The composer
Typing, attaching, slash commands, and choosing which model answers.
The box at the bottom reading Ask your coworker… is the same component everywhere — docked in the
chat panel, on the welcome screen, and as the floating command bar in runs mode.
Same keys, same rules, same limits in all three.
Sending#
Enter sends — as does Ctrl/Cmd+Enter. Shift+Enter starts a new line. The box grows a
row at a time to about 200px, then scrolls.
Escape stops a running agent. So does the send button, which turns into a pause icon while the agent is working.
That last one has a sharp edge worth learning before you hit it:
Note
While the agent is busy, Enter queues your message — it parks as a dashed bubble reading
Queued · sends when the agent finishes and goes out automatically when the turn ends. But
clicking the button instead stops the run. Same box, two different outcomes. Cancel a queued
message with the ✕ on its bubble.
Stopping the agent also discards everything queued behind it, and queued messages are never written to disk — a reload loses them.
The toolbar#
The row with the model picker, the context ring and the + button is collapsed at rest. Click
the ⬆ arrow (Show actions) to open it. It opens by itself on the welcome screen and on the first
message of a run, never closes by itself, and remembers your choice across tabs, new chats and
restarts.
Above the box sits a second row that's always visible: New chat, Chat history, the follow picker, and the view-mode switcher that gets you to runs mode. An emoji button can be added there from Settings → General → Emoji picker in the chat toolbar; it's off by default.
Attaching things#
Four kinds of thing can ride along with a message, and all of them are one-shot — everything attached is cleared the moment you send.
A file — drag it from the explorer onto the box. The border lights up in the accent colour as you hover, and dropping it leaves a chip showing the name and size. The file's contents are inlined into that one message; the transcript only shows the chip. Up to 10 files, each up to 256KB.
An image — paste it. Ctrl/Cmd+V with the box focused. Up to 4 images, each up to
10MB, in png, jpeg, gif or webp.
A snippet of code — select it and click Send to Chat. The button floats over any selection in
the editor, and over selected text in the terminal. Syntax-error diagnostics can be sent the same
way. The chip shows the line count and language.
A slash command — see below.
Note
Pasting is the only way to attach an image, and dragging from the explorer is the only way
to attach a file. You cannot drag a file in from your desktop or your file manager. The
Upload image entry in the + menu does nothing at all today — it's a stub, not a file picker.
Dragging a folder from the explorer also does nothing.
Note
Rejections are silent. An 11th file, a 5th image, a file over 256KB, an image over 10MB, an image of the wrong type, or the same image pasted twice — none of these show an error. The chip just never appears. If something you attached isn't there, it hit one of these. 256KB is smaller than it sounds; a large source file can exceed it.
Two more things about attachments that will save you a confusing minute:
Attached files are a snapshot. The contents are inlined into that single message. Edit the file afterwards and the agent is still working from what it read — attach it again to refresh it. (The agent can of course just read the file itself; attaching is for pointing.)
Attachments are shared across tabs. Paste an image in one conversation, switch to another, and the image is still attached — and sending from there will consume it. The same is true of text you've typed but not sent.
Slash commands#
Type / as the first character and a menu opens listing every command available to you. Keep
typing to filter, ↑/↓ to move, Enter or Tab to attach, Escape to close.
The rule for opening the menu is strict: / must be at the very start and there must be no
spaces anywhere in the box. check /deploy won't open it.
Attaching a command turns it into a chip above the box and clears what you typed — the assumption
is that the /name was the whole content. Then type your actual message; the command's body is
prepended to it when you send.
Rows carry a badge saying where the command came from:
USR— yours, from~/.semantix/USER/commands/. Available in every project.WS— this project's, from~/.semantix/WORKSPACE/<project>/commands/. Note that this is inside~/.semantix, not inside the project directory itself. A workspace command wins if both scopes define the same name.INSTR— a manual instruction from the active project, offered here so you can pull it in deliberately. Automatic instructions ride every message and never appear in this list.
Each command is a markdown file: the filename is the command name, optional frontmatter carries the one-line description, and the rest is the prompt body. Write them by hand or use Settings → Instructions → Commands, which refreshes the picker live — no reload.
/claude is the exception to all of this. It isn't attached to your message; picking it opens the
Claude settings panel.
Choosing the model#
The model dropdown in the toolbar has two tabs: your models and Claude Code.
Your models are OpenAI-compatible endpoints you've added yourself, stored with their keys in
~/.semantix/USER/custom-models.json. Semantix ships no built-in catalogue of hosted models — if the
tab is empty, you haven't added one yet. See
Conversations and history for how to add one.
Claude Code lists whatever your local Claude Code install offers, fetched live when you open the picker. If that list looks empty, the local sidecar didn't answer.
A pick applies to the conversation you're in, and is also remembered as the default for the next one you start. The dropdown is disabled while the agent is working — stop the run or wait.
On a Claude model the toolbar also shows a chip like Opus · Extra High. Clicking it opens a panel
with three rows: Switch model…, Effort, and Thinking. Effort is a bar slider; Thinking is
a switch. Both appear only if the selected model supports them, and both are dropped automatically
if you switch to a model that doesn't. Changing the model here leaves a Switched Claude Code to Opus. line in the transcript.
The context ring#
The ring beside the model picker is how full the model's context window is. Hover it for
142k / 1.0M tokens · 14% used; click it for a panel breaking down the last turn — input, output,
reasoning, cache hit, cache write, cost — and the session total.
It's green while more than half the window is free, amber below that, and red below 20% remaining.
Two things about the number:
It counts the whole prompt, including cache. "Used" is what the last request actually carried: new input plus cache reads plus cache writes. On a Claude Code session the ring therefore reads high almost immediately, because the entire conversation rides the cache on every turn. That's the true size of the request, not a bug — but it is not "how much I've typed".
It's zero until the first turn finishes. The ring reports what the provider said it used; it doesn't estimate what's sitting in the box.
Window sizes: 1,000,000 for a Claude model whose id carries [1m], 200,000 otherwise, and 128,000
for a custom model that doesn't declare one.
Note
Switching models mid-conversation spikes cache write on the next turn — the new model can't reuse the old one's cache and has to lay down its own. The panel shows this explicitly so a sudden cost jump has a visible cause.
What isn't kept#
Nothing in the composer survives a reload — typed text, attachments, chips, all gone. There are no
saved drafts, and there is no @ mention or path autocomplete anywhere; / is the only trigger
character.