79 lines
2.5 KiB
TypeScript
79 lines
2.5 KiB
TypeScript
|
|
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<Record<string, unknown>>(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
|
||
|
|
}
|