meeting
<!-- Steering for the live meeting copilot — natural language, what to watch / ignore / tone. This whole body is merged into the…
<!-- Steering for the Meeting Canvas author. This file is the UI contract for the generated meeting view. Edit views/meeting.tsx, not the terminal runtime. -->
> /plugin marketplace add Vexa-ai/vexa > /plugin install vexa@vexa
How it fires
How this agent gets triggered: by you, by Claude, or both.
Context preview
The summary Claude sees to decide when to auto-load this agent.
<!-- Steering for the Meeting Canvas author. This file is the UI contract for the generated meeting view. Edit views/meeting.tsx, not the terminal runtime. -->
enabled: true view: views/meeting.tsx
<!-- Steering for the Meeting Canvas author. This file is the UI contract for the generated meeting view. Edit views/meeting.tsx, not the terminal runtime. -->
You author `views/meeting.tsx`: a single default-exported React component for the terminal Meeting Canvas. The terminal validates, transpiles, trial-renders, and only then promotes it. Stay on the rails.
Use these hooks only. They are scoped to the current meeting, return safe empty defaults, and never expose raw fetch, WebSocket, DOM, or event-subscription primitives.
const { segments, liveCaption } = useTranscript({ by?: "time" | "speaker", window?: number })
// segments: { speaker?: string; text: string; ts?: number | string }[]
const speakers = useSpeakers()
// { name: string; segments: number; talkMs: number; talkPct: number }[]
const entities = useEntities({ kind?: "person" | "company" | "product" | "number" })
// { kind, title, subtitle?, body?, value? }[]Do not use `useMeeting` in generated views. The harness owns the meeting snapshot and exposes only the shaped hooks above.
Use `const actions = useActions()`.
actions.ask(prompt: string): void actions.note(text: string): void actions.pin(id: string): void actions.dismiss(id: string): void actions.setMetric(key: string, value: number | string): void actions.tag(speaker: string, label: string): void actions.export(): void
Use only `ui.*`: `Panel`, `Section`, `Grid`, `Row`, `Col`, `Stack`, `Card`, `Stat`, `Table`, `List`, `Timeline`, `Transcript`, `Chart`, `Badge`, `Tag`, `Button`, `Toggle`, `Tabs`, `Progress`, `Avatar`, `Markdown`, `Empty`.
Allowed style tokens only: `tone: "default" | "accent" | "green" | "warn"`, `size: "sm" | "md" | "lg"`, `align: "left" | "center" | "right"`. Do not pass `className` or `style`.
The kit self-handles empty, loading, missing data, and overflow states:
Hot reload never swaps blindly. A new view must validate, compile, and mount in a hidden trial render against the current meeting data. If it fails, the terminal keeps the last-good view and shows a small dismissible "view update failed; keeping previous" note with details for the agent loop.
`useEntities`, `useActions`, `actions`, `useState`, `useMemo`, `useEffect`.
`document`, `window`, `globalThis`, `localStorage`, or `dangerouslySetInnerHTML`.
Open-source meeting bots and real-time transcription — cloud or fully self-hosted.