authorgravatar for julius0216@outlook.comJulius Marminge <julius0216@outlook.com> 2026-02-27 09:17:14-08:00
committergravatar for jmarminge@gmail.comJulius Marminge <jmarminge@gmail.com> 2026-03-05 23:00:41-08:00
log441582dbb89228390d288fe9b141fe4730c1ca57
treea7e60633b75b1ee11354b3d1c79a2789a39f077e
parent1b1ede92bae7e925827f9961fe322c55e79241c3

Use typed errors for unavailable Claude runtime path

Co-authored-by: codex <codex@users.noreply.github.com>

1 files changed, 50 insertions(+), 8 deletions(-)

apps/server/src/provider/Layers/ClaudeCodeAdapter.ts+50-8
......@@ -116,16 +116,58 @@ function toRequestError(
116116 });
117117}
118118
119const unavailableRuntimeError = () => new Error("Claude Code runtime is not configured.");
120
121119function makeUnavailableRuntime(): ClaudeCodeRuntime {
120 const unavailableDetail = "Claude Code runtime is not configured.";
121
122122 return {
123 startSession: () => Effect.fail(unavailableRuntimeError()),
124 sendTurn: () => Effect.fail(unavailableRuntimeError()),
125 interruptTurn: () => Effect.fail(unavailableRuntimeError()),
126 readThread: () => Effect.fail(unavailableRuntimeError()),
127 rollbackThread: () => Effect.fail(unavailableRuntimeError()),
128 respondToRequest: () => Effect.fail(unavailableRuntimeError()),
123 startSession: () =>
124 Effect.fail(
125 new ProviderAdapterProcessError({
126 provider: PROVIDER,
127 sessionId: "pending",
128 detail: unavailableDetail,
129 }),
130 ),
131 sendTurn: (_input) =>
132 Effect.fail(
133 new ProviderAdapterRequestError({
134 provider: PROVIDER,
135 method: "turn/start",
136 detail: unavailableDetail,
137 }),
138 ),
139 interruptTurn: (_sessionId) =>
140 Effect.fail(
141 new ProviderAdapterRequestError({
142 provider: PROVIDER,
143 method: "turn/interrupt",
144 detail: unavailableDetail,
145 }),
146 ),
147 readThread: (_sessionId) =>
148 Effect.fail(
149 new ProviderAdapterRequestError({
150 provider: PROVIDER,
151 method: "thread/read",
152 detail: unavailableDetail,
153 }),
154 ),
155 rollbackThread: (_sessionId) =>
156 Effect.fail(
157 new ProviderAdapterRequestError({
158 provider: PROVIDER,
159 method: "thread/rollback",
160 detail: unavailableDetail,
161 }),
162 ),
163 respondToRequest: (_sessionId) =>
164 Effect.fail(
165 new ProviderAdapterRequestError({
166 provider: PROVIDER,
167 method: "item/requestApproval/decision",
168 detail: unavailableDetail,
169 }),
170 ),
129171 stopSession: () => Effect.void,
130172 listSessions: () => Effect.succeed([]),
131173 hasSession: () => Effect.succeed(false),