@mcpmesh/sdk 0.8.0-beta.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 (145) hide show
  1. package/dist/__tests__/claude-handler.test.d.ts +7 -0
  2. package/dist/__tests__/claude-handler.test.d.ts.map +1 -0
  3. package/dist/__tests__/claude-handler.test.js +455 -0
  4. package/dist/__tests__/claude-handler.test.js.map +1 -0
  5. package/dist/__tests__/config.test.d.ts +7 -0
  6. package/dist/__tests__/config.test.d.ts.map +1 -0
  7. package/dist/__tests__/config.test.js +156 -0
  8. package/dist/__tests__/config.test.js.map +1 -0
  9. package/dist/__tests__/errors.test.d.ts +7 -0
  10. package/dist/__tests__/errors.test.d.ts.map +1 -0
  11. package/dist/__tests__/errors.test.js +170 -0
  12. package/dist/__tests__/errors.test.js.map +1 -0
  13. package/dist/__tests__/generic-handler.test.d.ts +7 -0
  14. package/dist/__tests__/generic-handler.test.d.ts.map +1 -0
  15. package/dist/__tests__/generic-handler.test.js +243 -0
  16. package/dist/__tests__/generic-handler.test.js.map +1 -0
  17. package/dist/__tests__/llm-provider.test.d.ts +7 -0
  18. package/dist/__tests__/llm-provider.test.d.ts.map +1 -0
  19. package/dist/__tests__/llm-provider.test.js +217 -0
  20. package/dist/__tests__/llm-provider.test.js.map +1 -0
  21. package/dist/__tests__/openai-handler.test.d.ts +7 -0
  22. package/dist/__tests__/openai-handler.test.d.ts.map +1 -0
  23. package/dist/__tests__/openai-handler.test.js +359 -0
  24. package/dist/__tests__/openai-handler.test.js.map +1 -0
  25. package/dist/__tests__/provider-handler-registry.test.d.ts +9 -0
  26. package/dist/__tests__/provider-handler-registry.test.d.ts.map +1 -0
  27. package/dist/__tests__/provider-handler-registry.test.js +187 -0
  28. package/dist/__tests__/provider-handler-registry.test.js.map +1 -0
  29. package/dist/__tests__/response-parser.test.d.ts +7 -0
  30. package/dist/__tests__/response-parser.test.d.ts.map +1 -0
  31. package/dist/__tests__/response-parser.test.js +360 -0
  32. package/dist/__tests__/response-parser.test.js.map +1 -0
  33. package/dist/__tests__/route.test.d.ts +7 -0
  34. package/dist/__tests__/route.test.d.ts.map +1 -0
  35. package/dist/__tests__/route.test.js +281 -0
  36. package/dist/__tests__/route.test.js.map +1 -0
  37. package/dist/__tests__/sse.test.d.ts +7 -0
  38. package/dist/__tests__/sse.test.d.ts.map +1 -0
  39. package/dist/__tests__/sse.test.js +172 -0
  40. package/dist/__tests__/sse.test.js.map +1 -0
  41. package/dist/__tests__/template.test.d.ts +7 -0
  42. package/dist/__tests__/template.test.d.ts.map +1 -0
  43. package/dist/__tests__/template.test.js +176 -0
  44. package/dist/__tests__/template.test.js.map +1 -0
  45. package/dist/__tests__/tracing.test.d.ts +7 -0
  46. package/dist/__tests__/tracing.test.d.ts.map +1 -0
  47. package/dist/__tests__/tracing.test.js +264 -0
  48. package/dist/__tests__/tracing.test.js.map +1 -0
  49. package/dist/agent.d.ts +165 -0
  50. package/dist/agent.d.ts.map +1 -0
  51. package/dist/agent.js +626 -0
  52. package/dist/agent.js.map +1 -0
  53. package/dist/api-runtime.d.ts +166 -0
  54. package/dist/api-runtime.d.ts.map +1 -0
  55. package/dist/api-runtime.js +459 -0
  56. package/dist/api-runtime.js.map +1 -0
  57. package/dist/config.d.ts +31 -0
  58. package/dist/config.d.ts.map +1 -0
  59. package/dist/config.js +60 -0
  60. package/dist/config.js.map +1 -0
  61. package/dist/debug.d.ts +47 -0
  62. package/dist/debug.d.ts.map +1 -0
  63. package/dist/debug.js +86 -0
  64. package/dist/debug.js.map +1 -0
  65. package/dist/errors.d.ts +99 -0
  66. package/dist/errors.d.ts.map +1 -0
  67. package/dist/errors.js +110 -0
  68. package/dist/errors.js.map +1 -0
  69. package/dist/express.d.ts +146 -0
  70. package/dist/express.d.ts.map +1 -0
  71. package/dist/express.js +371 -0
  72. package/dist/express.js.map +1 -0
  73. package/dist/index.d.ts +96 -0
  74. package/dist/index.d.ts.map +1 -0
  75. package/dist/index.js +107 -0
  76. package/dist/index.js.map +1 -0
  77. package/dist/llm-agent.d.ts +193 -0
  78. package/dist/llm-agent.d.ts.map +1 -0
  79. package/dist/llm-agent.js +634 -0
  80. package/dist/llm-agent.js.map +1 -0
  81. package/dist/llm-provider.d.ts +323 -0
  82. package/dist/llm-provider.d.ts.map +1 -0
  83. package/dist/llm-provider.js +446 -0
  84. package/dist/llm-provider.js.map +1 -0
  85. package/dist/llm.d.ts +194 -0
  86. package/dist/llm.d.ts.map +1 -0
  87. package/dist/llm.js +304 -0
  88. package/dist/llm.js.map +1 -0
  89. package/dist/provider-handlers/claude-handler.d.ts +98 -0
  90. package/dist/provider-handlers/claude-handler.d.ts.map +1 -0
  91. package/dist/provider-handlers/claude-handler.js +268 -0
  92. package/dist/provider-handlers/claude-handler.js.map +1 -0
  93. package/dist/provider-handlers/gemini-handler.d.ts +82 -0
  94. package/dist/provider-handlers/gemini-handler.d.ts.map +1 -0
  95. package/dist/provider-handlers/gemini-handler.js +152 -0
  96. package/dist/provider-handlers/gemini-handler.js.map +1 -0
  97. package/dist/provider-handlers/generic-handler.d.ts +78 -0
  98. package/dist/provider-handlers/generic-handler.d.ts.map +1 -0
  99. package/dist/provider-handlers/generic-handler.js +152 -0
  100. package/dist/provider-handlers/generic-handler.js.map +1 -0
  101. package/dist/provider-handlers/index.d.ts +29 -0
  102. package/dist/provider-handlers/index.d.ts.map +1 -0
  103. package/dist/provider-handlers/index.js +32 -0
  104. package/dist/provider-handlers/index.js.map +1 -0
  105. package/dist/provider-handlers/openai-handler.d.ts +86 -0
  106. package/dist/provider-handlers/openai-handler.d.ts.map +1 -0
  107. package/dist/provider-handlers/openai-handler.js +160 -0
  108. package/dist/provider-handlers/openai-handler.js.map +1 -0
  109. package/dist/provider-handlers/provider-handler-registry.d.ts +124 -0
  110. package/dist/provider-handlers/provider-handler-registry.d.ts.map +1 -0
  111. package/dist/provider-handlers/provider-handler-registry.js +180 -0
  112. package/dist/provider-handlers/provider-handler-registry.js.map +1 -0
  113. package/dist/provider-handlers/provider-handler.d.ts +245 -0
  114. package/dist/provider-handlers/provider-handler.d.ts.map +1 -0
  115. package/dist/provider-handlers/provider-handler.js +238 -0
  116. package/dist/provider-handlers/provider-handler.js.map +1 -0
  117. package/dist/proxy.d.ts +44 -0
  118. package/dist/proxy.d.ts.map +1 -0
  119. package/dist/proxy.js +324 -0
  120. package/dist/proxy.js.map +1 -0
  121. package/dist/response-parser.d.ts +103 -0
  122. package/dist/response-parser.d.ts.map +1 -0
  123. package/dist/response-parser.js +232 -0
  124. package/dist/response-parser.js.map +1 -0
  125. package/dist/route.d.ts +185 -0
  126. package/dist/route.d.ts.map +1 -0
  127. package/dist/route.js +310 -0
  128. package/dist/route.js.map +1 -0
  129. package/dist/sse.d.ts +45 -0
  130. package/dist/sse.d.ts.map +1 -0
  131. package/dist/sse.js +77 -0
  132. package/dist/sse.js.map +1 -0
  133. package/dist/template.d.ts +86 -0
  134. package/dist/template.d.ts.map +1 -0
  135. package/dist/template.js +206 -0
  136. package/dist/template.js.map +1 -0
  137. package/dist/tracing.d.ts +88 -0
  138. package/dist/tracing.d.ts.map +1 -0
  139. package/dist/tracing.js +193 -0
  140. package/dist/tracing.js.map +1 -0
  141. package/dist/types.d.ts +618 -0
  142. package/dist/types.d.ts.map +1 -0
  143. package/dist/types.js +5 -0
  144. package/dist/types.js.map +1 -0
  145. package/package.json +68 -0
@@ -0,0 +1,166 @@
1
+ /**
2
+ * API Runtime - Singleton for auto-starting Express/API services with mesh.
3
+ *
4
+ * This module provides auto-initialization for API services (Express, etc.)
5
+ * that use mesh.route() for dependency injection. When the first mesh.route()
6
+ * is called, the runtime schedules itself to start via process.nextTick(),
7
+ * allowing all routes to be registered before connecting to the mesh.
8
+ *
9
+ * Key differences from MCP agents:
10
+ * - Uses agent_type: "api" (not "mcp_agent")
11
+ * - Port doesn't matter (API services are not called via mesh)
12
+ * - Only consumes capabilities, never provides them
13
+ *
14
+ * @example
15
+ * ```typescript
16
+ * import express from "express";
17
+ * import { mesh } from "@mcpmesh/sdk";
18
+ *
19
+ * const app = express();
20
+ *
21
+ * // mesh.route() triggers auto-init via nextTick
22
+ * app.post("/compute", mesh.route(
23
+ * [{ capability: "calculator" }],
24
+ * async (req, res, { calculator }) => {
25
+ * res.json({ result: await calculator({ a: 1, b: 2 }) });
26
+ * }
27
+ * ));
28
+ *
29
+ * app.listen(3000); // Mesh already started
30
+ * ```
31
+ */
32
+ /**
33
+ * Configuration for API runtime (optional, uses env vars if not set).
34
+ */
35
+ export interface ApiRuntimeConfig {
36
+ /** API service name prefix. Env: MCP_MESH_AGENT_NAME. Default: "api" */
37
+ name?: string;
38
+ /** Namespace for isolation. Env: MCP_MESH_NAMESPACE. Default: "default" */
39
+ namespace?: string;
40
+ /** Registry URL. Env: MCP_MESH_REGISTRY_URL. Default: "http://localhost:8000" */
41
+ registryUrl?: string;
42
+ /** Heartbeat interval in seconds. Env: MCP_MESH_HEALTH_INTERVAL. Default: 5 */
43
+ heartbeatInterval?: number;
44
+ /** Port the Express app is listening on (for registry display) */
45
+ port?: number;
46
+ }
47
+ /**
48
+ * Singleton API runtime that manages mesh connection for Express/API services.
49
+ *
50
+ * - Auto-starts when first mesh.route() is called
51
+ * - Uses agent_type: "api" for registration
52
+ * - Handles dependency resolution events
53
+ */
54
+ declare class ApiRuntime {
55
+ private static instance;
56
+ private config;
57
+ private serviceId;
58
+ private handle;
59
+ private started;
60
+ private starting;
61
+ private scheduledStart;
62
+ private constructor();
63
+ static getInstance(): ApiRuntime;
64
+ /**
65
+ * Reset the runtime (mainly for testing).
66
+ */
67
+ static reset(): void;
68
+ /**
69
+ * Configure the runtime (optional, can be called before routes are defined).
70
+ * Environment variables take precedence over config values.
71
+ */
72
+ configure(config: ApiRuntimeConfig): void;
73
+ /**
74
+ * Schedule the runtime to start on next tick.
75
+ * Called automatically when first mesh.route() is invoked.
76
+ */
77
+ scheduleStart(): void;
78
+ /**
79
+ * Start the API runtime - connects to mesh and handles dependency events.
80
+ */
81
+ start(): Promise<void>;
82
+ /**
83
+ * Run the event loop to handle mesh events.
84
+ */
85
+ private runEventLoop;
86
+ /**
87
+ * Handle dependency_available event.
88
+ */
89
+ private handleDependencyAvailable;
90
+ /**
91
+ * Handle dependency_unavailable event.
92
+ */
93
+ private handleDependencyUnavailable;
94
+ /**
95
+ * Install signal handlers for graceful shutdown.
96
+ */
97
+ private installSignalHandlers;
98
+ /**
99
+ * Shutdown the API runtime gracefully.
100
+ */
101
+ shutdown(): Promise<void>;
102
+ /**
103
+ * Get the service ID.
104
+ */
105
+ getServiceId(): string;
106
+ /**
107
+ * Check if the runtime is started.
108
+ */
109
+ isStarted(): boolean;
110
+ /**
111
+ * Update Express info detected on first request.
112
+ * Called by route middleware when auto-detection runs.
113
+ *
114
+ * After introspection, this method updates the Rust core with:
115
+ * 1. Updated tools with proper route names (e.g., "GET:/time" instead of "route_0_UNKNOWN:UNKNOWN")
116
+ * 2. Detected HTTP port
117
+ *
118
+ * The Rust core uses smart diffing - only sends a heartbeat if tools actually changed.
119
+ *
120
+ * @param port - Port detected from req.socket.localPort
121
+ * @param routeCount - Number of routes discovered via introspection
122
+ */
123
+ updateExpressInfo(port: number, routeCount: number): void;
124
+ }
125
+ export declare function getApiRuntime(): ApiRuntime;
126
+ /**
127
+ * Introspect Express app to discover route method/path for mesh routes.
128
+ *
129
+ * Express 4 stores routes in app._router.stack
130
+ * Express 5 stores routes in app.router.stack
131
+ *
132
+ * Each layer has:
133
+ * - route.path: the path pattern
134
+ * - route.methods: object with method flags { get: true, post: true, ... }
135
+ * - route.stack[0].handle: the handler function
136
+ *
137
+ * We match handlers by looking for our _meshRouteId marker.
138
+ */
139
+ export declare function introspectExpressRoutes(app: unknown): number;
140
+ /**
141
+ * Bind mesh to an Express app, introspecting routes for proper naming.
142
+ *
143
+ * This is OPTIONAL - everything works without it, but route names in logs
144
+ * will be "route_0_UNKNOWN:UNKNOWN" instead of "GET:/time".
145
+ *
146
+ * Port is auto-detected from PORT env var.
147
+ *
148
+ * @param app - Express application instance
149
+ * @returns Number of routes discovered
150
+ *
151
+ * @example
152
+ * ```typescript
153
+ * const app = express();
154
+ *
155
+ * app.get("/time", mesh.route([...], handler));
156
+ * app.get("/status", mesh.route([...], handler));
157
+ *
158
+ * // Optional: get proper route names in logs
159
+ * mesh.bind(app);
160
+ *
161
+ * app.listen(process.env.PORT || 4000);
162
+ * ```
163
+ */
164
+ export declare function bindToExpress(app: unknown): number;
165
+ export { ApiRuntime };
166
+ //# sourceMappingURL=api-runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-runtime.d.ts","sourceRoot":"","sources":["../src/api-runtime.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAyCH;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,wEAAwE;IACxE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,2EAA2E;IAC3E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iFAAiF;IACjF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+EAA+E;IAC/E,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,kEAAkE;IAClE,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;;;;GAMG;AACH,cAAM,UAAU;IACd,OAAO,CAAC,MAAM,CAAC,QAAQ,CAA2B;IAElD,OAAO,CAAC,MAAM,CAAwB;IACtC,OAAO,CAAC,SAAS,CAAc;IAC/B,OAAO,CAAC,MAAM,CAA8B;IAC5C,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,cAAc,CAAS;IAE/B,OAAO;IAEP,MAAM,CAAC,WAAW,IAAI,UAAU;IAOhC;;OAEG;IACH,MAAM,CAAC,KAAK,IAAI,IAAI;IAOpB;;;OAGG;IACH,SAAS,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI;IAIzC;;;OAGG;IACH,aAAa,IAAI,IAAI;IAgBrB;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAyF5B;;OAEG;YACW,YAAY;IAqE1B;;OAEG;IACH,OAAO,CAAC,yBAAyB;IAyCjC;;OAEG;IACH,OAAO,CAAC,2BAA2B;IA2BnC;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAyB7B;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAO/B;;OAEG;IACH,YAAY,IAAI,MAAM;IAItB;;OAEG;IACH,SAAS,IAAI,OAAO;IAIpB;;;;;;;;;;;;OAYG;IACH,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI;CAgC1D;AAGD,wBAAgB,aAAa,IAAI,UAAU,CAE1C;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAiD5D;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CASlD;AAGD,OAAO,EAAE,UAAU,EAAE,CAAC"}
@@ -0,0 +1,459 @@
1
+ /**
2
+ * API Runtime - Singleton for auto-starting Express/API services with mesh.
3
+ *
4
+ * This module provides auto-initialization for API services (Express, etc.)
5
+ * that use mesh.route() for dependency injection. When the first mesh.route()
6
+ * is called, the runtime schedules itself to start via process.nextTick(),
7
+ * allowing all routes to be registered before connecting to the mesh.
8
+ *
9
+ * Key differences from MCP agents:
10
+ * - Uses agent_type: "api" (not "mcp_agent")
11
+ * - Port doesn't matter (API services are not called via mesh)
12
+ * - Only consumes capabilities, never provides them
13
+ *
14
+ * @example
15
+ * ```typescript
16
+ * import express from "express";
17
+ * import { mesh } from "@mcpmesh/sdk";
18
+ *
19
+ * const app = express();
20
+ *
21
+ * // mesh.route() triggers auto-init via nextTick
22
+ * app.post("/compute", mesh.route(
23
+ * [{ capability: "calculator" }],
24
+ * async (req, res, { calculator }) => {
25
+ * res.json({ result: await calculator({ a: 1, b: 2 }) });
26
+ * }
27
+ * ));
28
+ *
29
+ * app.listen(3000); // Mesh already started
30
+ * ```
31
+ */
32
+ import { startAgent, resolveConfig, resolveConfigInt, autoDetectIp, } from "@mcpmesh/core";
33
+ import { RouteRegistry } from "./route.js";
34
+ import { createProxy } from "./proxy.js";
35
+ import { initTracing } from "./tracing.js";
36
+ /**
37
+ * Build tool specs from registered routes.
38
+ * Shared helper to avoid duplication between start() and updateExpressInfo().
39
+ */
40
+ function buildToolSpecs(routes) {
41
+ return routes
42
+ .filter((route) => route.dependencies.length > 0)
43
+ .map((route) => ({
44
+ functionName: route.routeId,
45
+ capability: "", // API routes don't provide capabilities
46
+ version: "1.0.0",
47
+ tags: [],
48
+ description: "",
49
+ dependencies: route.dependencies.map((dep) => ({
50
+ capability: dep.capability,
51
+ tags: dep.tags,
52
+ version: dep.version,
53
+ })),
54
+ inputSchema: undefined,
55
+ }));
56
+ }
57
+ /**
58
+ * Singleton API runtime that manages mesh connection for Express/API services.
59
+ *
60
+ * - Auto-starts when first mesh.route() is called
61
+ * - Uses agent_type: "api" for registration
62
+ * - Handles dependency resolution events
63
+ */
64
+ class ApiRuntime {
65
+ static instance = null;
66
+ config = {};
67
+ serviceId = "";
68
+ handle = null;
69
+ started = false;
70
+ starting = false;
71
+ scheduledStart = false;
72
+ constructor() { }
73
+ static getInstance() {
74
+ if (!ApiRuntime.instance) {
75
+ ApiRuntime.instance = new ApiRuntime();
76
+ }
77
+ return ApiRuntime.instance;
78
+ }
79
+ /**
80
+ * Reset the runtime (mainly for testing).
81
+ */
82
+ static reset() {
83
+ if (ApiRuntime.instance?.handle) {
84
+ ApiRuntime.instance.handle.shutdown().catch(() => { });
85
+ }
86
+ ApiRuntime.instance = null;
87
+ }
88
+ /**
89
+ * Configure the runtime (optional, can be called before routes are defined).
90
+ * Environment variables take precedence over config values.
91
+ */
92
+ configure(config) {
93
+ this.config = { ...this.config, ...config };
94
+ }
95
+ /**
96
+ * Schedule the runtime to start on next tick.
97
+ * Called automatically when first mesh.route() is invoked.
98
+ */
99
+ scheduleStart() {
100
+ if (this.started || this.starting || this.scheduledStart) {
101
+ return;
102
+ }
103
+ this.scheduledStart = true;
104
+ // Use process.nextTick to start after all routes are registered
105
+ process.nextTick(() => {
106
+ this.start().catch((err) => {
107
+ console.error("ApiRuntime auto-start failed:", err);
108
+ // Don't exit - the app may still work with degraded functionality
109
+ });
110
+ });
111
+ }
112
+ /**
113
+ * Start the API runtime - connects to mesh and handles dependency events.
114
+ */
115
+ async start() {
116
+ if (this.started)
117
+ return;
118
+ if (this.starting) {
119
+ // Wait for existing start to complete
120
+ while (this.starting) {
121
+ await new Promise((resolve) => setTimeout(resolve, 10));
122
+ }
123
+ return;
124
+ }
125
+ this.starting = true;
126
+ try {
127
+ // Generate service ID: "api-<random-suffix>"
128
+ const namePart = resolveConfig("agent_name", this.config.name) || "api";
129
+ const suffix = Math.random().toString(36).substring(2, 10);
130
+ this.serviceId = `${namePart}-${suffix}`;
131
+ console.log(`Starting API runtime: ${this.serviceId}`);
132
+ // Resolve configuration with env var precedence
133
+ const registryUrl = resolveConfig("registry_url", this.config.registryUrl);
134
+ const namespace = resolveConfig("namespace", this.config.namespace);
135
+ const heartbeatInterval = resolveConfigInt("health_interval", this.config.heartbeatInterval ?? null) ?? 5;
136
+ // Get port from config, env var, or default to 0
137
+ // Common pattern: apps use PORT env var
138
+ const port = this.config.port ??
139
+ (process.env.PORT ? parseInt(process.env.PORT, 10) : 0);
140
+ // Initialize distributed tracing
141
+ const agentMetadata = {
142
+ agentId: this.serviceId,
143
+ agentName: namePart,
144
+ agentNamespace: namespace,
145
+ agentHostname: autoDetectIp(),
146
+ agentIp: autoDetectIp(),
147
+ agentPort: port,
148
+ agentEndpoint: port > 0 ? `http://${autoDetectIp()}:${port}` : "",
149
+ };
150
+ await initTracing(agentMetadata);
151
+ // Build tool specs from registered routes
152
+ const registry = RouteRegistry.getInstance();
153
+ const routes = registry.getRoutes();
154
+ const tools = buildToolSpecs(routes);
155
+ // Create AgentSpec with agent_type: "api"
156
+ const spec = {
157
+ name: this.serviceId,
158
+ version: "1.0.0",
159
+ description: "",
160
+ registryUrl,
161
+ httpPort: port,
162
+ httpHost: autoDetectIp(),
163
+ namespace,
164
+ agentType: "api", // API services only consume capabilities
165
+ tools,
166
+ heartbeatInterval,
167
+ };
168
+ // Start the agent via Rust core
169
+ this.handle = startAgent(spec);
170
+ // Count total dependencies
171
+ const totalDeps = routes.reduce((sum, r) => sum + r.dependencies.length, 0);
172
+ console.log(`API runtime registered: ${routes.length} routes with ${totalDeps} dependencies`);
173
+ // Start event loop in background
174
+ this.runEventLoop();
175
+ // Install signal handlers for graceful shutdown
176
+ this.installSignalHandlers();
177
+ this.started = true;
178
+ }
179
+ finally {
180
+ this.starting = false;
181
+ }
182
+ }
183
+ /**
184
+ * Run the event loop to handle mesh events.
185
+ */
186
+ async runEventLoop() {
187
+ if (!this.handle)
188
+ return;
189
+ const registry = RouteRegistry.getInstance();
190
+ while (true) {
191
+ try {
192
+ // Check if handle was nulled during shutdown
193
+ if (!this.handle) {
194
+ console.log("API runtime event loop: handle nulled, exiting");
195
+ return;
196
+ }
197
+ const event = await this.handle.nextEvent();
198
+ switch (event.eventType) {
199
+ case "agent_registered":
200
+ console.log(`API service registered: ${event.agentId}`);
201
+ break;
202
+ case "registration_failed":
203
+ console.error(`API registration failed: ${event.error}`);
204
+ break;
205
+ case "dependency_available":
206
+ case "dependency_changed":
207
+ this.handleDependencyAvailable(registry, event.capability, event.endpoint, event.functionName, event.agentId, event.requestingFunction, event.depIndex);
208
+ break;
209
+ case "dependency_unavailable":
210
+ this.handleDependencyUnavailable(registry, event.capability, event.requestingFunction, event.depIndex);
211
+ break;
212
+ case "registry_connected":
213
+ console.log("API runtime connected to registry");
214
+ break;
215
+ case "registry_disconnected":
216
+ console.warn(`API runtime disconnected: ${event.reason}`);
217
+ registry.clearAllDependencies();
218
+ break;
219
+ case "shutdown":
220
+ console.log("API runtime shutting down");
221
+ return;
222
+ default:
223
+ break;
224
+ }
225
+ }
226
+ catch (err) {
227
+ console.error("API runtime event loop error:", err);
228
+ break;
229
+ }
230
+ }
231
+ }
232
+ /**
233
+ * Handle dependency_available event.
234
+ */
235
+ handleDependencyAvailable(registry, capability, endpoint, functionName, agentId, requestingFunction, depIndex) {
236
+ // If we have position info, use it directly
237
+ if (requestingFunction !== undefined && depIndex !== undefined) {
238
+ const route = registry.getRoute(requestingFunction);
239
+ const kwargs = route?.dependencyKwargs?.[depIndex];
240
+ const proxy = createProxy(endpoint, capability, functionName, kwargs);
241
+ registry.setDependency(requestingFunction, depIndex, proxy);
242
+ console.log(`Dependency available: ${capability} at ${endpoint} (route: ${requestingFunction}, agent: ${agentId})`);
243
+ return;
244
+ }
245
+ // Fallback: match by capability across all routes
246
+ let matchCount = 0;
247
+ for (const route of registry.getRoutes()) {
248
+ route.dependencies.forEach((dep, idx) => {
249
+ if (dep.capability === capability) {
250
+ const kwargs = route.dependencyKwargs?.[idx];
251
+ const proxy = createProxy(endpoint, capability, functionName, kwargs);
252
+ registry.setDependency(route.routeId, idx, proxy);
253
+ matchCount++;
254
+ }
255
+ });
256
+ }
257
+ console.log(`Dependency available: ${capability} at ${endpoint} (${matchCount} routes)`);
258
+ }
259
+ /**
260
+ * Handle dependency_unavailable event.
261
+ */
262
+ handleDependencyUnavailable(registry, capability, requestingFunction, depIndex) {
263
+ // If we have position info, use it directly
264
+ if (requestingFunction !== undefined && depIndex !== undefined) {
265
+ registry.removeDependency(requestingFunction, depIndex);
266
+ console.log(`Dependency unavailable: ${capability} (route: ${requestingFunction})`);
267
+ return;
268
+ }
269
+ // Fallback: match by capability across all routes
270
+ let removeCount = 0;
271
+ for (const route of registry.getRoutes()) {
272
+ route.dependencies.forEach((dep, idx) => {
273
+ if (dep.capability === capability) {
274
+ registry.removeDependency(route.routeId, idx);
275
+ removeCount++;
276
+ }
277
+ });
278
+ }
279
+ console.log(`Dependency unavailable: ${capability} (${removeCount} routes)`);
280
+ }
281
+ /**
282
+ * Install signal handlers for graceful shutdown.
283
+ */
284
+ installSignalHandlers() {
285
+ let shuttingDown = false;
286
+ const shutdownHandler = async (signal) => {
287
+ if (shuttingDown)
288
+ return;
289
+ shuttingDown = true;
290
+ console.log(`\nReceived ${signal}, shutting down ${this.serviceId}...`);
291
+ try {
292
+ await this.shutdown();
293
+ }
294
+ catch (err) {
295
+ console.error("Error during API runtime shutdown:", err);
296
+ }
297
+ // Exit the process after mesh shutdown
298
+ // The Express server may still be running, but we've cleanly
299
+ // unregistered from the mesh registry
300
+ process.exit(0);
301
+ };
302
+ process.on("SIGINT", () => void shutdownHandler("SIGINT"));
303
+ process.on("SIGTERM", () => void shutdownHandler("SIGTERM"));
304
+ }
305
+ /**
306
+ * Shutdown the API runtime gracefully.
307
+ */
308
+ async shutdown() {
309
+ if (this.handle) {
310
+ await this.handle.shutdown();
311
+ this.handle = null;
312
+ }
313
+ }
314
+ /**
315
+ * Get the service ID.
316
+ */
317
+ getServiceId() {
318
+ return this.serviceId;
319
+ }
320
+ /**
321
+ * Check if the runtime is started.
322
+ */
323
+ isStarted() {
324
+ return this.started;
325
+ }
326
+ /**
327
+ * Update Express info detected on first request.
328
+ * Called by route middleware when auto-detection runs.
329
+ *
330
+ * After introspection, this method updates the Rust core with:
331
+ * 1. Updated tools with proper route names (e.g., "GET:/time" instead of "route_0_UNKNOWN:UNKNOWN")
332
+ * 2. Detected HTTP port
333
+ *
334
+ * The Rust core uses smart diffing - only sends a heartbeat if tools actually changed.
335
+ *
336
+ * @param port - Port detected from req.socket.localPort
337
+ * @param routeCount - Number of routes discovered via introspection
338
+ */
339
+ updateExpressInfo(port, routeCount) {
340
+ if (!this.handle) {
341
+ console.warn("Cannot update Express info: handle not available");
342
+ return;
343
+ }
344
+ // Update port if detected
345
+ if (port > 0) {
346
+ this.config.port = port;
347
+ // Send port update to Rust core (triggers heartbeat if changed)
348
+ this.handle.updatePort(port).catch((err) => {
349
+ console.warn("Failed to update port:", err);
350
+ });
351
+ }
352
+ // Build updated tool specs with proper route names
353
+ const registry = RouteRegistry.getInstance();
354
+ const routes = registry.getRoutes();
355
+ const tools = buildToolSpecs(routes);
356
+ // Send updated tools to Rust core
357
+ // The Rust core uses smart diffing - only sends heartbeat if tools changed
358
+ this.handle.updateTools(tools).then((sent) => {
359
+ if (sent) {
360
+ console.log(`Express auto-detected: port ${port}, ${routeCount} mesh routes updated`);
361
+ }
362
+ }).catch((err) => {
363
+ console.warn("Failed to update tools:", err);
364
+ });
365
+ }
366
+ }
367
+ // Export singleton instance getter
368
+ export function getApiRuntime() {
369
+ return ApiRuntime.getInstance();
370
+ }
371
+ /**
372
+ * Introspect Express app to discover route method/path for mesh routes.
373
+ *
374
+ * Express 4 stores routes in app._router.stack
375
+ * Express 5 stores routes in app.router.stack
376
+ *
377
+ * Each layer has:
378
+ * - route.path: the path pattern
379
+ * - route.methods: object with method flags { get: true, post: true, ... }
380
+ * - route.stack[0].handle: the handler function
381
+ *
382
+ * We match handlers by looking for our _meshRouteId marker.
383
+ */
384
+ export function introspectExpressRoutes(app) {
385
+ const registry = RouteRegistry.getInstance();
386
+ let updatedCount = 0;
387
+ // Access Express internal router (Express 5 uses .router, Express 4 uses ._router)
388
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
389
+ const expressApp = app;
390
+ const router = expressApp.router || expressApp._router;
391
+ if (!router || !router.stack) {
392
+ console.warn("Express router not found - routes may not be registered yet");
393
+ return 0;
394
+ }
395
+ // Iterate through router stack
396
+ for (const layer of router.stack) {
397
+ if (!layer.route)
398
+ continue; // Skip middleware layers
399
+ const route = layer.route;
400
+ const path = route.path;
401
+ const methods = Object.keys(route.methods)
402
+ .filter((m) => route.methods[m])
403
+ .map((m) => m.toUpperCase());
404
+ // Check each handler in the route stack
405
+ for (const routeLayer of route.stack) {
406
+ const handler = routeLayer.handle;
407
+ // Check if this handler was created by mesh.route()
408
+ if (handler && handler._meshRouteId) {
409
+ const oldRouteId = handler._meshRouteId;
410
+ const method = methods[0] || "GET"; // Use first method
411
+ // Update the registry with proper method/path
412
+ registry.updateRouteInfo(oldRouteId, method, path);
413
+ // Update the handler's route ID reference (both direct and via ref object)
414
+ const newRouteId = `${method}:${path}`;
415
+ handler._meshRouteId = newRouteId;
416
+ if (handler._meshRouteRef) {
417
+ handler._meshRouteRef.id = newRouteId;
418
+ }
419
+ updatedCount++;
420
+ }
421
+ }
422
+ }
423
+ return updatedCount;
424
+ }
425
+ /**
426
+ * Bind mesh to an Express app, introspecting routes for proper naming.
427
+ *
428
+ * This is OPTIONAL - everything works without it, but route names in logs
429
+ * will be "route_0_UNKNOWN:UNKNOWN" instead of "GET:/time".
430
+ *
431
+ * Port is auto-detected from PORT env var.
432
+ *
433
+ * @param app - Express application instance
434
+ * @returns Number of routes discovered
435
+ *
436
+ * @example
437
+ * ```typescript
438
+ * const app = express();
439
+ *
440
+ * app.get("/time", mesh.route([...], handler));
441
+ * app.get("/status", mesh.route([...], handler));
442
+ *
443
+ * // Optional: get proper route names in logs
444
+ * mesh.bind(app);
445
+ *
446
+ * app.listen(process.env.PORT || 4000);
447
+ * ```
448
+ */
449
+ export function bindToExpress(app) {
450
+ // Introspect routes for proper naming
451
+ const count = introspectExpressRoutes(app);
452
+ if (count > 0) {
453
+ console.log(`Mesh bound to Express: ${count} routes discovered`);
454
+ }
455
+ return count;
456
+ }
457
+ // Export for testing
458
+ export { ApiRuntime };
459
+ //# sourceMappingURL=api-runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-runtime.js","sourceRoot":"","sources":["../src/api-runtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Configuration utilities for MCP Mesh agents.
3
+ *
4
+ * All configuration resolution is delegated to Rust core for consistency
5
+ * across all language SDKs. Priority: ENV > config > defaults
6
+ *
7
+ * Defaults are also sourced from Rust core to ensure single source of truth.
8
+ */
9
+ import type { AgentConfig, ResolvedAgentConfig } from "./types.js";
10
+ /**
11
+ * Generate a short UUID suffix (8 hex chars) for agent IDs.
12
+ */
13
+ export declare function generateAgentIdSuffix(): string;
14
+ /**
15
+ * Resolve configuration with environment variable precedence via Rust core.
16
+ *
17
+ * All resolution is delegated to Rust core to ensure consistent behavior
18
+ * across Python and TypeScript SDKs.
19
+ *
20
+ * Priority (handled by Rust): ENV > config > defaults
21
+ *
22
+ * Environment variables:
23
+ * - MCP_MESH_AGENT_NAME: Override agent name
24
+ * - MCP_MESH_HTTP_HOST: Override host (auto-detected if not set)
25
+ * - MCP_MESH_HTTP_PORT: Override port
26
+ * - MCP_MESH_NAMESPACE: Override namespace
27
+ * - MCP_MESH_REGISTRY_URL: Override registry URL
28
+ * - MCP_MESH_HEALTH_INTERVAL: Override heartbeat interval
29
+ */
30
+ export declare function resolveConfig(config: AgentConfig): ResolvedAgentConfig;
31
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAanE;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CAE9C;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,WAAW,GAAG,mBAAmB,CA8BtE"}