batch4.1-5.1: dedup audit, archive 400 fix, sidebar Delete, landing-page enrichment, auto-name tool-call fix
- Fastify global empty-JSON-body parser fixes archive/unarchive/stop 400s - Removed redundant local sessionEvents.emit at all 5+2 sites with server-side WS publishers; added dedupe guards in useSidebar/Workspace/Project handlers - Sidebar session right-click adds Delete (destructive) with confirm Dialog - Session.tsx navigates away on session_deleted/session_archived for the active session - SessionLandingPage chat rows show message_count, effective_context_tokens, last_message_preview via LATERAL joins on GET /api/sessions/:id/chats - Workspace.tsx pane drag-to-reorder using native HTML5 events (no new deps) - CompactCard: Copy toast, Send-to-chat with target chat name, empty-state in share popover, Re-run button - auto_name.ts: filter count gate and assistant-fetch by content <> '' so tool-call assistant rows don't trip the once-and-only-once guard - Adds CLAUDE.md and apps/web/src/lib/format.ts Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
import { useEffect, useState } from 'react';
|
||||
import { Link, useParams } from 'react-router-dom';
|
||||
import { Link, useNavigate, useParams } from 'react-router-dom';
|
||||
import { ChevronLeft } from 'lucide-react';
|
||||
import { api } from '@/api/client';
|
||||
import type { Session as SessionType } from '@/api/types';
|
||||
@@ -9,6 +9,7 @@ import { ModelPicker } from '@/components/ModelPicker';
|
||||
|
||||
export function Session() {
|
||||
const { id } = useParams<{ id: string }>();
|
||||
const navigate = useNavigate();
|
||||
const [session, setSession] = useState<SessionType | null>(null);
|
||||
const [name, setName] = useState('');
|
||||
const [editingName, setEditingName] = useState(false);
|
||||
@@ -43,12 +44,19 @@ export function Session() {
|
||||
useEffect(() => {
|
||||
if (!id) return;
|
||||
return sessionEvents.subscribe((event) => {
|
||||
if (event.type !== 'session_renamed') return;
|
||||
if (event.session_id !== id) return;
|
||||
setSession((prev) => (prev ? { ...prev, name: event.name } : prev));
|
||||
setName((prev) => (editingName ? prev : event.name));
|
||||
if (event.type === 'session_renamed' && event.session_id === id) {
|
||||
setSession((prev) => (prev ? { ...prev, name: event.name } : prev));
|
||||
setName((prev) => (editingName ? prev : event.name));
|
||||
return;
|
||||
}
|
||||
if (
|
||||
(event.type === 'session_deleted' || event.type === 'session_archived') &&
|
||||
event.session_id === id
|
||||
) {
|
||||
navigate(`/project/${event.project_id}`);
|
||||
}
|
||||
});
|
||||
}, [id, editingName]);
|
||||
}, [id, editingName, navigate]);
|
||||
|
||||
async function saveName() {
|
||||
if (!id || !session) return;
|
||||
|
||||
Reference in New Issue
Block a user