diff --git a/src/renderer/App.tsx b/src/renderer/App.tsx index 326e52e..f218fed 100644 --- a/src/renderer/App.tsx +++ b/src/renderer/App.tsx @@ -22,7 +22,7 @@ import { resolveReasoningEffort, } from '@shared/domain/models'; import type { PatternDefinition } from '@shared/domain/pattern'; -import { isScratchpadProject } from '@shared/domain/project'; +import { isScratchpadProject, SCRATCHPAD_PROJECT_ID } from '@shared/domain/project'; import { applyScratchpadSessionConfig } from '@shared/domain/session'; import type { LspProfileDefinition, McpServerDefinition } from '@shared/domain/tooling'; import type { WorkspaceState } from '@shared/domain/workspace'; @@ -89,7 +89,7 @@ export default function App() { const [isRefreshingCapabilities, setIsRefreshingCapabilities] = useState(false); const [showSettings, setShowSettings] = useState(false); - const [showNewSession, setShowNewSession] = useState(false); + const [newSessionProjectId, setNewSessionProjectId] = useState(); // Load workspace on mount useEffect(() => { @@ -201,6 +201,21 @@ export default function App() { } }; + const handleCreateScratchpad = () => { + const singlePatterns = workspace.patterns + .filter((p) => p.mode === 'single' && p.availability !== 'unavailable') + .sort((a, b) => { + if (a.isFavorite && !b.isFavorite) return -1; + if (!a.isFavorite && b.isFavorite) return 1; + return 0; + }); + + const defaultPattern = singlePatterns[0]; + if (defaultPattern) { + void api.createSession({ projectId: SCRATCHPAD_PROJECT_ID, patternId: defaultPattern.id }); + } + }; + // Determine main content let content: React.ReactNode; let detailPanel: React.ReactNode | undefined; @@ -253,7 +268,7 @@ export default function App() { void api.addProject()} - onNewSession={() => setShowNewSession(true)} + onNewScratchpad={() => handleCreateScratchpad()} onOpenSettings={() => setShowSettings(true)} /> ); @@ -309,7 +324,10 @@ export default function App() { sidebar={ void api.addProject()} - onNewSession={() => setShowNewSession(true)} + onCreateScratchpad={() => handleCreateScratchpad()} + onNewProjectSession={(projectId) => { + setNewSessionProjectId(projectId); + }} onOpenSettings={() => setShowSettings(true)} onProjectSelect={(projectId) => { void api.selectProject(projectId); @@ -337,12 +355,12 @@ export default function App() { } /> - {showNewSession && ( + {newSessionProjectId && ( setShowNewSession(false)} + defaultProjectId={newSessionProjectId} + onClose={() => setNewSessionProjectId(undefined)} onCreate={(projectId, patternId) => { - setShowNewSession(false); + setNewSessionProjectId(undefined); void api.createSession({ projectId, patternId }); }} onTogglePatternFavorite={(patternId, isFavorite) => { diff --git a/src/renderer/components/Sidebar.tsx b/src/renderer/components/Sidebar.tsx index 9ef56af..d936d6f 100644 --- a/src/renderer/components/Sidebar.tsx +++ b/src/renderer/components/Sidebar.tsx @@ -35,7 +35,8 @@ import type { WorkspaceState } from '@shared/domain/workspace'; interface SidebarProps { workspace: WorkspaceState; onAddProject: () => void; - onNewSession: () => void; + onCreateScratchpad: () => void; + onNewProjectSession: (projectId: string) => void; onProjectSelect: (projectId?: string) => void; onSessionSelect: (sessionId: string) => void; onOpenSettings: () => void; @@ -310,6 +311,8 @@ function ProjectGroup({ onRenameSubmit, onRenameCancel, onRefreshGitContext, + onNewSession, + newSessionLabel, }: { project: ProjectRecord; sessions: SessionRecord[]; @@ -321,6 +324,8 @@ function ProjectGroup({ onRenameSubmit: (sessionId: string, title: string) => void; onRenameCancel: () => void; onRefreshGitContext?: (projectId: string) => void; + onNewSession?: () => void; + newSessionLabel?: string; }){ const [expanded, setExpanded] = useState(true); const isScratchpad = isScratchpadProject(project); @@ -414,6 +419,16 @@ function ProjectGroup({ /> )) )} + {onNewSession && ( + + )} )} @@ -425,7 +440,8 @@ function ProjectGroup({ export function Sidebar({ workspace, onAddProject, - onNewSession, + onCreateScratchpad, + onNewProjectSession, onProjectSelect, onSessionSelect, onOpenSettings, @@ -537,18 +553,6 @@ export function Sidebar({ - {/* New session CTA */} -
- -
- {/* Session list */}
session.projectId === scratchpadProject.id)} + onNewSession={onCreateScratchpad} + newSessionLabel="New Scratchpad" />
)} @@ -646,6 +652,7 @@ export function Sidebar({ project={project} selectedSessionId={workspace.selectedSessionId} sessions={workspace.sessions.filter((session) => session.projectId === project.id)} + onNewSession={() => onNewProjectSession(project.id)} /> ))} diff --git a/src/renderer/components/WelcomePane.tsx b/src/renderer/components/WelcomePane.tsx index 36fa8c6..1239f9c 100644 --- a/src/renderer/components/WelcomePane.tsx +++ b/src/renderer/components/WelcomePane.tsx @@ -2,14 +2,14 @@ import { MessageSquare, Plus, Settings } from 'lucide-react'; interface WelcomePaneProps { hasProjects: boolean; - onNewSession: () => void; + onNewScratchpad: () => void; onAddProject: () => void; onOpenSettings: () => void; } export function WelcomePane({ hasProjects, - onNewSession, + onNewScratchpad, onAddProject, onOpenSettings, }: WelcomePaneProps) { @@ -31,11 +31,11 @@ export function WelcomePane({
{!hasProjects && (