# Agent Task Briefs (for Phase 2 spawn) ## Shared Context for ALL Phase 2 Agents - Working dir: `/Users/jakeshore/.clawdbot/workspace/mcp-diagrams/GoHighLevel-MCP/src/ui/react-app/` - Read the full plan: `../../REACT-REWRITE-PLAN.md` - Read types: `src/types.ts` (created by Alpha — has all prop interfaces) - Read registry: `src/renderer/registry.ts` (has stub components — replace yours) - Read current string implementations: `../json-render-app/src/components.ts` and `../json-render-app/src/charts.ts` - Use MCPAppContext via `import { useMCPApp } from '../context/MCPAppContext'` for callTool - CSS goes in `src/styles/components.css` (display) or `src/styles/interactive.css` (interactive) - Each component is a React FC exported from its own file - After building all components, UPDATE `src/renderer/registry.ts` to import your real components instead of stubs - NO GHL references — everything is generic MCP UI Kit - Compact sizing: 12px base, tight padding, designed for chat inline display --- ## Agent Bravo — Layout + Core Data (15 components) ### Files to create: ``` src/components/layout/PageHeader.tsx src/components/layout/Card.tsx src/components/layout/StatsGrid.tsx src/components/layout/SplitLayout.tsx src/components/layout/Section.tsx src/components/data/DataTable.tsx src/components/data/KanbanBoard.tsx ← DRAG AND DROP (key component) src/components/data/MetricCard.tsx src/components/data/StatusBadge.tsx src/components/data/Timeline.tsx src/components/data/DetailHeader.tsx src/components/data/KeyValueList.tsx src/components/data/LineItemsTable.tsx src/components/data/InfoBlock.tsx src/components/data/ProgressBar.tsx ``` ### Special attention: - **KanbanBoard** — Must have REAL drag-and-drop via React state (onDragStart/onDragOver/onDrop). - Cards are draggable between columns - Optimistic UI: move card immediately in state, revert on error - Accepts `moveTool?: string` prop — if provided, calls `callTool(moveTool, { opportunityId, pipelineStageId })` on drop - Drop zone highlights with dashed border - Cards show hover lift effect - **DataTable** — Sortable columns (click header), clickable rows (emit onRowClick), pagination - All layout components accept `children` prop for nested UITree elements --- ## Agent Charlie — Extended Data + Navigation + Actions (15 components) ### Files to create: ``` src/components/data/CurrencyDisplay.tsx src/components/data/TagList.tsx src/components/data/CardGrid.tsx src/components/data/AvatarGroup.tsx src/components/data/StarRating.tsx src/components/data/StockIndicator.tsx src/components/shared/SearchBar.tsx src/components/shared/FilterChips.tsx src/components/shared/TabGroup.tsx src/components/shared/ActionButton.tsx src/components/shared/ActionBar.tsx ``` Plus from data/: ``` src/components/data/ChecklistView.tsx src/components/data/AudioPlayer.tsx ``` ### Special attention: - **SearchBar** — Controlled input, fires onChange with debounce. Accepts `onSearch?: (query: string) => void` - **FilterChips** — Toggle active state on click, fires onFilter - **TabGroup** — Controlled tab state, fires onTabChange - **ActionButton** — Accepts `onClick` + optional `toolName` + `toolArgs` props. If toolName provided, calls callTool on click. - **ChecklistView** — Checkboxes toggle completed state. Accepts `onToggle?: (itemId, completed) => void` --- ## Agent Delta — Comms + Viz + Charts (16 components) ### Files to create: ``` src/components/comms/ChatThread.tsx src/components/comms/EmailPreview.tsx src/components/comms/ContentPreview.tsx src/components/comms/TranscriptView.tsx src/components/viz/CalendarView.tsx src/components/viz/FlowDiagram.tsx src/components/viz/TreeView.tsx src/components/viz/MediaGallery.tsx src/components/viz/DuplicateCompare.tsx src/components/charts/BarChart.tsx src/components/charts/LineChart.tsx src/components/charts/PieChart.tsx src/components/charts/FunnelChart.tsx src/components/charts/SparklineChart.tsx ``` ### Special attention: - **All charts** — Use inline SVG (same approach as current charts.ts). Convert from template strings to JSX SVG elements. - **CalendarView** — Grid layout, today highlight, event dots. Accepts `onDateClick?: (date: string) => void` - **TreeView** — Expandable nodes with click-to-toggle. Track expanded state in local component state. - **ChatThread** — Outbound messages right-aligned indigo, inbound left-aligned gray. Auto-scroll to bottom. - **FlowDiagram** — Horizontal/vertical node→arrow→node layout with SVG connectors. --- ## Agent Echo — Interactive Components + Forms (8 components + shared UI) ### Files to create: ``` src/components/interactive/ContactPicker.tsx src/components/interactive/InvoiceBuilder.tsx src/components/interactive/OpportunityEditor.tsx src/components/interactive/AppointmentBooker.tsx src/components/interactive/EditableField.tsx src/components/interactive/SelectDropdown.tsx src/components/interactive/FormGroup.tsx src/components/interactive/AmountInput.tsx src/components/shared/Toast.tsx src/components/shared/Modal.tsx ``` ### Critical design: ALL interactive components are **CRM-agnostic**. They receive tool names as props. - **ContactPicker** — Searchable dropdown. - Props: `searchTool: string` (e.g., "search_contacts"), `onSelect: (contact) => void`, `placeholder?: string` - On keystroke (debounced 300ms): calls `callTool(searchTool, { query })` → displays results as dropdown options - On select: calls onSelect with full contact object, closes dropdown - Shows loading spinner during search - **InvoiceBuilder** — Multi-section form. - Props: `createTool?: string`, `contactSearchTool?: string` - Sections: Contact (uses ContactPicker), Line Items (add/remove rows), Totals (auto-calc) - Each line item: description, quantity, unit price, total - "Create Invoice" button calls `callTool(createTool, { contactId, lineItems, ... })` - **OpportunityEditor** — Inline edit form. - Props: `saveTool: string` (e.g., "update_opportunity"), `opportunity: { id, name, value, status, stageId }` - Renders current values with click-to-edit behavior - Save button calls `callTool(saveTool, { opportunityId, ...changes })` - **AppointmentBooker** — Date/time picker + form. - Props: `calendarTool?: string`, `bookTool?: string`, `contactSearchTool?: string` - Calendar grid for date selection, time slot list, contact picker, notes field - Book button calls `callTool(bookTool, { calendarId, contactId, date, time, ... })` - **EditableField** — Click-to-edit wrapper. - Props: `value: string`, `saveTool?: string`, `saveArgs?: Record`, `fieldName: string` - Click → shows input, blur/enter → saves via callTool if provided - **SelectDropdown** — Generic async select. - Props: `loadTool?: string`, `options?: Array`, `onChange`, `placeholder` - If loadTool provided, fetches options on mount/open - **FormGroup** — Layout for labeled form fields. - Props: `fields: Array<{ key, label, type, value, required? }>`, `onSubmit`, `submitLabel` - **AmountInput** — Currency-formatted number input. - Props: `value, onChange, currency?, locale?` - Formats display as $1,234.56, stores raw number - **Toast** — Notification component (renders via React portal). - Export `useToast()` hook: `const { showToast } = useToast()` - `showToast('Deal moved!', 'success')` — auto-dismisses - **Modal** — Dialog component (renders via React portal). - Props: `isOpen, onClose, title, children, footer?` - Backdrop click to close, escape key to close ### Styles: Write `src/styles/interactive.css` with all interactive styles (modals, toasts, dropdowns, drag states, form inputs, etc.)