45bfae6e94
Initial import of all source code, config, and README assets: the packages workspace (cli, core, server, web, docs, landing, skills), build scripts, tooling config, and CI workflows. Includes the data-layout revision made on this branch: the local data root defaults to ~/.penguin/data (PENGUIN_HOME still overrides; the installer keeps its binaries in ~/.penguin), and every Agent lives under <project>/agents/<agent>/ — path helpers, the three agent-enumeration scans, the system prompt, built-in Skills, tests and docs all follow the new layout. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018ihk8iQuo3kv2aPjAYEPuR
65 lines
2.6 KiB
TypeScript
65 lines
2.6 KiB
TypeScript
/**
|
|
* Router (react-router v7 declarative style): /login is public; all other routes go through
|
|
* the RequireAuth guard (redirects to /login when not authenticated) and are wrapped in
|
|
* ProjectProvider + AppLayout.
|
|
*/
|
|
import { BrowserRouter, Navigate, Route, Routes } from "react-router";
|
|
import { useAuth } from "./state/auth";
|
|
import { ProjectProvider } from "./state/project";
|
|
import { SessionsProvider } from "./state/sessions";
|
|
import { AppLayout } from "./components/layout/app-layout";
|
|
import { LoginPage } from "./pages/login";
|
|
import { ChatPage } from "./features/chat/chat-page";
|
|
import { AgentsPage } from "./features/agents/agents-page";
|
|
import { AgentSettingsPage } from "./features/agents/agent-settings-page";
|
|
import { SkillsPage } from "./features/skills/skills-page";
|
|
import { ModelsPage } from "./features/models/models-page";
|
|
import { UsagePage } from "./features/usage/usage-page";
|
|
import { TracesPage } from "./features/traces/traces-page";
|
|
import { BenchmarkPage } from "./features/benchmark/benchmark-page";
|
|
import { AdminUsersPage } from "./features/admin/admin-users-page";
|
|
|
|
/** Route guard: shows blank while initializing, redirects to /login when not authenticated. */
|
|
function RequireAuth() {
|
|
const { user } = useAuth();
|
|
if (user === undefined) return null; // GET /api/me is still initializing
|
|
if (user === null) return <Navigate to="/login" replace />;
|
|
return (
|
|
<ProjectProvider>
|
|
<SessionsProvider>
|
|
<AppLayout />
|
|
</SessionsProvider>
|
|
</ProjectProvider>
|
|
);
|
|
}
|
|
|
|
/** When already logged in, visiting /login redirects straight to the chat page. */
|
|
function LoginRoute() {
|
|
const { user } = useAuth();
|
|
if (user) return <Navigate to="/chat" replace />;
|
|
return <LoginPage />;
|
|
}
|
|
|
|
export function AppRouter() {
|
|
return (
|
|
<BrowserRouter>
|
|
<Routes>
|
|
<Route path="/login" element={<LoginRoute />} />
|
|
<Route element={<RequireAuth />}>
|
|
<Route index element={<Navigate to="/chat" replace />} />
|
|
<Route path="/chat/:sessionId?" element={<ChatPage />} />
|
|
<Route path="/agents" element={<AgentsPage />} />
|
|
<Route path="/agents/:agentId" element={<AgentSettingsPage />} />
|
|
<Route path="/skills" element={<SkillsPage />} />
|
|
<Route path="/models" element={<ModelsPage />} />
|
|
<Route path="/usage" element={<UsagePage />} />
|
|
<Route path="/traces" element={<TracesPage />} />
|
|
<Route path="/benchmark" element={<BenchmarkPage />} />
|
|
<Route path="/admin/users" element={<AdminUsersPage />} />
|
|
<Route path="*" element={<Navigate to="/chat" replace />} />
|
|
</Route>
|
|
</Routes>
|
|
</BrowserRouter>
|
|
);
|
|
}
|