feat(web): W3-1 shared console routes, nav, api/sse/query-keys and shared components

- routes.ts registers all workspaces under /console (+ detail routes, engine, audit, login)
- api.ts: cookie session first (credentials include, CSRF header), Bearer only with stored key, 401 -> /login
- sse.ts: shared EventSource with ?after=seq catch-up, backoff reconnect, per-type subscribe
- shared components: data-table, filter-bar, detail-sheet, timeline, json-view, confirm-dialog,
  form-field, kv-list, stat-tile, error/loading states; ui tabs and textarea

Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
rootandClaude Opus 5.5 committed 2026-09-27 20:21:29 +08:00
1 parent a24bda952b
commit e5e42b1f0d
32 files changed
+1286 -71

No files matched your search

@@ -0,0 +1,6 @@
import { WorkspacePlaceholder } from "~/components/console/workspace-placeholder.tsx";
// 占位:路由已在 app/routes.ts 登记,由对应工作区负责实现
export default function Page() {
return <WorkspacePlaceholder />;
}
+6
View File
@@ -0,0 +1,6 @@
import { WorkspacePlaceholder } from "~/components/console/workspace-placeholder.tsx";
// 占位:路由已在 app/routes.ts 登记,由对应工作区负责实现
export default function Page() {
return <WorkspacePlaceholder />;
}
@@ -0,0 +1,6 @@
import { WorkspacePlaceholder } from "~/components/console/workspace-placeholder.tsx";
// 占位:路由已在 app/routes.ts 登记,由对应工作区负责实现
export default function Page() {
return <WorkspacePlaceholder />;
}
+6
View File
@@ -0,0 +1,6 @@
import { WorkspacePlaceholder } from "~/components/console/workspace-placeholder.tsx";
// 占位:路由已在 app/routes.ts 登记,由对应工作区负责实现
export default function Page() {
return <WorkspacePlaceholder />;
}
+4 -4
View File
@@ -2,7 +2,7 @@ import { ChevronLeft, ChevronRight, Clapperboard, Menu } from "lucide-react";
import { useCallback, useEffect, useLayoutEffect, useRef, useState } from "react";
import { Link, NavLink, Outlet, useLocation } from "react-router";
import { ApiKeyDialog } from "~/components/console/api-key-dialog.tsx";
import { findNavItem, NAV_GROUPS, NAV_ITEMS, type NavGroup } from "~/components/console/nav.ts";
import { CONSOLE_BASE, findNavItem, NAV_GROUPS, NAV_ITEMS, type NavGroup } from "~/components/console/nav.ts";
import PrismLeak from "~/components/prism-leak.tsx";
import { ThemeToggle } from "~/components/theme-toggle.tsx";
import { Button } from "~/components/ui/button.tsx";
@@ -59,7 +59,7 @@ function ExpandedNav({ groups, onNavigate }: { groups: NavGroup[]; onNavigate?:
<NavLink
key={item.to}
to={item.to}
end={item.to === "/"}
end={item.to === CONSOLE_BASE}
onClick={onNavigate}
className={({ isActive }) =>
cn(
@@ -93,7 +93,7 @@ function CollapsedNav() {
<NavLink
key={item.to}
to={item.to}
end={item.to === "/"}
end={item.to === CONSOLE_BASE}
title={item.label}
className={({ isActive }) =>
cn(
@@ -114,7 +114,7 @@ function CollapsedNav() {
function Brand({ collapsed = false }: { collapsed?: boolean }) {
return (
<Link
to="/"
to="/console"
className={cn(
"flex items-center transition-opacity hover:opacity-80",
collapsed ? "w-full justify-center" : "gap-2",
@@ -0,0 +1,6 @@
import { WorkspacePlaceholder } from "~/components/console/workspace-placeholder.tsx";
// 占位:路由已在 app/routes.ts 登记,由对应工作区负责实现
export default function Page() {
return <WorkspacePlaceholder />;
}
@@ -0,0 +1,6 @@
import { WorkspacePlaceholder } from "~/components/console/workspace-placeholder.tsx";
// 占位:路由已在 app/routes.ts 登记,由对应工作区负责实现
export default function Page() {
return <WorkspacePlaceholder />;
}
@@ -0,0 +1,6 @@
import { WorkspacePlaceholder } from "~/components/console/workspace-placeholder.tsx";
// 占位:路由已在 app/routes.ts 登记,由对应工作区负责实现
export default function Page() {
return <WorkspacePlaceholder />;
}
@@ -0,0 +1,6 @@
import { WorkspacePlaceholder } from "~/components/console/workspace-placeholder.tsx";
// 占位:路由已在 app/routes.ts 登记,由对应工作区负责实现
export default function Page() {
return <WorkspacePlaceholder />;
}