diff --git a/src/components/shared/left-panel.tsx b/src/components/shared/left-panel.tsx index b6503c7..a7072b6 100644 --- a/src/components/shared/left-panel.tsx +++ b/src/components/shared/left-panel.tsx @@ -1,11 +1,12 @@ 'use client'; import { useMemo, useState } from 'react'; -import { ChevronDown, ChevronRight, Folder, FolderOpen, Star } from 'lucide-react'; +import { ChevronDown, ChevronRight, Folder, FolderOpen, Pencil, Star, Rocket } from 'lucide-react'; import type { BeadIssue } from '../../lib/types'; import { cn } from '../../lib/utils'; import { useUrlState, type ViewType } from '../../hooks/use-url-state'; +import { LaunchSwarmDialog } from '../swarm/launch-dialog'; export type LeftPanelStatusFilter = 'all' | 'ready' | 'in_progress' | 'blocked' | 'deferred' | 'done'; export type LeftPanelPriorityFilter = 'all' | 'P0' | 'P1' | 'P2' | 'P3' | 'P4'; @@ -23,8 +24,10 @@ export interface LeftPanelProps { issues: BeadIssue[]; selectedEpicId?: string | null; onEpicSelect?: (epicId: string | null) => void; + onEpicEdit?: (epicId: string) => void; filters: LeftPanelFilters; onFiltersChange: (filters: LeftPanelFilters) => void; + projectRoot: string; } interface EpicEntry { @@ -172,10 +175,11 @@ function isTaskMatch(task: BeadIssue, filters: LeftPanelFilters): boolean { return true; } -export function LeftPanel({ issues, selectedEpicId, onEpicSelect, filters, onFiltersChange }: LeftPanelProps) { +export function LeftPanel({ issues, selectedEpicId, onEpicSelect, onEpicEdit, filters, onFiltersChange, projectRoot }: LeftPanelProps) { const { view, setView } = useUrlState(); const entries = useMemo(() => buildEntries(issues), [issues]); const [expanded, setExpanded] = useState>({}); + const [launchSwarmEpicId, setLaunchSwarmEpicId] = useState(null); const hasActiveFilters = filters.query.trim().length > 0 || @@ -369,6 +373,28 @@ export function LeftPanel({ issues, selectedEpicId, onEpicSelect, filters, onFil >