{"version":3,"file":"BunPTY-DSdtpStf.cjs","names":["Layer","PtyAdapter","Effect"],"sources":["../src/terminal/Layers/BunPTY.ts"],"sourcesContent":["import { Effect, Layer } from \"effect\";\nimport { PtyAdapter } from \"../Services/PTY.ts\";\nimport type { PtyAdapterShape, PtyExitEvent, PtyProcess } from \"../Services/PTY.ts\";\n\nclass BunPtyProcess implements PtyProcess {\n  private readonly dataListeners = new Set<(data: string) => void>();\n  private readonly exitListeners = new Set<(event: PtyExitEvent) => void>();\n  private readonly decoder = new TextDecoder();\n  private readonly process: Bun.Subprocess;\n  private didExit = false;\n\n  constructor(process: Bun.Subprocess) {\n    this.process = process;\n    void this.process.exited\n      .then((exitCode) => {\n        this.emitExit({\n          exitCode: Number.isInteger(exitCode) ? exitCode : 0,\n          signal: typeof this.process.signalCode === \"number\" ? this.process.signalCode : null,\n        });\n      })\n      .catch(() => {\n        this.emitExit({ exitCode: 1, signal: null });\n      });\n  }\n\n  get pid(): number {\n    return this.process.pid;\n  }\n\n  write(data: string): void {\n    if (!this.process.terminal) {\n      throw new Error(\"Bun PTY terminal handle is unavailable\");\n    }\n    this.process.terminal.write(data);\n  }\n\n  resize(cols: number, rows: number): void {\n    if (!this.process.terminal?.resize) {\n      throw new Error(\"Bun PTY resize is unavailable\");\n    }\n    this.process.terminal.resize(cols, rows);\n  }\n\n  kill(signal?: string): void {\n    if (!signal) {\n      this.process.kill();\n      return;\n    }\n    this.process.kill(signal as NodeJS.Signals);\n  }\n\n  onData(callback: (data: string) => void): () => void {\n    this.dataListeners.add(callback);\n    return () => {\n      this.dataListeners.delete(callback);\n    };\n  }\n\n  onExit(callback: (event: PtyExitEvent) => void): () => void {\n    this.exitListeners.add(callback);\n    return () => {\n      this.exitListeners.delete(callback);\n    };\n  }\n\n  emitData(data: Uint8Array): void {\n    if (this.didExit) return;\n    const text = this.decoder.decode(data, { stream: true });\n    if (text.length === 0) return;\n    for (const listener of this.dataListeners) {\n      listener(text);\n    }\n  }\n\n  private emitExit(event: PtyExitEvent): void {\n    if (this.didExit) return;\n    this.didExit = true;\n\n    const remainder = this.decoder.decode();\n    if (remainder.length > 0) {\n      for (const listener of this.dataListeners) {\n        listener(remainder);\n      }\n    }\n\n    for (const listener of this.exitListeners) {\n      listener(event);\n    }\n  }\n}\n\nexport const layer = Layer.effect(\n  PtyAdapter,\n  Effect.gen(function* () {\n    if (process.platform === \"win32\") {\n      return yield* Effect.die(\n        \"Bun PTY terminal support is unavailable on Windows. Please use Node.js (e.g. by running `npx t3`) instead.\",\n      );\n    }\n    return {\n      spawn: (input) =>\n        Effect.sync(() => {\n          let processHandle: BunPtyProcess | null = null;\n          const command = [input.shell, ...(input.args ?? [])];\n          const subprocess = Bun.spawn(command, {\n            cwd: input.cwd,\n            env: input.env,\n            terminal: {\n              cols: input.cols,\n              rows: input.rows,\n              data: (_terminal, data) => {\n                processHandle?.emitData(data);\n              },\n            },\n          });\n          processHandle = new BunPtyProcess(subprocess);\n          return processHandle;\n        }),\n    } satisfies PtyAdapterShape;\n  }),\n);\n"],"mappings":";;;;;;AAIA,IAAM,gBAAN,MAA0C;CACxC,AAAiB,gCAAgB,IAAI,KAA6B;CAClE,AAAiB,gCAAgB,IAAI,KAAoC;CACzE,AAAiB,UAAU,IAAI,aAAa;CAC5C,AAAiB;CACjB,AAAQ,UAAU;CAElB,YAAY,SAAyB;AACnC,OAAK,UAAU;AACf,EAAK,KAAK,QAAQ,OACf,MAAM,aAAa;AAClB,QAAK,SAAS;IACZ,UAAU,OAAO,UAAU,SAAS,GAAG,WAAW;IAClD,QAAQ,OAAO,KAAK,QAAQ,eAAe,WAAW,KAAK,QAAQ,aAAa;IACjF,CAAC;IACF,CACD,YAAY;AACX,QAAK,SAAS;IAAE,UAAU;IAAG,QAAQ;IAAM,CAAC;IAC5C;;CAGN,IAAI,MAAc;AAChB,SAAO,KAAK,QAAQ;;CAGtB,MAAM,MAAoB;AACxB,MAAI,CAAC,KAAK,QAAQ,SAChB,OAAM,IAAI,MAAM,yCAAyC;AAE3D,OAAK,QAAQ,SAAS,MAAM,KAAK;;CAGnC,OAAO,MAAc,MAAoB;AACvC,MAAI,CAAC,KAAK,QAAQ,UAAU,OAC1B,OAAM,IAAI,MAAM,gCAAgC;AAElD,OAAK,QAAQ,SAAS,OAAO,MAAM,KAAK;;CAG1C,KAAK,QAAuB;AAC1B,MAAI,CAAC,QAAQ;AACX,QAAK,QAAQ,MAAM;AACnB;;AAEF,OAAK,QAAQ,KAAK,OAAyB;;CAG7C,OAAO,UAA8C;AACnD,OAAK,cAAc,IAAI,SAAS;AAChC,eAAa;AACX,QAAK,cAAc,OAAO,SAAS;;;CAIvC,OAAO,UAAqD;AAC1D,OAAK,cAAc,IAAI,SAAS;AAChC,eAAa;AACX,QAAK,cAAc,OAAO,SAAS;;;CAIvC,SAAS,MAAwB;AAC/B,MAAI,KAAK,QAAS;EAClB,MAAM,OAAO,KAAK,QAAQ,OAAO,MAAM,EAAE,QAAQ,MAAM,CAAC;AACxD,MAAI,KAAK,WAAW,EAAG;AACvB,OAAK,MAAM,YAAY,KAAK,cAC1B,UAAS,KAAK;;CAIlB,AAAQ,SAAS,OAA2B;AAC1C,MAAI,KAAK,QAAS;AAClB,OAAK,UAAU;EAEf,MAAM,YAAY,KAAK,QAAQ,QAAQ;AACvC,MAAI,UAAU,SAAS,EACrB,MAAK,MAAM,YAAY,KAAK,cAC1B,UAAS,UAAU;AAIvB,OAAK,MAAM,YAAY,KAAK,cAC1B,UAAS,MAAM;;;AAKrB,MAAa,QAAQA,aAAM,OACzBC,wBACAC,cAAO,IAAI,aAAa;AACtB,KAAI,QAAQ,aAAa,QACvB,QAAO,OAAOA,cAAO,IACnB,6GACD;AAEH,QAAO,EACL,QAAQ,UACNA,cAAO,WAAW;EAChB,IAAI,gBAAsC;EAC1C,MAAM,UAAU,CAAC,MAAM,OAAO,GAAI,MAAM,QAAQ,EAAE,CAAE;AAYpD,kBAAgB,IAAI,cAXD,IAAI,MAAM,SAAS;GACpC,KAAK,MAAM;GACX,KAAK,MAAM;GACX,UAAU;IACR,MAAM,MAAM;IACZ,MAAM,MAAM;IACZ,OAAO,WAAW,SAAS;AACzB,oBAAe,SAAS,KAAK;;IAEhC;GACF,CAAC,CAC2C;AAC7C,SAAO;GACP,EACL;EACD,CACH"}