wave-agent-sdk 0.16.9 → 0.16.12
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/agent.d.ts +5 -0
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +18 -0
- package/dist/constants/toolLimits.d.ts +2 -0
- package/dist/constants/toolLimits.d.ts.map +1 -1
- package/dist/constants/toolLimits.js +2 -0
- package/dist/managers/aiManager.d.ts +5 -0
- package/dist/managers/aiManager.d.ts.map +1 -1
- package/dist/managers/aiManager.js +21 -0
- package/dist/managers/hookManager.d.ts +6 -3
- package/dist/managers/hookManager.d.ts.map +1 -1
- package/dist/managers/hookManager.js +36 -13
- package/dist/managers/mcpManager.d.ts +4 -28
- package/dist/managers/mcpManager.d.ts.map +1 -1
- package/dist/managers/mcpManager.js +10 -127
- package/dist/services/authService.d.ts +33 -1
- package/dist/services/authService.d.ts.map +1 -1
- package/dist/services/authService.js +212 -11
- package/dist/services/configurationService.d.ts +1 -0
- package/dist/services/configurationService.d.ts.map +1 -1
- package/dist/services/configurationService.js +48 -6
- package/dist/services/hook.d.ts +4 -0
- package/dist/services/hook.d.ts.map +1 -1
- package/dist/services/hook.js +10 -0
- package/dist/services/initializationService.d.ts.map +1 -1
- package/dist/services/initializationService.js +11 -0
- package/dist/services/interactionService.d.ts.map +1 -1
- package/dist/services/interactionService.js +0 -12
- package/dist/services/remoteSettingsService.d.ts +21 -0
- package/dist/services/remoteSettingsService.d.ts.map +1 -0
- package/dist/services/remoteSettingsService.js +280 -0
- package/dist/tools/bashTool.d.ts.map +1 -1
- package/dist/tools/bashTool.js +58 -32
- package/dist/tools/types.d.ts +4 -0
- package/dist/tools/types.d.ts.map +1 -1
- package/dist/types/agent.d.ts +7 -0
- package/dist/types/agent.d.ts.map +1 -1
- package/dist/types/auth.d.ts +12 -0
- package/dist/types/auth.d.ts.map +1 -1
- package/dist/types/configuration.d.ts +20 -0
- package/dist/types/configuration.d.ts.map +1 -1
- package/dist/types/hooks.d.ts +5 -1
- package/dist/types/hooks.d.ts.map +1 -1
- package/dist/types/hooks.js +1 -0
- package/dist/types/mcp.d.ts +1 -1
- package/dist/types/mcp.d.ts.map +1 -1
- package/dist/utils/containerSetup.d.ts.map +1 -1
- package/dist/utils/containerSetup.js +9 -8
- package/dist/utils/gitUtils.d.ts +18 -1
- package/dist/utils/gitUtils.d.ts.map +1 -1
- package/dist/utils/gitUtils.js +120 -49
- package/dist/utils/mcpUtils.d.ts.map +1 -1
- package/dist/utils/mcpUtils.js +6 -1
- package/dist/utils/openaiClient.d.ts.map +1 -1
- package/dist/utils/openaiClient.js +4 -2
- package/dist/utils/toolResultStorage.d.ts +46 -0
- package/dist/utils/toolResultStorage.d.ts.map +1 -0
- package/dist/utils/toolResultStorage.js +90 -0
- package/dist/utils/worktreeUtils.d.ts.map +1 -1
- package/dist/utils/worktreeUtils.js +58 -0
- package/package.json +3 -3
- package/src/agent.ts +20 -0
- package/src/constants/toolLimits.ts +3 -0
- package/src/managers/aiManager.ts +37 -0
- package/src/managers/hookManager.ts +42 -17
- package/src/managers/mcpManager.ts +10 -178
- package/src/services/authService.ts +243 -16
- package/src/services/configurationService.ts +58 -6
- package/src/services/hook.ts +15 -0
- package/src/services/initializationService.ts +13 -0
- package/src/services/interactionService.ts +0 -18
- package/src/services/remoteSettingsService.ts +315 -0
- package/src/tools/bashTool.ts +70 -38
- package/src/tools/types.ts +4 -0
- package/src/types/agent.ts +7 -0
- package/src/types/auth.ts +10 -0
- package/src/types/configuration.ts +23 -0
- package/src/types/hooks.ts +7 -1
- package/src/types/mcp.ts +1 -1
- package/src/utils/containerSetup.ts +8 -8
- package/src/utils/gitUtils.ts +123 -48
- package/src/utils/mcpUtils.ts +12 -1
- package/src/utils/openaiClient.ts +5 -2
- package/src/utils/toolResultStorage.ts +117 -0
- package/src/utils/worktreeUtils.ts +63 -0
package/dist/agent.d.ts
CHANGED
|
@@ -65,6 +65,11 @@ export declare class Agent {
|
|
|
65
65
|
get latestTotalTokens(): number;
|
|
66
66
|
/** Get working directory */
|
|
67
67
|
get workingDirectory(): string;
|
|
68
|
+
/**
|
|
69
|
+
* Set the working directory
|
|
70
|
+
* @param newCwd - The new working directory
|
|
71
|
+
*/
|
|
72
|
+
setWorkdir(newCwd: string): void;
|
|
68
73
|
/** Get project memory content */
|
|
69
74
|
get projectMemory(): string;
|
|
70
75
|
/** Get user memory content */
|
package/dist/agent.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AAYA,OAAO,EAAgB,KAAK,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAO9E,OAAO,EACL,YAAY,EACZ,kBAAkB,EAElB,YAAY,EACb,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EACV,OAAO,EAEP,eAAe,EACf,aAAa,EACb,WAAW,EACX,KAAK,EACL,cAAc,EACd,cAAc,EACf,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
|
package/dist/agent.js
CHANGED
|
@@ -9,6 +9,7 @@ import { ConfigurationService } from "./services/configurationService.js";
|
|
|
9
9
|
import { setupAgentContainer } from "./utils/containerSetup.js";
|
|
10
10
|
import { initializeTelemetry, shutdownTelemetry, } from "./telemetry/instrumentation.js";
|
|
11
11
|
import { logOTelEvent } from "./telemetry/events.js";
|
|
12
|
+
import { remoteSettingsService } from "./services/remoteSettingsService.js";
|
|
12
13
|
export class Agent {
|
|
13
14
|
// Dynamic configuration getter methods
|
|
14
15
|
getGatewayConfig() {
|
|
@@ -120,6 +121,12 @@ export class Agent {
|
|
|
120
121
|
this.pendingNotificationPromises.push(pendingPromise);
|
|
121
122
|
}
|
|
122
123
|
};
|
|
124
|
+
// Wire up CWD change callback from AIManager to sync Agent's workdir
|
|
125
|
+
this.aiManager.setOnCwdChange((newCwd) => {
|
|
126
|
+
this.workdir = newCwd;
|
|
127
|
+
this.container.register("Workdir", newCwd);
|
|
128
|
+
this.options.callbacks?.onWorkdirChange?.(newCwd);
|
|
129
|
+
});
|
|
123
130
|
// Wire up message queue to process when agent becomes idle
|
|
124
131
|
this.messageQueue.onMessageEnqueued = () => {
|
|
125
132
|
// If the AI is NOT loading and command is not running, trigger dequeue
|
|
@@ -172,6 +179,15 @@ export class Agent {
|
|
|
172
179
|
get workingDirectory() {
|
|
173
180
|
return this.workdir;
|
|
174
181
|
}
|
|
182
|
+
/**
|
|
183
|
+
* Set the working directory
|
|
184
|
+
* @param newCwd - The new working directory
|
|
185
|
+
*/
|
|
186
|
+
setWorkdir(newCwd) {
|
|
187
|
+
this.workdir = newCwd;
|
|
188
|
+
this.container.register("Workdir", newCwd);
|
|
189
|
+
this.options.callbacks?.onWorkdirChange?.(newCwd);
|
|
190
|
+
}
|
|
175
191
|
/** Get project memory content */
|
|
176
192
|
get projectMemory() {
|
|
177
193
|
const memoryService = this.container.get("MemoryService");
|
|
@@ -524,6 +540,8 @@ export class Agent {
|
|
|
524
540
|
catch (error) {
|
|
525
541
|
this.logger?.error("Error shutting down live configuration reload:", error);
|
|
526
542
|
}
|
|
543
|
+
// Cleanup remote settings polling
|
|
544
|
+
remoteSettingsService.shutdown();
|
|
527
545
|
// Cleanup memory store
|
|
528
546
|
}
|
|
529
547
|
/**
|
|
@@ -3,6 +3,8 @@
|
|
|
3
3
|
*/
|
|
4
4
|
/** System-wide default max result size in characters. */
|
|
5
5
|
export declare const DEFAULT_MAX_RESULT_SIZE_CHARS = 50000;
|
|
6
|
+
/** Per-command cap for bash tool output before persistence. */
|
|
7
|
+
export declare const BASH_MAX_OUTPUT_CHARS = 30000;
|
|
6
8
|
/** Per-command cap for skill bash substitution (inline/block). */
|
|
7
9
|
export declare const SKILL_BASH_MAX_OUTPUT_CHARS = 30000;
|
|
8
10
|
/** Preview size in characters when output is persisted to disk. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toolLimits.d.ts","sourceRoot":"","sources":["../../src/constants/toolLimits.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,yDAAyD;AACzD,eAAO,MAAM,6BAA6B,QAAS,CAAC;AAEpD,kEAAkE;AAClE,eAAO,MAAM,2BAA2B,QAAS,CAAC;AAElD,mEAAmE;AACnE,eAAO,MAAM,kBAAkB,OAAQ,CAAC"}
|
|
1
|
+
{"version":3,"file":"toolLimits.d.ts","sourceRoot":"","sources":["../../src/constants/toolLimits.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,yDAAyD;AACzD,eAAO,MAAM,6BAA6B,QAAS,CAAC;AAEpD,+DAA+D;AAC/D,eAAO,MAAM,qBAAqB,QAAS,CAAC;AAE5C,kEAAkE;AAClE,eAAO,MAAM,2BAA2B,QAAS,CAAC;AAElD,mEAAmE;AACnE,eAAO,MAAM,kBAAkB,OAAQ,CAAC"}
|
|
@@ -3,6 +3,8 @@
|
|
|
3
3
|
*/
|
|
4
4
|
/** System-wide default max result size in characters. */
|
|
5
5
|
export const DEFAULT_MAX_RESULT_SIZE_CHARS = 50000;
|
|
6
|
+
/** Per-command cap for bash tool output before persistence. */
|
|
7
|
+
export const BASH_MAX_OUTPUT_CHARS = 30000;
|
|
6
8
|
/** Per-command cap for skill bash substitution (inline/block). */
|
|
7
9
|
export const SKILL_BASH_MAX_OUTPUT_CHARS = 30000;
|
|
8
10
|
/** Preview size in characters when output is persisted to disk. */
|
|
@@ -3,6 +3,7 @@ import { Container } from "../utils/container.js";
|
|
|
3
3
|
export interface AIManagerCallbacks {
|
|
4
4
|
onCompactionStateChange?: (isCompacting: boolean) => void;
|
|
5
5
|
onUsageAdded?: (usage: Usage) => void;
|
|
6
|
+
onCwdChange?: (newCwd: string) => void;
|
|
6
7
|
}
|
|
7
8
|
export interface AIManagerOptions {
|
|
8
9
|
callbacks?: AIManagerCallbacks;
|
|
@@ -26,6 +27,8 @@ export declare class AIManager {
|
|
|
26
27
|
private subagentType?;
|
|
27
28
|
private stream;
|
|
28
29
|
private modelOverride?;
|
|
30
|
+
private _onCwdChange?;
|
|
31
|
+
private originalWorkdir;
|
|
29
32
|
private consecutiveCompactionFailures;
|
|
30
33
|
private readonly maxTurns?;
|
|
31
34
|
constructor(container: Container, options: AIManagerOptions);
|
|
@@ -44,11 +47,13 @@ export declare class AIManager {
|
|
|
44
47
|
getLanguage(): string | undefined;
|
|
45
48
|
getAutoMemoryEnabled(): boolean;
|
|
46
49
|
getWorkdir(): string;
|
|
50
|
+
getOriginalWorkdir(): string;
|
|
47
51
|
/**
|
|
48
52
|
* Update the working directory mid-session (e.g., when entering/exiting a worktree).
|
|
49
53
|
* Also updates process.chdir() so bash commands use the new directory.
|
|
50
54
|
*/
|
|
51
55
|
setWorkdir(newWorkdir: string): void;
|
|
56
|
+
setOnCwdChange(callback: (newCwd: string) => void): void;
|
|
52
57
|
private isCompacting;
|
|
53
58
|
private callbacks;
|
|
54
59
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aiManager.d.ts","sourceRoot":"","sources":["../../src/managers/aiManager.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACV,aAAa,EACb,WAAW,EACX,KAAK,EAGN,MAAM,mBAAmB,CAAC;AAY3B,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAclD,MAAM,WAAW,kBAAkB;IACjC,uBAAuB,CAAC,EAAE,CAAC,YAAY,EAAE,OAAO,KAAK,IAAI,CAAC;IAC1D,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"aiManager.d.ts","sourceRoot":"","sources":["../../src/managers/aiManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -23,6 +23,8 @@ export class AIManager {
|
|
|
23
23
|
this.stream = options.stream ?? true; // Default to true if not specified
|
|
24
24
|
this.callbacks = options.callbacks ?? {};
|
|
25
25
|
this.modelOverride = options.modelOverride;
|
|
26
|
+
this._onCwdChange = options.callbacks?.onCwdChange; // Initialize onCwdChange
|
|
27
|
+
this.originalWorkdir = options.workdir;
|
|
26
28
|
this.maxTurns = options.maxTurns;
|
|
27
29
|
}
|
|
28
30
|
get toolManager() {
|
|
@@ -84,6 +86,9 @@ export class AIManager {
|
|
|
84
86
|
getWorkdir() {
|
|
85
87
|
return this.container.get("Workdir") ?? process.cwd();
|
|
86
88
|
}
|
|
89
|
+
getOriginalWorkdir() {
|
|
90
|
+
return this.originalWorkdir;
|
|
91
|
+
}
|
|
87
92
|
/**
|
|
88
93
|
* Update the working directory mid-session (e.g., when entering/exiting a worktree).
|
|
89
94
|
* Also updates process.chdir() so bash commands use the new directory.
|
|
@@ -92,6 +97,9 @@ export class AIManager {
|
|
|
92
97
|
this.container.register("Workdir", newWorkdir);
|
|
93
98
|
process.chdir(newWorkdir);
|
|
94
99
|
}
|
|
100
|
+
setOnCwdChange(callback) {
|
|
101
|
+
this._onCwdChange = callback;
|
|
102
|
+
}
|
|
95
103
|
/**
|
|
96
104
|
* Get filtered tool configuration based on tools list
|
|
97
105
|
*/
|
|
@@ -144,6 +152,7 @@ export class AIManager {
|
|
|
144
152
|
if (toolPlugin?.formatCompactParams) {
|
|
145
153
|
const context = {
|
|
146
154
|
workdir: this.getWorkdir(),
|
|
155
|
+
originalWorkdir: this.originalWorkdir,
|
|
147
156
|
taskManager: this.taskManager,
|
|
148
157
|
};
|
|
149
158
|
return toolPlugin.formatCompactParams(toolArgs, context);
|
|
@@ -732,6 +741,7 @@ export class AIManager {
|
|
|
732
741
|
abortSignal: toolAbortController.signal,
|
|
733
742
|
backgroundTaskManager: this.backgroundTaskManager,
|
|
734
743
|
workdir: this.getWorkdir(),
|
|
744
|
+
originalWorkdir: this.originalWorkdir,
|
|
735
745
|
messageId: this.messageManager.getMessages().slice(-1)[0]?.id,
|
|
736
746
|
sessionId: this.messageManager.getSessionId(),
|
|
737
747
|
toolCallId: toolId,
|
|
@@ -750,6 +760,17 @@ export class AIManager {
|
|
|
750
760
|
stage: "running", // Keep it in running stage while updating result
|
|
751
761
|
});
|
|
752
762
|
},
|
|
763
|
+
onCwdChange: async (newCwd) => {
|
|
764
|
+
const oldCwd = this.getWorkdir();
|
|
765
|
+
this.container.register("Workdir", newCwd);
|
|
766
|
+
this._onCwdChange?.(newCwd);
|
|
767
|
+
if (this.hookManager) {
|
|
768
|
+
const sessionId = this.messageManager.getSessionId();
|
|
769
|
+
const transcriptPath = this.messageManager.getTranscriptPath();
|
|
770
|
+
const env = Object.fromEntries(Object.entries(process.env).filter((e) => e[1] !== undefined));
|
|
771
|
+
await this.hookManager.executeCwdChangedHooks(oldCwd, newCwd, sessionId, transcriptPath, env);
|
|
772
|
+
}
|
|
773
|
+
},
|
|
753
774
|
};
|
|
754
775
|
// Execute tool
|
|
755
776
|
const toolResult = await this.toolManager.execute(functionToolCall.function?.name || "", toolArgs, context);
|
|
@@ -16,10 +16,9 @@ export declare class HookManager {
|
|
|
16
16
|
private readonly workdir;
|
|
17
17
|
constructor(container: Container, workdir: string, matcher?: HookMatcher);
|
|
18
18
|
/**
|
|
19
|
-
* Load
|
|
20
|
-
* Project settings take precedence over user settings
|
|
19
|
+
* Load hook configuration from programmatic source (AgentOptions.hooks)
|
|
21
20
|
*/
|
|
22
|
-
loadConfiguration(
|
|
21
|
+
loadConfiguration(hooks?: PartialHookConfiguration): void;
|
|
23
22
|
/**
|
|
24
23
|
* Load hooks configuration from a pre-loaded WaveConfiguration
|
|
25
24
|
* Configuration loading is now handled by ConfigurationService
|
|
@@ -98,6 +97,10 @@ export declare class HookManager {
|
|
|
98
97
|
totalCommands: number;
|
|
99
98
|
eventBreakdown: Record<HookEvent, number>;
|
|
100
99
|
};
|
|
100
|
+
/**
|
|
101
|
+
* Execute CwdChanged hooks.
|
|
102
|
+
*/
|
|
103
|
+
executeCwdChangedHooks(oldCwd: string, newCwd: string, sessionId: string, transcriptPath: string, env: Record<string, string>): Promise<HookExecutionResult[]>;
|
|
101
104
|
/**
|
|
102
105
|
* Register hooks provided by a plugin
|
|
103
106
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hookManager.d.ts","sourceRoot":"","sources":["../../src/managers/hookManager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,KAAK,SAAS,EAEd,KAAK,oBAAoB,EACzB,KAAK,4BAA4B,EACjC,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EACzB,KAAK,gBAAgB,EAItB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EACV,iBAAiB,EACjB,wBAAwB,EACzB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAGtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAIlD,qBAAa,WAAW;IAMpB,OAAO,CAAC,SAAS;IALnB,OAAO,CAAC,aAAa,CAAuC;IAC5D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAc;IACtC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAGvB,SAAS,EAAE,SAAS,EAC5B,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,WAA+B;IAM1C
|
|
1
|
+
{"version":3,"file":"hookManager.d.ts","sourceRoot":"","sources":["../../src/managers/hookManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,18 +16,12 @@ export class HookManager {
|
|
|
16
16
|
this.matcher = matcher;
|
|
17
17
|
}
|
|
18
18
|
/**
|
|
19
|
-
* Load
|
|
20
|
-
* Project settings take precedence over user settings
|
|
19
|
+
* Load hook configuration from programmatic source (AgentOptions.hooks)
|
|
21
20
|
*/
|
|
22
|
-
loadConfiguration(
|
|
21
|
+
loadConfiguration(hooks) {
|
|
23
22
|
const merged = {};
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
this.mergeHooksConfiguration(merged, userHooks);
|
|
27
|
-
}
|
|
28
|
-
// Override with project hooks (project settings take precedence)
|
|
29
|
-
if (projectHooks) {
|
|
30
|
-
this.mergeHooksConfiguration(merged, projectHooks);
|
|
23
|
+
if (hooks) {
|
|
24
|
+
this.mergeHooksConfiguration(merged, hooks);
|
|
31
25
|
}
|
|
32
26
|
// Validate merged configuration
|
|
33
27
|
const validation = this.validatePartialConfiguration(merged);
|
|
@@ -462,9 +456,13 @@ export class HookManager {
|
|
|
462
456
|
mergeHooksConfiguration(target, source) {
|
|
463
457
|
for (const [event, configs] of Object.entries(source)) {
|
|
464
458
|
if (isValidHookEvent(event)) {
|
|
465
|
-
//
|
|
466
|
-
|
|
467
|
-
|
|
459
|
+
// Concatenate hook configs so multiple sources (programmatic, file-based, plugins) coexist
|
|
460
|
+
if (!target[event]) {
|
|
461
|
+
target[event] = [...configs];
|
|
462
|
+
}
|
|
463
|
+
else {
|
|
464
|
+
target[event] = [...target[event], ...configs];
|
|
465
|
+
}
|
|
468
466
|
}
|
|
469
467
|
}
|
|
470
468
|
}
|
|
@@ -478,6 +476,7 @@ export class HookManager {
|
|
|
478
476
|
event === "SubagentStop" ||
|
|
479
477
|
event === "WorktreeCreate" ||
|
|
480
478
|
event === "WorktreeRemove" ||
|
|
479
|
+
event === "CwdChanged" ||
|
|
481
480
|
event === "SessionStart" ||
|
|
482
481
|
event === "SessionEnd") {
|
|
483
482
|
return true;
|
|
@@ -554,6 +553,7 @@ export class HookManager {
|
|
|
554
553
|
PermissionRequest: 0,
|
|
555
554
|
WorktreeCreate: 0,
|
|
556
555
|
WorktreeRemove: 0,
|
|
556
|
+
CwdChanged: 0,
|
|
557
557
|
SessionStart: 0,
|
|
558
558
|
SessionEnd: 0,
|
|
559
559
|
},
|
|
@@ -568,6 +568,7 @@ export class HookManager {
|
|
|
568
568
|
PermissionRequest: 0,
|
|
569
569
|
WorktreeCreate: 0,
|
|
570
570
|
WorktreeRemove: 0,
|
|
571
|
+
CwdChanged: 0,
|
|
571
572
|
SessionStart: 0,
|
|
572
573
|
SessionEnd: 0,
|
|
573
574
|
};
|
|
@@ -587,6 +588,28 @@ export class HookManager {
|
|
|
587
588
|
eventBreakdown,
|
|
588
589
|
};
|
|
589
590
|
}
|
|
591
|
+
/**
|
|
592
|
+
* Execute CwdChanged hooks.
|
|
593
|
+
*/
|
|
594
|
+
async executeCwdChangedHooks(oldCwd, newCwd, sessionId, transcriptPath, env) {
|
|
595
|
+
const context = {
|
|
596
|
+
event: "CwdChanged",
|
|
597
|
+
projectDir: this.workdir,
|
|
598
|
+
timestamp: new Date(),
|
|
599
|
+
sessionId,
|
|
600
|
+
transcriptPath,
|
|
601
|
+
cwd: newCwd,
|
|
602
|
+
oldCwd,
|
|
603
|
+
newCwd,
|
|
604
|
+
env,
|
|
605
|
+
};
|
|
606
|
+
const results = await this.executeHooks("CwdChanged", context);
|
|
607
|
+
if (results.length > 0) {
|
|
608
|
+
// For CwdChanged hooks, we don't block, just log errors
|
|
609
|
+
this.processHookResults("CwdChanged", results);
|
|
610
|
+
}
|
|
611
|
+
return results;
|
|
612
|
+
}
|
|
590
613
|
/**
|
|
591
614
|
* Register hooks provided by a plugin
|
|
592
615
|
*/
|
|
@@ -10,32 +10,14 @@ export interface McpManagerOptions {
|
|
|
10
10
|
logger?: Logger;
|
|
11
11
|
/** Pre-configured MCP servers passed from constructor options */
|
|
12
12
|
mcpServers?: Record<string, McpServerConfig>;
|
|
13
|
-
/** Wave server URL for resolving ${WAVE_SERVER_URL} templates in MCP configs */
|
|
14
|
-
serverUrl?: string;
|
|
15
|
-
/** SSO token for resolving ${WAVE_SSO_TOKEN} templates in MCP configs */
|
|
16
|
-
ssoToken?: string;
|
|
17
13
|
}
|
|
18
14
|
export declare function expandEnvVars(value: string): string;
|
|
19
15
|
/**
|
|
20
|
-
*
|
|
16
|
+
* Walk an MCP config and resolve environment variables in all string fields.
|
|
17
|
+
* Only expands ${VAR} from process.env (skipping WAVE_PLUGIN_ROOT which is
|
|
18
|
+
* handled at spawn time).
|
|
21
19
|
*/
|
|
22
|
-
export
|
|
23
|
-
serverUrl?: string;
|
|
24
|
-
ssoToken?: string;
|
|
25
|
-
}
|
|
26
|
-
/**
|
|
27
|
-
* Walk a single McpServerConfig and replace Wave template variables.
|
|
28
|
-
* Only replaces ${WAVE_SERVER_URL} and ${WAVE_SSO_TOKEN} — does not touch
|
|
29
|
-
* arbitrary env vars (that is what expandEnvVars handles).
|
|
30
|
-
*/
|
|
31
|
-
export declare function resolveMcpTemplates(config: McpServerConfig, ctx: McpResolverContext): McpServerConfig;
|
|
32
|
-
/**
|
|
33
|
-
* Walk an MCP config and resolve variables in all string fields.
|
|
34
|
-
* Applies two steps in order:
|
|
35
|
-
* 1. expandEnvVars — resolves ${VAR} from process.env
|
|
36
|
-
* 2. resolveMcpTemplates — resolves ${WAVE_SERVER_URL}, ${WAVE_SSO_TOKEN} from context
|
|
37
|
-
*/
|
|
38
|
-
export declare function resolveMcpConfig(config: McpConfig, ctx?: McpResolverContext): McpConfig;
|
|
20
|
+
export declare function resolveMcpConfig(config: McpConfig): McpConfig;
|
|
39
21
|
export declare class McpManager {
|
|
40
22
|
private container;
|
|
41
23
|
private config;
|
|
@@ -45,7 +27,6 @@ export declare class McpManager {
|
|
|
45
27
|
private workdir;
|
|
46
28
|
private callbacks;
|
|
47
29
|
private mcpServers;
|
|
48
|
-
private resolverCtx;
|
|
49
30
|
private reconnectTimers;
|
|
50
31
|
private reconnectAttempts;
|
|
51
32
|
constructor(container: Container, options?: McpManagerOptions);
|
|
@@ -87,11 +68,6 @@ export declare class McpManager {
|
|
|
87
68
|
}>;
|
|
88
69
|
private executeToolOnConnection;
|
|
89
70
|
cleanup(): Promise<void>;
|
|
90
|
-
/**
|
|
91
|
-
* Update credentials and reconnect MCP servers that use template variables.
|
|
92
|
-
* Called after SSO login to refresh ${WAVE_SSO_TOKEN} and ${WAVE_SERVER_URL}.
|
|
93
|
-
*/
|
|
94
|
-
refreshCredentials(serverUrl?: string, ssoToken?: string): Promise<void>;
|
|
95
71
|
/**
|
|
96
72
|
* Get all currently available MCP tools as plugins
|
|
97
73
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcpManager.d.ts","sourceRoot":"","sources":["../../src/managers/mcpManager.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AAEjE,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC7E,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,KAAK,EACV,MAAM,EACN,eAAe,EACf,SAAS,EACT,OAAO,EACP,eAAe,EAChB,MAAM,mBAAmB,CAAC;AAQ3B,MAAM,WAAW,mBAAmB;IAClC,kBAAkB,CAAC,EAAE,CAAC,OAAO,EAAE,eAAe,EAAE,KAAK,IAAI,CAAC;CAC3D;AAID,MAAM,WAAW,iBAAiB;IAChC,SAAS,CAAC,EAAE,mBAAmB,CAAC;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iEAAiE;IACjE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"mcpManager.d.ts","sourceRoot":"","sources":["../../src/managers/mcpManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,16 +10,12 @@ import { logger } from "../utils/globalLogger.js";
|
|
|
10
10
|
* Expand environment variables in a string value.
|
|
11
11
|
* Supports ${VAR} and ${VAR:-default} patterns.
|
|
12
12
|
*/
|
|
13
|
-
const WAVE_TEMPLATE_VARS = [
|
|
14
|
-
"WAVE_SERVER_URL",
|
|
15
|
-
"WAVE_SSO_TOKEN",
|
|
16
|
-
"WAVE_PLUGIN_ROOT",
|
|
17
|
-
];
|
|
13
|
+
const WAVE_TEMPLATE_VARS = ["WAVE_PLUGIN_ROOT"];
|
|
18
14
|
export function expandEnvVars(value) {
|
|
19
15
|
return value.replace(/\$\{([^}]+)\}/g, (_match, expr) => {
|
|
20
16
|
const [varName, ...rest] = expr.split(":-");
|
|
21
17
|
const defaultValue = rest.join(":-");
|
|
22
|
-
// Skip Wave-specific template variables — they are handled
|
|
18
|
+
// Skip Wave-specific template variables — they are handled at spawn time
|
|
23
19
|
if (WAVE_TEMPLATE_VARS.includes(varName)) {
|
|
24
20
|
return _match; // return original ${...} string untouched
|
|
25
21
|
}
|
|
@@ -27,58 +23,14 @@ export function expandEnvVars(value) {
|
|
|
27
23
|
});
|
|
28
24
|
}
|
|
29
25
|
/**
|
|
30
|
-
* Walk
|
|
31
|
-
* Only
|
|
32
|
-
*
|
|
26
|
+
* Walk an MCP config and resolve environment variables in all string fields.
|
|
27
|
+
* Only expands ${VAR} from process.env (skipping WAVE_PLUGIN_ROOT which is
|
|
28
|
+
* handled at spawn time).
|
|
33
29
|
*/
|
|
34
|
-
export function
|
|
35
|
-
const resolved = { ...config };
|
|
36
|
-
const replace = (value) => {
|
|
37
|
-
let result = value;
|
|
38
|
-
if (ctx.serverUrl !== undefined) {
|
|
39
|
-
result = result.replace(/\$\{WAVE_SERVER_URL\}/g, ctx.serverUrl);
|
|
40
|
-
}
|
|
41
|
-
if (ctx.ssoToken !== undefined) {
|
|
42
|
-
result = result.replace(/\$\{WAVE_SSO_TOKEN\}/g, ctx.ssoToken);
|
|
43
|
-
}
|
|
44
|
-
return result;
|
|
45
|
-
};
|
|
46
|
-
if (resolved.command) {
|
|
47
|
-
resolved.command = replace(resolved.command);
|
|
48
|
-
}
|
|
49
|
-
if (resolved.args) {
|
|
50
|
-
resolved.args = resolved.args.map(replace);
|
|
51
|
-
}
|
|
52
|
-
if (resolved.env) {
|
|
53
|
-
const resolvedEnv = {};
|
|
54
|
-
for (const [key, val] of Object.entries(resolved.env)) {
|
|
55
|
-
resolvedEnv[key] = replace(val);
|
|
56
|
-
}
|
|
57
|
-
resolved.env = resolvedEnv;
|
|
58
|
-
}
|
|
59
|
-
if (resolved.url) {
|
|
60
|
-
resolved.url = replace(resolved.url);
|
|
61
|
-
}
|
|
62
|
-
if (resolved.headers) {
|
|
63
|
-
const resolvedHeaders = {};
|
|
64
|
-
for (const [key, val] of Object.entries(resolved.headers)) {
|
|
65
|
-
resolvedHeaders[key] = replace(val);
|
|
66
|
-
}
|
|
67
|
-
resolved.headers = resolvedHeaders;
|
|
68
|
-
}
|
|
69
|
-
return resolved;
|
|
70
|
-
}
|
|
71
|
-
/**
|
|
72
|
-
* Walk an MCP config and resolve variables in all string fields.
|
|
73
|
-
* Applies two steps in order:
|
|
74
|
-
* 1. expandEnvVars — resolves ${VAR} from process.env
|
|
75
|
-
* 2. resolveMcpTemplates — resolves ${WAVE_SERVER_URL}, ${WAVE_SSO_TOKEN} from context
|
|
76
|
-
*/
|
|
77
|
-
export function resolveMcpConfig(config, ctx) {
|
|
30
|
+
export function resolveMcpConfig(config) {
|
|
78
31
|
const resolved = { mcpServers: {} };
|
|
79
32
|
for (const [name, serverConfig] of Object.entries(config.mcpServers)) {
|
|
80
|
-
|
|
81
|
-
let resolvedServer = { ...serverConfig };
|
|
33
|
+
const resolvedServer = { ...serverConfig };
|
|
82
34
|
if (resolvedServer.command) {
|
|
83
35
|
resolvedServer.command = expandEnvVars(resolvedServer.command);
|
|
84
36
|
}
|
|
@@ -102,10 +54,6 @@ export function resolveMcpConfig(config, ctx) {
|
|
|
102
54
|
}
|
|
103
55
|
resolvedServer.headers = resolvedHeaders;
|
|
104
56
|
}
|
|
105
|
-
// Step 2: resolve Wave template variables from context
|
|
106
|
-
if (ctx) {
|
|
107
|
-
resolvedServer = resolveMcpTemplates(resolvedServer, ctx);
|
|
108
|
-
}
|
|
109
57
|
resolved.mcpServers[name] = resolvedServer;
|
|
110
58
|
}
|
|
111
59
|
return resolved;
|
|
@@ -122,10 +70,6 @@ export class McpManager {
|
|
|
122
70
|
this.reconnectAttempts = new Map();
|
|
123
71
|
this.callbacks = options.callbacks || {};
|
|
124
72
|
this.mcpServers = options.mcpServers;
|
|
125
|
-
this.resolverCtx = {
|
|
126
|
-
serverUrl: options.serverUrl,
|
|
127
|
-
ssoToken: options.ssoToken,
|
|
128
|
-
};
|
|
129
73
|
}
|
|
130
74
|
/**
|
|
131
75
|
* Initialize MCP manager with working directory and optionally auto-connect
|
|
@@ -181,7 +125,7 @@ export class McpManager {
|
|
|
181
125
|
try {
|
|
182
126
|
const configContent = await fs.readFile(this.configPath, "utf-8");
|
|
183
127
|
const rawConfig = JSON.parse(configContent);
|
|
184
|
-
const workspaceConfig = resolveMcpConfig(rawConfig
|
|
128
|
+
const workspaceConfig = resolveMcpConfig(rawConfig);
|
|
185
129
|
// Extract original (pre-resolution) URLs for safe display
|
|
186
130
|
const originalUrls = {};
|
|
187
131
|
for (const [name, serverConfig] of Object.entries(rawConfig.mcpServers)) {
|
|
@@ -266,8 +210,8 @@ export class McpManager {
|
|
|
266
210
|
}
|
|
267
211
|
// Capture original URL before any resolution for safe display
|
|
268
212
|
const originalUrl = config.url;
|
|
269
|
-
//
|
|
270
|
-
|
|
213
|
+
// Expand env vars from process.env (e.g. ${TAVILY_API_KEY})
|
|
214
|
+
const resolvedConfig = { ...config };
|
|
271
215
|
if (resolvedConfig.command) {
|
|
272
216
|
resolvedConfig.command = expandEnvVars(resolvedConfig.command);
|
|
273
217
|
}
|
|
@@ -291,8 +235,6 @@ export class McpManager {
|
|
|
291
235
|
}
|
|
292
236
|
resolvedConfig.headers = resolvedHeaders;
|
|
293
237
|
}
|
|
294
|
-
// Step 2: resolve Wave template variables (e.g. ${WAVE_SERVER_URL}, ${WAVE_SSO_TOKEN})
|
|
295
|
-
resolvedConfig = resolveMcpTemplates(resolvedConfig, this.resolverCtx ?? { serverUrl: undefined, ssoToken: undefined });
|
|
296
238
|
const newServer = {
|
|
297
239
|
name,
|
|
298
240
|
config: resolvedConfig,
|
|
@@ -697,65 +639,6 @@ export class McpManager {
|
|
|
697
639
|
const disconnectPromises = Array.from(this.connections.keys()).map((name) => this.disconnectServer(name));
|
|
698
640
|
await Promise.all(disconnectPromises);
|
|
699
641
|
}
|
|
700
|
-
/**
|
|
701
|
-
* Update credentials and reconnect MCP servers that use template variables.
|
|
702
|
-
* Called after SSO login to refresh ${WAVE_SSO_TOKEN} and ${WAVE_SERVER_URL}.
|
|
703
|
-
*/
|
|
704
|
-
async refreshCredentials(serverUrl, ssoToken) {
|
|
705
|
-
// Update resolver context
|
|
706
|
-
this.resolverCtx = {
|
|
707
|
-
serverUrl: serverUrl ?? this.resolverCtx?.serverUrl,
|
|
708
|
-
ssoToken: ssoToken ?? this.resolverCtx?.ssoToken,
|
|
709
|
-
};
|
|
710
|
-
logger?.info(`MCP refreshCredentials: serverUrl=${serverUrl}, hasToken=${!!ssoToken}`);
|
|
711
|
-
// Collect servers that need reconnection
|
|
712
|
-
const serversToReconnect = [];
|
|
713
|
-
for (const [name, server] of this.servers) {
|
|
714
|
-
// Re-resolve config with new credentials
|
|
715
|
-
const originalConfig = server.config;
|
|
716
|
-
const resolvedConfig = resolveMcpTemplates(originalConfig, this.resolverCtx);
|
|
717
|
-
// Update the stored config, preserving originalUrl
|
|
718
|
-
this.servers.set(name, {
|
|
719
|
-
...server,
|
|
720
|
-
config: resolvedConfig,
|
|
721
|
-
});
|
|
722
|
-
if (this.config && this.config.mcpServers[name]) {
|
|
723
|
-
this.config.mcpServers[name] = resolvedConfig;
|
|
724
|
-
}
|
|
725
|
-
// Determine if reconnection is needed
|
|
726
|
-
const wasConnected = this.connections.has(name);
|
|
727
|
-
const wasDisconnected = server.status === "disconnected" ||
|
|
728
|
-
server.status === "error" ||
|
|
729
|
-
server.status === "reconnecting";
|
|
730
|
-
if (wasConnected) {
|
|
731
|
-
// Disconnect first, then reconnect with new resolved config
|
|
732
|
-
await this.disconnectServer(name);
|
|
733
|
-
serversToReconnect.push(name);
|
|
734
|
-
}
|
|
735
|
-
else if (wasDisconnected) {
|
|
736
|
-
// Was disconnected or errored — try to reconnect now that we have credentials
|
|
737
|
-
serversToReconnect.push(name);
|
|
738
|
-
}
|
|
739
|
-
}
|
|
740
|
-
// Reconnect servers
|
|
741
|
-
for (const name of serversToReconnect) {
|
|
742
|
-
logger?.debug(`Reconnecting MCP server after credential refresh: ${name}`);
|
|
743
|
-
this.connectServer(name)
|
|
744
|
-
.then((success) => {
|
|
745
|
-
if (success) {
|
|
746
|
-
logger?.info(`Successfully reconnected MCP server: ${name}`);
|
|
747
|
-
}
|
|
748
|
-
else {
|
|
749
|
-
logger?.warn(`Failed to reconnect MCP server: ${name}`);
|
|
750
|
-
}
|
|
751
|
-
})
|
|
752
|
-
.catch((error) => {
|
|
753
|
-
logger?.error(`Reconnection to MCP server ${name} failed:`, error);
|
|
754
|
-
});
|
|
755
|
-
}
|
|
756
|
-
// Trigger state change callback
|
|
757
|
-
this.callbacks.onMcpServersChange?.(this.getAllServers());
|
|
758
|
-
}
|
|
759
642
|
// ========== Tools Registry Methods ==========
|
|
760
643
|
/**
|
|
761
644
|
* Get all currently available MCP tools as plugins
|