@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,176 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unit tests for template.ts
|
|
3
|
+
*
|
|
4
|
+
* Tests Handlebars template rendering and utilities.
|
|
5
|
+
*/
|
|
6
|
+
import { describe, it, expect, beforeEach } from "vitest";
|
|
7
|
+
import { isFileTemplate, extractFilePath, renderTemplate, clearTemplateCache, registerHelper, registerPartial, } from "../template.js";
|
|
8
|
+
describe("isFileTemplate", () => {
|
|
9
|
+
it("should return true for file:// templates", () => {
|
|
10
|
+
expect(isFileTemplate("file://path/to/template.hbs")).toBe(true);
|
|
11
|
+
expect(isFileTemplate("file://template.txt")).toBe(true);
|
|
12
|
+
expect(isFileTemplate("file://./relative/path.hbs")).toBe(true);
|
|
13
|
+
});
|
|
14
|
+
it("should return false for inline templates", () => {
|
|
15
|
+
expect(isFileTemplate("Hello {{name}}!")).toBe(false);
|
|
16
|
+
expect(isFileTemplate("Just plain text")).toBe(false);
|
|
17
|
+
expect(isFileTemplate("")).toBe(false);
|
|
18
|
+
});
|
|
19
|
+
it("should return false for file-like but not file:// templates", () => {
|
|
20
|
+
expect(isFileTemplate("filepath://test")).toBe(false);
|
|
21
|
+
expect(isFileTemplate("File://test")).toBe(false); // case sensitive
|
|
22
|
+
expect(isFileTemplate(" file://test")).toBe(false); // leading space
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
describe("extractFilePath", () => {
|
|
26
|
+
it("should extract path from file:// template", () => {
|
|
27
|
+
expect(extractFilePath("file://path/to/template.hbs")).toBe("path/to/template.hbs");
|
|
28
|
+
expect(extractFilePath("file://template.txt")).toBe("template.txt");
|
|
29
|
+
expect(extractFilePath("file:///absolute/path.hbs")).toBe("/absolute/path.hbs");
|
|
30
|
+
});
|
|
31
|
+
it("should throw for non-file templates", () => {
|
|
32
|
+
expect(() => extractFilePath("Hello {{name}}")).toThrow("Not a file template");
|
|
33
|
+
expect(() => extractFilePath("")).toThrow("Not a file template");
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
describe("renderTemplate", () => {
|
|
37
|
+
beforeEach(() => {
|
|
38
|
+
clearTemplateCache();
|
|
39
|
+
});
|
|
40
|
+
describe("inline templates", () => {
|
|
41
|
+
it("should render simple variable substitution", async () => {
|
|
42
|
+
const result = await renderTemplate("Hello {{name}}!", { name: "World" });
|
|
43
|
+
expect(result).toBe("Hello World!");
|
|
44
|
+
});
|
|
45
|
+
it("should render multiple variables", async () => {
|
|
46
|
+
const result = await renderTemplate("{{greeting}}, {{name}}! You have {{count}} messages.", { greeting: "Hi", name: "User", count: 5 });
|
|
47
|
+
expect(result).toBe("Hi, User! You have 5 messages.");
|
|
48
|
+
});
|
|
49
|
+
it("should handle missing variables as empty", async () => {
|
|
50
|
+
const result = await renderTemplate("Hello {{name}}!", {});
|
|
51
|
+
expect(result).toBe("Hello !");
|
|
52
|
+
});
|
|
53
|
+
it("should render nested object properties", async () => {
|
|
54
|
+
const result = await renderTemplate("Name: {{user.name}}, Age: {{user.age}}", {
|
|
55
|
+
user: { name: "John", age: 30 },
|
|
56
|
+
});
|
|
57
|
+
expect(result).toBe("Name: John, Age: 30");
|
|
58
|
+
});
|
|
59
|
+
it("should render arrays with #each", async () => {
|
|
60
|
+
const result = await renderTemplate("Items: {{#each items}}{{this}}{{#unless @last}}, {{/unless}}{{/each}}", { items: ["a", "b", "c"] });
|
|
61
|
+
expect(result).toBe("Items: a, b, c");
|
|
62
|
+
});
|
|
63
|
+
it("should handle conditionals", async () => {
|
|
64
|
+
const template = "{{#if active}}Active{{else}}Inactive{{/if}}";
|
|
65
|
+
const activeResult = await renderTemplate(template, { active: true });
|
|
66
|
+
expect(activeResult).toBe("Active");
|
|
67
|
+
const inactiveResult = await renderTemplate(template, { active: false });
|
|
68
|
+
expect(inactiveResult).toBe("Inactive");
|
|
69
|
+
});
|
|
70
|
+
it("should render empty string for empty template", async () => {
|
|
71
|
+
const result = await renderTemplate("", {});
|
|
72
|
+
expect(result).toBe("");
|
|
73
|
+
});
|
|
74
|
+
it("should preserve literal text", async () => {
|
|
75
|
+
const result = await renderTemplate("No variables here.", {});
|
|
76
|
+
expect(result).toBe("No variables here.");
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
describe("built-in helpers", () => {
|
|
80
|
+
it("should use json helper", async () => {
|
|
81
|
+
// Use triple braces to avoid HTML escaping
|
|
82
|
+
const result = await renderTemplate("Data: {{{json data}}}", {
|
|
83
|
+
data: { key: "value" },
|
|
84
|
+
});
|
|
85
|
+
expect(result).toContain('"key": "value"');
|
|
86
|
+
});
|
|
87
|
+
it("should use join helper", async () => {
|
|
88
|
+
const result = await renderTemplate("Items: {{join items ', '}}", {
|
|
89
|
+
items: ["a", "b", "c"],
|
|
90
|
+
});
|
|
91
|
+
expect(result).toBe("Items: a, b, c");
|
|
92
|
+
});
|
|
93
|
+
it("should handle join with non-array", async () => {
|
|
94
|
+
const result = await renderTemplate("Items: {{join notArray ', '}}", {
|
|
95
|
+
notArray: "string",
|
|
96
|
+
});
|
|
97
|
+
expect(result).toBe("Items: ");
|
|
98
|
+
});
|
|
99
|
+
it("should use eq helper", async () => {
|
|
100
|
+
const template = "{{#if (eq status 'active')}}Yes{{else}}No{{/if}}";
|
|
101
|
+
const activeResult = await renderTemplate(template, { status: "active" });
|
|
102
|
+
expect(activeResult).toBe("Yes");
|
|
103
|
+
const otherResult = await renderTemplate(template, { status: "inactive" });
|
|
104
|
+
expect(otherResult).toBe("No");
|
|
105
|
+
});
|
|
106
|
+
it("should use ne helper", async () => {
|
|
107
|
+
const template = "{{#if (ne value 0)}}Non-zero{{else}}Zero{{/if}}";
|
|
108
|
+
const nonZero = await renderTemplate(template, { value: 5 });
|
|
109
|
+
expect(nonZero).toBe("Non-zero");
|
|
110
|
+
const zero = await renderTemplate(template, { value: 0 });
|
|
111
|
+
expect(zero).toBe("Zero");
|
|
112
|
+
});
|
|
113
|
+
it("should use default helper", async () => {
|
|
114
|
+
const template = "Name: {{default name 'Anonymous'}}";
|
|
115
|
+
const withName = await renderTemplate(template, { name: "John" });
|
|
116
|
+
expect(withName).toBe("Name: John");
|
|
117
|
+
const withoutName = await renderTemplate(template, {});
|
|
118
|
+
expect(withoutName).toBe("Name: Anonymous");
|
|
119
|
+
});
|
|
120
|
+
});
|
|
121
|
+
describe("template caching", () => {
|
|
122
|
+
it("should cache compiled templates", async () => {
|
|
123
|
+
const template = "Hello {{name}}!";
|
|
124
|
+
// First render - compiles template
|
|
125
|
+
const result1 = await renderTemplate(template, { name: "First" });
|
|
126
|
+
expect(result1).toBe("Hello First!");
|
|
127
|
+
// Second render - uses cache
|
|
128
|
+
const result2 = await renderTemplate(template, { name: "Second" });
|
|
129
|
+
expect(result2).toBe("Hello Second!");
|
|
130
|
+
});
|
|
131
|
+
it("should clear cache", async () => {
|
|
132
|
+
const template = "Hello {{name}}!";
|
|
133
|
+
await renderTemplate(template, { name: "Test" });
|
|
134
|
+
clearTemplateCache();
|
|
135
|
+
// Should work after cache clear
|
|
136
|
+
const result = await renderTemplate(template, { name: "After Clear" });
|
|
137
|
+
expect(result).toBe("Hello After Clear!");
|
|
138
|
+
});
|
|
139
|
+
});
|
|
140
|
+
});
|
|
141
|
+
describe("registerHelper", () => {
|
|
142
|
+
beforeEach(() => {
|
|
143
|
+
clearTemplateCache();
|
|
144
|
+
});
|
|
145
|
+
it("should register and use custom helper", async () => {
|
|
146
|
+
registerHelper("uppercase", (str) => str.toUpperCase());
|
|
147
|
+
const result = await renderTemplate("Name: {{uppercase name}}", { name: "john" });
|
|
148
|
+
expect(result).toBe("Name: JOHN");
|
|
149
|
+
});
|
|
150
|
+
it("should register helper with multiple arguments", async () => {
|
|
151
|
+
registerHelper("repeat", (str, times) => {
|
|
152
|
+
return str.repeat(typeof times === "number" ? times : 1);
|
|
153
|
+
});
|
|
154
|
+
const result = await renderTemplate("{{repeat text 3}}", { text: "Hi" });
|
|
155
|
+
expect(result).toBe("HiHiHi");
|
|
156
|
+
});
|
|
157
|
+
});
|
|
158
|
+
describe("registerPartial", () => {
|
|
159
|
+
beforeEach(() => {
|
|
160
|
+
clearTemplateCache();
|
|
161
|
+
});
|
|
162
|
+
it("should register and use partial template", async () => {
|
|
163
|
+
registerPartial("header", "<h1>{{title}}</h1>");
|
|
164
|
+
const result = await renderTemplate("{{> header title='Welcome'}}", {});
|
|
165
|
+
expect(result).toBe("<h1>Welcome</h1>");
|
|
166
|
+
});
|
|
167
|
+
it("should use partial with context", async () => {
|
|
168
|
+
registerPartial("userCard", "User: {{name}} ({{role}})");
|
|
169
|
+
const result = await renderTemplate("{{> userCard}}", {
|
|
170
|
+
name: "John",
|
|
171
|
+
role: "Admin",
|
|
172
|
+
});
|
|
173
|
+
expect(result).toBe("User: John (Admin)");
|
|
174
|
+
});
|
|
175
|
+
});
|
|
176
|
+
//# sourceMappingURL=template.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template.test.js","sourceRoot":"","sources":["../../src/__tests__/template.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tracing.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/tracing.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
|
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unit tests for tracing.ts
|
|
3
|
+
*
|
|
4
|
+
* Tests distributed tracing utilities for MCP Mesh TypeScript SDK.
|
|
5
|
+
*/
|
|
6
|
+
import { describe, it, expect, vi, beforeEach } from "vitest";
|
|
7
|
+
import { generateTraceId, generateSpanId, parseTraceContext, createTraceHeaders, publishTraceSpan, } from "../tracing.js";
|
|
8
|
+
// Mock the @mcpmesh/core module
|
|
9
|
+
vi.mock("@mcpmesh/core", () => ({
|
|
10
|
+
isTracingEnabled: vi.fn(() => false),
|
|
11
|
+
initTracePublisher: vi.fn(async () => true),
|
|
12
|
+
publishSpan: vi.fn(async () => true),
|
|
13
|
+
isTracePublisherAvailable: vi.fn(async () => true),
|
|
14
|
+
}));
|
|
15
|
+
describe("generateTraceId", () => {
|
|
16
|
+
it("should generate a 32-character hex string (UUID without dashes)", () => {
|
|
17
|
+
const traceId = generateTraceId();
|
|
18
|
+
expect(traceId).toHaveLength(32);
|
|
19
|
+
expect(traceId).toMatch(/^[0-9a-f]{32}$/);
|
|
20
|
+
});
|
|
21
|
+
it("should not contain dashes", () => {
|
|
22
|
+
const traceId = generateTraceId();
|
|
23
|
+
expect(traceId).not.toContain("-");
|
|
24
|
+
});
|
|
25
|
+
it("should generate unique trace IDs", () => {
|
|
26
|
+
const traceId1 = generateTraceId();
|
|
27
|
+
const traceId2 = generateTraceId();
|
|
28
|
+
const traceId3 = generateTraceId();
|
|
29
|
+
expect(traceId1).not.toBe(traceId2);
|
|
30
|
+
expect(traceId2).not.toBe(traceId3);
|
|
31
|
+
expect(traceId1).not.toBe(traceId3);
|
|
32
|
+
});
|
|
33
|
+
it("should generate 1000 unique trace IDs without collision", () => {
|
|
34
|
+
const traceIds = new Set();
|
|
35
|
+
for (let i = 0; i < 1000; i++) {
|
|
36
|
+
traceIds.add(generateTraceId());
|
|
37
|
+
}
|
|
38
|
+
expect(traceIds.size).toBe(1000);
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
describe("generateSpanId", () => {
|
|
42
|
+
it("should generate a 16-character hex string (OTel compliant)", () => {
|
|
43
|
+
const spanId = generateSpanId();
|
|
44
|
+
// 16 hex characters (64-bit span ID per OpenTelemetry spec)
|
|
45
|
+
expect(spanId).toHaveLength(16);
|
|
46
|
+
expect(spanId).toMatch(/^[0-9a-f]{16}$/);
|
|
47
|
+
});
|
|
48
|
+
it("should not contain dashes", () => {
|
|
49
|
+
const spanId = generateSpanId();
|
|
50
|
+
expect(spanId).not.toContain("-");
|
|
51
|
+
});
|
|
52
|
+
it("should generate unique span IDs", () => {
|
|
53
|
+
const spanId1 = generateSpanId();
|
|
54
|
+
const spanId2 = generateSpanId();
|
|
55
|
+
expect(spanId1).not.toBe(spanId2);
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
describe("parseTraceContext", () => {
|
|
59
|
+
it("should parse trace context from lowercase headers", () => {
|
|
60
|
+
const headers = {
|
|
61
|
+
"x-trace-id": "abc123def456",
|
|
62
|
+
"x-parent-span-id": "span-789",
|
|
63
|
+
};
|
|
64
|
+
const context = parseTraceContext(headers);
|
|
65
|
+
expect(context).not.toBeNull();
|
|
66
|
+
expect(context?.traceId).toBe("abc123def456");
|
|
67
|
+
expect(context?.parentSpanId).toBe("span-789");
|
|
68
|
+
});
|
|
69
|
+
it("should parse trace context from mixed-case headers", () => {
|
|
70
|
+
const headers = {
|
|
71
|
+
"X-Trace-Id": "trace-mixed-case",
|
|
72
|
+
"X-Parent-Span-Id": "parent-mixed-case",
|
|
73
|
+
};
|
|
74
|
+
const context = parseTraceContext(headers);
|
|
75
|
+
expect(context).not.toBeNull();
|
|
76
|
+
expect(context?.traceId).toBe("trace-mixed-case");
|
|
77
|
+
expect(context?.parentSpanId).toBe("parent-mixed-case");
|
|
78
|
+
});
|
|
79
|
+
it("should parse trace context from Python SDK headers", () => {
|
|
80
|
+
const headers = {
|
|
81
|
+
"X-Trace-ID": "python-trace-id",
|
|
82
|
+
"X-Parent-Span": "python-parent-span",
|
|
83
|
+
};
|
|
84
|
+
const context = parseTraceContext(headers);
|
|
85
|
+
expect(context).not.toBeNull();
|
|
86
|
+
expect(context?.traceId).toBe("python-trace-id");
|
|
87
|
+
expect(context?.parentSpanId).toBe("python-parent-span");
|
|
88
|
+
});
|
|
89
|
+
it("should return null when trace ID is missing", () => {
|
|
90
|
+
const headers = {
|
|
91
|
+
"x-parent-span-id": "orphan-span",
|
|
92
|
+
};
|
|
93
|
+
const context = parseTraceContext(headers);
|
|
94
|
+
expect(context).toBeNull();
|
|
95
|
+
});
|
|
96
|
+
it("should handle missing parent span ID", () => {
|
|
97
|
+
const headers = {
|
|
98
|
+
"x-trace-id": "root-trace",
|
|
99
|
+
};
|
|
100
|
+
const context = parseTraceContext(headers);
|
|
101
|
+
expect(context).not.toBeNull();
|
|
102
|
+
expect(context?.traceId).toBe("root-trace");
|
|
103
|
+
expect(context?.parentSpanId).toBeNull();
|
|
104
|
+
});
|
|
105
|
+
it("should handle empty headers", () => {
|
|
106
|
+
const context = parseTraceContext({});
|
|
107
|
+
expect(context).toBeNull();
|
|
108
|
+
});
|
|
109
|
+
it("should handle undefined header values", () => {
|
|
110
|
+
const headers = {
|
|
111
|
+
"x-trace-id": undefined,
|
|
112
|
+
};
|
|
113
|
+
const context = parseTraceContext(headers);
|
|
114
|
+
expect(context).toBeNull();
|
|
115
|
+
});
|
|
116
|
+
});
|
|
117
|
+
describe("createTraceHeaders", () => {
|
|
118
|
+
it("should create headers with trace ID and span ID (Python SDK convention)", () => {
|
|
119
|
+
const headers = createTraceHeaders("my-trace-id", "my-span-id");
|
|
120
|
+
expect(headers["X-Trace-ID"]).toBe("my-trace-id");
|
|
121
|
+
expect(headers["X-Parent-Span"]).toBe("my-span-id");
|
|
122
|
+
});
|
|
123
|
+
it("should create headers that can be parsed back", () => {
|
|
124
|
+
const originalTraceId = generateTraceId();
|
|
125
|
+
const originalSpanId = generateSpanId();
|
|
126
|
+
const headers = createTraceHeaders(originalTraceId, originalSpanId);
|
|
127
|
+
const parsed = parseTraceContext(headers);
|
|
128
|
+
expect(parsed).not.toBeNull();
|
|
129
|
+
expect(parsed?.traceId).toBe(originalTraceId);
|
|
130
|
+
expect(parsed?.parentSpanId).toBe(originalSpanId);
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
describe("TraceContext interface", () => {
|
|
134
|
+
it("should have correct structure", () => {
|
|
135
|
+
const context = {
|
|
136
|
+
traceId: "test-trace-id",
|
|
137
|
+
parentSpanId: "test-parent-span",
|
|
138
|
+
};
|
|
139
|
+
expect(context.traceId).toBe("test-trace-id");
|
|
140
|
+
expect(context.parentSpanId).toBe("test-parent-span");
|
|
141
|
+
});
|
|
142
|
+
it("should allow null parentSpanId for root spans", () => {
|
|
143
|
+
const context = {
|
|
144
|
+
traceId: "root-trace",
|
|
145
|
+
parentSpanId: null,
|
|
146
|
+
};
|
|
147
|
+
expect(context.traceId).toBe("root-trace");
|
|
148
|
+
expect(context.parentSpanId).toBeNull();
|
|
149
|
+
});
|
|
150
|
+
});
|
|
151
|
+
describe("AgentMetadata interface", () => {
|
|
152
|
+
it("should have all required fields", () => {
|
|
153
|
+
const metadata = {
|
|
154
|
+
agentId: "test-agent-123",
|
|
155
|
+
agentName: "test-agent",
|
|
156
|
+
agentNamespace: "default",
|
|
157
|
+
agentHostname: "localhost",
|
|
158
|
+
agentIp: "127.0.0.1",
|
|
159
|
+
agentPort: 8080,
|
|
160
|
+
agentEndpoint: "http://127.0.0.1:8080",
|
|
161
|
+
};
|
|
162
|
+
expect(metadata.agentId).toBe("test-agent-123");
|
|
163
|
+
expect(metadata.agentName).toBe("test-agent");
|
|
164
|
+
expect(metadata.agentNamespace).toBe("default");
|
|
165
|
+
expect(metadata.agentHostname).toBe("localhost");
|
|
166
|
+
expect(metadata.agentIp).toBe("127.0.0.1");
|
|
167
|
+
expect(metadata.agentPort).toBe(8080);
|
|
168
|
+
expect(metadata.agentEndpoint).toBe("http://127.0.0.1:8080");
|
|
169
|
+
});
|
|
170
|
+
});
|
|
171
|
+
describe("SpanData interface", () => {
|
|
172
|
+
it("should have all required fields for a successful span", () => {
|
|
173
|
+
const span = {
|
|
174
|
+
traceId: "trace-123",
|
|
175
|
+
spanId: "span-456",
|
|
176
|
+
parentSpan: "parent-789",
|
|
177
|
+
functionName: "test_function",
|
|
178
|
+
startTime: 1704067200.0,
|
|
179
|
+
endTime: 1704067200.5,
|
|
180
|
+
durationMs: 500,
|
|
181
|
+
success: true,
|
|
182
|
+
error: null,
|
|
183
|
+
resultType: "string",
|
|
184
|
+
argsCount: 2,
|
|
185
|
+
kwargsCount: 3,
|
|
186
|
+
dependencies: ["dep1", "dep2"],
|
|
187
|
+
injectedDependencies: 2,
|
|
188
|
+
meshPositions: [0, 1],
|
|
189
|
+
};
|
|
190
|
+
expect(span.success).toBe(true);
|
|
191
|
+
expect(span.error).toBeNull();
|
|
192
|
+
expect(span.durationMs).toBe(500);
|
|
193
|
+
});
|
|
194
|
+
it("should have correct structure for a failed span", () => {
|
|
195
|
+
const span = {
|
|
196
|
+
traceId: "trace-error",
|
|
197
|
+
spanId: "span-error",
|
|
198
|
+
parentSpan: null,
|
|
199
|
+
functionName: "failing_function",
|
|
200
|
+
startTime: 1704067200.0,
|
|
201
|
+
endTime: 1704067200.1,
|
|
202
|
+
durationMs: 100,
|
|
203
|
+
success: false,
|
|
204
|
+
error: "Connection timeout",
|
|
205
|
+
resultType: "error",
|
|
206
|
+
argsCount: 0,
|
|
207
|
+
kwargsCount: 0,
|
|
208
|
+
dependencies: [],
|
|
209
|
+
injectedDependencies: 0,
|
|
210
|
+
meshPositions: [],
|
|
211
|
+
};
|
|
212
|
+
expect(span.success).toBe(false);
|
|
213
|
+
expect(span.error).toBe("Connection timeout");
|
|
214
|
+
expect(span.parentSpan).toBeNull();
|
|
215
|
+
});
|
|
216
|
+
});
|
|
217
|
+
describe("initTracing", () => {
|
|
218
|
+
beforeEach(() => {
|
|
219
|
+
vi.clearAllMocks();
|
|
220
|
+
// Reset module state by reimporting
|
|
221
|
+
vi.resetModules();
|
|
222
|
+
});
|
|
223
|
+
it("should check if tracing is enabled via Rust core", async () => {
|
|
224
|
+
const { isTracingEnabled } = await import("@mcpmesh/core");
|
|
225
|
+
const metadata = {
|
|
226
|
+
agentId: "test-agent",
|
|
227
|
+
agentName: "test",
|
|
228
|
+
agentNamespace: "default",
|
|
229
|
+
agentHostname: "localhost",
|
|
230
|
+
agentIp: "127.0.0.1",
|
|
231
|
+
agentPort: 8080,
|
|
232
|
+
agentEndpoint: "http://127.0.0.1:8080",
|
|
233
|
+
};
|
|
234
|
+
// Re-import to get fresh module state
|
|
235
|
+
const { initTracing: freshInit } = await import("../tracing.js");
|
|
236
|
+
await freshInit(metadata);
|
|
237
|
+
expect(isTracingEnabled).toHaveBeenCalled();
|
|
238
|
+
});
|
|
239
|
+
});
|
|
240
|
+
describe("publishTraceSpan", () => {
|
|
241
|
+
it("should return false when tracing is disabled", async () => {
|
|
242
|
+
const span = {
|
|
243
|
+
traceId: "trace-123",
|
|
244
|
+
spanId: "span-456",
|
|
245
|
+
parentSpan: null,
|
|
246
|
+
functionName: "test",
|
|
247
|
+
startTime: Date.now() / 1000,
|
|
248
|
+
endTime: Date.now() / 1000,
|
|
249
|
+
durationMs: 0,
|
|
250
|
+
success: true,
|
|
251
|
+
error: null,
|
|
252
|
+
resultType: "string",
|
|
253
|
+
argsCount: 0,
|
|
254
|
+
kwargsCount: 0,
|
|
255
|
+
dependencies: [],
|
|
256
|
+
injectedDependencies: 0,
|
|
257
|
+
meshPositions: [],
|
|
258
|
+
};
|
|
259
|
+
// Tracing is disabled by default in our mock
|
|
260
|
+
const result = await publishTraceSpan(span);
|
|
261
|
+
expect(result).toBe(false);
|
|
262
|
+
});
|
|
263
|
+
});
|
|
264
|
+
//# sourceMappingURL=tracing.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tracing.test.js","sourceRoot":"","sources":["../../src/__tests__/tracing.test.ts"],"names":[],"mappings":"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"}
|
package/dist/agent.d.ts
ADDED
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MeshAgent implementation for MCP Mesh.
|
|
3
|
+
*
|
|
4
|
+
* Provides the core agent functionality including:
|
|
5
|
+
* - Registration with mesh registry via Rust core
|
|
6
|
+
* - Heartbeat management
|
|
7
|
+
* - Tool/capability discovery
|
|
8
|
+
* - Dependency injection for tool functions
|
|
9
|
+
* - Graceful shutdown
|
|
10
|
+
*/
|
|
11
|
+
import type { FastMCP } from "fastmcp";
|
|
12
|
+
import type { z } from "zod";
|
|
13
|
+
import { type JsAgentHandle } from "@mcpmesh/core";
|
|
14
|
+
import type { AgentConfig, ResolvedAgentConfig, MeshToolDef, McpMeshAgent, LlmProviderConfig } from "./types.js";
|
|
15
|
+
/**
|
|
16
|
+
* MeshAgent wraps a FastMCP server with MCP Mesh capabilities.
|
|
17
|
+
*
|
|
18
|
+
* It provides:
|
|
19
|
+
* - Automatic registration with the mesh registry
|
|
20
|
+
* - Heartbeat management via Rust core
|
|
21
|
+
* - Tool/capability discovery
|
|
22
|
+
* - Dependency injection for tool functions
|
|
23
|
+
*/
|
|
24
|
+
export declare class MeshAgent {
|
|
25
|
+
private server;
|
|
26
|
+
private config;
|
|
27
|
+
private agentId;
|
|
28
|
+
private tools;
|
|
29
|
+
/**
|
|
30
|
+
* Maps LLM provider tool names to their vendor (e.g., "process_chat" -> "anthropic").
|
|
31
|
+
* TODO: Use for provider metrics, health checks, or exposing via getLlmProviderVendor() getter.
|
|
32
|
+
* Currently populated by addLlmProvider() for future introspection needs.
|
|
33
|
+
*/
|
|
34
|
+
private llmProviderVendors;
|
|
35
|
+
private handle;
|
|
36
|
+
private started;
|
|
37
|
+
private tracingEnabled;
|
|
38
|
+
/**
|
|
39
|
+
* Resolved dependencies: composite key -> proxy
|
|
40
|
+
* Key format: "${toolName}:dep_${depIndex}" (e.g., "myTool:dep_0")
|
|
41
|
+
* Updated when dependency_available/unavailable events arrive.
|
|
42
|
+
*
|
|
43
|
+
* This allows multiple tools to depend on the same capability with
|
|
44
|
+
* different tags/settings without overwriting each other.
|
|
45
|
+
*/
|
|
46
|
+
private resolvedDeps;
|
|
47
|
+
constructor(server: FastMCP, config: AgentConfig);
|
|
48
|
+
/**
|
|
49
|
+
* Add a tool to the agent.
|
|
50
|
+
*
|
|
51
|
+
* This registers the tool with both fastmcp (for MCP protocol) and
|
|
52
|
+
* the mesh (for capability discovery). If the tool has dependencies,
|
|
53
|
+
* they will be injected positionally at runtime.
|
|
54
|
+
*/
|
|
55
|
+
addTool<T extends z.ZodType>(def: MeshToolDef<T>): this;
|
|
56
|
+
/**
|
|
57
|
+
* Add an LLM provider to the agent.
|
|
58
|
+
*
|
|
59
|
+
* This creates a zero-code LLM provider that other agents can use
|
|
60
|
+
* via mesh delegation.
|
|
61
|
+
*
|
|
62
|
+
* @param config - LLM provider configuration
|
|
63
|
+
* @returns This agent for chaining
|
|
64
|
+
*
|
|
65
|
+
* @example
|
|
66
|
+
* ```typescript
|
|
67
|
+
* agent.addLlmProvider({
|
|
68
|
+
* model: "anthropic/claude-sonnet-4-5",
|
|
69
|
+
* capability: "llm",
|
|
70
|
+
* tags: ["llm", "claude", "anthropic", "provider"],
|
|
71
|
+
* });
|
|
72
|
+
* ```
|
|
73
|
+
*/
|
|
74
|
+
addLlmProvider(config: LlmProviderConfig): this;
|
|
75
|
+
/**
|
|
76
|
+
* Convert Zod schema to JSON Schema.
|
|
77
|
+
*/
|
|
78
|
+
private convertZodToJsonSchema;
|
|
79
|
+
/**
|
|
80
|
+
* Internal: Start the agent (called by auto-start mechanism).
|
|
81
|
+
*/
|
|
82
|
+
_autoStart(): Promise<void>;
|
|
83
|
+
/**
|
|
84
|
+
* Register LLM tools from LlmToolRegistry.
|
|
85
|
+
* This adds tool metadata for LLM tools created via mesh.llm().
|
|
86
|
+
*/
|
|
87
|
+
private registerLlmTools;
|
|
88
|
+
/**
|
|
89
|
+
* Install signal handlers for graceful shutdown.
|
|
90
|
+
* Ensures agent unregisters from registry on SIGINT/SIGTERM.
|
|
91
|
+
*/
|
|
92
|
+
private installSignalHandlers;
|
|
93
|
+
/**
|
|
94
|
+
* Start the Rust core heartbeat loop.
|
|
95
|
+
*/
|
|
96
|
+
private startHeartbeat;
|
|
97
|
+
/**
|
|
98
|
+
* Run the event loop to handle mesh events.
|
|
99
|
+
*/
|
|
100
|
+
private runEventLoop;
|
|
101
|
+
/**
|
|
102
|
+
* Handle dependency_available event.
|
|
103
|
+
* Creates proxy at the exact position specified by the event.
|
|
104
|
+
*
|
|
105
|
+
* The Rust core now sends events with requestingFunction and depIndex,
|
|
106
|
+
* so we can directly create the proxy at the correct position without
|
|
107
|
+
* needing to match by capability.
|
|
108
|
+
*/
|
|
109
|
+
private handleDependencyAvailable;
|
|
110
|
+
/**
|
|
111
|
+
* Handle dependency_unavailable event.
|
|
112
|
+
* Removes proxy at the exact position specified by the event.
|
|
113
|
+
*/
|
|
114
|
+
private handleDependencyUnavailable;
|
|
115
|
+
/**
|
|
116
|
+
* Get a resolved dependency proxy by capability name.
|
|
117
|
+
* Returns the first matching proxy if multiple tools depend on the same capability.
|
|
118
|
+
*
|
|
119
|
+
* For more precise lookup, use getDependencyByKey with composite key "toolName:dep_index".
|
|
120
|
+
*/
|
|
121
|
+
getDependency(capability: string): McpMeshAgent | null;
|
|
122
|
+
/**
|
|
123
|
+
* Get a resolved dependency proxy by composite key.
|
|
124
|
+
*
|
|
125
|
+
* @param toolName - The tool name
|
|
126
|
+
* @param depIndex - The dependency index within that tool
|
|
127
|
+
* @returns The proxy or null if not available
|
|
128
|
+
*/
|
|
129
|
+
getDependencyByKey(toolName: string, depIndex: number): McpMeshAgent | null;
|
|
130
|
+
/**
|
|
131
|
+
* Get all resolved dependencies.
|
|
132
|
+
*/
|
|
133
|
+
getAllDependencies(): Map<string, McpMeshAgent>;
|
|
134
|
+
/**
|
|
135
|
+
* Get the agent handle for advanced operations.
|
|
136
|
+
*/
|
|
137
|
+
getHandle(): JsAgentHandle | null;
|
|
138
|
+
/**
|
|
139
|
+
* Get the resolved configuration.
|
|
140
|
+
*/
|
|
141
|
+
getConfig(): ResolvedAgentConfig;
|
|
142
|
+
/**
|
|
143
|
+
* Get the agent ID.
|
|
144
|
+
*/
|
|
145
|
+
getAgentId(): string;
|
|
146
|
+
/**
|
|
147
|
+
* Shutdown the agent gracefully.
|
|
148
|
+
*/
|
|
149
|
+
shutdown(): Promise<void>;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Create a MeshAgent wrapping a FastMCP server.
|
|
153
|
+
*
|
|
154
|
+
* This is the main entry point for creating MCP Mesh agents.
|
|
155
|
+
*
|
|
156
|
+
* @example
|
|
157
|
+
* ```typescript
|
|
158
|
+
* const agent = mesh(server, {
|
|
159
|
+
* name: "calculator",
|
|
160
|
+
* port: 9002,
|
|
161
|
+
* });
|
|
162
|
+
* ```
|
|
163
|
+
*/
|
|
164
|
+
export declare function mesh(server: FastMCP, config: AgentConfig): MeshAgent;
|
|
165
|
+
//# sourceMappingURL=agent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAE7B,OAAO,EAGL,KAAK,aAAa,EAInB,MAAM,eAAe,CAAC;AAEvB,OAAO,KAAK,EACV,WAAW,EACX,mBAAmB,EACnB,WAAW,EAEX,YAAY,EAEZ,iBAAiB,EAClB,MAAM,YAAY,CAAC;AAuCpB;;;;;;;;GAQG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAAU;IACxB,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,KAAK,CAAoC;IACjD;;;;OAIG;IACH,OAAO,CAAC,kBAAkB,CAAkC;IAC5D,OAAO,CAAC,MAAM,CAA8B;IAC5C,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,cAAc,CAAS;IAE/B;;;;;;;OAOG;IACH,OAAO,CAAC,YAAY,CAAwC;gBAEhD,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW;IAchD;;;;;;OAMG;IACH,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,IAAI;IAyHvD;;;;;;;;;;;;;;;;;OAiBG;IACH,cAAc,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI;IAkC/C;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAI9B;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IA0CjC;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAoBxB;;;OAGG;IACH,OAAO,CAAC,qBAAqB;IA2B7B;;OAEG;YACW,cAAc;IAyF5B;;OAEG;YACW,YAAY;IA6G1B;;;;;;;OAOG;IACH,OAAO,CAAC,yBAAyB;IA6CjC;;;OAGG;IACH,OAAO,CAAC,2BAA2B;IAiCnC;;;;;OAKG;IACH,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI;IAYtD;;;;;;OAMG;IACH,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI;IAI3E;;OAEG;IACH,kBAAkB,IAAI,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC;IAI/C;;OAEG;IACH,SAAS,IAAI,aAAa,GAAG,IAAI;IAIjC;;OAEG;IACH,SAAS,IAAI,mBAAmB;IAIhC;;OAEG;IACH,UAAU,IAAI,MAAM;IAIpB;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAMhC;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,GAAG,SAAS,CAEpE"}
|