The composer

Typing, attaching, slash commands including /handoff, choosing which model answers and which agent's memory it draws on, the permission mode, and the context ring.

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. 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 becomes a stop button 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 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.

If Send is greyed out with the tooltip Select a model first, the conversation's saved model can't run right now — see Choosing the model.

The strip and the toolbar#

Two rows of controls belong to the composer.

The strip rides along its top edge and is always visible: New chat, Chat history, the emoji button if you've switched it on in Settings → Studio, the follow picker, and the view-mode switcher that gets you to runs mode. On a Claude Code conversation the strip's right end also carries the Claude cluster — see below.

The toolbar — the row with the + menu, the model picker, the context ring, the permission mode and Send — 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. While it's collapsed, the ⬆ arrow and the Send button sit beside the text so the box stays usable.

A suggestion can appear above the box after a turn on Claude Code: one quiet line with the agent's guess at what you'll ask next. Click it to put it in the box (you can still edit it); the ✕, or your next send, clears it.

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. Large images are downscaled before they're sent, to keep vision tokens down.

A snippet of code — select it and click Send to chat. The pill 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, 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-id>/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, which refreshes the picker live — no reload.

Two commands are exceptions to all of this — they're built in, they aren't markdown files, and neither one attaches to a message.

/handoff writes the note the next session starts from: a short narrative of what this conversation was about and where it left off, stored with the project, and handed to the next new chat on its first turn. It runs in the background — you can keep typing — and needs memory switched on. Pick it from the menu, or hover a conversation in the history list for the same button.

→ Handing a session off

/claude appears only while Claude Code is the active model, and opens the Claude settings panel described below.

Choosing the model#

The model picker in the toolbar opens a searchable list with two views, switched by the marks just above the rows: the Semantix mark — every model from every source, in one list — and Claude Code, which keeps its own mark beside it and appears only if the claude command is installed, signed in, and switched on in Settings → Models.

The all-models view holds your connected providers' catalogues (an OpenRouter row carries the provider's name), your custom models (labelled Custom), and any installed coding agents you've switched on. Search reaches the whole list, 25 rows at a time — the footer says Showing 25 of 446 — scroll or type for more. Above the search: a sort/filter bar and provider chips to narrow the list. Star a model and it rides at the top of every view; a starred model is also what a new agent in the composer starts with.

A pick applies to the conversation you're in, and is also remembered as the default for the next one you start. The picker is disabled while the agent is working — stop the run or wait.

Note

A saved model that can't run is never swapped for another. If a conversation's model disappears — a provider disconnected, Claude Code signed out — the picker reads Select Model, Send is disabled with Select a model first, and you choose. Nothing runs on a model you didn't pick.

With memory turned on, an Agent row sits at the very top of the menu, above the search. It chooses which agent this conversation is talking to — and so whose memory it draws on: the project's default agent first (<name> — project default), then any other agent allowed into this project. It's a separate choice from the model, and it's hidden entirely when memory is off.

→ Which agent it talks to

On a Claude Code model the toolbar also shows a chip like Opus · Extra High. Clicking it — or picking /claude — opens a panel with up to three rows: Switch model…, Effort, and Thinking. Effort is a bar slider (Low to Max, plus Ultra code on models that allow it); Thinking is a switch. Both appear only if the selected model supports them. Changing the model here leaves a Switched Claude Code to Opus. line in the transcript.

The Claude cluster#

On a Claude Code conversation the right end of the strip carries two small buttons — Plan usage (/usage) and Context window (/context) — which open the reports the Claude CLI itself prints, fetched on demand. No prompt is spent and nothing lands in the chat. A coloured dot appears beside them only when a subscription window is running low — yellow, orange at 90%, red when a request was refused — reading something like 5h · 90% used · resets 22:00.

The permission mode#

Just left of Send sits a chip reading Manual, Edits or Full — how much the agent may do before asking you. It applies machine-wide, persists, and starts on Manual.

→ Asking permission

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.

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.

The window size is whatever the provider reported for the model that answered. Where it reports nothing, Semantix falls back to 1,000,000 for a Claude model whose id carries [1m], 200,000 for other Claude models, a connected provider's published window, 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.