Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
67 commits
Select commit Hold shift + click to select a range
f8b8cce
feat(inference): add provider store
AkaraChen Apr 25, 2026
b01694f
feat(api): add inference provider endpoints
AkaraChen Apr 25, 2026
851cdc8
feat(desktop): add inference provider UI
AkaraChen Apr 25, 2026
57b1e32
fix(desktop): move providers to sidebar
AkaraChen Apr 25, 2026
870f5ea
feat(inference): add provider base URL
AkaraChen Apr 25, 2026
1b649bf
fix(desktop): simplify provider icon
AkaraChen Apr 25, 2026
2fd7b96
fix(desktop): align provider detail layout
AkaraChen Apr 25, 2026
6e92173
fix(desktop): simplify provider details
AkaraChen Apr 25, 2026
62afcb8
fix(desktop): use branded provider icons
AkaraChen Apr 25, 2026
4a657ca
fix(desktop): remove provider detail subtitle
AkaraChen Apr 25, 2026
273d0c4
fix(desktop): remove provider form description
AkaraChen Apr 25, 2026
f0c756b
refactor(inference): migrate metadata storage from JSON to SQLite via…
AkaraChen Apr 25, 2026
b18eb9b
feat(inference): add provider model editing
AkaraChen Apr 26, 2026
4bb829d
feat(inference): split provider resource list
AkaraChen Apr 26, 2026
5cd60a2
feat(inference): add coding agent panels
AkaraChen Apr 26, 2026
b57ad6a
feat(inference): add agent provider abstractions
AkaraChen Apr 26, 2026
b3927f6
feat(inference): add opencode provider management
AkaraChen Apr 26, 2026
56aa46d
feat(inference): wire opencode provider crud
AkaraChen Apr 26, 2026
c33f68c
feat(inference): manage opencode providers
AkaraChen Apr 26, 2026
caacd48
fix(desktop): edit matched opencode providers in store
AkaraChen Apr 26, 2026
b259fc9
feat(inference): support codex providers
AkaraChen Apr 26, 2026
2c71c46
feat(inference): support codex profiles
AkaraChen Apr 26, 2026
32edab5
fix(desktop): simplify codex provider list
AkaraChen Apr 26, 2026
95578e8
fix(desktop): align codex provider rows
AkaraChen Apr 26, 2026
3742fa9
feat: claude/codex/opencode ui for inference provider
AkaraChen Apr 28, 2026
2e442ec
feat(desktop): always show enable button in Claude provider panel
AkaraChen Apr 28, 2026
dbcb719
feat: almost work
AkaraChen Apr 28, 2026
63b17c1
feat: better codex
AkaraChen Apr 28, 2026
83b5288
chore: remove dead code
AkaraChen Apr 28, 2026
8132d1a
refactor(inference): remove is_active from binding table
AkaraChen Apr 28, 2026
ea0f4b6
fix(migration): restore original migration 5 checksum
AkaraChen Apr 29, 2026
0e7c019
fix(desktop): sync providers page with agent toggles
AkaraChen Apr 29, 2026
5258c9b
feat(inference): add built-in official login provider for Claude
Fldicoahkiin Apr 29, 2026
82bb843
fix(codex): write provider keys inline
AkaraChen May 2, 2026
ec6d9c1
feat(desktop): show config folder button on Codex provider rows
danielchim May 3, 2026
8c28586
feat(desktop): overhaul inference provider form UX
danielchim May 3, 2026
79115b9
feat(api): add inference provider preset DTO and bundled catalog
danielchim May 3, 2026
f7e9a33
feat(api): expose GET /api/v1/inference/presets
danielchim May 3, 2026
8e5742d
chore(desktop): regenerate DTOs for InferenceProviderPresetResponse
danielchim May 3, 2026
cb286e8
feat(desktop): add inference provider preset query and api client method
danielchim May 3, 2026
50b2c36
fix: issue
AkaraChen May 3, 2026
68a49ec
chore: revert frontend
AkaraChen May 3, 2026
69b1b54
fix(inference): preserve applied migration checksums
AkaraChen May 3, 2026
a05efc9
fix(desktop): render preset logos as inline SVG for dark mode support
Fldicoahkiin May 4, 2026
34cee89
feat(desktop): add show/hide toggle for API key input in provider form
Fldicoahkiin May 7, 2026
3929cf5
fix(desktop): render ProviderIcon as inline SVG matching PresetLogo p…
Fldicoahkiin May 7, 2026
cae1be3
Merge remote-tracking branch 'origin/main' into feat/inference-provider
Fldicoahkiin May 8, 2026
502b95d
refactor(desktop): use Tauri clipboard plugin in inference providers …
Fldicoahkiin May 8, 2026
16e14c0
chore(desktop): simplify nullish api_key fallback in opencode panel
danielchim May 9, 2026
1371009
feat(desktop): add home page with agent overview cards
danielchim May 9, 2026
cc38a45
feat(desktop): add per-agent detail page with skills/mcp/model/sub-ag…
danielchim May 9, 2026
39cefc2
feat(desktop): add global search with grouped popover and full result…
danielchim May 9, 2026
b2cd510
feat(desktop): add market page with skills/mcp/plugins/github tabs
danielchim May 9, 2026
c30af95
feat(desktop): rebuild sidebar IA, route table, and locales for agent…
danielchim May 9, 2026
2434c23
feat(desktop): pivot to resource-first IA with agent as filter
danielchim May 9, 2026
7ad09f2
feat(desktop): integrate Claude Code plugins into resource-first IA
danielchim May 9, 2026
9841058
refactor(desktop): extract plugin market content for reuse in Market tab
danielchim May 9, 2026
ba34677
refactor(desktop): polish plugin market UX in Market tab
danielchim May 10, 2026
ef7c395
feat(desktop): lift resource page toolbar to a full-width header
danielchim May 10, 2026
d0dd415
fix: remove extra blank line in App.tsx
Fldicoahkiin May 21, 2026
9281d74
Merge branch 'main' into feat/agent-hub-revamp
Fldicoahkiin May 21, 2026
d7458eb
chore: resolve remaining merge artifacts
Fldicoahkiin May 21, 2026
4f9ebed
Merge branch 'main' into feat/agent-hub-revamp
Fldicoahkiin May 29, 2026
f4e846a
Merge remote-tracking branch 'origin/main' into feat/agent-hub-revamp
Fldicoahkiin May 29, 2026
b6d8547
fix(api): sort models.dev presets with sort_by_key
Fldicoahkiin May 29, 2026
479e618
refactor(desktop): remove set-state-in-effect in search components
Fldicoahkiin May 29, 2026
d77617b
Merge remote-tracking branch 'origin/main' into feat/agent-hub-revamp
Fldicoahkiin May 29, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
146 changes: 86 additions & 60 deletions crates/desktop/src/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -14,21 +14,22 @@ import { DeepLinkImportModal } from "./components/deep-link-import-modal";
import { OnboardingController } from "./components/onboarding-controller";
import { Redirect } from "./components/redirect";
import { ErrorBoundary } from "./components/ui/error-boundary";
import { useSidebarNavigation } from "./hooks/use-sidebar-navigation";
import { MainLayout } from "./layouts/main-layout";
import type { DeepLinkImportIntent } from "./lib/deep-link";
import { parseDeepLink } from "./lib/deep-link";
import { setupAppMenu } from "./lib/menu";
import { initStore } from "./lib/store";
import HomePage from "./pages/home";
import InferenceProvidersPage from "./pages/inference-providers";
import MarketPage from "./pages/market";
import PluginsPage from "./pages/plugins";
import ProjectDetailPage from "./pages/project/detail";
import SearchResultsPage from "./pages/search";
import SettingsPage from "./pages/settings";
import CustomAgentsPage from "./pages/settings/custom-agents";
import MCPServersPage from "./pages/settings/mcp-servers";
import SkillsPage from "./pages/settings/skills";
import SubAgentsPage from "./pages/settings/sub-agents";
import SkillsShPage from "./pages/skills-sh";
import SkillsSearchPage from "./pages/skills-sh/search";
import { AgentAvailabilityProvider } from "./providers/agent-availability";
import { ServerProvider } from "./providers/server";
Expand All @@ -44,31 +45,14 @@ const queryClient = new QueryClient({
},
});

function SkillsPageSkeleton() {
function PageSkeleton() {
return (
<div className="flex h-full">
<div
className="
flex w-80 shrink-0 items-center justify-center border-r border-border
"
>
<Spinner />
</div>
<div className="flex-1" />
<div className="flex h-full items-center justify-center">
<Spinner />
</div>
);
}

function DefaultSidebarRoute() {
const { defaultHref, isLoading } = useSidebarNavigation();

if (isLoading) {
return null;
}

return <Redirect to={defaultHref} />;
}

function App() {
const [isStoreReady, setIsStoreReady] = useState(false);
const [pendingIntents, setPendingIntents] = useState<
Expand Down Expand Up @@ -178,110 +162,152 @@ function App() {
<OnboardingController />
<Switch>
<Route path="/">
<DefaultSidebarRoute />
</Route>
<Route path="/skills">
<MainLayout>
<ErrorBoundary>
<Suspense
fallback={
<SkillsPageSkeleton />
}
fallback={<PageSkeleton />}
>
<SkillsPage />
<HomePage />
</Suspense>
</ErrorBoundary>
</MainLayout>
</Route>
<Route path="/mcp">

<Route path="/search">
<MainLayout>
<ErrorBoundary>
<Suspense
fallback={
<SkillsPageSkeleton />
}
fallback={<PageSkeleton />}
>
<MCPServersPage />
<SearchResultsPage />
</Suspense>
</ErrorBoundary>
</MainLayout>
</Route>
<Route path="/inference-providers">

<Route path="/agents/:agentId/:rest*">
{(params) => (
<Redirect
to={`/skills?agent=${encodeURIComponent(params.agentId)}`}
/>
)}
</Route>

<Route path="/agents/:agentId">
{(params) => (
<Redirect
to={`/skills?agent=${encodeURIComponent(params.agentId)}`}
/>
)}
</Route>

<Route path="/market">
<MainLayout>
<ErrorBoundary>
<InferenceProvidersPage />
<Suspense
fallback={<PageSkeleton />}
>
<MarketPage />
</Suspense>
</ErrorBoundary>
</MainLayout>
</Route>
<Route path="/skills-sh/search">

<Route path="/market/search">
<MainLayout>
<ErrorBoundary>
<Suspense
fallback={
<SkillsPageSkeleton />
}
fallback={<PageSkeleton />}
>
<SkillsSearchPage />
</Suspense>
</ErrorBoundary>
</MainLayout>
</Route>
<Route path="/skills-sh">

<Route path="/library">
<Redirect to="/market" />
</Route>
<Route path="/library/search">
<Redirect to="/market/search" />
</Route>

<Route path="/skills">
<MainLayout>
<ErrorBoundary>
<Suspense
fallback={
<SkillsPageSkeleton />
}
fallback={<PageSkeleton />}
>
<SkillsShPage />
<SkillsPage />
</Suspense>
</ErrorBoundary>
</MainLayout>
</Route>
<Route path="/cc-plugins">
<Route path="/mcp">
<MainLayout>
<ErrorBoundary>
<Suspense
fallback={
<SkillsPageSkeleton />
}
fallback={<PageSkeleton />}
>
<PluginsPage />
<MCPServersPage />
</Suspense>
</ErrorBoundary>
</MainLayout>
</Route>
<Route path="/settings">
<Route path="/sub-agents">
<MainLayout>
<SettingsPage />
<ErrorBoundary>
<Suspense
fallback={<PageSkeleton />}
>
<SubAgentsPage />
</Suspense>
</ErrorBoundary>
</MainLayout>
</Route>
<Route path="/settings/custom-agents">
<Route path="/inference-providers">
<MainLayout>
<CustomAgentsPage />
<ErrorBoundary>
<InferenceProvidersPage />
</ErrorBoundary>
</MainLayout>
</Route>
<Route path="/sub-agents">
<Route path="/skills-sh">
<Redirect to="/market" />
</Route>
<Route path="/skills-sh/search">
<Redirect to="/market/search" />
</Route>

<Route path="/cc-plugins">
<MainLayout>
<ErrorBoundary>
<Suspense
fallback={
<SkillsPageSkeleton />
}
fallback={<PageSkeleton />}
>
<SubAgentsPage />
<PluginsPage />
</Suspense>
</ErrorBoundary>
</MainLayout>
</Route>

<Route path="/settings">
<MainLayout>
<SettingsPage />
</MainLayout>
</Route>
<Route path="/settings/custom-agents">
<MainLayout>
<CustomAgentsPage />
</MainLayout>
</Route>
<Route path="/projects/:id">
<MainLayout>
<ProjectDetailPage />
</MainLayout>
</Route>
<Route>
<DefaultSidebarRoute />
<Redirect to="/" />
</Route>
</Switch>
<DeepLinkImportModal
Expand Down
Loading
Loading