@superblocksteam/gateway 2.0.156-next.3 → 2.0.156

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 (40) hide show
  1. package/README.md +3 -30
  2. package/dist/capabilities/lifecycle.d.ts +1 -12
  3. package/dist/capabilities/lifecycle.js +51 -99
  4. package/dist/capabilities/lifecycle.js.map +1 -1
  5. package/dist/capabilities/types.d.ts +0 -5
  6. package/dist/capabilities/types.js.map +1 -1
  7. package/dist/deps.d.ts +0 -2
  8. package/dist/integrations/map.d.ts +0 -1
  9. package/dist/integrations/map.js +1 -1
  10. package/dist/integrations/map.js.map +1 -1
  11. package/dist/sabs/editor-client-methods.js +5 -4
  12. package/dist/sabs/editor-client-methods.js.map +1 -1
  13. package/dist/sabs/session-peer.d.ts +0 -4
  14. package/dist/sabs/websocket-session-peer.d.ts +1 -2
  15. package/dist/sabs/websocket-session-peer.js +11 -21
  16. package/dist/sabs/websocket-session-peer.js.map +1 -1
  17. package/dist/server/client.d.ts +4 -10
  18. package/dist/server/client.js +4 -13
  19. package/dist/server/client.js.map +1 -1
  20. package/dist/start.d.ts +0 -10
  21. package/dist/start.js +2 -5
  22. package/dist/start.js.map +1 -1
  23. package/dist/transports/mcp/admin-tools.d.ts +1 -3
  24. package/dist/transports/mcp/admin-tools.js +1 -12
  25. package/dist/transports/mcp/admin-tools.js.map +1 -1
  26. package/dist/transports/mcp/app-status-html.d.ts +2 -2
  27. package/dist/transports/mcp/app-status-html.js +8 -139
  28. package/dist/transports/mcp/app-status-html.js.map +1 -1
  29. package/dist/transports/mcp/mount.js +24 -89
  30. package/dist/transports/mcp/mount.js.map +1 -1
  31. package/package.json +4 -5
  32. package/dist/capabilities/integration-metadata.d.ts +0 -28
  33. package/dist/capabilities/integration-metadata.js +0 -174
  34. package/dist/capabilities/integration-metadata.js.map +0 -1
  35. package/dist/telemetry/mcp-client.d.ts +0 -22
  36. package/dist/telemetry/mcp-client.js +0 -129
  37. package/dist/telemetry/mcp-client.js.map +0 -1
  38. package/dist/telemetry/runtime.d.ts +0 -9
  39. package/dist/telemetry/runtime.js +0 -121
  40. package/dist/telemetry/runtime.js.map +0 -1
@@ -1,129 +0,0 @@
1
- import { context, SpanStatusCode, trace, } from "@opentelemetry/api";
2
- function bounded(value, maxLength) {
3
- return value.slice(0, maxLength);
4
- }
5
- function stringProperty(value, key) {
6
- if (typeof value !== "object" || value === null || !(key in value)) {
7
- return undefined;
8
- }
9
- const property = Reflect.get(value, key);
10
- return typeof property === "string" ? property : undefined;
11
- }
12
- export class McpClientTelemetry {
13
- tracer;
14
- ended = false;
15
- hadError = false;
16
- organizationId;
17
- sessionContext;
18
- sessionSpan;
19
- constructor(tracer) {
20
- this.tracer = tracer;
21
- this.sessionSpan = tracer.startSpan("gen_ai.request", {
22
- attributes: {
23
- "gen_ai.operation.name": "invoke_agent",
24
- },
25
- });
26
- this.sessionContext = trace.setSpan(context.active(), this.sessionSpan);
27
- }
28
- setOrganizationId(organizationId) {
29
- this.organizationId = organizationId;
30
- this.sessionSpan.setAttribute("organization.id", organizationId);
31
- }
32
- async runTool(call, operation) {
33
- const attributes = {
34
- "gen_ai.operation.name": "execute_tool",
35
- ...(call.client
36
- ? {
37
- "mcp.client.name": bounded(call.client.name, 80),
38
- ...(call.client.version
39
- ? {
40
- "mcp.client.version": bounded(call.client.version, 40),
41
- }
42
- : {}),
43
- }
44
- : {}),
45
- ...(this.organizationId
46
- ? { "organization.id": this.organizationId }
47
- : {}),
48
- "tool.name": bounded(call.toolName, 80),
49
- };
50
- if (call.client) {
51
- this.sessionSpan.setAttributes({
52
- "mcp.client.name": bounded(call.client.name, 80),
53
- ...(call.client.version
54
- ? { "mcp.client.version": bounded(call.client.version, 40) }
55
- : {}),
56
- });
57
- }
58
- let span;
59
- try {
60
- span = this.tracer.startSpan("gen_ai.tool_call", { attributes }, this.sessionContext);
61
- }
62
- catch {
63
- return operation();
64
- }
65
- const startedAt = Date.now();
66
- try {
67
- const result = await context.with(trace.setSpan(this.sessionContext, span), operation);
68
- span.setAttribute("tool.duration_ms", Date.now() - startedAt);
69
- if (this.organizationId) {
70
- span.setAttribute("organization.id", this.organizationId);
71
- }
72
- if (result.kind === "error") {
73
- this.hadError = true;
74
- span.setAttributes({
75
- ...(result.applicationId
76
- ? { "application.id": result.applicationId }
77
- : {}),
78
- "mcp.error.code": bounded(result.code, 80),
79
- "tool.error_category": result.code === "cancelled" ? "timeout" : "execution_error",
80
- "tool.status": "error",
81
- });
82
- span.setStatus({ code: SpanStatusCode.ERROR });
83
- }
84
- else if (result.kind === "auth_required") {
85
- this.hadError = true;
86
- span.setAttributes({
87
- "mcp.result.status": "auth_required",
88
- "tool.error_category": "permission_denied",
89
- "tool.status": "error",
90
- });
91
- }
92
- else {
93
- const applicationId = stringProperty(result.value, "applicationId");
94
- const resultStatus = stringProperty(result.value, "status");
95
- span.setAttributes({
96
- ...(applicationId ? { "application.id": applicationId } : {}),
97
- ...(resultStatus
98
- ? { "mcp.result.status": bounded(resultStatus, 80) }
99
- : {}),
100
- "tool.error_category": "none",
101
- "tool.status": "success",
102
- });
103
- }
104
- return result;
105
- }
106
- catch (error) {
107
- this.hadError = true;
108
- span.setAttributes({
109
- "tool.duration_ms": Date.now() - startedAt,
110
- "tool.error_category": "execution_error",
111
- "tool.status": "error",
112
- });
113
- span.setStatus({ code: SpanStatusCode.ERROR });
114
- throw error;
115
- }
116
- finally {
117
- span.end();
118
- }
119
- }
120
- endSession() {
121
- if (this.ended) {
122
- return;
123
- }
124
- this.ended = true;
125
- this.sessionSpan.setAttribute("gen_ai.request.status", this.hadError ? "error" : "success");
126
- this.sessionSpan.end();
127
- }
128
- }
129
- //# sourceMappingURL=mcp-client.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mcp-client.js","sourceRoot":"","sources":["../../src/telemetry/mcp-client.ts"],"names":[],"mappings":"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"}
@@ -1,9 +0,0 @@
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
- };
@@ -1,121 +0,0 @@
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
- // 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,
103
- otlpHeaders: { Authorization: `Bearer ${input.apiKey}` },
104
- ...(otlpUrl ? { otlpUrl } : {}),
105
- serviceName: "gateway",
106
- serviceVersion: "0.0.1",
107
- }, getDefaultPolicy(deploymentTypeFor(input.config)));
108
- const mcpTelemetry = new McpClientTelemetry(telemetry.getTracer("gateway.mcp"));
109
- return {
110
- mcpTelemetry,
111
- shutdown: async () => {
112
- try {
113
- mcpTelemetry.endSession();
114
- }
115
- finally {
116
- await settleWithin(telemetry.shutdown(), TELEMETRY_SHUTDOWN_MS);
117
- }
118
- },
119
- };
120
- }
121
- //# sourceMappingURL=runtime.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/telemetry/runtime.ts"],"names":[],"mappings":"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"}