Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
8c1e6c6
Split provider kind into driver id and instance id
juliusmarminge Apr 21, 2026
c098276
Surface provider instances and buffer settings inputs client-side
juliusmarminge Apr 21, 2026
7420471
Introduce provider instance registry and unify settings parity
juliusmarminge Apr 21, 2026
02ad01e
Add workspace split bindings and draft persistence
juliusmarminge Apr 23, 2026
0c868cb
Fix provider instance test fixtures after rebase
juliusmarminge Apr 27, 2026
d05e60c
Track provider instances through orchestration and sessions
juliusmarminge Apr 27, 2026
624a086
Add continuation group support for provider instances
juliusmarminge Apr 27, 2026
b1bb7a2
Propagate provider instance environments
juliusmarminge Apr 28, 2026
5be8c12
Use Claude initialization results for provider auth status
juliusmarminge Apr 28, 2026
4be5087
Bind provider adapters to their instance ids
juliusmarminge Apr 28, 2026
ed6d810
Improve provider error attribution for missing instances
juliusmarminge Apr 28, 2026
157fc5b
Use Claude init capabilities for provider status
juliusmarminge Apr 28, 2026
f3a568a
Propagate provider instance enabled state
juliusmarminge Apr 28, 2026
6dc8493
Require provider instance IDs across runtime routing
juliusmarminge Apr 28, 2026
a5fb47a
Refactor workspace to use provider instance registry
juliusmarminge Apr 28, 2026
a50c26d
Bind OpenCode fallback model selection to instance id
juliusmarminge Apr 29, 2026
0bfdf12
Allow provider switches after stopped sessions
juliusmarminge Apr 29, 2026
fa6e0cc
Reject cross-driver provider changes after session stop
juliusmarminge Apr 29, 2026
95ec3b7
Surface unavailable provider instances in registry
juliusmarminge Apr 29, 2026
0013b64
Track provider instance state across sessions and settings
juliusmarminge Apr 29, 2026
703132c
Add provider instance IDs to web test configs
juliusmarminge Apr 29, 2026
90fb94e
Rename provider driver IDs to driver kinds
juliusmarminge Apr 29, 2026
f206406
Fix provider picker test instance defaults
juliusmarminge Apr 29, 2026
9a14e09
Refactor provider kinds to use instance IDs
juliusmarminge Apr 29, 2026
41e6677
Refactor provider session routing in ProviderService
juliusmarminge Apr 29, 2026
7a654d5
Remove legacy provider-kind adapter lookup
juliusmarminge Apr 29, 2026
01f2b68
Add provider adapter registry coverage
juliusmarminge Apr 29, 2026
b9c11e7
Preserve provider registry cache on sync failures
juliusmarminge Apr 29, 2026
17ce24c
Add provider model preference management
juliusmarminge Apr 29, 2026
ee63c7b
Merge main and resolve OpenCode provider test
juliusmarminge Apr 29, 2026
c45a05a
Refactor provider home handling into effectful registry
juliusmarminge Apr 29, 2026
48c6bf9
Add provider instance registry wizard
juliusmarminge Apr 29, 2026
375dbad
Tighten OpenCode instance validation
juliusmarminge Apr 29, 2026
245ec79
Remove UI picker script from web shell
juliusmarminge Apr 29, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions apps/desktop/src/clientPersistence.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ const clientSettings: ClientSettings = {
confirmThreadDelete: false,
diffWordWrap: true,
favorites: [],
providerModelPreferences: {},
sidebarProjectGroupingMode: "repository_path",
sidebarProjectGroupingOverrides: {
"environment-1:/tmp/project-a": "separate",
Expand Down
44 changes: 22 additions & 22 deletions apps/server/integration/OrchestrationEngineHarness.integration.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@ import { execFileSync } from "node:child_process";
import * as NodeServices from "@effect/platform-node/NodeServices";
import {
ApprovalRequestId,
ProviderKind,
CodexSettings,
ProviderDriverKind,
type OrchestrationEvent,
type OrchestrationThread,
} from "@t3tools/contracts";
Expand Down Expand Up @@ -36,13 +37,16 @@ import { ProviderSessionRuntimeRepositoryLive } from "../src/persistence/Layers/
import { makeSqlitePersistenceLive } from "../src/persistence/Layers/Sqlite.ts";
import { ProjectionCheckpointRepository } from "../src/persistence/Services/ProjectionCheckpoints.ts";
import { ProjectionPendingApprovalRepository } from "../src/persistence/Services/ProjectionPendingApprovals.ts";
import { ProviderUnsupportedError } from "../src/provider/Errors.ts";
import { makeAdapterRegistryMock } from "../src/provider/testUtils/providerAdapterRegistryMock.ts";
import { ProviderAdapterRegistry } from "../src/provider/Services/ProviderAdapterRegistry.ts";
import { ProviderSessionDirectoryLive } from "../src/provider/Layers/ProviderSessionDirectory.ts";
import { ServerSettingsService } from "../src/serverSettings.ts";
import { makeProviderServiceLive } from "../src/provider/Layers/ProviderService.ts";
import { makeCodexAdapterLive } from "../src/provider/Layers/CodexAdapter.ts";
import { CodexAdapter } from "../src/provider/Services/CodexAdapter.ts";
import { makeCodexAdapter } from "../src/provider/Layers/CodexAdapter.ts";
import {
NoOpProviderEventLoggers,
ProviderEventLoggers,
} from "../src/provider/Layers/ProviderEventLoggers.ts";
import { ProviderService } from "../src/provider/Services/ProviderService.ts";
import { AnalyticsService } from "../src/telemetry/Services/AnalyticsService.ts";
import { CheckpointReactorLive } from "../src/orchestration/Layers/CheckpointReactor.ts";
Expand Down Expand Up @@ -214,7 +218,7 @@ export interface OrchestrationIntegrationHarness {
}

interface MakeOrchestrationIntegrationHarnessOptions {
readonly provider?: ProviderKind;
readonly provider?: ProviderDriverKind;
readonly realCodex?: boolean;
}

Expand All @@ -225,21 +229,18 @@ export const makeOrchestrationIntegrationHarness = (
const path = yield* Path.Path;
const fileSystem = yield* FileSystem.FileSystem;

const provider = options?.provider ?? "codex";
const provider = options?.provider ?? ProviderDriverKind.make("codex");
const useRealCodex = options?.realCodex === true;
const adapterHarness = useRealCodex
? null
: yield* makeTestProviderAdapterHarness({
provider,
});
const fakeRegistry = adapterHarness
? Layer.succeed(ProviderAdapterRegistry, {
getByProvider: (resolvedProvider) =>
resolvedProvider === adapterHarness.provider
? Effect.succeed(adapterHarness.adapter)
: Effect.fail(new ProviderUnsupportedError({ provider: resolvedProvider })),
listProviders: () => Effect.succeed([adapterHarness.provider]),
} as typeof ProviderAdapterRegistry.Service)
? Layer.succeed(
ProviderAdapterRegistry,
makeAdapterRegistryMock({ [adapterHarness.provider]: adapterHarness.adapter }),
)
: null;
const rootDir = yield* fileSystem.makeTempDirectoryScoped({
prefix: "t3-orchestration-integration-",
Expand All @@ -264,31 +265,30 @@ export const makeOrchestrationIntegrationHarness = (
const realCodexRegistry = Layer.effect(
ProviderAdapterRegistry,
Effect.gen(function* () {
const codexAdapter = yield* CodexAdapter;
return {
getByProvider: (resolvedProvider) =>
resolvedProvider === "codex"
? Effect.succeed(codexAdapter)
: Effect.fail(new ProviderUnsupportedError({ provider: resolvedProvider })),
listProviders: () => Effect.succeed(["codex"] as const),
} as typeof ProviderAdapterRegistry.Service;
const codexSettings = Schema.decodeSync(CodexSettings)({});
const codexAdapter = yield* makeCodexAdapter(codexSettings);
return makeAdapterRegistryMock({
[ProviderDriverKind.make("codex")]: codexAdapter,
});
}),
).pipe(
Layer.provide(makeCodexAdapterLive()),
Layer.provideMerge(ServerConfig.layerTest(workspaceDir, rootDir)),
Layer.provideMerge(NodeServices.layer),
Layer.provideMerge(providerSessionDirectoryLayer),
);
const providerEventLoggersLayer = Layer.succeed(ProviderEventLoggers, NoOpProviderEventLoggers);
const providerLayer = useRealCodex
? makeProviderServiceLive().pipe(
Layer.provide(providerSessionDirectoryLayer),
Layer.provide(realCodexRegistry),
Layer.provide(AnalyticsService.layerTest),
Layer.provide(providerEventLoggersLayer),
)
: makeProviderServiceLive().pipe(
Layer.provide(providerSessionDirectoryLayer),
Layer.provide(fakeRegistry!),
Layer.provide(AnalyticsService.layerTest),
Layer.provide(providerEventLoggersLayer),
);

const checkpointStoreLayer = CheckpointStoreLive.pipe(Layer.provide(GitCoreLive));
Expand Down
17 changes: 10 additions & 7 deletions apps/server/integration/TestProviderAdapter.integration.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import {
ProviderTurnStartResult,
ThreadId,
TurnId,
ProviderKind,
ProviderDriverKind,
} from "@t3tools/contracts";
import { Effect, Queue, Stream } from "effect";

Expand All @@ -36,7 +36,7 @@ export interface TestTurnResponse {
export type FixtureProviderRuntimeEvent = {
readonly type: string;
readonly eventId: EventId;
readonly provider: ProviderKind;
readonly provider: ProviderDriverKind;
readonly createdAt: string;
readonly threadId: string;
readonly turnId?: string | undefined;
Expand Down Expand Up @@ -178,7 +178,7 @@ function normalizeFixtureEvent(rawEvent: Record<string, unknown>): ProviderRunti

export interface TestProviderAdapterHarness {
readonly adapter: ProviderAdapterShape<ProviderAdapterError>;
readonly provider: ProviderKind;
readonly provider: ProviderDriverKind;
readonly queueTurnResponse: (
threadId: ThreadId,
response: TestTurnResponse,
Expand All @@ -198,15 +198,15 @@ export interface TestProviderAdapterHarness {
}

interface MakeTestProviderAdapterHarnessOptions {
readonly provider?: ProviderKind;
readonly provider?: ProviderDriverKind;
}

function nowIso(): string {
return new Date().toISOString();
}

function sessionNotFound(
provider: ProviderKind,
provider: ProviderDriverKind,
threadId: ThreadId,
): ProviderAdapterSessionNotFoundError {
return new ProviderAdapterSessionNotFoundError({
Expand All @@ -216,15 +216,15 @@ function sessionNotFound(
}

function missingSessionEffect(
provider: ProviderKind,
provider: ProviderDriverKind,
threadId: ThreadId,
): Effect.Effect<never, ProviderAdapterError> {
return Effect.fail(sessionNotFound(provider, threadId));
}

export const makeTestProviderAdapterHarness = (options?: MakeTestProviderAdapterHarnessOptions) =>
Effect.gen(function* () {
const provider = options?.provider ?? "codex";
const provider = options?.provider ?? ProviderDriverKind.make("codex");
const runtimeEvents = yield* Queue.unbounded<ProviderRuntimeEvent>();
let sessionCount = 0;
const sessions = new Map<ThreadId, SessionState>();
Expand Down Expand Up @@ -257,6 +257,9 @@ export const makeTestProviderAdapterHarness = (options?: MakeTestProviderAdapter

const session: ProviderSession = {
provider,
...(input.providerInstanceId !== undefined
? { providerInstanceId: input.providerInstanceId }
: {}),
status: "ready",
runtimeMode: input.runtimeMode,
threadId,
Expand Down
4 changes: 2 additions & 2 deletions apps/server/integration/fixtures/providerRuntime.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { EventId, RuntimeRequestId } from "@t3tools/contracts";
import { EventId, ProviderDriverKind, RuntimeRequestId } from "@t3tools/contracts";
import type { LegacyProviderRuntimeEvent } from "../TestProviderAdapter.integration.ts";

const PROVIDER = "codex" as const;
const PROVIDER = ProviderDriverKind.make("codex");
const SESSION_ID = "fixture-session";
const THREAD_ID = "fixture-thread";
const TURN_ID = "fixture-turn";
Expand Down
Loading
Loading