mirror of
https://github.com/openclaw/openclaw.git
synced 2026-03-30 03:11:10 +00:00
* fix(process): auto-detect PTY cursor key mode for send-keys When a PTY session sends smkx (\x1b[?1h) or rmkx (\x1b[?1l) to switch cursor key mode, send-keys now detects this and encodes cursor keys accordingly. - smkx/rmkx detection in handleStdout before sanitizeBinaryOutput - cursorKeyMode stored in ProcessSession - encodeKeySequence accepts cursorKeyMode parameter - DECCKM_SS3_KEYS for application mode (arrows + home/end) - CSI sequences for normal mode - Modified keys (including alt) always use xterm modifier scheme - Extract detectCursorKeyMode for unit testing - Use lastIndexOf to find last toggle in chunk (later one wins) Fixes #51488 * fix: fail loud when PTY cursor mode is unknown (#51490) (thanks @liuy) * style: format process send-keys guard (#51490) (thanks @liuy) --------- Co-authored-by: Ayaan Zaidi <hi@obviy.us>
45 lines
1.3 KiB
TypeScript
45 lines
1.3 KiB
TypeScript
import type { ChildProcessWithoutNullStreams } from "node:child_process";
|
|
import type { ProcessSession } from "./bash-process-registry.js";
|
|
|
|
export function createProcessSessionFixture(params: {
|
|
id: string;
|
|
command?: string;
|
|
startedAt?: number;
|
|
cwd?: string;
|
|
maxOutputChars?: number;
|
|
pendingMaxOutputChars?: number;
|
|
backgrounded?: boolean;
|
|
pid?: number;
|
|
child?: ChildProcessWithoutNullStreams;
|
|
cursorKeyMode?: ProcessSession["cursorKeyMode"];
|
|
}): ProcessSession {
|
|
const session: ProcessSession = {
|
|
id: params.id,
|
|
command: params.command ?? "test",
|
|
startedAt: params.startedAt ?? Date.now(),
|
|
cwd: params.cwd ?? "/tmp",
|
|
maxOutputChars: params.maxOutputChars ?? 10_000,
|
|
pendingMaxOutputChars: params.pendingMaxOutputChars ?? 30_000,
|
|
totalOutputChars: 0,
|
|
pendingStdout: [],
|
|
pendingStderr: [],
|
|
pendingStdoutChars: 0,
|
|
pendingStderrChars: 0,
|
|
aggregated: "",
|
|
tail: "",
|
|
exited: false,
|
|
exitCode: undefined,
|
|
exitSignal: undefined,
|
|
truncated: false,
|
|
backgrounded: params.backgrounded ?? false,
|
|
cursorKeyMode: params.cursorKeyMode ?? "normal",
|
|
};
|
|
if (params.pid !== undefined) {
|
|
session.pid = params.pid;
|
|
}
|
|
if (params.child) {
|
|
session.child = params.child;
|
|
}
|
|
return session;
|
|
}
|