Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 8 additions & 6 deletions docs/user/composer.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,15 +34,17 @@ See [images and videos](#images-and-videos-in-messages) for previewing and savin

## Send while the agent is working

On web and desktop, a message sent during a running turn waits at the end of the conversation as a
On web and desktop, a message sent during a running turn goes to the agent right
away and joins the work in progress. While a queued message is still due to go
out on its own, a new message lines up behind it.

In **Settings → General → Follow-up behavior**, choose **Queue** to hold these
messages instead. A queued message waits at the end of the conversation as a
dashed bubble. It goes out on its own when the agent finishes its next tool
call, or when the turn ends, even while you have another thread open. Use the arrow under the bubble to send it right
away, or the X to move it back into the composer. Stop returns every queued
message to the composer.

In **Settings → General → Follow-up behavior**, choose **Queue** to keep this
behavior or **Steer** to send new messages immediately. This setting applies to
the current client. Messages already queued keep their place.
message to the composer. This setting applies to the current client. Messages
already queued keep their place.
Comment thread
coderabbitai[bot] marked this conversation as resolved.

Use `Cmd+Shift+Enter` on macOS or `Ctrl+Shift+Enter` on Windows and Linux to send
the oldest queued message now. Change `thread.steerQueuedMessage` in
Expand Down
4 changes: 2 additions & 2 deletions packages/contracts/src/settings.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -632,8 +632,8 @@ describe("ClientSettings send shortcut", () => {
});

describe("ClientSettings follow-up behavior", () => {
it("defaults to queue and accepts either behavior", () => {
expect(decodeClientSettings({}).followUpBehavior).toBe("queue");
it("defaults to steer and accepts either behavior", () => {
expect(decodeClientSettings({}).followUpBehavior).toBe("steer");
for (const followUpBehavior of ["queue", "steer"]) {
expect(decodeClientSettings({ followUpBehavior }).followUpBehavior).toBe(followUpBehavior);
expect(decodeClientSettingsPatch({ followUpBehavior }).followUpBehavior).toBe(
Expand Down
4 changes: 3 additions & 1 deletion packages/contracts/src/settings.ts
Original file line number Diff line number Diff line change
Expand Up @@ -450,8 +450,10 @@ export const ClientSettingsSchema = Schema.Struct({
sendShortcut: Schema.Literals(["enter", "mod-enter-multiline", "mod-enter"]).pipe(
Schema.withDecodingDefault(Effect.succeed("enter")),
),
// A message sent during a running turn goes to the agent right away, as
// typing into the Claude Code CLI does. Queue holds it back instead.
followUpBehavior: Schema.Literals(["queue", "steer"]).pipe(
Schema.withDecodingDefault(Effect.succeed("queue")),
Schema.withDecodingDefault(Effect.succeed("steer")),
),
proactivePanelsEnabled: Schema.Boolean.pipe(Schema.withDecodingDefault(Effect.succeed(false))),
showSkillsInSlashMenu: Schema.Boolean.pipe(Schema.withDecodingDefault(Effect.succeed(true))),
Expand Down
Loading