Conversations
{loading ? (
Loading...
) : sessions.length === 0 ? (
- /* Empty state */
No conversations yet — start one below
-
-
-
- Enter to send · Shift+Enter for new line
-
-
+
) : (
- /* Sessions list + new conversation input */
<>
-
+
{sessions.map((session, i) => (
+
+ {/* ── Project Memory ── */}
+
+
Project Memory
+
+
+ ◈
+
+ Project Summary
+
+ Coming soon
+
+
+ Once this project has enough conversations, NexusAI will automatically
+ generate a rolling summary of key themes, decisions, and context — giving
+ the model a condensed view of the project's memory without consuming the
+ full context window.
+
+
+
+
+ {/* ── Notes ── */}
+
+
{/* Modal */}
@@ -283,6 +247,117 @@ export default function ProjectView({ project, onNavigate, onBack, onSelectSessi
);
}
+// ── Sub-components ─────────────────────────────────────────
+
+function ChatInput({ value, onChange, onSend, placeholder, autoFocus }) {
+ function handleKeyDown(e) {
+ if (e.key === 'Enter' && !e.shiftKey) {
+ e.preventDefault();
+ onSend();
+ }
+ }
+
+ return (
+
+
+
+ Enter to send · Shift+Enter for new line
+
+
+ );
+}
+
+function NotesSection({ projectId, initialNotes }) {
+ const [notes, setNotes] = useState(initialNotes);
+ const [saving, setSaving] = useState(false);
+
+ const isDirty = notes !== initialNotes;
+
+ async function handleSave() {
+ setSaving(true);
+ try {
+ await updateProject(projectId, { notes });
+ } catch (err) {
+ console.error('[NotesSection] Save failed:', err.message);
+ } finally {
+ setSaving(false);
+ }
+ }
+
+ return (
+
+
+
Project Notes
+ {isDirty && (
+
+ )}
+
+
+ );
+}
+
function MenuButton({ children, onClick, danger }) {
return (