/** * PtyAdapter - Terminal PTY adapter service contract. * * Defines the process primitives required by terminal session management * without binding to a specific PTY implementation. * * @module PtyAdapter */ import * as Context from "effect/Context"; import * as Effect from "effect/Effect"; import * as Schema from "effect/Schema"; /** * PtySpawnError - Error type for PTY spawn failures. */ export class PtySpawnError extends Schema.TaggedError()("PtySpawnError", { adapter: Schema.String, shell: Schema.optional(Schema.String), attemptedShells: Schema.optional(Schema.Array(Schema.String)), cause: Schema.optional(Schema.Defect()), }) { override get message(): string { const shell = this.shell === undefined ? "" : ` '${this.shell}'`; const attemptedShells = this.attemptedShells === undefined || this.attemptedShells.length === 0 ? "" : ` Tried shells: ${this.attemptedShells.join(", ")}.`; return `Failed to spawn PTY process${shell} with ${this.adapter}.${attemptedShells}`; } } export interface PtyExitEvent { exitCode: number; signal: number | null; } export interface PtyProcess { readonly pid: number; write(data: string): void; resize(cols: number, rows: number): void; kill(signal?: string): void; onData(callback: (data: string) => void): () => void; onExit(callback: (event: PtyExitEvent) => void): () => void; } export interface PtySpawnInput { shell: string; args?: string[]; cwd: string; cols: number; rows: number; env: NodeJS.ProcessEnv; } /** * PtyAdapter - Service tag for PTY process integration. */ export class PtyAdapter extends Context.Service< PtyAdapter, { /** * Spawn a PTY process for a terminal session. */ readonly spawn: (input: PtySpawnInput) => Effect.Effect; } >()("t3/terminal/PtyAdapter") {}