Host · Chat
Message Queue & TODO Panels
Two panels stacked directly above the composer — SessionTodoPanel (session TODOs) and MessageQueuePanel (pending external signals). Both are rendered by ChatComposerDock, and each draws nothing when it has no items.
MessageQueuePanel
When an external signal arrives (a new Outlook email, a meeting ending, etc.), it stacks up as a card in the panel without blocking the ChatView body. Implementation: src/ui/renderer/components/MessageQueuePanel.tsx. Clicking a card switches the chat body to an ask-user question card or a tool call.
SessionTodoPanel
Session-scoped TODOs. Items added directly by the user and items created by the agent from context share the same list. Implementation: src/ui/renderer/components/SessionTodoPanel.tsx. Each item is shown with a source label.
How a signal reaches the panel
- A plugin (e.g. ms-graph) calls
hostApi.emitEvent('email.new', payload). - The subscribed work-assistant evaluates it via a detector in
onEvent('email.new', …). - When the detector decides on a surface, it calls
hostApi.triggerConversation({ …spec }). - The host UI exposes it via the MessageQueuePanel or a card.
- Every flow appends one line to
~/.lvis/audit/<YYYY-MM-DD>.jsonl.
hostApi.enqueueMessage on the SDK surface. The standard path for putting an item on the panel is emit an event → host UI detects it → render, or triggerConversation.