mirror of
https://gitea.toothfairyai.com/ToothFairyAI/tf_code.git
synced 2026-03-30 22:03:58 +00:00
76 lines
2.0 KiB
TypeScript
76 lines
2.0 KiB
TypeScript
import { spawn } from "bun"
|
|
import z from "zod"
|
|
import { NamedError } from "../util/error"
|
|
import { Log } from "../util/log"
|
|
import { Bus } from "../bus"
|
|
|
|
const SUPPORTED_IDES = [
|
|
{ name: "Windsurf" as const, cmd: "windsurf" },
|
|
{ name: "Visual Studio Code - Insiders" as const, cmd: "code-insiders" },
|
|
{ name: "Visual Studio Code" as const, cmd: "code" },
|
|
{ name: "Cursor" as const, cmd: "cursor" },
|
|
{ name: "VSCodium" as const, cmd: "codium" },
|
|
]
|
|
|
|
export namespace Ide {
|
|
const log = Log.create({ service: "ide" })
|
|
|
|
export const Event = {
|
|
Installed: Bus.event(
|
|
"ide.installed",
|
|
z.object({
|
|
ide: z.string(),
|
|
}),
|
|
),
|
|
}
|
|
|
|
export const AlreadyInstalledError = NamedError.create("AlreadyInstalledError", z.object({}))
|
|
|
|
export const InstallFailedError = NamedError.create(
|
|
"InstallFailedError",
|
|
z.object({
|
|
stderr: z.string(),
|
|
}),
|
|
)
|
|
|
|
export function ide() {
|
|
if (process.env["TERM_PROGRAM"] === "vscode") {
|
|
const v = process.env["GIT_ASKPASS"]
|
|
for (const ide of SUPPORTED_IDES) {
|
|
if (v?.includes(ide.name)) return ide.name
|
|
}
|
|
}
|
|
return "unknown"
|
|
}
|
|
|
|
export function alreadyInstalled() {
|
|
return process.env["OPENCODE_CALLER"] === "vscode" || process.env["OPENCODE_CALLER"] === "vscode-insiders"
|
|
}
|
|
|
|
export async function install(ide: (typeof SUPPORTED_IDES)[number]["name"]) {
|
|
const cmd = SUPPORTED_IDES.find((i) => i.name === ide)?.cmd
|
|
if (!cmd) throw new Error(`Unknown IDE: ${ide}`)
|
|
|
|
const p = spawn([cmd, "--install-extension", "sst-dev.opencode"], {
|
|
stdout: "pipe",
|
|
stderr: "pipe",
|
|
})
|
|
await p.exited
|
|
const stdout = await new Response(p.stdout).text()
|
|
const stderr = await new Response(p.stderr).text()
|
|
|
|
log.info("installed", {
|
|
ide,
|
|
stdout,
|
|
stderr,
|
|
})
|
|
|
|
if (p.exitCode !== 0) {
|
|
throw new InstallFailedError({ stderr })
|
|
}
|
|
if (stdout.includes("already installed")) {
|
|
throw new AlreadyInstalledError({})
|
|
}
|
|
}
|
|
}
|