feat: Complete Pi Harness Rebuild - Phases 1 till 7.2
This commit is contained in:
@@ -1,56 +1,67 @@
|
||||
import type { SessionEntry, ChatMessage } from 'apps/Chat';
|
||||
import type { SlashCommandResult } from './useSlashCommands';
|
||||
import type { SessionEntry, ChatMessage, Message } from 'apps/Chat';
|
||||
import { useAuth } from 'hooks/useAuth';
|
||||
import { useClient } from 'hooks/useClient';
|
||||
import { useQuery, useQueryClient } from '@tanstack/react-query';
|
||||
|
||||
export const useChatSessions = () => {
|
||||
type SessionWithMessages = {
|
||||
id: string;
|
||||
title: string;
|
||||
model: string;
|
||||
cwd: string;
|
||||
groupSlug?: string | null;
|
||||
createdAt: number;
|
||||
updatedAt: number;
|
||||
messageCount: number;
|
||||
cost: {
|
||||
inputTokens: number;
|
||||
outputTokens: number;
|
||||
totalUSD: number;
|
||||
};
|
||||
messages: Message[];
|
||||
};
|
||||
|
||||
export function useChatSessions() {
|
||||
const client = useClient();
|
||||
const queryClient = useQueryClient();
|
||||
const { isAuthenticated } = useAuth();
|
||||
|
||||
const { data: sessions = [] } = useQuery<SessionEntry[]>({
|
||||
queryKey: ['SESSIONS'],
|
||||
queryKey: ['PI_SESSIONS'],
|
||||
enabled: isAuthenticated,
|
||||
queryFn: () => client.get<SessionEntry[]>('/sessions'),
|
||||
queryFn: () => client.post<{ sessions: SessionEntry[] }>('/api/pi/sessions').then((r) => r.sessions),
|
||||
});
|
||||
|
||||
const getMessages = (provider: 'claude' | 'opencode' | 'pi-mono', sessionId: string) =>
|
||||
client.get<ChatMessage[]>(`/sessions/${provider}/${sessionId}/messages`);
|
||||
function getSession(sessionId: string) {
|
||||
return client.get<{ session: SessionWithMessages }>(`/api/pi/sessions/${sessionId}`);
|
||||
}
|
||||
|
||||
const saveMessages = (provider: 'claude' | 'opencode' | 'pi-mono', sessionId: string, messages: ChatMessage[]) =>
|
||||
client.put(`/sessions/${provider}/${sessionId}/messages`, messages);
|
||||
function saveMessages(sessionId: string, messages: ChatMessage[]) {
|
||||
return client.put(`/api/pi/sessions/${sessionId}/messages`, messages);
|
||||
}
|
||||
|
||||
const renameSession = async (
|
||||
provider: 'claude' | 'opencode' | 'pi-mono',
|
||||
sessionId: string | null,
|
||||
args: string,
|
||||
): Promise<SlashCommandResult> => {
|
||||
if (!args) return { handled: true, feedback: 'Usage: /rename <new title>' };
|
||||
if (!sessionId) return { handled: true, feedback: 'No active session to rename.' };
|
||||
async function renameSession(sessionId: string, title: string) {
|
||||
await client.patch(`/api/pi/sessions/${sessionId}`, { title });
|
||||
queryClient.invalidateQueries({ queryKey: ['PI_SESSIONS'] });
|
||||
}
|
||||
|
||||
const title = args.slice(0, 200);
|
||||
try {
|
||||
await client.put(`/sessions/${provider}/${sessionId}`, { title });
|
||||
queryClient.setQueryData<SessionEntry[]>(
|
||||
['SESSIONS'],
|
||||
(prev) => prev?.map((s) => (s.id === sessionId ? { ...s, title } : s)) ?? [],
|
||||
);
|
||||
return { handled: true, feedback: `Session renamed to "${title}"` };
|
||||
} catch {
|
||||
return { handled: true, feedback: 'Failed to rename session.' };
|
||||
}
|
||||
async function deleteSession(sessionId: string) {
|
||||
await client.delete(`/api/pi/sessions/${sessionId}`);
|
||||
queryClient.setQueryData<SessionEntry[]>(
|
||||
['PI_SESSIONS'],
|
||||
(prev) => prev?.filter((s) => s.id !== sessionId) ?? [],
|
||||
);
|
||||
}
|
||||
|
||||
function searchSessions(query: string) {
|
||||
return client.get<{ results: SessionEntry[] }>(`/api/pi/sessions/search?q=${encodeURIComponent(query)}`);
|
||||
}
|
||||
|
||||
return {
|
||||
sessions,
|
||||
getSession,
|
||||
saveMessages,
|
||||
renameSession,
|
||||
deleteSession,
|
||||
searchSessions,
|
||||
};
|
||||
|
||||
const archiveSession = async (provider: 'claude' | 'opencode' | 'pi-mono', sessionId: string) => {
|
||||
await client.post(`/sessions/${provider}/${sessionId}/archive`);
|
||||
queryClient.setQueryData<SessionEntry[]>(['SESSIONS'], (prev) => prev?.filter((s) => s.id !== sessionId) ?? []);
|
||||
};
|
||||
|
||||
const deleteSession = async (provider: 'claude' | 'opencode' | 'pi-mono', sessionId: string) => {
|
||||
await client.delete(`/sessions/${provider}/${sessionId}`);
|
||||
queryClient.setQueryData<SessionEntry[]>(['SESSIONS'], (prev) => prev?.filter((s) => s.id !== sessionId) ?? []);
|
||||
};
|
||||
|
||||
return { sessions, getMessages, saveMessages, renameSession, archiveSession, deleteSession };
|
||||
};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user