@vybestack/llxprt-code-core 0.1.18 → 0.1.19-alpha
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 +1 -0
- package/dist/src/config/config.alwaysAllow.test.d.ts +6 -0
- package/dist/src/config/config.alwaysAllow.test.js +84 -0
- package/dist/src/config/config.alwaysAllow.test.js.map +1 -0
- package/dist/src/config/config.d.ts +26 -0
- package/dist/src/config/config.js +43 -0
- package/dist/src/config/config.js.map +1 -1
- package/dist/src/config/config.test.js +8 -0
- package/dist/src/config/config.test.js.map +1 -1
- package/dist/src/core/client.d.ts +0 -2
- package/dist/src/core/client.js +10 -85
- package/dist/src/core/client.js.map +1 -1
- package/dist/src/core/client.test.js +7 -2
- package/dist/src/core/client.test.js.map +1 -1
- package/dist/src/core/contentGenerator.js +1 -1
- package/dist/src/core/contentGenerator.js.map +1 -1
- package/dist/src/core/coreToolScheduler.d.ts +17 -7
- package/dist/src/core/coreToolScheduler.js +121 -18
- package/dist/src/core/coreToolScheduler.js.map +1 -1
- package/dist/src/core/coreToolScheduler.test.js +25 -37
- package/dist/src/core/coreToolScheduler.test.js.map +1 -1
- package/dist/src/core/geminiChat.d.ts +3 -0
- package/dist/src/core/geminiChat.js +17 -13
- package/dist/src/core/geminiChat.js.map +1 -1
- package/dist/src/core/nonInteractiveToolExecutor.js +4 -1
- package/dist/src/core/nonInteractiveToolExecutor.js.map +1 -1
- package/dist/src/core/nonInteractiveToolExecutor.test.js +8 -31
- package/dist/src/core/nonInteractiveToolExecutor.test.js.map +1 -1
- package/dist/src/core/subagent.d.ts +230 -0
- package/dist/src/core/subagent.js +453 -0
- package/dist/src/core/subagent.js.map +1 -0
- package/dist/src/core/subagent.test.d.ts +6 -0
- package/dist/src/core/subagent.test.js +519 -0
- package/dist/src/core/subagent.test.js.map +1 -0
- package/dist/src/hooks/tool-render-suppression-hook.d.ts +16 -0
- package/dist/src/hooks/tool-render-suppression-hook.js +26 -0
- package/dist/src/hooks/tool-render-suppression-hook.js.map +1 -0
- package/dist/src/hooks/tool-render-suppression-hook.test.d.ts +6 -0
- package/dist/src/hooks/tool-render-suppression-hook.test.js +59 -0
- package/dist/src/hooks/tool-render-suppression-hook.test.js.map +1 -0
- package/dist/src/ide/ide-client.d.ts +22 -1
- package/dist/src/ide/ide-client.js +145 -15
- package/dist/src/ide/ide-client.js.map +1 -1
- package/dist/src/ide/ideContext.d.ts +127 -32
- package/dist/src/ide/ideContext.js +45 -0
- package/dist/src/ide/ideContext.js.map +1 -1
- package/dist/src/index.d.ts +3 -0
- package/dist/src/index.js +3 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/integration-tests/todo-system.test.js +38 -602
- package/dist/src/integration-tests/todo-system.test.js.map +1 -1
- package/dist/src/providers/gemini/GeminiProvider.js +5 -5
- package/dist/src/providers/gemini/GeminiProvider.js.map +1 -1
- package/dist/src/providers/openai/OpenAIProvider.js +8 -1
- package/dist/src/providers/openai/OpenAIProvider.js.map +1 -1
- package/dist/src/providers/openai/OpenAIProvider.test.js +106 -0
- package/dist/src/providers/openai/OpenAIProvider.test.js.map +1 -1
- package/dist/src/providers/types/IProviderConfig.d.ts +5 -0
- package/dist/src/services/shellExecutionService.js +29 -5
- package/dist/src/services/shellExecutionService.js.map +1 -1
- package/dist/src/services/shellExecutionService.test.js +8 -0
- package/dist/src/services/shellExecutionService.test.js.map +1 -1
- package/dist/src/services/todo-context-tracker.d.ts +31 -0
- package/dist/src/services/todo-context-tracker.js +45 -0
- package/dist/src/services/todo-context-tracker.js.map +1 -0
- package/dist/src/services/tool-call-tracker-service.d.ts +52 -0
- package/dist/src/services/tool-call-tracker-service.js +170 -0
- package/dist/src/services/tool-call-tracker-service.js.map +1 -0
- package/dist/src/services/tool-call-tracker-service.test.d.ts +6 -0
- package/dist/src/services/tool-call-tracker-service.test.js +99 -0
- package/dist/src/services/tool-call-tracker-service.test.js.map +1 -0
- package/dist/src/telemetry/loggers.test.circular.js +7 -2
- package/dist/src/telemetry/loggers.test.circular.js.map +1 -1
- package/dist/src/telemetry/loggers.test.js +5 -1
- package/dist/src/telemetry/loggers.test.js.map +1 -1
- package/dist/src/telemetry/metrics.d.ts +1 -1
- package/dist/src/telemetry/metrics.js.map +1 -1
- package/dist/src/telemetry/types.d.ts +2 -1
- package/dist/src/telemetry/types.js +3 -1
- package/dist/src/telemetry/types.js.map +1 -1
- package/dist/src/telemetry/uiTelemetry.d.ts +2 -0
- package/dist/src/telemetry/uiTelemetry.js +2 -0
- package/dist/src/telemetry/uiTelemetry.js.map +1 -1
- package/dist/src/telemetry/uiTelemetry.test.js +11 -1
- package/dist/src/telemetry/uiTelemetry.test.js.map +1 -1
- package/dist/src/test-utils/tools.d.ts +23 -0
- package/dist/src/test-utils/tools.js +41 -0
- package/dist/src/test-utils/tools.js.map +1 -0
- package/dist/src/tools/edit.d.ts +5 -33
- package/dist/src/tools/edit.js +129 -124
- package/dist/src/tools/edit.js.map +1 -1
- package/dist/src/tools/edit.test.js +123 -50
- package/dist/src/tools/edit.test.js.map +1 -1
- package/dist/src/tools/glob.d.ts +3 -10
- package/dist/src/tools/glob.js +97 -99
- package/dist/src/tools/glob.js.map +1 -1
- package/dist/src/tools/glob.test.js +37 -26
- package/dist/src/tools/glob.test.js.map +1 -1
- package/dist/src/tools/grep.d.ts +3 -35
- package/dist/src/tools/grep.js +117 -88
- package/dist/src/tools/grep.js.map +1 -1
- package/dist/src/tools/grep.test.js +36 -22
- package/dist/src/tools/grep.test.js.map +1 -1
- package/dist/src/tools/mcp-client.d.ts +10 -0
- package/dist/src/tools/mcp-client.js +59 -0
- package/dist/src/tools/mcp-client.js.map +1 -1
- package/dist/src/tools/mcp-client.test.js +294 -1
- package/dist/src/tools/mcp-client.test.js.map +1 -1
- package/dist/src/tools/memoryTool.d.ts +2 -2
- package/dist/src/tools/memoryTool.js +1 -0
- package/dist/src/tools/memoryTool.js.map +1 -1
- package/dist/src/tools/modifiable-tool.d.ts +8 -5
- package/dist/src/tools/modifiable-tool.js +4 -1
- package/dist/src/tools/modifiable-tool.js.map +1 -1
- package/dist/src/tools/modifiable-tool.test.js +3 -3
- package/dist/src/tools/modifiable-tool.test.js.map +1 -1
- package/dist/src/tools/read-file.d.ts +4 -6
- package/dist/src/tools/read-file.js +55 -46
- package/dist/src/tools/read-file.js.map +1 -1
- package/dist/src/tools/read-file.test.js +201 -126
- package/dist/src/tools/read-file.test.js.map +1 -1
- package/dist/src/tools/read-many-files.js +8 -2
- package/dist/src/tools/read-many-files.js.map +1 -1
- package/dist/src/tools/read-many-files.test.js +16 -0
- package/dist/src/tools/read-many-files.test.js.map +1 -1
- package/dist/src/tools/todo-events.d.ts +22 -0
- package/dist/src/tools/todo-events.js +24 -0
- package/dist/src/tools/todo-events.js.map +1 -0
- package/dist/src/tools/todo-read.js.map +1 -1
- package/dist/src/tools/todo-schemas.d.ts +232 -4
- package/dist/src/tools/todo-schemas.js +13 -0
- package/dist/src/tools/todo-schemas.js.map +1 -1
- package/dist/src/tools/todo-schemas.test.js +190 -1
- package/dist/src/tools/todo-schemas.test.js.map +1 -1
- package/dist/src/tools/todo-store.d.ts +1 -4
- package/dist/src/tools/todo-store.js +41 -40
- package/dist/src/tools/todo-store.js.map +1 -1
- package/dist/src/tools/todo-store.test.js +34 -40
- package/dist/src/tools/todo-store.test.js.map +1 -1
- package/dist/src/tools/todo-write.d.ts +1 -1
- package/dist/src/tools/todo-write.js +84 -47
- package/dist/src/tools/todo-write.js.map +1 -1
- package/dist/src/tools/todo-write.test.js +23 -9
- package/dist/src/tools/todo-write.test.js.map +1 -1
- package/dist/src/tools/tool-context.d.ts +2 -0
- package/dist/src/tools/tool-registry.d.ts +12 -6
- package/dist/src/tools/tool-registry.js +16 -1
- package/dist/src/tools/tool-registry.js.map +1 -1
- package/dist/src/tools/tool-registry.test.js +1 -18
- package/dist/src/tools/tool-registry.test.js.map +1 -1
- package/dist/src/tools/tools.d.ts +127 -39
- package/dist/src/tools/tools.js +115 -10
- package/dist/src/tools/tools.js.map +1 -1
- package/dist/src/tools/write-file.d.ts +2 -2
- package/dist/src/tools/write-file.js +16 -0
- package/dist/src/tools/write-file.js.map +1 -1
- package/dist/src/tools/write-file.test.js +20 -3
- package/dist/src/tools/write-file.test.js.map +1 -1
- package/dist/src/types/modelParams.d.ts +2 -0
- package/dist/src/utils/environmentContext.d.ts +21 -0
- package/dist/src/utils/environmentContext.js +90 -0
- package/dist/src/utils/environmentContext.js.map +1 -0
- package/dist/src/utils/environmentContext.test.d.ts +6 -0
- package/dist/src/utils/environmentContext.test.js +139 -0
- package/dist/src/utils/environmentContext.test.js.map +1 -0
- package/dist/src/utils/fileUtils.js +2 -10
- package/dist/src/utils/fileUtils.js.map +1 -1
- package/dist/src/utils/fileUtils.test.js +1 -4
- package/dist/src/utils/fileUtils.test.js.map +1 -1
- package/dist/src/utils/filesearch/fileSearch.d.ts +1 -0
- package/dist/src/utils/filesearch/fileSearch.js +27 -5
- package/dist/src/utils/filesearch/fileSearch.js.map +1 -1
- package/dist/src/utils/filesearch/fileSearch.test.js +21 -1
- package/dist/src/utils/filesearch/fileSearch.test.js.map +1 -1
- package/dist/src/utils/memoryDiscovery.js +4 -1
- package/dist/src/utils/memoryDiscovery.js.map +1 -1
- package/dist/src/utils/shell-utils.js +14 -2
- package/dist/src/utils/shell-utils.js.map +1 -1
- package/dist/src/utils/shell-utils.shellReplacement.test.d.ts +6 -0
- package/dist/src/utils/shell-utils.shellReplacement.test.js +149 -0
- package/dist/src/utils/shell-utils.shellReplacement.test.js.map +1 -0
- package/package.json +2 -1
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Vybestack LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { describe, it, expect, beforeEach, vi } from 'vitest';
|
|
7
|
+
import { ToolRenderSuppressionHook } from '../hooks/tool-render-suppression-hook.js';
|
|
8
|
+
import { TodoContextTracker } from '../services/todo-context-tracker.js';
|
|
9
|
+
import { Config } from '../config/config.js';
|
|
10
|
+
// Mock Config class
|
|
11
|
+
vi.mock('../config/config.js', () => ({
|
|
12
|
+
Config: vi.fn().mockImplementation((params) => ({
|
|
13
|
+
getSessionId: vi
|
|
14
|
+
.fn()
|
|
15
|
+
.mockReturnValue(params.sessionId || 'default-session'),
|
|
16
|
+
})),
|
|
17
|
+
}));
|
|
18
|
+
describe('ToolRenderSuppressionHook', () => {
|
|
19
|
+
const sessionId = 'test-session';
|
|
20
|
+
const todoId = 'test-todo';
|
|
21
|
+
beforeEach(() => {
|
|
22
|
+
// Reset the context tracker
|
|
23
|
+
const contextTracker = TodoContextTracker.forSession(sessionId);
|
|
24
|
+
contextTracker.clearActiveTodo();
|
|
25
|
+
});
|
|
26
|
+
it('should suppress rendering when there is an active todo', () => {
|
|
27
|
+
// Set up the context tracker with an active todo
|
|
28
|
+
const contextTracker = TodoContextTracker.forSession(sessionId);
|
|
29
|
+
contextTracker.setActiveTodo(todoId);
|
|
30
|
+
// Create a mock config
|
|
31
|
+
const config = new Config({
|
|
32
|
+
sessionId,
|
|
33
|
+
targetDir: '/test',
|
|
34
|
+
debugMode: false,
|
|
35
|
+
cwd: '/test',
|
|
36
|
+
model: 'test-model',
|
|
37
|
+
});
|
|
38
|
+
// Check if rendering should be suppressed
|
|
39
|
+
const shouldSuppress = ToolRenderSuppressionHook.shouldSuppressToolCallRender(config);
|
|
40
|
+
expect(shouldSuppress).toBe(true);
|
|
41
|
+
});
|
|
42
|
+
it('should not suppress rendering when there is no active todo', () => {
|
|
43
|
+
// Ensure there is no active todo
|
|
44
|
+
const contextTracker = TodoContextTracker.forSession(sessionId);
|
|
45
|
+
contextTracker.clearActiveTodo();
|
|
46
|
+
// Create a mock config
|
|
47
|
+
const config = new Config({
|
|
48
|
+
sessionId,
|
|
49
|
+
targetDir: '/test',
|
|
50
|
+
debugMode: false,
|
|
51
|
+
cwd: '/test',
|
|
52
|
+
model: 'test-model',
|
|
53
|
+
});
|
|
54
|
+
// Check if rendering should be suppressed
|
|
55
|
+
const shouldSuppress = ToolRenderSuppressionHook.shouldSuppressToolCallRender(config);
|
|
56
|
+
expect(shouldSuppress).toBe(false);
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
//# sourceMappingURL=tool-render-suppression-hook.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-render-suppression-hook.test.js","sourceRoot":"","sources":["../../../src/hooks/tool-render-suppression-hook.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9D,OAAO,EAAE,yBAAyB,EAAE,MAAM,0CAA0C,CAAC;AACrF,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AACzE,OAAO,EAAE,MAAM,EAAoB,MAAM,qBAAqB,CAAC;AAE/D,oBAAoB;AACpB,EAAE,CAAC,IAAI,CAAC,qBAAqB,EAAE,GAAG,EAAE,CAAC,CAAC;IACpC,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAC9C,YAAY,EAAE,EAAE;aACb,EAAE,EAAE;aACJ,eAAe,CAAC,MAAM,CAAC,SAAS,IAAI,iBAAiB,CAAC;KAC1D,CAAC,CAAC;CACJ,CAAC,CAAC,CAAC;AAEJ,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;IACzC,MAAM,SAAS,GAAG,cAAc,CAAC;IACjC,MAAM,MAAM,GAAG,WAAW,CAAC;IAE3B,UAAU,CAAC,GAAG,EAAE;QACd,4BAA4B;QAC5B,MAAM,cAAc,GAAG,kBAAkB,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QAChE,cAAc,CAAC,eAAe,EAAE,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,iDAAiD;QACjD,MAAM,cAAc,GAAG,kBAAkB,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QAChE,cAAc,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QAErC,uBAAuB;QACvB,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC;YACxB,SAAS;YACT,SAAS,EAAE,OAAO;YAClB,SAAS,EAAE,KAAK;YAChB,GAAG,EAAE,OAAO;YACZ,KAAK,EAAE,YAAY;SACA,CAAC,CAAC;QAEvB,0CAA0C;QAC1C,MAAM,cAAc,GAClB,yBAAyB,CAAC,4BAA4B,CAAC,MAAM,CAAC,CAAC;QAEjE,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4DAA4D,EAAE,GAAG,EAAE;QACpE,iCAAiC;QACjC,MAAM,cAAc,GAAG,kBAAkB,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QAChE,cAAc,CAAC,eAAe,EAAE,CAAC;QAEjC,uBAAuB;QACvB,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC;YACxB,SAAS;YACT,SAAS,EAAE,OAAO;YAClB,SAAS,EAAE,KAAK;YAChB,GAAG,EAAE,OAAO;YACZ,KAAK,EAAE,YAAY;SACA,CAAC,CAAC;QAEvB,0CAA0C;QAC1C,MAAM,cAAc,GAClB,yBAAyB,CAAC,4BAA4B,CAAC,MAAM,CAAC,CAAC;QAEjE,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
6
|
import { DetectedIde } from '../ide/detect-ide.js';
|
|
7
|
+
import { DiffUpdateResult } from '../ide/ideContext.js';
|
|
7
8
|
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
|
|
8
9
|
export type IDEConnectionState = {
|
|
9
10
|
status: IDEConnectionStatus;
|
|
@@ -23,10 +24,31 @@ export declare class IdeClient {
|
|
|
23
24
|
private static instance;
|
|
24
25
|
private readonly currentIde;
|
|
25
26
|
private readonly currentIdeDisplayName;
|
|
27
|
+
private diffResponses;
|
|
26
28
|
constructor(ideMode: boolean);
|
|
27
29
|
static getInstance(ideMode: boolean): IdeClient;
|
|
30
|
+
connect(): Promise<void>;
|
|
31
|
+
/**
|
|
32
|
+
* A diff is accepted with any modifications if the user performs one of the
|
|
33
|
+
* following actions:
|
|
34
|
+
* - Clicks the checkbox icon in the IDE to accept
|
|
35
|
+
* - Runs `command+shift+p` > "LLxprt Code: Accept Diff in IDE" to accept
|
|
36
|
+
* - Selects "accept" in the CLI UI
|
|
37
|
+
* - Saves the file via `ctrl/command+s`
|
|
38
|
+
*
|
|
39
|
+
* A diff is rejected if the user performs one of the following actions:
|
|
40
|
+
* - Clicks the "x" icon in the IDE
|
|
41
|
+
* - Runs "LLxprt Code: Close Diff in IDE"
|
|
42
|
+
* - Selects "no" in the CLI UI
|
|
43
|
+
* - Closes the file
|
|
44
|
+
*/
|
|
45
|
+
openDiff(filePath: string, newContent?: string): Promise<DiffUpdateResult>;
|
|
46
|
+
closeDiff(filePath: string): Promise<string | undefined>;
|
|
47
|
+
resolveDiffFromCli(filePath: string, outcome: 'accepted' | 'rejected'): Promise<void>;
|
|
48
|
+
disconnect(): void;
|
|
28
49
|
getCurrentIde(): DetectedIde | undefined;
|
|
29
50
|
getConnectionStatus(): IDEConnectionState;
|
|
51
|
+
getDetectedIdeDisplayName(): string | undefined;
|
|
30
52
|
private setState;
|
|
31
53
|
private getPortFromEnv;
|
|
32
54
|
private validateWorkspacePath;
|
|
@@ -35,6 +57,5 @@ export declare class IdeClient {
|
|
|
35
57
|
private establishConnection;
|
|
36
58
|
init(): Promise<void>;
|
|
37
59
|
dispose(): void;
|
|
38
|
-
getDetectedIdeDisplayName(): string | undefined;
|
|
39
60
|
setDisconnected(): void;
|
|
40
61
|
}
|
|
@@ -3,13 +3,16 @@
|
|
|
3
3
|
* Copyright 2025 Google LLC
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
|
-
import
|
|
7
|
-
import {
|
|
6
|
+
import * as fs from 'node:fs';
|
|
7
|
+
import { detectIde, DetectedIde, getIdeDisplayName, } from '../ide/detect-ide.js';
|
|
8
|
+
import { ideContext, IdeContextNotificationSchema, IdeDiffAcceptedNotificationSchema, IdeDiffClosedNotificationSchema, CloseDiffResponseSchema, } from '../ide/ideContext.js';
|
|
8
9
|
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
|
|
9
10
|
import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
|
|
10
11
|
const logger = {
|
|
11
12
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
12
13
|
debug: (...args) => console.debug('[DEBUG] [IDEClient]', ...args),
|
|
14
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
15
|
+
error: (...args) => console.error('[ERROR] [IDEClient]', ...args),
|
|
13
16
|
};
|
|
14
17
|
export var IDEConnectionStatus;
|
|
15
18
|
(function (IDEConnectionStatus) {
|
|
@@ -17,6 +20,16 @@ export var IDEConnectionStatus;
|
|
|
17
20
|
IDEConnectionStatus["Disconnected"] = "disconnected";
|
|
18
21
|
IDEConnectionStatus["Connecting"] = "connecting";
|
|
19
22
|
})(IDEConnectionStatus || (IDEConnectionStatus = {}));
|
|
23
|
+
function getRealPath(path) {
|
|
24
|
+
try {
|
|
25
|
+
return fs.realpathSync(path);
|
|
26
|
+
}
|
|
27
|
+
catch (_e) {
|
|
28
|
+
// If realpathSync fails, it might be because the path doesn't exist.
|
|
29
|
+
// In that case, we can fall back to the original path.
|
|
30
|
+
return path;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
20
33
|
/**
|
|
21
34
|
* Manages the connection to and interaction with the IDE server.
|
|
22
35
|
*/
|
|
@@ -28,6 +41,7 @@ export class IdeClient {
|
|
|
28
41
|
static instance;
|
|
29
42
|
currentIde;
|
|
30
43
|
currentIdeDisplayName;
|
|
44
|
+
diffResponses = new Map();
|
|
31
45
|
constructor(ideMode) {
|
|
32
46
|
this.currentIde = detectIde();
|
|
33
47
|
if (this.currentIde) {
|
|
@@ -46,15 +60,112 @@ export class IdeClient {
|
|
|
46
60
|
}
|
|
47
61
|
return IdeClient.instance;
|
|
48
62
|
}
|
|
63
|
+
async connect() {
|
|
64
|
+
this.setState(IDEConnectionStatus.Connecting);
|
|
65
|
+
if (!this.currentIde || !this.currentIdeDisplayName) {
|
|
66
|
+
this.setState(IDEConnectionStatus.Disconnected, `IDE integration is not supported in your current environment. To use this feature, run LLxprt Code in one of these supported IDEs: ${Object.values(DetectedIde)
|
|
67
|
+
.map((ide) => getIdeDisplayName(ide))
|
|
68
|
+
.join(', ')}`, true);
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
if (!this.validateWorkspacePath()) {
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
const port = this.getPortFromEnv();
|
|
75
|
+
if (!port) {
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
await this.establishConnection(port);
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* A diff is accepted with any modifications if the user performs one of the
|
|
82
|
+
* following actions:
|
|
83
|
+
* - Clicks the checkbox icon in the IDE to accept
|
|
84
|
+
* - Runs `command+shift+p` > "LLxprt Code: Accept Diff in IDE" to accept
|
|
85
|
+
* - Selects "accept" in the CLI UI
|
|
86
|
+
* - Saves the file via `ctrl/command+s`
|
|
87
|
+
*
|
|
88
|
+
* A diff is rejected if the user performs one of the following actions:
|
|
89
|
+
* - Clicks the "x" icon in the IDE
|
|
90
|
+
* - Runs "LLxprt Code: Close Diff in IDE"
|
|
91
|
+
* - Selects "no" in the CLI UI
|
|
92
|
+
* - Closes the file
|
|
93
|
+
*/
|
|
94
|
+
async openDiff(filePath, newContent) {
|
|
95
|
+
return new Promise((resolve, reject) => {
|
|
96
|
+
this.diffResponses.set(filePath, resolve);
|
|
97
|
+
this.client
|
|
98
|
+
?.callTool({
|
|
99
|
+
name: `openDiff`,
|
|
100
|
+
arguments: {
|
|
101
|
+
filePath,
|
|
102
|
+
newContent,
|
|
103
|
+
},
|
|
104
|
+
})
|
|
105
|
+
.catch((err) => {
|
|
106
|
+
logger.debug(`callTool for ${filePath} failed:`, err);
|
|
107
|
+
reject(err);
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
async closeDiff(filePath) {
|
|
112
|
+
try {
|
|
113
|
+
const result = await this.client?.callTool({
|
|
114
|
+
name: `closeDiff`,
|
|
115
|
+
arguments: {
|
|
116
|
+
filePath,
|
|
117
|
+
},
|
|
118
|
+
});
|
|
119
|
+
if (result) {
|
|
120
|
+
const parsed = CloseDiffResponseSchema.parse(result);
|
|
121
|
+
return parsed.content;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
catch (err) {
|
|
125
|
+
logger.debug(`callTool for ${filePath} failed:`, err);
|
|
126
|
+
}
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
// Closes the diff. Instead of waiting for a notification,
|
|
130
|
+
// manually resolves the diff resolver as the desired outcome.
|
|
131
|
+
async resolveDiffFromCli(filePath, outcome) {
|
|
132
|
+
const content = await this.closeDiff(filePath);
|
|
133
|
+
const resolver = this.diffResponses.get(filePath);
|
|
134
|
+
if (resolver) {
|
|
135
|
+
if (outcome === 'accepted') {
|
|
136
|
+
resolver({ status: 'accepted', content });
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
resolver({ status: 'rejected', content: undefined });
|
|
140
|
+
}
|
|
141
|
+
this.diffResponses.delete(filePath);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
disconnect() {
|
|
145
|
+
this.setState(IDEConnectionStatus.Disconnected, 'IDE integration disabled. To enable it again, run /ide enable.');
|
|
146
|
+
this.client?.close();
|
|
147
|
+
}
|
|
49
148
|
getCurrentIde() {
|
|
50
149
|
return this.currentIde;
|
|
51
150
|
}
|
|
52
151
|
getConnectionStatus() {
|
|
53
152
|
return this.state;
|
|
54
153
|
}
|
|
55
|
-
|
|
56
|
-
this.
|
|
154
|
+
getDetectedIdeDisplayName() {
|
|
155
|
+
return this.currentIdeDisplayName;
|
|
156
|
+
}
|
|
157
|
+
setState(status, details, logToConsole = false) {
|
|
158
|
+
const isAlreadyDisconnected = this.state.status === IDEConnectionStatus.Disconnected &&
|
|
159
|
+
status === IDEConnectionStatus.Disconnected;
|
|
160
|
+
// Only update details if the state wasn't already disconnected, so that
|
|
161
|
+
// the first detail message is preserved.
|
|
162
|
+
if (!isAlreadyDisconnected) {
|
|
163
|
+
this.state = { status, details };
|
|
164
|
+
}
|
|
57
165
|
if (status === IDEConnectionStatus.Disconnected) {
|
|
166
|
+
if (logToConsole) {
|
|
167
|
+
logger.error(details);
|
|
168
|
+
}
|
|
58
169
|
logger.debug('IDE integration is disconnected. ', details);
|
|
59
170
|
ideContext.clearIdeContext();
|
|
60
171
|
}
|
|
@@ -62,7 +173,7 @@ export class IdeClient {
|
|
|
62
173
|
getPortFromEnv() {
|
|
63
174
|
const port = process.env['LLXPRT_CODE_IDE_SERVER_PORT'];
|
|
64
175
|
if (!port) {
|
|
65
|
-
this.setState(IDEConnectionStatus.Disconnected,
|
|
176
|
+
this.setState(IDEConnectionStatus.Disconnected, `Failed to connect to IDE companion extension for ${this.currentIdeDisplayName}. LLxprt Code Companion extension not found. Install via /ide install and restart the CLI in a fresh terminal window.`, true);
|
|
66
177
|
return undefined;
|
|
67
178
|
}
|
|
68
179
|
return port;
|
|
@@ -70,11 +181,11 @@ export class IdeClient {
|
|
|
70
181
|
validateWorkspacePath() {
|
|
71
182
|
const ideWorkspacePath = process.env['LLXPRT_CODE_IDE_WORKSPACE_PATH'];
|
|
72
183
|
if (!ideWorkspacePath) {
|
|
73
|
-
this.setState(IDEConnectionStatus.Disconnected,
|
|
184
|
+
this.setState(IDEConnectionStatus.Disconnected, `To use this feature, please open a single workspace folder in ${this.currentIdeDisplayName} and try again.`, true);
|
|
74
185
|
return false;
|
|
75
186
|
}
|
|
76
|
-
if (ideWorkspacePath !== process.cwd()) {
|
|
77
|
-
this.setState(IDEConnectionStatus.Disconnected, `LLxprt Code is running in a different
|
|
187
|
+
if (getRealPath(ideWorkspacePath) !== getRealPath(process.cwd())) {
|
|
188
|
+
this.setState(IDEConnectionStatus.Disconnected, `Directory mismatch. LLxprt Code is running in a different location than the open workspace in ${this.currentIdeDisplayName}. Please run the CLI from the same directory as your project's root folder.`, true);
|
|
78
189
|
return false;
|
|
79
190
|
}
|
|
80
191
|
return true;
|
|
@@ -87,11 +198,33 @@ export class IdeClient {
|
|
|
87
198
|
ideContext.setIdeContext(notification.params);
|
|
88
199
|
});
|
|
89
200
|
this.client.onerror = (_error) => {
|
|
90
|
-
this.setState(IDEConnectionStatus.Disconnected,
|
|
201
|
+
this.setState(IDEConnectionStatus.Disconnected, `IDE connection error. The connection was lost unexpectedly. Please try reconnecting by running /ide enable`, true);
|
|
91
202
|
};
|
|
92
203
|
this.client.onclose = () => {
|
|
93
|
-
this.setState(IDEConnectionStatus.Disconnected,
|
|
204
|
+
this.setState(IDEConnectionStatus.Disconnected, `IDE connection error. The connection was lost unexpectedly. Please try reconnecting by running /ide enable`, true);
|
|
94
205
|
};
|
|
206
|
+
this.client.setNotificationHandler(IdeDiffAcceptedNotificationSchema, (notification) => {
|
|
207
|
+
const { filePath, content } = notification.params;
|
|
208
|
+
const resolver = this.diffResponses.get(filePath);
|
|
209
|
+
if (resolver) {
|
|
210
|
+
resolver({ status: 'accepted', content });
|
|
211
|
+
this.diffResponses.delete(filePath);
|
|
212
|
+
}
|
|
213
|
+
else {
|
|
214
|
+
logger.debug(`No resolver found for ${filePath}`);
|
|
215
|
+
}
|
|
216
|
+
});
|
|
217
|
+
this.client.setNotificationHandler(IdeDiffClosedNotificationSchema, (notification) => {
|
|
218
|
+
const { filePath } = notification.params;
|
|
219
|
+
const resolver = this.diffResponses.get(filePath);
|
|
220
|
+
if (resolver) {
|
|
221
|
+
resolver({ status: 'rejected', content: undefined });
|
|
222
|
+
this.diffResponses.delete(filePath);
|
|
223
|
+
}
|
|
224
|
+
else {
|
|
225
|
+
logger.debug(`No resolver found for ${filePath}`);
|
|
226
|
+
}
|
|
227
|
+
});
|
|
95
228
|
}
|
|
96
229
|
async reconnect(ideMode) {
|
|
97
230
|
IdeClient.instance = new IdeClient(ideMode);
|
|
@@ -109,8 +242,8 @@ export class IdeClient {
|
|
|
109
242
|
await this.client.connect(transport);
|
|
110
243
|
this.setState(IDEConnectionStatus.Connected);
|
|
111
244
|
}
|
|
112
|
-
catch (
|
|
113
|
-
this.setState(IDEConnectionStatus.Disconnected, `Failed to connect to IDE
|
|
245
|
+
catch (_error) {
|
|
246
|
+
this.setState(IDEConnectionStatus.Disconnected, `Failed to connect to IDE companion extension for ${this.currentIdeDisplayName}. Please ensure the extension is running and try refreshing your terminal. To install the extension, run /ide install.`, true);
|
|
114
247
|
if (transport) {
|
|
115
248
|
try {
|
|
116
249
|
await transport.close();
|
|
@@ -142,9 +275,6 @@ export class IdeClient {
|
|
|
142
275
|
dispose() {
|
|
143
276
|
this.client?.close();
|
|
144
277
|
}
|
|
145
|
-
getDetectedIdeDisplayName() {
|
|
146
|
-
return this.currentIdeDisplayName;
|
|
147
|
-
}
|
|
148
278
|
setDisconnected() {
|
|
149
279
|
this.setState(IDEConnectionStatus.Disconnected);
|
|
150
280
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ide-client.js","sourceRoot":"","sources":["../../../src/ide/ide-client.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,SAAS,
|
|
1
|
+
{"version":3,"file":"ide-client.js","sourceRoot":"","sources":["../../../src/ide/ide-client.ts"],"names":[],"mappings":"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"}
|