1/**
2 * BUILT_IN_DRIVERS — the static set of `ProviderDriver`s this build ships
3 * with.
4 *
5 * Every driver that the server knows how to instantiate from settings is
6 * listed here. The `ProviderInstanceRegistry` iterates this array when
7 * resolving `providerInstances` entries; anything not in the array surfaces
8 * as an `"unavailable"` shadow snapshot at runtime (see
9 * `buildUnavailableProviderSnapshot`).
10 *
11 * Adding a new first-party driver means:
12 * 1. implement `ProviderDriver` in a sibling `Drivers/<Name>Driver.ts`,
13 * 2. add it to this array,
14 * 3. ensure the runtime layer satisfies its declared `R`.
15 *
16 * The aggregated `BuiltInDriversEnv` type is the union of every driver's
17 * env requirement — the registry layer's `R` is this type, and the runtime
18 * layer (ChildProcessSpawner, FileSystem, Path, ServerConfig,
19 * OpenCodeRuntime, …) must satisfy it.
20 *
21 * @module provider/builtInDrivers
22 */
23import {
24 AcpRegistryDriver,
25 type AcpRegistryDriverEnv,
26} from "@t3tools/provider-acp-registry/server";
27import { AntigravityDriver, type AntigravityDriverEnv } from "./Drivers/AntigravityDriver.ts";
28import { ClaudeDriver, type ClaudeDriverEnv } from "./Drivers/ClaudeDriver.ts";
29import { CodexDriver, type CodexDriverEnv } from "./Drivers/CodexDriver.ts";
30import { CursorDriver, type CursorDriverEnv } from "@t3tools/provider-cursor/server";
31import { GrokDriver, type GrokDriverEnv } from "@t3tools/provider-grok/server";
32import { OpenCodeDriver, type OpenCodeDriverEnv } from "@t3tools/provider-opencode/server";
33import { MuseDriver, type MuseDriverEnv } from "@t3tools/provider-muse/server";
34import { PiDriver, type PiDriverEnv } from "@t3tools/provider-pi/server";
35import type {
36 AnyProviderDriver,
37 ProviderUsageReaderEnv,
38} from "@t3tools/provider-core/server/driver";
39
40/**
41 * Union of infrastructure services required to construct any built-in
42 * driver. The registry layer declares `R = BuiltInDriversEnv`; the runtime
43 * layer must provide every service in this union.
44 */
45export type BuiltInDriversEnv =
46 | AcpRegistryDriverEnv
47 | AntigravityDriverEnv
48 | ClaudeDriverEnv
49 | CodexDriverEnv
50 | CursorDriverEnv
51 | GrokDriverEnv
52 | OpenCodeDriverEnv
53 | PiDriverEnv
54 | MuseDriverEnv;
55
56/**
57 * Ordered list of built-in drivers. Order matters only for tie-breaking in
58 * UI presentation — the registry itself is keyed by `driverKind`, so
59 * iteration order has no functional effect on instance lookup.
60 */
61export const BUILT_IN_DRIVERS: ReadonlyArray<AnyProviderDriver<BuiltInDriversEnv>> = [
62 CodexDriver,
63 ClaudeDriver,
64 CursorDriver,
65 GrokDriver,
66 OpenCodeDriver,
67 AntigravityDriver,
68 PiDriver,
69 MuseDriver,
70 AcpRegistryDriver,
71];
72
73/** Services the built-in usage readers need. */
74export type BuiltInUsageReadersEnv =
75 | ProviderUsageReaderEnv<typeof ClaudeDriver>
76 | ProviderUsageReaderEnv<typeof CodexDriver>
77 | ProviderUsageReaderEnv<typeof GrokDriver>
78 | ProviderUsageReaderEnv<typeof OpenCodeDriver>
79 | ProviderUsageReaderEnv<typeof AntigravityDriver>
80 | ProviderUsageReaderEnv<typeof CursorDriver>
81 | ProviderUsageReaderEnv<typeof PiDriver>;
82
83/**
84 * The drivers that keep usage history, in the order the usage page reads
85 * them: transcript readers first, then scan readers. Aggregation keeps the
86 * first copy of a duplicate record, so the order is part of the result.
87 */
88export const BUILT_IN_USAGE_DRIVERS: ReadonlyArray<
89 AnyProviderDriver<BuiltInDriversEnv, BuiltInUsageReadersEnv>
90> = [
91 ClaudeDriver,
92 CodexDriver,
93 GrokDriver,
94 PiDriver,
95 OpenCodeDriver,
96 AntigravityDriver,
97 CursorDriver,
98];