refactor(schema): derive partial config capabilities from Model.Capabilities

This commit is contained in:
James Long
2026-09-29 19:08:31 +00:00
parent e082357f29
commit 4f0263061d
2 changed files with 12 additions and 10 deletions
@@ -430,6 +430,8 @@ export type McpProtocol = "legacy" | "auto" | "2026-07-28"
export type ConfigWorktree = { directory: string }
export type ConfigModelCapabilities = { tools?: boolean; input?: Array<string>; output?: Array<string> }
export type ConfigShellOption = { path: string; name: string; acceptable: boolean }
export type SessionMessageLocationSwitched = {
@@ -2130,7 +2132,7 @@ export type ConfigEntry =
settings?: ConfigModelSettings
headers?: { [x: string]: string }
body?: { [x: string]: JsonValue }
capabilities?: { tools?: boolean; input?: Array<string>; output?: Array<string> }
capabilities?: ConfigModelCapabilities
variants?: Array<{
id: string
settings?: ConfigModelSettings
+9 -9
View File
@@ -2,7 +2,7 @@ export * as ConfigProvider from "./provider.js"
import { Schema } from "effect"
import { Money } from "../money.js"
import { Compatibility, Family, ID, VariantID } from "../model.js"
import { Capabilities, Compatibility, Family, ID, VariantID } from "../model.js"
import { Provider } from "../provider.js"
import { optional } from "../schema.js"
@@ -59,13 +59,6 @@ class Cost extends Schema.Class<Cost>("Config.Model.Cost")({
cache: Cache.pipe(optional),
}) {}
// Partial: unset fields fall back to the existing/base model's capabilities or Model.Capabilities.default().
class ModelCapabilities extends Schema.Class<ModelCapabilities>("Config.Model.Capabilities")({
tools: Schema.Boolean.pipe(optional),
input: Schema.Array(Schema.String).pipe(optional),
output: Schema.Array(Schema.String).pipe(optional),
}) {}
class Limit extends Schema.Class<Limit>("Config.Model.Limit")({
context: Schema.Int.pipe(optional),
input: Schema.Int.pipe(optional),
@@ -79,7 +72,14 @@ class Model extends Schema.Class<Model>("Config.Model")({
compatibility: Compatibility.pipe(optional),
package: Schema.String.pipe(optional),
...ModelOverlays,
capabilities: ModelCapabilities.pipe(optional),
// Partial: unset fields fall back to the base model's capabilities, then the defaults.
capabilities: Capabilities.mapFields((fields) => ({
tools: optional(fields.tools),
input: optional(fields.input),
output: optional(fields.output),
}))
.annotate({ identifier: "Config.Model.Capabilities" })
.pipe(optional),
variants: Schema.Struct({
id: VariantID,
...ModelOverlays,