34 lines
1.3 KiB
TypeScript
34 lines
1.3 KiB
TypeScript
import { Provider } from "../provider/provider"
|
|
import { NamedError } from "@opencode-ai/util/error"
|
|
import { NotFoundError } from "../storage/db"
|
|
import { Session } from "../session"
|
|
import type { ContentfulStatusCode } from "hono/utils/http-status"
|
|
import type { ErrorHandler } from "hono"
|
|
import { HTTPException } from "hono/http-exception"
|
|
import type { Log } from "../util/log"
|
|
|
|
export function errorHandler(log: Log.Logger): ErrorHandler {
|
|
return (err, c) => {
|
|
log.error("failed", {
|
|
error: err,
|
|
})
|
|
if (err instanceof NamedError) {
|
|
let status: ContentfulStatusCode
|
|
if (err instanceof NotFoundError) status = 404
|
|
else if (err instanceof Provider.ModelNotFoundError) status = 400
|
|
else if (err.name === "ProviderAuthValidationFailed") status = 400
|
|
else if (err.name.startsWith("Worktree")) status = 400
|
|
else status = 500
|
|
return c.json(err.toObject(), { status })
|
|
}
|
|
if (err instanceof Session.BusyError) {
|
|
return c.json(new NamedError.Unknown({ message: err.message }).toObject(), { status: 400 })
|
|
}
|
|
if (err instanceof HTTPException) return err.getResponse()
|
|
const message = err instanceof Error && err.stack ? err.stack : err.toString()
|
|
return c.json(new NamedError.Unknown({ message }).toObject(), {
|
|
status: 500,
|
|
})
|
|
}
|
|
}
|