@vybestack/llxprt-code-mcp 0.10.0 → 0.11.0-nightly.260727.c4abf5792
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/auth/src/proxy/framing.d.ts +2 -0
- package/dist/auth/src/proxy/framing.js +6 -0
- package/dist/auth/src/proxy/framing.js.map +1 -1
- package/dist/auth/src/proxy/proxy-socket-client.d.ts +8 -1
- package/dist/auth/src/proxy/proxy-socket-client.js +87 -13
- package/dist/auth/src/proxy/proxy-socket-client.js.map +1 -1
- package/dist/auth/src/proxy/proxy-token-store.d.ts +1 -1
- package/dist/auth/src/proxy/proxy-token-store.js +2 -2
- package/dist/auth/src/proxy/proxy-token-store.js.map +1 -1
- package/dist/core/src/config/config.d.ts +20 -0
- package/dist/core/src/config/config.js +143 -23
- package/dist/core/src/config/config.js.map +1 -1
- package/dist/core/src/config/configBaseCore.d.ts +6 -2
- package/dist/core/src/config/configBaseCore.js +8 -0
- package/dist/core/src/config/configBaseCore.js.map +1 -1
- package/dist/core/src/config/configConstructor.d.ts +2 -0
- package/dist/core/src/config/configConstructor.js +9 -1
- package/dist/core/src/config/configConstructor.js.map +1 -1
- package/dist/core/src/config/configTypes.d.ts +7 -2
- package/dist/core/src/config/configTypes.js +2 -0
- package/dist/core/src/config/configTypes.js.map +1 -1
- package/dist/core/src/config/liveTrustTransitionLifecycle.d.ts +35 -0
- package/dist/core/src/config/liveTrustTransitionLifecycle.js +180 -0
- package/dist/core/src/config/liveTrustTransitionLifecycle.js.map +1 -0
- package/dist/core/src/core/model-limits.json +96 -0
- package/dist/core/src/core/model-limits.schema.d.ts +123 -0
- package/dist/core/src/core/model-limits.schema.js +75 -0
- package/dist/core/src/core/model-limits.schema.js.map +1 -0
- package/dist/core/src/core/tokenLimits.d.ts +6 -8
- package/dist/core/src/core/tokenLimits.js +56 -132
- package/dist/core/src/core/tokenLimits.js.map +1 -1
- package/dist/core/src/hooks/hookRegistry.d.ts +1 -1
- package/dist/core/src/hooks/hookRegistry.js +3 -1
- package/dist/core/src/hooks/hookRegistry.js.map +1 -1
- package/dist/core/src/hooks/hookSystem.d.ts +10 -1
- package/dist/core/src/hooks/hookSystem.js +69 -12
- package/dist/core/src/hooks/hookSystem.js.map +1 -1
- package/dist/core/src/index.d.ts +1 -0
- package/dist/core/src/index.js +1 -0
- package/dist/core/src/index.js.map +1 -1
- package/dist/core/src/llm-types/geminiContent.d.ts +3 -0
- package/dist/core/src/policy/config.d.ts +4 -2
- package/dist/core/src/policy/config.js +22 -18
- package/dist/core/src/policy/config.js.map +1 -1
- package/dist/core/src/recording/ReplayEngine.js +39 -2
- package/dist/core/src/recording/ReplayEngine.js.map +1 -1
- package/dist/core/src/recording/SessionDiscovery.d.ts +8 -0
- package/dist/core/src/recording/SessionDiscovery.js +88 -3
- package/dist/core/src/recording/SessionDiscovery.js.map +1 -1
- package/dist/core/src/recording/SessionLockManager.d.ts +3 -0
- package/dist/core/src/recording/SessionLockManager.js +9 -3
- package/dist/core/src/recording/SessionLockManager.js.map +1 -1
- package/dist/core/src/recording/SessionRecordingService.d.ts +14 -1
- package/dist/core/src/recording/SessionRecordingService.js +27 -3
- package/dist/core/src/recording/SessionRecordingService.js.map +1 -1
- package/dist/core/src/recording/index.d.ts +4 -3
- package/dist/core/src/recording/index.js +4 -3
- package/dist/core/src/recording/index.js.map +1 -1
- package/dist/core/src/recording/resumeNotFoundMessages.d.ts +56 -0
- package/dist/core/src/recording/resumeNotFoundMessages.js +64 -0
- package/dist/core/src/recording/resumeNotFoundMessages.js.map +1 -0
- package/dist/core/src/recording/resumeSession.js +3 -2
- package/dist/core/src/recording/resumeSession.js.map +1 -1
- package/dist/core/src/recording/sessionManagement.d.ts +3 -0
- package/dist/core/src/recording/sessionManagement.js +38 -19
- package/dist/core/src/recording/sessionManagement.js.map +1 -1
- package/dist/core/src/recording/types.d.ts +42 -3
- package/dist/core/src/recording/types.js +1 -1
- package/dist/core/src/recording/types.js.map +1 -1
- package/dist/core/src/runtime/AgentRuntimeLoader.js +2 -1
- package/dist/core/src/runtime/AgentRuntimeLoader.js.map +1 -1
- package/dist/core/src/services/history/ContentConverters.d.ts +4 -0
- package/dist/core/src/services/history/ContentConverters.js +77 -59
- package/dist/core/src/services/history/ContentConverters.js.map +1 -1
- package/dist/core/src/services/history/HistoryService.d.ts +13 -1
- package/dist/core/src/services/history/HistoryService.js +71 -0
- package/dist/core/src/services/history/HistoryService.js.map +1 -1
- package/dist/core/src/services/history/IContent.d.ts +10 -0
- package/dist/core/src/services/history/IContent.js.map +1 -1
- package/dist/core/src/skills/skillManager.d.ts +11 -1
- package/dist/core/src/skills/skillManager.js +21 -1
- package/dist/core/src/skills/skillManager.js.map +1 -1
- package/dist/core/src/utils/browser-profile-discovery.d.ts +40 -0
- package/dist/core/src/utils/browser-profile-discovery.js +251 -0
- package/dist/core/src/utils/browser-profile-discovery.js.map +1 -0
- package/dist/core/src/utils/env.d.ts +12 -0
- package/dist/core/src/utils/env.js +15 -0
- package/dist/core/src/utils/env.js.map +1 -0
- package/dist/core/src/utils/events.d.ts +10 -1
- package/dist/core/src/utils/events.js +22 -0
- package/dist/core/src/utils/events.js.map +1 -1
- package/dist/core/src/utils/fileUtils.js +8 -1
- package/dist/core/src/utils/fileUtils.js.map +1 -1
- package/dist/core/src/utils/retry.js +3 -4
- package/dist/core/src/utils/retry.js.map +1 -1
- package/dist/core/src/utils/secure-browser-launcher.d.ts +35 -1
- package/dist/core/src/utils/secure-browser-launcher.js +341 -1
- package/dist/core/src/utils/secure-browser-launcher.js.map +1 -1
- package/dist/core/src/utils/thoughtUtils.d.ts +2 -0
- package/dist/core/src/utils/thoughtUtils.js.map +1 -1
- package/dist/mcp/src/client/close-client-with-timeout.d.ts +7 -0
- package/dist/mcp/src/client/close-client-with-timeout.js +23 -0
- package/dist/mcp/src/client/close-client-with-timeout.js.map +1 -0
- package/dist/mcp/src/client/mcp-callable-tool.d.ts +2 -1
- package/dist/mcp/src/client/mcp-callable-tool.js +10 -1
- package/dist/mcp/src/client/mcp-callable-tool.js.map +1 -1
- package/dist/mcp/src/client/mcp-client-manager-helpers.d.ts +27 -0
- package/dist/mcp/src/client/mcp-client-manager-helpers.js +87 -0
- package/dist/mcp/src/client/mcp-client-manager-helpers.js.map +1 -0
- package/dist/mcp/src/client/mcp-client-manager.d.ts +34 -37
- package/dist/mcp/src/client/mcp-client-manager.js +401 -135
- package/dist/mcp/src/client/mcp-client-manager.js.map +1 -1
- package/dist/mcp/src/client/mcp-client.d.ts +20 -2
- package/dist/mcp/src/client/mcp-client.js +391 -86
- package/dist/mcp/src/client/mcp-client.js.map +1 -1
- package/dist/mcp/src/client/mcp-connection.d.ts +1 -1
- package/dist/mcp/src/client/mcp-connection.js +140 -45
- package/dist/mcp/src/client/mcp-connection.js.map +1 -1
- package/dist/mcp/src/client/mcp-discovery.d.ts +17 -4
- package/dist/mcp/src/client/mcp-discovery.js +201 -37
- package/dist/mcp/src/client/mcp-discovery.js.map +1 -1
- package/dist/mcp/src/client/mcp-errors.d.ts +6 -0
- package/dist/mcp/src/client/mcp-errors.js +7 -0
- package/dist/mcp/src/client/mcp-errors.js.map +1 -0
- package/dist/mcp/src/client/mcp-instructions.d.ts +7 -0
- package/dist/mcp/src/client/mcp-instructions.js +16 -0
- package/dist/mcp/src/client/mcp-instructions.js.map +1 -0
- package/dist/mcp/src/client/mcp-oauth-helpers.d.ts +20 -0
- package/dist/mcp/src/client/mcp-oauth-helpers.js +159 -0
- package/dist/mcp/src/client/mcp-oauth-helpers.js.map +1 -1
- package/dist/mcp/src/client/mcp-status.d.ts +1 -1
- package/dist/mcp/src/client/mcp-status.js +10 -2
- package/dist/mcp/src/client/mcp-status.js.map +1 -1
- package/dist/mcp/src/client/retryable-client-disconnections.d.ts +14 -0
- package/dist/mcp/src/client/retryable-client-disconnections.js +36 -0
- package/dist/mcp/src/client/retryable-client-disconnections.js.map +1 -0
- package/dist/mcp/src/client/trust-revocation-errors.d.ts +7 -0
- package/dist/mcp/src/client/trust-revocation-errors.js +24 -0
- package/dist/mcp/src/client/trust-revocation-errors.js.map +1 -0
- package/dist/mcp/src/fake/fakeMcpDiscovery.d.ts +109 -29
- package/dist/mcp/src/fake/fakeMcpDiscovery.js +111 -22
- package/dist/mcp/src/fake/fakeMcpDiscovery.js.map +1 -1
- package/dist/settings/src/index.d.ts +1 -1
- package/dist/settings/src/index.js +1 -1
- package/dist/settings/src/index.js.map +1 -1
- package/dist/settings/src/profiles/types.d.ts +1 -0
- package/dist/settings/src/profiles/types.js.map +1 -1
- package/dist/settings/src/settings/registry/registry-entries-1.js +7 -0
- package/dist/settings/src/settings/registry/registry-entries-1.js.map +1 -1
- package/dist/settings/src/settings/registry/registry-entries-2.js +12 -0
- package/dist/settings/src/settings/registry/registry-entries-2.js.map +1 -1
- package/dist/settings/src/settings/registry/registry-entries-3.js +8 -0
- package/dist/settings/src/settings/registry/registry-entries-3.js.map +1 -1
- package/dist/tools/src/index.d.ts +2 -0
- package/dist/tools/src/index.js +2 -0
- package/dist/tools/src/index.js.map +1 -1
- package/dist/tools/src/tools/ast-edit/__tests__/test-helpers.d.ts +48 -0
- package/dist/tools/src/tools/ast-edit/__tests__/test-helpers.js +110 -0
- package/dist/tools/src/tools/ast-edit/__tests__/test-helpers.js.map +1 -0
- package/dist/tools/src/tools/ast-edit/ast-edit-invocation.d.ts +1 -0
- package/dist/tools/src/tools/ast-edit/ast-edit-invocation.js +38 -11
- package/dist/tools/src/tools/ast-edit/ast-edit-invocation.js.map +1 -1
- package/dist/tools/src/tools/ast-edit/edit-calculator.d.ts +6 -3
- package/dist/tools/src/tools/ast-edit/edit-calculator.js +24 -6
- package/dist/tools/src/tools/ast-edit/edit-calculator.js.map +1 -1
- package/dist/tools/src/tools/ast-edit/validation-categorizer.d.ts +58 -0
- package/dist/tools/src/tools/ast-edit/validation-categorizer.js +207 -0
- package/dist/tools/src/tools/ast-edit/validation-categorizer.js.map +1 -0
- package/dist/tools/src/tools/tool-registry.js +6 -43
- package/dist/tools/src/tools/tool-registry.js.map +1 -1
- package/dist/tools/src/utils/fileUtils.js +8 -1
- package/dist/tools/src/utils/fileUtils.js.map +1 -1
- package/package.json +7 -6
- package/src/client/close-client-with-timeout.ts +36 -0
- package/src/client/mcp-callable-tool.ts +8 -0
- package/src/client/mcp-client-manager-helpers.ts +150 -0
- package/src/client/mcp-client-manager.ts +539 -197
- package/src/client/mcp-client.ts +535 -101
- package/src/client/mcp-connection.ts +193 -71
- package/src/client/mcp-discovery.ts +380 -38
- package/src/client/mcp-errors.ts +8 -0
- package/src/client/mcp-instructions.ts +22 -0
- package/src/client/mcp-oauth-helpers.ts +186 -0
- package/src/client/mcp-status.ts +9 -1
- package/src/client/retryable-client-disconnections.ts +44 -0
- package/src/client/trust-revocation-errors.ts +32 -0
- package/src/fake/fakeMcpDiscovery.ts +136 -41
|
@@ -22,11 +22,13 @@ export interface FrameDecoderOptions {
|
|
|
22
22
|
* callback returns. Use this to close the connection or log the error.
|
|
23
23
|
*/
|
|
24
24
|
onPartialFrameTimeout?: () => void;
|
|
25
|
+
maxFramesPerFeed?: number;
|
|
25
26
|
}
|
|
26
27
|
export declare class FrameDecoder {
|
|
27
28
|
private buffer;
|
|
28
29
|
private partialFrameTimer;
|
|
29
30
|
private readonly onPartialFrameTimeout?;
|
|
31
|
+
private readonly maxFramesPerFeed?;
|
|
30
32
|
constructor(options?: FrameDecoderOptions);
|
|
31
33
|
feed(chunk: Buffer): Array<Record<string, unknown>>;
|
|
32
34
|
reset(): void;
|
|
@@ -34,8 +34,10 @@ export class FrameDecoder {
|
|
|
34
34
|
buffer = Buffer.alloc(0);
|
|
35
35
|
partialFrameTimer = null;
|
|
36
36
|
onPartialFrameTimeout;
|
|
37
|
+
maxFramesPerFeed;
|
|
37
38
|
constructor(options = {}) {
|
|
38
39
|
this.onPartialFrameTimeout = options.onPartialFrameTimeout;
|
|
40
|
+
this.maxFramesPerFeed = options.maxFramesPerFeed;
|
|
39
41
|
}
|
|
40
42
|
feed(chunk) {
|
|
41
43
|
this.buffer = Buffer.concat([this.buffer, chunk]);
|
|
@@ -60,6 +62,10 @@ export class FrameDecoder {
|
|
|
60
62
|
throw new FrameError(`Invalid JSON in frame: ${e.message}`);
|
|
61
63
|
}
|
|
62
64
|
frames.push(parsed);
|
|
65
|
+
if (this.maxFramesPerFeed !== undefined &&
|
|
66
|
+
frames.length > this.maxFramesPerFeed) {
|
|
67
|
+
throw new FrameError('Too many frames in one chunk');
|
|
68
|
+
}
|
|
63
69
|
}
|
|
64
70
|
return frames;
|
|
65
71
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"framing.js","sourceRoot":"","sources":["../../../../../auth/src/proxy/framing.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;;;GAMG;AAEH,gFAAgF;AAEhF,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,CAAC;AACpC,MAAM,CAAC,MAAM,wBAAwB,GAAG,IAAI,CAAC;AAE7C,gFAAgF;AAEhF,MAAM,OAAO,UAAW,SAAQ,KAAK;IACnC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;IACjB,CAAC;CACF;AAED,gFAAgF;AAEhF,MAAM,UAAU,WAAW,CAAC,OAAgC;IAC1D,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IACrC,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC5C,IAAI,SAAS,CAAC,MAAM,GAAG,cAAc,EAAE,CAAC;QACtC,MAAM,IAAI,UAAU,CAAC,4BAA4B,CAAC,CAAC;IACrD,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC/B,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAC1C,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;AAC5C,CAAC;
|
|
1
|
+
{"version":3,"file":"framing.js","sourceRoot":"","sources":["../../../../../auth/src/proxy/framing.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,6 +15,7 @@ export type ProxyResponse = {
|
|
|
15
15
|
};
|
|
16
16
|
export declare class ProxySocketClient {
|
|
17
17
|
private readonly socketPath;
|
|
18
|
+
private readonly capabilityToken;
|
|
18
19
|
private socket;
|
|
19
20
|
private decoder;
|
|
20
21
|
private pendingRequests;
|
|
@@ -22,7 +23,7 @@ export declare class ProxySocketClient {
|
|
|
22
23
|
private idleTimer;
|
|
23
24
|
private connectingPromise;
|
|
24
25
|
private handshakeResolver;
|
|
25
|
-
constructor(socketPath: string);
|
|
26
|
+
constructor(socketPath: string, capabilityToken?: string);
|
|
26
27
|
ensureConnected(): Promise<void>;
|
|
27
28
|
private isConnected;
|
|
28
29
|
request(op: string, payload: Record<string, unknown>): Promise<ProxyResponse>;
|
|
@@ -33,6 +34,12 @@ export declare class ProxySocketClient {
|
|
|
33
34
|
private connect;
|
|
34
35
|
private handshake;
|
|
35
36
|
private onData;
|
|
37
|
+
/**
|
|
38
|
+
* Processes a single decoded frame. Returns true if the socket was
|
|
39
|
+
* destroyed and the caller should stop iterating.
|
|
40
|
+
*/
|
|
41
|
+
private processFrame;
|
|
42
|
+
private resolveHandshake;
|
|
36
43
|
private resolvePendingRequest;
|
|
37
44
|
private onError;
|
|
38
45
|
private onClose;
|
|
@@ -16,8 +16,28 @@ import { encodeFrame, FrameDecoder } from './framing.js';
|
|
|
16
16
|
export const REQUEST_TIMEOUT_MS = 30000;
|
|
17
17
|
export const IDLE_TIMEOUT_MS = 300000;
|
|
18
18
|
export const PROTOCOL_VERSION = 1;
|
|
19
|
+
/** Validates that a decoded frame has the shape of a ProxyResponse, guarding
|
|
20
|
+
* against adversarial or malformed server responses with unexpected types
|
|
21
|
+
* for `ok`, `code`, or `error`. */
|
|
22
|
+
function isProxyResponseFrame(frame) {
|
|
23
|
+
if (typeof frame.ok !== 'boolean')
|
|
24
|
+
return false;
|
|
25
|
+
if (frame.code !== undefined && typeof frame.code !== 'string')
|
|
26
|
+
return false;
|
|
27
|
+
if (frame.error !== undefined && typeof frame.error !== 'string')
|
|
28
|
+
return false;
|
|
29
|
+
if (frame.retryAfter !== undefined && typeof frame.retryAfter !== 'number')
|
|
30
|
+
return false;
|
|
31
|
+
if (frame.data !== undefined &&
|
|
32
|
+
(typeof frame.data !== 'object' ||
|
|
33
|
+
frame.data === null ||
|
|
34
|
+
Array.isArray(frame.data)))
|
|
35
|
+
return false;
|
|
36
|
+
return true;
|
|
37
|
+
}
|
|
19
38
|
export class ProxySocketClient {
|
|
20
39
|
socketPath;
|
|
40
|
+
capabilityToken;
|
|
21
41
|
socket = null;
|
|
22
42
|
decoder = new FrameDecoder({
|
|
23
43
|
onPartialFrameTimeout: () => this.handlePartialFrameTimeout(),
|
|
@@ -27,8 +47,9 @@ export class ProxySocketClient {
|
|
|
27
47
|
idleTimer = null;
|
|
28
48
|
connectingPromise = null;
|
|
29
49
|
handshakeResolver = null;
|
|
30
|
-
constructor(socketPath) {
|
|
50
|
+
constructor(socketPath, capabilityToken) {
|
|
31
51
|
this.socketPath = socketPath;
|
|
52
|
+
this.capabilityToken = capabilityToken;
|
|
32
53
|
}
|
|
33
54
|
async ensureConnected() {
|
|
34
55
|
if (this.socket !== null && this.handshakeComplete) {
|
|
@@ -99,8 +120,19 @@ export class ProxySocketClient {
|
|
|
99
120
|
this.decoder.reset();
|
|
100
121
|
}
|
|
101
122
|
async connectAndHandshake() {
|
|
102
|
-
|
|
103
|
-
|
|
123
|
+
try {
|
|
124
|
+
await this.connect();
|
|
125
|
+
await this.handshake();
|
|
126
|
+
}
|
|
127
|
+
catch (err) {
|
|
128
|
+
try {
|
|
129
|
+
this.destroy(err instanceof Error ? err.message : 'Handshake failed');
|
|
130
|
+
}
|
|
131
|
+
catch {
|
|
132
|
+
// Swallow cleanup errors so the original failure is not masked
|
|
133
|
+
}
|
|
134
|
+
throw err;
|
|
135
|
+
}
|
|
104
136
|
}
|
|
105
137
|
async connect() {
|
|
106
138
|
this.socket = net.createConnection(this.socketPath);
|
|
@@ -118,10 +150,14 @@ export class ProxySocketClient {
|
|
|
118
150
|
this.socket.unref();
|
|
119
151
|
}
|
|
120
152
|
async handshake() {
|
|
153
|
+
const payload = { minVersion: 1, maxVersion: 1 };
|
|
154
|
+
if (this.capabilityToken) {
|
|
155
|
+
payload.capabilityToken = this.capabilityToken;
|
|
156
|
+
}
|
|
121
157
|
const request = {
|
|
122
158
|
v: PROTOCOL_VERSION,
|
|
123
159
|
op: 'handshake',
|
|
124
|
-
payload
|
|
160
|
+
payload,
|
|
125
161
|
};
|
|
126
162
|
this.socket.write(encodeFrame(request));
|
|
127
163
|
const response = await new Promise((resolve, reject) => {
|
|
@@ -142,7 +178,15 @@ export class ProxySocketClient {
|
|
|
142
178
|
};
|
|
143
179
|
});
|
|
144
180
|
if (response.ok !== true) {
|
|
145
|
-
|
|
181
|
+
if (response.code === 'UNAUTHORIZED') {
|
|
182
|
+
throw new Error('Credential proxy authentication failed: ' +
|
|
183
|
+
(response.error ?? 'invalid or missing capability token'));
|
|
184
|
+
}
|
|
185
|
+
const codeInfo = response.code ? ` [${response.code}]` : '';
|
|
186
|
+
throw new Error('Handshake failed' +
|
|
187
|
+
codeInfo +
|
|
188
|
+
': ' +
|
|
189
|
+
(response.error ?? 'unknown error'));
|
|
146
190
|
}
|
|
147
191
|
this.handshakeComplete = true;
|
|
148
192
|
this.resetIdleTimer();
|
|
@@ -151,19 +195,42 @@ export class ProxySocketClient {
|
|
|
151
195
|
try {
|
|
152
196
|
const frames = this.decoder.feed(chunk);
|
|
153
197
|
for (const frame of frames) {
|
|
154
|
-
if (this.
|
|
155
|
-
|
|
156
|
-
this.handshakeResolver = null;
|
|
157
|
-
resolver.resolve(frame);
|
|
158
|
-
continue;
|
|
159
|
-
}
|
|
160
|
-
this.resolvePendingRequest(frame);
|
|
198
|
+
if (this.processFrame(frame))
|
|
199
|
+
return;
|
|
161
200
|
}
|
|
162
201
|
}
|
|
163
202
|
catch {
|
|
164
203
|
this.destroy('Frame decode error');
|
|
165
204
|
}
|
|
166
205
|
}
|
|
206
|
+
/**
|
|
207
|
+
* Processes a single decoded frame. Returns true if the socket was
|
|
208
|
+
* destroyed and the caller should stop iterating.
|
|
209
|
+
*/
|
|
210
|
+
processFrame(frame) {
|
|
211
|
+
if (this.handshakeResolver) {
|
|
212
|
+
this.resolveHandshake(frame);
|
|
213
|
+
return this.socket === null;
|
|
214
|
+
}
|
|
215
|
+
this.resolvePendingRequest(frame);
|
|
216
|
+
return this.socket === null;
|
|
217
|
+
}
|
|
218
|
+
resolveHandshake(frame) {
|
|
219
|
+
const resolver = this.handshakeResolver;
|
|
220
|
+
if (resolver === null) {
|
|
221
|
+
return;
|
|
222
|
+
}
|
|
223
|
+
this.handshakeResolver = null;
|
|
224
|
+
if (isProxyResponseFrame(frame)) {
|
|
225
|
+
resolver.resolve(frame);
|
|
226
|
+
}
|
|
227
|
+
else {
|
|
228
|
+
// Reject first, then clean up. destroy() will not double-reject
|
|
229
|
+
// because handshakeResolver was already nulled above.
|
|
230
|
+
resolver.reject(new Error('Malformed handshake response from proxy'));
|
|
231
|
+
this.destroy('Malformed handshake response from proxy');
|
|
232
|
+
}
|
|
233
|
+
}
|
|
167
234
|
resolvePendingRequest(frame) {
|
|
168
235
|
const id = frame.id;
|
|
169
236
|
if (!id) {
|
|
@@ -173,7 +240,14 @@ export class ProxySocketClient {
|
|
|
173
240
|
if (pending) {
|
|
174
241
|
clearTimeout(pending.timer);
|
|
175
242
|
this.pendingRequests.delete(id);
|
|
176
|
-
|
|
243
|
+
if (isProxyResponseFrame(frame)) {
|
|
244
|
+
pending.resolve(frame);
|
|
245
|
+
}
|
|
246
|
+
else {
|
|
247
|
+
pending.reject(new Error(`Malformed response for request ${id}`));
|
|
248
|
+
this.destroy('Malformed response from proxy — connection reset');
|
|
249
|
+
return;
|
|
250
|
+
}
|
|
177
251
|
}
|
|
178
252
|
}
|
|
179
253
|
onError(_err) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proxy-socket-client.js","sourceRoot":"","sources":["../../../../../auth/src/proxy/proxy-socket-client.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;;;GAMG;AAEH,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAChC,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEzD,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,CAAC;AACxC,MAAM,CAAC,MAAM,eAAe,GAAG,MAAM,CAAC;AACtC,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"proxy-socket-client.js","sourceRoot":"","sources":["../../../../../auth/src/proxy/proxy-socket-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,7 +16,7 @@ import { type TokenStore } from '../token-store.js';
|
|
|
16
16
|
import { ProxySocketClient } from './proxy-socket-client.js';
|
|
17
17
|
export declare class ProxyTokenStore implements TokenStore {
|
|
18
18
|
private readonly client;
|
|
19
|
-
constructor(socketPath: string);
|
|
19
|
+
constructor(socketPath: string, capabilityToken?: string);
|
|
20
20
|
getToken(provider: string, bucket?: string): Promise<OAuthToken | null>;
|
|
21
21
|
saveToken(provider: string, token: OAuthToken, bucket?: string): Promise<void>;
|
|
22
22
|
removeToken(provider: string, bucket?: string): Promise<void>;
|
|
@@ -6,8 +6,8 @@
|
|
|
6
6
|
import { ProxySocketClient } from './proxy-socket-client.js';
|
|
7
7
|
export class ProxyTokenStore {
|
|
8
8
|
client;
|
|
9
|
-
constructor(socketPath) {
|
|
10
|
-
this.client = new ProxySocketClient(socketPath);
|
|
9
|
+
constructor(socketPath, capabilityToken) {
|
|
10
|
+
this.client = new ProxySocketClient(socketPath, capabilityToken);
|
|
11
11
|
}
|
|
12
12
|
async getToken(provider, bucket) {
|
|
13
13
|
const response = await this.client.request('get_token', {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proxy-token-store.js","sourceRoot":"","sources":["../../../../../auth/src/proxy/proxy-token-store.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAaH,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE7D,MAAM,OAAO,eAAe;IACT,MAAM,CAAoB;IAE3C,YAAY,UAAkB;
|
|
1
|
+
{"version":3,"file":"proxy-token-store.js","sourceRoot":"","sources":["../../../../../auth/src/proxy/proxy-token-store.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAaH,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE7D,MAAM,OAAO,eAAe;IACT,MAAM,CAAoB;IAE3C,YAAY,UAAkB,EAAE,eAAwB;QACtD,IAAI,CAAC,MAAM,GAAG,IAAI,iBAAiB,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;IACnE,CAAC;IAED,KAAK,CAAC,QAAQ,CACZ,QAAgB,EAChB,MAAe;QAEf,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE;YACtD,QAAQ;YACR,MAAM;SACP,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,QAAQ,CAAC,IAAI,KAAK,WAAW;YAAE,OAAO,IAAI,CAAC;QAC/D,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,IAAI,aAAa,CAAC,CAAC;QACnE,OAAO,QAAQ,CAAC,IAA6B,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,SAAS,CACb,QAAgB,EAChB,KAAiB,EACjB,MAAe;QAEf,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,EAAE;YACvD,QAAQ;YACR,MAAM;YACN,KAAK;SACN,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,IAAI,aAAa,CAAC,CAAC;IACrE,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,QAAgB,EAAE,MAAe;QACjD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,cAAc,EAAE;YACzD,QAAQ;YACR,MAAM;SACP,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,IAAI,aAAa,CAAC,CAAC;IACrE,CAAC;IAED,KAAK,CAAC,aAAa;QACjB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC;QACjE,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,IAAI,aAAa,CAAC,CAAC;QACnE,OAAQ,QAAQ,CAAC,IAAgC,CAAC,SAAqB,CAAC;IAC1E,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,QAAgB;QAChC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;QACzE,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,IAAI,aAAa,CAAC,CAAC;QACnE,OAAQ,QAAQ,CAAC,IAAgC,CAAC,OAAmB,CAAC;IACxE,CAAC;IAED,KAAK,CAAC,cAAc,CAClB,QAAgB,EAChB,MAAc;QAEd,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,kBAAkB,EAAE;YAC7D,QAAQ;YACR,MAAM;SACP,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,QAAQ,CAAC,IAAI,KAAK,WAAW;YAAE,OAAO,IAAI,CAAC;QAC/D,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,IAAI,aAAa,CAAC,CAAC;QACnE,MAAM,IAAI,GAAG,QAAQ,CAAC,IAA+B,CAAC;QACtD,OAAO;YACL,MAAM;YACN,YAAY,EACV,OAAO,IAAI,CAAC,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAC/D,UAAU,EAAE,OAAO,IAAI,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YACrE,QAAQ,EAAE,IAAI,CAAC,QAA8B;SAC9C,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,kBAAkB,CACtB,SAAiB,EACjB,QAA+C;QAE/C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,SAAiB,EAAE,OAAgB;QAC1D,8CAA8C;IAChD,CAAC;IAED,KAAK,CAAC,eAAe,CACnB,SAAiB,EACjB,QAA+C;QAE/C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,SAAiB,EAAE,OAAgB;QACvD,2CAA2C;IAC7C,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;CACF"}
|
|
@@ -19,6 +19,7 @@ import type { ShellExecutionConfig } from '../services/shellExecutionService.js'
|
|
|
19
19
|
import type { ToolSchedulerContract } from '../core/toolSchedulerContract.js';
|
|
20
20
|
export declare class Config extends ConfigBase {
|
|
21
21
|
private static readonly logger;
|
|
22
|
+
private readonly liveTrustTransitionLifecycle;
|
|
22
23
|
constructor(params: ConfigParameters);
|
|
23
24
|
private mcpDiscoveryPromise;
|
|
24
25
|
private initializationPromise;
|
|
@@ -80,6 +81,13 @@ export declare class Config extends ConfigBase {
|
|
|
80
81
|
* 'false' for untrusted.
|
|
81
82
|
*/
|
|
82
83
|
isTrustedFolder(): boolean;
|
|
84
|
+
getIdeTrust(): boolean | undefined;
|
|
85
|
+
/**
|
|
86
|
+
* Updates the local trust fallback. IDE trust remains authoritative, so this
|
|
87
|
+
* only triggers a transition when the effective trust value changes.
|
|
88
|
+
*/
|
|
89
|
+
setTrustedFolderLive(trusted: boolean): Promise<void>;
|
|
90
|
+
private reconcileEffectiveTrust;
|
|
83
91
|
setPtyTerminalSize(width: number | undefined, height: number | undefined): void;
|
|
84
92
|
getShellExecutionConfig(): ShellExecutionConfig;
|
|
85
93
|
getJitContextEnabled(): boolean;
|
|
@@ -136,6 +144,18 @@ export declare class Config extends ConfigBase {
|
|
|
136
144
|
* @requirement:HOOK-010 - Zero CPU/memory overhead when hooks are disabled
|
|
137
145
|
*/
|
|
138
146
|
getHookSystem(): HookSystem | undefined;
|
|
147
|
+
private ideTrust;
|
|
148
|
+
private cachedEffectiveTrust;
|
|
149
|
+
/**
|
|
150
|
+
* Resolves once any pending trust-transition side-effects have settled.
|
|
151
|
+
*/
|
|
152
|
+
whenTrustTransitionSettled(): Promise<void>;
|
|
153
|
+
private ideTrustChangeListener;
|
|
154
|
+
/**
|
|
155
|
+
* Subscribes to live IDE trust changes so that MCP servers, hooks, and
|
|
156
|
+
* approval mode are updated immediately without requiring a restart.
|
|
157
|
+
*/
|
|
158
|
+
private registerIdeTrustListener;
|
|
139
159
|
dispose(): Promise<void>;
|
|
140
160
|
}
|
|
141
161
|
export { type SchedulerCallbacks, type SchedulerOptions };
|
|
@@ -23,6 +23,7 @@ import { applyConfigParams, } from './configConstructor.js';
|
|
|
23
23
|
import { ConfigBase } from './configBase.js';
|
|
24
24
|
import { buildNewContentGeneratorConfig, createDetachedAgentClient, disposePreviousAgentClient, extractExistingState, requireAgentClientFactory, transferHistoryToNewClient, } from './agentClientLifecycle.js';
|
|
25
25
|
import { getOrCreateAsyncTaskManager, getOrCreateAsyncTaskReminderService, setupAsyncTaskAutoTrigger, } from './asyncTaskServices.js';
|
|
26
|
+
import { LiveTrustTransitionLifecycle } from './liveTrustTransitionLifecycle.js';
|
|
26
27
|
import { parseSettingsSubagentDefinitions } from './subagentSettingsParser.js';
|
|
27
28
|
import { ApprovalMode, } from './configTypes.js';
|
|
28
29
|
// Re-export all types for backward compatibility
|
|
@@ -32,12 +33,40 @@ export { DEFAULT_FILE_FILTERING_OPTIONS, DEFAULT_MEMORY_FILE_FILTERING_OPTIONS,
|
|
|
32
33
|
import { coreEvents, CoreEvent } from '../utils/events.js';
|
|
33
34
|
import { McpClientManager } from '@vybestack/llxprt-code-mcp';
|
|
34
35
|
import { getCoreVersion } from '../utils/version.js';
|
|
36
|
+
import { buildMcpTrustedRules, MCP_TRUSTED_POLICY_SOURCE, } from '../policy/config.js';
|
|
35
37
|
export class Config extends ConfigBase {
|
|
36
38
|
static logger = new DebugLogger('llxprt:config');
|
|
39
|
+
liveTrustTransitionLifecycle;
|
|
37
40
|
constructor(params) {
|
|
38
41
|
super();
|
|
39
42
|
applyConfigParams(this, params);
|
|
40
43
|
this.syncModeDerivedPolicyRules(this.approvalMode);
|
|
44
|
+
this.cachedEffectiveTrust = this.isTrustedFolder();
|
|
45
|
+
this.liveTrustTransitionLifecycle = new LiveTrustTransitionLifecycle({
|
|
46
|
+
downgradeApprovalMode: () => {
|
|
47
|
+
if (this.approvalMode !== ApprovalMode.DEFAULT) {
|
|
48
|
+
this.approvalMode = ApprovalMode.DEFAULT;
|
|
49
|
+
}
|
|
50
|
+
},
|
|
51
|
+
removeTrustedPolicyRules: () => this.policyEngine.removeRulesBySource(MCP_TRUSTED_POLICY_SOURCE),
|
|
52
|
+
updateTrustPolicy: (trusted) => {
|
|
53
|
+
if (trusted) {
|
|
54
|
+
for (const rule of buildMcpTrustedRules({
|
|
55
|
+
mcpServers: this.getMcpServers(),
|
|
56
|
+
})) {
|
|
57
|
+
this.policyEngine.addRule(rule);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
this.mcpClientManager?.quarantineForTrustRevocation();
|
|
62
|
+
}
|
|
63
|
+
},
|
|
64
|
+
transitionMcp: (trusted) => trusted
|
|
65
|
+
? this.mcpClientManager?.onFolderTrustGained()
|
|
66
|
+
: this.mcpClientManager?.onFolderTrustRevoked(),
|
|
67
|
+
initializeHooks: (signal) => this.getHookSystem()?.initialize(signal),
|
|
68
|
+
emitTrustChanged: (trusted) => coreEvents.emitFolderTrustChanged(trusted),
|
|
69
|
+
});
|
|
41
70
|
}
|
|
42
71
|
// Issue #2325: Background MCP discovery promise started in initialize() so
|
|
43
72
|
// startup is not blocked. Awaited in dispose() to avoid tearing down servers
|
|
@@ -72,7 +101,7 @@ export class Config extends ConfigBase {
|
|
|
72
101
|
if (!initializationMessageBus) {
|
|
73
102
|
throw new Error('Config.initialize requires an explicit session/runtime MessageBus dependency.');
|
|
74
103
|
}
|
|
75
|
-
this.
|
|
104
|
+
this.cachedEffectiveTrust = this.isTrustedFolder();
|
|
76
105
|
this.ideClient = await IdeClient.getInstance();
|
|
77
106
|
// Initialize centralized FileDiscoveryService
|
|
78
107
|
this.getFileService();
|
|
@@ -83,6 +112,8 @@ export class Config extends ConfigBase {
|
|
|
83
112
|
this.resourceRegistry = new ResourceRegistry();
|
|
84
113
|
this.toolRegistry = await this.createToolRegistry(initializationMessageBus);
|
|
85
114
|
this.mcpClientManager = new McpClientManager(await getCoreVersion(), this.toolRegistry, this, this.eventEmitter);
|
|
115
|
+
this.registerIdeTrustListener();
|
|
116
|
+
this.initialized = true;
|
|
86
117
|
// Issue #2325: Fire MCP discovery in the background — don't block startup.
|
|
87
118
|
// Tools are gated before model turns via McpClientManager.whenDiscoverySettled().
|
|
88
119
|
this.mcpDiscoveryPromise =
|
|
@@ -368,21 +399,30 @@ export class Config extends ConfigBase {
|
|
|
368
399
|
* 'false' for untrusted.
|
|
369
400
|
*/
|
|
370
401
|
isTrustedFolder() {
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
const
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
402
|
+
return this.getIdeTrust() ?? this.trustedFolder ?? true;
|
|
403
|
+
}
|
|
404
|
+
getIdeTrust() {
|
|
405
|
+
return (this.ideTrust ?? ideContext.getIdeContext()?.workspaceState?.isTrusted);
|
|
406
|
+
}
|
|
407
|
+
/**
|
|
408
|
+
* Updates the local trust fallback. IDE trust remains authoritative, so this
|
|
409
|
+
* only triggers a transition when the effective trust value changes.
|
|
410
|
+
*/
|
|
411
|
+
setTrustedFolderLive(trusted) {
|
|
412
|
+
const previousEffectiveTrust = this.isTrustedFolder();
|
|
413
|
+
this.trustedFolder = trusted;
|
|
414
|
+
if (!this.initialized) {
|
|
415
|
+
return Promise.resolve();
|
|
416
|
+
}
|
|
417
|
+
return this.reconcileEffectiveTrust(previousEffectiveTrust);
|
|
418
|
+
}
|
|
419
|
+
reconcileEffectiveTrust(previousEffectiveTrust) {
|
|
420
|
+
const effectiveTrust = this.isTrustedFolder();
|
|
421
|
+
this.cachedEffectiveTrust = effectiveTrust;
|
|
422
|
+
if (previousEffectiveTrust !== effectiveTrust) {
|
|
423
|
+
return this.liveTrustTransitionLifecycle.apply(effectiveTrust);
|
|
424
|
+
}
|
|
425
|
+
return Promise.resolve();
|
|
386
426
|
}
|
|
387
427
|
setPtyTerminalSize(width, height) {
|
|
388
428
|
if (typeof width === 'number' && Number.isFinite(width) && width > 0) {
|
|
@@ -560,10 +600,83 @@ export class Config extends ConfigBase {
|
|
|
560
600
|
this.hookSystem ??= new HookSystem(this);
|
|
561
601
|
return this.hookSystem;
|
|
562
602
|
}
|
|
603
|
+
ideTrust;
|
|
604
|
+
cachedEffectiveTrust;
|
|
605
|
+
/**
|
|
606
|
+
* Resolves once any pending trust-transition side-effects have settled.
|
|
607
|
+
*/
|
|
608
|
+
async whenTrustTransitionSettled() {
|
|
609
|
+
await this.liveTrustTransitionLifecycle.whenSettled();
|
|
610
|
+
}
|
|
611
|
+
ideTrustChangeListener;
|
|
612
|
+
/**
|
|
613
|
+
* Subscribes to live IDE trust changes so that MCP servers, hooks, and
|
|
614
|
+
* approval mode are updated immediately without requiring a restart.
|
|
615
|
+
*/
|
|
616
|
+
registerIdeTrustListener() {
|
|
617
|
+
const client = this.ideClient;
|
|
618
|
+
const previousEffectiveTrust = this.cachedEffectiveTrust;
|
|
619
|
+
this.ideTrust = ideContext.getIdeContext()?.workspaceState?.isTrusted;
|
|
620
|
+
if (client && typeof client.addTrustChangeListener === 'function') {
|
|
621
|
+
this.ideTrustChangeListener = (isTrusted) => {
|
|
622
|
+
const priorEffectiveTrust = this.cachedEffectiveTrust;
|
|
623
|
+
this.ideTrust = isTrusted;
|
|
624
|
+
void this.reconcileEffectiveTrust(priorEffectiveTrust).catch((error) => {
|
|
625
|
+
Config.logger.error(`IDE trust reconciliation failed: ${getErrorMessage(error)}`);
|
|
626
|
+
});
|
|
627
|
+
};
|
|
628
|
+
client.addTrustChangeListener(this.ideTrustChangeListener);
|
|
629
|
+
}
|
|
630
|
+
void this.reconcileEffectiveTrust(previousEffectiveTrust).catch((error) => {
|
|
631
|
+
Config.logger.error(`IDE trust reconciliation failed: ${getErrorMessage(error)}`);
|
|
632
|
+
});
|
|
633
|
+
}
|
|
563
634
|
async dispose() {
|
|
635
|
+
const failures = [];
|
|
636
|
+
try {
|
|
637
|
+
this.liveTrustTransitionLifecycle.beginDisposal();
|
|
638
|
+
}
|
|
639
|
+
catch (error) {
|
|
640
|
+
failures.push(error);
|
|
641
|
+
}
|
|
642
|
+
if (this.ideTrustChangeListener &&
|
|
643
|
+
this.ideClient &&
|
|
644
|
+
typeof this.ideClient.removeTrustChangeListener === 'function') {
|
|
645
|
+
try {
|
|
646
|
+
this.ideClient.removeTrustChangeListener(this.ideTrustChangeListener);
|
|
647
|
+
}
|
|
648
|
+
catch (error) {
|
|
649
|
+
failures.push(error);
|
|
650
|
+
}
|
|
651
|
+
this.ideTrustChangeListener = undefined;
|
|
652
|
+
}
|
|
653
|
+
// Initiate MCP shutdown before awaiting trust-transition settlement so
|
|
654
|
+
// in-flight MCP work is cancelled and cannot block disposal.
|
|
655
|
+
const stopPromise = this.mcpClientManager?.stop();
|
|
656
|
+
try {
|
|
657
|
+
await this.whenTrustTransitionSettled();
|
|
658
|
+
}
|
|
659
|
+
catch (error) {
|
|
660
|
+
failures.push(error);
|
|
661
|
+
}
|
|
564
662
|
const client = this.agentClient;
|
|
565
663
|
if (client !== undefined) {
|
|
566
|
-
|
|
664
|
+
try {
|
|
665
|
+
client.dispose();
|
|
666
|
+
}
|
|
667
|
+
catch (error) {
|
|
668
|
+
failures.push(error);
|
|
669
|
+
}
|
|
670
|
+
}
|
|
671
|
+
if (this.hookSystem !== undefined) {
|
|
672
|
+
const hookSystem = this.hookSystem;
|
|
673
|
+
this.hookSystem = undefined;
|
|
674
|
+
try {
|
|
675
|
+
hookSystem.dispose();
|
|
676
|
+
}
|
|
677
|
+
catch (error) {
|
|
678
|
+
failures.push(error);
|
|
679
|
+
}
|
|
567
680
|
}
|
|
568
681
|
if (this.mcpDiscoveryPromise !== undefined) {
|
|
569
682
|
try {
|
|
@@ -573,12 +686,19 @@ export class Config extends ConfigBase {
|
|
|
573
686
|
Config.logger.warn(`MCP discovery rejected during dispose: ${getErrorMessage(error)}`);
|
|
574
687
|
}
|
|
575
688
|
}
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
689
|
+
if (stopPromise !== undefined) {
|
|
690
|
+
try {
|
|
691
|
+
await stopPromise;
|
|
692
|
+
}
|
|
693
|
+
catch (error) {
|
|
694
|
+
failures.push(error);
|
|
695
|
+
}
|
|
696
|
+
}
|
|
697
|
+
if (failures.length === 1) {
|
|
698
|
+
throw failures[0];
|
|
699
|
+
}
|
|
700
|
+
if (failures.length > 1) {
|
|
701
|
+
throw new AggregateError(failures, 'Config disposal failed');
|
|
582
702
|
}
|
|
583
703
|
}
|
|
584
704
|
}
|