import { Context, Schema } from "effect"; import type { Effect } from "effect"; function describeTerminalInspectorCause(cause: unknown): string | null { if (cause instanceof Error && cause.message.length > 0) { return cause.message; } if (typeof cause === "string" && cause.length > 0) { return cause; } if (cause === undefined || cause === null) { return null; } return String(cause); } export class TerminalProcessInspectionError extends Schema.TaggedErrorClass()( "TerminalProcessInspectionError", { operation: Schema.String, terminalPid: Schema.Int, command: Schema.String, detail: Schema.String, cause: Schema.optional(Schema.Defect), }, ) { override get message(): string { const cause = describeTerminalInspectorCause(this.cause); return `${this.operation} failed for terminal pid ${this.terminalPid} (${this.command}): ${this.detail}${ cause ? ` Cause: ${cause}` : "" }`; } } export interface TerminalSubprocessActivity { hasRunningSubprocess: boolean; runningPorts: number[]; } export type TerminalSubprocessInspector = ( terminalPid: number, ) => Effect.Effect; export interface TerminalProcessInspectorShape { readonly inspect: ( terminalPid: number, ) => Effect.Effect; } export class TerminalProcessInspector extends Context.Service< TerminalProcessInspector, TerminalProcessInspectorShape >()("t3/process/Services/TerminalProcessInspector") {}