@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.
Files changed (182) hide show
  1. package/README.md +1 -0
  2. package/dist/src/config/config.alwaysAllow.test.d.ts +6 -0
  3. package/dist/src/config/config.alwaysAllow.test.js +84 -0
  4. package/dist/src/config/config.alwaysAllow.test.js.map +1 -0
  5. package/dist/src/config/config.d.ts +26 -0
  6. package/dist/src/config/config.js +43 -0
  7. package/dist/src/config/config.js.map +1 -1
  8. package/dist/src/config/config.test.js +8 -0
  9. package/dist/src/config/config.test.js.map +1 -1
  10. package/dist/src/core/client.d.ts +0 -2
  11. package/dist/src/core/client.js +10 -85
  12. package/dist/src/core/client.js.map +1 -1
  13. package/dist/src/core/client.test.js +7 -2
  14. package/dist/src/core/client.test.js.map +1 -1
  15. package/dist/src/core/contentGenerator.js +1 -1
  16. package/dist/src/core/contentGenerator.js.map +1 -1
  17. package/dist/src/core/coreToolScheduler.d.ts +17 -7
  18. package/dist/src/core/coreToolScheduler.js +121 -18
  19. package/dist/src/core/coreToolScheduler.js.map +1 -1
  20. package/dist/src/core/coreToolScheduler.test.js +25 -37
  21. package/dist/src/core/coreToolScheduler.test.js.map +1 -1
  22. package/dist/src/core/geminiChat.d.ts +3 -0
  23. package/dist/src/core/geminiChat.js +17 -13
  24. package/dist/src/core/geminiChat.js.map +1 -1
  25. package/dist/src/core/nonInteractiveToolExecutor.js +4 -1
  26. package/dist/src/core/nonInteractiveToolExecutor.js.map +1 -1
  27. package/dist/src/core/nonInteractiveToolExecutor.test.js +8 -31
  28. package/dist/src/core/nonInteractiveToolExecutor.test.js.map +1 -1
  29. package/dist/src/core/subagent.d.ts +230 -0
  30. package/dist/src/core/subagent.js +453 -0
  31. package/dist/src/core/subagent.js.map +1 -0
  32. package/dist/src/core/subagent.test.d.ts +6 -0
  33. package/dist/src/core/subagent.test.js +519 -0
  34. package/dist/src/core/subagent.test.js.map +1 -0
  35. package/dist/src/hooks/tool-render-suppression-hook.d.ts +16 -0
  36. package/dist/src/hooks/tool-render-suppression-hook.js +26 -0
  37. package/dist/src/hooks/tool-render-suppression-hook.js.map +1 -0
  38. package/dist/src/hooks/tool-render-suppression-hook.test.d.ts +6 -0
  39. package/dist/src/hooks/tool-render-suppression-hook.test.js +59 -0
  40. package/dist/src/hooks/tool-render-suppression-hook.test.js.map +1 -0
  41. package/dist/src/ide/ide-client.d.ts +22 -1
  42. package/dist/src/ide/ide-client.js +145 -15
  43. package/dist/src/ide/ide-client.js.map +1 -1
  44. package/dist/src/ide/ideContext.d.ts +127 -32
  45. package/dist/src/ide/ideContext.js +45 -0
  46. package/dist/src/ide/ideContext.js.map +1 -1
  47. package/dist/src/index.d.ts +3 -0
  48. package/dist/src/index.js +3 -0
  49. package/dist/src/index.js.map +1 -1
  50. package/dist/src/integration-tests/todo-system.test.js +38 -602
  51. package/dist/src/integration-tests/todo-system.test.js.map +1 -1
  52. package/dist/src/providers/gemini/GeminiProvider.js +5 -5
  53. package/dist/src/providers/gemini/GeminiProvider.js.map +1 -1
  54. package/dist/src/providers/openai/OpenAIProvider.js +8 -1
  55. package/dist/src/providers/openai/OpenAIProvider.js.map +1 -1
  56. package/dist/src/providers/openai/OpenAIProvider.test.js +106 -0
  57. package/dist/src/providers/openai/OpenAIProvider.test.js.map +1 -1
  58. package/dist/src/providers/types/IProviderConfig.d.ts +5 -0
  59. package/dist/src/services/shellExecutionService.js +29 -5
  60. package/dist/src/services/shellExecutionService.js.map +1 -1
  61. package/dist/src/services/shellExecutionService.test.js +8 -0
  62. package/dist/src/services/shellExecutionService.test.js.map +1 -1
  63. package/dist/src/services/todo-context-tracker.d.ts +31 -0
  64. package/dist/src/services/todo-context-tracker.js +45 -0
  65. package/dist/src/services/todo-context-tracker.js.map +1 -0
  66. package/dist/src/services/tool-call-tracker-service.d.ts +52 -0
  67. package/dist/src/services/tool-call-tracker-service.js +170 -0
  68. package/dist/src/services/tool-call-tracker-service.js.map +1 -0
  69. package/dist/src/services/tool-call-tracker-service.test.d.ts +6 -0
  70. package/dist/src/services/tool-call-tracker-service.test.js +99 -0
  71. package/dist/src/services/tool-call-tracker-service.test.js.map +1 -0
  72. package/dist/src/telemetry/loggers.test.circular.js +7 -2
  73. package/dist/src/telemetry/loggers.test.circular.js.map +1 -1
  74. package/dist/src/telemetry/loggers.test.js +5 -1
  75. package/dist/src/telemetry/loggers.test.js.map +1 -1
  76. package/dist/src/telemetry/metrics.d.ts +1 -1
  77. package/dist/src/telemetry/metrics.js.map +1 -1
  78. package/dist/src/telemetry/types.d.ts +2 -1
  79. package/dist/src/telemetry/types.js +3 -1
  80. package/dist/src/telemetry/types.js.map +1 -1
  81. package/dist/src/telemetry/uiTelemetry.d.ts +2 -0
  82. package/dist/src/telemetry/uiTelemetry.js +2 -0
  83. package/dist/src/telemetry/uiTelemetry.js.map +1 -1
  84. package/dist/src/telemetry/uiTelemetry.test.js +11 -1
  85. package/dist/src/telemetry/uiTelemetry.test.js.map +1 -1
  86. package/dist/src/test-utils/tools.d.ts +23 -0
  87. package/dist/src/test-utils/tools.js +41 -0
  88. package/dist/src/test-utils/tools.js.map +1 -0
  89. package/dist/src/tools/edit.d.ts +5 -33
  90. package/dist/src/tools/edit.js +129 -124
  91. package/dist/src/tools/edit.js.map +1 -1
  92. package/dist/src/tools/edit.test.js +123 -50
  93. package/dist/src/tools/edit.test.js.map +1 -1
  94. package/dist/src/tools/glob.d.ts +3 -10
  95. package/dist/src/tools/glob.js +97 -99
  96. package/dist/src/tools/glob.js.map +1 -1
  97. package/dist/src/tools/glob.test.js +37 -26
  98. package/dist/src/tools/glob.test.js.map +1 -1
  99. package/dist/src/tools/grep.d.ts +3 -35
  100. package/dist/src/tools/grep.js +117 -88
  101. package/dist/src/tools/grep.js.map +1 -1
  102. package/dist/src/tools/grep.test.js +36 -22
  103. package/dist/src/tools/grep.test.js.map +1 -1
  104. package/dist/src/tools/mcp-client.d.ts +10 -0
  105. package/dist/src/tools/mcp-client.js +59 -0
  106. package/dist/src/tools/mcp-client.js.map +1 -1
  107. package/dist/src/tools/mcp-client.test.js +294 -1
  108. package/dist/src/tools/mcp-client.test.js.map +1 -1
  109. package/dist/src/tools/memoryTool.d.ts +2 -2
  110. package/dist/src/tools/memoryTool.js +1 -0
  111. package/dist/src/tools/memoryTool.js.map +1 -1
  112. package/dist/src/tools/modifiable-tool.d.ts +8 -5
  113. package/dist/src/tools/modifiable-tool.js +4 -1
  114. package/dist/src/tools/modifiable-tool.js.map +1 -1
  115. package/dist/src/tools/modifiable-tool.test.js +3 -3
  116. package/dist/src/tools/modifiable-tool.test.js.map +1 -1
  117. package/dist/src/tools/read-file.d.ts +4 -6
  118. package/dist/src/tools/read-file.js +55 -46
  119. package/dist/src/tools/read-file.js.map +1 -1
  120. package/dist/src/tools/read-file.test.js +201 -126
  121. package/dist/src/tools/read-file.test.js.map +1 -1
  122. package/dist/src/tools/read-many-files.js +8 -2
  123. package/dist/src/tools/read-many-files.js.map +1 -1
  124. package/dist/src/tools/read-many-files.test.js +16 -0
  125. package/dist/src/tools/read-many-files.test.js.map +1 -1
  126. package/dist/src/tools/todo-events.d.ts +22 -0
  127. package/dist/src/tools/todo-events.js +24 -0
  128. package/dist/src/tools/todo-events.js.map +1 -0
  129. package/dist/src/tools/todo-read.js.map +1 -1
  130. package/dist/src/tools/todo-schemas.d.ts +232 -4
  131. package/dist/src/tools/todo-schemas.js +13 -0
  132. package/dist/src/tools/todo-schemas.js.map +1 -1
  133. package/dist/src/tools/todo-schemas.test.js +190 -1
  134. package/dist/src/tools/todo-schemas.test.js.map +1 -1
  135. package/dist/src/tools/todo-store.d.ts +1 -4
  136. package/dist/src/tools/todo-store.js +41 -40
  137. package/dist/src/tools/todo-store.js.map +1 -1
  138. package/dist/src/tools/todo-store.test.js +34 -40
  139. package/dist/src/tools/todo-store.test.js.map +1 -1
  140. package/dist/src/tools/todo-write.d.ts +1 -1
  141. package/dist/src/tools/todo-write.js +84 -47
  142. package/dist/src/tools/todo-write.js.map +1 -1
  143. package/dist/src/tools/todo-write.test.js +23 -9
  144. package/dist/src/tools/todo-write.test.js.map +1 -1
  145. package/dist/src/tools/tool-context.d.ts +2 -0
  146. package/dist/src/tools/tool-registry.d.ts +12 -6
  147. package/dist/src/tools/tool-registry.js +16 -1
  148. package/dist/src/tools/tool-registry.js.map +1 -1
  149. package/dist/src/tools/tool-registry.test.js +1 -18
  150. package/dist/src/tools/tool-registry.test.js.map +1 -1
  151. package/dist/src/tools/tools.d.ts +127 -39
  152. package/dist/src/tools/tools.js +115 -10
  153. package/dist/src/tools/tools.js.map +1 -1
  154. package/dist/src/tools/write-file.d.ts +2 -2
  155. package/dist/src/tools/write-file.js +16 -0
  156. package/dist/src/tools/write-file.js.map +1 -1
  157. package/dist/src/tools/write-file.test.js +20 -3
  158. package/dist/src/tools/write-file.test.js.map +1 -1
  159. package/dist/src/types/modelParams.d.ts +2 -0
  160. package/dist/src/utils/environmentContext.d.ts +21 -0
  161. package/dist/src/utils/environmentContext.js +90 -0
  162. package/dist/src/utils/environmentContext.js.map +1 -0
  163. package/dist/src/utils/environmentContext.test.d.ts +6 -0
  164. package/dist/src/utils/environmentContext.test.js +139 -0
  165. package/dist/src/utils/environmentContext.test.js.map +1 -0
  166. package/dist/src/utils/fileUtils.js +2 -10
  167. package/dist/src/utils/fileUtils.js.map +1 -1
  168. package/dist/src/utils/fileUtils.test.js +1 -4
  169. package/dist/src/utils/fileUtils.test.js.map +1 -1
  170. package/dist/src/utils/filesearch/fileSearch.d.ts +1 -0
  171. package/dist/src/utils/filesearch/fileSearch.js +27 -5
  172. package/dist/src/utils/filesearch/fileSearch.js.map +1 -1
  173. package/dist/src/utils/filesearch/fileSearch.test.js +21 -1
  174. package/dist/src/utils/filesearch/fileSearch.test.js.map +1 -1
  175. package/dist/src/utils/memoryDiscovery.js +4 -1
  176. package/dist/src/utils/memoryDiscovery.js.map +1 -1
  177. package/dist/src/utils/shell-utils.js +14 -2
  178. package/dist/src/utils/shell-utils.js.map +1 -1
  179. package/dist/src/utils/shell-utils.shellReplacement.test.d.ts +6 -0
  180. package/dist/src/utils/shell-utils.shellReplacement.test.js +149 -0
  181. package/dist/src/utils/shell-utils.shellReplacement.test.js.map +1 -0
  182. 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 { detectIde, getIdeDisplayName, } from '../ide/detect-ide.js';
7
- import { ideContext, IdeContextNotificationSchema } from '../ide/ideContext.js';
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
- setState(status, details) {
56
- this.state = { status, details };
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, 'LLxprt Code Companion extension not found. Install via /ide install and restart the CLI in a fresh terminal window.');
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, 'IDE integration requires a single workspace folder to be open in the IDE. Please ensure one folder is open and try again.');
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 directory (${process.cwd()}) from the IDE's open workspace (${ideWorkspacePath}). Please run LLxprt Code in the same directory.`);
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, 'Client error.');
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, 'Connection closed.');
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 (error) {
113
- this.setState(IDEConnectionStatus.Disconnected, `Failed to connect to IDE server: ${error}`);
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":"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"}
1
+ {"version":3,"file":"ide-client.js","sourceRoot":"","sources":["../../../src/ide/ide-client.ts"],"names":[],"mappings":"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"}