@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.
Files changed (54) hide show
  1. package/dist/capture-renderer.d.ts +21 -0
  2. package/dist/capture-renderer.d.ts.map +1 -0
  3. package/dist/capture-renderer.js +160 -0
  4. package/dist/capture-renderer.js.map +1 -0
  5. package/dist/cdp/cdp-client.d.ts +58 -0
  6. package/dist/cdp/cdp-client.d.ts.map +1 -1
  7. package/dist/cdp/cdp-client.js +119 -3
  8. package/dist/cdp/cdp-client.js.map +1 -1
  9. package/dist/constants.d.ts +19 -0
  10. package/dist/constants.d.ts.map +1 -1
  11. package/dist/constants.js +84 -0
  12. package/dist/constants.js.map +1 -1
  13. package/dist/daemon-config-store.d.ts.map +1 -1
  14. package/dist/daemon-config-store.js +1 -5
  15. package/dist/daemon-config-store.js.map +1 -1
  16. package/dist/index.d.ts +4 -3
  17. package/dist/index.d.ts.map +1 -1
  18. package/dist/index.js +290 -6
  19. package/dist/index.js.map +1 -1
  20. package/dist/protocol.d.ts +3 -3
  21. package/dist/protocol.d.ts.map +1 -1
  22. package/dist/protocol.js +2 -2
  23. package/dist/protocol.js.map +1 -1
  24. package/dist/schemas.d.ts +139 -0
  25. package/dist/schemas.d.ts.map +1 -1
  26. package/dist/schemas.js +213 -1
  27. package/dist/schemas.js.map +1 -1
  28. package/dist/session-automation.d.ts +53 -0
  29. package/dist/session-automation.d.ts.map +1 -0
  30. package/dist/session-automation.js +230 -0
  31. package/dist/session-automation.js.map +1 -0
  32. package/dist/session-manager.d.ts +45 -0
  33. package/dist/session-manager.d.ts.map +1 -1
  34. package/dist/session-manager.js +352 -2
  35. package/dist/session-manager.js.map +1 -1
  36. package/dist/session.d.ts +2 -0
  37. package/dist/session.d.ts.map +1 -1
  38. package/dist/session.js +19 -0
  39. package/dist/session.js.map +1 -1
  40. package/dist/types.d.ts +10 -1
  41. package/dist/types.d.ts.map +1 -1
  42. package/dist/utils/named-keys.d.ts +4 -0
  43. package/dist/utils/named-keys.d.ts.map +1 -0
  44. package/dist/utils/named-keys.js +82 -0
  45. package/dist/utils/named-keys.js.map +1 -0
  46. package/dist/utils/sgr-mouse.d.ts +13 -0
  47. package/dist/utils/sgr-mouse.d.ts.map +1 -0
  48. package/dist/utils/sgr-mouse.js +40 -0
  49. package/dist/utils/sgr-mouse.js.map +1 -0
  50. package/dist/utils/terminal-mode-state.d.ts +1 -0
  51. package/dist/utils/terminal-mode-state.d.ts.map +1 -1
  52. package/dist/utils/terminal-mode-state.js +13 -0
  53. package/dist/utils/terminal-mode-state.js.map +1 -1
  54. 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":"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"}
1
+ {"version":3,"file":"session-manager.d.ts","sourceRoot":"","sources":["../src/session-manager.ts"],"names":[],"mappings":"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"}