wave-agent-sdk 0.16.8 → 0.16.9
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/constants/tools.d.ts +0 -1
- package/dist/constants/tools.d.ts.map +1 -1
- package/dist/constants/tools.js +0 -1
- package/dist/managers/aiManager.d.ts +0 -8
- package/dist/managers/aiManager.d.ts.map +1 -1
- package/dist/managers/aiManager.js +0 -45
- package/dist/managers/mcpManager.d.ts +5 -0
- package/dist/managers/mcpManager.d.ts.map +1 -1
- package/dist/managers/mcpManager.js +107 -12
- package/dist/managers/toolManager.d.ts +0 -6
- package/dist/managers/toolManager.d.ts.map +1 -1
- package/dist/managers/toolManager.js +1 -28
- package/dist/prompts/index.d.ts.map +1 -1
- package/dist/prompts/index.js +1 -12
- package/dist/services/authService.d.ts +10 -0
- package/dist/services/authService.d.ts.map +1 -1
- package/dist/services/authService.js +45 -0
- package/dist/services/configurationService.d.ts.map +1 -1
- package/dist/services/configurationService.js +8 -14
- package/dist/services/pluginLoader.d.ts.map +1 -1
- package/dist/services/pluginLoader.js +2 -2
- package/dist/telemetry/instrumentation.d.ts +5 -2
- package/dist/telemetry/instrumentation.d.ts.map +1 -1
- package/dist/telemetry/instrumentation.js +8 -4
- package/dist/tools/buildTool.d.ts +0 -2
- package/dist/tools/buildTool.d.ts.map +1 -1
- package/dist/tools/buildTool.js +0 -2
- package/dist/tools/cronCreateTool.d.ts.map +1 -1
- package/dist/tools/cronCreateTool.js +0 -1
- package/dist/tools/cronDeleteTool.d.ts.map +1 -1
- package/dist/tools/cronDeleteTool.js +0 -1
- package/dist/tools/cronListTool.d.ts.map +1 -1
- package/dist/tools/cronListTool.js +0 -1
- package/dist/tools/enterWorktreeTool.d.ts.map +1 -1
- package/dist/tools/enterWorktreeTool.js +0 -1
- package/dist/tools/exitWorktreeTool.d.ts.map +1 -1
- package/dist/tools/exitWorktreeTool.js +0 -1
- package/dist/tools/taskManagementTools.d.ts.map +1 -1
- package/dist/tools/taskManagementTools.js +0 -4
- package/dist/tools/types.d.ts +0 -15
- package/dist/tools/types.d.ts.map +1 -1
- package/dist/tools/webFetchTool.d.ts.map +1 -1
- package/dist/tools/webFetchTool.js +0 -1
- package/dist/types/mcp.d.ts +3 -1
- package/dist/types/mcp.d.ts.map +1 -1
- package/dist/utils/mcpUtils.d.ts.map +1 -1
- package/dist/utils/mcpUtils.js +0 -1
- package/package.json +1 -1
- package/src/constants/tools.ts +0 -1
- package/src/managers/aiManager.ts +0 -48
- package/src/managers/mcpManager.ts +122 -16
- package/src/managers/toolManager.ts +1 -32
- package/src/prompts/index.ts +0 -13
- package/src/services/authService.ts +56 -0
- package/src/services/configurationService.ts +8 -18
- package/src/services/pluginLoader.ts +2 -2
- package/src/telemetry/instrumentation.ts +12 -4
- package/src/tools/buildTool.ts +0 -4
- package/src/tools/cronCreateTool.ts +0 -1
- package/src/tools/cronDeleteTool.ts +0 -1
- package/src/tools/cronListTool.ts +0 -1
- package/src/tools/enterWorktreeTool.ts +0 -1
- package/src/tools/exitWorktreeTool.ts +0 -1
- package/src/tools/taskManagementTools.ts +0 -4
- package/src/tools/types.ts +0 -15
- package/src/tools/webFetchTool.ts +0 -1
- package/src/types/mcp.ts +8 -1
- package/src/utils/mcpUtils.ts +0 -1
- package/dist/tools/toolSearchTool.d.ts +0 -15
- package/dist/tools/toolSearchTool.d.ts.map +0 -1
- package/dist/tools/toolSearchTool.js +0 -200
- package/dist/utils/isDeferredTool.d.ts +0 -19
- package/dist/utils/isDeferredTool.d.ts.map +0 -1
- package/dist/utils/isDeferredTool.js +0 -31
- package/src/tools/toolSearchTool.ts +0 -245
- package/src/utils/isDeferredTool.ts +0 -36
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pluginLoader.d.ts","sourceRoot":"","sources":["../../src/services/pluginLoader.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,cAAc,EACd,kBAAkB,EAClB,KAAK,EACL,SAAS,EACT,SAAS,EACT,wBAAwB,EACzB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAEL,KAAK,qBAAqB,EAC3B,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"pluginLoader.d.ts","sourceRoot":"","sources":["../../src/services/pluginLoader.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,cAAc,EACd,kBAAkB,EAClB,KAAK,EACL,SAAS,EACT,SAAS,EACT,wBAAwB,EACzB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAEL,KAAK,qBAAqB,EAC3B,MAAM,4BAA4B,CAAC;AAGpC,qBAAa,YAAY;IACvB;;;OAGG;WACU,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IA6CtE;;;OAGG;IACH,MAAM,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,kBAAkB,EAAE;IAK7D;;;OAGG;WACU,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;IAuC7D;;OAEG;WACU,aAAa,CACxB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC;IAUjC;;OAEG;WACU,aAAa,CACxB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC;IAWjC;;OAEG;WACU,eAAe,CAC1B,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,wBAAwB,GAAG,SAAS,CAAC;IAgBhD;;OAEG;WACU,UAAU,CACrB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,qBAAqB,EAAE,CAAC;IA2BnC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,gBAAgB;CAgBhC"}
|
|
@@ -3,7 +3,6 @@ import * as path from "path";
|
|
|
3
3
|
import { scanCommandsDirectory } from "../utils/customCommands.js";
|
|
4
4
|
import { parseSkillFile } from "../utils/skillParser.js";
|
|
5
5
|
import { parseAgentFile, } from "../utils/subagentParser.js";
|
|
6
|
-
import { resolveMcpConfig } from "../managers/mcpManager.js";
|
|
7
6
|
import { logger } from "../utils/globalLogger.js";
|
|
8
7
|
export class PluginLoader {
|
|
9
8
|
/**
|
|
@@ -112,7 +111,8 @@ export class PluginLoader {
|
|
|
112
111
|
const mcpPath = path.join(pluginPath, ".mcp.json");
|
|
113
112
|
try {
|
|
114
113
|
const content = await fs.readFile(mcpPath, "utf-8");
|
|
115
|
-
|
|
114
|
+
// Return raw config — let McpManager resolve templates and capture originalUrl
|
|
115
|
+
return JSON.parse(content);
|
|
116
116
|
}
|
|
117
117
|
catch {
|
|
118
118
|
return undefined;
|
|
@@ -63,8 +63,11 @@ export declare function getCurrentConfig(): TelemetryConfig | undefined;
|
|
|
63
63
|
export declare function isInitialized(): boolean;
|
|
64
64
|
export { JsonlSpanExporter, JsonlLogExporter };
|
|
65
65
|
/**
|
|
66
|
-
* Get telemetry attributes
|
|
67
|
-
*
|
|
66
|
+
* Get telemetry attributes for the current session.
|
|
67
|
+
*
|
|
68
|
+
* Priority:
|
|
69
|
+
* 1. SSO authenticated → server-provided user.id + user.email
|
|
70
|
+
* 2. Not authenticated → persistent anonymous ID from ~/.wave/config.json
|
|
68
71
|
*/
|
|
69
72
|
export declare function getTelemetryAttributes(): Record<string, string>;
|
|
70
73
|
//# sourceMappingURL=instrumentation.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instrumentation.d.ts","sourceRoot":"","sources":["../../src/telemetry/instrumentation.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,eAAe,EAGhB,MAAM,uBAAuB,CAAC;AAI/B,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAChF,OAAO,KAAK,EACV,iBAAiB,EACjB,iBAAiB,EAClB,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"instrumentation.d.ts","sourceRoot":"","sources":["../../src/telemetry/instrumentation.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,eAAe,EAGhB,MAAM,uBAAuB,CAAC;AAI/B,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAChF,OAAO,KAAK,EACV,iBAAiB,EACjB,iBAAiB,EAClB,MAAM,yBAAyB,CAAC;AA8JjC;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,cAAc,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,GACxC,eAAe,CAmBjB;AAwCD;;GAEG;AACH,cAAM,iBAAkB,YAAW,YAAY;IAC7C,OAAO,CAAC,QAAQ,CAAS;gBAEb,QAAQ,CAAC,EAAE,MAAM;IAI7B,MAAM,CACJ,KAAK,EAAE,YAAY,EAAE,EACrB,cAAc,EAAE,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,GACjD,IAAI;IAwBP,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAIzB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;CAG5B;AAED;;GAEG;AACH,cAAM,gBAAiB,YAAW,iBAAiB;IACjD,OAAO,CAAC,QAAQ,CAAS;gBAEb,QAAQ,CAAC,EAAE,MAAM;IAI7B,MAAM,CACJ,IAAI,EAAE,iBAAiB,EAAE,EACzB,cAAc,EAAE,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,GACjD,IAAI;IAuBP,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAIzB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;CAG5B;AAED;;;;;GAKG;AACH,wBAAsB,mBAAmB,CACvC,MAAM,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,GAChC,OAAO,CAAC,IAAI,CAAC,CA8Ef;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAuBvD;AAED;;;GAGG;AACH,wBAAgB,UAAU,IAAI,cAAc,oBAAoB,CAAC,GAAG,SAAS,CAE5E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,eAAe,GAAG,SAAS,CAE9D;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,OAAO,CAEvC;AAGD,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,CAAC;AAE/C;;;;;;GAMG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAgB/D"}
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import { logger } from "../utils/globalLogger.js";
|
|
8
8
|
import * as fs from "node:fs";
|
|
9
|
-
import { AuthService } from "../services/authService.js";
|
|
9
|
+
import { AuthService, getOrCreateAnonymousId, } from "../services/authService.js";
|
|
10
10
|
// Lazy-loaded OTEL modules — only imported when telemetry is initialized
|
|
11
11
|
let sdkNode;
|
|
12
12
|
let api;
|
|
@@ -371,8 +371,11 @@ export function isInitialized() {
|
|
|
371
371
|
// Export JSONL exporters for testing
|
|
372
372
|
export { JsonlSpanExporter, JsonlLogExporter };
|
|
373
373
|
/**
|
|
374
|
-
* Get telemetry attributes
|
|
375
|
-
*
|
|
374
|
+
* Get telemetry attributes for the current session.
|
|
375
|
+
*
|
|
376
|
+
* Priority:
|
|
377
|
+
* 1. SSO authenticated → server-provided user.id + user.email
|
|
378
|
+
* 2. Not authenticated → persistent anonymous ID from ~/.wave/config.json
|
|
376
379
|
*/
|
|
377
380
|
export function getTelemetryAttributes() {
|
|
378
381
|
try {
|
|
@@ -388,5 +391,6 @@ export function getTelemetryAttributes() {
|
|
|
388
391
|
catch {
|
|
389
392
|
// AuthService not available or not authenticated
|
|
390
393
|
}
|
|
391
|
-
|
|
394
|
+
// Fallback to anonymous ID
|
|
395
|
+
return { "user.id": getOrCreateAnonymousId() };
|
|
392
396
|
}
|
|
@@ -14,8 +14,6 @@ export interface ToolDef {
|
|
|
14
14
|
isSubagent?: boolean;
|
|
15
15
|
}) => string);
|
|
16
16
|
formatCompactParams?: (params: Record<string, unknown>, context: ToolContext) => string;
|
|
17
|
-
shouldDefer?: boolean;
|
|
18
|
-
alwaysLoad?: boolean;
|
|
19
17
|
additionalProperties?: boolean;
|
|
20
18
|
}
|
|
21
19
|
export declare function buildTool(def: ToolDef): ToolPlugin;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"buildTool.d.ts","sourceRoot":"","sources":["../../src/tools/buildTool.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEtE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACxE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,EAAE,CACP,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,OAAO,EAAE,WAAW,KACjB,OAAO,CAAC,UAAU,CAAC,CAAC;IACzB,MAAM,CAAC,EACH,MAAM,GACN,CAAC,CAAC,IAAI,CAAC,EAAE;QACP,kBAAkB,CAAC,EAAE,qBAAqB,EAAE,CAAC;QAC7C,eAAe,CAAC,EAAE,aAAa,EAAE,CAAC;QAClC,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,UAAU,CAAC,EAAE,OAAO,CAAC;KACtB,KAAK,MAAM,CAAC,CAAC;IAClB,mBAAmB,CAAC,EAAE,CACpB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,OAAO,EAAE,WAAW,KACjB,MAAM,CAAC;IACZ,
|
|
1
|
+
{"version":3,"file":"buildTool.d.ts","sourceRoot":"","sources":["../../src/tools/buildTool.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEtE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACxE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,EAAE,CACP,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,OAAO,EAAE,WAAW,KACjB,OAAO,CAAC,UAAU,CAAC,CAAC;IACzB,MAAM,CAAC,EACH,MAAM,GACN,CAAC,CAAC,IAAI,CAAC,EAAE;QACP,kBAAkB,CAAC,EAAE,qBAAqB,EAAE,CAAC;QAC7C,eAAe,CAAC,EAAE,aAAa,EAAE,CAAC;QAClC,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,UAAU,CAAC,EAAE,OAAO,CAAC;KACtB,KAAK,MAAM,CAAC,CAAC;IAClB,mBAAmB,CAAC,EAAE,CACpB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,OAAO,EAAE,WAAW,KACjB,MAAM,CAAC;IACZ,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,OAAO,GAAG,UAAU,CA+BlD"}
|
package/dist/tools/buildTool.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cronCreateTool.d.ts","sourceRoot":"","sources":["../../src/tools/cronCreateTool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAA2B,MAAM,YAAY,CAAC;AAgDjE,eAAO,MAAM,cAAc,EAAE,
|
|
1
|
+
{"version":3,"file":"cronCreateTool.d.ts","sourceRoot":"","sources":["../../src/tools/cronCreateTool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAA2B,MAAM,YAAY,CAAC;AAgDjE,eAAO,MAAM,cAAc,EAAE,UAgH5B,CAAC"}
|
|
@@ -43,7 +43,6 @@ Recurring tasks auto-expire after ${DEFAULT_MAX_AGE_DAYS} days — they fire one
|
|
|
43
43
|
Returns a job ID you can pass to CronDelete.`;
|
|
44
44
|
export const cronCreateTool = {
|
|
45
45
|
name: CRON_CREATE_TOOL_NAME,
|
|
46
|
-
shouldDefer: true,
|
|
47
46
|
config: {
|
|
48
47
|
type: "function",
|
|
49
48
|
function: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cronDeleteTool.d.ts","sourceRoot":"","sources":["../../src/tools/cronDeleteTool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAA2B,MAAM,YAAY,CAAC;AAOjE,eAAO,MAAM,cAAc,EAAE,
|
|
1
|
+
{"version":3,"file":"cronDeleteTool.d.ts","sourceRoot":"","sources":["../../src/tools/cronDeleteTool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAA2B,MAAM,YAAY,CAAC;AAOjE,eAAO,MAAM,cAAc,EAAE,UA2C5B,CAAC"}
|
|
@@ -3,7 +3,6 @@ const CRON_DELETE_DESCRIPTION = "Cancel a scheduled cron job by ID";
|
|
|
3
3
|
const CRON_DELETE_PROMPT = `Cancel a cron job previously scheduled with CronCreate. Removes it from both the in-memory session store and durable file storage (if applicable).`;
|
|
4
4
|
export const cronDeleteTool = {
|
|
5
5
|
name: CRON_DELETE_TOOL_NAME,
|
|
6
|
-
shouldDefer: true,
|
|
7
6
|
config: {
|
|
8
7
|
type: "function",
|
|
9
8
|
function: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cronListTool.d.ts","sourceRoot":"","sources":["../../src/tools/cronListTool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAA2B,MAAM,YAAY,CAAC;AAOjE,eAAO,MAAM,YAAY,EAAE,
|
|
1
|
+
{"version":3,"file":"cronListTool.d.ts","sourceRoot":"","sources":["../../src/tools/cronListTool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAA2B,MAAM,YAAY,CAAC;AAOjE,eAAO,MAAM,YAAY,EAAE,UAuC1B,CAAC"}
|
|
@@ -3,7 +3,6 @@ const CRON_LIST_DESCRIPTION = "List scheduled cron jobs";
|
|
|
3
3
|
const CRON_LIST_PROMPT = `List all cron jobs scheduled via CronCreate in this session.`;
|
|
4
4
|
export const cronListTool = {
|
|
5
5
|
name: CRON_LIST_TOOL_NAME,
|
|
6
|
-
shouldDefer: true,
|
|
7
6
|
config: {
|
|
8
7
|
type: "function",
|
|
9
8
|
function: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"enterWorktreeTool.d.ts","sourceRoot":"","sources":["../../src/tools/enterWorktreeTool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,UAAU,EAA2B,MAAM,YAAY,CAAC;AAetE,eAAO,MAAM,0BAA0B,qxCA0BtC,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,
|
|
1
|
+
{"version":3,"file":"enterWorktreeTool.d.ts","sourceRoot":"","sources":["../../src/tools/enterWorktreeTool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,UAAU,EAA2B,MAAM,YAAY,CAAC;AAetE,eAAO,MAAM,0BAA0B,qxCA0BtC,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,UAqI/B,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exitWorktreeTool.d.ts","sourceRoot":"","sources":["../../src/tools/exitWorktreeTool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,UAAU,EAA2B,MAAM,YAAY,CAAC;AAYtE,eAAO,MAAM,yBAAyB,gvDA4BrC,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,
|
|
1
|
+
{"version":3,"file":"exitWorktreeTool.d.ts","sourceRoot":"","sources":["../../src/tools/exitWorktreeTool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,UAAU,EAA2B,MAAM,YAAY,CAAC;AAYtE,eAAO,MAAM,yBAAyB,gvDA4BrC,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,UAiM9B,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"taskManagementTools.d.ts","sourceRoot":"","sources":["../../src/tools/taskManagementTools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAA2B,MAAM,YAAY,CAAC;AASjE,eAAO,MAAM,cAAc,EAAE,
|
|
1
|
+
{"version":3,"file":"taskManagementTools.d.ts","sourceRoot":"","sources":["../../src/tools/taskManagementTools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAA2B,MAAM,YAAY,CAAC;AASjE,eAAO,MAAM,cAAc,EAAE,UAoI5B,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,UAyDzB,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,UAgW5B,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,UAkE1B,CAAC"}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { TASK_CREATE_TOOL_NAME, TASK_GET_TOOL_NAME, TASK_UPDATE_TOOL_NAME, TASK_LIST_TOOL_NAME, } from "../constants/tools.js";
|
|
2
2
|
export const taskCreateTool = {
|
|
3
3
|
name: TASK_CREATE_TOOL_NAME,
|
|
4
|
-
shouldDefer: true,
|
|
5
4
|
config: {
|
|
6
5
|
type: "function",
|
|
7
6
|
function: {
|
|
@@ -124,7 +123,6 @@ NOTE that you should not use this tool if there is only one trivial task to do.
|
|
|
124
123
|
};
|
|
125
124
|
export const taskGetTool = {
|
|
126
125
|
name: TASK_GET_TOOL_NAME,
|
|
127
|
-
shouldDefer: true,
|
|
128
126
|
config: {
|
|
129
127
|
type: "function",
|
|
130
128
|
function: {
|
|
@@ -181,7 +179,6 @@ Returns full task details:
|
|
|
181
179
|
};
|
|
182
180
|
export const taskUpdateTool = {
|
|
183
181
|
name: TASK_UPDATE_TOOL_NAME,
|
|
184
|
-
shouldDefer: true,
|
|
185
182
|
config: {
|
|
186
183
|
type: "function",
|
|
187
184
|
function: {
|
|
@@ -481,7 +478,6 @@ Set up task dependencies:
|
|
|
481
478
|
};
|
|
482
479
|
export const taskListTool = {
|
|
483
480
|
name: TASK_LIST_TOOL_NAME,
|
|
484
|
-
shouldDefer: true,
|
|
485
481
|
config: {
|
|
486
482
|
type: "function",
|
|
487
483
|
function: {
|
package/dist/tools/types.d.ts
CHANGED
|
@@ -19,21 +19,6 @@ export interface ToolPlugin {
|
|
|
19
19
|
workdir?: string;
|
|
20
20
|
isSubagent?: boolean;
|
|
21
21
|
}) => string;
|
|
22
|
-
/**
|
|
23
|
-
* When true, this tool is deferred — it's not sent to the API until the model
|
|
24
|
-
* discovers it via ToolSearch. MCP tools are always deferred.
|
|
25
|
-
*/
|
|
26
|
-
shouldDefer?: boolean;
|
|
27
|
-
/**
|
|
28
|
-
* When true, this tool is never deferred — its full schema always appears in
|
|
29
|
-
* the initial prompt even when tool search is enabled.
|
|
30
|
-
*/
|
|
31
|
-
alwaysLoad?: boolean;
|
|
32
|
-
/**
|
|
33
|
-
* When true, this is an MCP tool (auto-set by McpManager). MCP tools are
|
|
34
|
-
* always deferred unless they have alwaysLoad: true.
|
|
35
|
-
*/
|
|
36
|
-
isMcp?: boolean;
|
|
37
22
|
}
|
|
38
23
|
export interface ToolResult {
|
|
39
24
|
success: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/tools/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,KAAK,EACV,cAAc,EACd,kBAAkB,EACnB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACxE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,0BAA0B,CAAC;IACnC,OAAO,EAAE,CACP,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,OAAO,EAAE,WAAW,KACjB,OAAO,CAAC,UAAU,CAAC,CAAC;IACzB,mBAAmB,CAAC,EAAE,CACpB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,OAAO,EAAE,WAAW,KACjB,MAAM,CAAC;IACZ;;OAEG;IACH,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE;QACf,kBAAkB,CAAC,EAAE,qBAAqB,EAAE,CAAC;QAC7C,eAAe,CAAC,EAAE,aAAa,EAAE,CAAC;QAClC,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,UAAU,CAAC,EAAE,OAAO,CAAC;KACtB,KAAK,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/tools/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webFetchTool.d.ts","sourceRoot":"","sources":["../../src/tools/webFetchTool.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAA2B,MAAM,YAAY,CAAC;AAoGtE,eAAO,MAAM,YAAY,EAAE,
|
|
1
|
+
{"version":3,"file":"webFetchTool.d.ts","sourceRoot":"","sources":["../../src/tools/webFetchTool.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAA2B,MAAM,YAAY,CAAC;AAoGtE,eAAO,MAAM,YAAY,EAAE,UAoL1B,CAAC"}
|
package/dist/types/mcp.d.ts
CHANGED
|
@@ -22,7 +22,9 @@ export interface McpTool {
|
|
|
22
22
|
export interface McpServerStatus {
|
|
23
23
|
name: string;
|
|
24
24
|
config: McpServerConfig;
|
|
25
|
-
|
|
25
|
+
/** Pre-resolution URL with template variables (e.g. ${WAVE_SSO_TOKEN}) preserved for safe display */
|
|
26
|
+
originalUrl?: string;
|
|
27
|
+
status: "disconnected" | "connected" | "connecting" | "reconnecting" | "error";
|
|
26
28
|
tools?: McpTool[];
|
|
27
29
|
toolCount?: number;
|
|
28
30
|
capabilities?: string[];
|
package/dist/types/mcp.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../src/types/mcp.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,gFAAgF;IAChF,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,SAAS;IACxB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;CAC7C;AAED,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,eAAe,CAAC;IACxB,
|
|
1
|
+
{"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../src/types/mcp.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,gFAAgF;IAChF,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,SAAS;IACxB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;CAC7C;AAED,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,eAAe,CAAC;IACxB,qGAAqG;IACrG,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EACF,cAAc,GACd,WAAW,GACX,YAAY,GACZ,cAAc,GACd,OAAO,CAAC;IACZ,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcpUtils.d.ts","sourceRoot":"","sources":["../../src/utils/mcpUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,KAAK,EAAE,UAAU,EAAc,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC7E,OAAO,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AA8ClE;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,MAAM,GACjB,0BAA0B,CAgB5B;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,CACX,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,OAAO,CAAC,EAAE,WAAW,KAClB,OAAO,CAAC;IACX,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACtD,CAAC,GACD,UAAU,
|
|
1
|
+
{"version":3,"file":"mcpUtils.d.ts","sourceRoot":"","sources":["../../src/utils/mcpUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,KAAK,EAAE,UAAU,EAAc,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC7E,OAAO,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AA8ClE;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,MAAM,GACjB,0BAA0B,CAgB5B;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,CACX,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,OAAO,CAAC,EAAE,WAAW,KAClB,OAAO,CAAC;IACX,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACtD,CAAC,GACD,UAAU,CAwBZ;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,eAAe,EAAE,GACzB,eAAe,GAAG,SAAS,CAK7B"}
|
package/dist/utils/mcpUtils.js
CHANGED
|
@@ -57,7 +57,6 @@ export function createMcpToolPlugin(mcpTool, serverName, executeTool) {
|
|
|
57
57
|
return {
|
|
58
58
|
name: prefixedName,
|
|
59
59
|
config: mcpToolToOpenAITool(mcpTool, serverName),
|
|
60
|
-
isMcp: true, // MCP tools are always deferred
|
|
61
60
|
async execute(args, context) {
|
|
62
61
|
try {
|
|
63
62
|
const result = await executeTool(prefixedName, args, context);
|
package/package.json
CHANGED
package/src/constants/tools.ts
CHANGED
|
@@ -66,8 +66,6 @@ export class AIManager {
|
|
|
66
66
|
private modelOverride?: string;
|
|
67
67
|
private consecutiveCompactionFailures: number = 0;
|
|
68
68
|
private readonly maxTurns?: number;
|
|
69
|
-
/** Tracks which deferred tools have been discovered via ToolSearch */
|
|
70
|
-
private discoveredTools = new Set<string>();
|
|
71
69
|
|
|
72
70
|
// Service overrides
|
|
73
71
|
constructor(
|
|
@@ -203,7 +201,6 @@ export class AIManager {
|
|
|
203
201
|
availableSkills,
|
|
204
202
|
workdir: this.getWorkdir(),
|
|
205
203
|
isSubagent: !!this.subagentType,
|
|
206
|
-
discoveredTools: this.discoveredTools,
|
|
207
204
|
});
|
|
208
205
|
}
|
|
209
206
|
|
|
@@ -1060,11 +1057,6 @@ export class AIManager {
|
|
|
1060
1057
|
toolArgs,
|
|
1061
1058
|
toolResult,
|
|
1062
1059
|
);
|
|
1063
|
-
|
|
1064
|
-
// Track discovered tools from ToolSearch results
|
|
1065
|
-
if (toolName === "ToolSearch" && toolResult.success) {
|
|
1066
|
-
this.trackDiscoveredTools(toolResult.content);
|
|
1067
|
-
}
|
|
1068
1060
|
} catch (toolError) {
|
|
1069
1061
|
const errorMessage =
|
|
1070
1062
|
toolError instanceof Error
|
|
@@ -1533,44 +1525,4 @@ export class AIManager {
|
|
|
1533
1525
|
logger?.error("PostToolUse hook execution failed:", error);
|
|
1534
1526
|
}
|
|
1535
1527
|
}
|
|
1536
|
-
|
|
1537
|
-
/**
|
|
1538
|
-
* Parse ToolSearch result content to extract discovered tool names.
|
|
1539
|
-
* ToolSearch returns content like "ToolName: description\nParameters: {...}"
|
|
1540
|
-
* or shortResult like "Discovered tools: ToolA, ToolB".
|
|
1541
|
-
*/
|
|
1542
|
-
private trackDiscoveredTools(content: string): void {
|
|
1543
|
-
// Try to extract tool names from shortResult-style content
|
|
1544
|
-
const discoveredMatch = content.match(/Discovered tools?: ([\w-, ]+)/);
|
|
1545
|
-
if (discoveredMatch) {
|
|
1546
|
-
const names = discoveredMatch[1]!
|
|
1547
|
-
.split(",")
|
|
1548
|
-
.map((n) => n.trim())
|
|
1549
|
-
.filter(Boolean);
|
|
1550
|
-
for (const name of names) {
|
|
1551
|
-
this.discoveredTools.add(name);
|
|
1552
|
-
}
|
|
1553
|
-
logger?.debug("Discovered tools:", names);
|
|
1554
|
-
return;
|
|
1555
|
-
}
|
|
1556
|
-
|
|
1557
|
-
// Fallback: extract tool names from "ToolName: description" pattern
|
|
1558
|
-
const lines = content.split("\n");
|
|
1559
|
-
const nonToolKeywords = new Set([
|
|
1560
|
-
"parameters",
|
|
1561
|
-
"description",
|
|
1562
|
-
"result",
|
|
1563
|
-
"error",
|
|
1564
|
-
"content",
|
|
1565
|
-
"type",
|
|
1566
|
-
"properties",
|
|
1567
|
-
"required",
|
|
1568
|
-
]);
|
|
1569
|
-
for (const line of lines) {
|
|
1570
|
-
const toolMatch = line.match(/^([\w-]+):/);
|
|
1571
|
-
if (toolMatch && !nonToolKeywords.has(toolMatch[1]!.toLowerCase())) {
|
|
1572
|
-
this.discoveredTools.add(toolMatch[1]!);
|
|
1573
|
-
}
|
|
1574
|
-
}
|
|
1575
|
-
}
|
|
1576
1528
|
}
|
|
@@ -44,7 +44,11 @@ export interface McpManagerOptions {
|
|
|
44
44
|
* Expand environment variables in a string value.
|
|
45
45
|
* Supports ${VAR} and ${VAR:-default} patterns.
|
|
46
46
|
*/
|
|
47
|
-
const WAVE_TEMPLATE_VARS = [
|
|
47
|
+
const WAVE_TEMPLATE_VARS = [
|
|
48
|
+
"WAVE_SERVER_URL",
|
|
49
|
+
"WAVE_SSO_TOKEN",
|
|
50
|
+
"WAVE_PLUGIN_ROOT",
|
|
51
|
+
];
|
|
48
52
|
|
|
49
53
|
export function expandEnvVars(value: string): string {
|
|
50
54
|
return value.replace(/\$\{([^}]+)\}/g, (_match, expr: string) => {
|
|
@@ -268,10 +272,14 @@ export class McpManager {
|
|
|
268
272
|
|
|
269
273
|
try {
|
|
270
274
|
const configContent = await fs.readFile(this.configPath, "utf-8");
|
|
271
|
-
const
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
)
|
|
275
|
+
const rawConfig: McpConfig = JSON.parse(configContent);
|
|
276
|
+
const workspaceConfig = resolveMcpConfig(rawConfig, this.resolverCtx);
|
|
277
|
+
|
|
278
|
+
// Extract original (pre-resolution) URLs for safe display
|
|
279
|
+
const originalUrls: Record<string, string | undefined> = {};
|
|
280
|
+
for (const [name, serverConfig] of Object.entries(rawConfig.mcpServers)) {
|
|
281
|
+
originalUrls[name] = serverConfig.url;
|
|
282
|
+
}
|
|
275
283
|
|
|
276
284
|
// Merge workspace config with any existing config (e.g., from plugins or constructor)
|
|
277
285
|
// Constructor-provided servers take precedence, then workspace config, then existing config
|
|
@@ -296,12 +304,14 @@ export class McpManager {
|
|
|
296
304
|
this.servers.set(name, {
|
|
297
305
|
...existingServer,
|
|
298
306
|
config, // Update config in case it changed
|
|
307
|
+
originalUrl: originalUrls[name] ?? existingServer.originalUrl,
|
|
299
308
|
});
|
|
300
309
|
} else {
|
|
301
310
|
// New server, initialize with disconnected status
|
|
302
311
|
this.servers.set(name, {
|
|
303
312
|
name,
|
|
304
313
|
config,
|
|
314
|
+
originalUrl: originalUrls[name],
|
|
305
315
|
status: "disconnected",
|
|
306
316
|
});
|
|
307
317
|
}
|
|
@@ -355,15 +365,45 @@ export class McpManager {
|
|
|
355
365
|
return false;
|
|
356
366
|
}
|
|
357
367
|
|
|
358
|
-
//
|
|
359
|
-
const
|
|
360
|
-
|
|
368
|
+
// Capture original URL before any resolution for safe display
|
|
369
|
+
const originalUrl = config.url;
|
|
370
|
+
|
|
371
|
+
// Step 1: expand env vars from process.env (e.g. ${TAVILY_API_KEY})
|
|
372
|
+
let resolvedConfig: McpServerConfig = { ...config };
|
|
373
|
+
if (resolvedConfig.command) {
|
|
374
|
+
resolvedConfig.command = expandEnvVars(resolvedConfig.command);
|
|
375
|
+
}
|
|
376
|
+
if (resolvedConfig.args) {
|
|
377
|
+
resolvedConfig.args = resolvedConfig.args.map(expandEnvVars);
|
|
378
|
+
}
|
|
379
|
+
if (resolvedConfig.env) {
|
|
380
|
+
const resolvedEnv: Record<string, string> = {};
|
|
381
|
+
for (const [key, val] of Object.entries(resolvedConfig.env)) {
|
|
382
|
+
resolvedEnv[key] = expandEnvVars(val);
|
|
383
|
+
}
|
|
384
|
+
resolvedConfig.env = resolvedEnv;
|
|
385
|
+
}
|
|
386
|
+
if (resolvedConfig.url) {
|
|
387
|
+
resolvedConfig.url = expandEnvVars(resolvedConfig.url);
|
|
388
|
+
}
|
|
389
|
+
if (resolvedConfig.headers) {
|
|
390
|
+
const resolvedHeaders: Record<string, string> = {};
|
|
391
|
+
for (const [key, val] of Object.entries(resolvedConfig.headers)) {
|
|
392
|
+
resolvedHeaders[key] = expandEnvVars(val);
|
|
393
|
+
}
|
|
394
|
+
resolvedConfig.headers = resolvedHeaders;
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
// Step 2: resolve Wave template variables (e.g. ${WAVE_SERVER_URL}, ${WAVE_SSO_TOKEN})
|
|
398
|
+
resolvedConfig = resolveMcpTemplates(
|
|
399
|
+
resolvedConfig,
|
|
361
400
|
this.resolverCtx ?? { serverUrl: undefined, ssoToken: undefined },
|
|
362
401
|
);
|
|
363
402
|
|
|
364
403
|
const newServer: McpServerStatus = {
|
|
365
404
|
name,
|
|
366
405
|
config: resolvedConfig,
|
|
406
|
+
originalUrl,
|
|
367
407
|
status: "disconnected",
|
|
368
408
|
};
|
|
369
409
|
|
|
@@ -545,13 +585,29 @@ export class McpManager {
|
|
|
545
585
|
);
|
|
546
586
|
}
|
|
547
587
|
|
|
548
|
-
// Handle transport errors
|
|
588
|
+
// Handle transport errors (e.g. SSE stream disconnected)
|
|
589
|
+
// The SDK auto-reconnects for transient SSE errors, so we use
|
|
590
|
+
// "reconnecting" status instead of "error". We then poll listTools()
|
|
591
|
+
// to detect when reconnection succeeds.
|
|
549
592
|
transport.onerror = (error: Error) => {
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
593
|
+
const isTransient = error.message?.includes("SSE stream disconnected");
|
|
594
|
+
if (isTransient) {
|
|
595
|
+
logger?.warn(
|
|
596
|
+
`MCP Server ${name} transient transport error (SDK will auto-reconnect): ${error.message}`,
|
|
597
|
+
);
|
|
598
|
+
this.updateServerStatus(name, {
|
|
599
|
+
status: "reconnecting",
|
|
600
|
+
error: error.message,
|
|
601
|
+
});
|
|
602
|
+
// Poll to detect when the SDK's auto-reconnect succeeds
|
|
603
|
+
this.pollReconnectRecovery(name, client);
|
|
604
|
+
} else {
|
|
605
|
+
logger?.error(`MCP Server ${name} transport error:`, error);
|
|
606
|
+
this.updateServerStatus(name, {
|
|
607
|
+
status: "error",
|
|
608
|
+
error: error.message,
|
|
609
|
+
});
|
|
610
|
+
}
|
|
555
611
|
};
|
|
556
612
|
|
|
557
613
|
transport.onclose = () => {
|
|
@@ -631,6 +687,54 @@ export class McpManager {
|
|
|
631
687
|
this.reconnectTimers.set(name, timer);
|
|
632
688
|
}
|
|
633
689
|
|
|
690
|
+
/**
|
|
691
|
+
* Poll listTools() to detect when the SDK's auto-reconnect succeeds
|
|
692
|
+
* after a transient SSE disconnect. Restores status to "connected".
|
|
693
|
+
*/
|
|
694
|
+
private async pollReconnectRecovery(
|
|
695
|
+
name: string,
|
|
696
|
+
client: Client,
|
|
697
|
+
): Promise<void> {
|
|
698
|
+
const maxAttempts = 10;
|
|
699
|
+
const delay = 3000; // Match SDK's reconnection delay
|
|
700
|
+
for (let i = 0; i < maxAttempts; i++) {
|
|
701
|
+
await new Promise((r) => setTimeout(r, delay));
|
|
702
|
+
const serverStatus = this.servers.get(name);
|
|
703
|
+
if (serverStatus?.status !== "reconnecting") {
|
|
704
|
+
return; // Status changed by onclose or user action — stop polling
|
|
705
|
+
}
|
|
706
|
+
try {
|
|
707
|
+
const toolsResponse = await client.listTools();
|
|
708
|
+
const tools =
|
|
709
|
+
toolsResponse.tools?.map((tool) => ({
|
|
710
|
+
name: tool.name,
|
|
711
|
+
description: tool.description,
|
|
712
|
+
inputSchema: tool.inputSchema,
|
|
713
|
+
})) || [];
|
|
714
|
+
logger?.info(
|
|
715
|
+
`MCP Server ${name} auto-reconnected successfully (attempt ${i + 1})`,
|
|
716
|
+
);
|
|
717
|
+
this.updateServerStatus(name, {
|
|
718
|
+
status: "connected",
|
|
719
|
+
tools,
|
|
720
|
+
toolCount: tools.length,
|
|
721
|
+
lastConnected: Date.now(),
|
|
722
|
+
error: undefined,
|
|
723
|
+
});
|
|
724
|
+
this.reconnectAttempts.delete(name);
|
|
725
|
+
return;
|
|
726
|
+
} catch {
|
|
727
|
+
logger?.debug(
|
|
728
|
+
`MCP Server ${name} reconnect recovery check ${i + 1}/${maxAttempts} failed`,
|
|
729
|
+
);
|
|
730
|
+
}
|
|
731
|
+
}
|
|
732
|
+
// If we exhausted attempts, fall through to McpManager's own reconnect
|
|
733
|
+
logger?.warn(
|
|
734
|
+
`MCP Server ${name} SDK auto-reconnect did not recover after ${maxAttempts} attempts`,
|
|
735
|
+
);
|
|
736
|
+
}
|
|
737
|
+
|
|
634
738
|
private cancelReconnect(name: string): void {
|
|
635
739
|
const timer = this.reconnectTimers.get(name);
|
|
636
740
|
if (timer) {
|
|
@@ -846,7 +950,7 @@ export class McpManager {
|
|
|
846
950
|
this.resolverCtx,
|
|
847
951
|
);
|
|
848
952
|
|
|
849
|
-
// Update the stored config
|
|
953
|
+
// Update the stored config, preserving originalUrl
|
|
850
954
|
this.servers.set(name, {
|
|
851
955
|
...server,
|
|
852
956
|
config: resolvedConfig,
|
|
@@ -859,7 +963,9 @@ export class McpManager {
|
|
|
859
963
|
// Determine if reconnection is needed
|
|
860
964
|
const wasConnected = this.connections.has(name);
|
|
861
965
|
const wasDisconnected =
|
|
862
|
-
server.status === "disconnected" ||
|
|
966
|
+
server.status === "disconnected" ||
|
|
967
|
+
server.status === "error" ||
|
|
968
|
+
server.status === "reconnecting";
|
|
863
969
|
|
|
864
970
|
if (wasConnected) {
|
|
865
971
|
// Disconnect first, then reconnect with new resolved config
|