@vybestack/llxprt-code 0.1.21 → 0.1.23-nightly.250823.4e884e4a

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 (187) hide show
  1. package/README.md +19 -0
  2. package/dist/package.json +3 -3
  3. package/dist/src/commands/mcp/add.js +11 -0
  4. package/dist/src/commands/mcp/add.js.map +1 -1
  5. package/dist/src/config/config.js +1 -0
  6. package/dist/src/config/config.js.map +1 -1
  7. package/dist/src/config/keyBindings.js +1 -0
  8. package/dist/src/config/keyBindings.js.map +1 -1
  9. package/dist/src/config/settings.d.ts +3 -0
  10. package/dist/src/config/settings.js +56 -39
  11. package/dist/src/config/settings.js.map +1 -1
  12. package/dist/src/config/settingsSchema.d.ts +24 -6
  13. package/dist/src/config/settingsSchema.js +24 -6
  14. package/dist/src/config/settingsSchema.js.map +1 -1
  15. package/dist/src/config/settingsSchema.test.js +1 -1
  16. package/dist/src/config/settingsSchema.test.js.map +1 -1
  17. package/dist/src/gemini.js +1 -1
  18. package/dist/src/gemini.js.map +1 -1
  19. package/dist/src/generated/git-commit.d.ts +1 -1
  20. package/dist/src/generated/git-commit.js +1 -1
  21. package/dist/src/integration-tests/ephemeral-settings.integration.test.js +47 -19
  22. package/dist/src/integration-tests/ephemeral-settings.integration.test.js.map +1 -1
  23. package/dist/src/nonInteractiveCli.js +3 -7
  24. package/dist/src/nonInteractiveCli.js.map +1 -1
  25. package/dist/src/providers/providerManagerInstance.d.ts +2 -1
  26. package/dist/src/providers/providerManagerInstance.js +27 -22
  27. package/dist/src/providers/providerManagerInstance.js.map +1 -1
  28. package/dist/src/services/BuiltinCommandLoader.js +2 -0
  29. package/dist/src/services/BuiltinCommandLoader.js.map +1 -1
  30. package/dist/src/services/FileCommandLoader.js +10 -8
  31. package/dist/src/services/FileCommandLoader.js.map +1 -1
  32. package/dist/src/services/prompt-processors/argumentProcessor.d.ts +2 -7
  33. package/dist/src/services/prompt-processors/argumentProcessor.js +2 -10
  34. package/dist/src/services/prompt-processors/argumentProcessor.js.map +1 -1
  35. package/dist/src/services/prompt-processors/shellProcessor.d.ts +16 -13
  36. package/dist/src/services/prompt-processors/shellProcessor.js +125 -40
  37. package/dist/src/services/prompt-processors/shellProcessor.js.map +1 -1
  38. package/dist/src/services/prompt-processors/types.d.ts +2 -0
  39. package/dist/src/services/prompt-processors/types.js +2 -0
  40. package/dist/src/services/prompt-processors/types.js.map +1 -1
  41. package/dist/src/test-utils/render.d.ts +8 -0
  42. package/dist/src/test-utils/render.js +10 -0
  43. package/dist/src/test-utils/render.js.map +1 -0
  44. package/dist/src/ui/App.js +10 -7
  45. package/dist/src/ui/App.js.map +1 -1
  46. package/dist/src/ui/colors.js +25 -2
  47. package/dist/src/ui/colors.js.map +1 -1
  48. package/dist/src/ui/commands/aboutCommand.js +4 -0
  49. package/dist/src/ui/commands/aboutCommand.js.map +1 -1
  50. package/dist/src/ui/commands/authCommand.js +3 -2
  51. package/dist/src/ui/commands/authCommand.js.map +1 -1
  52. package/dist/src/ui/commands/bugCommand.js +7 -1
  53. package/dist/src/ui/commands/bugCommand.js.map +1 -1
  54. package/dist/src/ui/commands/debugCommands.d.ts +22 -0
  55. package/dist/src/ui/commands/debugCommands.js +397 -0
  56. package/dist/src/ui/commands/debugCommands.js.map +1 -0
  57. package/dist/src/ui/commands/ideCommand.js +4 -7
  58. package/dist/src/ui/commands/ideCommand.js.map +1 -1
  59. package/dist/src/ui/commands/mcpCommand.js +6 -6
  60. package/dist/src/ui/commands/mcpCommand.js.map +1 -1
  61. package/dist/src/ui/commands/setCommand.js +41 -0
  62. package/dist/src/ui/commands/setCommand.js.map +1 -1
  63. package/dist/src/ui/commands/setCommand.test.js +4 -4
  64. package/dist/src/ui/commands/setCommand.test.js.map +1 -1
  65. package/dist/src/ui/components/AboutBox.d.ts +1 -0
  66. package/dist/src/ui/components/AboutBox.js +1 -1
  67. package/dist/src/ui/components/AboutBox.js.map +1 -1
  68. package/dist/src/ui/components/AuthDialog.js +16 -5
  69. package/dist/src/ui/components/AuthDialog.js.map +1 -1
  70. package/dist/src/ui/components/AuthDialog.test.js +11 -11
  71. package/dist/src/ui/components/AuthDialog.test.js.map +1 -1
  72. package/dist/src/ui/components/FolderTrustDialog.test.js +3 -3
  73. package/dist/src/ui/components/FolderTrustDialog.test.js.map +1 -1
  74. package/dist/src/ui/components/HistoryItemDisplay.js +1 -1
  75. package/dist/src/ui/components/HistoryItemDisplay.js.map +1 -1
  76. package/dist/src/ui/components/HistoryItemDisplay.test.js +1 -0
  77. package/dist/src/ui/components/HistoryItemDisplay.test.js.map +1 -1
  78. package/dist/src/ui/components/InputPrompt.js +14 -17
  79. package/dist/src/ui/components/InputPrompt.js.map +1 -1
  80. package/dist/src/ui/components/InputPrompt.paste.test.js +10 -4
  81. package/dist/src/ui/components/InputPrompt.paste.test.js.map +1 -1
  82. package/dist/src/ui/components/SettingsDialog.js +332 -62
  83. package/dist/src/ui/components/SettingsDialog.js.map +1 -1
  84. package/dist/src/ui/components/SettingsDialog.test.js +72 -59
  85. package/dist/src/ui/components/SettingsDialog.test.js.map +1 -1
  86. package/dist/src/ui/components/ShellConfirmationDialog.js +2 -1
  87. package/dist/src/ui/components/ShellConfirmationDialog.js.map +1 -1
  88. package/dist/src/ui/components/ShellConfirmationDialog.test.js +5 -5
  89. package/dist/src/ui/components/ShellConfirmationDialog.test.js.map +1 -1
  90. package/dist/src/ui/components/StatsDisplay.js +10 -5
  91. package/dist/src/ui/components/StatsDisplay.js.map +1 -1
  92. package/dist/src/ui/components/TodoPanel.js +34 -6
  93. package/dist/src/ui/components/TodoPanel.js.map +1 -1
  94. package/dist/src/ui/components/messages/DiffRenderer.js +7 -3
  95. package/dist/src/ui/components/messages/DiffRenderer.js.map +1 -1
  96. package/dist/src/ui/components/messages/DiffRenderer.test.js +27 -0
  97. package/dist/src/ui/components/messages/DiffRenderer.test.js.map +1 -1
  98. package/dist/src/ui/components/messages/InfoMessage.js +2 -1
  99. package/dist/src/ui/components/messages/InfoMessage.js.map +1 -1
  100. package/dist/src/ui/components/messages/ToolConfirmationMessage.js +2 -1
  101. package/dist/src/ui/components/messages/ToolConfirmationMessage.js.map +1 -1
  102. package/dist/src/ui/components/messages/ToolConfirmationMessage.responsive.test.js +15 -14
  103. package/dist/src/ui/components/messages/ToolConfirmationMessage.responsive.test.js.map +1 -1
  104. package/dist/src/ui/components/messages/ToolConfirmationMessage.test.js +3 -3
  105. package/dist/src/ui/components/messages/ToolConfirmationMessage.test.js.map +1 -1
  106. package/dist/src/ui/components/shared/RadioButtonSelect.test.js +14 -13
  107. package/dist/src/ui/components/shared/RadioButtonSelect.test.js.map +1 -1
  108. package/dist/src/ui/components/shared/text-buffer.js +4 -4
  109. package/dist/src/ui/components/shared/text-buffer.js.map +1 -1
  110. package/dist/src/ui/contexts/KeypressContext.d.ts +30 -0
  111. package/dist/src/ui/contexts/KeypressContext.js +313 -0
  112. package/dist/src/ui/contexts/KeypressContext.js.map +1 -0
  113. package/dist/src/ui/contexts/KeypressContext.test.d.ts +6 -0
  114. package/dist/src/ui/contexts/KeypressContext.test.js +219 -0
  115. package/dist/src/ui/contexts/KeypressContext.test.js.map +1 -0
  116. package/dist/src/ui/contexts/SessionContext.d.ts +3 -0
  117. package/dist/src/ui/contexts/SessionContext.js +1 -0
  118. package/dist/src/ui/contexts/SessionContext.js.map +1 -1
  119. package/dist/src/ui/hooks/atCommandProcessor.js +1 -1
  120. package/dist/src/ui/hooks/atCommandProcessor.js.map +1 -1
  121. package/dist/src/ui/hooks/atCommandProcessor.test.js +10 -3
  122. package/dist/src/ui/hooks/atCommandProcessor.test.js.map +1 -1
  123. package/dist/src/ui/hooks/index.d.ts +1 -0
  124. package/dist/src/ui/hooks/index.js +1 -0
  125. package/dist/src/ui/hooks/index.js.map +1 -1
  126. package/dist/src/ui/hooks/shellCommandProcessor.js +8 -13
  127. package/dist/src/ui/hooks/shellCommandProcessor.js.map +1 -1
  128. package/dist/src/ui/hooks/shellCommandProcessor.test.js +7 -5
  129. package/dist/src/ui/hooks/shellCommandProcessor.test.js.map +1 -1
  130. package/dist/src/ui/hooks/slashCommandProcessor.js +30 -9
  131. package/dist/src/ui/hooks/slashCommandProcessor.js.map +1 -1
  132. package/dist/src/ui/hooks/useAtCompletion.js +3 -5
  133. package/dist/src/ui/hooks/useAtCompletion.js.map +1 -1
  134. package/dist/src/ui/hooks/useGeminiStream.js +28 -1
  135. package/dist/src/ui/hooks/useGeminiStream.js.map +1 -1
  136. package/dist/src/ui/hooks/useKeypress.d.ts +4 -24
  137. package/dist/src/ui/hooks/useKeypress.js +9 -330
  138. package/dist/src/ui/hooks/useKeypress.js.map +1 -1
  139. package/dist/src/ui/hooks/useKeypress.test.js +5 -0
  140. package/dist/src/ui/hooks/useKeypress.test.js.map +1 -1
  141. package/dist/src/ui/hooks/usePhraseCycler.js +1 -0
  142. package/dist/src/ui/hooks/usePhraseCycler.js.map +1 -1
  143. package/dist/src/ui/hooks/usePrivacySettings.js +6 -2
  144. package/dist/src/ui/hooks/usePrivacySettings.js.map +1 -1
  145. package/dist/src/ui/hooks/usePrivacySettings.test.d.ts +6 -0
  146. package/dist/src/ui/hooks/usePrivacySettings.test.js +154 -0
  147. package/dist/src/ui/hooks/usePrivacySettings.test.js.map +1 -0
  148. package/dist/src/ui/hooks/useToolScheduler.test.d.ts +6 -0
  149. package/dist/src/ui/hooks/useToolScheduler.test.js +841 -0
  150. package/dist/src/ui/hooks/useToolScheduler.test.js.map +1 -0
  151. package/dist/src/ui/themes/semantic-resolver.js +16 -7
  152. package/dist/src/ui/themes/semantic-resolver.js.map +1 -1
  153. package/dist/src/ui/themes/semantic-resolver.test.js +68 -32
  154. package/dist/src/ui/themes/semantic-resolver.test.js.map +1 -1
  155. package/dist/src/ui/themes/semantic-tokens.d.ts +18 -33
  156. package/dist/src/ui/themes/semantic-tokens.js +88 -1
  157. package/dist/src/ui/themes/semantic-tokens.js.map +1 -1
  158. package/dist/src/ui/themes/semantic-tokens.test.js +22 -5
  159. package/dist/src/ui/themes/semantic-tokens.test.js.map +1 -1
  160. package/dist/src/ui/themes/theme-compat.d.ts +1 -1
  161. package/dist/src/ui/themes/theme-compat.js +7 -2
  162. package/dist/src/ui/themes/theme-compat.js.map +1 -1
  163. package/dist/src/ui/themes/theme-manager.test.js +10 -1
  164. package/dist/src/ui/themes/theme-manager.test.js.map +1 -1
  165. package/dist/src/ui/types.d.ts +12 -1
  166. package/dist/src/ui/types.js +1 -0
  167. package/dist/src/ui/types.js.map +1 -1
  168. package/dist/src/ui/utils/InlineMarkdownRenderer.js +8 -1
  169. package/dist/src/ui/utils/InlineMarkdownRenderer.js.map +1 -1
  170. package/dist/src/ui/utils/computeStats.js +3 -1
  171. package/dist/src/ui/utils/computeStats.js.map +1 -1
  172. package/dist/src/ui/utils/platformConstants.d.ts +5 -0
  173. package/dist/src/ui/utils/platformConstants.js +5 -0
  174. package/dist/src/ui/utils/platformConstants.js.map +1 -1
  175. package/dist/src/utils/settingsUtils.d.ts +8 -0
  176. package/dist/src/utils/settingsUtils.js +16 -7
  177. package/dist/src/utils/settingsUtils.js.map +1 -1
  178. package/dist/src/utils/settingsUtils.test.js +6 -6
  179. package/dist/src/utils/settingsUtils.test.js.map +1 -1
  180. package/dist/src/zed-integration/fileSystemService.d.ts +19 -0
  181. package/dist/src/zed-integration/fileSystemService.js +43 -0
  182. package/dist/src/zed-integration/fileSystemService.js.map +1 -0
  183. package/dist/src/zed-integration/schema.d.ts +16 -16
  184. package/dist/src/zed-integration/zedIntegration.js +17 -4
  185. package/dist/src/zed-integration/zedIntegration.js.map +1 -1
  186. package/dist/tsconfig.tsbuildinfo +1 -1
  187. package/package.json +3 -3
@@ -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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"}
@@ -5,16 +5,11 @@
5
5
  */
6
6
  import { IPromptProcessor } from './types.js';
7
7
  import { CommandContext } from '../../ui/commands/types.js';
8
- /**
9
- * Replaces all instances of `{{args}}` in a prompt with the user-provided
10
- * argument string.
11
- */
12
- export declare class ShorthandArgumentProcessor implements IPromptProcessor {
13
- process(prompt: string, context: CommandContext): Promise<string>;
14
- }
15
8
  /**
16
9
  * Appends the user's full command invocation to the prompt if arguments are
17
10
  * provided, allowing the model to perform its own argument parsing.
11
+ *
12
+ * This processor is only used if the prompt does NOT contain {{args}}.
18
13
  */
19
14
  export declare class DefaultArgumentProcessor implements IPromptProcessor {
20
15
  process(prompt: string, context: CommandContext): Promise<string>;
@@ -3,19 +3,11 @@
3
3
  * Copyright 2025 Google LLC
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
- import { SHORTHAND_ARGS_PLACEHOLDER } from './types.js';
7
- /**
8
- * Replaces all instances of `{{args}}` in a prompt with the user-provided
9
- * argument string.
10
- */
11
- export class ShorthandArgumentProcessor {
12
- async process(prompt, context) {
13
- return prompt.replaceAll(SHORTHAND_ARGS_PLACEHOLDER, context.invocation.args);
14
- }
15
- }
16
6
  /**
17
7
  * Appends the user's full command invocation to the prompt if arguments are
18
8
  * provided, allowing the model to perform its own argument parsing.
9
+ *
10
+ * This processor is only used if the prompt does NOT contain {{args}}.
19
11
  */
20
12
  export class DefaultArgumentProcessor {
21
13
  async process(prompt, context) {
@@ -1 +1 @@
1
- {"version":3,"file":"argumentProcessor.js","sourceRoot":"","sources":["../../../../src/services/prompt-processors/argumentProcessor.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAoB,0BAA0B,EAAE,MAAM,YAAY,CAAC;AAG1E;;;GAGG;AACH,MAAM,OAAO,0BAA0B;IACrC,KAAK,CAAC,OAAO,CAAC,MAAc,EAAE,OAAuB;QACnD,OAAO,MAAM,CAAC,UAAU,CACtB,0BAA0B,EAC1B,OAAO,CAAC,UAAW,CAAC,IAAI,CACzB,CAAC;IACJ,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,OAAO,wBAAwB;IACnC,KAAK,CAAC,OAAO,CAAC,MAAc,EAAE,OAAuB;QACnD,IAAI,OAAO,CAAC,UAAW,CAAC,IAAI,EAAE,CAAC;YAC7B,OAAO,GAAG,MAAM,OAAO,OAAO,CAAC,UAAW,CAAC,GAAG,EAAE,CAAC;QACnD,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}
1
+ {"version":3,"file":"argumentProcessor.js","sourceRoot":"","sources":["../../../../src/services/prompt-processors/argumentProcessor.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH;;;;;GAKG;AACH,MAAM,OAAO,wBAAwB;IACnC,KAAK,CAAC,OAAO,CAAC,MAAc,EAAE,OAAuB;QACnD,IAAI,OAAO,CAAC,UAAW,CAAC,IAAI,EAAE,CAAC;YAC7B,OAAO,GAAG,MAAM,OAAO,OAAO,CAAC,UAAW,CAAC,GAAG,EAAE,CAAC;QACnD,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}
@@ -10,23 +10,26 @@ export declare class ConfirmationRequiredError extends Error {
10
10
  constructor(message: string, commandsToConfirm: string[]);
11
11
  }
12
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.
13
+ * Handles prompt interpolation, including shell command execution (`!{...}`)
14
+ * and context-aware argument injection (`{{args}}`).
15
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.
16
+ * This processor ensures that:
17
+ * 1. `{{args}}` outside `!{...}` are replaced with raw input.
18
+ * 2. `{{args}}` inside `!{...}` are replaced with shell-escaped input.
19
+ * 3. Shell commands are executed securely after argument substitution.
20
+ * 4. Parsing correctly handles nested braces.
18
21
  */
19
22
  export declare class ShellProcessor implements IPromptProcessor {
20
23
  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
24
  constructor(commandName: string);
31
25
  process(prompt: string, context: CommandContext): Promise<string>;
26
+ /**
27
+ * Iteratively parses the prompt string to extract shell injections (!{...}),
28
+ * correctly handling nested braces within the command.
29
+ *
30
+ * @param prompt The prompt string to parse.
31
+ * @returns An array of extracted ShellInjection objects.
32
+ * @throws Error if an unclosed injection (`!{`) is found.
33
+ */
34
+ private extractInjections;
32
35
  }
@@ -3,7 +3,8 @@
3
3
  * Copyright 2025 Google LLC
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
- import { checkCommandPermissions, ShellExecutionService, } from '@vybestack/llxprt-code-core';
6
+ import { ApprovalMode, checkCommandPermissions, escapeShellArg, getShellConfiguration, ShellExecutionService, } from '@vybestack/llxprt-code-core';
7
+ import { SHELL_INJECTION_TRIGGER, SHORTHAND_ARGS_PLACEHOLDER, } from './types.js';
7
8
  export class ConfirmationRequiredError extends Error {
8
9
  commandsToConfirm;
9
10
  constructor(message, commandsToConfirm) {
@@ -13,65 +14,149 @@ export class ConfirmationRequiredError extends Error {
13
14
  }
14
15
  }
15
16
  /**
16
- * Finds all instances of shell command injections (`!{...}`) in a prompt,
17
- * executes them, and replaces the injection site with the command's output.
17
+ * Handles prompt interpolation, including shell command execution (`!{...}`)
18
+ * and context-aware argument injection (`{{args}}`).
18
19
  *
19
- * This processor ensures that only allowlisted commands are executed. If a
20
- * disallowed command is found, it halts execution and reports an error.
20
+ * This processor ensures that:
21
+ * 1. `{{args}}` outside `!{...}` are replaced with raw input.
22
+ * 2. `{{args}}` inside `!{...}` are replaced with shell-escaped input.
23
+ * 3. Shell commands are executed securely after argument substitution.
24
+ * 4. Parsing correctly handles nested braces.
21
25
  */
22
26
  export class ShellProcessor {
23
27
  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
28
  constructor(commandName) {
34
29
  this.commandName = commandName;
35
30
  }
36
31
  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.
32
+ const userArgsRaw = context.invocation?.args || '';
33
+ if (!prompt.includes(SHELL_INJECTION_TRIGGER)) {
34
+ return prompt.replaceAll(SHORTHAND_ARGS_PLACEHOLDER, userArgsRaw);
35
+ }
36
+ const config = context.services.config;
37
+ if (!config) {
38
+ throw new Error(`Security configuration not loaded. Cannot verify shell command permissions for '${this.commandName}'. Aborting.`);
46
39
  }
47
- // Discover all commands and check permissions.
48
- for (const match of matches) {
49
- const command = match[1].trim();
40
+ const { sessionShellAllowlist } = context.session;
41
+ const injections = this.extractInjections(prompt);
42
+ // If extractInjections found no closed blocks (and didn't throw), treat as raw.
43
+ if (injections.length === 0) {
44
+ return prompt.replaceAll(SHORTHAND_ARGS_PLACEHOLDER, userArgsRaw);
45
+ }
46
+ const { shell } = getShellConfiguration();
47
+ const userArgsEscaped = escapeShellArg(userArgsRaw, shell);
48
+ const resolvedInjections = injections.map((injection) => {
49
+ if (injection.command === '') {
50
+ return injection;
51
+ }
52
+ // Replace {{args}} inside the command string with the escaped version.
53
+ const resolvedCommand = injection.command.replaceAll(SHORTHAND_ARGS_PLACEHOLDER, userArgsEscaped);
54
+ return { ...injection, resolvedCommand };
55
+ });
56
+ const commandsToConfirm = new Set();
57
+ for (const injection of resolvedInjections) {
58
+ const command = injection.resolvedCommand;
59
+ if (!command)
60
+ continue;
61
+ // Security check on the final, escaped command string.
50
62
  const { allAllowed, disallowedCommands, blockReason, isHardDenial } = checkCommandPermissions(command, config, sessionShellAllowlist);
51
63
  if (!allAllowed) {
52
- // If it's a hard denial, this is a non-recoverable security error.
53
64
  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.'}`);
65
+ throw new Error(`${this.commandName} cannot be run. Blocked command: "${command}". Reason: ${blockReason || 'Blocked by configuration.'}`);
66
+ }
67
+ // If not a hard denial, respect YOLO mode and auto-approve.
68
+ if (config.getApprovalMode() !== ApprovalMode.YOLO) {
69
+ disallowedCommands.forEach((uc) => commandsToConfirm.add(uc));
55
70
  }
56
- // Add each soft denial disallowed command to the set for confirmation.
57
- disallowedCommands.forEach((uc) => commandsToConfirm.add(uc));
58
71
  }
59
- commandsToExecute.push({ fullMatch: match[0], command });
60
72
  }
61
- // If any commands require confirmation, throw a special error to halt the
62
- // pipeline and trigger the UI flow.
73
+ // Handle confirmation requirements.
63
74
  if (commandsToConfirm.size > 0) {
64
75
  throw new ConfirmationRequiredError('Shell command confirmation required', Array.from(commandsToConfirm));
65
76
  }
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);
77
+ let processedPrompt = '';
78
+ let lastIndex = 0;
79
+ for (const injection of resolvedInjections) {
80
+ // Append the text segment BEFORE the injection, substituting {{args}} with RAW input.
81
+ const segment = prompt.substring(lastIndex, injection.startIndex);
82
+ processedPrompt += segment.replaceAll(SHORTHAND_ARGS_PLACEHOLDER, userArgsRaw);
83
+ // Execute the resolved command (which already has ESCAPED input).
84
+ if (injection.resolvedCommand) {
85
+ const { result } = await ShellExecutionService.execute(injection.resolvedCommand, config.getTargetDir(), () => { }, new AbortController().signal, config.getShouldUseNodePtyShell());
86
+ const executionResult = await result;
87
+ // Handle Spawn Errors
88
+ if (executionResult.error && !executionResult.aborted) {
89
+ throw new Error(`Failed to start shell command in '${this.commandName}': ${executionResult.error.message}. Command: ${injection.resolvedCommand}`);
90
+ }
91
+ // Append the output, making stderr explicit for the model.
92
+ processedPrompt += executionResult.output;
93
+ // Append a status message if the command did not succeed.
94
+ if (executionResult.aborted) {
95
+ processedPrompt += `\n[Shell command '${injection.resolvedCommand}' aborted]`;
96
+ }
97
+ else if (executionResult.exitCode !== 0 &&
98
+ executionResult.exitCode !== null) {
99
+ processedPrompt += `\n[Shell command '${injection.resolvedCommand}' exited with code ${executionResult.exitCode}]`;
100
+ }
101
+ else if (executionResult.signal !== null) {
102
+ processedPrompt += `\n[Shell command '${injection.resolvedCommand}' terminated by signal ${executionResult.signal}]`;
103
+ }
104
+ }
105
+ lastIndex = injection.endIndex;
73
106
  }
107
+ // Append the remaining text AFTER the last injection, substituting {{args}} with RAW input.
108
+ const finalSegment = prompt.substring(lastIndex);
109
+ processedPrompt += finalSegment.replaceAll(SHORTHAND_ARGS_PLACEHOLDER, userArgsRaw);
74
110
  return processedPrompt;
75
111
  }
112
+ /**
113
+ * Iteratively parses the prompt string to extract shell injections (!{...}),
114
+ * correctly handling nested braces within the command.
115
+ *
116
+ * @param prompt The prompt string to parse.
117
+ * @returns An array of extracted ShellInjection objects.
118
+ * @throws Error if an unclosed injection (`!{`) is found.
119
+ */
120
+ extractInjections(prompt) {
121
+ const injections = [];
122
+ let index = 0;
123
+ while (index < prompt.length) {
124
+ const startIndex = prompt.indexOf(SHELL_INJECTION_TRIGGER, index);
125
+ if (startIndex === -1) {
126
+ break;
127
+ }
128
+ let currentIndex = startIndex + SHELL_INJECTION_TRIGGER.length;
129
+ let braceCount = 1;
130
+ let foundEnd = false;
131
+ while (currentIndex < prompt.length) {
132
+ const char = prompt[currentIndex];
133
+ // We count literal braces. This parser does not interpret shell quoting/escaping.
134
+ if (char === '{') {
135
+ braceCount++;
136
+ }
137
+ else if (char === '}') {
138
+ braceCount--;
139
+ if (braceCount === 0) {
140
+ const commandContent = prompt.substring(startIndex + SHELL_INJECTION_TRIGGER.length, currentIndex);
141
+ const endIndex = currentIndex + 1;
142
+ injections.push({
143
+ command: commandContent.trim(),
144
+ startIndex,
145
+ endIndex,
146
+ });
147
+ index = endIndex;
148
+ foundEnd = true;
149
+ break;
150
+ }
151
+ }
152
+ currentIndex++;
153
+ }
154
+ // Check if the inner loop finished without finding the closing brace.
155
+ if (!foundEnd) {
156
+ throw new Error(`Invalid syntax in command '${this.commandName}': Unclosed shell injection starting at index ${startIndex} ('!{'). Ensure braces are balanced.`);
157
+ }
158
+ }
159
+ return injections;
160
+ }
76
161
  }
77
162
  //# sourceMappingURL=shellProcessor.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"shellProcessor.js","sourceRoot":"","sources":["../../../../src/services/prompt-processors/shellProcessor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"shellProcessor.js","sourceRoot":"","sources":["../../../../src/services/prompt-processors/shellProcessor.ts"],"names":[],"mappings":"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"}
@@ -30,6 +30,8 @@ export interface IPromptProcessor {
30
30
  }
31
31
  /**
32
32
  * The placeholder string for shorthand argument injection in custom commands.
33
+ * When used outside of !{...}, arguments are injected raw.
34
+ * When used inside !{...}, arguments are shell-escaped.
33
35
  */
34
36
  export declare const SHORTHAND_ARGS_PLACEHOLDER = "{{args}}";
35
37
  /**
@@ -5,6 +5,8 @@
5
5
  */
6
6
  /**
7
7
  * The placeholder string for shorthand argument injection in custom commands.
8
+ * When used outside of !{...}, arguments are injected raw.
9
+ * When used inside !{...}, arguments are shell-escaped.
8
10
  */
9
11
  export const SHORTHAND_ARGS_PLACEHOLDER = '{{args}}';
10
12
  /**
@@ -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;AAErD;;GAEG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,IAAI,CAAC"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/services/prompt-processors/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA6BH;;;;GAIG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,UAAU,CAAC;AAErD;;GAEG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,IAAI,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { render } from 'ink-testing-library';
7
+ import React from 'react';
8
+ export declare const renderWithProviders: (component: React.ReactElement) => ReturnType<typeof render>;
@@ -0,0 +1,10 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ /**
3
+ * @license
4
+ * Copyright 2025 Google LLC
5
+ * SPDX-License-Identifier: Apache-2.0
6
+ */
7
+ import { render } from 'ink-testing-library';
8
+ import { KeypressProvider } from '../ui/contexts/KeypressContext.js';
9
+ export const renderWithProviders = (component) => render(_jsx(KeypressProvider, { kittyProtocolEnabled: true, children: component }));
10
+ //# sourceMappingURL=render.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.js","sourceRoot":"","sources":["../../../src/test-utils/render.tsx"],"names":[],"mappings":";AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAE7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAErE,MAAM,CAAC,MAAM,mBAAmB,GAAG,CACjC,SAA6B,EACF,EAAE,CAC7B,MAAM,CACJ,KAAC,gBAAgB,IAAC,oBAAoB,EAAE,IAAI,YACzC,SAAS,GACO,CACpB,CAAC"}
@@ -56,6 +56,7 @@ import { useTextBuffer } from './components/shared/text-buffer.js';
56
56
  import { useVimMode, VimModeProvider } from './contexts/VimModeContext.js';
57
57
  import { useVim } from './hooks/vim.js';
58
58
  import { useKeypress } from './hooks/useKeypress.js';
59
+ import { KeypressProvider } from './contexts/KeypressContext.js';
59
60
  import { useKittyKeyboardProtocol } from './hooks/useKittyKeyboardProtocol.js';
60
61
  import { keyMatchers, Command } from './keyMatchers.js';
61
62
  import * as fs from 'fs';
@@ -86,7 +87,10 @@ import { useTodoContext } from './contexts/TodoContext.js';
86
87
  const CTRL_EXIT_PROMPT_DURATION_MS = 1000;
87
88
  import { TodoProvider } from './contexts/TodoProvider.js';
88
89
  import { ToolCallProvider } from './contexts/ToolCallProvider.js';
89
- export const AppWrapper = (props) => (_jsx(SessionStatsProvider, { children: _jsx(VimModeProvider, { settings: props.settings, children: _jsx(ToolCallProvider, { sessionId: props.config.getSessionId(), children: _jsx(TodoProvider, { sessionId: props.config.getSessionId(), children: _jsx(AppWithState, { ...props }) }) }) }) }));
90
+ export const AppWrapper = (props) => {
91
+ const kittyProtocolStatus = useKittyKeyboardProtocol();
92
+ return (_jsx(KeypressProvider, { kittyProtocolEnabled: kittyProtocolStatus.enabled, config: props.config, children: _jsx(SessionStatsProvider, { children: _jsx(VimModeProvider, { settings: props.settings, children: _jsx(ToolCallProvider, { sessionId: props.config.getSessionId(), children: _jsx(TodoProvider, { sessionId: props.config.getSessionId(), children: _jsx(AppWithState, { ...props }) }) }) }) }) }));
93
+ };
90
94
  // New intermediate component that manages state and provides context
91
95
  const AppWithState = (props) => {
92
96
  const [appState, appDispatch] = useReducer(appReducer, initialAppState);
@@ -263,7 +267,7 @@ const App = (props) => {
263
267
  return () => clearInterval(checkOAuthFlag);
264
268
  }, [appDispatch]);
265
269
  const { isEditorDialogOpen, openEditorDialog, handleEditorSelect, exitEditorDialog, } = useEditorSettings(settings, appState, addItem);
266
- const providerManager = getProviderManager(config);
270
+ const providerManager = getProviderManager(config, false, settings);
267
271
  const { showDialog: isProviderDialogOpen, openDialog: openProviderDialog, handleSelect: handleProviderSelect, closeDialog: exitProviderDialog, } = useProviderDialog({
268
272
  addMessage: (msg) => addItem({ type: msg.type, text: msg.content }, msg.timestamp.getTime()),
269
273
  appState,
@@ -544,7 +548,6 @@ You can switch authentication methods by typing /auth or switch to a different m
544
548
  pendingHistoryItems.push(...pendingGeminiHistoryItems);
545
549
  const { elapsedTime, currentLoadingPhrase } = useLoadingIndicator(streamingState);
546
550
  const showAutoAcceptIndicator = useAutoAcceptIndicator({ config });
547
- const kittyProtocolStatus = useKittyKeyboardProtocol();
548
551
  const handleExit = useCallback((pressedOnce, setPressedOnce, timerRef) => {
549
552
  if (pressedOnce) {
550
553
  if (timerRef.current) {
@@ -629,8 +632,6 @@ You can switch authentication methods by typing /auth or switch to a different m
629
632
  ]);
630
633
  useKeypress(handleGlobalKeypress, {
631
634
  isActive: true,
632
- kittyProtocolEnabled: kittyProtocolStatus.enabled,
633
- config,
634
635
  });
635
636
  useEffect(() => {
636
637
  if (config) {
@@ -776,7 +777,7 @@ You can switch authentication methods by typing /auth or switch to a different m
776
777
  ], children: (item) => item }, staticKey), _jsx(OverflowProvider, { children: _jsxs(Box, { ref: pendingHistoryItemRef, flexDirection: "column", children: [pendingHistoryItems.map((item, i) => (_jsx(HistoryItemDisplay, { availableTerminalHeight: constrainHeight ? availableTerminalHeight : undefined, terminalWidth: mainAreaWidth,
777
778
  // TODO(taehykim): It seems like references to ids aren't necessary in
778
779
  // HistoryItemDisplay. Refactor later. Use a fake id for now.
779
- item: { ...item, id: 0 }, isPending: true, config: config, isFocused: !isEditorDialogOpen }, i))), _jsx(ShowMoreLines, { constrainHeight: constrainHeight })] }) }), showHelp && _jsx(Help, { commands: slashCommands }), _jsxs(Box, { flexDirection: "column", ref: mainControlsRef, children: [updateInfo && _jsx(UpdateNotification, { message: updateInfo.message }), startupWarnings.length > 0 && (_jsx(Box, { borderStyle: "round", borderColor: Colors.AccentYellow, paddingX: 1, marginY: 1, flexDirection: "column", children: startupWarnings.map((warning, index) => (_jsx(Text, { color: Colors.AccentYellow, children: warning }, index))) })), _jsx(TodoPanel, { width: inputWidth }), shouldShowIdePrompt && currentIDE ? (_jsx(IdeIntegrationNudge, { ide: currentIDE, onComplete: handleIdePromptComplete })) : isFolderTrustDialogOpen ? (_jsx(FolderTrustDialog, { onSelect: handleFolderTrustSelect })) : shellConfirmationRequest ? (_jsx(ShellConfirmationDialog, { request: shellConfirmationRequest })) : confirmationRequest ? (_jsxs(Box, { flexDirection: "column", children: [confirmationRequest.prompt, _jsx(Box, { paddingY: 1, children: _jsx(RadioButtonSelect, { items: [
780
+ item: { ...item, id: 0 }, isPending: true, config: config, isFocused: !isEditorDialogOpen }, i))), _jsx(ShowMoreLines, { constrainHeight: constrainHeight })] }) }), showHelp && _jsx(Help, { commands: slashCommands }), _jsxs(Box, { flexDirection: "column", ref: mainControlsRef, children: [updateInfo && _jsx(UpdateNotification, { message: updateInfo.message }), startupWarnings.length > 0 && (_jsx(Box, { borderStyle: "round", borderColor: Colors.AccentYellow, paddingX: 1, marginY: 1, flexDirection: "column", children: startupWarnings.map((warning, index) => (_jsx(Text, { color: Colors.AccentYellow, children: warning }, index))) })), _jsx(TodoPanel, { width: inputWidth }), shouldShowIdePrompt && currentIDE ? (_jsx(IdeIntegrationNudge, { ide: currentIDE, onComplete: handleIdePromptComplete })) : isFolderTrustDialogOpen ? (_jsx(FolderTrustDialog, { onSelect: handleFolderTrustSelect })) : shellConfirmationRequest ? (_jsx(ShellConfirmationDialog, { request: shellConfirmationRequest })) : confirmationRequest ? (_jsxs(Box, { flexDirection: "column", children: [confirmationRequest.prompt, _jsx(Box, { paddingY: 1, children: _jsx(RadioButtonSelect, { isFocused: !!confirmationRequest, items: [
780
781
  { label: 'Yes', value: true },
781
782
  { label: 'No', value: false },
782
783
  ], onSelect: handleConfirmationSelect }) })] })) : isThemeDialogOpen ? (_jsxs(Box, { flexDirection: "column", children: [_themeError && (_jsx(Box, { marginBottom: 1, children: _jsx(Text, { color: Colors.AccentRed, children: _themeError }) })), _jsx(ThemeDialog, { onSelect: handleThemeSelect, onHighlight: handleThemeHighlight, settings: settings, availableTerminalHeight: constrainHeight
@@ -788,6 +789,8 @@ You can switch authentication methods by typing /auth or switch to a different m
788
789
  : thought, currentLoadingPhrase: config.getAccessibility()?.disableLoadingPhrases
789
790
  ? undefined
790
791
  : currentLoadingPhrase, elapsedTime: elapsedTime }), _jsxs(Box, { marginTop: 1, display: "flex", justifyContent: "space-between", width: "100%", children: [_jsxs(Box, { children: [process.env.GEMINI_SYSTEM_MD && (_jsx(Text, { color: Colors.AccentRed, children: "|\u2310\u25A0_\u25A0| " })), ctrlCPressedOnce ? (_jsx(Text, { color: Colors.AccentYellow, children: "Press Ctrl+C again to exit." })) : ctrlDPressedOnce ? (_jsx(Text, { color: Colors.AccentYellow, children: "Press Ctrl+D again to exit." })) : showEscapePrompt ? (_jsx(Text, { color: Colors.Gray, children: "Press Esc again to clear." })) : (_jsx(ContextSummaryDisplay, { ideContext: ideContextState, llxprtMdFileCount: llxprtMdFileCount, contextFileNames: contextFileNames, mcpServers: config.getMcpServers(), blockedMcpServers: config.getBlockedMcpServers(), showToolDescriptions: showToolDescriptions }))] }), _jsxs(Box, { children: [showAutoAcceptIndicator !== ApprovalMode.DEFAULT &&
791
- !shellModeActive && (_jsx(AutoAcceptIndicator, { approvalMode: showAutoAcceptIndicator })), shellModeActive && _jsx(ShellModeIndicator, {})] })] }), showErrorDetails && (_jsx(OverflowProvider, { children: _jsxs(Box, { flexDirection: "column", children: [_jsx(DetailedMessagesDisplay, { messages: filteredConsoleMessages, maxHeight: constrainHeight ? debugConsoleMaxHeight : undefined, width: inputWidth }), _jsx(ShowMoreLines, { constrainHeight: constrainHeight })] }) })), isInputActive && (_jsx(_Fragment, { children: _jsx(InputPrompt, { buffer: buffer, inputWidth: inputWidth, suggestionsWidth: suggestionsWidth, onSubmit: handleUserInputSubmit, userMessages: userMessages, onClearScreen: handleClearScreen, config: config, slashCommands: slashCommands, commandContext: commandContext, shellModeActive: shellModeActive, setShellModeActive: setShellModeActive, onEscapePromptChange: handleEscapePromptChange, focus: isFocused, vimHandleInput: vimHandleInput, placeholder: placeholder }) }))] })), initError && streamingState !== StreamingState.Responding && (_jsx(Box, { borderStyle: "round", borderColor: Colors.AccentRed, paddingX: 1, marginBottom: 1, children: history.find((item) => item.type === 'error' && item.text?.includes(initError))?.text ? (_jsx(Text, { color: Colors.AccentRed, children: history.find((item) => item.type === 'error' && item.text?.includes(initError))?.text })) : (_jsxs(_Fragment, { children: [_jsxs(Text, { color: Colors.AccentRed, children: ["Initialization Error: ", initError] }), _jsxs(Text, { color: Colors.AccentRed, children: [' ', "Please check API key and configuration."] })] })) })), _jsx(Footer, { model: currentModel, targetDir: config.getTargetDir(), debugMode: config.getDebugMode(), branchName: branchName, debugMessage: debugMessage, errorCount: errorCount, showErrorDetails: showErrorDetails, showMemoryUsage: config.getDebugMode() || settings.merged.showMemoryUsage || false, promptTokenCount: sessionStats.lastPromptTokenCount, nightly: nightly, vimMode: vimModeEnabled ? vimMode : undefined, contextLimit: config.getEphemeralSetting('context-limit'), isTrustedFolder: config.isTrustedFolder() })] })] }) }));
792
+ !shellModeActive && (_jsx(AutoAcceptIndicator, { approvalMode: showAutoAcceptIndicator })), shellModeActive && _jsx(ShellModeIndicator, {})] })] }), showErrorDetails && (_jsx(OverflowProvider, { children: _jsxs(Box, { flexDirection: "column", children: [_jsx(DetailedMessagesDisplay, { messages: filteredConsoleMessages, maxHeight: constrainHeight ? debugConsoleMaxHeight : undefined, width: inputWidth }), _jsx(ShowMoreLines, { constrainHeight: constrainHeight })] }) })), isInputActive && (_jsx(_Fragment, { children: _jsx(InputPrompt, { buffer: buffer, inputWidth: inputWidth, suggestionsWidth: suggestionsWidth, onSubmit: handleUserInputSubmit, userMessages: userMessages, onClearScreen: handleClearScreen, config: config, slashCommands: slashCommands, commandContext: commandContext, shellModeActive: shellModeActive, setShellModeActive: setShellModeActive, onEscapePromptChange: handleEscapePromptChange, focus: isFocused, vimHandleInput: vimHandleInput, placeholder: placeholder }) }))] })), initError && streamingState !== StreamingState.Responding && (_jsx(Box, { borderStyle: "round", borderColor: Colors.AccentRed, paddingX: 1, marginBottom: 1, children: history.find((item) => item.type === 'error' && item.text?.includes(initError))?.text ? (_jsx(Text, { color: Colors.AccentRed, children: history.find((item) => item.type === 'error' && item.text?.includes(initError))?.text })) : (_jsxs(_Fragment, { children: [_jsxs(Text, { color: Colors.AccentRed, children: ["Initialization Error: ", initError] }), _jsxs(Text, { color: Colors.AccentRed, children: [' ', "Please check API key and configuration."] })] })) })), !settings.merged.hideFooter && (_jsx(Footer, { model: currentModel, targetDir: config.getTargetDir(), debugMode: config.getDebugMode(), branchName: branchName, debugMessage: debugMessage, errorCount: errorCount, showErrorDetails: showErrorDetails, showMemoryUsage: config.getDebugMode() ||
793
+ settings.merged.showMemoryUsage ||
794
+ false, promptTokenCount: sessionStats.lastPromptTokenCount, nightly: nightly, vimMode: vimModeEnabled ? vimMode : undefined, contextLimit: config.getEphemeralSetting('context-limit'), isTrustedFolder: config.isTrustedFolder() }))] })] }) }));
792
795
  };
793
796
  //# sourceMappingURL=App.js.map