fix: preserve runtime option defaults (#38118)

This commit is contained in:
Dax 2026-07-21 10:30:18 -04:00 committed by GitHub
commit 7243bd9e12
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 27 additions and 5 deletions

View file

@ -552,7 +552,7 @@ export const layer = (options?: Options) => Layer.effect(
), ),
) )
const source = options?.url ?? "https://models.dev" const source = options?.url || "https://models.dev"
const fetch = options?.fetch ?? true const fetch = options?.fetch ?? true
const userAgent = `opencode/${InstallationChannel}/${InstallationVersion}/${options?.client ?? "cli"}` const userAgent = `opencode/${InstallationChannel}/${InstallationVersion}/${options?.client ?? "cli"}`
const filepath = path.join( const filepath = path.join(

View file

@ -236,6 +236,16 @@ describe("ModelsDev Service", () => {
}), }),
) )
it.live("uses the default models URL when the configured URL is empty", () =>
Effect.gen(function* () {
const state = yield* Ref.make(initialState)
yield* ModelsDev.Service.use((service) => service.get()).pipe(
Effect.provide(buildLayer(state, { url: "", fetch: true })),
)
expect((yield* Ref.get(state)).calls[0]?.url).toBe("https://models.dev/api.json")
}),
)
it.live("get() is single-flight under concurrent calls", () => it.live("get() is single-flight under concurrent calls", () =>
Effect.gen(function* () { Effect.gen(function* () {
yield* writeCache(fixture) yield* writeCache(fixture)

View file

@ -7,7 +7,7 @@ export const ServerOptions = Schema.Struct({
client: Schema.optional(Schema.String), client: Schema.optional(Schema.String),
hostname: Schema.optional(Schema.String), hostname: Schema.optional(Schema.String),
port: Schema.optional( port: Schema.optional(
Schema.Int.check(Schema.isGreaterThanOrEqualTo(1), Schema.isLessThanOrEqualTo(65_535)), Schema.Int.check(Schema.isGreaterThanOrEqualTo(0), Schema.isLessThanOrEqualTo(65_535)),
), ),
password: Schema.optional(Schema.String), password: Schema.optional(Schema.String),
simulation: Schema.optional(Schema.Boolean), simulation: Schema.optional(Schema.Boolean),

View file

@ -30,7 +30,7 @@ import { SdkPlugins } from "@opencode-ai/core/plugin/sdk"
import { ToolOutputStore } from "@opencode-ai/core/tool-output-store" import { ToolOutputStore } from "@opencode-ai/core/tool-output-store"
import { WellKnown } from "@opencode-ai/core/wellknown" import { WellKnown } from "@opencode-ai/core/wellknown"
import { Watcher } from "@opencode-ai/core/filesystem/watcher" import { Watcher } from "@opencode-ai/core/filesystem/watcher"
import { HttpRouter, HttpServer } from "effect/unstable/http" import { HttpRouter } from "effect/unstable/http"
import { HttpApiBuilder } from "effect/unstable/httpapi" import { HttpApiBuilder } from "effect/unstable/httpapi"
import { Context, Effect, Layer, Option } from "effect" import { Context, Effect, Layer, Option } from "effect"
import { Api } from "./api" import { Api } from "./api"
@ -143,5 +143,3 @@ function makeRoutes<AuthError, AuthServices>(
}), }),
) )
} }
export const webHandler = () => HttpRouter.toWebHandler(createRoutes().pipe(Layer.provide(HttpServer.layerServices)))

View file

@ -0,0 +1,14 @@
import { expect, test } from "bun:test"
import { ServerOptions } from "@opencode-ai/server/options"
import { Option, Schema } from "effect"
const decode = Schema.decodeUnknownOption(ServerOptions)
test("accepts ephemeral port zero", () => {
expect(Option.isSome(decode({ port: 0 }))).toBe(true)
})
test("rejects ports outside the valid range", () => {
expect(Option.isNone(decode({ port: -1 }))).toBe(true)
expect(Option.isNone(decode({ port: 65_536 }))).toBe(true)
})