@vybestack/llxprt-code 0.1.14-nightly.250729.2076f7c6 → 0.1.15

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 (116) hide show
  1. package/README.md +53 -0
  2. package/dist/package.json +4 -5
  3. package/dist/src/config/extension.d.ts +1 -0
  4. package/dist/src/config/extension.js +4 -0
  5. package/dist/src/config/extension.js.map +1 -1
  6. package/dist/src/config/settings.d.ts +2 -1
  7. package/dist/src/config/settings.js.map +1 -1
  8. package/dist/src/gemini.d.ts +1 -0
  9. package/dist/src/gemini.js +35 -15
  10. package/dist/src/gemini.js.map +1 -1
  11. package/dist/src/generated/git-commit.d.ts +1 -1
  12. package/dist/src/generated/git-commit.js +1 -1
  13. package/dist/src/services/BuiltinCommandLoader.js +2 -0
  14. package/dist/src/services/BuiltinCommandLoader.js.map +1 -1
  15. package/dist/src/services/CommandService.d.ts +8 -4
  16. package/dist/src/services/CommandService.js +24 -8
  17. package/dist/src/services/CommandService.js.map +1 -1
  18. package/dist/src/services/FileCommandLoader.d.ts +15 -3
  19. package/dist/src/services/FileCommandLoader.js +94 -42
  20. package/dist/src/services/FileCommandLoader.js.map +1 -1
  21. package/dist/src/services/McpPromptLoader.d.ts +25 -0
  22. package/dist/src/services/McpPromptLoader.js +192 -0
  23. package/dist/src/services/McpPromptLoader.js.map +1 -0
  24. package/dist/src/services/prompt-processors/shellProcessor.d.ts +32 -0
  25. package/dist/src/services/prompt-processors/shellProcessor.js +77 -0
  26. package/dist/src/services/prompt-processors/shellProcessor.js.map +1 -0
  27. package/dist/src/services/prompt-processors/types.d.ts +4 -0
  28. package/dist/src/services/prompt-processors/types.js +4 -0
  29. package/dist/src/services/prompt-processors/types.js.map +1 -1
  30. package/dist/src/ui/App.js +312 -195
  31. package/dist/src/ui/App.js.map +1 -1
  32. package/dist/src/ui/commands/chatCommand.js +39 -1
  33. package/dist/src/ui/commands/chatCommand.js.map +1 -1
  34. package/dist/src/ui/commands/initCommand.d.ts +7 -0
  35. package/dist/src/ui/commands/initCommand.js +76 -0
  36. package/dist/src/ui/commands/initCommand.js.map +1 -0
  37. package/dist/src/ui/commands/mcpCommand.js +53 -8
  38. package/dist/src/ui/commands/mcpCommand.js.map +1 -1
  39. package/dist/src/ui/commands/types.d.ts +22 -3
  40. package/dist/src/ui/commands/types.js +1 -0
  41. package/dist/src/ui/commands/types.js.map +1 -1
  42. package/dist/src/ui/commands/vimCommand.js +0 -7
  43. package/dist/src/ui/commands/vimCommand.js.map +1 -1
  44. package/dist/src/ui/components/ContextSummaryDisplay.d.ts +3 -3
  45. package/dist/src/ui/components/ContextSummaryDisplay.js +8 -8
  46. package/dist/src/ui/components/ContextSummaryDisplay.js.map +1 -1
  47. package/dist/src/ui/components/Footer.d.ts +1 -0
  48. package/dist/src/ui/components/Footer.js +2 -2
  49. package/dist/src/ui/components/Footer.js.map +1 -1
  50. package/dist/src/ui/components/Header.js +1 -1
  51. package/dist/src/ui/components/Header.js.map +1 -1
  52. package/dist/src/ui/components/Help.js +2 -2
  53. package/dist/src/ui/components/Help.js.map +1 -1
  54. package/dist/src/ui/components/IDEContextDetailDisplay.d.ts +4 -4
  55. package/dist/src/ui/components/IDEContextDetailDisplay.js +5 -7
  56. package/dist/src/ui/components/IDEContextDetailDisplay.js.map +1 -1
  57. package/dist/src/ui/components/InputPrompt.d.ts +2 -0
  58. package/dist/src/ui/components/InputPrompt.js +5 -1
  59. package/dist/src/ui/components/InputPrompt.js.map +1 -1
  60. package/dist/src/ui/components/ShellConfirmationDialog.d.ts +15 -0
  61. package/dist/src/ui/components/ShellConfirmationDialog.js +45 -0
  62. package/dist/src/ui/components/ShellConfirmationDialog.js.map +1 -0
  63. package/dist/src/ui/components/Tips.js +1 -1
  64. package/dist/src/ui/components/Tips.js.map +1 -1
  65. package/dist/src/ui/components/shared/text-buffer.d.ts +270 -2
  66. package/dist/src/ui/components/shared/text-buffer.js +415 -70
  67. package/dist/src/ui/components/shared/text-buffer.js.map +1 -1
  68. package/dist/src/ui/components/shared/vim-buffer-actions.d.ts +72 -0
  69. package/dist/src/ui/components/shared/vim-buffer-actions.js +565 -0
  70. package/dist/src/ui/components/shared/vim-buffer-actions.js.map +1 -0
  71. package/dist/src/ui/contexts/VimModeContext.js +2 -2
  72. package/dist/src/ui/contexts/VimModeContext.js.map +1 -1
  73. package/dist/src/ui/hooks/shellCommandProcessor.d.ts +1 -0
  74. package/dist/src/ui/hooks/shellCommandProcessor.js +139 -200
  75. package/dist/src/ui/hooks/shellCommandProcessor.js.map +1 -1
  76. package/dist/src/ui/hooks/slashCommandProcessor.d.ts +7 -3
  77. package/dist/src/ui/hooks/slashCommandProcessor.js +208 -129
  78. package/dist/src/ui/hooks/slashCommandProcessor.js.map +1 -1
  79. package/dist/src/ui/hooks/useCompletion.js +7 -2
  80. package/dist/src/ui/hooks/useCompletion.js.map +1 -1
  81. package/dist/src/ui/hooks/useConsoleMessages.js +53 -37
  82. package/dist/src/ui/hooks/useConsoleMessages.js.map +1 -1
  83. package/dist/src/ui/hooks/useGeminiStream.js +14 -2
  84. package/dist/src/ui/hooks/useGeminiStream.js.map +1 -1
  85. package/dist/src/ui/hooks/useKeypress.js +5 -2
  86. package/dist/src/ui/hooks/useKeypress.js.map +1 -1
  87. package/dist/src/ui/hooks/useReactToolScheduler.js +0 -1
  88. package/dist/src/ui/hooks/useReactToolScheduler.js.map +1 -1
  89. package/dist/src/ui/hooks/vim.d.ts +28 -0
  90. package/dist/src/ui/hooks/vim.js +630 -0
  91. package/dist/src/ui/hooks/vim.js.map +1 -0
  92. package/dist/src/ui/themes/theme-manager.js +10 -1
  93. package/dist/src/ui/themes/theme-manager.js.map +1 -1
  94. package/dist/src/ui/themes/theme.d.ts +1 -0
  95. package/dist/src/ui/themes/theme.js +19 -4
  96. package/dist/src/ui/themes/theme.js.map +1 -1
  97. package/dist/src/ui/utils/textUtils.d.ts +0 -8
  98. package/dist/src/ui/utils/textUtils.js +0 -22
  99. package/dist/src/ui/utils/textUtils.js.map +1 -1
  100. package/dist/src/ui/utils/updateCheck.d.ts +7 -1
  101. package/dist/src/ui/utils/updateCheck.js +17 -28
  102. package/dist/src/ui/utils/updateCheck.js.map +1 -1
  103. package/dist/src/utils/events.d.ts +11 -0
  104. package/dist/src/utils/events.js +13 -0
  105. package/dist/src/utils/events.js.map +1 -0
  106. package/dist/src/utils/handleAutoUpdate.d.ts +10 -0
  107. package/dist/src/utils/handleAutoUpdate.js +97 -0
  108. package/dist/src/utils/handleAutoUpdate.js.map +1 -0
  109. package/dist/src/utils/installationInfo.d.ts +23 -0
  110. package/dist/src/utils/installationInfo.js +154 -0
  111. package/dist/src/utils/installationInfo.js.map +1 -0
  112. package/dist/src/utils/updateEventEmitter.d.ts +11 -0
  113. package/dist/src/utils/updateEventEmitter.js +12 -0
  114. package/dist/src/utils/updateEventEmitter.js.map +1 -0
  115. package/dist/tsconfig.tsbuildinfo +1 -1
  116. package/package.json +4 -5
@@ -11,7 +11,8 @@ import { z } from 'zod';
11
11
  import { getProjectCommandsDir, getUserCommandsDir, } from '@vybestack/llxprt-code-core';
12
12
  import { CommandKind, } from '../ui/commands/types.js';
13
13
  import { DefaultArgumentProcessor, ShorthandArgumentProcessor, } from './prompt-processors/argumentProcessor.js';
14
- import { SHORTHAND_ARGS_PLACEHOLDER, } from './prompt-processors/types.js';
14
+ import { SHORTHAND_ARGS_PLACEHOLDER, SHELL_INJECTION_TRIGGER, } from './prompt-processors/types.js';
15
+ import { ConfirmationRequiredError, ShellProcessor, } from './prompt-processors/shellProcessor.js';
15
16
  /**
16
17
  * Defines the Zod schema for a command definition file. This serves as the
17
18
  * single source of truth for both validation and type inference.
@@ -41,54 +42,78 @@ export class FileCommandLoader {
41
42
  this.projectRoot = config?.getProjectRoot() || process.cwd();
42
43
  }
43
44
  /**
44
- * Loads all commands, applying the precedence rule where project-level
45
- * commands override user-level commands with the same name.
45
+ * Loads all commands from user, project, and extension directories.
46
+ * Returns commands in order: user project extensions (alphabetically).
47
+ *
48
+ * Order is important for conflict resolution in CommandService:
49
+ * - User/project commands (without extensionName) use "last wins" strategy
50
+ * - Extension commands (with extensionName) get renamed if conflicts exist
51
+ *
46
52
  * @param signal An AbortSignal to cancel the loading process.
47
- * @returns A promise that resolves to an array of loaded SlashCommands.
53
+ * @returns A promise that resolves to an array of all loaded SlashCommands.
48
54
  */
49
55
  async loadCommands(signal) {
50
- const commandMap = new Map();
56
+ const allCommands = [];
51
57
  const globOptions = {
52
58
  nodir: true,
53
59
  dot: true,
54
60
  signal,
61
+ follow: true,
55
62
  };
56
- try {
57
- // User Commands
58
- const userDir = getUserCommandsDir();
59
- const userFiles = await glob('**/*.toml', {
60
- ...globOptions,
61
- cwd: userDir,
62
- });
63
- const userCommandPromises = userFiles.map((file) => this.parseAndAdaptFile(path.join(userDir, file), userDir));
64
- const userCommands = (await Promise.all(userCommandPromises)).filter((cmd) => cmd !== null);
65
- for (const cmd of userCommands) {
66
- commandMap.set(cmd.name, cmd);
63
+ // Load commands from each directory
64
+ const commandDirs = this.getCommandDirectories();
65
+ for (const dirInfo of commandDirs) {
66
+ try {
67
+ const files = await glob('**/*.toml', {
68
+ ...globOptions,
69
+ cwd: dirInfo.path,
70
+ });
71
+ const commandPromises = files.map((file) => this.parseAndAdaptFile(path.join(dirInfo.path, file), dirInfo.path, dirInfo.extensionName));
72
+ const commands = (await Promise.all(commandPromises)).filter((cmd) => cmd !== null);
73
+ // Add all commands without deduplication
74
+ allCommands.push(...commands);
67
75
  }
68
- // Project Commands (these intentionally override user commands)
69
- const projectDir = getProjectCommandsDir(this.projectRoot);
70
- const projectFiles = await glob('**/*.toml', {
71
- ...globOptions,
72
- cwd: projectDir,
73
- });
74
- const projectCommandPromises = projectFiles.map((file) => this.parseAndAdaptFile(path.join(projectDir, file), projectDir));
75
- const projectCommands = (await Promise.all(projectCommandPromises)).filter((cmd) => cmd !== null);
76
- for (const cmd of projectCommands) {
77
- commandMap.set(cmd.name, cmd);
76
+ catch (error) {
77
+ if (error.code !== 'ENOENT') {
78
+ console.error(`[FileCommandLoader] Error loading commands from ${dirInfo.path}:`, error);
79
+ }
78
80
  }
79
81
  }
80
- catch (error) {
81
- console.error(`[FileCommandLoader] Error during file search:`, error);
82
+ return allCommands;
83
+ }
84
+ /**
85
+ * Get all command directories in order for loading.
86
+ * User commands → Project commands → Extension commands
87
+ * This order ensures extension commands can detect all conflicts.
88
+ */
89
+ getCommandDirectories() {
90
+ const dirs = [];
91
+ // 1. User commands
92
+ dirs.push({ path: getUserCommandsDir() });
93
+ // 2. Project commands (override user commands)
94
+ dirs.push({ path: getProjectCommandsDir(this.projectRoot) });
95
+ // 3. Extension commands (processed last to detect all conflicts)
96
+ if (this.config) {
97
+ const activeExtensions = this.config
98
+ .getExtensions()
99
+ .filter((ext) => ext.isActive)
100
+ .sort((a, b) => a.name.localeCompare(b.name)); // Sort alphabetically for deterministic loading
101
+ const extensionCommandDirs = activeExtensions.map((ext) => ({
102
+ path: path.join(ext.path, 'commands'),
103
+ extensionName: ext.name,
104
+ }));
105
+ dirs.push(...extensionCommandDirs);
82
106
  }
83
- return Array.from(commandMap.values());
107
+ return dirs;
84
108
  }
85
109
  /**
86
110
  * Parses a single .toml file and transforms it into a SlashCommand object.
87
111
  * @param filePath The absolute path to the .toml file.
88
112
  * @param baseDir The root command directory for name calculation.
113
+ * @param extensionName Optional extension name to prefix commands with.
89
114
  * @returns A promise resolving to a SlashCommand, or null if the file is invalid.
90
115
  */
91
- async parseAndAdaptFile(filePath, baseDir) {
116
+ async parseAndAdaptFile(filePath, baseDir, extensionName) {
92
117
  let fileContent;
93
118
  try {
94
119
  fileContent = await fs.readFile(filePath, 'utf-8');
@@ -113,14 +138,24 @@ export class FileCommandLoader {
113
138
  const validDef = validationResult.data;
114
139
  const relativePathWithExt = path.relative(baseDir, filePath);
115
140
  const relativePath = relativePathWithExt.substring(0, relativePathWithExt.length - 5);
116
- const commandName = relativePath
141
+ const baseCommandName = relativePath
117
142
  .split(path.sep)
118
143
  // Sanitize each path segment to prevent ambiguity. Since ':' is our
119
144
  // namespace separator, we replace any literal colons in filenames
120
145
  // with underscores to avoid naming conflicts.
121
146
  .map((segment) => segment.replaceAll(':', '_'))
122
147
  .join(':');
148
+ // Add extension name tag for extension commands
149
+ const defaultDescription = `Custom command from ${path.basename(filePath)}`;
150
+ let description = validDef.description || defaultDescription;
151
+ if (extensionName) {
152
+ description = `[${extensionName}] ${description}`;
153
+ }
123
154
  const processors = [];
155
+ // Add the Shell Processor if needed.
156
+ if (validDef.prompt.includes(SHELL_INJECTION_TRIGGER)) {
157
+ processors.push(new ShellProcessor(baseCommandName));
158
+ }
124
159
  // The presence of '{{args}}' is the switch that determines the behavior.
125
160
  if (validDef.prompt.includes(SHORTHAND_ARGS_PLACEHOLDER)) {
126
161
  processors.push(new ShorthandArgumentProcessor());
@@ -129,26 +164,43 @@ export class FileCommandLoader {
129
164
  processors.push(new DefaultArgumentProcessor());
130
165
  }
131
166
  return {
132
- name: commandName,
133
- description: validDef.description ||
134
- `Custom command from ${path.basename(filePath)}`,
167
+ name: baseCommandName,
168
+ description,
135
169
  kind: CommandKind.FILE,
170
+ extensionName,
136
171
  action: async (context, _args) => {
137
172
  if (!context.invocation) {
138
- console.error(`[FileCommandLoader] Critical error: Command '${commandName}' was executed without invocation context.`);
173
+ console.error(`[FileCommandLoader] Critical error: Command '${baseCommandName}' was executed without invocation context.`);
139
174
  return {
140
175
  type: 'submit_prompt',
141
176
  content: validDef.prompt, // Fallback to unprocessed prompt
142
177
  };
143
178
  }
144
- let processedPrompt = validDef.prompt;
145
- for (const processor of processors) {
146
- processedPrompt = await processor.process(processedPrompt, context);
179
+ try {
180
+ let processedPrompt = validDef.prompt;
181
+ for (const processor of processors) {
182
+ processedPrompt = await processor.process(processedPrompt, context);
183
+ }
184
+ return {
185
+ type: 'submit_prompt',
186
+ content: processedPrompt,
187
+ };
188
+ }
189
+ catch (e) {
190
+ // Check if it's our specific error type
191
+ if (e instanceof ConfirmationRequiredError) {
192
+ // Halt and request confirmation from the UI layer.
193
+ return {
194
+ type: 'confirm_shell_commands',
195
+ commandsToConfirm: e.commandsToConfirm,
196
+ originalInvocation: {
197
+ raw: context.invocation.raw,
198
+ },
199
+ };
200
+ }
201
+ // Re-throw other errors to be handled by the global error handler.
202
+ throw e;
147
203
  }
148
- return {
149
- type: 'submit_prompt',
150
- content: processedPrompt,
151
- };
152
204
  },
153
205
  };
154
206
  }
@@ -1 +1 @@
1
- {"version":3,"file":"FileCommandLoader.js","sourceRoot":"","sources":["../../../src/services/FileCommandLoader.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"FileCommandLoader.js","sourceRoot":"","sources":["../../../src/services/FileCommandLoader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { Config } from '@vybestack/llxprt-code-core';
7
+ import { SlashCommand } from '../ui/commands/types.js';
8
+ import { ICommandLoader } from './types.js';
9
+ /**
10
+ * Discovers and loads executable slash commands from prompts exposed by
11
+ * Model-Context-Protocol (MCP) servers.
12
+ */
13
+ export declare class McpPromptLoader implements ICommandLoader {
14
+ private readonly config;
15
+ constructor(config: Config | null);
16
+ /**
17
+ * Loads all available prompts from all configured MCP servers and adapts
18
+ * them into executable SlashCommand objects.
19
+ *
20
+ * @param _signal An AbortSignal (unused for this synchronous loader).
21
+ * @returns A promise that resolves to an array of loaded SlashCommands.
22
+ */
23
+ loadCommands(_signal: AbortSignal): Promise<SlashCommand[]>;
24
+ private parseArgs;
25
+ }
@@ -0,0 +1,192 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { getErrorMessage, getMCPServerPrompts, } from '@vybestack/llxprt-code-core';
7
+ import { CommandKind, } from '../ui/commands/types.js';
8
+ /**
9
+ * Discovers and loads executable slash commands from prompts exposed by
10
+ * Model-Context-Protocol (MCP) servers.
11
+ */
12
+ export class McpPromptLoader {
13
+ config;
14
+ constructor(config) {
15
+ this.config = config;
16
+ }
17
+ /**
18
+ * Loads all available prompts from all configured MCP servers and adapts
19
+ * them into executable SlashCommand objects.
20
+ *
21
+ * @param _signal An AbortSignal (unused for this synchronous loader).
22
+ * @returns A promise that resolves to an array of loaded SlashCommands.
23
+ */
24
+ loadCommands(_signal) {
25
+ const promptCommands = [];
26
+ if (!this.config) {
27
+ return Promise.resolve([]);
28
+ }
29
+ const mcpServers = this.config.getMcpServers() || {};
30
+ for (const serverName in mcpServers) {
31
+ const prompts = getMCPServerPrompts(this.config, serverName) || [];
32
+ for (const prompt of prompts) {
33
+ const commandName = `${prompt.name}`;
34
+ const newPromptCommand = {
35
+ name: commandName,
36
+ description: prompt.description || `Invoke prompt ${prompt.name}`,
37
+ kind: CommandKind.MCP_PROMPT,
38
+ subCommands: [
39
+ {
40
+ name: 'help',
41
+ description: 'Show help for this prompt',
42
+ kind: CommandKind.MCP_PROMPT,
43
+ action: async () => {
44
+ if (!prompt.arguments || prompt.arguments.length === 0) {
45
+ return {
46
+ type: 'message',
47
+ messageType: 'info',
48
+ content: `Prompt "${prompt.name}" has no arguments.`,
49
+ };
50
+ }
51
+ let helpMessage = `Arguments for "${prompt.name}":\n\n`;
52
+ if (prompt.arguments && prompt.arguments.length > 0) {
53
+ helpMessage += `You can provide arguments by name (e.g., --argName="value") or by position.\n\n`;
54
+ helpMessage += `e.g., ${prompt.name} ${prompt.arguments?.map((_) => `"foo"`)} is equivalent to ${prompt.name} ${prompt.arguments?.map((arg) => `--${arg.name}="foo"`)}\n\n`;
55
+ }
56
+ for (const arg of prompt.arguments) {
57
+ helpMessage += ` --${arg.name}\n`;
58
+ if (arg.description) {
59
+ helpMessage += ` ${arg.description}\n`;
60
+ }
61
+ helpMessage += ` (required: ${arg.required ? 'yes' : 'no'})\n\n`;
62
+ }
63
+ return {
64
+ type: 'message',
65
+ messageType: 'info',
66
+ content: helpMessage,
67
+ };
68
+ },
69
+ },
70
+ ],
71
+ action: async (context, args) => {
72
+ if (!this.config) {
73
+ return {
74
+ type: 'message',
75
+ messageType: 'error',
76
+ content: 'Config not loaded.',
77
+ };
78
+ }
79
+ const promptInputs = this.parseArgs(args, prompt.arguments);
80
+ if (promptInputs instanceof Error) {
81
+ return {
82
+ type: 'message',
83
+ messageType: 'error',
84
+ content: promptInputs.message,
85
+ };
86
+ }
87
+ try {
88
+ const mcpServers = this.config.getMcpServers() || {};
89
+ const mcpServerConfig = mcpServers[serverName];
90
+ if (!mcpServerConfig) {
91
+ return {
92
+ type: 'message',
93
+ messageType: 'error',
94
+ content: `MCP server config not found for '${serverName}'.`,
95
+ };
96
+ }
97
+ const result = await prompt.invoke(promptInputs);
98
+ if (result.error) {
99
+ return {
100
+ type: 'message',
101
+ messageType: 'error',
102
+ content: `Error invoking prompt: ${result.error}`,
103
+ };
104
+ }
105
+ if (!result.messages?.[0]?.content?.text) {
106
+ return {
107
+ type: 'message',
108
+ messageType: 'error',
109
+ content: 'Received an empty or invalid prompt response from the server.',
110
+ };
111
+ }
112
+ return {
113
+ type: 'submit_prompt',
114
+ content: JSON.stringify(result.messages[0].content.text),
115
+ };
116
+ }
117
+ catch (error) {
118
+ return {
119
+ type: 'message',
120
+ messageType: 'error',
121
+ content: `Error: ${getErrorMessage(error)}`,
122
+ };
123
+ }
124
+ },
125
+ completion: async (_, partialArg) => {
126
+ if (!prompt || !prompt.arguments) {
127
+ return [];
128
+ }
129
+ const suggestions = [];
130
+ const usedArgNames = new Set((partialArg.match(/--([^=]+)/g) || []).map((s) => s.substring(2)));
131
+ for (const arg of prompt.arguments) {
132
+ if (!usedArgNames.has(arg.name)) {
133
+ suggestions.push(`--${arg.name}=""`);
134
+ }
135
+ }
136
+ return suggestions;
137
+ },
138
+ };
139
+ promptCommands.push(newPromptCommand);
140
+ }
141
+ }
142
+ return Promise.resolve(promptCommands);
143
+ }
144
+ parseArgs(userArgs, promptArgs) {
145
+ const argValues = {};
146
+ const promptInputs = {};
147
+ // arg parsing: --key="value" or --key=value
148
+ const namedArgRegex = /--([^=]+)=(?:"((?:\\.|[^"\\])*)"|([^ ]*))/g;
149
+ let match;
150
+ const remainingArgs = [];
151
+ let lastIndex = 0;
152
+ while ((match = namedArgRegex.exec(userArgs)) !== null) {
153
+ const key = match[1];
154
+ const value = match[2] ?? match[3]; // Quoted or unquoted value
155
+ argValues[key] = value;
156
+ // Capture text between matches as potential positional args
157
+ if (match.index > lastIndex) {
158
+ remainingArgs.push(userArgs.substring(lastIndex, match.index).trim());
159
+ }
160
+ lastIndex = namedArgRegex.lastIndex;
161
+ }
162
+ // Capture any remaining text after the last named arg
163
+ if (lastIndex < userArgs.length) {
164
+ remainingArgs.push(userArgs.substring(lastIndex).trim());
165
+ }
166
+ const positionalArgs = remainingArgs.join(' ').split(/ +/);
167
+ if (!promptArgs) {
168
+ return promptInputs;
169
+ }
170
+ for (const arg of promptArgs) {
171
+ if (argValues[arg.name]) {
172
+ promptInputs[arg.name] = argValues[arg.name];
173
+ }
174
+ }
175
+ const unfilledArgs = promptArgs.filter((arg) => arg.required && !promptInputs[arg.name]);
176
+ const missingArgs = [];
177
+ for (let i = 0; i < unfilledArgs.length; i++) {
178
+ if (positionalArgs.length > i && positionalArgs[i]) {
179
+ promptInputs[unfilledArgs[i].name] = positionalArgs[i];
180
+ }
181
+ else {
182
+ missingArgs.push(unfilledArgs[i].name);
183
+ }
184
+ }
185
+ if (missingArgs.length > 0) {
186
+ const missingArgNames = missingArgs.map((name) => `--${name}`).join(', ');
187
+ return new Error(`Missing required argument(s): ${missingArgNames}`);
188
+ }
189
+ return promptInputs;
190
+ }
191
+ }
192
+ //# sourceMappingURL=McpPromptLoader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"McpPromptLoader.js","sourceRoot":"","sources":["../../../src/services/McpPromptLoader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { CommandContext } from '../../ui/commands/types.js';
7
+ import { IPromptProcessor } from './types.js';
8
+ export declare class ConfirmationRequiredError extends Error {
9
+ commandsToConfirm: string[];
10
+ constructor(message: string, commandsToConfirm: string[]);
11
+ }
12
+ /**
13
+ * Finds all instances of shell command injections (`!{...}`) in a prompt,
14
+ * executes them, and replaces the injection site with the command's output.
15
+ *
16
+ * This processor ensures that only allowlisted commands are executed. If a
17
+ * disallowed command is found, it halts execution and reports an error.
18
+ */
19
+ export declare class ShellProcessor implements IPromptProcessor {
20
+ private readonly commandName;
21
+ /**
22
+ * A regular expression to find all instances of `!{...}`. The inner
23
+ * capture group extracts the command itself.
24
+ */
25
+ private static readonly SHELL_INJECTION_REGEX;
26
+ /**
27
+ * @param commandName The name of the custom command being executed, used
28
+ * for logging and error messages.
29
+ */
30
+ constructor(commandName: string);
31
+ process(prompt: string, context: CommandContext): Promise<string>;
32
+ }
@@ -0,0 +1,77 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { checkCommandPermissions, ShellExecutionService, } from '@vybestack/llxprt-code-core';
7
+ export class ConfirmationRequiredError extends Error {
8
+ commandsToConfirm;
9
+ constructor(message, commandsToConfirm) {
10
+ super(message);
11
+ this.commandsToConfirm = commandsToConfirm;
12
+ this.name = 'ConfirmationRequiredError';
13
+ }
14
+ }
15
+ /**
16
+ * Finds all instances of shell command injections (`!{...}`) in a prompt,
17
+ * executes them, and replaces the injection site with the command's output.
18
+ *
19
+ * This processor ensures that only allowlisted commands are executed. If a
20
+ * disallowed command is found, it halts execution and reports an error.
21
+ */
22
+ export class ShellProcessor {
23
+ commandName;
24
+ /**
25
+ * A regular expression to find all instances of `!{...}`. The inner
26
+ * capture group extracts the command itself.
27
+ */
28
+ static SHELL_INJECTION_REGEX = /!\{([^}]*)\}/g;
29
+ /**
30
+ * @param commandName The name of the custom command being executed, used
31
+ * for logging and error messages.
32
+ */
33
+ constructor(commandName) {
34
+ this.commandName = commandName;
35
+ }
36
+ async process(prompt, context) {
37
+ const { config, sessionShellAllowlist } = {
38
+ ...context.services,
39
+ ...context.session,
40
+ };
41
+ const commandsToExecute = [];
42
+ const commandsToConfirm = new Set();
43
+ const matches = [...prompt.matchAll(ShellProcessor.SHELL_INJECTION_REGEX)];
44
+ if (matches.length === 0) {
45
+ return prompt; // No shell commands, nothing to do.
46
+ }
47
+ // Discover all commands and check permissions.
48
+ for (const match of matches) {
49
+ const command = match[1].trim();
50
+ const { allAllowed, disallowedCommands, blockReason, isHardDenial } = checkCommandPermissions(command, config, sessionShellAllowlist);
51
+ if (!allAllowed) {
52
+ // If it's a hard denial, this is a non-recoverable security error.
53
+ if (isHardDenial) {
54
+ throw new Error(`${this.commandName} cannot be run. ${blockReason || 'A shell command in this custom command is explicitly blocked in your config settings.'}`);
55
+ }
56
+ // Add each soft denial disallowed command to the set for confirmation.
57
+ disallowedCommands.forEach((uc) => commandsToConfirm.add(uc));
58
+ }
59
+ commandsToExecute.push({ fullMatch: match[0], command });
60
+ }
61
+ // If any commands require confirmation, throw a special error to halt the
62
+ // pipeline and trigger the UI flow.
63
+ if (commandsToConfirm.size > 0) {
64
+ throw new ConfirmationRequiredError('Shell command confirmation required', Array.from(commandsToConfirm));
65
+ }
66
+ // Execute all commands (only runs if no confirmation was needed).
67
+ let processedPrompt = prompt;
68
+ for (const { fullMatch, command } of commandsToExecute) {
69
+ const { result } = ShellExecutionService.execute(command, config.getTargetDir(), () => { }, // No streaming needed.
70
+ new AbortController().signal);
71
+ const executionResult = await result;
72
+ processedPrompt = processedPrompt.replace(fullMatch, executionResult.output);
73
+ }
74
+ return processedPrompt;
75
+ }
76
+ }
77
+ //# sourceMappingURL=shellProcessor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shellProcessor.js","sourceRoot":"","sources":["../../../../src/services/prompt-processors/shellProcessor.ts"],"names":[],"mappings":"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"}
@@ -32,3 +32,7 @@ export interface IPromptProcessor {
32
32
  * The placeholder string for shorthand argument injection in custom commands.
33
33
  */
34
34
  export declare const SHORTHAND_ARGS_PLACEHOLDER = "{{args}}";
35
+ /**
36
+ * The trigger string for shell command injection in custom commands.
37
+ */
38
+ export declare const SHELL_INJECTION_TRIGGER = "!{";
@@ -7,4 +7,8 @@
7
7
  * The placeholder string for shorthand argument injection in custom commands.
8
8
  */
9
9
  export const SHORTHAND_ARGS_PLACEHOLDER = '{{args}}';
10
+ /**
11
+ * The trigger string for shell command injection in custom commands.
12
+ */
13
+ export const SHELL_INJECTION_TRIGGER = '!{';
10
14
  //# sourceMappingURL=types.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/services/prompt-processors/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA6BH;;GAEG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,UAAU,CAAC"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/services/prompt-processors/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA6BH;;GAEG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,UAAU,CAAC;AAErD;;GAEG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,IAAI,CAAC"}