14 · Conversation · Chat

The thread is the surface.

14 / 22

Chat is where intent meets capability. A thread is not a transcript — it is the connective tissue between what the user said, what the agent decided, what tools it reached for, and what the workspace now contains. Every other surface in the product is reached through conversation or informed by one. The thread persists, references context-map nodes, holds inline CTAs that stand in for whole flows, and survives transitions (onboarding → studio, studio → workflow authoring) without losing its history.

14.1Anatomy

Three zones, sharp seams.

A thread is head, transcript, composer — stacked, full height, no drawers. The head carries identity (toolbox, title), the transcript is the scrolling log, the composer anchors user intent. Seams between them are hairline borders, not shadows.

Studio Morning Clepsy digest · iteration 3 14:22 · 42 turns
You
Add the overnight Clepsy commits section above the inbox summary, and skip weekends.
Librarian
figments.edit 340 ms
Patch runtime 2 hunks · morning_digest.ts 180 ms
Read manifest figment.toml 160 ms
Done. Digest now leads with Clepsy commits when there are any, and the daily trigger skips Sat/Sun. Want me to add a skip for company holidays too?
You
Yes, use Google Calendar for holidays.
Librarian
Connect Google Calendar
Read-only access to your primary calendar, so I can detect holiday entries.
Librarian · streaming
Looking up next Monday…
Type a reply…
⌘↵ send · ⇧↵ newline · ⌥U attach
A Head — toolbox · title · meta · kebab for rename / delete / archive
B Transcript — scrolling log of turns, inline cards, tool calls, streaming states
C Composer — attachments row · textarea · attach + send/stop · drag-drop · paste
14.2Messages

Six shapes. Each one does one job.

The transcript composes a small number of message shapes. Every shape has a role strip (you / assistant / error), a body, and — when the agent called tools — an attached tool-call group above the body. Streaming messages animate in; finished messages don't. Situation changes, capability swaps, and toolbox rebinds are background machinery — they never render in the transcript.

User · text
Summarise my inbox for the last 24 hours.
User · text + attachment
sam-cv.pdf82 KB
Extract my projects from this.
Assistant · markdown
I found three active projects: Clepsy W, GEDi Cube handoff, and the Figments notebook. Here's what I already have for each in your context map.
Assistant · with tool calls
gmail 3 calls 1.2 s
18 unread · 3 marked important. Top sender: Mira.
Assistant · streaming
Reading 18 threads…
Assistant · error
Couldn't reach Gmail — the connection expired. Reconnect and I'll retry.
14.3Tool calls

Four zoom levels. No surprises.

When the agent uses a tool, the transcript renders a drill-down, not a dump. Four levels of disclosure, each earning its keep. The outer bar is a receipt at a glance; the next layer groups calls by what touched what; the next lists the individual calls; the innermost reveals the raw result for the one call a user actually wants to read. Nothing is hidden — it is arranged.

Calls group per integration, not per call, so one turn with five Gmail reads and one Notion write shows as two groups under one outer bar, not six equal rows. When an integration has an identity concept (Gmail, Slack, GitHub) and a single identity was touched, the identity rides inline in the group header. Touch two identities and a mono 2 accts badge replaces it, with sub-groups revealed on expansion. Identity-free tools stay flat.

L1
Outer receipt N tool call(s) · total duration · ▾ — pulse dot while streaming, red fail-count when any call errored. Tap to expand the whole turn.
L2
Integration groups One row per integration (or per built-in family). Logo or geometric glyph, integration name, identity-or-badge, call count, duration.
L3
Call rows Status glyph · action name · one-line summary · (Open) · duration · ▾. Rows collapse when the result carries no payload worth reading.
L4
Raw result Mono-font scrollable panel with the raw JSON / text, truncated at 30 lines. Reserved for when a user goes looking; never shown by default.
Built-in glyph language

Integration tools carry their vendor logo. Built-in tools — the ones Figments ships itself — carry a small geometric glyph keyed to their family, so the transcript never shows a missing-logo placeholder.

Canvasopen / close / edit the studio surface
Themecreate / update / list themes
Figmentcreate / read / list figments
Boardsnapshot / request / list boards
Fileread document / image / thread files
Integrationlist available integrations
L1 · outer receipt, collapsed
6 tool calls 3.4 s
L1 · with failure
3 tool calls · 1 failed 1.8 s
L1 · streaming
2 tool calls
L2 · one integration · expanded
3 tool calls 1.2 s
Gmail sam@figments.ai 3 calls
Search label:inbox newer_than:1d · 18 results 420 ms
Read thread 19a2f3… · 6 msgs 380 ms
Read thread 19a301… · 2 msgs 400 ms
L2 · multiple integrations
5 tool calls 2.8 s
Gmail sam@figments.ai 3 calls
Search 18 results 420 ms
Read thread 6 msgs 380 ms
Read thread 2 msgs 400 ms
read_document 1 call
Document prospect-pa-brief.md · 4.2 KB 280 ms
create_figment 1 call
Create figment Creating "Morning Clepsy digest" Open 1.8 s
L4 · raw result
1 tool call 280 ms
read_document 1 call
Document prospect-pa-brief.md 280 ms
{
  "document_id": "doc_01hv4ab…",
  "filename": "prospect-pa-brief.md",
  "byte_size": 4312,
  "mime_type": "text/markdown",
  "content": "# Prospect · Personal assistant brief\n\nHi Mira — here's the one-pager we talked about on Tuesday…"
}
Multi-identity · sub-grouped
5 tool calls 2.4 s
Gmail 2 accts 5 calls
sam@figments.ai 3 calls
Search label:inbox newer_than:1d 420 ms
Read thread 19a2f3… · 6 msgs 380 ms
Read thread 19a301… · 2 msgs 400 ms
sam@personal.com 2 calls
Search label:shipping 520 ms
Read thread ab7f… · 3 msgs 680 ms
Failed call
1 tool call · 1 failed 72 ms
Slack #eng-ops 1 call
Post message permission_denied · channel read-only for this scope 72 ms

Ordering. Inside an assistant turn, the message text renders first; the tool-call bar sits after it, with a paragraph break between. When the agent emits text → tool call → text, the renderer preserves the break so the second beat of prose never runs into the first. Errors and retries attach to the message, not the tool call: if the whole turn errored, the message body shows the error and a ↻ Resend affordance — not the tool-call bar.

14.4Composer

Five states. One frame.

The composer stays put. What changes is its border (hairline → signal on focus or drag), its button (send ↔ stop), and the attachments row above it. Pasting, dragging, and clicking the paperclip all land in the same attachment chip row. While the agent streams, you can type a follow-up — it queues and sends the moment the turn finishes.

Idle
Message…
Focused · ready to send
Summarise my inbox
Drag-over
Drop to attach
Uploading
sam-cv.pdfuploading…
Message…
Sending · follow-up ready
One more thing —
Type to queue a follow-up · it sends when the turn finishes.
14.5Attachments

Three ways in, one row.

Click the paperclip, drag from the OS, or paste from the clipboard. All three land the file in the attachments row above the composer as a chip — image chips show a thumbnail, file chips show a type glyph. Chips are removable until the message is sent; after that they're citable from the turn.

File chip proposal-q2.pdf 184 KB
Image chip whiteboard.png 2.1 MB
Uploading notes.md uploading…
Upload failed ! archive.zip too large
14.6Thread switching

The sidebar is your history.

Threads live in the left sidebar ordered by recency. The active thread is inverted. Hover or focus reveals the kebab — rename in place with double-click; delete asks for confirmation. An empty state teaches the first action rather than asking users to guess.

Threads · 4
Morning Clepsy digest · iteration 3 14:22
Onboarding Mon
Pitch deck draft Apr 14
Empty state

No threads yet.

Ideas live inside threads. Start one with a question or a document drop — the Librarian takes it from there.

14.7Inline cards

Calls to action, in the flow.

Agent tools render rich cards inline in the assistant's turn. Clicking a card does the real thing — create a figment, connect an integration, save a memory — and the card updates in place to reflect the new state. Every card has a primary action, optional secondary, and surfaces any confirmations before destructive steps.

Connect Gmail
So I can pull inbox threads related to Clepsy into the context map as they arrive.
Scope read · threads, labels Revoke any time
Morning Clepsy digest
A daily one-pager: overnight Clepsy commits, open Gmail threads tagged clepsy, and any tasks you flagged yesterday.
Triggers daily 07:00 Uses gmail, github
Triage new inbox contacts
When a Gmail thread arrives from an unknown sender, classify it and add a person node if they look worth remembering.
On new-thread Steps 3
You prefer async kickoffs over live meetings.
Heard this twice in the last three turns. I'll remember it unless you'd rather I didn't.
Which threads matter most to summarize?
Search · 4 hits
projectClepsy W
memoryClepsy W Project Focus
documentSamGalanakisCV
memoryProfessional experience at GEDi Cube
Delete the old-inbox workflow?
It hasn't triggered in the last 30 days.
Got a CV or LinkedIn export handy? It speeds this up a lot. Drop file
14.8Underneath · developer reference

Situation → Capabilities → Tools.

This machinery is invisible to users. No situation banner, no capability picker, no "toolbox rebinding…" toast. The thread just keeps going; what the agent can do quietly expands or contracts with context. Users never see the table below — it's a reference for people building the product, not a surface in it.

A thread has exactly one active situation. The situation resolves to a capability set, which flattens into concrete tools at turn start. Capabilities are where access control lives — integration capabilities only resolve if the user has actually connected the tool. The thread is the same thread across transitions; what changes is what the agent can do, and which cards it can render. Transitions are triggered by user actions on inline cards (creating a figment moves the thread into studio_editing) or by route changes (entering the workflow editor) — never by a chat message announcing them.

Situation
Capabilities
Cards it renders
onboarding
context_map.readcontext_map.write integrations.propose figments.proposeworkflows.propose uploads.requestonboarding.complete
IntegrationFigmentWorkflow MemoryUpload chip
normal_chat
context_map.readcontext_map.write integrations.use.* figments.proposeworkflows.propose
All of the above, as needed
studio_editing(id)
context_map.read figments.edit(id) integrations.use.*
Figment patchesMemoryConfirm
workflow_authoring(id)
context_map.read workflows.edit(id) integrations.use.*
Workflow patchesMemoryConfirm
14.9Variants

Wide for focus, compact for flow.

Two variants share the same grammar. Wide runs the full Studio column — larger type, user bubbles inverted for contrast, no role labels. Compact embeds inside other surfaces (workflow editor sidebar, agent-inspect panels) — smaller type, tighter rows, role strips restored for scannability.

Wide · studio primary
Ship it.
Done. Published v3 of Morning Clepsy digest to the daily run at 07:00.
Compact · widget embed
You
Why did this step fail?
Agent
Gmail returned 429. Retry in 30 s or bump the rate-limit.