@boba-cli/tea 0.1.0-alpha.1 → 1.0.0-alpha.2
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/dist/index.cjs +18 -22
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +22 -5
- package/dist/index.d.ts +22 -5
- package/dist/index.js +18 -22
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.cjs
CHANGED
|
@@ -762,14 +762,14 @@ var Program = class {
|
|
|
762
762
|
draining = false;
|
|
763
763
|
result = null;
|
|
764
764
|
resolveWait;
|
|
765
|
-
constructor(model, options
|
|
765
|
+
constructor(model, options) {
|
|
766
766
|
this.model = model;
|
|
767
767
|
this.opts = options;
|
|
768
768
|
this.platform = options.platform;
|
|
769
|
-
this.terminal = new TerminalController(
|
|
769
|
+
this.terminal = new TerminalController(this.platform);
|
|
770
770
|
this.renderer = new StandardRenderer({
|
|
771
|
-
platform:
|
|
772
|
-
fps:
|
|
771
|
+
platform: this.platform,
|
|
772
|
+
fps: this.opts.fps
|
|
773
773
|
});
|
|
774
774
|
}
|
|
775
775
|
async run() {
|
|
@@ -942,21 +942,19 @@ var Program = class {
|
|
|
942
942
|
}
|
|
943
943
|
setupSignals() {
|
|
944
944
|
const disposables = [];
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
this.send(new WindowSizeMsg(initialSize.columns, initialSize.rows));
|
|
959
|
-
}
|
|
945
|
+
const intDisposable = this.platform.signals.onInterrupt(this.onSigInt);
|
|
946
|
+
const termDisposable = this.platform.signals.onTerminate(this.onSigTerm);
|
|
947
|
+
disposables.push(
|
|
948
|
+
() => intDisposable.dispose(),
|
|
949
|
+
() => termDisposable.dispose()
|
|
950
|
+
);
|
|
951
|
+
const handleResize = (size) => {
|
|
952
|
+
this.send(new WindowSizeMsg(size.columns, size.rows));
|
|
953
|
+
};
|
|
954
|
+
const resizeDisposable = this.platform.terminal.onResize(handleResize);
|
|
955
|
+
disposables.push(() => resizeDisposable.dispose());
|
|
956
|
+
const initialSize = this.platform.terminal.getSize();
|
|
957
|
+
this.send(new WindowSizeMsg(initialSize.columns, initialSize.rows));
|
|
960
958
|
this.disposeSignals = () => {
|
|
961
959
|
for (const dispose of disposables) {
|
|
962
960
|
dispose();
|
|
@@ -981,9 +979,7 @@ var Program = class {
|
|
|
981
979
|
}
|
|
982
980
|
this.renderer.stop();
|
|
983
981
|
this.terminal.cleanup();
|
|
984
|
-
|
|
985
|
-
this.platform.dispose();
|
|
986
|
-
}
|
|
982
|
+
this.platform.dispose();
|
|
987
983
|
}
|
|
988
984
|
};
|
|
989
985
|
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/messages.ts","../src/keys.ts","../src/mouse.ts","../src/input.ts","../src/renderer.ts","../src/terminal.ts","../src/program.ts","../src/commands.ts","../src/screen.ts"],"names":["KeyType","decodeString","byteLength","rune","decodeFirstRune","MouseAction","MouseButton","allocBytes","concatBytes","encodeString","CLEAR_SCREEN","CURSOR_HOME","ALT_SCREEN_ON","ALT_SCREEN_OFF","CURSOR_SHOW","CURSOR_HIDE","MOUSE_CELL_ON","MOUSE_SGR_ON","MOUSE_ALL_ON","MOUSE_CELL_OFF","MOUSE_ALL_OFF","MOUSE_SGR_OFF","BRACKETED_PASTE_ON","BRACKETED_PASTE_OFF","REPORT_FOCUS_ON","REPORT_FOCUS_OFF","msg"],"mappings":"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","file":"index.cjs","sourcesContent":["/** @public Request graceful program termination. */\nexport class QuitMsg {\n readonly _tag = 'quit'\n}\n\n/** @public Interrupt the program (SIGINT). */\nexport class InterruptMsg {\n readonly _tag = 'interrupt'\n}\n\n/** @public Suspend the program (Ctrl+Z). */\nexport class SuspendMsg {\n readonly _tag = 'suspend'\n}\n\n/** @public Resume the program after suspension. */\nexport class ResumeMsg {\n readonly _tag = 'resume'\n}\n\n/** @public Report the current terminal width and height. */\nexport class WindowSizeMsg {\n readonly _tag = 'window-size'\n constructor(\n public readonly width: number,\n public readonly height: number,\n ) {}\n}\n\n/** @public Terminal focus gained. */\nexport class FocusMsg {\n readonly _tag = 'focus'\n}\n\n/** @public Terminal focus lost. */\nexport class BlurMsg {\n readonly _tag = 'blur'\n}\n\n/** @public Clear the terminal screen. */\nexport class ClearScreenMsg {\n readonly _tag = 'clear-screen'\n}\n\n/** @public Enter the alternate screen buffer. */\nexport class EnterAltScreenMsg {\n readonly _tag = 'enter-alt-screen'\n}\n\n/** @public Exit the alternate screen buffer. */\nexport class ExitAltScreenMsg {\n readonly _tag = 'exit-alt-screen'\n}\n\n/** @public Enable cell-based mouse reporting. */\nexport class EnableMouseCellMotionMsg {\n readonly _tag = 'enable-mouse-cell-motion'\n}\n\n/** @public Enable all-motion mouse reporting. */\nexport class EnableMouseAllMotionMsg {\n readonly _tag = 'enable-mouse-all-motion'\n}\n\n/** @public Disable mouse reporting. */\nexport class DisableMouseMsg {\n readonly _tag = 'disable-mouse'\n}\n\n/** @public Show the cursor. */\nexport class ShowCursorMsg {\n readonly _tag = 'show-cursor'\n}\n\n/** @public Hide the cursor. */\nexport class HideCursorMsg {\n readonly _tag = 'hide-cursor'\n}\n\n/** @public Enable focus in/out reporting. */\nexport class EnableReportFocusMsg {\n readonly _tag = 'enable-report-focus'\n}\n\n/** @public Disable focus in/out reporting. */\nexport class DisableReportFocusMsg {\n readonly _tag = 'disable-report-focus'\n}\n\n/** @public Set the terminal window title. */\nexport class SetWindowTitleMsg {\n readonly _tag = 'set-window-title'\n constructor(public readonly title: string) {}\n}\n","import { decodeFirstRune, decodeString, byteLength } from '@boba-cli/machine'\n\n/** @public Known key types parsed from terminal input. */\nexport enum KeyType {\n Null = 'null',\n Break = 'break',\n Enter = 'enter',\n Backspace = 'backspace',\n Tab = 'tab',\n Esc = 'esc',\n Space = 'space',\n Runes = 'runes',\n Up = 'up',\n Down = 'down',\n Right = 'right',\n Left = 'left',\n ShiftTab = 'shift+tab',\n Home = 'home',\n End = 'end',\n PgUp = 'pgup',\n PgDown = 'pgdown',\n CtrlPgUp = 'ctrl+pgup',\n CtrlPgDown = 'ctrl+pgdown',\n Delete = 'delete',\n Insert = 'insert',\n CtrlUp = 'ctrl+up',\n CtrlDown = 'ctrl+down',\n CtrlRight = 'ctrl+right',\n CtrlLeft = 'ctrl+left',\n CtrlHome = 'ctrl+home',\n CtrlEnd = 'ctrl+end',\n ShiftUp = 'shift+up',\n ShiftDown = 'shift+down',\n ShiftRight = 'shift+right',\n ShiftLeft = 'shift+left',\n ShiftHome = 'shift+home',\n ShiftEnd = 'shift+end',\n CtrlShiftUp = 'ctrl+shift+up',\n CtrlShiftDown = 'ctrl+shift+down',\n CtrlShiftLeft = 'ctrl+shift+left',\n CtrlShiftRight = 'ctrl+shift+right',\n CtrlShiftHome = 'ctrl+shift+home',\n CtrlShiftEnd = 'ctrl+shift+end',\n F1 = 'f1',\n F2 = 'f2',\n F3 = 'f3',\n F4 = 'f4',\n F5 = 'f5',\n F6 = 'f6',\n F7 = 'f7',\n F8 = 'f8',\n F9 = 'f9',\n F10 = 'f10',\n F11 = 'f11',\n F12 = 'f12',\n F13 = 'f13',\n F14 = 'f14',\n F15 = 'f15',\n F16 = 'f16',\n F17 = 'f17',\n F18 = 'f18',\n F19 = 'f19',\n F20 = 'f20',\n}\n\n/** @public Parsed key metadata. */\nexport interface Key {\n type: KeyType\n runes: string\n alt: boolean\n paste: boolean\n}\n\nconst keyNames: Record<KeyType, string> = {\n [KeyType.Null]: 'ctrl+@',\n [KeyType.Break]: 'ctrl+c',\n [KeyType.Enter]: 'enter',\n [KeyType.Backspace]: 'backspace',\n [KeyType.Tab]: 'tab',\n [KeyType.Esc]: 'esc',\n [KeyType.Space]: ' ',\n [KeyType.Runes]: 'runes',\n [KeyType.Up]: 'up',\n [KeyType.Down]: 'down',\n [KeyType.Right]: 'right',\n [KeyType.Left]: 'left',\n [KeyType.ShiftTab]: 'shift+tab',\n [KeyType.Home]: 'home',\n [KeyType.End]: 'end',\n [KeyType.PgUp]: 'pgup',\n [KeyType.PgDown]: 'pgdown',\n [KeyType.CtrlPgUp]: 'ctrl+pgup',\n [KeyType.CtrlPgDown]: 'ctrl+pgdown',\n [KeyType.Delete]: 'delete',\n [KeyType.Insert]: 'insert',\n [KeyType.CtrlUp]: 'ctrl+up',\n [KeyType.CtrlDown]: 'ctrl+down',\n [KeyType.CtrlRight]: 'ctrl+right',\n [KeyType.CtrlLeft]: 'ctrl+left',\n [KeyType.CtrlHome]: 'ctrl+home',\n [KeyType.CtrlEnd]: 'ctrl+end',\n [KeyType.ShiftUp]: 'shift+up',\n [KeyType.ShiftDown]: 'shift+down',\n [KeyType.ShiftRight]: 'shift+right',\n [KeyType.ShiftLeft]: 'shift+left',\n [KeyType.ShiftHome]: 'shift+home',\n [KeyType.ShiftEnd]: 'shift+end',\n [KeyType.CtrlShiftUp]: 'ctrl+shift+up',\n [KeyType.CtrlShiftDown]: 'ctrl+shift+down',\n [KeyType.CtrlShiftLeft]: 'ctrl+shift+left',\n [KeyType.CtrlShiftRight]: 'ctrl+shift+right',\n [KeyType.CtrlShiftHome]: 'ctrl+shift+home',\n [KeyType.CtrlShiftEnd]: 'ctrl+shift+end',\n [KeyType.F1]: 'f1',\n [KeyType.F2]: 'f2',\n [KeyType.F3]: 'f3',\n [KeyType.F4]: 'f4',\n [KeyType.F5]: 'f5',\n [KeyType.F6]: 'f6',\n [KeyType.F7]: 'f7',\n [KeyType.F8]: 'f8',\n [KeyType.F9]: 'f9',\n [KeyType.F10]: 'f10',\n [KeyType.F11]: 'f11',\n [KeyType.F12]: 'f12',\n [KeyType.F13]: 'f13',\n [KeyType.F14]: 'f14',\n [KeyType.F15]: 'f15',\n [KeyType.F16]: 'f16',\n [KeyType.F17]: 'f17',\n [KeyType.F18]: 'f18',\n [KeyType.F19]: 'f19',\n [KeyType.F20]: 'f20',\n}\n\nconst controlKeyMap: Record<number, KeyType | undefined> = {\n 0: KeyType.Null,\n 3: KeyType.Break,\n 9: KeyType.Tab,\n 10: KeyType.Enter,\n 13: KeyType.Enter,\n 27: KeyType.Esc,\n 127: KeyType.Backspace,\n}\n\ntype Sequence = [string, Key]\n\nconst sequences: Sequence[] = [\n ['\\u001b[A', { type: KeyType.Up, runes: '', alt: false, paste: false }],\n ['\\u001b[B', { type: KeyType.Down, runes: '', alt: false, paste: false }],\n ['\\u001b[C', { type: KeyType.Right, runes: '', alt: false, paste: false }],\n ['\\u001b[D', { type: KeyType.Left, runes: '', alt: false, paste: false }],\n ['\\u001b[Z', { type: KeyType.ShiftTab, runes: '', alt: false, paste: false }],\n ['\\u001b[2~', { type: KeyType.Insert, runes: '', alt: false, paste: false }],\n ['\\u001b[3~', { type: KeyType.Delete, runes: '', alt: false, paste: false }],\n ['\\u001b[5~', { type: KeyType.PgUp, runes: '', alt: false, paste: false }],\n ['\\u001b[6~', { type: KeyType.PgDown, runes: '', alt: false, paste: false }],\n ['\\u001b[1~', { type: KeyType.Home, runes: '', alt: false, paste: false }],\n ['\\u001b[4~', { type: KeyType.End, runes: '', alt: false, paste: false }],\n ['\\u001b[H', { type: KeyType.Home, runes: '', alt: false, paste: false }],\n ['\\u001b[F', { type: KeyType.End, runes: '', alt: false, paste: false }],\n ['\\u001bOP', { type: KeyType.F1, runes: '', alt: false, paste: false }],\n ['\\u001bOQ', { type: KeyType.F2, runes: '', alt: false, paste: false }],\n ['\\u001bOR', { type: KeyType.F3, runes: '', alt: false, paste: false }],\n ['\\u001bOS', { type: KeyType.F4, runes: '', alt: false, paste: false }],\n ['\\u001b[15~', { type: KeyType.F5, runes: '', alt: false, paste: false }],\n ['\\u001b[17~', { type: KeyType.F6, runes: '', alt: false, paste: false }],\n ['\\u001b[18~', { type: KeyType.F7, runes: '', alt: false, paste: false }],\n ['\\u001b[19~', { type: KeyType.F8, runes: '', alt: false, paste: false }],\n ['\\u001b[20~', { type: KeyType.F9, runes: '', alt: false, paste: false }],\n ['\\u001b[21~', { type: KeyType.F10, runes: '', alt: false, paste: false }],\n ['\\u001b[23~', { type: KeyType.F11, runes: '', alt: false, paste: false }],\n ['\\u001b[24~', { type: KeyType.F12, runes: '', alt: false, paste: false }],\n [\n '\\u001b[1;2A',\n { type: KeyType.ShiftUp, runes: '', alt: false, paste: false },\n ],\n [\n '\\u001b[1;2B',\n { type: KeyType.ShiftDown, runes: '', alt: false, paste: false },\n ],\n [\n '\\u001b[1;2C',\n { type: KeyType.ShiftRight, runes: '', alt: false, paste: false },\n ],\n [\n '\\u001b[1;2D',\n { type: KeyType.ShiftLeft, runes: '', alt: false, paste: false },\n ],\n [\n '\\u001b[1;5A',\n { type: KeyType.CtrlUp, runes: '', alt: false, paste: false },\n ],\n [\n '\\u001b[1;5B',\n { type: KeyType.CtrlDown, runes: '', alt: false, paste: false },\n ],\n [\n '\\u001b[1;5C',\n { type: KeyType.CtrlRight, runes: '', alt: false, paste: false },\n ],\n [\n '\\u001b[1;5D',\n { type: KeyType.CtrlLeft, runes: '', alt: false, paste: false },\n ],\n [\n '\\u001b[1;6A',\n { type: KeyType.CtrlShiftUp, runes: '', alt: false, paste: false },\n ],\n [\n '\\u001b[1;6B',\n { type: KeyType.CtrlShiftDown, runes: '', alt: false, paste: false },\n ],\n [\n '\\u001b[1;6C',\n { type: KeyType.CtrlShiftRight, runes: '', alt: false, paste: false },\n ],\n [\n '\\u001b[1;6D',\n { type: KeyType.CtrlShiftLeft, runes: '', alt: false, paste: false },\n ],\n ['\\u001b[1;3A', { type: KeyType.Up, runes: '', alt: true, paste: false }],\n ['\\u001b[1;3B', { type: KeyType.Down, runes: '', alt: true, paste: false }],\n ['\\u001b[1;3C', { type: KeyType.Right, runes: '', alt: true, paste: false }],\n ['\\u001b[1;3D', { type: KeyType.Left, runes: '', alt: true, paste: false }],\n [\n '\\u001b[5;5~',\n { type: KeyType.CtrlPgUp, runes: '', alt: false, paste: false },\n ],\n [\n '\\u001b[6;5~',\n { type: KeyType.CtrlPgDown, runes: '', alt: false, paste: false },\n ],\n ['\\u001b[5;3~', { type: KeyType.PgUp, runes: '', alt: true, paste: false }],\n ['\\u001b[6;3~', { type: KeyType.PgDown, runes: '', alt: true, paste: false }],\n ['\\u001b[3;2~', { type: KeyType.Insert, runes: '', alt: true, paste: false }],\n ['\\u001b[3;3~', { type: KeyType.Delete, runes: '', alt: true, paste: false }],\n ['\\u001b[[A', { type: KeyType.F1, runes: '', alt: false, paste: false }],\n ['\\u001b[[B', { type: KeyType.F2, runes: '', alt: false, paste: false }],\n ['\\u001b[[C', { type: KeyType.F3, runes: '', alt: false, paste: false }],\n ['\\u001b[[D', { type: KeyType.F4, runes: '', alt: false, paste: false }],\n ['\\u001b[[E', { type: KeyType.F5, runes: '', alt: false, paste: false }],\n]\n\n/** @public Message representing a parsed key event. */\nexport class KeyMsg {\n readonly _tag = 'key'\n constructor(public readonly key: Key) {}\n\n toString(): string {\n return keyToString(this.key)\n }\n}\n\n/** @public Convert a parsed key to a human-readable string. */\nexport function keyToString(key: Key): string {\n if (key.type === KeyType.Runes) {\n const value = key.paste ? `[${key.runes}]` : key.runes\n return key.alt ? `alt+${value}` : value\n }\n const base = keyNames[key.type] ?? ''\n return key.alt ? `alt+${base}` : base\n}\n\nexport function parseKey(\n buffer: Uint8Array,\n allowMoreData: boolean,\n): { key: Key; length: number } | { needMore: true } | undefined {\n if (buffer.length === 0) {\n return allowMoreData ? { needMore: true } : undefined\n }\n const input = decodeString(buffer)\n\n for (const [seq, key] of sequences) {\n if (input.startsWith(seq)) {\n return { key, length: byteLength(seq) }\n }\n if (allowMoreData && seq.startsWith(input)) {\n return { needMore: true }\n }\n }\n\n if (buffer[0] === 0x1b && buffer.length > 1) {\n const [rune, altLength] = decodeFirstRune(buffer, 1)\n if (altLength > 0 && rune !== null) {\n return {\n key: { type: KeyType.Runes, runes: rune, alt: true, paste: false },\n length: 1 + altLength,\n }\n }\n }\n\n const code: number = buffer[0] ?? 0\n const mapped: KeyType | undefined = Object.prototype.hasOwnProperty.call(\n controlKeyMap,\n code,\n )\n ? controlKeyMap[code]\n : undefined\n if (mapped !== undefined) {\n return {\n key: { type: mapped, runes: '', alt: false, paste: false },\n length: 1,\n }\n }\n\n const [rune, runeLength] = decodeFirstRune(buffer)\n if (runeLength === 0 || rune === null) {\n return allowMoreData ? { needMore: true } : undefined\n }\n\n if (rune === ' ') {\n return {\n key: { type: KeyType.Space, runes: rune, alt: false, paste: false },\n length: runeLength,\n }\n }\n\n return {\n key: { type: KeyType.Runes, runes: rune, alt: false, paste: false },\n length: runeLength,\n }\n}\n","import { decodeString } from '@boba-cli/machine'\n\n/** @public Mouse action type. */\nexport enum MouseAction {\n Press = 'press',\n Release = 'release',\n Motion = 'motion',\n}\n\n/** @public Mouse button identifiers, including wheels. */\nexport enum MouseButton {\n None = 'none',\n Left = 'left',\n Middle = 'middle',\n Right = 'right',\n WheelUp = 'wheel-up',\n WheelDown = 'wheel-down',\n WheelLeft = 'wheel-left',\n WheelRight = 'wheel-right',\n Backward = 'backward',\n Forward = 'forward',\n Button10 = 'button-10',\n Button11 = 'button-11',\n}\n\n/** @public Parsed mouse event payload. */\nexport interface MouseEvent {\n x: number\n y: number\n shift: boolean\n alt: boolean\n ctrl: boolean\n action: MouseAction\n button: MouseButton\n}\n\n/** @public Message representing a parsed mouse event. */\nexport class MouseMsg {\n readonly _tag = 'mouse'\n constructor(public readonly event: MouseEvent) {}\n\n toString(): string {\n const parts = [\n this.event.ctrl ? 'ctrl' : '',\n this.event.alt ? 'alt' : '',\n this.event.shift ? 'shift' : '',\n ].filter(Boolean)\n const mods = parts.length > 0 ? `${parts.join('+')}+` : ''\n return `${mods}${this.event.button} ${this.event.action} @${this.event.x},${this.event.y}`\n }\n}\n\nconst mouseSGRRegex = /(\\d+);(\\d+);(\\d+)([Mm])/\nconst mouseEventX10Len = 6\nconst x10MouseByteOffset = 32\n\nexport function parseMouse(\n buffer: Uint8Array,\n allowMoreData: boolean,\n): { msg: MouseMsg; length: number } | { needMore: true } | undefined {\n if (buffer.length < 3 || buffer[0] !== 0x1b || buffer[1] !== 0x5b) {\n return undefined\n }\n\n if (buffer[2] === 0x4d) {\n if (buffer.length < mouseEventX10Len) {\n return allowMoreData ? { needMore: true } : undefined\n }\n const event = parseX10MouseEvent(buffer.subarray(0, mouseEventX10Len))\n return { msg: new MouseMsg(event), length: mouseEventX10Len }\n }\n\n if (buffer[2] === 0x3c) {\n const slice = decodeString(buffer)\n const match = mouseSGRRegex.exec(slice.slice(3))\n if (!match) {\n return allowMoreData ? { needMore: true } : undefined\n }\n const event = parseSGRMouseEvent(slice)\n const matchedLength = match[0]?.length ?? 0\n return { msg: new MouseMsg(event), length: matchedLength + 3 }\n }\n\n return undefined\n}\n\nfunction parseSGRMouseEvent(seq: string): MouseEvent {\n const match = mouseSGRRegex.exec(seq.slice(3))\n if (!match) {\n return defaultMouseEvent()\n }\n\n const buttonCode = Number.parseInt(match[1] ?? '0', 10)\n const px = Number.parseInt(match[2] ?? '0', 10)\n const py = Number.parseInt(match[3] ?? '0', 10)\n const release = match[4] === 'm'\n\n const event = parseMouseButton(buttonCode, true)\n\n if (event.action !== MouseAction.Motion && !eventIsWheel(event) && release) {\n event.action = MouseAction.Release\n }\n\n event.x = px - 1\n event.y = py - 1\n\n return event\n}\n\nfunction parseX10MouseEvent(buf: Uint8Array): MouseEvent {\n const buttonByte = buf[3] ?? 0\n const c1 = buf[4] ?? 0\n const c2 = buf[5] ?? 0\n const event = parseMouseButton(buttonByte, false)\n event.x = c1 - x10MouseByteOffset - 1\n event.y = c2 - x10MouseByteOffset - 1\n return event\n}\n\nfunction parseMouseButton(code: number, isSGR: boolean): MouseEvent {\n let e = code\n if (!isSGR) {\n e -= x10MouseByteOffset\n }\n\n const bitShift = 0b0000_0100\n const bitAlt = 0b0000_1000\n const bitCtrl = 0b0001_0000\n const bitMotion = 0b0010_0000\n const bitWheel = 0b0100_0000\n const bitAdd = 0b1000_0000\n const bitsMask = 0b0000_0011\n\n const event = defaultMouseEvent()\n\n if ((e & bitAdd) !== 0) {\n const extraButtons: Record<number, MouseButton> = {\n 0: MouseButton.Backward,\n 1: MouseButton.Forward,\n 2: MouseButton.Button10,\n 3: MouseButton.Button11,\n }\n event.button = extraButtons[e & bitsMask] ?? MouseButton.None\n } else if ((e & bitWheel) !== 0) {\n const wheelButtons: Record<number, MouseButton> = {\n 0: MouseButton.WheelUp,\n 1: MouseButton.WheelDown,\n 2: MouseButton.WheelLeft,\n 3: MouseButton.WheelRight,\n }\n event.button = wheelButtons[e & bitsMask] ?? MouseButton.None\n } else {\n const baseButtons: Record<number, MouseButton> = {\n 0: MouseButton.Left,\n 1: MouseButton.Middle,\n 2: MouseButton.Right,\n 3: MouseButton.None,\n }\n event.button = baseButtons[e & bitsMask] ?? MouseButton.None\n if ((e & bitsMask) === bitsMask) {\n event.action = MouseAction.Release\n event.button = MouseButton.None\n }\n }\n\n if ((e & bitMotion) !== 0 && !eventIsWheel(event)) {\n event.action = MouseAction.Motion\n }\n\n event.alt = (e & bitAlt) !== 0\n event.ctrl = (e & bitCtrl) !== 0\n event.shift = (e & bitShift) !== 0\n\n return event\n}\n\nfunction eventIsWheel(event: MouseEvent): boolean {\n return (\n event.button === MouseButton.WheelUp ||\n event.button === MouseButton.WheelDown ||\n event.button === MouseButton.WheelLeft ||\n event.button === MouseButton.WheelRight\n )\n}\n\nfunction defaultMouseEvent(): MouseEvent {\n return {\n x: 0,\n y: 0,\n shift: false,\n alt: false,\n ctrl: false,\n action: MouseAction.Press,\n button: MouseButton.None,\n }\n}\n","import type { Disposable, PlatformAdapter } from '@boba-cli/machine'\nimport { allocBytes, concatBytes, encodeString } from '@boba-cli/machine'\nimport { BlurMsg, FocusMsg } from './messages.js'\nimport { KeyMsg, KeyType, parseKey } from './keys.js'\nimport { parseMouse } from './mouse.js'\nimport type { Msg } from './types.js'\n\n/** @public Options for the input reader. */\nexport interface InputOptions {\n platform?: PlatformAdapter\n onMessage: (msg: Msg) => void\n}\n\nconst BRACKET_PASTE_START = '\\u001b[200~'\nconst BRACKET_PASTE_END = '\\u001b[201~'\n\nexport function startInput(options: InputOptions): () => void {\n if (!options.platform) {\n // No platform adapter available, return no-op cleanup\n return () => {}\n }\n\n let buffer: Uint8Array = allocBytes(0)\n let disposable: Disposable | null = null\n\n const onData = (data: Uint8Array) => {\n buffer = concatBytes(buffer, data)\n buffer = consumeBuffer(buffer, options.onMessage)\n }\n\n disposable = options.platform.terminal.onInput(onData)\n\n return () => {\n if (disposable) {\n disposable.dispose()\n }\n }\n}\n\nfunction consumeBuffer(buffer: Uint8Array, push: (msg: Msg) => void): Uint8Array {\n let offset = 0\n\n while (offset < buffer.length) {\n const slice = buffer.subarray(offset)\n const result = detectOne(slice, offset + slice.length === buffer.length)\n\n if (!result || 'needMore' in result) {\n break\n }\n\n offset += result.length\n if (result.msg) {\n push(result.msg)\n }\n }\n\n return buffer.subarray(offset)\n}\n\ntype DetectResult =\n | { msg: Msg; length: number }\n | { msg?: Msg; length: number }\n | { needMore: true }\n\nfunction detectOne(\n buffer: Uint8Array,\n allowMoreData: boolean,\n): DetectResult | undefined {\n if (buffer.length === 0) {\n return allowMoreData ? { needMore: true } : undefined\n }\n const mouse = parseMouse(buffer, allowMoreData)\n if (mouse) {\n if ('needMore' in mouse) {\n return mouse\n }\n return { msg: mouse.msg, length: mouse.length }\n }\n\n const focus = detectFocus(buffer)\n if (focus) {\n return focus\n }\n\n const paste = detectBracketedPaste(buffer, allowMoreData)\n if (paste) {\n return paste\n }\n\n const key = parseKey(buffer, allowMoreData)\n if (!key) {\n return undefined\n }\n if ('needMore' in key) {\n return key\n }\n\n return { msg: new KeyMsg(key.key), length: key.length }\n}\n\nfunction detectFocus(buffer: Uint8Array): DetectResult | undefined {\n // Focus in: ESC [ I, Focus out: ESC [ O (exactly three bytes)\n if (buffer.length === 3 && buffer[0] === 0x1b && buffer[1] === 0x5b) {\n if (buffer[2] === 0x49) {\n return { msg: new FocusMsg(), length: 3 }\n }\n if (buffer[2] === 0x4f) {\n return { msg: new BlurMsg(), length: 3 }\n }\n }\n return undefined\n}\n\nfunction detectBracketedPaste(\n buffer: Uint8Array,\n allowMoreData: boolean,\n): DetectResult | undefined {\n const decoder = new TextDecoder('utf-8', { fatal: false })\n const asString = decoder.decode(buffer)\n if (!asString.startsWith(BRACKET_PASTE_START)) {\n return undefined\n }\n const endIndex = asString.indexOf(\n BRACKET_PASTE_END,\n BRACKET_PASTE_START.length,\n )\n if (endIndex === -1) {\n return allowMoreData ? { needMore: true } : undefined\n }\n const content = asString.slice(BRACKET_PASTE_START.length, endIndex)\n const fullString = BRACKET_PASTE_START + content + BRACKET_PASTE_END\n const length = encodeString(fullString).length\n const key: Msg = new KeyMsg({\n type: KeyType.Runes,\n runes: content,\n alt: false,\n paste: true,\n })\n return { msg: key, length }\n}\n","import type { PlatformAdapter, TerminalAdapter } from '@boba-cli/machine'\nimport { CURSOR_HOME, CLEAR_SCREEN } from '@boba-cli/machine'\n\n/** @public Options for the standard renderer. */\nexport interface RendererOptions {\n platform?: PlatformAdapter\n fps?: number\n}\n\nexport class StandardRenderer {\n private nextFrame: string | null = null\n private lastFrame = ''\n private ticker: ReturnType<typeof setInterval> | null = null\n private readonly terminal: TerminalAdapter | null\n private readonly frameInterval: number\n\n constructor(options: RendererOptions = {}) {\n this.terminal = options.platform?.terminal ?? null\n const fps = Math.min(Math.max(options.fps ?? 60, 1), 120)\n this.frameInterval = Math.round(1000 / fps)\n }\n\n start(): void {\n if (this.ticker) {\n return\n }\n this.ticker = setInterval(() => this.flush(), this.frameInterval)\n }\n\n stop(): void {\n this.flush()\n if (this.ticker) {\n clearInterval(this.ticker)\n this.ticker = null\n }\n }\n\n write(view: string): void {\n this.nextFrame = view ?? ''\n }\n\n repaint(): void {\n this.lastFrame = ''\n }\n\n private flush(): void {\n if (this.nextFrame === null) {\n return\n }\n const frame = this.nextFrame\n if (frame === this.lastFrame) {\n return\n }\n this.lastFrame = frame\n // Clear the full screen before writing the next frame to avoid leftover characters\n if (this.terminal) {\n this.terminal.write(`${CLEAR_SCREEN}${CURSOR_HOME}${frame}`)\n }\n }\n}\n","import type { PlatformAdapter, TerminalAdapter } from '@boba-cli/machine'\nimport {\n CURSOR_SHOW,\n CURSOR_HIDE,\n CLEAR_SCREEN,\n CURSOR_HOME,\n ALT_SCREEN_ON,\n ALT_SCREEN_OFF,\n MOUSE_CELL_ON,\n MOUSE_ALL_ON,\n MOUSE_SGR_ON,\n MOUSE_CELL_OFF,\n MOUSE_ALL_OFF,\n MOUSE_SGR_OFF,\n BRACKETED_PASTE_ON,\n BRACKETED_PASTE_OFF,\n REPORT_FOCUS_ON,\n REPORT_FOCUS_OFF,\n} from '@boba-cli/machine'\n\n/** @public Options for the terminal controller. */\nexport interface TerminalOptions {\n platform?: PlatformAdapter\n}\n\nexport class TerminalController {\n private rawMode = false\n private altScreen = false\n private bracketedPaste = false\n private focusReporting = false\n private readonly terminal: TerminalAdapter | null\n\n constructor(platform?: PlatformAdapter) {\n this.terminal = platform?.terminal ?? null\n }\n\n enableRawMode(): void {\n if (this.terminal && !this.rawMode) {\n this.terminal.enableRawMode()\n this.rawMode = true\n }\n }\n\n disableRawMode(): void {\n if (this.terminal && this.rawMode) {\n this.terminal.disableRawMode()\n this.rawMode = false\n }\n }\n\n enterAltScreen(): void {\n this.write(ALT_SCREEN_ON)\n this.altScreen = true\n }\n\n exitAltScreen(): void {\n this.write(ALT_SCREEN_OFF)\n this.altScreen = false\n }\n\n clearScreen(): void {\n this.write(`${CLEAR_SCREEN}${CURSOR_HOME}`)\n }\n\n showCursor(): void {\n this.write(CURSOR_SHOW)\n }\n\n hideCursor(): void {\n this.write(CURSOR_HIDE)\n }\n\n enableMouseCellMotion(): void {\n this.write(MOUSE_CELL_ON)\n this.write(MOUSE_SGR_ON)\n }\n\n enableMouseAllMotion(): void {\n this.write(MOUSE_ALL_ON)\n this.write(MOUSE_SGR_ON)\n }\n\n disableMouse(): void {\n this.write(MOUSE_CELL_OFF)\n this.write(MOUSE_ALL_OFF)\n this.write(MOUSE_SGR_OFF)\n }\n\n enableBracketedPaste(): void {\n this.write(BRACKETED_PASTE_ON)\n this.bracketedPaste = true\n }\n\n disableBracketedPaste(): void {\n this.write(BRACKETED_PASTE_OFF)\n this.bracketedPaste = false\n }\n\n enableReportFocus(): void {\n this.write(REPORT_FOCUS_ON)\n this.focusReporting = true\n }\n\n disableReportFocus(): void {\n this.write(REPORT_FOCUS_OFF)\n this.focusReporting = false\n }\n\n setWindowTitle(title: string): void {\n this.write(`\\u001b]0;${title}\\u0007`)\n }\n\n cleanup(): void {\n this.disableMouse()\n if (this.focusReporting) {\n this.disableReportFocus()\n }\n if (this.bracketedPaste) {\n this.disableBracketedPaste()\n }\n this.showCursor()\n if (this.altScreen) {\n this.exitAltScreen()\n }\n this.disableRawMode()\n }\n\n write(data: string): void {\n if (data.length === 0) {\n return\n }\n if (this.terminal) {\n this.terminal.write(data)\n }\n }\n}\n","import type { PlatformAdapter } from '@boba-cli/machine'\nimport { startInput } from './input.js'\nimport {\n ClearScreenMsg,\n DisableMouseMsg,\n EnableMouseAllMotionMsg,\n EnableMouseCellMotionMsg,\n EnterAltScreenMsg,\n ExitAltScreenMsg,\n HideCursorMsg,\n InterruptMsg,\n QuitMsg,\n ResumeMsg,\n SetWindowTitleMsg,\n ShowCursorMsg,\n} from './messages.js'\nimport { StandardRenderer } from './renderer.js'\nimport { TerminalController } from './terminal.js'\nimport type { Cmd, Model, ModelMsg, Msg, ProgramResult } from './types.js'\nimport { WindowSizeMsg } from './messages.js'\n\n/** @public Configure program runtime options. */\nexport interface ProgramOptions {\n altScreen?: boolean\n mouseMode?: 'cell' | 'all' | false\n platform?: PlatformAdapter\n fps?: number\n reportFocus?: boolean\n bracketedPaste?: boolean\n}\n\n/** @public Bubble Tea-style program runner. */\nexport class Program<M extends Model<Msg, M>> {\n private model: M\n private readonly terminal: TerminalController\n private readonly renderer: StandardRenderer\n private readonly opts: ProgramOptions\n private readonly platform: PlatformAdapter | undefined\n private stopInput?: () => void\n private running = false\n private queue: Msg[] = []\n private draining = false\n private result: ProgramResult<M> | null = null\n private resolveWait?: () => void\n\n constructor(model: M, options: ProgramOptions = {}) {\n this.model = model\n this.opts = options\n this.platform = options.platform\n this.terminal = new TerminalController(options.platform)\n this.renderer = new StandardRenderer({\n platform: options.platform,\n fps: options.fps,\n })\n }\n\n async run(): Promise<ProgramResult<M>> {\n this.running = true\n this.setupTerminal()\n this.setupSignals()\n this.renderer.start()\n\n try {\n this.runCmd(this.model.init())\n this.renderer.write(this.model.view())\n this.startInputLoop()\n // Wait until the program is explicitly quit\n await this.waitUntilDone()\n this.result = { model: this.model }\n } catch (err) {\n this.result = { model: this.model, error: err }\n } finally {\n this.shutdown()\n }\n\n return this.result ?? { model: this.model }\n }\n\n private waitUntilDone(): Promise<void> {\n return new Promise((resolve) => {\n this.resolveWait = resolve\n // If already not running, resolve immediately\n if (!this.running) {\n resolve()\n }\n })\n }\n\n send(msg: Msg): void {\n if (!msg) {\n return\n }\n this.queue.push(msg)\n if (!this.draining) {\n void this.drainQueue()\n }\n }\n\n quit(): void {\n this.send(new QuitMsg())\n }\n\n kill(): void {\n this.running = false\n this.shutdown()\n }\n\n private drainQueue(): void {\n if (this.draining) {\n return\n }\n this.draining = true\n\n while (this.running && this.queue.length > 0) {\n const msg = this.queue.shift()\n if (msg === undefined) {\n continue\n }\n\n const consumed = this.handleInternal(msg)\n if (consumed) {\n continue\n }\n\n const [nextModel, cmd] = this.model.update(msg)\n this.model = nextModel\n\n this.runCmd(cmd)\n this.renderer.write(this.model.view())\n }\n\n this.draining = false\n }\n\n private handleInternal(msg: Msg): boolean {\n if (msg instanceof QuitMsg || msg instanceof InterruptMsg) {\n this.running = false\n if (this.resolveWait) {\n this.resolveWait()\n }\n return true\n }\n if (msg instanceof ClearScreenMsg) {\n this.terminal.clearScreen()\n return false\n }\n if (msg instanceof EnterAltScreenMsg) {\n this.terminal.enterAltScreen()\n this.renderer.repaint()\n return false\n }\n if (msg instanceof ExitAltScreenMsg) {\n this.terminal.exitAltScreen()\n this.renderer.repaint()\n return false\n }\n if (msg instanceof EnableMouseCellMotionMsg) {\n this.terminal.enableMouseCellMotion()\n return false\n }\n if (msg instanceof EnableMouseAllMotionMsg) {\n this.terminal.enableMouseAllMotion()\n return false\n }\n if (msg instanceof DisableMouseMsg) {\n this.terminal.disableMouse()\n return false\n }\n if (msg instanceof ShowCursorMsg) {\n this.terminal.showCursor()\n return false\n }\n if (msg instanceof HideCursorMsg) {\n this.terminal.hideCursor()\n return false\n }\n if (msg instanceof SetWindowTitleMsg) {\n this.terminal.setWindowTitle(msg.title)\n return false\n }\n if (msg instanceof ResumeMsg) {\n return false\n }\n return false\n }\n\n private runCmd<T extends Msg>(cmd: Cmd<T> | undefined): void {\n if (!cmd) {\n return\n }\n\n const handleResult = (result: T | T[] | null | undefined) => {\n if (result === null || result === undefined) {\n return\n }\n if (Array.isArray(result)) {\n for (const msg of result) {\n this.send(msg)\n }\n } else {\n this.send(result)\n }\n }\n\n try {\n const effect = cmd()\n if (effect instanceof Promise) {\n effect.then(handleResult).catch((err) => {\n // Preserve behavior but don't block other messages\n console.error(err)\n })\n } else {\n handleResult(effect)\n }\n } catch (err) {\n console.error(err)\n }\n }\n\n private setupTerminal(): void {\n this.terminal.enableRawMode()\n this.terminal.hideCursor()\n\n if (this.opts.altScreen) {\n this.terminal.enterAltScreen()\n this.terminal.clearScreen()\n }\n\n if (this.opts.mouseMode === 'cell') {\n this.terminal.enableMouseCellMotion()\n } else if (this.opts.mouseMode === 'all') {\n this.terminal.enableMouseAllMotion()\n }\n\n if (this.opts.bracketedPaste !== false) {\n this.terminal.enableBracketedPaste()\n }\n\n if (this.opts.reportFocus) {\n this.terminal.enableReportFocus()\n }\n }\n\n private startInputLoop(): void {\n this.stopInput = startInput({\n platform: this.platform,\n onMessage: (msg) => this.send(msg as ModelMsg<M>),\n })\n }\n\n private setupSignals(): void {\n const disposables: (() => void)[] = []\n\n // Set up signal handlers if platform adapter is available\n if (this.platform) {\n const intDisposable = this.platform.signals.onInterrupt(this.onSigInt)\n const termDisposable = this.platform.signals.onTerminate(this.onSigTerm)\n disposables.push(\n () => intDisposable.dispose(),\n () => termDisposable.dispose(),\n )\n\n // Set up resize handler\n const handleResize = (size: { columns: number; rows: number }) => {\n this.send(new WindowSizeMsg(size.columns, size.rows))\n }\n const resizeDisposable =\n this.platform.terminal.onResize(handleResize)\n disposables.push(() => resizeDisposable.dispose())\n\n // Send initial size\n const initialSize = this.platform.terminal.getSize()\n this.send(new WindowSizeMsg(initialSize.columns, initialSize.rows))\n }\n\n this.disposeSignals = () => {\n for (const dispose of disposables) {\n dispose()\n }\n }\n }\n\n private disposeSignals: (() => void) | null = null\n\n private onSigInt = (): void => {\n this.send(new InterruptMsg())\n }\n\n private onSigTerm = (): void => {\n this.send(new QuitMsg())\n }\n\n private shutdown(): void {\n if (this.disposeSignals) {\n this.disposeSignals()\n this.disposeSignals = null\n }\n if (this.stopInput) {\n this.stopInput()\n this.stopInput = undefined\n }\n this.renderer.stop()\n this.terminal.cleanup()\n if (this.platform) {\n this.platform.dispose()\n }\n }\n}\n","import { QuitMsg } from './messages.js'\nimport { Cmd, Effect, Msg } from './types.js'\n\ntype MsgOrArray<M extends Msg> = M | M[]\n\nconst now = () => new Date()\n\n/**\n * @public\n * Run multiple commands concurrently and flatten their results.\n */\nexport function batch<M extends Msg>(...cmds: Array<Cmd<M>>): Cmd<M> {\n const valid = cmds.filter((cmd): cmd is Cmd<M> => Boolean(cmd))\n if (valid.length === 0) {\n return null\n }\n if (valid.length === 1) {\n const [only] = valid\n return only ?? null\n }\n return async () => {\n const results = await Promise.all(\n valid.map((cmd) => Promise.resolve(cmd?.())),\n )\n return flatten(results)\n }\n}\n\n/**\n * @public\n * Run commands sequentially, preserving order and skipping nulls.\n */\nexport function sequence<M extends Msg>(...cmds: Array<Cmd<M>>): Cmd<M> {\n const valid = cmds.filter((cmd): cmd is Cmd<M> => Boolean(cmd))\n if (valid.length === 0) {\n return null\n }\n if (valid.length === 1) {\n const [only] = valid\n return only ?? null\n }\n return async () => {\n const messages: Array<MsgOrArray<M>> = []\n for (const cmd of valid) {\n const result = await Promise.resolve(cmd?.())\n if (result !== null && result !== undefined) {\n messages.push(result)\n }\n }\n return flatten(messages)\n }\n}\n\n/**\n * @public\n * Emit a message after a delay.\n */\nexport function tick<M extends Msg>(ms: number, fn: (t: Date) => M): Cmd<M> {\n return () =>\n new Promise<M>((resolve) => {\n setTimeout(() => resolve(fn(now())), ms)\n })\n}\n\n/**\n * @public\n * Schedule a single message aligned to the next interval boundary.\n * Call again from your update loop to continue a repeating cadence.\n */\nexport function every<M extends Msg>(ms: number, fn: (t: Date) => M): Cmd<M> {\n return () =>\n new Promise<M>((resolve) => {\n const current = now()\n const delay = alignToInterval(current, ms)\n setTimeout(() => resolve(fn(now())), delay)\n })\n}\n\n/** @public Lift a message into a command. */\nexport const msg =\n <M extends Msg>(value: M): Cmd<M> =>\n () =>\n value\n/** @public Command that emits a QuitMsg. */\nexport const quit = (): Cmd<Msg> => msg(new QuitMsg())\n\nfunction flatten<M extends Msg>(\n values: Array<Effect<M>>,\n): MsgOrArray<M> | null {\n const results: M[] = []\n for (const value of values) {\n if (value === null || value === undefined) {\n continue\n }\n if (Array.isArray(value)) {\n results.push(...value)\n } else {\n results.push(value)\n }\n }\n if (results.length === 0) {\n return null\n }\n if (results.length === 1) {\n return results[0] as M\n }\n return results\n}\n\nfunction alignToInterval(date: Date, ms: number): number {\n const next = new Date(date)\n next.setMilliseconds(0)\n const remainder = date.getTime() % ms\n return remainder === 0 ? ms : ms - remainder\n}\n","import type { PlatformAdapter } from '@boba-cli/machine'\nimport {\n ClearScreenMsg,\n DisableMouseMsg,\n EnableMouseAllMotionMsg,\n EnableMouseCellMotionMsg,\n EnterAltScreenMsg,\n ExitAltScreenMsg,\n HideCursorMsg,\n SetWindowTitleMsg,\n ShowCursorMsg,\n WindowSizeMsg,\n} from './messages.js'\nimport type { Cmd, Msg } from './types.js'\n\n/** @public Clear the terminal screen. */\nexport const clearScreen = (): Cmd<Msg> => () => new ClearScreenMsg()\n/** @public Enter the alternate screen buffer. */\nexport const enterAltScreen = (): Cmd<Msg> => () => new EnterAltScreenMsg()\n/** @public Exit the alternate screen buffer. */\nexport const exitAltScreen = (): Cmd<Msg> => () => new ExitAltScreenMsg()\n/** @public Enable cell-motion mouse reporting. */\nexport const enableMouseCellMotion = (): Cmd<Msg> => () =>\n new EnableMouseCellMotionMsg()\n/** @public Enable all-motion mouse reporting. */\nexport const enableMouseAllMotion = (): Cmd<Msg> => () =>\n new EnableMouseAllMotionMsg()\n/** @public Disable mouse reporting. */\nexport const disableMouse = (): Cmd<Msg> => () => new DisableMouseMsg()\n/** @public Show the cursor. */\nexport const showCursor = (): Cmd<Msg> => () => new ShowCursorMsg()\n/** @public Hide the cursor. */\nexport const hideCursor = (): Cmd<Msg> => () => new HideCursorMsg()\n/** @public Set the terminal window title. */\nexport const setWindowTitle =\n (title: string): Cmd<Msg> =>\n () =>\n new SetWindowTitleMsg(title)\n/**\n * @public\n * Emit the current window size.\n * @param platform - Optional platform adapter to get terminal size from\n */\nexport const windowSize =\n (platform?: PlatformAdapter): Cmd<Msg> =>\n () => {\n if (platform) {\n const size = platform.terminal.getSize()\n return new WindowSizeMsg(size.columns, size.rows)\n }\n return new WindowSizeMsg(0, 0)\n }\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/messages.ts","../src/keys.ts","../src/mouse.ts","../src/input.ts","../src/renderer.ts","../src/terminal.ts","../src/program.ts","../src/commands.ts","../src/screen.ts"],"names":["KeyType","decodeString","byteLength","rune","decodeFirstRune","MouseAction","MouseButton","allocBytes","concatBytes","encodeString","CLEAR_SCREEN","CURSOR_HOME","ALT_SCREEN_ON","ALT_SCREEN_OFF","CURSOR_SHOW","CURSOR_HIDE","MOUSE_CELL_ON","MOUSE_SGR_ON","MOUSE_ALL_ON","MOUSE_CELL_OFF","MOUSE_ALL_OFF","MOUSE_SGR_OFF","BRACKETED_PASTE_ON","BRACKETED_PASTE_OFF","REPORT_FOCUS_ON","REPORT_FOCUS_OFF","msg"],"mappings":"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","file":"index.cjs","sourcesContent":["/** @public Request graceful program termination. */\nexport class QuitMsg {\n readonly _tag = 'quit'\n}\n\n/** @public Interrupt the program (SIGINT). */\nexport class InterruptMsg {\n readonly _tag = 'interrupt'\n}\n\n/** @public Suspend the program (Ctrl+Z). */\nexport class SuspendMsg {\n readonly _tag = 'suspend'\n}\n\n/** @public Resume the program after suspension. */\nexport class ResumeMsg {\n readonly _tag = 'resume'\n}\n\n/** @public Report the current terminal width and height. */\nexport class WindowSizeMsg {\n readonly _tag = 'window-size'\n constructor(\n public readonly width: number,\n public readonly height: number,\n ) {}\n}\n\n/** @public Terminal focus gained. */\nexport class FocusMsg {\n readonly _tag = 'focus'\n}\n\n/** @public Terminal focus lost. */\nexport class BlurMsg {\n readonly _tag = 'blur'\n}\n\n/** @public Clear the terminal screen. */\nexport class ClearScreenMsg {\n readonly _tag = 'clear-screen'\n}\n\n/** @public Enter the alternate screen buffer. */\nexport class EnterAltScreenMsg {\n readonly _tag = 'enter-alt-screen'\n}\n\n/** @public Exit the alternate screen buffer. */\nexport class ExitAltScreenMsg {\n readonly _tag = 'exit-alt-screen'\n}\n\n/** @public Enable cell-based mouse reporting. */\nexport class EnableMouseCellMotionMsg {\n readonly _tag = 'enable-mouse-cell-motion'\n}\n\n/** @public Enable all-motion mouse reporting. */\nexport class EnableMouseAllMotionMsg {\n readonly _tag = 'enable-mouse-all-motion'\n}\n\n/** @public Disable mouse reporting. */\nexport class DisableMouseMsg {\n readonly _tag = 'disable-mouse'\n}\n\n/** @public Show the cursor. */\nexport class ShowCursorMsg {\n readonly _tag = 'show-cursor'\n}\n\n/** @public Hide the cursor. */\nexport class HideCursorMsg {\n readonly _tag = 'hide-cursor'\n}\n\n/** @public Enable focus in/out reporting. */\nexport class EnableReportFocusMsg {\n readonly _tag = 'enable-report-focus'\n}\n\n/** @public Disable focus in/out reporting. */\nexport class DisableReportFocusMsg {\n readonly _tag = 'disable-report-focus'\n}\n\n/** @public Set the terminal window title. */\nexport class SetWindowTitleMsg {\n readonly _tag = 'set-window-title'\n constructor(public readonly title: string) {}\n}\n","import { decodeFirstRune, decodeString, byteLength } from '@boba-cli/machine'\n\n/** @public Known key types parsed from terminal input. */\nexport enum KeyType {\n Null = 'null',\n Break = 'break',\n Enter = 'enter',\n Backspace = 'backspace',\n Tab = 'tab',\n Esc = 'esc',\n Space = 'space',\n Runes = 'runes',\n Up = 'up',\n Down = 'down',\n Right = 'right',\n Left = 'left',\n ShiftTab = 'shift+tab',\n Home = 'home',\n End = 'end',\n PgUp = 'pgup',\n PgDown = 'pgdown',\n CtrlPgUp = 'ctrl+pgup',\n CtrlPgDown = 'ctrl+pgdown',\n Delete = 'delete',\n Insert = 'insert',\n CtrlUp = 'ctrl+up',\n CtrlDown = 'ctrl+down',\n CtrlRight = 'ctrl+right',\n CtrlLeft = 'ctrl+left',\n CtrlHome = 'ctrl+home',\n CtrlEnd = 'ctrl+end',\n ShiftUp = 'shift+up',\n ShiftDown = 'shift+down',\n ShiftRight = 'shift+right',\n ShiftLeft = 'shift+left',\n ShiftHome = 'shift+home',\n ShiftEnd = 'shift+end',\n CtrlShiftUp = 'ctrl+shift+up',\n CtrlShiftDown = 'ctrl+shift+down',\n CtrlShiftLeft = 'ctrl+shift+left',\n CtrlShiftRight = 'ctrl+shift+right',\n CtrlShiftHome = 'ctrl+shift+home',\n CtrlShiftEnd = 'ctrl+shift+end',\n F1 = 'f1',\n F2 = 'f2',\n F3 = 'f3',\n F4 = 'f4',\n F5 = 'f5',\n F6 = 'f6',\n F7 = 'f7',\n F8 = 'f8',\n F9 = 'f9',\n F10 = 'f10',\n F11 = 'f11',\n F12 = 'f12',\n F13 = 'f13',\n F14 = 'f14',\n F15 = 'f15',\n F16 = 'f16',\n F17 = 'f17',\n F18 = 'f18',\n F19 = 'f19',\n F20 = 'f20',\n}\n\n/** @public Parsed key metadata. */\nexport interface Key {\n type: KeyType\n runes: string\n alt: boolean\n paste: boolean\n}\n\nconst keyNames: Record<KeyType, string> = {\n [KeyType.Null]: 'ctrl+@',\n [KeyType.Break]: 'ctrl+c',\n [KeyType.Enter]: 'enter',\n [KeyType.Backspace]: 'backspace',\n [KeyType.Tab]: 'tab',\n [KeyType.Esc]: 'esc',\n [KeyType.Space]: ' ',\n [KeyType.Runes]: 'runes',\n [KeyType.Up]: 'up',\n [KeyType.Down]: 'down',\n [KeyType.Right]: 'right',\n [KeyType.Left]: 'left',\n [KeyType.ShiftTab]: 'shift+tab',\n [KeyType.Home]: 'home',\n [KeyType.End]: 'end',\n [KeyType.PgUp]: 'pgup',\n [KeyType.PgDown]: 'pgdown',\n [KeyType.CtrlPgUp]: 'ctrl+pgup',\n [KeyType.CtrlPgDown]: 'ctrl+pgdown',\n [KeyType.Delete]: 'delete',\n [KeyType.Insert]: 'insert',\n [KeyType.CtrlUp]: 'ctrl+up',\n [KeyType.CtrlDown]: 'ctrl+down',\n [KeyType.CtrlRight]: 'ctrl+right',\n [KeyType.CtrlLeft]: 'ctrl+left',\n [KeyType.CtrlHome]: 'ctrl+home',\n [KeyType.CtrlEnd]: 'ctrl+end',\n [KeyType.ShiftUp]: 'shift+up',\n [KeyType.ShiftDown]: 'shift+down',\n [KeyType.ShiftRight]: 'shift+right',\n [KeyType.ShiftLeft]: 'shift+left',\n [KeyType.ShiftHome]: 'shift+home',\n [KeyType.ShiftEnd]: 'shift+end',\n [KeyType.CtrlShiftUp]: 'ctrl+shift+up',\n [KeyType.CtrlShiftDown]: 'ctrl+shift+down',\n [KeyType.CtrlShiftLeft]: 'ctrl+shift+left',\n [KeyType.CtrlShiftRight]: 'ctrl+shift+right',\n [KeyType.CtrlShiftHome]: 'ctrl+shift+home',\n [KeyType.CtrlShiftEnd]: 'ctrl+shift+end',\n [KeyType.F1]: 'f1',\n [KeyType.F2]: 'f2',\n [KeyType.F3]: 'f3',\n [KeyType.F4]: 'f4',\n [KeyType.F5]: 'f5',\n [KeyType.F6]: 'f6',\n [KeyType.F7]: 'f7',\n [KeyType.F8]: 'f8',\n [KeyType.F9]: 'f9',\n [KeyType.F10]: 'f10',\n [KeyType.F11]: 'f11',\n [KeyType.F12]: 'f12',\n [KeyType.F13]: 'f13',\n [KeyType.F14]: 'f14',\n [KeyType.F15]: 'f15',\n [KeyType.F16]: 'f16',\n [KeyType.F17]: 'f17',\n [KeyType.F18]: 'f18',\n [KeyType.F19]: 'f19',\n [KeyType.F20]: 'f20',\n}\n\nconst controlKeyMap: Record<number, KeyType | undefined> = {\n 0: KeyType.Null,\n 3: KeyType.Break,\n 9: KeyType.Tab,\n 10: KeyType.Enter,\n 13: KeyType.Enter,\n 27: KeyType.Esc,\n 127: KeyType.Backspace,\n}\n\ntype Sequence = [string, Key]\n\nconst sequences: Sequence[] = [\n ['\\u001b[A', { type: KeyType.Up, runes: '', alt: false, paste: false }],\n ['\\u001b[B', { type: KeyType.Down, runes: '', alt: false, paste: false }],\n ['\\u001b[C', { type: KeyType.Right, runes: '', alt: false, paste: false }],\n ['\\u001b[D', { type: KeyType.Left, runes: '', alt: false, paste: false }],\n ['\\u001b[Z', { type: KeyType.ShiftTab, runes: '', alt: false, paste: false }],\n ['\\u001b[2~', { type: KeyType.Insert, runes: '', alt: false, paste: false }],\n ['\\u001b[3~', { type: KeyType.Delete, runes: '', alt: false, paste: false }],\n ['\\u001b[5~', { type: KeyType.PgUp, runes: '', alt: false, paste: false }],\n ['\\u001b[6~', { type: KeyType.PgDown, runes: '', alt: false, paste: false }],\n ['\\u001b[1~', { type: KeyType.Home, runes: '', alt: false, paste: false }],\n ['\\u001b[4~', { type: KeyType.End, runes: '', alt: false, paste: false }],\n ['\\u001b[H', { type: KeyType.Home, runes: '', alt: false, paste: false }],\n ['\\u001b[F', { type: KeyType.End, runes: '', alt: false, paste: false }],\n ['\\u001bOP', { type: KeyType.F1, runes: '', alt: false, paste: false }],\n ['\\u001bOQ', { type: KeyType.F2, runes: '', alt: false, paste: false }],\n ['\\u001bOR', { type: KeyType.F3, runes: '', alt: false, paste: false }],\n ['\\u001bOS', { type: KeyType.F4, runes: '', alt: false, paste: false }],\n ['\\u001b[15~', { type: KeyType.F5, runes: '', alt: false, paste: false }],\n ['\\u001b[17~', { type: KeyType.F6, runes: '', alt: false, paste: false }],\n ['\\u001b[18~', { type: KeyType.F7, runes: '', alt: false, paste: false }],\n ['\\u001b[19~', { type: KeyType.F8, runes: '', alt: false, paste: false }],\n ['\\u001b[20~', { type: KeyType.F9, runes: '', alt: false, paste: false }],\n ['\\u001b[21~', { type: KeyType.F10, runes: '', alt: false, paste: false }],\n ['\\u001b[23~', { type: KeyType.F11, runes: '', alt: false, paste: false }],\n ['\\u001b[24~', { type: KeyType.F12, runes: '', alt: false, paste: false }],\n [\n '\\u001b[1;2A',\n { type: KeyType.ShiftUp, runes: '', alt: false, paste: false },\n ],\n [\n '\\u001b[1;2B',\n { type: KeyType.ShiftDown, runes: '', alt: false, paste: false },\n ],\n [\n '\\u001b[1;2C',\n { type: KeyType.ShiftRight, runes: '', alt: false, paste: false },\n ],\n [\n '\\u001b[1;2D',\n { type: KeyType.ShiftLeft, runes: '', alt: false, paste: false },\n ],\n [\n '\\u001b[1;5A',\n { type: KeyType.CtrlUp, runes: '', alt: false, paste: false },\n ],\n [\n '\\u001b[1;5B',\n { type: KeyType.CtrlDown, runes: '', alt: false, paste: false },\n ],\n [\n '\\u001b[1;5C',\n { type: KeyType.CtrlRight, runes: '', alt: false, paste: false },\n ],\n [\n '\\u001b[1;5D',\n { type: KeyType.CtrlLeft, runes: '', alt: false, paste: false },\n ],\n [\n '\\u001b[1;6A',\n { type: KeyType.CtrlShiftUp, runes: '', alt: false, paste: false },\n ],\n [\n '\\u001b[1;6B',\n { type: KeyType.CtrlShiftDown, runes: '', alt: false, paste: false },\n ],\n [\n '\\u001b[1;6C',\n { type: KeyType.CtrlShiftRight, runes: '', alt: false, paste: false },\n ],\n [\n '\\u001b[1;6D',\n { type: KeyType.CtrlShiftLeft, runes: '', alt: false, paste: false },\n ],\n ['\\u001b[1;3A', { type: KeyType.Up, runes: '', alt: true, paste: false }],\n ['\\u001b[1;3B', { type: KeyType.Down, runes: '', alt: true, paste: false }],\n ['\\u001b[1;3C', { type: KeyType.Right, runes: '', alt: true, paste: false }],\n ['\\u001b[1;3D', { type: KeyType.Left, runes: '', alt: true, paste: false }],\n [\n '\\u001b[5;5~',\n { type: KeyType.CtrlPgUp, runes: '', alt: false, paste: false },\n ],\n [\n '\\u001b[6;5~',\n { type: KeyType.CtrlPgDown, runes: '', alt: false, paste: false },\n ],\n ['\\u001b[5;3~', { type: KeyType.PgUp, runes: '', alt: true, paste: false }],\n ['\\u001b[6;3~', { type: KeyType.PgDown, runes: '', alt: true, paste: false }],\n ['\\u001b[3;2~', { type: KeyType.Insert, runes: '', alt: true, paste: false }],\n ['\\u001b[3;3~', { type: KeyType.Delete, runes: '', alt: true, paste: false }],\n ['\\u001b[[A', { type: KeyType.F1, runes: '', alt: false, paste: false }],\n ['\\u001b[[B', { type: KeyType.F2, runes: '', alt: false, paste: false }],\n ['\\u001b[[C', { type: KeyType.F3, runes: '', alt: false, paste: false }],\n ['\\u001b[[D', { type: KeyType.F4, runes: '', alt: false, paste: false }],\n ['\\u001b[[E', { type: KeyType.F5, runes: '', alt: false, paste: false }],\n]\n\n/** @public Message representing a parsed key event. */\nexport class KeyMsg {\n readonly _tag = 'key'\n constructor(public readonly key: Key) {}\n\n toString(): string {\n return keyToString(this.key)\n }\n}\n\n/** @public Convert a parsed key to a human-readable string. */\nexport function keyToString(key: Key): string {\n if (key.type === KeyType.Runes) {\n const value = key.paste ? `[${key.runes}]` : key.runes\n return key.alt ? `alt+${value}` : value\n }\n const base = keyNames[key.type] ?? ''\n return key.alt ? `alt+${base}` : base\n}\n\n/** @internal */\nexport function parseKey(\n buffer: Uint8Array,\n allowMoreData: boolean,\n): { key: Key; length: number } | { needMore: true } | undefined {\n if (buffer.length === 0) {\n return allowMoreData ? { needMore: true } : undefined\n }\n const input = decodeString(buffer)\n\n for (const [seq, key] of sequences) {\n if (input.startsWith(seq)) {\n return { key, length: byteLength(seq) }\n }\n if (allowMoreData && seq.startsWith(input)) {\n return { needMore: true }\n }\n }\n\n if (buffer[0] === 0x1b && buffer.length > 1) {\n const [rune, altLength] = decodeFirstRune(buffer, 1)\n if (altLength > 0 && rune !== null) {\n return {\n key: { type: KeyType.Runes, runes: rune, alt: true, paste: false },\n length: 1 + altLength,\n }\n }\n }\n\n const code: number = buffer[0] ?? 0\n const mapped: KeyType | undefined = Object.prototype.hasOwnProperty.call(\n controlKeyMap,\n code,\n )\n ? controlKeyMap[code]\n : undefined\n if (mapped !== undefined) {\n return {\n key: { type: mapped, runes: '', alt: false, paste: false },\n length: 1,\n }\n }\n\n const [rune, runeLength] = decodeFirstRune(buffer)\n if (runeLength === 0 || rune === null) {\n return allowMoreData ? { needMore: true } : undefined\n }\n\n if (rune === ' ') {\n return {\n key: { type: KeyType.Space, runes: rune, alt: false, paste: false },\n length: runeLength,\n }\n }\n\n return {\n key: { type: KeyType.Runes, runes: rune, alt: false, paste: false },\n length: runeLength,\n }\n}\n","import { decodeString } from '@boba-cli/machine'\n\n/** @public Mouse action type. */\nexport enum MouseAction {\n Press = 'press',\n Release = 'release',\n Motion = 'motion',\n}\n\n/** @public Mouse button identifiers, including wheels. */\nexport enum MouseButton {\n None = 'none',\n Left = 'left',\n Middle = 'middle',\n Right = 'right',\n WheelUp = 'wheel-up',\n WheelDown = 'wheel-down',\n WheelLeft = 'wheel-left',\n WheelRight = 'wheel-right',\n Backward = 'backward',\n Forward = 'forward',\n Button10 = 'button-10',\n Button11 = 'button-11',\n}\n\n/** @public Parsed mouse event payload. */\nexport interface MouseEvent {\n x: number\n y: number\n shift: boolean\n alt: boolean\n ctrl: boolean\n action: MouseAction\n button: MouseButton\n}\n\n/** @public Message representing a parsed mouse event. */\nexport class MouseMsg {\n readonly _tag = 'mouse'\n constructor(public readonly event: MouseEvent) {}\n\n toString(): string {\n const parts = [\n this.event.ctrl ? 'ctrl' : '',\n this.event.alt ? 'alt' : '',\n this.event.shift ? 'shift' : '',\n ].filter(Boolean)\n const mods = parts.length > 0 ? `${parts.join('+')}+` : ''\n return `${mods}${this.event.button} ${this.event.action} @${this.event.x},${this.event.y}`\n }\n}\n\nconst mouseSGRRegex = /(\\d+);(\\d+);(\\d+)([Mm])/\nconst mouseEventX10Len = 6\nconst x10MouseByteOffset = 32\n\n/** @internal */\nexport function parseMouse(\n buffer: Uint8Array,\n allowMoreData: boolean,\n): { msg: MouseMsg; length: number } | { needMore: true } | undefined {\n if (buffer.length < 3 || buffer[0] !== 0x1b || buffer[1] !== 0x5b) {\n return undefined\n }\n\n if (buffer[2] === 0x4d) {\n if (buffer.length < mouseEventX10Len) {\n return allowMoreData ? { needMore: true } : undefined\n }\n const event = parseX10MouseEvent(buffer.subarray(0, mouseEventX10Len))\n return { msg: new MouseMsg(event), length: mouseEventX10Len }\n }\n\n if (buffer[2] === 0x3c) {\n const slice = decodeString(buffer)\n const match = mouseSGRRegex.exec(slice.slice(3))\n if (!match) {\n return allowMoreData ? { needMore: true } : undefined\n }\n const event = parseSGRMouseEvent(slice)\n const matchedLength = match[0]?.length ?? 0\n return { msg: new MouseMsg(event), length: matchedLength + 3 }\n }\n\n return undefined\n}\n\nfunction parseSGRMouseEvent(seq: string): MouseEvent {\n const match = mouseSGRRegex.exec(seq.slice(3))\n if (!match) {\n return defaultMouseEvent()\n }\n\n const buttonCode = Number.parseInt(match[1] ?? '0', 10)\n const px = Number.parseInt(match[2] ?? '0', 10)\n const py = Number.parseInt(match[3] ?? '0', 10)\n const release = match[4] === 'm'\n\n const event = parseMouseButton(buttonCode, true)\n\n if (event.action !== MouseAction.Motion && !eventIsWheel(event) && release) {\n event.action = MouseAction.Release\n }\n\n event.x = px - 1\n event.y = py - 1\n\n return event\n}\n\nfunction parseX10MouseEvent(buf: Uint8Array): MouseEvent {\n const buttonByte = buf[3] ?? 0\n const c1 = buf[4] ?? 0\n const c2 = buf[5] ?? 0\n const event = parseMouseButton(buttonByte, false)\n event.x = c1 - x10MouseByteOffset - 1\n event.y = c2 - x10MouseByteOffset - 1\n return event\n}\n\nfunction parseMouseButton(code: number, isSGR: boolean): MouseEvent {\n let e = code\n if (!isSGR) {\n e -= x10MouseByteOffset\n }\n\n const bitShift = 0b0000_0100\n const bitAlt = 0b0000_1000\n const bitCtrl = 0b0001_0000\n const bitMotion = 0b0010_0000\n const bitWheel = 0b0100_0000\n const bitAdd = 0b1000_0000\n const bitsMask = 0b0000_0011\n\n const event = defaultMouseEvent()\n\n if ((e & bitAdd) !== 0) {\n const extraButtons: Record<number, MouseButton> = {\n 0: MouseButton.Backward,\n 1: MouseButton.Forward,\n 2: MouseButton.Button10,\n 3: MouseButton.Button11,\n }\n event.button = extraButtons[e & bitsMask] ?? MouseButton.None\n } else if ((e & bitWheel) !== 0) {\n const wheelButtons: Record<number, MouseButton> = {\n 0: MouseButton.WheelUp,\n 1: MouseButton.WheelDown,\n 2: MouseButton.WheelLeft,\n 3: MouseButton.WheelRight,\n }\n event.button = wheelButtons[e & bitsMask] ?? MouseButton.None\n } else {\n const baseButtons: Record<number, MouseButton> = {\n 0: MouseButton.Left,\n 1: MouseButton.Middle,\n 2: MouseButton.Right,\n 3: MouseButton.None,\n }\n event.button = baseButtons[e & bitsMask] ?? MouseButton.None\n if ((e & bitsMask) === bitsMask) {\n event.action = MouseAction.Release\n event.button = MouseButton.None\n }\n }\n\n if ((e & bitMotion) !== 0 && !eventIsWheel(event)) {\n event.action = MouseAction.Motion\n }\n\n event.alt = (e & bitAlt) !== 0\n event.ctrl = (e & bitCtrl) !== 0\n event.shift = (e & bitShift) !== 0\n\n return event\n}\n\nfunction eventIsWheel(event: MouseEvent): boolean {\n return (\n event.button === MouseButton.WheelUp ||\n event.button === MouseButton.WheelDown ||\n event.button === MouseButton.WheelLeft ||\n event.button === MouseButton.WheelRight\n )\n}\n\nfunction defaultMouseEvent(): MouseEvent {\n return {\n x: 0,\n y: 0,\n shift: false,\n alt: false,\n ctrl: false,\n action: MouseAction.Press,\n button: MouseButton.None,\n }\n}\n","import type { Disposable, PlatformAdapter } from '@boba-cli/machine'\nimport { allocBytes, concatBytes, encodeString } from '@boba-cli/machine'\nimport { BlurMsg, FocusMsg } from './messages.js'\nimport { KeyMsg, KeyType, parseKey } from './keys.js'\nimport { parseMouse } from './mouse.js'\nimport type { Msg } from './types.js'\n\n/** @public Options for the input reader. */\nexport interface InputOptions {\n platform?: PlatformAdapter\n onMessage: (msg: Msg) => void\n}\n\nconst BRACKET_PASTE_START = '\\u001b[200~'\nconst BRACKET_PASTE_END = '\\u001b[201~'\n\n/** @internal */\nexport function startInput(options: InputOptions): () => void {\n if (!options.platform) {\n // No platform adapter available, return no-op cleanup\n return () => {}\n }\n\n let buffer: Uint8Array = allocBytes(0)\n let disposable: Disposable | null = null\n\n const onData = (data: Uint8Array) => {\n buffer = concatBytes(buffer, data)\n buffer = consumeBuffer(buffer, options.onMessage)\n }\n\n disposable = options.platform.terminal.onInput(onData)\n\n return () => {\n if (disposable) {\n disposable.dispose()\n }\n }\n}\n\nfunction consumeBuffer(buffer: Uint8Array, push: (msg: Msg) => void): Uint8Array {\n let offset = 0\n\n while (offset < buffer.length) {\n const slice = buffer.subarray(offset)\n const result = detectOne(slice, offset + slice.length === buffer.length)\n\n if (!result || 'needMore' in result) {\n break\n }\n\n offset += result.length\n if (result.msg) {\n push(result.msg)\n }\n }\n\n return buffer.subarray(offset)\n}\n\ntype DetectResult =\n | { msg: Msg; length: number }\n | { msg?: Msg; length: number }\n | { needMore: true }\n\nfunction detectOne(\n buffer: Uint8Array,\n allowMoreData: boolean,\n): DetectResult | undefined {\n if (buffer.length === 0) {\n return allowMoreData ? { needMore: true } : undefined\n }\n const mouse = parseMouse(buffer, allowMoreData)\n if (mouse) {\n if ('needMore' in mouse) {\n return mouse\n }\n return { msg: mouse.msg, length: mouse.length }\n }\n\n const focus = detectFocus(buffer)\n if (focus) {\n return focus\n }\n\n const paste = detectBracketedPaste(buffer, allowMoreData)\n if (paste) {\n return paste\n }\n\n const key = parseKey(buffer, allowMoreData)\n if (!key) {\n return undefined\n }\n if ('needMore' in key) {\n return key\n }\n\n return { msg: new KeyMsg(key.key), length: key.length }\n}\n\nfunction detectFocus(buffer: Uint8Array): DetectResult | undefined {\n // Focus in: ESC [ I, Focus out: ESC [ O (exactly three bytes)\n if (buffer.length === 3 && buffer[0] === 0x1b && buffer[1] === 0x5b) {\n if (buffer[2] === 0x49) {\n return { msg: new FocusMsg(), length: 3 }\n }\n if (buffer[2] === 0x4f) {\n return { msg: new BlurMsg(), length: 3 }\n }\n }\n return undefined\n}\n\nfunction detectBracketedPaste(\n buffer: Uint8Array,\n allowMoreData: boolean,\n): DetectResult | undefined {\n const decoder = new TextDecoder('utf-8', { fatal: false })\n const asString = decoder.decode(buffer)\n if (!asString.startsWith(BRACKET_PASTE_START)) {\n return undefined\n }\n const endIndex = asString.indexOf(\n BRACKET_PASTE_END,\n BRACKET_PASTE_START.length,\n )\n if (endIndex === -1) {\n return allowMoreData ? { needMore: true } : undefined\n }\n const content = asString.slice(BRACKET_PASTE_START.length, endIndex)\n const fullString = BRACKET_PASTE_START + content + BRACKET_PASTE_END\n const length = encodeString(fullString).length\n const key: Msg = new KeyMsg({\n type: KeyType.Runes,\n runes: content,\n alt: false,\n paste: true,\n })\n return { msg: key, length }\n}\n","import type { PlatformAdapter, TerminalAdapter } from '@boba-cli/machine'\nimport { CURSOR_HOME, CLEAR_SCREEN } from '@boba-cli/machine'\n\n/** @public Options for the standard renderer. */\nexport interface RendererOptions {\n platform?: PlatformAdapter\n fps?: number\n}\n\n/** @public Standard renderer for terminal output. */\nexport class StandardRenderer {\n private nextFrame: string | null = null\n private lastFrame = ''\n private ticker: ReturnType<typeof setInterval> | null = null\n private readonly terminal: TerminalAdapter | null\n private readonly frameInterval: number\n\n constructor(options: RendererOptions = {}) {\n this.terminal = options.platform?.terminal ?? null\n const fps = Math.min(Math.max(options.fps ?? 60, 1), 120)\n this.frameInterval = Math.round(1000 / fps)\n }\n\n start(): void {\n if (this.ticker) {\n return\n }\n this.ticker = setInterval(() => this.flush(), this.frameInterval)\n }\n\n stop(): void {\n this.flush()\n if (this.ticker) {\n clearInterval(this.ticker)\n this.ticker = null\n }\n }\n\n write(view: string): void {\n this.nextFrame = view ?? ''\n }\n\n repaint(): void {\n this.lastFrame = ''\n }\n\n private flush(): void {\n if (this.nextFrame === null) {\n return\n }\n const frame = this.nextFrame\n if (frame === this.lastFrame) {\n return\n }\n this.lastFrame = frame\n // Clear the full screen before writing the next frame to avoid leftover characters\n if (this.terminal) {\n this.terminal.write(`${CLEAR_SCREEN}${CURSOR_HOME}${frame}`)\n }\n }\n}\n","import type { PlatformAdapter, TerminalAdapter } from '@boba-cli/machine'\nimport {\n CURSOR_SHOW,\n CURSOR_HIDE,\n CLEAR_SCREEN,\n CURSOR_HOME,\n ALT_SCREEN_ON,\n ALT_SCREEN_OFF,\n MOUSE_CELL_ON,\n MOUSE_ALL_ON,\n MOUSE_SGR_ON,\n MOUSE_CELL_OFF,\n MOUSE_ALL_OFF,\n MOUSE_SGR_OFF,\n BRACKETED_PASTE_ON,\n BRACKETED_PASTE_OFF,\n REPORT_FOCUS_ON,\n REPORT_FOCUS_OFF,\n} from '@boba-cli/machine'\n\n/** @public Options for the terminal controller. */\nexport interface TerminalOptions {\n platform?: PlatformAdapter\n}\n\n/** @public Controller for terminal state management. */\nexport class TerminalController {\n private rawMode = false\n private altScreen = false\n private bracketedPaste = false\n private focusReporting = false\n private readonly terminal: TerminalAdapter | null\n\n constructor(platform?: PlatformAdapter) {\n this.terminal = platform?.terminal ?? null\n }\n\n enableRawMode(): void {\n if (this.terminal && !this.rawMode) {\n this.terminal.enableRawMode()\n this.rawMode = true\n }\n }\n\n disableRawMode(): void {\n if (this.terminal && this.rawMode) {\n this.terminal.disableRawMode()\n this.rawMode = false\n }\n }\n\n enterAltScreen(): void {\n this.write(ALT_SCREEN_ON)\n this.altScreen = true\n }\n\n exitAltScreen(): void {\n this.write(ALT_SCREEN_OFF)\n this.altScreen = false\n }\n\n clearScreen(): void {\n this.write(`${CLEAR_SCREEN}${CURSOR_HOME}`)\n }\n\n showCursor(): void {\n this.write(CURSOR_SHOW)\n }\n\n hideCursor(): void {\n this.write(CURSOR_HIDE)\n }\n\n enableMouseCellMotion(): void {\n this.write(MOUSE_CELL_ON)\n this.write(MOUSE_SGR_ON)\n }\n\n enableMouseAllMotion(): void {\n this.write(MOUSE_ALL_ON)\n this.write(MOUSE_SGR_ON)\n }\n\n disableMouse(): void {\n this.write(MOUSE_CELL_OFF)\n this.write(MOUSE_ALL_OFF)\n this.write(MOUSE_SGR_OFF)\n }\n\n enableBracketedPaste(): void {\n this.write(BRACKETED_PASTE_ON)\n this.bracketedPaste = true\n }\n\n disableBracketedPaste(): void {\n this.write(BRACKETED_PASTE_OFF)\n this.bracketedPaste = false\n }\n\n enableReportFocus(): void {\n this.write(REPORT_FOCUS_ON)\n this.focusReporting = true\n }\n\n disableReportFocus(): void {\n this.write(REPORT_FOCUS_OFF)\n this.focusReporting = false\n }\n\n setWindowTitle(title: string): void {\n this.write(`\\u001b]0;${title}\\u0007`)\n }\n\n cleanup(): void {\n this.disableMouse()\n if (this.focusReporting) {\n this.disableReportFocus()\n }\n if (this.bracketedPaste) {\n this.disableBracketedPaste()\n }\n this.showCursor()\n if (this.altScreen) {\n this.exitAltScreen()\n }\n this.disableRawMode()\n }\n\n write(data: string): void {\n if (data.length === 0) {\n return\n }\n if (this.terminal) {\n this.terminal.write(data)\n }\n }\n}\n","import { type PlatformAdapter } from '@boba-cli/machine'\nimport { startInput } from './input.js'\nimport {\n ClearScreenMsg,\n DisableMouseMsg,\n EnableMouseAllMotionMsg,\n EnableMouseCellMotionMsg,\n EnterAltScreenMsg,\n ExitAltScreenMsg,\n HideCursorMsg,\n InterruptMsg,\n QuitMsg,\n ResumeMsg,\n SetWindowTitleMsg,\n ShowCursorMsg,\n} from './messages.js'\nimport { StandardRenderer } from './renderer.js'\nimport { TerminalController } from './terminal.js'\nimport type { Cmd, Model, ModelMsg, Msg, ProgramResult } from './types.js'\nimport { WindowSizeMsg } from './messages.js'\n\n/** @public Configure program runtime options. */\nexport interface ProgramOptions {\n altScreen?: boolean\n mouseMode?: 'cell' | 'all' | false\n /**\n * The platform adapter to use.\n *\n * @remarks\n * For Node.js, use `createNodePlatform()` from `@boba-cli/machine/node`.\n * For browser with xterm.js, use `createBrowserPlatform({ terminal })` from `@boba-cli/machine/browser`.\n */\n platform: PlatformAdapter\n fps?: number\n reportFocus?: boolean\n bracketedPaste?: boolean\n}\n\n/**\n * Bubble Tea-style program runner.\n *\n * @remarks\n * Requires a platform adapter to be provided via options.\n * Use `createNodePlatform()` from `@boba-cli/machine/node` for Node.js,\n * or `createBrowserPlatform({ terminal })` from `@boba-cli/machine/browser` for browsers.\n *\n * @public\n */\nexport class Program<M extends Model<Msg, M>> {\n private model: M\n private terminal: TerminalController\n private renderer: StandardRenderer\n private readonly opts: ProgramOptions\n private readonly platform: PlatformAdapter\n private stopInput?: () => void\n private running = false\n private queue: Msg[] = []\n private draining = false\n private result: ProgramResult<M> | null = null\n private resolveWait?: () => void\n\n constructor(model: M, options: ProgramOptions) {\n this.model = model\n this.opts = options\n this.platform = options.platform\n this.terminal = new TerminalController(this.platform)\n this.renderer = new StandardRenderer({\n platform: this.platform,\n fps: this.opts.fps,\n })\n }\n\n async run(): Promise<ProgramResult<M>> {\n this.running = true\n this.setupTerminal()\n this.setupSignals()\n this.renderer.start()\n\n try {\n this.runCmd(this.model.init())\n this.renderer.write(this.model.view())\n this.startInputLoop()\n // Wait until the program is explicitly quit\n await this.waitUntilDone()\n this.result = { model: this.model }\n } catch (err) {\n this.result = { model: this.model, error: err }\n } finally {\n this.shutdown()\n }\n\n return this.result ?? { model: this.model }\n }\n\n private waitUntilDone(): Promise<void> {\n return new Promise((resolve) => {\n this.resolveWait = resolve\n // If already not running, resolve immediately\n if (!this.running) {\n resolve()\n }\n })\n }\n\n send(msg: Msg): void {\n if (!msg) {\n return\n }\n this.queue.push(msg)\n if (!this.draining) {\n void this.drainQueue()\n }\n }\n\n quit(): void {\n this.send(new QuitMsg())\n }\n\n kill(): void {\n this.running = false\n this.shutdown()\n }\n\n private drainQueue(): void {\n if (this.draining) {\n return\n }\n this.draining = true\n\n while (this.running && this.queue.length > 0) {\n const msg = this.queue.shift()\n if (msg === undefined) {\n continue\n }\n\n const consumed = this.handleInternal(msg)\n if (consumed) {\n continue\n }\n\n const [nextModel, cmd] = this.model.update(msg)\n this.model = nextModel\n\n this.runCmd(cmd)\n this.renderer.write(this.model.view())\n }\n\n this.draining = false\n }\n\n private handleInternal(msg: Msg): boolean {\n if (msg instanceof QuitMsg || msg instanceof InterruptMsg) {\n this.running = false\n if (this.resolveWait) {\n this.resolveWait()\n }\n return true\n }\n if (msg instanceof ClearScreenMsg) {\n this.terminal.clearScreen()\n return false\n }\n if (msg instanceof EnterAltScreenMsg) {\n this.terminal.enterAltScreen()\n this.renderer.repaint()\n return false\n }\n if (msg instanceof ExitAltScreenMsg) {\n this.terminal.exitAltScreen()\n this.renderer.repaint()\n return false\n }\n if (msg instanceof EnableMouseCellMotionMsg) {\n this.terminal.enableMouseCellMotion()\n return false\n }\n if (msg instanceof EnableMouseAllMotionMsg) {\n this.terminal.enableMouseAllMotion()\n return false\n }\n if (msg instanceof DisableMouseMsg) {\n this.terminal.disableMouse()\n return false\n }\n if (msg instanceof ShowCursorMsg) {\n this.terminal.showCursor()\n return false\n }\n if (msg instanceof HideCursorMsg) {\n this.terminal.hideCursor()\n return false\n }\n if (msg instanceof SetWindowTitleMsg) {\n this.terminal.setWindowTitle(msg.title)\n return false\n }\n if (msg instanceof ResumeMsg) {\n return false\n }\n return false\n }\n\n private runCmd<T extends Msg>(cmd: Cmd<T> | undefined): void {\n if (!cmd) {\n return\n }\n\n const handleResult = (result: T | T[] | null | undefined) => {\n if (result === null || result === undefined) {\n return\n }\n if (Array.isArray(result)) {\n for (const msg of result) {\n this.send(msg)\n }\n } else {\n this.send(result)\n }\n }\n\n try {\n const effect = cmd()\n if (effect instanceof Promise) {\n effect.then(handleResult).catch((err) => {\n // Preserve behavior but don't block other messages\n console.error(err)\n })\n } else {\n handleResult(effect)\n }\n } catch (err) {\n console.error(err)\n }\n }\n\n private setupTerminal(): void {\n this.terminal.enableRawMode()\n this.terminal.hideCursor()\n\n if (this.opts.altScreen) {\n this.terminal.enterAltScreen()\n this.terminal.clearScreen()\n }\n\n if (this.opts.mouseMode === 'cell') {\n this.terminal.enableMouseCellMotion()\n } else if (this.opts.mouseMode === 'all') {\n this.terminal.enableMouseAllMotion()\n }\n\n if (this.opts.bracketedPaste !== false) {\n this.terminal.enableBracketedPaste()\n }\n\n if (this.opts.reportFocus) {\n this.terminal.enableReportFocus()\n }\n }\n\n private startInputLoop(): void {\n this.stopInput = startInput({\n platform: this.platform,\n onMessage: (msg) => this.send(msg as ModelMsg<M>),\n })\n }\n\n private setupSignals(): void {\n const disposables: (() => void)[] = []\n\n const intDisposable = this.platform.signals.onInterrupt(this.onSigInt)\n const termDisposable = this.platform.signals.onTerminate(this.onSigTerm)\n disposables.push(\n () => intDisposable.dispose(),\n () => termDisposable.dispose(),\n )\n\n // Set up resize handler\n const handleResize = (size: { columns: number; rows: number }) => {\n this.send(new WindowSizeMsg(size.columns, size.rows))\n }\n const resizeDisposable = this.platform.terminal.onResize(handleResize)\n disposables.push(() => resizeDisposable.dispose())\n\n // Send initial size\n const initialSize = this.platform.terminal.getSize()\n this.send(new WindowSizeMsg(initialSize.columns, initialSize.rows))\n\n this.disposeSignals = () => {\n for (const dispose of disposables) {\n dispose()\n }\n }\n }\n\n private disposeSignals: (() => void) | null = null\n\n private onSigInt = (): void => {\n this.send(new InterruptMsg())\n }\n\n private onSigTerm = (): void => {\n this.send(new QuitMsg())\n }\n\n private shutdown(): void {\n if (this.disposeSignals) {\n this.disposeSignals()\n this.disposeSignals = null\n }\n if (this.stopInput) {\n this.stopInput()\n this.stopInput = undefined\n }\n this.renderer.stop()\n this.terminal.cleanup()\n this.platform.dispose()\n }\n}\n","import { QuitMsg } from './messages.js'\nimport { Cmd, Effect, Msg } from './types.js'\n\ntype MsgOrArray<M extends Msg> = M | M[]\n\nconst now = () => new Date()\n\n/**\n * @public\n * Run multiple commands concurrently and flatten their results.\n */\nexport function batch<M extends Msg>(...cmds: Array<Cmd<M>>): Cmd<M> {\n const valid = cmds.filter((cmd): cmd is Cmd<M> => Boolean(cmd))\n if (valid.length === 0) {\n return null\n }\n if (valid.length === 1) {\n const [only] = valid\n return only ?? null\n }\n return async () => {\n const results = await Promise.all(\n valid.map((cmd) => Promise.resolve(cmd?.())),\n )\n return flatten(results)\n }\n}\n\n/**\n * @public\n * Run commands sequentially, preserving order and skipping nulls.\n */\nexport function sequence<M extends Msg>(...cmds: Array<Cmd<M>>): Cmd<M> {\n const valid = cmds.filter((cmd): cmd is Cmd<M> => Boolean(cmd))\n if (valid.length === 0) {\n return null\n }\n if (valid.length === 1) {\n const [only] = valid\n return only ?? null\n }\n return async () => {\n const messages: Array<MsgOrArray<M>> = []\n for (const cmd of valid) {\n const result = await Promise.resolve(cmd?.())\n if (result !== null && result !== undefined) {\n messages.push(result)\n }\n }\n return flatten(messages)\n }\n}\n\n/**\n * @public\n * Emit a message after a delay.\n */\nexport function tick<M extends Msg>(ms: number, fn: (t: Date) => M): Cmd<M> {\n return () =>\n new Promise<M>((resolve) => {\n setTimeout(() => resolve(fn(now())), ms)\n })\n}\n\n/**\n * @public\n * Schedule a single message aligned to the next interval boundary.\n * Call again from your update loop to continue a repeating cadence.\n */\nexport function every<M extends Msg>(ms: number, fn: (t: Date) => M): Cmd<M> {\n return () =>\n new Promise<M>((resolve) => {\n const current = now()\n const delay = alignToInterval(current, ms)\n setTimeout(() => resolve(fn(now())), delay)\n })\n}\n\n/** @public Lift a message into a command. */\nexport const msg =\n <M extends Msg>(value: M): Cmd<M> =>\n () =>\n value\n/** @public Command that emits a QuitMsg. */\nexport const quit = (): Cmd<Msg> => msg(new QuitMsg())\n\nfunction flatten<M extends Msg>(\n values: Array<Effect<M>>,\n): MsgOrArray<M> | null {\n const results: M[] = []\n for (const value of values) {\n if (value === null || value === undefined) {\n continue\n }\n if (Array.isArray(value)) {\n results.push(...value)\n } else {\n results.push(value)\n }\n }\n if (results.length === 0) {\n return null\n }\n if (results.length === 1) {\n return results[0] as M\n }\n return results\n}\n\nfunction alignToInterval(date: Date, ms: number): number {\n const next = new Date(date)\n next.setMilliseconds(0)\n const remainder = date.getTime() % ms\n return remainder === 0 ? ms : ms - remainder\n}\n","import type { PlatformAdapter } from '@boba-cli/machine'\nimport {\n ClearScreenMsg,\n DisableMouseMsg,\n EnableMouseAllMotionMsg,\n EnableMouseCellMotionMsg,\n EnterAltScreenMsg,\n ExitAltScreenMsg,\n HideCursorMsg,\n SetWindowTitleMsg,\n ShowCursorMsg,\n WindowSizeMsg,\n} from './messages.js'\nimport type { Cmd, Msg } from './types.js'\n\n/** @public Clear the terminal screen. */\nexport const clearScreen = (): Cmd<Msg> => () => new ClearScreenMsg()\n/** @public Enter the alternate screen buffer. */\nexport const enterAltScreen = (): Cmd<Msg> => () => new EnterAltScreenMsg()\n/** @public Exit the alternate screen buffer. */\nexport const exitAltScreen = (): Cmd<Msg> => () => new ExitAltScreenMsg()\n/** @public Enable cell-motion mouse reporting. */\nexport const enableMouseCellMotion = (): Cmd<Msg> => () =>\n new EnableMouseCellMotionMsg()\n/** @public Enable all-motion mouse reporting. */\nexport const enableMouseAllMotion = (): Cmd<Msg> => () =>\n new EnableMouseAllMotionMsg()\n/** @public Disable mouse reporting. */\nexport const disableMouse = (): Cmd<Msg> => () => new DisableMouseMsg()\n/** @public Show the cursor. */\nexport const showCursor = (): Cmd<Msg> => () => new ShowCursorMsg()\n/** @public Hide the cursor. */\nexport const hideCursor = (): Cmd<Msg> => () => new HideCursorMsg()\n/** @public Set the terminal window title. */\nexport const setWindowTitle =\n (title: string): Cmd<Msg> =>\n () =>\n new SetWindowTitleMsg(title)\n/**\n * @public\n * Emit the current window size.\n * @param platform - Optional platform adapter to get terminal size from\n */\nexport const windowSize =\n (platform?: PlatformAdapter): Cmd<Msg> =>\n () => {\n if (platform) {\n const size = platform.terminal.getSize()\n return new WindowSizeMsg(size.columns, size.rows)\n }\n return new WindowSizeMsg(0, 0)\n }\n"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -10,6 +10,7 @@ import { PlatformAdapter } from '@boba-cli/machine';
|
|
|
10
10
|
type Msg = {
|
|
11
11
|
readonly _tag: string;
|
|
12
12
|
};
|
|
13
|
+
/** @public Effect that can produce one or more messages synchronously. */
|
|
13
14
|
type Effect<M extends Msg = Msg> = M | M[] | null | undefined;
|
|
14
15
|
/** @public Function producing an effectful message or messages. */
|
|
15
16
|
type EffectFn<M extends Msg = Msg> = () => Effect<M> | Promise<Effect<M>>;
|
|
@@ -38,16 +39,32 @@ type ProgramResult<M extends Model> = {
|
|
|
38
39
|
interface ProgramOptions {
|
|
39
40
|
altScreen?: boolean;
|
|
40
41
|
mouseMode?: 'cell' | 'all' | false;
|
|
41
|
-
|
|
42
|
+
/**
|
|
43
|
+
* The platform adapter to use.
|
|
44
|
+
*
|
|
45
|
+
* @remarks
|
|
46
|
+
* For Node.js, use `createNodePlatform()` from `@boba-cli/machine/node`.
|
|
47
|
+
* For browser with xterm.js, use `createBrowserPlatform({ terminal })` from `@boba-cli/machine/browser`.
|
|
48
|
+
*/
|
|
49
|
+
platform: PlatformAdapter;
|
|
42
50
|
fps?: number;
|
|
43
51
|
reportFocus?: boolean;
|
|
44
52
|
bracketedPaste?: boolean;
|
|
45
53
|
}
|
|
46
|
-
/**
|
|
54
|
+
/**
|
|
55
|
+
* Bubble Tea-style program runner.
|
|
56
|
+
*
|
|
57
|
+
* @remarks
|
|
58
|
+
* Requires a platform adapter to be provided via options.
|
|
59
|
+
* Use `createNodePlatform()` from `@boba-cli/machine/node` for Node.js,
|
|
60
|
+
* or `createBrowserPlatform({ terminal })` from `@boba-cli/machine/browser` for browsers.
|
|
61
|
+
*
|
|
62
|
+
* @public
|
|
63
|
+
*/
|
|
47
64
|
declare class Program<M extends Model<Msg, M>> {
|
|
48
65
|
private model;
|
|
49
|
-
private
|
|
50
|
-
private
|
|
66
|
+
private terminal;
|
|
67
|
+
private renderer;
|
|
51
68
|
private readonly opts;
|
|
52
69
|
private readonly platform;
|
|
53
70
|
private stopInput?;
|
|
@@ -56,7 +73,7 @@ declare class Program<M extends Model<Msg, M>> {
|
|
|
56
73
|
private draining;
|
|
57
74
|
private result;
|
|
58
75
|
private resolveWait?;
|
|
59
|
-
constructor(model: M, options
|
|
76
|
+
constructor(model: M, options: ProgramOptions);
|
|
60
77
|
run(): Promise<ProgramResult<M>>;
|
|
61
78
|
private waitUntilDone;
|
|
62
79
|
send(msg: Msg): void;
|
package/dist/index.d.ts
CHANGED
|
@@ -10,6 +10,7 @@ import { PlatformAdapter } from '@boba-cli/machine';
|
|
|
10
10
|
type Msg = {
|
|
11
11
|
readonly _tag: string;
|
|
12
12
|
};
|
|
13
|
+
/** @public Effect that can produce one or more messages synchronously. */
|
|
13
14
|
type Effect<M extends Msg = Msg> = M | M[] | null | undefined;
|
|
14
15
|
/** @public Function producing an effectful message or messages. */
|
|
15
16
|
type EffectFn<M extends Msg = Msg> = () => Effect<M> | Promise<Effect<M>>;
|
|
@@ -38,16 +39,32 @@ type ProgramResult<M extends Model> = {
|
|
|
38
39
|
interface ProgramOptions {
|
|
39
40
|
altScreen?: boolean;
|
|
40
41
|
mouseMode?: 'cell' | 'all' | false;
|
|
41
|
-
|
|
42
|
+
/**
|
|
43
|
+
* The platform adapter to use.
|
|
44
|
+
*
|
|
45
|
+
* @remarks
|
|
46
|
+
* For Node.js, use `createNodePlatform()` from `@boba-cli/machine/node`.
|
|
47
|
+
* For browser with xterm.js, use `createBrowserPlatform({ terminal })` from `@boba-cli/machine/browser`.
|
|
48
|
+
*/
|
|
49
|
+
platform: PlatformAdapter;
|
|
42
50
|
fps?: number;
|
|
43
51
|
reportFocus?: boolean;
|
|
44
52
|
bracketedPaste?: boolean;
|
|
45
53
|
}
|
|
46
|
-
/**
|
|
54
|
+
/**
|
|
55
|
+
* Bubble Tea-style program runner.
|
|
56
|
+
*
|
|
57
|
+
* @remarks
|
|
58
|
+
* Requires a platform adapter to be provided via options.
|
|
59
|
+
* Use `createNodePlatform()` from `@boba-cli/machine/node` for Node.js,
|
|
60
|
+
* or `createBrowserPlatform({ terminal })` from `@boba-cli/machine/browser` for browsers.
|
|
61
|
+
*
|
|
62
|
+
* @public
|
|
63
|
+
*/
|
|
47
64
|
declare class Program<M extends Model<Msg, M>> {
|
|
48
65
|
private model;
|
|
49
|
-
private
|
|
50
|
-
private
|
|
66
|
+
private terminal;
|
|
67
|
+
private renderer;
|
|
51
68
|
private readonly opts;
|
|
52
69
|
private readonly platform;
|
|
53
70
|
private stopInput?;
|
|
@@ -56,7 +73,7 @@ declare class Program<M extends Model<Msg, M>> {
|
|
|
56
73
|
private draining;
|
|
57
74
|
private result;
|
|
58
75
|
private resolveWait?;
|
|
59
|
-
constructor(model: M, options
|
|
76
|
+
constructor(model: M, options: ProgramOptions);
|
|
60
77
|
run(): Promise<ProgramResult<M>>;
|
|
61
78
|
private waitUntilDone;
|
|
62
79
|
send(msg: Msg): void;
|
package/dist/index.js
CHANGED
|
@@ -760,14 +760,14 @@ var Program = class {
|
|
|
760
760
|
draining = false;
|
|
761
761
|
result = null;
|
|
762
762
|
resolveWait;
|
|
763
|
-
constructor(model, options
|
|
763
|
+
constructor(model, options) {
|
|
764
764
|
this.model = model;
|
|
765
765
|
this.opts = options;
|
|
766
766
|
this.platform = options.platform;
|
|
767
|
-
this.terminal = new TerminalController(
|
|
767
|
+
this.terminal = new TerminalController(this.platform);
|
|
768
768
|
this.renderer = new StandardRenderer({
|
|
769
|
-
platform:
|
|
770
|
-
fps:
|
|
769
|
+
platform: this.platform,
|
|
770
|
+
fps: this.opts.fps
|
|
771
771
|
});
|
|
772
772
|
}
|
|
773
773
|
async run() {
|
|
@@ -940,21 +940,19 @@ var Program = class {
|
|
|
940
940
|
}
|
|
941
941
|
setupSignals() {
|
|
942
942
|
const disposables = [];
|
|
943
|
-
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
this.send(new WindowSizeMsg(initialSize.columns, initialSize.rows));
|
|
957
|
-
}
|
|
943
|
+
const intDisposable = this.platform.signals.onInterrupt(this.onSigInt);
|
|
944
|
+
const termDisposable = this.platform.signals.onTerminate(this.onSigTerm);
|
|
945
|
+
disposables.push(
|
|
946
|
+
() => intDisposable.dispose(),
|
|
947
|
+
() => termDisposable.dispose()
|
|
948
|
+
);
|
|
949
|
+
const handleResize = (size) => {
|
|
950
|
+
this.send(new WindowSizeMsg(size.columns, size.rows));
|
|
951
|
+
};
|
|
952
|
+
const resizeDisposable = this.platform.terminal.onResize(handleResize);
|
|
953
|
+
disposables.push(() => resizeDisposable.dispose());
|
|
954
|
+
const initialSize = this.platform.terminal.getSize();
|
|
955
|
+
this.send(new WindowSizeMsg(initialSize.columns, initialSize.rows));
|
|
958
956
|
this.disposeSignals = () => {
|
|
959
957
|
for (const dispose of disposables) {
|
|
960
958
|
dispose();
|
|
@@ -979,9 +977,7 @@ var Program = class {
|
|
|
979
977
|
}
|
|
980
978
|
this.renderer.stop();
|
|
981
979
|
this.terminal.cleanup();
|
|
982
|
-
|
|
983
|
-
this.platform.dispose();
|
|
984
|
-
}
|
|
980
|
+
this.platform.dispose();
|
|
985
981
|
}
|
|
986
982
|
};
|
|
987
983
|
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/messages.ts","../src/keys.ts","../src/mouse.ts","../src/input.ts","../src/renderer.ts","../src/terminal.ts","../src/program.ts","../src/commands.ts","../src/screen.ts"],"names":["KeyType","rune","MouseAction","MouseButton","decodeString","CLEAR_SCREEN","CURSOR_HOME","msg"],"mappings":"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","file":"index.js","sourcesContent":["/** @public Request graceful program termination. */\nexport class QuitMsg {\n readonly _tag = 'quit'\n}\n\n/** @public Interrupt the program (SIGINT). */\nexport class InterruptMsg {\n readonly _tag = 'interrupt'\n}\n\n/** @public Suspend the program (Ctrl+Z). */\nexport class SuspendMsg {\n readonly _tag = 'suspend'\n}\n\n/** @public Resume the program after suspension. */\nexport class ResumeMsg {\n readonly _tag = 'resume'\n}\n\n/** @public Report the current terminal width and height. */\nexport class WindowSizeMsg {\n readonly _tag = 'window-size'\n constructor(\n public readonly width: number,\n public readonly height: number,\n ) {}\n}\n\n/** @public Terminal focus gained. */\nexport class FocusMsg {\n readonly _tag = 'focus'\n}\n\n/** @public Terminal focus lost. */\nexport class BlurMsg {\n readonly _tag = 'blur'\n}\n\n/** @public Clear the terminal screen. */\nexport class ClearScreenMsg {\n readonly _tag = 'clear-screen'\n}\n\n/** @public Enter the alternate screen buffer. */\nexport class EnterAltScreenMsg {\n readonly _tag = 'enter-alt-screen'\n}\n\n/** @public Exit the alternate screen buffer. */\nexport class ExitAltScreenMsg {\n readonly _tag = 'exit-alt-screen'\n}\n\n/** @public Enable cell-based mouse reporting. */\nexport class EnableMouseCellMotionMsg {\n readonly _tag = 'enable-mouse-cell-motion'\n}\n\n/** @public Enable all-motion mouse reporting. */\nexport class EnableMouseAllMotionMsg {\n readonly _tag = 'enable-mouse-all-motion'\n}\n\n/** @public Disable mouse reporting. */\nexport class DisableMouseMsg {\n readonly _tag = 'disable-mouse'\n}\n\n/** @public Show the cursor. */\nexport class ShowCursorMsg {\n readonly _tag = 'show-cursor'\n}\n\n/** @public Hide the cursor. */\nexport class HideCursorMsg {\n readonly _tag = 'hide-cursor'\n}\n\n/** @public Enable focus in/out reporting. */\nexport class EnableReportFocusMsg {\n readonly _tag = 'enable-report-focus'\n}\n\n/** @public Disable focus in/out reporting. */\nexport class DisableReportFocusMsg {\n readonly _tag = 'disable-report-focus'\n}\n\n/** @public Set the terminal window title. */\nexport class SetWindowTitleMsg {\n readonly _tag = 'set-window-title'\n constructor(public readonly title: string) {}\n}\n","import { decodeFirstRune, decodeString, byteLength } from '@boba-cli/machine'\n\n/** @public Known key types parsed from terminal input. */\nexport enum KeyType {\n Null = 'null',\n Break = 'break',\n Enter = 'enter',\n Backspace = 'backspace',\n Tab = 'tab',\n Esc = 'esc',\n Space = 'space',\n Runes = 'runes',\n Up = 'up',\n Down = 'down',\n Right = 'right',\n Left = 'left',\n ShiftTab = 'shift+tab',\n Home = 'home',\n End = 'end',\n PgUp = 'pgup',\n PgDown = 'pgdown',\n CtrlPgUp = 'ctrl+pgup',\n CtrlPgDown = 'ctrl+pgdown',\n Delete = 'delete',\n Insert = 'insert',\n CtrlUp = 'ctrl+up',\n CtrlDown = 'ctrl+down',\n CtrlRight = 'ctrl+right',\n CtrlLeft = 'ctrl+left',\n CtrlHome = 'ctrl+home',\n CtrlEnd = 'ctrl+end',\n ShiftUp = 'shift+up',\n ShiftDown = 'shift+down',\n ShiftRight = 'shift+right',\n ShiftLeft = 'shift+left',\n ShiftHome = 'shift+home',\n ShiftEnd = 'shift+end',\n CtrlShiftUp = 'ctrl+shift+up',\n CtrlShiftDown = 'ctrl+shift+down',\n CtrlShiftLeft = 'ctrl+shift+left',\n CtrlShiftRight = 'ctrl+shift+right',\n CtrlShiftHome = 'ctrl+shift+home',\n CtrlShiftEnd = 'ctrl+shift+end',\n F1 = 'f1',\n F2 = 'f2',\n F3 = 'f3',\n F4 = 'f4',\n F5 = 'f5',\n F6 = 'f6',\n F7 = 'f7',\n F8 = 'f8',\n F9 = 'f9',\n F10 = 'f10',\n F11 = 'f11',\n F12 = 'f12',\n F13 = 'f13',\n F14 = 'f14',\n F15 = 'f15',\n F16 = 'f16',\n F17 = 'f17',\n F18 = 'f18',\n F19 = 'f19',\n F20 = 'f20',\n}\n\n/** @public Parsed key metadata. */\nexport interface Key {\n type: KeyType\n runes: string\n alt: boolean\n paste: boolean\n}\n\nconst keyNames: Record<KeyType, string> = {\n [KeyType.Null]: 'ctrl+@',\n [KeyType.Break]: 'ctrl+c',\n [KeyType.Enter]: 'enter',\n [KeyType.Backspace]: 'backspace',\n [KeyType.Tab]: 'tab',\n [KeyType.Esc]: 'esc',\n [KeyType.Space]: ' ',\n [KeyType.Runes]: 'runes',\n [KeyType.Up]: 'up',\n [KeyType.Down]: 'down',\n [KeyType.Right]: 'right',\n [KeyType.Left]: 'left',\n [KeyType.ShiftTab]: 'shift+tab',\n [KeyType.Home]: 'home',\n [KeyType.End]: 'end',\n [KeyType.PgUp]: 'pgup',\n [KeyType.PgDown]: 'pgdown',\n [KeyType.CtrlPgUp]: 'ctrl+pgup',\n [KeyType.CtrlPgDown]: 'ctrl+pgdown',\n [KeyType.Delete]: 'delete',\n [KeyType.Insert]: 'insert',\n [KeyType.CtrlUp]: 'ctrl+up',\n [KeyType.CtrlDown]: 'ctrl+down',\n [KeyType.CtrlRight]: 'ctrl+right',\n [KeyType.CtrlLeft]: 'ctrl+left',\n [KeyType.CtrlHome]: 'ctrl+home',\n [KeyType.CtrlEnd]: 'ctrl+end',\n [KeyType.ShiftUp]: 'shift+up',\n [KeyType.ShiftDown]: 'shift+down',\n [KeyType.ShiftRight]: 'shift+right',\n [KeyType.ShiftLeft]: 'shift+left',\n [KeyType.ShiftHome]: 'shift+home',\n [KeyType.ShiftEnd]: 'shift+end',\n [KeyType.CtrlShiftUp]: 'ctrl+shift+up',\n [KeyType.CtrlShiftDown]: 'ctrl+shift+down',\n [KeyType.CtrlShiftLeft]: 'ctrl+shift+left',\n [KeyType.CtrlShiftRight]: 'ctrl+shift+right',\n [KeyType.CtrlShiftHome]: 'ctrl+shift+home',\n [KeyType.CtrlShiftEnd]: 'ctrl+shift+end',\n [KeyType.F1]: 'f1',\n [KeyType.F2]: 'f2',\n [KeyType.F3]: 'f3',\n [KeyType.F4]: 'f4',\n [KeyType.F5]: 'f5',\n [KeyType.F6]: 'f6',\n [KeyType.F7]: 'f7',\n [KeyType.F8]: 'f8',\n [KeyType.F9]: 'f9',\n [KeyType.F10]: 'f10',\n [KeyType.F11]: 'f11',\n [KeyType.F12]: 'f12',\n [KeyType.F13]: 'f13',\n [KeyType.F14]: 'f14',\n [KeyType.F15]: 'f15',\n [KeyType.F16]: 'f16',\n [KeyType.F17]: 'f17',\n [KeyType.F18]: 'f18',\n [KeyType.F19]: 'f19',\n [KeyType.F20]: 'f20',\n}\n\nconst controlKeyMap: Record<number, KeyType | undefined> = {\n 0: KeyType.Null,\n 3: KeyType.Break,\n 9: KeyType.Tab,\n 10: KeyType.Enter,\n 13: KeyType.Enter,\n 27: KeyType.Esc,\n 127: KeyType.Backspace,\n}\n\ntype Sequence = [string, Key]\n\nconst sequences: Sequence[] = [\n ['\\u001b[A', { type: KeyType.Up, runes: '', alt: false, paste: false }],\n ['\\u001b[B', { type: KeyType.Down, runes: '', alt: false, paste: false }],\n ['\\u001b[C', { type: KeyType.Right, runes: '', alt: false, paste: false }],\n ['\\u001b[D', { type: KeyType.Left, runes: '', alt: false, paste: false }],\n ['\\u001b[Z', { type: KeyType.ShiftTab, runes: '', alt: false, paste: false }],\n ['\\u001b[2~', { type: KeyType.Insert, runes: '', alt: false, paste: false }],\n ['\\u001b[3~', { type: KeyType.Delete, runes: '', alt: false, paste: false }],\n ['\\u001b[5~', { type: KeyType.PgUp, runes: '', alt: false, paste: false }],\n ['\\u001b[6~', { type: KeyType.PgDown, runes: '', alt: false, paste: false }],\n ['\\u001b[1~', { type: KeyType.Home, runes: '', alt: false, paste: false }],\n ['\\u001b[4~', { type: KeyType.End, runes: '', alt: false, paste: false }],\n ['\\u001b[H', { type: KeyType.Home, runes: '', alt: false, paste: false }],\n ['\\u001b[F', { type: KeyType.End, runes: '', alt: false, paste: false }],\n ['\\u001bOP', { type: KeyType.F1, runes: '', alt: false, paste: false }],\n ['\\u001bOQ', { type: KeyType.F2, runes: '', alt: false, paste: false }],\n ['\\u001bOR', { type: KeyType.F3, runes: '', alt: false, paste: false }],\n ['\\u001bOS', { type: KeyType.F4, runes: '', alt: false, paste: false }],\n ['\\u001b[15~', { type: KeyType.F5, runes: '', alt: false, paste: false }],\n ['\\u001b[17~', { type: KeyType.F6, runes: '', alt: false, paste: false }],\n ['\\u001b[18~', { type: KeyType.F7, runes: '', alt: false, paste: false }],\n ['\\u001b[19~', { type: KeyType.F8, runes: '', alt: false, paste: false }],\n ['\\u001b[20~', { type: KeyType.F9, runes: '', alt: false, paste: false }],\n ['\\u001b[21~', { type: KeyType.F10, runes: '', alt: false, paste: false }],\n ['\\u001b[23~', { type: KeyType.F11, runes: '', alt: false, paste: false }],\n ['\\u001b[24~', { type: KeyType.F12, runes: '', alt: false, paste: false }],\n [\n '\\u001b[1;2A',\n { type: KeyType.ShiftUp, runes: '', alt: false, paste: false },\n ],\n [\n '\\u001b[1;2B',\n { type: KeyType.ShiftDown, runes: '', alt: false, paste: false },\n ],\n [\n '\\u001b[1;2C',\n { type: KeyType.ShiftRight, runes: '', alt: false, paste: false },\n ],\n [\n '\\u001b[1;2D',\n { type: KeyType.ShiftLeft, runes: '', alt: false, paste: false },\n ],\n [\n '\\u001b[1;5A',\n { type: KeyType.CtrlUp, runes: '', alt: false, paste: false },\n ],\n [\n '\\u001b[1;5B',\n { type: KeyType.CtrlDown, runes: '', alt: false, paste: false },\n ],\n [\n '\\u001b[1;5C',\n { type: KeyType.CtrlRight, runes: '', alt: false, paste: false },\n ],\n [\n '\\u001b[1;5D',\n { type: KeyType.CtrlLeft, runes: '', alt: false, paste: false },\n ],\n [\n '\\u001b[1;6A',\n { type: KeyType.CtrlShiftUp, runes: '', alt: false, paste: false },\n ],\n [\n '\\u001b[1;6B',\n { type: KeyType.CtrlShiftDown, runes: '', alt: false, paste: false },\n ],\n [\n '\\u001b[1;6C',\n { type: KeyType.CtrlShiftRight, runes: '', alt: false, paste: false },\n ],\n [\n '\\u001b[1;6D',\n { type: KeyType.CtrlShiftLeft, runes: '', alt: false, paste: false },\n ],\n ['\\u001b[1;3A', { type: KeyType.Up, runes: '', alt: true, paste: false }],\n ['\\u001b[1;3B', { type: KeyType.Down, runes: '', alt: true, paste: false }],\n ['\\u001b[1;3C', { type: KeyType.Right, runes: '', alt: true, paste: false }],\n ['\\u001b[1;3D', { type: KeyType.Left, runes: '', alt: true, paste: false }],\n [\n '\\u001b[5;5~',\n { type: KeyType.CtrlPgUp, runes: '', alt: false, paste: false },\n ],\n [\n '\\u001b[6;5~',\n { type: KeyType.CtrlPgDown, runes: '', alt: false, paste: false },\n ],\n ['\\u001b[5;3~', { type: KeyType.PgUp, runes: '', alt: true, paste: false }],\n ['\\u001b[6;3~', { type: KeyType.PgDown, runes: '', alt: true, paste: false }],\n ['\\u001b[3;2~', { type: KeyType.Insert, runes: '', alt: true, paste: false }],\n ['\\u001b[3;3~', { type: KeyType.Delete, runes: '', alt: true, paste: false }],\n ['\\u001b[[A', { type: KeyType.F1, runes: '', alt: false, paste: false }],\n ['\\u001b[[B', { type: KeyType.F2, runes: '', alt: false, paste: false }],\n ['\\u001b[[C', { type: KeyType.F3, runes: '', alt: false, paste: false }],\n ['\\u001b[[D', { type: KeyType.F4, runes: '', alt: false, paste: false }],\n ['\\u001b[[E', { type: KeyType.F5, runes: '', alt: false, paste: false }],\n]\n\n/** @public Message representing a parsed key event. */\nexport class KeyMsg {\n readonly _tag = 'key'\n constructor(public readonly key: Key) {}\n\n toString(): string {\n return keyToString(this.key)\n }\n}\n\n/** @public Convert a parsed key to a human-readable string. */\nexport function keyToString(key: Key): string {\n if (key.type === KeyType.Runes) {\n const value = key.paste ? `[${key.runes}]` : key.runes\n return key.alt ? `alt+${value}` : value\n }\n const base = keyNames[key.type] ?? ''\n return key.alt ? `alt+${base}` : base\n}\n\nexport function parseKey(\n buffer: Uint8Array,\n allowMoreData: boolean,\n): { key: Key; length: number } | { needMore: true } | undefined {\n if (buffer.length === 0) {\n return allowMoreData ? { needMore: true } : undefined\n }\n const input = decodeString(buffer)\n\n for (const [seq, key] of sequences) {\n if (input.startsWith(seq)) {\n return { key, length: byteLength(seq) }\n }\n if (allowMoreData && seq.startsWith(input)) {\n return { needMore: true }\n }\n }\n\n if (buffer[0] === 0x1b && buffer.length > 1) {\n const [rune, altLength] = decodeFirstRune(buffer, 1)\n if (altLength > 0 && rune !== null) {\n return {\n key: { type: KeyType.Runes, runes: rune, alt: true, paste: false },\n length: 1 + altLength,\n }\n }\n }\n\n const code: number = buffer[0] ?? 0\n const mapped: KeyType | undefined = Object.prototype.hasOwnProperty.call(\n controlKeyMap,\n code,\n )\n ? controlKeyMap[code]\n : undefined\n if (mapped !== undefined) {\n return {\n key: { type: mapped, runes: '', alt: false, paste: false },\n length: 1,\n }\n }\n\n const [rune, runeLength] = decodeFirstRune(buffer)\n if (runeLength === 0 || rune === null) {\n return allowMoreData ? { needMore: true } : undefined\n }\n\n if (rune === ' ') {\n return {\n key: { type: KeyType.Space, runes: rune, alt: false, paste: false },\n length: runeLength,\n }\n }\n\n return {\n key: { type: KeyType.Runes, runes: rune, alt: false, paste: false },\n length: runeLength,\n }\n}\n","import { decodeString } from '@boba-cli/machine'\n\n/** @public Mouse action type. */\nexport enum MouseAction {\n Press = 'press',\n Release = 'release',\n Motion = 'motion',\n}\n\n/** @public Mouse button identifiers, including wheels. */\nexport enum MouseButton {\n None = 'none',\n Left = 'left',\n Middle = 'middle',\n Right = 'right',\n WheelUp = 'wheel-up',\n WheelDown = 'wheel-down',\n WheelLeft = 'wheel-left',\n WheelRight = 'wheel-right',\n Backward = 'backward',\n Forward = 'forward',\n Button10 = 'button-10',\n Button11 = 'button-11',\n}\n\n/** @public Parsed mouse event payload. */\nexport interface MouseEvent {\n x: number\n y: number\n shift: boolean\n alt: boolean\n ctrl: boolean\n action: MouseAction\n button: MouseButton\n}\n\n/** @public Message representing a parsed mouse event. */\nexport class MouseMsg {\n readonly _tag = 'mouse'\n constructor(public readonly event: MouseEvent) {}\n\n toString(): string {\n const parts = [\n this.event.ctrl ? 'ctrl' : '',\n this.event.alt ? 'alt' : '',\n this.event.shift ? 'shift' : '',\n ].filter(Boolean)\n const mods = parts.length > 0 ? `${parts.join('+')}+` : ''\n return `${mods}${this.event.button} ${this.event.action} @${this.event.x},${this.event.y}`\n }\n}\n\nconst mouseSGRRegex = /(\\d+);(\\d+);(\\d+)([Mm])/\nconst mouseEventX10Len = 6\nconst x10MouseByteOffset = 32\n\nexport function parseMouse(\n buffer: Uint8Array,\n allowMoreData: boolean,\n): { msg: MouseMsg; length: number } | { needMore: true } | undefined {\n if (buffer.length < 3 || buffer[0] !== 0x1b || buffer[1] !== 0x5b) {\n return undefined\n }\n\n if (buffer[2] === 0x4d) {\n if (buffer.length < mouseEventX10Len) {\n return allowMoreData ? { needMore: true } : undefined\n }\n const event = parseX10MouseEvent(buffer.subarray(0, mouseEventX10Len))\n return { msg: new MouseMsg(event), length: mouseEventX10Len }\n }\n\n if (buffer[2] === 0x3c) {\n const slice = decodeString(buffer)\n const match = mouseSGRRegex.exec(slice.slice(3))\n if (!match) {\n return allowMoreData ? { needMore: true } : undefined\n }\n const event = parseSGRMouseEvent(slice)\n const matchedLength = match[0]?.length ?? 0\n return { msg: new MouseMsg(event), length: matchedLength + 3 }\n }\n\n return undefined\n}\n\nfunction parseSGRMouseEvent(seq: string): MouseEvent {\n const match = mouseSGRRegex.exec(seq.slice(3))\n if (!match) {\n return defaultMouseEvent()\n }\n\n const buttonCode = Number.parseInt(match[1] ?? '0', 10)\n const px = Number.parseInt(match[2] ?? '0', 10)\n const py = Number.parseInt(match[3] ?? '0', 10)\n const release = match[4] === 'm'\n\n const event = parseMouseButton(buttonCode, true)\n\n if (event.action !== MouseAction.Motion && !eventIsWheel(event) && release) {\n event.action = MouseAction.Release\n }\n\n event.x = px - 1\n event.y = py - 1\n\n return event\n}\n\nfunction parseX10MouseEvent(buf: Uint8Array): MouseEvent {\n const buttonByte = buf[3] ?? 0\n const c1 = buf[4] ?? 0\n const c2 = buf[5] ?? 0\n const event = parseMouseButton(buttonByte, false)\n event.x = c1 - x10MouseByteOffset - 1\n event.y = c2 - x10MouseByteOffset - 1\n return event\n}\n\nfunction parseMouseButton(code: number, isSGR: boolean): MouseEvent {\n let e = code\n if (!isSGR) {\n e -= x10MouseByteOffset\n }\n\n const bitShift = 0b0000_0100\n const bitAlt = 0b0000_1000\n const bitCtrl = 0b0001_0000\n const bitMotion = 0b0010_0000\n const bitWheel = 0b0100_0000\n const bitAdd = 0b1000_0000\n const bitsMask = 0b0000_0011\n\n const event = defaultMouseEvent()\n\n if ((e & bitAdd) !== 0) {\n const extraButtons: Record<number, MouseButton> = {\n 0: MouseButton.Backward,\n 1: MouseButton.Forward,\n 2: MouseButton.Button10,\n 3: MouseButton.Button11,\n }\n event.button = extraButtons[e & bitsMask] ?? MouseButton.None\n } else if ((e & bitWheel) !== 0) {\n const wheelButtons: Record<number, MouseButton> = {\n 0: MouseButton.WheelUp,\n 1: MouseButton.WheelDown,\n 2: MouseButton.WheelLeft,\n 3: MouseButton.WheelRight,\n }\n event.button = wheelButtons[e & bitsMask] ?? MouseButton.None\n } else {\n const baseButtons: Record<number, MouseButton> = {\n 0: MouseButton.Left,\n 1: MouseButton.Middle,\n 2: MouseButton.Right,\n 3: MouseButton.None,\n }\n event.button = baseButtons[e & bitsMask] ?? MouseButton.None\n if ((e & bitsMask) === bitsMask) {\n event.action = MouseAction.Release\n event.button = MouseButton.None\n }\n }\n\n if ((e & bitMotion) !== 0 && !eventIsWheel(event)) {\n event.action = MouseAction.Motion\n }\n\n event.alt = (e & bitAlt) !== 0\n event.ctrl = (e & bitCtrl) !== 0\n event.shift = (e & bitShift) !== 0\n\n return event\n}\n\nfunction eventIsWheel(event: MouseEvent): boolean {\n return (\n event.button === MouseButton.WheelUp ||\n event.button === MouseButton.WheelDown ||\n event.button === MouseButton.WheelLeft ||\n event.button === MouseButton.WheelRight\n )\n}\n\nfunction defaultMouseEvent(): MouseEvent {\n return {\n x: 0,\n y: 0,\n shift: false,\n alt: false,\n ctrl: false,\n action: MouseAction.Press,\n button: MouseButton.None,\n }\n}\n","import type { Disposable, PlatformAdapter } from '@boba-cli/machine'\nimport { allocBytes, concatBytes, encodeString } from '@boba-cli/machine'\nimport { BlurMsg, FocusMsg } from './messages.js'\nimport { KeyMsg, KeyType, parseKey } from './keys.js'\nimport { parseMouse } from './mouse.js'\nimport type { Msg } from './types.js'\n\n/** @public Options for the input reader. */\nexport interface InputOptions {\n platform?: PlatformAdapter\n onMessage: (msg: Msg) => void\n}\n\nconst BRACKET_PASTE_START = '\\u001b[200~'\nconst BRACKET_PASTE_END = '\\u001b[201~'\n\nexport function startInput(options: InputOptions): () => void {\n if (!options.platform) {\n // No platform adapter available, return no-op cleanup\n return () => {}\n }\n\n let buffer: Uint8Array = allocBytes(0)\n let disposable: Disposable | null = null\n\n const onData = (data: Uint8Array) => {\n buffer = concatBytes(buffer, data)\n buffer = consumeBuffer(buffer, options.onMessage)\n }\n\n disposable = options.platform.terminal.onInput(onData)\n\n return () => {\n if (disposable) {\n disposable.dispose()\n }\n }\n}\n\nfunction consumeBuffer(buffer: Uint8Array, push: (msg: Msg) => void): Uint8Array {\n let offset = 0\n\n while (offset < buffer.length) {\n const slice = buffer.subarray(offset)\n const result = detectOne(slice, offset + slice.length === buffer.length)\n\n if (!result || 'needMore' in result) {\n break\n }\n\n offset += result.length\n if (result.msg) {\n push(result.msg)\n }\n }\n\n return buffer.subarray(offset)\n}\n\ntype DetectResult =\n | { msg: Msg; length: number }\n | { msg?: Msg; length: number }\n | { needMore: true }\n\nfunction detectOne(\n buffer: Uint8Array,\n allowMoreData: boolean,\n): DetectResult | undefined {\n if (buffer.length === 0) {\n return allowMoreData ? { needMore: true } : undefined\n }\n const mouse = parseMouse(buffer, allowMoreData)\n if (mouse) {\n if ('needMore' in mouse) {\n return mouse\n }\n return { msg: mouse.msg, length: mouse.length }\n }\n\n const focus = detectFocus(buffer)\n if (focus) {\n return focus\n }\n\n const paste = detectBracketedPaste(buffer, allowMoreData)\n if (paste) {\n return paste\n }\n\n const key = parseKey(buffer, allowMoreData)\n if (!key) {\n return undefined\n }\n if ('needMore' in key) {\n return key\n }\n\n return { msg: new KeyMsg(key.key), length: key.length }\n}\n\nfunction detectFocus(buffer: Uint8Array): DetectResult | undefined {\n // Focus in: ESC [ I, Focus out: ESC [ O (exactly three bytes)\n if (buffer.length === 3 && buffer[0] === 0x1b && buffer[1] === 0x5b) {\n if (buffer[2] === 0x49) {\n return { msg: new FocusMsg(), length: 3 }\n }\n if (buffer[2] === 0x4f) {\n return { msg: new BlurMsg(), length: 3 }\n }\n }\n return undefined\n}\n\nfunction detectBracketedPaste(\n buffer: Uint8Array,\n allowMoreData: boolean,\n): DetectResult | undefined {\n const decoder = new TextDecoder('utf-8', { fatal: false })\n const asString = decoder.decode(buffer)\n if (!asString.startsWith(BRACKET_PASTE_START)) {\n return undefined\n }\n const endIndex = asString.indexOf(\n BRACKET_PASTE_END,\n BRACKET_PASTE_START.length,\n )\n if (endIndex === -1) {\n return allowMoreData ? { needMore: true } : undefined\n }\n const content = asString.slice(BRACKET_PASTE_START.length, endIndex)\n const fullString = BRACKET_PASTE_START + content + BRACKET_PASTE_END\n const length = encodeString(fullString).length\n const key: Msg = new KeyMsg({\n type: KeyType.Runes,\n runes: content,\n alt: false,\n paste: true,\n })\n return { msg: key, length }\n}\n","import type { PlatformAdapter, TerminalAdapter } from '@boba-cli/machine'\nimport { CURSOR_HOME, CLEAR_SCREEN } from '@boba-cli/machine'\n\n/** @public Options for the standard renderer. */\nexport interface RendererOptions {\n platform?: PlatformAdapter\n fps?: number\n}\n\nexport class StandardRenderer {\n private nextFrame: string | null = null\n private lastFrame = ''\n private ticker: ReturnType<typeof setInterval> | null = null\n private readonly terminal: TerminalAdapter | null\n private readonly frameInterval: number\n\n constructor(options: RendererOptions = {}) {\n this.terminal = options.platform?.terminal ?? null\n const fps = Math.min(Math.max(options.fps ?? 60, 1), 120)\n this.frameInterval = Math.round(1000 / fps)\n }\n\n start(): void {\n if (this.ticker) {\n return\n }\n this.ticker = setInterval(() => this.flush(), this.frameInterval)\n }\n\n stop(): void {\n this.flush()\n if (this.ticker) {\n clearInterval(this.ticker)\n this.ticker = null\n }\n }\n\n write(view: string): void {\n this.nextFrame = view ?? ''\n }\n\n repaint(): void {\n this.lastFrame = ''\n }\n\n private flush(): void {\n if (this.nextFrame === null) {\n return\n }\n const frame = this.nextFrame\n if (frame === this.lastFrame) {\n return\n }\n this.lastFrame = frame\n // Clear the full screen before writing the next frame to avoid leftover characters\n if (this.terminal) {\n this.terminal.write(`${CLEAR_SCREEN}${CURSOR_HOME}${frame}`)\n }\n }\n}\n","import type { PlatformAdapter, TerminalAdapter } from '@boba-cli/machine'\nimport {\n CURSOR_SHOW,\n CURSOR_HIDE,\n CLEAR_SCREEN,\n CURSOR_HOME,\n ALT_SCREEN_ON,\n ALT_SCREEN_OFF,\n MOUSE_CELL_ON,\n MOUSE_ALL_ON,\n MOUSE_SGR_ON,\n MOUSE_CELL_OFF,\n MOUSE_ALL_OFF,\n MOUSE_SGR_OFF,\n BRACKETED_PASTE_ON,\n BRACKETED_PASTE_OFF,\n REPORT_FOCUS_ON,\n REPORT_FOCUS_OFF,\n} from '@boba-cli/machine'\n\n/** @public Options for the terminal controller. */\nexport interface TerminalOptions {\n platform?: PlatformAdapter\n}\n\nexport class TerminalController {\n private rawMode = false\n private altScreen = false\n private bracketedPaste = false\n private focusReporting = false\n private readonly terminal: TerminalAdapter | null\n\n constructor(platform?: PlatformAdapter) {\n this.terminal = platform?.terminal ?? null\n }\n\n enableRawMode(): void {\n if (this.terminal && !this.rawMode) {\n this.terminal.enableRawMode()\n this.rawMode = true\n }\n }\n\n disableRawMode(): void {\n if (this.terminal && this.rawMode) {\n this.terminal.disableRawMode()\n this.rawMode = false\n }\n }\n\n enterAltScreen(): void {\n this.write(ALT_SCREEN_ON)\n this.altScreen = true\n }\n\n exitAltScreen(): void {\n this.write(ALT_SCREEN_OFF)\n this.altScreen = false\n }\n\n clearScreen(): void {\n this.write(`${CLEAR_SCREEN}${CURSOR_HOME}`)\n }\n\n showCursor(): void {\n this.write(CURSOR_SHOW)\n }\n\n hideCursor(): void {\n this.write(CURSOR_HIDE)\n }\n\n enableMouseCellMotion(): void {\n this.write(MOUSE_CELL_ON)\n this.write(MOUSE_SGR_ON)\n }\n\n enableMouseAllMotion(): void {\n this.write(MOUSE_ALL_ON)\n this.write(MOUSE_SGR_ON)\n }\n\n disableMouse(): void {\n this.write(MOUSE_CELL_OFF)\n this.write(MOUSE_ALL_OFF)\n this.write(MOUSE_SGR_OFF)\n }\n\n enableBracketedPaste(): void {\n this.write(BRACKETED_PASTE_ON)\n this.bracketedPaste = true\n }\n\n disableBracketedPaste(): void {\n this.write(BRACKETED_PASTE_OFF)\n this.bracketedPaste = false\n }\n\n enableReportFocus(): void {\n this.write(REPORT_FOCUS_ON)\n this.focusReporting = true\n }\n\n disableReportFocus(): void {\n this.write(REPORT_FOCUS_OFF)\n this.focusReporting = false\n }\n\n setWindowTitle(title: string): void {\n this.write(`\\u001b]0;${title}\\u0007`)\n }\n\n cleanup(): void {\n this.disableMouse()\n if (this.focusReporting) {\n this.disableReportFocus()\n }\n if (this.bracketedPaste) {\n this.disableBracketedPaste()\n }\n this.showCursor()\n if (this.altScreen) {\n this.exitAltScreen()\n }\n this.disableRawMode()\n }\n\n write(data: string): void {\n if (data.length === 0) {\n return\n }\n if (this.terminal) {\n this.terminal.write(data)\n }\n }\n}\n","import type { PlatformAdapter } from '@boba-cli/machine'\nimport { startInput } from './input.js'\nimport {\n ClearScreenMsg,\n DisableMouseMsg,\n EnableMouseAllMotionMsg,\n EnableMouseCellMotionMsg,\n EnterAltScreenMsg,\n ExitAltScreenMsg,\n HideCursorMsg,\n InterruptMsg,\n QuitMsg,\n ResumeMsg,\n SetWindowTitleMsg,\n ShowCursorMsg,\n} from './messages.js'\nimport { StandardRenderer } from './renderer.js'\nimport { TerminalController } from './terminal.js'\nimport type { Cmd, Model, ModelMsg, Msg, ProgramResult } from './types.js'\nimport { WindowSizeMsg } from './messages.js'\n\n/** @public Configure program runtime options. */\nexport interface ProgramOptions {\n altScreen?: boolean\n mouseMode?: 'cell' | 'all' | false\n platform?: PlatformAdapter\n fps?: number\n reportFocus?: boolean\n bracketedPaste?: boolean\n}\n\n/** @public Bubble Tea-style program runner. */\nexport class Program<M extends Model<Msg, M>> {\n private model: M\n private readonly terminal: TerminalController\n private readonly renderer: StandardRenderer\n private readonly opts: ProgramOptions\n private readonly platform: PlatformAdapter | undefined\n private stopInput?: () => void\n private running = false\n private queue: Msg[] = []\n private draining = false\n private result: ProgramResult<M> | null = null\n private resolveWait?: () => void\n\n constructor(model: M, options: ProgramOptions = {}) {\n this.model = model\n this.opts = options\n this.platform = options.platform\n this.terminal = new TerminalController(options.platform)\n this.renderer = new StandardRenderer({\n platform: options.platform,\n fps: options.fps,\n })\n }\n\n async run(): Promise<ProgramResult<M>> {\n this.running = true\n this.setupTerminal()\n this.setupSignals()\n this.renderer.start()\n\n try {\n this.runCmd(this.model.init())\n this.renderer.write(this.model.view())\n this.startInputLoop()\n // Wait until the program is explicitly quit\n await this.waitUntilDone()\n this.result = { model: this.model }\n } catch (err) {\n this.result = { model: this.model, error: err }\n } finally {\n this.shutdown()\n }\n\n return this.result ?? { model: this.model }\n }\n\n private waitUntilDone(): Promise<void> {\n return new Promise((resolve) => {\n this.resolveWait = resolve\n // If already not running, resolve immediately\n if (!this.running) {\n resolve()\n }\n })\n }\n\n send(msg: Msg): void {\n if (!msg) {\n return\n }\n this.queue.push(msg)\n if (!this.draining) {\n void this.drainQueue()\n }\n }\n\n quit(): void {\n this.send(new QuitMsg())\n }\n\n kill(): void {\n this.running = false\n this.shutdown()\n }\n\n private drainQueue(): void {\n if (this.draining) {\n return\n }\n this.draining = true\n\n while (this.running && this.queue.length > 0) {\n const msg = this.queue.shift()\n if (msg === undefined) {\n continue\n }\n\n const consumed = this.handleInternal(msg)\n if (consumed) {\n continue\n }\n\n const [nextModel, cmd] = this.model.update(msg)\n this.model = nextModel\n\n this.runCmd(cmd)\n this.renderer.write(this.model.view())\n }\n\n this.draining = false\n }\n\n private handleInternal(msg: Msg): boolean {\n if (msg instanceof QuitMsg || msg instanceof InterruptMsg) {\n this.running = false\n if (this.resolveWait) {\n this.resolveWait()\n }\n return true\n }\n if (msg instanceof ClearScreenMsg) {\n this.terminal.clearScreen()\n return false\n }\n if (msg instanceof EnterAltScreenMsg) {\n this.terminal.enterAltScreen()\n this.renderer.repaint()\n return false\n }\n if (msg instanceof ExitAltScreenMsg) {\n this.terminal.exitAltScreen()\n this.renderer.repaint()\n return false\n }\n if (msg instanceof EnableMouseCellMotionMsg) {\n this.terminal.enableMouseCellMotion()\n return false\n }\n if (msg instanceof EnableMouseAllMotionMsg) {\n this.terminal.enableMouseAllMotion()\n return false\n }\n if (msg instanceof DisableMouseMsg) {\n this.terminal.disableMouse()\n return false\n }\n if (msg instanceof ShowCursorMsg) {\n this.terminal.showCursor()\n return false\n }\n if (msg instanceof HideCursorMsg) {\n this.terminal.hideCursor()\n return false\n }\n if (msg instanceof SetWindowTitleMsg) {\n this.terminal.setWindowTitle(msg.title)\n return false\n }\n if (msg instanceof ResumeMsg) {\n return false\n }\n return false\n }\n\n private runCmd<T extends Msg>(cmd: Cmd<T> | undefined): void {\n if (!cmd) {\n return\n }\n\n const handleResult = (result: T | T[] | null | undefined) => {\n if (result === null || result === undefined) {\n return\n }\n if (Array.isArray(result)) {\n for (const msg of result) {\n this.send(msg)\n }\n } else {\n this.send(result)\n }\n }\n\n try {\n const effect = cmd()\n if (effect instanceof Promise) {\n effect.then(handleResult).catch((err) => {\n // Preserve behavior but don't block other messages\n console.error(err)\n })\n } else {\n handleResult(effect)\n }\n } catch (err) {\n console.error(err)\n }\n }\n\n private setupTerminal(): void {\n this.terminal.enableRawMode()\n this.terminal.hideCursor()\n\n if (this.opts.altScreen) {\n this.terminal.enterAltScreen()\n this.terminal.clearScreen()\n }\n\n if (this.opts.mouseMode === 'cell') {\n this.terminal.enableMouseCellMotion()\n } else if (this.opts.mouseMode === 'all') {\n this.terminal.enableMouseAllMotion()\n }\n\n if (this.opts.bracketedPaste !== false) {\n this.terminal.enableBracketedPaste()\n }\n\n if (this.opts.reportFocus) {\n this.terminal.enableReportFocus()\n }\n }\n\n private startInputLoop(): void {\n this.stopInput = startInput({\n platform: this.platform,\n onMessage: (msg) => this.send(msg as ModelMsg<M>),\n })\n }\n\n private setupSignals(): void {\n const disposables: (() => void)[] = []\n\n // Set up signal handlers if platform adapter is available\n if (this.platform) {\n const intDisposable = this.platform.signals.onInterrupt(this.onSigInt)\n const termDisposable = this.platform.signals.onTerminate(this.onSigTerm)\n disposables.push(\n () => intDisposable.dispose(),\n () => termDisposable.dispose(),\n )\n\n // Set up resize handler\n const handleResize = (size: { columns: number; rows: number }) => {\n this.send(new WindowSizeMsg(size.columns, size.rows))\n }\n const resizeDisposable =\n this.platform.terminal.onResize(handleResize)\n disposables.push(() => resizeDisposable.dispose())\n\n // Send initial size\n const initialSize = this.platform.terminal.getSize()\n this.send(new WindowSizeMsg(initialSize.columns, initialSize.rows))\n }\n\n this.disposeSignals = () => {\n for (const dispose of disposables) {\n dispose()\n }\n }\n }\n\n private disposeSignals: (() => void) | null = null\n\n private onSigInt = (): void => {\n this.send(new InterruptMsg())\n }\n\n private onSigTerm = (): void => {\n this.send(new QuitMsg())\n }\n\n private shutdown(): void {\n if (this.disposeSignals) {\n this.disposeSignals()\n this.disposeSignals = null\n }\n if (this.stopInput) {\n this.stopInput()\n this.stopInput = undefined\n }\n this.renderer.stop()\n this.terminal.cleanup()\n if (this.platform) {\n this.platform.dispose()\n }\n }\n}\n","import { QuitMsg } from './messages.js'\nimport { Cmd, Effect, Msg } from './types.js'\n\ntype MsgOrArray<M extends Msg> = M | M[]\n\nconst now = () => new Date()\n\n/**\n * @public\n * Run multiple commands concurrently and flatten their results.\n */\nexport function batch<M extends Msg>(...cmds: Array<Cmd<M>>): Cmd<M> {\n const valid = cmds.filter((cmd): cmd is Cmd<M> => Boolean(cmd))\n if (valid.length === 0) {\n return null\n }\n if (valid.length === 1) {\n const [only] = valid\n return only ?? null\n }\n return async () => {\n const results = await Promise.all(\n valid.map((cmd) => Promise.resolve(cmd?.())),\n )\n return flatten(results)\n }\n}\n\n/**\n * @public\n * Run commands sequentially, preserving order and skipping nulls.\n */\nexport function sequence<M extends Msg>(...cmds: Array<Cmd<M>>): Cmd<M> {\n const valid = cmds.filter((cmd): cmd is Cmd<M> => Boolean(cmd))\n if (valid.length === 0) {\n return null\n }\n if (valid.length === 1) {\n const [only] = valid\n return only ?? null\n }\n return async () => {\n const messages: Array<MsgOrArray<M>> = []\n for (const cmd of valid) {\n const result = await Promise.resolve(cmd?.())\n if (result !== null && result !== undefined) {\n messages.push(result)\n }\n }\n return flatten(messages)\n }\n}\n\n/**\n * @public\n * Emit a message after a delay.\n */\nexport function tick<M extends Msg>(ms: number, fn: (t: Date) => M): Cmd<M> {\n return () =>\n new Promise<M>((resolve) => {\n setTimeout(() => resolve(fn(now())), ms)\n })\n}\n\n/**\n * @public\n * Schedule a single message aligned to the next interval boundary.\n * Call again from your update loop to continue a repeating cadence.\n */\nexport function every<M extends Msg>(ms: number, fn: (t: Date) => M): Cmd<M> {\n return () =>\n new Promise<M>((resolve) => {\n const current = now()\n const delay = alignToInterval(current, ms)\n setTimeout(() => resolve(fn(now())), delay)\n })\n}\n\n/** @public Lift a message into a command. */\nexport const msg =\n <M extends Msg>(value: M): Cmd<M> =>\n () =>\n value\n/** @public Command that emits a QuitMsg. */\nexport const quit = (): Cmd<Msg> => msg(new QuitMsg())\n\nfunction flatten<M extends Msg>(\n values: Array<Effect<M>>,\n): MsgOrArray<M> | null {\n const results: M[] = []\n for (const value of values) {\n if (value === null || value === undefined) {\n continue\n }\n if (Array.isArray(value)) {\n results.push(...value)\n } else {\n results.push(value)\n }\n }\n if (results.length === 0) {\n return null\n }\n if (results.length === 1) {\n return results[0] as M\n }\n return results\n}\n\nfunction alignToInterval(date: Date, ms: number): number {\n const next = new Date(date)\n next.setMilliseconds(0)\n const remainder = date.getTime() % ms\n return remainder === 0 ? ms : ms - remainder\n}\n","import type { PlatformAdapter } from '@boba-cli/machine'\nimport {\n ClearScreenMsg,\n DisableMouseMsg,\n EnableMouseAllMotionMsg,\n EnableMouseCellMotionMsg,\n EnterAltScreenMsg,\n ExitAltScreenMsg,\n HideCursorMsg,\n SetWindowTitleMsg,\n ShowCursorMsg,\n WindowSizeMsg,\n} from './messages.js'\nimport type { Cmd, Msg } from './types.js'\n\n/** @public Clear the terminal screen. */\nexport const clearScreen = (): Cmd<Msg> => () => new ClearScreenMsg()\n/** @public Enter the alternate screen buffer. */\nexport const enterAltScreen = (): Cmd<Msg> => () => new EnterAltScreenMsg()\n/** @public Exit the alternate screen buffer. */\nexport const exitAltScreen = (): Cmd<Msg> => () => new ExitAltScreenMsg()\n/** @public Enable cell-motion mouse reporting. */\nexport const enableMouseCellMotion = (): Cmd<Msg> => () =>\n new EnableMouseCellMotionMsg()\n/** @public Enable all-motion mouse reporting. */\nexport const enableMouseAllMotion = (): Cmd<Msg> => () =>\n new EnableMouseAllMotionMsg()\n/** @public Disable mouse reporting. */\nexport const disableMouse = (): Cmd<Msg> => () => new DisableMouseMsg()\n/** @public Show the cursor. */\nexport const showCursor = (): Cmd<Msg> => () => new ShowCursorMsg()\n/** @public Hide the cursor. */\nexport const hideCursor = (): Cmd<Msg> => () => new HideCursorMsg()\n/** @public Set the terminal window title. */\nexport const setWindowTitle =\n (title: string): Cmd<Msg> =>\n () =>\n new SetWindowTitleMsg(title)\n/**\n * @public\n * Emit the current window size.\n * @param platform - Optional platform adapter to get terminal size from\n */\nexport const windowSize =\n (platform?: PlatformAdapter): Cmd<Msg> =>\n () => {\n if (platform) {\n const size = platform.terminal.getSize()\n return new WindowSizeMsg(size.columns, size.rows)\n }\n return new WindowSizeMsg(0, 0)\n }\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/messages.ts","../src/keys.ts","../src/mouse.ts","../src/input.ts","../src/renderer.ts","../src/terminal.ts","../src/program.ts","../src/commands.ts","../src/screen.ts"],"names":["KeyType","rune","MouseAction","MouseButton","decodeString","CLEAR_SCREEN","CURSOR_HOME","msg"],"mappings":"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","file":"index.js","sourcesContent":["/** @public Request graceful program termination. */\nexport class QuitMsg {\n readonly _tag = 'quit'\n}\n\n/** @public Interrupt the program (SIGINT). */\nexport class InterruptMsg {\n readonly _tag = 'interrupt'\n}\n\n/** @public Suspend the program (Ctrl+Z). */\nexport class SuspendMsg {\n readonly _tag = 'suspend'\n}\n\n/** @public Resume the program after suspension. */\nexport class ResumeMsg {\n readonly _tag = 'resume'\n}\n\n/** @public Report the current terminal width and height. */\nexport class WindowSizeMsg {\n readonly _tag = 'window-size'\n constructor(\n public readonly width: number,\n public readonly height: number,\n ) {}\n}\n\n/** @public Terminal focus gained. */\nexport class FocusMsg {\n readonly _tag = 'focus'\n}\n\n/** @public Terminal focus lost. */\nexport class BlurMsg {\n readonly _tag = 'blur'\n}\n\n/** @public Clear the terminal screen. */\nexport class ClearScreenMsg {\n readonly _tag = 'clear-screen'\n}\n\n/** @public Enter the alternate screen buffer. */\nexport class EnterAltScreenMsg {\n readonly _tag = 'enter-alt-screen'\n}\n\n/** @public Exit the alternate screen buffer. */\nexport class ExitAltScreenMsg {\n readonly _tag = 'exit-alt-screen'\n}\n\n/** @public Enable cell-based mouse reporting. */\nexport class EnableMouseCellMotionMsg {\n readonly _tag = 'enable-mouse-cell-motion'\n}\n\n/** @public Enable all-motion mouse reporting. */\nexport class EnableMouseAllMotionMsg {\n readonly _tag = 'enable-mouse-all-motion'\n}\n\n/** @public Disable mouse reporting. */\nexport class DisableMouseMsg {\n readonly _tag = 'disable-mouse'\n}\n\n/** @public Show the cursor. */\nexport class ShowCursorMsg {\n readonly _tag = 'show-cursor'\n}\n\n/** @public Hide the cursor. */\nexport class HideCursorMsg {\n readonly _tag = 'hide-cursor'\n}\n\n/** @public Enable focus in/out reporting. */\nexport class EnableReportFocusMsg {\n readonly _tag = 'enable-report-focus'\n}\n\n/** @public Disable focus in/out reporting. */\nexport class DisableReportFocusMsg {\n readonly _tag = 'disable-report-focus'\n}\n\n/** @public Set the terminal window title. */\nexport class SetWindowTitleMsg {\n readonly _tag = 'set-window-title'\n constructor(public readonly title: string) {}\n}\n","import { decodeFirstRune, decodeString, byteLength } from '@boba-cli/machine'\n\n/** @public Known key types parsed from terminal input. */\nexport enum KeyType {\n Null = 'null',\n Break = 'break',\n Enter = 'enter',\n Backspace = 'backspace',\n Tab = 'tab',\n Esc = 'esc',\n Space = 'space',\n Runes = 'runes',\n Up = 'up',\n Down = 'down',\n Right = 'right',\n Left = 'left',\n ShiftTab = 'shift+tab',\n Home = 'home',\n End = 'end',\n PgUp = 'pgup',\n PgDown = 'pgdown',\n CtrlPgUp = 'ctrl+pgup',\n CtrlPgDown = 'ctrl+pgdown',\n Delete = 'delete',\n Insert = 'insert',\n CtrlUp = 'ctrl+up',\n CtrlDown = 'ctrl+down',\n CtrlRight = 'ctrl+right',\n CtrlLeft = 'ctrl+left',\n CtrlHome = 'ctrl+home',\n CtrlEnd = 'ctrl+end',\n ShiftUp = 'shift+up',\n ShiftDown = 'shift+down',\n ShiftRight = 'shift+right',\n ShiftLeft = 'shift+left',\n ShiftHome = 'shift+home',\n ShiftEnd = 'shift+end',\n CtrlShiftUp = 'ctrl+shift+up',\n CtrlShiftDown = 'ctrl+shift+down',\n CtrlShiftLeft = 'ctrl+shift+left',\n CtrlShiftRight = 'ctrl+shift+right',\n CtrlShiftHome = 'ctrl+shift+home',\n CtrlShiftEnd = 'ctrl+shift+end',\n F1 = 'f1',\n F2 = 'f2',\n F3 = 'f3',\n F4 = 'f4',\n F5 = 'f5',\n F6 = 'f6',\n F7 = 'f7',\n F8 = 'f8',\n F9 = 'f9',\n F10 = 'f10',\n F11 = 'f11',\n F12 = 'f12',\n F13 = 'f13',\n F14 = 'f14',\n F15 = 'f15',\n F16 = 'f16',\n F17 = 'f17',\n F18 = 'f18',\n F19 = 'f19',\n F20 = 'f20',\n}\n\n/** @public Parsed key metadata. */\nexport interface Key {\n type: KeyType\n runes: string\n alt: boolean\n paste: boolean\n}\n\nconst keyNames: Record<KeyType, string> = {\n [KeyType.Null]: 'ctrl+@',\n [KeyType.Break]: 'ctrl+c',\n [KeyType.Enter]: 'enter',\n [KeyType.Backspace]: 'backspace',\n [KeyType.Tab]: 'tab',\n [KeyType.Esc]: 'esc',\n [KeyType.Space]: ' ',\n [KeyType.Runes]: 'runes',\n [KeyType.Up]: 'up',\n [KeyType.Down]: 'down',\n [KeyType.Right]: 'right',\n [KeyType.Left]: 'left',\n [KeyType.ShiftTab]: 'shift+tab',\n [KeyType.Home]: 'home',\n [KeyType.End]: 'end',\n [KeyType.PgUp]: 'pgup',\n [KeyType.PgDown]: 'pgdown',\n [KeyType.CtrlPgUp]: 'ctrl+pgup',\n [KeyType.CtrlPgDown]: 'ctrl+pgdown',\n [KeyType.Delete]: 'delete',\n [KeyType.Insert]: 'insert',\n [KeyType.CtrlUp]: 'ctrl+up',\n [KeyType.CtrlDown]: 'ctrl+down',\n [KeyType.CtrlRight]: 'ctrl+right',\n [KeyType.CtrlLeft]: 'ctrl+left',\n [KeyType.CtrlHome]: 'ctrl+home',\n [KeyType.CtrlEnd]: 'ctrl+end',\n [KeyType.ShiftUp]: 'shift+up',\n [KeyType.ShiftDown]: 'shift+down',\n [KeyType.ShiftRight]: 'shift+right',\n [KeyType.ShiftLeft]: 'shift+left',\n [KeyType.ShiftHome]: 'shift+home',\n [KeyType.ShiftEnd]: 'shift+end',\n [KeyType.CtrlShiftUp]: 'ctrl+shift+up',\n [KeyType.CtrlShiftDown]: 'ctrl+shift+down',\n [KeyType.CtrlShiftLeft]: 'ctrl+shift+left',\n [KeyType.CtrlShiftRight]: 'ctrl+shift+right',\n [KeyType.CtrlShiftHome]: 'ctrl+shift+home',\n [KeyType.CtrlShiftEnd]: 'ctrl+shift+end',\n [KeyType.F1]: 'f1',\n [KeyType.F2]: 'f2',\n [KeyType.F3]: 'f3',\n [KeyType.F4]: 'f4',\n [KeyType.F5]: 'f5',\n [KeyType.F6]: 'f6',\n [KeyType.F7]: 'f7',\n [KeyType.F8]: 'f8',\n [KeyType.F9]: 'f9',\n [KeyType.F10]: 'f10',\n [KeyType.F11]: 'f11',\n [KeyType.F12]: 'f12',\n [KeyType.F13]: 'f13',\n [KeyType.F14]: 'f14',\n [KeyType.F15]: 'f15',\n [KeyType.F16]: 'f16',\n [KeyType.F17]: 'f17',\n [KeyType.F18]: 'f18',\n [KeyType.F19]: 'f19',\n [KeyType.F20]: 'f20',\n}\n\nconst controlKeyMap: Record<number, KeyType | undefined> = {\n 0: KeyType.Null,\n 3: KeyType.Break,\n 9: KeyType.Tab,\n 10: KeyType.Enter,\n 13: KeyType.Enter,\n 27: KeyType.Esc,\n 127: KeyType.Backspace,\n}\n\ntype Sequence = [string, Key]\n\nconst sequences: Sequence[] = [\n ['\\u001b[A', { type: KeyType.Up, runes: '', alt: false, paste: false }],\n ['\\u001b[B', { type: KeyType.Down, runes: '', alt: false, paste: false }],\n ['\\u001b[C', { type: KeyType.Right, runes: '', alt: false, paste: false }],\n ['\\u001b[D', { type: KeyType.Left, runes: '', alt: false, paste: false }],\n ['\\u001b[Z', { type: KeyType.ShiftTab, runes: '', alt: false, paste: false }],\n ['\\u001b[2~', { type: KeyType.Insert, runes: '', alt: false, paste: false }],\n ['\\u001b[3~', { type: KeyType.Delete, runes: '', alt: false, paste: false }],\n ['\\u001b[5~', { type: KeyType.PgUp, runes: '', alt: false, paste: false }],\n ['\\u001b[6~', { type: KeyType.PgDown, runes: '', alt: false, paste: false }],\n ['\\u001b[1~', { type: KeyType.Home, runes: '', alt: false, paste: false }],\n ['\\u001b[4~', { type: KeyType.End, runes: '', alt: false, paste: false }],\n ['\\u001b[H', { type: KeyType.Home, runes: '', alt: false, paste: false }],\n ['\\u001b[F', { type: KeyType.End, runes: '', alt: false, paste: false }],\n ['\\u001bOP', { type: KeyType.F1, runes: '', alt: false, paste: false }],\n ['\\u001bOQ', { type: KeyType.F2, runes: '', alt: false, paste: false }],\n ['\\u001bOR', { type: KeyType.F3, runes: '', alt: false, paste: false }],\n ['\\u001bOS', { type: KeyType.F4, runes: '', alt: false, paste: false }],\n ['\\u001b[15~', { type: KeyType.F5, runes: '', alt: false, paste: false }],\n ['\\u001b[17~', { type: KeyType.F6, runes: '', alt: false, paste: false }],\n ['\\u001b[18~', { type: KeyType.F7, runes: '', alt: false, paste: false }],\n ['\\u001b[19~', { type: KeyType.F8, runes: '', alt: false, paste: false }],\n ['\\u001b[20~', { type: KeyType.F9, runes: '', alt: false, paste: false }],\n ['\\u001b[21~', { type: KeyType.F10, runes: '', alt: false, paste: false }],\n ['\\u001b[23~', { type: KeyType.F11, runes: '', alt: false, paste: false }],\n ['\\u001b[24~', { type: KeyType.F12, runes: '', alt: false, paste: false }],\n [\n '\\u001b[1;2A',\n { type: KeyType.ShiftUp, runes: '', alt: false, paste: false },\n ],\n [\n '\\u001b[1;2B',\n { type: KeyType.ShiftDown, runes: '', alt: false, paste: false },\n ],\n [\n '\\u001b[1;2C',\n { type: KeyType.ShiftRight, runes: '', alt: false, paste: false },\n ],\n [\n '\\u001b[1;2D',\n { type: KeyType.ShiftLeft, runes: '', alt: false, paste: false },\n ],\n [\n '\\u001b[1;5A',\n { type: KeyType.CtrlUp, runes: '', alt: false, paste: false },\n ],\n [\n '\\u001b[1;5B',\n { type: KeyType.CtrlDown, runes: '', alt: false, paste: false },\n ],\n [\n '\\u001b[1;5C',\n { type: KeyType.CtrlRight, runes: '', alt: false, paste: false },\n ],\n [\n '\\u001b[1;5D',\n { type: KeyType.CtrlLeft, runes: '', alt: false, paste: false },\n ],\n [\n '\\u001b[1;6A',\n { type: KeyType.CtrlShiftUp, runes: '', alt: false, paste: false },\n ],\n [\n '\\u001b[1;6B',\n { type: KeyType.CtrlShiftDown, runes: '', alt: false, paste: false },\n ],\n [\n '\\u001b[1;6C',\n { type: KeyType.CtrlShiftRight, runes: '', alt: false, paste: false },\n ],\n [\n '\\u001b[1;6D',\n { type: KeyType.CtrlShiftLeft, runes: '', alt: false, paste: false },\n ],\n ['\\u001b[1;3A', { type: KeyType.Up, runes: '', alt: true, paste: false }],\n ['\\u001b[1;3B', { type: KeyType.Down, runes: '', alt: true, paste: false }],\n ['\\u001b[1;3C', { type: KeyType.Right, runes: '', alt: true, paste: false }],\n ['\\u001b[1;3D', { type: KeyType.Left, runes: '', alt: true, paste: false }],\n [\n '\\u001b[5;5~',\n { type: KeyType.CtrlPgUp, runes: '', alt: false, paste: false },\n ],\n [\n '\\u001b[6;5~',\n { type: KeyType.CtrlPgDown, runes: '', alt: false, paste: false },\n ],\n ['\\u001b[5;3~', { type: KeyType.PgUp, runes: '', alt: true, paste: false }],\n ['\\u001b[6;3~', { type: KeyType.PgDown, runes: '', alt: true, paste: false }],\n ['\\u001b[3;2~', { type: KeyType.Insert, runes: '', alt: true, paste: false }],\n ['\\u001b[3;3~', { type: KeyType.Delete, runes: '', alt: true, paste: false }],\n ['\\u001b[[A', { type: KeyType.F1, runes: '', alt: false, paste: false }],\n ['\\u001b[[B', { type: KeyType.F2, runes: '', alt: false, paste: false }],\n ['\\u001b[[C', { type: KeyType.F3, runes: '', alt: false, paste: false }],\n ['\\u001b[[D', { type: KeyType.F4, runes: '', alt: false, paste: false }],\n ['\\u001b[[E', { type: KeyType.F5, runes: '', alt: false, paste: false }],\n]\n\n/** @public Message representing a parsed key event. */\nexport class KeyMsg {\n readonly _tag = 'key'\n constructor(public readonly key: Key) {}\n\n toString(): string {\n return keyToString(this.key)\n }\n}\n\n/** @public Convert a parsed key to a human-readable string. */\nexport function keyToString(key: Key): string {\n if (key.type === KeyType.Runes) {\n const value = key.paste ? `[${key.runes}]` : key.runes\n return key.alt ? `alt+${value}` : value\n }\n const base = keyNames[key.type] ?? ''\n return key.alt ? `alt+${base}` : base\n}\n\n/** @internal */\nexport function parseKey(\n buffer: Uint8Array,\n allowMoreData: boolean,\n): { key: Key; length: number } | { needMore: true } | undefined {\n if (buffer.length === 0) {\n return allowMoreData ? { needMore: true } : undefined\n }\n const input = decodeString(buffer)\n\n for (const [seq, key] of sequences) {\n if (input.startsWith(seq)) {\n return { key, length: byteLength(seq) }\n }\n if (allowMoreData && seq.startsWith(input)) {\n return { needMore: true }\n }\n }\n\n if (buffer[0] === 0x1b && buffer.length > 1) {\n const [rune, altLength] = decodeFirstRune(buffer, 1)\n if (altLength > 0 && rune !== null) {\n return {\n key: { type: KeyType.Runes, runes: rune, alt: true, paste: false },\n length: 1 + altLength,\n }\n }\n }\n\n const code: number = buffer[0] ?? 0\n const mapped: KeyType | undefined = Object.prototype.hasOwnProperty.call(\n controlKeyMap,\n code,\n )\n ? controlKeyMap[code]\n : undefined\n if (mapped !== undefined) {\n return {\n key: { type: mapped, runes: '', alt: false, paste: false },\n length: 1,\n }\n }\n\n const [rune, runeLength] = decodeFirstRune(buffer)\n if (runeLength === 0 || rune === null) {\n return allowMoreData ? { needMore: true } : undefined\n }\n\n if (rune === ' ') {\n return {\n key: { type: KeyType.Space, runes: rune, alt: false, paste: false },\n length: runeLength,\n }\n }\n\n return {\n key: { type: KeyType.Runes, runes: rune, alt: false, paste: false },\n length: runeLength,\n }\n}\n","import { decodeString } from '@boba-cli/machine'\n\n/** @public Mouse action type. */\nexport enum MouseAction {\n Press = 'press',\n Release = 'release',\n Motion = 'motion',\n}\n\n/** @public Mouse button identifiers, including wheels. */\nexport enum MouseButton {\n None = 'none',\n Left = 'left',\n Middle = 'middle',\n Right = 'right',\n WheelUp = 'wheel-up',\n WheelDown = 'wheel-down',\n WheelLeft = 'wheel-left',\n WheelRight = 'wheel-right',\n Backward = 'backward',\n Forward = 'forward',\n Button10 = 'button-10',\n Button11 = 'button-11',\n}\n\n/** @public Parsed mouse event payload. */\nexport interface MouseEvent {\n x: number\n y: number\n shift: boolean\n alt: boolean\n ctrl: boolean\n action: MouseAction\n button: MouseButton\n}\n\n/** @public Message representing a parsed mouse event. */\nexport class MouseMsg {\n readonly _tag = 'mouse'\n constructor(public readonly event: MouseEvent) {}\n\n toString(): string {\n const parts = [\n this.event.ctrl ? 'ctrl' : '',\n this.event.alt ? 'alt' : '',\n this.event.shift ? 'shift' : '',\n ].filter(Boolean)\n const mods = parts.length > 0 ? `${parts.join('+')}+` : ''\n return `${mods}${this.event.button} ${this.event.action} @${this.event.x},${this.event.y}`\n }\n}\n\nconst mouseSGRRegex = /(\\d+);(\\d+);(\\d+)([Mm])/\nconst mouseEventX10Len = 6\nconst x10MouseByteOffset = 32\n\n/** @internal */\nexport function parseMouse(\n buffer: Uint8Array,\n allowMoreData: boolean,\n): { msg: MouseMsg; length: number } | { needMore: true } | undefined {\n if (buffer.length < 3 || buffer[0] !== 0x1b || buffer[1] !== 0x5b) {\n return undefined\n }\n\n if (buffer[2] === 0x4d) {\n if (buffer.length < mouseEventX10Len) {\n return allowMoreData ? { needMore: true } : undefined\n }\n const event = parseX10MouseEvent(buffer.subarray(0, mouseEventX10Len))\n return { msg: new MouseMsg(event), length: mouseEventX10Len }\n }\n\n if (buffer[2] === 0x3c) {\n const slice = decodeString(buffer)\n const match = mouseSGRRegex.exec(slice.slice(3))\n if (!match) {\n return allowMoreData ? { needMore: true } : undefined\n }\n const event = parseSGRMouseEvent(slice)\n const matchedLength = match[0]?.length ?? 0\n return { msg: new MouseMsg(event), length: matchedLength + 3 }\n }\n\n return undefined\n}\n\nfunction parseSGRMouseEvent(seq: string): MouseEvent {\n const match = mouseSGRRegex.exec(seq.slice(3))\n if (!match) {\n return defaultMouseEvent()\n }\n\n const buttonCode = Number.parseInt(match[1] ?? '0', 10)\n const px = Number.parseInt(match[2] ?? '0', 10)\n const py = Number.parseInt(match[3] ?? '0', 10)\n const release = match[4] === 'm'\n\n const event = parseMouseButton(buttonCode, true)\n\n if (event.action !== MouseAction.Motion && !eventIsWheel(event) && release) {\n event.action = MouseAction.Release\n }\n\n event.x = px - 1\n event.y = py - 1\n\n return event\n}\n\nfunction parseX10MouseEvent(buf: Uint8Array): MouseEvent {\n const buttonByte = buf[3] ?? 0\n const c1 = buf[4] ?? 0\n const c2 = buf[5] ?? 0\n const event = parseMouseButton(buttonByte, false)\n event.x = c1 - x10MouseByteOffset - 1\n event.y = c2 - x10MouseByteOffset - 1\n return event\n}\n\nfunction parseMouseButton(code: number, isSGR: boolean): MouseEvent {\n let e = code\n if (!isSGR) {\n e -= x10MouseByteOffset\n }\n\n const bitShift = 0b0000_0100\n const bitAlt = 0b0000_1000\n const bitCtrl = 0b0001_0000\n const bitMotion = 0b0010_0000\n const bitWheel = 0b0100_0000\n const bitAdd = 0b1000_0000\n const bitsMask = 0b0000_0011\n\n const event = defaultMouseEvent()\n\n if ((e & bitAdd) !== 0) {\n const extraButtons: Record<number, MouseButton> = {\n 0: MouseButton.Backward,\n 1: MouseButton.Forward,\n 2: MouseButton.Button10,\n 3: MouseButton.Button11,\n }\n event.button = extraButtons[e & bitsMask] ?? MouseButton.None\n } else if ((e & bitWheel) !== 0) {\n const wheelButtons: Record<number, MouseButton> = {\n 0: MouseButton.WheelUp,\n 1: MouseButton.WheelDown,\n 2: MouseButton.WheelLeft,\n 3: MouseButton.WheelRight,\n }\n event.button = wheelButtons[e & bitsMask] ?? MouseButton.None\n } else {\n const baseButtons: Record<number, MouseButton> = {\n 0: MouseButton.Left,\n 1: MouseButton.Middle,\n 2: MouseButton.Right,\n 3: MouseButton.None,\n }\n event.button = baseButtons[e & bitsMask] ?? MouseButton.None\n if ((e & bitsMask) === bitsMask) {\n event.action = MouseAction.Release\n event.button = MouseButton.None\n }\n }\n\n if ((e & bitMotion) !== 0 && !eventIsWheel(event)) {\n event.action = MouseAction.Motion\n }\n\n event.alt = (e & bitAlt) !== 0\n event.ctrl = (e & bitCtrl) !== 0\n event.shift = (e & bitShift) !== 0\n\n return event\n}\n\nfunction eventIsWheel(event: MouseEvent): boolean {\n return (\n event.button === MouseButton.WheelUp ||\n event.button === MouseButton.WheelDown ||\n event.button === MouseButton.WheelLeft ||\n event.button === MouseButton.WheelRight\n )\n}\n\nfunction defaultMouseEvent(): MouseEvent {\n return {\n x: 0,\n y: 0,\n shift: false,\n alt: false,\n ctrl: false,\n action: MouseAction.Press,\n button: MouseButton.None,\n }\n}\n","import type { Disposable, PlatformAdapter } from '@boba-cli/machine'\nimport { allocBytes, concatBytes, encodeString } from '@boba-cli/machine'\nimport { BlurMsg, FocusMsg } from './messages.js'\nimport { KeyMsg, KeyType, parseKey } from './keys.js'\nimport { parseMouse } from './mouse.js'\nimport type { Msg } from './types.js'\n\n/** @public Options for the input reader. */\nexport interface InputOptions {\n platform?: PlatformAdapter\n onMessage: (msg: Msg) => void\n}\n\nconst BRACKET_PASTE_START = '\\u001b[200~'\nconst BRACKET_PASTE_END = '\\u001b[201~'\n\n/** @internal */\nexport function startInput(options: InputOptions): () => void {\n if (!options.platform) {\n // No platform adapter available, return no-op cleanup\n return () => {}\n }\n\n let buffer: Uint8Array = allocBytes(0)\n let disposable: Disposable | null = null\n\n const onData = (data: Uint8Array) => {\n buffer = concatBytes(buffer, data)\n buffer = consumeBuffer(buffer, options.onMessage)\n }\n\n disposable = options.platform.terminal.onInput(onData)\n\n return () => {\n if (disposable) {\n disposable.dispose()\n }\n }\n}\n\nfunction consumeBuffer(buffer: Uint8Array, push: (msg: Msg) => void): Uint8Array {\n let offset = 0\n\n while (offset < buffer.length) {\n const slice = buffer.subarray(offset)\n const result = detectOne(slice, offset + slice.length === buffer.length)\n\n if (!result || 'needMore' in result) {\n break\n }\n\n offset += result.length\n if (result.msg) {\n push(result.msg)\n }\n }\n\n return buffer.subarray(offset)\n}\n\ntype DetectResult =\n | { msg: Msg; length: number }\n | { msg?: Msg; length: number }\n | { needMore: true }\n\nfunction detectOne(\n buffer: Uint8Array,\n allowMoreData: boolean,\n): DetectResult | undefined {\n if (buffer.length === 0) {\n return allowMoreData ? { needMore: true } : undefined\n }\n const mouse = parseMouse(buffer, allowMoreData)\n if (mouse) {\n if ('needMore' in mouse) {\n return mouse\n }\n return { msg: mouse.msg, length: mouse.length }\n }\n\n const focus = detectFocus(buffer)\n if (focus) {\n return focus\n }\n\n const paste = detectBracketedPaste(buffer, allowMoreData)\n if (paste) {\n return paste\n }\n\n const key = parseKey(buffer, allowMoreData)\n if (!key) {\n return undefined\n }\n if ('needMore' in key) {\n return key\n }\n\n return { msg: new KeyMsg(key.key), length: key.length }\n}\n\nfunction detectFocus(buffer: Uint8Array): DetectResult | undefined {\n // Focus in: ESC [ I, Focus out: ESC [ O (exactly three bytes)\n if (buffer.length === 3 && buffer[0] === 0x1b && buffer[1] === 0x5b) {\n if (buffer[2] === 0x49) {\n return { msg: new FocusMsg(), length: 3 }\n }\n if (buffer[2] === 0x4f) {\n return { msg: new BlurMsg(), length: 3 }\n }\n }\n return undefined\n}\n\nfunction detectBracketedPaste(\n buffer: Uint8Array,\n allowMoreData: boolean,\n): DetectResult | undefined {\n const decoder = new TextDecoder('utf-8', { fatal: false })\n const asString = decoder.decode(buffer)\n if (!asString.startsWith(BRACKET_PASTE_START)) {\n return undefined\n }\n const endIndex = asString.indexOf(\n BRACKET_PASTE_END,\n BRACKET_PASTE_START.length,\n )\n if (endIndex === -1) {\n return allowMoreData ? { needMore: true } : undefined\n }\n const content = asString.slice(BRACKET_PASTE_START.length, endIndex)\n const fullString = BRACKET_PASTE_START + content + BRACKET_PASTE_END\n const length = encodeString(fullString).length\n const key: Msg = new KeyMsg({\n type: KeyType.Runes,\n runes: content,\n alt: false,\n paste: true,\n })\n return { msg: key, length }\n}\n","import type { PlatformAdapter, TerminalAdapter } from '@boba-cli/machine'\nimport { CURSOR_HOME, CLEAR_SCREEN } from '@boba-cli/machine'\n\n/** @public Options for the standard renderer. */\nexport interface RendererOptions {\n platform?: PlatformAdapter\n fps?: number\n}\n\n/** @public Standard renderer for terminal output. */\nexport class StandardRenderer {\n private nextFrame: string | null = null\n private lastFrame = ''\n private ticker: ReturnType<typeof setInterval> | null = null\n private readonly terminal: TerminalAdapter | null\n private readonly frameInterval: number\n\n constructor(options: RendererOptions = {}) {\n this.terminal = options.platform?.terminal ?? null\n const fps = Math.min(Math.max(options.fps ?? 60, 1), 120)\n this.frameInterval = Math.round(1000 / fps)\n }\n\n start(): void {\n if (this.ticker) {\n return\n }\n this.ticker = setInterval(() => this.flush(), this.frameInterval)\n }\n\n stop(): void {\n this.flush()\n if (this.ticker) {\n clearInterval(this.ticker)\n this.ticker = null\n }\n }\n\n write(view: string): void {\n this.nextFrame = view ?? ''\n }\n\n repaint(): void {\n this.lastFrame = ''\n }\n\n private flush(): void {\n if (this.nextFrame === null) {\n return\n }\n const frame = this.nextFrame\n if (frame === this.lastFrame) {\n return\n }\n this.lastFrame = frame\n // Clear the full screen before writing the next frame to avoid leftover characters\n if (this.terminal) {\n this.terminal.write(`${CLEAR_SCREEN}${CURSOR_HOME}${frame}`)\n }\n }\n}\n","import type { PlatformAdapter, TerminalAdapter } from '@boba-cli/machine'\nimport {\n CURSOR_SHOW,\n CURSOR_HIDE,\n CLEAR_SCREEN,\n CURSOR_HOME,\n ALT_SCREEN_ON,\n ALT_SCREEN_OFF,\n MOUSE_CELL_ON,\n MOUSE_ALL_ON,\n MOUSE_SGR_ON,\n MOUSE_CELL_OFF,\n MOUSE_ALL_OFF,\n MOUSE_SGR_OFF,\n BRACKETED_PASTE_ON,\n BRACKETED_PASTE_OFF,\n REPORT_FOCUS_ON,\n REPORT_FOCUS_OFF,\n} from '@boba-cli/machine'\n\n/** @public Options for the terminal controller. */\nexport interface TerminalOptions {\n platform?: PlatformAdapter\n}\n\n/** @public Controller for terminal state management. */\nexport class TerminalController {\n private rawMode = false\n private altScreen = false\n private bracketedPaste = false\n private focusReporting = false\n private readonly terminal: TerminalAdapter | null\n\n constructor(platform?: PlatformAdapter) {\n this.terminal = platform?.terminal ?? null\n }\n\n enableRawMode(): void {\n if (this.terminal && !this.rawMode) {\n this.terminal.enableRawMode()\n this.rawMode = true\n }\n }\n\n disableRawMode(): void {\n if (this.terminal && this.rawMode) {\n this.terminal.disableRawMode()\n this.rawMode = false\n }\n }\n\n enterAltScreen(): void {\n this.write(ALT_SCREEN_ON)\n this.altScreen = true\n }\n\n exitAltScreen(): void {\n this.write(ALT_SCREEN_OFF)\n this.altScreen = false\n }\n\n clearScreen(): void {\n this.write(`${CLEAR_SCREEN}${CURSOR_HOME}`)\n }\n\n showCursor(): void {\n this.write(CURSOR_SHOW)\n }\n\n hideCursor(): void {\n this.write(CURSOR_HIDE)\n }\n\n enableMouseCellMotion(): void {\n this.write(MOUSE_CELL_ON)\n this.write(MOUSE_SGR_ON)\n }\n\n enableMouseAllMotion(): void {\n this.write(MOUSE_ALL_ON)\n this.write(MOUSE_SGR_ON)\n }\n\n disableMouse(): void {\n this.write(MOUSE_CELL_OFF)\n this.write(MOUSE_ALL_OFF)\n this.write(MOUSE_SGR_OFF)\n }\n\n enableBracketedPaste(): void {\n this.write(BRACKETED_PASTE_ON)\n this.bracketedPaste = true\n }\n\n disableBracketedPaste(): void {\n this.write(BRACKETED_PASTE_OFF)\n this.bracketedPaste = false\n }\n\n enableReportFocus(): void {\n this.write(REPORT_FOCUS_ON)\n this.focusReporting = true\n }\n\n disableReportFocus(): void {\n this.write(REPORT_FOCUS_OFF)\n this.focusReporting = false\n }\n\n setWindowTitle(title: string): void {\n this.write(`\\u001b]0;${title}\\u0007`)\n }\n\n cleanup(): void {\n this.disableMouse()\n if (this.focusReporting) {\n this.disableReportFocus()\n }\n if (this.bracketedPaste) {\n this.disableBracketedPaste()\n }\n this.showCursor()\n if (this.altScreen) {\n this.exitAltScreen()\n }\n this.disableRawMode()\n }\n\n write(data: string): void {\n if (data.length === 0) {\n return\n }\n if (this.terminal) {\n this.terminal.write(data)\n }\n }\n}\n","import { type PlatformAdapter } from '@boba-cli/machine'\nimport { startInput } from './input.js'\nimport {\n ClearScreenMsg,\n DisableMouseMsg,\n EnableMouseAllMotionMsg,\n EnableMouseCellMotionMsg,\n EnterAltScreenMsg,\n ExitAltScreenMsg,\n HideCursorMsg,\n InterruptMsg,\n QuitMsg,\n ResumeMsg,\n SetWindowTitleMsg,\n ShowCursorMsg,\n} from './messages.js'\nimport { StandardRenderer } from './renderer.js'\nimport { TerminalController } from './terminal.js'\nimport type { Cmd, Model, ModelMsg, Msg, ProgramResult } from './types.js'\nimport { WindowSizeMsg } from './messages.js'\n\n/** @public Configure program runtime options. */\nexport interface ProgramOptions {\n altScreen?: boolean\n mouseMode?: 'cell' | 'all' | false\n /**\n * The platform adapter to use.\n *\n * @remarks\n * For Node.js, use `createNodePlatform()` from `@boba-cli/machine/node`.\n * For browser with xterm.js, use `createBrowserPlatform({ terminal })` from `@boba-cli/machine/browser`.\n */\n platform: PlatformAdapter\n fps?: number\n reportFocus?: boolean\n bracketedPaste?: boolean\n}\n\n/**\n * Bubble Tea-style program runner.\n *\n * @remarks\n * Requires a platform adapter to be provided via options.\n * Use `createNodePlatform()` from `@boba-cli/machine/node` for Node.js,\n * or `createBrowserPlatform({ terminal })` from `@boba-cli/machine/browser` for browsers.\n *\n * @public\n */\nexport class Program<M extends Model<Msg, M>> {\n private model: M\n private terminal: TerminalController\n private renderer: StandardRenderer\n private readonly opts: ProgramOptions\n private readonly platform: PlatformAdapter\n private stopInput?: () => void\n private running = false\n private queue: Msg[] = []\n private draining = false\n private result: ProgramResult<M> | null = null\n private resolveWait?: () => void\n\n constructor(model: M, options: ProgramOptions) {\n this.model = model\n this.opts = options\n this.platform = options.platform\n this.terminal = new TerminalController(this.platform)\n this.renderer = new StandardRenderer({\n platform: this.platform,\n fps: this.opts.fps,\n })\n }\n\n async run(): Promise<ProgramResult<M>> {\n this.running = true\n this.setupTerminal()\n this.setupSignals()\n this.renderer.start()\n\n try {\n this.runCmd(this.model.init())\n this.renderer.write(this.model.view())\n this.startInputLoop()\n // Wait until the program is explicitly quit\n await this.waitUntilDone()\n this.result = { model: this.model }\n } catch (err) {\n this.result = { model: this.model, error: err }\n } finally {\n this.shutdown()\n }\n\n return this.result ?? { model: this.model }\n }\n\n private waitUntilDone(): Promise<void> {\n return new Promise((resolve) => {\n this.resolveWait = resolve\n // If already not running, resolve immediately\n if (!this.running) {\n resolve()\n }\n })\n }\n\n send(msg: Msg): void {\n if (!msg) {\n return\n }\n this.queue.push(msg)\n if (!this.draining) {\n void this.drainQueue()\n }\n }\n\n quit(): void {\n this.send(new QuitMsg())\n }\n\n kill(): void {\n this.running = false\n this.shutdown()\n }\n\n private drainQueue(): void {\n if (this.draining) {\n return\n }\n this.draining = true\n\n while (this.running && this.queue.length > 0) {\n const msg = this.queue.shift()\n if (msg === undefined) {\n continue\n }\n\n const consumed = this.handleInternal(msg)\n if (consumed) {\n continue\n }\n\n const [nextModel, cmd] = this.model.update(msg)\n this.model = nextModel\n\n this.runCmd(cmd)\n this.renderer.write(this.model.view())\n }\n\n this.draining = false\n }\n\n private handleInternal(msg: Msg): boolean {\n if (msg instanceof QuitMsg || msg instanceof InterruptMsg) {\n this.running = false\n if (this.resolveWait) {\n this.resolveWait()\n }\n return true\n }\n if (msg instanceof ClearScreenMsg) {\n this.terminal.clearScreen()\n return false\n }\n if (msg instanceof EnterAltScreenMsg) {\n this.terminal.enterAltScreen()\n this.renderer.repaint()\n return false\n }\n if (msg instanceof ExitAltScreenMsg) {\n this.terminal.exitAltScreen()\n this.renderer.repaint()\n return false\n }\n if (msg instanceof EnableMouseCellMotionMsg) {\n this.terminal.enableMouseCellMotion()\n return false\n }\n if (msg instanceof EnableMouseAllMotionMsg) {\n this.terminal.enableMouseAllMotion()\n return false\n }\n if (msg instanceof DisableMouseMsg) {\n this.terminal.disableMouse()\n return false\n }\n if (msg instanceof ShowCursorMsg) {\n this.terminal.showCursor()\n return false\n }\n if (msg instanceof HideCursorMsg) {\n this.terminal.hideCursor()\n return false\n }\n if (msg instanceof SetWindowTitleMsg) {\n this.terminal.setWindowTitle(msg.title)\n return false\n }\n if (msg instanceof ResumeMsg) {\n return false\n }\n return false\n }\n\n private runCmd<T extends Msg>(cmd: Cmd<T> | undefined): void {\n if (!cmd) {\n return\n }\n\n const handleResult = (result: T | T[] | null | undefined) => {\n if (result === null || result === undefined) {\n return\n }\n if (Array.isArray(result)) {\n for (const msg of result) {\n this.send(msg)\n }\n } else {\n this.send(result)\n }\n }\n\n try {\n const effect = cmd()\n if (effect instanceof Promise) {\n effect.then(handleResult).catch((err) => {\n // Preserve behavior but don't block other messages\n console.error(err)\n })\n } else {\n handleResult(effect)\n }\n } catch (err) {\n console.error(err)\n }\n }\n\n private setupTerminal(): void {\n this.terminal.enableRawMode()\n this.terminal.hideCursor()\n\n if (this.opts.altScreen) {\n this.terminal.enterAltScreen()\n this.terminal.clearScreen()\n }\n\n if (this.opts.mouseMode === 'cell') {\n this.terminal.enableMouseCellMotion()\n } else if (this.opts.mouseMode === 'all') {\n this.terminal.enableMouseAllMotion()\n }\n\n if (this.opts.bracketedPaste !== false) {\n this.terminal.enableBracketedPaste()\n }\n\n if (this.opts.reportFocus) {\n this.terminal.enableReportFocus()\n }\n }\n\n private startInputLoop(): void {\n this.stopInput = startInput({\n platform: this.platform,\n onMessage: (msg) => this.send(msg as ModelMsg<M>),\n })\n }\n\n private setupSignals(): void {\n const disposables: (() => void)[] = []\n\n const intDisposable = this.platform.signals.onInterrupt(this.onSigInt)\n const termDisposable = this.platform.signals.onTerminate(this.onSigTerm)\n disposables.push(\n () => intDisposable.dispose(),\n () => termDisposable.dispose(),\n )\n\n // Set up resize handler\n const handleResize = (size: { columns: number; rows: number }) => {\n this.send(new WindowSizeMsg(size.columns, size.rows))\n }\n const resizeDisposable = this.platform.terminal.onResize(handleResize)\n disposables.push(() => resizeDisposable.dispose())\n\n // Send initial size\n const initialSize = this.platform.terminal.getSize()\n this.send(new WindowSizeMsg(initialSize.columns, initialSize.rows))\n\n this.disposeSignals = () => {\n for (const dispose of disposables) {\n dispose()\n }\n }\n }\n\n private disposeSignals: (() => void) | null = null\n\n private onSigInt = (): void => {\n this.send(new InterruptMsg())\n }\n\n private onSigTerm = (): void => {\n this.send(new QuitMsg())\n }\n\n private shutdown(): void {\n if (this.disposeSignals) {\n this.disposeSignals()\n this.disposeSignals = null\n }\n if (this.stopInput) {\n this.stopInput()\n this.stopInput = undefined\n }\n this.renderer.stop()\n this.terminal.cleanup()\n this.platform.dispose()\n }\n}\n","import { QuitMsg } from './messages.js'\nimport { Cmd, Effect, Msg } from './types.js'\n\ntype MsgOrArray<M extends Msg> = M | M[]\n\nconst now = () => new Date()\n\n/**\n * @public\n * Run multiple commands concurrently and flatten their results.\n */\nexport function batch<M extends Msg>(...cmds: Array<Cmd<M>>): Cmd<M> {\n const valid = cmds.filter((cmd): cmd is Cmd<M> => Boolean(cmd))\n if (valid.length === 0) {\n return null\n }\n if (valid.length === 1) {\n const [only] = valid\n return only ?? null\n }\n return async () => {\n const results = await Promise.all(\n valid.map((cmd) => Promise.resolve(cmd?.())),\n )\n return flatten(results)\n }\n}\n\n/**\n * @public\n * Run commands sequentially, preserving order and skipping nulls.\n */\nexport function sequence<M extends Msg>(...cmds: Array<Cmd<M>>): Cmd<M> {\n const valid = cmds.filter((cmd): cmd is Cmd<M> => Boolean(cmd))\n if (valid.length === 0) {\n return null\n }\n if (valid.length === 1) {\n const [only] = valid\n return only ?? null\n }\n return async () => {\n const messages: Array<MsgOrArray<M>> = []\n for (const cmd of valid) {\n const result = await Promise.resolve(cmd?.())\n if (result !== null && result !== undefined) {\n messages.push(result)\n }\n }\n return flatten(messages)\n }\n}\n\n/**\n * @public\n * Emit a message after a delay.\n */\nexport function tick<M extends Msg>(ms: number, fn: (t: Date) => M): Cmd<M> {\n return () =>\n new Promise<M>((resolve) => {\n setTimeout(() => resolve(fn(now())), ms)\n })\n}\n\n/**\n * @public\n * Schedule a single message aligned to the next interval boundary.\n * Call again from your update loop to continue a repeating cadence.\n */\nexport function every<M extends Msg>(ms: number, fn: (t: Date) => M): Cmd<M> {\n return () =>\n new Promise<M>((resolve) => {\n const current = now()\n const delay = alignToInterval(current, ms)\n setTimeout(() => resolve(fn(now())), delay)\n })\n}\n\n/** @public Lift a message into a command. */\nexport const msg =\n <M extends Msg>(value: M): Cmd<M> =>\n () =>\n value\n/** @public Command that emits a QuitMsg. */\nexport const quit = (): Cmd<Msg> => msg(new QuitMsg())\n\nfunction flatten<M extends Msg>(\n values: Array<Effect<M>>,\n): MsgOrArray<M> | null {\n const results: M[] = []\n for (const value of values) {\n if (value === null || value === undefined) {\n continue\n }\n if (Array.isArray(value)) {\n results.push(...value)\n } else {\n results.push(value)\n }\n }\n if (results.length === 0) {\n return null\n }\n if (results.length === 1) {\n return results[0] as M\n }\n return results\n}\n\nfunction alignToInterval(date: Date, ms: number): number {\n const next = new Date(date)\n next.setMilliseconds(0)\n const remainder = date.getTime() % ms\n return remainder === 0 ? ms : ms - remainder\n}\n","import type { PlatformAdapter } from '@boba-cli/machine'\nimport {\n ClearScreenMsg,\n DisableMouseMsg,\n EnableMouseAllMotionMsg,\n EnableMouseCellMotionMsg,\n EnterAltScreenMsg,\n ExitAltScreenMsg,\n HideCursorMsg,\n SetWindowTitleMsg,\n ShowCursorMsg,\n WindowSizeMsg,\n} from './messages.js'\nimport type { Cmd, Msg } from './types.js'\n\n/** @public Clear the terminal screen. */\nexport const clearScreen = (): Cmd<Msg> => () => new ClearScreenMsg()\n/** @public Enter the alternate screen buffer. */\nexport const enterAltScreen = (): Cmd<Msg> => () => new EnterAltScreenMsg()\n/** @public Exit the alternate screen buffer. */\nexport const exitAltScreen = (): Cmd<Msg> => () => new ExitAltScreenMsg()\n/** @public Enable cell-motion mouse reporting. */\nexport const enableMouseCellMotion = (): Cmd<Msg> => () =>\n new EnableMouseCellMotionMsg()\n/** @public Enable all-motion mouse reporting. */\nexport const enableMouseAllMotion = (): Cmd<Msg> => () =>\n new EnableMouseAllMotionMsg()\n/** @public Disable mouse reporting. */\nexport const disableMouse = (): Cmd<Msg> => () => new DisableMouseMsg()\n/** @public Show the cursor. */\nexport const showCursor = (): Cmd<Msg> => () => new ShowCursorMsg()\n/** @public Hide the cursor. */\nexport const hideCursor = (): Cmd<Msg> => () => new HideCursorMsg()\n/** @public Set the terminal window title. */\nexport const setWindowTitle =\n (title: string): Cmd<Msg> =>\n () =>\n new SetWindowTitleMsg(title)\n/**\n * @public\n * Emit the current window size.\n * @param platform - Optional platform adapter to get terminal size from\n */\nexport const windowSize =\n (platform?: PlatformAdapter): Cmd<Msg> =>\n () => {\n if (platform) {\n const size = platform.terminal.getSize()\n return new WindowSizeMsg(size.columns, size.rows)\n }\n return new WindowSizeMsg(0, 0)\n }\n"]}
|
package/package.json
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@boba-cli/tea",
|
|
3
3
|
"description": "Bubble Tea-inspired runtime for Boba terminal UIs",
|
|
4
|
-
"version": "
|
|
4
|
+
"version": "1.0.0-alpha.2",
|
|
5
5
|
"dependencies": {
|
|
6
|
-
"@boba-cli/machine": "0.1.0-alpha.
|
|
6
|
+
"@boba-cli/machine": "0.1.0-alpha.2"
|
|
7
7
|
},
|
|
8
8
|
"devDependencies": {
|
|
9
9
|
"@types/node": "^24.10.2",
|