@monotykamary/localterm-server 2.66.8 → 2.66.9
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/agent-git-status.d.ts +3 -0
- package/dist/agent-git-status.d.ts.map +1 -0
- package/dist/agent-git-status.js +46 -0
- package/dist/agent-git-status.js.map +1 -0
- package/dist/agent-log-utils.d.ts +18 -0
- package/dist/agent-log-utils.d.ts.map +1 -0
- package/dist/agent-log-utils.js +123 -0
- package/dist/agent-log-utils.js.map +1 -0
- package/dist/agent-models.d.ts +4 -0
- package/dist/agent-models.d.ts.map +1 -0
- package/dist/agent-models.js +100 -0
- package/dist/agent-models.js.map +1 -0
- package/dist/agent-runner.d.ts +3 -5
- package/dist/agent-runner.d.ts.map +1 -1
- package/dist/agent-runner.js +8 -522
- package/dist/agent-runner.js.map +1 -1
- package/dist/agent-session-reader.d.ts +3 -0
- package/dist/agent-session-reader.d.ts.map +1 -0
- package/dist/agent-session-reader.js +113 -0
- package/dist/agent-session-reader.js.map +1 -0
- package/dist/build-pty-environment.d.ts +8 -0
- package/dist/build-pty-environment.d.ts.map +1 -0
- package/dist/build-pty-environment.js +44 -0
- package/dist/build-pty-environment.js.map +1 -0
- package/dist/caffeinate-automatic-detector.d.ts +57 -0
- package/dist/caffeinate-automatic-detector.d.ts.map +1 -0
- package/dist/caffeinate-automatic-detector.js +275 -0
- package/dist/caffeinate-automatic-detector.js.map +1 -0
- package/dist/caffeinate-battery-guard.d.ts +35 -0
- package/dist/caffeinate-battery-guard.d.ts.map +1 -0
- package/dist/caffeinate-battery-guard.js +190 -0
- package/dist/caffeinate-battery-guard.js.map +1 -0
- package/dist/caffeinate-manager.d.ts +5 -31
- package/dist/caffeinate-manager.d.ts.map +1 -1
- package/dist/caffeinate-manager.js +55 -400
- package/dist/caffeinate-manager.js.map +1 -1
- package/dist/cdp/cdp-client.d.ts +4 -70
- package/dist/cdp/cdp-client.d.ts.map +1 -1
- package/dist/cdp/cdp-client.js +58 -418
- package/dist/cdp/cdp-client.js.map +1 -1
- package/dist/cdp/cdp-connection.d.ts +72 -0
- package/dist/cdp/cdp-connection.d.ts.map +1 -0
- package/dist/cdp/cdp-connection.js +272 -0
- package/dist/cdp/cdp-connection.js.map +1 -0
- package/dist/cdp/constants.d.ts +6 -0
- package/dist/cdp/constants.d.ts.map +1 -0
- package/dist/cdp/constants.js +9 -0
- package/dist/cdp/constants.js.map +1 -0
- package/dist/cdp/target-registry.d.ts +41 -0
- package/dist/cdp/target-registry.d.ts.map +1 -0
- package/dist/cdp/target-registry.js +118 -0
- package/dist/cdp/target-registry.js.map +1 -0
- package/dist/constants.d.ts +2 -0
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +2 -0
- package/dist/constants.js.map +1 -1
- package/dist/git-branch-metadata.d.ts +11 -0
- package/dist/git-branch-metadata.d.ts.map +1 -0
- package/dist/git-branch-metadata.js +85 -0
- package/dist/git-branch-metadata.js.map +1 -0
- package/dist/git-diff-cache.d.ts +13 -0
- package/dist/git-diff-cache.d.ts.map +1 -0
- package/dist/git-diff-cache.js +32 -0
- package/dist/git-diff-cache.js.map +1 -0
- package/dist/git-diff-parser.d.ts +15 -0
- package/dist/git-diff-parser.d.ts.map +1 -0
- package/dist/git-diff-parser.js +196 -0
- package/dist/git-diff-parser.js.map +1 -0
- package/dist/git-diff-service.d.ts +10 -0
- package/dist/git-diff-service.d.ts.map +1 -0
- package/dist/git-diff-service.js +395 -0
- package/dist/git-diff-service.js.map +1 -0
- package/dist/git-diff.d.ts +8 -41
- package/dist/git-diff.d.ts.map +1 -1
- package/dist/git-diff.js +5 -944
- package/dist/git-diff.js.map +1 -1
- package/dist/github-pr.d.ts +32 -0
- package/dist/github-pr.d.ts.map +1 -0
- package/dist/github-pr.js +266 -0
- package/dist/github-pr.js.map +1 -0
- package/dist/pi-binary-resolver.d.ts +6 -0
- package/dist/pi-binary-resolver.d.ts.map +1 -0
- package/dist/pi-binary-resolver.js +70 -0
- package/dist/pi-binary-resolver.js.map +1 -0
- package/dist/pi-rpc-client.d.ts +14 -0
- package/dist/pi-rpc-client.d.ts.map +1 -0
- package/dist/pi-rpc-client.js +87 -0
- package/dist/pi-rpc-client.js.map +1 -0
- package/dist/session-client-hub.d.ts +57 -0
- package/dist/session-client-hub.d.ts.map +1 -0
- package/dist/session-client-hub.js +435 -0
- package/dist/session-client-hub.js.map +1 -0
- package/dist/session-command-executor.d.ts +14 -0
- package/dist/session-command-executor.d.ts.map +1 -0
- package/dist/session-command-executor.js +207 -0
- package/dist/session-command-executor.js.map +1 -0
- package/dist/session-git-event-bridge.d.ts +16 -0
- package/dist/session-git-event-bridge.d.ts.map +1 -0
- package/dist/session-git-event-bridge.js +56 -0
- package/dist/session-git-event-bridge.js.map +1 -0
- package/dist/session-lifecycle-policy.d.ts +15 -0
- package/dist/session-lifecycle-policy.d.ts.map +1 -0
- package/dist/session-lifecycle-policy.js +105 -0
- package/dist/session-lifecycle-policy.js.map +1 -0
- package/dist/session-manager.d.ts +11 -42
- package/dist/session-manager.d.ts.map +1 -1
- package/dist/session-manager.js +72 -987
- package/dist/session-manager.js.map +1 -1
- package/dist/session-output-coordinator.d.ts +21 -0
- package/dist/session-output-coordinator.d.ts.map +1 -0
- package/dist/session-output-coordinator.js +134 -0
- package/dist/session-output-coordinator.js.map +1 -0
- package/dist/session-output-transport.d.ts +22 -0
- package/dist/session-output-transport.d.ts.map +1 -0
- package/dist/session-output-transport.js +160 -0
- package/dist/session-output-transport.js.map +1 -0
- package/dist/session.d.ts +0 -4
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +11 -258
- package/dist/session.js.map +1 -1
- package/dist/shell-hook-builder.d.ts +16 -0
- package/dist/shell-hook-builder.d.ts.map +1 -0
- package/dist/shell-hook-builder.js +230 -0
- package/dist/shell-hook-builder.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
import { randomBytes } from "node:crypto";
|
|
2
|
+
import { CaptureRenderer } from "./capture-renderer.js";
|
|
3
|
+
import { EXEC_DEFAULT_OUTPUT_LIMIT_BYTES, EXEC_DEFAULT_TIMEOUT_MS, EXEC_EPHEMERAL_SCROLLBACK, EXEC_MAX_OUTPUT_LIMIT_BYTES, EXEC_MAX_TIMEOUT_MS, EXEC_RAW_ACCUMULATE_CAP_BYTES, EXEC_TIMEOUT_INTERRUPT_GRACE_MS, CAPTURE_PANE_MAX_LINES, WAIT_IDLE_POLL_INTERVAL_MS, } from "./constants.js";
|
|
4
|
+
export class SessionCommandExecutor {
|
|
5
|
+
async capturePane(managed, lines) {
|
|
6
|
+
const capped = lines && lines > 0 ? Math.min(lines, CAPTURE_PANE_MAX_LINES) : undefined;
|
|
7
|
+
const renderer = await this.ensureCaptureRenderer(managed);
|
|
8
|
+
return renderer.capture(capped);
|
|
9
|
+
}
|
|
10
|
+
async waitFor(managed, predicate, timeoutMs, idleMs) {
|
|
11
|
+
const session = managed.session;
|
|
12
|
+
const startedAt = Date.now();
|
|
13
|
+
let resolved = false;
|
|
14
|
+
let lastChangeAt = Date.now();
|
|
15
|
+
let timeoutHandle = null;
|
|
16
|
+
let idleTimer = null;
|
|
17
|
+
return new Promise((resolve) => {
|
|
18
|
+
const finalize = async (matched) => {
|
|
19
|
+
if (resolved)
|
|
20
|
+
return;
|
|
21
|
+
resolved = true;
|
|
22
|
+
if (timeoutHandle)
|
|
23
|
+
clearTimeout(timeoutHandle);
|
|
24
|
+
if (idleTimer)
|
|
25
|
+
clearInterval(idleTimer);
|
|
26
|
+
session.off("output", onOutput);
|
|
27
|
+
session.off("exit", onExit);
|
|
28
|
+
const snapshot = await this.capturePane(managed).catch(() => "");
|
|
29
|
+
resolve({
|
|
30
|
+
matched,
|
|
31
|
+
elapsedMs: Date.now() - startedAt,
|
|
32
|
+
snapshot,
|
|
33
|
+
});
|
|
34
|
+
};
|
|
35
|
+
const testPredicate = async () => {
|
|
36
|
+
const renderer = await this.ensureCaptureRenderer(managed);
|
|
37
|
+
await renderer.flush();
|
|
38
|
+
return predicate.test(renderer.capture());
|
|
39
|
+
};
|
|
40
|
+
const onOutput = () => {
|
|
41
|
+
lastChangeAt = Date.now();
|
|
42
|
+
void testPredicate().then((hit) => {
|
|
43
|
+
if (hit && !resolved)
|
|
44
|
+
finalize(true);
|
|
45
|
+
});
|
|
46
|
+
};
|
|
47
|
+
const onExit = () => {
|
|
48
|
+
void finalize(false);
|
|
49
|
+
};
|
|
50
|
+
// Idle mode: resolve once no output has arrived for `idleMs`. The interval
|
|
51
|
+
// checks recency without forcing a renderer read each tick (the output
|
|
52
|
+
// listener already bumps lastChangeAt).
|
|
53
|
+
if (predicate.kind === "idle") {
|
|
54
|
+
idleTimer = setInterval(() => {
|
|
55
|
+
if (!resolved && Date.now() - lastChangeAt >= (idleMs ?? 0))
|
|
56
|
+
finalize(true);
|
|
57
|
+
}, WAIT_IDLE_POLL_INTERVAL_MS);
|
|
58
|
+
idleTimer.unref?.();
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
// Text/regex: test once up front in case the pane already matches, then
|
|
62
|
+
// react to output events.
|
|
63
|
+
void testPredicate().then((hit) => {
|
|
64
|
+
if (hit && !resolved)
|
|
65
|
+
finalize(true);
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
session.on("output", onOutput);
|
|
69
|
+
session.on("exit", onExit);
|
|
70
|
+
timeoutHandle = setTimeout(() => finalize(false), timeoutMs);
|
|
71
|
+
timeoutHandle.unref?.();
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
async findTextInViewport(managed, needle) {
|
|
75
|
+
const renderer = await this.ensureCaptureRenderer(managed);
|
|
76
|
+
await renderer.flush();
|
|
77
|
+
return renderer.findTextInViewport(needle);
|
|
78
|
+
}
|
|
79
|
+
// Lazily create (and prime) a session's capture renderer. Fed the scrollback
|
|
80
|
+
// snapshot at creation so it catches up on recent history before the renderer
|
|
81
|
+
// existed, then kept alive and fed live output by onSessionOutput. Awaits the
|
|
82
|
+
// snapshot's async parse so the first capture-pane read lands on a populated
|
|
83
|
+
// grid instead of a blank one (xterm parses `write` on a timer).
|
|
84
|
+
async ensureCaptureRenderer(managed) {
|
|
85
|
+
if (managed.captureRenderer)
|
|
86
|
+
return managed.captureRenderer;
|
|
87
|
+
const renderer = new CaptureRenderer(managed.session.cols, managed.session.rows);
|
|
88
|
+
const snapshot = managed.session.snapshotScrollback();
|
|
89
|
+
if (snapshot)
|
|
90
|
+
renderer.write(snapshot);
|
|
91
|
+
await renderer.flush();
|
|
92
|
+
managed.captureRenderer = renderer;
|
|
93
|
+
return renderer;
|
|
94
|
+
}
|
|
95
|
+
async execute(managed, command, options = {}) {
|
|
96
|
+
const session = managed.session;
|
|
97
|
+
const timeoutMs = this.clampInt(options.timeoutMs ?? EXEC_DEFAULT_TIMEOUT_MS, 1, EXEC_MAX_TIMEOUT_MS);
|
|
98
|
+
const outputLimit = this.clampInt(options.outputLimitBytes ?? EXEC_DEFAULT_OUTPUT_LIMIT_BYTES, 1, EXEC_MAX_OUTPUT_LIMIT_BYTES);
|
|
99
|
+
const token = randomBytes(8).toString("hex");
|
|
100
|
+
const startMarker = `__LT_S_${token}__`;
|
|
101
|
+
const endMarkerPrefix = `__LT_E_${token}__`;
|
|
102
|
+
const endPattern = new RegExp(`${endMarkerPrefix} (\\d+)`);
|
|
103
|
+
const cmd = command.trim() || ":";
|
|
104
|
+
const wrapped = `printf '${startMarker}\\n'; ${cmd}; printf '${endMarkerPrefix} %d\\n' "$?"`;
|
|
105
|
+
const startedAt = Date.now();
|
|
106
|
+
let accumulated = "";
|
|
107
|
+
let capped = false;
|
|
108
|
+
let exitCode = null;
|
|
109
|
+
let didTimeout = false;
|
|
110
|
+
let resolved = false;
|
|
111
|
+
let timeoutHandle = null;
|
|
112
|
+
let interruptHandle = null;
|
|
113
|
+
return new Promise((resolve) => {
|
|
114
|
+
const finalize = async (finalExit, finalTimedOut) => {
|
|
115
|
+
if (resolved)
|
|
116
|
+
return;
|
|
117
|
+
resolved = true;
|
|
118
|
+
if (timeoutHandle)
|
|
119
|
+
clearTimeout(timeoutHandle);
|
|
120
|
+
if (interruptHandle)
|
|
121
|
+
clearTimeout(interruptHandle);
|
|
122
|
+
session.off("output", onOutput);
|
|
123
|
+
session.off("exit", onExit);
|
|
124
|
+
resolve(await this.buildExecResult(session.cols, session.rows, accumulated, startMarker, endMarkerPrefix, finalExit, finalTimedOut, outputLimit, startedAt));
|
|
125
|
+
};
|
|
126
|
+
const onOutput = (data) => {
|
|
127
|
+
if (!capped) {
|
|
128
|
+
if (accumulated.length + data.length <= EXEC_RAW_ACCUMULATE_CAP_BYTES) {
|
|
129
|
+
accumulated += data;
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
const room = EXEC_RAW_ACCUMULATE_CAP_BYTES - accumulated.length;
|
|
133
|
+
if (room > 0)
|
|
134
|
+
accumulated += data.slice(0, room);
|
|
135
|
+
capped = true;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
// Once the timeout has fired we've committed to a timed-out result; a
|
|
139
|
+
// marker arriving during the interrupt grace (Ctrl-C kills the command,
|
|
140
|
+
// the trailing `printf END $?` runs with the interrupt exit code) is
|
|
141
|
+
// ignored so the call resolves as timed out, not as a normal completion.
|
|
142
|
+
if (didTimeout)
|
|
143
|
+
return;
|
|
144
|
+
const match = accumulated.match(endPattern);
|
|
145
|
+
if (match) {
|
|
146
|
+
exitCode = Number.parseInt(match[1], 10);
|
|
147
|
+
finalize(exitCode, false);
|
|
148
|
+
}
|
|
149
|
+
};
|
|
150
|
+
const onExit = (code) => {
|
|
151
|
+
exitCode = code;
|
|
152
|
+
finalize(code, false);
|
|
153
|
+
};
|
|
154
|
+
session.on("output", onOutput);
|
|
155
|
+
session.on("exit", onExit);
|
|
156
|
+
timeoutHandle = setTimeout(() => {
|
|
157
|
+
// Commit to a timed-out result: the command didn't finish within
|
|
158
|
+
// timeoutMs. Send Ctrl-C to interrupt it (so the session returns to a
|
|
159
|
+
// prompt for a follow-up call), then resolve after a short grace so any
|
|
160
|
+
// output already in flight is captured into the partial result. A marker
|
|
161
|
+
// arriving during the grace is ignored (see onOutput).
|
|
162
|
+
didTimeout = true;
|
|
163
|
+
session.write("\x03");
|
|
164
|
+
interruptHandle = setTimeout(() => finalize(null, true), EXEC_TIMEOUT_INTERRUPT_GRACE_MS);
|
|
165
|
+
interruptHandle.unref?.();
|
|
166
|
+
}, timeoutMs);
|
|
167
|
+
timeoutHandle.unref?.();
|
|
168
|
+
// A client sending input is live; for a detached session there's no
|
|
169
|
+
// pending handshake, so the bytes reach the PTY directly.
|
|
170
|
+
session.write(`${wrapped}\r`);
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
async buildExecResult(cols, rows, accumulated, startMarker, endMarkerPrefix, exitCode, timedOut, outputLimit, startedAt) {
|
|
174
|
+
// Render the captured raw stream through a fresh headless terminal and slice
|
|
175
|
+
// between the start/end marker rows for clean, ANSI-processed text. A fresh
|
|
176
|
+
// (not the persistent) renderer so this exec's output is isolated and the
|
|
177
|
+
// markers are always near the bottom of the buffer.
|
|
178
|
+
const renderer = new CaptureRenderer(cols, rows, EXEC_EPHEMERAL_SCROLLBACK);
|
|
179
|
+
let output;
|
|
180
|
+
try {
|
|
181
|
+
renderer.write(accumulated);
|
|
182
|
+
await renderer.flush();
|
|
183
|
+
const endRow = exitCode !== null && !timedOut ? renderer.findRow(`${endMarkerPrefix} ${exitCode}`) : -1;
|
|
184
|
+
const startRow = renderer.findRow(startMarker);
|
|
185
|
+
output = renderer.extractBetween(startRow, endRow);
|
|
186
|
+
}
|
|
187
|
+
finally {
|
|
188
|
+
renderer.dispose();
|
|
189
|
+
}
|
|
190
|
+
const textBytes = Buffer.byteLength(output, "utf8");
|
|
191
|
+
const truncated = textBytes > outputLimit;
|
|
192
|
+
if (truncated) {
|
|
193
|
+
output = Buffer.from(output, "utf8").subarray(0, outputLimit).toString("utf8");
|
|
194
|
+
}
|
|
195
|
+
return {
|
|
196
|
+
exitCode,
|
|
197
|
+
output,
|
|
198
|
+
timedOut,
|
|
199
|
+
truncated,
|
|
200
|
+
durationMs: Date.now() - startedAt,
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
clampInt(value, min, max) {
|
|
204
|
+
return Math.min(Math.max(Math.trunc(value), min), max);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
//# sourceMappingURL=session-command-executor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-command-executor.js","sourceRoot":"","sources":["../src/session-command-executor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { SessionClientHub } from "./session-client-hub.js";
|
|
2
|
+
import type { SessionEventName } from "./session-event-manager.js";
|
|
3
|
+
import type { ManagedSession } from "./session-manager.js";
|
|
4
|
+
import type { GitBranchPr } from "./types.js";
|
|
5
|
+
export declare class SessionGitEventBridge {
|
|
6
|
+
private readonly clientHub;
|
|
7
|
+
private readonly onSessionEvent;
|
|
8
|
+
constructor(clientHub: SessionClientHub, onSessionEvent: (event: SessionEventName, cwd: string) => void);
|
|
9
|
+
installSessionListener(managed: ManagedSession): void;
|
|
10
|
+
installWatcher(managed: ManagedSession): void;
|
|
11
|
+
handleCwdChange(managed: ManagedSession, cwd: string): void;
|
|
12
|
+
dispose(managed: ManagedSession): void;
|
|
13
|
+
broadcastGitBranchPr(cwd: string, pr: GitBranchPr | null): void;
|
|
14
|
+
hasCoordinatorFor(cwd: string): boolean;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=session-git-event-bridge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-git-event-bridge.d.ts","sourceRoot":"","sources":["../src/session-git-event-bridge.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,qBAAa,qBAAqB;IAE9B,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,cAAc;IAFjC,YACmB,SAAS,EAAE,gBAAgB,EAC3B,cAAc,EAAE,CAAC,KAAK,EAAE,gBAAgB,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,EAC7E;IAEJ,sBAAsB,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI,CAOpD;IAED,cAAc,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI,CAgB5C;IAED,eAAe,CAAC,OAAO,EAAE,cAAc,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAK1D;IAED,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI,CAErC;IAED,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,WAAW,GAAG,IAAI,GAAG,IAAI,CAE9D;IAED,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAEtC;CACF"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { GIT_DIFF_WATCHER_EVENT_NAMES } from "./git-diff-watcher.js";
|
|
2
|
+
import { SessionClientHub } from "./session-client-hub.js";
|
|
3
|
+
export class SessionGitEventBridge {
|
|
4
|
+
clientHub;
|
|
5
|
+
onSessionEvent;
|
|
6
|
+
constructor(clientHub, onSessionEvent) {
|
|
7
|
+
this.clientHub = clientHub;
|
|
8
|
+
this.onSessionEvent = onSessionEvent;
|
|
9
|
+
}
|
|
10
|
+
installSessionListener(managed) {
|
|
11
|
+
const session = managed.session;
|
|
12
|
+
session.on("git-dirty", () => {
|
|
13
|
+
const cwd = session.lastEmittedCwd;
|
|
14
|
+
if (cwd)
|
|
15
|
+
this.clientHub.coordinatorForCwd(cwd).signal();
|
|
16
|
+
if (!managed.automation && cwd)
|
|
17
|
+
this.onSessionEvent("git-dirty", cwd);
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
installWatcher(managed) {
|
|
21
|
+
const session = managed.session;
|
|
22
|
+
managed.gitWatcher.on("git-dirty", () => {
|
|
23
|
+
const cwd = session.lastEmittedCwd;
|
|
24
|
+
if (cwd)
|
|
25
|
+
this.clientHub.coordinatorForCwd(cwd).signal();
|
|
26
|
+
});
|
|
27
|
+
for (const refEvent of GIT_DIFF_WATCHER_EVENT_NAMES) {
|
|
28
|
+
if (refEvent === "git-dirty")
|
|
29
|
+
continue;
|
|
30
|
+
const eventName = refEvent;
|
|
31
|
+
managed.gitWatcher.on(eventName, () => {
|
|
32
|
+
if (!managed.automation && session.lastEmittedCwd) {
|
|
33
|
+
this.onSessionEvent(eventName, session.lastEmittedCwd);
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
managed.gitWatcher.start(session.cwd);
|
|
38
|
+
}
|
|
39
|
+
handleCwdChange(managed, cwd) {
|
|
40
|
+
managed.gitWatcher.stop();
|
|
41
|
+
managed.gitWatcher.start(cwd);
|
|
42
|
+
this.clientHub.moveClientCoordinators(managed, cwd);
|
|
43
|
+
if (!managed.automation)
|
|
44
|
+
this.onSessionEvent("cwd", cwd);
|
|
45
|
+
}
|
|
46
|
+
dispose(managed) {
|
|
47
|
+
managed.gitWatcher.dispose();
|
|
48
|
+
}
|
|
49
|
+
broadcastGitBranchPr(cwd, pr) {
|
|
50
|
+
this.clientHub.broadcastGitBranchPr(cwd, pr);
|
|
51
|
+
}
|
|
52
|
+
hasCoordinatorFor(cwd) {
|
|
53
|
+
return this.clientHub.hasCoordinatorFor(cwd);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=session-git-event-bridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-git-event-bridge.js","sourceRoot":"","sources":["../src/session-git-event-bridge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,4BAA4B,EAAwB,MAAM,uBAAuB,CAAC;AAC3F,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAK3D,MAAM,OAAO,qBAAqB;IAEb,SAAS;IACT,cAAc;IAFjC,YACmB,SAA2B,EAC3B,cAA8D;yBAD9D,SAAS;8BACT,cAAc;IAC9B,CAAC;IAEJ,sBAAsB,CAAC,OAAuB;QAC5C,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAChC,OAAO,CAAC,EAAE,CAAC,WAAW,EAAE,GAAG,EAAE;YAC3B,MAAM,GAAG,GAAG,OAAO,CAAC,cAAc,CAAC;YACnC,IAAI,GAAG;gBAAE,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC;YACxD,IAAI,CAAC,OAAO,CAAC,UAAU,IAAI,GAAG;gBAAE,IAAI,CAAC,cAAc,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;QACxE,CAAC,CAAC,CAAC;IACL,CAAC;IAED,cAAc,CAAC,OAAuB;QACpC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAChC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC,WAAW,EAAE,GAAG,EAAE;YACtC,MAAM,GAAG,GAAG,OAAO,CAAC,cAAc,CAAC;YACnC,IAAI,GAAG;gBAAE,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC;QAC1D,CAAC,CAAC,CAAC;QACH,KAAK,MAAM,QAAQ,IAAI,4BAA4B,EAAE,CAAC;YACpD,IAAI,QAAQ,KAAK,WAAW;gBAAE,SAAS;YACvC,MAAM,SAAS,GAAoB,QAAQ,CAAC;YAC5C,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;gBACpC,IAAI,CAAC,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;oBAClD,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;gBACzD,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;QACD,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACxC,CAAC;IAED,eAAe,CAAC,OAAuB,EAAE,GAAW;QAClD,OAAO,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;QAC1B,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,CAAC,SAAS,CAAC,sBAAsB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QACpD,IAAI,CAAC,OAAO,CAAC,UAAU;YAAE,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC3D,CAAC;IAED,OAAO,CAAC,OAAuB;QAC7B,OAAO,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;IAC/B,CAAC;IAED,oBAAoB,CAAC,GAAW,EAAE,EAAsB;QACtD,IAAI,CAAC,SAAS,CAAC,oBAAoB,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED,iBAAiB,CAAC,GAAW;QAC3B,OAAO,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;IAC/C,CAAC;CACF"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { ManagedSession, SessionActivityState } from "./session-manager.js";
|
|
2
|
+
export declare class SessionLifecyclePolicy {
|
|
3
|
+
private readonly getGraceMs;
|
|
4
|
+
private readonly tearDown;
|
|
5
|
+
private readonly onSessionActivity;
|
|
6
|
+
constructor(getGraceMs: () => number | null, tearDown: (managed: ManagedSession) => void, onSessionActivity: () => void);
|
|
7
|
+
atCapacity(sessions: ReadonlyMap<string, ManagedSession>): boolean;
|
|
8
|
+
makeRoomForSession(sessions: ReadonlyMap<string, ManagedSession>): boolean;
|
|
9
|
+
startGrace(managed: ManagedSession): void;
|
|
10
|
+
rearmGrace(sessions: ReadonlyMap<string, ManagedSession>): void;
|
|
11
|
+
cancelGrace(managed: ManagedSession): void;
|
|
12
|
+
computeState(managed: ManagedSession): SessionActivityState;
|
|
13
|
+
private evictOldestDormant;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=session-lifecycle-policy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-lifecycle-policy.d.ts","sourceRoot":"","sources":["../src/session-lifecycle-policy.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAEjF,qBAAa,sBAAsB;IAE/B,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAHpC,YACmB,UAAU,EAAE,MAAM,MAAM,GAAG,IAAI,EAC/B,QAAQ,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,EAC3C,iBAAiB,EAAE,MAAM,IAAI,EAC5C;IAEJ,UAAU,CAAC,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,cAAc,CAAC,GAAG,OAAO,CASjE;IAED,kBAAkB,CAAC,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,cAAc,CAAC,GAAG,OAAO,CAGzE;IAED,UAAU,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI,CA8BxC;IAED,UAAU,CAAC,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,cAAc,CAAC,GAAG,IAAI,CAI9D;IAED,WAAW,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI,CAMzC;IAMD,YAAY,CAAC,OAAO,EAAE,cAAc,GAAG,oBAAoB,CAG1D;IAED,OAAO,CAAC,kBAAkB;CAkB3B"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { MAX_CONCURRENT_SESSIONS, SESSION_ACTIVITY_WINDOW_MS } from "./constants.js";
|
|
2
|
+
export class SessionLifecyclePolicy {
|
|
3
|
+
getGraceMs;
|
|
4
|
+
tearDown;
|
|
5
|
+
onSessionActivity;
|
|
6
|
+
constructor(getGraceMs, tearDown, onSessionActivity) {
|
|
7
|
+
this.getGraceMs = getGraceMs;
|
|
8
|
+
this.tearDown = tearDown;
|
|
9
|
+
this.onSessionActivity = onSessionActivity;
|
|
10
|
+
}
|
|
11
|
+
atCapacity(sessions) {
|
|
12
|
+
if (sessions.size < MAX_CONCURRENT_SESSIONS)
|
|
13
|
+
return false;
|
|
14
|
+
for (const managed of sessions.values()) {
|
|
15
|
+
// A dormant, non-pinned session can be evicted to make room. Pinned
|
|
16
|
+
// sessions hold their slots (never silently reaped), so a full cap of
|
|
17
|
+
// pinned sessions surfaces a real capacity error instead of a steal.
|
|
18
|
+
if (managed.clients.size === 0 && !managed.pinned)
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
return true;
|
|
22
|
+
}
|
|
23
|
+
makeRoomForSession(sessions) {
|
|
24
|
+
if (sessions.size >= MAX_CONCURRENT_SESSIONS)
|
|
25
|
+
this.evictOldestDormant(sessions);
|
|
26
|
+
return sessions.size < MAX_CONCURRENT_SESSIONS;
|
|
27
|
+
}
|
|
28
|
+
startGrace(managed) {
|
|
29
|
+
this.cancelGrace(managed);
|
|
30
|
+
managed.parkedAt = Date.now();
|
|
31
|
+
// Pinned sessions park indefinitely — never reaped by the idle grace and
|
|
32
|
+
// never evicted at the cap. They live until an explicit kill or shell exit.
|
|
33
|
+
if (managed.pinned)
|
|
34
|
+
return;
|
|
35
|
+
const graceMs = this.getGraceMs();
|
|
36
|
+
// "Never reap": park the shell with no timer. It lingers until a viewer
|
|
37
|
+
// reattaches, it's killed from the switcher, the shell exits, or it's
|
|
38
|
+
// evicted at MAX_CONCURRENT_SESSIONS. parkedAt stays set so eviction
|
|
39
|
+
// ordering still treats it as dormant.
|
|
40
|
+
if (graceMs === null)
|
|
41
|
+
return;
|
|
42
|
+
managed.graceTimer = setTimeout(() => {
|
|
43
|
+
managed.graceTimer = null;
|
|
44
|
+
managed.parkedAt = null;
|
|
45
|
+
// Re-check on fire: reschedule while the shell is still doing something —
|
|
46
|
+
// output still arriving (running), or a foreground program still alive
|
|
47
|
+
// though quiet (alive-quiet) — so a closed tab never kills a running
|
|
48
|
+
// command mid-stream, even after it's gone quiet. The shell only dies on
|
|
49
|
+
// a real idle (ready: no recent output and no foreground program, no
|
|
50
|
+
// clients), the same "no activity" signal that turns the tab's favicon
|
|
51
|
+
// grey.
|
|
52
|
+
if (this.computeState(managed) !== "ready") {
|
|
53
|
+
this.startGrace(managed);
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
this.tearDown(managed);
|
|
57
|
+
this.onSessionActivity();
|
|
58
|
+
}, graceMs);
|
|
59
|
+
managed.graceTimer.unref?.();
|
|
60
|
+
}
|
|
61
|
+
rearmGrace(sessions) {
|
|
62
|
+
for (const managed of sessions.values()) {
|
|
63
|
+
if (managed.clients.size === 0 && !managed.session.isExited)
|
|
64
|
+
this.startGrace(managed);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
cancelGrace(managed) {
|
|
68
|
+
if (managed.graceTimer !== null) {
|
|
69
|
+
clearTimeout(managed.graceTimer);
|
|
70
|
+
managed.graceTimer = null;
|
|
71
|
+
}
|
|
72
|
+
managed.parkedAt = null;
|
|
73
|
+
}
|
|
74
|
+
// The favicon-equivalent state, computed from the same signals the client's
|
|
75
|
+
// favicon uses (recent output → running; a foreground program but quiet →
|
|
76
|
+
// alive-quiet; idle → ready). Surfaced on the session list so the row icon
|
|
77
|
+
// colors match the tab the user is looking at.
|
|
78
|
+
computeState(managed) {
|
|
79
|
+
if (Date.now() - managed.lastOutputAt < SESSION_ACTIVITY_WINDOW_MS)
|
|
80
|
+
return "running";
|
|
81
|
+
return managed.hasForeground ? "alive-quiet" : "ready";
|
|
82
|
+
}
|
|
83
|
+
evictOldestDormant(sessions) {
|
|
84
|
+
let oldest = null;
|
|
85
|
+
let oldestKey = Infinity;
|
|
86
|
+
for (const managed of sessions.values()) {
|
|
87
|
+
if (managed.clients.size > 0)
|
|
88
|
+
continue;
|
|
89
|
+
// Pinned sessions are never silently evicted — they're explicitly held.
|
|
90
|
+
if (managed.pinned)
|
|
91
|
+
continue;
|
|
92
|
+
// Evict the parked session whose grace fires soonest (armed earliest); a
|
|
93
|
+
// parked session with no timer is a fresh spawn nobody attached yet —
|
|
94
|
+
// yield it only after all armed ones.
|
|
95
|
+
const key = managed.parkedAt ?? managed.createdAt;
|
|
96
|
+
if (key < oldestKey) {
|
|
97
|
+
oldestKey = key;
|
|
98
|
+
oldest = managed;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
if (oldest)
|
|
102
|
+
this.tearDown(oldest);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=session-lifecycle-policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-lifecycle-policy.js","sourceRoot":"","sources":["../src/session-lifecycle-policy.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,17 +1,14 @@
|
|
|
1
|
-
import { CaptureRenderer } from "./capture-renderer.js";
|
|
1
|
+
import type { CaptureRenderer } from "./capture-renderer.js";
|
|
2
2
|
import { GitDiffWatcher } from "./git-diff-watcher.js";
|
|
3
|
-
import { GitMetadataCoordinator } from "./git-metadata-coordinator.js";
|
|
3
|
+
import type { GitMetadataCoordinator } from "./git-metadata-coordinator.js";
|
|
4
4
|
import { Session } from "./session.js";
|
|
5
|
+
import { type BrotliEncoder } from "./session-output-transport.js";
|
|
5
6
|
import type { SessionEventName } from "./session-event-manager.js";
|
|
6
7
|
import type { GitBranchPr, ServerToClientMessage, SessionClientProfile, SpawnPtyInput } from "./types.js";
|
|
7
8
|
import type { CompressMode } from "./schemas.js";
|
|
8
9
|
import type { SessionOwner } from "./identity/types.js";
|
|
9
|
-
interface BrotliEncoder {
|
|
10
|
-
flush: (bytes: Uint8Array<ArrayBuffer>) => Promise<Buffer<ArrayBuffer>>;
|
|
11
|
-
release: () => void;
|
|
12
|
-
}
|
|
13
10
|
import { type SynchronizedOutputEndDetector } from "./utils/create-synchronized-output-end-detector.js";
|
|
14
|
-
import {
|
|
11
|
+
import type { ClientSocket } from "./utils/ws-socket.js";
|
|
15
12
|
import type { WorkspaceEntry } from "./workspace-store.js";
|
|
16
13
|
export interface AutomationContext {
|
|
17
14
|
automationId: string;
|
|
@@ -38,7 +35,7 @@ export interface WaitResult {
|
|
|
38
35
|
snapshot: string;
|
|
39
36
|
}
|
|
40
37
|
export type SessionActivityState = "running" | "alive-quiet" | "ready";
|
|
41
|
-
interface ManagedClient {
|
|
38
|
+
export interface ManagedClient {
|
|
42
39
|
ws: ClientSocket;
|
|
43
40
|
pending: boolean;
|
|
44
41
|
pendingControl: ServerToClientMessage[];
|
|
@@ -94,13 +91,15 @@ interface SessionManagerOptions {
|
|
|
94
91
|
}
|
|
95
92
|
export declare class SessionManager {
|
|
96
93
|
private readonly sessions;
|
|
97
|
-
private readonly wsToClient;
|
|
98
94
|
private readonly lastOutputAtByPid;
|
|
99
|
-
private readonly coordinatorsByCwd;
|
|
100
95
|
private readonly hooks;
|
|
101
96
|
private readonly sendControl;
|
|
102
|
-
private readonly
|
|
103
|
-
private readonly
|
|
97
|
+
private readonly outputTransport;
|
|
98
|
+
private readonly clientHub;
|
|
99
|
+
private readonly commandExecutor;
|
|
100
|
+
private readonly gitEventBridge;
|
|
101
|
+
private readonly lifecyclePolicy;
|
|
102
|
+
private readonly outputCoordinator;
|
|
104
103
|
private readonly shimsDir?;
|
|
105
104
|
constructor(options: SessionManagerOptions);
|
|
106
105
|
size(): number;
|
|
@@ -111,7 +110,6 @@ export declare class SessionManager {
|
|
|
111
110
|
noteOutput(pid: number): void;
|
|
112
111
|
hasRecentOutput(pids: readonly number[], withinMs: number): boolean;
|
|
113
112
|
list(owner?: SessionOwner): SessionListItem[];
|
|
114
|
-
private clientProfilesFor;
|
|
115
113
|
workspaceEntries(): WorkspaceEntry[];
|
|
116
114
|
clientProfile(ws: ClientSocket): {
|
|
117
115
|
owner: SessionOwner;
|
|
@@ -130,8 +128,6 @@ export declare class SessionManager {
|
|
|
130
128
|
promote(ws: ClientSocket, replay: boolean, compress?: CompressMode): Promise<void>;
|
|
131
129
|
writeInput(ws: ClientSocket, data: string): void;
|
|
132
130
|
writeTerminalResponse(ws: ClientSocket, data: string): void;
|
|
133
|
-
private ensureTerminalResponder;
|
|
134
|
-
private assignTerminalResponder;
|
|
135
131
|
resize(ws: ClientSocket, cols: number, rows: number, pixelWidth?: number, pixelHeight?: number): void;
|
|
136
132
|
detach(ws: ClientSocket): void;
|
|
137
133
|
kill(id: string, owner?: SessionOwner): boolean;
|
|
@@ -153,38 +149,11 @@ export declare class SessionManager {
|
|
|
153
149
|
cols: number;
|
|
154
150
|
rows: number;
|
|
155
151
|
};
|
|
156
|
-
private ensureCaptureRenderer;
|
|
157
152
|
execInSession(id: string, command: string, options?: ExecOptions, owner?: SessionOwner): Promise<ExecResult | null>;
|
|
158
|
-
private buildExecResult;
|
|
159
|
-
private clampInt;
|
|
160
|
-
private sendScrollback;
|
|
161
|
-
private sendOutputBytes;
|
|
162
|
-
private compressPayload;
|
|
163
|
-
private frameWithHeader;
|
|
164
|
-
private frameWithCtxHeader;
|
|
165
|
-
private sendOutputFrame;
|
|
166
|
-
private broadcastBytes;
|
|
167
|
-
private sendToClient;
|
|
168
|
-
private broadcast;
|
|
169
|
-
private broadcastToOwner;
|
|
170
|
-
private onSessionOutput;
|
|
171
|
-
private appendAutomationLog;
|
|
172
|
-
private flushOutput;
|
|
173
|
-
private maybePauseAfterFlush;
|
|
174
|
-
private ensureDrainPoll;
|
|
175
|
-
private stopDrainPoll;
|
|
176
|
-
private recomputeResize;
|
|
177
153
|
private installSessionListeners;
|
|
178
|
-
private moveClientCoordinator;
|
|
179
154
|
private handleExit;
|
|
180
155
|
private tearDown;
|
|
181
|
-
private evictOldestDormant;
|
|
182
|
-
private startGrace;
|
|
183
156
|
rearmGrace(): void;
|
|
184
|
-
private cancelGrace;
|
|
185
|
-
private computeState;
|
|
186
|
-
private coordinatorForCwd;
|
|
187
|
-
private releaseCoordinator;
|
|
188
157
|
broadcastGitBranchPr(cwd: string, pr: GitBranchPr | null): void;
|
|
189
158
|
hasCoordinatorFor(cwd: string): boolean;
|
|
190
159
|
}
|
|
@@ -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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"}
|