diff --git a/apps/server/src/provider/ClaudeModelCatalog.ts b/apps/server/src/provider/ClaudeModelCatalog.ts index b1fcd6a92bbfe926b1862256a5d547b69cd8d0e5..e601e9dc93928205bbdcd04bc442237e74fb141b 100644 --- a/apps/server/src/provider/ClaudeModelCatalog.ts +++ b/apps/server/src/provider/ClaudeModelCatalog.ts @@ -118,7 +118,7 @@ export function scopeClaudeModelCatalog( return { models: [...builtInModels, ...customCatalogModels] }; } -export function resolveClaudeCatalogModel( +function resolveClaudeCatalogModel( catalog: ClaudeModelCatalog, slugOrAlias: string | null | undefined, ): ClaudeCatalogModel | undefined { @@ -215,7 +215,7 @@ export function isClaudeCatalogUltracodeEffort(effort: string | null | undefined return effort === "ultracode"; } -export function resolveClaudeCatalogContextWindow( +function resolveClaudeCatalogContextWindow( catalog: ClaudeModelCatalog, modelSelection: ModelSelection | undefined, ): string | undefined { diff --git a/apps/server/src/provider/Drivers/ClaudeSkills.ts b/apps/server/src/provider/Drivers/ClaudeSkills.ts index 236fe79f518c413cfd53d54a44f266e8b854d4f5..259ceeb4b775b2a3878782383471cd6b400215b4 100644 --- a/apps/server/src/provider/Drivers/ClaudeSkills.ts +++ b/apps/server/src/provider/Drivers/ClaudeSkills.ts @@ -104,7 +104,7 @@ function parseSkillFrontmatter(contents: string): SkillFrontmatter { * user and project one. Absent on almost every machine, which is why a missing * file is the normal case rather than an error. */ -export function claudeManagedSettingsPath( +function claudeManagedSettingsPath( path: Path.Path, platform: NodeJS.Platform, environment: NodeJS.ProcessEnv, diff --git a/apps/server/src/provider/Layers/ProviderAdapterRegistry.ts b/apps/server/src/provider/Layers/ProviderAdapterRegistry.ts index 919a345aa98816e204da62e35186a55feb35b7dc..9e8e3c5d1f9025fddabe562e37886f4909ff1b64 100644 --- a/apps/server/src/provider/Layers/ProviderAdapterRegistry.ts +++ b/apps/server/src/provider/Layers/ProviderAdapterRegistry.ts @@ -80,13 +80,6 @@ export const ProviderAdapterRegistryLive = Layer.effect( makeProviderAdapterRegistry(), ); -// Exposed for tests that want to build a facade over a pre-assembled -// `ProviderInstanceRegistry` without pulling in the whole boot graph. -export { makeProviderAdapterRegistry }; - -// Re-export for consumers that need the accessor shape. The service tag -// itself lives in `Services/ProviderAdapterRegistry.ts`. -export { ProviderAdapterRegistry } from "../Services/ProviderAdapterRegistry.ts"; // Re-export for consumers (including tests) that construct a // `ProviderInstanceId` before calling `getByInstance`. export { ProviderInstanceId }; diff --git a/apps/server/src/provider/Layers/ProviderEventLoggers.ts b/apps/server/src/provider/Layers/ProviderEventLoggers.ts index a4f0b01e819304ca7546bd9818c05d6701c523d2..517a1c8195c01dc668f0430935d20a35ad66bbc4 100644 --- a/apps/server/src/provider/Layers/ProviderEventLoggers.ts +++ b/apps/server/src/provider/Layers/ProviderEventLoggers.ts @@ -61,6 +61,8 @@ export const NoOpProviderEventLoggers: ProviderEventLoggers["Service"] = { /** * Builds both stream views over one shared store. Setup failures are logged * and downgraded to the no-op service so diagnostics never block startup. + * + * @public Service construction is part of the canonical Effect module API. */ export const make = Effect.gen(function* () { const { providerEventLogPath } = yield* ServerConfig; diff --git a/apps/server/src/provider/Layers/ProviderInstanceRegistryLive.ts b/apps/server/src/provider/Layers/ProviderInstanceRegistryLive.ts index 0cc4b6c93cb89e8dfb711f603c8f985edff8b61e..67ccbd167c304cdcbfb63de366abf01ead27bbdb 100644 --- a/apps/server/src/provider/Layers/ProviderInstanceRegistryLive.ts +++ b/apps/server/src/provider/Layers/ProviderInstanceRegistryLive.ts @@ -33,7 +33,6 @@ * @module provider/Layers/ProviderInstanceRegistryLive */ import { - defaultInstanceIdForDriver, providerInstanceConfigEnabledFlag, ProviderInstanceId, type ProviderInstanceConfig, @@ -430,5 +429,3 @@ export const ProviderInstanceRegistryMutableLayer = (input: { ), ), ) as Layer.Layer; - -export { defaultInstanceIdForDriver }; diff --git a/apps/server/src/provider/Layers/codexLaunchArgs.ts b/apps/server/src/provider/Layers/codexLaunchArgs.ts index 771a4f0b6ed6239073353e24fc5955fbf05631c5..f64ff263e0e3c5771c52c2067d2c2da38f3d7080 100644 --- a/apps/server/src/provider/Layers/codexLaunchArgs.ts +++ b/apps/server/src/provider/Layers/codexLaunchArgs.ts @@ -1,14 +1,13 @@ import { tokenizeCliArgs } from "@t3tools/shared/cliArgs"; -export const T3CODE_CODEX_LAUNCH_ARGS_ENV = "T3CODE_CODEX_LAUNCH_ARGS"; +const T3CODE_CODEX_LAUNCH_ARGS_ENV = "T3CODE_CODEX_LAUNCH_ARGS"; export const resolveCodexLaunchArgs = ( launchArgs?: string, environment: NodeJS.ProcessEnv = process.env, ) => environment[T3CODE_CODEX_LAUNCH_ARGS_ENV]?.trim() || launchArgs?.trim() || ""; -export const codexLaunchArgv = (launchArgs?: string): ReadonlyArray => - tokenizeCliArgs(launchArgs); +const codexLaunchArgv = (launchArgs?: string): ReadonlyArray => tokenizeCliArgs(launchArgs); export const codexAppServerArgs = (launchArgs?: string) => [ "app-server", diff --git a/apps/server/src/provider/Layers/codexResetCredit.ts b/apps/server/src/provider/Layers/codexResetCredit.ts index d8310c7c3ee7d8370196bf71fd712abf83cebd92..34bd0a77fe27228f9922471a62a63d7416cada28 100644 --- a/apps/server/src/provider/Layers/codexResetCredit.ts +++ b/apps/server/src/provider/Layers/codexResetCredit.ts @@ -45,6 +45,7 @@ export class CodexResetCreditCoordinator extends Context.Service< } >()("t3/provider/Layers/codexResetCredit/CodexResetCreditCoordinator") {} +/** @public Service construction is part of the canonical Effect module API. */ export const make = Effect.gen(function* () { const crypto = yield* Crypto.Crypto; const statesRef = yield* Ref.make>(new Map()); diff --git a/apps/server/src/provider/Layers/codexUsageLimits.ts b/apps/server/src/provider/Layers/codexUsageLimits.ts index 66b9511b1e441df151b27b28ecbe370b03e651d9..74ce04a7895feca440652d2cf2f78920b9e7754f 100644 --- a/apps/server/src/provider/Layers/codexUsageLimits.ts +++ b/apps/server/src/provider/Layers/codexUsageLimits.ts @@ -67,7 +67,7 @@ function labelForKind(kind: ServerProviderUsageWindow["kind"]): string { * `windowDurationMins`; when it does not, paid plans expose the 5-hour and * weekly pair and Free/Go expose one monthly allowance. */ -export function codexRateLimitsToWindows( +function codexRateLimitsToWindows( snapshot: CodexRateLimitSnapshot, ): ReadonlyArray { // Show the main allowance only. Model-specific notifications (such as Spark) diff --git a/apps/server/src/provider/ModelManifest.ts b/apps/server/src/provider/ModelManifest.ts index 67a7334f613dfa62cf8b6476c0e15d49497a1d36..15000630b35948bad0a784f03ec4f15809446f4a 100644 --- a/apps/server/src/provider/ModelManifest.ts +++ b/apps/server/src/provider/ModelManifest.ts @@ -207,7 +207,7 @@ export const encodeManifestCache = Schema.encodeEffect( ); /** True when the manifest classifies `slug` as legacy for `driverKind`. */ -export function isLegacyModel( +function isLegacyModel( manifest: ModelManifestData, driverKind: ProviderDriverKind, slug: string, @@ -310,8 +310,8 @@ export class ModelManifest extends Context.Service< } >()("t3/provider/ModelManifest") {} -/** Constant service for tests and callers that only need the bundled data. */ -export const BundledOnlyModelManifest: ModelManifest["Service"] = { +/** Constant service backing the bundled-data test layer. */ +const BundledOnlyModelManifest: ModelManifest["Service"] = { current: Effect.succeed(BUNDLED_MODEL_MANIFEST), refresh: Effect.succeed(BUNDLED_MODEL_MANIFEST), refreshInBackground: Effect.void, diff --git a/apps/server/src/provider/OpenCodeServerOwner.ts b/apps/server/src/provider/OpenCodeServerOwner.ts index cccfcaccd6ef02e152d251329801bc6683b2c325..2f51137de24c48470f4f6fe52b708fcdb751ab15 100644 --- a/apps/server/src/provider/OpenCodeServerOwner.ts +++ b/apps/server/src/provider/OpenCodeServerOwner.ts @@ -8,7 +8,7 @@ import * as Semaphore from "effect/Semaphore"; import * as OpenCodeRuntime from "./opencodeRuntime.ts"; -export const OPENCODE_SERVER_IDLE_TTL = "30 seconds"; +const OPENCODE_SERVER_IDLE_TTL = "30 seconds"; interface OpenCodeServerOwnerState { server: OpenCodeRuntime.OpenCodeServerProcess | null; @@ -176,6 +176,7 @@ export const make = Effect.fn("OpenCodeServerOwner.make")(function* (input: { }); }); +/** @public Service construction is part of the canonical Effect module API. */ export const layer = (input: { readonly binaryPath: string; readonly directory: string; diff --git a/apps/server/src/provider/acp/AntigravityAcpSupport.ts b/apps/server/src/provider/acp/AntigravityAcpSupport.ts index cb37df006587db24c13dd7bcd6579d77c876bcf1..6e625127cb18c85f75790864f4a4cc3049b7b2d9 100644 --- a/apps/server/src/provider/acp/AntigravityAcpSupport.ts +++ b/apps/server/src/provider/acp/AntigravityAcpSupport.ts @@ -181,7 +181,7 @@ const AUDIO_MIME_TYPES = new Set([ "audio/x-wav", "audio/webm", ]); -export const ANTIGRAVITY_MAX_AUDIO_ATTACHMENT_BYTES = 20 * 1024 * 1024; +const ANTIGRAVITY_MAX_AUDIO_ATTACHMENT_BYTES = 20 * 1024 * 1024; const TEXT_MIME_TYPES = new Set([ "application/json", "application/ld+json", diff --git a/apps/server/src/provider/acp/AntigravityProtocol.ts b/apps/server/src/provider/acp/AntigravityProtocol.ts index 81ec91d265b0f938a74ee0cd3c7cf64dc0f4f630..1993c9457af521d678b102df03d623731996523e 100644 --- a/apps/server/src/provider/acp/AntigravityProtocol.ts +++ b/apps/server/src/provider/acp/AntigravityProtocol.ts @@ -72,9 +72,7 @@ const decodeSecurityWarning = Schema.decodeUnknownOption( * The agent marks "Allow Always" on shell and web tools with a prompt injection * warning in `_meta`. Surface it as option text so both clients can show it. */ -export function antigravitySecurityWarning( - option: EffectAcpSchema.PermissionOption, -): string | undefined { +function antigravitySecurityWarning(option: EffectAcpSchema.PermissionOption): string | undefined { const meta = option._meta; if (!Predicate.isObject(meta)) return undefined; const warning = Option.getOrUndefined(decodeSecurityWarning(meta[SECURITY_WARNING_META_KEY])); diff --git a/apps/server/src/provider/antigravityRelease.ts b/apps/server/src/provider/antigravityRelease.ts index c33f09cef4651a43474197d89a9ceb26053454fa..90ba309c10c61d3bda1252535aa3392b033ebf76 100644 --- a/apps/server/src/provider/antigravityRelease.ts +++ b/apps/server/src/provider/antigravityRelease.ts @@ -1,4 +1,4 @@ -export const ANTIGRAVITY_RELEASE_VERSION = "agy_acp_server_1.1.1"; +const ANTIGRAVITY_RELEASE_VERSION = "agy_acp_server_1.1.1"; export interface AntigravityReleaseAsset { readonly version: string; diff --git a/apps/server/src/provider/opencodeRuntime.ts b/apps/server/src/provider/opencodeRuntime.ts index ce2840f6c13d5e85b1a4fcfb9469b6cb3c7b6947..6d7187792a997d3adea9d69e715a8f2a7a6f9522 100644 --- a/apps/server/src/provider/opencodeRuntime.ts +++ b/apps/server/src/provider/opencodeRuntime.ts @@ -438,9 +438,9 @@ export function openCodeQuestionId( * puts in the prompt. */ const OPENCODE_NATIVE_IMAGE_MIMES = new Set(["image/png", "image/jpeg", "image/gif", "image/webp"]); -export const OPENCODE_NATIVE_FILE_PART_MAX_BYTES = 20 * 1024 * 1024; +const OPENCODE_NATIVE_FILE_PART_MAX_BYTES = 20 * 1024 * 1024; -export function isOpenCodeNativeFilePart(input: { +function isOpenCodeNativeFilePart(input: { readonly mimeType: string; readonly sizeBytes: number; }): boolean { diff --git a/apps/server/src/provider/providerMaintenance.ts b/apps/server/src/provider/providerMaintenance.ts index e8ff090a4ec937ddb8ca7d3a196abf690a8b6a06..74167a8088402a9f95ff68d77cede5b64ad62990 100644 --- a/apps/server/src/provider/providerMaintenance.ts +++ b/apps/server/src/provider/providerMaintenance.ts @@ -33,7 +33,7 @@ const PROVIDER_UPDATE_ACTION_TOAST_MESSAGE = "Install the update now or review p * move on their own, so this mostly bounds how stale a Homebrew "latest" can * get; the npm registry check keeps its own cache. */ -export const MAINTENANCE_CAPABILITIES_CACHE_TTL = Duration.hours(1); +const MAINTENANCE_CAPABILITIES_CACHE_TTL = Duration.hours(1); const compactEnv = (input: Record>): NodeJS.ProcessEnv => Object.fromEntries( diff --git a/apps/server/src/provider/providerMaintenanceRunner.ts b/apps/server/src/provider/providerMaintenanceRunner.ts index e91560312566fe0a8ea7410b541fd554b0550a89..121e5aeab7d151b43e332fcb65588cf75a79ccb1 100644 --- a/apps/server/src/provider/providerMaintenanceRunner.ts +++ b/apps/server/src/provider/providerMaintenanceRunner.ts @@ -211,6 +211,7 @@ function makeUpdateState(input: { }; } +/** @public Service construction is part of the canonical Effect module API. */ export const make = Effect.fn("ProviderMaintenanceRunner.make")(function* () { const providerRegistry = yield* ProviderRegistry; const spawner = yield* ChildProcessSpawner.ChildProcessSpawner; diff --git a/apps/server/src/provider/providerSnapshot.ts b/apps/server/src/provider/providerSnapshot.ts index 4b5d4ae3ee4719c93eb400e5a01b5c1556bf9478..8c94b8bb977d4b453e0a5efe6d0420f248f521b2 100644 --- a/apps/server/src/provider/providerSnapshot.ts +++ b/apps/server/src/provider/providerSnapshot.ts @@ -105,42 +105,6 @@ export const spawnAndCollect = (binaryPath: string, command: ChildProcess.Comman return result; }).pipe(Effect.scoped); -export function detailFromResult( - result: CommandResult & { readonly timedOut?: boolean }, -): string | undefined { - if (result.timedOut) return "Timed out while running command."; - const stderr = nonEmptyTrimmed(result.stderr); - if (stderr) return stderr; - const stdout = nonEmptyTrimmed(result.stdout); - if (stdout) return stdout; - if (result.code !== 0) { - return `Command exited with code ${result.code}.`; - } - return undefined; -} - -export function extractAuthBoolean(value: unknown): boolean | undefined { - if (globalThis.Array.isArray(value)) { - for (const entry of value) { - const nested = extractAuthBoolean(entry); - if (nested !== undefined) return nested; - } - return undefined; - } - - if (!value || typeof value !== "object") return undefined; - - const record = value as Record; - for (const key of ["authenticated", "isAuthenticated", "loggedIn", "isLoggedIn"] as const) { - if (typeof record[key] === "boolean") return record[key]; - } - for (const key of ["auth", "status", "session", "account"] as const) { - const nested = extractAuthBoolean(record[key]); - if (nested !== undefined) return nested; - } - return undefined; -} - export function parseGenericCliVersion(output: string): string | null { const match = output.match(/\b(\d+\.\d+\.\d+)\b/); return match?.[1] ?? null; diff --git a/apps/server/src/provider/providerUpdateSettings.ts b/apps/server/src/provider/providerUpdateSettings.ts index 308d84a144672ef1829868154ce8584b7c3ef381..30ad2bf8a286cb33389fe57003203418f81fc84b 100644 --- a/apps/server/src/provider/providerUpdateSettings.ts +++ b/apps/server/src/provider/providerUpdateSettings.ts @@ -10,7 +10,7 @@ export interface ProviderSnapshotSettings { readonly enableProviderUpdateChecks: boolean; } -export function makeProviderSnapshotSettings( +function makeProviderSnapshotSettings( provider: Settings, settings: ServerSettings, ): ProviderSnapshotSettings { diff --git a/apps/server/src/provider/testUtils/providerRegistryMock.ts b/apps/server/src/provider/testUtils/providerRegistryMock.ts index d9a04de6f607a4d855c9b06f7ed8aa9ffceff065..b2195b1d890c1f95965bdf14d38965e856d5282e 100644 --- a/apps/server/src/provider/testUtils/providerRegistryMock.ts +++ b/apps/server/src/provider/testUtils/providerRegistryMock.ts @@ -5,7 +5,7 @@ import * as Layer from "effect/Layer"; import * as Stream from "effect/Stream"; import { makeManualOnlyProviderMaintenanceCapabilities } from "../providerMaintenance.ts"; -export const makeProviderRegistryMock = ( +const makeProviderRegistryMock = ( providers: ReadonlyArray = [], ): ProviderRegistryShape => ({ getProviders: Effect.succeed(providers),