@code-yeongyu/senpi-pty 2026.8.24 → 2026.8.26-2

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/index.d.ts CHANGED
@@ -5,6 +5,7 @@ export { detectNativePtyRuntime, getNativePtyCandidatePaths, getNativePtyHost, t
5
5
  export { type InitialSessionRegistryEntry, isTerminalSessionExited, SessionRegistry, SessionRegistryCapacityError, type SessionRegistryCreateContext, type SessionRegistryCreateOptions, type SessionRegistryEntry, type SessionRegistryOptions, type SessionRegistrySession, type SessionRegistrySweepOptions, sessionIdPrefix, type TerminalSessionSignal, type TerminalSessionState, type TrackedDetachedChild, } from "./registry.ts";
6
6
  export { TerminalScreen, type TerminalScreenOptions, type TerminalScreenSnapshot } from "./screen.ts";
7
7
  export { type CreateNativeTerminalSession, createTerminalSession, TerminalSession, type TerminalSessionBackend, type TerminalSessionDataHandler, type TerminalSessionDependencies, type TerminalSessionExit, type TerminalSessionExitError, type TerminalSessionExitState, type TerminalSessionHandle, type TerminalSessionNativeOptions, type TerminalSessionOperationResult, type TerminalSessionOptions, } from "./session.ts";
8
+ export { type BunRuntime, type BunRuntimeVersions, type BunTerminal, createBunTerminalSession, ENV_BUN_TERMINAL, isBunTerminalEnabled, } from "./session-bun.ts";
8
9
  export type PtySessionOptions = TerminalSessionOptions;
9
10
  export declare class PtySession extends BaseTerminalSession {
10
11
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC7E,OAAO,EAAE,eAAe,IAAI,mBAAmB,EAAE,KAAK,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAEnG,YAAY,EACX,gBAAgB,EAChB,mBAAmB,EACnB,8BAA8B,GAC9B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACN,sBAAsB,EACtB,0BAA0B,EAC1B,gBAAgB,EAChB,KAAK,gBAAgB,EACrB,8BAA8B,GAC9B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACN,KAAK,2BAA2B,EAChC,uBAAuB,EACvB,eAAe,EACf,4BAA4B,EAC5B,KAAK,4BAA4B,EACjC,KAAK,4BAA4B,EACjC,KAAK,oBAAoB,EACzB,KAAK,sBAAsB,EAC3B,KAAK,sBAAsB,EAC3B,KAAK,2BAA2B,EAChC,eAAe,EACf,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EACzB,KAAK,oBAAoB,GACzB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,cAAc,EAAE,KAAK,qBAAqB,EAAE,KAAK,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACtG,OAAO,EACN,KAAK,2BAA2B,EAChC,qBAAqB,EACrB,eAAe,EACf,KAAK,sBAAsB,EAC3B,KAAK,0BAA0B,EAC/B,KAAK,2BAA2B,EAChC,KAAK,mBAAmB,EACxB,KAAK,wBAAwB,EAC7B,KAAK,wBAAwB,EAC7B,KAAK,qBAAqB,EAC1B,KAAK,4BAA4B,EACjC,KAAK,8BAA8B,EACnC,KAAK,sBAAsB,GAC3B,MAAM,cAAc,CAAC;AAEtB,MAAM,MAAM,iBAAiB,GAAG,sBAAsB,CAAC;AAEvD,qBAAa,UAAW,SAAQ,mBAAmB;CAAG;AAEtD,wBAAgB,aAAa,IAAI,mBAAmB,CAEnD"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC7E,OAAO,EAAE,eAAe,IAAI,mBAAmB,EAAE,KAAK,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAEnG,YAAY,EACX,gBAAgB,EAChB,mBAAmB,EACnB,8BAA8B,GAC9B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACN,sBAAsB,EACtB,0BAA0B,EAC1B,gBAAgB,EAChB,KAAK,gBAAgB,EACrB,8BAA8B,GAC9B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACN,KAAK,2BAA2B,EAChC,uBAAuB,EACvB,eAAe,EACf,4BAA4B,EAC5B,KAAK,4BAA4B,EACjC,KAAK,4BAA4B,EACjC,KAAK,oBAAoB,EACzB,KAAK,sBAAsB,EAC3B,KAAK,sBAAsB,EAC3B,KAAK,2BAA2B,EAChC,eAAe,EACf,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EACzB,KAAK,oBAAoB,GACzB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,cAAc,EAAE,KAAK,qBAAqB,EAAE,KAAK,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACtG,OAAO,EACN,KAAK,2BAA2B,EAChC,qBAAqB,EACrB,eAAe,EACf,KAAK,sBAAsB,EAC3B,KAAK,0BAA0B,EAC/B,KAAK,2BAA2B,EAChC,KAAK,mBAAmB,EACxB,KAAK,wBAAwB,EAC7B,KAAK,wBAAwB,EAC7B,KAAK,qBAAqB,EAC1B,KAAK,4BAA4B,EACjC,KAAK,8BAA8B,EACnC,KAAK,sBAAsB,GAC3B,MAAM,cAAc,CAAC;AACtB,OAAO,EACN,KAAK,UAAU,EACf,KAAK,kBAAkB,EACvB,KAAK,WAAW,EAChB,wBAAwB,EACxB,gBAAgB,EAChB,oBAAoB,GACpB,MAAM,kBAAkB,CAAC;AAE1B,MAAM,MAAM,iBAAiB,GAAG,sBAAsB,CAAC;AAEvD,qBAAa,UAAW,SAAQ,mBAAmB;CAAG;AAEtD,wBAAgB,aAAa,IAAI,mBAAmB,CAEnD"}
package/dist/index.js CHANGED
@@ -4,6 +4,7 @@ export { detectNativePtyRuntime, getNativePtyCandidatePaths, getNativePtyHost, N
4
4
  export { isTerminalSessionExited, SessionRegistry, SessionRegistryCapacityError, sessionIdPrefix, } from "./registry.js";
5
5
  export { TerminalScreen } from "./screen.js";
6
6
  export { createTerminalSession, TerminalSession, } from "./session.js";
7
+ export { createBunTerminalSession, ENV_BUN_TERMINAL, isBunTerminalEnabled, } from "./session-bun.js";
7
8
  export class PtySession extends BaseTerminalSession {
8
9
  }
9
10
  export function loadPtyNative() {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAA4B,MAAM,oBAAoB,CAAC;AAC7E,OAAO,EAAE,eAAe,IAAI,mBAAmB,EAA+B,MAAM,cAAc,CAAC;AAOnG,OAAO,EACN,sBAAsB,EACtB,0BAA0B,EAC1B,gBAAgB,EAEhB,8BAA8B,GAC9B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAEN,uBAAuB,EACvB,eAAe,EACf,4BAA4B,EAO5B,eAAe,GAIf,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,cAAc,EAA2D,MAAM,aAAa,CAAC;AACtG,OAAO,EAEN,qBAAqB,EACrB,eAAe,GAWf,MAAM,cAAc,CAAC;AAItB,MAAM,OAAO,UAAW,SAAQ,mBAAmB;CAAG;AAEtD,MAAM,UAAU,aAAa;IAC5B,OAAO,aAAa,EAAE,CAAC;AACxB,CAAC","sourcesContent":["import { loadNativePty, type NativePtyLoadResult } from \"./native-loader.ts\";\nimport { TerminalSession as BaseTerminalSession, type TerminalSessionOptions } from \"./session.ts\";\n\nexport type {\n\tNativePtyBinding,\n\tNativePtyLoadResult,\n\tNativePtyUnavailableDiagnostic,\n} from \"./native-loader.ts\";\nexport {\n\tdetectNativePtyRuntime,\n\tgetNativePtyCandidatePaths,\n\tgetNativePtyHost,\n\ttype NativePtyRuntime,\n\tNativePtySentinelMismatchError,\n} from \"./native-loader.ts\";\nexport {\n\ttype InitialSessionRegistryEntry,\n\tisTerminalSessionExited,\n\tSessionRegistry,\n\tSessionRegistryCapacityError,\n\ttype SessionRegistryCreateContext,\n\ttype SessionRegistryCreateOptions,\n\ttype SessionRegistryEntry,\n\ttype SessionRegistryOptions,\n\ttype SessionRegistrySession,\n\ttype SessionRegistrySweepOptions,\n\tsessionIdPrefix,\n\ttype TerminalSessionSignal,\n\ttype TerminalSessionState,\n\ttype TrackedDetachedChild,\n} from \"./registry.ts\";\nexport { TerminalScreen, type TerminalScreenOptions, type TerminalScreenSnapshot } from \"./screen.ts\";\nexport {\n\ttype CreateNativeTerminalSession,\n\tcreateTerminalSession,\n\tTerminalSession,\n\ttype TerminalSessionBackend,\n\ttype TerminalSessionDataHandler,\n\ttype TerminalSessionDependencies,\n\ttype TerminalSessionExit,\n\ttype TerminalSessionExitError,\n\ttype TerminalSessionExitState,\n\ttype TerminalSessionHandle,\n\ttype TerminalSessionNativeOptions,\n\ttype TerminalSessionOperationResult,\n\ttype TerminalSessionOptions,\n} from \"./session.ts\";\n\nexport type PtySessionOptions = TerminalSessionOptions;\n\nexport class PtySession extends BaseTerminalSession {}\n\nexport function loadPtyNative(): NativePtyLoadResult {\n\treturn loadNativePty();\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAA4B,MAAM,oBAAoB,CAAC;AAC7E,OAAO,EAAE,eAAe,IAAI,mBAAmB,EAA+B,MAAM,cAAc,CAAC;AAOnG,OAAO,EACN,sBAAsB,EACtB,0BAA0B,EAC1B,gBAAgB,EAEhB,8BAA8B,GAC9B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAEN,uBAAuB,EACvB,eAAe,EACf,4BAA4B,EAO5B,eAAe,GAIf,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,cAAc,EAA2D,MAAM,aAAa,CAAC;AACtG,OAAO,EAEN,qBAAqB,EACrB,eAAe,GAWf,MAAM,cAAc,CAAC;AACtB,OAAO,EAIN,wBAAwB,EACxB,gBAAgB,EAChB,oBAAoB,GACpB,MAAM,kBAAkB,CAAC;AAI1B,MAAM,OAAO,UAAW,SAAQ,mBAAmB;CAAG;AAEtD,MAAM,UAAU,aAAa;IAC5B,OAAO,aAAa,EAAE,CAAC;AACxB,CAAC","sourcesContent":["import { loadNativePty, type NativePtyLoadResult } from \"./native-loader.ts\";\nimport { TerminalSession as BaseTerminalSession, type TerminalSessionOptions } from \"./session.ts\";\n\nexport type {\n\tNativePtyBinding,\n\tNativePtyLoadResult,\n\tNativePtyUnavailableDiagnostic,\n} from \"./native-loader.ts\";\nexport {\n\tdetectNativePtyRuntime,\n\tgetNativePtyCandidatePaths,\n\tgetNativePtyHost,\n\ttype NativePtyRuntime,\n\tNativePtySentinelMismatchError,\n} from \"./native-loader.ts\";\nexport {\n\ttype InitialSessionRegistryEntry,\n\tisTerminalSessionExited,\n\tSessionRegistry,\n\tSessionRegistryCapacityError,\n\ttype SessionRegistryCreateContext,\n\ttype SessionRegistryCreateOptions,\n\ttype SessionRegistryEntry,\n\ttype SessionRegistryOptions,\n\ttype SessionRegistrySession,\n\ttype SessionRegistrySweepOptions,\n\tsessionIdPrefix,\n\ttype TerminalSessionSignal,\n\ttype TerminalSessionState,\n\ttype TrackedDetachedChild,\n} from \"./registry.ts\";\nexport { TerminalScreen, type TerminalScreenOptions, type TerminalScreenSnapshot } from \"./screen.ts\";\nexport {\n\ttype CreateNativeTerminalSession,\n\tcreateTerminalSession,\n\tTerminalSession,\n\ttype TerminalSessionBackend,\n\ttype TerminalSessionDataHandler,\n\ttype TerminalSessionDependencies,\n\ttype TerminalSessionExit,\n\ttype TerminalSessionExitError,\n\ttype TerminalSessionExitState,\n\ttype TerminalSessionHandle,\n\ttype TerminalSessionNativeOptions,\n\ttype TerminalSessionOperationResult,\n\ttype TerminalSessionOptions,\n} from \"./session.ts\";\nexport {\n\ttype BunRuntime,\n\ttype BunRuntimeVersions,\n\ttype BunTerminal,\n\tcreateBunTerminalSession,\n\tENV_BUN_TERMINAL,\n\tisBunTerminalEnabled,\n} from \"./session-bun.ts\";\n\nexport type PtySessionOptions = TerminalSessionOptions;\n\nexport class PtySession extends BaseTerminalSession {}\n\nexport function loadPtyNative(): NativePtyLoadResult {\n\treturn loadNativePty();\n}\n"]}
@@ -0,0 +1,30 @@
1
+ import type { TerminalSessionDataHandler, TerminalSessionHandle, TerminalSessionNativeOptions, TerminalSessionSignal } from "./session-types.ts";
2
+ export interface BunTerminal {
3
+ readonly write: (data: string | Uint8Array) => void;
4
+ readonly resize: (cols: number, rows: number) => void;
5
+ }
6
+ interface BunSubprocess {
7
+ readonly terminal: BunTerminal;
8
+ readonly exited: Promise<number>;
9
+ kill: (signal?: TerminalSessionSignal) => void;
10
+ }
11
+ interface BunSpawnOptions {
12
+ readonly cwd?: string;
13
+ readonly env?: Readonly<Record<string, string>>;
14
+ readonly terminal: {
15
+ readonly cols: number;
16
+ readonly rows: number;
17
+ readonly data: (terminal: BunTerminal, data: Uint8Array) => void;
18
+ };
19
+ }
20
+ export interface BunRuntimeVersions {
21
+ readonly bun?: unknown;
22
+ }
23
+ export interface BunRuntime {
24
+ readonly spawn: (command: readonly string[], options: BunSpawnOptions) => BunSubprocess;
25
+ }
26
+ export declare const ENV_BUN_TERMINAL = "SENPI_BUN_TERMINAL";
27
+ export declare function isBunTerminalEnabled(env?: Readonly<Record<string, string | undefined>>, versions?: BunRuntimeVersions): boolean;
28
+ export declare function createBunTerminalSession(options: TerminalSessionNativeOptions, onData: TerminalSessionDataHandler, runtime?: BunRuntime): TerminalSessionHandle;
29
+ export {};
30
+ //# sourceMappingURL=session-bun.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-bun.d.ts","sourceRoot":"","sources":["../src/session-bun.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACX,0BAA0B,EAC1B,qBAAqB,EACrB,4BAA4B,EAE5B,qBAAqB,EACrB,MAAM,oBAAoB,CAAC;AAE5B,MAAM,WAAW,WAAW;IAC3B,QAAQ,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,KAAK,IAAI,CAAC;IACpD,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACtD;AAED,UAAU,aAAa;IACtB,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;IAC/B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IACjC,IAAI,EAAE,CAAC,MAAM,CAAC,EAAE,qBAAqB,KAAK,IAAI,CAAC;CAC/C;AAED,UAAU,eAAe;IACxB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAChD,QAAQ,CAAC,QAAQ,EAAE;QAClB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,UAAU,KAAK,IAAI,CAAC;KACjE,CAAC;CACF;AAED,MAAM,WAAW,kBAAkB;IAClC,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,UAAU;IAC1B,QAAQ,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,EAAE,OAAO,EAAE,eAAe,KAAK,aAAa,CAAC;CACxF;AAID,eAAO,MAAM,gBAAgB,uBAAuB,CAAC;AAErD,wBAAgB,oBAAoB,CACnC,GAAG,GAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAe,EAC/D,QAAQ,GAAE,kBAA2D,GACnE,OAAO,CAMT;AAED,wBAAgB,wBAAwB,CACvC,OAAO,EAAE,4BAA4B,EACrC,MAAM,EAAE,0BAA0B,EAClC,OAAO,GAAE,UAA4B,GACnC,qBAAqB,CA0CvB"}
@@ -0,0 +1,76 @@
1
+ import { Buffer } from "node:buffer";
2
+ import process from "node:process";
3
+ const BUN_TERMINAL_NOTE = "Used Bun.spawn terminal backend.";
4
+ export const ENV_BUN_TERMINAL = "SENPI_BUN_TERMINAL";
5
+ export function isBunTerminalEnabled(env = process.env, versions = process.versions) {
6
+ if (typeof versions.bun !== "string")
7
+ return false;
8
+ const value = env[ENV_BUN_TERMINAL];
9
+ if (value === undefined)
10
+ return false;
11
+ const normalized = value.trim().toLowerCase();
12
+ return normalized === "1" || normalized === "true" || normalized === "yes" || normalized === "on";
13
+ }
14
+ export function createBunTerminalSession(options, onData, runtime = getBunRuntime()) {
15
+ if (options.timeoutMs !== undefined && (!Number.isFinite(options.timeoutMs) || options.timeoutMs <= 0)) {
16
+ throw new Error("Invalid timeoutMs: must be a finite positive number");
17
+ }
18
+ const child = runtime.spawn([options.command, ...options.args], {
19
+ cwd: options.cwd,
20
+ env: options.env ? mergeEnvironment(options.env) : undefined,
21
+ terminal: {
22
+ cols: options.cols,
23
+ rows: options.rows,
24
+ data: (_terminal, data) => onData(Buffer.from(data)),
25
+ },
26
+ });
27
+ let timedOut = false;
28
+ let timeoutHandle;
29
+ const exitPromise = child.exited.then((exitCode) => {
30
+ if (timeoutHandle !== undefined)
31
+ clearTimeout(timeoutHandle);
32
+ return { exitCode, signal: null, timedOut };
33
+ });
34
+ if (options.timeoutMs !== undefined) {
35
+ timeoutHandle = setTimeout(() => {
36
+ timedOut = true;
37
+ child.kill("SIGTERM");
38
+ }, options.timeoutMs);
39
+ }
40
+ return {
41
+ write(data) {
42
+ child.terminal.write(data);
43
+ return { ok: true, note: BUN_TERMINAL_NOTE };
44
+ },
45
+ resize(cols, rows) {
46
+ child.terminal.resize(cols, rows);
47
+ return { ok: true, note: `Resized Bun terminal session to ${cols}x${rows}.` };
48
+ },
49
+ kill(signal = "SIGTERM") {
50
+ child.kill(signal);
51
+ return { ok: true, note: `Sent ${signal} to Bun terminal session.` };
52
+ },
53
+ waitExit: async () => await exitPromise,
54
+ };
55
+ }
56
+ function mergeEnvironment(env) {
57
+ const merged = {};
58
+ for (const [key, value] of Object.entries(process.env)) {
59
+ if (value !== undefined)
60
+ merged[key] = value;
61
+ }
62
+ for (const [key, value] of Object.entries(env)) {
63
+ if (value === undefined)
64
+ delete merged[key];
65
+ else
66
+ merged[key] = value;
67
+ }
68
+ return merged;
69
+ }
70
+ function getBunRuntime() {
71
+ const runtime = globalThis.Bun;
72
+ if (!runtime)
73
+ throw new Error("Bun terminal backend is only available in Bun runtimes");
74
+ return runtime;
75
+ }
76
+ //# sourceMappingURL=session-bun.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-bun.js","sourceRoot":"","sources":["../src/session-bun.ts"],"names":[],"mappings":"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","sourcesContent":["import { Buffer } from \"node:buffer\";\nimport process from \"node:process\";\nimport type {\n\tTerminalSessionDataHandler,\n\tTerminalSessionHandle,\n\tTerminalSessionNativeOptions,\n\tTerminalSessionOperationResult,\n\tTerminalSessionSignal,\n} from \"./session-types.ts\";\n\nexport interface BunTerminal {\n\treadonly write: (data: string | Uint8Array) => void;\n\treadonly resize: (cols: number, rows: number) => void;\n}\n\ninterface BunSubprocess {\n\treadonly terminal: BunTerminal;\n\treadonly exited: Promise<number>;\n\tkill: (signal?: TerminalSessionSignal) => void;\n}\n\ninterface BunSpawnOptions {\n\treadonly cwd?: string;\n\treadonly env?: Readonly<Record<string, string>>;\n\treadonly terminal: {\n\t\treadonly cols: number;\n\t\treadonly rows: number;\n\t\treadonly data: (terminal: BunTerminal, data: Uint8Array) => void;\n\t};\n}\n\nexport interface BunRuntimeVersions {\n\treadonly bun?: unknown;\n}\n\nexport interface BunRuntime {\n\treadonly spawn: (command: readonly string[], options: BunSpawnOptions) => BunSubprocess;\n}\n\nconst BUN_TERMINAL_NOTE = \"Used Bun.spawn terminal backend.\";\n\nexport const ENV_BUN_TERMINAL = \"SENPI_BUN_TERMINAL\";\n\nexport function isBunTerminalEnabled(\n\tenv: Readonly<Record<string, string | undefined>> = process.env,\n\tversions: BunRuntimeVersions = process.versions as BunRuntimeVersions,\n): boolean {\n\tif (typeof versions.bun !== \"string\") return false;\n\tconst value = env[ENV_BUN_TERMINAL];\n\tif (value === undefined) return false;\n\tconst normalized = value.trim().toLowerCase();\n\treturn normalized === \"1\" || normalized === \"true\" || normalized === \"yes\" || normalized === \"on\";\n}\n\nexport function createBunTerminalSession(\n\toptions: TerminalSessionNativeOptions,\n\tonData: TerminalSessionDataHandler,\n\truntime: BunRuntime = getBunRuntime(),\n): TerminalSessionHandle {\n\tif (options.timeoutMs !== undefined && (!Number.isFinite(options.timeoutMs) || options.timeoutMs <= 0)) {\n\t\tthrow new Error(\"Invalid timeoutMs: must be a finite positive number\");\n\t}\n\tconst child = runtime.spawn([options.command, ...options.args], {\n\t\tcwd: options.cwd,\n\t\tenv: options.env ? mergeEnvironment(options.env) : undefined,\n\t\tterminal: {\n\t\t\tcols: options.cols,\n\t\t\trows: options.rows,\n\t\t\tdata: (_terminal, data) => onData(Buffer.from(data)),\n\t\t},\n\t});\n\tlet timedOut = false;\n\tlet timeoutHandle: ReturnType<typeof setTimeout> | undefined;\n\tconst exitPromise = child.exited.then((exitCode) => {\n\t\tif (timeoutHandle !== undefined) clearTimeout(timeoutHandle);\n\t\treturn { exitCode, signal: null, timedOut };\n\t});\n\n\tif (options.timeoutMs !== undefined) {\n\t\ttimeoutHandle = setTimeout(() => {\n\t\t\ttimedOut = true;\n\t\t\tchild.kill(\"SIGTERM\");\n\t\t}, options.timeoutMs);\n\t}\n\n\treturn {\n\t\twrite(data) {\n\t\t\tchild.terminal.write(data);\n\t\t\treturn { ok: true, note: BUN_TERMINAL_NOTE } satisfies TerminalSessionOperationResult;\n\t\t},\n\t\tresize(cols, rows) {\n\t\t\tchild.terminal.resize(cols, rows);\n\t\t\treturn { ok: true, note: `Resized Bun terminal session to ${cols}x${rows}.` };\n\t\t},\n\t\tkill(signal = \"SIGTERM\") {\n\t\t\tchild.kill(signal);\n\t\t\treturn { ok: true, note: `Sent ${signal} to Bun terminal session.` };\n\t\t},\n\t\twaitExit: async () => await exitPromise,\n\t};\n}\n\nfunction mergeEnvironment(env: Readonly<Record<string, string | undefined>>): Record<string, string> {\n\tconst merged: Record<string, string> = {};\n\tfor (const [key, value] of Object.entries(process.env)) {\n\t\tif (value !== undefined) merged[key] = value;\n\t}\n\tfor (const [key, value] of Object.entries(env)) {\n\t\tif (value === undefined) delete merged[key];\n\t\telse merged[key] = value;\n\t}\n\treturn merged;\n}\n\nfunction getBunRuntime(): BunRuntime {\n\tconst runtime = (globalThis as { readonly Bun?: BunRuntime }).Bun;\n\tif (!runtime) throw new Error(\"Bun terminal backend is only available in Bun runtimes\");\n\treturn runtime;\n}\n"]}
@@ -1,6 +1,6 @@
1
1
  import type { Buffer } from "node:buffer";
2
2
  import type { NativePtyLoadResult } from "./native-loader.ts";
3
- export type TerminalSessionBackend = "native" | "pipe-fallback";
3
+ export type TerminalSessionBackend = "native" | "pipe-fallback" | "bun";
4
4
  export type TerminalSessionDataHandler = (chunk: Buffer) => void;
5
5
  export type TerminalSessionSignal = NodeJS.Signals;
6
6
  export interface TerminalSessionOptions {
@@ -60,5 +60,7 @@ export interface TerminalSessionDependencies {
60
60
  readonly nativeLoadResult?: NativePtyLoadResult;
61
61
  readonly createNativeSession?: CreateNativeTerminalSession;
62
62
  readonly env?: Readonly<Record<string, string | undefined>>;
63
+ readonly runtimeVersions?: import("./session-bun.ts").BunRuntimeVersions;
64
+ readonly bunRuntime?: import("./session-bun.ts").BunRuntime;
63
65
  }
64
66
  //# sourceMappingURL=session-types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"session-types.d.ts","sourceRoot":"","sources":["../src/session-types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"session-types.d.ts","sourceRoot":"","sources":["../src/session-types.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"session-types.js","sourceRoot":"","sources":["../src/session-types.ts"],"names":[],"mappings":"","sourcesContent":["import type { Buffer } from \"node:buffer\";\nimport type { NativePtyLoadResult } from \"./native-loader.ts\";\n\nexport type TerminalSessionBackend = \"native\" | \"pipe-fallback\";\nexport type TerminalSessionDataHandler = (chunk: Buffer) => void;\nexport type TerminalSessionSignal = NodeJS.Signals;\n\nexport interface TerminalSessionOptions {\n\treadonly command?: string;\n\treadonly args?: readonly string[];\n\treadonly cwd?: string;\n\treadonly env?: Readonly<Record<string, string | undefined>>;\n\treadonly cols?: number;\n\treadonly rows?: number;\n\treadonly timeoutMs?: number;\n\treadonly rawTailBytes?: number;\n}\n\nexport interface TerminalSessionNativeOptions {\n\treadonly command: string;\n\treadonly args: readonly string[];\n\treadonly cwd?: string;\n\treadonly env?: Readonly<Record<string, string | undefined>>;\n\treadonly cols: number;\n\treadonly rows: number;\n\treadonly timeoutMs?: number;\n}\n\nexport interface TerminalSessionOperationResult {\n\treadonly ok: boolean;\n\treadonly note: string;\n\treadonly code?: string;\n\treadonly idempotent?: boolean;\n}\n\nexport interface TerminalSessionExitError {\n\treadonly code: string;\n\treadonly message: string;\n}\n\nexport interface TerminalSessionExit {\n\treadonly backend: TerminalSessionBackend;\n\treadonly exitCode: number | null;\n\treadonly signal: string | null;\n\treadonly cancelled: boolean;\n\treadonly timedOut: boolean;\n\treadonly error?: TerminalSessionExitError;\n}\n\nexport type TerminalSessionExitState =\n\t| {\n\t\t\treadonly status: \"not_started\" | \"running\";\n\t\t\treadonly exit: null;\n\t }\n\t| {\n\t\t\treadonly status: \"exited\";\n\t\t\treadonly exit: TerminalSessionExit;\n\t };\n\nexport interface TerminalSessionHandle {\n\treadonly onData?: (handler: TerminalSessionDataHandler) => () => void;\n\treadonly write: (data: string | Uint8Array) => TerminalSessionOperationResult | undefined;\n\treadonly resize: (cols: number, rows: number) => TerminalSessionOperationResult | undefined;\n\treadonly kill: (signal?: TerminalSessionSignal) => TerminalSessionOperationResult | undefined;\n\treadonly waitExit?: () => Promise<unknown>;\n\treadonly wait?: () => Promise<unknown>;\n}\n\nexport type CreateNativeTerminalSession = (\n\toptions: TerminalSessionNativeOptions,\n\tonData: TerminalSessionDataHandler,\n) => TerminalSessionHandle;\n\nexport interface TerminalSessionDependencies {\n\treadonly nativeLoadResult?: NativePtyLoadResult;\n\treadonly createNativeSession?: CreateNativeTerminalSession;\n\treadonly env?: Readonly<Record<string, string | undefined>>;\n}\n"]}
1
+ {"version":3,"file":"session-types.js","sourceRoot":"","sources":["../src/session-types.ts"],"names":[],"mappings":"","sourcesContent":["import type { Buffer } from \"node:buffer\";\nimport type { NativePtyLoadResult } from \"./native-loader.ts\";\n\nexport type TerminalSessionBackend = \"native\" | \"pipe-fallback\" | \"bun\";\nexport type TerminalSessionDataHandler = (chunk: Buffer) => void;\nexport type TerminalSessionSignal = NodeJS.Signals;\n\nexport interface TerminalSessionOptions {\n\treadonly command?: string;\n\treadonly args?: readonly string[];\n\treadonly cwd?: string;\n\treadonly env?: Readonly<Record<string, string | undefined>>;\n\treadonly cols?: number;\n\treadonly rows?: number;\n\treadonly timeoutMs?: number;\n\treadonly rawTailBytes?: number;\n}\n\nexport interface TerminalSessionNativeOptions {\n\treadonly command: string;\n\treadonly args: readonly string[];\n\treadonly cwd?: string;\n\treadonly env?: Readonly<Record<string, string | undefined>>;\n\treadonly cols: number;\n\treadonly rows: number;\n\treadonly timeoutMs?: number;\n}\n\nexport interface TerminalSessionOperationResult {\n\treadonly ok: boolean;\n\treadonly note: string;\n\treadonly code?: string;\n\treadonly idempotent?: boolean;\n}\n\nexport interface TerminalSessionExitError {\n\treadonly code: string;\n\treadonly message: string;\n}\n\nexport interface TerminalSessionExit {\n\treadonly backend: TerminalSessionBackend;\n\treadonly exitCode: number | null;\n\treadonly signal: string | null;\n\treadonly cancelled: boolean;\n\treadonly timedOut: boolean;\n\treadonly error?: TerminalSessionExitError;\n}\n\nexport type TerminalSessionExitState =\n\t| {\n\t\t\treadonly status: \"not_started\" | \"running\";\n\t\t\treadonly exit: null;\n\t }\n\t| {\n\t\t\treadonly status: \"exited\";\n\t\t\treadonly exit: TerminalSessionExit;\n\t };\n\nexport interface TerminalSessionHandle {\n\treadonly onData?: (handler: TerminalSessionDataHandler) => () => void;\n\treadonly write: (data: string | Uint8Array) => TerminalSessionOperationResult | undefined;\n\treadonly resize: (cols: number, rows: number) => TerminalSessionOperationResult | undefined;\n\treadonly kill: (signal?: TerminalSessionSignal) => TerminalSessionOperationResult | undefined;\n\treadonly waitExit?: () => Promise<unknown>;\n\treadonly wait?: () => Promise<unknown>;\n}\n\nexport type CreateNativeTerminalSession = (\n\toptions: TerminalSessionNativeOptions,\n\tonData: TerminalSessionDataHandler,\n) => TerminalSessionHandle;\n\nexport interface TerminalSessionDependencies {\n\treadonly nativeLoadResult?: NativePtyLoadResult;\n\treadonly createNativeSession?: CreateNativeTerminalSession;\n\treadonly env?: Readonly<Record<string, string | undefined>>;\n\treadonly runtimeVersions?: import(\"./session-bun.ts\").BunRuntimeVersions;\n\treadonly bunRuntime?: import(\"./session-bun.ts\").BunRuntime;\n}\n"]}
package/dist/session.d.ts CHANGED
@@ -7,6 +7,8 @@ export declare class TerminalSession {
7
7
  private readonly nativeLoadResult;
8
8
  private readonly createNativeSessionDependency?;
9
9
  private readonly env;
10
+ private readonly runtimeVersions;
11
+ private readonly bunRuntime;
10
12
  private readonly rawTailLimit;
11
13
  private readonly dataHandlers;
12
14
  private readonly exitHandlers;
@@ -1 +1 @@
1
- {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,OAAO,EAAiB,KAAK,mBAAmB,EAAE,KAAK,8BAA8B,EAAE,MAAM,oBAAoB,CAAC;AAUlH,OAAO,KAAK,EAEX,sBAAsB,EACtB,0BAA0B,EAC1B,2BAA2B,EAC3B,mBAAmB,EACnB,wBAAwB,EAExB,8BAA8B,EAC9B,sBAAsB,EACtB,qBAAqB,EACrB,MAAM,oBAAoB,CAAC;AAE5B,YAAY,EACX,2BAA2B,EAC3B,sBAAsB,EACtB,0BAA0B,EAC1B,2BAA2B,EAC3B,mBAAmB,EACnB,wBAAwB,EACxB,wBAAwB,EACxB,qBAAqB,EACrB,4BAA4B,EAC5B,8BAA8B,EAC9B,sBAAsB,EACtB,qBAAqB,GACrB,MAAM,oBAAoB,CAAC;AAE5B,qBAAa,eAAe;IAC3B,QAAQ,CAAC,OAAO,EAAE,sBAAsB,CAAC;IACzC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAsB;IACvD,OAAO,CAAC,QAAQ,CAAC,6BAA6B,CAAC,CAA8B;IAC7E,OAAO,CAAC,QAAQ,CAAC,GAAG,CAA+C;IACnE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAyC;IACtE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAyB;IACtD,OAAO,CAAC,aAAa,CAAsC;IAC3D,OAAO,CAAC,YAAY,CAAuC;IAC3D,OAAO,CAAC,WAAW,CAA6C;IAChE,OAAO,CAAC,WAAW,CAAoC;IACvD,OAAO,CAAC,aAAa,CAAmB;IACxC,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,sBAAsB,CAA6B;gBAE/C,OAAO,GAAE,sBAA2B,EAAE,YAAY,GAAE,2BAAgC;IAYhG,IAAI,MAAM,IAAI,mBAAmB,CAEhC;IAED,IAAI,qBAAqB,IAAI,8BAA8B,GAAG,IAAI,CAGjE;IAED,IAAI,OAAO,IAAI,sBAAsB,GAAG,IAAI,CAE3C;IAED,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED,IAAI,MAAM,IAAI,aAAa,GAAG,SAAS,GAAG,QAAQ,CAEjD;IAED,IAAI,MAAM,IAAI,OAAO,CAEpB;IAED,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED,IAAI,UAAU,IAAI,mBAAmB,GAAG,IAAI,CAE3C;IAED,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED,IAAI,cAAc,IAAI,MAAM,CAE3B;IAED,IAAI,SAAS,IAAI,wBAAwB,CAGxC;IAED,KAAK,IAAI,IAAI;IA6Bb,MAAM,CAAC,OAAO,EAAE,0BAA0B,GAAG,MAAM,IAAI;IAKvD,MAAM,CAAC,OAAO,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI;IAMvC,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,8BAA8B;IAOhE,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,8BAA8B;IAOlE,IAAI,CAAC,MAAM,GAAE,qBAAiC,GAAG,8BAA8B;IAiB/E,IAAI,IAAI,8BAA8B;IAIhC,QAAQ,IAAI,OAAO,CAAC,mBAAmB,CAAC;YAMhC,eAAe;IAU7B,OAAO,CAAC,UAAU;IAUlB,OAAO,CAAC,QAAQ;IAMhB,OAAO,CAAC,aAAa;CAUrB;AAED,wBAAgB,qBAAqB,CACpC,OAAO,GAAE,sBAA2B,EACpC,YAAY,GAAE,2BAAgC,GAC5C,eAAe,CAEjB"}
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,OAAO,EAAiB,KAAK,mBAAmB,EAAE,KAAK,8BAA8B,EAAE,MAAM,oBAAoB,CAAC;AAWlH,OAAO,KAAK,EAEX,sBAAsB,EACtB,0BAA0B,EAC1B,2BAA2B,EAC3B,mBAAmB,EACnB,wBAAwB,EAExB,8BAA8B,EAC9B,sBAAsB,EACtB,qBAAqB,EACrB,MAAM,oBAAoB,CAAC;AAE5B,YAAY,EACX,2BAA2B,EAC3B,sBAAsB,EACtB,0BAA0B,EAC1B,2BAA2B,EAC3B,mBAAmB,EACnB,wBAAwB,EACxB,wBAAwB,EACxB,qBAAqB,EACrB,4BAA4B,EAC5B,8BAA8B,EAC9B,sBAAsB,EACtB,qBAAqB,GACrB,MAAM,oBAAoB,CAAC;AAE5B,qBAAa,eAAe;IAC3B,QAAQ,CAAC,OAAO,EAAE,sBAAsB,CAAC;IACzC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAsB;IACvD,OAAO,CAAC,QAAQ,CAAC,6BAA6B,CAAC,CAA8B;IAC7E,OAAO,CAAC,QAAQ,CAAC,GAAG,CAA+C;IACnE,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAgD;IAChF,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAoD;IAC/E,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAyC;IACtE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAyB;IACtD,OAAO,CAAC,aAAa,CAAsC;IAC3D,OAAO,CAAC,YAAY,CAAuC;IAC3D,OAAO,CAAC,WAAW,CAA6C;IAChE,OAAO,CAAC,WAAW,CAAoC;IACvD,OAAO,CAAC,aAAa,CAAmB;IACxC,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,sBAAsB,CAA6B;gBAE/C,OAAO,GAAE,sBAA2B,EAAE,YAAY,GAAE,2BAAgC;IAehG,IAAI,MAAM,IAAI,mBAAmB,CAEhC;IAED,IAAI,qBAAqB,IAAI,8BAA8B,GAAG,IAAI,CAGjE;IAED,IAAI,OAAO,IAAI,sBAAsB,GAAG,IAAI,CAE3C;IAED,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED,IAAI,MAAM,IAAI,aAAa,GAAG,SAAS,GAAG,QAAQ,CAEjD;IAED,IAAI,MAAM,IAAI,OAAO,CAEpB;IAED,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED,IAAI,UAAU,IAAI,mBAAmB,GAAG,IAAI,CAE3C;IAED,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED,IAAI,cAAc,IAAI,MAAM,CAE3B;IAED,IAAI,SAAS,IAAI,wBAAwB,CAGxC;IAED,KAAK,IAAI,IAAI;IAsCb,MAAM,CAAC,OAAO,EAAE,0BAA0B,GAAG,MAAM,IAAI;IAKvD,MAAM,CAAC,OAAO,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI;IAMvC,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,8BAA8B;IAOhE,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,8BAA8B;IAOlE,IAAI,CAAC,MAAM,GAAE,qBAAiC,GAAG,8BAA8B;IAiB/E,IAAI,IAAI,8BAA8B;IAIhC,QAAQ,IAAI,OAAO,CAAC,mBAAmB,CAAC;YAMhC,eAAe;IAU7B,OAAO,CAAC,UAAU;IAUlB,OAAO,CAAC,QAAQ;IAMhB,OAAO,CAAC,aAAa;CAUrB;AAED,wBAAgB,qBAAqB,CACpC,OAAO,GAAE,sBAA2B,EACpC,YAAY,GAAE,2BAAgC,GAC5C,eAAe,CAEjB"}
package/dist/session.js CHANGED
@@ -2,6 +2,7 @@ import { Buffer } from "node:buffer";
2
2
  import process from "node:process";
3
3
  import { loadNativePty } from "./native-loader.js";
4
4
  import { PipeFallbackSession, shouldUsePipeFallback } from "./pipe-fallback.js";
5
+ import { createBunTerminalSession, isBunTerminalEnabled } from "./session-bun.js";
5
6
  import { exitedOperation, normalizeOperationResult, normalizeTerminalExit, notStartedOperation, } from "./session-exit.js";
6
7
  import { getNativeSessionFactory } from "./session-native.js";
7
8
  import { defaultCommand, normalizeRawTailBytes, toNativeOptions, toPipeFallbackOptions } from "./session-options.js";
@@ -25,6 +26,9 @@ export class TerminalSession {
25
26
  this.nativeLoadResult = dependencies.nativeLoadResult ?? loadNativePty();
26
27
  this.createNativeSessionDependency = dependencies.createNativeSession;
27
28
  this.env = dependencies.env ?? process.env;
29
+ this.runtimeVersions =
30
+ dependencies.runtimeVersions ?? process.versions;
31
+ this.bunRuntime = dependencies.bunRuntime;
28
32
  this.rawTailLimit = normalizeRawTailBytes(options.rawTailBytes);
29
33
  }
30
34
  get native() {
@@ -69,17 +73,23 @@ export class TerminalSession {
69
73
  throw new Error("Cannot restart exited terminal session");
70
74
  if (this.backendHandle !== null)
71
75
  throw new Error("Terminal session has already been started");
72
- const nativeFactory = this.createNativeSessionDependency ?? getNativeSessionFactory(this.nativeLoadResult);
73
- if (nativeFactory && !shouldUsePipeFallback(this.nativeLoadResult, this.env)) {
74
- this.backendValue = "native";
75
- this.backendHandle = nativeFactory(toNativeOptions(this.options), (chunk) => this.emitData(chunk));
76
+ if (isBunTerminalEnabled(this.env, this.runtimeVersions)) {
77
+ this.backendValue = "bun";
78
+ this.backendHandle = createBunTerminalSession(toNativeOptions(this.options), (chunk) => this.emitData(chunk), this.bunRuntime);
76
79
  }
77
80
  else {
78
- this.backendValue = "pipe-fallback";
79
- const fallback = new PipeFallbackSession(toPipeFallbackOptions(this.options));
80
- this.backendHandle = fallback;
81
- this.unsubscribeBackendData = fallback.onData((chunk) => this.emitData(chunk));
82
- fallback.start();
81
+ const nativeFactory = this.createNativeSessionDependency ?? getNativeSessionFactory(this.nativeLoadResult);
82
+ if (nativeFactory && !shouldUsePipeFallback(this.nativeLoadResult, this.env)) {
83
+ this.backendValue = "native";
84
+ this.backendHandle = nativeFactory(toNativeOptions(this.options), (chunk) => this.emitData(chunk));
85
+ }
86
+ else {
87
+ this.backendValue = "pipe-fallback";
88
+ const fallback = new PipeFallbackSession(toPipeFallbackOptions(this.options));
89
+ this.backendHandle = fallback;
90
+ this.unsubscribeBackendData = fallback.onData((chunk) => this.emitData(chunk));
91
+ fallback.start();
92
+ }
83
93
  }
84
94
  const backendHandle = this.backendHandle;
85
95
  const backendValue = this.backendValue;
@@ -1 +1 @@
1
- {"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"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","sourcesContent":["import { Buffer } from \"node:buffer\";\nimport process from \"node:process\";\nimport { loadNativePty, type NativePtyLoadResult, type NativePtyUnavailableDiagnostic } from \"./native-loader.ts\";\nimport { PipeFallbackSession, shouldUsePipeFallback } from \"./pipe-fallback.ts\";\nimport {\n\texitedOperation,\n\tnormalizeOperationResult,\n\tnormalizeTerminalExit,\n\tnotStartedOperation,\n} from \"./session-exit.ts\";\nimport { getNativeSessionFactory } from \"./session-native.ts\";\nimport { defaultCommand, normalizeRawTailBytes, toNativeOptions, toPipeFallbackOptions } from \"./session-options.ts\";\nimport type {\n\tCreateNativeTerminalSession,\n\tTerminalSessionBackend,\n\tTerminalSessionDataHandler,\n\tTerminalSessionDependencies,\n\tTerminalSessionExit,\n\tTerminalSessionExitState,\n\tTerminalSessionHandle,\n\tTerminalSessionOperationResult,\n\tTerminalSessionOptions,\n\tTerminalSessionSignal,\n} from \"./session-types.ts\";\n\nexport type {\n\tCreateNativeTerminalSession,\n\tTerminalSessionBackend,\n\tTerminalSessionDataHandler,\n\tTerminalSessionDependencies,\n\tTerminalSessionExit,\n\tTerminalSessionExitError,\n\tTerminalSessionExitState,\n\tTerminalSessionHandle,\n\tTerminalSessionNativeOptions,\n\tTerminalSessionOperationResult,\n\tTerminalSessionOptions,\n\tTerminalSessionSignal,\n} from \"./session-types.ts\";\n\nexport class TerminalSession {\n\treadonly options: TerminalSessionOptions;\n\tprivate readonly nativeLoadResult: NativePtyLoadResult;\n\tprivate readonly createNativeSessionDependency?: CreateNativeTerminalSession;\n\tprivate readonly env: Readonly<Record<string, string | undefined>>;\n\tprivate readonly rawTailLimit: number;\n\tprivate readonly dataHandlers = new Set<TerminalSessionDataHandler>();\n\tprivate readonly exitHandlers = new Set<() => void>();\n\tprivate backendHandle: TerminalSessionHandle | null = null;\n\tprivate backendValue: TerminalSessionBackend | null = null;\n\tprivate exitPromise: Promise<TerminalSessionExit> | null = null;\n\tprivate settledExit: TerminalSessionExit | null = null;\n\tprivate rawTailBuffer = Buffer.alloc(0);\n\tprivate rawByteCount = 0;\n\tprivate killRequested = false;\n\tprivate unsubscribeBackendData: (() => void) | null = null;\n\n\tconstructor(options: TerminalSessionOptions = {}, dependencies: TerminalSessionDependencies = {}) {\n\t\tthis.options = {\n\t\t\t...options,\n\t\t\targs: options.args ? [...options.args] : undefined,\n\t\t\tenv: options.env ? { ...options.env } : undefined,\n\t\t};\n\t\tthis.nativeLoadResult = dependencies.nativeLoadResult ?? loadNativePty();\n\t\tthis.createNativeSessionDependency = dependencies.createNativeSession;\n\t\tthis.env = dependencies.env ?? process.env;\n\t\tthis.rawTailLimit = normalizeRawTailBytes(options.rawTailBytes);\n\t}\n\n\tget native(): NativePtyLoadResult {\n\t\treturn this.nativeLoadResult;\n\t}\n\n\tget unavailableDiagnostic(): NativePtyUnavailableDiagnostic | null {\n\t\tif (this.nativeLoadResult.native !== null) return null;\n\t\treturn this.nativeLoadResult.diagnostic;\n\t}\n\n\tget backend(): TerminalSessionBackend | null {\n\t\treturn this.backendValue;\n\t}\n\n\tget command(): string {\n\t\treturn this.options.command ?? defaultCommand();\n\t}\n\n\tget status(): \"not_started\" | \"running\" | \"exited\" {\n\t\treturn this.exitState.status;\n\t}\n\n\tget exited(): boolean {\n\t\treturn this.settledExit !== null;\n\t}\n\n\tget isExited(): boolean {\n\t\treturn this.exited;\n\t}\n\n\tget exitResult(): TerminalSessionExit | null {\n\t\treturn this.settledExit;\n\t}\n\n\tget rawTail(): Buffer {\n\t\treturn Buffer.from(this.rawTailBuffer);\n\t}\n\n\tget rawOutputBytes(): number {\n\t\treturn this.rawByteCount;\n\t}\n\n\tget exitState(): TerminalSessionExitState {\n\t\tif (this.settledExit !== null) return { status: \"exited\", exit: this.settledExit };\n\t\treturn { status: this.backendHandle === null ? \"not_started\" : \"running\", exit: null };\n\t}\n\n\tstart(): this {\n\t\tif (this.settledExit !== null) throw new Error(\"Cannot restart exited terminal session\");\n\t\tif (this.backendHandle !== null) throw new Error(\"Terminal session has already been started\");\n\n\t\tconst nativeFactory = this.createNativeSessionDependency ?? getNativeSessionFactory(this.nativeLoadResult);\n\t\tif (nativeFactory && !shouldUsePipeFallback(this.nativeLoadResult, this.env)) {\n\t\t\tthis.backendValue = \"native\";\n\t\t\tthis.backendHandle = nativeFactory(toNativeOptions(this.options), (chunk) => this.emitData(chunk));\n\t\t} else {\n\t\t\tthis.backendValue = \"pipe-fallback\";\n\t\t\tconst fallback = new PipeFallbackSession(toPipeFallbackOptions(this.options));\n\t\t\tthis.backendHandle = fallback;\n\t\t\tthis.unsubscribeBackendData = fallback.onData((chunk) => this.emitData(chunk));\n\t\t\tfallback.start();\n\t\t}\n\n\t\tconst backendHandle = this.backendHandle;\n\t\tconst backendValue = this.backendValue;\n\t\tif (backendHandle === null || backendValue === null) {\n\t\t\tthrow new Error(\"Terminal session backend did not initialize\");\n\t\t}\n\n\t\tif (backendValue === \"native\" && backendHandle.onData) {\n\t\t\tthis.unsubscribeBackendData = backendHandle.onData((chunk) => this.emitData(chunk));\n\t\t}\n\t\tthis.exitPromise = this.waitBackendExit(backendHandle, backendValue).then((exit) => this.settleExit(exit));\n\t\treturn this;\n\t}\n\n\tonData(handler: TerminalSessionDataHandler): () => void {\n\t\tthis.dataHandlers.add(handler);\n\t\treturn () => this.dataHandlers.delete(handler);\n\t}\n\n\tonExit(handler: () => void): () => void {\n\t\tif (this.settledExit !== null) queueMicrotask(handler);\n\t\telse this.exitHandlers.add(handler);\n\t\treturn () => this.exitHandlers.delete(handler);\n\t}\n\n\twrite(data: string | Uint8Array): TerminalSessionOperationResult {\n\t\tconst handle = this.backendHandle;\n\t\tif (this.settledExit !== null) return exitedOperation(\"write\");\n\t\tif (handle === null) return notStartedOperation(\"write\");\n\t\treturn normalizeOperationResult(handle.write(data), \"Wrote data to terminal session.\");\n\t}\n\n\tresize(cols: number, rows: number): TerminalSessionOperationResult {\n\t\tconst handle = this.backendHandle;\n\t\tif (this.settledExit !== null) return exitedOperation(\"resize\");\n\t\tif (handle === null) return notStartedOperation(\"resize\");\n\t\treturn normalizeOperationResult(handle.resize(cols, rows), `Resized terminal session to ${cols}x${rows}.`);\n\t}\n\n\tkill(signal: TerminalSessionSignal = \"SIGTERM\"): TerminalSessionOperationResult {\n\t\tconst handle = this.backendHandle;\n\t\tif (this.killRequested || this.settledExit !== null) {\n\t\t\treturn {\n\t\t\t\tok: true,\n\t\t\t\tidempotent: true,\n\t\t\t\tnote: \"Terminal session kill was already requested.\",\n\t\t\t};\n\t\t}\n\t\tif (handle === null) return notStartedOperation(\"kill\");\n\n\t\tthis.killRequested = true;\n\t\tconst result = normalizeOperationResult(handle.kill(signal), `Sent ${signal} to terminal session.`);\n\t\tif (!result.ok) this.killRequested = false;\n\t\treturn result;\n\t}\n\n\tstop(): TerminalSessionOperationResult {\n\t\treturn this.kill();\n\t}\n\n\tasync waitExit(): Promise<TerminalSessionExit> {\n\t\tif (this.settledExit !== null) return this.settledExit;\n\t\tif (this.exitPromise === null) throw new Error(\"Cannot wait for terminal session exit before start\");\n\t\treturn await this.exitPromise;\n\t}\n\n\tprivate async waitBackendExit(\n\t\thandle: TerminalSessionHandle,\n\t\tbackend: TerminalSessionBackend,\n\t): Promise<TerminalSessionExit> {\n\t\tconst wait = handle.waitExit ?? handle.wait;\n\t\tif (!wait) throw new Error(\"Terminal session backend does not expose waitExit or wait\");\n\t\tconst exit = await wait.call(handle);\n\t\treturn normalizeTerminalExit(exit, backend, this.killRequested);\n\t}\n\n\tprivate settleExit(exit: TerminalSessionExit): TerminalSessionExit {\n\t\tif (this.settledExit !== null) return this.settledExit;\n\t\tthis.settledExit = exit;\n\t\tthis.unsubscribeBackendData?.();\n\t\tthis.unsubscribeBackendData = null;\n\t\tfor (const handler of this.exitHandlers) handler();\n\t\tthis.exitHandlers.clear();\n\t\treturn exit;\n\t}\n\n\tprivate emitData(chunk: Buffer | Uint8Array | string): void {\n\t\tconst buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);\n\t\tthis.appendRawTail(buffer);\n\t\tfor (const handler of this.dataHandlers) handler(buffer);\n\t}\n\n\tprivate appendRawTail(chunk: Buffer): void {\n\t\tthis.rawByteCount += chunk.byteLength;\n\t\tif (this.rawTailLimit === 0) {\n\t\t\tthis.rawTailBuffer = Buffer.alloc(0);\n\t\t\treturn;\n\t\t}\n\t\tconst next = Buffer.concat([this.rawTailBuffer, chunk]);\n\t\tthis.rawTailBuffer =\n\t\t\tnext.byteLength <= this.rawTailLimit ? next : next.subarray(next.byteLength - this.rawTailLimit);\n\t}\n}\n\nexport function createTerminalSession(\n\toptions: TerminalSessionOptions = {},\n\tdependencies: TerminalSessionDependencies = {},\n): TerminalSession {\n\treturn new TerminalSession(options, dependencies).start();\n}\n"]}
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"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","sourcesContent":["import { Buffer } from \"node:buffer\";\nimport process from \"node:process\";\nimport { loadNativePty, type NativePtyLoadResult, type NativePtyUnavailableDiagnostic } from \"./native-loader.ts\";\nimport { PipeFallbackSession, shouldUsePipeFallback } from \"./pipe-fallback.ts\";\nimport { createBunTerminalSession, isBunTerminalEnabled } from \"./session-bun.ts\";\nimport {\n\texitedOperation,\n\tnormalizeOperationResult,\n\tnormalizeTerminalExit,\n\tnotStartedOperation,\n} from \"./session-exit.ts\";\nimport { getNativeSessionFactory } from \"./session-native.ts\";\nimport { defaultCommand, normalizeRawTailBytes, toNativeOptions, toPipeFallbackOptions } from \"./session-options.ts\";\nimport type {\n\tCreateNativeTerminalSession,\n\tTerminalSessionBackend,\n\tTerminalSessionDataHandler,\n\tTerminalSessionDependencies,\n\tTerminalSessionExit,\n\tTerminalSessionExitState,\n\tTerminalSessionHandle,\n\tTerminalSessionOperationResult,\n\tTerminalSessionOptions,\n\tTerminalSessionSignal,\n} from \"./session-types.ts\";\n\nexport type {\n\tCreateNativeTerminalSession,\n\tTerminalSessionBackend,\n\tTerminalSessionDataHandler,\n\tTerminalSessionDependencies,\n\tTerminalSessionExit,\n\tTerminalSessionExitError,\n\tTerminalSessionExitState,\n\tTerminalSessionHandle,\n\tTerminalSessionNativeOptions,\n\tTerminalSessionOperationResult,\n\tTerminalSessionOptions,\n\tTerminalSessionSignal,\n} from \"./session-types.ts\";\n\nexport class TerminalSession {\n\treadonly options: TerminalSessionOptions;\n\tprivate readonly nativeLoadResult: NativePtyLoadResult;\n\tprivate readonly createNativeSessionDependency?: CreateNativeTerminalSession;\n\tprivate readonly env: Readonly<Record<string, string | undefined>>;\n\tprivate readonly runtimeVersions: import(\"./session-bun.ts\").BunRuntimeVersions;\n\tprivate readonly bunRuntime: import(\"./session-bun.ts\").BunRuntime | undefined;\n\tprivate readonly rawTailLimit: number;\n\tprivate readonly dataHandlers = new Set<TerminalSessionDataHandler>();\n\tprivate readonly exitHandlers = new Set<() => void>();\n\tprivate backendHandle: TerminalSessionHandle | null = null;\n\tprivate backendValue: TerminalSessionBackend | null = null;\n\tprivate exitPromise: Promise<TerminalSessionExit> | null = null;\n\tprivate settledExit: TerminalSessionExit | null = null;\n\tprivate rawTailBuffer = Buffer.alloc(0);\n\tprivate rawByteCount = 0;\n\tprivate killRequested = false;\n\tprivate unsubscribeBackendData: (() => void) | null = null;\n\n\tconstructor(options: TerminalSessionOptions = {}, dependencies: TerminalSessionDependencies = {}) {\n\t\tthis.options = {\n\t\t\t...options,\n\t\t\targs: options.args ? [...options.args] : undefined,\n\t\t\tenv: options.env ? { ...options.env } : undefined,\n\t\t};\n\t\tthis.nativeLoadResult = dependencies.nativeLoadResult ?? loadNativePty();\n\t\tthis.createNativeSessionDependency = dependencies.createNativeSession;\n\t\tthis.env = dependencies.env ?? process.env;\n\t\tthis.runtimeVersions =\n\t\t\tdependencies.runtimeVersions ?? (process.versions as import(\"./session-bun.ts\").BunRuntimeVersions);\n\t\tthis.bunRuntime = dependencies.bunRuntime;\n\t\tthis.rawTailLimit = normalizeRawTailBytes(options.rawTailBytes);\n\t}\n\n\tget native(): NativePtyLoadResult {\n\t\treturn this.nativeLoadResult;\n\t}\n\n\tget unavailableDiagnostic(): NativePtyUnavailableDiagnostic | null {\n\t\tif (this.nativeLoadResult.native !== null) return null;\n\t\treturn this.nativeLoadResult.diagnostic;\n\t}\n\n\tget backend(): TerminalSessionBackend | null {\n\t\treturn this.backendValue;\n\t}\n\n\tget command(): string {\n\t\treturn this.options.command ?? defaultCommand();\n\t}\n\n\tget status(): \"not_started\" | \"running\" | \"exited\" {\n\t\treturn this.exitState.status;\n\t}\n\n\tget exited(): boolean {\n\t\treturn this.settledExit !== null;\n\t}\n\n\tget isExited(): boolean {\n\t\treturn this.exited;\n\t}\n\n\tget exitResult(): TerminalSessionExit | null {\n\t\treturn this.settledExit;\n\t}\n\n\tget rawTail(): Buffer {\n\t\treturn Buffer.from(this.rawTailBuffer);\n\t}\n\n\tget rawOutputBytes(): number {\n\t\treturn this.rawByteCount;\n\t}\n\n\tget exitState(): TerminalSessionExitState {\n\t\tif (this.settledExit !== null) return { status: \"exited\", exit: this.settledExit };\n\t\treturn { status: this.backendHandle === null ? \"not_started\" : \"running\", exit: null };\n\t}\n\n\tstart(): this {\n\t\tif (this.settledExit !== null) throw new Error(\"Cannot restart exited terminal session\");\n\t\tif (this.backendHandle !== null) throw new Error(\"Terminal session has already been started\");\n\n\t\tif (isBunTerminalEnabled(this.env, this.runtimeVersions)) {\n\t\t\tthis.backendValue = \"bun\";\n\t\t\tthis.backendHandle = createBunTerminalSession(\n\t\t\t\ttoNativeOptions(this.options),\n\t\t\t\t(chunk) => this.emitData(chunk),\n\t\t\t\tthis.bunRuntime,\n\t\t\t);\n\t\t} else {\n\t\t\tconst nativeFactory = this.createNativeSessionDependency ?? getNativeSessionFactory(this.nativeLoadResult);\n\t\t\tif (nativeFactory && !shouldUsePipeFallback(this.nativeLoadResult, this.env)) {\n\t\t\t\tthis.backendValue = \"native\";\n\t\t\t\tthis.backendHandle = nativeFactory(toNativeOptions(this.options), (chunk) => this.emitData(chunk));\n\t\t\t} else {\n\t\t\t\tthis.backendValue = \"pipe-fallback\";\n\t\t\t\tconst fallback = new PipeFallbackSession(toPipeFallbackOptions(this.options));\n\t\t\t\tthis.backendHandle = fallback;\n\t\t\t\tthis.unsubscribeBackendData = fallback.onData((chunk) => this.emitData(chunk));\n\t\t\t\tfallback.start();\n\t\t\t}\n\t\t}\n\n\t\tconst backendHandle = this.backendHandle;\n\t\tconst backendValue = this.backendValue;\n\t\tif (backendHandle === null || backendValue === null) {\n\t\t\tthrow new Error(\"Terminal session backend did not initialize\");\n\t\t}\n\n\t\tif (backendValue === \"native\" && backendHandle.onData) {\n\t\t\tthis.unsubscribeBackendData = backendHandle.onData((chunk) => this.emitData(chunk));\n\t\t}\n\t\tthis.exitPromise = this.waitBackendExit(backendHandle, backendValue).then((exit) => this.settleExit(exit));\n\t\treturn this;\n\t}\n\n\tonData(handler: TerminalSessionDataHandler): () => void {\n\t\tthis.dataHandlers.add(handler);\n\t\treturn () => this.dataHandlers.delete(handler);\n\t}\n\n\tonExit(handler: () => void): () => void {\n\t\tif (this.settledExit !== null) queueMicrotask(handler);\n\t\telse this.exitHandlers.add(handler);\n\t\treturn () => this.exitHandlers.delete(handler);\n\t}\n\n\twrite(data: string | Uint8Array): TerminalSessionOperationResult {\n\t\tconst handle = this.backendHandle;\n\t\tif (this.settledExit !== null) return exitedOperation(\"write\");\n\t\tif (handle === null) return notStartedOperation(\"write\");\n\t\treturn normalizeOperationResult(handle.write(data), \"Wrote data to terminal session.\");\n\t}\n\n\tresize(cols: number, rows: number): TerminalSessionOperationResult {\n\t\tconst handle = this.backendHandle;\n\t\tif (this.settledExit !== null) return exitedOperation(\"resize\");\n\t\tif (handle === null) return notStartedOperation(\"resize\");\n\t\treturn normalizeOperationResult(handle.resize(cols, rows), `Resized terminal session to ${cols}x${rows}.`);\n\t}\n\n\tkill(signal: TerminalSessionSignal = \"SIGTERM\"): TerminalSessionOperationResult {\n\t\tconst handle = this.backendHandle;\n\t\tif (this.killRequested || this.settledExit !== null) {\n\t\t\treturn {\n\t\t\t\tok: true,\n\t\t\t\tidempotent: true,\n\t\t\t\tnote: \"Terminal session kill was already requested.\",\n\t\t\t};\n\t\t}\n\t\tif (handle === null) return notStartedOperation(\"kill\");\n\n\t\tthis.killRequested = true;\n\t\tconst result = normalizeOperationResult(handle.kill(signal), `Sent ${signal} to terminal session.`);\n\t\tif (!result.ok) this.killRequested = false;\n\t\treturn result;\n\t}\n\n\tstop(): TerminalSessionOperationResult {\n\t\treturn this.kill();\n\t}\n\n\tasync waitExit(): Promise<TerminalSessionExit> {\n\t\tif (this.settledExit !== null) return this.settledExit;\n\t\tif (this.exitPromise === null) throw new Error(\"Cannot wait for terminal session exit before start\");\n\t\treturn await this.exitPromise;\n\t}\n\n\tprivate async waitBackendExit(\n\t\thandle: TerminalSessionHandle,\n\t\tbackend: TerminalSessionBackend,\n\t): Promise<TerminalSessionExit> {\n\t\tconst wait = handle.waitExit ?? handle.wait;\n\t\tif (!wait) throw new Error(\"Terminal session backend does not expose waitExit or wait\");\n\t\tconst exit = await wait.call(handle);\n\t\treturn normalizeTerminalExit(exit, backend, this.killRequested);\n\t}\n\n\tprivate settleExit(exit: TerminalSessionExit): TerminalSessionExit {\n\t\tif (this.settledExit !== null) return this.settledExit;\n\t\tthis.settledExit = exit;\n\t\tthis.unsubscribeBackendData?.();\n\t\tthis.unsubscribeBackendData = null;\n\t\tfor (const handler of this.exitHandlers) handler();\n\t\tthis.exitHandlers.clear();\n\t\treturn exit;\n\t}\n\n\tprivate emitData(chunk: Buffer | Uint8Array | string): void {\n\t\tconst buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);\n\t\tthis.appendRawTail(buffer);\n\t\tfor (const handler of this.dataHandlers) handler(buffer);\n\t}\n\n\tprivate appendRawTail(chunk: Buffer): void {\n\t\tthis.rawByteCount += chunk.byteLength;\n\t\tif (this.rawTailLimit === 0) {\n\t\t\tthis.rawTailBuffer = Buffer.alloc(0);\n\t\t\treturn;\n\t\t}\n\t\tconst next = Buffer.concat([this.rawTailBuffer, chunk]);\n\t\tthis.rawTailBuffer =\n\t\t\tnext.byteLength <= this.rawTailLimit ? next : next.subarray(next.byteLength - this.rawTailLimit);\n\t}\n}\n\nexport function createTerminalSession(\n\toptions: TerminalSessionOptions = {},\n\tdependencies: TerminalSessionDependencies = {},\n): TerminalSession {\n\treturn new TerminalSession(options, dependencies).start();\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/senpi-pty",
3
- "version": "2026.8.24",
3
+ "version": "2026.8.26-2",
4
4
  "description": "Typed PTY session loader for Senpi persistent terminals",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",