import { existsSync, readFileSync } from "node:fs" import { parseJsonc } from "../../shared" import type { DetectedConfig } from "../types" import { getOmoConfigPath } from "./config-context" import { detectConfigFormat } from "./opencode-config-format" import { parseOpenCodeConfigFileWithError } from "./parse-opencode-config-file" function detectProvidersFromOmoConfig(): { hasOpenAI: boolean hasOpencodeZen: boolean hasZaiCodingPlan: boolean hasKimiForCoding: boolean } { const omoConfigPath = getOmoConfigPath() if (!existsSync(omoConfigPath)) { return { hasOpenAI: true, hasOpencodeZen: true, hasZaiCodingPlan: false, hasKimiForCoding: false } } try { const content = readFileSync(omoConfigPath, "utf-8") const omoConfig = parseJsonc>(content) if (!omoConfig || typeof omoConfig !== "object") { return { hasOpenAI: true, hasOpencodeZen: true, hasZaiCodingPlan: false, hasKimiForCoding: false } } const configStr = JSON.stringify(omoConfig) const hasOpenAI = configStr.includes('"openai/') const hasOpencodeZen = configStr.includes('"opencode/') const hasZaiCodingPlan = configStr.includes('"zai-coding-plan/') const hasKimiForCoding = configStr.includes('"kimi-for-coding/') return { hasOpenAI, hasOpencodeZen, hasZaiCodingPlan, hasKimiForCoding } } catch { return { hasOpenAI: true, hasOpencodeZen: true, hasZaiCodingPlan: false, hasKimiForCoding: false } } } export function detectCurrentConfig(): DetectedConfig { const result: DetectedConfig = { isInstalled: false, hasClaude: true, isMax20: true, hasOpenAI: true, hasGemini: false, hasCopilot: false, hasOpencodeZen: true, hasZaiCodingPlan: false, hasKimiForCoding: false, } const { format, path } = detectConfigFormat() if (format === "none") { return result } const parseResult = parseOpenCodeConfigFileWithError(path) if (!parseResult.config) { return result } const openCodeConfig = parseResult.config const plugins = openCodeConfig.plugin ?? [] result.isInstalled = plugins.some((p) => p.startsWith("oh-my-opencode")) if (!result.isInstalled) { return result } result.hasGemini = plugins.some((p) => p.startsWith("opencode-antigravity-auth")) const { hasOpenAI, hasOpencodeZen, hasZaiCodingPlan, hasKimiForCoding } = detectProvidersFromOmoConfig() result.hasOpenAI = hasOpenAI result.hasOpencodeZen = hasOpencodeZen result.hasZaiCodingPlan = hasZaiCodingPlan result.hasKimiForCoding = hasKimiForCoding return result }