@vybestack/llxprt-code 0.1.15 → 0.1.16-nightly.250805.82080ee4

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 (163) hide show
  1. package/README.md +37 -2
  2. package/dist/package.json +3 -3
  3. package/dist/src/config/config.d.ts +4 -1
  4. package/dist/src/config/config.js +151 -54
  5. package/dist/src/config/config.js.map +1 -1
  6. package/dist/src/config/settings.d.ts +11 -2
  7. package/dist/src/config/settings.js +84 -23
  8. package/dist/src/config/settings.js.map +1 -1
  9. package/dist/src/gemini.d.ts +2 -0
  10. package/dist/src/gemini.js +177 -21
  11. package/dist/src/gemini.js.map +1 -1
  12. package/dist/src/generated/git-commit.d.ts +1 -1
  13. package/dist/src/generated/git-commit.js +1 -1
  14. package/dist/src/generated/git-commit.js.map +1 -1
  15. package/dist/src/integration-tests/GITHUB_ACTIONS_README.md +41 -0
  16. package/dist/src/integration-tests/test-utils.d.ts +68 -0
  17. package/dist/src/integration-tests/test-utils.js +167 -0
  18. package/dist/src/integration-tests/test-utils.js.map +1 -0
  19. package/dist/src/nonInteractiveCli.js +24 -66
  20. package/dist/src/nonInteractiveCli.js.map +1 -1
  21. package/dist/src/providers/IFileSystem.d.ts +42 -0
  22. package/dist/src/providers/IFileSystem.js +46 -0
  23. package/dist/src/providers/IFileSystem.js.map +1 -0
  24. package/dist/src/providers/providerConfigUtils.d.ts +0 -4
  25. package/dist/src/providers/providerConfigUtils.js +21 -52
  26. package/dist/src/providers/providerConfigUtils.js.map +1 -1
  27. package/dist/src/providers/providerManagerInstance.d.ts +6 -1
  28. package/dist/src/providers/providerManagerInstance.js +117 -82
  29. package/dist/src/providers/providerManagerInstance.js.map +1 -1
  30. package/dist/src/services/BuiltinCommandLoader.js +11 -0
  31. package/dist/src/services/BuiltinCommandLoader.js.map +1 -1
  32. package/dist/src/ui/App.js +61 -48
  33. package/dist/src/ui/App.js.map +1 -1
  34. package/dist/src/ui/commands/aboutCommand.js +2 -5
  35. package/dist/src/ui/commands/aboutCommand.js.map +1 -1
  36. package/dist/src/ui/commands/baseurlCommand.js +54 -9
  37. package/dist/src/ui/commands/baseurlCommand.js.map +1 -1
  38. package/dist/src/ui/commands/diagnosticsCommand.d.ts +10 -0
  39. package/dist/src/ui/commands/diagnosticsCommand.js +122 -0
  40. package/dist/src/ui/commands/diagnosticsCommand.js.map +1 -0
  41. package/dist/src/ui/commands/directoryCommand.d.ts +8 -0
  42. package/dist/src/ui/commands/directoryCommand.js +116 -0
  43. package/dist/src/ui/commands/directoryCommand.js.map +1 -0
  44. package/dist/src/ui/commands/ideCommand.js +101 -105
  45. package/dist/src/ui/commands/ideCommand.js.map +1 -1
  46. package/dist/src/ui/commands/initCommand.js +63 -31
  47. package/dist/src/ui/commands/initCommand.js.map +1 -1
  48. package/dist/src/ui/commands/keyCommand.js +75 -11
  49. package/dist/src/ui/commands/keyCommand.js.map +1 -1
  50. package/dist/src/ui/commands/keyfileCommand.js +54 -13
  51. package/dist/src/ui/commands/keyfileCommand.js.map +1 -1
  52. package/dist/src/ui/commands/memoryCommand.js +2 -1
  53. package/dist/src/ui/commands/memoryCommand.js.map +1 -1
  54. package/dist/src/ui/commands/modelCommand.js +2 -5
  55. package/dist/src/ui/commands/modelCommand.js.map +1 -1
  56. package/dist/src/ui/commands/profileCommand.d.ts +10 -0
  57. package/dist/src/ui/commands/profileCommand.js +592 -0
  58. package/dist/src/ui/commands/profileCommand.js.map +1 -0
  59. package/dist/src/ui/commands/providerCommand.js +46 -3
  60. package/dist/src/ui/commands/providerCommand.js.map +1 -1
  61. package/dist/src/ui/commands/setCommand.d.ts +7 -0
  62. package/dist/src/ui/commands/setCommand.js +431 -0
  63. package/dist/src/ui/commands/setCommand.js.map +1 -0
  64. package/dist/src/ui/commands/setupGithubCommand.d.ts +7 -0
  65. package/dist/src/ui/commands/setupGithubCommand.js +49 -0
  66. package/dist/src/ui/commands/setupGithubCommand.js.map +1 -0
  67. package/dist/src/ui/commands/types.d.ts +1 -1
  68. package/dist/src/ui/commands/types.js.map +1 -1
  69. package/dist/src/ui/components/DebugProfiler.d.ts +6 -0
  70. package/dist/src/ui/components/DebugProfiler.js +26 -0
  71. package/dist/src/ui/components/DebugProfiler.js.map +1 -0
  72. package/dist/src/ui/components/Footer.d.ts +1 -0
  73. package/dist/src/ui/components/Footer.js +5 -4
  74. package/dist/src/ui/components/Footer.js.map +1 -1
  75. package/dist/src/ui/components/IDEContextDetailDisplay.d.ts +2 -1
  76. package/dist/src/ui/components/IDEContextDetailDisplay.js +3 -3
  77. package/dist/src/ui/components/IDEContextDetailDisplay.js.map +1 -1
  78. package/dist/src/ui/components/InputPrompt.js +123 -12
  79. package/dist/src/ui/components/InputPrompt.js.map +1 -1
  80. package/dist/src/ui/components/LoadProfileDialog.d.ts +13 -0
  81. package/dist/src/ui/components/LoadProfileDialog.js +57 -0
  82. package/dist/src/ui/components/LoadProfileDialog.js.map +1 -0
  83. package/dist/src/ui/components/PrepareLabel.d.ts +15 -0
  84. package/dist/src/ui/components/PrepareLabel.js +16 -0
  85. package/dist/src/ui/components/PrepareLabel.js.map +1 -0
  86. package/dist/src/ui/components/ProviderModelDialog.js +75 -28
  87. package/dist/src/ui/components/ProviderModelDialog.js.map +1 -1
  88. package/dist/src/ui/components/SecureKeyInput.d.ts +15 -0
  89. package/dist/src/ui/components/SecureKeyInput.js +58 -0
  90. package/dist/src/ui/components/SecureKeyInput.js.map +1 -0
  91. package/dist/src/ui/components/SuggestionsDisplay.d.ts +1 -0
  92. package/dist/src/ui/components/SuggestionsDisplay.js +3 -3
  93. package/dist/src/ui/components/SuggestionsDisplay.js.map +1 -1
  94. package/dist/src/ui/components/messages/ToolConfirmationMessage.js +15 -4
  95. package/dist/src/ui/components/messages/ToolConfirmationMessage.js.map +1 -1
  96. package/dist/src/ui/components/messages/UserMessage.js +4 -1
  97. package/dist/src/ui/components/messages/UserMessage.js.map +1 -1
  98. package/dist/src/ui/components/shared/text-buffer.js +9 -14
  99. package/dist/src/ui/components/shared/text-buffer.js.map +1 -1
  100. package/dist/src/ui/containers/SessionController.js +14 -15
  101. package/dist/src/ui/containers/SessionController.js.map +1 -1
  102. package/dist/src/ui/editors/editorSettingsManager.js +2 -0
  103. package/dist/src/ui/editors/editorSettingsManager.js.map +1 -1
  104. package/dist/src/ui/hooks/atCommandProcessor.js +56 -48
  105. package/dist/src/ui/hooks/atCommandProcessor.js.map +1 -1
  106. package/dist/src/ui/hooks/slashCommandProcessor.d.ts +1 -1
  107. package/dist/src/ui/hooks/slashCommandProcessor.js +13 -3
  108. package/dist/src/ui/hooks/slashCommandProcessor.js.map +1 -1
  109. package/dist/src/ui/hooks/useAuthCommand.js +9 -0
  110. package/dist/src/ui/hooks/useAuthCommand.js.map +1 -1
  111. package/dist/src/ui/hooks/useCompletion.d.ts +5 -5
  112. package/dist/src/ui/hooks/useCompletion.js +7 -407
  113. package/dist/src/ui/hooks/useCompletion.js.map +1 -1
  114. package/dist/src/ui/hooks/useGeminiStream.js +61 -10
  115. package/dist/src/ui/hooks/useGeminiStream.js.map +1 -1
  116. package/dist/src/ui/hooks/useLoadProfileDialog.d.ts +27 -0
  117. package/dist/src/ui/hooks/useLoadProfileDialog.js +138 -0
  118. package/dist/src/ui/hooks/useLoadProfileDialog.js.map +1 -0
  119. package/dist/src/ui/hooks/useReverseSearchCompletion.d.ts +19 -0
  120. package/dist/src/ui/hooks/useReverseSearchCompletion.js +54 -0
  121. package/dist/src/ui/hooks/useReverseSearchCompletion.js.map +1 -0
  122. package/dist/src/ui/hooks/useShellHistory.d.ts +1 -0
  123. package/dist/src/ui/hooks/useShellHistory.js +30 -7
  124. package/dist/src/ui/hooks/useShellHistory.js.map +1 -1
  125. package/dist/src/ui/hooks/useSlashCompletion.d.ts +24 -0
  126. package/dist/src/ui/hooks/useSlashCompletion.js +451 -0
  127. package/dist/src/ui/hooks/useSlashCompletion.js.map +1 -0
  128. package/dist/src/ui/reducers/appReducer.d.ts +3 -2
  129. package/dist/src/ui/reducers/appReducer.js +1 -0
  130. package/dist/src/ui/reducers/appReducer.js.map +1 -1
  131. package/dist/src/ui/utils/renderLoopDetector.js +3 -3
  132. package/dist/src/ui/utils/renderLoopDetector.js.map +1 -1
  133. package/dist/src/ui/utils/secureInputHandler.d.ts +46 -0
  134. package/dist/src/ui/utils/secureInputHandler.js +128 -0
  135. package/dist/src/ui/utils/secureInputHandler.js.map +1 -0
  136. package/dist/src/ui/utils/updateCheck.js +57 -12
  137. package/dist/src/ui/utils/updateCheck.js.map +1 -1
  138. package/dist/src/utils/gitUtils.d.ts +10 -0
  139. package/dist/src/utils/gitUtils.js +24 -0
  140. package/dist/src/utils/gitUtils.js.map +1 -0
  141. package/dist/src/utils/handleAutoUpdate.d.ts +2 -1
  142. package/dist/src/utils/handleAutoUpdate.js +8 -4
  143. package/dist/src/utils/handleAutoUpdate.js.map +1 -1
  144. package/dist/src/utils/sandbox-macos-permissive-closed.sb +6 -0
  145. package/dist/src/utils/sandbox-macos-permissive-open.sb +6 -0
  146. package/dist/src/utils/sandbox-macos-permissive-proxied.sb +6 -0
  147. package/dist/src/utils/sandbox-macos-restrictive-closed.sb +6 -0
  148. package/dist/src/utils/sandbox-macos-restrictive-open.sb +6 -0
  149. package/dist/src/utils/sandbox-macos-restrictive-proxied.sb +6 -0
  150. package/dist/src/utils/sandbox.d.ts +2 -2
  151. package/dist/src/utils/sandbox.js +35 -11
  152. package/dist/src/utils/sandbox.js.map +1 -1
  153. package/dist/src/utils/spawnWrapper.d.ts +7 -0
  154. package/dist/src/utils/spawnWrapper.js +8 -0
  155. package/dist/src/utils/spawnWrapper.js.map +1 -0
  156. package/dist/src/validateNonInterActiveAuth.d.ts +2 -1
  157. package/dist/src/validateNonInterActiveAuth.js +31 -5
  158. package/dist/src/validateNonInterActiveAuth.js.map +1 -1
  159. package/dist/tsconfig.tsbuildinfo +1 -1
  160. package/package.json +3 -3
  161. package/dist/src/providers/enhanceConfigWithProviders.d.ts +0 -12
  162. package/dist/src/providers/enhanceConfigWithProviders.js +0 -16
  163. package/dist/src/providers/enhanceConfigWithProviders.js.map +0 -1
@@ -0,0 +1,122 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Vybestack LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { CommandKind, } from './types.js';
7
+ /**
8
+ * Masks sensitive information like API keys
9
+ */
10
+ function maskSensitive(value) {
11
+ if (value.length < 8) {
12
+ return '*'.repeat(value.length);
13
+ }
14
+ return (value.substring(0, 4) +
15
+ '*'.repeat(value.length - 8) +
16
+ value.substring(value.length - 4));
17
+ }
18
+ /**
19
+ * Implementation for the /diagnostics command that shows current configuration and state
20
+ */
21
+ export const diagnosticsCommand = {
22
+ name: 'diagnostics',
23
+ description: 'show current configuration and diagnostic information',
24
+ kind: CommandKind.BUILT_IN,
25
+ action: async (context) => {
26
+ try {
27
+ const config = context.services.config;
28
+ const settings = context.services.settings;
29
+ if (!config) {
30
+ return {
31
+ type: 'message',
32
+ messageType: 'error',
33
+ content: 'Configuration not available',
34
+ };
35
+ }
36
+ const diagnostics = ['# LLxprt Diagnostics\n'];
37
+ // Provider information
38
+ const providerManager = config.getProviderManager();
39
+ const activeProvider = providerManager?.getActiveProvider();
40
+ diagnostics.push('## Provider Information');
41
+ diagnostics.push(`- Active Provider: ${activeProvider?.name || 'none'}`);
42
+ diagnostics.push(`- Current Model: ${config.getModel()}`);
43
+ // Check for API key
44
+ if (activeProvider &&
45
+ 'hasApiKey' in activeProvider &&
46
+ typeof activeProvider.hasApiKey === 'function') {
47
+ diagnostics.push(`- API Key: ${activeProvider.hasApiKey() ? 'Set' : 'Not set'}`);
48
+ }
49
+ // Ephemeral settings
50
+ const ephemeralSettings = config.getEphemeralSettings();
51
+ diagnostics.push('\n## Ephemeral Settings');
52
+ if (Object.keys(ephemeralSettings).length === 0) {
53
+ diagnostics.push('- No ephemeral settings configured');
54
+ }
55
+ else {
56
+ for (const [key, value] of Object.entries(ephemeralSettings)) {
57
+ if (key === 'auth-key' && typeof value === 'string') {
58
+ diagnostics.push(`- ${key}: ${maskSensitive(value)}`);
59
+ }
60
+ else if (key === 'auth-keyfile' && typeof value === 'string') {
61
+ diagnostics.push(`- ${key}: ${value}`);
62
+ }
63
+ else {
64
+ diagnostics.push(`- ${key}: ${JSON.stringify(value)}`);
65
+ }
66
+ }
67
+ }
68
+ // Model parameters
69
+ diagnostics.push('\n## Model Parameters');
70
+ if (activeProvider &&
71
+ 'getModelParams' in activeProvider &&
72
+ typeof activeProvider.getModelParams === 'function') {
73
+ const modelParams = activeProvider.getModelParams();
74
+ if (modelParams && Object.keys(modelParams).length > 0) {
75
+ for (const [key, value] of Object.entries(modelParams)) {
76
+ diagnostics.push(`- ${key}: ${JSON.stringify(value)}`);
77
+ }
78
+ }
79
+ else {
80
+ diagnostics.push('- No model parameters configured');
81
+ }
82
+ }
83
+ else {
84
+ diagnostics.push('- Model parameters not available for this provider');
85
+ }
86
+ // System information
87
+ diagnostics.push('\n## System Information');
88
+ diagnostics.push(`- Platform: ${process.platform}`);
89
+ diagnostics.push(`- Node Version: ${process.version}`);
90
+ diagnostics.push(`- Working Directory: ${process.cwd()}`);
91
+ diagnostics.push(`- Debug Mode: ${config.getDebugMode() ? 'Enabled' : 'Disabled'}`);
92
+ // Settings
93
+ diagnostics.push('\n## Settings');
94
+ const merged = settings.merged || {};
95
+ diagnostics.push(`- Theme: ${merged.theme || 'default'}`);
96
+ diagnostics.push(`- Selected Auth Type: ${merged.selectedAuthType || 'none'}`);
97
+ diagnostics.push(`- Default Profile: ${merged.defaultProfile || 'none'}`);
98
+ diagnostics.push(`- Sandbox: ${merged.sandbox || 'disabled'}`);
99
+ // Memory/Context
100
+ diagnostics.push('\n## Memory/Context');
101
+ const userMemory = config.getUserMemory();
102
+ diagnostics.push(`- User Memory: ${userMemory ? `${userMemory.length} characters` : 'Not loaded'}`);
103
+ diagnostics.push(`- Context Files: ${config.getLlxprtMdFileCount() || 0} files`);
104
+ // Telemetry
105
+ diagnostics.push('\n## Telemetry');
106
+ diagnostics.push(`- Usage Statistics: ${merged.usageStatisticsEnabled ? 'Enabled' : 'Disabled'}`);
107
+ return {
108
+ type: 'message',
109
+ messageType: 'info',
110
+ content: diagnostics.join('\n'),
111
+ };
112
+ }
113
+ catch (error) {
114
+ return {
115
+ type: 'message',
116
+ messageType: 'error',
117
+ content: `Failed to generate diagnostics: ${error instanceof Error ? error.message : String(error)}`,
118
+ };
119
+ }
120
+ },
121
+ };
122
+ //# sourceMappingURL=diagnosticsCommand.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnosticsCommand.js","sourceRoot":"","sources":["../../../../src/ui/commands/diagnosticsCommand.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { SlashCommand } from './types.js';
7
+ export declare function expandHomeDir(p: string): string;
8
+ export declare const directoryCommand: SlashCommand;
@@ -0,0 +1,116 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { CommandKind } from './types.js';
7
+ import { MessageType } from '../types.js';
8
+ import * as os from 'os';
9
+ import * as path from 'path';
10
+ export function expandHomeDir(p) {
11
+ if (!p) {
12
+ return '';
13
+ }
14
+ let expandedPath = p;
15
+ if (p.toLowerCase().startsWith('%userprofile%')) {
16
+ expandedPath = os.homedir() + p.substring('%userprofile%'.length);
17
+ }
18
+ else if (p.startsWith('~')) {
19
+ expandedPath = os.homedir() + p.substring(1);
20
+ }
21
+ return path.normalize(expandedPath);
22
+ }
23
+ export const directoryCommand = {
24
+ name: 'directory',
25
+ altNames: ['dir'],
26
+ description: 'Manage workspace directories',
27
+ kind: CommandKind.BUILT_IN,
28
+ subCommands: [
29
+ {
30
+ name: 'add',
31
+ description: 'Add directories to the workspace. Use comma to separate multiple paths',
32
+ kind: CommandKind.BUILT_IN,
33
+ action: async (context, args) => {
34
+ const { ui: { addItem }, services: { config }, } = context;
35
+ const [...rest] = args.split(' ');
36
+ if (!config) {
37
+ addItem({
38
+ type: MessageType.ERROR,
39
+ text: 'Configuration is not available.',
40
+ }, Date.now());
41
+ return;
42
+ }
43
+ const workspaceContext = config.getWorkspaceContext();
44
+ const pathsToAdd = rest
45
+ .join(' ')
46
+ .split(',')
47
+ .filter((p) => p);
48
+ if (pathsToAdd.length === 0) {
49
+ addItem({
50
+ type: MessageType.ERROR,
51
+ text: 'Please provide at least one path to add.',
52
+ }, Date.now());
53
+ return;
54
+ }
55
+ if (config.isRestrictiveSandbox()) {
56
+ return {
57
+ type: 'message',
58
+ messageType: 'error',
59
+ content: 'The /directory add command is not supported in restrictive sandbox profiles. Please use --include-directories when starting the session instead.',
60
+ };
61
+ }
62
+ const added = [];
63
+ const errors = [];
64
+ for (const pathToAdd of pathsToAdd) {
65
+ try {
66
+ workspaceContext.addDirectory(expandHomeDir(pathToAdd.trim()));
67
+ added.push(pathToAdd.trim());
68
+ }
69
+ catch (e) {
70
+ const error = e;
71
+ errors.push(`Error adding '${pathToAdd.trim()}': ${error.message}`);
72
+ }
73
+ }
74
+ if (added.length > 0) {
75
+ const gemini = config.getGeminiClient();
76
+ if (gemini) {
77
+ await gemini.addDirectoryContext();
78
+ }
79
+ addItem({
80
+ type: MessageType.INFO,
81
+ text: `Successfully added directories:\n- ${added.join('\n- ')}`,
82
+ }, Date.now());
83
+ }
84
+ if (errors.length > 0) {
85
+ addItem({
86
+ type: MessageType.ERROR,
87
+ text: errors.join('\n'),
88
+ }, Date.now());
89
+ }
90
+ },
91
+ },
92
+ {
93
+ name: 'show',
94
+ description: 'Show all directories in the workspace',
95
+ kind: CommandKind.BUILT_IN,
96
+ action: async (context) => {
97
+ const { ui: { addItem }, services: { config }, } = context;
98
+ if (!config) {
99
+ addItem({
100
+ type: MessageType.ERROR,
101
+ text: 'Configuration is not available.',
102
+ }, Date.now());
103
+ return;
104
+ }
105
+ const workspaceContext = config.getWorkspaceContext();
106
+ const directories = workspaceContext.getDirectories();
107
+ const directoryList = directories.map((dir) => `- ${dir}`).join('\n');
108
+ addItem({
109
+ type: MessageType.INFO,
110
+ text: `Current workspace directories:\n${directoryList}`,
111
+ }, Date.now());
112
+ },
113
+ },
114
+ ],
115
+ };
116
+ //# sourceMappingURL=directoryCommand.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"directoryCommand.js","sourceRoot":"","sources":["../../../../src/ui/commands/directoryCommand.tsx"],"names":[],"mappings":"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"}
@@ -3,119 +3,115 @@
3
3
  * Copyright 2025 Google LLC
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
- import { fileURLToPath } from 'url';
7
- import { IDEConnectionStatus } from '@vybestack/llxprt-code-core';
6
+ import { IDEConnectionStatus, getIdeDisplayName, getIdeInstaller, } from '@vybestack/llxprt-code-core';
8
7
  import { CommandKind, } from './types.js';
9
- import * as child_process from 'child_process';
10
- import * as process from 'process';
11
- import { glob } from 'glob';
12
- import * as path from 'path';
13
- const VSCODE_COMMAND = process.platform === 'win32' ? 'code.cmd' : 'code';
14
- const VSCODE_COMPANION_EXTENSION_FOLDER = 'vscode-ide-companion';
15
- function isVSCodeInstalled() {
16
- try {
17
- child_process.execSync(process.platform === 'win32'
18
- ? `where.exe ${VSCODE_COMMAND}`
19
- : `command -v ${VSCODE_COMMAND}`, { stdio: 'ignore' });
20
- return true;
21
- }
22
- catch {
23
- return false;
24
- }
25
- }
8
+ import { SettingScope } from '../../config/settings.js';
26
9
  export const ideCommand = (config) => {
27
- if (!config?.getIdeMode()) {
10
+ if (!config?.getIdeModeFeature()) {
28
11
  return null;
29
12
  }
30
- return {
13
+ const currentIDE = config.getIdeClient()?.getCurrentIde();
14
+ if (!currentIDE) {
15
+ return null;
16
+ }
17
+ const ideSlashCommand = {
31
18
  name: 'ide',
32
19
  description: 'manage IDE integration',
33
20
  kind: CommandKind.BUILT_IN,
34
- subCommands: [
35
- {
36
- name: 'status',
37
- description: 'check status of IDE integration',
38
- kind: CommandKind.BUILT_IN,
39
- action: (_context) => {
40
- const connection = config.getIdeClient()?.getConnectionStatus();
41
- switch (connection?.status) {
42
- case IDEConnectionStatus.Connected:
43
- return {
44
- type: 'message',
45
- messageType: 'info',
46
- content: `🟢 Connected`,
47
- };
48
- case IDEConnectionStatus.Connecting:
49
- return {
50
- type: 'message',
51
- messageType: 'info',
52
- content: `🟡 Connecting...`,
53
- };
54
- default: {
55
- let content = `🔴 Disconnected`;
56
- if (connection?.details) {
57
- content += `: ${connection.details}`;
58
- }
59
- return {
60
- type: 'message',
61
- messageType: 'error',
62
- content,
63
- };
64
- }
65
- }
66
- },
67
- },
68
- {
69
- name: 'install',
70
- description: 'install required VS Code companion extension',
71
- kind: CommandKind.BUILT_IN,
72
- action: async (context) => {
73
- if (!isVSCodeInstalled()) {
74
- context.ui.addItem({
75
- type: 'error',
76
- text: `VS Code command-line tool "${VSCODE_COMMAND}" not found in your PATH.`,
77
- }, Date.now());
78
- return;
79
- }
80
- const bundleDir = path.dirname(fileURLToPath(import.meta.url));
81
- // The VSIX file is copied to the bundle directory as part of the build.
82
- let vsixFiles = glob.sync(path.join(bundleDir, '*.vsix'));
83
- if (vsixFiles.length === 0) {
84
- // If the VSIX file is not in the bundle, it might be a dev
85
- // environment running with `npm start`. Look for it in the original
86
- // package location, relative to the bundle dir.
87
- const devPath = path.join(bundleDir, '..', '..', '..', '..', '..', VSCODE_COMPANION_EXTENSION_FOLDER, '*.vsix');
88
- vsixFiles = glob.sync(devPath);
89
- }
90
- if (vsixFiles.length === 0) {
91
- context.ui.addItem({
92
- type: 'error',
93
- text: 'Could not find the required VS Code companion extension. Please file a bug via /bug.',
94
- }, Date.now());
95
- return;
96
- }
97
- const vsixPath = vsixFiles[0];
98
- const command = `${VSCODE_COMMAND} --install-extension ${vsixPath} --force`;
99
- context.ui.addItem({
100
- type: 'info',
101
- text: `Installing VS Code companion extension...`,
102
- }, Date.now());
103
- try {
104
- child_process.execSync(command, { stdio: 'pipe' });
105
- context.ui.addItem({
106
- type: 'info',
107
- text: 'VS Code companion extension installed successfully. Restart llxprt in a fresh terminal window.',
108
- }, Date.now());
109
- }
110
- catch (_error) {
111
- context.ui.addItem({
112
- type: 'error',
113
- text: `Failed to install VS Code companion extension.`,
114
- }, Date.now());
21
+ subCommands: [],
22
+ };
23
+ const statusCommand = {
24
+ name: 'status',
25
+ description: 'check status of IDE integration',
26
+ kind: CommandKind.BUILT_IN,
27
+ action: (_context) => {
28
+ const connection = config.getIdeClient()?.getConnectionStatus();
29
+ switch (connection?.status) {
30
+ case IDEConnectionStatus.Connected:
31
+ return {
32
+ type: 'message',
33
+ messageType: 'info',
34
+ content: `🟢 Connected`,
35
+ };
36
+ case IDEConnectionStatus.Connecting:
37
+ return {
38
+ type: 'message',
39
+ messageType: 'info',
40
+ content: `🟡 Connecting...`,
41
+ };
42
+ default: {
43
+ let content = `🔴 Disconnected`;
44
+ if (connection?.details) {
45
+ content += `: ${connection.details}`;
115
46
  }
116
- },
117
- },
118
- ],
47
+ return {
48
+ type: 'message',
49
+ messageType: 'error',
50
+ content,
51
+ };
52
+ }
53
+ }
54
+ },
55
+ };
56
+ const installCommand = {
57
+ name: 'install',
58
+ description: `install required IDE companion ${getIdeDisplayName(currentIDE)} extension `,
59
+ kind: CommandKind.BUILT_IN,
60
+ action: async (context) => {
61
+ const installer = getIdeInstaller(currentIDE);
62
+ if (!installer) {
63
+ context.ui.addItem({
64
+ type: 'error',
65
+ text: 'No installer available for your configured IDE.',
66
+ }, Date.now());
67
+ return;
68
+ }
69
+ context.ui.addItem({
70
+ type: 'info',
71
+ text: `Installing IDE companion extension...`,
72
+ }, Date.now());
73
+ const result = await installer.install();
74
+ context.ui.addItem({
75
+ type: result.success ? 'info' : 'error',
76
+ text: result.message,
77
+ }, Date.now());
78
+ },
79
+ };
80
+ const enableCommand = {
81
+ name: 'enable',
82
+ description: 'enable IDE integration',
83
+ kind: CommandKind.BUILT_IN,
84
+ action: async (context) => {
85
+ context.services.settings.setValue(SettingScope.User, 'ideMode', true);
86
+ config.setIdeMode(true);
87
+ config.setIdeClientConnected();
88
+ },
119
89
  };
90
+ const disableCommand = {
91
+ name: 'disable',
92
+ description: 'disable IDE integration',
93
+ kind: CommandKind.BUILT_IN,
94
+ action: async (context) => {
95
+ context.services.settings.setValue(SettingScope.User, 'ideMode', false);
96
+ config.setIdeMode(false);
97
+ config.setIdeClientDisconnected();
98
+ },
99
+ };
100
+ const ideModeEnabled = config.getIdeMode();
101
+ if (ideModeEnabled) {
102
+ ideSlashCommand.subCommands = [
103
+ disableCommand,
104
+ statusCommand,
105
+ installCommand,
106
+ ];
107
+ }
108
+ else {
109
+ ideSlashCommand.subCommands = [
110
+ enableCommand,
111
+ statusCommand,
112
+ installCommand,
113
+ ];
114
+ }
115
+ return ideSlashCommand;
120
116
  };
121
117
  //# sourceMappingURL=ideCommand.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ideCommand.js","sourceRoot":"","sources":["../../../../src/ui/commands/ideCommand.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAU,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAC1E,OAAO,EAIL,WAAW,GACZ,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,aAAa,MAAM,eAAe,CAAC;AAC/C,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,MAAM,cAAc,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC;AAC1E,MAAM,iCAAiC,GAAG,sBAAsB,CAAC;AAEjE,SAAS,iBAAiB;IACxB,IAAI,CAAC;QACH,aAAa,CAAC,QAAQ,CACpB,OAAO,CAAC,QAAQ,KAAK,OAAO;YAC1B,CAAC,CAAC,aAAa,cAAc,EAAE;YAC/B,CAAC,CAAC,cAAc,cAAc,EAAE,EAClC,EAAE,KAAK,EAAE,QAAQ,EAAE,CACpB,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,MAAqB,EAAuB,EAAE;IACvE,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,EAAE,CAAC;QAC1B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO;QACL,IAAI,EAAE,KAAK;QACX,WAAW,EAAE,wBAAwB;QACrC,IAAI,EAAE,WAAW,CAAC,QAAQ;QAC1B,WAAW,EAAE;YACX;gBACE,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,iCAAiC;gBAC9C,IAAI,EAAE,WAAW,CAAC,QAAQ;gBAC1B,MAAM,EAAE,CAAC,QAAwB,EAA4B,EAAE;oBAC7D,MAAM,UAAU,GAAG,MAAM,CAAC,YAAY,EAAE,EAAE,mBAAmB,EAAE,CAAC;oBAChE,QAAQ,UAAU,EAAE,MAAM,EAAE,CAAC;wBAC3B,KAAK,mBAAmB,CAAC,SAAS;4BAChC,OAAO;gCACL,IAAI,EAAE,SAAS;gCACf,WAAW,EAAE,MAAM;gCACnB,OAAO,EAAE,cAAc;6BACf,CAAC;wBACb,KAAK,mBAAmB,CAAC,UAAU;4BACjC,OAAO;gCACL,IAAI,EAAE,SAAS;gCACf,WAAW,EAAE,MAAM;gCACnB,OAAO,EAAE,kBAAkB;6BACnB,CAAC;wBACb,OAAO,CAAC,CAAC,CAAC;4BACR,IAAI,OAAO,GAAG,iBAAiB,CAAC;4BAChC,IAAI,UAAU,EAAE,OAAO,EAAE,CAAC;gCACxB,OAAO,IAAI,KAAK,UAAU,CAAC,OAAO,EAAE,CAAC;4BACvC,CAAC;4BACD,OAAO;gCACL,IAAI,EAAE,SAAS;gCACf,WAAW,EAAE,OAAO;gCACpB,OAAO;6BACC,CAAC;wBACb,CAAC;oBACH,CAAC;gBACH,CAAC;aACF;YACD;gBACE,IAAI,EAAE,SAAS;gBACf,WAAW,EAAE,8CAA8C;gBAC3D,IAAI,EAAE,WAAW,CAAC,QAAQ;gBAC1B,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;oBACxB,IAAI,CAAC,iBAAiB,EAAE,EAAE,CAAC;wBACzB,OAAO,CAAC,EAAE,CAAC,OAAO,CAChB;4BACE,IAAI,EAAE,OAAO;4BACb,IAAI,EAAE,8BAA8B,cAAc,2BAA2B;yBAC9E,EACD,IAAI,CAAC,GAAG,EAAE,CACX,CAAC;wBACF,OAAO;oBACT,CAAC;oBAED,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;oBAC/D,wEAAwE;oBACxE,IAAI,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC;oBAC1D,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;wBAC3B,2DAA2D;wBAC3D,oEAAoE;wBACpE,gDAAgD;wBAChD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CACvB,SAAS,EACT,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,iCAAiC,EACjC,QAAQ,CACT,CAAC;wBACF,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;oBACjC,CAAC;oBACD,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;wBAC3B,OAAO,CAAC,EAAE,CAAC,OAAO,CAChB;4BACE,IAAI,EAAE,OAAO;4BACb,IAAI,EAAE,sFAAsF;yBAC7F,EACD,IAAI,CAAC,GAAG,EAAE,CACX,CAAC;wBACF,OAAO;oBACT,CAAC;oBAED,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;oBAC9B,MAAM,OAAO,GAAG,GAAG,cAAc,wBAAwB,QAAQ,UAAU,CAAC;oBAC5E,OAAO,CAAC,EAAE,CAAC,OAAO,CAChB;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,2CAA2C;qBAClD,EACD,IAAI,CAAC,GAAG,EAAE,CACX,CAAC;oBACF,IAAI,CAAC;wBACH,aAAa,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;wBACnD,OAAO,CAAC,EAAE,CAAC,OAAO,CAChB;4BACE,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,gGAAgG;yBACvG,EACD,IAAI,CAAC,GAAG,EAAE,CACX,CAAC;oBACJ,CAAC;oBAAC,OAAO,MAAM,EAAE,CAAC;wBAChB,OAAO,CAAC,EAAE,CAAC,OAAO,CAChB;4BACE,IAAI,EAAE,OAAO;4BACb,IAAI,EAAE,gDAAgD;yBACvD,EACD,IAAI,CAAC,GAAG,EAAE,CACX,CAAC;oBACJ,CAAC;gBACH,CAAC;aACF;SACF;KACF,CAAC;AACJ,CAAC,CAAC"}
1
+ {"version":3,"file":"ideCommand.js","sourceRoot":"","sources":["../../../../src/ui/commands/ideCommand.ts"],"names":[],"mappings":"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"}
@@ -5,38 +5,39 @@
5
5
  */
6
6
  import * as fs from 'fs';
7
7
  import * as path from 'path';
8
+ import * as os from 'os';
8
9
  import { CommandKind, } from './types.js';
9
- export const initCommand = {
10
- name: 'init',
11
- description: 'Analyzes the project and creates a tailored LLXPRT.md file.',
12
- kind: CommandKind.BUILT_IN,
13
- action: async (context, _args) => {
14
- if (!context.services.config) {
15
- return {
16
- type: 'message',
17
- messageType: 'error',
18
- content: 'Configuration not available.',
19
- };
10
+ import { PromptService } from '@vybestack/llxprt-code-core';
11
+ /**
12
+ * Get the init command prompt from the prompt service
13
+ */
14
+ async function getInitCommandPrompt() {
15
+ try {
16
+ const baseDir = process.env.LLXPRT_PROMPTS_DIR ||
17
+ path.join(os.homedir(), '.llxprt', 'prompts');
18
+ const promptService = new PromptService({
19
+ baseDir,
20
+ debugMode: process.env.DEBUG === 'true',
21
+ });
22
+ await promptService.initialize();
23
+ try {
24
+ return await promptService.loadPrompt('commands/init-command.md');
20
25
  }
21
- const targetDir = context.services.config.getTargetDir();
22
- const llxprtMdPath = path.join(targetDir, 'LLXPRT.md');
23
- if (fs.existsSync(llxprtMdPath)) {
24
- return {
25
- type: 'message',
26
- messageType: 'info',
27
- content: 'A LLXPRT.md file already exists in this directory. No changes were made.',
28
- };
26
+ catch (error) {
27
+ console.warn('Failed to load init command prompt from file, using fallback:', error);
29
28
  }
30
- // Create an empty LLXPRT.md file
31
- fs.writeFileSync(llxprtMdPath, '', 'utf8');
32
- context.ui.addItem({
33
- type: 'info',
34
- text: 'Empty LLXPRT.md created. Now analyzing the project to populate it.',
35
- }, Date.now());
36
- return {
37
- type: 'submit_prompt',
38
- content: `
39
- You are an AI agent that brings the power of multiple LLM providers directly into the terminal. Your task is to analyze the current directory and generate a comprehensive LLXPRT.md file to be used as instructional context for future interactions.
29
+ }
30
+ catch (error) {
31
+ console.warn('Failed to initialize prompt service, using fallback:', error);
32
+ }
33
+ // Fallback to hardcoded prompt
34
+ return getFallbackInitCommandPrompt();
35
+ }
36
+ /**
37
+ * Fallback prompt if the prompt service is not available
38
+ */
39
+ function getFallbackInitCommandPrompt() {
40
+ return `You are an AI agent that brings the power of multiple LLM providers directly into the terminal. Your task is to analyze the current directory and generate a comprehensive LLXPRT.md file to be used as instructional context for future interactions.
40
41
 
41
42
  **Analysis Process:**
42
43
 
@@ -68,8 +69,39 @@ You are an AI agent that brings the power of multiple LLM providers directly int
68
69
 
69
70
  **Final Output:**
70
71
 
71
- Write the complete content to the \`LLXPRT.md\` file. The output must be well-formatted Markdown.
72
- `,
72
+ Write the complete content to the \`LLXPRT.md\` file. The output must be well-formatted Markdown.`;
73
+ }
74
+ export const initCommand = {
75
+ name: 'init',
76
+ description: 'Analyzes the project and creates a tailored LLXPRT.md file.',
77
+ kind: CommandKind.BUILT_IN,
78
+ action: async (context, _args) => {
79
+ if (!context.services.config) {
80
+ return {
81
+ type: 'message',
82
+ messageType: 'error',
83
+ content: 'Configuration not available.',
84
+ };
85
+ }
86
+ const targetDir = context.services.config.getTargetDir();
87
+ const llxprtMdPath = path.join(targetDir, 'LLXPRT.md');
88
+ if (fs.existsSync(llxprtMdPath)) {
89
+ return {
90
+ type: 'message',
91
+ messageType: 'info',
92
+ content: 'A LLXPRT.md file already exists in this directory. No changes were made.',
93
+ };
94
+ }
95
+ // Create an empty LLXPRT.md file
96
+ fs.writeFileSync(llxprtMdPath, '', 'utf8');
97
+ context.ui.addItem({
98
+ type: 'info',
99
+ text: 'Empty LLXPRT.md created. Now analyzing the project to populate it.',
100
+ }, Date.now());
101
+ const initPrompt = await getInitCommandPrompt();
102
+ return {
103
+ type: 'submit_prompt',
104
+ content: initPrompt,
73
105
  };
74
106
  },
75
107
  };
@@ -1 +1 @@
1
- {"version":3,"file":"initCommand.js","sourceRoot":"","sources":["../../../../src/ui/commands/initCommand.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAIL,WAAW,GACZ,MAAM,YAAY,CAAC;AAEpB,MAAM,CAAC,MAAM,WAAW,GAAiB;IACvC,IAAI,EAAE,MAAM;IACZ,WAAW,EAAE,6DAA6D;IAC1E,IAAI,EAAE,WAAW,CAAC,QAAQ;IAC1B,MAAM,EAAE,KAAK,EACX,OAAuB,EACvB,KAAa,EACsB,EAAE;QACrC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;YAC7B,OAAO;gBACL,IAAI,EAAE,SAAS;gBACf,WAAW,EAAE,OAAO;gBACpB,OAAO,EAAE,8BAA8B;aACxC,CAAC;QACJ,CAAC;QACD,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;QACzD,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QAEvD,IAAI,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YAChC,OAAO;gBACL,IAAI,EAAE,SAAS;gBACf,WAAW,EAAE,MAAM;gBACnB,OAAO,EACL,0EAA0E;aAC7E,CAAC;QACJ,CAAC;QAED,iCAAiC;QACjC,EAAE,CAAC,aAAa,CAAC,YAAY,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC;QAE3C,OAAO,CAAC,EAAE,CAAC,OAAO,CAChB;YACE,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,oEAAoE;SAC3E,EACD,IAAI,CAAC,GAAG,EAAE,CACX,CAAC;QAEF,OAAO;YACL,IAAI,EAAE,eAAe;YACrB,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkCd;SACI,CAAC;IACJ,CAAC;CACF,CAAC"}
1
+ {"version":3,"file":"initCommand.js","sourceRoot":"","sources":["../../../../src/ui/commands/initCommand.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,EAIL,WAAW,GACZ,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAE5D;;GAEG;AACH,KAAK,UAAU,oBAAoB;IACjC,IAAI,CAAC;QACH,MAAM,OAAO,GACX,OAAO,CAAC,GAAG,CAAC,kBAAkB;YAC9B,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;QAChD,MAAM,aAAa,GAAG,IAAI,aAAa,CAAC;YACtC,OAAO;YACP,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,MAAM;SACxC,CAAC,CAAC;QACH,MAAM,aAAa,CAAC,UAAU,EAAE,CAAC;QAEjC,IAAI,CAAC;YACH,OAAO,MAAM,aAAa,CAAC,UAAU,CAAC,0BAA0B,CAAC,CAAC;QACpE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CACV,+DAA+D,EAC/D,KAAK,CACN,CAAC;QACJ,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,sDAAsD,EAAE,KAAK,CAAC,CAAC;IAC9E,CAAC;IAED,+BAA+B;IAC/B,OAAO,4BAA4B,EAAE,CAAC;AACxC,CAAC;AAED;;GAEG;AACH,SAAS,4BAA4B;IACnC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kGAgCyF,CAAC;AACnG,CAAC;AAED,MAAM,CAAC,MAAM,WAAW,GAAiB;IACvC,IAAI,EAAE,MAAM;IACZ,WAAW,EAAE,6DAA6D;IAC1E,IAAI,EAAE,WAAW,CAAC,QAAQ;IAC1B,MAAM,EAAE,KAAK,EACX,OAAuB,EACvB,KAAa,EACsB,EAAE;QACrC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;YAC7B,OAAO;gBACL,IAAI,EAAE,SAAS;gBACf,WAAW,EAAE,OAAO;gBACpB,OAAO,EAAE,8BAA8B;aACxC,CAAC;QACJ,CAAC;QACD,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;QACzD,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QAEvD,IAAI,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YAChC,OAAO;gBACL,IAAI,EAAE,SAAS;gBACf,WAAW,EAAE,MAAM;gBACnB,OAAO,EACL,0EAA0E;aAC7E,CAAC;QACJ,CAAC;QAED,iCAAiC;QACjC,EAAE,CAAC,aAAa,CAAC,YAAY,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC;QAE3C,OAAO,CAAC,EAAE,CAAC,OAAO,CAChB;YACE,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,oEAAoE;SAC3E,EACD,IAAI,CAAC,GAAG,EAAE,CACX,CAAC;QAEF,MAAM,UAAU,GAAG,MAAM,oBAAoB,EAAE,CAAC;QAEhD,OAAO;YACL,IAAI,EAAE,eAAe;YACrB,OAAO,EAAE,UAAU;SACpB,CAAC;IACJ,CAAC;CACF,CAAC"}