@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.
- package/dist/__tests__/claude-handler.test.d.ts +7 -0
- package/dist/__tests__/claude-handler.test.d.ts.map +1 -0
- package/dist/__tests__/claude-handler.test.js +455 -0
- package/dist/__tests__/claude-handler.test.js.map +1 -0
- package/dist/__tests__/config.test.d.ts +7 -0
- package/dist/__tests__/config.test.d.ts.map +1 -0
- package/dist/__tests__/config.test.js +156 -0
- package/dist/__tests__/config.test.js.map +1 -0
- package/dist/__tests__/errors.test.d.ts +7 -0
- package/dist/__tests__/errors.test.d.ts.map +1 -0
- package/dist/__tests__/errors.test.js +170 -0
- package/dist/__tests__/errors.test.js.map +1 -0
- package/dist/__tests__/generic-handler.test.d.ts +7 -0
- package/dist/__tests__/generic-handler.test.d.ts.map +1 -0
- package/dist/__tests__/generic-handler.test.js +243 -0
- package/dist/__tests__/generic-handler.test.js.map +1 -0
- package/dist/__tests__/llm-provider.test.d.ts +7 -0
- package/dist/__tests__/llm-provider.test.d.ts.map +1 -0
- package/dist/__tests__/llm-provider.test.js +217 -0
- package/dist/__tests__/llm-provider.test.js.map +1 -0
- package/dist/__tests__/openai-handler.test.d.ts +7 -0
- package/dist/__tests__/openai-handler.test.d.ts.map +1 -0
- package/dist/__tests__/openai-handler.test.js +359 -0
- package/dist/__tests__/openai-handler.test.js.map +1 -0
- package/dist/__tests__/provider-handler-registry.test.d.ts +9 -0
- package/dist/__tests__/provider-handler-registry.test.d.ts.map +1 -0
- package/dist/__tests__/provider-handler-registry.test.js +187 -0
- package/dist/__tests__/provider-handler-registry.test.js.map +1 -0
- package/dist/__tests__/response-parser.test.d.ts +7 -0
- package/dist/__tests__/response-parser.test.d.ts.map +1 -0
- package/dist/__tests__/response-parser.test.js +360 -0
- package/dist/__tests__/response-parser.test.js.map +1 -0
- package/dist/__tests__/route.test.d.ts +7 -0
- package/dist/__tests__/route.test.d.ts.map +1 -0
- package/dist/__tests__/route.test.js +281 -0
- package/dist/__tests__/route.test.js.map +1 -0
- package/dist/__tests__/sse.test.d.ts +7 -0
- package/dist/__tests__/sse.test.d.ts.map +1 -0
- package/dist/__tests__/sse.test.js +172 -0
- package/dist/__tests__/sse.test.js.map +1 -0
- package/dist/__tests__/template.test.d.ts +7 -0
- package/dist/__tests__/template.test.d.ts.map +1 -0
- package/dist/__tests__/template.test.js +176 -0
- package/dist/__tests__/template.test.js.map +1 -0
- package/dist/__tests__/tracing.test.d.ts +7 -0
- package/dist/__tests__/tracing.test.d.ts.map +1 -0
- package/dist/__tests__/tracing.test.js +264 -0
- package/dist/__tests__/tracing.test.js.map +1 -0
- package/dist/agent.d.ts +165 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +626 -0
- package/dist/agent.js.map +1 -0
- package/dist/api-runtime.d.ts +166 -0
- package/dist/api-runtime.d.ts.map +1 -0
- package/dist/api-runtime.js +459 -0
- package/dist/api-runtime.js.map +1 -0
- package/dist/config.d.ts +31 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +60 -0
- package/dist/config.js.map +1 -0
- package/dist/debug.d.ts +47 -0
- package/dist/debug.d.ts.map +1 -0
- package/dist/debug.js +86 -0
- package/dist/debug.js.map +1 -0
- package/dist/errors.d.ts +99 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +110 -0
- package/dist/errors.js.map +1 -0
- package/dist/express.d.ts +146 -0
- package/dist/express.d.ts.map +1 -0
- package/dist/express.js +371 -0
- package/dist/express.js.map +1 -0
- package/dist/index.d.ts +96 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +107 -0
- package/dist/index.js.map +1 -0
- package/dist/llm-agent.d.ts +193 -0
- package/dist/llm-agent.d.ts.map +1 -0
- package/dist/llm-agent.js +634 -0
- package/dist/llm-agent.js.map +1 -0
- package/dist/llm-provider.d.ts +323 -0
- package/dist/llm-provider.d.ts.map +1 -0
- package/dist/llm-provider.js +446 -0
- package/dist/llm-provider.js.map +1 -0
- package/dist/llm.d.ts +194 -0
- package/dist/llm.d.ts.map +1 -0
- package/dist/llm.js +304 -0
- package/dist/llm.js.map +1 -0
- package/dist/provider-handlers/claude-handler.d.ts +98 -0
- package/dist/provider-handlers/claude-handler.d.ts.map +1 -0
- package/dist/provider-handlers/claude-handler.js +268 -0
- package/dist/provider-handlers/claude-handler.js.map +1 -0
- package/dist/provider-handlers/gemini-handler.d.ts +82 -0
- package/dist/provider-handlers/gemini-handler.d.ts.map +1 -0
- package/dist/provider-handlers/gemini-handler.js +152 -0
- package/dist/provider-handlers/gemini-handler.js.map +1 -0
- package/dist/provider-handlers/generic-handler.d.ts +78 -0
- package/dist/provider-handlers/generic-handler.d.ts.map +1 -0
- package/dist/provider-handlers/generic-handler.js +152 -0
- package/dist/provider-handlers/generic-handler.js.map +1 -0
- package/dist/provider-handlers/index.d.ts +29 -0
- package/dist/provider-handlers/index.d.ts.map +1 -0
- package/dist/provider-handlers/index.js +32 -0
- package/dist/provider-handlers/index.js.map +1 -0
- package/dist/provider-handlers/openai-handler.d.ts +86 -0
- package/dist/provider-handlers/openai-handler.d.ts.map +1 -0
- package/dist/provider-handlers/openai-handler.js +160 -0
- package/dist/provider-handlers/openai-handler.js.map +1 -0
- package/dist/provider-handlers/provider-handler-registry.d.ts +124 -0
- package/dist/provider-handlers/provider-handler-registry.d.ts.map +1 -0
- package/dist/provider-handlers/provider-handler-registry.js +180 -0
- package/dist/provider-handlers/provider-handler-registry.js.map +1 -0
- package/dist/provider-handlers/provider-handler.d.ts +245 -0
- package/dist/provider-handlers/provider-handler.d.ts.map +1 -0
- package/dist/provider-handlers/provider-handler.js +238 -0
- package/dist/provider-handlers/provider-handler.js.map +1 -0
- package/dist/proxy.d.ts +44 -0
- package/dist/proxy.d.ts.map +1 -0
- package/dist/proxy.js +324 -0
- package/dist/proxy.js.map +1 -0
- package/dist/response-parser.d.ts +103 -0
- package/dist/response-parser.d.ts.map +1 -0
- package/dist/response-parser.js +232 -0
- package/dist/response-parser.js.map +1 -0
- package/dist/route.d.ts +185 -0
- package/dist/route.d.ts.map +1 -0
- package/dist/route.js +310 -0
- package/dist/route.js.map +1 -0
- package/dist/sse.d.ts +45 -0
- package/dist/sse.d.ts.map +1 -0
- package/dist/sse.js +77 -0
- package/dist/sse.js.map +1 -0
- package/dist/template.d.ts +86 -0
- package/dist/template.d.ts.map +1 -0
- package/dist/template.js +206 -0
- package/dist/template.js.map +1 -0
- package/dist/tracing.d.ts +88 -0
- package/dist/tracing.d.ts.map +1 -0
- package/dist/tracing.js +193 -0
- package/dist/tracing.js.map +1 -0
- package/dist/types.d.ts +618 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- 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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"}
|
package/dist/config.d.ts
ADDED
|
@@ -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"}
|