@superblocksteam/gateway 2.0.161 → 2.0.162-next.1

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 (235) hide show
  1. package/README.md +135 -39
  2. package/dist/agents/resolve-orchestrator-url.d.ts +18 -0
  3. package/dist/agents/resolve-orchestrator-url.js +64 -1
  4. package/dist/agents/resolve-orchestrator-url.js.map +1 -1
  5. package/dist/capabilities/lifecycle.d.ts +46 -29
  6. package/dist/capabilities/lifecycle.js +1731 -843
  7. package/dist/capabilities/lifecycle.js.map +1 -1
  8. package/dist/capabilities/query-integration.d.ts +14 -0
  9. package/dist/capabilities/query-integration.js +172 -0
  10. package/dist/capabilities/query-integration.js.map +1 -0
  11. package/dist/capabilities/source-files-archive.d.ts +11 -0
  12. package/dist/capabilities/source-files-archive.js +54 -0
  13. package/dist/capabilities/source-files-archive.js.map +1 -0
  14. package/dist/capabilities/types.d.ts +197 -119
  15. package/dist/capabilities/types.js +45 -6
  16. package/dist/capabilities/types.js.map +1 -1
  17. package/dist/capture/browser-contract.d.ts +15 -5
  18. package/dist/capture/browser-contract.js +13 -3
  19. package/dist/capture/browser-contract.js.map +1 -1
  20. package/dist/capture/browser-instructions.d.ts +3 -2
  21. package/dist/capture/browser-instructions.js +3 -2
  22. package/dist/capture/browser-instructions.js.map +1 -1
  23. package/dist/capture/mode.d.ts +8 -1
  24. package/dist/capture/mode.js +22 -2
  25. package/dist/capture/mode.js.map +1 -1
  26. package/dist/config.d.ts +22 -23
  27. package/dist/config.js +13 -12
  28. package/dist/config.js.map +1 -1
  29. package/dist/deps.d.ts +7 -7
  30. package/dist/index.d.ts +2 -4
  31. package/dist/index.js +2 -4
  32. package/dist/index.js.map +1 -1
  33. package/dist/integrations/read-only-postgres-query.d.ts +2 -0
  34. package/dist/integrations/read-only-postgres-query.js +164 -0
  35. package/dist/integrations/read-only-postgres-query.js.map +1 -0
  36. package/dist/main.js +1 -1
  37. package/dist/main.js.map +1 -1
  38. package/dist/playwright/ensure-chromium.d.ts +5 -7
  39. package/dist/playwright/ensure-chromium.js +13 -13
  40. package/dist/playwright/ensure-chromium.js.map +1 -1
  41. package/dist/preview/capture-screenshot.d.ts +30 -4
  42. package/dist/preview/capture-screenshot.js +67 -17
  43. package/dist/preview/capture-screenshot.js.map +1 -1
  44. package/dist/preview/viewer-url.js +3 -1
  45. package/dist/preview/viewer-url.js.map +1 -1
  46. package/dist/process/fault-barrier.js +1 -1
  47. package/dist/process/fault-barrier.js.map +1 -1
  48. package/dist/sabs/agent-facing-text.d.ts +2 -0
  49. package/dist/sabs/agent-facing-text.js +56 -2
  50. package/dist/sabs/agent-facing-text.js.map +1 -1
  51. package/dist/sabs/app-state.d.ts +126 -0
  52. package/dist/sabs/app-state.js +332 -0
  53. package/dist/sabs/app-state.js.map +1 -0
  54. package/dist/sabs/awaited-decision.d.ts +49 -0
  55. package/dist/sabs/awaited-decision.js +129 -0
  56. package/dist/sabs/awaited-decision.js.map +1 -0
  57. package/dist/sabs/editor-client-methods.d.ts +23 -5
  58. package/dist/sabs/editor-client-methods.js +45 -4
  59. package/dist/sabs/editor-client-methods.js.map +1 -1
  60. package/dist/sabs/editor-socket.d.ts +85 -0
  61. package/dist/sabs/editor-socket.js +67 -0
  62. package/dist/sabs/editor-socket.js.map +1 -0
  63. package/dist/sabs/session-peer.d.ts +119 -82
  64. package/dist/sabs/session-peer.js +10 -1
  65. package/dist/sabs/session-peer.js.map +1 -1
  66. package/dist/sabs/streamed-reply.d.ts +45 -0
  67. package/dist/sabs/streamed-reply.js +125 -0
  68. package/dist/sabs/streamed-reply.js.map +1 -0
  69. package/dist/sabs/turn-collector.d.ts +50 -35
  70. package/dist/sabs/turn-collector.js +110 -176
  71. package/dist/sabs/turn-collector.js.map +1 -1
  72. package/dist/sabs/websocket-session-peer.d.ts +104 -69
  73. package/dist/sabs/websocket-session-peer.js +1333 -477
  74. package/dist/sabs/websocket-session-peer.js.map +1 -1
  75. package/dist/server/client.d.ts +41 -9
  76. package/dist/server/client.js +126 -21
  77. package/dist/server/client.js.map +1 -1
  78. package/dist/start.d.ts +1 -1
  79. package/dist/start.js +30 -8
  80. package/dist/start.js.map +1 -1
  81. package/dist/stores/memory.d.ts +46 -0
  82. package/dist/stores/memory.js +163 -0
  83. package/dist/stores/memory.js.map +1 -0
  84. package/dist/stores/types.d.ts +92 -0
  85. package/dist/stores/types.js +11 -0
  86. package/dist/stores/types.js.map +1 -0
  87. package/dist/telemetry/mcp-client.d.ts +6 -1
  88. package/dist/telemetry/mcp-client.js +100 -4
  89. package/dist/telemetry/mcp-client.js.map +1 -1
  90. package/dist/telemetry/metrics.d.ts +12 -3
  91. package/dist/telemetry/metrics.js +60 -14
  92. package/dist/telemetry/metrics.js.map +1 -1
  93. package/dist/telemetry/runtime.js +4 -6
  94. package/dist/telemetry/runtime.js.map +1 -1
  95. package/dist/transports/mcp/admin-tools.d.ts +8 -0
  96. package/dist/transports/mcp/admin-tools.js +115 -4
  97. package/dist/transports/mcp/admin-tools.js.map +1 -1
  98. package/dist/transports/mcp/app-status-html.d.ts +4 -8
  99. package/dist/transports/mcp/app-status-html.js +336 -128
  100. package/dist/transports/mcp/app-status-html.js.map +1 -1
  101. package/dist/transports/mcp/client-presentation.d.ts +16 -0
  102. package/dist/transports/mcp/client-presentation.js +13 -0
  103. package/dist/transports/mcp/client-presentation.js.map +1 -0
  104. package/dist/transports/mcp/cowork-editor-url.d.ts +6 -0
  105. package/dist/transports/mcp/cowork-editor-url.js +10 -0
  106. package/dist/transports/mcp/cowork-editor-url.js.map +1 -0
  107. package/dist/transports/mcp/decision-card-html.d.ts +26 -0
  108. package/dist/transports/mcp/decision-card-html.js +876 -0
  109. package/dist/transports/mcp/decision-card-html.js.map +1 -0
  110. package/dist/transports/mcp/decision-elicitation.d.ts +42 -0
  111. package/dist/transports/mcp/decision-elicitation.js +59 -0
  112. package/dist/transports/mcp/decision-elicitation.js.map +1 -1
  113. package/dist/transports/mcp/editor-document-probe.d.ts +4 -0
  114. package/dist/transports/mcp/editor-document-probe.js +35 -0
  115. package/dist/transports/mcp/editor-document-probe.js.map +1 -0
  116. package/dist/transports/mcp/editor-integration-setup-url.d.ts +14 -0
  117. package/dist/transports/mcp/editor-integration-setup-url.js +29 -0
  118. package/dist/transports/mcp/editor-integration-setup-url.js.map +1 -0
  119. package/dist/transports/mcp/format-tool-content.d.ts +13 -18
  120. package/dist/transports/mcp/format-tool-content.js +172 -13
  121. package/dist/transports/mcp/format-tool-content.js.map +1 -1
  122. package/dist/transports/mcp/instructions/index.d.ts +23 -0
  123. package/dist/transports/mcp/instructions/index.js +81 -0
  124. package/dist/transports/mcp/instructions/index.js.map +1 -0
  125. package/dist/transports/mcp/instructions/result.d.ts +18 -0
  126. package/dist/transports/mcp/instructions/result.js +58 -0
  127. package/dist/transports/mcp/instructions/result.js.map +1 -0
  128. package/dist/transports/mcp/instructions/tools/ask-user.d.ts +2 -0
  129. package/dist/transports/mcp/instructions/tools/ask-user.js +20 -0
  130. package/dist/transports/mcp/instructions/tools/ask-user.js.map +1 -0
  131. package/dist/transports/mcp/instructions/tools/build-app.d.ts +4 -0
  132. package/dist/transports/mcp/instructions/tools/build-app.js +54 -0
  133. package/dist/transports/mcp/instructions/tools/build-app.js.map +1 -0
  134. package/dist/transports/mcp/instructions/tools/check-app-progress.d.ts +3 -0
  135. package/dist/transports/mcp/instructions/tools/check-app-progress.js +79 -0
  136. package/dist/transports/mcp/instructions/tools/check-app-progress.js.map +1 -0
  137. package/dist/transports/mcp/instructions/tools/check-publish-progress.d.ts +3 -0
  138. package/dist/transports/mcp/instructions/tools/check-publish-progress.js +23 -0
  139. package/dist/transports/mcp/instructions/tools/check-publish-progress.js.map +1 -0
  140. package/dist/transports/mcp/instructions/tools/copy.d.ts +18 -0
  141. package/dist/transports/mcp/instructions/tools/copy.js +49 -0
  142. package/dist/transports/mcp/instructions/tools/copy.js.map +1 -0
  143. package/dist/transports/mcp/instructions/tools/create-integration.d.ts +4 -0
  144. package/dist/transports/mcp/instructions/tools/create-integration.js +41 -0
  145. package/dist/transports/mcp/instructions/tools/create-integration.js.map +1 -0
  146. package/dist/transports/mcp/instructions/tools/edit-app.d.ts +3 -0
  147. package/dist/transports/mcp/instructions/tools/edit-app.js +18 -0
  148. package/dist/transports/mcp/instructions/tools/edit-app.js.map +1 -0
  149. package/dist/transports/mcp/instructions/tools/get-app.d.ts +3 -0
  150. package/dist/transports/mcp/instructions/tools/get-app.js +49 -0
  151. package/dist/transports/mcp/instructions/tools/get-app.js.map +1 -0
  152. package/dist/transports/mcp/instructions/tools/get-integration-metadata.d.ts +2 -0
  153. package/dist/transports/mcp/instructions/tools/get-integration-metadata.js +13 -0
  154. package/dist/transports/mcp/instructions/tools/get-integration-metadata.js.map +1 -0
  155. package/dist/transports/mcp/instructions/tools/index.d.ts +7 -0
  156. package/dist/transports/mcp/instructions/tools/index.js +31 -0
  157. package/dist/transports/mcp/instructions/tools/index.js.map +1 -0
  158. package/dist/transports/mcp/instructions/tools/publish-app.d.ts +3 -0
  159. package/dist/transports/mcp/instructions/tools/publish-app.js +23 -0
  160. package/dist/transports/mcp/instructions/tools/publish-app.js.map +1 -0
  161. package/dist/transports/mcp/instructions/tools/start-app.d.ts +3 -0
  162. package/dist/transports/mcp/instructions/tools/start-app.js +22 -0
  163. package/dist/transports/mcp/instructions/tools/start-app.js.map +1 -0
  164. package/dist/transports/mcp/instructions/tools/upload-artifact.d.ts +2 -0
  165. package/dist/transports/mcp/instructions/tools/upload-artifact.js +13 -0
  166. package/dist/transports/mcp/instructions/tools/upload-artifact.js.map +1 -0
  167. package/dist/transports/mcp/mcp-app-brand-css.d.ts +1 -0
  168. package/dist/transports/mcp/mcp-app-brand-css.js +180 -0
  169. package/dist/transports/mcp/mcp-app-brand-css.js.map +1 -0
  170. package/dist/transports/mcp/mount.d.ts +14 -1
  171. package/dist/transports/mcp/mount.js +729 -172
  172. package/dist/transports/mcp/mount.js.map +1 -1
  173. package/dist/transports/mcp/native-browser-presence.d.ts +45 -0
  174. package/dist/transports/mcp/native-browser-presence.js +158 -0
  175. package/dist/transports/mcp/native-browser-presence.js.map +1 -0
  176. package/dist/transports/mcp/plan-approval.d.ts +44 -0
  177. package/dist/transports/mcp/plan-approval.js +179 -0
  178. package/dist/transports/mcp/plan-approval.js.map +1 -0
  179. package/dist/transports/mcp/session-directory.d.ts +7 -0
  180. package/dist/transports/mcp/session-directory.js +18 -0
  181. package/dist/transports/mcp/session-directory.js.map +1 -0
  182. package/dist/transports/mcp/tool-names.d.ts +2 -0
  183. package/dist/transports/mcp/tool-names.js +2 -0
  184. package/dist/transports/mcp/tool-names.js.map +1 -0
  185. package/package.json +16 -7
  186. package/skills/superblocks-build/SKILL.md +59 -0
  187. package/skills/superblocks-import/SKILL.md +125 -0
  188. package/dist/capabilities/import-prompt.d.ts +0 -11
  189. package/dist/capabilities/import-prompt.js +0 -96
  190. package/dist/capabilities/import-prompt.js.map +0 -1
  191. package/dist/capabilities/persisted-progress.d.ts +0 -46
  192. package/dist/capabilities/persisted-progress.js +0 -246
  193. package/dist/capabilities/persisted-progress.js.map +0 -1
  194. package/dist/events/cursor.d.ts +0 -43
  195. package/dist/events/cursor.js +0 -78
  196. package/dist/events/cursor.js.map +0 -1
  197. package/dist/events/memory-event-store.d.ts +0 -34
  198. package/dist/events/memory-event-store.js +0 -110
  199. package/dist/events/memory-event-store.js.map +0 -1
  200. package/dist/events/merge.d.ts +0 -23
  201. package/dist/events/merge.js +0 -97
  202. package/dist/events/merge.js.map +0 -1
  203. package/dist/events/normalized-collector.d.ts +0 -62
  204. package/dist/events/normalized-collector.js +0 -156
  205. package/dist/events/normalized-collector.js.map +0 -1
  206. package/dist/events/schema.d.ts +0 -9
  207. package/dist/events/schema.js +0 -93
  208. package/dist/events/schema.js.map +0 -1
  209. package/dist/events/snapshot.d.ts +0 -32
  210. package/dist/events/snapshot.js +0 -57
  211. package/dist/events/snapshot.js.map +0 -1
  212. package/dist/events/stream-key.d.ts +0 -2
  213. package/dist/events/stream-key.js +0 -31
  214. package/dist/events/stream-key.js.map +0 -1
  215. package/dist/events/types.d.ts +0 -179
  216. package/dist/events/types.js +0 -66
  217. package/dist/events/types.js.map +0 -1
  218. package/dist/resume/memory-progress-store.d.ts +0 -39
  219. package/dist/resume/memory-progress-store.js +0 -82
  220. package/dist/resume/memory-progress-store.js.map +0 -1
  221. package/dist/resume/memory-recent-app-store.d.ts +0 -14
  222. package/dist/resume/memory-recent-app-store.js +0 -27
  223. package/dist/resume/memory-recent-app-store.js.map +0 -1
  224. package/dist/resume/memory-turn-store.d.ts +0 -18
  225. package/dist/resume/memory-turn-store.js +0 -73
  226. package/dist/resume/memory-turn-store.js.map +0 -1
  227. package/dist/resume/progress-key.d.ts +0 -21
  228. package/dist/resume/progress-key.js +0 -58
  229. package/dist/resume/progress-key.js.map +0 -1
  230. package/dist/resume/stores.d.ts +0 -14
  231. package/dist/resume/stores.js +0 -18
  232. package/dist/resume/stores.js.map +0 -1
  233. package/dist/resume/types.d.ts +0 -124
  234. package/dist/resume/types.js +0 -13
  235. package/dist/resume/types.js.map +0 -1
@@ -0,0 +1,92 @@
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
+ export type RecentApp = {
19
+ applicationId: string;
20
+ branch?: string;
21
+ };
22
+ /**
23
+ * The applications a caller worked on recently, so a tool call that names none
24
+ * still has one to act on.
25
+ *
26
+ * Scoped to the user rather than the conversation because stdio carries no
27
+ * conversation identity, and one process serves every chat in a client. A
28
+ * caller that cannot afford to act on another chat's application therefore
29
+ * asks for `recentUnambiguous` and passes an explicit id when it declines.
30
+ */
31
+ export type RecentAppStore = {
32
+ /** The application worked on most recently, while still within `withinMs`. */
33
+ recent(key: UserScopeKey, withinMs: number): RecentApp | undefined;
34
+ /** One named application, while its branch hint is still fresh. */
35
+ recentForApplication(key: UserScopeKey, applicationId: string, withinMs: number): RecentApp | undefined;
36
+ /**
37
+ * The same application, but only when it is the only one worked on in the
38
+ * window. Two applications in play means two conversations, and this process
39
+ * cannot tell which of them is asking.
40
+ */
41
+ recentUnambiguous(key: UserScopeKey, withinMs: number): RecentApp | undefined;
42
+ set(input: UserScopeKey & RecentApp & {
43
+ atMs?: number;
44
+ }): void;
45
+ };
46
+ /**
47
+ * When a build last spoke, and whether its silence has already been reported.
48
+ *
49
+ * App-scoped rather than per-caller: whether a build has gone quiet is a fact
50
+ * about the build, and two readers of one build must not disagree about it.
51
+ */
52
+ export type ProgressStore = {
53
+ lastActivityAtMs(key: AppScopeKey): number | undefined;
54
+ recordActivity(input: AppScopeKey & {
55
+ atMs: number;
56
+ }): void;
57
+ stallHintedAtMs(key: AppScopeKey): number | undefined;
58
+ /** `undefined` clears the mark, so the next quiet spell gets its own hint. */
59
+ recordStallHint(input: AppScopeKey & {
60
+ atMs: number | undefined;
61
+ }): void;
62
+ };
63
+ export type StepUpTurnStatus = "pending" | "ready" | "expired";
64
+ /**
65
+ * An interactive authorization a capability is waiting on.
66
+ *
67
+ * The one thing here with a real expiry: a step-up a caller walked away from
68
+ * must not still be claimable an hour later.
69
+ */
70
+ export type StepUpTurn = {
71
+ authUrl: string;
72
+ callbackToken: string;
73
+ createdAtMs: number;
74
+ idempotencyKey: string;
75
+ reason: "idp_step_up";
76
+ status: StepUpTurnStatus;
77
+ turnId: string;
78
+ };
79
+ export type StepUpTurnStore = {
80
+ complete(turnId: string, callbackToken: string): StepUpTurn | undefined;
81
+ create(input: {
82
+ authUrl: string;
83
+ callbackToken?: string;
84
+ idempotencyKey: string;
85
+ reason: StepUpTurn["reason"];
86
+ ttlMs?: number;
87
+ turnId?: string;
88
+ }): StepUpTurn;
89
+ get(turnId: string): StepUpTurn | undefined;
90
+ getByIdempotencyKey(idempotencyKey: string): StepUpTurn | undefined;
91
+ };
92
+ 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;AA0FH,MAAM,CAAC,MAAM,sBAAsB,GAAG,OAAO,CAAC"}
@@ -5,17 +5,22 @@ export type McpClientInfo = {
5
5
  version?: string;
6
6
  };
7
7
  export type McpToolCall = {
8
+ arguments?: Record<string, unknown>;
8
9
  client?: McpClientInfo;
9
10
  toolName: string;
10
11
  };
12
+ export type McpClientTelemetryOptions = {
13
+ recordToolIo?: boolean;
14
+ };
11
15
  export declare class McpClientTelemetry {
12
16
  private readonly tracer;
17
+ private readonly options;
13
18
  private ended;
14
19
  private hadError;
15
20
  private organizationId;
16
21
  private readonly sessionContext;
17
22
  private readonly sessionSpan;
18
- constructor(tracer: Tracer);
23
+ constructor(tracer: Tracer, options?: McpClientTelemetryOptions);
19
24
  setOrganizationId(organizationId: string): void;
20
25
  runTool<T>(call: McpToolCall, operation: () => Promise<CapabilityResult<T>>): Promise<CapabilityResult<T>>;
21
26
  endSession(): void;
@@ -1,4 +1,29 @@
1
1
  import { context, SpanStatusCode, trace, } from "@opentelemetry/api";
2
+ import { recordMcpToolCall } from "./metrics.js";
3
+ const LLMOBS_JSON_MAX = 1024;
4
+ const LLMOBS_TRUNCATED_JSON = '{"truncated":true}';
5
+ const ARGUMENT_VALUES = [
6
+ "applicationId",
7
+ "commitId",
8
+ "directoryHash",
9
+ "includeScreenshot",
10
+ "integrationId",
11
+ "limit",
12
+ "mode",
13
+ "offset",
14
+ "planAction",
15
+ "replacesApplicationId",
16
+ ];
17
+ const ARGUMENT_PRESENT = [
18
+ "artifacts",
19
+ "filePath",
20
+ "files",
21
+ "idempotencyKey",
22
+ "name",
23
+ "prompt",
24
+ "search",
25
+ "zipBase64",
26
+ ];
2
27
  function bounded(value, maxLength) {
3
28
  return value.slice(0, maxLength);
4
29
  }
@@ -9,15 +34,57 @@ function stringProperty(value, key) {
9
34
  const property = Reflect.get(value, key);
10
35
  return typeof property === "string" ? property : undefined;
11
36
  }
37
+ function llmObsJson(value) {
38
+ const json = JSON.stringify(value);
39
+ return json.length <= LLMOBS_JSON_MAX ? json : LLMOBS_TRUNCATED_JSON;
40
+ }
41
+ function sanitizeToolArguments(args) {
42
+ if (!args) {
43
+ return "{}";
44
+ }
45
+ const sanitized = {};
46
+ for (const key of ARGUMENT_VALUES) {
47
+ if (args[key] !== undefined) {
48
+ sanitized[key] = args[key];
49
+ }
50
+ }
51
+ for (const key of ARGUMENT_PRESENT) {
52
+ if (args[key] !== undefined) {
53
+ sanitized[key] = true;
54
+ }
55
+ }
56
+ return llmObsJson(sanitized);
57
+ }
58
+ function sanitizeToolResult(result) {
59
+ if (result.kind === "error") {
60
+ return llmObsJson({
61
+ ...(result.applicationId ? { applicationId: result.applicationId } : {}),
62
+ code: bounded(result.code, 80),
63
+ kind: "error",
64
+ });
65
+ }
66
+ if (result.kind === "auth_required") {
67
+ return llmObsJson({ kind: "auth_required" });
68
+ }
69
+ const applicationId = stringProperty(result.value, "applicationId");
70
+ const resultStatus = stringProperty(result.value, "status");
71
+ return llmObsJson({
72
+ ...(applicationId ? { applicationId } : {}),
73
+ kind: "ok",
74
+ ...(resultStatus ? { status: bounded(resultStatus, 80) } : {}),
75
+ });
76
+ }
12
77
  export class McpClientTelemetry {
13
78
  tracer;
79
+ options;
14
80
  ended = false;
15
81
  hadError = false;
16
82
  organizationId;
17
83
  sessionContext;
18
84
  sessionSpan;
19
- constructor(tracer) {
85
+ constructor(tracer, options = {}) {
20
86
  this.tracer = tracer;
87
+ this.options = options;
21
88
  this.sessionSpan = tracer.startSpan("gen_ai.request", {
22
89
  attributes: {
23
90
  "gen_ai.operation.name": "invoke_agent",
@@ -30,8 +97,16 @@ export class McpClientTelemetry {
30
97
  this.sessionSpan.setAttribute("organization.id", organizationId);
31
98
  }
32
99
  async runTool(call, operation) {
100
+ const toolName = bounded(call.toolName, 80);
101
+ const recordToolIo = this.options.recordToolIo === true;
33
102
  const attributes = {
34
103
  "gen_ai.operation.name": "execute_tool",
104
+ ...(recordToolIo
105
+ ? {
106
+ "gen_ai.tool.call.arguments": sanitizeToolArguments(call.arguments),
107
+ "gen_ai.tool.name": toolName,
108
+ }
109
+ : {}),
35
110
  ...(call.client
36
111
  ? {
37
112
  "mcp.client.name": bounded(call.client.name, 80),
@@ -45,7 +120,7 @@ export class McpClientTelemetry {
45
120
  ...(this.organizationId
46
121
  ? { "organization.id": this.organizationId }
47
122
  : {}),
48
- "tool.name": bounded(call.toolName, 80),
123
+ "tool.name": toolName,
49
124
  };
50
125
  if (call.client) {
51
126
  this.sessionSpan.setAttributes({
@@ -63,14 +138,19 @@ export class McpClientTelemetry {
63
138
  return operation();
64
139
  }
65
140
  const startedAt = Date.now();
141
+ let status = "success";
66
142
  try {
67
143
  const result = await context.with(trace.setSpan(this.sessionContext, span), operation);
68
144
  span.setAttribute("tool.duration_ms", Date.now() - startedAt);
69
145
  if (this.organizationId) {
70
146
  span.setAttribute("organization.id", this.organizationId);
71
147
  }
148
+ if (recordToolIo) {
149
+ span.setAttribute("gen_ai.tool.call.result", sanitizeToolResult(result));
150
+ }
72
151
  if (result.kind === "error") {
73
152
  this.hadError = true;
153
+ status = "error";
74
154
  span.setAttributes({
75
155
  ...(result.applicationId
76
156
  ? { "application.id": result.applicationId }
@@ -79,10 +159,14 @@ export class McpClientTelemetry {
79
159
  "tool.error_category": result.code === "cancelled" ? "timeout" : "execution_error",
80
160
  "tool.status": "error",
81
161
  });
82
- span.setStatus({ code: SpanStatusCode.ERROR });
162
+ span.setStatus({
163
+ code: SpanStatusCode.ERROR,
164
+ message: bounded(result.code, 80),
165
+ });
83
166
  }
84
167
  else if (result.kind === "auth_required") {
85
168
  this.hadError = true;
169
+ status = "error";
86
170
  span.setAttributes({
87
171
  "mcp.result.status": "auth_required",
88
172
  "tool.error_category": "permission_denied",
@@ -105,15 +189,27 @@ export class McpClientTelemetry {
105
189
  }
106
190
  catch (error) {
107
191
  this.hadError = true;
192
+ status = "error";
108
193
  span.setAttributes({
194
+ ...(recordToolIo
195
+ ? {
196
+ "gen_ai.tool.call.result": llmObsJson({ kind: "exception" }),
197
+ }
198
+ : {}),
109
199
  "tool.duration_ms": Date.now() - startedAt,
110
200
  "tool.error_category": "execution_error",
111
201
  "tool.status": "error",
112
202
  });
113
- span.setStatus({ code: SpanStatusCode.ERROR });
203
+ span.setStatus({ code: SpanStatusCode.ERROR, message: "exception" });
114
204
  throw error;
115
205
  }
116
206
  finally {
207
+ recordMcpToolCall({
208
+ ...(call.client ? { clientName: bounded(call.client.name, 80) } : {}),
209
+ durationSeconds: (Date.now() - startedAt) / 1000,
210
+ status,
211
+ toolName,
212
+ });
117
213
  span.end();
118
214
  }
119
215
  }
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-client.js","sourceRoot":"","sources":["../../src/telemetry/mcp-client.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,OAAO,EAEP,cAAc,EACd,KAAK,GAEN,MAAM,oBAAoB,CAAC;AAc5B,SAAS,OAAO,CAAC,KAAa,EAAE,SAAiB;IAC/C,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;AACnC,CAAC;AAED,SAAS,cAAc,CAAC,KAAc,EAAE,GAAW;IACjD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,CAAC,GAAG,IAAI,KAAK,CAAC,EAAE,CAAC;QACnE,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACzC,OAAO,OAAO,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;AAC7D,CAAC;AAED,MAAM,OAAO,kBAAkB;IAOA;IANrB,KAAK,GAAG,KAAK,CAAC;IACd,QAAQ,GAAG,KAAK,CAAC;IACjB,cAAc,CAAqB;IAC1B,cAAc,CAAmC;IACjD,WAAW,CAAO;IAEnC,YAA6B,MAAc;QAAd,WAAM,GAAN,MAAM,CAAQ;QACzC,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,SAAS,CAAC,gBAAgB,EAAE;YACpD,UAAU,EAAE;gBACV,uBAAuB,EAAE,cAAc;aACxC;SACF,CAAC,CAAC;QACH,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IAC1E,CAAC;IAED,iBAAiB,CAAC,cAAsB;QACtC,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;QACrC,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,iBAAiB,EAAE,cAAc,CAAC,CAAC;IACnE,CAAC;IAED,KAAK,CAAC,OAAO,CACX,IAAiB,EACjB,SAA6C;QAE7C,MAAM,UAAU,GAAG;YACjB,uBAAuB,EAAE,cAAc;YACvC,GAAG,CAAC,IAAI,CAAC,MAAM;gBACb,CAAC,CAAC;oBACE,iBAAiB,EAAE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;oBAChD,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO;wBACrB,CAAC,CAAC;4BACE,oBAAoB,EAAE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;yBACvD;wBACH,CAAC,CAAC,EAAE,CAAC;iBACR;gBACH,CAAC,CAAC,EAAE,CAAC;YACP,GAAG,CAAC,IAAI,CAAC,cAAc;gBACrB,CAAC,CAAC,EAAE,iBAAiB,EAAE,IAAI,CAAC,cAAc,EAAE;gBAC5C,CAAC,CAAC,EAAE,CAAC;YACP,WAAW,EAAE,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;SACxC,CAAC;QACF,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC;gBAC7B,iBAAiB,EAAE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;gBAChD,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO;oBACrB,CAAC,CAAC,EAAE,oBAAoB,EAAE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE;oBAC5D,CAAC,CAAC,EAAE,CAAC;aACR,CAAC,CAAC;QACL,CAAC;QAED,IAAI,IAAU,CAAC;QACf,IAAI,CAAC;YACH,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAC1B,kBAAkB,EAClB,EAAE,UAAU,EAAE,EACd,IAAI,CAAC,cAAc,CACpB,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,SAAS,EAAE,CAAC;QACrB,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAC/B,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,EACxC,SAAS,CACV,CAAC;YACF,IAAI,CAAC,YAAY,CAAC,kBAAkB,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,CAAC;YAC9D,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;gBACxB,IAAI,CAAC,YAAY,CAAC,iBAAiB,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;YAC5D,CAAC;YACD,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBAC5B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;gBACrB,IAAI,CAAC,aAAa,CAAC;oBACjB,GAAG,CAAC,MAAM,CAAC,aAAa;wBACtB,CAAC,CAAC,EAAE,gBAAgB,EAAE,MAAM,CAAC,aAAa,EAAE;wBAC5C,CAAC,CAAC,EAAE,CAAC;oBACP,gBAAgB,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;oBAC1C,qBAAqB,EACnB,MAAM,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,iBAAiB;oBAC7D,aAAa,EAAE,OAAO;iBACvB,CAAC,CAAC;gBACH,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,cAAc,CAAC,KAAK,EAAE,CAAC,CAAC;YACjD,CAAC;iBAAM,IAAI,MAAM,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;gBAC3C,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;gBACrB,IAAI,CAAC,aAAa,CAAC;oBACjB,mBAAmB,EAAE,eAAe;oBACpC,qBAAqB,EAAE,mBAAmB;oBAC1C,aAAa,EAAE,OAAO;iBACvB,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,MAAM,aAAa,GAAG,cAAc,CAAC,MAAM,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC;gBACpE,MAAM,YAAY,GAAG,cAAc,CAAC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;gBAC5D,IAAI,CAAC,aAAa,CAAC;oBACjB,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC7D,GAAG,CAAC,YAAY;wBACd,CAAC,CAAC,EAAE,mBAAmB,EAAE,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,EAAE;wBACpD,CAAC,CAAC,EAAE,CAAC;oBACP,qBAAqB,EAAE,MAAM;oBAC7B,aAAa,EAAE,SAAS;iBACzB,CAAC,CAAC;YACL,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;YACrB,IAAI,CAAC,aAAa,CAAC;gBACjB,kBAAkB,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;gBAC1C,qBAAqB,EAAE,iBAAiB;gBACxC,aAAa,EAAE,OAAO;aACvB,CAAC,CAAC;YACH,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,cAAc,CAAC,KAAK,EAAE,CAAC,CAAC;YAC/C,MAAM,KAAK,CAAC;QACd,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,GAAG,EAAE,CAAC;QACb,CAAC;IACH,CAAC;IAED,UAAU;QACR,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,OAAO;QACT,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,CAAC,WAAW,CAAC,YAAY,CAC3B,uBAAuB,EACvB,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CACpC,CAAC;QACF,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC;IACzB,CAAC;CACF"}
1
+ {"version":3,"file":"mcp-client.js","sourceRoot":"","sources":["../../src/telemetry/mcp-client.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,15 @@
1
1
  import type { IdentityReadOutcome } from "../server/identity-reads.js";
2
- export declare const identityReadOutcomes: import("@opentelemetry/api").Counter<import("@opentelemetry/api").Attributes>;
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";
3
13
  /**
4
14
  * How the identity lookup behind a capability is behaving.
5
15
  *
@@ -7,7 +17,7 @@ export declare const identityReadOutcomes: import("@opentelemetry/api").Counter<
7
17
  * closed set, so the series count grows with code and not with traffic.
8
18
  */
9
19
  export declare function recordIdentityReadOutcome(outcome: IdentityReadOutcome): void;
10
- export declare const processFaults: import("@opentelemetry/api").Counter<import("@opentelemetry/api").Attributes>;
20
+ export declare function recordCheckpointOutcome(outcome: CheckpointMetricOutcome): void;
11
21
  /**
12
22
  * How often the gateway is absorbing faults it used to die from (ENG-5809).
13
23
  *
@@ -17,7 +27,6 @@ export declare function recordGatewayFault(fault: {
17
27
  fatal: boolean;
18
28
  kind: string;
19
29
  }): void;
20
- export declare const readinessVerdicts: import("@opentelemetry/api").Counter<import("@opentelemetry/api").Attributes>;
21
30
  /**
22
31
  * Separates "this gateway is broken" from "the platform it fronts is down".
23
32
  *
@@ -1,14 +1,57 @@
1
- import { metrics } from "@opentelemetry/api";
2
- const meter = metrics.getMeter("gateway");
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
+ }
3
48
  function resourceAttributes() {
4
49
  return {
5
50
  "deployment.environment.name": process.env.DEPLOYMENT_ENVIRONMENT_NAME ?? "local",
6
51
  "service.name": "gateway",
7
52
  };
8
53
  }
9
- export const identityReadOutcomes = meter.createCounter("gateway.identity.read.outcomes", {
10
- description: "Caller-identity lookups by outcome: served from cache, resolved, refused, or unavailable",
11
- });
54
+ const identityReadOutcomes = lazyCounter("gateway.identity.read.outcomes", "Caller-identity lookups by outcome: served from cache, resolved, refused, or unavailable");
12
55
  /**
13
56
  * How the identity lookup behind a capability is behaving.
14
57
  *
@@ -16,29 +59,32 @@ export const identityReadOutcomes = meter.createCounter("gateway.identity.read.o
16
59
  * closed set, so the series count grows with code and not with traffic.
17
60
  */
18
61
  export function recordIdentityReadOutcome(outcome) {
19
- identityReadOutcomes.add(1, {
62
+ identityReadOutcomes().add(1, {
20
63
  ...resourceAttributes(),
21
64
  "gateway.outcome": outcome,
22
65
  });
23
66
  }
24
- export const processFaults = meter.createCounter("gateway.process.faults", {
25
- description: "Faults the process-level barrier caught, by kind and whether it gave up the process",
26
- });
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");
27
75
  /**
28
76
  * How often the gateway is absorbing faults it used to die from (ENG-5809).
29
77
  *
30
78
  * Neither the message nor a stack is a label; both go to the log line instead.
31
79
  */
32
80
  export function recordGatewayFault(fault) {
33
- processFaults.add(1, {
81
+ processFaults().add(1, {
34
82
  ...resourceAttributes(),
35
83
  "gateway.fault.fatal": String(fault.fatal),
36
84
  "gateway.fault.kind": fault.kind,
37
85
  });
38
86
  }
39
- export const readinessVerdicts = meter.createCounter("gateway.readiness.verdicts", {
40
- description: "Health and readiness probe verdicts, by dispatch state and upstream reachability",
41
- });
87
+ const readinessVerdicts = lazyCounter("gateway.readiness.verdicts", "Health and readiness probe verdicts, by dispatch state and upstream reachability");
42
88
  /**
43
89
  * Separates "this gateway is broken" from "the platform it fronts is down".
44
90
  *
@@ -46,7 +92,7 @@ export const readinessVerdicts = meter.createCounter("gateway.readiness.verdicts
46
92
  * does not bind `/health`.
47
93
  */
48
94
  export function recordReadinessVerdict(input) {
49
- readinessVerdicts.add(1, {
95
+ readinessVerdicts().add(1, {
50
96
  ...resourceAttributes(),
51
97
  "gateway.readiness.dispatch": input.dispatch,
52
98
  "gateway.readiness.probe": input.probe,
@@ -1 +1 @@
1
- {"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../src/telemetry/metrics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAI7C,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;AAE1C,SAAS,kBAAkB;IACzB,OAAO;QACL,6BAA6B,EAC3B,OAAO,CAAC,GAAG,CAAC,2BAA2B,IAAI,OAAO;QACpD,cAAc,EAAE,SAAS;KAC1B,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,oBAAoB,GAAG,KAAK,CAAC,aAAa,CACrD,gCAAgC,EAChC;IACE,WAAW,EACT,0FAA0F;CAC7F,CACF,CAAC;AAEF;;;;;GAKG;AACH,MAAM,UAAU,yBAAyB,CAAC,OAA4B;IACpE,oBAAoB,CAAC,GAAG,CAAC,CAAC,EAAE;QAC1B,GAAG,kBAAkB,EAAE;QACvB,iBAAiB,EAAE,OAAO;KAC3B,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,CAAC,aAAa,CAAC,wBAAwB,EAAE;IACzE,WAAW,EACT,qFAAqF;CACxF,CAAC,CAAC;AAEH;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAGlC;IACC,aAAa,CAAC,GAAG,CAAC,CAAC,EAAE;QACnB,GAAG,kBAAkB,EAAE;QACvB,qBAAqB,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC;QAC1C,oBAAoB,EAAE,KAAK,CAAC,IAAI;KACjC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,CAAC,aAAa,CAClD,4BAA4B,EAC5B;IACE,WAAW,EACT,kFAAkF;CACrF,CACF,CAAC;AAEF;;;;;GAKG;AACH,MAAM,UAAU,sBAAsB,CAAC,KAKtC;IACC,iBAAiB,CAAC,GAAG,CAAC,CAAC,EAAE;QACvB,GAAG,kBAAkB,EAAE;QACvB,4BAA4B,EAAE,KAAK,CAAC,QAAQ;QAC5C,yBAAyB,EAAE,KAAK,CAAC,KAAK;QACtC,yBAAyB,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC;QAC9C,4BAA4B,EAAE,KAAK,CAAC,QAAQ;KAC7C,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../src/telemetry/metrics.ts"],"names":[],"mappings":"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"}
@@ -92,20 +92,18 @@ async function settleWithin(work, timeoutMs) {
92
92
  }
93
93
  export function startGatewayTelemetry(input) {
94
94
  const otlpUrl = telemetryBaseUrl(input.config.serverUrl);
95
+ const deploymentType = deploymentTypeFor(input.config);
95
96
  const telemetry = initNodeTelemetry({
96
97
  environment: environmentName(input.config),
97
98
  logger: stderrLogger,
98
99
  logsEnabled: false,
99
- // Counters in metrics.ts are created at import time, before this SDK
100
- // starts, so they stay no-ops. Do not turn metrics on until those
101
- // instruments are created after init.
102
- metricsEnabled: false,
100
+ metricsEnabled: true,
103
101
  otlpHeaders: { Authorization: `Bearer ${input.apiKey}` },
104
102
  ...(otlpUrl ? { otlpUrl } : {}),
105
103
  serviceName: "gateway",
106
104
  serviceVersion: "0.0.1",
107
- }, getDefaultPolicy(deploymentTypeFor(input.config)));
108
- const mcpTelemetry = new McpClientTelemetry(telemetry.getTracer("gateway.mcp"));
105
+ }, getDefaultPolicy(deploymentType));
106
+ const mcpTelemetry = new McpClientTelemetry(telemetry.getTracer("gateway.mcp"), { recordToolIo: deploymentType === DeploymentType.CLOUD });
109
107
  return {
110
108
  mcpTelemetry,
111
109
  shutdown: async () => {
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/telemetry/runtime.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/telemetry/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AAGpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAErD,MAAM,qBAAqB,GAAG,KAAK,CAAC;AAEpC;;;GAGG;AACH,SAAS,WAAW,CAAC,KAAsB,EAAE,OAAgB;IAC3D,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IACD,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;AAChC,CAAC;AAED,MAAM,YAAY,GAAG;IACnB,KAAK,EAAE,WAAW;IAClB,IAAI,EAAE,WAAW;IACjB,IAAI,EAAE,WAAW;CAClB,CAAC;AAEF,SAAS,gBAAgB,CAAC,SAAiB;IACzC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC;QAC/B,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC;QACd,GAAG,CAAC,QAAQ,GAAG,GAAG,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC;QACzD,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC;QAChB,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC5C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,KAAK,CAAC,wDAAwD,CAAC,CAAC;QACxE,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,MAAqB;IAC5C,IAAI,MAAM,CAAC,yBAAyB,KAAK,SAAS,EAAE,CAAC;QACnD,OAAO,MAAM,CAAC,yBAAyB,CAAC;IAC1C,CAAC;IACD,IAAI,CAAC;QACH,OAAO,uBAAuB,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,CAAC;IACrE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,uBAAuB,CAAC,QAAgB;IAC/C,IAAI,QAAQ,CAAC,KAAK,CAAC,iCAAiC,CAAC,EAAE,CAAC;QACtD,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,IAAI,QAAQ,CAAC,KAAK,CAAC,gCAAgC,CAAC,EAAE,CAAC;QACrD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,QAAQ,CAAC,KAAK,CAAC,qCAAqC,CAAC,EAAE,CAAC;QAC1D,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,QAAQ,CAAC,KAAK,CAAC,iCAAiC,CAAC,EAAE,CAAC;QACtD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,QAAQ,CAAC,KAAK,CAAC,uCAAuC,CAAC,EAAE,CAAC;QAC5D,OAAO,WAAW,CAAC;IACrB,CAAC;IACD,IAAI,QAAQ,KAAK,WAAW,IAAI,QAAQ,KAAK,WAAW,EAAE,CAAC;QACzD,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,iBAAiB,CAAC,MAAqB;IAC9C,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC;QAC1B,OAAO,cAAc,CAAC,UAAU,CAAC;IACnC,CAAC;IACD,IAAI,CAAC;QACH,OAAO,mBAAmB,CAAC,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;IACtE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,cAAc,CAAC,KAAK,CAAC;IAC9B,CAAC;AACH,CAAC;AAED,KAAK,UAAU,YAAY,CACzB,IAAmB,EACnB,SAAiB;IAEjB,IAAI,KAAgD,CAAC;IACrD,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,IAAI,CAAC;YACjB,IAAI;YACJ,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;gBAC5B,KAAK,GAAG,UAAU,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;YACzC,CAAC,CAAC;SACH,CAAC,CAAC;IACL,CAAC;YAAS,CAAC;QACT,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,YAAY,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,KAGrC;IAIC,MAAM,OAAO,GAAG,gBAAgB,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACzD,MAAM,cAAc,GAAG,iBAAiB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACvD,MAAM,SAAS,GAAG,iBAAiB,CACjC;QACE,WAAW,EAAE,eAAe,CAAC,KAAK,CAAC,MAAM,CAAC;QAC1C,MAAM,EAAE,YAAY;QACpB,WAAW,EAAE,KAAK;QAClB,cAAc,EAAE,IAAI;QACpB,WAAW,EAAE,EAAE,aAAa,EAAE,UAAU,KAAK,CAAC,MAAM,EAAE,EAAE;QACxD,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/B,WAAW,EAAE,SAAS;QACtB,cAAc,EAAE,OAAO;KACxB,EACD,gBAAgB,CAAC,cAAc,CAAC,CACjC,CAAC;IACF,MAAM,YAAY,GAAG,IAAI,kBAAkB,CACzC,SAAS,CAAC,SAAS,CAAC,aAAa,CAAC,EAClC,EAAE,YAAY,EAAE,cAAc,KAAK,cAAc,CAAC,KAAK,EAAE,CAC1D,CAAC;IAEF,OAAO;QACL,YAAY;QACZ,QAAQ,EAAE,KAAK,IAAI,EAAE;YACnB,IAAI,CAAC;gBACH,YAAY,CAAC,UAAU,EAAE,CAAC;YAC5B,CAAC;oBAAS,CAAC;gBACT,MAAM,YAAY,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,qBAAqB,CAAC,CAAC;YAClE,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -3,6 +3,7 @@ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
3
3
  import type { Tool, ToolAnnotations } from "@modelcontextprotocol/sdk/types.js";
4
4
  import { z } from "zod";
5
5
  import { type ToolRegistry } from "@superblocksteam/mcp-server";
6
+ import type { ClientProfile } from "./client-presentation.js";
6
7
  export type RegisterAdminToolsOptions = {
7
8
  /**
8
9
  * Superblocks Server base URL injected as `base_url` when the caller omits it.
@@ -23,6 +24,13 @@ export type RegisterAdminToolsOptions = {
23
24
  * and keep the check.
24
25
  */
25
26
  localAgentMode?: boolean;
27
+ clientProfile?: () => ClientProfile;
28
+ /**
29
+ * When the caller named the application it is building, send credential
30
+ * entry to that editor's Integrations tab instead of the org Integrations
31
+ * page. An unnamed application gets the org page.
32
+ */
33
+ resolveEditorIntegrationSetupUrl?: (integrationId: string, applicationId: string | undefined) => string | undefined | Promise<string | undefined>;
26
34
  };
27
35
  export type JsonSchemaToZodShapeOptions = {
28
36
  /** Advertised as optional no matter what the source schema requires. */