chore: merge dev

This commit is contained in:
Dax Raad
2026-06-04 01:24:55 -04:00
312 changed files with 32760 additions and 4465 deletions
@@ -5,6 +5,7 @@ import { PublicApi } from "../../src/server/routes/instance/httpapi/public"
type Method = "get" | "post" | "put" | "delete" | "patch"
type OpenApiSchema = {
readonly $ref?: string
readonly anyOf?: ReadonlyArray<OpenApiSchema>
readonly type?: string
readonly enum?: readonly unknown[]
readonly properties?: Record<string, OpenApiSchema>
@@ -22,6 +23,7 @@ type OpenApiOperation = {
readonly schema?: { readonly type?: string }
}>
readonly responses?: Record<string, OpenApiResponse>
readonly requestBody?: { readonly required?: boolean }
readonly security?: unknown
}
type OpenApiPathItem = Partial<Record<Method, OpenApiOperation>>
@@ -53,6 +55,12 @@ function componentName(ref: string) {
return ref.replace("#/components/schemas/", "")
}
function componentNames(response: OpenApiResponse | undefined) {
const schema = response?.content?.["application/json"]?.schema
if (!schema) return []
return [schema, ...(schema.anyOf ?? [])].flatMap((item) => (item.$ref ? [componentName(item.$ref)] : []))
}
function isBuiltInEndpointError(name: string) {
return name.startsWith("EffectHttpApiError") || name.startsWith("effect_HttpApiError_")
}
@@ -97,6 +105,18 @@ describe("PublicApi OpenAPI v2 errors", () => {
}
})
test("preserves required request bodies for v2 mutations", () => {
const spec = OpenApi.fromApi(PublicApi) as OpenApiSpec
for (const path of [
"/api/session/{sessionID}/prompt",
"/api/session/{sessionID}/permission/request/{requestID}/reply",
"/api/session/{sessionID}/question/request/{requestID}/reply",
]) {
expect(spec.paths[path]?.post?.requestBody?.required, path).toBe(true)
}
})
test("does not rewrite /api endpoint errors to legacy error components", () => {
const spec = OpenApi.fromApi(PublicApi) as OpenApiSpec
const refs = v2Operations(spec)
@@ -165,7 +185,6 @@ describe("PublicApi OpenAPI v2 errors", () => {
const spec = OpenApi.fromApi(PublicApi) as OpenApiSpec
for (const route of [
["post", "/api/session/{sessionID}/prompt"],
["post", "/api/session/{sessionID}/compact"],
["post", "/api/session/{sessionID}/wait"],
] as const) {
@@ -217,6 +236,15 @@ describe("PublicApi OpenAPI v2 errors", () => {
"QuestionNotFoundError",
)
}
for (const route of [
["post", "/api/session/{sessionID}/question/request/{requestID}/reply"],
["post", "/api/session/{sessionID}/question/request/{requestID}/reject"],
] as const) {
expect(componentNames(spec.paths[route[1]]?.[route[0]]?.responses?.["404"])).toEqual([
"SessionNotFoundError",
"QuestionNotFoundError",
])
}
})
test("documents MCP server not-found errors", () => {