From 0c710be628fa9380c3ec1192a9eb9b5b084bc011 Mon Sep 17 00:00:00 2001 From: Adam <2363879+adamdotdevin@users.noreply.github.com> Date: Wed, 11 Mar 2026 20:00:51 -0500 Subject: [PATCH] chore: cleanup --- .../session/session-sortable-terminal-tab.tsx | 18 +- .../app/src/components/settings-agents.tsx | 16 - .../app/src/components/settings-commands.tsx | 16 - packages/app/src/components/settings-mcp.tsx | 16 - .../src/components/settings-permissions.tsx | 230 ------------ packages/app/src/context/global-sync.test.ts | 8 +- packages/app/src/context/global-sync.tsx | 3 - .../app/src/context/notification-index.ts | 66 ---- packages/app/src/context/notification.test.ts | 73 ---- packages/app/src/pages/layout.tsx | 6 +- packages/app/src/pages/layout/helpers.test.ts | 16 +- packages/app/src/pages/layout/helpers.ts | 8 - .../layout/sidebar-project-helpers.test.ts | 63 ---- .../pages/layout/sidebar-project-helpers.ts | 11 - .../app/src/pages/layout/sidebar-project.tsx | 18 +- .../src/pages/layout/sidebar-shell-helpers.ts | 1 - .../src/pages/layout/sidebar-shell.test.ts | 13 - .../app/src/pages/layout/sidebar-shell.tsx | 3 +- .../pages/layout/sidebar-workspace-helpers.ts | 2 - .../pages/layout/sidebar-workspace.test.ts | 13 - .../src/pages/layout/sidebar-workspace.tsx | 100 ++---- .../app/src/pages/session/composer/index.ts | 3 +- .../composer/session-composer-helpers.ts | 10 - .../composer/session-composer-state.test.ts | 2 +- .../composer/session-composer-state.ts | 31 +- packages/app/src/pages/session/helpers.ts | 56 +-- .../pages/session/session-command-helpers.ts | 10 - .../pages/session/session-prompt-dock.test.ts | 22 -- .../pages/session/session-prompt-helpers.ts | 4 - .../session/use-session-commands.test.ts | 44 --- .../pages/session/use-session-commands.tsx | 15 +- .../pages/session/use-session-hash-scroll.ts | 2 - packages/app/src/utils/dom.ts | 51 --- packages/app/src/utils/index.ts | 1 - packages/app/src/utils/speech.ts | 326 ------------------ 35 files changed, 75 insertions(+), 1202 deletions(-) delete mode 100644 packages/app/src/components/settings-agents.tsx delete mode 100644 packages/app/src/components/settings-commands.tsx delete mode 100644 packages/app/src/components/settings-mcp.tsx delete mode 100644 packages/app/src/components/settings-permissions.tsx delete mode 100644 packages/app/src/context/notification-index.ts delete mode 100644 packages/app/src/context/notification.test.ts delete mode 100644 packages/app/src/pages/layout/sidebar-project-helpers.test.ts delete mode 100644 packages/app/src/pages/layout/sidebar-project-helpers.ts delete mode 100644 packages/app/src/pages/layout/sidebar-shell-helpers.ts delete mode 100644 packages/app/src/pages/layout/sidebar-shell.test.ts delete mode 100644 packages/app/src/pages/layout/sidebar-workspace-helpers.ts delete mode 100644 packages/app/src/pages/layout/sidebar-workspace.test.ts delete mode 100644 packages/app/src/pages/session/composer/session-composer-helpers.ts delete mode 100644 packages/app/src/pages/session/session-command-helpers.ts delete mode 100644 packages/app/src/pages/session/session-prompt-dock.test.ts delete mode 100644 packages/app/src/pages/session/session-prompt-helpers.ts delete mode 100644 packages/app/src/pages/session/use-session-commands.test.ts delete mode 100644 packages/app/src/utils/dom.ts delete mode 100644 packages/app/src/utils/index.ts delete mode 100644 packages/app/src/utils/speech.ts diff --git a/packages/app/src/components/session/session-sortable-terminal-tab.tsx b/packages/app/src/components/session/session-sortable-terminal-tab.tsx index 6fe6186d510..4f49911c127 100644 --- a/packages/app/src/components/session/session-sortable-terminal-tab.tsx +++ b/packages/app/src/components/session/session-sortable-terminal-tab.tsx @@ -8,6 +8,7 @@ import { DropdownMenu } from "@opencode-ai/ui/dropdown-menu" import { Icon } from "@opencode-ai/ui/icon" import { useTerminal, type LocalPTY } from "@/context/terminal" import { useLanguage } from "@/context/language" +import { focusTerminalById } from "@/pages/session/helpers" export function SortableTerminalTab(props: { terminal: LocalPTY; onClose?: () => void }): JSX.Element { const terminal = useTerminal() @@ -53,21 +54,8 @@ export function SortableTerminalTab(props: { terminal: LocalPTY; onClose?: () => const focus = () => { if (store.editing) return - - if (document.activeElement instanceof HTMLElement) { - document.activeElement.blur() - } - const wrapper = document.getElementById(`terminal-wrapper-${props.terminal.id}`) - const element = wrapper?.querySelector('[data-component="terminal"]') as HTMLElement - if (!element) return - - const textarea = element.querySelector("textarea") as HTMLTextAreaElement - if (textarea) { - textarea.focus() - return - } - element.focus() - element.dispatchEvent(new PointerEvent("pointerdown", { bubbles: true, cancelable: true })) + if (document.activeElement instanceof HTMLElement) document.activeElement.blur() + focusTerminalById(props.terminal.id) } const edit = (e?: Event) => { diff --git a/packages/app/src/components/settings-agents.tsx b/packages/app/src/components/settings-agents.tsx deleted file mode 100644 index 74a942f7770..00000000000 --- a/packages/app/src/components/settings-agents.tsx +++ /dev/null @@ -1,16 +0,0 @@ -import { Component } from "solid-js" -import { useLanguage } from "@/context/language" - -export const SettingsAgents: Component = () => { - // TODO: Replace this placeholder with full agents settings controls. - const language = useLanguage() - - return ( -
-
-

{language.t("settings.agents.title")}

-

{language.t("settings.agents.description")}

-
-
- ) -} diff --git a/packages/app/src/components/settings-commands.tsx b/packages/app/src/components/settings-commands.tsx deleted file mode 100644 index e158d231cee..00000000000 --- a/packages/app/src/components/settings-commands.tsx +++ /dev/null @@ -1,16 +0,0 @@ -import { Component } from "solid-js" -import { useLanguage } from "@/context/language" - -export const SettingsCommands: Component = () => { - // TODO: Replace this placeholder with full commands settings controls. - const language = useLanguage() - - return ( -
-
-

{language.t("settings.commands.title")}

-

{language.t("settings.commands.description")}

-
-
- ) -} diff --git a/packages/app/src/components/settings-mcp.tsx b/packages/app/src/components/settings-mcp.tsx deleted file mode 100644 index 507e041aa89..00000000000 --- a/packages/app/src/components/settings-mcp.tsx +++ /dev/null @@ -1,16 +0,0 @@ -import { Component } from "solid-js" -import { useLanguage } from "@/context/language" - -export const SettingsMcp: Component = () => { - // TODO: Replace this placeholder with full MCP settings controls. - const language = useLanguage() - - return ( -
-
-

{language.t("settings.mcp.title")}

-

{language.t("settings.mcp.description")}

-
-
- ) -} diff --git a/packages/app/src/components/settings-permissions.tsx b/packages/app/src/components/settings-permissions.tsx deleted file mode 100644 index 5c922ba44a4..00000000000 --- a/packages/app/src/components/settings-permissions.tsx +++ /dev/null @@ -1,230 +0,0 @@ -import { Select } from "@opencode-ai/ui/select" -import { showToast } from "@opencode-ai/ui/toast" -import { Component, For, createMemo, type JSX } from "solid-js" -import { useGlobalSync } from "@/context/global-sync" -import { useLanguage } from "@/context/language" - -type PermissionAction = "allow" | "ask" | "deny" - -type PermissionObject = Record -type PermissionValue = PermissionAction | PermissionObject | string[] | undefined -type PermissionMap = Record - -type PermissionItem = { - id: string - title: string - description: string -} - -const ACTIONS = [ - { value: "allow", label: "settings.permissions.action.allow" }, - { value: "ask", label: "settings.permissions.action.ask" }, - { value: "deny", label: "settings.permissions.action.deny" }, -] as const - -const ITEMS = [ - { - id: "read", - title: "settings.permissions.tool.read.title", - description: "settings.permissions.tool.read.description", - }, - { - id: "edit", - title: "settings.permissions.tool.edit.title", - description: "settings.permissions.tool.edit.description", - }, - { - id: "glob", - title: "settings.permissions.tool.glob.title", - description: "settings.permissions.tool.glob.description", - }, - { - id: "grep", - title: "settings.permissions.tool.grep.title", - description: "settings.permissions.tool.grep.description", - }, - { - id: "list", - title: "settings.permissions.tool.list.title", - description: "settings.permissions.tool.list.description", - }, - { - id: "bash", - title: "settings.permissions.tool.bash.title", - description: "settings.permissions.tool.bash.description", - }, - { - id: "task", - title: "settings.permissions.tool.task.title", - description: "settings.permissions.tool.task.description", - }, - { - id: "skill", - title: "settings.permissions.tool.skill.title", - description: "settings.permissions.tool.skill.description", - }, - { - id: "lsp", - title: "settings.permissions.tool.lsp.title", - description: "settings.permissions.tool.lsp.description", - }, - { - id: "todoread", - title: "settings.permissions.tool.todoread.title", - description: "settings.permissions.tool.todoread.description", - }, - { - id: "todowrite", - title: "settings.permissions.tool.todowrite.title", - description: "settings.permissions.tool.todowrite.description", - }, - { - id: "webfetch", - title: "settings.permissions.tool.webfetch.title", - description: "settings.permissions.tool.webfetch.description", - }, - { - id: "websearch", - title: "settings.permissions.tool.websearch.title", - description: "settings.permissions.tool.websearch.description", - }, - { - id: "codesearch", - title: "settings.permissions.tool.codesearch.title", - description: "settings.permissions.tool.codesearch.description", - }, - { - id: "external_directory", - title: "settings.permissions.tool.external_directory.title", - description: "settings.permissions.tool.external_directory.description", - }, - { - id: "doom_loop", - title: "settings.permissions.tool.doom_loop.title", - description: "settings.permissions.tool.doom_loop.description", - }, -] as const - -const VALID_ACTIONS = new Set(["allow", "ask", "deny"]) - -function toMap(value: unknown): PermissionMap { - if (value && typeof value === "object" && !Array.isArray(value)) return value as PermissionMap - - const action = getAction(value) - if (action) return { "*": action } - - return {} -} - -function getAction(value: unknown): PermissionAction | undefined { - if (typeof value === "string" && VALID_ACTIONS.has(value as PermissionAction)) return value as PermissionAction - return -} - -function getRuleDefault(value: unknown): PermissionAction | undefined { - const action = getAction(value) - if (action) return action - - if (!value || typeof value !== "object" || Array.isArray(value)) return - - return getAction((value as Record)["*"]) -} - -export const SettingsPermissions: Component = () => { - const globalSync = useGlobalSync() - const language = useLanguage() - - const actions = createMemo( - (): Array<{ value: PermissionAction; label: string }> => - ACTIONS.map((action) => ({ - value: action.value, - label: language.t(action.label), - })), - ) - - const permission = createMemo(() => { - return toMap(globalSync.data.config.permission) - }) - - const actionFor = (id: string): PermissionAction => { - const value = permission()[id] - const direct = getRuleDefault(value) - if (direct) return direct - - const wildcard = getRuleDefault(permission()["*"]) - if (wildcard) return wildcard - - return "allow" - } - - const setPermission = async (id: string, action: PermissionAction) => { - const before = globalSync.data.config.permission - const map = toMap(before) - const existing = map[id] - - const nextValue = - existing && typeof existing === "object" && !Array.isArray(existing) ? { ...existing, "*": action } : action - - const rollback = (err: unknown) => { - globalSync.set("config", "permission", before) - const message = err instanceof Error ? err.message : String(err) - showToast({ title: language.t("settings.permissions.toast.updateFailed.title"), description: message }) - } - - globalSync.set("config", "permission", { ...map, [id]: nextValue }) - globalSync.updateConfig({ permission: { [id]: nextValue } }).catch(rollback) - } - - return ( -
-
-
-

{language.t("settings.permissions.title")}

-

{language.t("settings.permissions.description")}

-
-
- -
-
-

{language.t("settings.permissions.section.tools")}

-
- - {(item) => ( - -