diff --git a/packages/chat-client/src/App.jsx b/packages/chat-client/src/App.jsx index f6fb1d6..50a59d7 100644 --- a/packages/chat-client/src/App.jsx +++ b/packages/chat-client/src/App.jsx @@ -108,7 +108,7 @@ export default function App() { }, 50); } - async function handleNewProjectChat() { + function handleNewProjectChat(text) { const newSession = { external_id: uuidv4(), metadata: null, @@ -117,7 +117,12 @@ export default function App() { }; setSessions(prev => [newSession, ...prev]); selectSession(newSession); - navigate('chat'); + setViewHistory(prev => [...prev, view]); + setView('chat'); + setLeftOpen(true); + setTimeout(() => { + sendMessage(text, selectedModel, activeProject?.id ?? null); + }, 50); } const canGoBack = view !== 'home'; @@ -172,6 +177,8 @@ export default function App() { )} @@ -190,6 +197,7 @@ export default function App() { onBack={goBack} onSelectSession={selectSession} onNewProjectChat={handleNewProjectChat} + onProjectsChange={refreshProjects} // ← add /> )} diff --git a/packages/chat-client/src/client.zip b/packages/chat-client/src/client.zip new file mode 100644 index 0000000..2e6bfc3 Binary files /dev/null and b/packages/chat-client/src/client.zip differ diff --git a/packages/chat-client/src/components/AllChatsView.jsx b/packages/chat-client/src/components/AllChatsView.jsx index 93f4e8d..b8e6472 100644 --- a/packages/chat-client/src/components/AllChatsView.jsx +++ b/packages/chat-client/src/components/AllChatsView.jsx @@ -1,8 +1,8 @@ import React, { useState, useEffect } from 'react'; import { fetchSessions, deleteSession } from '../api/orchestration'; -import { API_DEFAULTS } from '../config/constants'; +import { API_DEFAULTS, CLIENT_DEFAULTS } from '../config/constants'; -const PAGE_SIZE = API_DEFAULTS.PAGE_SIZE; +const PAGE_SIZE = CLIENT_DEFAULTS.PAGE_SIZE; export default function AllChatsView({ onSelectSession, onBack }) { const [sessions, setSessions] = useState([]); diff --git a/packages/chat-client/src/components/AllProjectsView.jsx b/packages/chat-client/src/components/AllProjectsView.jsx index 6cd7e11..1431e2a 100644 --- a/packages/chat-client/src/components/AllProjectsView.jsx +++ b/packages/chat-client/src/components/AllProjectsView.jsx @@ -2,7 +2,7 @@ import React, { useState, useEffect } from 'react'; import ProjectModal from './ProjectModal'; import { fetchProjects, createProject, updateProject, deleteProject } from '../api/orchestration'; -export default function AllProjectsView({ onProjectsChange, onBack }) { +export default function AllProjectsView({ onProjectsChange, onBack, onSelectProject, onNavigate }) { const [projects, setProjects] = useState([]); const [loading, setLoading] = useState(true); const [modal, setModal] = useState(null); // { mode, project? } @@ -76,12 +76,13 @@ async function handleDelete(id) { }}> {projects.map(project => ( setModal({ mode: 'edit', project })} - onDelete={() => setModal({ mode: 'confirm-delete', project })} - /> - ))} + key={project.id} + project={project} + onSelect={() => { onSelectProject(project); onNavigate('project'); }} + onEdit={() => setModal({ mode: 'edit', project })} + onDelete={() => setModal({ mode: 'confirm-delete', project })} + /> + ))} {projects.length === 0 && (
setHovered(true)} onMouseLeave={() => setHovered(false)} style={{ @@ -123,6 +125,7 @@ function ProjectTile({ project, onEdit, onDelete }) { transition: 'border-color 0.15s', position: 'relative', minHeight: '100px', + cursor: 'pointer', }} > {/* Colour accent bar */} @@ -151,9 +154,9 @@ function ProjectTile({ project, onEdit, onDelete }) { {/* Action buttons — appear on hover */} {hovered && (
- -
)} diff --git a/packages/chat-client/src/components/MemoryView.jsx b/packages/chat-client/src/components/MemoryView.jsx index aef22cc..5d2b143 100644 --- a/packages/chat-client/src/components/MemoryView.jsx +++ b/packages/chat-client/src/components/MemoryView.jsx @@ -4,7 +4,7 @@ import ReactMarkdown from 'react-markdown'; const PAGE_SIZE = 20; -export default function MemoryView({ onNavigate }) { +export default function MemoryView({ onNavigate, onBack }) { const [episodes, setEpisodes] = useState([]); const [total, setTotal] = useState(0); const [offset, setOffset] = useState(0); diff --git a/packages/chat-client/src/components/ProjectModal.jsx b/packages/chat-client/src/components/ProjectModal.jsx index fcffe79..bf63b22 100644 --- a/packages/chat-client/src/components/ProjectModal.jsx +++ b/packages/chat-client/src/components/ProjectModal.jsx @@ -6,7 +6,6 @@ export default function ProjectModal({ project, mode, onSave, onDelete, onClose const [name, setName] = useState(project?.name ?? ''); const [description, setDescription] = useState(project?.description ?? ''); const [colour, setColour] = useState(project?.colour ?? COLOURS[0]); - const [isolated, setIsolated] = useState(project?.isolated === 1); const inputRef = useRef(null); useEffect(() => { @@ -16,7 +15,7 @@ export default function ProjectModal({ project, mode, onSave, onDelete, onClose function handleSubmit() { const trimmed = name.trim(); if (!trimmed) return; - onSave({ name: trimmed, description: description.trim() || null, colour, icon: null, isolated }); + onSave({ name: trimmed, description: description.trim() || null, colour, icon: null, isolated: 1 }); onClose(); } @@ -123,33 +122,6 @@ export default function ProjectModal({ project, mode, onSave, onDelete, onClose
- {/* Project-Only toggle */} -
-
- - Limit context to this project only -
- -
-
- + + {/* ⋮ menu */} +
+ + + {menuOpen && ( + <> + {/* Click-away backdrop */} +
setMenuOpen(false)} + /> +
+ { setMenuOpen(false); setModal({ mode: 'edit' }); }}> + ✎ Edit details + + { setMenuOpen(false); setModal({ mode: 'confirm-delete' }); }}> + ✕ Delete project + +
+ + )} +
{/* Content */}
- {/* Project title + meta */} + {/* Project title + description */}
-
-

- {project.name} -

- {project.isolated === 1 && ( - - Project Only - - )} -
+

+ {project.name} +

{project.description && (

{project.description} @@ -91,56 +139,163 @@ export default function ProjectView({ project, onNavigate, onSelectSession, onNe )}

- {/* Sessions list */} + {/* Conversations */}

Conversations

+ {loading ? (
Loading...
+ ) : sessions.length === 0 ? ( -
-

No conversations in this project yet

-

- Click "+ New Chat" to start one -

+ /* Empty state */ +
+

No conversations yet — start one below

+
+
+