Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 0 additions & 9 deletions packages/opencode/src/cli/cmd/tui/app.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@ import { LocalProvider, useLocal } from "@tui/context/local"
import { DialogModel, useConnected } from "@tui/component/dialog-model"
import { DialogMcp } from "@tui/component/dialog-mcp"
import { DialogTools } from "@tui/component/dialog-tools"
import { DialogIde } from "@tui/component/dialog-ide"
import { DialogStatus } from "@tui/component/dialog-status"
import { DialogThemeList } from "@tui/component/dialog-theme-list"
import { DialogSpinnerList, DialogSpinnerInterval } from "@tui/component/dialog-spinner"
Expand Down Expand Up @@ -378,14 +377,6 @@ function App() {
dialog.replace(() => <DialogTools />)
},
},
{
title: "Toggle IDEs",
value: "ide.list",
category: "Agent",
onSelect: () => {
dialog.replace(() => <DialogIde />)
},
},
{
title: "Agent cycle",
value: "agent.cycle",
Expand Down
76 changes: 0 additions & 76 deletions packages/opencode/src/cli/cmd/tui/component/dialog-ide.tsx

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -436,11 +436,6 @@ export function Autocomplete(props: {
description: "list tools",
onSelect: () => command.trigger("tool.list"),
},
{
display: "/ide",
description: "toggle IDEs",
onSelect: () => command.trigger("ide.list"),
},
{
display: "/theme",
description: "toggle theme",
Expand Down
55 changes: 2 additions & 53 deletions packages/opencode/src/cli/cmd/tui/context/local.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { createStore, reconcile } from "solid-js/store"
import { createStore } from "solid-js/store"
import { batch, createEffect, createMemo } from "solid-js"
import { useSync } from "@tui/context/sync"
import { useTheme } from "@tui/context/theme"
Expand All @@ -12,7 +12,6 @@ import { Provider } from "@/provider/provider"
import { useArgs } from "./args"
import { useSDK } from "./sdk"
import { RGBA } from "@opentui/core"
import { Ide } from "@/ide"

export const { use: useLocal, provider: LocalProvider } = createSimpleContext({
name: "Local",
Expand All @@ -39,7 +38,7 @@ export const { use: useLocal, provider: LocalProvider } = createSimpleContext({
const [agentStore, setAgentStore] = createStore<{
current: string
}>({
current: agents().find((x) => x.default)?.name ?? agents()[0].name,
current: agents()[0]?.name ?? "default",
})
const { theme } = useTheme()
const colors = createMemo(() => [
Expand Down Expand Up @@ -366,54 +365,6 @@ export const { use: useLocal, provider: LocalProvider } = createSimpleContext({
},
}

const ide = {
isConnected(name: string) {
const status = sync.data.ide[name]
return status?.status === "connected"
},
getWorkspaceFolders(name: string) {
const status = sync.data.ide[name]
if (status && "workspaceFolders" in status && status.workspaceFolders) {
return status.workspaceFolders
}
return []
},
async toggle(name: string) {
const current = sync.data.ide[name]
if (current?.status === "connected") {
await Ide.disconnect()
} else {
await Ide.connect(name)
}
const status = await Ide.status()
sync.set("ide", reconcile(status))
},
}

const selection = iife(() => {
const [selStore, setSelStore] = createStore<{
current: Ide.Selection | null
}>({ current: null })

sdk.event.on(Ide.Event.SelectionChanged.type, async (evt) => {
setSelStore("current", evt.properties.selection)
// Refresh IDE status when we receive a selection
const status = await Ide.status()
sync.set("ide", reconcile(status))
})

return {
current: () => selStore.current,
clear: () => setSelStore("current", null),
formatted: () => {
const sel = selStore.current
if (!sel || !sel.text) return null
const lines = sel.text.split("\n").length
return `${lines} lines`
},
}
})

// Automatically update model when agent changes
createEffect(() => {
const value = agent.current()
Expand All @@ -436,8 +387,6 @@ export const { use: useLocal, provider: LocalProvider } = createSimpleContext({
model,
agent,
mcp,
ide,
selection,
}
return result
},
Expand Down
5 changes: 0 additions & 5 deletions packages/opencode/src/cli/cmd/tui/context/sync.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ import type {
QuestionRequest,
LspStatus,
McpStatus,
IdeStatus,
FormatterStatus,
SessionStatus,
ProviderListResponse,
Expand All @@ -36,7 +35,6 @@ import { useArgs } from "./args"
import { batch, onMount } from "solid-js"
import { Log } from "@/util/log"
import type { Path } from "@opencode-ai/sdk"
import { Ide } from "@/ide"

export const { use: useSync, provider: SyncProvider } = createSimpleContext({
name: "Sync",
Expand Down Expand Up @@ -76,7 +74,6 @@ export const { use: useSync, provider: SyncProvider } = createSimpleContext({
mcp: {
[key: string]: McpStatus
}
ide: { [key: string]: IdeStatus }
mcp_resource: {
[key: string]: McpResource
}
Expand Down Expand Up @@ -106,7 +103,6 @@ export const { use: useSync, provider: SyncProvider } = createSimpleContext({
part: {},
lsp: [],
mcp: {},
ide: {},
mcp_resource: {},
formatter: [],
vcs: undefined,
Expand Down Expand Up @@ -372,7 +368,6 @@ export const { use: useSync, provider: SyncProvider } = createSimpleContext({
sdk.client.command.list().then((x) => setStore("command", reconcile(x.data ?? []))),
sdk.client.lsp.status().then((x) => setStore("lsp", reconcile(x.data!))),
sdk.client.mcp.status().then((x) => setStore("mcp", reconcile(x.data!))),
Ide.status().then((x) => setStore("ide", reconcile(x))),
// TODO: Re-enable after SDK regeneration (Phase 15) - sdk.client.experimental.resource.list()
(sdk.client as { experimental?: { resource: { list: () => Promise<{ data?: Record<string, McpResource> }> } } }).experimental?.resource.list().then((x) => setStore("mcp_resource", reconcile(x?.data ?? {}))),
sdk.client.formatter.status().then((x) => setStore("formatter", reconcile(x.data!))),
Expand Down
15 changes: 0 additions & 15 deletions packages/opencode/src/cli/cmd/tui/routes/home.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ import { useSync } from "../context/sync"
import { Toast } from "../ui/toast"
import { useArgs } from "../context/args"
import { useDirectory } from "../context/directory"
import { useLocal } from "../context/local"
import { useRouteData } from "@tui/context/route"
import { usePromptRef } from "../context/prompt"
import { Installation } from "@/installation"
Expand Down Expand Up @@ -89,8 +88,6 @@ export function Home() {
}
})
const directory = useDirectory()
const local = useLocal()
const ide = createMemo(() => Object.values(sync.data.ide).find((x) => x.status === "connected"))

return (
<>
Expand Down Expand Up @@ -128,18 +125,6 @@ export function Home() {
{connectedMcpCount()} MCP
</text>
</Show>
<Show when={ide()}>
<text fg={theme.text}>
<span style={{ fg: theme.success }}>◆ </span>
{ide()!.name}
</text>
</Show>
<Show when={local.selection.formatted()}>
<text fg={theme.text}>
<span style={{ fg: theme.accent }}>[] </span>
{local.selection.formatted()}
</text>
</Show>
<text fg={theme.textMuted}>/status</text>
</box>
<box flexGrow={1} />
Expand Down
15 changes: 0 additions & 15 deletions packages/opencode/src/cli/cmd/tui/routes/session/footer.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,17 +5,14 @@ import { useDirectory } from "../../context/directory"
import { useConnected } from "../../component/dialog-model"
import { createStore } from "solid-js/store"
import { useRoute } from "../../context/route"
import { useLocal } from "../../context/local"

export function Footer() {
const { theme } = useTheme()
const sync = useSync()
const route = useRoute()
const local = useLocal()
const mcp = createMemo(() => Object.values(sync.data.mcp).filter((x) => x.status === "connected").length)
const mcpError = createMemo(() => Object.values(sync.data.mcp).some((x) => x.status === "failed"))
const lsp = createMemo(() => Object.keys(sync.data.lsp))
const ide = createMemo(() => Object.values(sync.data.ide).find((x) => x.status === "connected"))
const permissions = createMemo(() => {
if (route.data.type !== "session") return []
return sync.data.permission[route.data.sessionID] ?? []
Expand Down Expand Up @@ -82,18 +79,6 @@ export function Footer() {
{mcp()} MCP
</text>
</Show>
<Show when={ide()}>
<text fg={theme.text}>
<span style={{ fg: theme.success }}>◆ </span>
{ide()!.name}
</text>
</Show>
<Show when={local.selection.formatted()}>
<text fg={theme.text}>
<span style={{ fg: theme.accent }}>[] </span>
{local.selection.formatted()}
</text>
</Show>
<text fg={theme.textMuted}>/status</text>
</Match>
</Switch>
Expand Down
Loading