authorgravatar for julius0216@outlook.comJulius Marminge <julius0216@outlook.com> 2026-02-25 18:10:14-08:00
committergravatar for jmarminge@gmail.comJulius Marminge <jmarminge@gmail.com> 2026-02-26 13:20:36-08:00
log3e58fd6ab77787d1835db1bbdca567b7151b46ba
tree928a45f610afa9c3a7c2260ee3a08ac13ebb1637
parent5a755ada28fa8da9d435f2e1f14697e83f4aa6db

kewl


2 files changed, 14 insertions(+), 18 deletions(-)

apps/server/src/terminal/Layers/Manager.ts+13-2
...@@ -21,8 +21,6 @@ import { ServerConfig } from "../../config";...@@ -21,8 +21,6 @@ import { ServerConfig } from "../../config";
21import {21import {
22 ShellCandidate,22 ShellCandidate,
23 TerminalManager,23 TerminalManager,
24 TerminalManagerEvents,
25 TerminalManagerOptions,
26 TerminalManagerShape,24 TerminalManagerShape,
27 TerminalSessionState,25 TerminalSessionState,
28 TerminalStartInput,26 TerminalStartInput,
...@@ -270,6 +268,19 @@ function normalizedRuntimeEnv(...@@ -270,6 +268,19 @@ function normalizedRuntimeEnv(
270 return Object.fromEntries(entries.toSorted(([left], [right]) => left.localeCompare(right)));268 return Object.fromEntries(entries.toSorted(([left], [right]) => left.localeCompare(right)));
271}269}
272270
271interface TerminalManagerEvents {
272 event: [event: TerminalEvent];
273}
274
275interface TerminalManagerOptions {
276 logsDir?: string;
277 historyLineLimit?: number;
278 ptyAdapter: PtyAdapterShape;
279 shellResolver?: () => string;
280 subprocessChecker?: TerminalSubprocessChecker;
281 subprocessPollIntervalMs?: number;
282}
283
273export class TerminalManagerRuntime extends EventEmitter<TerminalManagerEvents> {284export class TerminalManagerRuntime extends EventEmitter<TerminalManagerEvents> {
274 private readonly sessions = new Map<string, TerminalSessionState>();285 private readonly sessions = new Map<string, TerminalSessionState>();
275 private readonly logsDir: string;286 private readonly logsDir: string;
apps/server/src/terminal/Services/Manager.ts+1-16
...@@ -8,15 +8,9 @@ import {...@@ -8,15 +8,9 @@ import {
8 TerminalSessionStatus,8 TerminalSessionStatus,
9 TerminalWriteInput,9 TerminalWriteInput,
10} from "@t3tools/contracts";10} from "@t3tools/contracts";
11import { PtyAdapterShape, PtyProcess } from "./PTY";11import { PtyProcess } from "./PTY";
12import { Effect, ServiceMap } from "effect";12import { Effect, ServiceMap } from "effect";
1313
14type TerminalSubprocessChecker = (terminalPid: number) => Promise<boolean>;
15
16export interface TerminalManagerEvents {
17 event: [event: TerminalEvent];
18}
19
20export interface TerminalSessionState {14export interface TerminalSessionState {
21 threadId: string;15 threadId: string;
22 terminalId: string;16 terminalId: string;
...@@ -46,15 +40,6 @@ export interface TerminalStartInput extends TerminalOpenInput {...@@ -46,15 +40,6 @@ export interface TerminalStartInput extends TerminalOpenInput {
46 rows: number;40 rows: number;
47}41}
4842
49export interface TerminalManagerOptions {
50 logsDir?: string;
51 historyLineLimit?: number;
52 ptyAdapter: PtyAdapterShape;
53 shellResolver?: () => string;
54 subprocessChecker?: TerminalSubprocessChecker;
55 subprocessPollIntervalMs?: number;
56}
57
58export interface TerminalManagerShape {43export interface TerminalManagerShape {
59 readonly open: (input: TerminalOpenInput) => Effect.Effect<TerminalSessionSnapshot, unknown>;44 readonly open: (input: TerminalOpenInput) => Effect.Effect<TerminalSessionSnapshot, unknown>;
60 readonly write: (input: TerminalWriteInput) => Effect.Effect<void, unknown>;45 readonly write: (input: TerminalWriteInput) => Effect.Effect<void, unknown>;