Some checks failed
build-packages / resolve bundled mosh-client (push) Has been cancelled
build-packages / resolve bundled et-client (push) Has been cancelled
build-packages / build-macos (push) Has been cancelled
build-packages / build-windows (push) Has been cancelled
build-packages / build-linux-x64 (push) Has been cancelled
build-packages / build-linux-arm64 (push) Has been cancelled
build-packages / release (push) Has been cancelled
build-packages / update Nix release metadata (push) Has been cancelled
build-packages / bump homebrew tap (push) Has been cancelled
test / lint-and-test (push) Has been cancelled
AI automation / Route event (push) Has been cancelled
AI automation / Hand reopened issue to maintainers (push) Has been cancelled
AI automation / Clean source issue state (push) Has been cancelled
AI automation / Reconcile handoffs (push) Has been cancelled
AI automation / Classify issue (push) Has been cancelled
AI automation / Claude Code smoke (push) Has been cancelled
AI automation / Review issue follow-up (push) Has been cancelled
AI automation / Publish issue follow-up (push) Has been cancelled
AI automation / Implement with Claude Code (push) Has been cancelled
AI automation / Publish implement PR (push) Has been cancelled
AI automation / Continue queued issue comments (push) Has been cancelled
AI automation / Codex review loop (push) Has been cancelled
AI automation / Publish Codex fix (push) Has been cancelled
AI automation / Clear Codex dispatch marker (push) Has been cancelled
AI automation / Own PR re-request Codex (push) Has been cancelled
AI automation / External PR re-request Codex (push) Has been cancelled
AI automation / Poll Codex reaction / retry (push) Has been cancelled
build-et-binaries / build-linux-x64 (push) Has been cancelled
build-et-binaries / build-linux-arm64 (push) Has been cancelled
build-et-binaries / build-macos-universal (push) Has been cancelled
build-et-binaries / build-windows-x64 (push) Has been cancelled
build-et-binaries / release (push) Has been cancelled
87 lines
2.0 KiB
TypeScript
87 lines
2.0 KiB
TypeScript
type StringRef = {
|
|
current: string;
|
|
};
|
|
|
|
type SerialLineModeInputOptions = {
|
|
bufferRef: StringRef;
|
|
localEcho?: boolean;
|
|
writeToSession: (data: string) => void;
|
|
writeToTerminal: (data: string) => void;
|
|
};
|
|
|
|
const submitLine = ({
|
|
bufferRef,
|
|
localEcho,
|
|
writeToSession,
|
|
writeToTerminal,
|
|
}: SerialLineModeInputOptions) => {
|
|
const line = `${bufferRef.current}\r`;
|
|
writeToSession(line);
|
|
bufferRef.current = "";
|
|
if (localEcho) writeToTerminal("\r\n");
|
|
};
|
|
|
|
const appendText = (
|
|
text: string,
|
|
{ bufferRef, localEcho, writeToTerminal }: SerialLineModeInputOptions,
|
|
) => {
|
|
if (!text) return;
|
|
bufferRef.current += text;
|
|
if (localEcho) writeToTerminal(text);
|
|
};
|
|
|
|
const clearLine = ({
|
|
bufferRef,
|
|
localEcho,
|
|
writeToTerminal,
|
|
}: SerialLineModeInputOptions) => {
|
|
if (localEcho && bufferRef.current.length > 0) {
|
|
writeToTerminal("\b \b".repeat(bufferRef.current.length));
|
|
}
|
|
bufferRef.current = "";
|
|
};
|
|
|
|
export function handleSerialLineModeInput(
|
|
data: string,
|
|
options: SerialLineModeInputOptions,
|
|
): void {
|
|
if (data === "\r" || data === "\n") {
|
|
submitLine(options);
|
|
return;
|
|
}
|
|
|
|
if (data === "\x7f" || data === "\b") {
|
|
if (options.bufferRef.current.length > 0) {
|
|
options.bufferRef.current = options.bufferRef.current.slice(0, -1);
|
|
if (options.localEcho) options.writeToTerminal("\b \b");
|
|
}
|
|
return;
|
|
}
|
|
|
|
if (data === "\x03") {
|
|
options.bufferRef.current = "";
|
|
options.writeToSession(data);
|
|
if (options.localEcho) options.writeToTerminal("^C\r\n");
|
|
return;
|
|
}
|
|
|
|
if (data === "\x15") {
|
|
clearLine(options);
|
|
return;
|
|
}
|
|
|
|
const normalizedData = data.replace(/\r\n/g, "\r").replace(/\n/g, "\r");
|
|
if (normalizedData.includes("\r")) {
|
|
const parts = normalizedData.split("\r");
|
|
parts.forEach((part, index) => {
|
|
appendText(part, options);
|
|
if (index < parts.length - 1) submitLine(options);
|
|
});
|
|
return;
|
|
}
|
|
|
|
if (data.charCodeAt(0) >= 32 || data.length > 1) {
|
|
appendText(data, options);
|
|
}
|
|
}
|