by aloner
Gallery
What it does
Group chats lose the plan and the receipt. Huddle gives a small group one live page; movable cards, a poll, a bring-list, and a shared ledger plus its own email address. Forward a bakery receipt and the Clerk files the expense, the Treasurer splits it and emails back what everyone owes, and the Scout reads any link and pins a summary with questions. Everything the agents do appears on the page as it happens, so the group sees the work instead of scrolling for it.
How the agents run concurrently
One inbox.received event wakes Clerk and Scout at the same time: Clerk files the receipt or plan while Scout reads the URL, each in its own Mozaik runLoop with a fresh ModelContext. Clerk deliberately skips bare-link mail so the two agents split the work instead of duplicating it. When Clerk's file_expense tool finishes, it emits expense.filed, which wakes Treasurer immediately, its split-and-reply loop starts while Clerk and Scout may still be running. No agent calls another; every participant reacts to the same semantic event stream. They share one space: cards, members, the ledger and the activity feed, plus the agent-status map and the SSE client set. Tools write cards and ledger entries; the runtime broadcasts every change to the UI and the other participants. Humans are participants too, adding a card, voting, claiming an item or dropping a link emits card.added, poll.voted, item.claimed or link.dropped into the same stream. Coordination is by event type, not a fixed workflow: inbox.received, expense.filed, link.dropped. Concurrency safety comes from Clerk's mail context carried in AsyncLocalStorage (two forwards can't overwrite each other's sender/subject), height-aware card lanes so parallel outputs don't overlap, and guarded SSE writes. A Ticker observer turns every inference start, tool call and model answer into the live agent panel without calling the model; once paired, the same loops stream to Mozaik Cloud, the submitted trace shows 22 loops across the three agents.