@monotykamary/localterm-server 2.30.0 → 2.32.0
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/capture-renderer.d.ts +21 -0
- package/dist/capture-renderer.d.ts.map +1 -0
- package/dist/capture-renderer.js +160 -0
- package/dist/capture-renderer.js.map +1 -0
- package/dist/cdp/cdp-client.d.ts +58 -0
- package/dist/cdp/cdp-client.d.ts.map +1 -1
- package/dist/cdp/cdp-client.js +119 -3
- package/dist/cdp/cdp-client.js.map +1 -1
- package/dist/constants.d.ts +19 -0
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +84 -0
- package/dist/constants.js.map +1 -1
- package/dist/daemon-config-store.d.ts.map +1 -1
- package/dist/daemon-config-store.js +1 -5
- package/dist/daemon-config-store.js.map +1 -1
- package/dist/index.d.ts +4 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +290 -6
- package/dist/index.js.map +1 -1
- package/dist/protocol.d.ts +3 -3
- package/dist/protocol.d.ts.map +1 -1
- package/dist/protocol.js +2 -2
- package/dist/protocol.js.map +1 -1
- package/dist/schemas.d.ts +139 -0
- package/dist/schemas.d.ts.map +1 -1
- package/dist/schemas.js +213 -1
- package/dist/schemas.js.map +1 -1
- package/dist/session-automation.d.ts +53 -0
- package/dist/session-automation.d.ts.map +1 -0
- package/dist/session-automation.js +230 -0
- package/dist/session-automation.js.map +1 -0
- package/dist/session-manager.d.ts +45 -0
- package/dist/session-manager.d.ts.map +1 -1
- package/dist/session-manager.js +352 -2
- package/dist/session-manager.js.map +1 -1
- package/dist/session.d.ts +2 -0
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +19 -0
- package/dist/session.js.map +1 -1
- package/dist/types.d.ts +10 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/named-keys.d.ts +4 -0
- package/dist/utils/named-keys.d.ts.map +1 -0
- package/dist/utils/named-keys.js +82 -0
- package/dist/utils/named-keys.js.map +1 -0
- package/dist/utils/sgr-mouse.d.ts +13 -0
- package/dist/utils/sgr-mouse.d.ts.map +1 -0
- package/dist/utils/sgr-mouse.js +40 -0
- package/dist/utils/sgr-mouse.js.map +1 -0
- package/dist/utils/terminal-mode-state.d.ts +1 -0
- package/dist/utils/terminal-mode-state.d.ts.map +1 -1
- package/dist/utils/terminal-mode-state.js +13 -0
- package/dist/utils/terminal-mode-state.js.map +1 -1
- package/package.json +2 -1
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
// CDP-backed terminal-use parity: capture-pane --png and session mouse, built
|
|
2
|
+
// on the insight that the daemon's existing CDP socket (the one `localterm
|
|
3
|
+
// start` opened for background-tab automation) plus the tmux-parity surface
|
|
4
|
+
// compose without new deps. The browser (already a hard dep for the viewer) is
|
|
5
|
+
// the rasterizer; xterm.js (already speaking SGR mouse natively) is the mouse
|
|
6
|
+
// encoder. The tmux-parity capture renderer is the render-landed source of
|
|
7
|
+
// truth and the no-browser fallback for text capture.
|
|
8
|
+
//
|
|
9
|
+
// Reuse strategy: prefer a live viewer tab for the session (zero spawn latency,
|
|
10
|
+
// render already current) before opening an ephemeral background tab. A pinned
|
|
11
|
+
// session (the REST default) survives between calls with no tab burning a slot.
|
|
12
|
+
import { CDP_MOUSE_TIMEOUT_MS, CDP_RENDER_LANDED_POLL_INTERVAL_MS, CDP_RENDER_LANDED_SETTLE_MS, CDP_SCREENSHOT_TIMEOUT_MS, LOCALTERM_MOUSE_CELLS_PROPERTY, LOCALTERM_PANE_TEXT_PROPERTY, } from "./constants.js";
|
|
13
|
+
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
14
|
+
// Find an existing viewer tab for `id` (a page whose URL carries `?sid=<id>`),
|
|
15
|
+
// or open an ephemeral background tab and attach it. Returns null when no
|
|
16
|
+
// browser is reachable (caller falls back to the headless SGR path for mouse,
|
|
17
|
+
// or reports no_browser for screenshot).
|
|
18
|
+
const resolveTab = async (deps, id) => {
|
|
19
|
+
const { cdpClient } = deps;
|
|
20
|
+
if (!cdpClient)
|
|
21
|
+
return null;
|
|
22
|
+
const sidParam = `sid=${encodeURIComponent(id)}`;
|
|
23
|
+
const existing = await cdpClient.findTargetByUrl((url) => url.includes(sidParam));
|
|
24
|
+
const targetId = existing ?? (await cdpClient.openBackgroundTab(deps.buildTabUrl(id)));
|
|
25
|
+
if (!targetId)
|
|
26
|
+
return null;
|
|
27
|
+
const cdpSessionId = await cdpClient.attachSession(targetId);
|
|
28
|
+
if (!cdpSessionId) {
|
|
29
|
+
if (!existing)
|
|
30
|
+
await cdpClient.closeTab(targetId);
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
return {
|
|
34
|
+
targetId,
|
|
35
|
+
cdpSessionId,
|
|
36
|
+
close: existing ? async () => undefined : async () => cdpClient.closeTab(targetId),
|
|
37
|
+
};
|
|
38
|
+
};
|
|
39
|
+
// Wait for the tab's xterm to render the session's current pane text. Robust
|
|
40
|
+
// against xterm's async write: polls the tab's `__localtermPaneText` and
|
|
41
|
+
// compares to the server-side `capturePane` (flushed, the source of truth) —
|
|
42
|
+
// when they're equal the grid is fully parsed; a short settle covers the
|
|
43
|
+
// canvas paint. Returns true on land, false on timeout (caller screenshots
|
|
44
|
+
// anyway, best effort).
|
|
45
|
+
const waitForRenderLanded = async (cdpClient, cdpSessionId, registry, id, timeoutMs) => {
|
|
46
|
+
const deadline = Date.now() + timeoutMs;
|
|
47
|
+
const expr = `window[${JSON.stringify(LOCALTERM_PANE_TEXT_PROPERTY)}]?.() ?? null`;
|
|
48
|
+
while (Date.now() < deadline) {
|
|
49
|
+
const expected = await registry.capturePane(id).catch(() => null);
|
|
50
|
+
const tabText = await cdpClient.evaluateInSession(cdpSessionId, expr);
|
|
51
|
+
if (expected !== null && tabText === expected) {
|
|
52
|
+
await sleep(CDP_RENDER_LANDED_SETTLE_MS);
|
|
53
|
+
return true;
|
|
54
|
+
}
|
|
55
|
+
await sleep(CDP_RENDER_LANDED_POLL_INTERVAL_MS);
|
|
56
|
+
}
|
|
57
|
+
return false;
|
|
58
|
+
};
|
|
59
|
+
// `capture-pane --png`: render the session's current screen to a PNG via the
|
|
60
|
+
// browser. Reuses an existing viewer tab or opens an ephemeral one; clips to
|
|
61
|
+
// the `.xterm` element so the PNG is just the terminal. Returns the PNG bytes,
|
|
62
|
+
// or null when no browser is reachable (the caller reports `no_browser`; text
|
|
63
|
+
// `capture-pane` still works headlessly via the capture renderer).
|
|
64
|
+
export const capturePanePng = async (deps, registry, id) => {
|
|
65
|
+
const { cdpClient } = deps;
|
|
66
|
+
if (!cdpClient)
|
|
67
|
+
return null;
|
|
68
|
+
const tab = await resolveTab(deps, id);
|
|
69
|
+
if (!tab)
|
|
70
|
+
return null;
|
|
71
|
+
try {
|
|
72
|
+
await waitForRenderLanded(cdpClient, tab.cdpSessionId, registry, id, CDP_SCREENSHOT_TIMEOUT_MS);
|
|
73
|
+
const clipExpr = `(() => {
|
|
74
|
+
const el = document.querySelector(".xterm");
|
|
75
|
+
if (!el) return null;
|
|
76
|
+
const r = el.getBoundingClientRect();
|
|
77
|
+
return JSON.stringify({ x: r.left, y: r.top, width: r.width, height: r.height });
|
|
78
|
+
})()`;
|
|
79
|
+
const clipRaw = await cdpClient.evaluateInSession(tab.cdpSessionId, clipExpr);
|
|
80
|
+
const clip = typeof clipRaw === "string"
|
|
81
|
+
? JSON.parse(clipRaw)
|
|
82
|
+
: undefined;
|
|
83
|
+
return cdpClient.captureScreenshotInSession(tab.cdpSessionId, clip);
|
|
84
|
+
}
|
|
85
|
+
finally {
|
|
86
|
+
await tab.close();
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
// `session mouse`: dispatch a mouse gesture. Primary path is CDP — drive the
|
|
90
|
+
// browser's xterm.js, which generates the SGR sequence itself, so drag/scroll/
|
|
91
|
+
// click-count semantics are exactly right with no encoder. Falls back to
|
|
92
|
+
// direct SGR-1006 bytes written to the PTY when no browser is reachable (the
|
|
93
|
+
// true-headless case), gated on the session's mouse mode so the bytes aren't
|
|
94
|
+
// fed to an app that didn't enable mouse.
|
|
95
|
+
export const sendMouse = async (deps, registry, id, action,
|
|
96
|
+
// Headless SGR fallback (injected from the route to avoid a circular import
|
|
97
|
+
// of the encoder here): writes the encoded sequence to the session PTY.
|
|
98
|
+
sgrFallback) => {
|
|
99
|
+
const { cdpClient } = deps;
|
|
100
|
+
// Resolve the target cell for any coord-bearing action. `--on-text` reads the
|
|
101
|
+
// server-side capture grid (no tab needed) so the fallback path can also
|
|
102
|
+
// locate a label.
|
|
103
|
+
let target = null;
|
|
104
|
+
let labelText = null;
|
|
105
|
+
if (action.action === "click" && "onText" in action) {
|
|
106
|
+
const found = await registry.findTextInViewport(id, action.onText);
|
|
107
|
+
if (!found) {
|
|
108
|
+
return {
|
|
109
|
+
ok: false,
|
|
110
|
+
mode: "sgr",
|
|
111
|
+
col: null,
|
|
112
|
+
row: null,
|
|
113
|
+
text: action.onText,
|
|
114
|
+
reason: "text_not_found",
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
target = found;
|
|
118
|
+
labelText = action.onText;
|
|
119
|
+
}
|
|
120
|
+
else if ("col" in action && "row" in action) {
|
|
121
|
+
target = { col: action.col, row: action.row };
|
|
122
|
+
}
|
|
123
|
+
// Try the CDP path first: dispatch through the tab's xterm.js.
|
|
124
|
+
if (cdpClient) {
|
|
125
|
+
const tab = await resolveTab(deps, id);
|
|
126
|
+
if (tab) {
|
|
127
|
+
try {
|
|
128
|
+
await waitForRenderLanded(cdpClient, tab.cdpSessionId, registry, id, CDP_MOUSE_TIMEOUT_MS);
|
|
129
|
+
const cellsExpr = `window[${JSON.stringify(LOCALTERM_MOUSE_CELLS_PROPERTY)}]?.() ?? null`;
|
|
130
|
+
const cellsRaw = await cdpClient.evaluateInSession(tab.cdpSessionId, cellsExpr);
|
|
131
|
+
const cells = typeof cellsRaw === "string"
|
|
132
|
+
? JSON.parse(cellsRaw)
|
|
133
|
+
: null;
|
|
134
|
+
if (!cells) {
|
|
135
|
+
return {
|
|
136
|
+
ok: false,
|
|
137
|
+
mode: "cdp",
|
|
138
|
+
col: null,
|
|
139
|
+
row: null,
|
|
140
|
+
text: labelText,
|
|
141
|
+
reason: "no_xterm",
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
// Coords for scroll: default to the viewport center so the wheel lands
|
|
145
|
+
// on the terminal even when the caller didn't specify a cell.
|
|
146
|
+
const t = target ?? { col: Math.floor(cells.cols / 2), row: Math.floor(cells.rows / 2) };
|
|
147
|
+
if (t.col < 0 || t.col >= cells.cols || t.row < 0 || t.row >= cells.rows) {
|
|
148
|
+
return {
|
|
149
|
+
ok: false,
|
|
150
|
+
mode: "cdp",
|
|
151
|
+
col: t.col,
|
|
152
|
+
row: t.row,
|
|
153
|
+
text: labelText,
|
|
154
|
+
reason: "out_of_bounds",
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
const px = (col, row) => ({
|
|
158
|
+
x: cells.left + (col + 0.5) * cells.cellWidth,
|
|
159
|
+
y: cells.top + (row + 0.5) * cells.cellHeight,
|
|
160
|
+
});
|
|
161
|
+
const buttonName = action.action === "click" || action.action === "drag" ? action.button : "left";
|
|
162
|
+
const events = [];
|
|
163
|
+
if (action.action === "click") {
|
|
164
|
+
const at = px(t.col, t.row);
|
|
165
|
+
for (let i = 0; i < action.clicks; i++) {
|
|
166
|
+
events.push({ type: "mousePressed", ...at, button: buttonName, clickCount: 1 });
|
|
167
|
+
}
|
|
168
|
+
events.push({
|
|
169
|
+
type: "mouseReleased",
|
|
170
|
+
...at,
|
|
171
|
+
button: buttonName,
|
|
172
|
+
clickCount: action.clicks,
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
else if (action.action === "drag") {
|
|
176
|
+
const from = px(action.fromCol, action.fromRow);
|
|
177
|
+
const to = px(action.toCol, action.toRow);
|
|
178
|
+
events.push({ type: "mousePressed", ...from, button: buttonName, clickCount: 1 });
|
|
179
|
+
events.push({ type: "mouseMoved", ...to, button: buttonName, buttons: 1 });
|
|
180
|
+
events.push({ type: "mouseReleased", ...to, button: buttonName, clickCount: 1 });
|
|
181
|
+
}
|
|
182
|
+
else if (action.action === "move") {
|
|
183
|
+
const at = px(t.col, t.row);
|
|
184
|
+
events.push({ type: "mouseMoved", ...at, button: "none" });
|
|
185
|
+
}
|
|
186
|
+
else {
|
|
187
|
+
const at = px(t.col, t.row);
|
|
188
|
+
const delta = action.direction === "up" ? -action.amount : action.amount;
|
|
189
|
+
events.push({
|
|
190
|
+
type: "mouseWheel",
|
|
191
|
+
...at,
|
|
192
|
+
deltaX: 0,
|
|
193
|
+
deltaY: delta * Math.max(cells.cellHeight, 1),
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
await cdpClient.dispatchMouseEventsInSession(tab.cdpSessionId, events);
|
|
197
|
+
// CDP dispatch via xterm.js always "succeeds" from our view — whether the
|
|
198
|
+
// app responds depends on its mouse mode, which xterm gates internally.
|
|
199
|
+
return { ok: true, mode: "cdp", col: t.col, row: t.row, text: labelText, reason: null };
|
|
200
|
+
}
|
|
201
|
+
finally {
|
|
202
|
+
await tab.close();
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
// Headless fallback: write SGR-1006 bytes straight to the PTY. Gated on the
|
|
207
|
+
// session's mouse mode so the bytes aren't fed to an app that can't read them.
|
|
208
|
+
if (!registry.mouseEnabledFor(id)) {
|
|
209
|
+
return {
|
|
210
|
+
ok: false,
|
|
211
|
+
mode: "sgr",
|
|
212
|
+
col: target?.col ?? null,
|
|
213
|
+
row: target?.row ?? null,
|
|
214
|
+
text: labelText,
|
|
215
|
+
reason: "mouse_disabled",
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
// Scroll needs a cell to anchor the SGR event; default to viewport center.
|
|
219
|
+
const fallbackTarget = target ?? { col: 0, row: 0 };
|
|
220
|
+
const written = sgrFallback(id, action, fallbackTarget.col, fallbackTarget.row);
|
|
221
|
+
return {
|
|
222
|
+
ok: written,
|
|
223
|
+
mode: "sgr",
|
|
224
|
+
col: fallbackTarget.col,
|
|
225
|
+
row: fallbackTarget.row,
|
|
226
|
+
text: labelText,
|
|
227
|
+
reason: written ? null : "not_found",
|
|
228
|
+
};
|
|
229
|
+
};
|
|
230
|
+
//# sourceMappingURL=session-automation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-automation.js","sourceRoot":"","sources":["../src/session-automation.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { CaptureRenderer } from "./capture-renderer.js";
|
|
1
2
|
import { GitDiffWatcher } from "./git-diff-watcher.js";
|
|
2
3
|
import { GitMetadataCoordinator } from "./git-metadata-coordinator.js";
|
|
3
4
|
import { Session } from "./session.js";
|
|
@@ -8,6 +9,26 @@ export interface AutomationContext {
|
|
|
8
9
|
automationId: string;
|
|
9
10
|
runId: string;
|
|
10
11
|
}
|
|
12
|
+
export interface ExecResult {
|
|
13
|
+
exitCode: number | null;
|
|
14
|
+
output: string;
|
|
15
|
+
timedOut: boolean;
|
|
16
|
+
truncated: boolean;
|
|
17
|
+
durationMs: number;
|
|
18
|
+
}
|
|
19
|
+
export interface ExecOptions {
|
|
20
|
+
timeoutMs?: number;
|
|
21
|
+
outputLimitBytes?: number;
|
|
22
|
+
}
|
|
23
|
+
export interface WaitPredicate {
|
|
24
|
+
kind: "text" | "regex" | "idle";
|
|
25
|
+
test: (text: string) => boolean;
|
|
26
|
+
}
|
|
27
|
+
export interface WaitResult {
|
|
28
|
+
matched: boolean;
|
|
29
|
+
elapsedMs: number;
|
|
30
|
+
snapshot: string;
|
|
31
|
+
}
|
|
11
32
|
export type SessionActivityState = "running" | "alive-quiet" | "ready";
|
|
12
33
|
interface ManagedClient {
|
|
13
34
|
ws: ClientSocket;
|
|
@@ -35,6 +56,8 @@ export interface ManagedSession {
|
|
|
35
56
|
hasForeground: boolean;
|
|
36
57
|
graceTimer: NodeJS.Timeout | null;
|
|
37
58
|
parkedAt: number | null;
|
|
59
|
+
pinned: boolean;
|
|
60
|
+
captureRenderer: CaptureRenderer | undefined;
|
|
38
61
|
ptySizeCols: number | null;
|
|
39
62
|
ptySizeRows: number | null;
|
|
40
63
|
ptySizeWasMultiViewer: boolean;
|
|
@@ -83,6 +106,27 @@ export declare class SessionManager {
|
|
|
83
106
|
detach(ws: ClientSocket): void;
|
|
84
107
|
kill(id: string): boolean;
|
|
85
108
|
disposeAll(): void;
|
|
109
|
+
spawnDetached(input: SpawnPtyInput, pinned: boolean): string | null;
|
|
110
|
+
writeInputById(id: string, data: string): boolean;
|
|
111
|
+
resizeById(id: string, cols: number, rows: number): boolean;
|
|
112
|
+
capturePane(id: string, lines?: number): Promise<string | null>;
|
|
113
|
+
setPinned(id: string, pinned: boolean): boolean;
|
|
114
|
+
setTitleById(id: string, title: string): boolean;
|
|
115
|
+
pressKeysById(id: string, input: string): boolean;
|
|
116
|
+
waitFor(id: string, predicate: WaitPredicate, timeoutMs: number, idleMs?: number): Promise<WaitResult | null>;
|
|
117
|
+
findTextInViewport(id: string, needle: string): Promise<{
|
|
118
|
+
col: number;
|
|
119
|
+
row: number;
|
|
120
|
+
} | null>;
|
|
121
|
+
mouseEnabledFor(id: string): boolean;
|
|
122
|
+
sessionSizeFor(id: string): {
|
|
123
|
+
cols: number;
|
|
124
|
+
rows: number;
|
|
125
|
+
};
|
|
126
|
+
private ensureCaptureRenderer;
|
|
127
|
+
execInSession(id: string, command: string, options?: ExecOptions): Promise<ExecResult | null>;
|
|
128
|
+
private buildExecResult;
|
|
129
|
+
private clampInt;
|
|
86
130
|
private sendScrollback;
|
|
87
131
|
private sendOutputBytes;
|
|
88
132
|
private broadcastBytes;
|
|
@@ -118,6 +162,7 @@ export interface SessionListItem {
|
|
|
118
162
|
lastOutputAt: number;
|
|
119
163
|
clients: number;
|
|
120
164
|
state: SessionActivityState;
|
|
165
|
+
pinned: boolean;
|
|
121
166
|
}
|
|
122
167
|
export {};
|
|
123
168
|
//# sourceMappingURL=session-manager.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-manager.d.ts","sourceRoot":"","sources":["../src/session-manager.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"session-manager.d.ts","sourceRoot":"","sources":["../src/session-manager.ts"],"names":[],"mappings":"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"}
|