2025-10-30 15:56:30 +00:00
|
|
|
import { ConfigMarkdown } from "@/config/markdown"
|
2025-06-20 04:57:28 +00:00
|
|
|
import { Config } from "../config/config"
|
2025-06-23 01:10:05 +00:00
|
|
|
import { MCP } from "../mcp"
|
2025-11-11 22:13:55 +00:00
|
|
|
import { Provider } from "../provider/provider"
|
2025-06-25 02:09:43 +00:00
|
|
|
import { UI } from "./ui"
|
2025-06-20 04:57:28 +00:00
|
|
|
|
|
|
|
|
export function FormatError(input: unknown) {
|
2025-06-23 01:10:05 +00:00
|
|
|
if (MCP.Failed.isInstance(input))
|
|
|
|
|
return `MCP server "${input.data.name}" failed. Note, opencode does not support MCP authentication yet.`
|
2025-11-11 22:13:55 +00:00
|
|
|
if (Provider.ModelNotFoundError.isInstance(input)) {
|
2025-11-12 15:41:38 +00:00
|
|
|
const { providerID, modelID, suggestions } = input.data
|
2025-11-11 22:13:55 +00:00
|
|
|
return [
|
|
|
|
|
`Model not found: ${providerID}/${modelID}`,
|
2025-11-12 15:41:38 +00:00
|
|
|
...(Array.isArray(suggestions) && suggestions.length
|
|
|
|
|
? ["Did you mean: " + suggestions.join(", ")]
|
|
|
|
|
: []),
|
2025-11-11 22:13:55 +00:00
|
|
|
`Try: \`opencode models\` to list available models`,
|
|
|
|
|
`Or check your config (opencode.json) provider/model names`,
|
|
|
|
|
].join("\n")
|
|
|
|
|
}
|
|
|
|
|
if (Provider.InitError.isInstance(input)) {
|
|
|
|
|
return `Failed to initialize provider "${input.data.providerID}". Check credentials and configuration.`
|
|
|
|
|
}
|
2025-07-31 11:25:26 +00:00
|
|
|
if (Config.JsonError.isInstance(input)) {
|
|
|
|
|
return (
|
|
|
|
|
`Config file at ${input.data.path} is not valid JSON(C)` + (input.data.message ? `: ${input.data.message}` : "")
|
|
|
|
|
)
|
|
|
|
|
}
|
2025-10-17 19:34:37 +00:00
|
|
|
if (Config.ConfigDirectoryTypoError.isInstance(input)) {
|
|
|
|
|
return `Directory "${input.data.dir}" in ${input.data.path} is not valid. Use "${input.data.suggestion}" instead. This is a common typo.`
|
|
|
|
|
}
|
2025-10-30 15:56:30 +00:00
|
|
|
if (ConfigMarkdown.FrontmatterError.isInstance(input)) {
|
|
|
|
|
return `Failed to parse frontmatter in ${input.data.path}:\n${input.data.message}`
|
|
|
|
|
}
|
2025-06-20 04:57:28 +00:00
|
|
|
if (Config.InvalidError.isInstance(input))
|
|
|
|
|
return [
|
2025-08-13 00:28:41 +00:00
|
|
|
`Config file at ${input.data.path} is invalid` + (input.data.message ? `: ${input.data.message}` : ""),
|
2025-07-07 19:53:43 +00:00
|
|
|
...(input.data.issues?.map((issue) => "↳ " + issue.message + " " + issue.path.join(".")) ?? []),
|
2025-06-20 04:57:28 +00:00
|
|
|
].join("\n")
|
2025-06-25 02:09:43 +00:00
|
|
|
|
|
|
|
|
if (UI.CancelledError.isInstance(input)) return ""
|
2025-06-20 04:57:28 +00:00
|
|
|
}
|