Components
The frontend's Vue components live in frontend/components/ and are auto-imported — no explicit import needed.
Component Organization
components/
├── agent/ # AI agent turn rendering
│ ├── AgentView.vue # Main: renders Turn[] as request bubbles + response blocks
│ ├── AgentInput.vue # Dock input: text + image/file drag-drop + mic recording
│ ├── ToolCard.vue # Collapsible tool call card (running/done/error states)
│ ├── ResponseBlocks.vue # Renders ResponseBlock[] by type
│ ├── RequestBubble.vue # User message bubble
│ └── ... other block renderers
├── ai/
│ └── AssistantPanel.vue # Main AI chat panel (header + AgentView + AgentInput)
├── common/
│ ├── Sidebar3D.vue # Dock sidebar: home, pinned, spaces, settings
│ ├── Toolbar3D.vue # Rotating toolbar: breadcrumb + space actions
│ └── ConfirmationModal.vue
├── panels/
│ ├── SplitPane.vue # Resizable split panels
│ ├── BottomPanel.vue # Output/debug panel
│ └── files/FileExplorer.vue
├── toolbar/
│ ├── Search.vue
│ └── Breadcrumb.vue
├── media/
│ ├── MediaPickerModal.vue
│ └── MediaUploadModal.vue
└── oracle/
└── OraclePanel.vue # Context-aware AI sidebarKey Components
AgentView
Renders an array of Turn[] — the core AI conversation display. Each turn shows:
- RequestBubble — the user's input (text, images, files)
- ResponseBlocks — the agent's response rendered by block type
- Auto-scrolls during streaming
- Shows stream status (thinking, tool running, etc.)
AgentInput
The input dock at the bottom of the assistant panel:
- Text input with glassmorphism styling
- Drag-and-drop for images and files → creates attachment blocks
- Speech recognition (mic button)
- Send button dispatches
RequestBlock[]
ToolCard
Visualizes a single tool call:
- State indicator: spinning (running), check (done), X (error)
- Collapsible panel showing tool name, input parameters, and result
- Expandable with input/output inspection
AssistantPanel
The main AI chat wrapper:
- Header with agent selector
- AgentView for conversation
- AgentInput for user input
- Toggleable with Double-Shift shortcut
Sidebar3D
72px-wide dock sidebar using CSS 3D transforms:
- Front face: Home icon, pinned items, divider, all space icons, settings
- Right face (-90°): Space sub-pages (when a space is active)
- Rotates between faces with
rotateYtransform - Click space → route to
/:spaceName
Toolbar3D
Breadcrumb + action bar using CSS 3D transforms:
- Front face: Current page breadcrumb
- Bottom face: Next page during transition
- Rotates with
rotateXtransform - Space-specific toolbar items injected from space manifest
Component Conventions
- Use
<script setup lang="ts">(Composition API) - Props defined with
defineProps<T>() - Emit events with
defineEmits<T>() - Use composables for shared logic (not mixins)
- UI primitives from
@construct-space/ui(auto-imported)