@1mcp/agent 0.18.0 → 0.19.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/README.md +4 -0
- package/build/commands/mcp/add.d.ts +3 -0
- package/build/commands/mcp/add.d.ts.map +1 -1
- package/build/commands/mcp/add.js +24 -0
- package/build/commands/mcp/add.js.map +1 -1
- package/build/commands/mcp/index.d.ts.map +1 -1
- package/build/commands/mcp/index.js +24 -0
- package/build/commands/mcp/index.js.map +1 -1
- package/build/commands/mcp/list.js +12 -0
- package/build/commands/mcp/list.js.map +1 -1
- package/build/commands/mcp/update.d.ts +3 -0
- package/build/commands/mcp/update.d.ts.map +1 -1
- package/build/commands/mcp/update.js +21 -0
- package/build/commands/mcp/update.js.map +1 -1
- package/build/config/mcpConfigManager.d.ts +5 -0
- package/build/config/mcpConfigManager.d.ts.map +1 -1
- package/build/config/mcpConfigManager.js +56 -8
- package/build/config/mcpConfigManager.js.map +1 -1
- package/build/constants.d.ts +1 -1
- package/build/constants.js +1 -1
- package/build/core/types/transport.d.ts +27 -5
- package/build/core/types/transport.d.ts.map +1 -1
- package/build/core/types/transport.js +7 -2
- package/build/core/types/transport.js.map +1 -1
- package/build/transport/restartableStdioTransport.d.ts +84 -0
- package/build/transport/restartableStdioTransport.d.ts.map +1 -0
- package/build/transport/restartableStdioTransport.js +185 -0
- package/build/transport/restartableStdioTransport.js.map +1 -0
- package/build/transport/transportFactory.d.ts.map +1 -1
- package/build/transport/transportFactory.js +38 -2
- package/build/transport/transportFactory.js.map +1 -1
- package/build/utils/envProcessor.d.ts +45 -0
- package/build/utils/envProcessor.d.ts.map +1 -0
- package/build/utils/envProcessor.js +214 -0
- package/build/utils/envProcessor.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { StdioServerParameters } from '@modelcontextprotocol/sdk/client/stdio.js';
|
|
2
|
+
import { JSONRPCMessage } from '@modelcontextprotocol/sdk/types.js';
|
|
3
|
+
import { Transport } from '@modelcontextprotocol/sdk/shared/transport.js';
|
|
4
|
+
import { Stream } from 'node:stream';
|
|
5
|
+
/**
|
|
6
|
+
* Configuration for the restartable stdio transport
|
|
7
|
+
*/
|
|
8
|
+
export interface RestartableTransportConfig {
|
|
9
|
+
readonly restartOnExit: boolean;
|
|
10
|
+
readonly maxRestarts?: number;
|
|
11
|
+
readonly restartDelay?: number;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Wrapper around StdioClientTransport that provides automatic restart functionality
|
|
15
|
+
* Implements Transport interface and adds OAuth provider support
|
|
16
|
+
*/
|
|
17
|
+
export declare class RestartableStdioTransport implements Transport {
|
|
18
|
+
private readonly serverParams;
|
|
19
|
+
private readonly restartConfig;
|
|
20
|
+
private _currentTransport;
|
|
21
|
+
private _restartCount;
|
|
22
|
+
private _isStarting;
|
|
23
|
+
private _isClosing;
|
|
24
|
+
private _restartTimer;
|
|
25
|
+
timeout?: number;
|
|
26
|
+
tags?: string[];
|
|
27
|
+
oauthProvider?: any;
|
|
28
|
+
onclose?: () => void;
|
|
29
|
+
onerror?: (error: Error) => void;
|
|
30
|
+
onmessage?: (message: JSONRPCMessage) => void;
|
|
31
|
+
constructor(serverParams: StdioServerParameters, restartConfig: RestartableTransportConfig);
|
|
32
|
+
/**
|
|
33
|
+
* Creates a new underlying transport instance
|
|
34
|
+
*/
|
|
35
|
+
private createTransport;
|
|
36
|
+
/**
|
|
37
|
+
* Handles transport close events
|
|
38
|
+
*/
|
|
39
|
+
private handleTransportClose;
|
|
40
|
+
/**
|
|
41
|
+
* Handles transport error events
|
|
42
|
+
*/
|
|
43
|
+
private handleTransportError;
|
|
44
|
+
/**
|
|
45
|
+
* Handles transport message events
|
|
46
|
+
*/
|
|
47
|
+
private handleTransportMessage;
|
|
48
|
+
/**
|
|
49
|
+
* Attempts to restart the transport
|
|
50
|
+
*/
|
|
51
|
+
private attemptRestart;
|
|
52
|
+
/**
|
|
53
|
+
* Restarts the underlying transport
|
|
54
|
+
*/
|
|
55
|
+
private restartTransport;
|
|
56
|
+
/**
|
|
57
|
+
* Starts the transport
|
|
58
|
+
*/
|
|
59
|
+
start(): Promise<void>;
|
|
60
|
+
/**
|
|
61
|
+
* Gets the stderr stream from the current transport
|
|
62
|
+
*/
|
|
63
|
+
get stderr(): Stream | null;
|
|
64
|
+
/**
|
|
65
|
+
* Gets the process PID from the current transport
|
|
66
|
+
*/
|
|
67
|
+
get pid(): number | null;
|
|
68
|
+
/**
|
|
69
|
+
* Sends a message through the current transport
|
|
70
|
+
*/
|
|
71
|
+
send(message: JSONRPCMessage): Promise<void>;
|
|
72
|
+
/**
|
|
73
|
+
* Closes the transport and prevents restart
|
|
74
|
+
*/
|
|
75
|
+
close(): Promise<void>;
|
|
76
|
+
/**
|
|
77
|
+
* Gets restart statistics
|
|
78
|
+
*/
|
|
79
|
+
getRestartStats(): {
|
|
80
|
+
restartCount: number;
|
|
81
|
+
isRestarting: boolean;
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=restartableStdioTransport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"restartableStdioTransport.d.ts","sourceRoot":"","sources":["../../src/transport/restartableStdioTransport.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwB,qBAAqB,EAAE,MAAM,2CAA2C,CAAC;AACxG,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACpE,OAAO,EAAE,SAAS,EAAE,MAAM,+CAA+C,CAAC;AAC1E,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAGrC;;GAEG;AACH,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;IAChC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;CAChC;AAED;;;GAGG;AACH,qBAAa,yBAA0B,YAAW,SAAS;IAkBvD,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,aAAa;IAlBhC,OAAO,CAAC,iBAAiB,CAAqC;IAC9D,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,aAAa,CAA8C;IAG5D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,aAAa,CAAC,EAAE,GAAG,CAAC;IAGpB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,CAAC;gBAGlC,YAAY,EAAE,qBAAqB,EACnC,aAAa,EAAE,0BAA0B;IAK5D;;OAEG;IACH,OAAO,CAAC,eAAe;IAWvB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAgB5B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAK5B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAI9B;;OAEG;IACH,OAAO,CAAC,cAAc;IA6BtB;;OAEG;YACW,gBAAgB;IAqB9B;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAiB5B;;OAEG;IACH,IAAI,MAAM,IAAI,MAAM,GAAG,IAAI,CAE1B;IAED;;OAEG;IACH,IAAI,GAAG,IAAI,MAAM,GAAG,IAAI,CAEvB;IAED;;OAEG;IACG,IAAI,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAQlD;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAkB5B;;OAEG;IACH,eAAe,IAAI;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,OAAO,CAAA;KAAE;CAMnE"}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';
|
|
2
|
+
import logger from '../logger/logger.js';
|
|
3
|
+
/**
|
|
4
|
+
* Wrapper around StdioClientTransport that provides automatic restart functionality
|
|
5
|
+
* Implements Transport interface and adds OAuth provider support
|
|
6
|
+
*/
|
|
7
|
+
export class RestartableStdioTransport {
|
|
8
|
+
serverParams;
|
|
9
|
+
restartConfig;
|
|
10
|
+
_currentTransport = null;
|
|
11
|
+
_restartCount = 0;
|
|
12
|
+
_isStarting = false;
|
|
13
|
+
_isClosing = false;
|
|
14
|
+
_restartTimer = null;
|
|
15
|
+
// Extended properties for AuthProviderTransport compatibility
|
|
16
|
+
timeout;
|
|
17
|
+
tags;
|
|
18
|
+
oauthProvider;
|
|
19
|
+
// Event handlers
|
|
20
|
+
onclose;
|
|
21
|
+
onerror;
|
|
22
|
+
onmessage;
|
|
23
|
+
constructor(serverParams, restartConfig) {
|
|
24
|
+
this.serverParams = serverParams;
|
|
25
|
+
this.restartConfig = restartConfig;
|
|
26
|
+
logger.debug(`Creating RestartableStdioTransport for command: ${serverParams.command}`);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Creates a new underlying transport instance
|
|
30
|
+
*/
|
|
31
|
+
createTransport() {
|
|
32
|
+
const transport = new StdioClientTransport(this.serverParams);
|
|
33
|
+
// Forward event handlers
|
|
34
|
+
transport.onclose = () => this.handleTransportClose();
|
|
35
|
+
transport.onerror = (error) => this.handleTransportError(error);
|
|
36
|
+
transport.onmessage = (message) => this.handleTransportMessage(message);
|
|
37
|
+
return transport;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Handles transport close events
|
|
41
|
+
*/
|
|
42
|
+
handleTransportClose() {
|
|
43
|
+
if (this._isClosing) {
|
|
44
|
+
// Expected close, forward the event
|
|
45
|
+
this.onclose?.();
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
// Unexpected close, attempt restart if configured
|
|
49
|
+
if (this.restartConfig.restartOnExit) {
|
|
50
|
+
this.attemptRestart();
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
// No restart configured, forward close event
|
|
54
|
+
this.onclose?.();
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Handles transport error events
|
|
59
|
+
*/
|
|
60
|
+
handleTransportError(error) {
|
|
61
|
+
logger.error(`Transport error: ${error.message}`);
|
|
62
|
+
this.onerror?.(error);
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Handles transport message events
|
|
66
|
+
*/
|
|
67
|
+
handleTransportMessage(message) {
|
|
68
|
+
this.onmessage?.(message);
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Attempts to restart the transport
|
|
72
|
+
*/
|
|
73
|
+
attemptRestart() {
|
|
74
|
+
if (this._isClosing) {
|
|
75
|
+
return; // Don't restart if we're intentionally closing
|
|
76
|
+
}
|
|
77
|
+
const maxRestarts = this.restartConfig.maxRestarts;
|
|
78
|
+
if (maxRestarts !== undefined && this._restartCount >= maxRestarts) {
|
|
79
|
+
logger.error(`Max restart limit reached (${maxRestarts}), stopping transport`);
|
|
80
|
+
this.onerror?.(new Error(`Transport failed after ${maxRestarts} restart attempts`));
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
this._restartCount++;
|
|
84
|
+
const restartDelay = this.restartConfig.restartDelay ?? 1000;
|
|
85
|
+
logger.info(`Attempting transport restart ${this._restartCount} in ${restartDelay}ms...`);
|
|
86
|
+
this._restartTimer = setTimeout(async () => {
|
|
87
|
+
this._restartTimer = null;
|
|
88
|
+
try {
|
|
89
|
+
await this.restartTransport();
|
|
90
|
+
logger.info(`Transport restarted successfully (attempt ${this._restartCount})`);
|
|
91
|
+
}
|
|
92
|
+
catch (error) {
|
|
93
|
+
logger.error(`Transport restart failed: ${error}`);
|
|
94
|
+
this.onerror?.(error instanceof Error ? error : new Error(String(error)));
|
|
95
|
+
}
|
|
96
|
+
}, restartDelay);
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Restarts the underlying transport
|
|
100
|
+
*/
|
|
101
|
+
async restartTransport() {
|
|
102
|
+
if (this._isStarting || this._isClosing) {
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
this._isStarting = true;
|
|
106
|
+
try {
|
|
107
|
+
// Close old transport if it exists
|
|
108
|
+
if (this._currentTransport) {
|
|
109
|
+
await this._currentTransport.close();
|
|
110
|
+
}
|
|
111
|
+
// Create and start new transport
|
|
112
|
+
this._currentTransport = this.createTransport();
|
|
113
|
+
await this._currentTransport.start();
|
|
114
|
+
}
|
|
115
|
+
finally {
|
|
116
|
+
this._isStarting = false;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Starts the transport
|
|
121
|
+
*/
|
|
122
|
+
async start() {
|
|
123
|
+
if (this._currentTransport) {
|
|
124
|
+
throw new Error('RestartableStdioTransport already started!');
|
|
125
|
+
}
|
|
126
|
+
this._isStarting = true;
|
|
127
|
+
this._restartCount = 0;
|
|
128
|
+
try {
|
|
129
|
+
this._currentTransport = this.createTransport();
|
|
130
|
+
await this._currentTransport.start();
|
|
131
|
+
logger.debug('RestartableStdioTransport started successfully');
|
|
132
|
+
}
|
|
133
|
+
finally {
|
|
134
|
+
this._isStarting = false;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Gets the stderr stream from the current transport
|
|
139
|
+
*/
|
|
140
|
+
get stderr() {
|
|
141
|
+
return this._currentTransport?.stderr ?? null;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Gets the process PID from the current transport
|
|
145
|
+
*/
|
|
146
|
+
get pid() {
|
|
147
|
+
return this._currentTransport?.pid ?? null;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Sends a message through the current transport
|
|
151
|
+
*/
|
|
152
|
+
async send(message) {
|
|
153
|
+
if (!this._currentTransport) {
|
|
154
|
+
throw new Error('Transport not started');
|
|
155
|
+
}
|
|
156
|
+
return this._currentTransport.send(message);
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Closes the transport and prevents restart
|
|
160
|
+
*/
|
|
161
|
+
async close() {
|
|
162
|
+
this._isClosing = true;
|
|
163
|
+
// Clear any pending restart timer
|
|
164
|
+
if (this._restartTimer) {
|
|
165
|
+
clearTimeout(this._restartTimer);
|
|
166
|
+
this._restartTimer = null;
|
|
167
|
+
}
|
|
168
|
+
// Close current transport if it exists
|
|
169
|
+
if (this._currentTransport) {
|
|
170
|
+
await this._currentTransport.close();
|
|
171
|
+
this._currentTransport = null;
|
|
172
|
+
}
|
|
173
|
+
logger.debug('RestartableStdioTransport closed');
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Gets restart statistics
|
|
177
|
+
*/
|
|
178
|
+
getRestartStats() {
|
|
179
|
+
return {
|
|
180
|
+
restartCount: this._restartCount,
|
|
181
|
+
isRestarting: this._isStarting,
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
//# sourceMappingURL=restartableStdioTransport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"restartableStdioTransport.js","sourceRoot":"","sources":["../../src/transport/restartableStdioTransport.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAyB,MAAM,2CAA2C,CAAC;AAIxG,OAAO,MAAM,MAAM,qBAAqB,CAAC;AAWzC;;;GAGG;AACH,MAAM,OAAO,yBAAyB;IAkBjB;IACA;IAlBX,iBAAiB,GAAgC,IAAI,CAAC;IACtD,aAAa,GAAG,CAAC,CAAC;IAClB,WAAW,GAAG,KAAK,CAAC;IACpB,UAAU,GAAG,KAAK,CAAC;IACnB,aAAa,GAAyC,IAAI,CAAC;IAEnE,8DAA8D;IACvD,OAAO,CAAU;IACjB,IAAI,CAAY;IAChB,aAAa,CAAO;IAE3B,iBAAiB;IACV,OAAO,CAAc;IACrB,OAAO,CAA0B;IACjC,SAAS,CAAqC;IAErD,YACmB,YAAmC,EACnC,aAAyC;QADzC,iBAAY,GAAZ,YAAY,CAAuB;QACnC,kBAAa,GAAb,aAAa,CAA4B;QAE1D,MAAM,CAAC,KAAK,CAAC,mDAAmD,YAAY,CAAC,OAAO,EAAE,CAAC,CAAC;IAC1F,CAAC;IAED;;OAEG;IACK,eAAe;QACrB,MAAM,SAAS,GAAG,IAAI,oBAAoB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAE9D,yBAAyB;QACzB,SAAS,CAAC,OAAO,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC;QACtD,SAAS,CAAC,OAAO,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;QAChE,SAAS,CAAC,SAAS,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC;QAExE,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;OAEG;IACK,oBAAoB;QAC1B,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,oCAAoC;YACpC,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;YACjB,OAAO;QACT,CAAC;QAED,kDAAkD;QAClD,IAAI,IAAI,CAAC,aAAa,CAAC,aAAa,EAAE,CAAC;YACrC,IAAI,CAAC,cAAc,EAAE,CAAC;QACxB,CAAC;aAAM,CAAC;YACN,6CAA6C;YAC7C,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;QACnB,CAAC;IACH,CAAC;IAED;;OAEG;IACK,oBAAoB,CAAC,KAAY;QACvC,MAAM,CAAC,KAAK,CAAC,oBAAoB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAClD,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;IACxB,CAAC;IAED;;OAEG;IACK,sBAAsB,CAAC,OAAuB;QACpD,IAAI,CAAC,SAAS,EAAE,CAAC,OAAO,CAAC,CAAC;IAC5B,CAAC;IAED;;OAEG;IACK,cAAc;QACpB,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,OAAO,CAAC,+CAA+C;QACzD,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC;QACnD,IAAI,WAAW,KAAK,SAAS,IAAI,IAAI,CAAC,aAAa,IAAI,WAAW,EAAE,CAAC;YACnE,MAAM,CAAC,KAAK,CAAC,8BAA8B,WAAW,uBAAuB,CAAC,CAAC;YAC/E,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,KAAK,CAAC,0BAA0B,WAAW,mBAAmB,CAAC,CAAC,CAAC;YACpF,OAAO;QACT,CAAC;QAED,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,YAAY,IAAI,IAAI,CAAC;QAE7D,MAAM,CAAC,IAAI,CAAC,gCAAgC,IAAI,CAAC,aAAa,OAAO,YAAY,OAAO,CAAC,CAAC;QAE1F,IAAI,CAAC,aAAa,GAAG,UAAU,CAAC,KAAK,IAAI,EAAE;YACzC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;YAC1B,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBAC9B,MAAM,CAAC,IAAI,CAAC,6CAA6C,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC;YAClF,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,KAAK,CAAC,6BAA6B,KAAK,EAAE,CAAC,CAAC;gBACnD,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC5E,CAAC;QACH,CAAC,EAAE,YAAY,CAAC,CAAC;IACnB,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,gBAAgB;QAC5B,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACxC,OAAO;QACT,CAAC;QAED,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QAExB,IAAI,CAAC;YACH,mCAAmC;YACnC,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBAC3B,MAAM,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,CAAC;YACvC,CAAC;YAED,iCAAiC;YACjC,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;YAChD,MAAM,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,CAAC;QACvC,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;QAC3B,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAChE,CAAC;QAED,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC;QAEvB,IAAI,CAAC;YACH,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;YAChD,MAAM,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,CAAC;YACrC,MAAM,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAC;QACjE,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;QAC3B,CAAC;IACH,CAAC;IAED;;OAEG;IACH,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,iBAAiB,EAAE,MAAM,IAAI,IAAI,CAAC;IAChD,CAAC;IAED;;OAEG;IACH,IAAI,GAAG;QACL,OAAO,IAAI,CAAC,iBAAiB,EAAE,GAAG,IAAI,IAAI,CAAC;IAC7C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI,CAAC,OAAuB;QAChC,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;QAC3C,CAAC;QAED,OAAO,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC9C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QAEvB,kCAAkC;QAClC,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YACjC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC5B,CAAC;QAED,uCAAuC;QACvC,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC3B,MAAM,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,CAAC;YACrC,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;QAChC,CAAC;QAED,MAAM,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;IACnD,CAAC;IAED;;OAEG;IACH,eAAe;QACb,OAAO;YACL,YAAY,EAAE,IAAI,CAAC,aAAa;YAChC,YAAY,EAAE,IAAI,CAAC,WAAW;SAC/B,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transportFactory.d.ts","sourceRoot":"","sources":["../../src/transport/transportFactory.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,qBAAqB,EAAyB,MAAM,wBAAwB,CAAC;AACtF,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"transportFactory.d.ts","sourceRoot":"","sources":["../../src/transport/transportFactory.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,qBAAqB,EAAyB,MAAM,wBAAwB,CAAC;AACtF,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAOzD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,GAAG,eAAe,CAuBzF;AAmKD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAAC,CA2B/G"}
|
|
@@ -7,6 +7,8 @@ import { transportConfigSchema } from '../core/types/index.js';
|
|
|
7
7
|
import { SDKOAuthClientProvider } from '../auth/sdkOAuthClientProvider.js';
|
|
8
8
|
import { AUTH_CONFIG } from '../constants.js';
|
|
9
9
|
import { AgentConfigManager } from '../core/server/agentConfig.js';
|
|
10
|
+
import { processEnvironment } from '../utils/envProcessor.js';
|
|
11
|
+
import { RestartableStdioTransport } from './restartableStdioTransport.js';
|
|
10
12
|
/**
|
|
11
13
|
* Infers transport type from configuration parameters
|
|
12
14
|
*/
|
|
@@ -82,13 +84,47 @@ function createHTTPTransport(name, validatedTransport) {
|
|
|
82
84
|
return transport;
|
|
83
85
|
}
|
|
84
86
|
/**
|
|
85
|
-
* Creates stdio transport
|
|
87
|
+
* Creates stdio transport with enhanced environment processing and optional restart capability
|
|
86
88
|
*/
|
|
87
89
|
function createStdioTransport(name, validatedTransport) {
|
|
88
90
|
if (!validatedTransport.command) {
|
|
89
91
|
throw new Error(`Command is required for stdio transport: ${name}`);
|
|
90
92
|
}
|
|
91
|
-
|
|
93
|
+
// Process environment variables with new features
|
|
94
|
+
const envResult = processEnvironment({
|
|
95
|
+
inheritParentEnv: validatedTransport.inheritParentEnv,
|
|
96
|
+
envFilter: validatedTransport.envFilter,
|
|
97
|
+
env: validatedTransport.env,
|
|
98
|
+
});
|
|
99
|
+
logger.debug(`Environment processing for ${name}:`, {
|
|
100
|
+
totalVariables: Object.keys(envResult.processedEnv).length,
|
|
101
|
+
sdkDefaults: envResult.sources.sdkDefaults.length,
|
|
102
|
+
inherited: envResult.sources.inherited.length,
|
|
103
|
+
custom: envResult.sources.custom.length,
|
|
104
|
+
filtered: envResult.sources.filtered.length,
|
|
105
|
+
});
|
|
106
|
+
// Create SDK-compatible parameters with processed environment
|
|
107
|
+
const stdioParams = {
|
|
108
|
+
command: validatedTransport.command,
|
|
109
|
+
args: validatedTransport.args,
|
|
110
|
+
stderr: validatedTransport.stderr, // IOType validation is complex, trust Zod validation
|
|
111
|
+
cwd: validatedTransport.cwd,
|
|
112
|
+
env: envResult.processedEnv,
|
|
113
|
+
};
|
|
114
|
+
// Create transport with restart capability if enabled
|
|
115
|
+
if (validatedTransport.restartOnExit) {
|
|
116
|
+
logger.info(`Creating restartable stdio transport for: ${name}`);
|
|
117
|
+
const restartableTransport = new RestartableStdioTransport(stdioParams, {
|
|
118
|
+
restartOnExit: true,
|
|
119
|
+
maxRestarts: validatedTransport.maxRestarts, // Use config value or undefined for unlimited
|
|
120
|
+
restartDelay: validatedTransport.restartDelay ?? 1000, // Use config value or default to 1 second
|
|
121
|
+
});
|
|
122
|
+
// Add AuthProviderTransport properties
|
|
123
|
+
return restartableTransport;
|
|
124
|
+
}
|
|
125
|
+
// Create standard stdio transport
|
|
126
|
+
logger.debug(`Creating standard stdio transport for: ${name}`);
|
|
127
|
+
return new StdioClientTransport(stdioParams);
|
|
92
128
|
}
|
|
93
129
|
/**
|
|
94
130
|
* Creates a single transport instance
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transportFactory.js","sourceRoot":"","sources":["../../src/transport/transportFactory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAyB,MAAM,2CAA2C,CAAC;AACxG,OAAO,EAAE,kBAAkB,EAA6B,MAAM,yCAAyC,CAAC;AACxG,OAAO,EACL,6BAA6B,GAE9B,MAAM,oDAAoD,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAC/B,OAAO,MAAM,MAAM,qBAAqB,CAAC;AACzC,OAAO,EAAyB,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAEtF,OAAO,EAAqB,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AAC9F,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"transportFactory.js","sourceRoot":"","sources":["../../src/transport/transportFactory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration for environment processing
|
|
3
|
+
*/
|
|
4
|
+
export interface EnvProcessingConfig {
|
|
5
|
+
readonly inheritParentEnv?: boolean;
|
|
6
|
+
readonly envFilter?: string[];
|
|
7
|
+
readonly env?: Record<string, string> | string[];
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Result of environment processing
|
|
11
|
+
*/
|
|
12
|
+
export interface ProcessedEnvironment {
|
|
13
|
+
readonly processedEnv: Record<string, string>;
|
|
14
|
+
readonly sources: {
|
|
15
|
+
readonly sdkDefaults: string[];
|
|
16
|
+
readonly inherited: string[];
|
|
17
|
+
readonly custom: string[];
|
|
18
|
+
readonly filtered: string[];
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Converts environment array format to object format
|
|
23
|
+
* @param envArray Array in format ["KEY=value", "PATH=/usr/bin"]
|
|
24
|
+
* @returns Object in format {KEY: "value", PATH: "/usr/bin"}
|
|
25
|
+
*/
|
|
26
|
+
export declare function parseEnvArray(envArray: string[]): Record<string, string>;
|
|
27
|
+
/**
|
|
28
|
+
* Substitutes environment variables in configuration values
|
|
29
|
+
* @param configValue Configuration value that may contain ${VAR} patterns
|
|
30
|
+
* @returns Value with environment variables substituted
|
|
31
|
+
*/
|
|
32
|
+
export declare function substituteEnvVars(configValue: string): string;
|
|
33
|
+
/**
|
|
34
|
+
* Recursively substitutes environment variables in a configuration object
|
|
35
|
+
* @param config Configuration object
|
|
36
|
+
* @returns Configuration object with environment variables substituted
|
|
37
|
+
*/
|
|
38
|
+
export declare function substituteEnvVarsInConfig(config: any): any;
|
|
39
|
+
/**
|
|
40
|
+
* Processes environment configuration for stdio transport
|
|
41
|
+
* @param config Environment processing configuration
|
|
42
|
+
* @returns Processed environment variables with metadata
|
|
43
|
+
*/
|
|
44
|
+
export declare function processEnvironment(config: EnvProcessingConfig): ProcessedEnvironment;
|
|
45
|
+
//# sourceMappingURL=envProcessor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"envProcessor.d.ts","sourceRoot":"","sources":["../../src/utils/envProcessor.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IACpC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,EAAE,CAAC;CAClD;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9C,QAAQ,CAAC,OAAO,EAAE;QAChB,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,CAAC;QAC/B,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC;QAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;QAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;KAC7B,CAAC;CACH;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAqBxE;AAwGD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAS7D;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,GAAG,GAAG,GAAG,CAkB1D;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,mBAAmB,GAAG,oBAAoB,CAiEpF"}
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
import { getDefaultEnvironment } from '@modelcontextprotocol/sdk/client/stdio.js';
|
|
2
|
+
import logger from '../logger/logger.js';
|
|
3
|
+
/**
|
|
4
|
+
* Converts environment array format to object format
|
|
5
|
+
* @param envArray Array in format ["KEY=value", "PATH=/usr/bin"]
|
|
6
|
+
* @returns Object in format {KEY: "value", PATH: "/usr/bin"}
|
|
7
|
+
*/
|
|
8
|
+
export function parseEnvArray(envArray) {
|
|
9
|
+
const envObject = {};
|
|
10
|
+
for (const entry of envArray) {
|
|
11
|
+
const equalIndex = entry.indexOf('=');
|
|
12
|
+
if (equalIndex === -1) {
|
|
13
|
+
// No equals sign, treat as inheritance key
|
|
14
|
+
const key = entry.trim();
|
|
15
|
+
const value = process.env[key];
|
|
16
|
+
if (value !== undefined) {
|
|
17
|
+
envObject[key] = value;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
// Has equals sign, treat as key=value assignment
|
|
22
|
+
const key = entry.slice(0, equalIndex).trim();
|
|
23
|
+
const value = entry.slice(equalIndex + 1);
|
|
24
|
+
envObject[key] = value;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return envObject;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Checks if an environment variable key matches any pattern
|
|
31
|
+
* @param key Environment variable key
|
|
32
|
+
* @param patterns Array of patterns with optional ! prefix for denial
|
|
33
|
+
* @returns true if key should be included, false if denied or not matched
|
|
34
|
+
*/
|
|
35
|
+
function matchesEnvPattern(key, patterns) {
|
|
36
|
+
let matched = false;
|
|
37
|
+
let denied = false;
|
|
38
|
+
for (const pattern of patterns) {
|
|
39
|
+
if (pattern.startsWith('!')) {
|
|
40
|
+
// Denial pattern
|
|
41
|
+
const denyPattern = pattern.slice(1);
|
|
42
|
+
if (matchesGlobPattern(key, denyPattern)) {
|
|
43
|
+
denied = true;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
// Allow pattern
|
|
48
|
+
if (matchesGlobPattern(key, pattern)) {
|
|
49
|
+
matched = true;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
// If explicitly denied, return false
|
|
54
|
+
// If matched by allow pattern and not denied, return true
|
|
55
|
+
// If no allow patterns specified but denied patterns exist, default to true unless denied
|
|
56
|
+
if (denied)
|
|
57
|
+
return false;
|
|
58
|
+
if (matched)
|
|
59
|
+
return true;
|
|
60
|
+
// Check if there are any allow patterns - if not, default to allow (only deny patterns)
|
|
61
|
+
const hasAllowPatterns = patterns.some((p) => !p.startsWith('!'));
|
|
62
|
+
return !hasAllowPatterns;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Simple glob pattern matching for environment variable names
|
|
66
|
+
* Supports * wildcard at the end of patterns
|
|
67
|
+
* @param text Text to match
|
|
68
|
+
* @param pattern Pattern with optional * wildcard
|
|
69
|
+
* @returns true if text matches pattern
|
|
70
|
+
*/
|
|
71
|
+
function matchesGlobPattern(text, pattern) {
|
|
72
|
+
if (pattern === text) {
|
|
73
|
+
return true;
|
|
74
|
+
}
|
|
75
|
+
if (pattern.endsWith('*')) {
|
|
76
|
+
const prefix = pattern.slice(0, -1);
|
|
77
|
+
return text.startsWith(prefix);
|
|
78
|
+
}
|
|
79
|
+
return false;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Applies environment variable filtering based on patterns
|
|
83
|
+
* @param env Environment variables to filter
|
|
84
|
+
* @param patterns Array of allow/deny patterns
|
|
85
|
+
* @returns Filtered environment variables and list of filtered keys
|
|
86
|
+
*/
|
|
87
|
+
function applyEnvPatterns(env, patterns) {
|
|
88
|
+
const filtered = {};
|
|
89
|
+
const filteredKeys = [];
|
|
90
|
+
for (const [key, value] of Object.entries(env)) {
|
|
91
|
+
if (matchesEnvPattern(key, patterns)) {
|
|
92
|
+
filtered[key] = value;
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
filteredKeys.push(key);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return { filtered, filteredKeys };
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Gets environment variables from parent process, excluding dangerous ones
|
|
102
|
+
* @returns Safe environment variables from parent process
|
|
103
|
+
*/
|
|
104
|
+
function getParentEnvironment() {
|
|
105
|
+
const parentEnv = {};
|
|
106
|
+
for (const [key, value] of Object.entries(process.env)) {
|
|
107
|
+
if (value === undefined)
|
|
108
|
+
continue;
|
|
109
|
+
// Skip bash functions and other potentially dangerous variables
|
|
110
|
+
if (value.startsWith('()')) {
|
|
111
|
+
logger.debug(`Skipping dangerous environment variable: ${key}`);
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
parentEnv[key] = value;
|
|
115
|
+
}
|
|
116
|
+
return parentEnv;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Substitutes environment variables in configuration values
|
|
120
|
+
* @param configValue Configuration value that may contain ${VAR} patterns
|
|
121
|
+
* @returns Value with environment variables substituted
|
|
122
|
+
*/
|
|
123
|
+
export function substituteEnvVars(configValue) {
|
|
124
|
+
return configValue.replace(/\$\{([^}]+)\}/g, (match, envVar) => {
|
|
125
|
+
const value = process.env[envVar.trim()];
|
|
126
|
+
if (value === undefined) {
|
|
127
|
+
logger.warn(`Environment variable ${envVar} not found, keeping placeholder: ${match}`);
|
|
128
|
+
return match;
|
|
129
|
+
}
|
|
130
|
+
return value;
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Recursively substitutes environment variables in a configuration object
|
|
135
|
+
* @param config Configuration object
|
|
136
|
+
* @returns Configuration object with environment variables substituted
|
|
137
|
+
*/
|
|
138
|
+
export function substituteEnvVarsInConfig(config) {
|
|
139
|
+
if (typeof config === 'string') {
|
|
140
|
+
return substituteEnvVars(config);
|
|
141
|
+
}
|
|
142
|
+
if (Array.isArray(config)) {
|
|
143
|
+
return config.map((item) => substituteEnvVarsInConfig(item));
|
|
144
|
+
}
|
|
145
|
+
if (config && typeof config === 'object') {
|
|
146
|
+
const result = {};
|
|
147
|
+
for (const [key, value] of Object.entries(config)) {
|
|
148
|
+
result[key] = substituteEnvVarsInConfig(value);
|
|
149
|
+
}
|
|
150
|
+
return result;
|
|
151
|
+
}
|
|
152
|
+
return config;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Processes environment configuration for stdio transport
|
|
156
|
+
* @param config Environment processing configuration
|
|
157
|
+
* @returns Processed environment variables with metadata
|
|
158
|
+
*/
|
|
159
|
+
export function processEnvironment(config) {
|
|
160
|
+
// 1. Start with SDK safe defaults
|
|
161
|
+
const sdkDefaults = getDefaultEnvironment();
|
|
162
|
+
const sdkDefaultKeys = Object.keys(sdkDefaults);
|
|
163
|
+
logger.debug(`SDK default environment variables: ${sdkDefaultKeys.join(', ')}`);
|
|
164
|
+
// 2. Optionally inherit from parent process
|
|
165
|
+
let inheritedEnv = {};
|
|
166
|
+
let inheritedKeys = [];
|
|
167
|
+
if (config.inheritParentEnv) {
|
|
168
|
+
const parentEnv = getParentEnvironment();
|
|
169
|
+
inheritedEnv = { ...parentEnv };
|
|
170
|
+
inheritedKeys = Object.keys(parentEnv).filter((key) => !sdkDefaultKeys.includes(key));
|
|
171
|
+
logger.debug(`Inheriting ${inheritedKeys.length} additional environment variables from parent`);
|
|
172
|
+
}
|
|
173
|
+
// 3. Combine SDK defaults and inherited environment
|
|
174
|
+
let combinedEnv = { ...sdkDefaults, ...inheritedEnv };
|
|
175
|
+
// 4. Apply pattern filtering if specified
|
|
176
|
+
let filteredKeys = [];
|
|
177
|
+
if (config.envFilter && config.envFilter.length > 0) {
|
|
178
|
+
const filterResult = applyEnvPatterns(combinedEnv, config.envFilter);
|
|
179
|
+
combinedEnv = filterResult.filtered;
|
|
180
|
+
filteredKeys = filterResult.filteredKeys;
|
|
181
|
+
logger.debug(`Environment filtering removed ${filteredKeys.length} variables: ${filteredKeys.join(', ')}`);
|
|
182
|
+
}
|
|
183
|
+
// 5. Add custom environment variables
|
|
184
|
+
let customEnv = {};
|
|
185
|
+
let customKeys = [];
|
|
186
|
+
if (config.env) {
|
|
187
|
+
if (Array.isArray(config.env)) {
|
|
188
|
+
customEnv = parseEnvArray(config.env);
|
|
189
|
+
}
|
|
190
|
+
else {
|
|
191
|
+
customEnv = { ...config.env };
|
|
192
|
+
}
|
|
193
|
+
// Apply environment variable substitution to custom env
|
|
194
|
+
for (const [key, value] of Object.entries(customEnv)) {
|
|
195
|
+
customEnv[key] = substituteEnvVars(value);
|
|
196
|
+
}
|
|
197
|
+
customKeys = Object.keys(customEnv);
|
|
198
|
+
logger.debug(`Adding ${customKeys.length} custom environment variables: ${customKeys.join(', ')}`);
|
|
199
|
+
}
|
|
200
|
+
// 6. Final merge (custom env overrides everything)
|
|
201
|
+
const processedEnv = { ...combinedEnv, ...customEnv };
|
|
202
|
+
const result = {
|
|
203
|
+
processedEnv,
|
|
204
|
+
sources: {
|
|
205
|
+
sdkDefaults: sdkDefaultKeys,
|
|
206
|
+
inherited: inheritedKeys,
|
|
207
|
+
custom: customKeys,
|
|
208
|
+
filtered: filteredKeys,
|
|
209
|
+
},
|
|
210
|
+
};
|
|
211
|
+
logger.debug(`Environment processing complete. Total variables: ${Object.keys(processedEnv).length}`);
|
|
212
|
+
return result;
|
|
213
|
+
}
|
|
214
|
+
//# sourceMappingURL=envProcessor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"envProcessor.js","sourceRoot":"","sources":["../../src/utils/envProcessor.ts"],"names":[],"mappings":"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"}
|