@google/gemini-cli 0.12.0-nightly.20251027.cb0947c5 → 0.13.0-nightly.20251030.42c79c64

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 (239) hide show
  1. package/README.md +7 -5
  2. package/dist/package.json +2 -2
  3. package/dist/src/commands/extensions/disable.d.ts +1 -1
  4. package/dist/src/commands/extensions/disable.js +5 -4
  5. package/dist/src/commands/extensions/disable.js.map +1 -1
  6. package/dist/src/commands/extensions/enable.d.ts +1 -1
  7. package/dist/src/commands/extensions/enable.js +3 -2
  8. package/dist/src/commands/extensions/enable.js.map +1 -1
  9. package/dist/src/commands/extensions/install.js +2 -1
  10. package/dist/src/commands/extensions/install.js.map +1 -1
  11. package/dist/src/commands/extensions/install.test.js +1 -0
  12. package/dist/src/commands/extensions/install.test.js.map +1 -1
  13. package/dist/src/commands/extensions/link.js +2 -1
  14. package/dist/src/commands/extensions/link.js.map +1 -1
  15. package/dist/src/commands/extensions/list.js +2 -2
  16. package/dist/src/commands/extensions/list.js.map +1 -1
  17. package/dist/src/commands/extensions/uninstall.js +2 -1
  18. package/dist/src/commands/extensions/uninstall.js.map +1 -1
  19. package/dist/src/commands/extensions/update.js +2 -2
  20. package/dist/src/commands/extensions/update.js.map +1 -1
  21. package/dist/src/commands/mcp/list.js +2 -2
  22. package/dist/src/commands/mcp/list.js.map +1 -1
  23. package/dist/src/config/auth.js +0 -5
  24. package/dist/src/config/auth.js.map +1 -1
  25. package/dist/src/config/auth.test.js +1 -3
  26. package/dist/src/config/auth.test.js.map +1 -1
  27. package/dist/src/config/config.d.ts +5 -3
  28. package/dist/src/config/config.js +42 -9
  29. package/dist/src/config/config.js.map +1 -1
  30. package/dist/src/config/config.test.js +186 -161
  31. package/dist/src/config/config.test.js.map +1 -1
  32. package/dist/src/config/extension-manager.d.ts +23 -10
  33. package/dist/src/config/extension-manager.js +89 -62
  34. package/dist/src/config/extension-manager.js.map +1 -1
  35. package/dist/src/config/extension.test.js +158 -74
  36. package/dist/src/config/extension.test.js.map +1 -1
  37. package/dist/src/config/extensions/extensionSettings.d.ts +3 -3
  38. package/dist/src/config/extensions/extensionSettings.js +74 -24
  39. package/dist/src/config/extensions/extensionSettings.js.map +1 -1
  40. package/dist/src/config/extensions/extensionSettings.test.js +145 -24
  41. package/dist/src/config/extensions/extensionSettings.test.js.map +1 -1
  42. package/dist/src/config/extensions/github.js +3 -3
  43. package/dist/src/config/extensions/github.js.map +1 -1
  44. package/dist/src/config/extensions/github.test.js +1 -1
  45. package/dist/src/config/extensions/github.test.js.map +1 -1
  46. package/dist/src/config/extensions/update.js +7 -6
  47. package/dist/src/config/extensions/update.js.map +1 -1
  48. package/dist/src/config/extensions/update.test.js +54 -31
  49. package/dist/src/config/extensions/update.test.js.map +1 -1
  50. package/dist/src/config/keyBindings.js +1 -1
  51. package/dist/src/config/keyBindings.js.map +1 -1
  52. package/dist/src/config/policies/read-only.toml +56 -0
  53. package/dist/src/config/policies/write.toml +63 -0
  54. package/dist/src/config/policies/yolo.toml +31 -0
  55. package/dist/src/config/policy-engine.integration.test.js +41 -38
  56. package/dist/src/config/policy-engine.integration.test.js.map +1 -1
  57. package/dist/src/config/policy-toml-loader.d.ts +46 -0
  58. package/dist/src/config/policy-toml-loader.js +314 -0
  59. package/dist/src/config/policy-toml-loader.js.map +1 -0
  60. package/dist/src/config/policy-toml-loader.test.d.ts +6 -0
  61. package/dist/src/config/policy-toml-loader.test.js +626 -0
  62. package/dist/src/config/policy-toml-loader.test.js.map +1 -0
  63. package/dist/src/config/policy.d.ts +9 -2
  64. package/dist/src/config/policy.js +139 -110
  65. package/dist/src/config/policy.js.map +1 -1
  66. package/dist/src/config/policy.test.js +780 -82
  67. package/dist/src/config/policy.test.js.map +1 -1
  68. package/dist/src/config/sandboxConfig.d.ts +1 -1
  69. package/dist/src/config/sandboxConfig.js +6 -3
  70. package/dist/src/config/sandboxConfig.js.map +1 -1
  71. package/dist/src/config/settings.js +1 -1
  72. package/dist/src/config/settings.js.map +1 -1
  73. package/dist/src/config/settings.test.js +4 -4
  74. package/dist/src/config/settings.test.js.map +1 -1
  75. package/dist/src/gemini.js +14 -18
  76. package/dist/src/gemini.js.map +1 -1
  77. package/dist/src/gemini.test.js +2 -0
  78. package/dist/src/gemini.test.js.map +1 -1
  79. package/dist/src/generated/git-commit.d.ts +2 -2
  80. package/dist/src/generated/git-commit.js +2 -2
  81. package/dist/src/nonInteractiveCli.d.ts +9 -1
  82. package/dist/src/nonInteractiveCli.js +16 -1
  83. package/dist/src/nonInteractiveCli.js.map +1 -1
  84. package/dist/src/nonInteractiveCli.test.js +209 -103
  85. package/dist/src/nonInteractiveCli.test.js.map +1 -1
  86. package/dist/src/test-utils/render.d.ts +12 -0
  87. package/dist/src/test-utils/render.js +28 -1
  88. package/dist/src/test-utils/render.js.map +1 -1
  89. package/dist/src/test-utils/render.test.d.ts +6 -0
  90. package/dist/src/test-utils/render.test.js +54 -0
  91. package/dist/src/test-utils/render.test.js.map +1 -0
  92. package/dist/src/ui/AppContainer.js +60 -25
  93. package/dist/src/ui/AppContainer.js.map +1 -1
  94. package/dist/src/ui/AppContainer.test.js +8 -0
  95. package/dist/src/ui/AppContainer.test.js.map +1 -1
  96. package/dist/src/ui/auth/ApiAuthDialog.d.ts +14 -0
  97. package/dist/src/ui/auth/ApiAuthDialog.js +26 -0
  98. package/dist/src/ui/auth/ApiAuthDialog.js.map +1 -0
  99. package/dist/src/ui/auth/ApiAuthDialog.test.d.ts +6 -0
  100. package/dist/src/ui/auth/ApiAuthDialog.test.js +91 -0
  101. package/dist/src/ui/auth/ApiAuthDialog.test.js.map +1 -0
  102. package/dist/src/ui/auth/AuthDialog.js +7 -3
  103. package/dist/src/ui/auth/AuthDialog.js.map +1 -1
  104. package/dist/src/ui/auth/AuthDialog.test.js +1 -1
  105. package/dist/src/ui/auth/AuthDialog.test.js.map +1 -1
  106. package/dist/src/ui/auth/useAuth.d.ts +2 -0
  107. package/dist/src/ui/auth/useAuth.js +31 -2
  108. package/dist/src/ui/auth/useAuth.js.map +1 -1
  109. package/dist/src/ui/commands/directoryCommand.js +1 -1
  110. package/dist/src/ui/commands/directoryCommand.js.map +1 -1
  111. package/dist/src/ui/commands/extensionsCommand.js +45 -1
  112. package/dist/src/ui/commands/extensionsCommand.js.map +1 -1
  113. package/dist/src/ui/commands/extensionsCommand.test.js +64 -1
  114. package/dist/src/ui/commands/extensionsCommand.test.js.map +1 -1
  115. package/dist/src/ui/commands/memoryCommand.js +1 -1
  116. package/dist/src/ui/commands/memoryCommand.js.map +1 -1
  117. package/dist/src/ui/commands/memoryCommand.test.js +3 -1
  118. package/dist/src/ui/commands/memoryCommand.test.js.map +1 -1
  119. package/dist/src/ui/components/ConsoleSummaryDisplay.js +1 -1
  120. package/dist/src/ui/components/ConsoleSummaryDisplay.js.map +1 -1
  121. package/dist/src/ui/components/DetailedMessagesDisplay.js +1 -1
  122. package/dist/src/ui/components/DetailedMessagesDisplay.js.map +1 -1
  123. package/dist/src/ui/components/DialogManager.js +4 -0
  124. package/dist/src/ui/components/DialogManager.js.map +1 -1
  125. package/dist/src/ui/components/FolderTrustDialog.test.js +4 -5
  126. package/dist/src/ui/components/FolderTrustDialog.test.js.map +1 -1
  127. package/dist/src/ui/components/Footer.js +1 -1
  128. package/dist/src/ui/components/Footer.js.map +1 -1
  129. package/dist/src/ui/components/Footer.test.js +24 -0
  130. package/dist/src/ui/components/Footer.test.js.map +1 -1
  131. package/dist/src/ui/components/Help.test.js +0 -1
  132. package/dist/src/ui/components/Help.test.js.map +1 -1
  133. package/dist/src/ui/components/ModelDialog.test.js +5 -6
  134. package/dist/src/ui/components/ModelDialog.test.js.map +1 -1
  135. package/dist/src/ui/components/PermissionsModifyTrustDialog.test.js +11 -13
  136. package/dist/src/ui/components/PermissionsModifyTrustDialog.test.js.map +1 -1
  137. package/dist/src/ui/components/SettingsDialog.test.js +12 -14
  138. package/dist/src/ui/components/SettingsDialog.test.js.map +1 -1
  139. package/dist/src/ui/components/messages/Todo.js +27 -5
  140. package/dist/src/ui/components/messages/Todo.js.map +1 -1
  141. package/dist/src/ui/components/messages/Todo.test.js +19 -7
  142. package/dist/src/ui/components/messages/Todo.test.js.map +1 -1
  143. package/dist/src/ui/components/shared/BaseSelectionList.test.js +11 -13
  144. package/dist/src/ui/components/shared/BaseSelectionList.test.js.map +1 -1
  145. package/dist/src/ui/components/shared/TextInput.d.ts +15 -0
  146. package/dist/src/ui/components/shared/TextInput.js +38 -0
  147. package/dist/src/ui/components/shared/TextInput.js.map +1 -0
  148. package/dist/src/ui/components/shared/TextInput.test.d.ts +6 -0
  149. package/dist/src/ui/components/shared/TextInput.test.js +242 -0
  150. package/dist/src/ui/components/shared/TextInput.test.js.map +1 -0
  151. package/dist/src/ui/components/shared/text-buffer.d.ts +8 -2
  152. package/dist/src/ui/components/shared/text-buffer.js +28 -13
  153. package/dist/src/ui/components/shared/text-buffer.js.map +1 -1
  154. package/dist/src/ui/components/shared/text-buffer.test.js +139 -2
  155. package/dist/src/ui/components/shared/text-buffer.test.js.map +1 -1
  156. package/dist/src/ui/contexts/KeypressContext.js +8 -29
  157. package/dist/src/ui/contexts/KeypressContext.js.map +1 -1
  158. package/dist/src/ui/contexts/KeypressContext.test.js +90 -73
  159. package/dist/src/ui/contexts/KeypressContext.test.js.map +1 -1
  160. package/dist/src/ui/contexts/SessionContext.test.js +27 -14
  161. package/dist/src/ui/contexts/SessionContext.test.js.map +1 -1
  162. package/dist/src/ui/contexts/UIActionsContext.d.ts +2 -0
  163. package/dist/src/ui/contexts/UIActionsContext.js.map +1 -1
  164. package/dist/src/ui/contexts/UIStateContext.d.ts +2 -0
  165. package/dist/src/ui/contexts/UIStateContext.js.map +1 -1
  166. package/dist/src/ui/hooks/atCommandProcessor.js +31 -9
  167. package/dist/src/ui/hooks/atCommandProcessor.js.map +1 -1
  168. package/dist/src/ui/hooks/atCommandProcessor.test.js +162 -64
  169. package/dist/src/ui/hooks/atCommandProcessor.test.js.map +1 -1
  170. package/dist/src/ui/hooks/useAtCompletion.test.js +32 -23
  171. package/dist/src/ui/hooks/useAtCompletion.test.js.map +1 -1
  172. package/dist/src/ui/hooks/useAutoAcceptIndicator.test.js +2 -2
  173. package/dist/src/ui/hooks/useAutoAcceptIndicator.test.js.map +1 -1
  174. package/dist/src/ui/hooks/useExtensionUpdates.d.ts +1 -2
  175. package/dist/src/ui/hooks/useExtensionUpdates.js +2 -1
  176. package/dist/src/ui/hooks/useExtensionUpdates.js.map +1 -1
  177. package/dist/src/ui/hooks/useExtensionUpdates.test.js +14 -20
  178. package/dist/src/ui/hooks/useExtensionUpdates.test.js.map +1 -1
  179. package/dist/src/ui/hooks/useFlickerDetector.test.js +9 -6
  180. package/dist/src/ui/hooks/useFlickerDetector.test.js.map +1 -1
  181. package/dist/src/ui/hooks/useFolderTrust.test.js +45 -23
  182. package/dist/src/ui/hooks/useFolderTrust.test.js.map +1 -1
  183. package/dist/src/ui/hooks/useGeminiStream.js +7 -5
  184. package/dist/src/ui/hooks/useGeminiStream.js.map +1 -1
  185. package/dist/src/ui/hooks/useGeminiStream.test.js +42 -41
  186. package/dist/src/ui/hooks/useGeminiStream.test.js.map +1 -1
  187. package/dist/src/ui/hooks/useHistoryManager.test.js +2 -2
  188. package/dist/src/ui/hooks/useHistoryManager.test.js.map +1 -1
  189. package/dist/src/ui/hooks/useInputHistory.test.js +2 -2
  190. package/dist/src/ui/hooks/useInputHistory.test.js.map +1 -1
  191. package/dist/src/ui/hooks/useInputHistoryStore.test.js +2 -2
  192. package/dist/src/ui/hooks/useInputHistoryStore.test.js.map +1 -1
  193. package/dist/src/ui/hooks/usePermissionsModifyTrust.test.js +2 -3
  194. package/dist/src/ui/hooks/usePermissionsModifyTrust.test.js.map +1 -1
  195. package/dist/src/ui/hooks/usePhraseCycler.js +1 -1
  196. package/dist/src/ui/hooks/usePhraseCycler.js.map +1 -1
  197. package/dist/src/ui/hooks/usePhraseCycler.test.js +83 -111
  198. package/dist/src/ui/hooks/usePhraseCycler.test.js.map +1 -1
  199. package/dist/src/ui/hooks/useQuotaAndFallback.test.js +2 -2
  200. package/dist/src/ui/hooks/useQuotaAndFallback.test.js.map +1 -1
  201. package/dist/src/ui/hooks/useReactToolScheduler.test.js +1 -2
  202. package/dist/src/ui/hooks/useReactToolScheduler.test.js.map +1 -1
  203. package/dist/src/ui/hooks/useReverseSearchCompletion.test.js +2 -2
  204. package/dist/src/ui/hooks/useReverseSearchCompletion.test.js.map +1 -1
  205. package/dist/src/ui/hooks/useShellHistory.test.js +40 -17
  206. package/dist/src/ui/hooks/useShellHistory.test.js.map +1 -1
  207. package/dist/src/ui/hooks/useSlashCompletion.js +2 -2
  208. package/dist/src/ui/hooks/useSlashCompletion.js.map +1 -1
  209. package/dist/src/ui/hooks/useSlashCompletion.test.js +54 -49
  210. package/dist/src/ui/hooks/useSlashCompletion.test.js.map +1 -1
  211. package/dist/src/ui/hooks/useToolScheduler.test.js +48 -42
  212. package/dist/src/ui/hooks/useToolScheduler.test.js.map +1 -1
  213. package/dist/src/ui/keyMatchers.test.js +3 -3
  214. package/dist/src/ui/keyMatchers.test.js.map +1 -1
  215. package/dist/src/ui/types.d.ts +1 -0
  216. package/dist/src/ui/types.js +2 -0
  217. package/dist/src/ui/types.js.map +1 -1
  218. package/dist/src/ui/utils/clipboardUtils.js +2 -2
  219. package/dist/src/ui/utils/clipboardUtils.js.map +1 -1
  220. package/dist/src/ui/utils/updateCheck.js +6 -3
  221. package/dist/src/ui/utils/updateCheck.js.map +1 -1
  222. package/dist/src/ui/utils/updateCheck.test.js +5 -1
  223. package/dist/src/ui/utils/updateCheck.test.js.map +1 -1
  224. package/dist/src/utils/commentJson.js +2 -2
  225. package/dist/src/utils/commentJson.js.map +1 -1
  226. package/dist/src/utils/commentJson.test.js +7 -6
  227. package/dist/src/utils/commentJson.test.js.map +1 -1
  228. package/dist/src/utils/version.js +6 -2
  229. package/dist/src/utils/version.js.map +1 -1
  230. package/dist/src/zed-integration/acp.js +2 -1
  231. package/dist/src/zed-integration/acp.js.map +1 -1
  232. package/dist/src/zed-integration/zedIntegration.d.ts +2 -2
  233. package/dist/src/zed-integration/zedIntegration.js +4 -6
  234. package/dist/src/zed-integration/zedIntegration.js.map +1 -1
  235. package/dist/tsconfig.tsbuildinfo +1 -1
  236. package/package.json +3 -3
  237. package/dist/src/utils/package.d.ts +0 -12
  238. package/dist/src/utils/package.js +0 -24
  239. package/dist/src/utils/package.js.map +0 -1
@@ -0,0 +1,242 @@
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 { describe, it, expect, vi, beforeEach } from 'vitest';
9
+ import { TextInput } from './TextInput.js';
10
+ import { useKeypress } from '../../hooks/useKeypress.js';
11
+ import { useTextBuffer } from './text-buffer.js';
12
+ // Mocks
13
+ vi.mock('../../hooks/useKeypress.js', () => ({
14
+ useKeypress: vi.fn(),
15
+ }));
16
+ vi.mock('./text-buffer.js', () => {
17
+ const mockTextBuffer = {
18
+ text: '',
19
+ lines: [''],
20
+ cursor: [0, 0],
21
+ visualCursor: [0, 0],
22
+ viewportVisualLines: [''],
23
+ handleInput: vi.fn((key) => {
24
+ // Simulate basic input for testing
25
+ if (key.sequence) {
26
+ mockTextBuffer.text += key.sequence;
27
+ mockTextBuffer.viewportVisualLines = [mockTextBuffer.text];
28
+ mockTextBuffer.visualCursor[1] = mockTextBuffer.text.length;
29
+ }
30
+ else if (key.name === 'backspace') {
31
+ mockTextBuffer.text = mockTextBuffer.text.slice(0, -1);
32
+ mockTextBuffer.viewportVisualLines = [mockTextBuffer.text];
33
+ mockTextBuffer.visualCursor[1] = mockTextBuffer.text.length;
34
+ }
35
+ else if (key.name === 'left') {
36
+ mockTextBuffer.visualCursor[1] = Math.max(0, mockTextBuffer.visualCursor[1] - 1);
37
+ }
38
+ else if (key.name === 'right') {
39
+ mockTextBuffer.visualCursor[1] = Math.min(mockTextBuffer.text.length, mockTextBuffer.visualCursor[1] + 1);
40
+ }
41
+ }),
42
+ setText: vi.fn((newText) => {
43
+ mockTextBuffer.text = newText;
44
+ mockTextBuffer.viewportVisualLines = [newText];
45
+ mockTextBuffer.visualCursor[1] = newText.length;
46
+ }),
47
+ };
48
+ return {
49
+ useTextBuffer: vi.fn(() => mockTextBuffer),
50
+ TextBuffer: vi.fn(() => mockTextBuffer),
51
+ };
52
+ });
53
+ const mockedUseKeypress = useKeypress;
54
+ const mockedUseTextBuffer = useTextBuffer;
55
+ describe('TextInput', () => {
56
+ const onCancel = vi.fn();
57
+ const onSubmit = vi.fn();
58
+ let mockBuffer;
59
+ beforeEach(() => {
60
+ vi.resetAllMocks();
61
+ // Reset the internal state of the mock buffer for each test
62
+ const buffer = {
63
+ text: '',
64
+ lines: [''],
65
+ cursor: [0, 0],
66
+ visualCursor: [0, 0],
67
+ viewportVisualLines: [''],
68
+ handleInput: vi.fn((key) => {
69
+ if (key.sequence) {
70
+ buffer.text += key.sequence;
71
+ buffer.viewportVisualLines = [buffer.text];
72
+ buffer.visualCursor[1] = buffer.text.length;
73
+ }
74
+ else if (key.name === 'backspace') {
75
+ buffer.text = buffer.text.slice(0, -1);
76
+ buffer.viewportVisualLines = [buffer.text];
77
+ buffer.visualCursor[1] = buffer.text.length;
78
+ }
79
+ else if (key.name === 'left') {
80
+ buffer.visualCursor[1] = Math.max(0, buffer.visualCursor[1] - 1);
81
+ }
82
+ else if (key.name === 'right') {
83
+ buffer.visualCursor[1] = Math.min(buffer.text.length, buffer.visualCursor[1] + 1);
84
+ }
85
+ }),
86
+ setText: vi.fn((newText) => {
87
+ buffer.text = newText;
88
+ buffer.viewportVisualLines = [newText];
89
+ buffer.visualCursor[1] = newText.length;
90
+ }),
91
+ };
92
+ mockBuffer = buffer;
93
+ mockedUseTextBuffer.mockReturnValue(mockBuffer);
94
+ });
95
+ it('renders with an initial value', () => {
96
+ const buffer = {
97
+ text: 'test',
98
+ lines: ['test'],
99
+ cursor: [0, 4],
100
+ visualCursor: [0, 4],
101
+ viewportVisualLines: ['test'],
102
+ handleInput: vi.fn(),
103
+ setText: vi.fn(),
104
+ };
105
+ const { lastFrame } = render(_jsx(TextInput, { buffer: buffer, onSubmit: onSubmit, onCancel: onCancel }));
106
+ expect(lastFrame()).toContain('test');
107
+ });
108
+ it('renders a placeholder', () => {
109
+ const buffer = {
110
+ text: '',
111
+ lines: [''],
112
+ cursor: [0, 0],
113
+ visualCursor: [0, 0],
114
+ viewportVisualLines: [''],
115
+ handleInput: vi.fn(),
116
+ setText: vi.fn(),
117
+ };
118
+ const { lastFrame } = render(_jsx(TextInput, { buffer: buffer, placeholder: "testing", onSubmit: onSubmit, onCancel: onCancel }));
119
+ expect(lastFrame()).toContain('testing');
120
+ });
121
+ it('handles character input', () => {
122
+ render(_jsx(TextInput, { buffer: mockBuffer, onSubmit: onSubmit, onCancel: onCancel }));
123
+ const keypressHandler = mockedUseKeypress.mock.calls[0][0];
124
+ keypressHandler({
125
+ name: 'a',
126
+ sequence: 'a',
127
+ ctrl: false,
128
+ meta: false,
129
+ shift: false,
130
+ paste: false,
131
+ });
132
+ expect(mockBuffer.handleInput).toHaveBeenCalledWith({
133
+ name: 'a',
134
+ sequence: 'a',
135
+ ctrl: false,
136
+ meta: false,
137
+ shift: false,
138
+ paste: false,
139
+ });
140
+ expect(mockBuffer.text).toBe('a');
141
+ });
142
+ it('handles backspace', () => {
143
+ mockBuffer.setText('test');
144
+ render(_jsx(TextInput, { buffer: mockBuffer, onSubmit: onSubmit, onCancel: onCancel }));
145
+ const keypressHandler = mockedUseKeypress.mock.calls[0][0];
146
+ keypressHandler({
147
+ name: 'backspace',
148
+ sequence: '',
149
+ ctrl: false,
150
+ meta: false,
151
+ shift: false,
152
+ paste: false,
153
+ });
154
+ expect(mockBuffer.handleInput).toHaveBeenCalledWith({
155
+ name: 'backspace',
156
+ sequence: '',
157
+ ctrl: false,
158
+ meta: false,
159
+ shift: false,
160
+ paste: false,
161
+ });
162
+ expect(mockBuffer.text).toBe('tes');
163
+ });
164
+ it('handles left arrow', () => {
165
+ mockBuffer.setText('test');
166
+ render(_jsx(TextInput, { buffer: mockBuffer, onSubmit: onSubmit, onCancel: onCancel }));
167
+ const keypressHandler = mockedUseKeypress.mock.calls[0][0];
168
+ keypressHandler({
169
+ name: 'left',
170
+ sequence: '',
171
+ ctrl: false,
172
+ meta: false,
173
+ shift: false,
174
+ paste: false,
175
+ });
176
+ // Cursor moves from end to before 't'
177
+ expect(mockBuffer.visualCursor[1]).toBe(3);
178
+ });
179
+ it('handles right arrow', () => {
180
+ mockBuffer.setText('test');
181
+ mockBuffer.visualCursor[1] = 2; // Set initial cursor for right arrow test
182
+ render(_jsx(TextInput, { buffer: mockBuffer, onSubmit: onSubmit, onCancel: onCancel }));
183
+ const keypressHandler = mockedUseKeypress.mock.calls[0][0];
184
+ keypressHandler({
185
+ name: 'right',
186
+ sequence: '',
187
+ ctrl: false,
188
+ meta: false,
189
+ shift: false,
190
+ paste: false,
191
+ });
192
+ expect(mockBuffer.visualCursor[1]).toBe(3);
193
+ });
194
+ it('calls onSubmit on return', () => {
195
+ mockBuffer.setText('test');
196
+ render(_jsx(TextInput, { buffer: mockBuffer, onSubmit: onSubmit, onCancel: onCancel }));
197
+ const keypressHandler = mockedUseKeypress.mock.calls[0][0];
198
+ keypressHandler({
199
+ name: 'return',
200
+ sequence: '',
201
+ ctrl: false,
202
+ meta: false,
203
+ shift: false,
204
+ paste: false,
205
+ });
206
+ expect(onSubmit).toHaveBeenCalledWith('test');
207
+ });
208
+ it('calls onCancel on escape', async () => {
209
+ vi.useFakeTimers();
210
+ render(_jsx(TextInput, { buffer: mockBuffer, onCancel: onCancel, onSubmit: onSubmit }));
211
+ const keypressHandler = mockedUseKeypress.mock.calls[0][0];
212
+ keypressHandler({
213
+ name: 'escape',
214
+ sequence: '',
215
+ ctrl: false,
216
+ meta: false,
217
+ shift: false,
218
+ paste: false,
219
+ });
220
+ await vi.runAllTimersAsync();
221
+ expect(onCancel).toHaveBeenCalled();
222
+ vi.useRealTimers();
223
+ });
224
+ it('renders the input value', () => {
225
+ mockBuffer.setText('secret');
226
+ const { lastFrame } = render(_jsx(TextInput, { buffer: mockBuffer, onSubmit: onSubmit, onCancel: onCancel }));
227
+ expect(lastFrame()).toContain('secret');
228
+ });
229
+ it('does not show cursor when not focused', () => {
230
+ mockBuffer.setText('test');
231
+ const { lastFrame } = render(_jsx(TextInput, { buffer: mockBuffer, focus: false, onSubmit: onSubmit, onCancel: onCancel }));
232
+ expect(lastFrame()).not.toContain('\u001b[7m'); // Inverse video chalk
233
+ });
234
+ it('renders multiple lines when text wraps', () => {
235
+ mockBuffer.text = 'line1\nline2';
236
+ mockBuffer.viewportVisualLines = ['line1', 'line2'];
237
+ const { lastFrame } = render(_jsx(TextInput, { buffer: mockBuffer, onSubmit: onSubmit, onCancel: onCancel }));
238
+ expect(lastFrame()).toContain('line1');
239
+ expect(lastFrame()).toContain('line2');
240
+ });
241
+ });
242
+ //# sourceMappingURL=TextInput.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TextInput.test.js","sourceRoot":"","sources":["../../../../../src/ui/components/shared/TextInput.test.tsx"],"names":[],"mappings":"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"}
@@ -45,6 +45,8 @@ interface UseTextBufferProps {
45
45
  onChange?: (text: string) => void;
46
46
  isValidPath: (path: string) => boolean;
47
47
  shellModeActive?: boolean;
48
+ inputFilter?: (text: string) => string;
49
+ singleLine?: boolean;
48
50
  }
49
51
  interface UndoHistoryEntry {
50
52
  lines: string[];
@@ -253,8 +255,12 @@ export type TextBufferAction = {
253
255
  } | {
254
256
  type: 'vim_escape_insert_mode';
255
257
  };
256
- export declare function textBufferReducer(state: TextBufferState, action: TextBufferAction): TextBufferState;
257
- export declare function useTextBuffer({ initialText, initialCursorOffset, viewport, stdin, setRawMode, onChange, isValidPath, shellModeActive, }: UseTextBufferProps): TextBuffer;
258
+ export interface TextBufferOptions {
259
+ inputFilter?: (text: string) => string;
260
+ singleLine?: boolean;
261
+ }
262
+ export declare function textBufferReducer(state: TextBufferState, action: TextBufferAction, options?: TextBufferOptions): TextBufferState;
263
+ export declare function useTextBuffer({ initialText, initialCursorOffset, viewport, stdin, setRawMode, onChange, isValidPath, shellModeActive, inputFilter, singleLine, }: UseTextBufferProps): TextBuffer;
258
264
  export interface TextBuffer {
259
265
  lines: string[];
260
266
  text: string;
@@ -624,7 +624,7 @@ export const pushUndo = (currentState) => {
624
624
  }
625
625
  return { ...currentState, undoStack: newStack, redoStack: [] };
626
626
  };
627
- function textBufferReducerLogic(state, action) {
627
+ function textBufferReducerLogic(state, action, options = {}) {
628
628
  const pushUndoLocal = pushUndo;
629
629
  const currentLine = (r) => state.lines[r] ?? '';
630
630
  const currentLineLen = (r) => cpLen(currentLine(r));
@@ -653,7 +653,17 @@ function textBufferReducerLogic(state, action) {
653
653
  let newCursorRow = nextState.cursorRow;
654
654
  let newCursorCol = nextState.cursorCol;
655
655
  const currentLine = (r) => newLines[r] ?? '';
656
- const str = stripUnsafeCharacters(action.payload.replace(/\r\n/g, '\n').replace(/\r/g, '\n'));
656
+ let payload = action.payload;
657
+ if (options.singleLine) {
658
+ payload = payload.replace(/[\r\n]/g, '');
659
+ }
660
+ if (options.inputFilter) {
661
+ payload = options.inputFilter(payload);
662
+ }
663
+ if (payload.length === 0) {
664
+ return state;
665
+ }
666
+ const str = stripUnsafeCharacters(payload.replace(/\r\n/g, '\n').replace(/\r/g, '\n'));
657
667
  const parts = str.split('\n');
658
668
  const lineContent = currentLine(newCursorRow);
659
669
  const before = cpSlice(lineContent, 0, newCursorCol);
@@ -1105,8 +1115,8 @@ function textBufferReducerLogic(state, action) {
1105
1115
  }
1106
1116
  }
1107
1117
  }
1108
- export function textBufferReducer(state, action) {
1109
- const newState = textBufferReducerLogic(state, action);
1118
+ export function textBufferReducer(state, action, options = {}) {
1119
+ const newState = textBufferReducerLogic(state, action, options);
1110
1120
  if (newState.lines !== state.lines ||
1111
1121
  newState.viewportWidth !== state.viewportWidth) {
1112
1122
  return {
@@ -1117,7 +1127,7 @@ export function textBufferReducer(state, action) {
1117
1127
  return newState;
1118
1128
  }
1119
1129
  // --- End of reducer logic ---
1120
- export function useTextBuffer({ initialText = '', initialCursorOffset = 0, viewport, stdin, setRawMode, onChange, isValidPath, shellModeActive = false, }) {
1130
+ export function useTextBuffer({ initialText = '', initialCursorOffset = 0, viewport, stdin, setRawMode, onChange, isValidPath, shellModeActive = false, inputFilter, singleLine = false, }) {
1121
1131
  const initialState = useMemo(() => {
1122
1132
  const lines = initialText.split('\n');
1123
1133
  const [initialCursorRow, initialCursorCol] = calculateInitialCursorPosition(lines.length === 0 ? [''] : lines, initialCursorOffset);
@@ -1136,7 +1146,7 @@ export function useTextBuffer({ initialText = '', initialCursorOffset = 0, viewp
1136
1146
  visualLayout,
1137
1147
  };
1138
1148
  }, [initialText, initialCursorOffset, viewport.width, viewport.height]);
1139
- const [state, dispatch] = useReducer(textBufferReducer, initialState);
1149
+ const [state, dispatch] = useReducer((s, a) => textBufferReducer(s, a, { inputFilter, singleLine }), initialState);
1140
1150
  const { lines, cursorRow, cursorCol, preferredCol, selectionAnchor, visualLayout, } = state;
1141
1151
  const text = useMemo(() => lines.join('\n'), [lines]);
1142
1152
  const visualCursor = useMemo(() => calculateVisualCursorFromLayout(visualLayout, [cursorRow, cursorCol]), [visualLayout, cursorRow, cursorCol]);
@@ -1173,7 +1183,7 @@ export function useTextBuffer({ initialText = '', initialCursorOffset = 0, viewp
1173
1183
  }
1174
1184
  }, [visualCursor, visualScrollRow, viewport, visualLines.length]);
1175
1185
  const insert = useCallback((ch, { paste = false } = {}) => {
1176
- if (/[\n\r]/.test(ch)) {
1186
+ if (!singleLine && /[\n\r]/.test(ch)) {
1177
1187
  dispatch({ type: 'insert', payload: ch });
1178
1188
  return;
1179
1189
  }
@@ -1207,10 +1217,13 @@ export function useTextBuffer({ initialText = '', initialCursorOffset = 0, viewp
1207
1217
  if (currentText.length > 0) {
1208
1218
  dispatch({ type: 'insert', payload: currentText });
1209
1219
  }
1210
- }, [isValidPath, shellModeActive]);
1220
+ }, [isValidPath, shellModeActive, singleLine]);
1211
1221
  const newline = useCallback(() => {
1222
+ if (singleLine) {
1223
+ return;
1224
+ }
1212
1225
  dispatch({ type: 'insert', payload: '\n' });
1213
- }, []);
1226
+ }, [singleLine]);
1214
1227
  const backspace = useCallback(() => {
1215
1228
  dispatch({ type: 'backspace' });
1216
1229
  }, []);
@@ -1390,10 +1403,11 @@ export function useTextBuffer({ initialText = '', initialCursorOffset = 0, viewp
1390
1403
  insert(input, { paste: key.paste });
1391
1404
  return;
1392
1405
  }
1393
- if (key.name === 'return' ||
1394
- input === '\r' ||
1395
- input === '\n' ||
1396
- input === '\\\r' // VSCode terminal represents shift + enter this way
1406
+ if (!singleLine &&
1407
+ (key.name === 'return' ||
1408
+ input === '\r' ||
1409
+ input === '\n' ||
1410
+ input === '\\r') // VSCode terminal represents shift + enter this way
1397
1411
  )
1398
1412
  newline();
1399
1413
  else if (key.name === 'left' && !key.meta && !key.ctrl)
@@ -1454,6 +1468,7 @@ export function useTextBuffer({ initialText = '', initialCursorOffset = 0, viewp
1454
1468
  insert,
1455
1469
  undo,
1456
1470
  redo,
1471
+ singleLine,
1457
1472
  ]);
1458
1473
  const renderedVisualLines = useMemo(() => visualLines.slice(visualScrollRow, visualScrollRow + viewport.height), [visualLines, visualScrollRow, viewport.height]);
1459
1474
  const replaceRange = useCallback((startRow, startCol, endRow, endCol, text) => {