@monotykamary/localterm-server 2.16.5 → 2.17.1
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/cdp/cdp-client.d.ts +13 -10
- package/dist/cdp/cdp-client.d.ts.map +1 -1
- package/dist/cdp/cdp-client.js +13 -10
- package/dist/cdp/cdp-client.js.map +1 -1
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +8 -9
- package/dist/constants.js.map +1 -1
- package/dist/index.d.ts +11 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -2
- package/dist/index.js.map +1 -1
- package/dist/protocol.d.ts +4 -2
- package/dist/protocol.d.ts.map +1 -1
- package/dist/protocol.js +2 -1
- package/dist/protocol.js.map +1 -1
- package/dist/schemas.d.ts +12 -0
- package/dist/schemas.d.ts.map +1 -1
- package/dist/schemas.js +26 -2
- package/dist/schemas.js.map +1 -1
- package/dist/session-manager.d.ts +1 -0
- package/dist/session-manager.d.ts.map +1 -1
- package/dist/session-manager.js +8 -1
- package/dist/session-manager.js.map +1 -1
- package/dist/session.d.ts +1 -0
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +45 -7
- package/dist/session.js.map +1 -1
- package/dist/types.d.ts +2 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/terminal-mode-state.d.ts +7 -0
- package/dist/utils/terminal-mode-state.d.ts.map +1 -0
- package/dist/utils/terminal-mode-state.js +58 -0
- package/dist/utils/terminal-mode-state.js.map +1 -0
- package/dist/utils/terminal-query-responder.d.ts +13 -0
- package/dist/utils/terminal-query-responder.d.ts.map +1 -0
- package/dist/utils/terminal-query-responder.js +100 -0
- package/dist/utils/terminal-query-responder.js.map +1 -0
- package/package.json +1 -1
package/dist/types.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { z } from "zod";
|
|
2
|
-
import type { automationLastRunSchema, automationLastRunStatusSchema, automationLifecycleSchema, automationRunLimitSchema, automationRunRecordSchema, automationRunStatusSchema, automationScheduleSchema, automationSchema, automationSessionEventSchema, automationTriggerSchema, automationV1Schema, automationV2Schema, automationWithNextRunSchema, caffeinateModeSchema, clientToServerMessageSchema, createAutomationInputSchema, gitBaseSourceSchema, gitBranchInfoSchema, gitBranchPrLeaseSchema, gitBranchPrMergeableSchema, gitBranchPrSchema, gitBranchPrStateSchema, gitDiffFileListResponseSchema, gitDiffFileMetaSchema, gitDiffFilePatchSchema, gitDiffFileSchema, gitDiffFileStatusSchema, gitDiffModeSchema, gitDiffResponseSchema, gitDiffSummarySchema, gitWorktreeListResponseSchema, gitWorktreeResultSchema, gitWorktreeSchema, gitWorktreeBaseRefSchema, createWorktreeInputSchema, worktreeOpenInCommandSchema, worktreeRepoConfigFileSchema, worktreeRepoConfigSchema, updateWorktreeConfigInputSchema, worktreeIncludeFileInputSchema, worktreeIncludeFileSchema, worktreeSweepResultSchema, launchInputSchema, resetAutomationInputSchema, serverToClientMessageSchema, sessionListItemSchema, sessionsListResponseSchema, sessionActivityStateSchema, triggerInputSchema, updateAutomationInputSchema } from "./schemas.js";
|
|
2
|
+
import type { automationLastRunSchema, automationLastRunStatusSchema, automationLifecycleSchema, automationRunLimitSchema, automationRunRecordSchema, automationRunStatusSchema, automationScheduleSchema, automationSchema, automationSessionEventSchema, automationTriggerSchema, automationV1Schema, automationV2Schema, automationWithNextRunSchema, caffeinateModeSchema, cdpHealthSchema, clientToServerMessageSchema, createAutomationInputSchema, gitBaseSourceSchema, gitBranchInfoSchema, gitBranchPrLeaseSchema, gitBranchPrMergeableSchema, gitBranchPrSchema, gitBranchPrStateSchema, gitDiffFileListResponseSchema, gitDiffFileMetaSchema, gitDiffFilePatchSchema, gitDiffFileSchema, gitDiffFileStatusSchema, gitDiffModeSchema, gitDiffResponseSchema, gitDiffSummarySchema, gitWorktreeListResponseSchema, gitWorktreeResultSchema, gitWorktreeSchema, gitWorktreeBaseRefSchema, createWorktreeInputSchema, worktreeOpenInCommandSchema, worktreeRepoConfigFileSchema, worktreeRepoConfigSchema, updateWorktreeConfigInputSchema, worktreeIncludeFileInputSchema, worktreeIncludeFileSchema, worktreeSweepResultSchema, launchInputSchema, resetAutomationInputSchema, serverToClientMessageSchema, sessionListItemSchema, sessionsListResponseSchema, sessionActivityStateSchema, triggerInputSchema, updateAutomationInputSchema } from "./schemas.js";
|
|
3
3
|
export interface SpawnPtyInput {
|
|
4
4
|
cols?: number;
|
|
5
5
|
rows?: number;
|
|
@@ -18,6 +18,7 @@ export interface PendingAutomationRun {
|
|
|
18
18
|
export type ClientToServerMessage = z.infer<typeof clientToServerMessageSchema>;
|
|
19
19
|
export type ServerToClientMessage = z.infer<typeof serverToClientMessageSchema>;
|
|
20
20
|
export type CaffeinateMode = z.infer<typeof caffeinateModeSchema>;
|
|
21
|
+
export type CdpHealth = z.infer<typeof cdpHealthSchema>;
|
|
21
22
|
export type AutomationLastRunStatus = z.infer<typeof automationLastRunStatusSchema>;
|
|
22
23
|
export type AutomationLastRun = z.infer<typeof automationLastRunSchema>;
|
|
23
24
|
export type AutomationSchedule = z.infer<typeof automationScheduleSchema>;
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,KAAK,EACV,uBAAuB,EACvB,6BAA6B,EAC7B,yBAAyB,EACzB,wBAAwB,EACxB,yBAAyB,EACzB,yBAAyB,EACzB,wBAAwB,EACxB,gBAAgB,EAChB,4BAA4B,EAC5B,uBAAuB,EACvB,kBAAkB,EAClB,kBAAkB,EAClB,2BAA2B,EAC3B,oBAAoB,EACpB,2BAA2B,EAC3B,2BAA2B,EAC3B,mBAAmB,EACnB,mBAAmB,EACnB,sBAAsB,EACtB,0BAA0B,EAC1B,iBAAiB,EACjB,sBAAsB,EACtB,6BAA6B,EAC7B,qBAAqB,EACrB,sBAAsB,EACtB,iBAAiB,EACjB,uBAAuB,EACvB,iBAAiB,EACjB,qBAAqB,EACrB,oBAAoB,EACpB,6BAA6B,EAC7B,uBAAuB,EACvB,iBAAiB,EACjB,wBAAwB,EACxB,yBAAyB,EACzB,2BAA2B,EAC3B,4BAA4B,EAC5B,wBAAwB,EACxB,+BAA+B,EAC/B,8BAA8B,EAC9B,yBAAyB,EACzB,yBAAyB,EACzB,iBAAiB,EACjB,0BAA0B,EAC1B,2BAA2B,EAC3B,qBAAqB,EACrB,0BAA0B,EAC1B,0BAA0B,EAC1B,kBAAkB,EAClB,2BAA2B,EAC5B,MAAM,cAAc,CAAC;AAEtB,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAC;AAChF,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAC;AAEhF,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,KAAK,EACV,uBAAuB,EACvB,6BAA6B,EAC7B,yBAAyB,EACzB,wBAAwB,EACxB,yBAAyB,EACzB,yBAAyB,EACzB,wBAAwB,EACxB,gBAAgB,EAChB,4BAA4B,EAC5B,uBAAuB,EACvB,kBAAkB,EAClB,kBAAkB,EAClB,2BAA2B,EAC3B,oBAAoB,EACpB,eAAe,EACf,2BAA2B,EAC3B,2BAA2B,EAC3B,mBAAmB,EACnB,mBAAmB,EACnB,sBAAsB,EACtB,0BAA0B,EAC1B,iBAAiB,EACjB,sBAAsB,EACtB,6BAA6B,EAC7B,qBAAqB,EACrB,sBAAsB,EACtB,iBAAiB,EACjB,uBAAuB,EACvB,iBAAiB,EACjB,qBAAqB,EACrB,oBAAoB,EACpB,6BAA6B,EAC7B,uBAAuB,EACvB,iBAAiB,EACjB,wBAAwB,EACxB,yBAAyB,EACzB,2BAA2B,EAC3B,4BAA4B,EAC5B,wBAAwB,EACxB,+BAA+B,EAC/B,8BAA8B,EAC9B,yBAAyB,EACzB,yBAAyB,EACzB,iBAAiB,EACjB,0BAA0B,EAC1B,2BAA2B,EAC3B,qBAAqB,EACrB,0BAA0B,EAC1B,0BAA0B,EAC1B,kBAAkB,EAClB,2BAA2B,EAC5B,MAAM,cAAc,CAAC;AAEtB,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAC;AAChF,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAC;AAEhF,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAClE,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAExD,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,6BAA6B,CAAC,CAAC;AACpF,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AACxE,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAC1E,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,4BAA4B,CAAC,CAAC;AAClF,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AACxE,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAC9D,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAC1E,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAC5E,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAC5E,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAC5E,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAC1D,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAC9D,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAC9D,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAC;AAChF,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAC;AAChF,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAC;AAChF,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAE9E,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AACxE,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAC5D,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAChE,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AACtE,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAC9E,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAC5D,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAChE,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AACtE,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAC5D,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,6BAA6B,CAAC,CAAC;AACpF,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AACxE,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAC1E,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAC5E,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAC;AAChF,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,4BAA4B,CAAC,CAAC;AAClF,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAC1E,MAAM,MAAM,yBAAyB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,+BAA+B,CAAC,CAAC;AACxF,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAC5E,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,8BAA8B,CAAC,CAAC;AACtF,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAC5E,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAC5D,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAClE,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AACpE,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAC7E,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAC9E,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AACpE,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,6BAA6B,CAAC,CAAC;AACpF,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AACtE,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAC5D,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminal-mode-state.d.ts","sourceRoot":"","sources":["../../src/utils/terminal-mode-state.ts"],"names":[],"mappings":"AAgCA,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAqB;IAClD,OAAO,CAAC,YAAY,CAAS;IAE7B,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAiB1B,aAAa,IAAI,MAAM;CAQxB"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
// Tracks the live state of the terminal private modes that a scrollback replay
|
|
2
|
+
// must re-establish for a switched-to TUI to behave correctly. The replay ring
|
|
3
|
+
// buffer holds only the last ~256KB of raw PTY bytes, so a long-running TUI's
|
|
4
|
+
// mode-set sequences (alt-screen enter, mouse enable, bracketed paste) often
|
|
5
|
+
// scroll out of the window — replaying the bytes into a fresh xterm.js after a
|
|
6
|
+
// reset then leaves the terminal in the normal buffer with no mouse, and the
|
|
7
|
+
// wheel scrolls xterm's scrollback instead of the TUI. snapshotScrollback()
|
|
8
|
+
// prepends a restore prefix built from this tracker so xterm starts in the
|
|
9
|
+
// PTY's current mode state before the replayed content lands.
|
|
10
|
+
//
|
|
11
|
+
// Scope is deliberately narrow: only the modes that change how the replay
|
|
12
|
+
// renders or routes input. Synchronized-output mode (2026) is intentionally
|
|
13
|
+
// excluded — restoring it risks leaving xterm in a buffered state if the
|
|
14
|
+
// snapshot was taken mid-redraw (a `?2026h` whose matching `?2026l` is outside
|
|
15
|
+
// the window), freezing the screen. Kitty keyboard is a push/pop stack, not a
|
|
16
|
+
// simple toggle, and is left to the replay bytes. Cursor visibility (25) is
|
|
17
|
+
// tracked as a hide flag so a TUI that hid the cursor can restore the hide
|
|
18
|
+
// over the client's default `?25h`.
|
|
19
|
+
const ESC = "\x1b";
|
|
20
|
+
const RESTORABLE_PRIVATE_MODES = new Set([
|
|
21
|
+
1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1015, 1047, 1048, 1049, 2004,
|
|
22
|
+
]);
|
|
23
|
+
const DECRQM_PATTERN = /\x1b\[\?(\d+)([hl])/g;
|
|
24
|
+
const sortedRestorableModes = (modes) => Array.from(modes)
|
|
25
|
+
.filter((mode) => RESTORABLE_PRIVATE_MODES.has(mode))
|
|
26
|
+
.sort((a, b) => a - b);
|
|
27
|
+
export class TerminalModeState {
|
|
28
|
+
enabledModes = new Set();
|
|
29
|
+
cursorHidden = false;
|
|
30
|
+
update(data) {
|
|
31
|
+
DECRQM_PATTERN.lastIndex = 0;
|
|
32
|
+
let match = DECRQM_PATTERN.exec(data);
|
|
33
|
+
while (match !== null) {
|
|
34
|
+
const mode = Number.parseInt(match[1], 10);
|
|
35
|
+
const action = match[2];
|
|
36
|
+
if (mode === 25) {
|
|
37
|
+
this.cursorHidden = action === "l";
|
|
38
|
+
}
|
|
39
|
+
else if (action === "h") {
|
|
40
|
+
this.enabledModes.add(mode);
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
this.enabledModes.delete(mode);
|
|
44
|
+
}
|
|
45
|
+
match = DECRQM_PATTERN.exec(data);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
restorePrefix() {
|
|
49
|
+
const parts = [];
|
|
50
|
+
for (const mode of sortedRestorableModes(this.enabledModes)) {
|
|
51
|
+
parts.push(`${ESC}[?${mode}h`);
|
|
52
|
+
}
|
|
53
|
+
if (this.cursorHidden)
|
|
54
|
+
parts.push(`${ESC}[?25l`);
|
|
55
|
+
return parts.join("");
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=terminal-mode-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminal-mode-state.js","sourceRoot":"","sources":["../../src/utils/terminal-mode-state.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,+EAA+E;AAC/E,8EAA8E;AAC9E,6EAA6E;AAC7E,+EAA+E;AAC/E,6EAA6E;AAC7E,4EAA4E;AAC5E,2EAA2E;AAC3E,8DAA8D;AAC9D,EAAE;AACF,0EAA0E;AAC1E,4EAA4E;AAC5E,yEAAyE;AACzE,+EAA+E;AAC/E,8EAA8E;AAC9E,4EAA4E;AAC5E,2EAA2E;AAC3E,oCAAoC;AAEpC,MAAM,GAAG,GAAG,MAAM,CAAC;AAEnB,MAAM,wBAAwB,GAAG,IAAI,GAAG,CAAC;IACvC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;CAC7E,CAAC,CAAC;AAEH,MAAM,cAAc,GAAG,sBAAsB,CAAC;AAE9C,MAAM,qBAAqB,GAAG,CAAC,KAAkB,EAAY,EAAE,CAC7D,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;KACd,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,wBAAwB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;KACpD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAE3B,MAAM,OAAO,iBAAiB;IACX,YAAY,GAAG,IAAI,GAAG,EAAU,CAAC;IAC1C,YAAY,GAAG,KAAK,CAAC;IAE7B,MAAM,CAAC,IAAY;QACjB,cAAc,CAAC,SAAS,GAAG,CAAC,CAAC;QAC7B,IAAI,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtC,OAAO,KAAK,KAAK,IAAI,EAAE,CAAC;YACtB,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC3C,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACxB,IAAI,IAAI,KAAK,EAAE,EAAE,CAAC;gBAChB,IAAI,CAAC,YAAY,GAAG,MAAM,KAAK,GAAG,CAAC;YACrC,CAAC;iBAAM,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;gBAC1B,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC9B,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACjC,CAAC;YACD,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IAED,aAAa;QACX,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,MAAM,IAAI,IAAI,qBAAqB,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;YAC5D,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,KAAK,IAAI,GAAG,CAAC,CAAC;QACjC,CAAC;QACD,IAAI,IAAI,CAAC,YAAY;YAAE,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,CAAC;QACjD,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACxB,CAAC;CACF"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
declare class TerminalQueryResponder {
|
|
2
|
+
private da1Response;
|
|
3
|
+
private da2Response;
|
|
4
|
+
interceptRequest: (data: string) => {
|
|
5
|
+
passthrough: string;
|
|
6
|
+
responses: string[];
|
|
7
|
+
};
|
|
8
|
+
captureResponse: (data: string) => void;
|
|
9
|
+
reset: () => void;
|
|
10
|
+
}
|
|
11
|
+
declare const terminalQueryResponder: TerminalQueryResponder;
|
|
12
|
+
export { TerminalQueryResponder, terminalQueryResponder };
|
|
13
|
+
//# sourceMappingURL=terminal-query-responder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminal-query-responder.d.ts","sourceRoot":"","sources":["../../src/utils/terminal-query-responder.ts"],"names":[],"mappings":"AA4CA,cAAM,sBAAsB;IAO1B,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,WAAW,CAAuB;IAS1C,gBAAgB,GAAI,MAAM,MAAM,KAAG;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,EAAE,CAAA;KAAE,CAa7E;IAOF,eAAe,GAAI,MAAM,MAAM,KAAG,IAAI,CASpC;IAIF,KAAK,QAAO,IAAI,CAGd;CACH;AAED,QAAA,MAAM,sBAAsB,wBAA+B,CAAC;AAE5D,OAAO,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,CAAC"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
// Answers the stateless terminal identity queries (DA1, DA2) server-side so the
|
|
2
|
+
// probing program gets an instant in-process response instead of waiting on
|
|
3
|
+
// the remote round-trip to xterm.js.
|
|
4
|
+
//
|
|
5
|
+
// Why: a terminal identity query is a synchronous, in-process protocol. In a
|
|
6
|
+
// real terminal the program writes `CSI c` (DA1) and the same process reads the
|
|
7
|
+
// response (`CSI ? 62;4;9;22c`) off the PTY master microseconds later. In
|
|
8
|
+
// localterm the terminal emulator is across a WebSocket, so the response must
|
|
9
|
+
// travel PTY -> server -> xterm.js (parsed asynchronously via setTimeout) ->
|
|
10
|
+
// server -> PTY — reliably tens of ms. A probing program that issues the query
|
|
11
|
+
// with a short read timeout (a prompt plugin) or that exits before the
|
|
12
|
+
// response arrives (neovim re-probing DA1 on a resize-driven SIGWINCH, then
|
|
13
|
+
// `:q`) gives up before the slow response lands, so the response is orphaned in
|
|
14
|
+
// the PTY stdin and the next reader treats it as typed text — `62;4;9;22c`
|
|
15
|
+
// leaking into the shell. Latency tuning can't win this race reliably (every
|
|
16
|
+
// program's timeout differs), so the fix is to answer in the same process that
|
|
17
|
+
// holds the PTY, the tmux/mosh model: nothing round-trips to xterm at all.
|
|
18
|
+
//
|
|
19
|
+
// Scope is deliberately a fixed, standard, stateless family: DA1 (`CSI [Ps] c`
|
|
20
|
+
// -> `CSI ? ... c`) and DA2 (`CSI > [Ps] c` -> `CSI > ... c`). Their responses
|
|
21
|
+
// depend only on terminal identity (fixed for a given xterm build), not on
|
|
22
|
+
// modes or colors, so a once-captured response is correct forever. DA3
|
|
23
|
+
// (`CSI = c`) is intentionally NOT handled: xterm.js does not answer it, so
|
|
24
|
+
// there is no response to orphan and nothing to replay — intercepting it would
|
|
25
|
+
// be dead code. Stateful queries (DECRQM mode reports, OSC color) are also out
|
|
26
|
+
// of scope: their responses depend on live state, answering them server-side
|
|
27
|
+
// would mean tracking that state, and the replay-suppression + sync-flush
|
|
28
|
+
// fixes already keep them from leaking in the observed paths.
|
|
29
|
+
//
|
|
30
|
+
// This is NOT the rejected server-side stripper. The stripper rewrote the
|
|
31
|
+
// scrollback replay to drop an open-ended set of query variants — unbounded
|
|
32
|
+
// (every variant enumerated) and lossy. This responder intercepts a fixed
|
|
33
|
+
// set of live queries with unambiguous CSI finals (final `c`, intermediate
|
|
34
|
+
// none = DA1 / `>` = DA2 — no other sequence has these shapes), removes exactly
|
|
35
|
+
// those bytes from the output so xterm never sees the request and never
|
|
36
|
+
// responds, and writes the cached response straight to the PTY. A request
|
|
37
|
+
// split across PTY chunks simply isn't matched (DA queries are single small
|
|
38
|
+
// writes, one per chunk), so it passes through unchanged — no corruption.
|
|
39
|
+
const DA_REQUEST = /\x1b\[(>?)0?c/g;
|
|
40
|
+
const DA1_RESPONSE = /\x1b\[\?\d+(?:;\d+)*c/;
|
|
41
|
+
const DA2_RESPONSE = /\x1b\[>\d+(?:;\d+)*c/;
|
|
42
|
+
class TerminalQueryResponder {
|
|
43
|
+
// xterm.js's responses, captured the first time xterm answers each query
|
|
44
|
+
// (before the cache is warm the request round-trips to xterm as it does
|
|
45
|
+
// today — the round-trip is fine on a fresh spawn where the shell reads
|
|
46
|
+
// patiently; the leak only happens at the switch/exit moments where the cache
|
|
47
|
+
// is already warm). Once captured, every subsequent probe across every PTY
|
|
48
|
+
// is answered instantly from here.
|
|
49
|
+
da1Response = null;
|
|
50
|
+
da2Response = null;
|
|
51
|
+
// Scan PTY output for DA1/DA2 requests. Returns the output with matched
|
|
52
|
+
// requests removed (so xterm never sees them and never responds) plus the
|
|
53
|
+
// cached responses to write straight to the PTY, in order. When a cache is
|
|
54
|
+
// cold the request is left in the output to round-trip to xterm (whose
|
|
55
|
+
// response is then captured via captureResponse) — so the first probe ever
|
|
56
|
+
// behaves exactly as it does today, and only subsequent probes are answered
|
|
57
|
+
// here.
|
|
58
|
+
interceptRequest = (data) => {
|
|
59
|
+
const responses = [];
|
|
60
|
+
const passthrough = data.replace(DA_REQUEST, (match, intermediate) => {
|
|
61
|
+
if (intermediate === ">") {
|
|
62
|
+
if (this.da2Response === null)
|
|
63
|
+
return match;
|
|
64
|
+
responses.push(this.da2Response);
|
|
65
|
+
return "";
|
|
66
|
+
}
|
|
67
|
+
if (this.da1Response === null)
|
|
68
|
+
return match;
|
|
69
|
+
responses.push(this.da1Response);
|
|
70
|
+
return "";
|
|
71
|
+
});
|
|
72
|
+
return { passthrough, responses };
|
|
73
|
+
};
|
|
74
|
+
// Scan xterm's input (its query responses) for DA1/DA2 and cache the first
|
|
75
|
+
// seen of each. Non-destructive: it only reads. Called on every input frame,
|
|
76
|
+
// so the scan is a cheap regex against a short string (a DA response is under
|
|
77
|
+
// 30 bytes and arrives alone in its own input message — xterm emits query
|
|
78
|
+
// responses as separate onData events from keystrokes).
|
|
79
|
+
captureResponse = (data) => {
|
|
80
|
+
if (this.da1Response === null) {
|
|
81
|
+
const da1 = data.match(DA1_RESPONSE);
|
|
82
|
+
if (da1)
|
|
83
|
+
this.da1Response = da1[0];
|
|
84
|
+
}
|
|
85
|
+
if (this.da2Response === null) {
|
|
86
|
+
const da2 = data.match(DA2_RESPONSE);
|
|
87
|
+
if (da2)
|
|
88
|
+
this.da2Response = da2[0];
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
// Test-only: reset the cache between cases so the process-global singleton
|
|
92
|
+
// doesn't leak state across tests.
|
|
93
|
+
reset = () => {
|
|
94
|
+
this.da1Response = null;
|
|
95
|
+
this.da2Response = null;
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
const terminalQueryResponder = new TerminalQueryResponder();
|
|
99
|
+
export { TerminalQueryResponder, terminalQueryResponder };
|
|
100
|
+
//# sourceMappingURL=terminal-query-responder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminal-query-responder.js","sourceRoot":"","sources":["../../src/utils/terminal-query-responder.ts"],"names":[],"mappings":"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"}
|