fix(client): copies over plain HTTP, Vietnamese IME Enter, stale replies; react-router 7

- Every Copy goes through copyText: on http://<lan-ip> navigator.clipboard
  is undefined, so the push token (shown once), snapshot links, tool paths and
  hosts copied nothing, silently or with a TypeError.
- Inputs that submit on Enter use isSubmitEnter, so committing an IME
  composition (Vietnamese) no longer saves a half-typed pet name, jumps the
  settings search, or submits a cut-off plugin/MCP/marketplace spec.
- LaneChangesPanel, Workspace features/proof and AiToolConfig drop a reply
  that lands after the next request started: opening file B before file A's
  read returned showed (and let the editor save) A's text under B's header.
- Error-state Retry buttons spin through useSpin; ImageLightbox uses useDialog.
- react-router-dom 6.30 -> 7.18.4 (GHSA-wrjc-x8rr-h8h6, GHSA-337j-9hxr-rhxg);
  screen snapshots gain only Link's data-discover attribute.
- StatusBar test follows v2.8.17's "Settings → AI tools → Profiles" text.
This commit is contained in:
2026-10-22 12:17:18 +07:00
parent fa74cce3fc
commit 50ac0f0daf
27 changed files with 191 additions and 110 deletions
+3 -2
View File
@@ -95,6 +95,7 @@ import type {
CodexScope,
CodexSkill,
} from "../lib/api";
import { isSubmitEnter } from "../lib/keys";
type TabKey = "overview" | "skills" | "agents" | "rules" | "memory" | "config" | "mcp" | "plugins";
@@ -1630,7 +1631,7 @@ function PluginsPanel({
value={spec}
onChange={(e) => setSpec(e.target.value)}
onKeyDown={(e) => {
if (e.key === "Enter") void submitPlugin();
if (isSubmitEnter(e)) void submitPlugin();
}}
placeholder={t("plugins.installPlaceholder")}
aria-label={t("plugins.installTitle")}
@@ -1710,7 +1711,7 @@ function PluginsPanel({
value={mktUrl}
onChange={(e) => setMktUrl(e.target.value)}
onKeyDown={(e) => {
if (e.key === "Enter") void submitMarketplace();
if (isSubmitEnter(e)) void submitMarketplace();
}}
placeholder={t("plugins.addMarketplacePlaceholder")}
aria-label={t("plugins.addMarketplaceTitle")}