Skip to content

Commit 754cded

Browse files
Load PTY adapter at runtime (#1311)
Co-authored-by: Julius Marminge <[email protected]>
1 parent 2b6640a commit 754cded

File tree

3 files changed

+25
-13
lines changed

3 files changed

+25
-13
lines changed

apps/server/src/serverLayers.ts

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import * as NodeServices from "@effect/platform-node/NodeServices";
2-
import { Effect, FileSystem, Layer } from "effect";
2+
import { Effect, FileSystem, Layer, Path } from "effect";
33
import * as SqlClient from "effect/unstable/sql/SqlClient";
44

55
import { CheckpointDiffQueryLive } from "./checkpointing/Layers/CheckpointDiffQuery";
@@ -32,10 +32,26 @@ import { GitCoreLive } from "./git/Layers/GitCore";
3232
import { GitHubCliLive } from "./git/Layers/GitHubCli";
3333
import { CodexTextGenerationLive } from "./git/Layers/CodexTextGeneration";
3434
import { GitServiceLive } from "./git/Layers/GitService";
35-
import { BunPtyAdapterLive } from "./terminal/Layers/BunPTY";
36-
import { NodePtyAdapterLive } from "./terminal/Layers/NodePTY";
35+
import { PtyAdapter } from "./terminal/Services/PTY";
3736
import { AnalyticsService } from "./telemetry/Services/AnalyticsService";
3837

38+
type RuntimePtyAdapterLoader = {
39+
layer: Layer.Layer<PtyAdapter, never, FileSystem.FileSystem | Path.Path>;
40+
};
41+
42+
const runtimePtyAdapterLoaders = {
43+
bun: () => import("./terminal/Layers/BunPTY"),
44+
node: () => import("./terminal/Layers/NodePTY"),
45+
} satisfies Record<string, () => Promise<RuntimePtyAdapterLoader>>;
46+
47+
const makeRuntimePtyAdapterLayer = () =>
48+
Effect.gen(function* () {
49+
const runtime = process.versions.bun !== undefined ? "bun" : "node";
50+
const loader = runtimePtyAdapterLoaders[runtime];
51+
const ptyAdapterModule = yield* Effect.promise<RuntimePtyAdapterLoader>(loader);
52+
return ptyAdapterModule.layer;
53+
}).pipe(Layer.unwrap);
54+
3955
export function makeServerProviderLayer(): Layer.Layer<
4056
ProviderService,
4157
ProviderUnsupportedError,
@@ -108,13 +124,7 @@ export function makeServerRuntimeServicesLayer() {
108124
Layer.provideMerge(checkpointReactorLayer),
109125
);
110126

111-
const terminalLayer = TerminalManagerLive.pipe(
112-
Layer.provide(
113-
typeof Bun !== "undefined" && process.platform !== "win32"
114-
? BunPtyAdapterLive
115-
: NodePtyAdapterLive,
116-
),
117-
);
127+
const terminalLayer = TerminalManagerLive.pipe(Layer.provide(makeRuntimePtyAdapterLayer()));
118128

119129
const gitManagerLayer = GitManagerLive.pipe(
120130
Layer.provideMerge(gitCoreLayer),

apps/server/src/terminal/Layers/BunPTY.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,11 +86,13 @@ class BunPtyProcess implements PtyProcess {
8686
}
8787
}
8888

89-
export const BunPtyAdapterLive = Layer.effect(
89+
export const layer = Layer.effect(
9090
PtyAdapter,
9191
Effect.gen(function* () {
9292
if (process.platform === "win32") {
93-
return yield* Effect.die("Bun PTY terminal support is unavailable on Windows.");
93+
return yield* Effect.die(
94+
"Bun PTY terminal support is unavailable on Windows. Please use Node.js (e.g. by running `npx t3`) instead.",
95+
);
9496
}
9597
return {
9698
spawn: (input) =>

apps/server/src/terminal/Layers/NodePTY.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ class NodePtyProcess implements PtyProcess {
8484
}
8585
}
8686

87-
export const NodePtyAdapterLive = Layer.effect(
87+
export const layer = Layer.effect(
8888
PtyAdapter,
8989
Effect.gen(function* () {
9090
const fs = yield* FileSystem.FileSystem;

0 commit comments

Comments
 (0)