diff --git a/esbuild.config.mjs b/esbuild.config.mjs index 02099f11..336f191b 100644 --- a/esbuild.config.mjs +++ b/esbuild.config.mjs @@ -6,7 +6,7 @@ const watch = process.argv.includes("--watch"); const context = await esbuild.context({ entryPoints: ["src/main.ts"], bundle: true, - external: ["obsidian", "electron"], + external: ["obsidian"], format: "cjs", platform: "node", target: "es2022", diff --git a/src/app-server/transport.ts b/src/app-server/transport.ts index 27e56ca0..e54148ec 100644 --- a/src/app-server/transport.ts +++ b/src/app-server/transport.ts @@ -36,7 +36,6 @@ export class StdioAppServerTransport implements AppServerTransport { this.process = spawn(this.codexPath, ["app-server"], { cwd: this.cwd, stdio: ["pipe", "pipe", "pipe"], - env: process.env, }); this.process.once("error", (error) => { diff --git a/src/electron.d.ts b/src/electron.d.ts deleted file mode 100644 index e0c2f04a..00000000 --- a/src/electron.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -declare module "electron" { - export const shell: { - openPath(path: string): Promise; - }; -} diff --git a/src/main.ts b/src/main.ts index 1cd0869f..172d46d6 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,6 +1,4 @@ -import { ItemView, MarkdownRenderer, Notice, Platform, Plugin, TFile, type WorkspaceLeaf } from "obsidian"; -import { existsSync } from "fs"; -import { join } from "path"; +import { ItemView, MarkdownRenderer, Notice, Plugin, TFile, type WorkspaceLeaf } from "obsidian"; import type { AppServerClient } from "./app-server/client"; import { ConnectionManager, StaleConnectionError } from "./app-server/connection-manager"; @@ -57,7 +55,6 @@ import { CodexPanelSettingTab } from "./settings-tab"; import { clearActiveThreadState, clearConnectionScopedState, createPanelState, type PanelState } from "./state/panel-state"; import { userInputDraftKey, userInputOtherDraftKey } from "./panel/request-state"; import { getThreadTitle } from "./threads"; -import { errorMessage } from "./utils"; import { questionDefaultAnswer, type PendingUserInput } from "./user-input/model"; import { renderComposerShell, @@ -661,7 +658,6 @@ class CodexPanelView extends ItemView { toggleFast: () => this.toggleFastMode(), toggleRuntime: () => this.toggleRuntimePicker("model"), connect: () => void this.reconnectFromToolbar(), - openCodexConfigFolder: () => void this.openCodexConfigFolder(), refreshThreads: () => { this.state.openDetails.delete("status-panel"); void this.refreshThreads(); @@ -680,30 +676,6 @@ class CodexPanelView extends ItemView { }); } - private async openCodexConfigFolder(): Promise { - if (!Platform.isDesktopApp) { - new Notice("Opening .codex requires Obsidian desktop."); - return; - } - - try { - const { shell } = await import("electron"); - if (!shell) throw new Error("Electron shell is not available."); - - const vaultCodexPath = join(this.plugin.vaultPath, ".codex"); - const targetPath = existsSync(vaultCodexPath) - ? vaultCodexPath - : (this.state.initializeResponse?.codexHome ?? join(process.env.HOME ?? "", ".codex")); - const message = await shell.openPath(targetPath); - if (message) throw new Error(message); - if (targetPath !== vaultCodexPath) { - new Notice("Vault .codex folder not found. Opened Codex home instead."); - } - } catch (error) { - new Notice(`Could not open Codex config folder: ${errorMessage(error)}`); - } - } - private toolbarViewModel(): ToolbarViewModel { const snapshot = this.runtimeSnapshot(); const config = configRecord(this.state.effectiveConfig); diff --git a/src/view/toolbar.ts b/src/view/toolbar.ts index 496be350..05acc5b4 100644 --- a/src/view/toolbar.ts +++ b/src/view/toolbar.ts @@ -65,7 +65,6 @@ export interface ToolbarActions { toggleFast: () => void; toggleRuntime: () => void; connect: () => void; - openCodexConfigFolder: () => void; refreshThreads: () => void; resumeThread: (threadId: string) => void; archiveThread: (threadId: string) => void; @@ -220,10 +219,6 @@ function renderStatusPanel(parent: HTMLElement, model: ToolbarViewModel, actions onClick: actions.refreshThreads, className: "codex-panel__status-panel-item", }); - createToolbarPanelItem(statusItems, "Open Codex config folder", { - onClick: actions.openCodexConfigFolder, - className: "codex-panel__status-panel-item", - }); renderRateLimitPanel(parent, model.rateLimit); renderConnectionDiagnostics(parent, model.diagnostics); renderEffectiveConfig(parent, model.configSections); diff --git a/tests/view-renderers.test.ts b/tests/view-renderers.test.ts index 068e339e..338b2f02 100644 --- a/tests/view-renderers.test.ts +++ b/tests/view-renderers.test.ts @@ -781,7 +781,6 @@ describe("view renderers", () => { it("renders connection diagnostics in the status menu", () => { const parent = document.createElement("div"); - const openCodexConfigFolder = vi.fn(); renderToolbar( parent, @@ -793,12 +792,9 @@ describe("view renderers", () => { { label: "compatibility", value: "model/list failed", level: "error" }, ], }), - toolbarActions({ openCodexConfigFolder }), + toolbarActions(), ); - parent.querySelectorAll(".codex-panel__status-panel-item")[2]?.click(); - expect(openCodexConfigFolder).toHaveBeenCalled(); - expect(parent.textContent).toContain("Open Codex config folder"); expect(parent.querySelector(".codex-panel__connection-diagnostics-title")?.textContent).toBe("Connection diagnostics"); expect(parent.textContent).toContain("Effective Codex config"); expect(parent.textContent).toContain("codex-cli/1.2.3"); @@ -1139,7 +1135,6 @@ function toolbarActions(overrides: Partial[2]> toggleFast: vi.fn(), toggleRuntime: vi.fn(), connect: vi.fn(), - openCodexConfigFolder: vi.fn(), refreshThreads: vi.fn(), resumeThread: vi.fn(), archiveThread: vi.fn(),