feat: session manger (#867)

* feat: init session manger

* feat: persist selected app to localStorage

- Save app selection when switching providers
- Restore last selected app on page load

* feat: persist current view to localStorage

- Save view selection when switching tabs
- Restore last selected view on page load

* styles: update ui

* feat: Improve macOS Terminal activation and refactor Kitty launch to use  command with user's default shell.

* fix: session view

* feat: toc

* feat: Implement FlexSearch for improved session search functionality.

* feat: Redesign session manager search and filter UI for a more compact and dynamic experience.

* refactor: modularize session manager by extracting components and utility functions into dedicated files.

* feat: Enhance session terminal launching with support for iTerm2, Ghostty, WezTerm, and Alacritty, including UI and custom configuration options.

* feat: Conditionally render terminal selection and resume session buttons only on macOS.
This commit is contained in:
TinsFox
2026-02-02 11:12:30 +08:00
committed by GitHub
parent 58153333ce
commit f0e8ba1d8f
32 changed files with 2926 additions and 32 deletions
+34 -2
View File
@@ -3,8 +3,20 @@ import {
type UseQueryResult,
keepPreviousData,
} from "@tanstack/react-query";
import { providersApi, settingsApi, usageApi, type AppId } from "@/lib/api";
import type { Provider, Settings, UsageResult } from "@/types";
import {
providersApi,
settingsApi,
usageApi,
sessionsApi,
type AppId,
} from "@/lib/api";
import type {
Provider,
Settings,
UsageResult,
SessionMeta,
SessionMessage,
} from "@/types";
const sortProviders = (
providers: Record<string, Provider>,
@@ -132,3 +144,23 @@ export const useUsageQuery = (
lastQueriedAt: query.dataUpdatedAt || null,
};
};
export const useSessionsQuery = () => {
return useQuery<SessionMeta[]>({
queryKey: ["sessions"],
queryFn: async () => sessionsApi.list(),
staleTime: 30 * 1000,
});
};
export const useSessionMessagesQuery = (
providerId?: string,
sourcePath?: string,
) => {
return useQuery<SessionMessage[]>({
queryKey: ["sessionMessages", providerId, sourcePath],
queryFn: async () => sessionsApi.getMessages(providerId!, sourcePath!),
enabled: Boolean(providerId && sourcePath),
staleTime: 30 * 1000,
});
};