diff --git a/CLAUDE.md b/CLAUDE.md index 5899138d..6d09fa82 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1,6 +1,6 @@ # Claude Code Working Guide -_Last synced: v2.7.3 (2026-10-12) — Update now restarts through our own service unit; a start refuses a missing folder (ENOCWD)._ A change that makes any statement in this file, `AGENTS.md`, or a README wrong — a moved path, a new or changed extension point, a retired rule — updates that file in the same change-set and bumps this marker. **Bump = replace the version/date and a ≤ 1-line summary; never append a changelog here** — details belong in the commit message and `docs/`, because this whole file is loaded into every session. +_Last synced: v2.7.4 (2026-10-12) — Changes hides a staged change undone on disk (#72); chat says when the session has not started (#73)._ A change that makes any statement in this file, `AGENTS.md`, or a README wrong — a moved path, a new or changed extension point, a retired rule — updates that file in the same change-set and bumps this marker. **Bump = replace the version/date and a ≤ 1-line summary; never append a changelog here** — details belong in the commit message and `docs/`, because this whole file is loaded into every session. ## Project mission - Maintain a reliable local-first dashboard for Claude Code session monitoring. diff --git a/client/src/components/PathPickButton.tsx b/client/src/components/PathPickButton.tsx index 9f5048a0..02f8a90a 100644 --- a/client/src/components/PathPickButton.tsx +++ b/client/src/components/PathPickButton.tsx @@ -6,9 +6,9 @@ * user chose. A browser's picker cannot give a page that path, so the dialog * opens on the server's desktop — which is only this user's screen when the * browser runs on the same machine. Anywhere else (a LAN browser, a server - * with no desktop or no zenity/kdialog) a folder falls back to the in-app - * `FolderBrowseModal` (as it does on any other failure), and a file to typing - * the path. + * with no desktop or no zenity/kdialog) it falls back to the in-app + * `FolderBrowseModal` (as it does on any other failure) — for a file field + * too, which then lists files and picks one on click. * @author Nguyễn Ngọc Trí Vĩ */ @@ -16,12 +16,8 @@ import { useState, type Ref } from "react"; import { useTranslation } from "react-i18next"; import { FolderOpen } from "lucide-react"; import { api } from "../lib/api"; -import { toast } from "../lib/toast"; import { FolderBrowseModal } from "./lanes/FolderBrowseModal"; -/** Server answers that mean "no native picker for this browser" — not a fault. */ -const FALLBACK = new Set(["EREMOTE", "EBADORIGIN", "ENODIALOG"]); - export function PathPickButton({ kind = "dir", start, @@ -47,15 +43,10 @@ export function PathPickButton({ try { const r = await api.lanes.pickPath(kind, start?.trim() || undefined); if (r.path) onPick(r.path); - } catch (err) { - const code = (err as { code?: string }).code; - // A folder always has the in-app browser to fall back on, whatever went - // wrong with the native one (a crashed dialog, one already open). - if (kind === "dir") setFallback(true); - else if (code && FALLBACK.has(code)) toast.info(t("browse.typePath")); - else { - toast.error(err instanceof Error ? err.message : String(err)); - } + } catch { + // The in-app browser is the fallback whatever went wrong with the + // native one: a LAN browser (EREMOTE), no desktop, a crashed dialog. + setFallback(true); } finally { setBusy(false); } @@ -80,6 +71,7 @@ export function PathPickButton({
e.stopPropagation()}> setFallback(false)} diff --git a/client/src/components/SplashScreen.tsx b/client/src/components/SplashScreen.tsx index 06049720..585278a4 100644 --- a/client/src/components/SplashScreen.tsx +++ b/client/src/components/SplashScreen.tsx @@ -1,7 +1,7 @@ /** * @file SplashScreen.tsx * @description Branding splash shown once per browser session on app load. A - * dark-tech "constellation" overlay built around the node-graph brand mark: + * dark-tech "constellation" overlay built around the SmartGift brand mark: * a time-aware greeting, a bold (localized) tagline, and two subtexts reveal * in a staggered cascade. The tagline and the subtext pair are picked at * random (per mount) from localized pools in `splash.json`, so the copy is @@ -143,7 +143,7 @@ export function SplashScreen() {