Skip to content

Commit 4834bfd

Browse files
refactor(server): import Effect services as namespaces in the OpenCode adapters
The OpenCode 2 adapter, its testkit, test, live test and the shared fixture helpers take the namespace form the rest of V2 uses, and so does the 1.x adapter this layer edits. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
1 parent c0b6e89 commit 4834bfd

6 files changed

Lines changed: 165 additions & 195 deletions

File tree

‎apps/server/src/orchestration-v2/Adapters/OpenCode2AdapterV2.test.ts‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ import type {
3232
ProviderAdapterV2Event,
3333
ProviderAdapterV2SessionRuntime,
3434
} from "../ProviderAdapter.ts";
35-
import { IdAllocatorV2, layer as idAllocatorLayer } from "../IdAllocator.ts";
35+
import * as IdAllocator from "../IdAllocator.ts";
3636
import { OPENCODE_PROVIDER } from "./OpenCodeAdapterV2.ts";
3737
import { OPENCODE_2_FULL_ACCESS_ONLY, OPENCODE_2_STILL_STOPPING } from "./OpenCode2AdapterV2.ts";
3838
import { openCode2ReplayRuntime } from "./OpenCode2AdapterV2.testkit.ts";
@@ -824,9 +824,9 @@ describe("OpenCode2 adapter", () => {
824824

825825
/** The provider turn the adapter derives for `turnInput`'s attempt. */
826826
const providerTurnId = Effect.gen(function* () {
827-
const ids = yield* IdAllocatorV2;
827+
const ids = yield* IdAllocator.IdAllocatorV2;
828828
return ids.derive.providerTurn({
829829
driver: OPENCODE_PROVIDER,
830830
nativeTurnId: `${SESSION}:attempt:attempt:opencode2-adapter`,
831831
});
832-
}).pipe(Effect.provide(idAllocatorLayer));
832+
}).pipe(Effect.provide(IdAllocator.layer));

‎apps/server/src/orchestration-v2/Adapters/OpenCode2AdapterV2.testkit.ts‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,11 @@ import * as HttpClientError from "effect/unstable/http/HttpClientError";
2020
import * as HttpClientResponse from "effect/unstable/http/HttpClientResponse";
2121
import * as UrlParams from "effect/unstable/http/UrlParams";
2222

23-
import { ServerConfig } from "../../config.ts";
23+
import * as ServerConfig from "../../config.ts";
2424
import * as OpenCode2Client from "../../provider/opencode2/OpenCode2Client.ts";
2525
import * as OpenCode2Server from "../../provider/opencode2/OpenCode2Server.ts";
2626
import * as IdAllocator from "../IdAllocator.ts";
27-
import { makeLayer } from "../ProviderAdapterRegistry.ts";
27+
import * as ProviderAdapterRegistry from "../ProviderAdapterRegistry.ts";
2828
import {
2929
makeReplayServerConfig,
3030
type OrchestratorV2ProviderReplayHarness,
@@ -169,14 +169,14 @@ const makeReplayAdapter = (
169169
});
170170

171171
const replayServerConfig = (scenario: string) =>
172-
Layer.effect(ServerConfig, makeReplayServerConfig(scenario).pipe(Effect.orDie)).pipe(
172+
Layer.effect(ServerConfig.ServerConfig, makeReplayServerConfig(scenario).pipe(Effect.orDie)).pipe(
173173
Layer.provide(NodeServices.layer),
174174
);
175175

176176
function makeRegistryLayer(transcript: OpenCode2ReplayTranscript) {
177177
return Layer.unwrap(
178178
makeReplayAdapter(transcript, { external: true }).pipe(
179-
Effect.map((adapter) => makeLayer([adapter])),
179+
Effect.map((adapter) => ProviderAdapterRegistry.makeLayer([adapter])),
180180
),
181181
).pipe(Layer.provide(Layer.mergeAll(replayServerConfig(transcript.scenario), IdAllocator.layer)));
182182
}

‎apps/server/src/orchestration-v2/Adapters/OpenCode2AdapterV2.ts‎

Lines changed: 30 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ import * as Queue from "effect/Queue";
3939
import * as Schema from "effect/Schema";
4040
import * as Stream from "effect/Stream";
4141

42-
import { ServerConfig } from "../../config.ts";
42+
import * as ServerConfig from "../../config.ts";
4343
import type { OpenCode2StreamEvent } from "../../provider/opencode2/OpenCode2Client.ts";
4444
import * as OpenCode2Server from "../../provider/opencode2/OpenCode2Server.ts";
4545
import {
@@ -52,26 +52,7 @@ import { getModelSelectionStringOptionValue } from "@t3tools/shared/model";
5252
import { providerMessageTextWithAttachmentPaths } from "../AttachmentPrompt.ts";
5353
import * as IdAllocator from "../IdAllocator.ts";
5454
import { makeProviderFailure } from "../ProviderFailure.ts";
55-
import {
56-
ProviderAdapterEnsureThreadError,
57-
ProviderAdapterEventStreamError,
58-
ProviderAdapterForkThreadError,
59-
ProviderAdapterInterruptError,
60-
ProviderAdapterOpenSessionError,
61-
ProviderAdapterProtocolError,
62-
ProviderAdapterReadThreadSnapshotError,
63-
ProviderAdapterResumeThreadError,
64-
ProviderAdapterRollbackThreadError,
65-
ProviderAdapterRuntimeRequestResponseError,
66-
ProviderAdapterSteerRunUnsupportedError,
67-
ProviderAdapterTurnStartError,
68-
ProviderAdapterV2,
69-
ProviderAdapterV2Error,
70-
type ProviderAdapterV2Event,
71-
type ProviderAdapterV2SessionRuntime,
72-
type ProviderAdapterV2Shape,
73-
type ProviderAdapterV2TurnInput,
74-
} from "../ProviderAdapter.ts";
55+
import * as ProviderAdapter from "../ProviderAdapter.ts";
7556
import { turnScopedSelectionTransition } from "../ProviderSelectionTransition.ts";
7657
import { OPENCODE_PROVIDER } from "./OpenCodeAdapterV2.ts";
7758
import { openCodeToolTurnItem } from "./OpenCodeToolItems.ts";
@@ -173,7 +154,7 @@ const OpenCode2ProviderCapabilities = {
173154
type EventOf<T extends OpenCodeEvent["type"]> = Extract<OpenCodeEvent, { readonly type: T }>;
174155

175156
interface ActiveTurn {
176-
readonly input: ProviderAdapterV2TurnInput;
157+
readonly input: ProviderAdapter.ProviderAdapterV2TurnInput;
177158
readonly providerTurn: OrchestrationV2ProviderTurn;
178159
/** Open text and reasoning blocks, keyed `<assistantMessageID>:<kind>:<ordinal>`. */
179160
readonly texts: Map<string, OpenBlock>;
@@ -214,7 +195,7 @@ interface ThreadState {
214195

215196
/** One wording for every capability later layers add. */
216197
const notYet = (feature: string) =>
217-
new ProviderAdapterProtocolError({
198+
new ProviderAdapter.ProviderAdapterProtocolError({
218199
driver: OPENCODE_PROVIDER,
219200
detail: `OpenCode 2 ${feature} is not supported yet`,
220201
});
@@ -229,7 +210,7 @@ const sessionIdOf = (providerThread: OrchestrationV2ProviderThread) => {
229210
const nativeId = providerThread.nativeThreadRef?.nativeId;
230211
return nativeId === undefined || nativeId === null
231212
? Effect.fail(
232-
new ProviderAdapterProtocolError({
213+
new ProviderAdapter.ProviderAdapterProtocolError({
233214
driver: OPENCODE_PROVIDER,
234215
detail: `Provider thread ${providerThread.id} has no OpenCode session`,
235216
}),
@@ -294,14 +275,14 @@ const deliver = <E>(answer: Effect.Effect<void, E>) =>
294275
type ModelRef = ReturnType<typeof Model.Ref.make>;
295276

296277
// Errors already in the adapter channel keep their tag; only lower-level ones are wrapped.
297-
const isProviderAdapterError = Schema.is(ProviderAdapterV2Error);
278+
const isProviderAdapterError = Schema.is(ProviderAdapter.ProviderAdapterV2Error);
298279

299280
/**
300281
* The model OpenCode should run for a `provider/model` slug and its reasoning
301282
* variant, or undefined for any other slug: sending none would run OpenCode's
302283
* default while T3 records the requested model.
303284
*/
304-
const modelRef = (selection: ProviderAdapterV2TurnInput["modelSelection"]) => {
285+
const modelRef = (selection: ProviderAdapter.ProviderAdapterV2TurnInput["modelSelection"]) => {
305286
const parsed = parseOpenCodeModelSlug(selection.model);
306287
if (parsed === null) return undefined;
307288
const variant = getModelSelectionStringOptionValue(selection, "variant");
@@ -325,11 +306,11 @@ const sameModel = (left: ModelRef, right: ModelRef | undefined) =>
325306
export const make = Effect.fn("OpenCode2Adapter.make")(function* (instanceId: ProviderInstanceId) {
326307
const server = yield* OpenCode2Server.OpenCode2Server;
327308
const idAllocator = yield* IdAllocator.IdAllocatorV2;
328-
const serverConfig = yield* ServerConfig;
309+
const serverConfig = yield* ServerConfig.ServerConfig;
329310
const driver = OPENCODE_PROVIDER;
330311

331312
const openSession = Effect.fn("OpenCode2Adapter.openSession")(function* (
332-
input: Parameters<ProviderAdapterV2Shape["openSession"]>[0],
313+
input: Parameters<ProviderAdapter.ProviderAdapterV2Shape["openSession"]>[0],
333314
connection: OpenCode2Server.OpenCode2Connection,
334315
) {
335316
const { client } = connection;
@@ -346,9 +327,10 @@ export const make = Effect.fn("OpenCode2Adapter.make")(function* (instanceId: Pr
346327
updatedAt: now,
347328
lastError: null,
348329
};
349-
const events = yield* Queue.unbounded<ProviderAdapterV2Event, Cause.Done>();
330+
const events = yield* Queue.unbounded<ProviderAdapter.ProviderAdapterV2Event, Cause.Done>();
350331
const threads = new Map<string, ThreadState>();
351-
const emit = (event: ProviderAdapterV2Event) => Queue.offer(events, event).pipe(Effect.asVoid);
332+
const emit = (event: ProviderAdapter.ProviderAdapterV2Event) =>
333+
Queue.offer(events, event).pipe(Effect.asVoid);
352334

353335
const setSessionStatus = (
354336
status: OrchestrationV2ProviderSession["status"],
@@ -820,7 +802,7 @@ export const make = Effect.fn("OpenCode2Adapter.make")(function* (instanceId: Pr
820802
return providerThread;
821803
};
822804

823-
const prompt = (turnInput: ProviderAdapterV2TurnInput) => {
805+
const prompt = (turnInput: ProviderAdapter.ProviderAdapterV2TurnInput) => {
824806
const text = providerMessageTextWithAttachmentPaths({
825807
text: turnInput.message.text,
826808
attachments: turnInput.message.attachments,
@@ -833,7 +815,7 @@ export const make = Effect.fn("OpenCode2Adapter.make")(function* (instanceId: Pr
833815
return `${text}\n\n${instructions}`;
834816
};
835817

836-
const runtime: ProviderAdapterV2SessionRuntime = {
818+
const runtime: ProviderAdapter.ProviderAdapterV2SessionRuntime = {
837819
instanceId,
838820
driver,
839821
providerSessionId: input.providerSessionId,
@@ -853,7 +835,7 @@ export const make = Effect.fn("OpenCode2Adapter.make")(function* (instanceId: Pr
853835
}
854836
const model = modelRef(threadInput.modelSelection);
855837
if (model === undefined) {
856-
return yield* new ProviderAdapterProtocolError({
838+
return yield* new ProviderAdapter.ProviderAdapterProtocolError({
857839
driver: OPENCODE_PROVIDER,
858840
detail: malformedModel(threadInput.modelSelection.model),
859841
});
@@ -890,7 +872,7 @@ export const make = Effect.fn("OpenCode2Adapter.make")(function* (instanceId: Pr
890872
Effect.mapError((cause) =>
891873
isProviderAdapterError(cause)
892874
? cause
893-
: new ProviderAdapterEnsureThreadError({
875+
: new ProviderAdapter.ProviderAdapterEnsureThreadError({
894876
driver,
895877
threadId: threadInput.threadId,
896878
cause,
@@ -933,7 +915,7 @@ export const make = Effect.fn("OpenCode2Adapter.make")(function* (instanceId: Pr
933915
Effect.mapError((cause) =>
934916
isProviderAdapterError(cause)
935917
? cause
936-
: new ProviderAdapterResumeThreadError({
918+
: new ProviderAdapter.ProviderAdapterResumeThreadError({
937919
driver,
938920
providerSessionId: input.providerSessionId,
939921
providerThreadId: threadInput.providerThread.id,
@@ -946,13 +928,13 @@ export const make = Effect.fn("OpenCode2Adapter.make")(function* (instanceId: Pr
946928
const sessionId = yield* sessionIdOf(turnInput.providerThread);
947929
const state = threads.get(sessionId);
948930
if (state === undefined) {
949-
return yield* new ProviderAdapterProtocolError({
931+
return yield* new ProviderAdapter.ProviderAdapterProtocolError({
950932
driver: OPENCODE_PROVIDER,
951933
detail: `OpenCode session ${sessionId} is not registered`,
952934
});
953935
}
954936
if (state.active !== undefined) {
955-
return yield* new ProviderAdapterProtocolError({
937+
return yield* new ProviderAdapter.ProviderAdapterProtocolError({
956938
driver: OPENCODE_PROVIDER,
957939
detail: `OpenCode session ${sessionId} already has an active turn`,
958940
});
@@ -1004,7 +986,7 @@ export const make = Effect.fn("OpenCode2Adapter.make")(function* (instanceId: Pr
1004986
};
1005987
// No stream is left to end this turn, so it must not start.
1006988
if (streamFailure !== undefined) {
1007-
return yield* new ProviderAdapterEventStreamError({
989+
return yield* new ProviderAdapter.ProviderAdapterEventStreamError({
1008990
driver,
1009991
providerSessionId: input.providerSessionId,
1010992
cause: streamFailure,
@@ -1099,7 +1081,7 @@ export const make = Effect.fn("OpenCode2Adapter.make")(function* (instanceId: Pr
10991081
Effect.mapError((cause) =>
11001082
isProviderAdapterError(cause)
11011083
? cause
1102-
: new ProviderAdapterTurnStartError({
1084+
: new ProviderAdapter.ProviderAdapterTurnStartError({
11031085
driver,
11041086
threadId: turnInput.threadId,
11051087
providerThreadId: turnInput.providerThread.id,
@@ -1110,7 +1092,7 @@ export const make = Effect.fn("OpenCode2Adapter.make")(function* (instanceId: Pr
11101092
),
11111093
steerTurn: (steerInput) =>
11121094
Effect.fail(
1113-
new ProviderAdapterSteerRunUnsupportedError({
1095+
new ProviderAdapter.ProviderAdapterSteerRunUnsupportedError({
11141096
driver,
11151097
providerThreadId: steerInput.providerThread.id,
11161098
}),
@@ -1150,7 +1132,7 @@ export const make = Effect.fn("OpenCode2Adapter.make")(function* (instanceId: Pr
11501132
// is on the way), the turn is still open and nothing stopped.
11511133
if (!reply.value.interrupted && state.active === turn) {
11521134
turn.interrupted = false;
1153-
return yield* new ProviderAdapterProtocolError({
1135+
return yield* new ProviderAdapter.ProviderAdapterProtocolError({
11541136
driver: OPENCODE_PROVIDER,
11551137
detail: `OpenCode session ${sessionId} had nothing running to stop`,
11561138
});
@@ -1159,7 +1141,7 @@ export const make = Effect.fn("OpenCode2Adapter.make")(function* (instanceId: Pr
11591141
Effect.mapError((cause) =>
11601142
isProviderAdapterError(cause)
11611143
? cause
1162-
: new ProviderAdapterInterruptError({
1144+
: new ProviderAdapter.ProviderAdapterInterruptError({
11631145
driver,
11641146
providerThreadId: interruptInput.providerThread.id,
11651147
providerTurnId: interruptInput.providerTurnId,
@@ -1180,23 +1162,23 @@ export const make = Effect.fn("OpenCode2Adapter.make")(function* (instanceId: Pr
11801162
}),
11811163
respondToRuntimeRequest: (requestInput) =>
11821164
Effect.fail(
1183-
new ProviderAdapterRuntimeRequestResponseError({
1165+
new ProviderAdapter.ProviderAdapterRuntimeRequestResponseError({
11841166
driver,
11851167
requestId: requestInput.requestId,
11861168
cause: notYet("answering runtime requests"),
11871169
}),
11881170
),
11891171
readThreadSnapshot: ({ providerThread }) =>
11901172
Effect.fail(
1191-
new ProviderAdapterReadThreadSnapshotError({
1173+
new ProviderAdapter.ProviderAdapterReadThreadSnapshotError({
11921174
driver,
11931175
providerThreadId: providerThread.id,
11941176
cause: notYet("history snapshots"),
11951177
}),
11961178
),
11971179
rollbackThread: (rollbackInput) =>
11981180
Effect.fail(
1199-
new ProviderAdapterRollbackThreadError({
1181+
new ProviderAdapter.ProviderAdapterRollbackThreadError({
12001182
driver,
12011183
providerThreadId: rollbackInput.providerThread.id,
12021184
checkpointId: rollbackInput.target.checkpointId,
@@ -1205,7 +1187,7 @@ export const make = Effect.fn("OpenCode2Adapter.make")(function* (instanceId: Pr
12051187
),
12061188
forkThread: (forkInput) =>
12071189
Effect.fail(
1208-
new ProviderAdapterForkThreadError({
1190+
new ProviderAdapter.ProviderAdapterForkThreadError({
12091191
driver,
12101192
providerThreadId: forkInput.sourceProviderThread.id,
12111193
cause: notYet("fork"),
@@ -1215,7 +1197,7 @@ export const make = Effect.fn("OpenCode2Adapter.make")(function* (instanceId: Pr
12151197
return runtime;
12161198
});
12171199

1218-
return ProviderAdapterV2.of({
1200+
return ProviderAdapter.ProviderAdapterV2.of({
12191201
instanceId,
12201202
driver,
12211203
getCapabilities: () => Effect.succeed(OpenCode2ProviderCapabilities),
@@ -1240,7 +1222,7 @@ export const make = Effect.fn("OpenCode2Adapter.make")(function* (instanceId: Pr
12401222
}).pipe(
12411223
Effect.mapError(
12421224
(cause) =>
1243-
new ProviderAdapterOpenSessionError({
1225+
new ProviderAdapter.ProviderAdapterOpenSessionError({
12441226
driver,
12451227
providerSessionId: input.providerSessionId,
12461228
cause,

0 commit comments

Comments
 (0)