@qwen-code/qwen-code 0.0.2 → 0.0.4-nightly.1

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 (262) hide show
  1. package/dist/package.json +6 -4
  2. package/dist/qwen-code-qwen-code-0.0.3.tgz +0 -0
  3. package/dist/src/acp/acp.d.ts +208 -0
  4. package/dist/src/acp/acp.js +193 -0
  5. package/dist/src/acp/acp.js.map +1 -0
  6. package/dist/src/acp/acpPeer.d.ts +8 -0
  7. package/dist/src/acp/acpPeer.js +537 -0
  8. package/dist/src/acp/acpPeer.js.map +1 -0
  9. package/dist/src/config/config.d.ts +5 -2
  10. package/dist/src/config/config.js +70 -28
  11. package/dist/src/config/config.js.map +1 -1
  12. package/dist/src/config/extension.d.ts +2 -2
  13. package/dist/src/config/extension.js +21 -16
  14. package/dist/src/config/extension.js.map +1 -1
  15. package/dist/src/config/settings.d.ts +22 -15
  16. package/dist/src/config/settings.js +25 -10
  17. package/dist/src/config/settings.js.map +1 -1
  18. package/dist/src/gemini.d.ts +1 -0
  19. package/dist/src/gemini.js +31 -49
  20. package/dist/src/gemini.js.map +1 -1
  21. package/dist/src/generated/git-commit.d.ts +1 -1
  22. package/dist/src/generated/git-commit.js +1 -1
  23. package/dist/src/generated/git-commit.js.map +1 -1
  24. package/dist/src/nonInteractiveCli.js +0 -67
  25. package/dist/src/nonInteractiveCli.js.map +1 -1
  26. package/dist/src/patches/is-in-ci.d.ts +7 -0
  27. package/dist/src/patches/is-in-ci.js +15 -0
  28. package/dist/src/patches/is-in-ci.js.map +1 -0
  29. package/dist/src/services/BuiltinCommandLoader.d.ts +24 -0
  30. package/dist/src/services/BuiltinCommandLoader.js +72 -0
  31. package/dist/src/services/BuiltinCommandLoader.js.map +1 -0
  32. package/dist/src/services/CommandService.d.ts +43 -5
  33. package/dist/src/services/CommandService.js +61 -25
  34. package/dist/src/services/CommandService.js.map +1 -1
  35. package/dist/src/services/FileCommandLoader.d.ts +37 -0
  36. package/dist/src/services/FileCommandLoader.js +179 -0
  37. package/dist/src/services/FileCommandLoader.js.map +1 -0
  38. package/dist/src/services/McpPromptLoader.d.ts +25 -0
  39. package/dist/src/services/McpPromptLoader.js +192 -0
  40. package/dist/src/services/McpPromptLoader.js.map +1 -0
  41. package/dist/src/services/prompt-processors/argumentProcessor.d.ts +21 -0
  42. package/dist/src/services/prompt-processors/argumentProcessor.js +28 -0
  43. package/dist/src/services/prompt-processors/argumentProcessor.js.map +1 -0
  44. package/dist/src/services/prompt-processors/shellProcessor.d.ts +32 -0
  45. package/dist/src/services/prompt-processors/shellProcessor.js +77 -0
  46. package/dist/src/services/prompt-processors/shellProcessor.js.map +1 -0
  47. package/dist/src/services/prompt-processors/types.d.ts +38 -0
  48. package/dist/src/services/prompt-processors/types.js +14 -0
  49. package/dist/src/services/prompt-processors/types.js.map +1 -0
  50. package/dist/src/services/types.d.ts +22 -0
  51. package/dist/src/services/types.js +7 -0
  52. package/dist/src/services/types.js.map +1 -0
  53. package/dist/src/ui/App.js +130 -101
  54. package/dist/src/ui/App.js.map +1 -1
  55. package/dist/src/ui/colors.js +6 -0
  56. package/dist/src/ui/colors.js.map +1 -1
  57. package/dist/src/ui/commands/aboutCommand.js +2 -0
  58. package/dist/src/ui/commands/aboutCommand.js.map +1 -1
  59. package/dist/src/ui/commands/authCommand.js +2 -0
  60. package/dist/src/ui/commands/authCommand.js.map +1 -1
  61. package/dist/src/ui/commands/bugCommand.d.ts +7 -0
  62. package/dist/src/ui/commands/bugCommand.js +63 -0
  63. package/dist/src/ui/commands/bugCommand.js.map +1 -0
  64. package/dist/src/ui/commands/chatCommand.d.ts +7 -0
  65. package/dist/src/ui/commands/chatCommand.js +179 -0
  66. package/dist/src/ui/commands/chatCommand.js.map +1 -0
  67. package/dist/src/ui/commands/clearCommand.js +14 -2
  68. package/dist/src/ui/commands/clearCommand.js.map +1 -1
  69. package/dist/src/ui/commands/compressCommand.d.ts +7 -0
  70. package/dist/src/ui/commands/compressCommand.js +64 -0
  71. package/dist/src/ui/commands/compressCommand.js.map +1 -0
  72. package/dist/src/ui/commands/copyCommand.d.ts +7 -0
  73. package/dist/src/ui/commands/copyCommand.js +59 -0
  74. package/dist/src/ui/commands/copyCommand.js.map +1 -0
  75. package/dist/src/ui/commands/corgiCommand.d.ts +7 -0
  76. package/dist/src/ui/commands/corgiCommand.js +15 -0
  77. package/dist/src/ui/commands/corgiCommand.js.map +1 -0
  78. package/dist/src/ui/commands/docsCommand.d.ts +7 -0
  79. package/dist/src/ui/commands/docsCommand.js +31 -0
  80. package/dist/src/ui/commands/docsCommand.js.map +1 -0
  81. package/dist/src/ui/commands/editorCommand.d.ts +7 -0
  82. package/dist/src/ui/commands/editorCommand.js +16 -0
  83. package/dist/src/ui/commands/editorCommand.js.map +1 -0
  84. package/dist/src/ui/commands/extensionsCommand.d.ts +7 -0
  85. package/dist/src/ui/commands/extensionsCommand.js +31 -0
  86. package/dist/src/ui/commands/extensionsCommand.js.map +1 -0
  87. package/dist/src/ui/commands/helpCommand.js +4 -2
  88. package/dist/src/ui/commands/helpCommand.js.map +1 -1
  89. package/dist/src/ui/commands/ideCommand.d.ts +8 -0
  90. package/dist/src/ui/commands/ideCommand.js +121 -0
  91. package/dist/src/ui/commands/ideCommand.js.map +1 -0
  92. package/dist/src/ui/commands/mcpCommand.d.ts +7 -0
  93. package/dist/src/ui/commands/mcpCommand.js +425 -0
  94. package/dist/src/ui/commands/mcpCommand.js.map +1 -0
  95. package/dist/src/ui/commands/memoryCommand.js +11 -4
  96. package/dist/src/ui/commands/memoryCommand.js.map +1 -1
  97. package/dist/src/ui/commands/privacyCommand.js +2 -0
  98. package/dist/src/ui/commands/privacyCommand.js.map +1 -1
  99. package/dist/src/ui/commands/quitCommand.d.ts +7 -0
  100. package/dist/src/ui/commands/quitCommand.js +34 -0
  101. package/dist/src/ui/commands/quitCommand.js.map +1 -0
  102. package/dist/src/ui/commands/restoreCommand.d.ts +8 -0
  103. package/dist/src/ui/commands/restoreCommand.js +128 -0
  104. package/dist/src/ui/commands/restoreCommand.js.map +1 -0
  105. package/dist/src/ui/commands/statsCommand.d.ts +7 -0
  106. package/dist/src/ui/commands/statsCommand.js +54 -0
  107. package/dist/src/ui/commands/statsCommand.js.map +1 -0
  108. package/dist/src/ui/commands/themeCommand.js +2 -0
  109. package/dist/src/ui/commands/themeCommand.js.map +1 -1
  110. package/dist/src/ui/commands/toolsCommand.d.ts +7 -0
  111. package/dist/src/ui/commands/toolsCommand.js +56 -0
  112. package/dist/src/ui/commands/toolsCommand.js.map +1 -0
  113. package/dist/src/ui/commands/types.d.ts +76 -4
  114. package/dist/src/ui/commands/types.js +6 -1
  115. package/dist/src/ui/commands/types.js.map +1 -1
  116. package/dist/src/ui/commands/vimCommand.d.ts +7 -0
  117. package/dist/src/ui/commands/vimCommand.js +23 -0
  118. package/dist/src/ui/commands/vimCommand.js.map +1 -0
  119. package/dist/src/ui/components/AuthDialog.js +0 -1
  120. package/dist/src/ui/components/AuthDialog.js.map +1 -1
  121. package/dist/src/ui/components/ContextSummaryDisplay.d.ts +6 -1
  122. package/dist/src/ui/components/ContextSummaryDisplay.js +46 -19
  123. package/dist/src/ui/components/ContextSummaryDisplay.js.map +1 -1
  124. package/dist/src/ui/components/Footer.d.ts +1 -0
  125. package/dist/src/ui/components/Footer.js +2 -2
  126. package/dist/src/ui/components/Footer.js.map +1 -1
  127. package/dist/src/ui/components/Header.js +1 -1
  128. package/dist/src/ui/components/Header.js.map +1 -1
  129. package/dist/src/ui/components/Help.d.ts +1 -1
  130. package/dist/src/ui/components/IDEContextDetailDisplay.d.ts +11 -0
  131. package/dist/src/ui/components/IDEContextDetailDisplay.js +19 -0
  132. package/dist/src/ui/components/IDEContextDetailDisplay.js.map +1 -0
  133. package/dist/src/ui/components/InputPrompt.d.ts +3 -1
  134. package/dist/src/ui/components/InputPrompt.js +86 -123
  135. package/dist/src/ui/components/InputPrompt.js.map +1 -1
  136. package/dist/src/ui/components/ShellConfirmationDialog.d.ts +15 -0
  137. package/dist/src/ui/components/ShellConfirmationDialog.js +44 -0
  138. package/dist/src/ui/components/ShellConfirmationDialog.js.map +1 -0
  139. package/dist/src/ui/components/ThemeDialog.js +51 -25
  140. package/dist/src/ui/components/ThemeDialog.js.map +1 -1
  141. package/dist/src/ui/components/Tips.js +1 -1
  142. package/dist/src/ui/components/Tips.js.map +1 -1
  143. package/dist/src/ui/components/messages/DiffRenderer.d.ts +1 -0
  144. package/dist/src/ui/components/messages/DiffRenderer.js +12 -11
  145. package/dist/src/ui/components/messages/DiffRenderer.js.map +1 -1
  146. package/dist/src/ui/components/messages/ToolConfirmationMessage.js +5 -4
  147. package/dist/src/ui/components/messages/ToolConfirmationMessage.js.map +1 -1
  148. package/dist/src/ui/components/messages/ToolGroupMessage.js +3 -1
  149. package/dist/src/ui/components/messages/ToolGroupMessage.js.map +1 -1
  150. package/dist/src/ui/components/shared/MaxSizedBox.js +69 -2
  151. package/dist/src/ui/components/shared/MaxSizedBox.js.map +1 -1
  152. package/dist/src/ui/components/shared/RadioButtonSelect.d.ts +3 -1
  153. package/dist/src/ui/components/shared/RadioButtonSelect.js +69 -50
  154. package/dist/src/ui/components/shared/RadioButtonSelect.js.map +1 -1
  155. package/dist/src/ui/components/shared/text-buffer.d.ts +273 -3
  156. package/dist/src/ui/components/shared/text-buffer.js +426 -80
  157. package/dist/src/ui/components/shared/text-buffer.js.map +1 -1
  158. package/dist/src/ui/components/shared/vim-buffer-actions.d.ts +72 -0
  159. package/dist/src/ui/components/shared/vim-buffer-actions.js +565 -0
  160. package/dist/src/ui/components/shared/vim-buffer-actions.js.map +1 -0
  161. package/dist/src/ui/constants.d.ts +1 -0
  162. package/dist/src/ui/constants.js +1 -0
  163. package/dist/src/ui/constants.js.map +1 -1
  164. package/dist/src/ui/contexts/VimModeContext.d.ts +19 -0
  165. package/dist/src/ui/contexts/VimModeContext.js +48 -0
  166. package/dist/src/ui/contexts/VimModeContext.js.map +1 -0
  167. package/dist/src/ui/hooks/atCommandProcessor.js +54 -15
  168. package/dist/src/ui/hooks/atCommandProcessor.js.map +1 -1
  169. package/dist/src/ui/hooks/shellCommandProcessor.d.ts +2 -1
  170. package/dist/src/ui/hooks/shellCommandProcessor.js +154 -177
  171. package/dist/src/ui/hooks/shellCommandProcessor.js.map +1 -1
  172. package/dist/src/ui/hooks/slashCommandProcessor.d.ts +9 -12
  173. package/dist/src/ui/hooks/slashCommandProcessor.js +203 -880
  174. package/dist/src/ui/hooks/slashCommandProcessor.js.map +1 -1
  175. package/dist/src/ui/hooks/useAuthCommand.js +2 -1
  176. package/dist/src/ui/hooks/useAuthCommand.js.map +1 -1
  177. package/dist/src/ui/hooks/useCompletion.d.ts +4 -1
  178. package/dist/src/ui/hooks/useCompletion.js +137 -24
  179. package/dist/src/ui/hooks/useCompletion.js.map +1 -1
  180. package/dist/src/ui/hooks/useConsoleMessages.js +53 -37
  181. package/dist/src/ui/hooks/useConsoleMessages.js.map +1 -1
  182. package/dist/src/ui/hooks/useFocus.d.ts +6 -0
  183. package/dist/src/ui/hooks/useFocus.js +41 -0
  184. package/dist/src/ui/hooks/useFocus.js.map +1 -0
  185. package/dist/src/ui/hooks/useGeminiStream.js +57 -11
  186. package/dist/src/ui/hooks/useGeminiStream.js.map +1 -1
  187. package/dist/src/ui/hooks/useInputHistory.d.ts +1 -1
  188. package/dist/src/ui/hooks/useKeypress.js +5 -2
  189. package/dist/src/ui/hooks/useKeypress.js.map +1 -1
  190. package/dist/src/ui/hooks/usePrivacySettings.js +5 -5
  191. package/dist/src/ui/hooks/usePrivacySettings.js.map +1 -1
  192. package/dist/src/ui/hooks/useShellHistory.d.ts +3 -2
  193. package/dist/src/ui/hooks/useShellHistory.js.map +1 -1
  194. package/dist/src/ui/hooks/useThemeCommand.js +24 -23
  195. package/dist/src/ui/hooks/useThemeCommand.js.map +1 -1
  196. package/dist/src/ui/hooks/vim.d.ts +28 -0
  197. package/dist/src/ui/hooks/vim.js +630 -0
  198. package/dist/src/ui/hooks/vim.js.map +1 -0
  199. package/dist/src/ui/themes/ansi-light.js +3 -1
  200. package/dist/src/ui/themes/ansi-light.js.map +1 -1
  201. package/dist/src/ui/themes/ansi.js +2 -0
  202. package/dist/src/ui/themes/ansi.js.map +1 -1
  203. package/dist/src/ui/themes/atom-one-dark.js +2 -0
  204. package/dist/src/ui/themes/atom-one-dark.js.map +1 -1
  205. package/dist/src/ui/themes/ayu-light.js +3 -1
  206. package/dist/src/ui/themes/ayu-light.js.map +1 -1
  207. package/dist/src/ui/themes/ayu.js +3 -1
  208. package/dist/src/ui/themes/ayu.js.map +1 -1
  209. package/dist/src/ui/themes/color-utils.d.ts +21 -0
  210. package/dist/src/ui/themes/color-utils.js +221 -0
  211. package/dist/src/ui/themes/color-utils.js.map +1 -0
  212. package/dist/src/ui/themes/dracula.js +2 -0
  213. package/dist/src/ui/themes/dracula.js.map +1 -1
  214. package/dist/src/ui/themes/github-dark.js +2 -0
  215. package/dist/src/ui/themes/github-dark.js.map +1 -1
  216. package/dist/src/ui/themes/github-light.js +2 -0
  217. package/dist/src/ui/themes/github-light.js.map +1 -1
  218. package/dist/src/ui/themes/googlecode.js +3 -1
  219. package/dist/src/ui/themes/googlecode.js.map +1 -1
  220. package/dist/src/ui/themes/no-color.js +3 -1
  221. package/dist/src/ui/themes/no-color.js.map +1 -1
  222. package/dist/src/ui/themes/qwen-dark.js +2 -0
  223. package/dist/src/ui/themes/qwen-dark.js.map +1 -1
  224. package/dist/src/ui/themes/qwen-light.js +2 -0
  225. package/dist/src/ui/themes/qwen-light.js.map +1 -1
  226. package/dist/src/ui/themes/shades-of-purple.d.ts +1 -1
  227. package/dist/src/ui/themes/shades-of-purple.js +3 -1
  228. package/dist/src/ui/themes/shades-of-purple.js.map +1 -1
  229. package/dist/src/ui/themes/theme-manager.d.ts +31 -6
  230. package/dist/src/ui/themes/theme-manager.js +114 -37
  231. package/dist/src/ui/themes/theme-manager.js.map +1 -1
  232. package/dist/src/ui/themes/theme.d.ts +23 -3
  233. package/dist/src/ui/themes/theme.js +244 -182
  234. package/dist/src/ui/themes/theme.js.map +1 -1
  235. package/dist/src/ui/themes/xcode.js +3 -1
  236. package/dist/src/ui/themes/xcode.js.map +1 -1
  237. package/dist/src/ui/types.d.ts +9 -1
  238. package/dist/src/ui/utils/CodeColorizer.d.ts +3 -1
  239. package/dist/src/ui/utils/CodeColorizer.js +23 -11
  240. package/dist/src/ui/utils/CodeColorizer.js.map +1 -1
  241. package/dist/src/ui/utils/commandUtils.d.ts +1 -0
  242. package/dist/src/ui/utils/commandUtils.js +47 -0
  243. package/dist/src/ui/utils/commandUtils.js.map +1 -1
  244. package/dist/src/ui/utils/errorParsing.js.map +1 -1
  245. package/dist/src/ui/utils/markdownUtilities.js +1 -1
  246. package/dist/src/ui/utils/textUtils.d.ts +0 -8
  247. package/dist/src/ui/utils/textUtils.js +0 -22
  248. package/dist/src/ui/utils/textUtils.js.map +1 -1
  249. package/dist/src/ui/utils/updateCheck.js +5 -1
  250. package/dist/src/ui/utils/updateCheck.js.map +1 -1
  251. package/dist/src/utils/events.d.ts +11 -0
  252. package/dist/src/utils/events.js +13 -0
  253. package/dist/src/utils/events.js.map +1 -0
  254. package/dist/src/utils/sandbox.js +7 -3
  255. package/dist/src/utils/sandbox.js.map +1 -1
  256. package/dist/src/utils/userStartupWarnings.js +16 -10
  257. package/dist/src/utils/userStartupWarnings.js.map +1 -1
  258. package/dist/src/validateNonInterActiveAuth.d.ts +7 -0
  259. package/dist/src/validateNonInterActiveAuth.js +38 -0
  260. package/dist/src/validateNonInterActiveAuth.js.map +1 -0
  261. package/dist/tsconfig.tsbuildinfo +1 -1
  262. package/package.json +7 -5
@@ -4,7 +4,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
4
4
  * Copyright 2025 Google LLC
5
5
  * SPDX-License-Identifier: Apache-2.0
6
6
  */
7
- import { useEffect, useState } from 'react';
7
+ import { useEffect, useState, useRef } from 'react';
8
8
  import { Text, Box, useInput } from 'ink';
9
9
  import { Colors } from '../../colors.js';
10
10
  /**
@@ -13,22 +13,11 @@ import { Colors } from '../../colors.js';
13
13
  *
14
14
  * @template T The type of the value associated with each radio item.
15
15
  */
16
- export function RadioButtonSelect({ items, initialIndex = 0, onSelect, onHighlight, isFocused, showScrollArrows = false, maxItemsToShow = 10, }) {
17
- // Ensure initialIndex is within bounds
18
- const safeInitialIndex = items.length > 0
19
- ? Math.max(0, Math.min(initialIndex, items.length - 1))
20
- : 0;
21
- const [activeIndex, setActiveIndex] = useState(safeInitialIndex);
16
+ export function RadioButtonSelect({ items, initialIndex = 0, onSelect, onHighlight, isFocused, showScrollArrows = false, maxItemsToShow = 10, showNumbers = true, }) {
17
+ const [activeIndex, setActiveIndex] = useState(initialIndex);
22
18
  const [scrollOffset, setScrollOffset] = useState(0);
23
- // Ensure activeIndex is always within bounds when items change
24
- useEffect(() => {
25
- if (items.length === 0) {
26
- setActiveIndex(0);
27
- }
28
- else if (activeIndex >= items.length) {
29
- setActiveIndex(Math.max(0, items.length - 1));
30
- }
31
- }, [items.length, activeIndex]);
19
+ const [numberInput, setNumberInput] = useState('');
20
+ const numberInputTimer = useRef(null);
32
21
  useEffect(() => {
33
22
  const newScrollOffset = Math.max(0, Math.min(activeIndex - maxItemsToShow + 1, items.length - maxItemsToShow));
34
23
  if (activeIndex < scrollOffset) {
@@ -38,61 +27,91 @@ export function RadioButtonSelect({ items, initialIndex = 0, onSelect, onHighlig
38
27
  setScrollOffset(newScrollOffset);
39
28
  }
40
29
  }, [activeIndex, items.length, scrollOffset, maxItemsToShow]);
30
+ useEffect(() => () => {
31
+ if (numberInputTimer.current) {
32
+ clearTimeout(numberInputTimer.current);
33
+ }
34
+ }, []);
41
35
  useInput((input, key) => {
36
+ const isNumeric = showNumbers && /^[0-9]$/.test(input);
37
+ // Any key press that is not a digit should clear the number input buffer.
38
+ if (!isNumeric && numberInputTimer.current) {
39
+ clearTimeout(numberInputTimer.current);
40
+ setNumberInput('');
41
+ }
42
42
  if (input === 'k' || key.upArrow) {
43
- if (items.length > 0) {
44
- const newIndex = activeIndex > 0 ? activeIndex - 1 : items.length - 1;
45
- setActiveIndex(newIndex);
46
- if (items[newIndex]) {
47
- onHighlight?.(items[newIndex].value);
48
- }
49
- }
43
+ const newIndex = activeIndex > 0 ? activeIndex - 1 : items.length - 1;
44
+ setActiveIndex(newIndex);
45
+ onHighlight?.(items[newIndex].value);
46
+ return;
50
47
  }
51
48
  if (input === 'j' || key.downArrow) {
52
- if (items.length > 0) {
53
- const newIndex = activeIndex < items.length - 1 ? activeIndex + 1 : 0;
54
- setActiveIndex(newIndex);
55
- if (items[newIndex]) {
56
- onHighlight?.(items[newIndex].value);
57
- }
58
- }
49
+ const newIndex = activeIndex < items.length - 1 ? activeIndex + 1 : 0;
50
+ setActiveIndex(newIndex);
51
+ onHighlight?.(items[newIndex].value);
52
+ return;
59
53
  }
60
54
  if (key.return) {
61
- // Add bounds check before accessing items[activeIndex]
62
- if (activeIndex >= 0 &&
63
- activeIndex < items.length &&
64
- items[activeIndex]) {
65
- onSelect(items[activeIndex].value);
66
- }
55
+ onSelect(items[activeIndex].value);
56
+ return;
67
57
  }
68
- // Enable selection directly from number keys.
69
- if (/^[1-9]$/.test(input)) {
70
- const targetIndex = Number.parseInt(input, 10) - 1;
71
- if (targetIndex >= 0 && targetIndex < visibleItems.length) {
72
- const selectedItem = visibleItems[targetIndex];
73
- if (selectedItem) {
74
- onSelect?.(selectedItem.value);
58
+ // Handle numeric input for selection.
59
+ if (isNumeric) {
60
+ if (numberInputTimer.current) {
61
+ clearTimeout(numberInputTimer.current);
62
+ }
63
+ const newNumberInput = numberInput + input;
64
+ setNumberInput(newNumberInput);
65
+ const targetIndex = Number.parseInt(newNumberInput, 10) - 1;
66
+ // A single '0' is not a valid selection since items are 1-indexed.
67
+ if (newNumberInput === '0') {
68
+ numberInputTimer.current = setTimeout(() => setNumberInput(''), 350);
69
+ return;
70
+ }
71
+ if (targetIndex >= 0 && targetIndex < items.length) {
72
+ const targetItem = items[targetIndex];
73
+ setActiveIndex(targetIndex);
74
+ onHighlight?.(targetItem.value);
75
+ // If the typed number can't be a prefix for another valid number,
76
+ // select it immediately. Otherwise, wait for more input.
77
+ const potentialNextNumber = Number.parseInt(newNumberInput + '0', 10);
78
+ if (potentialNextNumber > items.length) {
79
+ onSelect(targetItem.value);
80
+ setNumberInput('');
75
81
  }
82
+ else {
83
+ numberInputTimer.current = setTimeout(() => {
84
+ onSelect(targetItem.value);
85
+ setNumberInput('');
86
+ }, 350); // Debounce time for multi-digit input.
87
+ }
88
+ }
89
+ else {
90
+ // The typed number is out of bounds, clear the buffer
91
+ setNumberInput('');
76
92
  }
77
93
  }
78
- }, {
79
- isActive: isFocused &&
80
- items.length > 0 &&
81
- activeIndex >= 0 &&
82
- activeIndex < items.length,
83
- });
94
+ }, { isActive: isFocused && items.length > 0 });
84
95
  const visibleItems = items.slice(scrollOffset, scrollOffset + maxItemsToShow);
85
96
  return (_jsxs(Box, { flexDirection: "column", children: [showScrollArrows && (_jsx(Text, { color: scrollOffset > 0 ? Colors.Foreground : Colors.Gray, children: "\u25B2" })), visibleItems.map((item, index) => {
86
97
  const itemIndex = scrollOffset + index;
87
98
  const isSelected = activeIndex === itemIndex;
88
99
  let textColor = Colors.Foreground;
100
+ let numberColor = Colors.Foreground;
89
101
  if (isSelected) {
90
102
  textColor = Colors.AccentGreen;
103
+ numberColor = Colors.AccentGreen;
91
104
  }
92
105
  else if (item.disabled) {
93
106
  textColor = Colors.Gray;
107
+ numberColor = Colors.Gray;
108
+ }
109
+ if (!showNumbers) {
110
+ numberColor = Colors.Gray;
94
111
  }
95
- return (_jsxs(Box, { children: [_jsx(Box, { minWidth: 2, flexShrink: 0, children: _jsx(Text, { color: isSelected ? Colors.AccentGreen : Colors.Foreground, children: isSelected ? '●' : '○' }) }), item.themeNameDisplay && item.themeTypeDisplay ? (_jsxs(Text, { color: textColor, wrap: "truncate", children: [item.themeNameDisplay, ' ', _jsx(Text, { color: Colors.Gray, children: item.themeTypeDisplay })] })) : (_jsx(Text, { color: textColor, wrap: "truncate", children: item.label }))] }, item.label));
112
+ const numberColumnWidth = String(items.length).length;
113
+ const itemNumberText = `${String(itemIndex + 1).padStart(numberColumnWidth)}.`;
114
+ return (_jsxs(Box, { alignItems: "center", children: [_jsx(Box, { minWidth: 2, flexShrink: 0, children: _jsx(Text, { color: isSelected ? Colors.AccentGreen : Colors.Foreground, children: isSelected ? '●' : ' ' }) }), _jsx(Box, { marginRight: 1, flexShrink: 0, minWidth: itemNumberText.length, children: _jsx(Text, { color: numberColor, children: itemNumberText }) }), item.themeNameDisplay && item.themeTypeDisplay ? (_jsxs(Text, { color: textColor, wrap: "truncate", children: [item.themeNameDisplay, ' ', _jsx(Text, { color: Colors.Gray, children: item.themeTypeDisplay })] })) : (_jsx(Text, { color: textColor, wrap: "truncate", children: item.label }))] }, item.label));
96
115
  }), showScrollArrows && (_jsx(Text, { color: scrollOffset + maxItemsToShow < items.length
97
116
  ? Colors.Foreground
98
117
  : Colors.Gray, children: "\u25BC" }))] }));
@@ -1 +1 @@
1
- {"version":3,"file":"RadioButtonSelect.js","sourceRoot":"","sources":["../../../../../src/ui/components/shared/RadioButtonSelect.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"RadioButtonSelect.js","sourceRoot":"","sources":["../../../../../src/ui/components/shared/RadioButtonSelect.tsx"],"names":[],"mappings":"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"}
@@ -4,6 +4,21 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
  export type Direction = 'left' | 'right' | 'up' | 'down' | 'wordLeft' | 'wordRight' | 'home' | 'end';
7
+ export declare const findNextWordStart: (text: string, currentOffset: number) => number;
8
+ export declare const findPrevWordStart: (text: string, currentOffset: number) => number;
9
+ export declare const findWordEnd: (text: string, currentOffset: number) => number;
10
+ export declare const getOffsetFromPosition: (row: number, col: number, lines: string[]) => number;
11
+ export declare const getPositionFromOffsets: (startOffset: number, endOffset: number, lines: string[]) => {
12
+ startRow: number;
13
+ startCol: number;
14
+ endRow: number;
15
+ endCol: number;
16
+ };
17
+ export declare const getLineRangeOffsets: (startRow: number, lineCount: number, lines: string[]) => {
18
+ startOffset: number;
19
+ endOffset: number;
20
+ };
21
+ export declare const replaceRangeInternal: (state: TextBufferState, startRow: number, startCol: number, endRow: number, endCol: number, text: string) => TextBufferState;
7
22
  export interface Viewport {
8
23
  height: number;
9
24
  width: number;
@@ -24,7 +39,12 @@ interface UndoHistoryEntry {
24
39
  cursorCol: number;
25
40
  }
26
41
  export declare function offsetToLogicalPos(text: string, offset: number): [number, number];
27
- interface TextBufferState {
42
+ /**
43
+ * Converts logical row/col position to absolute text offset
44
+ * Inverse operation of offsetToLogicalPos
45
+ */
46
+ export declare function logicalPosToOffset(lines: string[], row: number, col: number): number;
47
+ export interface TextBufferState {
28
48
  lines: string[];
29
49
  cursorRow: number;
30
50
  cursorCol: number;
@@ -35,7 +55,8 @@ interface TextBufferState {
35
55
  selectionAnchor: [number, number] | null;
36
56
  viewportWidth: number;
37
57
  }
38
- type TextBufferAction = {
58
+ export declare const pushUndo: (currentState: TextBufferState) => TextBufferState;
59
+ export type TextBufferAction = {
39
60
  type: 'set_text';
40
61
  payload: string;
41
62
  pushToUndo?: boolean;
@@ -82,6 +103,125 @@ type TextBufferAction = {
82
103
  } | {
83
104
  type: 'set_viewport_width';
84
105
  payload: number;
106
+ } | {
107
+ type: 'vim_delete_word_forward';
108
+ payload: {
109
+ count: number;
110
+ };
111
+ } | {
112
+ type: 'vim_delete_word_backward';
113
+ payload: {
114
+ count: number;
115
+ };
116
+ } | {
117
+ type: 'vim_delete_word_end';
118
+ payload: {
119
+ count: number;
120
+ };
121
+ } | {
122
+ type: 'vim_change_word_forward';
123
+ payload: {
124
+ count: number;
125
+ };
126
+ } | {
127
+ type: 'vim_change_word_backward';
128
+ payload: {
129
+ count: number;
130
+ };
131
+ } | {
132
+ type: 'vim_change_word_end';
133
+ payload: {
134
+ count: number;
135
+ };
136
+ } | {
137
+ type: 'vim_delete_line';
138
+ payload: {
139
+ count: number;
140
+ };
141
+ } | {
142
+ type: 'vim_change_line';
143
+ payload: {
144
+ count: number;
145
+ };
146
+ } | {
147
+ type: 'vim_delete_to_end_of_line';
148
+ } | {
149
+ type: 'vim_change_to_end_of_line';
150
+ } | {
151
+ type: 'vim_change_movement';
152
+ payload: {
153
+ movement: 'h' | 'j' | 'k' | 'l';
154
+ count: number;
155
+ };
156
+ } | {
157
+ type: 'vim_move_left';
158
+ payload: {
159
+ count: number;
160
+ };
161
+ } | {
162
+ type: 'vim_move_right';
163
+ payload: {
164
+ count: number;
165
+ };
166
+ } | {
167
+ type: 'vim_move_up';
168
+ payload: {
169
+ count: number;
170
+ };
171
+ } | {
172
+ type: 'vim_move_down';
173
+ payload: {
174
+ count: number;
175
+ };
176
+ } | {
177
+ type: 'vim_move_word_forward';
178
+ payload: {
179
+ count: number;
180
+ };
181
+ } | {
182
+ type: 'vim_move_word_backward';
183
+ payload: {
184
+ count: number;
185
+ };
186
+ } | {
187
+ type: 'vim_move_word_end';
188
+ payload: {
189
+ count: number;
190
+ };
191
+ } | {
192
+ type: 'vim_delete_char';
193
+ payload: {
194
+ count: number;
195
+ };
196
+ } | {
197
+ type: 'vim_insert_at_cursor';
198
+ } | {
199
+ type: 'vim_append_at_cursor';
200
+ } | {
201
+ type: 'vim_open_line_below';
202
+ } | {
203
+ type: 'vim_open_line_above';
204
+ } | {
205
+ type: 'vim_append_at_line_end';
206
+ } | {
207
+ type: 'vim_insert_at_line_start';
208
+ } | {
209
+ type: 'vim_move_to_line_start';
210
+ } | {
211
+ type: 'vim_move_to_line_end';
212
+ } | {
213
+ type: 'vim_move_to_first_nonwhitespace';
214
+ } | {
215
+ type: 'vim_move_to_first_line';
216
+ } | {
217
+ type: 'vim_move_to_last_line';
218
+ } | {
219
+ type: 'vim_move_to_line';
220
+ payload: {
221
+ lineNumber: number;
222
+ };
223
+ } | {
224
+ type: 'vim_escape_insert_mode';
85
225
  };
86
226
  export declare function textBufferReducer(state: TextBufferState, action: TextBufferAction): TextBufferState;
87
227
  export declare function useTextBuffer({ initialText, initialCursorOffset, viewport, stdin, setRawMode, onChange, isValidPath, shellModeActive, }: UseTextBufferProps): TextBuffer;
@@ -109,7 +249,9 @@ export interface TextBuffer {
109
249
  /**
110
250
  * Insert a single character or string without newlines.
111
251
  */
112
- insert: (ch: string) => void;
252
+ insert: (ch: string, opts?: {
253
+ paste?: boolean;
254
+ }) => void;
113
255
  newline: () => void;
114
256
  backspace: () => void;
115
257
  del: () => void;
@@ -180,5 +322,133 @@ export interface TextBuffer {
180
322
  }) => Promise<void>;
181
323
  replaceRangeByOffset: (startOffset: number, endOffset: number, replacementText: string) => void;
182
324
  moveToOffset(offset: number): void;
325
+ /**
326
+ * Delete N words forward from cursor position (vim 'dw' command)
327
+ */
328
+ vimDeleteWordForward: (count: number) => void;
329
+ /**
330
+ * Delete N words backward from cursor position (vim 'db' command)
331
+ */
332
+ vimDeleteWordBackward: (count: number) => void;
333
+ /**
334
+ * Delete to end of N words from cursor position (vim 'de' command)
335
+ */
336
+ vimDeleteWordEnd: (count: number) => void;
337
+ /**
338
+ * Change N words forward from cursor position (vim 'cw' command)
339
+ */
340
+ vimChangeWordForward: (count: number) => void;
341
+ /**
342
+ * Change N words backward from cursor position (vim 'cb' command)
343
+ */
344
+ vimChangeWordBackward: (count: number) => void;
345
+ /**
346
+ * Change to end of N words from cursor position (vim 'ce' command)
347
+ */
348
+ vimChangeWordEnd: (count: number) => void;
349
+ /**
350
+ * Delete N lines from cursor position (vim 'dd' command)
351
+ */
352
+ vimDeleteLine: (count: number) => void;
353
+ /**
354
+ * Change N lines from cursor position (vim 'cc' command)
355
+ */
356
+ vimChangeLine: (count: number) => void;
357
+ /**
358
+ * Delete from cursor to end of line (vim 'D' command)
359
+ */
360
+ vimDeleteToEndOfLine: () => void;
361
+ /**
362
+ * Change from cursor to end of line (vim 'C' command)
363
+ */
364
+ vimChangeToEndOfLine: () => void;
365
+ /**
366
+ * Change movement operations (vim 'ch', 'cj', 'ck', 'cl' commands)
367
+ */
368
+ vimChangeMovement: (movement: 'h' | 'j' | 'k' | 'l', count: number) => void;
369
+ /**
370
+ * Move cursor left N times (vim 'h' command)
371
+ */
372
+ vimMoveLeft: (count: number) => void;
373
+ /**
374
+ * Move cursor right N times (vim 'l' command)
375
+ */
376
+ vimMoveRight: (count: number) => void;
377
+ /**
378
+ * Move cursor up N times (vim 'k' command)
379
+ */
380
+ vimMoveUp: (count: number) => void;
381
+ /**
382
+ * Move cursor down N times (vim 'j' command)
383
+ */
384
+ vimMoveDown: (count: number) => void;
385
+ /**
386
+ * Move cursor forward N words (vim 'w' command)
387
+ */
388
+ vimMoveWordForward: (count: number) => void;
389
+ /**
390
+ * Move cursor backward N words (vim 'b' command)
391
+ */
392
+ vimMoveWordBackward: (count: number) => void;
393
+ /**
394
+ * Move cursor to end of Nth word (vim 'e' command)
395
+ */
396
+ vimMoveWordEnd: (count: number) => void;
397
+ /**
398
+ * Delete N characters at cursor (vim 'x' command)
399
+ */
400
+ vimDeleteChar: (count: number) => void;
401
+ /**
402
+ * Enter insert mode at cursor (vim 'i' command)
403
+ */
404
+ vimInsertAtCursor: () => void;
405
+ /**
406
+ * Enter insert mode after cursor (vim 'a' command)
407
+ */
408
+ vimAppendAtCursor: () => void;
409
+ /**
410
+ * Open new line below and enter insert mode (vim 'o' command)
411
+ */
412
+ vimOpenLineBelow: () => void;
413
+ /**
414
+ * Open new line above and enter insert mode (vim 'O' command)
415
+ */
416
+ vimOpenLineAbove: () => void;
417
+ /**
418
+ * Move to end of line and enter insert mode (vim 'A' command)
419
+ */
420
+ vimAppendAtLineEnd: () => void;
421
+ /**
422
+ * Move to first non-whitespace and enter insert mode (vim 'I' command)
423
+ */
424
+ vimInsertAtLineStart: () => void;
425
+ /**
426
+ * Move cursor to beginning of line (vim '0' command)
427
+ */
428
+ vimMoveToLineStart: () => void;
429
+ /**
430
+ * Move cursor to end of line (vim '$' command)
431
+ */
432
+ vimMoveToLineEnd: () => void;
433
+ /**
434
+ * Move cursor to first non-whitespace character (vim '^' command)
435
+ */
436
+ vimMoveToFirstNonWhitespace: () => void;
437
+ /**
438
+ * Move cursor to first line (vim 'gg' command)
439
+ */
440
+ vimMoveToFirstLine: () => void;
441
+ /**
442
+ * Move cursor to last line (vim 'G' command)
443
+ */
444
+ vimMoveToLastLine: () => void;
445
+ /**
446
+ * Move cursor to specific line number (vim '[N]G' command)
447
+ */
448
+ vimMoveToLine: (lineNumber: number) => void;
449
+ /**
450
+ * Handle escape from insert mode (moves cursor left if not at line start)
451
+ */
452
+ vimEscapeInsertMode: () => void;
183
453
  }
184
454
  export {};