@mcpmesh/sdk 2.3.0 → 2.5.0
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__/agent-single-instance.spec.d.ts +2 -0
- package/dist/__tests__/agent-single-instance.spec.d.ts.map +1 -0
- package/dist/__tests__/agent-single-instance.spec.js +80 -0
- package/dist/__tests__/agent-single-instance.spec.js.map +1 -0
- package/dist/__tests__/event-loop-resilience.spec.d.ts +2 -0
- package/dist/__tests__/event-loop-resilience.spec.d.ts.map +1 -0
- package/dist/__tests__/event-loop-resilience.spec.js +321 -0
- package/dist/__tests__/event-loop-resilience.spec.js.map +1 -0
- package/dist/__tests__/llm-agent-model-params.test.js +83 -0
- package/dist/__tests__/llm-agent-model-params.test.js.map +1 -1
- package/dist/__tests__/llm-max-iterations.test.d.ts +20 -0
- package/dist/__tests__/llm-max-iterations.test.d.ts.map +1 -0
- package/dist/__tests__/llm-max-iterations.test.js +252 -0
- package/dist/__tests__/llm-max-iterations.test.js.map +1 -0
- package/dist/__tests__/llm-mesh-error-mapping.test.d.ts +16 -0
- package/dist/__tests__/llm-mesh-error-mapping.test.d.ts.map +1 -0
- package/dist/__tests__/llm-mesh-error-mapping.test.js +135 -0
- package/dist/__tests__/llm-mesh-error-mapping.test.js.map +1 -0
- package/dist/__tests__/llm-provider-multistep.test.d.ts +20 -0
- package/dist/__tests__/llm-provider-multistep.test.d.ts.map +1 -0
- package/dist/__tests__/llm-provider-multistep.test.js +138 -0
- package/dist/__tests__/llm-provider-multistep.test.js.map +1 -0
- package/dist/__tests__/llm-provider-output-mode.test.d.ts +21 -0
- package/dist/__tests__/llm-provider-output-mode.test.d.ts.map +1 -0
- package/dist/__tests__/llm-provider-output-mode.test.js +116 -0
- package/dist/__tests__/llm-provider-output-mode.test.js.map +1 -0
- package/dist/__tests__/llm-provider-stopwhen.test.d.ts +22 -0
- package/dist/__tests__/llm-provider-stopwhen.test.d.ts.map +1 -0
- package/dist/__tests__/llm-provider-stopwhen.test.js +127 -0
- package/dist/__tests__/llm-provider-stopwhen.test.js.map +1 -0
- package/dist/__tests__/llm-provider-system-synthesis.test.d.ts +20 -0
- package/dist/__tests__/llm-provider-system-synthesis.test.d.ts.map +1 -0
- package/dist/__tests__/llm-provider-system-synthesis.test.js +168 -0
- package/dist/__tests__/llm-provider-system-synthesis.test.js.map +1 -0
- package/dist/__tests__/llm-provider-vertex-settings.test.d.ts +18 -0
- package/dist/__tests__/llm-provider-vertex-settings.test.d.ts.map +1 -0
- package/dist/__tests__/llm-provider-vertex-settings.test.js +128 -0
- package/dist/__tests__/llm-provider-vertex-settings.test.js.map +1 -0
- package/dist/__tests__/llm-response-model.test.d.ts +10 -0
- package/dist/__tests__/llm-response-model.test.d.ts.map +1 -0
- package/dist/__tests__/llm-response-model.test.js +92 -0
- package/dist/__tests__/llm-response-model.test.js.map +1 -0
- package/dist/__tests__/port-conflict-fallback.spec.d.ts +2 -0
- package/dist/__tests__/port-conflict-fallback.spec.d.ts.map +1 -0
- package/dist/__tests__/port-conflict-fallback.spec.js +123 -0
- package/dist/__tests__/port-conflict-fallback.spec.js.map +1 -0
- package/dist/__tests__/port-probe-errors.spec.d.ts +2 -0
- package/dist/__tests__/port-probe-errors.spec.d.ts.map +1 -0
- package/dist/__tests__/port-probe-errors.spec.js +100 -0
- package/dist/__tests__/port-probe-errors.spec.js.map +1 -0
- package/dist/__tests__/provider-handler-registry.test.d.ts +0 -1
- package/dist/__tests__/provider-handler-registry.test.d.ts.map +1 -1
- package/dist/__tests__/provider-handler-registry.test.js +23 -1
- package/dist/__tests__/provider-handler-registry.test.js.map +1 -1
- package/dist/__tests__/proxy-sse-no-data.test.d.ts +13 -0
- package/dist/__tests__/proxy-sse-no-data.test.d.ts.map +1 -0
- package/dist/__tests__/proxy-sse-no-data.test.js +147 -0
- package/dist/__tests__/proxy-sse-no-data.test.js.map +1 -0
- package/dist/__tests__/proxy-stream.test.js +26 -0
- package/dist/__tests__/proxy-stream.test.js.map +1 -1
- package/dist/__tests__/proxy-timeout-guard.test.d.ts +12 -0
- package/dist/__tests__/proxy-timeout-guard.test.d.ts.map +1 -0
- package/dist/__tests__/proxy-timeout-guard.test.js +85 -0
- package/dist/__tests__/proxy-timeout-guard.test.js.map +1 -0
- package/dist/__tests__/proxy-timer-leak.test.d.ts +16 -0
- package/dist/__tests__/proxy-timer-leak.test.d.ts.map +1 -0
- package/dist/__tests__/proxy-timer-leak.test.js +97 -0
- package/dist/__tests__/proxy-timer-leak.test.js.map +1 -0
- package/dist/__tests__/proxy-tool-error.test.d.ts +13 -0
- package/dist/__tests__/proxy-tool-error.test.d.ts.map +1 -0
- package/dist/__tests__/proxy-tool-error.test.js +313 -0
- package/dist/__tests__/proxy-tool-error.test.js.map +1 -0
- package/dist/__tests__/registry-disconnect-retains-deps.spec.d.ts +2 -0
- package/dist/__tests__/registry-disconnect-retains-deps.spec.d.ts.map +1 -0
- package/dist/__tests__/registry-disconnect-retains-deps.spec.js +101 -0
- package/dist/__tests__/registry-disconnect-retains-deps.spec.js.map +1 -0
- package/dist/__tests__/response-parser.test.js +29 -0
- package/dist/__tests__/response-parser.test.js.map +1 -1
- package/dist/__tests__/route.test.js +21 -1
- package/dist/__tests__/route.test.js.map +1 -1
- package/dist/__tests__/settle-window.spec.d.ts +2 -0
- package/dist/__tests__/settle-window.spec.d.ts.map +1 -0
- package/dist/__tests__/settle-window.spec.js +324 -0
- package/dist/__tests__/settle-window.spec.js.map +1 -0
- package/dist/__tests__/sse.test.js +12 -0
- package/dist/__tests__/sse.test.js.map +1 -1
- package/dist/__tests__/stop-dispatchers.spec.d.ts +2 -0
- package/dist/__tests__/stop-dispatchers.spec.d.ts.map +1 -0
- package/dist/__tests__/stop-dispatchers.spec.js +227 -0
- package/dist/__tests__/stop-dispatchers.spec.js.map +1 -0
- package/dist/agent.d.ts +65 -5
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +317 -78
- package/dist/agent.js.map +1 -1
- package/dist/api-runtime.d.ts +33 -3
- package/dist/api-runtime.d.ts.map +1 -1
- package/dist/api-runtime.js +133 -33
- package/dist/api-runtime.js.map +1 -1
- package/dist/claim-dispatcher.d.ts +25 -0
- package/dist/claim-dispatcher.d.ts.map +1 -1
- package/dist/claim-dispatcher.js +59 -1
- package/dist/claim-dispatcher.js.map +1 -1
- package/dist/config.d.ts +73 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +108 -2
- package/dist/config.js.map +1 -1
- package/dist/debug.d.ts +1 -1
- package/dist/debug.d.ts.map +1 -1
- package/dist/express.d.ts +33 -0
- package/dist/express.d.ts.map +1 -1
- package/dist/express.js +157 -32
- package/dist/express.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/llm-agent.d.ts +34 -0
- package/dist/llm-agent.d.ts.map +1 -1
- package/dist/llm-agent.js +239 -434
- package/dist/llm-agent.js.map +1 -1
- package/dist/llm-provider.d.ts +51 -4
- package/dist/llm-provider.d.ts.map +1 -1
- package/dist/llm-provider.js +175 -36
- package/dist/llm-provider.js.map +1 -1
- package/dist/llm.d.ts +1 -1
- package/dist/llm.d.ts.map +1 -1
- package/dist/llm.js +8 -5
- package/dist/llm.js.map +1 -1
- package/dist/provider-handlers/gemini-handler.d.ts.map +1 -1
- package/dist/provider-handlers/gemini-handler.js +8 -14
- package/dist/provider-handlers/gemini-handler.js.map +1 -1
- package/dist/provider-handlers/openai-handler.d.ts.map +1 -1
- package/dist/provider-handlers/openai-handler.js +2 -15
- package/dist/provider-handlers/openai-handler.js.map +1 -1
- package/dist/provider-handlers/provider-handler-registry.d.ts +10 -1
- package/dist/provider-handlers/provider-handler-registry.d.ts.map +1 -1
- package/dist/provider-handlers/provider-handler-registry.js +4 -1
- package/dist/provider-handlers/provider-handler-registry.js.map +1 -1
- package/dist/provider-handlers/provider-handler.d.ts +12 -0
- package/dist/provider-handlers/provider-handler.d.ts.map +1 -1
- package/dist/provider-handlers/provider-handler.js +24 -0
- package/dist/provider-handlers/provider-handler.js.map +1 -1
- package/dist/proxy.d.ts.map +1 -1
- package/dist/proxy.js +360 -287
- package/dist/proxy.js.map +1 -1
- package/dist/response-parser.d.ts +10 -0
- package/dist/response-parser.d.ts.map +1 -1
- package/dist/response-parser.js +55 -0
- package/dist/response-parser.js.map +1 -1
- package/dist/route.d.ts.map +1 -1
- package/dist/route.js +38 -0
- package/dist/route.js.map +1 -1
- package/dist/settle.d.ts +129 -0
- package/dist/settle.d.ts.map +1 -0
- package/dist/settle.js +284 -0
- package/dist/settle.js.map +1 -0
- package/dist/sse.d.ts.map +1 -1
- package/dist/sse.js +5 -2
- package/dist/sse.js.map +1 -1
- package/dist/tracing.d.ts +13 -0
- package/dist/tracing.d.ts.map +1 -1
- package/dist/tracing.js +40 -0
- package/dist/tracing.js.map +1 -1
- package/dist/types.d.ts +10 -2
- package/dist/types.d.ts.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llm-provider-vertex-settings.test.js","sourceRoot":"","sources":["../../src/__tests__/llm-provider-vertex-settings.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unit tests for mesh.llm() responseModel option (issue #1094).
|
|
3
|
+
*
|
|
4
|
+
* `responseModel` specifies the schema the LLM must emit and is validated
|
|
5
|
+
* against (it feeds the provider's structured-output schema and the response
|
|
6
|
+
* parser). When omitted it falls back to `returns`. `returns` continues to
|
|
7
|
+
* type what `execute` returns to callers.
|
|
8
|
+
*/
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=llm-response-model.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llm-response-model.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/llm-response-model.test.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unit tests for mesh.llm() responseModel option (issue #1094).
|
|
3
|
+
*
|
|
4
|
+
* `responseModel` specifies the schema the LLM must emit and is validated
|
|
5
|
+
* against (it feeds the provider's structured-output schema and the response
|
|
6
|
+
* parser). When omitted it falls back to `returns`. `returns` continues to
|
|
7
|
+
* type what `execute` returns to callers.
|
|
8
|
+
*/
|
|
9
|
+
import { describe, it, expect, expectTypeOf } from "vitest";
|
|
10
|
+
import { z } from "zod";
|
|
11
|
+
import { llm } from "../llm.js";
|
|
12
|
+
const BigSchema = z.object({
|
|
13
|
+
id: z.string(),
|
|
14
|
+
title: z.string(),
|
|
15
|
+
body: z.string(),
|
|
16
|
+
metadata: z.record(z.string(), z.unknown()),
|
|
17
|
+
});
|
|
18
|
+
const SmallSchema = z.object({
|
|
19
|
+
id: z.string(),
|
|
20
|
+
});
|
|
21
|
+
const baseConfig = {
|
|
22
|
+
provider: { capability: "llm-service" },
|
|
23
|
+
parameters: z.object({ query: z.string() }),
|
|
24
|
+
};
|
|
25
|
+
describe("mesh.llm responseModel", () => {
|
|
26
|
+
it("uses responseModel as returnSchema when both responseModel and returns are provided", () => {
|
|
27
|
+
const tool = llm({
|
|
28
|
+
...baseConfig,
|
|
29
|
+
name: "tool-with-response-model",
|
|
30
|
+
responseModel: SmallSchema,
|
|
31
|
+
returns: BigSchema,
|
|
32
|
+
execute: async () => ({
|
|
33
|
+
id: "1",
|
|
34
|
+
title: "t",
|
|
35
|
+
body: "b",
|
|
36
|
+
metadata: {},
|
|
37
|
+
}),
|
|
38
|
+
});
|
|
39
|
+
// returnSchema drives provider output schema + ResponseParser; must be the
|
|
40
|
+
// responseModel, not the (broader) returns type.
|
|
41
|
+
expect(tool._meshLlmConfig.returnSchema).toBe(SmallSchema);
|
|
42
|
+
expect(tool._meshLlmConfig.returnSchema).not.toBe(BigSchema);
|
|
43
|
+
});
|
|
44
|
+
it("falls back to returns when responseModel is omitted (back-compat)", () => {
|
|
45
|
+
const tool = llm({
|
|
46
|
+
...baseConfig,
|
|
47
|
+
name: "tool-with-returns-only",
|
|
48
|
+
returns: BigSchema,
|
|
49
|
+
execute: async () => ({
|
|
50
|
+
id: "1",
|
|
51
|
+
title: "t",
|
|
52
|
+
body: "b",
|
|
53
|
+
metadata: {},
|
|
54
|
+
}),
|
|
55
|
+
});
|
|
56
|
+
expect(tool._meshLlmConfig.returnSchema).toBe(BigSchema);
|
|
57
|
+
});
|
|
58
|
+
it("leaves returnSchema undefined when neither is provided (string mode)", () => {
|
|
59
|
+
const tool = llm({
|
|
60
|
+
...baseConfig,
|
|
61
|
+
name: "tool-with-neither",
|
|
62
|
+
execute: async () => "hello",
|
|
63
|
+
});
|
|
64
|
+
expect(tool._meshLlmConfig.returnSchema).toBeUndefined();
|
|
65
|
+
});
|
|
66
|
+
it("types the injected llm callable by responseModel when provided", () => {
|
|
67
|
+
llm({
|
|
68
|
+
...baseConfig,
|
|
69
|
+
name: "tool-type-response-model",
|
|
70
|
+
responseModel: SmallSchema,
|
|
71
|
+
returns: BigSchema,
|
|
72
|
+
execute: async (_args, { llm: llmCallable }) => {
|
|
73
|
+
// The injected callable is typed by responseModel (SmallSchema), not returns.
|
|
74
|
+
expectTypeOf(llmCallable).returns.resolves.toEqualTypeOf();
|
|
75
|
+
// execute's own return type still follows `returns` (BigSchema).
|
|
76
|
+
return { id: "1", title: "t", body: "b", metadata: {} };
|
|
77
|
+
},
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
it("types the injected llm callable by returns when no responseModel", () => {
|
|
81
|
+
llm({
|
|
82
|
+
...baseConfig,
|
|
83
|
+
name: "tool-type-returns",
|
|
84
|
+
returns: BigSchema,
|
|
85
|
+
execute: async (_args, { llm: llmCallable }) => {
|
|
86
|
+
expectTypeOf(llmCallable).returns.resolves.toEqualTypeOf();
|
|
87
|
+
return { id: "1", title: "t", body: "b", metadata: {} };
|
|
88
|
+
},
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
});
|
|
92
|
+
//# sourceMappingURL=llm-response-model.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llm-response-model.test.js","sourceRoot":"","sources":["../../src/__tests__/llm-response-model.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"port-conflict-fallback.spec.d.ts","sourceRoot":"","sources":["../../src/__tests__/port-conflict-fallback.spec.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for issue #1194: port bind conflicts must never produce a phantom
|
|
3
|
+
* registration (registered port != bound port).
|
|
4
|
+
*
|
|
5
|
+
* The runtime resolves the bind port BEFORE the HTTP server and heartbeat
|
|
6
|
+
* start: a configured port that is already in use falls back to an
|
|
7
|
+
* OS-assigned port (adapt, don't crash), and the resolved port is what
|
|
8
|
+
* flows into `config.httpPort` — the field the heartbeat registers.
|
|
9
|
+
*/
|
|
10
|
+
import { describe, it, expect, beforeEach, afterEach, vi } from "vitest";
|
|
11
|
+
import { createServer } from "net";
|
|
12
|
+
import { findAvailablePort, isPortBindable, resolveBindPort, resolveStartupBindPort, } from "../config.js";
|
|
13
|
+
const HOST = "127.0.0.1";
|
|
14
|
+
/** Occupy an OS-assigned port with a live listener and return it. */
|
|
15
|
+
async function occupyPort() {
|
|
16
|
+
return new Promise((resolve, reject) => {
|
|
17
|
+
const server = createServer();
|
|
18
|
+
server.once("error", reject);
|
|
19
|
+
server.listen(0, HOST, () => {
|
|
20
|
+
const address = server.address();
|
|
21
|
+
if (address && typeof address === "object") {
|
|
22
|
+
resolve({ server, port: address.port });
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
reject(new Error("Failed to get blocker address"));
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
describe("resolveBindPort (issue #1194)", () => {
|
|
31
|
+
let blocker = null;
|
|
32
|
+
let blockedPort = 0;
|
|
33
|
+
beforeEach(async () => {
|
|
34
|
+
const occupied = await occupyPort();
|
|
35
|
+
blocker = occupied.server;
|
|
36
|
+
blockedPort = occupied.port;
|
|
37
|
+
});
|
|
38
|
+
afterEach(async () => {
|
|
39
|
+
if (blocker) {
|
|
40
|
+
await new Promise((resolve) => blocker.close(() => resolve()));
|
|
41
|
+
blocker = null;
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
it("returns the configured port unchanged when it is free", async () => {
|
|
45
|
+
// Find a free port, release it, then resolve it.
|
|
46
|
+
const freePort = await findAvailablePort();
|
|
47
|
+
const resolved = await resolveBindPort(freePort, HOST);
|
|
48
|
+
expect(resolved.port).toBe(freePort);
|
|
49
|
+
expect(resolved.fellBack).toBe(false);
|
|
50
|
+
});
|
|
51
|
+
it("falls back to an OS-assigned port when the configured port is in use", async () => {
|
|
52
|
+
const resolved = await resolveBindPort(blockedPort, HOST);
|
|
53
|
+
expect(resolved.fellBack).toBe(true);
|
|
54
|
+
expect(resolved.port).not.toBe(blockedPort);
|
|
55
|
+
expect(resolved.port).toBeGreaterThan(0);
|
|
56
|
+
// The fallback port must itself be bindable (no phantom endpoint).
|
|
57
|
+
expect(await isPortBindable(resolved.port, HOST)).toBe(true);
|
|
58
|
+
});
|
|
59
|
+
it("auto-assigns for configured port 0 without fallback semantics", async () => {
|
|
60
|
+
const resolved = await resolveBindPort(0, HOST);
|
|
61
|
+
expect(resolved.fellBack).toBe(false);
|
|
62
|
+
expect(resolved.port).toBeGreaterThan(0);
|
|
63
|
+
});
|
|
64
|
+
it("isPortBindable reports an occupied port as not bindable", async () => {
|
|
65
|
+
expect(await isPortBindable(blockedPort, HOST)).toBe(false);
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
describe("resolveStartupBindPort (shared agent/express helper)", () => {
|
|
69
|
+
let blocker = null;
|
|
70
|
+
let blockedPort = 0;
|
|
71
|
+
let savedHost;
|
|
72
|
+
beforeEach(async () => {
|
|
73
|
+
const occupied = await occupyPort();
|
|
74
|
+
blocker = occupied.server;
|
|
75
|
+
blockedPort = occupied.port;
|
|
76
|
+
// The helper probes the REAL bind host (process.env.HOST, default
|
|
77
|
+
// 0.0.0.0). Pin it to loopback so the blocker and the probe agree.
|
|
78
|
+
savedHost = process.env.HOST;
|
|
79
|
+
process.env.HOST = HOST;
|
|
80
|
+
});
|
|
81
|
+
afterEach(async () => {
|
|
82
|
+
if (savedHost === undefined) {
|
|
83
|
+
delete process.env.HOST;
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
process.env.HOST = savedHost;
|
|
87
|
+
}
|
|
88
|
+
if (blocker) {
|
|
89
|
+
await new Promise((resolve) => blocker.close(() => resolve()));
|
|
90
|
+
blocker = null;
|
|
91
|
+
}
|
|
92
|
+
vi.restoreAllMocks();
|
|
93
|
+
});
|
|
94
|
+
it("returns the configured port silently when it is free", async () => {
|
|
95
|
+
const warnSpy = vi.spyOn(console, "warn").mockImplementation(() => { });
|
|
96
|
+
const freePort = await findAvailablePort(HOST);
|
|
97
|
+
const port = await resolveStartupBindPort(freePort, "agent");
|
|
98
|
+
expect(port).toBe(freePort);
|
|
99
|
+
expect(warnSpy).not.toHaveBeenCalled();
|
|
100
|
+
});
|
|
101
|
+
it("falls back with the canonical PORT CONFLICT warning when the port is in use", async () => {
|
|
102
|
+
const warnSpy = vi.spyOn(console, "warn").mockImplementation(() => { });
|
|
103
|
+
const port = await resolveStartupBindPort(blockedPort, "agent");
|
|
104
|
+
expect(port).not.toBe(blockedPort);
|
|
105
|
+
expect(port).toBeGreaterThan(0);
|
|
106
|
+
// The fallback port is probed on the same host the server will bind.
|
|
107
|
+
expect(await isPortBindable(port, HOST)).toBe(true);
|
|
108
|
+
expect(warnSpy).toHaveBeenCalledTimes(1);
|
|
109
|
+
const message = String(warnSpy.mock.calls[0][0]);
|
|
110
|
+
expect(message).toContain("PORT CONFLICT");
|
|
111
|
+
expect(message).toContain(String(blockedPort));
|
|
112
|
+
expect(message).toContain(HOST);
|
|
113
|
+
});
|
|
114
|
+
it("auto-assigns for configured port 0 without a conflict warning", async () => {
|
|
115
|
+
const warnSpy = vi.spyOn(console, "warn").mockImplementation(() => { });
|
|
116
|
+
const logSpy = vi.spyOn(console, "log").mockImplementation(() => { });
|
|
117
|
+
const port = await resolveStartupBindPort(0, "service");
|
|
118
|
+
expect(port).toBeGreaterThan(0);
|
|
119
|
+
expect(warnSpy).not.toHaveBeenCalled();
|
|
120
|
+
expect(logSpy).toHaveBeenCalledWith(`Auto-assigned port ${port} for service`);
|
|
121
|
+
});
|
|
122
|
+
});
|
|
123
|
+
//# sourceMappingURL=port-conflict-fallback.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"port-conflict-fallback.spec.js","sourceRoot":"","sources":["../../src/__tests__/port-conflict-fallback.spec.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,EAAE,YAAY,EAAe,MAAM,KAAK,CAAC;AAChD,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,eAAe,EACf,sBAAsB,GACvB,MAAM,cAAc,CAAC;AAEtB,MAAM,IAAI,GAAG,WAAW,CAAC;AAEzB,qEAAqE;AACrE,KAAK,UAAU,UAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;QAC9B,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC7B,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE;YAC1B,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;YACjC,IAAI,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;gBAC3C,OAAO,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;YAC1C,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC,CAAC;YACrD,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,QAAQ,CAAC,+BAA+B,EAAE,GAAG,EAAE;IAC7C,IAAI,OAAO,GAAkB,IAAI,CAAC;IAClC,IAAI,WAAW,GAAG,CAAC,CAAC;IAEpB,UAAU,CAAC,KAAK,IAAI,EAAE;QACpB,MAAM,QAAQ,GAAG,MAAM,UAAU,EAAE,CAAC;QACpC,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC;QAC1B,WAAW,GAAG,QAAQ,CAAC,IAAI,CAAC;IAC9B,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,KAAK,IAAI,EAAE;QACnB,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,OAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YACtE,OAAO,GAAG,IAAI,CAAC;QACjB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;QACrE,iDAAiD;QACjD,MAAM,QAAQ,GAAG,MAAM,iBAAiB,EAAE,CAAC;QAC3C,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QACvD,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACrC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sEAAsE,EAAE,KAAK,IAAI,EAAE;QACpF,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QAC1D,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC5C,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QACzC,mEAAmE;QACnE,MAAM,CAAC,MAAM,cAAc,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;QAC7E,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QAChD,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACtC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;QACvE,MAAM,CAAC,MAAM,cAAc,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,sDAAsD,EAAE,GAAG,EAAE;IACpE,IAAI,OAAO,GAAkB,IAAI,CAAC;IAClC,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,SAA6B,CAAC;IAElC,UAAU,CAAC,KAAK,IAAI,EAAE;QACpB,MAAM,QAAQ,GAAG,MAAM,UAAU,EAAE,CAAC;QACpC,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC;QAC1B,WAAW,GAAG,QAAQ,CAAC,IAAI,CAAC;QAC5B,kEAAkE;QAClE,mEAAmE;QACnE,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,KAAK,IAAI,EAAE;QACnB,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC5B,OAAO,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;QAC1B,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,SAAS,CAAC;QAC/B,CAAC;QACD,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,OAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YACtE,OAAO,GAAG,IAAI,CAAC;QACjB,CAAC;QACD,EAAE,CAAC,eAAe,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;QACpE,MAAM,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACvE,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAE/C,MAAM,IAAI,GAAG,MAAM,sBAAsB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAE7D,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC5B,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6EAA6E,EAAE,KAAK,IAAI,EAAE;QAC3F,MAAM,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAEvE,MAAM,IAAI,GAAG,MAAM,sBAAsB,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QAEhE,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACnC,MAAM,CAAC,IAAI,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAChC,qEAAqE;QACrE,MAAM,CAAC,MAAM,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpD,MAAM,CAAC,OAAO,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QACzC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACjD,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;QAC3C,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC;QAC/C,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;QAC7E,MAAM,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACvE,MAAM,MAAM,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAErE,MAAM,IAAI,GAAG,MAAM,sBAAsB,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;QAExD,MAAM,CAAC,IAAI,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAChC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QACvC,MAAM,CAAC,MAAM,CAAC,CAAC,oBAAoB,CACjC,sBAAsB,IAAI,cAAc,CACzC,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"port-probe-errors.spec.d.ts","sourceRoot":"","sources":["../../src/__tests__/port-probe-errors.spec.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for the bind-probe error policy (PR #1197 review follow-up to
|
|
3
|
+
* issue #1194): only a genuine `EADDRINUSE` conflict may trigger the
|
|
4
|
+
* auto-assign fallback. Any other bind failure (`EACCES` privileged port,
|
|
5
|
+
* host errors, ...) must REJECT so callers surface the real problem
|
|
6
|
+
* instead of a misleading "port in use" warning.
|
|
7
|
+
*
|
|
8
|
+
* `net` is mocked: a real `EACCES` is environment-dependent (root and
|
|
9
|
+
* modern macOS can bind low ports), so the error path is simulated.
|
|
10
|
+
*/
|
|
11
|
+
import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
|
|
12
|
+
import { EventEmitter } from "node:events";
|
|
13
|
+
const probeControl = vi.hoisted(() => ({
|
|
14
|
+
errorFor: (_port) => null,
|
|
15
|
+
autoAssignPort: 45678,
|
|
16
|
+
}));
|
|
17
|
+
vi.mock("net", () => {
|
|
18
|
+
return {
|
|
19
|
+
createServer: () => {
|
|
20
|
+
const server = new EventEmitter();
|
|
21
|
+
let boundPort = 0;
|
|
22
|
+
server.listen = (port, _host, cb) => {
|
|
23
|
+
const err = probeControl.errorFor(port);
|
|
24
|
+
if (err) {
|
|
25
|
+
queueMicrotask(() => server.emit("error", err));
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
boundPort = port === 0 ? probeControl.autoAssignPort : port;
|
|
29
|
+
queueMicrotask(() => cb?.());
|
|
30
|
+
}
|
|
31
|
+
return server;
|
|
32
|
+
};
|
|
33
|
+
server.close = (cb) => {
|
|
34
|
+
cb?.();
|
|
35
|
+
return server;
|
|
36
|
+
};
|
|
37
|
+
server.address = () => ({ port: boundPort });
|
|
38
|
+
return server;
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
});
|
|
42
|
+
import { isPortBindable, resolveBindPort, resolveStartupBindPort, } from "../config.js";
|
|
43
|
+
function errnoError(code) {
|
|
44
|
+
const err = new Error(`listen ${code}`);
|
|
45
|
+
err.code = code;
|
|
46
|
+
return err;
|
|
47
|
+
}
|
|
48
|
+
beforeEach(() => {
|
|
49
|
+
probeControl.errorFor = () => null;
|
|
50
|
+
});
|
|
51
|
+
afterEach(() => {
|
|
52
|
+
vi.restoreAllMocks();
|
|
53
|
+
});
|
|
54
|
+
describe("isPortBindable error policy", () => {
|
|
55
|
+
it("resolves true when the probe bind succeeds", async () => {
|
|
56
|
+
await expect(isPortBindable(8080, "0.0.0.0")).resolves.toBe(true);
|
|
57
|
+
});
|
|
58
|
+
it("resolves false ONLY for EADDRINUSE", async () => {
|
|
59
|
+
probeControl.errorFor = () => errnoError("EADDRINUSE");
|
|
60
|
+
await expect(isPortBindable(8080, "0.0.0.0")).resolves.toBe(false);
|
|
61
|
+
});
|
|
62
|
+
it("rejects with the underlying error for EACCES", async () => {
|
|
63
|
+
probeControl.errorFor = () => errnoError("EACCES");
|
|
64
|
+
await expect(isPortBindable(80, "0.0.0.0")).rejects.toMatchObject({
|
|
65
|
+
code: "EACCES",
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
it("rejects with the underlying error for host failures", async () => {
|
|
69
|
+
probeControl.errorFor = () => errnoError("EADDRNOTAVAIL");
|
|
70
|
+
await expect(isPortBindable(8080, "203.0.113.1")).rejects.toMatchObject({
|
|
71
|
+
code: "EADDRNOTAVAIL",
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
describe("resolveBindPort error policy", () => {
|
|
76
|
+
it("falls back to an OS-assigned port for a genuine EADDRINUSE", async () => {
|
|
77
|
+
// Conflict on the configured port; the port-0 fallback bind succeeds.
|
|
78
|
+
probeControl.errorFor = (port) => port === 8080 ? errnoError("EADDRINUSE") : null;
|
|
79
|
+
const resolved = await resolveBindPort(8080, "0.0.0.0");
|
|
80
|
+
expect(resolved.fellBack).toBe(true);
|
|
81
|
+
expect(resolved.port).toBe(probeControl.autoAssignPort);
|
|
82
|
+
});
|
|
83
|
+
it("propagates EACCES instead of silently falling back", async () => {
|
|
84
|
+
probeControl.errorFor = () => errnoError("EACCES");
|
|
85
|
+
await expect(resolveBindPort(80, "0.0.0.0")).rejects.toMatchObject({
|
|
86
|
+
code: "EACCES",
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
describe("resolveStartupBindPort error policy", () => {
|
|
91
|
+
it("surfaces non-conflict bind failures without a PORT CONFLICT warning", async () => {
|
|
92
|
+
const warnSpy = vi.spyOn(console, "warn").mockImplementation(() => { });
|
|
93
|
+
probeControl.errorFor = () => errnoError("EACCES");
|
|
94
|
+
await expect(resolveStartupBindPort(80, "agent")).rejects.toMatchObject({
|
|
95
|
+
code: "EACCES",
|
|
96
|
+
});
|
|
97
|
+
expect(warnSpy).not.toHaveBeenCalled();
|
|
98
|
+
});
|
|
99
|
+
});
|
|
100
|
+
//# sourceMappingURL=port-probe-errors.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"port-probe-errors.spec.js","sourceRoot":"","sources":["../../src/__tests__/port-probe-errors.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,6 +4,5 @@
|
|
|
4
4
|
* Tests the ProviderHandlerRegistry singleton that manages vendor-specific handlers.
|
|
5
5
|
*/
|
|
6
6
|
import "../provider-handlers/openai-handler.js";
|
|
7
|
-
import "../provider-handlers/gemini-handler.js";
|
|
8
7
|
import "../provider-handlers/generic-handler.js";
|
|
9
8
|
//# sourceMappingURL=provider-handler-registry.test.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider-handler-registry.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/provider-handler-registry.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"provider-handler-registry.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/provider-handler-registry.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AASH,OAAO,wCAAwC,CAAC;AAChD,OAAO,yCAAyC,CAAC"}
|
|
@@ -6,9 +6,9 @@
|
|
|
6
6
|
import { describe, it, expect, beforeEach, afterEach } from "vitest";
|
|
7
7
|
import { ProviderHandlerRegistry } from "../provider-handlers/provider-handler-registry.js";
|
|
8
8
|
import { ClaudeHandler } from "../provider-handlers/claude-handler.js";
|
|
9
|
+
import { GeminiHandler } from "../provider-handlers/gemini-handler.js";
|
|
9
10
|
// Import handlers to register them (side effect registration)
|
|
10
11
|
import "../provider-handlers/openai-handler.js";
|
|
11
|
-
import "../provider-handlers/gemini-handler.js";
|
|
12
12
|
import "../provider-handlers/generic-handler.js";
|
|
13
13
|
describe("ProviderHandlerRegistry", () => {
|
|
14
14
|
beforeEach(() => {
|
|
@@ -35,6 +35,20 @@ describe("ProviderHandlerRegistry", () => {
|
|
|
35
35
|
expect(handler.vendor).toBe("google");
|
|
36
36
|
expect(handler.constructor.name).toBe("GeminiHandler");
|
|
37
37
|
});
|
|
38
|
+
it("should return GeminiHandler for google vendor (#1163 MED-4)", () => {
|
|
39
|
+
// "google" is a first-class model prefix (VENDOR_PROVIDERS,
|
|
40
|
+
// llm-provider guards, media/resolver) and must map to the Gemini
|
|
41
|
+
// handler, not fall through to GenericHandler.
|
|
42
|
+
const handler = ProviderHandlerRegistry.getHandler("google");
|
|
43
|
+
expect(handler).toBeDefined();
|
|
44
|
+
expect(handler).toBeInstanceOf(GeminiHandler);
|
|
45
|
+
expect(handler.vendor).toBe("google");
|
|
46
|
+
});
|
|
47
|
+
it("should return GeminiHandler for vertex_ai vendor", () => {
|
|
48
|
+
const handler = ProviderHandlerRegistry.getHandler("vertex_ai");
|
|
49
|
+
expect(handler).toBeDefined();
|
|
50
|
+
expect(handler).toBeInstanceOf(GeminiHandler);
|
|
51
|
+
});
|
|
38
52
|
it("should return GenericHandler for unknown vendor", () => {
|
|
39
53
|
const handler = ProviderHandlerRegistry.getHandler("unknown");
|
|
40
54
|
expect(handler).toBeDefined();
|
|
@@ -55,6 +69,14 @@ describe("ProviderHandlerRegistry", () => {
|
|
|
55
69
|
expect(handler).toBeDefined();
|
|
56
70
|
expect(handler.constructor.name).toBe("GenericHandler");
|
|
57
71
|
});
|
|
72
|
+
it("should pass the requested vendor into the fallback GenericHandler (#1163 MED-4)", () => {
|
|
73
|
+
// The fallback used to be constructed with no args, hard-wiring
|
|
74
|
+
// vendor "unknown" — losing vendor-aware prompt shaping for
|
|
75
|
+
// unregistered-but-known vendors.
|
|
76
|
+
const handler = ProviderHandlerRegistry.getHandler("cohere");
|
|
77
|
+
expect(handler.constructor.name).toBe("GenericHandler");
|
|
78
|
+
expect(handler.vendor).toBe("cohere");
|
|
79
|
+
});
|
|
58
80
|
it("should normalize vendor name to lowercase", () => {
|
|
59
81
|
const handler1 = ProviderHandlerRegistry.getHandler("ANTHROPIC");
|
|
60
82
|
const handler2 = ProviderHandlerRegistry.getHandler("Anthropic");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider-handler-registry.test.js","sourceRoot":"","sources":["../../src/__tests__/provider-handler-registry.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAErE,OAAO,EAAE,uBAAuB,EAAE,MAAM,mDAAmD,CAAC;AAC5F,OAAO,EAAE,aAAa,EAAE,MAAM,wCAAwC,CAAC;
|
|
1
|
+
{"version":3,"file":"provider-handler-registry.test.js","sourceRoot":"","sources":["../../src/__tests__/provider-handler-registry.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unit tests for SSE no-data/comment-only EOF handling in callMcpTool (#1201).
|
|
3
|
+
*
|
|
4
|
+
* When a producer holds a response past the proxy's X-Mesh-Timeout budget,
|
|
5
|
+
* the registry proxy cuts the exchange with a clean EOF whose accumulated
|
|
6
|
+
* body may be nothing but sse-starlette keepalive comment frames
|
|
7
|
+
* (`: ping - <ts>`). Per the SSE spec, ":"-prefixed comment frames must be
|
|
8
|
+
* ignored — and a stream that ends with ZERO result frames is a cut
|
|
9
|
+
* exchange that must reject, never resolve as an empty-string success
|
|
10
|
+
* (which would poison LLM tool loops and record success spans).
|
|
11
|
+
*/
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=proxy-sse-no-data.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proxy-sse-no-data.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/proxy-sse-no-data.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG"}
|