@google/gemini-cli 0.1.9-nightly.250709.c8cf954e → 0.1.9-rc.0

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 (136) hide show
  1. package/README.md +3 -17
  2. package/dist/google-gemini-cli-0.1.9-rc.0.tgz +0 -0
  3. package/dist/index.js +0 -0
  4. package/dist/package.json +10 -9
  5. package/dist/src/config/auth.js +5 -6
  6. package/dist/src/config/auth.js.map +1 -1
  7. package/dist/src/config/config.d.ts +1 -0
  8. package/dist/src/config/config.js +44 -64
  9. package/dist/src/config/config.js.map +1 -1
  10. package/dist/src/config/extension.d.ts +0 -2
  11. package/dist/src/config/extension.js +6 -34
  12. package/dist/src/config/extension.js.map +1 -1
  13. package/dist/src/config/sandboxConfig.d.ts +1 -1
  14. package/dist/src/config/sandboxConfig.js +1 -1
  15. package/dist/src/config/sandboxConfig.js.map +1 -1
  16. package/dist/src/config/settings.d.ts +0 -2
  17. package/dist/src/config/settings.js +1 -63
  18. package/dist/src/config/settings.js.map +1 -1
  19. package/dist/src/gemini.js +20 -26
  20. package/dist/src/gemini.js.map +1 -1
  21. package/dist/src/{ui/commands/types.js → gemini.test.d.ts} +0 -1
  22. package/dist/src/gemini.test.js +122 -0
  23. package/dist/src/gemini.test.js.map +1 -0
  24. package/dist/src/generated/git-commit.d.ts +1 -1
  25. package/dist/src/generated/git-commit.js +1 -1
  26. package/dist/src/generated/git-commit.js.map +1 -1
  27. package/dist/src/ui/App.js +7 -11
  28. package/dist/src/ui/App.js.map +1 -1
  29. package/dist/src/ui/App.test.d.ts +6 -0
  30. package/dist/src/ui/App.test.js +299 -0
  31. package/dist/src/ui/App.test.js.map +1 -0
  32. package/dist/src/ui/components/AuthDialog.js +8 -36
  33. package/dist/src/ui/components/AuthDialog.js.map +1 -1
  34. package/dist/src/ui/components/AuthDialog.test.d.ts +6 -0
  35. package/dist/src/ui/components/AuthDialog.test.js +69 -0
  36. package/dist/src/ui/components/AuthDialog.test.js.map +1 -0
  37. package/dist/src/ui/components/Help.d.ts +1 -1
  38. package/dist/src/ui/components/Help.js +2 -3
  39. package/dist/src/ui/components/Help.js.map +1 -1
  40. package/dist/src/ui/components/HistoryItemDisplay.test.d.ts +6 -0
  41. package/dist/src/ui/components/HistoryItemDisplay.test.js +81 -0
  42. package/dist/src/ui/components/HistoryItemDisplay.test.js.map +1 -0
  43. package/dist/src/ui/components/InputPrompt.d.ts +1 -2
  44. package/dist/src/ui/components/InputPrompt.js +157 -106
  45. package/dist/src/ui/components/InputPrompt.js.map +1 -1
  46. package/dist/src/ui/components/InputPrompt.test.d.ts +6 -0
  47. package/dist/src/ui/components/InputPrompt.test.js +154 -0
  48. package/dist/src/ui/components/InputPrompt.test.js.map +1 -0
  49. package/dist/src/ui/components/LoadingIndicator.js +1 -2
  50. package/dist/src/ui/components/LoadingIndicator.js.map +1 -1
  51. package/dist/src/ui/components/LoadingIndicator.test.d.ts +6 -0
  52. package/dist/src/ui/components/LoadingIndicator.test.js +141 -0
  53. package/dist/src/ui/components/LoadingIndicator.test.js.map +1 -0
  54. package/dist/src/ui/components/ModelStatsDisplay.test.d.ts +6 -0
  55. package/dist/src/ui/components/ModelStatsDisplay.test.js +217 -0
  56. package/dist/src/ui/components/ModelStatsDisplay.test.js.map +1 -0
  57. package/dist/src/ui/components/SessionSummaryDisplay.test.d.ts +6 -0
  58. package/dist/src/ui/components/SessionSummaryDisplay.test.js +60 -0
  59. package/dist/src/ui/components/SessionSummaryDisplay.test.js.map +1 -0
  60. package/dist/src/ui/components/StatsDisplay.test.d.ts +6 -0
  61. package/dist/src/ui/components/StatsDisplay.test.js +275 -0
  62. package/dist/src/ui/components/StatsDisplay.test.js.map +1 -0
  63. package/dist/src/ui/components/ToolStatsDisplay.test.d.ts +6 -0
  64. package/dist/src/ui/components/ToolStatsDisplay.test.js +160 -0
  65. package/dist/src/ui/components/ToolStatsDisplay.test.js.map +1 -0
  66. package/dist/src/ui/components/messages/CompressionMessage.js +1 -1
  67. package/dist/src/ui/components/messages/DiffRenderer.test.d.ts +6 -0
  68. package/dist/src/ui/components/messages/DiffRenderer.test.js +239 -0
  69. package/dist/src/ui/components/messages/DiffRenderer.test.js.map +1 -0
  70. package/dist/src/ui/components/messages/ToolConfirmationMessage.test.d.ts +6 -0
  71. package/dist/src/ui/components/messages/ToolConfirmationMessage.test.js +37 -0
  72. package/dist/src/ui/components/messages/ToolConfirmationMessage.test.js.map +1 -0
  73. package/dist/src/ui/components/messages/ToolMessage.test.d.ts +6 -0
  74. package/dist/src/ui/components/messages/ToolMessage.test.js +116 -0
  75. package/dist/src/ui/components/messages/ToolMessage.test.js.map +1 -0
  76. package/dist/src/ui/components/shared/MaxSizedBox.js +1 -1
  77. package/dist/src/ui/components/shared/MaxSizedBox.js.map +1 -1
  78. package/dist/src/ui/components/shared/MaxSizedBox.test.d.ts +6 -0
  79. package/dist/src/ui/components/shared/MaxSizedBox.test.js +134 -0
  80. package/dist/src/ui/components/shared/MaxSizedBox.test.js.map +1 -0
  81. package/dist/src/ui/components/shared/text-buffer.d.ts +16 -72
  82. package/dist/src/ui/components/shared/text-buffer.js +676 -564
  83. package/dist/src/ui/components/shared/text-buffer.js.map +1 -1
  84. package/dist/src/ui/contexts/SessionContext.d.ts +1 -1
  85. package/dist/src/ui/contexts/SessionContext.test.d.ts +6 -0
  86. package/dist/src/ui/contexts/SessionContext.test.js +96 -0
  87. package/dist/src/ui/contexts/SessionContext.test.js.map +1 -0
  88. package/dist/src/ui/hooks/atCommandProcessor.js +7 -5
  89. package/dist/src/ui/hooks/atCommandProcessor.js.map +1 -1
  90. package/dist/src/ui/hooks/slashCommandProcessor.d.ts +10 -6
  91. package/dist/src/ui/hooks/slashCommandProcessor.js +124 -235
  92. package/dist/src/ui/hooks/slashCommandProcessor.js.map +1 -1
  93. package/dist/src/ui/hooks/useCompletion.d.ts +2 -2
  94. package/dist/src/ui/hooks/useCompletion.js +56 -106
  95. package/dist/src/ui/hooks/useCompletion.js.map +1 -1
  96. package/dist/src/ui/hooks/useGeminiStream.d.ts +2 -2
  97. package/dist/src/ui/hooks/useGeminiStream.js +18 -12
  98. package/dist/src/ui/hooks/useGeminiStream.js.map +1 -1
  99. package/dist/src/ui/hooks/useGeminiStream.test.d.ts +6 -0
  100. package/dist/src/ui/hooks/useGeminiStream.test.js +775 -0
  101. package/dist/src/ui/hooks/useGeminiStream.test.js.map +1 -0
  102. package/dist/src/ui/themes/ansi.js +1 -1
  103. package/dist/src/ui/themes/ansi.js.map +1 -1
  104. package/dist/src/ui/types.d.ts +0 -10
  105. package/dist/src/ui/utils/MarkdownDisplay.js +80 -1
  106. package/dist/src/ui/utils/MarkdownDisplay.js.map +1 -1
  107. package/dist/src/ui/utils/MarkdownDisplay.test.d.ts +6 -0
  108. package/dist/src/ui/utils/MarkdownDisplay.test.js +176 -0
  109. package/dist/src/ui/utils/MarkdownDisplay.test.js.map +1 -0
  110. package/dist/src/ui/utils/TableRenderer.js +32 -50
  111. package/dist/src/ui/utils/TableRenderer.js.map +1 -1
  112. package/dist/src/utils/sandbox-macos-permissive-proxied.sb +1 -1
  113. package/dist/src/utils/sandbox-macos-restrictive-proxied.sb +1 -1
  114. package/dist/tsconfig.tsbuildinfo +1 -1
  115. package/package.json +10 -9
  116. package/dist/google-gemini-cli-0.1.9.tgz +0 -0
  117. package/dist/src/services/CommandService.d.ts +0 -13
  118. package/dist/src/services/CommandService.js +0 -30
  119. package/dist/src/services/CommandService.js.map +0 -1
  120. package/dist/src/ui/commands/clearCommand.d.ts +0 -7
  121. package/dist/src/ui/commands/clearCommand.js +0 -15
  122. package/dist/src/ui/commands/clearCommand.js.map +0 -1
  123. package/dist/src/ui/commands/helpCommand.d.ts +0 -7
  124. package/dist/src/ui/commands/helpCommand.js +0 -18
  125. package/dist/src/ui/commands/helpCommand.js.map +0 -1
  126. package/dist/src/ui/commands/memoryCommand.d.ts +0 -7
  127. package/dist/src/ui/commands/memoryCommand.js +0 -81
  128. package/dist/src/ui/commands/memoryCommand.js.map +0 -1
  129. package/dist/src/ui/commands/types.d.ts +0 -63
  130. package/dist/src/ui/commands/types.js.map +0 -1
  131. package/dist/src/ui/utils/InlineMarkdownRenderer.d.ts +0 -16
  132. package/dist/src/ui/utils/InlineMarkdownRenderer.js +0 -104
  133. package/dist/src/ui/utils/InlineMarkdownRenderer.js.map +0 -1
  134. package/dist/src/utils/userStartupWarnings.d.ts +0 -6
  135. package/dist/src/utils/userStartupWarnings.js +0 -33
  136. package/dist/src/utils/userStartupWarnings.js.map +0 -1
@@ -0,0 +1,134 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } 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 { OverflowProvider } from '../../contexts/OverflowContext.js';
9
+ import { MaxSizedBox, setMaxSizedBoxDebugging } from './MaxSizedBox.js';
10
+ import { Box, Text } from 'ink';
11
+ import { describe, it, expect } from 'vitest';
12
+ describe('<MaxSizedBox />', () => {
13
+ // Make sure MaxSizedBox logs errors on invalid configurations.
14
+ // This is useful for debugging issues with the component.
15
+ // It should be set to false in production for perfornance and to avoid
16
+ // cluttering the console if there are ignorable issues.
17
+ setMaxSizedBoxDebugging(true);
18
+ it('renders children without truncation when they fit', () => {
19
+ const { lastFrame } = render(_jsx(OverflowProvider, { children: _jsx(MaxSizedBox, { maxWidth: 80, maxHeight: 10, children: _jsx(Box, { children: _jsx(Text, { children: "Hello, World!" }) }) }) }));
20
+ expect(lastFrame()).equals('Hello, World!');
21
+ });
22
+ it('hides lines when content exceeds maxHeight', () => {
23
+ const { lastFrame } = render(_jsx(OverflowProvider, { children: _jsxs(MaxSizedBox, { maxWidth: 80, maxHeight: 2, children: [_jsx(Box, { children: _jsx(Text, { children: "Line 1" }) }), _jsx(Box, { children: _jsx(Text, { children: "Line 2" }) }), _jsx(Box, { children: _jsx(Text, { children: "Line 3" }) })] }) }));
24
+ expect(lastFrame()).equals(`... first 2 lines hidden ...
25
+ Line 3`);
26
+ });
27
+ it('hides lines at the end when content exceeds maxHeight and overflowDirection is bottom', () => {
28
+ const { lastFrame } = render(_jsx(OverflowProvider, { children: _jsxs(MaxSizedBox, { maxWidth: 80, maxHeight: 2, overflowDirection: "bottom", children: [_jsx(Box, { children: _jsx(Text, { children: "Line 1" }) }), _jsx(Box, { children: _jsx(Text, { children: "Line 2" }) }), _jsx(Box, { children: _jsx(Text, { children: "Line 3" }) })] }) }));
29
+ expect(lastFrame()).equals(`Line 1
30
+ ... last 2 lines hidden ...`);
31
+ });
32
+ it('wraps text that exceeds maxWidth', () => {
33
+ const { lastFrame } = render(_jsx(OverflowProvider, { children: _jsx(MaxSizedBox, { maxWidth: 10, maxHeight: 5, children: _jsx(Box, { children: _jsx(Text, { wrap: "wrap", children: "This is a long line of text" }) }) }) }));
34
+ expect(lastFrame()).equals(`This is a
35
+ long line
36
+ of text`);
37
+ });
38
+ it('handles mixed wrapping and non-wrapping segments', () => {
39
+ const multilineText = `This part will wrap around.
40
+ And has a line break.
41
+ Leading spaces preserved.`;
42
+ const { lastFrame } = render(_jsx(OverflowProvider, { children: _jsxs(MaxSizedBox, { maxWidth: 20, maxHeight: 20, children: [_jsx(Box, { children: _jsx(Text, { children: "Example" }) }), _jsxs(Box, { children: [_jsx(Text, { children: "No Wrap: " }), _jsx(Text, { wrap: "wrap", children: multilineText })] }), _jsxs(Box, { children: [_jsx(Text, { children: "Longer No Wrap: " }), _jsx(Text, { wrap: "wrap", children: "This part will wrap around." })] })] }) }));
43
+ expect(lastFrame()).equals(`Example
44
+ No Wrap: This part
45
+ will wrap
46
+ around.
47
+ And has a
48
+ line break.
49
+ Leading
50
+ spaces
51
+ preserved.
52
+ Longer No Wrap: This
53
+ part
54
+ will
55
+ wrap
56
+ arou
57
+ nd.`);
58
+ });
59
+ it('handles words longer than maxWidth by splitting them', () => {
60
+ const { lastFrame } = render(_jsx(OverflowProvider, { children: _jsx(MaxSizedBox, { maxWidth: 5, maxHeight: 5, children: _jsx(Box, { children: _jsx(Text, { wrap: "wrap", children: "Supercalifragilisticexpialidocious" }) }) }) }));
61
+ expect(lastFrame()).equals(`... …
62
+ istic
63
+ expia
64
+ lidoc
65
+ ious`);
66
+ });
67
+ it('does not truncate when maxHeight is undefined', () => {
68
+ const { lastFrame } = render(_jsx(OverflowProvider, { children: _jsxs(MaxSizedBox, { maxWidth: 80, maxHeight: undefined, children: [_jsx(Box, { children: _jsx(Text, { children: "Line 1" }) }), _jsx(Box, { children: _jsx(Text, { children: "Line 2" }) })] }) }));
69
+ expect(lastFrame()).equals(`Line 1
70
+ Line 2`);
71
+ });
72
+ it('shows plural "lines" when more than one line is hidden', () => {
73
+ const { lastFrame } = render(_jsx(OverflowProvider, { children: _jsxs(MaxSizedBox, { maxWidth: 80, maxHeight: 2, children: [_jsx(Box, { children: _jsx(Text, { children: "Line 1" }) }), _jsx(Box, { children: _jsx(Text, { children: "Line 2" }) }), _jsx(Box, { children: _jsx(Text, { children: "Line 3" }) })] }) }));
74
+ expect(lastFrame()).equals(`... first 2 lines hidden ...
75
+ Line 3`);
76
+ });
77
+ it('shows plural "lines" when more than one line is hidden and overflowDirection is bottom', () => {
78
+ const { lastFrame } = render(_jsx(OverflowProvider, { children: _jsxs(MaxSizedBox, { maxWidth: 80, maxHeight: 2, overflowDirection: "bottom", children: [_jsx(Box, { children: _jsx(Text, { children: "Line 1" }) }), _jsx(Box, { children: _jsx(Text, { children: "Line 2" }) }), _jsx(Box, { children: _jsx(Text, { children: "Line 3" }) })] }) }));
79
+ expect(lastFrame()).equals(`Line 1
80
+ ... last 2 lines hidden ...`);
81
+ });
82
+ it('renders an empty box for empty children', () => {
83
+ const { lastFrame } = render(_jsx(OverflowProvider, { children: _jsx(MaxSizedBox, { maxWidth: 80, maxHeight: 10 }) }));
84
+ // Expect an empty string or a box with nothing in it.
85
+ // Ink renders an empty box as an empty string.
86
+ expect(lastFrame()).equals('');
87
+ });
88
+ it('wraps text with multi-byte unicode characters correctly', () => {
89
+ const { lastFrame } = render(_jsx(OverflowProvider, { children: _jsx(MaxSizedBox, { maxWidth: 5, maxHeight: 5, children: _jsx(Box, { children: _jsx(Text, { wrap: "wrap", children: "\u4F60\u597D\u4E16\u754C" }) }) }) }));
90
+ // "你好" has a visual width of 4. "世界" has a visual width of 4.
91
+ // With maxWidth=5, it should wrap after the second character.
92
+ expect(lastFrame()).equals(`你好
93
+ 世界`);
94
+ });
95
+ it('wraps text with multi-byte emoji characters correctly', () => {
96
+ const { lastFrame } = render(_jsx(OverflowProvider, { children: _jsx(MaxSizedBox, { maxWidth: 5, maxHeight: 5, children: _jsx(Box, { children: _jsx(Text, { wrap: "wrap", children: "\uD83D\uDC36\uD83D\uDC36\uD83D\uDC36\uD83D\uDC36\uD83D\uDC36" }) }) }) }));
97
+ // Each "🐶" has a visual width of 2.
98
+ // With maxWidth=5, it should wrap every 2 emojis.
99
+ expect(lastFrame()).equals(`🐶🐶
100
+ 🐶🐶
101
+ 🐶`);
102
+ });
103
+ it('accounts for additionalHiddenLinesCount', () => {
104
+ const { lastFrame } = render(_jsx(OverflowProvider, { children: _jsxs(MaxSizedBox, { maxWidth: 80, maxHeight: 2, additionalHiddenLinesCount: 5, children: [_jsx(Box, { children: _jsx(Text, { children: "Line 1" }) }), _jsx(Box, { children: _jsx(Text, { children: "Line 2" }) }), _jsx(Box, { children: _jsx(Text, { children: "Line 3" }) })] }) }));
105
+ // 1 line is hidden by overflow, 5 are additionally hidden.
106
+ expect(lastFrame()).equals(`... first 7 lines hidden ...
107
+ Line 3`);
108
+ });
109
+ it('handles React.Fragment as a child', () => {
110
+ const { lastFrame } = render(_jsx(OverflowProvider, { children: _jsxs(MaxSizedBox, { maxWidth: 80, maxHeight: 10, children: [_jsxs(_Fragment, { children: [_jsx(Box, { children: _jsx(Text, { children: "Line 1 from Fragment" }) }), _jsx(Box, { children: _jsx(Text, { children: "Line 2 from Fragment" }) })] }), _jsx(Box, { children: _jsx(Text, { children: "Line 3 direct child" }) })] }) }));
111
+ expect(lastFrame()).equals(`Line 1 from Fragment
112
+ Line 2 from Fragment
113
+ Line 3 direct child`);
114
+ });
115
+ it('clips a long single text child from the top', () => {
116
+ const THIRTY_LINES = Array.from({ length: 30 }, (_, i) => `Line ${i + 1}`).join('\n');
117
+ const { lastFrame } = render(_jsx(OverflowProvider, { children: _jsx(MaxSizedBox, { maxWidth: 80, maxHeight: 10, children: _jsx(Box, { children: _jsx(Text, { children: THIRTY_LINES }) }) }) }));
118
+ const expected = [
119
+ '... first 21 lines hidden ...',
120
+ ...Array.from({ length: 9 }, (_, i) => `Line ${22 + i}`),
121
+ ].join('\n');
122
+ expect(lastFrame()).equals(expected);
123
+ });
124
+ it('clips a long single text child from the bottom', () => {
125
+ const THIRTY_LINES = Array.from({ length: 30 }, (_, i) => `Line ${i + 1}`).join('\n');
126
+ const { lastFrame } = render(_jsx(OverflowProvider, { children: _jsx(MaxSizedBox, { maxWidth: 80, maxHeight: 10, overflowDirection: "bottom", children: _jsx(Box, { children: _jsx(Text, { children: THIRTY_LINES }) }) }) }));
127
+ const expected = [
128
+ ...Array.from({ length: 9 }, (_, i) => `Line ${i + 1}`),
129
+ '... last 21 lines hidden ...',
130
+ ].join('\n');
131
+ expect(lastFrame()).equals(expected);
132
+ });
133
+ });
134
+ //# sourceMappingURL=MaxSizedBox.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MaxSizedBox.test.js","sourceRoot":"","sources":["../../../../../src/ui/components/shared/MaxSizedBox.test.tsx"],"names":[],"mappings":"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"}
@@ -4,6 +4,12 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
  export type Direction = 'left' | 'right' | 'up' | 'down' | 'wordLeft' | 'wordRight' | 'home' | 'end';
7
+ type UpdateOperation = {
8
+ type: 'insert';
9
+ payload: string;
10
+ } | {
11
+ type: 'backspace';
12
+ };
7
13
  export interface Viewport {
8
14
  height: number;
9
15
  width: number;
@@ -16,75 +22,9 @@ interface UseTextBufferProps {
16
22
  setRawMode?: (mode: boolean) => void;
17
23
  onChange?: (text: string) => void;
18
24
  isValidPath: (path: string) => boolean;
19
- shellModeActive?: boolean;
20
- }
21
- interface UndoHistoryEntry {
22
- lines: string[];
23
- cursorRow: number;
24
- cursorCol: number;
25
25
  }
26
26
  export declare function offsetToLogicalPos(text: string, offset: number): [number, number];
27
- interface TextBufferState {
28
- lines: string[];
29
- cursorRow: number;
30
- cursorCol: number;
31
- preferredCol: number | null;
32
- undoStack: UndoHistoryEntry[];
33
- redoStack: UndoHistoryEntry[];
34
- clipboard: string | null;
35
- selectionAnchor: [number, number] | null;
36
- viewportWidth: number;
37
- }
38
- type TextBufferAction = {
39
- type: 'set_text';
40
- payload: string;
41
- pushToUndo?: boolean;
42
- } | {
43
- type: 'insert';
44
- payload: string;
45
- } | {
46
- type: 'backspace';
47
- } | {
48
- type: 'move';
49
- payload: {
50
- dir: Direction;
51
- };
52
- } | {
53
- type: 'delete';
54
- } | {
55
- type: 'delete_word_left';
56
- } | {
57
- type: 'delete_word_right';
58
- } | {
59
- type: 'kill_line_right';
60
- } | {
61
- type: 'kill_line_left';
62
- } | {
63
- type: 'undo';
64
- } | {
65
- type: 'redo';
66
- } | {
67
- type: 'replace_range';
68
- payload: {
69
- startRow: number;
70
- startCol: number;
71
- endRow: number;
72
- endCol: number;
73
- text: string;
74
- };
75
- } | {
76
- type: 'move_to_offset';
77
- payload: {
78
- offset: number;
79
- };
80
- } | {
81
- type: 'create_undo_snapshot';
82
- } | {
83
- type: 'set_viewport_width';
84
- payload: number;
85
- };
86
- export declare function textBufferReducer(state: TextBufferState, action: TextBufferAction): TextBufferState;
87
- export declare function useTextBuffer({ initialText, initialCursorOffset, viewport, stdin, setRawMode, onChange, isValidPath, shellModeActive, }: UseTextBufferProps): TextBuffer;
27
+ export declare function useTextBuffer({ initialText, initialCursorOffset, viewport, stdin, setRawMode, onChange, isValidPath, }: UseTextBufferProps): TextBuffer;
88
28
  export interface TextBuffer {
89
29
  lines: string[];
90
30
  text: string;
@@ -114,8 +54,8 @@ export interface TextBuffer {
114
54
  backspace: () => void;
115
55
  del: () => void;
116
56
  move: (dir: Direction) => void;
117
- undo: () => void;
118
- redo: () => void;
57
+ undo: () => boolean;
58
+ redo: () => boolean;
119
59
  /**
120
60
  * Replaces the text within the specified range with new text.
121
61
  * Handles both single-line and multi-line ranges.
@@ -127,7 +67,7 @@ export interface TextBuffer {
127
67
  * @param text The new text to insert.
128
68
  * @returns True if the buffer was modified, false otherwise.
129
69
  */
130
- replaceRange: (startRow: number, startCol: number, endRow: number, endCol: number, text: string) => void;
70
+ replaceRange: (startRow: number, startCol: number, endRow: number, endCol: number, text: string) => boolean;
131
71
  /**
132
72
  * Delete the word to the *left* of the caret, mirroring common
133
73
  * Ctrl/Alt+Backspace behaviour in editors & terminals. Both the adjacent
@@ -159,7 +99,7 @@ export interface TextBuffer {
159
99
  shift: boolean;
160
100
  paste: boolean;
161
101
  sequence: string;
162
- }) => void;
102
+ }) => boolean;
163
103
  /**
164
104
  * Opens the current buffer contents in the user's preferred terminal text
165
105
  * editor ($VISUAL or $EDITOR, falling back to "vi"). The method blocks
@@ -178,7 +118,11 @@ export interface TextBuffer {
178
118
  openInExternalEditor: (opts?: {
179
119
  editor?: string;
180
120
  }) => Promise<void>;
181
- replaceRangeByOffset: (startOffset: number, endOffset: number, replacementText: string) => void;
121
+ copy: () => string | null;
122
+ paste: () => boolean;
123
+ startSelection: () => void;
124
+ replaceRangeByOffset: (startOffset: number, endOffset: number, replacementText: string) => boolean;
182
125
  moveToOffset(offset: number): void;
126
+ applyOperations: (ops: UpdateOperation[]) => void;
183
127
  }
184
128
  export {};