diff --git a/packages/opencode/script/build.ts b/packages/opencode/script/build.ts index 5aa14d52cd..bc280b9700 100755 --- a/packages/opencode/script/build.ts +++ b/packages/opencode/script/build.ts @@ -213,7 +213,7 @@ for (const item of targets) { }, files: embeddedFileMap ? { "opencode-web-ui.gen.ts": embeddedFileMap } : {}, entrypoints: [ - "./src/index.ts", + "./src/temporary.ts", parserWorker, workerPath, rgPath, diff --git a/packages/opencode/src/cli/cmd/tui/app.tsx b/packages/opencode/src/cli/cmd/tui/app.tsx index 8255c007d0..3e56cd9b5d 100644 --- a/packages/opencode/src/cli/cmd/tui/app.tsx +++ b/packages/opencode/src/cli/cmd/tui/app.tsx @@ -28,7 +28,7 @@ import { useEvent } from "@tui/context/event" import { SDKProvider, useSDK } from "@tui/context/sdk" import { StartupLoading } from "@tui/component/startup-loading" import { SyncProvider, useSync } from "@tui/context/sync" -import { LocalProvider, useLocal } from "@tui/context/local" +import { LocalProvider, parseModel, useLocal } from "@tui/context/local" import { DialogModel, useConnected } from "@tui/component/dialog-model" import { DialogMcp } from "@tui/component/dialog-mcp" import { DialogStatus } from "@tui/component/dialog-status" @@ -49,10 +49,8 @@ import { DialogAlert } from "./ui/dialog-alert" import { DialogConfirm } from "./ui/dialog-confirm" import { ToastProvider, useToast } from "./ui/toast" import { ExitProvider, useExit } from "./context/exit" -import { Session as SessionApi } from "@/session" import { TuiEvent } from "./event" import { KVProvider, useKV } from "./context/kv" -import { Provider } from "@/provider" import { ArgsProvider, useArgs, type Args } from "./context/args" import open from "open" import { PromptRefProvider, usePromptRef } from "./context/prompt" @@ -304,7 +302,7 @@ function App(props: { onSnapshot?: () => Promise }) { if (route.data.type === "session") { const session = sync.session.get(route.data.sessionID) - if (!session || SessionApi.isDefaultTitle(session.title)) { + if (!session) { renderer.setTerminalTitle("OpenCode") return } @@ -324,7 +322,7 @@ function App(props: { onSnapshot?: () => Promise }) { batch(() => { if (args.agent) local.agent.set(args.agent) if (args.model) { - const { providerID, modelID } = Provider.parseModel(args.model) + const { providerID, modelID } = parseModel(args.model) if (!providerID || !modelID) return toast.show({ variant: "warning", diff --git a/packages/opencode/src/cli/cmd/tui/event.ts b/packages/opencode/src/cli/cmd/tui/event.ts index fa164d53e8..367b0ce604 100644 --- a/packages/opencode/src/cli/cmd/tui/event.ts +++ b/packages/opencode/src/cli/cmd/tui/event.ts @@ -1,5 +1,4 @@ import { BusEvent } from "@/bus/bus-event" -import { SessionID } from "@/session/schema" import z from "zod" export const TuiEvent = { @@ -42,7 +41,7 @@ export const TuiEvent = { SessionSelect: BusEvent.define( "tui.session.select", z.object({ - sessionID: SessionID.zod.describe("Session ID to navigate to"), + sessionID: z.string().describe("Session ID to navigate to"), }), ), } diff --git a/packages/opencode/src/cli/cmd/tui/plugin/runtime.ts b/packages/opencode/src/cli/cmd/tui/plugin/runtime.ts index e1b2eca1dd..6e5b02a472 100644 --- a/packages/opencode/src/cli/cmd/tui/plugin/runtime.ts +++ b/packages/opencode/src/cli/cmd/tui/plugin/runtime.ts @@ -16,7 +16,6 @@ import { TuiConfig } from "@/cli/cmd/tui/config/tui" import { Log } from "@/util" import { errorData, errorMessage } from "@/util/error" import { isRecord } from "@/util/record" -import { Instance } from "@/project/instance" import { readPackageThemes, readPluginId, @@ -790,10 +789,7 @@ async function addPluginBySpec(state: RuntimeState | undefined, raw: string) { state.pending.delete(spec) return true } - const ready = await Instance.provide({ - directory: state.directory, - fn: () => resolveExternalPlugins([cfg], () => TuiConfig.waitForDependencies()), - }).catch((error) => { + const ready = await resolveExternalPlugins([cfg], () => TuiConfig.waitForDependencies()).catch((error) => { fail("failed to add tui plugin", { path: next, error }) return [] as PluginLoad[] }) @@ -987,42 +983,37 @@ export namespace TuiPluginRuntime { } runtime = next try { - await Instance.provide({ - directory: cwd, - fn: async () => { - const records = Flag.OPENCODE_PURE ? [] : (config.plugin_origins ?? []) - if (Flag.OPENCODE_PURE && config.plugin_origins?.length) { - log.info("skipping external tui plugins in pure mode", { count: config.plugin_origins.length }) - } + const records = Flag.OPENCODE_PURE ? [] : (config.plugin_origins ?? []) + if (Flag.OPENCODE_PURE && config.plugin_origins?.length) { + log.info("skipping external tui plugins in pure mode", { count: config.plugin_origins.length }) + } - for (const item of INTERNAL_TUI_PLUGINS) { - log.info("loading internal tui plugin", { id: item.id }) - const entry = loadInternalPlugin(item) - const meta = createMeta(entry.source, entry.spec, entry.target, undefined, entry.id) - addPluginEntry(next, { - id: entry.id, - load: entry, - meta, - themes: {}, - plugin: entry.module.tui, - enabled: true, - }) - } + for (const item of INTERNAL_TUI_PLUGINS) { + log.info("loading internal tui plugin", { id: item.id }) + const entry = loadInternalPlugin(item) + const meta = createMeta(entry.source, entry.spec, entry.target, undefined, entry.id) + addPluginEntry(next, { + id: entry.id, + load: entry, + meta, + themes: {}, + plugin: entry.module.tui, + enabled: true, + }) + } - const ready = await resolveExternalPlugins(records, () => TuiConfig.waitForDependencies()) - await addExternalPluginEntries(next, ready) + const ready = await resolveExternalPlugins(records, () => TuiConfig.waitForDependencies()) + await addExternalPluginEntries(next, ready) - applyInitialPluginEnabledState(next, config) - for (const plugin of next.plugins) { - if (!plugin.enabled) continue - // Keep plugin execution sequential for deterministic side effects: - // command registration order affects keybind/command precedence, - // route registration is last-wins when ids collide, - // and hook chains rely on stable plugin ordering. - await activatePluginEntry(next, plugin, false) - } - }, - }) + applyInitialPluginEnabledState(next, config) + for (const plugin of next.plugins) { + if (!plugin.enabled) continue + // Keep plugin execution sequential for deterministic side effects: + // command registration order affects keybind/command precedence, + // route registration is last-wins when ids collide, + // and hook chains rely on stable plugin ordering. + await activatePluginEntry(next, plugin, false) + } } catch (error) { fail("failed to load tui plugins", { directory: cwd, error }) } diff --git a/packages/opencode/src/config/config.ts b/packages/opencode/src/config/config.ts index 3cbc539600..ee72c1930d 100644 --- a/packages/opencode/src/config/config.ts +++ b/packages/opencode/src/config/config.ts @@ -203,7 +203,7 @@ export const Info = z .optional(), lsp: z .union([ - z.literal(false), + z.literal(true), z.record( z.string(), z.union([ diff --git a/packages/opencode/src/config/variable.ts b/packages/opencode/src/config/variable.ts index e016e33a21..a2ceba7aef 100644 --- a/packages/opencode/src/config/variable.ts +++ b/packages/opencode/src/config/variable.ts @@ -5,7 +5,7 @@ import os from "os" import { Filesystem } from "@/util" import { InvalidError } from "./error" -type ParseSource = +export type ParseSource = | { type: "path" path: string diff --git a/packages/opencode/src/lsp/lsp.ts b/packages/opencode/src/lsp/lsp.ts index d895e73256..ac97d65838 100644 --- a/packages/opencode/src/lsp/lsp.ts +++ b/packages/opencode/src/lsp/lsp.ts @@ -167,7 +167,7 @@ export const layer = Layer.effect( const servers: Record = {} - if (cfg.lsp === false) { + if (!cfg.lsp) { log.info("all LSPs are disabled") } else { for (const server of Object.values(LSPServer)) { diff --git a/packages/opencode/src/server/instance/tui.ts b/packages/opencode/src/server/instance/tui.ts index 0073ef98c9..4c6ecb5e9f 100644 --- a/packages/opencode/src/server/instance/tui.ts +++ b/packages/opencode/src/server/instance/tui.ts @@ -8,6 +8,7 @@ import { AppRuntime } from "@/effect/app-runtime" import { AsyncQueue } from "../../util/queue" import { errors } from "../error" import { lazy } from "../../util/lazy" +import { SessionID } from "@/session/schema" const TuiRequest = z.object({ path: z.string(), @@ -371,7 +372,7 @@ export const TuiRoutes = lazy(() => validator("json", TuiEvent.SessionSelect.properties), async (c) => { const { sessionID } = c.req.valid("json") - await AppRuntime.runPromise(Session.Service.use((svc) => svc.get(sessionID))) + await AppRuntime.runPromise(Session.Service.use((svc) => svc.get(SessionID.make(sessionID)))) await Bus.publish(TuiEvent.SessionSelect, { sessionID }) return c.json(true) }, diff --git a/packages/opencode/src/temporary.ts b/packages/opencode/src/temporary.ts index bbb97e0f0f..1769b9a44a 100644 --- a/packages/opencode/src/temporary.ts +++ b/packages/opencode/src/temporary.ts @@ -1,33 +1,10 @@ -import yargs from "yargs" import { TuiThreadCommand } from "./cli/cmd/tui/thread" -import { InstallationVersion } from "./installation/version" -import { hideBin } from "yargs/helpers" import { Log } from "./node" Log.init({ print: false, }) -const cli = yargs(hideBin(process.argv)) - .parserConfiguration({ "populate--": true }) - .scriptName("opencode") - .wrap(100) - .help("help", "show help") - .alias("help", "h") - .version("version", "show version number", InstallationVersion) - .alias("version", "v") - .option("print-logs", { - describe: "print logs to stderr", - type: "boolean", - }) - .option("log-level", { - describe: "log level", - type: "string", - choices: ["DEBUG", "INFO", "WARN", "ERROR"], - }) - .option("pure", { - describe: "run without external plugins", - type: "boolean", - }) - .command(TuiThreadCommand) - .parse() +console.log(TuiThreadCommand) + +console.log(performance.now())