| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 |
- import "zod-openapi/extend"
- import yargs from "yargs"
- import { hideBin } from "yargs/helpers"
- import { RunCommand } from "./cli/cmd/run"
- import { GenerateCommand } from "./cli/cmd/generate"
- import { Log } from "./util/log"
- import { AuthCommand } from "./cli/cmd/auth"
- import { UpgradeCommand } from "./cli/cmd/upgrade"
- import { ModelsCommand } from "./cli/cmd/models"
- import { UI } from "./cli/ui"
- import { Installation } from "./installation"
- import { NamedError } from "./util/error"
- import { FormatError } from "./cli/error"
- import { ServeCommand } from "./cli/cmd/serve"
- import { TuiCommand } from "./cli/cmd/tui"
- import { DebugCommand } from "./cli/cmd/debug"
- const cancel = new AbortController()
- process.on("unhandledRejection", (e) => {
- Log.Default.error("rejection", {
- e: e instanceof Error ? e.message : e,
- })
- })
- process.on("uncaughtException", (e) => {
- Log.Default.error("exception", {
- e: e instanceof Error ? e.message : e,
- })
- })
- const cli = yargs(hideBin(process.argv))
- .scriptName("opencode")
- .help("help", "show help")
- .version("version", "show version number", Installation.VERSION)
- .alias("version", "v")
- .option("print-logs", {
- describe: "print logs to stderr",
- type: "boolean",
- })
- .middleware(async () => {
- await Log.init({ print: process.argv.includes("--print-logs") })
- try {
- const { Config } = await import("./config/config")
- const { App } = await import("./app/app")
- App.provide({ cwd: process.cwd() }, async () => {
- const cfg = await Config.get()
- if (cfg.log_level) {
- Log.setLevel(cfg.log_level as Log.Level)
- } else {
- const defaultLevel = Installation.isDev() ? "DEBUG" : "INFO"
- Log.setLevel(defaultLevel)
- }
- })
- } catch (e) {
- Log.Default.error("failed to load config", { error: e })
- }
- Log.Default.info("opencode", {
- version: Installation.VERSION,
- args: process.argv.slice(2),
- })
- })
- .usage("\n" + UI.logo())
- .command(TuiCommand)
- .command(RunCommand)
- .command(GenerateCommand)
- .command(DebugCommand)
- .command(AuthCommand)
- .command(UpgradeCommand)
- .command(ServeCommand)
- .command(ModelsCommand)
- .fail((msg) => {
- if (msg.startsWith("Unknown argument") || msg.startsWith("Not enough non-option arguments")) {
- cli.showHelp("log")
- }
- })
- .strict()
- try {
- await cli.parse()
- } catch (e) {
- let data: Record<string, any> = {}
- if (e instanceof NamedError) {
- const obj = e.toObject()
- Object.assign(data, {
- ...obj.data,
- })
- }
- if (e instanceof Error) {
- Object.assign(data, {
- name: e.name,
- message: e.message,
- cause: e.cause?.toString(),
- })
- }
- if (e instanceof ResolveMessage) {
- Object.assign(data, {
- name: e.name,
- message: e.message,
- code: e.code,
- specifier: e.specifier,
- referrer: e.referrer,
- position: e.position,
- importKind: e.importKind,
- })
- }
- Log.Default.error("fatal", data)
- const formatted = FormatError(e)
- if (formatted) UI.error(formatted)
- if (formatted === undefined) UI.error("Unexpected error, check log file at " + Log.file() + " for more details")
- process.exitCode = 1
- }
- cancel.abort()
|