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(...@@ -116,16 +116,58 @@ function toRequestError(
116 });116 });
117}117}
118118
119const unavailableRuntimeError = () => new Error("Claude Code runtime is not configured.");
120
121function makeUnavailableRuntime(): ClaudeCodeRuntime {119function makeUnavailableRuntime(): ClaudeCodeRuntime {
120 const unavailableDetail = "Claude Code runtime is not configured.";
121
122 return {122 return {
123 startSession: () => Effect.fail(unavailableRuntimeError()),123 startSession: () =>
124 sendTurn: () => Effect.fail(unavailableRuntimeError()),124 Effect.fail(
125 interruptTurn: () => Effect.fail(unavailableRuntimeError()),125 new ProviderAdapterProcessError({
126 readThread: () => Effect.fail(unavailableRuntimeError()),126 provider: PROVIDER,
127 rollbackThread: () => Effect.fail(unavailableRuntimeError()),127 sessionId: "pending",
128 respondToRequest: () => Effect.fail(unavailableRuntimeError()),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 ),
129 stopSession: () => Effect.void,171 stopSession: () => Effect.void,
130 listSessions: () => Effect.succeed([]),172 listSessions: () => Effect.succeed([]),
131 hasSession: () => Effect.succeed(false),173 hasSession: () => Effect.succeed(false),