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
package/dist/ink-ui/launch.js
CHANGED
|
@@ -3,12 +3,70 @@ 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.prepareInkStdin = prepareInkStdin;
|
|
6
7
|
exports.launchInkUI = launchInkUI;
|
|
7
8
|
const react_1 = __importDefault(require("react"));
|
|
8
9
|
const ink_1 = require("ink");
|
|
9
10
|
const App_1 = require("./App");
|
|
11
|
+
const native_cursor_1 = require("./runtime/native-cursor");
|
|
12
|
+
function prepareInkStdin(stdin = process.stdin) {
|
|
13
|
+
if (!stdin.isTTY || typeof stdin.setRawMode !== 'function') {
|
|
14
|
+
return () => undefined;
|
|
15
|
+
}
|
|
16
|
+
const wasRaw = stdin.isRaw === true;
|
|
17
|
+
stdin.setEncoding('utf8');
|
|
18
|
+
stdin.resume();
|
|
19
|
+
stdin.setRawMode(true);
|
|
20
|
+
return () => {
|
|
21
|
+
if (!stdin.isTTY || typeof stdin.setRawMode !== 'function')
|
|
22
|
+
return;
|
|
23
|
+
stdin.setRawMode(wasRaw);
|
|
24
|
+
if (wasRaw)
|
|
25
|
+
stdin.resume();
|
|
26
|
+
};
|
|
27
|
+
}
|
|
10
28
|
async function launchInkUI(runtime) {
|
|
11
|
-
const
|
|
12
|
-
|
|
29
|
+
const restoreStdin = prepareInkStdin(process.stdin);
|
|
30
|
+
const cursorController = (0, native_cursor_1.createNativeCursorController)(process.stdout);
|
|
31
|
+
let resizeEpoch = 0;
|
|
32
|
+
let resizeTimer;
|
|
33
|
+
const viewportReset = '\x1b[2J\x1b[H';
|
|
34
|
+
const app = () => react_1.default.createElement(App_1.App, { runtime: runtime, cursorController: cursorController, resizeEpoch: resizeEpoch });
|
|
35
|
+
const instance = (0, ink_1.render)(app(), {
|
|
36
|
+
exitOnCtrlC: false,
|
|
37
|
+
stdout: cursorController.wrapStdout(),
|
|
38
|
+
});
|
|
39
|
+
const handleResize = () => {
|
|
40
|
+
resizeEpoch += 1;
|
|
41
|
+
if (resizeTimer)
|
|
42
|
+
clearTimeout(resizeTimer);
|
|
43
|
+
cursorController.resetForViewportClear();
|
|
44
|
+
instance.clear();
|
|
45
|
+
if (process.stdout.isTTY) {
|
|
46
|
+
process.stdout.write(viewportReset);
|
|
47
|
+
}
|
|
48
|
+
cursorController.resetForViewportClear();
|
|
49
|
+
resizeTimer = setTimeout(() => {
|
|
50
|
+
cursorController.resetForViewportClear();
|
|
51
|
+
instance.rerender(app());
|
|
52
|
+
}, 16);
|
|
53
|
+
};
|
|
54
|
+
if (typeof process.stdout.prependListener === 'function') {
|
|
55
|
+
process.stdout.prependListener('resize', handleResize);
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
process.stdout.on?.('resize', handleResize);
|
|
59
|
+
}
|
|
60
|
+
try {
|
|
61
|
+
await instance.waitUntilExit();
|
|
62
|
+
}
|
|
63
|
+
finally {
|
|
64
|
+
process.stdout.off?.('resize', handleResize);
|
|
65
|
+
if (resizeTimer)
|
|
66
|
+
clearTimeout(resizeTimer);
|
|
67
|
+
cursorController.disable();
|
|
68
|
+
instance.clear();
|
|
69
|
+
restoreStdin();
|
|
70
|
+
}
|
|
13
71
|
}
|
|
14
72
|
//# sourceMappingURL=launch.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"launch.js","sourceRoot":"","sources":["../../src/ink-ui/launch.tsx"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"launch.js","sourceRoot":"","sources":["../../src/ink-ui/launch.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export interface GraphemeSegment {
|
|
2
|
+
segment: string;
|
|
3
|
+
index: number;
|
|
4
|
+
}
|
|
5
|
+
export declare function segmentGraphemes(value: string): GraphemeSegment[];
|
|
6
|
+
export declare function previousGraphemeBoundary(value: string, cursor: number): number;
|
|
7
|
+
export declare function nextGraphemeBoundary(value: string, cursor: number): number;
|
|
8
|
+
export declare function floorGraphemeBoundary(value: string, cursor: number): number;
|
|
9
|
+
//# sourceMappingURL=grapheme.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grapheme.d.ts","sourceRoot":"","sources":["../../../src/ink-ui/runtime/grapheme.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AASD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,eAAe,EAAE,CAoBjE;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAU9E;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAU1E;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAa3E"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.segmentGraphemes = segmentGraphemes;
|
|
4
|
+
exports.previousGraphemeBoundary = previousGraphemeBoundary;
|
|
5
|
+
exports.nextGraphemeBoundary = nextGraphemeBoundary;
|
|
6
|
+
exports.floorGraphemeBoundary = floorGraphemeBoundary;
|
|
7
|
+
function segmentGraphemes(value) {
|
|
8
|
+
const SegmenterCtor = Intl.Segmenter;
|
|
9
|
+
if (typeof SegmenterCtor === 'function') {
|
|
10
|
+
try {
|
|
11
|
+
return Array.from(new SegmenterCtor(undefined, { granularity: 'grapheme' }).segment(value));
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
// Fall back to code point segmentation below.
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
const segments = [];
|
|
18
|
+
for (let index = 0; index < value.length;) {
|
|
19
|
+
const codePoint = value.codePointAt(index);
|
|
20
|
+
const segment = codePoint === undefined ? '' : String.fromCodePoint(codePoint);
|
|
21
|
+
if (!segment)
|
|
22
|
+
break;
|
|
23
|
+
segments.push({ segment, index });
|
|
24
|
+
index += segment.length;
|
|
25
|
+
}
|
|
26
|
+
return segments;
|
|
27
|
+
}
|
|
28
|
+
function previousGraphemeBoundary(value, cursor) {
|
|
29
|
+
const current = Math.min(Math.max(0, Math.floor(cursor)), value.length);
|
|
30
|
+
let previous = 0;
|
|
31
|
+
for (const part of segmentGraphemes(value)) {
|
|
32
|
+
if (part.index >= current)
|
|
33
|
+
break;
|
|
34
|
+
previous = part.index;
|
|
35
|
+
}
|
|
36
|
+
return previous;
|
|
37
|
+
}
|
|
38
|
+
function nextGraphemeBoundary(value, cursor) {
|
|
39
|
+
const current = Math.min(Math.max(0, Math.floor(cursor)), value.length);
|
|
40
|
+
if (current >= value.length)
|
|
41
|
+
return value.length;
|
|
42
|
+
for (const part of segmentGraphemes(value)) {
|
|
43
|
+
const end = part.index + part.segment.length;
|
|
44
|
+
if (end > current)
|
|
45
|
+
return end;
|
|
46
|
+
}
|
|
47
|
+
return value.length;
|
|
48
|
+
}
|
|
49
|
+
function floorGraphemeBoundary(value, cursor) {
|
|
50
|
+
const current = Math.min(Math.max(0, Math.floor(cursor)), value.length);
|
|
51
|
+
if (current >= value.length)
|
|
52
|
+
return value.length;
|
|
53
|
+
for (const part of segmentGraphemes(value)) {
|
|
54
|
+
const end = part.index + part.segment.length;
|
|
55
|
+
if (current < part.index)
|
|
56
|
+
break;
|
|
57
|
+
if (current <= end) {
|
|
58
|
+
return current === end ? end : part.index;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return value.length;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=grapheme.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grapheme.js","sourceRoot":"","sources":["../../../src/ink-ui/runtime/grapheme.ts"],"names":[],"mappings":";;AAYA,4CAoBC;AAED,4DAUC;AAED,oDAUC;AAED,sDAaC;AA3DD,SAAgB,gBAAgB,CAAC,KAAa;IAC5C,MAAM,aAAa,GAAI,IAAiD,CAAC,SAAS,CAAC;IAEnF,IAAI,OAAO,aAAa,KAAK,UAAU,EAAE,CAAC;QACxC,IAAI,CAAC;YACH,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,aAAa,CAAC,SAAS,EAAE,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;QAC9F,CAAC;QAAC,MAAM,CAAC;YACP,8CAA8C;QAChD,CAAC;IACH,CAAC;IAED,MAAM,QAAQ,GAAsB,EAAE,CAAC;IACvC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC;QAC1C,MAAM,SAAS,GAAG,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QAC3C,MAAM,OAAO,GAAG,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;QAC/E,IAAI,CAAC,OAAO;YAAE,MAAM;QACpB,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QAClC,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;IAC1B,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAgB,wBAAwB,CAAC,KAAa,EAAE,MAAc;IACpE,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACxE,IAAI,QAAQ,GAAG,CAAC,CAAC;IAEjB,KAAK,MAAM,IAAI,IAAI,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3C,IAAI,IAAI,CAAC,KAAK,IAAI,OAAO;YAAE,MAAM;QACjC,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC;IACxB,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAgB,oBAAoB,CAAC,KAAa,EAAE,MAAc;IAChE,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACxE,IAAI,OAAO,IAAI,KAAK,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC,MAAM,CAAC;IAEjD,KAAK,MAAM,IAAI,IAAI,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;QAC7C,IAAI,GAAG,GAAG,OAAO;YAAE,OAAO,GAAG,CAAC;IAChC,CAAC;IAED,OAAO,KAAK,CAAC,MAAM,CAAC;AACtB,CAAC;AAED,SAAgB,qBAAqB,CAAC,KAAa,EAAE,MAAc;IACjE,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACxE,IAAI,OAAO,IAAI,KAAK,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC,MAAM,CAAC;IAEjD,KAAK,MAAM,IAAI,IAAI,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;QAC7C,IAAI,OAAO,GAAG,IAAI,CAAC,KAAK;YAAE,MAAM;QAChC,IAAI,OAAO,IAAI,GAAG,EAAE,CAAC;YACnB,OAAO,OAAO,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;QAC5C,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,MAAM,CAAC;AACtB,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export interface InputBuffer {
|
|
2
|
+
value: string;
|
|
3
|
+
cursor: number;
|
|
4
|
+
}
|
|
5
|
+
export type InputBufferAction = {
|
|
6
|
+
type: 'insert';
|
|
7
|
+
text: string;
|
|
8
|
+
} | {
|
|
9
|
+
type: 'inputChunk';
|
|
10
|
+
text: string;
|
|
11
|
+
} | {
|
|
12
|
+
type: 'backspace';
|
|
13
|
+
} | {
|
|
14
|
+
type: 'delete';
|
|
15
|
+
} | {
|
|
16
|
+
type: 'move';
|
|
17
|
+
direction: 'left' | 'right' | 'home' | 'end';
|
|
18
|
+
} | {
|
|
19
|
+
type: 'set';
|
|
20
|
+
value: string;
|
|
21
|
+
cursor?: number;
|
|
22
|
+
} | {
|
|
23
|
+
type: 'clear';
|
|
24
|
+
};
|
|
25
|
+
export declare const initialInputBuffer: InputBuffer;
|
|
26
|
+
export declare function reduceInputBuffer(state: InputBuffer, action: InputBufferAction): InputBuffer;
|
|
27
|
+
export declare function reduceInputChunk(state: InputBuffer, text: string): InputBuffer;
|
|
28
|
+
export declare function clampInputCursor(value: string, cursor: number): number;
|
|
29
|
+
export declare function moveInputCursor(value: string, cursor: number, direction: Extract<InputBufferAction, {
|
|
30
|
+
type: 'move';
|
|
31
|
+
}>['direction']): number;
|
|
32
|
+
//# sourceMappingURL=input-buffer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input-buffer.d.ts","sourceRoot":"","sources":["../../../src/ink-ui/runtime/input-buffer.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,iBAAiB,GACzB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACpC;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,GACrB;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAClB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,KAAK,CAAA;CAAE,GAC9D;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAC/C;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC;AAEtB,eAAO,MAAM,kBAAkB,EAAE,WAGhC,CAAC;AAEF,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,iBAAiB,GAAG,WAAW,CAoD5F;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,GAAG,WAAW,CAwF9E;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAGtE;AAED,wBAAgB,eAAe,CAC7B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,OAAO,CAAC,iBAAiB,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,WAAW,CAAC,GACnE,MAAM,CAaR"}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.initialInputBuffer = void 0;
|
|
4
|
+
exports.reduceInputBuffer = reduceInputBuffer;
|
|
5
|
+
exports.reduceInputChunk = reduceInputChunk;
|
|
6
|
+
exports.clampInputCursor = clampInputCursor;
|
|
7
|
+
exports.moveInputCursor = moveInputCursor;
|
|
8
|
+
const grapheme_1 = require("./grapheme");
|
|
9
|
+
exports.initialInputBuffer = {
|
|
10
|
+
value: '',
|
|
11
|
+
cursor: 0,
|
|
12
|
+
};
|
|
13
|
+
function reduceInputBuffer(state, action) {
|
|
14
|
+
switch (action.type) {
|
|
15
|
+
case 'insert': {
|
|
16
|
+
if (!action.text)
|
|
17
|
+
return state;
|
|
18
|
+
const cursor = clampInputCursor(state.value, state.cursor);
|
|
19
|
+
const value = state.value.slice(0, cursor) + action.text + state.value.slice(cursor);
|
|
20
|
+
return {
|
|
21
|
+
value,
|
|
22
|
+
cursor: cursor + action.text.length,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
case 'inputChunk':
|
|
26
|
+
return reduceInputChunk(state, action.text);
|
|
27
|
+
case 'backspace': {
|
|
28
|
+
const cursor = clampInputCursor(state.value, state.cursor);
|
|
29
|
+
if (cursor === 0)
|
|
30
|
+
return { ...state, cursor };
|
|
31
|
+
const previous = previousCursorPosition(state.value, cursor);
|
|
32
|
+
return {
|
|
33
|
+
value: state.value.slice(0, previous) + state.value.slice(cursor),
|
|
34
|
+
cursor: previous,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
case 'delete': {
|
|
38
|
+
const cursor = clampInputCursor(state.value, state.cursor);
|
|
39
|
+
if (cursor >= state.value.length)
|
|
40
|
+
return { ...state, cursor };
|
|
41
|
+
const next = nextCursorPosition(state.value, cursor);
|
|
42
|
+
return {
|
|
43
|
+
value: state.value.slice(0, cursor) + state.value.slice(next),
|
|
44
|
+
cursor,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
case 'move':
|
|
48
|
+
return {
|
|
49
|
+
...state,
|
|
50
|
+
cursor: moveInputCursor(state.value, state.cursor, action.direction),
|
|
51
|
+
};
|
|
52
|
+
case 'set': {
|
|
53
|
+
const cursor = action.cursor ?? action.value.length;
|
|
54
|
+
return {
|
|
55
|
+
value: action.value,
|
|
56
|
+
cursor: clampInputCursor(action.value, cursor),
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
case 'clear':
|
|
60
|
+
return exports.initialInputBuffer;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
function reduceInputChunk(state, text) {
|
|
64
|
+
let next = state;
|
|
65
|
+
let buffer = '';
|
|
66
|
+
const flush = () => {
|
|
67
|
+
if (!buffer)
|
|
68
|
+
return;
|
|
69
|
+
next = reduceInputBuffer(next, { type: 'insert', text: buffer });
|
|
70
|
+
buffer = '';
|
|
71
|
+
};
|
|
72
|
+
for (let index = 0; index < text.length;) {
|
|
73
|
+
const slice = text.slice(index);
|
|
74
|
+
if (slice.startsWith('\x1b[200~')) {
|
|
75
|
+
flush();
|
|
76
|
+
index += '\x1b[200~'.length;
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
if (slice.startsWith('\x1b[201~')) {
|
|
80
|
+
flush();
|
|
81
|
+
index += '\x1b[201~'.length;
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
if (slice.startsWith('\x1b[D')) {
|
|
85
|
+
flush();
|
|
86
|
+
next = reduceInputBuffer(next, { type: 'move', direction: 'left' });
|
|
87
|
+
index += 3;
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
if (slice.startsWith('\x1b[C')) {
|
|
91
|
+
flush();
|
|
92
|
+
next = reduceInputBuffer(next, { type: 'move', direction: 'right' });
|
|
93
|
+
index += 3;
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
96
|
+
if (slice.startsWith('\x1b[H') || slice.startsWith('\x1b[1~')) {
|
|
97
|
+
flush();
|
|
98
|
+
next = reduceInputBuffer(next, { type: 'move', direction: 'home' });
|
|
99
|
+
index += slice.startsWith('\x1b[H') ? 3 : 4;
|
|
100
|
+
continue;
|
|
101
|
+
}
|
|
102
|
+
if (slice.startsWith('\x1b[F') || slice.startsWith('\x1b[4~')) {
|
|
103
|
+
flush();
|
|
104
|
+
next = reduceInputBuffer(next, { type: 'move', direction: 'end' });
|
|
105
|
+
index += slice.startsWith('\x1b[F') ? 3 : 4;
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
if (slice.startsWith('\x1b[3~')) {
|
|
109
|
+
flush();
|
|
110
|
+
next = reduceInputBuffer(next, { type: 'delete' });
|
|
111
|
+
index += 4;
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
if (slice.startsWith('\x7f') || slice.startsWith('\x08')) {
|
|
115
|
+
flush();
|
|
116
|
+
next = reduceInputBuffer(next, { type: 'backspace' });
|
|
117
|
+
index += 1;
|
|
118
|
+
continue;
|
|
119
|
+
}
|
|
120
|
+
if (slice.startsWith('\x15')) {
|
|
121
|
+
flush();
|
|
122
|
+
next = reduceInputBuffer(next, { type: 'clear' });
|
|
123
|
+
index += 1;
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
const codePoint = text.codePointAt(index);
|
|
127
|
+
if (codePoint === undefined)
|
|
128
|
+
break;
|
|
129
|
+
const char = String.fromCodePoint(codePoint);
|
|
130
|
+
if (codePoint < 32 && char !== '\n' && char !== '\t') {
|
|
131
|
+
flush();
|
|
132
|
+
index += char.length;
|
|
133
|
+
continue;
|
|
134
|
+
}
|
|
135
|
+
buffer += char;
|
|
136
|
+
index += char.length;
|
|
137
|
+
}
|
|
138
|
+
flush();
|
|
139
|
+
return next;
|
|
140
|
+
}
|
|
141
|
+
function clampInputCursor(value, cursor) {
|
|
142
|
+
if (!Number.isFinite(cursor))
|
|
143
|
+
return value.length;
|
|
144
|
+
return Math.min(Math.max(0, Math.floor(cursor)), value.length);
|
|
145
|
+
}
|
|
146
|
+
function moveInputCursor(value, cursor, direction) {
|
|
147
|
+
const current = clampInputCursor(value, cursor);
|
|
148
|
+
switch (direction) {
|
|
149
|
+
case 'left':
|
|
150
|
+
return previousCursorPosition(value, current);
|
|
151
|
+
case 'right':
|
|
152
|
+
return nextCursorPosition(value, current);
|
|
153
|
+
case 'home':
|
|
154
|
+
return 0;
|
|
155
|
+
case 'end':
|
|
156
|
+
return value.length;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
function previousCursorPosition(value, cursor) {
|
|
160
|
+
return (0, grapheme_1.previousGraphemeBoundary)(value, cursor);
|
|
161
|
+
}
|
|
162
|
+
function nextCursorPosition(value, cursor) {
|
|
163
|
+
return (0, grapheme_1.nextGraphemeBoundary)(value, cursor);
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=input-buffer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input-buffer.js","sourceRoot":"","sources":["../../../src/ink-ui/runtime/input-buffer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface InkLayoutBudget {
|
|
2
|
+
terminalWidth: number;
|
|
3
|
+
terminalHeight: number;
|
|
4
|
+
layoutWidth: number;
|
|
5
|
+
maxLiveTranscriptItems: number;
|
|
6
|
+
maxOverlayItems: number;
|
|
7
|
+
maxPromptRows: number;
|
|
8
|
+
}
|
|
9
|
+
export declare function fitCount(value: number, min: number, max: number): number;
|
|
10
|
+
export declare function getInkLayoutBudget(terminalWidth: number, terminalHeight: number, options?: {
|
|
11
|
+
overlayVisible?: boolean;
|
|
12
|
+
}): InkLayoutBudget;
|
|
13
|
+
//# sourceMappingURL=layout-budget.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layout-budget.d.ts","sourceRoot":"","sources":["../../../src/ink-ui/runtime/layout-budget.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAExE;AAED,wBAAgB,kBAAkB,CAChC,aAAa,EAAE,MAAM,EACrB,cAAc,EAAE,MAAM,EACtB,OAAO,GAAE;IAAE,cAAc,CAAC,EAAE,OAAO,CAAA;CAAO,GACzC,eAAe,CAiBjB"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.fitCount = fitCount;
|
|
4
|
+
exports.getInkLayoutBudget = getInkLayoutBudget;
|
|
5
|
+
function fitCount(value, min, max) {
|
|
6
|
+
return Math.max(min, Math.min(max, value));
|
|
7
|
+
}
|
|
8
|
+
function getInkLayoutBudget(terminalWidth, terminalHeight, options = {}) {
|
|
9
|
+
const height = Math.max(8, terminalHeight || 24);
|
|
10
|
+
const width = Math.max(20, terminalWidth || 80);
|
|
11
|
+
const maxPromptRows = fitCount(Math.floor(height / 4), 1, 6);
|
|
12
|
+
const maxLiveTranscriptItems = options.overlayVisible
|
|
13
|
+
? 1
|
|
14
|
+
: fitCount(height - 10, 1, 8);
|
|
15
|
+
const maxOverlayItems = fitCount(height - maxPromptRows - maxLiveTranscriptItems - 10, 1, 10);
|
|
16
|
+
return {
|
|
17
|
+
terminalWidth: width,
|
|
18
|
+
terminalHeight: height,
|
|
19
|
+
layoutWidth: Math.max(20, width - 1),
|
|
20
|
+
maxLiveTranscriptItems,
|
|
21
|
+
maxOverlayItems,
|
|
22
|
+
maxPromptRows,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=layout-budget.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layout-budget.js","sourceRoot":"","sources":["../../../src/ink-ui/runtime/layout-budget.ts"],"names":[],"mappings":";;AASA,4BAEC;AAED,gDAqBC;AAzBD,SAAgB,QAAQ,CAAC,KAAa,EAAE,GAAW,EAAE,GAAW;IAC9D,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED,SAAgB,kBAAkB,CAChC,aAAqB,EACrB,cAAsB,EACtB,UAAwC,EAAE;IAE1C,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,cAAc,IAAI,EAAE,CAAC,CAAC;IACjD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,aAAa,IAAI,EAAE,CAAC,CAAC;IAChD,MAAM,aAAa,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7D,MAAM,sBAAsB,GAAG,OAAO,CAAC,cAAc;QACnD,CAAC,CAAC,CAAC;QACH,CAAC,CAAC,QAAQ,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAChC,MAAM,eAAe,GAAG,QAAQ,CAAC,MAAM,GAAG,aAAa,GAAG,sBAAsB,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;IAE9F,OAAO;QACL,aAAa,EAAE,KAAK;QACpB,cAAc,EAAE,MAAM;QACtB,WAAW,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,GAAG,CAAC,CAAC;QACpC,sBAAsB;QACtB,eAAe;QACf,aAAa;KACd,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
export interface NativeCursorState {
|
|
2
|
+
enabled: boolean;
|
|
3
|
+
column: number;
|
|
4
|
+
rowsUp: number;
|
|
5
|
+
cursorLineIndex?: number;
|
|
6
|
+
row?: number;
|
|
7
|
+
absolute?: boolean;
|
|
8
|
+
}
|
|
9
|
+
interface InkYogaNode {
|
|
10
|
+
getComputedLeft?: () => number;
|
|
11
|
+
getComputedTop?: () => number;
|
|
12
|
+
getComputedHeight?: () => number;
|
|
13
|
+
}
|
|
14
|
+
export interface InkDomNodeLike {
|
|
15
|
+
yogaNode?: InkYogaNode;
|
|
16
|
+
parentNode?: InkDomNodeLike | null;
|
|
17
|
+
}
|
|
18
|
+
export interface NativeCursorAnchor {
|
|
19
|
+
column: number;
|
|
20
|
+
rowsUp: number;
|
|
21
|
+
row: number;
|
|
22
|
+
}
|
|
23
|
+
export interface CursorPosition {
|
|
24
|
+
row: number;
|
|
25
|
+
column: number;
|
|
26
|
+
}
|
|
27
|
+
export declare function nativeCursorUnparkSequence(rowsUp: number): string;
|
|
28
|
+
export declare function nativeCursorParkSequence(state: NativeCursorState): string;
|
|
29
|
+
export declare function nativeCursorAbsoluteMoveSequence(to: CursorPosition): string;
|
|
30
|
+
export declare function nativeCursorAbsoluteParkSequence(to: CursorPosition): string;
|
|
31
|
+
export declare function nativeCursorMoveSequence(from: CursorPosition, to: CursorPosition): string;
|
|
32
|
+
export declare class NativeCursorController {
|
|
33
|
+
private readonly output;
|
|
34
|
+
private cursorState;
|
|
35
|
+
private cursorParked;
|
|
36
|
+
private parkedState;
|
|
37
|
+
private frameCursor;
|
|
38
|
+
private physicalCursor;
|
|
39
|
+
private restoreScheduled;
|
|
40
|
+
private promptTopRow;
|
|
41
|
+
private observedLines;
|
|
42
|
+
private parkedWithAbsoluteTarget;
|
|
43
|
+
private restoreGeneration;
|
|
44
|
+
constructor(output: NodeJS.WriteStream);
|
|
45
|
+
wrapStdout(): NodeJS.WriteStream;
|
|
46
|
+
setState(state: NativeCursorState): void;
|
|
47
|
+
restore(): void;
|
|
48
|
+
disable(): void;
|
|
49
|
+
resetForViewportClear(): void;
|
|
50
|
+
private unpark;
|
|
51
|
+
private park;
|
|
52
|
+
private cursorTargetFromFrame;
|
|
53
|
+
private scheduleRestore;
|
|
54
|
+
}
|
|
55
|
+
export declare function createNativeCursorController(output: NodeJS.WriteStream): NativeCursorController;
|
|
56
|
+
export declare function nativeCursorAnchorFromNode(node: InkDomNodeLike | null | undefined, options: {
|
|
57
|
+
cursorColumn: number;
|
|
58
|
+
cursorLineIndex: number;
|
|
59
|
+
}): NativeCursorAnchor | null;
|
|
60
|
+
export declare function applyTerminalOutputToCursor(position: CursorPosition, chunk: unknown, columns: number, rows?: number): CursorPosition;
|
|
61
|
+
export {};
|
|
62
|
+
//# sourceMappingURL=native-cursor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"native-cursor.d.ts","sourceRoot":"","sources":["../../../src/ink-ui/runtime/native-cursor.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,UAAU,WAAW;IACnB,eAAe,CAAC,EAAE,MAAM,MAAM,CAAC;IAC/B,cAAc,CAAC,EAAE,MAAM,MAAM,CAAC;IAC9B,iBAAiB,CAAC,EAAE,MAAM,MAAM,CAAC;CAClC;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,WAAW,CAAC;IACvB,UAAU,CAAC,EAAE,cAAc,GAAG,IAAI,CAAC;CACpC;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAKjE;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,iBAAiB,GAAG,MAAM,CAOzE;AAED,wBAAgB,gCAAgC,CAAC,EAAE,EAAE,cAAc,GAAG,MAAM,CAI3E;AAED,wBAAgB,gCAAgC,CAAC,EAAE,EAAE,cAAc,GAAG,MAAM,CAE3E;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,cAAc,EAAE,EAAE,EAAE,cAAc,GAAG,MAAM,CAkBzF;AAED,qBAAa,sBAAsB;IAgBrB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAfnC,OAAO,CAAC,WAAW,CAIjB;IACF,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,WAAW,CAAkC;IACrD,OAAO,CAAC,WAAW,CAAyC;IAC5D,OAAO,CAAC,cAAc,CAAyC;IAC/D,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,YAAY,CAAuB;IAC3C,OAAO,CAAC,aAAa,CAA6B;IAClD,OAAO,CAAC,wBAAwB,CAAS;IACzC,OAAO,CAAC,iBAAiB,CAAK;gBAED,MAAM,EAAE,MAAM,CAAC,WAAW;IAEvD,UAAU,IAAI,MAAM,CAAC,WAAW;IA8ChC,QAAQ,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI;IAIxC,OAAO,IAAI,IAAI;IAYf,OAAO,IAAI,IAAI;IAKf,qBAAqB,IAAI,IAAI;IAY7B,OAAO,CAAC,MAAM;IAsBd,OAAO,CAAC,IAAI;IAuBZ,OAAO,CAAC,qBAAqB;IA8B7B,OAAO,CAAC,eAAe;CAUxB;AAED,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,MAAM,CAAC,WAAW,GAAG,sBAAsB,CAE/F;AAWD,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,cAAc,GAAG,IAAI,GAAG,SAAS,EACvC,OAAO,EAAE;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAA;CAAE,GACzD,kBAAkB,GAAG,IAAI,CA+B3B;AAED,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,cAAc,EACxB,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,MAAM,EACf,IAAI,SAA0B,GAC7B,cAAc,CAEhB"}
|