@datnguyennnx/localterm-server 0.0.15 → 0.0.16
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/rpc.d.ts +22 -0
- package/dist/agent/rpc.d.ts.map +1 -0
- package/dist/agent/rpc.js +233 -0
- package/dist/agent/rpc.js.map +1 -0
- package/dist/agent/token.d.ts +21 -0
- package/dist/agent/token.d.ts.map +1 -0
- package/dist/agent/token.js +56 -0
- package/dist/agent/token.js.map +1 -0
- package/dist/agent-rpc.d.ts +0 -5
- package/dist/agent-rpc.d.ts.map +1 -1
- package/dist/agent-rpc.js +34 -14
- package/dist/agent-rpc.js.map +1 -1
- package/dist/agent-token.d.ts.map +1 -1
- package/dist/agent-token.js +10 -7
- package/dist/agent-token.js.map +1 -1
- package/dist/ensure-spawn-helper-executable.js +3 -3
- package/dist/ensure-spawn-helper-executable.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/osc-chunk-parser.d.ts +32 -0
- package/dist/osc-chunk-parser.d.ts.map +1 -0
- package/dist/osc-chunk-parser.js +56 -0
- package/dist/osc-chunk-parser.js.map +1 -0
- package/dist/osc133-chunk-parser.d.ts +9 -5
- package/dist/osc133-chunk-parser.d.ts.map +1 -1
- package/dist/osc133-chunk-parser.js +9 -25
- package/dist/osc133-chunk-parser.js.map +1 -1
- package/dist/osc7-chunk-parser.d.ts +8 -5
- package/dist/osc7-chunk-parser.d.ts.map +1 -1
- package/dist/osc7-chunk-parser.js +9 -25
- package/dist/osc7-chunk-parser.js.map +1 -1
- package/dist/output-batcher.d.ts +2 -1
- package/dist/output-batcher.d.ts.map +1 -1
- package/dist/output-batcher.js +3 -1
- package/dist/output-batcher.js.map +1 -1
- package/dist/parser/osc.d.ts +32 -0
- package/dist/parser/osc.d.ts.map +1 -0
- package/dist/parser/osc.js +56 -0
- package/dist/parser/osc.js.map +1 -0
- package/dist/parser/osc133-chunk-parser.d.ts +12 -0
- package/dist/parser/osc133-chunk-parser.d.ts.map +1 -0
- package/dist/parser/osc133-chunk-parser.js +13 -0
- package/dist/parser/osc133-chunk-parser.js.map +1 -0
- package/dist/parser/osc7-chunk-parser.d.ts +10 -0
- package/dist/parser/osc7-chunk-parser.d.ts.map +1 -0
- package/dist/parser/osc7-chunk-parser.js +13 -0
- package/dist/parser/osc7-chunk-parser.js.map +1 -0
- package/dist/parser/parse-osc133-from-chunk.d.ts +10 -0
- package/dist/parser/parse-osc133-from-chunk.d.ts.map +1 -0
- package/dist/parser/parse-osc133-from-chunk.js +49 -0
- package/dist/parser/parse-osc133-from-chunk.js.map +1 -0
- package/dist/parser/parse-osc7-from-chunk.d.ts +2 -0
- package/dist/parser/parse-osc7-from-chunk.d.ts.map +1 -0
- package/dist/parser/parse-osc7-from-chunk.js +33 -0
- package/dist/parser/parse-osc7-from-chunk.js.map +1 -0
- package/dist/parser/strip-ansi.d.ts +13 -0
- package/dist/parser/strip-ansi.d.ts.map +1 -0
- package/dist/parser/strip-ansi.js +26 -0
- package/dist/parser/strip-ansi.js.map +1 -0
- package/dist/schemas.js +1 -1
- package/dist/schemas.js.map +1 -1
- package/dist/server/index.d.ts +25 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +433 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/security.d.ts +5 -0
- package/dist/server/security.d.ts.map +1 -0
- package/dist/server/security.js +63 -0
- package/dist/server/security.js.map +1 -0
- package/dist/server/static-resolver.d.ts +7 -0
- package/dist/server/static-resolver.d.ts.map +1 -0
- package/dist/server/static-resolver.js +65 -0
- package/dist/server/static-resolver.js.map +1 -0
- package/dist/session/default-shell.d.ts +2 -0
- package/dist/session/default-shell.d.ts.map +1 -0
- package/dist/session/default-shell.js +44 -0
- package/dist/session/default-shell.js.map +1 -0
- package/dist/session/ensure-spawn-helper-executable.d.ts +2 -0
- package/dist/session/ensure-spawn-helper-executable.d.ts.map +1 -0
- package/dist/session/ensure-spawn-helper-executable.js +34 -0
- package/dist/session/ensure-spawn-helper-executable.js.map +1 -0
- package/dist/session/session-registry.d.ts +9 -0
- package/dist/session/session-registry.d.ts.map +1 -0
- package/dist/session/session-registry.js +19 -0
- package/dist/session/session-registry.js.map +1 -0
- package/dist/session/session.d.ts +62 -0
- package/dist/session/session.d.ts.map +1 -0
- package/dist/session/session.js +245 -0
- package/dist/session/session.js.map +1 -0
- package/dist/session.d.ts +1 -1
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +12 -5
- package/dist/session.js.map +1 -1
- package/dist/static-resolver.js +1 -1
- package/dist/static-resolver.js.map +1 -1
- package/dist/utils/parse-osc133-from-chunk.d.ts.map +1 -1
- package/dist/utils/parse-osc133-from-chunk.js +10 -5
- package/dist/utils/parse-osc133-from-chunk.js.map +1 -1
- package/dist/utils/parse-osc7-from-chunk.d.ts.map +1 -1
- package/dist/utils/parse-osc7-from-chunk.js +4 -3
- package/dist/utils/parse-osc7-from-chunk.js.map +1 -1
- package/dist/utils/strip-ansi.d.ts.map +1 -1
- package/dist/utils/strip-ansi.js +6 -8
- package/dist/utils/strip-ansi.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { LOOPBACK_HOSTS } from "../constants.js";
|
|
2
|
+
const stripPort = (hostHeader) => {
|
|
3
|
+
if (!hostHeader)
|
|
4
|
+
return null;
|
|
5
|
+
const trimmed = hostHeader.trim();
|
|
6
|
+
if (!trimmed)
|
|
7
|
+
return null;
|
|
8
|
+
if (trimmed.startsWith("[")) {
|
|
9
|
+
const end = trimmed.indexOf("]");
|
|
10
|
+
return end === -1 ? trimmed : trimmed.slice(0, end + 1);
|
|
11
|
+
}
|
|
12
|
+
if (trimmed.includes(":") && !trimmed.includes("."))
|
|
13
|
+
return `[${trimmed}]`;
|
|
14
|
+
const colon = trimmed.lastIndexOf(":");
|
|
15
|
+
if (colon === -1)
|
|
16
|
+
return trimmed;
|
|
17
|
+
return trimmed.slice(0, colon);
|
|
18
|
+
};
|
|
19
|
+
const originHostname = (originHeader) => {
|
|
20
|
+
if (!originHeader)
|
|
21
|
+
return null;
|
|
22
|
+
if (originHeader === "null")
|
|
23
|
+
return null;
|
|
24
|
+
try {
|
|
25
|
+
return new URL(originHeader).hostname;
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
const isLoopback = (hostname) => {
|
|
32
|
+
if (!hostname)
|
|
33
|
+
return false;
|
|
34
|
+
if (LOOPBACK_HOSTS.has(hostname))
|
|
35
|
+
return true;
|
|
36
|
+
if (hostname === "localhost" || hostname.endsWith(".localhost"))
|
|
37
|
+
return true;
|
|
38
|
+
return false;
|
|
39
|
+
};
|
|
40
|
+
const normalizeBareIpv6 = (host) => host.includes(":") && !host.startsWith("[") ? `[${host}]` : host;
|
|
41
|
+
export const isLoopbackHost = (host) => isLoopback(normalizeBareIpv6(host));
|
|
42
|
+
export const enforceLoopback = (context) => {
|
|
43
|
+
const hostHeader = context.req.header("host");
|
|
44
|
+
const hostname = stripPort(hostHeader);
|
|
45
|
+
if (!isLoopback(hostname)) {
|
|
46
|
+
return new Response("forbidden: non-loopback host", { status: 403 });
|
|
47
|
+
}
|
|
48
|
+
const origin = context.req.header("origin");
|
|
49
|
+
if (origin !== undefined) {
|
|
50
|
+
const originHost = originHostname(origin);
|
|
51
|
+
if (!isLoopback(originHost)) {
|
|
52
|
+
return new Response("forbidden: cross-origin", { status: 403 });
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return null;
|
|
56
|
+
};
|
|
57
|
+
export const loopbackMiddleware = async (context, next) => {
|
|
58
|
+
const blocked = enforceLoopback(context);
|
|
59
|
+
if (blocked)
|
|
60
|
+
return blocked;
|
|
61
|
+
await next();
|
|
62
|
+
};
|
|
63
|
+
//# sourceMappingURL=security.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security.js","sourceRoot":"","sources":["../../src/server/security.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"static-resolver.d.ts","sourceRoot":"","sources":["../../src/server/static-resolver.ts"],"names":[],"mappings":"AAuBA,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;CAChB;AAkBD,eAAO,MAAM,kBAAkB,GAAI,MAAM,MAAM,EAAE,SAAS,MAAM,KAAG,WAAW,GAAG,IAqBhF,CAAC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { existsSync, readFileSync, statSync } from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
const MIME = {
|
|
4
|
+
".html": "text/html; charset=utf-8",
|
|
5
|
+
".js": "text/javascript; charset=utf-8",
|
|
6
|
+
".mjs": "text/javascript; charset=utf-8",
|
|
7
|
+
".css": "text/css; charset=utf-8",
|
|
8
|
+
".svg": "image/svg+xml",
|
|
9
|
+
".png": "image/png",
|
|
10
|
+
".jpg": "image/jpeg",
|
|
11
|
+
".jpeg": "image/jpeg",
|
|
12
|
+
".gif": "image/gif",
|
|
13
|
+
".webp": "image/webp",
|
|
14
|
+
".ico": "image/x-icon",
|
|
15
|
+
".json": "application/json; charset=utf-8",
|
|
16
|
+
".webmanifest": "application/manifest+json; charset=utf-8",
|
|
17
|
+
".woff": "font/woff",
|
|
18
|
+
".woff2": "font/woff2",
|
|
19
|
+
".ttf": "font/ttf",
|
|
20
|
+
".map": "application/json; charset=utf-8",
|
|
21
|
+
};
|
|
22
|
+
const isContained = (root, resolved) => {
|
|
23
|
+
const relative = path.relative(root, resolved);
|
|
24
|
+
return relative !== "" && !relative.startsWith("..") && !path.isAbsolute(relative);
|
|
25
|
+
};
|
|
26
|
+
const readFile = (target) => {
|
|
27
|
+
if (!existsSync(target))
|
|
28
|
+
return null;
|
|
29
|
+
if (!statSync(target).isFile())
|
|
30
|
+
return null;
|
|
31
|
+
const ext = path.extname(target).toLowerCase();
|
|
32
|
+
return {
|
|
33
|
+
body: readFileSync(target),
|
|
34
|
+
contentType: MIME[ext] ?? "application/octet-stream",
|
|
35
|
+
status: 200,
|
|
36
|
+
};
|
|
37
|
+
};
|
|
38
|
+
export const resolveStaticAsset = (root, urlPath) => {
|
|
39
|
+
const normalizedRoot = path.resolve(root);
|
|
40
|
+
let decoded;
|
|
41
|
+
try {
|
|
42
|
+
decoded = decodeURIComponent(urlPath.split("?", 1)[0] ?? "/");
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
const trimmed = decoded.replace(/^[/\\]+/, "");
|
|
48
|
+
const resolvedExact = path.resolve(normalizedRoot, trimmed);
|
|
49
|
+
if (isContained(normalizedRoot, resolvedExact)) {
|
|
50
|
+
const direct = readFile(resolvedExact);
|
|
51
|
+
if (direct)
|
|
52
|
+
return direct;
|
|
53
|
+
const indexed = readFile(path.join(resolvedExact, "index.html"));
|
|
54
|
+
if (indexed)
|
|
55
|
+
return indexed;
|
|
56
|
+
}
|
|
57
|
+
const hasFileExtension = /\.[a-z0-9]+$/i.test(trimmed);
|
|
58
|
+
if (hasFileExtension)
|
|
59
|
+
return null;
|
|
60
|
+
const fallback = readFile(path.join(normalizedRoot, "index.html"));
|
|
61
|
+
if (!fallback)
|
|
62
|
+
return null;
|
|
63
|
+
return fallback;
|
|
64
|
+
};
|
|
65
|
+
//# sourceMappingURL=static-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"static-resolver.js","sourceRoot":"","sources":["../../src/server/static-resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"default-shell.d.ts","sourceRoot":"","sources":["../../src/session/default-shell.ts"],"names":[],"mappings":"AAaA,eAAO,MAAM,eAAe,QAAO,MAyBlC,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { accessSync, constants as fsConstants } from "node:fs";
|
|
2
|
+
import os from "node:os";
|
|
3
|
+
import { DEFAULT_SHELL_FALLBACK } from "../constants.js";
|
|
4
|
+
const isExecutable = (binaryPath) => {
|
|
5
|
+
try {
|
|
6
|
+
accessSync(binaryPath, fsConstants.X_OK);
|
|
7
|
+
return true;
|
|
8
|
+
}
|
|
9
|
+
catch {
|
|
10
|
+
return false;
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
export const getDefaultShell = () => {
|
|
14
|
+
if (process.platform === "win32") {
|
|
15
|
+
return process.env.COMSPEC ?? "cmd.exe";
|
|
16
|
+
}
|
|
17
|
+
// Priority order (matches VS Code, Hyper, and Warp):
|
|
18
|
+
// 1. LOCALTERM_SHELL — explicit user override
|
|
19
|
+
// 2. os.userInfo().shell — the user's persistent login shell from passwd / DSCL
|
|
20
|
+
// 3. process.env.SHELL — only as a fallback; this leaks the parent process's
|
|
21
|
+
// shell (often zsh from launchd / a Cursor terminal) and is wrong when the
|
|
22
|
+
// user has changed their default with `chsh`
|
|
23
|
+
// 4. DEFAULT_SHELL_FALLBACK
|
|
24
|
+
const candidates = [];
|
|
25
|
+
if (process.env.LOCALTERM_SHELL)
|
|
26
|
+
candidates.push(process.env.LOCALTERM_SHELL);
|
|
27
|
+
try {
|
|
28
|
+
const userInfo = os.userInfo();
|
|
29
|
+
if (userInfo.shell)
|
|
30
|
+
candidates.push(userInfo.shell);
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
/* os.userInfo throws on systems without /etc/passwd entry for the uid */
|
|
34
|
+
}
|
|
35
|
+
if (process.env.SHELL)
|
|
36
|
+
candidates.push(process.env.SHELL);
|
|
37
|
+
candidates.push(DEFAULT_SHELL_FALLBACK);
|
|
38
|
+
for (const candidate of candidates) {
|
|
39
|
+
if (isExecutable(candidate))
|
|
40
|
+
return candidate;
|
|
41
|
+
}
|
|
42
|
+
return DEFAULT_SHELL_FALLBACK;
|
|
43
|
+
};
|
|
44
|
+
//# sourceMappingURL=default-shell.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"default-shell.js","sourceRoot":"","sources":["../../src/session/default-shell.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,IAAI,WAAW,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAEzD,MAAM,YAAY,GAAG,CAAC,UAAkB,EAAW,EAAE;IACnD,IAAI,CAAC;QACH,UAAU,CAAC,UAAU,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC;QACzC,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG,GAAW,EAAE;IAC1C,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,OAAO,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,SAAS,CAAC;IAC1C,CAAC;IACD,qDAAqD;IACrD,gDAAgD;IAChD,kFAAkF;IAClF,+EAA+E;IAC/E,gFAAgF;IAChF,kDAAkD;IAClD,8BAA8B;IAC9B,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe;QAAE,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IAC9E,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC;QAC/B,IAAI,QAAQ,CAAC,KAAK;YAAE,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACtD,CAAC;IAAC,MAAM,CAAC;QACP,yEAAyE;IAC3E,CAAC;IACD,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK;QAAE,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC1D,UAAU,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IACxC,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,YAAY,CAAC,SAAS,CAAC;YAAE,OAAO,SAAS,CAAC;IAChD,CAAC;IACD,OAAO,sBAAsB,CAAC;AAChC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ensure-spawn-helper-executable.d.ts","sourceRoot":"","sources":["../../src/session/ensure-spawn-helper-executable.ts"],"names":[],"mappings":"AAcA,eAAO,MAAM,2BAA2B,QAAO,IAkB9C,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { chmodSync, existsSync } from "node:fs";
|
|
2
|
+
import { createRequire } from "node:module";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
const requireCjs = createRequire(import.meta.url);
|
|
5
|
+
const SPAWN_HELPER_MODE = 0o755;
|
|
6
|
+
let hasEnsuredSpawnHelper = false;
|
|
7
|
+
const candidateSpawnHelperPaths = (nodePtyDir) => [
|
|
8
|
+
path.join(nodePtyDir, "build", "Release", "spawn-helper"),
|
|
9
|
+
path.join(nodePtyDir, "prebuilds", `${process.platform}-${process.arch}`, "spawn-helper"),
|
|
10
|
+
];
|
|
11
|
+
export const ensureSpawnHelperExecutable = () => {
|
|
12
|
+
if (hasEnsuredSpawnHelper)
|
|
13
|
+
return;
|
|
14
|
+
hasEnsuredSpawnHelper = true;
|
|
15
|
+
let nodePtyDir;
|
|
16
|
+
try {
|
|
17
|
+
const ptyEntry = requireCjs.resolve("node-pty");
|
|
18
|
+
nodePtyDir = path.dirname(path.dirname(ptyEntry));
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
for (const candidate of candidateSpawnHelperPaths(nodePtyDir)) {
|
|
24
|
+
if (!existsSync(candidate))
|
|
25
|
+
continue;
|
|
26
|
+
try {
|
|
27
|
+
chmodSync(candidate, SPAWN_HELPER_MODE);
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
/* helper already executable, or filesystem refused chmod (e.g. read-only mount) */
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
//# sourceMappingURL=ensure-spawn-helper-executable.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ensure-spawn-helper-executable.js","sourceRoot":"","sources":["../../src/session/ensure-spawn-helper-executable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,iBAAiB,GAAG,KAAK,CAAC;AAEhC,IAAI,qBAAqB,GAAG,KAAK,CAAC;AAElC,MAAM,yBAAyB,GAAG,CAAC,UAAkB,EAAY,EAAE,CAAC;IAClE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,cAAc,CAAC;IACzD,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,IAAI,EAAE,EAAE,cAAc,CAAC;CAC1F,CAAC;AAEF,MAAM,CAAC,MAAM,2BAA2B,GAAG,GAAS,EAAE;IACpD,IAAI,qBAAqB;QAAE,OAAO;IAClC,qBAAqB,GAAG,IAAI,CAAC;IAC7B,IAAI,UAAkB,CAAC;IACvB,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAChD,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;IACpD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;IACT,CAAC;IACD,KAAK,MAAM,SAAS,IAAI,yBAAyB,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9D,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;YAAE,SAAS;QACrC,IAAI,CAAC;YACH,SAAS,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC;QAC1C,CAAC;QAAC,MAAM,CAAC;YACP,mFAAmF;QACrF,CAAC;IACH,CAAC;AACH,CAAC,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Session } from "./session.js";
|
|
2
|
+
export declare class SessionRegistry {
|
|
3
|
+
private readonly sessions;
|
|
4
|
+
register(session: Session): void;
|
|
5
|
+
unregister(session: Session): void;
|
|
6
|
+
size(): number;
|
|
7
|
+
disposeAll(): void;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=session-registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-registry.d.ts","sourceRoot":"","sources":["../../src/session/session-registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE5C,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAsB;IAE/C,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAIhC,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAIlC,IAAI,IAAI,MAAM;IAId,UAAU,IAAI,IAAI;CAMnB"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export class SessionRegistry {
|
|
2
|
+
sessions = new Set();
|
|
3
|
+
register(session) {
|
|
4
|
+
this.sessions.add(session);
|
|
5
|
+
}
|
|
6
|
+
unregister(session) {
|
|
7
|
+
this.sessions.delete(session);
|
|
8
|
+
}
|
|
9
|
+
size() {
|
|
10
|
+
return this.sessions.size;
|
|
11
|
+
}
|
|
12
|
+
disposeAll() {
|
|
13
|
+
for (const session of this.sessions) {
|
|
14
|
+
session.dispose();
|
|
15
|
+
}
|
|
16
|
+
this.sessions.clear();
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=session-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-registry.js","sourceRoot":"","sources":["../../src/session/session-registry.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,eAAe;IACT,QAAQ,GAAG,IAAI,GAAG,EAAW,CAAC;IAE/C,QAAQ,CAAC,OAAgB;QACvB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IAED,UAAU,CAAC,OAAgB;QACzB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAChC,CAAC;IAED,IAAI;QACF,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;IAC5B,CAAC;IAED,UAAU;QACR,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACpC,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;CACF"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { EventEmitter } from "node:events";
|
|
2
|
+
import { type CommandBoundary } from "../parser/parse-osc133-from-chunk.js";
|
|
3
|
+
import type { SpawnPtyInput } from "../types.js";
|
|
4
|
+
interface SessionEvents {
|
|
5
|
+
output: [data: string];
|
|
6
|
+
exit: [code: number | null];
|
|
7
|
+
title: [title: string];
|
|
8
|
+
cwd: [cwd: string];
|
|
9
|
+
commandBoundary: [boundary: CommandBoundary];
|
|
10
|
+
}
|
|
11
|
+
export declare class Session extends EventEmitter<SessionEvents> {
|
|
12
|
+
readonly shell: string;
|
|
13
|
+
readonly cwd: string;
|
|
14
|
+
readonly createdAt: number;
|
|
15
|
+
readonly mode: "human" | "agent";
|
|
16
|
+
private readonly pty;
|
|
17
|
+
private readonly shellName;
|
|
18
|
+
private currentCols;
|
|
19
|
+
private currentRows;
|
|
20
|
+
private exited;
|
|
21
|
+
private paused;
|
|
22
|
+
private titlePollTimer;
|
|
23
|
+
private lastEmittedTitle;
|
|
24
|
+
private lastEmittedCwd;
|
|
25
|
+
private nextCwdResolveAt;
|
|
26
|
+
private osc7Detected;
|
|
27
|
+
private readonly osc7ChunkParser;
|
|
28
|
+
private readonly osc133ChunkParser;
|
|
29
|
+
constructor(input: SpawnPtyInput);
|
|
30
|
+
get pid(): number;
|
|
31
|
+
get shellBaseName(): string;
|
|
32
|
+
get cols(): number;
|
|
33
|
+
get rows(): number;
|
|
34
|
+
get isExited(): boolean;
|
|
35
|
+
get isPaused(): boolean;
|
|
36
|
+
write(data: string): void;
|
|
37
|
+
/**
|
|
38
|
+
* Stop reading data from the PTY. node-pty buffers further child output in
|
|
39
|
+
* the OS pipe; once that fills, write() in the child process blocks, which
|
|
40
|
+
* propagates flow control all the way back to the producing program (e.g.
|
|
41
|
+
* `cat large_file`). Used by the WS layer to pause heavy output streams
|
|
42
|
+
* when the outbound socket buffer is filling, so we don't have to kill the
|
|
43
|
+
* connection just to recover memory.
|
|
44
|
+
*/
|
|
45
|
+
pause(): void;
|
|
46
|
+
/**
|
|
47
|
+
* Reverse of `pause()`. Buffered child output starts flowing again and the
|
|
48
|
+
* child process unblocks if it was stuck in write().
|
|
49
|
+
*/
|
|
50
|
+
resume(): void;
|
|
51
|
+
resize(cols: number, rows: number): void;
|
|
52
|
+
kill(signal?: NodeJS.Signals): void;
|
|
53
|
+
dispose(): void;
|
|
54
|
+
private onPtyOutput;
|
|
55
|
+
private scheduleTitlePoll;
|
|
56
|
+
private runTitlePoll;
|
|
57
|
+
private computeTitle;
|
|
58
|
+
private resolveLiveCwd;
|
|
59
|
+
private stopTitlePolling;
|
|
60
|
+
}
|
|
61
|
+
export {};
|
|
62
|
+
//# sourceMappingURL=session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/session/session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAsB3C,OAAO,EAAwB,KAAK,eAAe,EAAE,MAAM,sCAAsC,CAAC;AAElG,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAIjD,UAAU,aAAa;IACrB,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACvB,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC;IAC5B,KAAK,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACvB,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACnB,eAAe,EAAE,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;CAC9C;AAED,qBAAa,OAAQ,SAAQ,YAAY,CAAC,aAAa,CAAC;IACtD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC;IAEjC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAO;IAC3B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,gBAAgB,CAAM;IAC9B,OAAO,CAAC,cAAc,CAAM;IAC5B,OAAO,CAAC,gBAAgB,CAAK;IAC7B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA0C;IAC1E,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAA4C;gBAElE,KAAK,EAAE,aAAa;IA+ChC,IAAI,GAAG,IAAI,MAAM,CAEhB;IAED,IAAI,aAAa,IAAI,MAAM,CAE1B;IAED,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAKzB;;;;;;;OAOG;IACH,KAAK,IAAI,IAAI;IAUb;;;OAGG;IACH,MAAM,IAAI,IAAI;IAUd,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAaxC,IAAI,CAAC,MAAM,GAAE,MAAM,CAAC,OAAkB,GAAG,IAAI;IAS7C,OAAO,IAAI,IAAI;IASf,OAAO,CAAC,WAAW;IAiBnB,OAAO,CAAC,iBAAiB;YAQX,YAAY;IAqB1B,OAAO,CAAC,YAAY;YAWN,cAAc;IAS5B,OAAO,CAAC,gBAAgB;CAKzB"}
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
import { EventEmitter } from "node:events";
|
|
2
|
+
import os from "node:os";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { spawn } from "node-pty";
|
|
5
|
+
import { COLORTERM_VALUE, CWD_RESOLVE_BACKOFF_MS, CWD_RESOLVE_COOLDOWN_MS, DEFAULT_COLS, DEFAULT_ROWS, PTY_ENV_DENYLIST, TERM_TYPE, TITLE_POLL_INTERVAL_MS, } from "../constants.js";
|
|
6
|
+
// Note: titles are emitted on a dedicated `title` event so they travel as a
|
|
7
|
+
// separate WebSocket frame. We deliberately do NOT splice OSC sequences into
|
|
8
|
+
// the PTY output stream — doing so corrupts in-flight escape sequences from
|
|
9
|
+
// modern TUIs (e.g. Cursor Agent / Claude Code use DECSET 2026 synchronized
|
|
10
|
+
// output mode and any byte landing inside that frame breaks the parser state).
|
|
11
|
+
import { ensureSpawnHelperExecutable } from "./ensure-spawn-helper-executable.js";
|
|
12
|
+
import { getDefaultShell } from "./default-shell.js";
|
|
13
|
+
import { OscChunkParser } from "../parser/osc.js";
|
|
14
|
+
import { parseOsc133FromChunk } from "../parser/parse-osc133-from-chunk.js";
|
|
15
|
+
import { parseOsc7FromChunk } from "../parser/parse-osc7-from-chunk.js";
|
|
16
|
+
import { formatWorkingDirectoryTitle } from "../utils/format-working-directory-title.js";
|
|
17
|
+
import { resolveCwdForPid } from "../utils/resolve-cwd-for-pid.js";
|
|
18
|
+
export class Session extends EventEmitter {
|
|
19
|
+
shell;
|
|
20
|
+
cwd;
|
|
21
|
+
createdAt;
|
|
22
|
+
mode;
|
|
23
|
+
pty;
|
|
24
|
+
shellName;
|
|
25
|
+
currentCols;
|
|
26
|
+
currentRows;
|
|
27
|
+
exited = false;
|
|
28
|
+
paused = false;
|
|
29
|
+
titlePollTimer = null;
|
|
30
|
+
lastEmittedTitle = "";
|
|
31
|
+
lastEmittedCwd = "";
|
|
32
|
+
nextCwdResolveAt = 0;
|
|
33
|
+
osc7Detected = false;
|
|
34
|
+
osc7ChunkParser = new OscChunkParser(parseOsc7FromChunk);
|
|
35
|
+
osc133ChunkParser = new OscChunkParser(parseOsc133FromChunk);
|
|
36
|
+
constructor(input) {
|
|
37
|
+
super();
|
|
38
|
+
ensureSpawnHelperExecutable();
|
|
39
|
+
this.shell = input.shell ?? getDefaultShell();
|
|
40
|
+
this.shellName = path.basename(this.shell);
|
|
41
|
+
this.cwd = input.cwd ?? os.homedir();
|
|
42
|
+
this.currentCols = input.cols ?? DEFAULT_COLS;
|
|
43
|
+
this.currentRows = input.rows ?? DEFAULT_ROWS;
|
|
44
|
+
this.createdAt = Date.now();
|
|
45
|
+
this.mode = input.mode ?? "human";
|
|
46
|
+
const env = {};
|
|
47
|
+
const denied = new Set(PTY_ENV_DENYLIST);
|
|
48
|
+
for (const [key, value] of Object.entries(process.env)) {
|
|
49
|
+
if (denied.has(key))
|
|
50
|
+
continue;
|
|
51
|
+
if (typeof value === "string")
|
|
52
|
+
env[key] = value;
|
|
53
|
+
}
|
|
54
|
+
if (input.env) {
|
|
55
|
+
for (const [key, value] of Object.entries(input.env)) {
|
|
56
|
+
env[key] = value;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
env.TERM = TERM_TYPE;
|
|
60
|
+
env.COLORTERM = COLORTERM_VALUE;
|
|
61
|
+
this.pty = spawn(this.shell, [], {
|
|
62
|
+
name: TERM_TYPE,
|
|
63
|
+
cols: this.currentCols,
|
|
64
|
+
rows: this.currentRows,
|
|
65
|
+
cwd: this.cwd,
|
|
66
|
+
env,
|
|
67
|
+
});
|
|
68
|
+
this.pty.onData((data) => {
|
|
69
|
+
this.onPtyOutput(data);
|
|
70
|
+
this.emit("output", data);
|
|
71
|
+
});
|
|
72
|
+
this.pty.onExit(({ exitCode }) => {
|
|
73
|
+
this.exited = true;
|
|
74
|
+
this.stopTitlePolling();
|
|
75
|
+
this.emit("exit", exitCode);
|
|
76
|
+
});
|
|
77
|
+
this.scheduleTitlePoll(0);
|
|
78
|
+
}
|
|
79
|
+
get pid() {
|
|
80
|
+
return this.pty.pid;
|
|
81
|
+
}
|
|
82
|
+
get shellBaseName() {
|
|
83
|
+
return this.shellName;
|
|
84
|
+
}
|
|
85
|
+
get cols() {
|
|
86
|
+
return this.currentCols;
|
|
87
|
+
}
|
|
88
|
+
get rows() {
|
|
89
|
+
return this.currentRows;
|
|
90
|
+
}
|
|
91
|
+
get isExited() {
|
|
92
|
+
return this.exited;
|
|
93
|
+
}
|
|
94
|
+
get isPaused() {
|
|
95
|
+
return this.paused;
|
|
96
|
+
}
|
|
97
|
+
write(data) {
|
|
98
|
+
if (this.exited)
|
|
99
|
+
return;
|
|
100
|
+
this.pty.write(data);
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Stop reading data from the PTY. node-pty buffers further child output in
|
|
104
|
+
* the OS pipe; once that fills, write() in the child process blocks, which
|
|
105
|
+
* propagates flow control all the way back to the producing program (e.g.
|
|
106
|
+
* `cat large_file`). Used by the WS layer to pause heavy output streams
|
|
107
|
+
* when the outbound socket buffer is filling, so we don't have to kill the
|
|
108
|
+
* connection just to recover memory.
|
|
109
|
+
*/
|
|
110
|
+
pause() {
|
|
111
|
+
if (this.exited || this.paused)
|
|
112
|
+
return;
|
|
113
|
+
this.paused = true;
|
|
114
|
+
try {
|
|
115
|
+
this.pty.pause();
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
/* PTY may have died between the exited check and the call */
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Reverse of `pause()`. Buffered child output starts flowing again and the
|
|
123
|
+
* child process unblocks if it was stuck in write().
|
|
124
|
+
*/
|
|
125
|
+
resume() {
|
|
126
|
+
if (this.exited || !this.paused)
|
|
127
|
+
return;
|
|
128
|
+
this.paused = false;
|
|
129
|
+
try {
|
|
130
|
+
this.pty.resume();
|
|
131
|
+
}
|
|
132
|
+
catch {
|
|
133
|
+
/* see pause() */
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
resize(cols, rows) {
|
|
137
|
+
if (this.exited)
|
|
138
|
+
return;
|
|
139
|
+
if (cols <= 0 || rows <= 0)
|
|
140
|
+
return;
|
|
141
|
+
if (cols === this.currentCols && rows === this.currentRows)
|
|
142
|
+
return;
|
|
143
|
+
this.currentCols = cols;
|
|
144
|
+
this.currentRows = rows;
|
|
145
|
+
try {
|
|
146
|
+
this.pty.resize(cols, rows);
|
|
147
|
+
}
|
|
148
|
+
catch {
|
|
149
|
+
/* PTY may have died between checks */
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
kill(signal = "SIGHUP") {
|
|
153
|
+
if (this.exited)
|
|
154
|
+
return;
|
|
155
|
+
try {
|
|
156
|
+
this.pty.kill(signal);
|
|
157
|
+
}
|
|
158
|
+
catch {
|
|
159
|
+
/* already gone */
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
dispose() {
|
|
163
|
+
this.kill();
|
|
164
|
+
this.exited = true;
|
|
165
|
+
this.stopTitlePolling();
|
|
166
|
+
this.osc7ChunkParser.reset();
|
|
167
|
+
this.osc133ChunkParser.reset();
|
|
168
|
+
this.removeAllListeners();
|
|
169
|
+
}
|
|
170
|
+
onPtyOutput(data) {
|
|
171
|
+
const osc7Path = this.osc7ChunkParser.push(data);
|
|
172
|
+
if (osc7Path) {
|
|
173
|
+
this.osc7Detected = true;
|
|
174
|
+
if (osc7Path !== this.lastEmittedCwd) {
|
|
175
|
+
this.lastEmittedCwd = osc7Path;
|
|
176
|
+
this.emit("cwd", osc7Path);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
// OSC 133 / FinalTerm command boundary detection.
|
|
180
|
+
const boundary = this.osc133ChunkParser.push(data);
|
|
181
|
+
if (boundary) {
|
|
182
|
+
this.emit("commandBoundary", boundary);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
scheduleTitlePoll(delayMs) {
|
|
186
|
+
if (this.exited)
|
|
187
|
+
return;
|
|
188
|
+
this.titlePollTimer = setTimeout(() => {
|
|
189
|
+
void this.runTitlePoll();
|
|
190
|
+
}, delayMs);
|
|
191
|
+
this.titlePollTimer.unref();
|
|
192
|
+
}
|
|
193
|
+
async runTitlePoll() {
|
|
194
|
+
if (this.exited)
|
|
195
|
+
return;
|
|
196
|
+
try {
|
|
197
|
+
const liveCwd = this.osc7Detected ? this.lastEmittedCwd || null : await this.resolveLiveCwd();
|
|
198
|
+
if (this.exited)
|
|
199
|
+
return;
|
|
200
|
+
if (!this.osc7Detected && liveCwd && liveCwd !== this.lastEmittedCwd) {
|
|
201
|
+
this.lastEmittedCwd = liveCwd;
|
|
202
|
+
this.emit("cwd", liveCwd);
|
|
203
|
+
}
|
|
204
|
+
const nextTitle = this.computeTitle(liveCwd);
|
|
205
|
+
if (nextTitle && nextTitle !== this.lastEmittedTitle) {
|
|
206
|
+
this.lastEmittedTitle = nextTitle;
|
|
207
|
+
this.emit("title", nextTitle);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
catch {
|
|
211
|
+
/* polling errors are non-fatal; the next tick will retry */
|
|
212
|
+
}
|
|
213
|
+
finally {
|
|
214
|
+
this.scheduleTitlePoll(TITLE_POLL_INTERVAL_MS);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
computeTitle(liveCwd) {
|
|
218
|
+
let foreground = "";
|
|
219
|
+
try {
|
|
220
|
+
foreground = this.pty.process?.trim() ?? "";
|
|
221
|
+
}
|
|
222
|
+
catch {
|
|
223
|
+
// pty.process can throw in some node-pty versions when the process is destroyed
|
|
224
|
+
}
|
|
225
|
+
if (foreground && foreground !== this.shellName)
|
|
226
|
+
return foreground;
|
|
227
|
+
return formatWorkingDirectoryTitle(liveCwd ?? this.cwd);
|
|
228
|
+
}
|
|
229
|
+
async resolveLiveCwd() {
|
|
230
|
+
const now = Date.now();
|
|
231
|
+
if (now < this.nextCwdResolveAt)
|
|
232
|
+
return null;
|
|
233
|
+
const liveCwd = await resolveCwdForPid(this.pid).catch(() => null);
|
|
234
|
+
this.nextCwdResolveAt =
|
|
235
|
+
now + (liveCwd === null ? CWD_RESOLVE_BACKOFF_MS : CWD_RESOLVE_COOLDOWN_MS);
|
|
236
|
+
return liveCwd;
|
|
237
|
+
}
|
|
238
|
+
stopTitlePolling() {
|
|
239
|
+
if (this.titlePollTimer === null)
|
|
240
|
+
return;
|
|
241
|
+
clearTimeout(this.titlePollTimer);
|
|
242
|
+
this.titlePollTimer = null;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/session/session.ts"],"names":[],"mappings":"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"}
|
package/dist/session.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { EventEmitter } from "node:events";
|
|
2
|
-
import type
|
|
2
|
+
import { type CommandBoundary } from "./utils/parse-osc133-from-chunk.js";
|
|
3
3
|
import type { SpawnPtyInput } from "./types.js";
|
|
4
4
|
interface SessionEvents {
|
|
5
5
|
output: [data: string];
|
package/dist/session.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAsB3C,OAAO,EAAwB,KAAK,eAAe,EAAE,MAAM,oCAAoC,CAAC;AAEhG,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAIhD,UAAU,aAAa;IACrB,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACvB,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC;IAC5B,KAAK,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACvB,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACnB,eAAe,EAAE,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;CAC9C;AAED,qBAAa,OAAQ,SAAQ,YAAY,CAAC,aAAa,CAAC;IACtD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC;IAEjC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAO;IAC3B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,gBAAgB,CAAM;IAC9B,OAAO,CAAC,cAAc,CAAM;IAC5B,OAAO,CAAC,gBAAgB,CAAK;IAC7B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA0C;IAC1E,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAA4C;gBAElE,KAAK,EAAE,aAAa;IA+ChC,IAAI,GAAG,IAAI,MAAM,CAEhB;IAED,IAAI,aAAa,IAAI,MAAM,CAE1B;IAED,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAKzB;;;;;;;OAOG;IACH,KAAK,IAAI,IAAI;IAUb;;;OAGG;IACH,MAAM,IAAI,IAAI;IAUd,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAaxC,IAAI,CAAC,MAAM,GAAE,MAAM,CAAC,OAAkB,GAAG,IAAI;IAS7C,OAAO,IAAI,IAAI;IASf,OAAO,CAAC,WAAW;IAiBnB,OAAO,CAAC,iBAAiB;YAQX,YAAY;IAqB1B,OAAO,CAAC,YAAY;YAWN,cAAc;IAS5B,OAAO,CAAC,gBAAgB;CAKzB"}
|