@caupulican/pi-tui 0.85.0 → 0.85.4
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.
|
@@ -122,6 +122,7 @@ export declare class Editor implements Component, Focusable {
|
|
|
122
122
|
col: number;
|
|
123
123
|
};
|
|
124
124
|
setText(text: string): void;
|
|
125
|
+
private resetState;
|
|
125
126
|
/** Drop every live or historical reference retained by this editor instance. */
|
|
126
127
|
clear(): void;
|
|
127
128
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"editor.d.ts","sourceRoot":"","sources":["../../src/components/editor.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"editor.d.ts","sourceRoot":"","sources":["../../src/components/editor.ts"],"names":[],"mappings":"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"}
|
|
@@ -803,14 +803,14 @@ export class Editor {
|
|
|
803
803
|
this.pasteCounter = 0;
|
|
804
804
|
this.setTextInternal(normalized);
|
|
805
805
|
}
|
|
806
|
-
|
|
807
|
-
clear() {
|
|
806
|
+
resetState(preserveHistory) {
|
|
808
807
|
this.cancelAutocomplete();
|
|
809
808
|
this.state = { lines: [""], cursorLine: 0, cursorCol: 0 };
|
|
810
809
|
this.pastes.clear();
|
|
811
810
|
this.pasteCounter = 0;
|
|
812
811
|
this.bracketedPaste.clear();
|
|
813
|
-
|
|
812
|
+
if (!preserveHistory)
|
|
813
|
+
this.history = [];
|
|
814
814
|
this.historyIndex = -1;
|
|
815
815
|
this.killRing = new KillRing();
|
|
816
816
|
this.undoStack.clear();
|
|
@@ -821,6 +821,10 @@ export class Editor {
|
|
|
821
821
|
this.scrollOffset = 0;
|
|
822
822
|
this.notifyChange();
|
|
823
823
|
}
|
|
824
|
+
/** Drop every live or historical reference retained by this editor instance. */
|
|
825
|
+
clear() {
|
|
826
|
+
this.resetState(false);
|
|
827
|
+
}
|
|
824
828
|
/**
|
|
825
829
|
* Insert text at the current cursor position.
|
|
826
830
|
* Used for programmatic insertion (e.g., clipboard image markers).
|
|
@@ -1030,7 +1034,7 @@ export class Editor {
|
|
|
1030
1034
|
this.cancelAutocomplete();
|
|
1031
1035
|
const expanded = this.expandPasteMarkers(this.state.lines.join("\n"));
|
|
1032
1036
|
const result = this.privateContent ? expanded : expanded.trim();
|
|
1033
|
-
this.
|
|
1037
|
+
this.resetState(true);
|
|
1034
1038
|
if (this.onSubmit)
|
|
1035
1039
|
this.onSubmit(result);
|
|
1036
1040
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"editor.js","sourceRoot":"","sources":["../../src/components/editor.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AutocompleteProvider, AutocompleteSuggestions } from \"../autocomplete.ts\";\nimport { BracketedPasteBuffer } from \"../bracketed-paste.ts\";\nimport {\n\tDELETE_CHARACTER_BACKWARD,\n\tDELETE_CHARACTER_FORWARD,\n\tDELETE_TO_LINE_END,\n\tDELETE_TO_LINE_START,\n\tDELETE_WORD_BACKWARD,\n\tDELETE_WORD_FORWARD,\n\tdispatchDeletionInput,\n} from \"../editing-actions.ts\";\nimport { type EditorChangeSummary, firstNonWhitespaceCharacter } from \"../editor-component.ts\";\nimport { getKeybindings } from \"../keybindings.ts\";\nimport { decodePrintableKey, matchesKey } from \"../keys.ts\";\nimport { KillRing } from \"../kill-ring.ts\";\nimport { type Component, CURSOR_MARKER, type Focusable, type TUI } from \"../tui.ts\";\nimport { UndoStack } from \"../undo-stack.ts\";\nimport { getGraphemeSegmenter, getWordSegmenter, isWhitespaceChar, sliceByColumn, visibleWidth } from \"../utils.ts\";\nimport { findWordBackward, findWordForward } from \"../word-navigation.ts\";\nimport { SelectList, type SelectListLayoutOptions, type SelectListTheme } from \"./select-list.ts\";\n\nconst graphemeSegmenter = getGraphemeSegmenter();\nconst wordSegmenter = getWordSegmenter();\n\n/** Regex matching paste markers like `[paste #1 +123 lines]` or `[paste #2 1234 chars]`. */\nconst PASTE_MARKER_REGEX = /\\[paste #(\\d+)( (\\+\\d+ lines|\\d+ chars))?\\]/g;\n\n/** Non-global version for single-segment testing. */\nconst PASTE_MARKER_SINGLE = /^\\[paste #(\\d+)( (\\+\\d+ lines|\\d+ chars))?\\]$/;\n\n/** Check if a segment is a paste marker (i.e. was merged by segmentWithMarkers). */\nfunction isPasteMarker(segment: string): boolean {\n\treturn segment.length >= 10 && PASTE_MARKER_SINGLE.test(segment);\n}\n\n/**\n * A segmenter that wraps Intl.Segmenter and merges graphemes that fall\n * within paste markers into single atomic segments. This makes cursor\n * movement, deletion, word-wrap, etc. treat paste markers as single units.\n *\n * Only markers whose numeric ID exists in `validIds` are merged.\n */\nfunction segmentWithMarkers(\n\ttext: string,\n\tbaseSegmenter: Intl.Segmenter,\n\tvalidIds: Set<number>,\n): Iterable<Intl.SegmentData> {\n\t// Fast path: no paste markers in the text or no valid IDs.\n\tif (validIds.size === 0 || !text.includes(\"[paste #\")) {\n\t\treturn baseSegmenter.segment(text);\n\t}\n\n\t// Find all marker spans with valid IDs.\n\tconst markers: Array<{ start: number; end: number }> = [];\n\tfor (const m of text.matchAll(PASTE_MARKER_REGEX)) {\n\t\tconst id = Number.parseInt(m[1]!, 10);\n\t\tif (!validIds.has(id)) continue;\n\t\tmarkers.push({ start: m.index, end: m.index + m[0].length });\n\t}\n\tif (markers.length === 0) {\n\t\treturn baseSegmenter.segment(text);\n\t}\n\n\t// Build merged segment list.\n\tconst baseSegments = baseSegmenter.segment(text);\n\tconst result: Intl.SegmentData[] = [];\n\tlet markerIdx = 0;\n\n\tfor (const seg of baseSegments) {\n\t\t// Skip past markers that are entirely before this segment.\n\t\twhile (markerIdx < markers.length && markers[markerIdx]!.end <= seg.index) {\n\t\t\tmarkerIdx++;\n\t\t}\n\n\t\tconst marker = markerIdx < markers.length ? markers[markerIdx]! : null;\n\n\t\tif (marker && seg.index >= marker.start && seg.index < marker.end) {\n\t\t\t// This segment falls inside a marker.\n\t\t\t// If this is the first segment of the marker, emit a merged segment.\n\t\t\tif (seg.index === marker.start) {\n\t\t\t\tconst markerText = text.slice(marker.start, marker.end);\n\t\t\t\tresult.push({\n\t\t\t\t\tsegment: markerText,\n\t\t\t\t\tindex: marker.start,\n\t\t\t\t\tinput: text,\n\t\t\t\t});\n\t\t\t}\n\t\t\t// Otherwise skip (already merged into the first segment).\n\t\t} else {\n\t\t\tresult.push(seg);\n\t\t}\n\t}\n\n\treturn result;\n}\n\n/**\n * Represents a chunk of text for word-wrap layout.\n * Tracks both the text content and its position in the original line.\n */\nexport interface TextChunk {\n\ttext: string;\n\tstartIndex: number;\n\tendIndex: number;\n}\n\n/**\n * Split a line into word-wrapped chunks.\n * Wraps at word boundaries when possible, falling back to character-level\n * wrapping for words longer than the available width.\n *\n * @param line - The text line to wrap\n * @param maxWidth - Maximum visible width per chunk\n * @param preSegmented - Optional pre-segmented graphemes (e.g. with paste-marker awareness).\n * When omitted the default Intl.Segmenter is used.\n * @returns Array of chunks with text and position information\n */\nexport function wordWrapLine(line: string, maxWidth: number, preSegmented?: Intl.SegmentData[]): TextChunk[] {\n\tif (!line || maxWidth <= 0) {\n\t\treturn [{ text: \"\", startIndex: 0, endIndex: 0 }];\n\t}\n\n\tconst lineWidth = visibleWidth(line);\n\tif (lineWidth <= maxWidth) {\n\t\treturn [{ text: line, startIndex: 0, endIndex: line.length }];\n\t}\n\n\tconst chunks: TextChunk[] = [];\n\tconst segments = preSegmented ?? [...graphemeSegmenter.segment(line)];\n\n\tlet currentWidth = 0;\n\tlet chunkStart = 0;\n\n\t// Wrap opportunity: the position after the last whitespace before a non-whitespace\n\t// grapheme, i.e. where a line break is allowed.\n\tlet wrapOppIndex = -1;\n\tlet wrapOppWidth = 0;\n\n\tfor (let i = 0; i < segments.length; i++) {\n\t\tconst seg = segments[i]!;\n\t\tconst grapheme = seg.segment;\n\t\tconst gWidth = visibleWidth(grapheme);\n\t\tconst charIndex = seg.index;\n\t\tconst isWs = !isPasteMarker(grapheme) && isWhitespaceChar(grapheme);\n\n\t\t// Overflow check before advancing.\n\t\tif (currentWidth + gWidth > maxWidth) {\n\t\t\tif (wrapOppIndex >= 0 && currentWidth - wrapOppWidth + gWidth <= maxWidth) {\n\t\t\t\t// Backtrack to last wrap opportunity (the remaining content\n\t\t\t\t// plus the current grapheme still fits within maxWidth).\n\t\t\t\tchunks.push({ text: line.slice(chunkStart, wrapOppIndex), startIndex: chunkStart, endIndex: wrapOppIndex });\n\t\t\t\tchunkStart = wrapOppIndex;\n\t\t\t\tcurrentWidth -= wrapOppWidth;\n\t\t\t} else if (chunkStart < charIndex) {\n\t\t\t\t// No viable wrap opportunity: force-break at current position.\n\t\t\t\t// This also handles the case where backtracking to a word\n\t\t\t\t// boundary wouldn't help because the remaining content plus\n\t\t\t\t// the current grapheme (e.g. a wide character) still exceeds\n\t\t\t\t// maxWidth.\n\t\t\t\tchunks.push({ text: line.slice(chunkStart, charIndex), startIndex: chunkStart, endIndex: charIndex });\n\t\t\t\tchunkStart = charIndex;\n\t\t\t\tcurrentWidth = 0;\n\t\t\t}\n\t\t\twrapOppIndex = -1;\n\t\t}\n\n\t\tif (gWidth > maxWidth) {\n\t\t\tconst subGraphemes = [...graphemeSegmenter.segment(grapheme)];\n\t\t\tif (subGraphemes.length <= 1) {\n\t\t\t\t// A grapheme is atomic. If it is wider than the layout width,\n\t\t\t\t// render it as an overflowing visual chunk instead of recursing\n\t\t\t\t// with identical arguments.\n\t\t\t\tconst endIndex = charIndex + grapheme.length;\n\t\t\t\tchunks.push({ text: grapheme, startIndex: charIndex, endIndex });\n\t\t\t\tchunkStart = endIndex;\n\t\t\t\tcurrentWidth = 0;\n\t\t\t\twrapOppIndex = -1;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Multi-grapheme atomic segments wider than maxWidth (e.g. paste\n\t\t\t// markers in a narrow terminal) can still be visually split at\n\t\t\t// grapheme granularity. The segment remains logically atomic for\n\t\t\t// cursor movement / editing.\n\t\t\tconst subChunks = wordWrapLine(grapheme, maxWidth);\n\t\t\tfor (let j = 0; j < subChunks.length - 1; j++) {\n\t\t\t\tconst sc = subChunks[j]!;\n\t\t\t\tchunks.push({ text: sc.text, startIndex: charIndex + sc.startIndex, endIndex: charIndex + sc.endIndex });\n\t\t\t}\n\t\t\tconst last = subChunks[subChunks.length - 1]!;\n\t\t\tchunkStart = charIndex + last.startIndex;\n\t\t\tcurrentWidth = visibleWidth(last.text);\n\t\t\twrapOppIndex = -1;\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Advance.\n\t\tcurrentWidth += gWidth;\n\n\t\t// Record wrap opportunity: whitespace followed by non-whitespace.\n\t\t// Multiple spaces join (no break between them); the break point is\n\t\t// after the last space before the next word.\n\t\tconst next = segments[i + 1];\n\t\tif (isWs && next && (isPasteMarker(next.segment) || !isWhitespaceChar(next.segment))) {\n\t\t\twrapOppIndex = next.index;\n\t\t\twrapOppWidth = currentWidth;\n\t\t}\n\t}\n\n\t// Push final chunk.\n\tif (chunkStart < line.length || chunks.length === 0) {\n\t\tchunks.push({ text: line.slice(chunkStart), startIndex: chunkStart, endIndex: line.length });\n\t}\n\n\treturn chunks;\n}\n\n// Kitty CSI-u sequences for printable keys, including optional shifted/base codepoints.\ninterface EditorState {\n\tlines: string[];\n\tcursorLine: number;\n\tcursorCol: number;\n}\n\ninterface EditorSnapshot {\n\tstate: EditorState;\n\tpastes: Map<number, string>;\n\tpasteCounter: number;\n}\n\ninterface LayoutLine {\n\ttext: string;\n\thasCursor: boolean;\n\tcursorPos?: number;\n}\n\nexport interface EditorTheme {\n\tborderColor: (str: string) => string;\n\tselectList: SelectListTheme;\n}\n\nexport interface EditorOptions {\n\tpaddingX?: number;\n\tautocompleteMaxVisible?: number;\n\t/**\n\t * Keep visible owner-entered content out of autocomplete, prompt history, undo snapshots, and\n\t * the kill ring. Large pastes stay expanded and submit preserves surrounding whitespace.\n\t */\n\tprivateContent?: boolean;\n}\n\nconst SLASH_COMMAND_SELECT_LIST_LAYOUT: SelectListLayoutOptions = {\n\tminPrimaryColumnWidth: 12,\n\tmaxPrimaryColumnWidth: 32,\n};\n\nconst ATTACHMENT_AUTOCOMPLETE_DEBOUNCE_MS = 20;\n\nfunction createScrollBorder(direction: \"↑\" | \"↓\", hiddenLineCount: number, width: number): string {\n\tconst availableWidth = Math.max(0, width);\n\tconst indicator = `─── ${direction} ${hiddenLineCount} more `;\n\tconst remaining = availableWidth - visibleWidth(indicator);\n\tif (remaining >= 0) return indicator + \"─\".repeat(remaining);\n\n\tconst ellipsis = \"...\".slice(0, availableWidth);\n\tconst indicatorWidth = availableWidth - visibleWidth(ellipsis);\n\treturn sliceByColumn(indicator, 0, indicatorWidth, true) + ellipsis;\n}\n\nexport class Editor implements Component, Focusable {\n\tprivate state: EditorState = {\n\t\tlines: [\"\"],\n\t\tcursorLine: 0,\n\t\tcursorCol: 0,\n\t};\n\n\t/** Focusable interface - set by TUI when focus changes */\n\tfocused: boolean = false;\n\n\tprotected tui: TUI;\n\tprivate theme: EditorTheme;\n\tprivate paddingX: number = 0;\n\n\t// Store last render width for cursor navigation\n\tprivate lastWidth: number = 80;\n\n\t// Vertical scrolling support\n\tprivate scrollOffset: number = 0;\n\n\t// Border color (can be changed dynamically)\n\tpublic borderColor: (str: string) => string;\n\n\t// Autocomplete support\n\tprivate autocompleteProvider?: AutocompleteProvider;\n\tprivate autocompleteList?: SelectList;\n\tprivate autocompleteState: \"regular\" | \"force\" | null = null;\n\tprivate autocompletePrefix: string = \"\";\n\tprivate autocompleteMaxVisible: number = 5;\n\tprivate autocompleteAbort?: AbortController;\n\tprivate autocompleteDebounceTimer?: ReturnType<typeof setTimeout>;\n\tprivate autocompleteRequestTask: Promise<void> = Promise.resolve();\n\tprivate autocompleteStartToken: number = 0;\n\tprivate autocompleteRequestId: number = 0;\n\n\t// Paste tracking for large pastes\n\tprivate pastes: Map<number, string> = new Map();\n\tprivate pasteCounter: number = 0;\n\n\t// Bracketed paste mode buffering\n\tprivate bracketedPaste = new BracketedPasteBuffer();\n\n\t// Prompt history for up/down navigation\n\tprivate history: string[] = [];\n\tprivate historyIndex: number = -1; // -1 = not browsing, 0 = most recent, 1 = older, etc.\n\n\t/**\n\t * Consulted on Up arrow in an empty editor, before history navigation.\n\t * Return true after restoring queued message(s) into the editor to consume\n\t * the key; return false to fall through to history.\n\t */\n\tonRecallQueued?: () => boolean;\n\n\t// Kill ring for Emacs-style kill/yank operations\n\tprivate killRing = new KillRing();\n\tprivate lastAction: \"kill\" | \"yank\" | \"type-word\" | null = null;\n\n\t// Character jump mode\n\tprivate jumpMode: \"forward\" | \"backward\" | null = null;\n\n\t// Preferred visual column for vertical cursor movement (sticky column)\n\tprivate preferredVisualCol: number | null = null;\n\n\t// When the cursor is snapped to the start of an atomic segment, e.g. a\n\t// paste marker, cursorCol no longer reflects where the cursor would have\n\t// landed. This field stores the pre-snap cursorCol so that the next\n\t// vertical move can resolve it to a visual column on whatever VL it belongs\n\t// to.\n\tprivate snappedFromCursorCol: number | null = null;\n\n\t// Undo support\n\tprivate undoStack = new UndoStack<EditorSnapshot>();\n\tprivate readonly privateContent: boolean;\n\n\tpublic onSubmit?: (text: string) => void;\n\tpublic onChange?: (text: string) => void;\n\tpublic readonly supportsChangeSummary = true as const;\n\tpublic onChangeSummary?: (summary: EditorChangeSummary) => void;\n\tpublic disableSubmit: boolean = false;\n\n\tconstructor(tui: TUI, theme: EditorTheme, options: EditorOptions = {}) {\n\t\tthis.tui = tui;\n\t\tthis.theme = theme;\n\t\tthis.borderColor = theme.borderColor;\n\t\tthis.privateContent = options.privateContent ?? false;\n\t\tconst paddingX = options.paddingX ?? 0;\n\t\tthis.paddingX = Number.isFinite(paddingX) ? Math.max(0, Math.floor(paddingX)) : 0;\n\t\tconst maxVisible = options.autocompleteMaxVisible ?? 5;\n\t\tthis.autocompleteMaxVisible = Number.isFinite(maxVisible) ? Math.max(3, Math.min(20, Math.floor(maxVisible))) : 5;\n\t}\n\n\tprivate notifyChange(): void {\n\t\tif (this.onChangeSummary) {\n\t\t\tlet firstNonWhitespace: string | undefined;\n\t\t\tfor (const line of this.state.lines) {\n\t\t\t\tfirstNonWhitespace = firstNonWhitespaceCharacter(line);\n\t\t\t\tif (firstNonWhitespace !== undefined) break;\n\t\t\t}\n\t\t\tthis.onChangeSummary({ firstNonWhitespace });\n\t\t}\n\t\tif (this.onChange) this.onChange(this.getText());\n\t}\n\n\t/** Set of currently valid paste IDs, for marker-aware segmentation. */\n\tprivate validPasteIds(): Set<number> {\n\t\treturn new Set(this.pastes.keys());\n\t}\n\n\t/** Segment text with paste-marker awareness, only merging markers with valid IDs. */\n\tprivate segment(text: string, mode: \"word\" | \"grapheme\"): Iterable<Intl.SegmentData> {\n\t\treturn segmentWithMarkers(text, mode === \"word\" ? wordSegmenter : graphemeSegmenter, this.validPasteIds());\n\t}\n\n\tgetPaddingX(): number {\n\t\treturn this.paddingX;\n\t}\n\n\tsetPaddingX(padding: number): void {\n\t\tconst newPadding = Number.isFinite(padding) ? Math.max(0, Math.floor(padding)) : 0;\n\t\tif (this.paddingX !== newPadding) {\n\t\t\tthis.paddingX = newPadding;\n\t\t\tthis.tui.requestRender();\n\t\t}\n\t}\n\n\tgetAutocompleteMaxVisible(): number {\n\t\treturn this.autocompleteMaxVisible;\n\t}\n\n\tsetAutocompleteMaxVisible(maxVisible: number): void {\n\t\tconst newMaxVisible = Number.isFinite(maxVisible) ? Math.max(3, Math.min(20, Math.floor(maxVisible))) : 5;\n\t\tif (this.autocompleteMaxVisible !== newMaxVisible) {\n\t\t\tthis.autocompleteMaxVisible = newMaxVisible;\n\t\t\tthis.tui.requestRender();\n\t\t}\n\t}\n\n\tsetAutocompleteProvider(provider: AutocompleteProvider): void {\n\t\tthis.cancelAutocomplete();\n\t\tif (this.privateContent) return;\n\t\tthis.autocompleteProvider = provider;\n\t}\n\n\t/**\n\t * Add a prompt to history for up/down arrow navigation.\n\t * Called after successful submission.\n\t */\n\taddToHistory(text: string): void {\n\t\tif (this.privateContent) return;\n\t\tconst trimmed = text.trim();\n\t\tif (!trimmed) return;\n\t\t// Don't add consecutive duplicates\n\t\tif (this.history.length > 0 && this.history[0] === trimmed) return;\n\t\tthis.history.unshift(trimmed);\n\t\t// Limit history size\n\t\tif (this.history.length > 100) {\n\t\t\tthis.history.pop();\n\t\t}\n\t}\n\n\t/** Replace the prompt history buffer. Input is oldest entry first. */\n\tsetHistory(texts: readonly string[]): void {\n\t\tthis.history = [];\n\t\tthis.historyIndex = -1;\n\t\tif (this.privateContent) return;\n\t\tfor (const text of texts) {\n\t\t\tthis.addToHistory(text);\n\t\t}\n\t}\n\n\tprivate isEditorEmpty(): boolean {\n\t\treturn this.state.lines.length === 1 && this.state.lines[0] === \"\";\n\t}\n\n\tprivate isOnFirstVisualLine(): boolean {\n\t\tconst visualLines = this.buildVisualLineMap(this.lastWidth);\n\t\tconst currentVisualLine = this.findCurrentVisualLine(visualLines);\n\t\treturn currentVisualLine === 0;\n\t}\n\n\tprivate isOnLastVisualLine(): boolean {\n\t\tconst visualLines = this.buildVisualLineMap(this.lastWidth);\n\t\tconst currentVisualLine = this.findCurrentVisualLine(visualLines);\n\t\treturn currentVisualLine === visualLines.length - 1;\n\t}\n\n\tprivate navigateHistory(direction: 1 | -1): void {\n\t\tif (this.privateContent) return;\n\t\tthis.lastAction = null;\n\t\tif (this.history.length === 0) return;\n\n\t\tconst newIndex = this.historyIndex - direction; // Up(-1) increases index, Down(1) decreases\n\t\tif (newIndex < -1 || newIndex >= this.history.length) return;\n\n\t\t// Capture state when first entering history browsing mode\n\t\tif (this.historyIndex === -1 && newIndex >= 0) {\n\t\t\tthis.pushUndoSnapshot();\n\t\t}\n\n\t\tthis.historyIndex = newIndex;\n\n\t\tif (this.historyIndex === -1) {\n\t\t\t// Returned to \"current\" state - clear editor\n\t\t\tthis.setTextInternal(\"\");\n\t\t} else {\n\t\t\tthis.setTextInternal(this.history[this.historyIndex] || \"\");\n\t\t}\n\t}\n\n\t/** Internal setText that doesn't reset history state - used by navigateHistory */\n\tprivate setTextInternal(text: string): void {\n\t\tconst lines = text.split(\"\\n\");\n\t\tthis.state.lines = lines.length === 0 ? [\"\"] : lines;\n\t\tthis.state.cursorLine = this.state.lines.length - 1;\n\t\tthis.setCursorCol(this.state.lines[this.state.cursorLine]?.length || 0);\n\t\t// Reset scroll - render() will adjust to show cursor\n\t\tthis.scrollOffset = 0;\n\n\t\tthis.notifyChange();\n\t}\n\n\tinvalidate(): void {\n\t\t// No cached state to invalidate currently\n\t}\n\n\trender(width: number): string[] {\n\t\tconst maxPadding = Math.max(0, Math.floor((width - 1) / 2));\n\t\tconst paddingX = Math.min(this.paddingX, maxPadding);\n\t\tconst contentWidth = Math.max(1, width - paddingX * 2);\n\n\t\t// Layout width: with padding the cursor can overflow into it,\n\t\t// without padding we reserve 1 column for the cursor.\n\t\tconst layoutWidth = Math.max(1, contentWidth - (paddingX ? 0 : 1));\n\n\t\t// Store for cursor navigation (must match wrapping width)\n\t\tthis.lastWidth = layoutWidth;\n\n\t\tconst horizontal = this.borderColor(\"─\");\n\n\t\t// Layout the text\n\t\tconst layoutLines = this.layoutText(layoutWidth);\n\n\t\t// Calculate max visible lines: 30% of terminal height, minimum 5 lines\n\t\tconst terminalRows = this.tui.terminal.rows;\n\t\tconst maxVisibleLines = Math.max(5, Math.floor(terminalRows * 0.3));\n\n\t\t// Find the cursor line index in layoutLines\n\t\tlet cursorLineIndex = layoutLines.findIndex((line) => line.hasCursor);\n\t\tif (cursorLineIndex === -1) cursorLineIndex = 0;\n\n\t\t// Adjust scroll offset to keep cursor visible\n\t\tif (cursorLineIndex < this.scrollOffset) {\n\t\t\tthis.scrollOffset = cursorLineIndex;\n\t\t} else if (cursorLineIndex >= this.scrollOffset + maxVisibleLines) {\n\t\t\tthis.scrollOffset = cursorLineIndex - maxVisibleLines + 1;\n\t\t}\n\n\t\t// Clamp scroll offset to valid range\n\t\tconst maxScrollOffset = Math.max(0, layoutLines.length - maxVisibleLines);\n\t\tthis.scrollOffset = Math.max(0, Math.min(this.scrollOffset, maxScrollOffset));\n\n\t\t// Get visible lines slice\n\t\tconst visibleLines = layoutLines.slice(this.scrollOffset, this.scrollOffset + maxVisibleLines);\n\n\t\tconst result: string[] = [];\n\t\tconst leftPadding = \" \".repeat(paddingX);\n\t\tconst rightPadding = leftPadding;\n\n\t\t// Render top border (with scroll indicator if scrolled down)\n\t\tif (this.scrollOffset > 0) {\n\t\t\tresult.push(this.borderColor(createScrollBorder(\"↑\", this.scrollOffset, width)));\n\t\t} else {\n\t\t\tresult.push(horizontal.repeat(width));\n\t\t}\n\n\t\t// Render each visible layout line\n\t\t// Emit hardware cursor marker only when focused and not showing autocomplete\n\t\tconst emitCursorMarker = this.focused && !this.autocompleteState;\n\n\t\tfor (const layoutLine of visibleLines) {\n\t\t\tlet displayText = layoutLine.text;\n\t\t\tlet lineVisibleWidth = visibleWidth(layoutLine.text);\n\t\t\tlet cursorInPadding = false;\n\n\t\t\t// Add cursor if this line has it\n\t\t\tif (layoutLine.hasCursor && layoutLine.cursorPos !== undefined) {\n\t\t\t\tconst before = displayText.slice(0, layoutLine.cursorPos);\n\t\t\t\tconst after = displayText.slice(layoutLine.cursorPos);\n\n\t\t\t\t// Hardware cursor marker (zero-width, emitted before fake cursor for IME positioning)\n\t\t\t\tconst marker = emitCursorMarker ? CURSOR_MARKER : \"\";\n\n\t\t\t\tif (after.length > 0) {\n\t\t\t\t\t// Cursor is on a character (grapheme) - replace it with highlighted version\n\t\t\t\t\t// Get the first grapheme from 'after'\n\t\t\t\t\tconst afterGraphemes = [...this.segment(after, \"grapheme\")];\n\t\t\t\t\tconst firstGrapheme = afterGraphemes[0]?.segment || \"\";\n\t\t\t\t\tconst restAfter = after.slice(firstGrapheme.length);\n\t\t\t\t\tconst cursor = `\\x1b[7m${firstGrapheme}\\x1b[0m`;\n\t\t\t\t\tdisplayText = before + marker + cursor + restAfter;\n\t\t\t\t\t// lineVisibleWidth stays the same - we're replacing, not adding\n\t\t\t\t} else {\n\t\t\t\t\t// Cursor is at the end - add highlighted space\n\t\t\t\t\tconst cursor = \"\\x1b[7m \\x1b[0m\";\n\t\t\t\t\tdisplayText = before + marker + cursor;\n\t\t\t\t\tlineVisibleWidth = lineVisibleWidth + 1;\n\t\t\t\t\t// If cursor overflows content width into the padding, flag it\n\t\t\t\t\tif (lineVisibleWidth > contentWidth && paddingX > 0) {\n\t\t\t\t\t\tcursorInPadding = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Calculate padding based on actual visible width\n\t\t\tconst padding = \" \".repeat(Math.max(0, contentWidth - lineVisibleWidth));\n\t\t\tconst lineRightPadding = cursorInPadding ? rightPadding.slice(1) : rightPadding;\n\n\t\t\t// Render the line (no side borders, just horizontal lines above and below)\n\t\t\tresult.push(`${leftPadding}${displayText}${padding}${lineRightPadding}`);\n\t\t}\n\n\t\t// Render bottom border (with scroll indicator if more content below)\n\t\tconst linesBelow = layoutLines.length - (this.scrollOffset + visibleLines.length);\n\t\tif (linesBelow > 0) {\n\t\t\tresult.push(this.borderColor(createScrollBorder(\"↓\", linesBelow, width)));\n\t\t} else {\n\t\t\tresult.push(horizontal.repeat(width));\n\t\t}\n\n\t\t// Add autocomplete list if active\n\t\tif (this.autocompleteState && this.autocompleteList) {\n\t\t\tconst autocompleteResult = this.autocompleteList.render(contentWidth);\n\t\t\tfor (const line of autocompleteResult) {\n\t\t\t\tconst lineWidth = visibleWidth(line);\n\t\t\t\tconst linePadding = \" \".repeat(Math.max(0, contentWidth - lineWidth));\n\t\t\t\tresult.push(`${leftPadding}${line}${linePadding}${rightPadding}`);\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t}\n\n\thandleInput(data: string): void {\n\t\tconst kb = getKeybindings();\n\n\t\t// Handle character jump mode (awaiting next character to jump to)\n\t\tif (this.jumpMode !== null) {\n\t\t\t// Cancel if the hotkey is pressed again\n\t\t\tif (kb.matches(data, \"tui.editor.jumpForward\") || kb.matches(data, \"tui.editor.jumpBackward\")) {\n\t\t\t\tthis.jumpMode = null;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst printable = decodePrintableKey(data) ?? (data.charCodeAt(0) >= 32 ? data : undefined);\n\t\t\tif (printable !== undefined) {\n\t\t\t\t// Printable character - perform the jump\n\t\t\t\tconst direction = this.jumpMode;\n\t\t\t\tthis.jumpMode = null;\n\t\t\t\tthis.jumpToChar(printable, direction);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Control character - cancel and fall through to normal handling\n\t\t\tthis.jumpMode = null;\n\t\t}\n\n\t\tconst pasteResult = this.bracketedPaste.consume(data);\n\t\tif (pasteResult.kind === \"pending\") return;\n\t\tif (pasteResult.kind === \"complete\") {\n\t\t\tif (pasteResult.content.length > 0) {\n\t\t\t\tthis.handlePaste(pasteResult.content);\n\t\t\t}\n\t\t\tif (pasteResult.remainder.length > 0) {\n\t\t\t\tthis.handleInput(pasteResult.remainder);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tdata = pasteResult.data;\n\n\t\t// Ctrl+C - let parent handle (exit/clear)\n\t\tif (kb.matches(data, \"tui.input.copy\")) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Undo\n\t\tif (kb.matches(data, \"tui.editor.undo\")) {\n\t\t\tif (!this.privateContent) this.undo();\n\t\t\treturn;\n\t\t}\n\n\t\t// Handle autocomplete mode\n\t\tif (this.autocompleteState && this.autocompleteList) {\n\t\t\tif (kb.matches(data, \"tui.select.cancel\")) {\n\t\t\t\tthis.cancelAutocomplete();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (kb.matches(data, \"tui.select.up\") || kb.matches(data, \"tui.select.down\")) {\n\t\t\t\tthis.autocompleteList.handleInput(data);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (kb.matches(data, \"tui.input.tab\")) {\n\t\t\t\tif (this.applySelectedAutocomplete()) {\n\t\t\t\t\tthis.cancelAutocomplete();\n\t\t\t\t\tthis.notifyChange();\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (kb.matches(data, \"tui.select.confirm\")) {\n\t\t\t\tif (this.applySelectedAutocomplete()) {\n\t\t\t\t\tif (this.autocompletePrefix.startsWith(\"/\")) {\n\t\t\t\t\t\tthis.cancelAutocomplete();\n\t\t\t\t\t\t// Fall through to submit\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.cancelAutocomplete();\n\t\t\t\t\t\tthis.notifyChange();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Tab - trigger completion\n\t\tif (kb.matches(data, \"tui.input.tab\") && !this.autocompleteState) {\n\t\t\tthis.handleTabCompletion();\n\t\t\treturn;\n\t\t}\n\n\t\tif (dispatchDeletionInput(data, this)) return;\n\n\t\t// Kill ring actions\n\t\tif (kb.matches(data, \"tui.editor.yank\")) {\n\t\t\tif (!this.privateContent) this.yank();\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.editor.yankPop\")) {\n\t\t\tif (!this.privateContent) this.yankPop();\n\t\t\treturn;\n\t\t}\n\n\t\t// Cursor movement actions\n\t\tif (kb.matches(data, \"tui.editor.cursorLineStart\")) {\n\t\t\tthis.moveToLineStart();\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.editor.cursorLineEnd\")) {\n\t\t\tthis.moveToLineEnd();\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.editor.cursorWordLeft\")) {\n\t\t\tthis.moveWordBackwards();\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.editor.cursorWordRight\")) {\n\t\t\tthis.moveWordForwards();\n\t\t\treturn;\n\t\t}\n\n\t\t// New line\n\t\tif (\n\t\t\tkb.matches(data, \"tui.input.newLine\") ||\n\t\t\t(data.charCodeAt(0) === 10 && data.length > 1) ||\n\t\t\tdata === \"\\x1b\\r\" ||\n\t\t\tdata === \"\\x1b[13;2~\" ||\n\t\t\t(data.length > 1 && data.includes(\"\\x1b\") && data.includes(\"\\r\")) ||\n\t\t\t(data === \"\\n\" && data.length === 1)\n\t\t) {\n\t\t\tif (this.shouldSubmitOnBackslashEnter(data, kb)) {\n\t\t\t\tthis[DELETE_CHARACTER_BACKWARD]();\n\t\t\t\tthis.submitValue();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.addNewLine();\n\t\t\treturn;\n\t\t}\n\n\t\t// Submit (Enter)\n\t\tif (kb.matches(data, \"tui.input.submit\")) {\n\t\t\tif (this.disableSubmit) return;\n\n\t\t\t// Workaround for terminals without Shift+Enter support:\n\t\t\t// If char before cursor is \\, delete it and insert newline instead of submitting.\n\t\t\tconst currentLine = this.state.lines[this.state.cursorLine] || \"\";\n\t\t\tif (this.state.cursorCol > 0 && currentLine[this.state.cursorCol - 1] === \"\\\\\") {\n\t\t\t\tthis[DELETE_CHARACTER_BACKWARD]();\n\t\t\t\tthis.addNewLine();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.submitValue();\n\t\t\treturn;\n\t\t}\n\n\t\t// Arrow key navigation (with history support)\n\t\tif (kb.matches(data, \"tui.editor.cursorUp\")) {\n\t\t\tif (this.isEditorEmpty()) {\n\t\t\t\tif (this.onRecallQueued?.()) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tthis.navigateHistory(-1);\n\t\t\t} else if (this.historyIndex > -1 && this.isOnFirstVisualLine()) {\n\t\t\t\tthis.navigateHistory(-1);\n\t\t\t} else if (this.isOnFirstVisualLine()) {\n\t\t\t\t// Already at top - jump to start of line\n\t\t\t\tthis.moveToLineStart();\n\t\t\t} else {\n\t\t\t\tthis.moveCursor(-1, 0);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.editor.cursorDown\")) {\n\t\t\tif (this.historyIndex > -1 && this.isOnLastVisualLine()) {\n\t\t\t\tthis.navigateHistory(1);\n\t\t\t} else if (this.isOnLastVisualLine()) {\n\t\t\t\t// Already at bottom - jump to end of line\n\t\t\t\tthis.moveToLineEnd();\n\t\t\t} else {\n\t\t\t\tthis.moveCursor(1, 0);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.editor.cursorRight\")) {\n\t\t\tthis.moveCursor(0, 1);\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.editor.cursorLeft\")) {\n\t\t\tthis.moveCursor(0, -1);\n\t\t\treturn;\n\t\t}\n\n\t\t// Page up/down - scroll by page and move cursor\n\t\tif (kb.matches(data, \"tui.editor.pageUp\")) {\n\t\t\tthis.pageScroll(-1);\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.editor.pageDown\")) {\n\t\t\tthis.pageScroll(1);\n\t\t\treturn;\n\t\t}\n\n\t\t// Character jump mode triggers\n\t\tif (kb.matches(data, \"tui.editor.jumpForward\")) {\n\t\t\tthis.jumpMode = \"forward\";\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.editor.jumpBackward\")) {\n\t\t\tthis.jumpMode = \"backward\";\n\t\t\treturn;\n\t\t}\n\n\t\t// Shift+Space - insert regular space\n\t\tif (matchesKey(data, \"shift+space\")) {\n\t\t\tthis.insertCharacter(\" \");\n\t\t\treturn;\n\t\t}\n\n\t\tconst printable = decodePrintableKey(data);\n\t\tif (printable !== undefined) {\n\t\t\tthis.insertCharacter(printable);\n\t\t\treturn;\n\t\t}\n\n\t\t// Regular characters\n\t\tif (data.charCodeAt(0) >= 32) {\n\t\t\tthis.insertCharacter(data);\n\t\t}\n\t}\n\n\tprivate applySelectedAutocomplete(): boolean {\n\t\tconst selected = this.autocompleteList?.getSelectedItem();\n\t\tif (!selected || !this.autocompleteProvider) return false;\n\n\t\tthis.pushUndoSnapshot();\n\t\tthis.lastAction = null;\n\t\tconst result = this.autocompleteProvider.applyCompletion(\n\t\t\tthis.state.lines,\n\t\t\tthis.state.cursorLine,\n\t\t\tthis.state.cursorCol,\n\t\t\tselected,\n\t\t\tthis.autocompletePrefix,\n\t\t);\n\t\tthis.state.lines = result.lines;\n\t\tthis.state.cursorLine = result.cursorLine;\n\t\tthis.setCursorCol(result.cursorCol);\n\t\treturn true;\n\t}\n\n\tprivate layoutText(contentWidth: number): LayoutLine[] {\n\t\tconst layoutLines: LayoutLine[] = [];\n\n\t\tif (this.state.lines.length === 0 || (this.state.lines.length === 1 && this.state.lines[0] === \"\")) {\n\t\t\t// Empty editor\n\t\t\tlayoutLines.push({\n\t\t\t\ttext: \"\",\n\t\t\t\thasCursor: true,\n\t\t\t\tcursorPos: 0,\n\t\t\t});\n\t\t\treturn layoutLines;\n\t\t}\n\n\t\t// Process each logical line\n\t\tfor (let i = 0; i < this.state.lines.length; i++) {\n\t\t\tconst line = this.state.lines[i] || \"\";\n\t\t\tconst isCurrentLine = i === this.state.cursorLine;\n\t\t\tconst lineVisibleWidth = visibleWidth(line);\n\n\t\t\tif (lineVisibleWidth <= contentWidth) {\n\t\t\t\t// Line fits in one layout line\n\t\t\t\tif (isCurrentLine) {\n\t\t\t\t\tlayoutLines.push({\n\t\t\t\t\t\ttext: line,\n\t\t\t\t\t\thasCursor: true,\n\t\t\t\t\t\tcursorPos: this.state.cursorCol,\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tlayoutLines.push({\n\t\t\t\t\t\ttext: line,\n\t\t\t\t\t\thasCursor: false,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Line needs wrapping - use word-aware wrapping\n\t\t\t\tconst chunks = wordWrapLine(line, contentWidth, [...this.segment(line, \"grapheme\")]);\n\n\t\t\t\tfor (let chunkIndex = 0; chunkIndex < chunks.length; chunkIndex++) {\n\t\t\t\t\tconst chunk = chunks[chunkIndex];\n\t\t\t\t\tif (!chunk) continue;\n\n\t\t\t\t\tconst cursorPos = this.state.cursorCol;\n\t\t\t\t\tconst isLastChunk = chunkIndex === chunks.length - 1;\n\n\t\t\t\t\t// Determine if cursor is in this chunk\n\t\t\t\t\t// For word-wrapped chunks, we need to handle the case where\n\t\t\t\t\t// cursor might be in trimmed whitespace at end of chunk\n\t\t\t\t\tlet hasCursorInChunk = false;\n\t\t\t\t\tlet adjustedCursorPos = 0;\n\n\t\t\t\t\tif (isCurrentLine) {\n\t\t\t\t\t\tif (isLastChunk) {\n\t\t\t\t\t\t\t// Last chunk: cursor belongs here if >= startIndex\n\t\t\t\t\t\t\thasCursorInChunk = cursorPos >= chunk.startIndex;\n\t\t\t\t\t\t\tadjustedCursorPos = cursorPos - chunk.startIndex;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Non-last chunk: cursor belongs here if in range [startIndex, endIndex)\n\t\t\t\t\t\t\t// But we need to handle the visual position in the trimmed text\n\t\t\t\t\t\t\thasCursorInChunk = cursorPos >= chunk.startIndex && cursorPos < chunk.endIndex;\n\t\t\t\t\t\t\tif (hasCursorInChunk) {\n\t\t\t\t\t\t\t\tadjustedCursorPos = cursorPos - chunk.startIndex;\n\t\t\t\t\t\t\t\t// Clamp to text length (in case cursor was in trimmed whitespace)\n\t\t\t\t\t\t\t\tif (adjustedCursorPos > chunk.text.length) {\n\t\t\t\t\t\t\t\t\tadjustedCursorPos = chunk.text.length;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (hasCursorInChunk) {\n\t\t\t\t\t\tlayoutLines.push({\n\t\t\t\t\t\t\ttext: chunk.text,\n\t\t\t\t\t\t\thasCursor: true,\n\t\t\t\t\t\t\tcursorPos: adjustedCursorPos,\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlayoutLines.push({\n\t\t\t\t\t\t\ttext: chunk.text,\n\t\t\t\t\t\t\thasCursor: false,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn layoutLines;\n\t}\n\n\tgetText(): string {\n\t\treturn this.state.lines.join(\"\\n\");\n\t}\n\n\tprivate expandPasteMarkers(text: string): string {\n\t\treturn text.replace(PASTE_MARKER_REGEX, (marker, idGroup) => this.pastes.get(Number(idGroup)) ?? marker);\n\t}\n\n\t/**\n\t * Get text with paste markers expanded to their actual content.\n\t * Use this when you need the full content (e.g., for external editor).\n\t */\n\tgetExpandedText(): string {\n\t\treturn this.expandPasteMarkers(this.state.lines.join(\"\\n\"));\n\t}\n\n\tgetLines(): string[] {\n\t\treturn [...this.state.lines];\n\t}\n\n\tgetCursor(): { line: number; col: number } {\n\t\treturn { line: this.state.cursorLine, col: this.state.cursorCol };\n\t}\n\n\tsetText(text: string): void {\n\t\tthis.cancelAutocomplete();\n\t\tthis.lastAction = null;\n\t\tthis.historyIndex = -1; // Exit history browsing mode\n\t\tconst normalized = this.normalizeText(text);\n\t\t// Push undo snapshot if content differs (makes programmatic changes undoable)\n\t\tif (this.getText() !== normalized) {\n\t\t\tthis.pushUndoSnapshot();\n\t\t}\n\t\tthis.pastes.clear();\n\t\tthis.pasteCounter = 0;\n\t\tthis.setTextInternal(normalized);\n\t}\n\n\t/** Drop every live or historical reference retained by this editor instance. */\n\tclear(): void {\n\t\tthis.cancelAutocomplete();\n\t\tthis.state = { lines: [\"\"], cursorLine: 0, cursorCol: 0 };\n\t\tthis.pastes.clear();\n\t\tthis.pasteCounter = 0;\n\t\tthis.bracketedPaste.clear();\n\t\tthis.history = [];\n\t\tthis.historyIndex = -1;\n\t\tthis.killRing = new KillRing();\n\t\tthis.undoStack.clear();\n\t\tthis.lastAction = null;\n\t\tthis.jumpMode = null;\n\t\tthis.preferredVisualCol = null;\n\t\tthis.snappedFromCursorCol = null;\n\t\tthis.scrollOffset = 0;\n\t\tthis.notifyChange();\n\t}\n\n\t/**\n\t * Insert text at the current cursor position.\n\t * Used for programmatic insertion (e.g., clipboard image markers).\n\t * This is atomic for undo - single undo restores entire pre-insert state.\n\t */\n\tinsertTextAtCursor(text: string): void {\n\t\tif (!text) return;\n\t\tthis.cancelAutocomplete();\n\t\tthis.pushUndoSnapshot();\n\t\tthis.lastAction = null;\n\t\tthis.historyIndex = -1;\n\t\tthis.insertTextAtCursorInternal(text);\n\t}\n\n\t/**\n\t * Normalize text for editor storage:\n\t * - Normalize line endings (\\r\\n and \\r -> \\n)\n\t * - Expand tabs to 4 spaces\n\t */\n\tprivate normalizeText(text: string): string {\n\t\tconst normalizedLines = text.replace(/\\r\\n/g, \"\\n\").replace(/\\r/g, \"\\n\");\n\t\treturn this.privateContent ? normalizedLines : normalizedLines.replace(/\\t/g, \" \");\n\t}\n\n\t/**\n\t * Internal text insertion at cursor. Handles single and multi-line text.\n\t * Does not push undo snapshots or trigger autocomplete - caller is responsible.\n\t * Normalizes line endings and calls onChange once at the end.\n\t */\n\tprivate insertTextAtCursorInternal(text: string): void {\n\t\tif (!text) return;\n\n\t\t// Normalize line endings and tabs\n\t\tconst normalized = this.normalizeText(text);\n\t\tconst insertedLines = normalized.split(\"\\n\");\n\n\t\tconst currentLine = this.state.lines[this.state.cursorLine] || \"\";\n\t\tconst beforeCursor = currentLine.slice(0, this.state.cursorCol);\n\t\tconst afterCursor = currentLine.slice(this.state.cursorCol);\n\n\t\tif (insertedLines.length === 1) {\n\t\t\t// Single line - insert at cursor position\n\t\t\tthis.state.lines[this.state.cursorLine] = beforeCursor + normalized + afterCursor;\n\t\t\tthis.setCursorCol(this.state.cursorCol + normalized.length);\n\t\t} else {\n\t\t\t// Multi-line insertion\n\t\t\tthis.state.lines = [\n\t\t\t\t// All lines before current line\n\t\t\t\t...this.state.lines.slice(0, this.state.cursorLine),\n\n\t\t\t\t// The first inserted line merged with text before cursor\n\t\t\t\tbeforeCursor + insertedLines[0],\n\n\t\t\t\t// All middle inserted lines\n\t\t\t\t...insertedLines.slice(1, -1),\n\n\t\t\t\t// The last inserted line with text after cursor\n\t\t\t\tinsertedLines[insertedLines.length - 1] + afterCursor,\n\n\t\t\t\t// All lines after current line\n\t\t\t\t...this.state.lines.slice(this.state.cursorLine + 1),\n\t\t\t];\n\n\t\t\tthis.state.cursorLine += insertedLines.length - 1;\n\t\t\tthis.setCursorCol((insertedLines[insertedLines.length - 1] || \"\").length);\n\t\t}\n\n\t\tthis.notifyChange();\n\t}\n\n\t// All the editor methods from before...\n\tprivate insertCharacter(char: string, skipUndoCoalescing?: boolean): void {\n\t\tthis.historyIndex = -1; // Exit history browsing mode\n\n\t\t// Undo coalescing (fish-style):\n\t\t// - Consecutive word chars coalesce into one undo unit\n\t\t// - Space captures state before itself (so undo removes space+following word together)\n\t\t// - Each space is separately undoable\n\t\t// Skip coalescing when called from atomic operations (e.g., handlePaste)\n\t\tif (!skipUndoCoalescing) {\n\t\t\tif (isWhitespaceChar(char) || this.lastAction !== \"type-word\") {\n\t\t\t\tthis.pushUndoSnapshot();\n\t\t\t}\n\t\t\tthis.lastAction = \"type-word\";\n\t\t}\n\n\t\tconst line = this.state.lines[this.state.cursorLine] || \"\";\n\n\t\tconst before = line.slice(0, this.state.cursorCol);\n\t\tconst after = line.slice(this.state.cursorCol);\n\n\t\tthis.state.lines[this.state.cursorLine] = before + char + after;\n\t\tthis.setCursorCol(this.state.cursorCol + char.length);\n\n\t\tthis.notifyChange();\n\n\t\t// Check if we should trigger or update autocomplete\n\t\tif (!this.autocompleteState) {\n\t\t\t// Auto-trigger for \"/\" at the start of a line (slash commands)\n\t\t\tif (char === \"/\" && this.isAtStartOfMessage()) {\n\t\t\t\tthis.tryTriggerAutocomplete();\n\t\t\t}\n\t\t\t// Auto-trigger for symbol-based completion like @ or # at token boundaries\n\t\t\telse if (char === \"@\" || char === \"#\") {\n\t\t\t\tconst currentLine = this.state.lines[this.state.cursorLine] || \"\";\n\t\t\t\tconst textBeforeCursor = currentLine.slice(0, this.state.cursorCol);\n\t\t\t\tconst charBeforeSymbol = textBeforeCursor[textBeforeCursor.length - 2];\n\t\t\t\tif (textBeforeCursor.length === 1 || charBeforeSymbol === \" \" || charBeforeSymbol === \"\\t\") {\n\t\t\t\t\tthis.tryTriggerAutocomplete();\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Also auto-trigger when typing letters in a slash command or symbol completion context\n\t\t\telse if (/[a-zA-Z0-9.\\-_]/.test(char)) {\n\t\t\t\tthis.triggerAutocompleteForCurrentContext();\n\t\t\t}\n\t\t} else {\n\t\t\tthis.updateAutocomplete();\n\t\t}\n\t}\n\n\tprivate triggerAutocompleteForCurrentContext(): void {\n\t\tconst currentLine = this.state.lines[this.state.cursorLine] || \"\";\n\t\tconst textBeforeCursor = currentLine.slice(0, this.state.cursorCol);\n\t\tif (this.isInSlashCommandContext(textBeforeCursor) || /(?:^|[\\s])[@#][^\\s]*$/.test(textBeforeCursor)) {\n\t\t\tthis.tryTriggerAutocomplete();\n\t\t}\n\t}\n\n\tprivate refreshAutocompleteAfterDeletion(): void {\n\t\tif (this.autocompleteState) {\n\t\t\tthis.updateAutocomplete();\n\t\t} else {\n\t\t\tthis.triggerAutocompleteForCurrentContext();\n\t\t}\n\t}\n\n\tprivate handlePaste(pastedText: string): void {\n\t\tthis.cancelAutocomplete();\n\t\tthis.historyIndex = -1; // Exit history browsing mode\n\t\tthis.lastAction = null;\n\n\t\tthis.pushUndoSnapshot();\n\n\t\t// Some terminals (e.g. tmux popups with extended-keys-format=csi-u) re-encode\n\t\t// control bytes inside bracketed paste as CSI-u Ctrl+<letter> sequences\n\t\t// (ESC [ <codepoint> ; 5 u). Decode those back to their literal byte so the\n\t\t// per-char filter below preserves newlines instead of stripping ESC and\n\t\t// leaking the printable tail (e.g. \"[106;5u\") into the editor.\n\t\tconst decodedText = pastedText.replace(/\\x1b\\[(\\d+);5u/g, (match, code) => {\n\t\t\tconst cp = Number(code);\n\t\t\tif (cp >= 97 && cp <= 122) return String.fromCharCode(cp - 96);\n\t\t\tif (cp >= 65 && cp <= 90) return String.fromCharCode(cp - 64);\n\t\t\treturn match;\n\t\t});\n\n\t\t// Clean the pasted text: normalize line endings, expand tabs\n\t\tconst cleanText = this.normalizeText(decodedText);\n\n\t\t// Filter out non-printable characters except newlines\n\t\tlet filteredText = this.privateContent\n\t\t\t? cleanText.replace(/[\\x00-\\x08\\x0b-\\x1f]/g, \"\")\n\t\t\t: cleanText.replace(/[\\x00-\\x09\\x0b-\\x1f]/g, \"\");\n\n\t\t// If pasting a file path (starts with /, ~, or .) and the character before\n\t\t// the cursor is a word character, prepend a space for better readability\n\t\tif (!this.privateContent && /^[/~.]/.test(filteredText)) {\n\t\t\tconst currentLine = this.state.lines[this.state.cursorLine] || \"\";\n\t\t\tconst charBeforeCursor = this.state.cursorCol > 0 ? currentLine[this.state.cursorCol - 1] : \"\";\n\t\t\tif (charBeforeCursor && /\\w/.test(charBeforeCursor)) {\n\t\t\t\tfilteredText = ` ${filteredText}`;\n\t\t\t}\n\t\t}\n\n\t\t// Split into lines to check for large paste\n\t\tconst pastedLines = filteredText.split(\"\\n\");\n\n\t\t// Check if this is a large paste (> 10 lines or > 1000 characters)\n\t\tconst totalChars = filteredText.length;\n\t\tif (!this.privateContent && (pastedLines.length > 10 || totalChars > 1000)) {\n\t\t\t// Store the paste and insert a marker\n\t\t\tthis.pasteCounter++;\n\t\t\tconst pasteId = this.pasteCounter;\n\t\t\tthis.pastes.set(pasteId, filteredText);\n\n\t\t\t// Insert marker like \"[paste #1 +123 lines]\" or \"[paste #1 1234 chars]\"\n\t\t\tconst marker =\n\t\t\t\tpastedLines.length > 10\n\t\t\t\t\t? `[paste #${pasteId} +${pastedLines.length} lines]`\n\t\t\t\t\t: `[paste #${pasteId} ${totalChars} chars]`;\n\t\t\tthis.insertTextAtCursorInternal(marker);\n\t\t\treturn;\n\t\t}\n\n\t\tif (pastedLines.length === 1) {\n\t\t\t// Single line - insert atomically (do not trigger autocomplete during paste)\n\t\t\tthis.insertTextAtCursorInternal(filteredText);\n\t\t\treturn;\n\t\t}\n\n\t\t// Multi-line paste - use direct state manipulation\n\t\tthis.insertTextAtCursorInternal(filteredText);\n\t}\n\n\tprivate addNewLine(): void {\n\t\tthis.cancelAutocomplete();\n\t\tthis.historyIndex = -1; // Exit history browsing mode\n\t\tthis.lastAction = null;\n\n\t\tthis.pushUndoSnapshot();\n\n\t\tconst currentLine = this.state.lines[this.state.cursorLine] || \"\";\n\n\t\tconst before = currentLine.slice(0, this.state.cursorCol);\n\t\tconst after = currentLine.slice(this.state.cursorCol);\n\n\t\t// Split current line\n\t\tthis.state.lines[this.state.cursorLine] = before;\n\t\tthis.state.lines.splice(this.state.cursorLine + 1, 0, after);\n\n\t\t// Move cursor to start of new line\n\t\tthis.state.cursorLine++;\n\t\tthis.setCursorCol(0);\n\n\t\tthis.notifyChange();\n\t}\n\n\tprivate shouldSubmitOnBackslashEnter(data: string, kb: ReturnType<typeof getKeybindings>): boolean {\n\t\tif (this.disableSubmit) return false;\n\t\tif (!matchesKey(data, \"enter\")) return false;\n\t\tconst submitKeys = kb.getKeys(\"tui.input.submit\");\n\t\tconst hasShiftEnter = submitKeys.includes(\"shift+enter\") || submitKeys.includes(\"shift+return\");\n\t\tif (!hasShiftEnter) return false;\n\n\t\tconst currentLine = this.state.lines[this.state.cursorLine] || \"\";\n\t\treturn this.state.cursorCol > 0 && currentLine[this.state.cursorCol - 1] === \"\\\\\";\n\t}\n\n\tprivate submitValue(): void {\n\t\tthis.cancelAutocomplete();\n\t\tconst expanded = this.expandPasteMarkers(this.state.lines.join(\"\\n\"));\n\t\tconst result = this.privateContent ? expanded : expanded.trim();\n\t\tthis.clear();\n\t\tif (this.onSubmit) this.onSubmit(result);\n\t}\n\n\t[DELETE_CHARACTER_BACKWARD](): void {\n\t\tthis.historyIndex = -1; // Exit history browsing mode\n\t\tthis.lastAction = null;\n\n\t\tif (this.state.cursorCol > 0) {\n\t\t\tthis.pushUndoSnapshot();\n\n\t\t\t// Delete grapheme before cursor (handles emojis, combining characters, etc.)\n\t\t\tlet line = this.state.lines[this.state.cursorLine] || \"\";\n\t\t\tconst beforeCursor = line.slice(0, this.state.cursorCol);\n\n\t\t\t// Find the last grapheme in the text before cursor\n\t\t\tconst graphemes = [...this.segment(beforeCursor, \"grapheme\")];\n\t\t\tconst lastGrapheme = graphemes[graphemes.length - 1];\n\t\t\tconst graphemeLength = lastGrapheme ? lastGrapheme.segment.length : 1;\n\t\t\tconst pasteMarker = PASTE_MARKER_SINGLE.exec(lastGrapheme?.segment ?? \"\");\n\n\t\t\tif (pasteMarker) {\n\t\t\t\tconst targetId = Number(pasteMarker[1]);\n\t\t\t\tthis.pastes.delete(targetId);\n\t\t\t\tthis.pasteCounter--;\n\n\t\t\t\tconst higherIds = [...this.pastes.keys()].filter((id) => id > targetId).sort((a, b) => a - b);\n\t\t\t\tfor (const id of higherIds) {\n\t\t\t\t\tthis.pastes.set(id - 1, this.pastes.get(id)!);\n\t\t\t\t\tthis.pastes.delete(id);\n\t\t\t\t}\n\n\t\t\t\tthis.state.lines = this.state.lines.map((currentLine) =>\n\t\t\t\t\tcurrentLine.replace(PASTE_MARKER_REGEX, (fullMatch, idGroup, suffixGroup) => {\n\t\t\t\t\t\tconst id = Number(idGroup);\n\t\t\t\t\t\treturn id <= targetId ? fullMatch : `[paste #${id - 1}${suffixGroup}]`;\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t\tline = this.state.lines[this.state.cursorLine] || \"\";\n\t\t\t}\n\n\t\t\tconst before = line.slice(0, this.state.cursorCol - graphemeLength);\n\t\t\tconst after = line.slice(this.state.cursorCol);\n\n\t\t\tthis.state.lines[this.state.cursorLine] = before + after;\n\t\t\tthis.setCursorCol(this.state.cursorCol - graphemeLength);\n\t\t} else if (this.state.cursorLine > 0) {\n\t\t\tthis.pushUndoSnapshot();\n\t\t\tthis.mergeCurrentLineIntoPrevious();\n\t\t}\n\n\t\tthis.notifyChange();\n\n\t\tthis.refreshAutocompleteAfterDeletion();\n\t}\n\n\t/**\n\t * Set cursor column and clear preferredVisualCol.\n\t * Use this for all non-vertical cursor movements to reset sticky column behavior.\n\t */\n\tprivate setCursorCol(col: number): void {\n\t\tthis.state.cursorCol = col;\n\t\tthis.preferredVisualCol = null;\n\t\tthis.snappedFromCursorCol = null;\n\t}\n\n\t/**\n\t * Move cursor to a target visual line, applying sticky column logic.\n\t * Shared by moveCursor() and pageScroll().\n\t */\n\tprivate moveToVisualLine(\n\t\tvisualLines: Array<{ logicalLine: number; startCol: number; length: number }>,\n\t\tcurrentVisualLine: number,\n\t\ttargetVisualLine: number,\n\t): void {\n\t\tconst currentVL = visualLines[currentVisualLine];\n\t\tconst targetVL = visualLines[targetVisualLine];\n\t\tif (!(currentVL && targetVL)) return;\n\n\t\t// When the cursor was snapped to a segment start, resolve the pre-snap\n\t\t// position against the VL it belongs to. This gives the correct visual\n\t\t// column even after a resize reshuffles VLs.\n\t\tlet currentVisualCol: number;\n\t\tif (this.snappedFromCursorCol !== null) {\n\t\t\tconst vlIndex = this.findVisualLineAt(visualLines, currentVL.logicalLine, this.snappedFromCursorCol);\n\t\t\tcurrentVisualCol = this.snappedFromCursorCol - visualLines[vlIndex].startCol;\n\t\t} else {\n\t\t\tcurrentVisualCol = this.state.cursorCol - currentVL.startCol;\n\t\t}\n\n\t\t// For non-last segments, clamp to length-1 to stay within the segment\n\t\tconst isLastSourceSegment =\n\t\t\tcurrentVisualLine === visualLines.length - 1 ||\n\t\t\tvisualLines[currentVisualLine + 1]?.logicalLine !== currentVL.logicalLine;\n\t\tconst sourceMaxVisualCol = isLastSourceSegment ? currentVL.length : Math.max(0, currentVL.length - 1);\n\n\t\tconst isLastTargetSegment =\n\t\t\ttargetVisualLine === visualLines.length - 1 ||\n\t\t\tvisualLines[targetVisualLine + 1]?.logicalLine !== targetVL.logicalLine;\n\t\tconst targetMaxVisualCol = isLastTargetSegment ? targetVL.length : Math.max(0, targetVL.length - 1);\n\n\t\tconst moveToVisualCol = this.computeVerticalMoveColumn(currentVisualCol, sourceMaxVisualCol, targetMaxVisualCol);\n\n\t\t// Set cursor position\n\t\tthis.state.cursorLine = targetVL.logicalLine;\n\t\tconst targetCol = targetVL.startCol + moveToVisualCol;\n\t\tconst logicalLine = this.state.lines[targetVL.logicalLine] || \"\";\n\t\tthis.state.cursorCol = Math.min(targetCol, logicalLine.length);\n\n\t\t// Snap cursor to atomic segment boundary (e.g. paste markers)\n\t\t// so the cursor never lands in the middle of a multi-grapheme unit.\n\t\t// Single-grapheme segments don't need snapping.\n\t\tconst segments = [...this.segment(logicalLine, \"grapheme\")];\n\t\tfor (const seg of segments) {\n\t\t\tif (seg.index > this.state.cursorCol) break;\n\t\t\tif (seg.segment.length <= 1) continue;\n\t\t\tif (this.state.cursorCol < seg.index + seg.segment.length) {\n\t\t\t\tconst isContinuation = seg.index < targetVL.startCol;\n\t\t\t\tconst isMovingDown = targetVisualLine > currentVisualLine;\n\n\t\t\t\tif (isContinuation && isMovingDown) {\n\t\t\t\t\t// The segment started on a previous visual line, and we\n\t\t\t\t\t// already visited it on the way down. Skip all remaining\n\t\t\t\t\t// continuation VLs and land on the first VL past it.\n\t\t\t\t\tconst segEnd = seg.index + seg.segment.length;\n\t\t\t\t\tlet next = targetVisualLine + 1;\n\t\t\t\t\twhile (\n\t\t\t\t\t\tnext < visualLines.length &&\n\t\t\t\t\t\tvisualLines[next].logicalLine === targetVL.logicalLine &&\n\t\t\t\t\t\tvisualLines[next].startCol < segEnd\n\t\t\t\t\t) {\n\t\t\t\t\t\tnext++;\n\t\t\t\t\t}\n\t\t\t\t\tif (next < visualLines.length) {\n\t\t\t\t\t\tthis.moveToVisualLine(visualLines, currentVisualLine, next);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Snap to the start of the segment so it gets highlighted.\n\t\t\t\t// Store the pre-snap position so the next vertical move can\n\t\t\t\t// resolve it to the correct visual column.\n\t\t\t\tthis.snappedFromCursorCol = this.state.cursorCol;\n\t\t\t\tthis.state.cursorCol = seg.index;\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t// No snap occurred – we moved out of the atomic segment.\n\t\tthis.snappedFromCursorCol = null;\n\t}\n\n\t/**\n\t * Compute the target visual column for vertical cursor movement.\n\t * Implements the sticky column decision table:\n\t *\n\t * | P | S | T | U | Scenario | Set Preferred | Move To |\n\t * |---|---|---|---| ---------------------------------------------------- |---------------|-------------|\n\t * | 0 | * | 0 | - | Start nav, target fits | null | current |\n\t * | 0 | * | 1 | - | Start nav, target shorter | current | target end |\n\t * | 1 | 0 | 0 | 0 | Clamped, target fits preferred | null | preferred |\n\t * | 1 | 0 | 0 | 1 | Clamped, target longer but still can't fit preferred | keep | target end |\n\t * | 1 | 0 | 1 | - | Clamped, target even shorter | keep | target end |\n\t * | 1 | 1 | 0 | - | Rewrapped, target fits current | null | current |\n\t * | 1 | 1 | 1 | - | Rewrapped, target shorter than current | current | target end |\n\t *\n\t * Where:\n\t * - P = preferred col is set\n\t * - S = cursor in middle of source line (not clamped to end)\n\t * - T = target line shorter than current visual col\n\t * - U = target line shorter than preferred col\n\t */\n\tprivate computeVerticalMoveColumn(\n\t\tcurrentVisualCol: number,\n\t\tsourceMaxVisualCol: number,\n\t\ttargetMaxVisualCol: number,\n\t): number {\n\t\tconst hasPreferred = this.preferredVisualCol !== null; // P\n\t\tconst cursorInMiddle = currentVisualCol < sourceMaxVisualCol; // S\n\t\tconst targetTooShort = targetMaxVisualCol < currentVisualCol; // T\n\n\t\tif (!hasPreferred || cursorInMiddle) {\n\t\t\tif (targetTooShort) {\n\t\t\t\t// Cases 2 and 7\n\t\t\t\tthis.preferredVisualCol = currentVisualCol;\n\t\t\t\treturn targetMaxVisualCol;\n\t\t\t}\n\n\t\t\t// Cases 1 and 6\n\t\t\tthis.preferredVisualCol = null;\n\t\t\treturn currentVisualCol;\n\t\t}\n\n\t\tconst targetCantFitPreferred = targetMaxVisualCol < this.preferredVisualCol!; // U\n\t\tif (targetTooShort || targetCantFitPreferred) {\n\t\t\t// Cases 4 and 5\n\t\t\treturn targetMaxVisualCol;\n\t\t}\n\n\t\t// Case 3\n\t\tconst result = this.preferredVisualCol!;\n\t\tthis.preferredVisualCol = null;\n\t\treturn result;\n\t}\n\n\tprivate moveToLineStart(): void {\n\t\tthis.lastAction = null;\n\t\tthis.setCursorCol(0);\n\t}\n\n\tprivate moveToLineEnd(): void {\n\t\tthis.lastAction = null;\n\t\tconst currentLine = this.state.lines[this.state.cursorLine] || \"\";\n\t\tthis.setCursorCol(currentLine.length);\n\t}\n\n\tprivate mergeCurrentLineIntoPrevious(): void {\n\t\tconst currentLine = this.state.lines[this.state.cursorLine] || \"\";\n\t\tconst previousLine = this.state.lines[this.state.cursorLine - 1] || \"\";\n\t\tthis.state.lines[this.state.cursorLine - 1] = previousLine + currentLine;\n\t\tthis.state.lines.splice(this.state.cursorLine, 1);\n\t\tthis.state.cursorLine--;\n\t\tthis.setCursorCol(previousLine.length);\n\t}\n\n\tprivate mergeNextLineIntoCurrent(): void {\n\t\tconst currentLine = this.state.lines[this.state.cursorLine] || \"\";\n\t\tconst nextLine = this.state.lines[this.state.cursorLine + 1] || \"\";\n\t\tthis.state.lines[this.state.cursorLine] = currentLine + nextLine;\n\t\tthis.state.lines.splice(this.state.cursorLine + 1, 1);\n\t}\n\n\tprivate isAtCurrentLineEnd(currentLine: string): boolean {\n\t\treturn this.state.cursorCol >= currentLine.length;\n\t}\n\n\tprivate hasNextLine(): boolean {\n\t\treturn this.state.cursorLine < this.state.lines.length - 1;\n\t}\n\n\tprivate recordKilledNewline(prepend: boolean): void {\n\t\tif (this.privateContent) return;\n\t\tthis.killRing.push(\"\\n\", { prepend, accumulate: this.lastAction === \"kill\" });\n\t\tthis.lastAction = \"kill\";\n\t}\n\n\t[DELETE_TO_LINE_START](): void {\n\t\tthis.historyIndex = -1; // Exit history browsing mode\n\n\t\tconst currentLine = this.state.lines[this.state.cursorLine] || \"\";\n\n\t\tif (this.state.cursorCol > 0) {\n\t\t\tthis.pushUndoSnapshot();\n\n\t\t\t// Calculate text to be deleted and save to kill ring (backward deletion = prepend)\n\t\t\tconst deletedText = currentLine.slice(0, this.state.cursorCol);\n\t\t\tif (!this.privateContent) {\n\t\t\t\tthis.killRing.push(deletedText, { prepend: true, accumulate: this.lastAction === \"kill\" });\n\t\t\t\tthis.lastAction = \"kill\";\n\t\t\t}\n\n\t\t\t// Delete from start of line up to cursor\n\t\t\tthis.state.lines[this.state.cursorLine] = currentLine.slice(this.state.cursorCol);\n\t\t\tthis.setCursorCol(0);\n\t\t} else if (this.state.cursorLine > 0) {\n\t\t\tthis.pushUndoSnapshot();\n\t\t\tthis.recordKilledNewline(true);\n\t\t\tthis.mergeCurrentLineIntoPrevious();\n\t\t}\n\n\t\tthis.notifyChange();\n\t}\n\n\t[DELETE_TO_LINE_END](): void {\n\t\tthis.historyIndex = -1; // Exit history browsing mode\n\n\t\tconst currentLine = this.state.lines[this.state.cursorLine] || \"\";\n\n\t\tif (this.state.cursorCol < currentLine.length) {\n\t\t\tthis.pushUndoSnapshot();\n\n\t\t\t// Calculate text to be deleted and save to kill ring (forward deletion = append)\n\t\t\tconst deletedText = currentLine.slice(this.state.cursorCol);\n\t\t\tif (!this.privateContent) {\n\t\t\t\tthis.killRing.push(deletedText, { prepend: false, accumulate: this.lastAction === \"kill\" });\n\t\t\t\tthis.lastAction = \"kill\";\n\t\t\t}\n\n\t\t\t// Delete from cursor to end of line\n\t\t\tthis.state.lines[this.state.cursorLine] = currentLine.slice(0, this.state.cursorCol);\n\t\t} else if (this.state.cursorLine < this.state.lines.length - 1) {\n\t\t\tthis.pushUndoSnapshot();\n\t\t\tthis.recordKilledNewline(false);\n\t\t\tthis.mergeNextLineIntoCurrent();\n\t\t}\n\n\t\tthis.notifyChange();\n\t}\n\n\t[DELETE_WORD_BACKWARD](): void {\n\t\tthis.historyIndex = -1; // Exit history browsing mode\n\n\t\tconst currentLine = this.state.lines[this.state.cursorLine] || \"\";\n\n\t\t// If at start of line, behave like backspace at column 0 (merge with previous line)\n\t\tif (this.state.cursorCol === 0) {\n\t\t\tif (this.state.cursorLine > 0) {\n\t\t\t\tthis.pushUndoSnapshot();\n\t\t\t\tthis.recordKilledNewline(true);\n\t\t\t\tthis.mergeCurrentLineIntoPrevious();\n\t\t\t}\n\t\t} else {\n\t\t\tthis.pushUndoSnapshot();\n\n\t\t\t// Save lastAction before cursor movement (moveWordBackwards resets it)\n\t\t\tconst wasKill = this.lastAction === \"kill\";\n\n\t\t\tconst oldCursorCol = this.state.cursorCol;\n\t\t\tthis.moveWordBackwards();\n\t\t\tconst deleteFrom = this.state.cursorCol;\n\t\t\tthis.setCursorCol(oldCursorCol);\n\n\t\t\tconst deletedText = currentLine.slice(deleteFrom, this.state.cursorCol);\n\t\t\tif (!this.privateContent) {\n\t\t\t\tthis.killRing.push(deletedText, { prepend: true, accumulate: wasKill });\n\t\t\t\tthis.lastAction = \"kill\";\n\t\t\t}\n\n\t\t\tthis.state.lines[this.state.cursorLine] =\n\t\t\t\tcurrentLine.slice(0, deleteFrom) + currentLine.slice(this.state.cursorCol);\n\t\t\tthis.setCursorCol(deleteFrom);\n\t\t}\n\n\t\tthis.notifyChange();\n\t}\n\n\t[DELETE_WORD_FORWARD](): void {\n\t\tthis.historyIndex = -1; // Exit history browsing mode\n\n\t\tconst currentLine = this.state.lines[this.state.cursorLine] || \"\";\n\n\t\t// If at end of line, merge with next line (delete the newline)\n\t\tif (this.isAtCurrentLineEnd(currentLine)) {\n\t\t\tif (this.hasNextLine()) {\n\t\t\t\tthis.pushUndoSnapshot();\n\t\t\t\tthis.recordKilledNewline(false);\n\t\t\t\tthis.mergeNextLineIntoCurrent();\n\t\t\t}\n\t\t} else {\n\t\t\tthis.pushUndoSnapshot();\n\n\t\t\t// Save lastAction before cursor movement (moveWordForwards resets it)\n\t\t\tconst wasKill = this.lastAction === \"kill\";\n\n\t\t\tconst oldCursorCol = this.state.cursorCol;\n\t\t\tthis.moveWordForwards();\n\t\t\tconst deleteTo = this.state.cursorCol;\n\t\t\tthis.setCursorCol(oldCursorCol);\n\n\t\t\tconst deletedText = currentLine.slice(this.state.cursorCol, deleteTo);\n\t\t\tif (!this.privateContent) {\n\t\t\t\tthis.killRing.push(deletedText, { prepend: false, accumulate: wasKill });\n\t\t\t\tthis.lastAction = \"kill\";\n\t\t\t}\n\n\t\t\tthis.state.lines[this.state.cursorLine] =\n\t\t\t\tcurrentLine.slice(0, this.state.cursorCol) + currentLine.slice(deleteTo);\n\t\t}\n\n\t\tthis.notifyChange();\n\t}\n\n\t[DELETE_CHARACTER_FORWARD](): void {\n\t\tthis.historyIndex = -1; // Exit history browsing mode\n\t\tthis.lastAction = null;\n\n\t\tconst currentLine = this.state.lines[this.state.cursorLine] || \"\";\n\n\t\tif (this.state.cursorCol < currentLine.length) {\n\t\t\tthis.pushUndoSnapshot();\n\n\t\t\t// Delete grapheme at cursor position (handles emojis, combining characters, etc.)\n\t\t\tconst afterCursor = currentLine.slice(this.state.cursorCol);\n\n\t\t\t// Find the first grapheme at cursor\n\t\t\tconst graphemes = [...this.segment(afterCursor, \"grapheme\")];\n\t\t\tconst firstGrapheme = graphemes[0];\n\t\t\tconst graphemeLength = firstGrapheme ? firstGrapheme.segment.length : 1;\n\n\t\t\tconst before = currentLine.slice(0, this.state.cursorCol);\n\t\t\tconst after = currentLine.slice(this.state.cursorCol + graphemeLength);\n\t\t\tthis.state.lines[this.state.cursorLine] = before + after;\n\t\t} else if (this.state.cursorLine < this.state.lines.length - 1) {\n\t\t\tthis.pushUndoSnapshot();\n\t\t\tthis.mergeNextLineIntoCurrent();\n\t\t}\n\n\t\tthis.notifyChange();\n\n\t\tthis.refreshAutocompleteAfterDeletion();\n\t}\n\n\t/**\n\t * Build a mapping from visual lines to logical positions.\n\t * Returns an array where each element represents a visual line with:\n\t * - logicalLine: index into this.state.lines\n\t * - startCol: starting column in the logical line\n\t * - length: length of this visual line segment\n\t */\n\tprivate buildVisualLineMap(width: number): Array<{ logicalLine: number; startCol: number; length: number }> {\n\t\tconst visualLines: Array<{ logicalLine: number; startCol: number; length: number }> = [];\n\n\t\tfor (let i = 0; i < this.state.lines.length; i++) {\n\t\t\tconst line = this.state.lines[i] || \"\";\n\t\t\tconst lineVisWidth = visibleWidth(line);\n\t\t\tif (line.length === 0) {\n\t\t\t\t// Empty line still takes one visual line\n\t\t\t\tvisualLines.push({ logicalLine: i, startCol: 0, length: 0 });\n\t\t\t} else if (lineVisWidth <= width) {\n\t\t\t\tvisualLines.push({ logicalLine: i, startCol: 0, length: line.length });\n\t\t\t} else {\n\t\t\t\t// Line needs wrapping - use word-aware wrapping\n\t\t\t\tconst chunks = wordWrapLine(line, width, [...this.segment(line, \"grapheme\")]);\n\t\t\t\tfor (const chunk of chunks) {\n\t\t\t\t\tvisualLines.push({\n\t\t\t\t\t\tlogicalLine: i,\n\t\t\t\t\t\tstartCol: chunk.startIndex,\n\t\t\t\t\t\tlength: chunk.endIndex - chunk.startIndex,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn visualLines;\n\t}\n\n\t/**\n\t * Find the visual line index that contains the given logical position.\n\t */\n\tprivate findVisualLineAt(\n\t\tvisualLines: Array<{ logicalLine: number; startCol: number; length: number }>,\n\t\tline: number,\n\t\tcol: number,\n\t): number {\n\t\tfor (let i = 0; i < visualLines.length; i++) {\n\t\t\tconst vl = visualLines[i];\n\t\t\tif (!vl || vl.logicalLine !== line) continue;\n\t\t\tconst offset = col - vl.startCol;\n\t\t\t// Cursor is in this segment if it's within range. For the last\n\t\t\t// segment of a logical line, cursor can be at length (end position)\n\t\t\tconst isLastSegmentOfLine = i === visualLines.length - 1 || visualLines[i + 1]?.logicalLine !== vl.logicalLine;\n\t\t\tif (offset >= 0 && (offset < vl.length || (isLastSegmentOfLine && offset === vl.length))) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\t\treturn visualLines.length - 1;\n\t}\n\n\t/**\n\t * Find the visual line index for the current cursor position.\n\t */\n\tprivate findCurrentVisualLine(\n\t\tvisualLines: Array<{ logicalLine: number; startCol: number; length: number }>,\n\t): number {\n\t\treturn this.findVisualLineAt(visualLines, this.state.cursorLine, this.state.cursorCol);\n\t}\n\n\tprivate moveCursor(deltaLine: number, deltaCol: number): void {\n\t\tthis.lastAction = null;\n\t\tconst visualLines = this.buildVisualLineMap(this.lastWidth);\n\t\tconst currentVisualLine = this.findCurrentVisualLine(visualLines);\n\n\t\tif (deltaLine !== 0) {\n\t\t\tconst targetVisualLine = currentVisualLine + deltaLine;\n\n\t\t\tif (targetVisualLine >= 0 && targetVisualLine < visualLines.length) {\n\t\t\t\tthis.moveToVisualLine(visualLines, currentVisualLine, targetVisualLine);\n\t\t\t}\n\t\t}\n\n\t\tif (deltaCol !== 0) {\n\t\t\tconst currentLine = this.state.lines[this.state.cursorLine] || \"\";\n\n\t\t\tif (deltaCol > 0) {\n\t\t\t\t// Moving right - move by one grapheme (handles emojis, combining characters, etc.)\n\t\t\t\tif (this.state.cursorCol < currentLine.length) {\n\t\t\t\t\tconst afterCursor = currentLine.slice(this.state.cursorCol);\n\t\t\t\t\tconst graphemes = [...this.segment(afterCursor, \"grapheme\")];\n\t\t\t\t\tconst firstGrapheme = graphemes[0];\n\t\t\t\t\tthis.setCursorCol(this.state.cursorCol + (firstGrapheme ? firstGrapheme.segment.length : 1));\n\t\t\t\t} else if (this.state.cursorLine < this.state.lines.length - 1) {\n\t\t\t\t\t// Wrap to start of next logical line\n\t\t\t\t\tthis.state.cursorLine++;\n\t\t\t\t\tthis.setCursorCol(0);\n\t\t\t\t} else {\n\t\t\t\t\t// At end of last line - can't move, but set preferredVisualCol for up/down navigation\n\t\t\t\t\tconst currentVL = visualLines[currentVisualLine];\n\t\t\t\t\tif (currentVL) {\n\t\t\t\t\t\tthis.preferredVisualCol = this.state.cursorCol - currentVL.startCol;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Moving left - move by one grapheme (handles emojis, combining characters, etc.)\n\t\t\t\tif (this.state.cursorCol > 0) {\n\t\t\t\t\tconst beforeCursor = currentLine.slice(0, this.state.cursorCol);\n\t\t\t\t\tconst graphemes = [...this.segment(beforeCursor, \"grapheme\")];\n\t\t\t\t\tconst lastGrapheme = graphemes[graphemes.length - 1];\n\t\t\t\t\tthis.setCursorCol(this.state.cursorCol - (lastGrapheme ? lastGrapheme.segment.length : 1));\n\t\t\t\t} else if (this.state.cursorLine > 0) {\n\t\t\t\t\t// Wrap to end of previous logical line\n\t\t\t\t\tthis.state.cursorLine--;\n\t\t\t\t\tconst prevLine = this.state.lines[this.state.cursorLine] || \"\";\n\t\t\t\t\tthis.setCursorCol(prevLine.length);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Scroll by a page (direction: -1 for up, 1 for down).\n\t * Moves cursor by the page size while keeping it in bounds.\n\t */\n\tprivate pageScroll(direction: -1 | 1): void {\n\t\tthis.lastAction = null;\n\t\tconst terminalRows = this.tui.terminal.rows;\n\t\tconst pageSize = Math.max(5, Math.floor(terminalRows * 0.3));\n\n\t\tconst visualLines = this.buildVisualLineMap(this.lastWidth);\n\t\tconst currentVisualLine = this.findCurrentVisualLine(visualLines);\n\t\tconst targetVisualLine = Math.max(0, Math.min(visualLines.length - 1, currentVisualLine + direction * pageSize));\n\n\t\tthis.moveToVisualLine(visualLines, currentVisualLine, targetVisualLine);\n\t}\n\n\tprivate moveWordBackwards(): void {\n\t\tthis.lastAction = null;\n\t\tconst currentLine = this.state.lines[this.state.cursorLine] || \"\";\n\n\t\t// If at start of line, move to end of previous line\n\t\tif (this.state.cursorCol === 0) {\n\t\t\tif (this.state.cursorLine > 0) {\n\t\t\t\tthis.state.cursorLine--;\n\t\t\t\tconst prevLine = this.state.lines[this.state.cursorLine] || \"\";\n\t\t\t\tthis.setCursorCol(prevLine.length);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tthis.setCursorCol(\n\t\t\tfindWordBackward(currentLine, this.state.cursorCol, {\n\t\t\t\tsegment: (text) => this.segment(text, \"word\"),\n\t\t\t\tisAtomicSegment: isPasteMarker,\n\t\t\t}),\n\t\t);\n\t}\n\n\t/**\n\t * Yank (paste) the most recent kill ring entry at cursor position.\n\t */\n\tprivate yank(): void {\n\t\tif (this.killRing.length === 0) return;\n\n\t\tthis.pushUndoSnapshot();\n\n\t\tconst text = this.killRing.peek()!;\n\t\tthis.insertYankedText(text);\n\n\t\tthis.lastAction = \"yank\";\n\t}\n\n\t/**\n\t * Cycle through kill ring (only works immediately after yank or yank-pop).\n\t * Replaces the last yanked text with the previous entry in the ring.\n\t */\n\tprivate yankPop(): void {\n\t\t// Only works if we just yanked and have more than one entry\n\t\tif (this.lastAction !== \"yank\" || this.killRing.length <= 1) return;\n\n\t\tthis.pushUndoSnapshot();\n\n\t\t// Delete the previously yanked text (still at end of ring before rotation)\n\t\tthis.deleteYankedText();\n\n\t\t// Rotate the ring: move end to front\n\t\tthis.killRing.rotate();\n\n\t\t// Insert the new most recent entry (now at end after rotation)\n\t\tconst text = this.killRing.peek()!;\n\t\tthis.insertYankedText(text);\n\n\t\tthis.lastAction = \"yank\";\n\t}\n\n\t/**\n\t * Insert text at cursor position (used by yank operations).\n\t */\n\tprivate insertYankedText(text: string): void {\n\t\tthis.historyIndex = -1; // Exit history browsing mode\n\t\tthis.insertTextAtCursorInternal(text);\n\t}\n\n\t/**\n\t * Delete the previously yanked text (used by yank-pop).\n\t * The yanked text is derived from killRing[end] since it hasn't been rotated yet.\n\t */\n\tprivate deleteYankedText(): void {\n\t\tconst yankedText = this.killRing.peek();\n\t\tif (!yankedText) return;\n\n\t\tconst yankLines = yankedText.split(\"\\n\");\n\n\t\tif (yankLines.length === 1) {\n\t\t\t// Single line - delete backward from cursor\n\t\t\tconst currentLine = this.state.lines[this.state.cursorLine] || \"\";\n\t\t\tconst deleteLen = yankedText.length;\n\t\t\tconst before = currentLine.slice(0, this.state.cursorCol - deleteLen);\n\t\t\tconst after = currentLine.slice(this.state.cursorCol);\n\t\t\tthis.state.lines[this.state.cursorLine] = before + after;\n\t\t\tthis.setCursorCol(this.state.cursorCol - deleteLen);\n\t\t} else {\n\t\t\t// Multi-line delete - cursor is at end of last yanked line\n\t\t\tconst startLine = this.state.cursorLine - (yankLines.length - 1);\n\t\t\tconst startCol = (this.state.lines[startLine] || \"\").length - (yankLines[0] || \"\").length;\n\n\t\t\t// Get text after cursor on current line\n\t\t\tconst afterCursor = (this.state.lines[this.state.cursorLine] || \"\").slice(this.state.cursorCol);\n\n\t\t\t// Get text before yank start position\n\t\t\tconst beforeYank = (this.state.lines[startLine] || \"\").slice(0, startCol);\n\n\t\t\t// Remove all lines from startLine to cursorLine and replace with merged line\n\t\t\tthis.state.lines.splice(startLine, yankLines.length, beforeYank + afterCursor);\n\n\t\t\t// Update cursor\n\t\t\tthis.state.cursorLine = startLine;\n\t\t\tthis.setCursorCol(startCol);\n\t\t}\n\n\t\tthis.notifyChange();\n\t}\n\n\tprivate pushUndoSnapshot(): void {\n\t\tif (this.privateContent) return;\n\t\tthis.undoStack.push({ state: this.state, pastes: this.pastes, pasteCounter: this.pasteCounter });\n\t}\n\n\tprivate undo(): void {\n\t\tthis.historyIndex = -1; // Exit history browsing mode\n\t\tconst snapshot = this.undoStack.pop();\n\t\tif (!snapshot) return;\n\t\tObject.assign(this.state, snapshot.state);\n\t\tthis.pastes = snapshot.pastes;\n\t\tthis.pasteCounter = snapshot.pasteCounter;\n\t\tthis.lastAction = null;\n\t\tthis.preferredVisualCol = null;\n\t\tthis.notifyChange();\n\t}\n\n\t/**\n\t * Jump to the first occurrence of a character in the specified direction.\n\t * Multi-line search. Case-sensitive. Skips the current cursor position.\n\t */\n\tprivate jumpToChar(char: string, direction: \"forward\" | \"backward\"): void {\n\t\tthis.lastAction = null;\n\t\tconst isForward = direction === \"forward\";\n\t\tconst lines = this.state.lines;\n\n\t\tconst end = isForward ? lines.length : -1;\n\t\tconst step = isForward ? 1 : -1;\n\n\t\tfor (let lineIdx = this.state.cursorLine; lineIdx !== end; lineIdx += step) {\n\t\t\tconst line = lines[lineIdx] || \"\";\n\t\t\tconst isCurrentLine = lineIdx === this.state.cursorLine;\n\n\t\t\t// Current line: start after/before cursor; other lines: search full line\n\t\t\tconst searchFrom = isCurrentLine\n\t\t\t\t? isForward\n\t\t\t\t\t? this.state.cursorCol + 1\n\t\t\t\t\t: this.state.cursorCol - 1\n\t\t\t\t: undefined;\n\n\t\t\tconst idx = isForward ? line.indexOf(char, searchFrom) : line.lastIndexOf(char, searchFrom);\n\n\t\t\tif (idx !== -1) {\n\t\t\t\tthis.state.cursorLine = lineIdx;\n\t\t\t\tthis.setCursorCol(idx);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\t// No match found - cursor stays in place\n\t}\n\n\tprivate moveWordForwards(): void {\n\t\tthis.lastAction = null;\n\t\tconst currentLine = this.state.lines[this.state.cursorLine] || \"\";\n\n\t\t// If at end of line, move to start of next line\n\t\tif (this.isAtCurrentLineEnd(currentLine)) {\n\t\t\tif (this.hasNextLine()) {\n\t\t\t\tthis.state.cursorLine++;\n\t\t\t\tthis.setCursorCol(0);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tthis.setCursorCol(\n\t\t\tfindWordForward(currentLine, this.state.cursorCol, {\n\t\t\t\tsegment: (text) => this.segment(text, \"word\"),\n\t\t\t\tisAtomicSegment: isPasteMarker,\n\t\t\t}),\n\t\t);\n\t}\n\n\t// Slash menu only allowed on the first line of the editor\n\tprivate isSlashMenuAllowed(): boolean {\n\t\treturn this.state.cursorLine === 0;\n\t}\n\n\t// Helper method to check if cursor is at start of message (for slash command detection)\n\tprivate isAtStartOfMessage(): boolean {\n\t\tif (!this.isSlashMenuAllowed()) return false;\n\t\tconst currentLine = this.state.lines[this.state.cursorLine] || \"\";\n\t\tconst beforeCursor = currentLine.slice(0, this.state.cursorCol);\n\t\treturn beforeCursor.trim() === \"\" || beforeCursor.trim() === \"/\";\n\t}\n\n\tprivate isInSlashCommandContext(textBeforeCursor: string): boolean {\n\t\treturn this.isSlashMenuAllowed() && textBeforeCursor.trimStart().startsWith(\"/\");\n\t}\n\n\t// Autocomplete methods\n\t/**\n\t * Find the best autocomplete item index for the given prefix.\n\t * Returns -1 if no match is found.\n\t *\n\t * Match priority:\n\t * 1. Exact match (prefix === item.value) -> always selected\n\t * 2. Prefix match -> first item whose value starts with prefix\n\t * 3. No match -> -1 (keep default highlight)\n\t *\n\t * Matching is case-sensitive and checks item.value only.\n\t */\n\tprivate getBestAutocompleteMatchIndex(items: Array<{ value: string; label: string }>, prefix: string): number {\n\t\tif (!prefix) return -1;\n\n\t\tlet firstPrefixIndex = -1;\n\n\t\tfor (let i = 0; i < items.length; i++) {\n\t\t\tconst value = items[i]!.value;\n\t\t\tif (value === prefix) {\n\t\t\t\treturn i; // Exact match always wins\n\t\t\t}\n\t\t\tif (firstPrefixIndex === -1 && value.startsWith(prefix)) {\n\t\t\t\tfirstPrefixIndex = i;\n\t\t\t}\n\t\t}\n\n\t\treturn firstPrefixIndex;\n\t}\n\n\tprivate createAutocompleteList(\n\t\tprefix: string,\n\t\titems: Array<{ value: string; label: string; description?: string }>,\n\t): SelectList {\n\t\tconst layout = prefix.startsWith(\"/\") ? SLASH_COMMAND_SELECT_LIST_LAYOUT : undefined;\n\t\treturn new SelectList(items, this.autocompleteMaxVisible, this.theme.selectList, layout);\n\t}\n\n\tprivate tryTriggerAutocomplete(explicitTab: boolean = false): void {\n\t\tthis.requestAutocomplete({ force: false, explicitTab });\n\t}\n\n\tprivate handleTabCompletion(): void {\n\t\tif (!this.autocompleteProvider) return;\n\n\t\tconst currentLine = this.state.lines[this.state.cursorLine] || \"\";\n\t\tconst beforeCursor = currentLine.slice(0, this.state.cursorCol);\n\n\t\tif (this.isInSlashCommandContext(beforeCursor) && !beforeCursor.trimStart().includes(\" \")) {\n\t\t\tthis.handleSlashCommandCompletion();\n\t\t} else {\n\t\t\tthis.forceFileAutocomplete(true);\n\t\t}\n\t}\n\n\tprivate handleSlashCommandCompletion(): void {\n\t\tthis.requestAutocomplete({ force: false, explicitTab: true });\n\t}\n\n\tprivate forceFileAutocomplete(explicitTab: boolean = false): void {\n\t\tthis.requestAutocomplete({ force: true, explicitTab });\n\t}\n\n\tprivate requestAutocomplete(options: { force: boolean; explicitTab: boolean }): void {\n\t\tif (!this.autocompleteProvider) return;\n\n\t\tif (options.force) {\n\t\t\tconst shouldTrigger =\n\t\t\t\t!this.autocompleteProvider.shouldTriggerFileCompletion ||\n\t\t\t\tthis.autocompleteProvider.shouldTriggerFileCompletion(\n\t\t\t\t\tthis.state.lines,\n\t\t\t\t\tthis.state.cursorLine,\n\t\t\t\t\tthis.state.cursorCol,\n\t\t\t\t);\n\t\t\tif (!shouldTrigger) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tthis.cancelAutocompleteRequest();\n\t\tconst startToken = ++this.autocompleteStartToken;\n\n\t\tconst debounceMs = this.getAutocompleteDebounceMs(options);\n\t\tif (debounceMs > 0) {\n\t\t\tthis.autocompleteDebounceTimer = setTimeout(() => {\n\t\t\t\tthis.autocompleteDebounceTimer = undefined;\n\t\t\t\tvoid this.startAutocompleteRequest(startToken, options);\n\t\t\t}, debounceMs);\n\t\t\treturn;\n\t\t}\n\n\t\tvoid this.startAutocompleteRequest(startToken, options);\n\t}\n\n\tprivate async startAutocompleteRequest(\n\t\tstartToken: number,\n\t\toptions: { force: boolean; explicitTab: boolean },\n\t): Promise<void> {\n\t\tconst previousTask = this.autocompleteRequestTask;\n\t\tthis.autocompleteRequestTask = (async () => {\n\t\t\tawait previousTask;\n\t\t\tif (startToken !== this.autocompleteStartToken || !this.autocompleteProvider) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst controller = new AbortController();\n\t\t\tthis.autocompleteAbort = controller;\n\t\t\tconst requestId = ++this.autocompleteRequestId;\n\t\t\tconst snapshotText = this.getText();\n\t\t\tconst snapshotLine = this.state.cursorLine;\n\t\t\tconst snapshotCol = this.state.cursorCol;\n\n\t\t\tawait this.runAutocompleteRequest(requestId, controller, snapshotText, snapshotLine, snapshotCol, options);\n\t\t})();\n\t\tawait this.autocompleteRequestTask;\n\t}\n\n\tprivate getAutocompleteDebounceMs(options: { force: boolean; explicitTab: boolean }): number {\n\t\tif (options.explicitTab || options.force) {\n\t\t\treturn 0;\n\t\t}\n\n\t\tconst currentLine = this.state.lines[this.state.cursorLine] || \"\";\n\t\tconst textBeforeCursor = currentLine.slice(0, this.state.cursorCol);\n\t\tconst isSymbolAutocompleteContext = /(?:^|[ \\t])(?:@(?:\"[^\"]*|[^\\s]*)|#[^\\s]*)$/.test(textBeforeCursor);\n\t\treturn isSymbolAutocompleteContext ? ATTACHMENT_AUTOCOMPLETE_DEBOUNCE_MS : 0;\n\t}\n\n\tprivate async runAutocompleteRequest(\n\t\trequestId: number,\n\t\tcontroller: AbortController,\n\t\tsnapshotText: string,\n\t\tsnapshotLine: number,\n\t\tsnapshotCol: number,\n\t\toptions: { force: boolean; explicitTab: boolean },\n\t): Promise<void> {\n\t\tif (!this.autocompleteProvider) return;\n\n\t\tconst suggestions = await this.autocompleteProvider.getSuggestions(\n\t\t\tthis.state.lines,\n\t\t\tthis.state.cursorLine,\n\t\t\tthis.state.cursorCol,\n\t\t\t{ signal: controller.signal, force: options.force },\n\t\t);\n\n\t\tif (!this.isAutocompleteRequestCurrent(requestId, controller, snapshotText, snapshotLine, snapshotCol)) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.autocompleteAbort = undefined;\n\n\t\tif (!suggestions || !Array.isArray(suggestions.items) || suggestions.items.length === 0) {\n\t\t\tthis.cancelAutocomplete();\n\t\t\tthis.tui.requestRender();\n\t\t\treturn;\n\t\t}\n\n\t\tif (options.force && options.explicitTab && suggestions.items.length === 1) {\n\t\t\tconst item = suggestions.items[0]!;\n\t\t\tthis.pushUndoSnapshot();\n\t\t\tthis.lastAction = null;\n\t\t\tconst result = this.autocompleteProvider.applyCompletion(\n\t\t\t\tthis.state.lines,\n\t\t\t\tthis.state.cursorLine,\n\t\t\t\tthis.state.cursorCol,\n\t\t\t\titem,\n\t\t\t\tsuggestions.prefix,\n\t\t\t);\n\t\t\tthis.state.lines = result.lines;\n\t\t\tthis.state.cursorLine = result.cursorLine;\n\t\t\tthis.setCursorCol(result.cursorCol);\n\t\t\tthis.notifyChange();\n\t\t\tthis.tui.requestRender();\n\t\t\treturn;\n\t\t}\n\n\t\tthis.applyAutocompleteSuggestions(suggestions, options.force ? \"force\" : \"regular\");\n\t\tthis.tui.requestRender();\n\t}\n\n\tprivate isAutocompleteRequestCurrent(\n\t\trequestId: number,\n\t\tcontroller: AbortController,\n\t\tsnapshotText: string,\n\t\tsnapshotLine: number,\n\t\tsnapshotCol: number,\n\t): boolean {\n\t\treturn (\n\t\t\t!controller.signal.aborted &&\n\t\t\trequestId === this.autocompleteRequestId &&\n\t\t\tthis.getText() === snapshotText &&\n\t\t\tthis.state.cursorLine === snapshotLine &&\n\t\t\tthis.state.cursorCol === snapshotCol\n\t\t);\n\t}\n\n\tprivate applyAutocompleteSuggestions(suggestions: AutocompleteSuggestions, state: \"regular\" | \"force\"): void {\n\t\tthis.autocompletePrefix = suggestions.prefix;\n\t\tthis.autocompleteList = this.createAutocompleteList(suggestions.prefix, suggestions.items);\n\n\t\tconst bestMatchIndex = this.getBestAutocompleteMatchIndex(suggestions.items, suggestions.prefix);\n\t\tif (bestMatchIndex >= 0) {\n\t\t\tthis.autocompleteList.setSelectedIndex(bestMatchIndex);\n\t\t}\n\n\t\tthis.autocompleteState = state;\n\t}\n\n\tprivate cancelAutocompleteRequest(): void {\n\t\tthis.autocompleteStartToken += 1;\n\t\tif (this.autocompleteDebounceTimer) {\n\t\t\tclearTimeout(this.autocompleteDebounceTimer);\n\t\t\tthis.autocompleteDebounceTimer = undefined;\n\t\t}\n\t\tthis.autocompleteAbort?.abort();\n\t\tthis.autocompleteAbort = undefined;\n\t}\n\n\tprivate clearAutocompleteUi(): void {\n\t\tthis.autocompleteState = null;\n\t\tthis.autocompleteList = undefined;\n\t\tthis.autocompletePrefix = \"\";\n\t}\n\n\tprivate cancelAutocomplete(): void {\n\t\tthis.cancelAutocompleteRequest();\n\t\tthis.clearAutocompleteUi();\n\t}\n\n\tpublic isShowingAutocomplete(): boolean {\n\t\treturn this.autocompleteState !== null;\n\t}\n\n\tprivate updateAutocomplete(): void {\n\t\tif (!this.autocompleteState || !this.autocompleteProvider) return;\n\t\tthis.requestAutocomplete({ force: this.autocompleteState === \"force\", explicitTab: false });\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"editor.js","sourceRoot":"","sources":["../../src/components/editor.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AutocompleteProvider, AutocompleteSuggestions } from \"../autocomplete.ts\";\nimport { BracketedPasteBuffer } from \"../bracketed-paste.ts\";\nimport {\n\tDELETE_CHARACTER_BACKWARD,\n\tDELETE_CHARACTER_FORWARD,\n\tDELETE_TO_LINE_END,\n\tDELETE_TO_LINE_START,\n\tDELETE_WORD_BACKWARD,\n\tDELETE_WORD_FORWARD,\n\tdispatchDeletionInput,\n} from \"../editing-actions.ts\";\nimport { type EditorChangeSummary, firstNonWhitespaceCharacter } from \"../editor-component.ts\";\nimport { getKeybindings } from \"../keybindings.ts\";\nimport { decodePrintableKey, matchesKey } from \"../keys.ts\";\nimport { KillRing } from \"../kill-ring.ts\";\nimport { type Component, CURSOR_MARKER, type Focusable, type TUI } from \"../tui.ts\";\nimport { UndoStack } from \"../undo-stack.ts\";\nimport { getGraphemeSegmenter, getWordSegmenter, isWhitespaceChar, sliceByColumn, visibleWidth } from \"../utils.ts\";\nimport { findWordBackward, findWordForward } from \"../word-navigation.ts\";\nimport { SelectList, type SelectListLayoutOptions, type SelectListTheme } from \"./select-list.ts\";\n\nconst graphemeSegmenter = getGraphemeSegmenter();\nconst wordSegmenter = getWordSegmenter();\n\n/** Regex matching paste markers like `[paste #1 +123 lines]` or `[paste #2 1234 chars]`. */\nconst PASTE_MARKER_REGEX = /\\[paste #(\\d+)( (\\+\\d+ lines|\\d+ chars))?\\]/g;\n\n/** Non-global version for single-segment testing. */\nconst PASTE_MARKER_SINGLE = /^\\[paste #(\\d+)( (\\+\\d+ lines|\\d+ chars))?\\]$/;\n\n/** Check if a segment is a paste marker (i.e. was merged by segmentWithMarkers). */\nfunction isPasteMarker(segment: string): boolean {\n\treturn segment.length >= 10 && PASTE_MARKER_SINGLE.test(segment);\n}\n\n/**\n * A segmenter that wraps Intl.Segmenter and merges graphemes that fall\n * within paste markers into single atomic segments. This makes cursor\n * movement, deletion, word-wrap, etc. treat paste markers as single units.\n *\n * Only markers whose numeric ID exists in `validIds` are merged.\n */\nfunction segmentWithMarkers(\n\ttext: string,\n\tbaseSegmenter: Intl.Segmenter,\n\tvalidIds: Set<number>,\n): Iterable<Intl.SegmentData> {\n\t// Fast path: no paste markers in the text or no valid IDs.\n\tif (validIds.size === 0 || !text.includes(\"[paste #\")) {\n\t\treturn baseSegmenter.segment(text);\n\t}\n\n\t// Find all marker spans with valid IDs.\n\tconst markers: Array<{ start: number; end: number }> = [];\n\tfor (const m of text.matchAll(PASTE_MARKER_REGEX)) {\n\t\tconst id = Number.parseInt(m[1]!, 10);\n\t\tif (!validIds.has(id)) continue;\n\t\tmarkers.push({ start: m.index, end: m.index + m[0].length });\n\t}\n\tif (markers.length === 0) {\n\t\treturn baseSegmenter.segment(text);\n\t}\n\n\t// Build merged segment list.\n\tconst baseSegments = baseSegmenter.segment(text);\n\tconst result: Intl.SegmentData[] = [];\n\tlet markerIdx = 0;\n\n\tfor (const seg of baseSegments) {\n\t\t// Skip past markers that are entirely before this segment.\n\t\twhile (markerIdx < markers.length && markers[markerIdx]!.end <= seg.index) {\n\t\t\tmarkerIdx++;\n\t\t}\n\n\t\tconst marker = markerIdx < markers.length ? markers[markerIdx]! : null;\n\n\t\tif (marker && seg.index >= marker.start && seg.index < marker.end) {\n\t\t\t// This segment falls inside a marker.\n\t\t\t// If this is the first segment of the marker, emit a merged segment.\n\t\t\tif (seg.index === marker.start) {\n\t\t\t\tconst markerText = text.slice(marker.start, marker.end);\n\t\t\t\tresult.push({\n\t\t\t\t\tsegment: markerText,\n\t\t\t\t\tindex: marker.start,\n\t\t\t\t\tinput: text,\n\t\t\t\t});\n\t\t\t}\n\t\t\t// Otherwise skip (already merged into the first segment).\n\t\t} else {\n\t\t\tresult.push(seg);\n\t\t}\n\t}\n\n\treturn result;\n}\n\n/**\n * Represents a chunk of text for word-wrap layout.\n * Tracks both the text content and its position in the original line.\n */\nexport interface TextChunk {\n\ttext: string;\n\tstartIndex: number;\n\tendIndex: number;\n}\n\n/**\n * Split a line into word-wrapped chunks.\n * Wraps at word boundaries when possible, falling back to character-level\n * wrapping for words longer than the available width.\n *\n * @param line - The text line to wrap\n * @param maxWidth - Maximum visible width per chunk\n * @param preSegmented - Optional pre-segmented graphemes (e.g. with paste-marker awareness).\n * When omitted the default Intl.Segmenter is used.\n * @returns Array of chunks with text and position information\n */\nexport function wordWrapLine(line: string, maxWidth: number, preSegmented?: Intl.SegmentData[]): TextChunk[] {\n\tif (!line || maxWidth <= 0) {\n\t\treturn [{ text: \"\", startIndex: 0, endIndex: 0 }];\n\t}\n\n\tconst lineWidth = visibleWidth(line);\n\tif (lineWidth <= maxWidth) {\n\t\treturn [{ text: line, startIndex: 0, endIndex: line.length }];\n\t}\n\n\tconst chunks: TextChunk[] = [];\n\tconst segments = preSegmented ?? [...graphemeSegmenter.segment(line)];\n\n\tlet currentWidth = 0;\n\tlet chunkStart = 0;\n\n\t// Wrap opportunity: the position after the last whitespace before a non-whitespace\n\t// grapheme, i.e. where a line break is allowed.\n\tlet wrapOppIndex = -1;\n\tlet wrapOppWidth = 0;\n\n\tfor (let i = 0; i < segments.length; i++) {\n\t\tconst seg = segments[i]!;\n\t\tconst grapheme = seg.segment;\n\t\tconst gWidth = visibleWidth(grapheme);\n\t\tconst charIndex = seg.index;\n\t\tconst isWs = !isPasteMarker(grapheme) && isWhitespaceChar(grapheme);\n\n\t\t// Overflow check before advancing.\n\t\tif (currentWidth + gWidth > maxWidth) {\n\t\t\tif (wrapOppIndex >= 0 && currentWidth - wrapOppWidth + gWidth <= maxWidth) {\n\t\t\t\t// Backtrack to last wrap opportunity (the remaining content\n\t\t\t\t// plus the current grapheme still fits within maxWidth).\n\t\t\t\tchunks.push({ text: line.slice(chunkStart, wrapOppIndex), startIndex: chunkStart, endIndex: wrapOppIndex });\n\t\t\t\tchunkStart = wrapOppIndex;\n\t\t\t\tcurrentWidth -= wrapOppWidth;\n\t\t\t} else if (chunkStart < charIndex) {\n\t\t\t\t// No viable wrap opportunity: force-break at current position.\n\t\t\t\t// This also handles the case where backtracking to a word\n\t\t\t\t// boundary wouldn't help because the remaining content plus\n\t\t\t\t// the current grapheme (e.g. a wide character) still exceeds\n\t\t\t\t// maxWidth.\n\t\t\t\tchunks.push({ text: line.slice(chunkStart, charIndex), startIndex: chunkStart, endIndex: charIndex });\n\t\t\t\tchunkStart = charIndex;\n\t\t\t\tcurrentWidth = 0;\n\t\t\t}\n\t\t\twrapOppIndex = -1;\n\t\t}\n\n\t\tif (gWidth > maxWidth) {\n\t\t\tconst subGraphemes = [...graphemeSegmenter.segment(grapheme)];\n\t\t\tif (subGraphemes.length <= 1) {\n\t\t\t\t// A grapheme is atomic. If it is wider than the layout width,\n\t\t\t\t// render it as an overflowing visual chunk instead of recursing\n\t\t\t\t// with identical arguments.\n\t\t\t\tconst endIndex = charIndex + grapheme.length;\n\t\t\t\tchunks.push({ text: grapheme, startIndex: charIndex, endIndex });\n\t\t\t\tchunkStart = endIndex;\n\t\t\t\tcurrentWidth = 0;\n\t\t\t\twrapOppIndex = -1;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Multi-grapheme atomic segments wider than maxWidth (e.g. paste\n\t\t\t// markers in a narrow terminal) can still be visually split at\n\t\t\t// grapheme granularity. The segment remains logically atomic for\n\t\t\t// cursor movement / editing.\n\t\t\tconst subChunks = wordWrapLine(grapheme, maxWidth);\n\t\t\tfor (let j = 0; j < subChunks.length - 1; j++) {\n\t\t\t\tconst sc = subChunks[j]!;\n\t\t\t\tchunks.push({ text: sc.text, startIndex: charIndex + sc.startIndex, endIndex: charIndex + sc.endIndex });\n\t\t\t}\n\t\t\tconst last = subChunks[subChunks.length - 1]!;\n\t\t\tchunkStart = charIndex + last.startIndex;\n\t\t\tcurrentWidth = visibleWidth(last.text);\n\t\t\twrapOppIndex = -1;\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Advance.\n\t\tcurrentWidth += gWidth;\n\n\t\t// Record wrap opportunity: whitespace followed by non-whitespace.\n\t\t// Multiple spaces join (no break between them); the break point is\n\t\t// after the last space before the next word.\n\t\tconst next = segments[i + 1];\n\t\tif (isWs && next && (isPasteMarker(next.segment) || !isWhitespaceChar(next.segment))) {\n\t\t\twrapOppIndex = next.index;\n\t\t\twrapOppWidth = currentWidth;\n\t\t}\n\t}\n\n\t// Push final chunk.\n\tif (chunkStart < line.length || chunks.length === 0) {\n\t\tchunks.push({ text: line.slice(chunkStart), startIndex: chunkStart, endIndex: line.length });\n\t}\n\n\treturn chunks;\n}\n\n// Kitty CSI-u sequences for printable keys, including optional shifted/base codepoints.\ninterface EditorState {\n\tlines: string[];\n\tcursorLine: number;\n\tcursorCol: number;\n}\n\ninterface EditorSnapshot {\n\tstate: EditorState;\n\tpastes: Map<number, string>;\n\tpasteCounter: number;\n}\n\ninterface LayoutLine {\n\ttext: string;\n\thasCursor: boolean;\n\tcursorPos?: number;\n}\n\nexport interface EditorTheme {\n\tborderColor: (str: string) => string;\n\tselectList: SelectListTheme;\n}\n\nexport interface EditorOptions {\n\tpaddingX?: number;\n\tautocompleteMaxVisible?: number;\n\t/**\n\t * Keep visible owner-entered content out of autocomplete, prompt history, undo snapshots, and\n\t * the kill ring. Large pastes stay expanded and submit preserves surrounding whitespace.\n\t */\n\tprivateContent?: boolean;\n}\n\nconst SLASH_COMMAND_SELECT_LIST_LAYOUT: SelectListLayoutOptions = {\n\tminPrimaryColumnWidth: 12,\n\tmaxPrimaryColumnWidth: 32,\n};\n\nconst ATTACHMENT_AUTOCOMPLETE_DEBOUNCE_MS = 20;\n\nfunction createScrollBorder(direction: \"↑\" | \"↓\", hiddenLineCount: number, width: number): string {\n\tconst availableWidth = Math.max(0, width);\n\tconst indicator = `─── ${direction} ${hiddenLineCount} more `;\n\tconst remaining = availableWidth - visibleWidth(indicator);\n\tif (remaining >= 0) return indicator + \"─\".repeat(remaining);\n\n\tconst ellipsis = \"...\".slice(0, availableWidth);\n\tconst indicatorWidth = availableWidth - visibleWidth(ellipsis);\n\treturn sliceByColumn(indicator, 0, indicatorWidth, true) + ellipsis;\n}\n\nexport class Editor implements Component, Focusable {\n\tprivate state: EditorState = {\n\t\tlines: [\"\"],\n\t\tcursorLine: 0,\n\t\tcursorCol: 0,\n\t};\n\n\t/** Focusable interface - set by TUI when focus changes */\n\tfocused: boolean = false;\n\n\tprotected tui: TUI;\n\tprivate theme: EditorTheme;\n\tprivate paddingX: number = 0;\n\n\t// Store last render width for cursor navigation\n\tprivate lastWidth: number = 80;\n\n\t// Vertical scrolling support\n\tprivate scrollOffset: number = 0;\n\n\t// Border color (can be changed dynamically)\n\tpublic borderColor: (str: string) => string;\n\n\t// Autocomplete support\n\tprivate autocompleteProvider?: AutocompleteProvider;\n\tprivate autocompleteList?: SelectList;\n\tprivate autocompleteState: \"regular\" | \"force\" | null = null;\n\tprivate autocompletePrefix: string = \"\";\n\tprivate autocompleteMaxVisible: number = 5;\n\tprivate autocompleteAbort?: AbortController;\n\tprivate autocompleteDebounceTimer?: ReturnType<typeof setTimeout>;\n\tprivate autocompleteRequestTask: Promise<void> = Promise.resolve();\n\tprivate autocompleteStartToken: number = 0;\n\tprivate autocompleteRequestId: number = 0;\n\n\t// Paste tracking for large pastes\n\tprivate pastes: Map<number, string> = new Map();\n\tprivate pasteCounter: number = 0;\n\n\t// Bracketed paste mode buffering\n\tprivate bracketedPaste = new BracketedPasteBuffer();\n\n\t// Prompt history for up/down navigation\n\tprivate history: string[] = [];\n\tprivate historyIndex: number = -1; // -1 = not browsing, 0 = most recent, 1 = older, etc.\n\n\t/**\n\t * Consulted on Up arrow in an empty editor, before history navigation.\n\t * Return true after restoring queued message(s) into the editor to consume\n\t * the key; return false to fall through to history.\n\t */\n\tonRecallQueued?: () => boolean;\n\n\t// Kill ring for Emacs-style kill/yank operations\n\tprivate killRing = new KillRing();\n\tprivate lastAction: \"kill\" | \"yank\" | \"type-word\" | null = null;\n\n\t// Character jump mode\n\tprivate jumpMode: \"forward\" | \"backward\" | null = null;\n\n\t// Preferred visual column for vertical cursor movement (sticky column)\n\tprivate preferredVisualCol: number | null = null;\n\n\t// When the cursor is snapped to the start of an atomic segment, e.g. a\n\t// paste marker, cursorCol no longer reflects where the cursor would have\n\t// landed. This field stores the pre-snap cursorCol so that the next\n\t// vertical move can resolve it to a visual column on whatever VL it belongs\n\t// to.\n\tprivate snappedFromCursorCol: number | null = null;\n\n\t// Undo support\n\tprivate undoStack = new UndoStack<EditorSnapshot>();\n\tprivate readonly privateContent: boolean;\n\n\tpublic onSubmit?: (text: string) => void;\n\tpublic onChange?: (text: string) => void;\n\tpublic readonly supportsChangeSummary = true as const;\n\tpublic onChangeSummary?: (summary: EditorChangeSummary) => void;\n\tpublic disableSubmit: boolean = false;\n\n\tconstructor(tui: TUI, theme: EditorTheme, options: EditorOptions = {}) {\n\t\tthis.tui = tui;\n\t\tthis.theme = theme;\n\t\tthis.borderColor = theme.borderColor;\n\t\tthis.privateContent = options.privateContent ?? false;\n\t\tconst paddingX = options.paddingX ?? 0;\n\t\tthis.paddingX = Number.isFinite(paddingX) ? Math.max(0, Math.floor(paddingX)) : 0;\n\t\tconst maxVisible = options.autocompleteMaxVisible ?? 5;\n\t\tthis.autocompleteMaxVisible = Number.isFinite(maxVisible) ? Math.max(3, Math.min(20, Math.floor(maxVisible))) : 5;\n\t}\n\n\tprivate notifyChange(): void {\n\t\tif (this.onChangeSummary) {\n\t\t\tlet firstNonWhitespace: string | undefined;\n\t\t\tfor (const line of this.state.lines) {\n\t\t\t\tfirstNonWhitespace = firstNonWhitespaceCharacter(line);\n\t\t\t\tif (firstNonWhitespace !== undefined) break;\n\t\t\t}\n\t\t\tthis.onChangeSummary({ firstNonWhitespace });\n\t\t}\n\t\tif (this.onChange) this.onChange(this.getText());\n\t}\n\n\t/** Set of currently valid paste IDs, for marker-aware segmentation. */\n\tprivate validPasteIds(): Set<number> {\n\t\treturn new Set(this.pastes.keys());\n\t}\n\n\t/** Segment text with paste-marker awareness, only merging markers with valid IDs. */\n\tprivate segment(text: string, mode: \"word\" | \"grapheme\"): Iterable<Intl.SegmentData> {\n\t\treturn segmentWithMarkers(text, mode === \"word\" ? wordSegmenter : graphemeSegmenter, this.validPasteIds());\n\t}\n\n\tgetPaddingX(): number {\n\t\treturn this.paddingX;\n\t}\n\n\tsetPaddingX(padding: number): void {\n\t\tconst newPadding = Number.isFinite(padding) ? Math.max(0, Math.floor(padding)) : 0;\n\t\tif (this.paddingX !== newPadding) {\n\t\t\tthis.paddingX = newPadding;\n\t\t\tthis.tui.requestRender();\n\t\t}\n\t}\n\n\tgetAutocompleteMaxVisible(): number {\n\t\treturn this.autocompleteMaxVisible;\n\t}\n\n\tsetAutocompleteMaxVisible(maxVisible: number): void {\n\t\tconst newMaxVisible = Number.isFinite(maxVisible) ? Math.max(3, Math.min(20, Math.floor(maxVisible))) : 5;\n\t\tif (this.autocompleteMaxVisible !== newMaxVisible) {\n\t\t\tthis.autocompleteMaxVisible = newMaxVisible;\n\t\t\tthis.tui.requestRender();\n\t\t}\n\t}\n\n\tsetAutocompleteProvider(provider: AutocompleteProvider): void {\n\t\tthis.cancelAutocomplete();\n\t\tif (this.privateContent) return;\n\t\tthis.autocompleteProvider = provider;\n\t}\n\n\t/**\n\t * Add a prompt to history for up/down arrow navigation.\n\t * Called after successful submission.\n\t */\n\taddToHistory(text: string): void {\n\t\tif (this.privateContent) return;\n\t\tconst trimmed = text.trim();\n\t\tif (!trimmed) return;\n\t\t// Don't add consecutive duplicates\n\t\tif (this.history.length > 0 && this.history[0] === trimmed) return;\n\t\tthis.history.unshift(trimmed);\n\t\t// Limit history size\n\t\tif (this.history.length > 100) {\n\t\t\tthis.history.pop();\n\t\t}\n\t}\n\n\t/** Replace the prompt history buffer. Input is oldest entry first. */\n\tsetHistory(texts: readonly string[]): void {\n\t\tthis.history = [];\n\t\tthis.historyIndex = -1;\n\t\tif (this.privateContent) return;\n\t\tfor (const text of texts) {\n\t\t\tthis.addToHistory(text);\n\t\t}\n\t}\n\n\tprivate isEditorEmpty(): boolean {\n\t\treturn this.state.lines.length === 1 && this.state.lines[0] === \"\";\n\t}\n\n\tprivate isOnFirstVisualLine(): boolean {\n\t\tconst visualLines = this.buildVisualLineMap(this.lastWidth);\n\t\tconst currentVisualLine = this.findCurrentVisualLine(visualLines);\n\t\treturn currentVisualLine === 0;\n\t}\n\n\tprivate isOnLastVisualLine(): boolean {\n\t\tconst visualLines = this.buildVisualLineMap(this.lastWidth);\n\t\tconst currentVisualLine = this.findCurrentVisualLine(visualLines);\n\t\treturn currentVisualLine === visualLines.length - 1;\n\t}\n\n\tprivate navigateHistory(direction: 1 | -1): void {\n\t\tif (this.privateContent) return;\n\t\tthis.lastAction = null;\n\t\tif (this.history.length === 0) return;\n\n\t\tconst newIndex = this.historyIndex - direction; // Up(-1) increases index, Down(1) decreases\n\t\tif (newIndex < -1 || newIndex >= this.history.length) return;\n\n\t\t// Capture state when first entering history browsing mode\n\t\tif (this.historyIndex === -1 && newIndex >= 0) {\n\t\t\tthis.pushUndoSnapshot();\n\t\t}\n\n\t\tthis.historyIndex = newIndex;\n\n\t\tif (this.historyIndex === -1) {\n\t\t\t// Returned to \"current\" state - clear editor\n\t\t\tthis.setTextInternal(\"\");\n\t\t} else {\n\t\t\tthis.setTextInternal(this.history[this.historyIndex] || \"\");\n\t\t}\n\t}\n\n\t/** Internal setText that doesn't reset history state - used by navigateHistory */\n\tprivate setTextInternal(text: string): void {\n\t\tconst lines = text.split(\"\\n\");\n\t\tthis.state.lines = lines.length === 0 ? [\"\"] : lines;\n\t\tthis.state.cursorLine = this.state.lines.length - 1;\n\t\tthis.setCursorCol(this.state.lines[this.state.cursorLine]?.length || 0);\n\t\t// Reset scroll - render() will adjust to show cursor\n\t\tthis.scrollOffset = 0;\n\n\t\tthis.notifyChange();\n\t}\n\n\tinvalidate(): void {\n\t\t// No cached state to invalidate currently\n\t}\n\n\trender(width: number): string[] {\n\t\tconst maxPadding = Math.max(0, Math.floor((width - 1) / 2));\n\t\tconst paddingX = Math.min(this.paddingX, maxPadding);\n\t\tconst contentWidth = Math.max(1, width - paddingX * 2);\n\n\t\t// Layout width: with padding the cursor can overflow into it,\n\t\t// without padding we reserve 1 column for the cursor.\n\t\tconst layoutWidth = Math.max(1, contentWidth - (paddingX ? 0 : 1));\n\n\t\t// Store for cursor navigation (must match wrapping width)\n\t\tthis.lastWidth = layoutWidth;\n\n\t\tconst horizontal = this.borderColor(\"─\");\n\n\t\t// Layout the text\n\t\tconst layoutLines = this.layoutText(layoutWidth);\n\n\t\t// Calculate max visible lines: 30% of terminal height, minimum 5 lines\n\t\tconst terminalRows = this.tui.terminal.rows;\n\t\tconst maxVisibleLines = Math.max(5, Math.floor(terminalRows * 0.3));\n\n\t\t// Find the cursor line index in layoutLines\n\t\tlet cursorLineIndex = layoutLines.findIndex((line) => line.hasCursor);\n\t\tif (cursorLineIndex === -1) cursorLineIndex = 0;\n\n\t\t// Adjust scroll offset to keep cursor visible\n\t\tif (cursorLineIndex < this.scrollOffset) {\n\t\t\tthis.scrollOffset = cursorLineIndex;\n\t\t} else if (cursorLineIndex >= this.scrollOffset + maxVisibleLines) {\n\t\t\tthis.scrollOffset = cursorLineIndex - maxVisibleLines + 1;\n\t\t}\n\n\t\t// Clamp scroll offset to valid range\n\t\tconst maxScrollOffset = Math.max(0, layoutLines.length - maxVisibleLines);\n\t\tthis.scrollOffset = Math.max(0, Math.min(this.scrollOffset, maxScrollOffset));\n\n\t\t// Get visible lines slice\n\t\tconst visibleLines = layoutLines.slice(this.scrollOffset, this.scrollOffset + maxVisibleLines);\n\n\t\tconst result: string[] = [];\n\t\tconst leftPadding = \" \".repeat(paddingX);\n\t\tconst rightPadding = leftPadding;\n\n\t\t// Render top border (with scroll indicator if scrolled down)\n\t\tif (this.scrollOffset > 0) {\n\t\t\tresult.push(this.borderColor(createScrollBorder(\"↑\", this.scrollOffset, width)));\n\t\t} else {\n\t\t\tresult.push(horizontal.repeat(width));\n\t\t}\n\n\t\t// Render each visible layout line\n\t\t// Emit hardware cursor marker only when focused and not showing autocomplete\n\t\tconst emitCursorMarker = this.focused && !this.autocompleteState;\n\n\t\tfor (const layoutLine of visibleLines) {\n\t\t\tlet displayText = layoutLine.text;\n\t\t\tlet lineVisibleWidth = visibleWidth(layoutLine.text);\n\t\t\tlet cursorInPadding = false;\n\n\t\t\t// Add cursor if this line has it\n\t\t\tif (layoutLine.hasCursor && layoutLine.cursorPos !== undefined) {\n\t\t\t\tconst before = displayText.slice(0, layoutLine.cursorPos);\n\t\t\t\tconst after = displayText.slice(layoutLine.cursorPos);\n\n\t\t\t\t// Hardware cursor marker (zero-width, emitted before fake cursor for IME positioning)\n\t\t\t\tconst marker = emitCursorMarker ? CURSOR_MARKER : \"\";\n\n\t\t\t\tif (after.length > 0) {\n\t\t\t\t\t// Cursor is on a character (grapheme) - replace it with highlighted version\n\t\t\t\t\t// Get the first grapheme from 'after'\n\t\t\t\t\tconst afterGraphemes = [...this.segment(after, \"grapheme\")];\n\t\t\t\t\tconst firstGrapheme = afterGraphemes[0]?.segment || \"\";\n\t\t\t\t\tconst restAfter = after.slice(firstGrapheme.length);\n\t\t\t\t\tconst cursor = `\\x1b[7m${firstGrapheme}\\x1b[0m`;\n\t\t\t\t\tdisplayText = before + marker + cursor + restAfter;\n\t\t\t\t\t// lineVisibleWidth stays the same - we're replacing, not adding\n\t\t\t\t} else {\n\t\t\t\t\t// Cursor is at the end - add highlighted space\n\t\t\t\t\tconst cursor = \"\\x1b[7m \\x1b[0m\";\n\t\t\t\t\tdisplayText = before + marker + cursor;\n\t\t\t\t\tlineVisibleWidth = lineVisibleWidth + 1;\n\t\t\t\t\t// If cursor overflows content width into the padding, flag it\n\t\t\t\t\tif (lineVisibleWidth > contentWidth && paddingX > 0) {\n\t\t\t\t\t\tcursorInPadding = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Calculate padding based on actual visible width\n\t\t\tconst padding = \" \".repeat(Math.max(0, contentWidth - lineVisibleWidth));\n\t\t\tconst lineRightPadding = cursorInPadding ? rightPadding.slice(1) : rightPadding;\n\n\t\t\t// Render the line (no side borders, just horizontal lines above and below)\n\t\t\tresult.push(`${leftPadding}${displayText}${padding}${lineRightPadding}`);\n\t\t}\n\n\t\t// Render bottom border (with scroll indicator if more content below)\n\t\tconst linesBelow = layoutLines.length - (this.scrollOffset + visibleLines.length);\n\t\tif (linesBelow > 0) {\n\t\t\tresult.push(this.borderColor(createScrollBorder(\"↓\", linesBelow, width)));\n\t\t} else {\n\t\t\tresult.push(horizontal.repeat(width));\n\t\t}\n\n\t\t// Add autocomplete list if active\n\t\tif (this.autocompleteState && this.autocompleteList) {\n\t\t\tconst autocompleteResult = this.autocompleteList.render(contentWidth);\n\t\t\tfor (const line of autocompleteResult) {\n\t\t\t\tconst lineWidth = visibleWidth(line);\n\t\t\t\tconst linePadding = \" \".repeat(Math.max(0, contentWidth - lineWidth));\n\t\t\t\tresult.push(`${leftPadding}${line}${linePadding}${rightPadding}`);\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t}\n\n\thandleInput(data: string): void {\n\t\tconst kb = getKeybindings();\n\n\t\t// Handle character jump mode (awaiting next character to jump to)\n\t\tif (this.jumpMode !== null) {\n\t\t\t// Cancel if the hotkey is pressed again\n\t\t\tif (kb.matches(data, \"tui.editor.jumpForward\") || kb.matches(data, \"tui.editor.jumpBackward\")) {\n\t\t\t\tthis.jumpMode = null;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst printable = decodePrintableKey(data) ?? (data.charCodeAt(0) >= 32 ? data : undefined);\n\t\t\tif (printable !== undefined) {\n\t\t\t\t// Printable character - perform the jump\n\t\t\t\tconst direction = this.jumpMode;\n\t\t\t\tthis.jumpMode = null;\n\t\t\t\tthis.jumpToChar(printable, direction);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Control character - cancel and fall through to normal handling\n\t\t\tthis.jumpMode = null;\n\t\t}\n\n\t\tconst pasteResult = this.bracketedPaste.consume(data);\n\t\tif (pasteResult.kind === \"pending\") return;\n\t\tif (pasteResult.kind === \"complete\") {\n\t\t\tif (pasteResult.content.length > 0) {\n\t\t\t\tthis.handlePaste(pasteResult.content);\n\t\t\t}\n\t\t\tif (pasteResult.remainder.length > 0) {\n\t\t\t\tthis.handleInput(pasteResult.remainder);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tdata = pasteResult.data;\n\n\t\t// Ctrl+C - let parent handle (exit/clear)\n\t\tif (kb.matches(data, \"tui.input.copy\")) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Undo\n\t\tif (kb.matches(data, \"tui.editor.undo\")) {\n\t\t\tif (!this.privateContent) this.undo();\n\t\t\treturn;\n\t\t}\n\n\t\t// Handle autocomplete mode\n\t\tif (this.autocompleteState && this.autocompleteList) {\n\t\t\tif (kb.matches(data, \"tui.select.cancel\")) {\n\t\t\t\tthis.cancelAutocomplete();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (kb.matches(data, \"tui.select.up\") || kb.matches(data, \"tui.select.down\")) {\n\t\t\t\tthis.autocompleteList.handleInput(data);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (kb.matches(data, \"tui.input.tab\")) {\n\t\t\t\tif (this.applySelectedAutocomplete()) {\n\t\t\t\t\tthis.cancelAutocomplete();\n\t\t\t\t\tthis.notifyChange();\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (kb.matches(data, \"tui.select.confirm\")) {\n\t\t\t\tif (this.applySelectedAutocomplete()) {\n\t\t\t\t\tif (this.autocompletePrefix.startsWith(\"/\")) {\n\t\t\t\t\t\tthis.cancelAutocomplete();\n\t\t\t\t\t\t// Fall through to submit\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.cancelAutocomplete();\n\t\t\t\t\t\tthis.notifyChange();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Tab - trigger completion\n\t\tif (kb.matches(data, \"tui.input.tab\") && !this.autocompleteState) {\n\t\t\tthis.handleTabCompletion();\n\t\t\treturn;\n\t\t}\n\n\t\tif (dispatchDeletionInput(data, this)) return;\n\n\t\t// Kill ring actions\n\t\tif (kb.matches(data, \"tui.editor.yank\")) {\n\t\t\tif (!this.privateContent) this.yank();\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.editor.yankPop\")) {\n\t\t\tif (!this.privateContent) this.yankPop();\n\t\t\treturn;\n\t\t}\n\n\t\t// Cursor movement actions\n\t\tif (kb.matches(data, \"tui.editor.cursorLineStart\")) {\n\t\t\tthis.moveToLineStart();\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.editor.cursorLineEnd\")) {\n\t\t\tthis.moveToLineEnd();\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.editor.cursorWordLeft\")) {\n\t\t\tthis.moveWordBackwards();\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.editor.cursorWordRight\")) {\n\t\t\tthis.moveWordForwards();\n\t\t\treturn;\n\t\t}\n\n\t\t// New line\n\t\tif (\n\t\t\tkb.matches(data, \"tui.input.newLine\") ||\n\t\t\t(data.charCodeAt(0) === 10 && data.length > 1) ||\n\t\t\tdata === \"\\x1b\\r\" ||\n\t\t\tdata === \"\\x1b[13;2~\" ||\n\t\t\t(data.length > 1 && data.includes(\"\\x1b\") && data.includes(\"\\r\")) ||\n\t\t\t(data === \"\\n\" && data.length === 1)\n\t\t) {\n\t\t\tif (this.shouldSubmitOnBackslashEnter(data, kb)) {\n\t\t\t\tthis[DELETE_CHARACTER_BACKWARD]();\n\t\t\t\tthis.submitValue();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.addNewLine();\n\t\t\treturn;\n\t\t}\n\n\t\t// Submit (Enter)\n\t\tif (kb.matches(data, \"tui.input.submit\")) {\n\t\t\tif (this.disableSubmit) return;\n\n\t\t\t// Workaround for terminals without Shift+Enter support:\n\t\t\t// If char before cursor is \\, delete it and insert newline instead of submitting.\n\t\t\tconst currentLine = this.state.lines[this.state.cursorLine] || \"\";\n\t\t\tif (this.state.cursorCol > 0 && currentLine[this.state.cursorCol - 1] === \"\\\\\") {\n\t\t\t\tthis[DELETE_CHARACTER_BACKWARD]();\n\t\t\t\tthis.addNewLine();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.submitValue();\n\t\t\treturn;\n\t\t}\n\n\t\t// Arrow key navigation (with history support)\n\t\tif (kb.matches(data, \"tui.editor.cursorUp\")) {\n\t\t\tif (this.isEditorEmpty()) {\n\t\t\t\tif (this.onRecallQueued?.()) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tthis.navigateHistory(-1);\n\t\t\t} else if (this.historyIndex > -1 && this.isOnFirstVisualLine()) {\n\t\t\t\tthis.navigateHistory(-1);\n\t\t\t} else if (this.isOnFirstVisualLine()) {\n\t\t\t\t// Already at top - jump to start of line\n\t\t\t\tthis.moveToLineStart();\n\t\t\t} else {\n\t\t\t\tthis.moveCursor(-1, 0);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.editor.cursorDown\")) {\n\t\t\tif (this.historyIndex > -1 && this.isOnLastVisualLine()) {\n\t\t\t\tthis.navigateHistory(1);\n\t\t\t} else if (this.isOnLastVisualLine()) {\n\t\t\t\t// Already at bottom - jump to end of line\n\t\t\t\tthis.moveToLineEnd();\n\t\t\t} else {\n\t\t\t\tthis.moveCursor(1, 0);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.editor.cursorRight\")) {\n\t\t\tthis.moveCursor(0, 1);\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.editor.cursorLeft\")) {\n\t\t\tthis.moveCursor(0, -1);\n\t\t\treturn;\n\t\t}\n\n\t\t// Page up/down - scroll by page and move cursor\n\t\tif (kb.matches(data, \"tui.editor.pageUp\")) {\n\t\t\tthis.pageScroll(-1);\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.editor.pageDown\")) {\n\t\t\tthis.pageScroll(1);\n\t\t\treturn;\n\t\t}\n\n\t\t// Character jump mode triggers\n\t\tif (kb.matches(data, \"tui.editor.jumpForward\")) {\n\t\t\tthis.jumpMode = \"forward\";\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.editor.jumpBackward\")) {\n\t\t\tthis.jumpMode = \"backward\";\n\t\t\treturn;\n\t\t}\n\n\t\t// Shift+Space - insert regular space\n\t\tif (matchesKey(data, \"shift+space\")) {\n\t\t\tthis.insertCharacter(\" \");\n\t\t\treturn;\n\t\t}\n\n\t\tconst printable = decodePrintableKey(data);\n\t\tif (printable !== undefined) {\n\t\t\tthis.insertCharacter(printable);\n\t\t\treturn;\n\t\t}\n\n\t\t// Regular characters\n\t\tif (data.charCodeAt(0) >= 32) {\n\t\t\tthis.insertCharacter(data);\n\t\t}\n\t}\n\n\tprivate applySelectedAutocomplete(): boolean {\n\t\tconst selected = this.autocompleteList?.getSelectedItem();\n\t\tif (!selected || !this.autocompleteProvider) return false;\n\n\t\tthis.pushUndoSnapshot();\n\t\tthis.lastAction = null;\n\t\tconst result = this.autocompleteProvider.applyCompletion(\n\t\t\tthis.state.lines,\n\t\t\tthis.state.cursorLine,\n\t\t\tthis.state.cursorCol,\n\t\t\tselected,\n\t\t\tthis.autocompletePrefix,\n\t\t);\n\t\tthis.state.lines = result.lines;\n\t\tthis.state.cursorLine = result.cursorLine;\n\t\tthis.setCursorCol(result.cursorCol);\n\t\treturn true;\n\t}\n\n\tprivate layoutText(contentWidth: number): LayoutLine[] {\n\t\tconst layoutLines: LayoutLine[] = [];\n\n\t\tif (this.state.lines.length === 0 || (this.state.lines.length === 1 && this.state.lines[0] === \"\")) {\n\t\t\t// Empty editor\n\t\t\tlayoutLines.push({\n\t\t\t\ttext: \"\",\n\t\t\t\thasCursor: true,\n\t\t\t\tcursorPos: 0,\n\t\t\t});\n\t\t\treturn layoutLines;\n\t\t}\n\n\t\t// Process each logical line\n\t\tfor (let i = 0; i < this.state.lines.length; i++) {\n\t\t\tconst line = this.state.lines[i] || \"\";\n\t\t\tconst isCurrentLine = i === this.state.cursorLine;\n\t\t\tconst lineVisibleWidth = visibleWidth(line);\n\n\t\t\tif (lineVisibleWidth <= contentWidth) {\n\t\t\t\t// Line fits in one layout line\n\t\t\t\tif (isCurrentLine) {\n\t\t\t\t\tlayoutLines.push({\n\t\t\t\t\t\ttext: line,\n\t\t\t\t\t\thasCursor: true,\n\t\t\t\t\t\tcursorPos: this.state.cursorCol,\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tlayoutLines.push({\n\t\t\t\t\t\ttext: line,\n\t\t\t\t\t\thasCursor: false,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Line needs wrapping - use word-aware wrapping\n\t\t\t\tconst chunks = wordWrapLine(line, contentWidth, [...this.segment(line, \"grapheme\")]);\n\n\t\t\t\tfor (let chunkIndex = 0; chunkIndex < chunks.length; chunkIndex++) {\n\t\t\t\t\tconst chunk = chunks[chunkIndex];\n\t\t\t\t\tif (!chunk) continue;\n\n\t\t\t\t\tconst cursorPos = this.state.cursorCol;\n\t\t\t\t\tconst isLastChunk = chunkIndex === chunks.length - 1;\n\n\t\t\t\t\t// Determine if cursor is in this chunk\n\t\t\t\t\t// For word-wrapped chunks, we need to handle the case where\n\t\t\t\t\t// cursor might be in trimmed whitespace at end of chunk\n\t\t\t\t\tlet hasCursorInChunk = false;\n\t\t\t\t\tlet adjustedCursorPos = 0;\n\n\t\t\t\t\tif (isCurrentLine) {\n\t\t\t\t\t\tif (isLastChunk) {\n\t\t\t\t\t\t\t// Last chunk: cursor belongs here if >= startIndex\n\t\t\t\t\t\t\thasCursorInChunk = cursorPos >= chunk.startIndex;\n\t\t\t\t\t\t\tadjustedCursorPos = cursorPos - chunk.startIndex;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Non-last chunk: cursor belongs here if in range [startIndex, endIndex)\n\t\t\t\t\t\t\t// But we need to handle the visual position in the trimmed text\n\t\t\t\t\t\t\thasCursorInChunk = cursorPos >= chunk.startIndex && cursorPos < chunk.endIndex;\n\t\t\t\t\t\t\tif (hasCursorInChunk) {\n\t\t\t\t\t\t\t\tadjustedCursorPos = cursorPos - chunk.startIndex;\n\t\t\t\t\t\t\t\t// Clamp to text length (in case cursor was in trimmed whitespace)\n\t\t\t\t\t\t\t\tif (adjustedCursorPos > chunk.text.length) {\n\t\t\t\t\t\t\t\t\tadjustedCursorPos = chunk.text.length;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (hasCursorInChunk) {\n\t\t\t\t\t\tlayoutLines.push({\n\t\t\t\t\t\t\ttext: chunk.text,\n\t\t\t\t\t\t\thasCursor: true,\n\t\t\t\t\t\t\tcursorPos: adjustedCursorPos,\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlayoutLines.push({\n\t\t\t\t\t\t\ttext: chunk.text,\n\t\t\t\t\t\t\thasCursor: false,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn layoutLines;\n\t}\n\n\tgetText(): string {\n\t\treturn this.state.lines.join(\"\\n\");\n\t}\n\n\tprivate expandPasteMarkers(text: string): string {\n\t\treturn text.replace(PASTE_MARKER_REGEX, (marker, idGroup) => this.pastes.get(Number(idGroup)) ?? marker);\n\t}\n\n\t/**\n\t * Get text with paste markers expanded to their actual content.\n\t * Use this when you need the full content (e.g., for external editor).\n\t */\n\tgetExpandedText(): string {\n\t\treturn this.expandPasteMarkers(this.state.lines.join(\"\\n\"));\n\t}\n\n\tgetLines(): string[] {\n\t\treturn [...this.state.lines];\n\t}\n\n\tgetCursor(): { line: number; col: number } {\n\t\treturn { line: this.state.cursorLine, col: this.state.cursorCol };\n\t}\n\n\tsetText(text: string): void {\n\t\tthis.cancelAutocomplete();\n\t\tthis.lastAction = null;\n\t\tthis.historyIndex = -1; // Exit history browsing mode\n\t\tconst normalized = this.normalizeText(text);\n\t\t// Push undo snapshot if content differs (makes programmatic changes undoable)\n\t\tif (this.getText() !== normalized) {\n\t\t\tthis.pushUndoSnapshot();\n\t\t}\n\t\tthis.pastes.clear();\n\t\tthis.pasteCounter = 0;\n\t\tthis.setTextInternal(normalized);\n\t}\n\n\tprivate resetState(preserveHistory: boolean): void {\n\t\tthis.cancelAutocomplete();\n\t\tthis.state = { lines: [\"\"], cursorLine: 0, cursorCol: 0 };\n\t\tthis.pastes.clear();\n\t\tthis.pasteCounter = 0;\n\t\tthis.bracketedPaste.clear();\n\t\tif (!preserveHistory) this.history = [];\n\t\tthis.historyIndex = -1;\n\t\tthis.killRing = new KillRing();\n\t\tthis.undoStack.clear();\n\t\tthis.lastAction = null;\n\t\tthis.jumpMode = null;\n\t\tthis.preferredVisualCol = null;\n\t\tthis.snappedFromCursorCol = null;\n\t\tthis.scrollOffset = 0;\n\t\tthis.notifyChange();\n\t}\n\n\t/** Drop every live or historical reference retained by this editor instance. */\n\tclear(): void {\n\t\tthis.resetState(false);\n\t}\n\n\t/**\n\t * Insert text at the current cursor position.\n\t * Used for programmatic insertion (e.g., clipboard image markers).\n\t * This is atomic for undo - single undo restores entire pre-insert state.\n\t */\n\tinsertTextAtCursor(text: string): void {\n\t\tif (!text) return;\n\t\tthis.cancelAutocomplete();\n\t\tthis.pushUndoSnapshot();\n\t\tthis.lastAction = null;\n\t\tthis.historyIndex = -1;\n\t\tthis.insertTextAtCursorInternal(text);\n\t}\n\n\t/**\n\t * Normalize text for editor storage:\n\t * - Normalize line endings (\\r\\n and \\r -> \\n)\n\t * - Expand tabs to 4 spaces\n\t */\n\tprivate normalizeText(text: string): string {\n\t\tconst normalizedLines = text.replace(/\\r\\n/g, \"\\n\").replace(/\\r/g, \"\\n\");\n\t\treturn this.privateContent ? normalizedLines : normalizedLines.replace(/\\t/g, \" \");\n\t}\n\n\t/**\n\t * Internal text insertion at cursor. Handles single and multi-line text.\n\t * Does not push undo snapshots or trigger autocomplete - caller is responsible.\n\t * Normalizes line endings and calls onChange once at the end.\n\t */\n\tprivate insertTextAtCursorInternal(text: string): void {\n\t\tif (!text) return;\n\n\t\t// Normalize line endings and tabs\n\t\tconst normalized = this.normalizeText(text);\n\t\tconst insertedLines = normalized.split(\"\\n\");\n\n\t\tconst currentLine = this.state.lines[this.state.cursorLine] || \"\";\n\t\tconst beforeCursor = currentLine.slice(0, this.state.cursorCol);\n\t\tconst afterCursor = currentLine.slice(this.state.cursorCol);\n\n\t\tif (insertedLines.length === 1) {\n\t\t\t// Single line - insert at cursor position\n\t\t\tthis.state.lines[this.state.cursorLine] = beforeCursor + normalized + afterCursor;\n\t\t\tthis.setCursorCol(this.state.cursorCol + normalized.length);\n\t\t} else {\n\t\t\t// Multi-line insertion\n\t\t\tthis.state.lines = [\n\t\t\t\t// All lines before current line\n\t\t\t\t...this.state.lines.slice(0, this.state.cursorLine),\n\n\t\t\t\t// The first inserted line merged with text before cursor\n\t\t\t\tbeforeCursor + insertedLines[0],\n\n\t\t\t\t// All middle inserted lines\n\t\t\t\t...insertedLines.slice(1, -1),\n\n\t\t\t\t// The last inserted line with text after cursor\n\t\t\t\tinsertedLines[insertedLines.length - 1] + afterCursor,\n\n\t\t\t\t// All lines after current line\n\t\t\t\t...this.state.lines.slice(this.state.cursorLine + 1),\n\t\t\t];\n\n\t\t\tthis.state.cursorLine += insertedLines.length - 1;\n\t\t\tthis.setCursorCol((insertedLines[insertedLines.length - 1] || \"\").length);\n\t\t}\n\n\t\tthis.notifyChange();\n\t}\n\n\t// All the editor methods from before...\n\tprivate insertCharacter(char: string, skipUndoCoalescing?: boolean): void {\n\t\tthis.historyIndex = -1; // Exit history browsing mode\n\n\t\t// Undo coalescing (fish-style):\n\t\t// - Consecutive word chars coalesce into one undo unit\n\t\t// - Space captures state before itself (so undo removes space+following word together)\n\t\t// - Each space is separately undoable\n\t\t// Skip coalescing when called from atomic operations (e.g., handlePaste)\n\t\tif (!skipUndoCoalescing) {\n\t\t\tif (isWhitespaceChar(char) || this.lastAction !== \"type-word\") {\n\t\t\t\tthis.pushUndoSnapshot();\n\t\t\t}\n\t\t\tthis.lastAction = \"type-word\";\n\t\t}\n\n\t\tconst line = this.state.lines[this.state.cursorLine] || \"\";\n\n\t\tconst before = line.slice(0, this.state.cursorCol);\n\t\tconst after = line.slice(this.state.cursorCol);\n\n\t\tthis.state.lines[this.state.cursorLine] = before + char + after;\n\t\tthis.setCursorCol(this.state.cursorCol + char.length);\n\n\t\tthis.notifyChange();\n\n\t\t// Check if we should trigger or update autocomplete\n\t\tif (!this.autocompleteState) {\n\t\t\t// Auto-trigger for \"/\" at the start of a line (slash commands)\n\t\t\tif (char === \"/\" && this.isAtStartOfMessage()) {\n\t\t\t\tthis.tryTriggerAutocomplete();\n\t\t\t}\n\t\t\t// Auto-trigger for symbol-based completion like @ or # at token boundaries\n\t\t\telse if (char === \"@\" || char === \"#\") {\n\t\t\t\tconst currentLine = this.state.lines[this.state.cursorLine] || \"\";\n\t\t\t\tconst textBeforeCursor = currentLine.slice(0, this.state.cursorCol);\n\t\t\t\tconst charBeforeSymbol = textBeforeCursor[textBeforeCursor.length - 2];\n\t\t\t\tif (textBeforeCursor.length === 1 || charBeforeSymbol === \" \" || charBeforeSymbol === \"\\t\") {\n\t\t\t\t\tthis.tryTriggerAutocomplete();\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Also auto-trigger when typing letters in a slash command or symbol completion context\n\t\t\telse if (/[a-zA-Z0-9.\\-_]/.test(char)) {\n\t\t\t\tthis.triggerAutocompleteForCurrentContext();\n\t\t\t}\n\t\t} else {\n\t\t\tthis.updateAutocomplete();\n\t\t}\n\t}\n\n\tprivate triggerAutocompleteForCurrentContext(): void {\n\t\tconst currentLine = this.state.lines[this.state.cursorLine] || \"\";\n\t\tconst textBeforeCursor = currentLine.slice(0, this.state.cursorCol);\n\t\tif (this.isInSlashCommandContext(textBeforeCursor) || /(?:^|[\\s])[@#][^\\s]*$/.test(textBeforeCursor)) {\n\t\t\tthis.tryTriggerAutocomplete();\n\t\t}\n\t}\n\n\tprivate refreshAutocompleteAfterDeletion(): void {\n\t\tif (this.autocompleteState) {\n\t\t\tthis.updateAutocomplete();\n\t\t} else {\n\t\t\tthis.triggerAutocompleteForCurrentContext();\n\t\t}\n\t}\n\n\tprivate handlePaste(pastedText: string): void {\n\t\tthis.cancelAutocomplete();\n\t\tthis.historyIndex = -1; // Exit history browsing mode\n\t\tthis.lastAction = null;\n\n\t\tthis.pushUndoSnapshot();\n\n\t\t// Some terminals (e.g. tmux popups with extended-keys-format=csi-u) re-encode\n\t\t// control bytes inside bracketed paste as CSI-u Ctrl+<letter> sequences\n\t\t// (ESC [ <codepoint> ; 5 u). Decode those back to their literal byte so the\n\t\t// per-char filter below preserves newlines instead of stripping ESC and\n\t\t// leaking the printable tail (e.g. \"[106;5u\") into the editor.\n\t\tconst decodedText = pastedText.replace(/\\x1b\\[(\\d+);5u/g, (match, code) => {\n\t\t\tconst cp = Number(code);\n\t\t\tif (cp >= 97 && cp <= 122) return String.fromCharCode(cp - 96);\n\t\t\tif (cp >= 65 && cp <= 90) return String.fromCharCode(cp - 64);\n\t\t\treturn match;\n\t\t});\n\n\t\t// Clean the pasted text: normalize line endings, expand tabs\n\t\tconst cleanText = this.normalizeText(decodedText);\n\n\t\t// Filter out non-printable characters except newlines\n\t\tlet filteredText = this.privateContent\n\t\t\t? cleanText.replace(/[\\x00-\\x08\\x0b-\\x1f]/g, \"\")\n\t\t\t: cleanText.replace(/[\\x00-\\x09\\x0b-\\x1f]/g, \"\");\n\n\t\t// If pasting a file path (starts with /, ~, or .) and the character before\n\t\t// the cursor is a word character, prepend a space for better readability\n\t\tif (!this.privateContent && /^[/~.]/.test(filteredText)) {\n\t\t\tconst currentLine = this.state.lines[this.state.cursorLine] || \"\";\n\t\t\tconst charBeforeCursor = this.state.cursorCol > 0 ? currentLine[this.state.cursorCol - 1] : \"\";\n\t\t\tif (charBeforeCursor && /\\w/.test(charBeforeCursor)) {\n\t\t\t\tfilteredText = ` ${filteredText}`;\n\t\t\t}\n\t\t}\n\n\t\t// Split into lines to check for large paste\n\t\tconst pastedLines = filteredText.split(\"\\n\");\n\n\t\t// Check if this is a large paste (> 10 lines or > 1000 characters)\n\t\tconst totalChars = filteredText.length;\n\t\tif (!this.privateContent && (pastedLines.length > 10 || totalChars > 1000)) {\n\t\t\t// Store the paste and insert a marker\n\t\t\tthis.pasteCounter++;\n\t\t\tconst pasteId = this.pasteCounter;\n\t\t\tthis.pastes.set(pasteId, filteredText);\n\n\t\t\t// Insert marker like \"[paste #1 +123 lines]\" or \"[paste #1 1234 chars]\"\n\t\t\tconst marker =\n\t\t\t\tpastedLines.length > 10\n\t\t\t\t\t? `[paste #${pasteId} +${pastedLines.length} lines]`\n\t\t\t\t\t: `[paste #${pasteId} ${totalChars} chars]`;\n\t\t\tthis.insertTextAtCursorInternal(marker);\n\t\t\treturn;\n\t\t}\n\n\t\tif (pastedLines.length === 1) {\n\t\t\t// Single line - insert atomically (do not trigger autocomplete during paste)\n\t\t\tthis.insertTextAtCursorInternal(filteredText);\n\t\t\treturn;\n\t\t}\n\n\t\t// Multi-line paste - use direct state manipulation\n\t\tthis.insertTextAtCursorInternal(filteredText);\n\t}\n\n\tprivate addNewLine(): void {\n\t\tthis.cancelAutocomplete();\n\t\tthis.historyIndex = -1; // Exit history browsing mode\n\t\tthis.lastAction = null;\n\n\t\tthis.pushUndoSnapshot();\n\n\t\tconst currentLine = this.state.lines[this.state.cursorLine] || \"\";\n\n\t\tconst before = currentLine.slice(0, this.state.cursorCol);\n\t\tconst after = currentLine.slice(this.state.cursorCol);\n\n\t\t// Split current line\n\t\tthis.state.lines[this.state.cursorLine] = before;\n\t\tthis.state.lines.splice(this.state.cursorLine + 1, 0, after);\n\n\t\t// Move cursor to start of new line\n\t\tthis.state.cursorLine++;\n\t\tthis.setCursorCol(0);\n\n\t\tthis.notifyChange();\n\t}\n\n\tprivate shouldSubmitOnBackslashEnter(data: string, kb: ReturnType<typeof getKeybindings>): boolean {\n\t\tif (this.disableSubmit) return false;\n\t\tif (!matchesKey(data, \"enter\")) return false;\n\t\tconst submitKeys = kb.getKeys(\"tui.input.submit\");\n\t\tconst hasShiftEnter = submitKeys.includes(\"shift+enter\") || submitKeys.includes(\"shift+return\");\n\t\tif (!hasShiftEnter) return false;\n\n\t\tconst currentLine = this.state.lines[this.state.cursorLine] || \"\";\n\t\treturn this.state.cursorCol > 0 && currentLine[this.state.cursorCol - 1] === \"\\\\\";\n\t}\n\n\tprivate submitValue(): void {\n\t\tthis.cancelAutocomplete();\n\t\tconst expanded = this.expandPasteMarkers(this.state.lines.join(\"\\n\"));\n\t\tconst result = this.privateContent ? expanded : expanded.trim();\n\t\tthis.resetState(true);\n\t\tif (this.onSubmit) this.onSubmit(result);\n\t}\n\n\t[DELETE_CHARACTER_BACKWARD](): void {\n\t\tthis.historyIndex = -1; // Exit history browsing mode\n\t\tthis.lastAction = null;\n\n\t\tif (this.state.cursorCol > 0) {\n\t\t\tthis.pushUndoSnapshot();\n\n\t\t\t// Delete grapheme before cursor (handles emojis, combining characters, etc.)\n\t\t\tlet line = this.state.lines[this.state.cursorLine] || \"\";\n\t\t\tconst beforeCursor = line.slice(0, this.state.cursorCol);\n\n\t\t\t// Find the last grapheme in the text before cursor\n\t\t\tconst graphemes = [...this.segment(beforeCursor, \"grapheme\")];\n\t\t\tconst lastGrapheme = graphemes[graphemes.length - 1];\n\t\t\tconst graphemeLength = lastGrapheme ? lastGrapheme.segment.length : 1;\n\t\t\tconst pasteMarker = PASTE_MARKER_SINGLE.exec(lastGrapheme?.segment ?? \"\");\n\n\t\t\tif (pasteMarker) {\n\t\t\t\tconst targetId = Number(pasteMarker[1]);\n\t\t\t\tthis.pastes.delete(targetId);\n\t\t\t\tthis.pasteCounter--;\n\n\t\t\t\tconst higherIds = [...this.pastes.keys()].filter((id) => id > targetId).sort((a, b) => a - b);\n\t\t\t\tfor (const id of higherIds) {\n\t\t\t\t\tthis.pastes.set(id - 1, this.pastes.get(id)!);\n\t\t\t\t\tthis.pastes.delete(id);\n\t\t\t\t}\n\n\t\t\t\tthis.state.lines = this.state.lines.map((currentLine) =>\n\t\t\t\t\tcurrentLine.replace(PASTE_MARKER_REGEX, (fullMatch, idGroup, suffixGroup) => {\n\t\t\t\t\t\tconst id = Number(idGroup);\n\t\t\t\t\t\treturn id <= targetId ? fullMatch : `[paste #${id - 1}${suffixGroup}]`;\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t\tline = this.state.lines[this.state.cursorLine] || \"\";\n\t\t\t}\n\n\t\t\tconst before = line.slice(0, this.state.cursorCol - graphemeLength);\n\t\t\tconst after = line.slice(this.state.cursorCol);\n\n\t\t\tthis.state.lines[this.state.cursorLine] = before + after;\n\t\t\tthis.setCursorCol(this.state.cursorCol - graphemeLength);\n\t\t} else if (this.state.cursorLine > 0) {\n\t\t\tthis.pushUndoSnapshot();\n\t\t\tthis.mergeCurrentLineIntoPrevious();\n\t\t}\n\n\t\tthis.notifyChange();\n\n\t\tthis.refreshAutocompleteAfterDeletion();\n\t}\n\n\t/**\n\t * Set cursor column and clear preferredVisualCol.\n\t * Use this for all non-vertical cursor movements to reset sticky column behavior.\n\t */\n\tprivate setCursorCol(col: number): void {\n\t\tthis.state.cursorCol = col;\n\t\tthis.preferredVisualCol = null;\n\t\tthis.snappedFromCursorCol = null;\n\t}\n\n\t/**\n\t * Move cursor to a target visual line, applying sticky column logic.\n\t * Shared by moveCursor() and pageScroll().\n\t */\n\tprivate moveToVisualLine(\n\t\tvisualLines: Array<{ logicalLine: number; startCol: number; length: number }>,\n\t\tcurrentVisualLine: number,\n\t\ttargetVisualLine: number,\n\t): void {\n\t\tconst currentVL = visualLines[currentVisualLine];\n\t\tconst targetVL = visualLines[targetVisualLine];\n\t\tif (!(currentVL && targetVL)) return;\n\n\t\t// When the cursor was snapped to a segment start, resolve the pre-snap\n\t\t// position against the VL it belongs to. This gives the correct visual\n\t\t// column even after a resize reshuffles VLs.\n\t\tlet currentVisualCol: number;\n\t\tif (this.snappedFromCursorCol !== null) {\n\t\t\tconst vlIndex = this.findVisualLineAt(visualLines, currentVL.logicalLine, this.snappedFromCursorCol);\n\t\t\tcurrentVisualCol = this.snappedFromCursorCol - visualLines[vlIndex].startCol;\n\t\t} else {\n\t\t\tcurrentVisualCol = this.state.cursorCol - currentVL.startCol;\n\t\t}\n\n\t\t// For non-last segments, clamp to length-1 to stay within the segment\n\t\tconst isLastSourceSegment =\n\t\t\tcurrentVisualLine === visualLines.length - 1 ||\n\t\t\tvisualLines[currentVisualLine + 1]?.logicalLine !== currentVL.logicalLine;\n\t\tconst sourceMaxVisualCol = isLastSourceSegment ? currentVL.length : Math.max(0, currentVL.length - 1);\n\n\t\tconst isLastTargetSegment =\n\t\t\ttargetVisualLine === visualLines.length - 1 ||\n\t\t\tvisualLines[targetVisualLine + 1]?.logicalLine !== targetVL.logicalLine;\n\t\tconst targetMaxVisualCol = isLastTargetSegment ? targetVL.length : Math.max(0, targetVL.length - 1);\n\n\t\tconst moveToVisualCol = this.computeVerticalMoveColumn(currentVisualCol, sourceMaxVisualCol, targetMaxVisualCol);\n\n\t\t// Set cursor position\n\t\tthis.state.cursorLine = targetVL.logicalLine;\n\t\tconst targetCol = targetVL.startCol + moveToVisualCol;\n\t\tconst logicalLine = this.state.lines[targetVL.logicalLine] || \"\";\n\t\tthis.state.cursorCol = Math.min(targetCol, logicalLine.length);\n\n\t\t// Snap cursor to atomic segment boundary (e.g. paste markers)\n\t\t// so the cursor never lands in the middle of a multi-grapheme unit.\n\t\t// Single-grapheme segments don't need snapping.\n\t\tconst segments = [...this.segment(logicalLine, \"grapheme\")];\n\t\tfor (const seg of segments) {\n\t\t\tif (seg.index > this.state.cursorCol) break;\n\t\t\tif (seg.segment.length <= 1) continue;\n\t\t\tif (this.state.cursorCol < seg.index + seg.segment.length) {\n\t\t\t\tconst isContinuation = seg.index < targetVL.startCol;\n\t\t\t\tconst isMovingDown = targetVisualLine > currentVisualLine;\n\n\t\t\t\tif (isContinuation && isMovingDown) {\n\t\t\t\t\t// The segment started on a previous visual line, and we\n\t\t\t\t\t// already visited it on the way down. Skip all remaining\n\t\t\t\t\t// continuation VLs and land on the first VL past it.\n\t\t\t\t\tconst segEnd = seg.index + seg.segment.length;\n\t\t\t\t\tlet next = targetVisualLine + 1;\n\t\t\t\t\twhile (\n\t\t\t\t\t\tnext < visualLines.length &&\n\t\t\t\t\t\tvisualLines[next].logicalLine === targetVL.logicalLine &&\n\t\t\t\t\t\tvisualLines[next].startCol < segEnd\n\t\t\t\t\t) {\n\t\t\t\t\t\tnext++;\n\t\t\t\t\t}\n\t\t\t\t\tif (next < visualLines.length) {\n\t\t\t\t\t\tthis.moveToVisualLine(visualLines, currentVisualLine, next);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Snap to the start of the segment so it gets highlighted.\n\t\t\t\t// Store the pre-snap position so the next vertical move can\n\t\t\t\t// resolve it to the correct visual column.\n\t\t\t\tthis.snappedFromCursorCol = this.state.cursorCol;\n\t\t\t\tthis.state.cursorCol = seg.index;\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t// No snap occurred – we moved out of the atomic segment.\n\t\tthis.snappedFromCursorCol = null;\n\t}\n\n\t/**\n\t * Compute the target visual column for vertical cursor movement.\n\t * Implements the sticky column decision table:\n\t *\n\t * | P | S | T | U | Scenario | Set Preferred | Move To |\n\t * |---|---|---|---| ---------------------------------------------------- |---------------|-------------|\n\t * | 0 | * | 0 | - | Start nav, target fits | null | current |\n\t * | 0 | * | 1 | - | Start nav, target shorter | current | target end |\n\t * | 1 | 0 | 0 | 0 | Clamped, target fits preferred | null | preferred |\n\t * | 1 | 0 | 0 | 1 | Clamped, target longer but still can't fit preferred | keep | target end |\n\t * | 1 | 0 | 1 | - | Clamped, target even shorter | keep | target end |\n\t * | 1 | 1 | 0 | - | Rewrapped, target fits current | null | current |\n\t * | 1 | 1 | 1 | - | Rewrapped, target shorter than current | current | target end |\n\t *\n\t * Where:\n\t * - P = preferred col is set\n\t * - S = cursor in middle of source line (not clamped to end)\n\t * - T = target line shorter than current visual col\n\t * - U = target line shorter than preferred col\n\t */\n\tprivate computeVerticalMoveColumn(\n\t\tcurrentVisualCol: number,\n\t\tsourceMaxVisualCol: number,\n\t\ttargetMaxVisualCol: number,\n\t): number {\n\t\tconst hasPreferred = this.preferredVisualCol !== null; // P\n\t\tconst cursorInMiddle = currentVisualCol < sourceMaxVisualCol; // S\n\t\tconst targetTooShort = targetMaxVisualCol < currentVisualCol; // T\n\n\t\tif (!hasPreferred || cursorInMiddle) {\n\t\t\tif (targetTooShort) {\n\t\t\t\t// Cases 2 and 7\n\t\t\t\tthis.preferredVisualCol = currentVisualCol;\n\t\t\t\treturn targetMaxVisualCol;\n\t\t\t}\n\n\t\t\t// Cases 1 and 6\n\t\t\tthis.preferredVisualCol = null;\n\t\t\treturn currentVisualCol;\n\t\t}\n\n\t\tconst targetCantFitPreferred = targetMaxVisualCol < this.preferredVisualCol!; // U\n\t\tif (targetTooShort || targetCantFitPreferred) {\n\t\t\t// Cases 4 and 5\n\t\t\treturn targetMaxVisualCol;\n\t\t}\n\n\t\t// Case 3\n\t\tconst result = this.preferredVisualCol!;\n\t\tthis.preferredVisualCol = null;\n\t\treturn result;\n\t}\n\n\tprivate moveToLineStart(): void {\n\t\tthis.lastAction = null;\n\t\tthis.setCursorCol(0);\n\t}\n\n\tprivate moveToLineEnd(): void {\n\t\tthis.lastAction = null;\n\t\tconst currentLine = this.state.lines[this.state.cursorLine] || \"\";\n\t\tthis.setCursorCol(currentLine.length);\n\t}\n\n\tprivate mergeCurrentLineIntoPrevious(): void {\n\t\tconst currentLine = this.state.lines[this.state.cursorLine] || \"\";\n\t\tconst previousLine = this.state.lines[this.state.cursorLine - 1] || \"\";\n\t\tthis.state.lines[this.state.cursorLine - 1] = previousLine + currentLine;\n\t\tthis.state.lines.splice(this.state.cursorLine, 1);\n\t\tthis.state.cursorLine--;\n\t\tthis.setCursorCol(previousLine.length);\n\t}\n\n\tprivate mergeNextLineIntoCurrent(): void {\n\t\tconst currentLine = this.state.lines[this.state.cursorLine] || \"\";\n\t\tconst nextLine = this.state.lines[this.state.cursorLine + 1] || \"\";\n\t\tthis.state.lines[this.state.cursorLine] = currentLine + nextLine;\n\t\tthis.state.lines.splice(this.state.cursorLine + 1, 1);\n\t}\n\n\tprivate isAtCurrentLineEnd(currentLine: string): boolean {\n\t\treturn this.state.cursorCol >= currentLine.length;\n\t}\n\n\tprivate hasNextLine(): boolean {\n\t\treturn this.state.cursorLine < this.state.lines.length - 1;\n\t}\n\n\tprivate recordKilledNewline(prepend: boolean): void {\n\t\tif (this.privateContent) return;\n\t\tthis.killRing.push(\"\\n\", { prepend, accumulate: this.lastAction === \"kill\" });\n\t\tthis.lastAction = \"kill\";\n\t}\n\n\t[DELETE_TO_LINE_START](): void {\n\t\tthis.historyIndex = -1; // Exit history browsing mode\n\n\t\tconst currentLine = this.state.lines[this.state.cursorLine] || \"\";\n\n\t\tif (this.state.cursorCol > 0) {\n\t\t\tthis.pushUndoSnapshot();\n\n\t\t\t// Calculate text to be deleted and save to kill ring (backward deletion = prepend)\n\t\t\tconst deletedText = currentLine.slice(0, this.state.cursorCol);\n\t\t\tif (!this.privateContent) {\n\t\t\t\tthis.killRing.push(deletedText, { prepend: true, accumulate: this.lastAction === \"kill\" });\n\t\t\t\tthis.lastAction = \"kill\";\n\t\t\t}\n\n\t\t\t// Delete from start of line up to cursor\n\t\t\tthis.state.lines[this.state.cursorLine] = currentLine.slice(this.state.cursorCol);\n\t\t\tthis.setCursorCol(0);\n\t\t} else if (this.state.cursorLine > 0) {\n\t\t\tthis.pushUndoSnapshot();\n\t\t\tthis.recordKilledNewline(true);\n\t\t\tthis.mergeCurrentLineIntoPrevious();\n\t\t}\n\n\t\tthis.notifyChange();\n\t}\n\n\t[DELETE_TO_LINE_END](): void {\n\t\tthis.historyIndex = -1; // Exit history browsing mode\n\n\t\tconst currentLine = this.state.lines[this.state.cursorLine] || \"\";\n\n\t\tif (this.state.cursorCol < currentLine.length) {\n\t\t\tthis.pushUndoSnapshot();\n\n\t\t\t// Calculate text to be deleted and save to kill ring (forward deletion = append)\n\t\t\tconst deletedText = currentLine.slice(this.state.cursorCol);\n\t\t\tif (!this.privateContent) {\n\t\t\t\tthis.killRing.push(deletedText, { prepend: false, accumulate: this.lastAction === \"kill\" });\n\t\t\t\tthis.lastAction = \"kill\";\n\t\t\t}\n\n\t\t\t// Delete from cursor to end of line\n\t\t\tthis.state.lines[this.state.cursorLine] = currentLine.slice(0, this.state.cursorCol);\n\t\t} else if (this.state.cursorLine < this.state.lines.length - 1) {\n\t\t\tthis.pushUndoSnapshot();\n\t\t\tthis.recordKilledNewline(false);\n\t\t\tthis.mergeNextLineIntoCurrent();\n\t\t}\n\n\t\tthis.notifyChange();\n\t}\n\n\t[DELETE_WORD_BACKWARD](): void {\n\t\tthis.historyIndex = -1; // Exit history browsing mode\n\n\t\tconst currentLine = this.state.lines[this.state.cursorLine] || \"\";\n\n\t\t// If at start of line, behave like backspace at column 0 (merge with previous line)\n\t\tif (this.state.cursorCol === 0) {\n\t\t\tif (this.state.cursorLine > 0) {\n\t\t\t\tthis.pushUndoSnapshot();\n\t\t\t\tthis.recordKilledNewline(true);\n\t\t\t\tthis.mergeCurrentLineIntoPrevious();\n\t\t\t}\n\t\t} else {\n\t\t\tthis.pushUndoSnapshot();\n\n\t\t\t// Save lastAction before cursor movement (moveWordBackwards resets it)\n\t\t\tconst wasKill = this.lastAction === \"kill\";\n\n\t\t\tconst oldCursorCol = this.state.cursorCol;\n\t\t\tthis.moveWordBackwards();\n\t\t\tconst deleteFrom = this.state.cursorCol;\n\t\t\tthis.setCursorCol(oldCursorCol);\n\n\t\t\tconst deletedText = currentLine.slice(deleteFrom, this.state.cursorCol);\n\t\t\tif (!this.privateContent) {\n\t\t\t\tthis.killRing.push(deletedText, { prepend: true, accumulate: wasKill });\n\t\t\t\tthis.lastAction = \"kill\";\n\t\t\t}\n\n\t\t\tthis.state.lines[this.state.cursorLine] =\n\t\t\t\tcurrentLine.slice(0, deleteFrom) + currentLine.slice(this.state.cursorCol);\n\t\t\tthis.setCursorCol(deleteFrom);\n\t\t}\n\n\t\tthis.notifyChange();\n\t}\n\n\t[DELETE_WORD_FORWARD](): void {\n\t\tthis.historyIndex = -1; // Exit history browsing mode\n\n\t\tconst currentLine = this.state.lines[this.state.cursorLine] || \"\";\n\n\t\t// If at end of line, merge with next line (delete the newline)\n\t\tif (this.isAtCurrentLineEnd(currentLine)) {\n\t\t\tif (this.hasNextLine()) {\n\t\t\t\tthis.pushUndoSnapshot();\n\t\t\t\tthis.recordKilledNewline(false);\n\t\t\t\tthis.mergeNextLineIntoCurrent();\n\t\t\t}\n\t\t} else {\n\t\t\tthis.pushUndoSnapshot();\n\n\t\t\t// Save lastAction before cursor movement (moveWordForwards resets it)\n\t\t\tconst wasKill = this.lastAction === \"kill\";\n\n\t\t\tconst oldCursorCol = this.state.cursorCol;\n\t\t\tthis.moveWordForwards();\n\t\t\tconst deleteTo = this.state.cursorCol;\n\t\t\tthis.setCursorCol(oldCursorCol);\n\n\t\t\tconst deletedText = currentLine.slice(this.state.cursorCol, deleteTo);\n\t\t\tif (!this.privateContent) {\n\t\t\t\tthis.killRing.push(deletedText, { prepend: false, accumulate: wasKill });\n\t\t\t\tthis.lastAction = \"kill\";\n\t\t\t}\n\n\t\t\tthis.state.lines[this.state.cursorLine] =\n\t\t\t\tcurrentLine.slice(0, this.state.cursorCol) + currentLine.slice(deleteTo);\n\t\t}\n\n\t\tthis.notifyChange();\n\t}\n\n\t[DELETE_CHARACTER_FORWARD](): void {\n\t\tthis.historyIndex = -1; // Exit history browsing mode\n\t\tthis.lastAction = null;\n\n\t\tconst currentLine = this.state.lines[this.state.cursorLine] || \"\";\n\n\t\tif (this.state.cursorCol < currentLine.length) {\n\t\t\tthis.pushUndoSnapshot();\n\n\t\t\t// Delete grapheme at cursor position (handles emojis, combining characters, etc.)\n\t\t\tconst afterCursor = currentLine.slice(this.state.cursorCol);\n\n\t\t\t// Find the first grapheme at cursor\n\t\t\tconst graphemes = [...this.segment(afterCursor, \"grapheme\")];\n\t\t\tconst firstGrapheme = graphemes[0];\n\t\t\tconst graphemeLength = firstGrapheme ? firstGrapheme.segment.length : 1;\n\n\t\t\tconst before = currentLine.slice(0, this.state.cursorCol);\n\t\t\tconst after = currentLine.slice(this.state.cursorCol + graphemeLength);\n\t\t\tthis.state.lines[this.state.cursorLine] = before + after;\n\t\t} else if (this.state.cursorLine < this.state.lines.length - 1) {\n\t\t\tthis.pushUndoSnapshot();\n\t\t\tthis.mergeNextLineIntoCurrent();\n\t\t}\n\n\t\tthis.notifyChange();\n\n\t\tthis.refreshAutocompleteAfterDeletion();\n\t}\n\n\t/**\n\t * Build a mapping from visual lines to logical positions.\n\t * Returns an array where each element represents a visual line with:\n\t * - logicalLine: index into this.state.lines\n\t * - startCol: starting column in the logical line\n\t * - length: length of this visual line segment\n\t */\n\tprivate buildVisualLineMap(width: number): Array<{ logicalLine: number; startCol: number; length: number }> {\n\t\tconst visualLines: Array<{ logicalLine: number; startCol: number; length: number }> = [];\n\n\t\tfor (let i = 0; i < this.state.lines.length; i++) {\n\t\t\tconst line = this.state.lines[i] || \"\";\n\t\t\tconst lineVisWidth = visibleWidth(line);\n\t\t\tif (line.length === 0) {\n\t\t\t\t// Empty line still takes one visual line\n\t\t\t\tvisualLines.push({ logicalLine: i, startCol: 0, length: 0 });\n\t\t\t} else if (lineVisWidth <= width) {\n\t\t\t\tvisualLines.push({ logicalLine: i, startCol: 0, length: line.length });\n\t\t\t} else {\n\t\t\t\t// Line needs wrapping - use word-aware wrapping\n\t\t\t\tconst chunks = wordWrapLine(line, width, [...this.segment(line, \"grapheme\")]);\n\t\t\t\tfor (const chunk of chunks) {\n\t\t\t\t\tvisualLines.push({\n\t\t\t\t\t\tlogicalLine: i,\n\t\t\t\t\t\tstartCol: chunk.startIndex,\n\t\t\t\t\t\tlength: chunk.endIndex - chunk.startIndex,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn visualLines;\n\t}\n\n\t/**\n\t * Find the visual line index that contains the given logical position.\n\t */\n\tprivate findVisualLineAt(\n\t\tvisualLines: Array<{ logicalLine: number; startCol: number; length: number }>,\n\t\tline: number,\n\t\tcol: number,\n\t): number {\n\t\tfor (let i = 0; i < visualLines.length; i++) {\n\t\t\tconst vl = visualLines[i];\n\t\t\tif (!vl || vl.logicalLine !== line) continue;\n\t\t\tconst offset = col - vl.startCol;\n\t\t\t// Cursor is in this segment if it's within range. For the last\n\t\t\t// segment of a logical line, cursor can be at length (end position)\n\t\t\tconst isLastSegmentOfLine = i === visualLines.length - 1 || visualLines[i + 1]?.logicalLine !== vl.logicalLine;\n\t\t\tif (offset >= 0 && (offset < vl.length || (isLastSegmentOfLine && offset === vl.length))) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\t\treturn visualLines.length - 1;\n\t}\n\n\t/**\n\t * Find the visual line index for the current cursor position.\n\t */\n\tprivate findCurrentVisualLine(\n\t\tvisualLines: Array<{ logicalLine: number; startCol: number; length: number }>,\n\t): number {\n\t\treturn this.findVisualLineAt(visualLines, this.state.cursorLine, this.state.cursorCol);\n\t}\n\n\tprivate moveCursor(deltaLine: number, deltaCol: number): void {\n\t\tthis.lastAction = null;\n\t\tconst visualLines = this.buildVisualLineMap(this.lastWidth);\n\t\tconst currentVisualLine = this.findCurrentVisualLine(visualLines);\n\n\t\tif (deltaLine !== 0) {\n\t\t\tconst targetVisualLine = currentVisualLine + deltaLine;\n\n\t\t\tif (targetVisualLine >= 0 && targetVisualLine < visualLines.length) {\n\t\t\t\tthis.moveToVisualLine(visualLines, currentVisualLine, targetVisualLine);\n\t\t\t}\n\t\t}\n\n\t\tif (deltaCol !== 0) {\n\t\t\tconst currentLine = this.state.lines[this.state.cursorLine] || \"\";\n\n\t\t\tif (deltaCol > 0) {\n\t\t\t\t// Moving right - move by one grapheme (handles emojis, combining characters, etc.)\n\t\t\t\tif (this.state.cursorCol < currentLine.length) {\n\t\t\t\t\tconst afterCursor = currentLine.slice(this.state.cursorCol);\n\t\t\t\t\tconst graphemes = [...this.segment(afterCursor, \"grapheme\")];\n\t\t\t\t\tconst firstGrapheme = graphemes[0];\n\t\t\t\t\tthis.setCursorCol(this.state.cursorCol + (firstGrapheme ? firstGrapheme.segment.length : 1));\n\t\t\t\t} else if (this.state.cursorLine < this.state.lines.length - 1) {\n\t\t\t\t\t// Wrap to start of next logical line\n\t\t\t\t\tthis.state.cursorLine++;\n\t\t\t\t\tthis.setCursorCol(0);\n\t\t\t\t} else {\n\t\t\t\t\t// At end of last line - can't move, but set preferredVisualCol for up/down navigation\n\t\t\t\t\tconst currentVL = visualLines[currentVisualLine];\n\t\t\t\t\tif (currentVL) {\n\t\t\t\t\t\tthis.preferredVisualCol = this.state.cursorCol - currentVL.startCol;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Moving left - move by one grapheme (handles emojis, combining characters, etc.)\n\t\t\t\tif (this.state.cursorCol > 0) {\n\t\t\t\t\tconst beforeCursor = currentLine.slice(0, this.state.cursorCol);\n\t\t\t\t\tconst graphemes = [...this.segment(beforeCursor, \"grapheme\")];\n\t\t\t\t\tconst lastGrapheme = graphemes[graphemes.length - 1];\n\t\t\t\t\tthis.setCursorCol(this.state.cursorCol - (lastGrapheme ? lastGrapheme.segment.length : 1));\n\t\t\t\t} else if (this.state.cursorLine > 0) {\n\t\t\t\t\t// Wrap to end of previous logical line\n\t\t\t\t\tthis.state.cursorLine--;\n\t\t\t\t\tconst prevLine = this.state.lines[this.state.cursorLine] || \"\";\n\t\t\t\t\tthis.setCursorCol(prevLine.length);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Scroll by a page (direction: -1 for up, 1 for down).\n\t * Moves cursor by the page size while keeping it in bounds.\n\t */\n\tprivate pageScroll(direction: -1 | 1): void {\n\t\tthis.lastAction = null;\n\t\tconst terminalRows = this.tui.terminal.rows;\n\t\tconst pageSize = Math.max(5, Math.floor(terminalRows * 0.3));\n\n\t\tconst visualLines = this.buildVisualLineMap(this.lastWidth);\n\t\tconst currentVisualLine = this.findCurrentVisualLine(visualLines);\n\t\tconst targetVisualLine = Math.max(0, Math.min(visualLines.length - 1, currentVisualLine + direction * pageSize));\n\n\t\tthis.moveToVisualLine(visualLines, currentVisualLine, targetVisualLine);\n\t}\n\n\tprivate moveWordBackwards(): void {\n\t\tthis.lastAction = null;\n\t\tconst currentLine = this.state.lines[this.state.cursorLine] || \"\";\n\n\t\t// If at start of line, move to end of previous line\n\t\tif (this.state.cursorCol === 0) {\n\t\t\tif (this.state.cursorLine > 0) {\n\t\t\t\tthis.state.cursorLine--;\n\t\t\t\tconst prevLine = this.state.lines[this.state.cursorLine] || \"\";\n\t\t\t\tthis.setCursorCol(prevLine.length);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tthis.setCursorCol(\n\t\t\tfindWordBackward(currentLine, this.state.cursorCol, {\n\t\t\t\tsegment: (text) => this.segment(text, \"word\"),\n\t\t\t\tisAtomicSegment: isPasteMarker,\n\t\t\t}),\n\t\t);\n\t}\n\n\t/**\n\t * Yank (paste) the most recent kill ring entry at cursor position.\n\t */\n\tprivate yank(): void {\n\t\tif (this.killRing.length === 0) return;\n\n\t\tthis.pushUndoSnapshot();\n\n\t\tconst text = this.killRing.peek()!;\n\t\tthis.insertYankedText(text);\n\n\t\tthis.lastAction = \"yank\";\n\t}\n\n\t/**\n\t * Cycle through kill ring (only works immediately after yank or yank-pop).\n\t * Replaces the last yanked text with the previous entry in the ring.\n\t */\n\tprivate yankPop(): void {\n\t\t// Only works if we just yanked and have more than one entry\n\t\tif (this.lastAction !== \"yank\" || this.killRing.length <= 1) return;\n\n\t\tthis.pushUndoSnapshot();\n\n\t\t// Delete the previously yanked text (still at end of ring before rotation)\n\t\tthis.deleteYankedText();\n\n\t\t// Rotate the ring: move end to front\n\t\tthis.killRing.rotate();\n\n\t\t// Insert the new most recent entry (now at end after rotation)\n\t\tconst text = this.killRing.peek()!;\n\t\tthis.insertYankedText(text);\n\n\t\tthis.lastAction = \"yank\";\n\t}\n\n\t/**\n\t * Insert text at cursor position (used by yank operations).\n\t */\n\tprivate insertYankedText(text: string): void {\n\t\tthis.historyIndex = -1; // Exit history browsing mode\n\t\tthis.insertTextAtCursorInternal(text);\n\t}\n\n\t/**\n\t * Delete the previously yanked text (used by yank-pop).\n\t * The yanked text is derived from killRing[end] since it hasn't been rotated yet.\n\t */\n\tprivate deleteYankedText(): void {\n\t\tconst yankedText = this.killRing.peek();\n\t\tif (!yankedText) return;\n\n\t\tconst yankLines = yankedText.split(\"\\n\");\n\n\t\tif (yankLines.length === 1) {\n\t\t\t// Single line - delete backward from cursor\n\t\t\tconst currentLine = this.state.lines[this.state.cursorLine] || \"\";\n\t\t\tconst deleteLen = yankedText.length;\n\t\t\tconst before = currentLine.slice(0, this.state.cursorCol - deleteLen);\n\t\t\tconst after = currentLine.slice(this.state.cursorCol);\n\t\t\tthis.state.lines[this.state.cursorLine] = before + after;\n\t\t\tthis.setCursorCol(this.state.cursorCol - deleteLen);\n\t\t} else {\n\t\t\t// Multi-line delete - cursor is at end of last yanked line\n\t\t\tconst startLine = this.state.cursorLine - (yankLines.length - 1);\n\t\t\tconst startCol = (this.state.lines[startLine] || \"\").length - (yankLines[0] || \"\").length;\n\n\t\t\t// Get text after cursor on current line\n\t\t\tconst afterCursor = (this.state.lines[this.state.cursorLine] || \"\").slice(this.state.cursorCol);\n\n\t\t\t// Get text before yank start position\n\t\t\tconst beforeYank = (this.state.lines[startLine] || \"\").slice(0, startCol);\n\n\t\t\t// Remove all lines from startLine to cursorLine and replace with merged line\n\t\t\tthis.state.lines.splice(startLine, yankLines.length, beforeYank + afterCursor);\n\n\t\t\t// Update cursor\n\t\t\tthis.state.cursorLine = startLine;\n\t\t\tthis.setCursorCol(startCol);\n\t\t}\n\n\t\tthis.notifyChange();\n\t}\n\n\tprivate pushUndoSnapshot(): void {\n\t\tif (this.privateContent) return;\n\t\tthis.undoStack.push({ state: this.state, pastes: this.pastes, pasteCounter: this.pasteCounter });\n\t}\n\n\tprivate undo(): void {\n\t\tthis.historyIndex = -1; // Exit history browsing mode\n\t\tconst snapshot = this.undoStack.pop();\n\t\tif (!snapshot) return;\n\t\tObject.assign(this.state, snapshot.state);\n\t\tthis.pastes = snapshot.pastes;\n\t\tthis.pasteCounter = snapshot.pasteCounter;\n\t\tthis.lastAction = null;\n\t\tthis.preferredVisualCol = null;\n\t\tthis.notifyChange();\n\t}\n\n\t/**\n\t * Jump to the first occurrence of a character in the specified direction.\n\t * Multi-line search. Case-sensitive. Skips the current cursor position.\n\t */\n\tprivate jumpToChar(char: string, direction: \"forward\" | \"backward\"): void {\n\t\tthis.lastAction = null;\n\t\tconst isForward = direction === \"forward\";\n\t\tconst lines = this.state.lines;\n\n\t\tconst end = isForward ? lines.length : -1;\n\t\tconst step = isForward ? 1 : -1;\n\n\t\tfor (let lineIdx = this.state.cursorLine; lineIdx !== end; lineIdx += step) {\n\t\t\tconst line = lines[lineIdx] || \"\";\n\t\t\tconst isCurrentLine = lineIdx === this.state.cursorLine;\n\n\t\t\t// Current line: start after/before cursor; other lines: search full line\n\t\t\tconst searchFrom = isCurrentLine\n\t\t\t\t? isForward\n\t\t\t\t\t? this.state.cursorCol + 1\n\t\t\t\t\t: this.state.cursorCol - 1\n\t\t\t\t: undefined;\n\n\t\t\tconst idx = isForward ? line.indexOf(char, searchFrom) : line.lastIndexOf(char, searchFrom);\n\n\t\t\tif (idx !== -1) {\n\t\t\t\tthis.state.cursorLine = lineIdx;\n\t\t\t\tthis.setCursorCol(idx);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\t// No match found - cursor stays in place\n\t}\n\n\tprivate moveWordForwards(): void {\n\t\tthis.lastAction = null;\n\t\tconst currentLine = this.state.lines[this.state.cursorLine] || \"\";\n\n\t\t// If at end of line, move to start of next line\n\t\tif (this.isAtCurrentLineEnd(currentLine)) {\n\t\t\tif (this.hasNextLine()) {\n\t\t\t\tthis.state.cursorLine++;\n\t\t\t\tthis.setCursorCol(0);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tthis.setCursorCol(\n\t\t\tfindWordForward(currentLine, this.state.cursorCol, {\n\t\t\t\tsegment: (text) => this.segment(text, \"word\"),\n\t\t\t\tisAtomicSegment: isPasteMarker,\n\t\t\t}),\n\t\t);\n\t}\n\n\t// Slash menu only allowed on the first line of the editor\n\tprivate isSlashMenuAllowed(): boolean {\n\t\treturn this.state.cursorLine === 0;\n\t}\n\n\t// Helper method to check if cursor is at start of message (for slash command detection)\n\tprivate isAtStartOfMessage(): boolean {\n\t\tif (!this.isSlashMenuAllowed()) return false;\n\t\tconst currentLine = this.state.lines[this.state.cursorLine] || \"\";\n\t\tconst beforeCursor = currentLine.slice(0, this.state.cursorCol);\n\t\treturn beforeCursor.trim() === \"\" || beforeCursor.trim() === \"/\";\n\t}\n\n\tprivate isInSlashCommandContext(textBeforeCursor: string): boolean {\n\t\treturn this.isSlashMenuAllowed() && textBeforeCursor.trimStart().startsWith(\"/\");\n\t}\n\n\t// Autocomplete methods\n\t/**\n\t * Find the best autocomplete item index for the given prefix.\n\t * Returns -1 if no match is found.\n\t *\n\t * Match priority:\n\t * 1. Exact match (prefix === item.value) -> always selected\n\t * 2. Prefix match -> first item whose value starts with prefix\n\t * 3. No match -> -1 (keep default highlight)\n\t *\n\t * Matching is case-sensitive and checks item.value only.\n\t */\n\tprivate getBestAutocompleteMatchIndex(items: Array<{ value: string; label: string }>, prefix: string): number {\n\t\tif (!prefix) return -1;\n\n\t\tlet firstPrefixIndex = -1;\n\n\t\tfor (let i = 0; i < items.length; i++) {\n\t\t\tconst value = items[i]!.value;\n\t\t\tif (value === prefix) {\n\t\t\t\treturn i; // Exact match always wins\n\t\t\t}\n\t\t\tif (firstPrefixIndex === -1 && value.startsWith(prefix)) {\n\t\t\t\tfirstPrefixIndex = i;\n\t\t\t}\n\t\t}\n\n\t\treturn firstPrefixIndex;\n\t}\n\n\tprivate createAutocompleteList(\n\t\tprefix: string,\n\t\titems: Array<{ value: string; label: string; description?: string }>,\n\t): SelectList {\n\t\tconst layout = prefix.startsWith(\"/\") ? SLASH_COMMAND_SELECT_LIST_LAYOUT : undefined;\n\t\treturn new SelectList(items, this.autocompleteMaxVisible, this.theme.selectList, layout);\n\t}\n\n\tprivate tryTriggerAutocomplete(explicitTab: boolean = false): void {\n\t\tthis.requestAutocomplete({ force: false, explicitTab });\n\t}\n\n\tprivate handleTabCompletion(): void {\n\t\tif (!this.autocompleteProvider) return;\n\n\t\tconst currentLine = this.state.lines[this.state.cursorLine] || \"\";\n\t\tconst beforeCursor = currentLine.slice(0, this.state.cursorCol);\n\n\t\tif (this.isInSlashCommandContext(beforeCursor) && !beforeCursor.trimStart().includes(\" \")) {\n\t\t\tthis.handleSlashCommandCompletion();\n\t\t} else {\n\t\t\tthis.forceFileAutocomplete(true);\n\t\t}\n\t}\n\n\tprivate handleSlashCommandCompletion(): void {\n\t\tthis.requestAutocomplete({ force: false, explicitTab: true });\n\t}\n\n\tprivate forceFileAutocomplete(explicitTab: boolean = false): void {\n\t\tthis.requestAutocomplete({ force: true, explicitTab });\n\t}\n\n\tprivate requestAutocomplete(options: { force: boolean; explicitTab: boolean }): void {\n\t\tif (!this.autocompleteProvider) return;\n\n\t\tif (options.force) {\n\t\t\tconst shouldTrigger =\n\t\t\t\t!this.autocompleteProvider.shouldTriggerFileCompletion ||\n\t\t\t\tthis.autocompleteProvider.shouldTriggerFileCompletion(\n\t\t\t\t\tthis.state.lines,\n\t\t\t\t\tthis.state.cursorLine,\n\t\t\t\t\tthis.state.cursorCol,\n\t\t\t\t);\n\t\t\tif (!shouldTrigger) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tthis.cancelAutocompleteRequest();\n\t\tconst startToken = ++this.autocompleteStartToken;\n\n\t\tconst debounceMs = this.getAutocompleteDebounceMs(options);\n\t\tif (debounceMs > 0) {\n\t\t\tthis.autocompleteDebounceTimer = setTimeout(() => {\n\t\t\t\tthis.autocompleteDebounceTimer = undefined;\n\t\t\t\tvoid this.startAutocompleteRequest(startToken, options);\n\t\t\t}, debounceMs);\n\t\t\treturn;\n\t\t}\n\n\t\tvoid this.startAutocompleteRequest(startToken, options);\n\t}\n\n\tprivate async startAutocompleteRequest(\n\t\tstartToken: number,\n\t\toptions: { force: boolean; explicitTab: boolean },\n\t): Promise<void> {\n\t\tconst previousTask = this.autocompleteRequestTask;\n\t\tthis.autocompleteRequestTask = (async () => {\n\t\t\tawait previousTask;\n\t\t\tif (startToken !== this.autocompleteStartToken || !this.autocompleteProvider) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst controller = new AbortController();\n\t\t\tthis.autocompleteAbort = controller;\n\t\t\tconst requestId = ++this.autocompleteRequestId;\n\t\t\tconst snapshotText = this.getText();\n\t\t\tconst snapshotLine = this.state.cursorLine;\n\t\t\tconst snapshotCol = this.state.cursorCol;\n\n\t\t\tawait this.runAutocompleteRequest(requestId, controller, snapshotText, snapshotLine, snapshotCol, options);\n\t\t})();\n\t\tawait this.autocompleteRequestTask;\n\t}\n\n\tprivate getAutocompleteDebounceMs(options: { force: boolean; explicitTab: boolean }): number {\n\t\tif (options.explicitTab || options.force) {\n\t\t\treturn 0;\n\t\t}\n\n\t\tconst currentLine = this.state.lines[this.state.cursorLine] || \"\";\n\t\tconst textBeforeCursor = currentLine.slice(0, this.state.cursorCol);\n\t\tconst isSymbolAutocompleteContext = /(?:^|[ \\t])(?:@(?:\"[^\"]*|[^\\s]*)|#[^\\s]*)$/.test(textBeforeCursor);\n\t\treturn isSymbolAutocompleteContext ? ATTACHMENT_AUTOCOMPLETE_DEBOUNCE_MS : 0;\n\t}\n\n\tprivate async runAutocompleteRequest(\n\t\trequestId: number,\n\t\tcontroller: AbortController,\n\t\tsnapshotText: string,\n\t\tsnapshotLine: number,\n\t\tsnapshotCol: number,\n\t\toptions: { force: boolean; explicitTab: boolean },\n\t): Promise<void> {\n\t\tif (!this.autocompleteProvider) return;\n\n\t\tconst suggestions = await this.autocompleteProvider.getSuggestions(\n\t\t\tthis.state.lines,\n\t\t\tthis.state.cursorLine,\n\t\t\tthis.state.cursorCol,\n\t\t\t{ signal: controller.signal, force: options.force },\n\t\t);\n\n\t\tif (!this.isAutocompleteRequestCurrent(requestId, controller, snapshotText, snapshotLine, snapshotCol)) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.autocompleteAbort = undefined;\n\n\t\tif (!suggestions || !Array.isArray(suggestions.items) || suggestions.items.length === 0) {\n\t\t\tthis.cancelAutocomplete();\n\t\t\tthis.tui.requestRender();\n\t\t\treturn;\n\t\t}\n\n\t\tif (options.force && options.explicitTab && suggestions.items.length === 1) {\n\t\t\tconst item = suggestions.items[0]!;\n\t\t\tthis.pushUndoSnapshot();\n\t\t\tthis.lastAction = null;\n\t\t\tconst result = this.autocompleteProvider.applyCompletion(\n\t\t\t\tthis.state.lines,\n\t\t\t\tthis.state.cursorLine,\n\t\t\t\tthis.state.cursorCol,\n\t\t\t\titem,\n\t\t\t\tsuggestions.prefix,\n\t\t\t);\n\t\t\tthis.state.lines = result.lines;\n\t\t\tthis.state.cursorLine = result.cursorLine;\n\t\t\tthis.setCursorCol(result.cursorCol);\n\t\t\tthis.notifyChange();\n\t\t\tthis.tui.requestRender();\n\t\t\treturn;\n\t\t}\n\n\t\tthis.applyAutocompleteSuggestions(suggestions, options.force ? \"force\" : \"regular\");\n\t\tthis.tui.requestRender();\n\t}\n\n\tprivate isAutocompleteRequestCurrent(\n\t\trequestId: number,\n\t\tcontroller: AbortController,\n\t\tsnapshotText: string,\n\t\tsnapshotLine: number,\n\t\tsnapshotCol: number,\n\t): boolean {\n\t\treturn (\n\t\t\t!controller.signal.aborted &&\n\t\t\trequestId === this.autocompleteRequestId &&\n\t\t\tthis.getText() === snapshotText &&\n\t\t\tthis.state.cursorLine === snapshotLine &&\n\t\t\tthis.state.cursorCol === snapshotCol\n\t\t);\n\t}\n\n\tprivate applyAutocompleteSuggestions(suggestions: AutocompleteSuggestions, state: \"regular\" | \"force\"): void {\n\t\tthis.autocompletePrefix = suggestions.prefix;\n\t\tthis.autocompleteList = this.createAutocompleteList(suggestions.prefix, suggestions.items);\n\n\t\tconst bestMatchIndex = this.getBestAutocompleteMatchIndex(suggestions.items, suggestions.prefix);\n\t\tif (bestMatchIndex >= 0) {\n\t\t\tthis.autocompleteList.setSelectedIndex(bestMatchIndex);\n\t\t}\n\n\t\tthis.autocompleteState = state;\n\t}\n\n\tprivate cancelAutocompleteRequest(): void {\n\t\tthis.autocompleteStartToken += 1;\n\t\tif (this.autocompleteDebounceTimer) {\n\t\t\tclearTimeout(this.autocompleteDebounceTimer);\n\t\t\tthis.autocompleteDebounceTimer = undefined;\n\t\t}\n\t\tthis.autocompleteAbort?.abort();\n\t\tthis.autocompleteAbort = undefined;\n\t}\n\n\tprivate clearAutocompleteUi(): void {\n\t\tthis.autocompleteState = null;\n\t\tthis.autocompleteList = undefined;\n\t\tthis.autocompletePrefix = \"\";\n\t}\n\n\tprivate cancelAutocomplete(): void {\n\t\tthis.cancelAutocompleteRequest();\n\t\tthis.clearAutocompleteUi();\n\t}\n\n\tpublic isShowingAutocomplete(): boolean {\n\t\treturn this.autocompleteState !== null;\n\t}\n\n\tprivate updateAutocomplete(): void {\n\t\tif (!this.autocompleteState || !this.autocompleteProvider) return;\n\t\tthis.requestAutocomplete({ force: this.autocompleteState === \"force\", explicitTab: false });\n\t}\n}\n"]}
|
package/package.json
CHANGED