openhorse 0.2.2 → 0.2.3
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.
- package/README.md +23 -0
- package/dist/cli.js +163 -22
- package/dist/cli.js.map +1 -1
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +82 -2
- package/dist/commands/index.js.map +1 -1
- package/dist/framework/prompt.d.ts +4 -0
- package/dist/framework/prompt.d.ts.map +1 -1
- package/dist/framework/prompt.js +18 -0
- package/dist/framework/prompt.js.map +1 -1
- package/dist/framework/query.d.ts +7 -0
- package/dist/framework/query.d.ts.map +1 -1
- package/dist/framework/query.js +14 -0
- package/dist/framework/query.js.map +1 -1
- package/dist/framework/store.d.ts +3 -1
- package/dist/framework/store.d.ts.map +1 -1
- package/dist/framework/store.js +1 -0
- package/dist/framework/store.js.map +1 -1
- package/dist/ink-ui/App.d.ts +4 -1
- package/dist/ink-ui/App.d.ts.map +1 -1
- package/dist/ink-ui/App.js +2 -2
- package/dist/ink-ui/App.js.map +1 -1
- package/dist/ink-ui/components/NativeCursor.d.ts +12 -0
- package/dist/ink-ui/components/NativeCursor.d.ts.map +1 -0
- package/dist/ink-ui/components/NativeCursor.js +35 -0
- package/dist/ink-ui/components/NativeCursor.js.map +1 -0
- package/dist/ink-ui/components/PromptInput.d.ts +5 -1
- package/dist/ink-ui/components/PromptInput.d.ts.map +1 -1
- package/dist/ink-ui/components/PromptInput.js +10 -6
- package/dist/ink-ui/components/PromptInput.js.map +1 -1
- package/dist/ink-ui/components/RunningHorseIndicator.d.ts +1 -1
- package/dist/ink-ui/components/RunningHorseIndicator.d.ts.map +1 -1
- package/dist/ink-ui/components/RunningHorseIndicator.js +3 -41
- package/dist/ink-ui/components/RunningHorseIndicator.js.map +1 -1
- package/dist/ink-ui/components/SelectList.d.ts +2 -1
- package/dist/ink-ui/components/SelectList.d.ts.map +1 -1
- package/dist/ink-ui/components/SelectList.js +26 -11
- package/dist/ink-ui/components/SelectList.js.map +1 -1
- package/dist/ink-ui/components/StatusLine.d.ts.map +1 -1
- package/dist/ink-ui/components/StatusLine.js +22 -31
- package/dist/ink-ui/components/StatusLine.js.map +1 -1
- package/dist/ink-ui/components/TerminalCursor.d.ts +4 -2
- package/dist/ink-ui/components/TerminalCursor.d.ts.map +1 -1
- package/dist/ink-ui/components/TerminalCursor.js +18 -43
- package/dist/ink-ui/components/TerminalCursor.js.map +1 -1
- package/dist/ink-ui/components/ToolActivity.d.ts +17 -0
- package/dist/ink-ui/components/ToolActivity.d.ts.map +1 -0
- package/dist/ink-ui/components/ToolActivity.js +107 -0
- package/dist/ink-ui/components/ToolActivity.js.map +1 -0
- package/dist/ink-ui/components/Transcript.d.ts +7 -1
- package/dist/ink-ui/components/Transcript.d.ts.map +1 -1
- package/dist/ink-ui/components/Transcript.js +40 -3
- package/dist/ink-ui/components/Transcript.js.map +1 -1
- package/dist/ink-ui/controllers/chat-controller.d.ts +1 -33
- package/dist/ink-ui/controllers/chat-controller.d.ts.map +1 -1
- package/dist/ink-ui/controllers/chat-controller.js +15 -437
- package/dist/ink-ui/controllers/chat-controller.js.map +1 -1
- package/dist/ink-ui/hooks/use-raw-input-bridge.d.ts +6 -0
- package/dist/ink-ui/hooks/use-raw-input-bridge.d.ts.map +1 -0
- package/dist/ink-ui/hooks/use-raw-input-bridge.js +27 -0
- package/dist/ink-ui/hooks/use-raw-input-bridge.js.map +1 -0
- package/dist/ink-ui/hooks/use-terminal-size.d.ts +7 -0
- package/dist/ink-ui/hooks/use-terminal-size.d.ts.map +1 -0
- package/dist/ink-ui/hooks/use-terminal-size.js +34 -0
- package/dist/ink-ui/hooks/use-terminal-size.js.map +1 -0
- package/dist/ink-ui/launch.d.ts +6 -0
- package/dist/ink-ui/launch.d.ts.map +1 -1
- package/dist/ink-ui/launch.js +60 -2
- package/dist/ink-ui/launch.js.map +1 -1
- package/dist/ink-ui/runtime/grapheme.d.ts +9 -0
- package/dist/ink-ui/runtime/grapheme.d.ts.map +1 -0
- package/dist/ink-ui/runtime/grapheme.js +63 -0
- package/dist/ink-ui/runtime/grapheme.js.map +1 -0
- package/dist/ink-ui/runtime/input-buffer.d.ts +32 -0
- package/dist/ink-ui/runtime/input-buffer.d.ts.map +1 -0
- package/dist/ink-ui/runtime/input-buffer.js +165 -0
- package/dist/ink-ui/runtime/input-buffer.js.map +1 -0
- package/dist/ink-ui/runtime/layout-budget.d.ts +13 -0
- package/dist/ink-ui/runtime/layout-budget.d.ts.map +1 -0
- package/dist/ink-ui/runtime/layout-budget.js +25 -0
- package/dist/ink-ui/runtime/layout-budget.js.map +1 -0
- package/dist/ink-ui/runtime/native-cursor.d.ts +62 -0
- package/dist/ink-ui/runtime/native-cursor.d.ts.map +1 -0
- package/dist/ink-ui/runtime/native-cursor.js +423 -0
- package/dist/ink-ui/runtime/native-cursor.js.map +1 -0
- package/dist/ink-ui/runtime/prompt-layout.d.ts +20 -1
- package/dist/ink-ui/runtime/prompt-layout.d.ts.map +1 -1
- package/dist/ink-ui/runtime/prompt-layout.js +129 -11
- package/dist/ink-ui/runtime/prompt-layout.js.map +1 -1
- package/dist/ink-ui/runtime/raw-input.d.ts +4 -0
- package/dist/ink-ui/runtime/raw-input.d.ts.map +1 -0
- package/dist/ink-ui/runtime/raw-input.js +15 -0
- package/dist/ink-ui/runtime/raw-input.js.map +1 -0
- package/dist/ink-ui/runtime/stdout.d.ts +11 -0
- package/dist/ink-ui/runtime/stdout.d.ts.map +1 -0
- package/dist/ink-ui/runtime/stdout.js +82 -0
- package/dist/ink-ui/runtime/stdout.js.map +1 -0
- package/dist/ink-ui/runtime/transcript-state.d.ts +37 -0
- package/dist/ink-ui/runtime/transcript-state.d.ts.map +1 -0
- package/dist/ink-ui/runtime/transcript-state.js +89 -0
- package/dist/ink-ui/runtime/transcript-state.js.map +1 -0
- package/dist/ink-ui/screens/ReplScreen.d.ts +8 -2
- package/dist/ink-ui/screens/ReplScreen.d.ts.map +1 -1
- package/dist/ink-ui/screens/ReplScreen.js +247 -151
- package/dist/ink-ui/screens/ReplScreen.js.map +1 -1
- package/dist/ink-ui/types.d.ts +1 -42
- package/dist/ink-ui/types.d.ts.map +1 -1
- package/dist/ink-ui/types.js +15 -0
- package/dist/ink-ui/types.js.map +1 -1
- package/dist/print-ui/launch.d.ts +8 -0
- package/dist/print-ui/launch.d.ts.map +1 -0
- package/dist/print-ui/launch.js +205 -0
- package/dist/print-ui/launch.js.map +1 -0
- package/dist/runtime/agent-runtime-controller.d.ts +69 -0
- package/dist/runtime/agent-runtime-controller.d.ts.map +1 -0
- package/dist/runtime/agent-runtime-controller.js +225 -0
- package/dist/runtime/agent-runtime-controller.js.map +1 -0
- package/dist/runtime/agent-runtime-protocol.d.ts +90 -0
- package/dist/runtime/agent-runtime-protocol.d.ts.map +1 -0
- package/dist/runtime/agent-runtime-protocol.js +80 -0
- package/dist/runtime/agent-runtime-protocol.js.map +1 -0
- package/dist/runtime/chat-controller.d.ts +41 -0
- package/dist/runtime/chat-controller.d.ts.map +1 -0
- package/dist/runtime/chat-controller.js +577 -0
- package/dist/runtime/chat-controller.js.map +1 -0
- package/dist/runtime/ui-events.d.ts +59 -0
- package/dist/runtime/ui-events.d.ts.map +1 -0
- package/dist/runtime/ui-events.js +3 -0
- package/dist/runtime/ui-events.js.map +1 -0
- package/dist/services/commit-plan.d.ts +17 -0
- package/dist/services/commit-plan.d.ts.map +1 -0
- package/dist/services/commit-plan.js +161 -0
- package/dist/services/commit-plan.js.map +1 -0
- package/dist/services/config.d.ts +3 -2
- package/dist/services/config.d.ts.map +1 -1
- package/dist/services/config.js +7 -6
- package/dist/services/config.js.map +1 -1
- package/dist/services/doctor.d.ts +33 -0
- package/dist/services/doctor.d.ts.map +1 -0
- package/dist/services/doctor.js +211 -0
- package/dist/services/doctor.js.map +1 -0
- package/dist/services/file-context.d.ts +21 -0
- package/dist/services/file-context.d.ts.map +1 -0
- package/dist/services/file-context.js +194 -0
- package/dist/services/file-context.js.map +1 -0
- package/dist/services/global-config.d.ts +1 -1
- package/dist/services/global-config.d.ts.map +1 -1
- package/dist/services/project-instructions.d.ts +16 -0
- package/dist/services/project-instructions.d.ts.map +1 -0
- package/dist/services/project-instructions.js +135 -0
- package/dist/services/project-instructions.js.map +1 -0
- package/dist/services/prompt-context.d.ts +3 -0
- package/dist/services/prompt-context.d.ts.map +1 -0
- package/dist/services/prompt-context.js +13 -0
- package/dist/services/prompt-context.js.map +1 -0
- package/dist/services/session-storage.d.ts +3 -0
- package/dist/services/session-storage.d.ts.map +1 -1
- package/dist/services/session-storage.js +11 -0
- package/dist/services/session-storage.js.map +1 -1
- package/dist/services/workspace-diff.d.ts +27 -0
- package/dist/services/workspace-diff.d.ts.map +1 -0
- package/dist/services/workspace-diff.js +129 -0
- package/dist/services/workspace-diff.js.map +1 -0
- package/dist/terminal-ui/completion.d.ts +6 -0
- package/dist/terminal-ui/completion.d.ts.map +1 -0
- package/dist/terminal-ui/completion.js +80 -0
- package/dist/terminal-ui/completion.js.map +1 -0
- package/dist/terminal-ui/editor.d.ts +17 -0
- package/dist/terminal-ui/editor.d.ts.map +1 -0
- package/dist/terminal-ui/editor.js +42 -0
- package/dist/terminal-ui/editor.js.map +1 -0
- package/dist/terminal-ui/launch.d.ts +23 -0
- package/dist/terminal-ui/launch.d.ts.map +1 -0
- package/dist/terminal-ui/launch.js +567 -0
- package/dist/terminal-ui/launch.js.map +1 -0
- package/dist/terminal-ui/raw-editor.d.ts +57 -0
- package/dist/terminal-ui/raw-editor.d.ts.map +1 -0
- package/dist/terminal-ui/raw-editor.js +339 -0
- package/dist/terminal-ui/raw-editor.js.map +1 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +61 -19
- package/dist/tools/index.js.map +1 -1
- package/dist/tui-core/frame.d.ts +25 -0
- package/dist/tui-core/frame.d.ts.map +1 -0
- package/dist/tui-core/frame.js +104 -0
- package/dist/tui-core/frame.js.map +1 -0
- package/dist/tui-core/input-parser.d.ts +25 -0
- package/dist/tui-core/input-parser.d.ts.map +1 -0
- package/dist/tui-core/input-parser.js +207 -0
- package/dist/tui-core/input-parser.js.map +1 -0
- package/dist/tui-core/terminal-writer.d.ts +34 -0
- package/dist/tui-core/terminal-writer.d.ts.map +1 -0
- package/dist/tui-core/terminal-writer.js +92 -0
- package/dist/tui-core/terminal-writer.js.map +1 -0
- package/dist/tui-ui/launch.d.ts +7 -0
- package/dist/tui-ui/launch.d.ts.map +1 -0
- package/dist/tui-ui/launch.js +194 -0
- package/dist/tui-ui/launch.js.map +1 -0
- package/dist/tui-ui/layout.d.ts +9 -0
- package/dist/tui-ui/layout.d.ts.map +1 -0
- package/dist/tui-ui/layout.js +239 -0
- package/dist/tui-ui/layout.js.map +1 -0
- package/dist/tui-ui/pickers.d.ts +13 -0
- package/dist/tui-ui/pickers.d.ts.map +1 -0
- package/dist/tui-ui/pickers.js +79 -0
- package/dist/tui-ui/pickers.js.map +1 -0
- package/dist/tui-ui/runner.d.ts +43 -0
- package/dist/tui-ui/runner.d.ts.map +1 -0
- package/dist/tui-ui/runner.js +387 -0
- package/dist/tui-ui/runner.js.map +1 -0
- package/dist/tui-ui/state.d.ts +106 -0
- package/dist/tui-ui/state.d.ts.map +1 -0
- package/dist/tui-ui/state.js +202 -0
- package/dist/tui-ui/state.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,423 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.NativeCursorController = void 0;
|
|
7
|
+
exports.nativeCursorUnparkSequence = nativeCursorUnparkSequence;
|
|
8
|
+
exports.nativeCursorParkSequence = nativeCursorParkSequence;
|
|
9
|
+
exports.nativeCursorAbsoluteMoveSequence = nativeCursorAbsoluteMoveSequence;
|
|
10
|
+
exports.nativeCursorAbsoluteParkSequence = nativeCursorAbsoluteParkSequence;
|
|
11
|
+
exports.nativeCursorMoveSequence = nativeCursorMoveSequence;
|
|
12
|
+
exports.createNativeCursorController = createNativeCursorController;
|
|
13
|
+
exports.nativeCursorAnchorFromNode = nativeCursorAnchorFromNode;
|
|
14
|
+
exports.applyTerminalOutputToCursor = applyTerminalOutputToCursor;
|
|
15
|
+
const string_width_1 = __importDefault(require("string-width"));
|
|
16
|
+
const grapheme_1 = require("./grapheme");
|
|
17
|
+
function nativeCursorUnparkSequence(rowsUp) {
|
|
18
|
+
return nativeCursorMoveSequence({ row: -Math.max(1, rowsUp), column: 0 }, { row: 0, column: 0 });
|
|
19
|
+
}
|
|
20
|
+
function nativeCursorParkSequence(state) {
|
|
21
|
+
const rowsUp = Math.max(1, state.rowsUp);
|
|
22
|
+
const column = Math.max(1, state.column);
|
|
23
|
+
return `\x1b[?25h${nativeCursorMoveSequence({ row: 0, column: 0 }, { row: -rowsUp, column: column - 1 })}`;
|
|
24
|
+
}
|
|
25
|
+
function nativeCursorAbsoluteMoveSequence(to) {
|
|
26
|
+
const row = Math.max(0, Math.floor(to.row));
|
|
27
|
+
const column = Math.max(0, Math.floor(to.column));
|
|
28
|
+
return `\x1b[${row + 1};${column + 1}H`;
|
|
29
|
+
}
|
|
30
|
+
function nativeCursorAbsoluteParkSequence(to) {
|
|
31
|
+
return `\x1b[?25h${nativeCursorAbsoluteMoveSequence(to)}`;
|
|
32
|
+
}
|
|
33
|
+
function nativeCursorMoveSequence(from, to) {
|
|
34
|
+
const rowDelta = to.row - from.row;
|
|
35
|
+
let sequence = '';
|
|
36
|
+
if (rowDelta < 0) {
|
|
37
|
+
sequence += `\x1b[${Math.abs(rowDelta)}A`;
|
|
38
|
+
}
|
|
39
|
+
else if (rowDelta > 0) {
|
|
40
|
+
sequence += `\x1b[${rowDelta}B`;
|
|
41
|
+
}
|
|
42
|
+
if (rowDelta !== 0 || from.column !== to.column) {
|
|
43
|
+
sequence += '\r';
|
|
44
|
+
if (to.column > 0) {
|
|
45
|
+
sequence += `\x1b[${to.column + 1}G`;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return sequence;
|
|
49
|
+
}
|
|
50
|
+
class NativeCursorController {
|
|
51
|
+
constructor(output) {
|
|
52
|
+
this.output = output;
|
|
53
|
+
this.cursorState = {
|
|
54
|
+
enabled: false,
|
|
55
|
+
column: 5,
|
|
56
|
+
rowsUp: 2,
|
|
57
|
+
};
|
|
58
|
+
this.cursorParked = false;
|
|
59
|
+
this.parkedState = null;
|
|
60
|
+
this.frameCursor = { row: 0, column: 0 };
|
|
61
|
+
this.physicalCursor = { row: 0, column: 0 };
|
|
62
|
+
this.restoreScheduled = false;
|
|
63
|
+
this.promptTopRow = null;
|
|
64
|
+
this.observedLines = new Map();
|
|
65
|
+
this.parkedWithAbsoluteTarget = false;
|
|
66
|
+
this.restoreGeneration = 0;
|
|
67
|
+
}
|
|
68
|
+
wrapStdout() {
|
|
69
|
+
return new Proxy(this.output, {
|
|
70
|
+
get: (target, property, receiver) => {
|
|
71
|
+
if (property === 'write') {
|
|
72
|
+
return (...args) => {
|
|
73
|
+
this.unpark(target);
|
|
74
|
+
const result = target.write(...args);
|
|
75
|
+
const observation = observeTerminalOutput(this.physicalCursor, args[0], target.columns || this.output.columns || 80, target.rows || this.output.rows || 24, this.observedLines);
|
|
76
|
+
this.physicalCursor = observation.cursor;
|
|
77
|
+
if (observation.promptTopRow !== null) {
|
|
78
|
+
this.promptTopRow = observation.promptTopRow;
|
|
79
|
+
}
|
|
80
|
+
this.frameCursor = { ...this.physicalCursor };
|
|
81
|
+
// Keep the native cursor synchronized with the rendered frame.
|
|
82
|
+
// Once a prompt frame has been observed, even later control-only
|
|
83
|
+
// chunks such as cursor-hide must re-park immediately so IME
|
|
84
|
+
// composition has no visible window to attach to the frame tail.
|
|
85
|
+
// Before the first prompt is seen, coalesce partial Ink writes.
|
|
86
|
+
if (this.promptTopRow !== null) {
|
|
87
|
+
this.restore();
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
this.scheduleRestore();
|
|
91
|
+
}
|
|
92
|
+
return result;
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
const value = Reflect.get(target, property, receiver);
|
|
96
|
+
if (typeof value === 'function') {
|
|
97
|
+
return value.bind(target);
|
|
98
|
+
}
|
|
99
|
+
return value;
|
|
100
|
+
},
|
|
101
|
+
set(target, property, value, receiver) {
|
|
102
|
+
return Reflect.set(target, property, value, receiver);
|
|
103
|
+
},
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
setState(state) {
|
|
107
|
+
this.cursorState = state;
|
|
108
|
+
}
|
|
109
|
+
restore() {
|
|
110
|
+
if (!this.cursorState.enabled || this.output.isTTY === false) {
|
|
111
|
+
this.unpark();
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
if (this.cursorParked && this.parkedState && nativeCursorStateEquals(this.parkedState, this.cursorState)) {
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
this.unpark();
|
|
118
|
+
this.park();
|
|
119
|
+
}
|
|
120
|
+
disable() {
|
|
121
|
+
this.cursorState = { ...this.cursorState, enabled: false };
|
|
122
|
+
this.unpark();
|
|
123
|
+
}
|
|
124
|
+
resetForViewportClear() {
|
|
125
|
+
this.restoreGeneration += 1;
|
|
126
|
+
this.cursorParked = false;
|
|
127
|
+
this.parkedState = null;
|
|
128
|
+
this.frameCursor = { row: 0, column: 0 };
|
|
129
|
+
this.physicalCursor = { row: 0, column: 0 };
|
|
130
|
+
this.restoreScheduled = false;
|
|
131
|
+
this.promptTopRow = null;
|
|
132
|
+
this.observedLines.clear();
|
|
133
|
+
this.parkedWithAbsoluteTarget = false;
|
|
134
|
+
}
|
|
135
|
+
unpark(output = this.output) {
|
|
136
|
+
if (!this.cursorParked || output.isTTY === false) {
|
|
137
|
+
this.cursorParked = false;
|
|
138
|
+
this.parkedState = null;
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
const sequence = this.parkedWithAbsoluteTarget
|
|
142
|
+
? nativeCursorAbsoluteMoveSequence(this.frameCursor)
|
|
143
|
+
: nativeCursorMoveSequence(this.physicalCursor, this.frameCursor);
|
|
144
|
+
output.write(sequence);
|
|
145
|
+
this.physicalCursor = applyTerminalOutputToCursor(this.physicalCursor, sequence, output.columns || this.output.columns || 80, output.rows || this.output.rows || 24);
|
|
146
|
+
this.cursorParked = false;
|
|
147
|
+
this.parkedWithAbsoluteTarget = false;
|
|
148
|
+
this.parkedState = null;
|
|
149
|
+
}
|
|
150
|
+
park(output = this.output) {
|
|
151
|
+
if (!this.cursorState.enabled || output.isTTY === false) {
|
|
152
|
+
this.cursorParked = false;
|
|
153
|
+
this.parkedState = null;
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
const target = this.cursorTargetFromFrame(this.cursorState);
|
|
157
|
+
const sequence = target.absolute
|
|
158
|
+
? nativeCursorAbsoluteParkSequence(target.position)
|
|
159
|
+
: `\x1b[?25h${nativeCursorMoveSequence(this.physicalCursor, target.position)}`;
|
|
160
|
+
output.write(sequence);
|
|
161
|
+
this.physicalCursor = applyTerminalOutputToCursor(this.physicalCursor, sequence, output.columns || this.output.columns || 80, output.rows || this.output.rows || 24);
|
|
162
|
+
this.parkedState = { ...this.cursorState };
|
|
163
|
+
this.cursorParked = true;
|
|
164
|
+
this.parkedWithAbsoluteTarget = target.absolute;
|
|
165
|
+
}
|
|
166
|
+
cursorTargetFromFrame(state) {
|
|
167
|
+
if (state.absolute && this.promptTopRow !== null) {
|
|
168
|
+
return {
|
|
169
|
+
position: {
|
|
170
|
+
row: this.promptTopRow + 1 + Math.max(0, state.cursorLineIndex ?? 0),
|
|
171
|
+
column: Math.max(1, state.column) - 1,
|
|
172
|
+
},
|
|
173
|
+
absolute: true,
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
if (state.absolute && Number.isFinite(state.row)) {
|
|
177
|
+
return {
|
|
178
|
+
position: {
|
|
179
|
+
row: Math.max(0, Math.floor(state.row ?? 0)),
|
|
180
|
+
column: Math.max(1, state.column) - 1,
|
|
181
|
+
},
|
|
182
|
+
absolute: true,
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
return {
|
|
186
|
+
position: {
|
|
187
|
+
row: this.frameCursor.row - Math.max(1, state.rowsUp),
|
|
188
|
+
column: Math.max(1, state.column) - 1,
|
|
189
|
+
},
|
|
190
|
+
absolute: false,
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
scheduleRestore() {
|
|
194
|
+
if (this.restoreScheduled)
|
|
195
|
+
return;
|
|
196
|
+
this.restoreScheduled = true;
|
|
197
|
+
const generation = this.restoreGeneration;
|
|
198
|
+
queueMicrotask(() => {
|
|
199
|
+
if (generation !== this.restoreGeneration)
|
|
200
|
+
return;
|
|
201
|
+
this.restoreScheduled = false;
|
|
202
|
+
this.restore();
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
exports.NativeCursorController = NativeCursorController;
|
|
207
|
+
function createNativeCursorController(output) {
|
|
208
|
+
return new NativeCursorController(output);
|
|
209
|
+
}
|
|
210
|
+
function nativeCursorStateEquals(left, right) {
|
|
211
|
+
return left.enabled === right.enabled
|
|
212
|
+
&& left.column === right.column
|
|
213
|
+
&& left.rowsUp === right.rowsUp
|
|
214
|
+
&& (left.cursorLineIndex ?? 0) === (right.cursorLineIndex ?? 0)
|
|
215
|
+
&& (left.row ?? null) === (right.row ?? null)
|
|
216
|
+
&& (left.absolute ?? false) === (right.absolute ?? false);
|
|
217
|
+
}
|
|
218
|
+
function nativeCursorAnchorFromNode(node, options) {
|
|
219
|
+
if (!node?.yogaNode)
|
|
220
|
+
return null;
|
|
221
|
+
let current = node;
|
|
222
|
+
let left = 0;
|
|
223
|
+
let top = 0;
|
|
224
|
+
let rootHeight = 0;
|
|
225
|
+
while (current?.yogaNode) {
|
|
226
|
+
left += current.yogaNode.getComputedLeft?.() ?? 0;
|
|
227
|
+
top += current.yogaNode.getComputedTop?.() ?? 0;
|
|
228
|
+
rootHeight = current.yogaNode.getComputedHeight?.() ?? rootHeight;
|
|
229
|
+
current = current.parentNode;
|
|
230
|
+
}
|
|
231
|
+
if (!rootHeight)
|
|
232
|
+
return null;
|
|
233
|
+
// The prompt box has a top border. The first rendered input row starts one
|
|
234
|
+
// row below that border, and cursorLineIndex is relative to the visible input
|
|
235
|
+
// rows inside the box.
|
|
236
|
+
const targetRow = top + 1 + options.cursorLineIndex;
|
|
237
|
+
return {
|
|
238
|
+
column: Math.max(1, Math.round(left + options.cursorColumn)),
|
|
239
|
+
row: Math.max(0, Math.round(targetRow)),
|
|
240
|
+
// Official Ink writes the dynamic frame and leaves the terminal cursor on
|
|
241
|
+
// the line after the frame. Move back from that render baseline to the
|
|
242
|
+
// declared input row, matching OpenClaude's renderer-owned declaration
|
|
243
|
+
// model as closely as possible without forking Ink yet.
|
|
244
|
+
rowsUp: Math.max(1, Math.round(rootHeight - targetRow)),
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
function applyTerminalOutputToCursor(position, chunk, columns, rows = Number.MAX_SAFE_INTEGER) {
|
|
248
|
+
return observeTerminalOutput(position, chunk, columns, rows).cursor;
|
|
249
|
+
}
|
|
250
|
+
function observeTerminalOutput(position, chunk, columns, rows = Number.MAX_SAFE_INTEGER, lineBuffers = new Map()) {
|
|
251
|
+
const text = Buffer.isBuffer(chunk) ? chunk.toString('utf8') : String(chunk ?? '');
|
|
252
|
+
const cursor = { ...position };
|
|
253
|
+
const width = Math.max(1, columns || 80);
|
|
254
|
+
const graphemes = (0, grapheme_1.segmentGraphemes)(text);
|
|
255
|
+
let graphemeIndex = 0;
|
|
256
|
+
let promptTopRow = null;
|
|
257
|
+
for (let index = 0; index < text.length;) {
|
|
258
|
+
const char = text[index];
|
|
259
|
+
if (char === '\x1b') {
|
|
260
|
+
index = consumeEscapeForObservation(text, index, cursor, width, rows, lineBuffers);
|
|
261
|
+
continue;
|
|
262
|
+
}
|
|
263
|
+
if (char === '\r') {
|
|
264
|
+
cursor.column = 0;
|
|
265
|
+
index += 1;
|
|
266
|
+
continue;
|
|
267
|
+
}
|
|
268
|
+
if (char === '\n') {
|
|
269
|
+
cursor.row = clampCursorRow(cursor.row + 1, rows);
|
|
270
|
+
index += 1;
|
|
271
|
+
continue;
|
|
272
|
+
}
|
|
273
|
+
if (char === '\b') {
|
|
274
|
+
cursor.column = Math.max(0, cursor.column - 1);
|
|
275
|
+
index += 1;
|
|
276
|
+
continue;
|
|
277
|
+
}
|
|
278
|
+
while (graphemeIndex < graphemes.length && graphemes[graphemeIndex].index < index) {
|
|
279
|
+
graphemeIndex += 1;
|
|
280
|
+
}
|
|
281
|
+
const grapheme = graphemes[graphemeIndex];
|
|
282
|
+
if (!grapheme || grapheme.index !== index) {
|
|
283
|
+
const codePoint = text.codePointAt(index);
|
|
284
|
+
if (codePoint === undefined)
|
|
285
|
+
break;
|
|
286
|
+
const printable = String.fromCodePoint(codePoint);
|
|
287
|
+
index += printable.length;
|
|
288
|
+
continue;
|
|
289
|
+
}
|
|
290
|
+
const firstCodePoint = grapheme.segment.codePointAt(0);
|
|
291
|
+
if (firstCodePoint !== undefined && firstCodePoint >= 32) {
|
|
292
|
+
const line = `${lineBuffers.get(cursor.row) ?? ''}${grapheme.segment}`;
|
|
293
|
+
lineBuffers.set(cursor.row, line);
|
|
294
|
+
const trimmed = line.trimEnd();
|
|
295
|
+
if (isPromptTopBorderText(trimmed)) {
|
|
296
|
+
promptTopRow = cursor.row;
|
|
297
|
+
}
|
|
298
|
+
cursor.column += Math.max(0, (0, string_width_1.default)(grapheme.segment));
|
|
299
|
+
if (cursor.column >= width) {
|
|
300
|
+
cursor.column = width - 1;
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
index += grapheme.segment.length;
|
|
304
|
+
graphemeIndex += 1;
|
|
305
|
+
}
|
|
306
|
+
return { cursor, promptTopRow };
|
|
307
|
+
}
|
|
308
|
+
function consumeEscapeForCursor(text, index, cursor, columns) {
|
|
309
|
+
if (index + 1 >= text.length)
|
|
310
|
+
return index + 1;
|
|
311
|
+
const marker = text[index + 1];
|
|
312
|
+
if (marker === '[') {
|
|
313
|
+
let end = index + 2;
|
|
314
|
+
while (end < text.length && !('@' <= text[end] && text[end] <= '~')) {
|
|
315
|
+
end += 1;
|
|
316
|
+
}
|
|
317
|
+
if (end >= text.length)
|
|
318
|
+
return text.length;
|
|
319
|
+
applyCsiToCursor(text.slice(index + 2, end), text[end], cursor, columns);
|
|
320
|
+
return end + 1;
|
|
321
|
+
}
|
|
322
|
+
if (marker === ']') {
|
|
323
|
+
const endBel = text.indexOf('\x07', index + 2);
|
|
324
|
+
const endSt = text.indexOf('\x1b\\', index + 2);
|
|
325
|
+
const candidates = [endBel, endSt].filter(position => position >= 0);
|
|
326
|
+
if (candidates.length === 0)
|
|
327
|
+
return text.length;
|
|
328
|
+
const end = Math.min(...candidates);
|
|
329
|
+
return end + (end === endSt ? 2 : 1);
|
|
330
|
+
}
|
|
331
|
+
return Math.min(text.length, index + 2);
|
|
332
|
+
}
|
|
333
|
+
function consumeEscapeForObservation(text, index, cursor, columns, rows, lineBuffers) {
|
|
334
|
+
if (index + 1 >= text.length)
|
|
335
|
+
return index + 1;
|
|
336
|
+
const marker = text[index + 1];
|
|
337
|
+
if (marker === '[') {
|
|
338
|
+
let end = index + 2;
|
|
339
|
+
while (end < text.length && !('@' <= text[end] && text[end] <= '~')) {
|
|
340
|
+
end += 1;
|
|
341
|
+
}
|
|
342
|
+
if (end >= text.length)
|
|
343
|
+
return text.length;
|
|
344
|
+
const params = text.slice(index + 2, end);
|
|
345
|
+
const final = text[end];
|
|
346
|
+
applyCsiToCursor(params, final, cursor, columns, rows);
|
|
347
|
+
applyCsiToObservedLines(params, final, cursor, lineBuffers);
|
|
348
|
+
return end + 1;
|
|
349
|
+
}
|
|
350
|
+
if (marker === ']') {
|
|
351
|
+
const endBel = text.indexOf('\x07', index + 2);
|
|
352
|
+
const endSt = text.indexOf('\x1b\\', index + 2);
|
|
353
|
+
const candidates = [endBel, endSt].filter(position => position >= 0);
|
|
354
|
+
if (candidates.length === 0)
|
|
355
|
+
return text.length;
|
|
356
|
+
const end = Math.min(...candidates);
|
|
357
|
+
return end + (end === endSt ? 2 : 1);
|
|
358
|
+
}
|
|
359
|
+
return Math.min(text.length, index + 2);
|
|
360
|
+
}
|
|
361
|
+
function applyCsiToObservedLines(params, final, cursor, lineBuffers) {
|
|
362
|
+
const clean = params.replace(/^[?=>]*/, '');
|
|
363
|
+
const parts = clean
|
|
364
|
+
.split(';')
|
|
365
|
+
.filter(part => part !== '')
|
|
366
|
+
.map(part => (/^\d+$/.test(part) ? Number(part) : 0));
|
|
367
|
+
const first = parts[0] ?? 0;
|
|
368
|
+
if (final === 'K') {
|
|
369
|
+
lineBuffers.set(cursor.row, '');
|
|
370
|
+
return;
|
|
371
|
+
}
|
|
372
|
+
if (final === 'J' && first !== 1) {
|
|
373
|
+
lineBuffers.clear();
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
function isPromptTopBorderText(line) {
|
|
377
|
+
return line.startsWith('┌') && line.endsWith('┐') && line.includes('─');
|
|
378
|
+
}
|
|
379
|
+
function applyCsiToCursor(params, final, cursor, columns, rows = Number.MAX_SAFE_INTEGER) {
|
|
380
|
+
const clean = params.replace(/^[?=>]*/, '');
|
|
381
|
+
const parts = clean
|
|
382
|
+
.split(';')
|
|
383
|
+
.filter(part => part !== '')
|
|
384
|
+
.map(part => (/^\d+$/.test(part) ? Number(part) : 0));
|
|
385
|
+
const first = parts[0] ?? 0;
|
|
386
|
+
const count = first || 1;
|
|
387
|
+
switch (final) {
|
|
388
|
+
case 'A':
|
|
389
|
+
cursor.row = clampCursorRow(cursor.row - count, rows);
|
|
390
|
+
break;
|
|
391
|
+
case 'B':
|
|
392
|
+
cursor.row = clampCursorRow(cursor.row + count, rows);
|
|
393
|
+
break;
|
|
394
|
+
case 'C':
|
|
395
|
+
cursor.column = Math.min(columns - 1, cursor.column + count);
|
|
396
|
+
break;
|
|
397
|
+
case 'D':
|
|
398
|
+
cursor.column = Math.max(0, cursor.column - count);
|
|
399
|
+
break;
|
|
400
|
+
case 'E':
|
|
401
|
+
cursor.row = clampCursorRow(cursor.row + count, rows);
|
|
402
|
+
cursor.column = 0;
|
|
403
|
+
break;
|
|
404
|
+
case 'F':
|
|
405
|
+
cursor.row = clampCursorRow(cursor.row - count, rows);
|
|
406
|
+
cursor.column = 0;
|
|
407
|
+
break;
|
|
408
|
+
case 'G':
|
|
409
|
+
cursor.column = Math.min(columns - 1, Math.max(0, count - 1));
|
|
410
|
+
break;
|
|
411
|
+
case 'H':
|
|
412
|
+
case 'f':
|
|
413
|
+
cursor.row = clampCursorRow((parts[0] || 1) - 1, rows);
|
|
414
|
+
cursor.column = Math.min(columns - 1, Math.max(0, (parts[1] || 1) - 1));
|
|
415
|
+
break;
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
function clampCursorRow(row, rows) {
|
|
419
|
+
if (!Number.isFinite(rows) || rows <= 0)
|
|
420
|
+
return Math.max(0, row);
|
|
421
|
+
return Math.min(rows - 1, Math.max(0, row));
|
|
422
|
+
}
|
|
423
|
+
//# sourceMappingURL=native-cursor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"native-cursor.js","sourceRoot":"","sources":["../../../src/ink-ui/runtime/native-cursor.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,10 +2,29 @@ export interface PromptVisualLine {
|
|
|
2
2
|
logicalIndex: number;
|
|
3
3
|
wrapIndex: number;
|
|
4
4
|
content: string;
|
|
5
|
+
start: number;
|
|
6
|
+
end: number;
|
|
5
7
|
}
|
|
8
|
+
export interface PromptInputViewport {
|
|
9
|
+
lines: PromptVisualLine[];
|
|
10
|
+
hiddenRows: number;
|
|
11
|
+
showHiddenIndicator: boolean;
|
|
12
|
+
cursorLineIndex: number;
|
|
13
|
+
cursorColumn: number;
|
|
14
|
+
rowsUpFromPromptBottom: number;
|
|
15
|
+
}
|
|
16
|
+
export declare const PROMPT_CURSOR_GLYPH = "\u258C";
|
|
6
17
|
export declare function promptContentWidth(width: number): number;
|
|
7
18
|
export declare function promptTextWidth(width: number): number;
|
|
8
19
|
export declare function splitByVisualWidth(text: string, maxWidth: number): string[];
|
|
9
20
|
export declare function getPromptVisualLines(value: string, width: number): PromptVisualLine[];
|
|
10
|
-
export declare function
|
|
21
|
+
export declare function getVisiblePromptVisualLines(value: string, width: number, maxRows: number): {
|
|
22
|
+
lines: PromptVisualLine[];
|
|
23
|
+
hiddenRows: number;
|
|
24
|
+
};
|
|
25
|
+
export declare function getPromptInputViewport(value: string, width: number, maxRows: number, cursor?: number): PromptInputViewport;
|
|
26
|
+
export declare function formatPromptVisualLine(visualLine: PromptVisualLine, width: number, options?: {
|
|
27
|
+
showCursor?: boolean;
|
|
28
|
+
cursorOffset?: number;
|
|
29
|
+
}): string;
|
|
11
30
|
//# sourceMappingURL=prompt-layout.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompt-layout.d.ts","sourceRoot":"","sources":["../../../src/ink-ui/runtime/prompt-layout.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"prompt-layout.d.ts","sourceRoot":"","sources":["../../../src/ink-ui/runtime/prompt-layout.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb;AAOD,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,sBAAsB,EAAE,MAAM,CAAC;CAChC;AAED,eAAO,MAAM,mBAAmB,WAAM,CAAC;AAEvC,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAExD;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAErD;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAkB3E;AAyBD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,gBAAgB,EAAE,CAErF;AAED,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,GACd;IAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAYnD;AAED,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,MAAM,GAAE,MAAqB,GAC5B,mBAAmB,CA6BrB;AA+DD,wBAAgB,sBAAsB,CACpC,UAAU,EAAE,gBAAgB,EAC5B,KAAK,EAAE,MAAM,EACb,OAAO,GAAE;IAAE,UAAU,CAAC,EAAE,OAAO,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAO,GAC5D,MAAM,CAoBR"}
|
|
@@ -3,12 +3,17 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.PROMPT_CURSOR_GLYPH = void 0;
|
|
6
7
|
exports.promptContentWidth = promptContentWidth;
|
|
7
8
|
exports.promptTextWidth = promptTextWidth;
|
|
8
9
|
exports.splitByVisualWidth = splitByVisualWidth;
|
|
9
10
|
exports.getPromptVisualLines = getPromptVisualLines;
|
|
11
|
+
exports.getVisiblePromptVisualLines = getVisiblePromptVisualLines;
|
|
12
|
+
exports.getPromptInputViewport = getPromptInputViewport;
|
|
10
13
|
exports.formatPromptVisualLine = formatPromptVisualLine;
|
|
11
14
|
const string_width_1 = __importDefault(require("string-width"));
|
|
15
|
+
const grapheme_1 = require("./grapheme");
|
|
16
|
+
exports.PROMPT_CURSOR_GLYPH = '▌';
|
|
12
17
|
function promptContentWidth(width) {
|
|
13
18
|
return Math.max(1, width - 4);
|
|
14
19
|
}
|
|
@@ -20,11 +25,11 @@ function splitByVisualWidth(text, maxWidth) {
|
|
|
20
25
|
return [''];
|
|
21
26
|
const chunks = [];
|
|
22
27
|
let current = '';
|
|
23
|
-
for (const
|
|
24
|
-
const next = `${current}${
|
|
28
|
+
for (const part of (0, grapheme_1.segmentGraphemes)(text)) {
|
|
29
|
+
const next = `${current}${part.segment}`;
|
|
25
30
|
if (current && (0, string_width_1.default)(next) > maxWidth) {
|
|
26
31
|
chunks.push(current);
|
|
27
|
-
current =
|
|
32
|
+
current = part.segment;
|
|
28
33
|
}
|
|
29
34
|
else {
|
|
30
35
|
current = next;
|
|
@@ -33,18 +38,131 @@ function splitByVisualWidth(text, maxWidth) {
|
|
|
33
38
|
chunks.push(current);
|
|
34
39
|
return chunks;
|
|
35
40
|
}
|
|
41
|
+
function splitByVisualWidthWithOffsets(text, maxWidth) {
|
|
42
|
+
if (text.length === 0)
|
|
43
|
+
return [{ content: '', start: 0, end: 0 }];
|
|
44
|
+
const chunks = [];
|
|
45
|
+
let current = '';
|
|
46
|
+
let currentStart = 0;
|
|
47
|
+
for (const part of (0, grapheme_1.segmentGraphemes)(text)) {
|
|
48
|
+
const next = `${current}${part.segment}`;
|
|
49
|
+
const nextOffset = part.index + part.segment.length;
|
|
50
|
+
if (current && (0, string_width_1.default)(next) > maxWidth) {
|
|
51
|
+
chunks.push({ content: current, start: currentStart, end: part.index });
|
|
52
|
+
current = part.segment;
|
|
53
|
+
currentStart = part.index;
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
current = next;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
chunks.push({ content: current, start: currentStart, end: text.length });
|
|
60
|
+
return chunks;
|
|
61
|
+
}
|
|
36
62
|
function getPromptVisualLines(value, width) {
|
|
37
|
-
|
|
63
|
+
return buildPromptVisualLines(value, width).lines;
|
|
64
|
+
}
|
|
65
|
+
function getVisiblePromptVisualLines(value, width, maxRows) {
|
|
66
|
+
const lines = getPromptVisualLines(value, width);
|
|
67
|
+
const rowLimit = Math.max(1, maxRows);
|
|
68
|
+
if (lines.length <= rowLimit) {
|
|
69
|
+
return { lines, hiddenRows: 0 };
|
|
70
|
+
}
|
|
71
|
+
return {
|
|
72
|
+
lines: lines.slice(-rowLimit),
|
|
73
|
+
hiddenRows: lines.length - rowLimit,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
function getPromptInputViewport(value, width, maxRows, cursor = value.length) {
|
|
77
|
+
const layout = buildPromptVisualLines(value, width, cursor);
|
|
78
|
+
const allLines = layout.lines;
|
|
79
|
+
const rowLimit = Math.max(1, maxRows);
|
|
80
|
+
const showHiddenIndicator = allLines.length > rowLimit && rowLimit > 1;
|
|
81
|
+
const visibleInputRows = showHiddenIndicator ? rowLimit - 1 : rowLimit;
|
|
82
|
+
const start = allLines.length <= visibleInputRows
|
|
83
|
+
? 0
|
|
84
|
+
: Math.min(Math.max(0, layout.cursorLineIndex - visibleInputRows + 1), allLines.length - visibleInputRows);
|
|
85
|
+
const lines = allLines.slice(start, start + visibleInputRows);
|
|
86
|
+
const indicatorRows = showHiddenIndicator ? 1 : 0;
|
|
87
|
+
const cursorLineIndex = indicatorRows + Math.max(0, layout.cursorLineIndex - start);
|
|
88
|
+
const contentRows = indicatorRows + lines.length;
|
|
89
|
+
return {
|
|
90
|
+
lines,
|
|
91
|
+
hiddenRows: allLines.length - lines.length,
|
|
92
|
+
showHiddenIndicator,
|
|
93
|
+
cursorLineIndex,
|
|
94
|
+
cursorColumn: layout.cursorColumn,
|
|
95
|
+
// Ink leaves the terminal cursor after the prompt box has been rendered,
|
|
96
|
+
// below the bottom border. Native IME candidate windows follow that real
|
|
97
|
+
// terminal cursor, so include the bottom border row when parking it on the
|
|
98
|
+
// active input text row.
|
|
99
|
+
rowsUpFromPromptBottom: Math.max(1, contentRows - cursorLineIndex + 1),
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
function buildPromptVisualLines(value, width, cursor = value.length) {
|
|
103
|
+
const logicalLines = value.length > 0 ? value.split('\n') : [''];
|
|
38
104
|
const maxTextWidth = promptTextWidth(width);
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
105
|
+
const clampedCursor = Math.min(Math.max(0, cursor), value.length);
|
|
106
|
+
const visualLines = [];
|
|
107
|
+
let cursorLineIndex = 0;
|
|
108
|
+
let cursorColumn = 5;
|
|
109
|
+
let lineStart = 0;
|
|
110
|
+
logicalLines.forEach((line, logicalIndex) => {
|
|
111
|
+
const chunks = splitByVisualWidthWithOffsets(line, maxTextWidth);
|
|
112
|
+
const lineEnd = lineStart + line.length;
|
|
113
|
+
const cursorInThisLine = clampedCursor >= lineStart && clampedCursor <= lineEnd;
|
|
114
|
+
chunks.forEach((chunk, wrapIndex) => {
|
|
115
|
+
const visualLine = {
|
|
116
|
+
logicalIndex,
|
|
117
|
+
wrapIndex,
|
|
118
|
+
content: chunk.content,
|
|
119
|
+
start: lineStart + chunk.start,
|
|
120
|
+
end: lineStart + chunk.end,
|
|
121
|
+
chunkStart: chunk.start,
|
|
122
|
+
chunkEnd: chunk.end,
|
|
123
|
+
};
|
|
124
|
+
if (cursorInThisLine && clampedCursor - lineStart >= chunk.start && clampedCursor - lineStart <= chunk.end) {
|
|
125
|
+
cursorLineIndex = visualLines.length;
|
|
126
|
+
const cursorInChunk = Math.max(0, clampedCursor - lineStart - chunk.start);
|
|
127
|
+
cursorColumn = 5 + (0, string_width_1.default)(chunk.content.slice(0, cursorInChunk));
|
|
128
|
+
}
|
|
129
|
+
visualLines.push(visualLine);
|
|
130
|
+
});
|
|
131
|
+
lineStart = lineEnd + 1;
|
|
132
|
+
});
|
|
133
|
+
return {
|
|
134
|
+
lines: visualLines,
|
|
135
|
+
cursorLineIndex,
|
|
136
|
+
cursorColumn,
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
function takeVisualWidth(text, maxWidth) {
|
|
140
|
+
if (maxWidth <= 0)
|
|
141
|
+
return '';
|
|
142
|
+
let result = '';
|
|
143
|
+
for (const part of (0, grapheme_1.segmentGraphemes)(text)) {
|
|
144
|
+
const next = `${result}${part.segment}`;
|
|
145
|
+
if ((0, string_width_1.default)(next) > maxWidth)
|
|
146
|
+
break;
|
|
147
|
+
result = next;
|
|
148
|
+
}
|
|
149
|
+
return result;
|
|
44
150
|
}
|
|
45
|
-
function formatPromptVisualLine(visualLine, width) {
|
|
151
|
+
function formatPromptVisualLine(visualLine, width, options = {}) {
|
|
46
152
|
const prefix = visualLine.logicalIndex === 0 && visualLine.wrapIndex === 0 ? '› ' : ' ';
|
|
47
|
-
const
|
|
153
|
+
const maxContentWidth = Math.max(1, promptContentWidth(width) - (0, string_width_1.default)(prefix));
|
|
154
|
+
let content = visualLine.content;
|
|
155
|
+
if (options.showCursor) {
|
|
156
|
+
const requestedOffset = Math.min(Math.max(0, options.cursorOffset ?? content.length), content.length);
|
|
157
|
+
const offset = (0, grapheme_1.floorGraphemeBoundary)(content, requestedOffset);
|
|
158
|
+
const before = content.slice(0, offset);
|
|
159
|
+
const after = content.slice(offset);
|
|
160
|
+
const beforeWithCursor = `${before}${exports.PROMPT_CURSOR_GLYPH}`;
|
|
161
|
+
content = (0, string_width_1.default)(beforeWithCursor) >= maxContentWidth
|
|
162
|
+
? `${takeVisualWidth(before, maxContentWidth - (0, string_width_1.default)(exports.PROMPT_CURSOR_GLYPH))}${exports.PROMPT_CURSOR_GLYPH}`
|
|
163
|
+
: `${beforeWithCursor}${takeVisualWidth(after, maxContentWidth - (0, string_width_1.default)(beforeWithCursor))}`;
|
|
164
|
+
}
|
|
165
|
+
const raw = `${prefix}${content}`;
|
|
48
166
|
const padding = Math.max(0, promptContentWidth(width) - (0, string_width_1.default)(raw));
|
|
49
167
|
return raw + ' '.repeat(padding);
|
|
50
168
|
}
|