@meistrari/remy-cli 1.25.0-rc.6 → 1.25.0-rc.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/README.md +12 -5
  2. package/dist/remy.js +26 -9
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -66,7 +66,7 @@ The new-session request and conversation composers share path completion and att
66
66
 
67
67
  ### Resume or follow up
68
68
 
69
- Every terminal follow-up is appended as an explicit **Steer**, so it targets the work currently in progress. Queuing a message for a later turn (**Next**) is Web-only for now. Remy can replay sessions containing queued-message dispatch, withdrawal, and failure events. Messages withdrawn or failed before reaching Remy show an activity notice; an active submission ends as cancelled or failed instead of waiting for a turn that never started.
69
+ Terminal follow-ups default to **Steer**, targeting the work currently in progress. Press `Ctrl+Enter` to queue a message as **Next**, which waits for current work to finish. Plain `Enter` continues to send as Steer. Failed submissions retain their mode, attachments, settings, and idempotency key when retried with `Ctrl+R`. Remy can replay sessions containing queued-message dispatch, withdrawal, and failure events. Messages withdrawn or failed before reaching Remy show an activity notice; an active submission ends as cancelled or failed instead of waiting for a turn that never started.
70
70
 
71
71
  Use Up/Down to select a session in the dashboard, Left/Right to load the adjacent page, and `Enter` to open it. Remy loads the complete retained conversation before showing the session view, then streams new activity as it arrives. Press `s` to search the loaded page by session ID, title, or number; `Enter` keeps the search active and `Esc` clears it. Press `f` to filter sessions by lifecycle status or `a` to filter by author. Both pickers use checkboxes: Up/Down or `j`/`k` moves, `Space` toggles, Right/`l` checks, Left/`h` clears, `G` and `gg` jump to the last and first option, and `Enter` applies every checked value. An empty picker means all values. Press `s` inside either picker to fuzzy-search its options; `Enter` keeps the matching list and `Esc` cancels the search. Press `Esc` outside search to discard staged checkbox changes. Filters apply to the complete remote result set and reset pagination to its first page. After the dashboard list or repository-review list has focus, Vim keys work too: `j`/`k` move, `h`/`l` go to the previous/next dashboard page (or clear/mark a repository), `G` goes to the last row, and `gg` goes to the first row. Press `Shift+L` in the dashboard to start a logout confirmation. In any message composer, plain `Enter` and `Shift+Enter` submit; `Option+Enter` on macOS (`Alt+Enter` elsewhere) inserts a newline. `Ctrl+J` also inserts a newline for terminals that do not report the Option/Alt modifier. `Cmd+Left`/`Cmd+Right` move to the start or end of the current line, as do `Home`/`End`, which many macOS terminals send for those keys; `Ctrl+D` deletes the character after the cursor. In the session view, `Ctrl+C` first clears a non-empty draft; press it again with an empty composer to exit. The conversation header keeps the numbered session title on its first line and repository, pull request, work state, elapsed time, connection state, and the agent's current `Harness · Model · Effort` on its second line. The header also keeps the last provider-reported context observation across reconnects, such as `Context 50% left · 62,000 used`; when the provider does not report a context window, it shows only used tokens. This is an observation, not a live occupancy guarantee or billing total.
72
72
 
@@ -94,7 +94,7 @@ Terminal previews show up to 50 content blocks and 8,000 characters per block, w
94
94
 
95
95
  Command and attachment feedback share progress, success, failure, and attention indicators. Failed stop requests show the reason and `esc` retry; failed complete/cancel requests restore the message prompt and show the retry command. Logout shows a confirmation with `y` to confirm and `Esc` to cancel.
96
96
 
97
- **Change the model or effort:** enter `/model` or `/reasoning` (`/effort` is an alias) to pick a new model or reasoning effort for your next message. The model list contains only the session's harness (a Claude session offers Claude models, a Codex session Codex models), in the same order and with the same labels as the new-session wizard. Arrows move, `Enter` stages the pick, and `Esc` closes the picker without changing what is already staged. Nothing is sent until you send a message: the change travels with it and stays the session's setting afterward. Because every terminal follow-up is a Steer, a change sent while Remy is working switches the running turn from its next model request; otherwise it applies from the turn your message starts. The header shows the staged change as `→ Sonnet 5.5 · High (next message)`, then `(switching…)` until the runtime applies it. The timeline then records `Switched to Sonnet 5.5 · High` right after your message, or `Switched to Sonnet 5.5 · High (from next turn)` when the running turn could not switch; its details (`Ctrl+O`) then show the provider's reason when one was given. Picking the current value removes it from the staged change.
97
+ **Change the model or effort:** enter `/model` or `/reasoning` (`/effort` is an alias) to pick a new model or reasoning effort for your next message. The model list contains only the session's harness (a Claude session offers Claude models, a Codex session Codex models), in the same order and with the same labels as the new-session wizard. Arrows move, `Enter` stages the pick, and `Esc` closes the picker without changing what is already staged. Nothing is sent until you send a message: the change travels with it and stays the session's setting afterward. With Steer, a change sent while Remy is working switches the running turn from its next model request; with Next, it waits for the queued message’s turn. The header shows the staged change as `→ Sonnet 5.5 · High (next message)`, then `(switching…)` until the runtime applies it. The timeline then records `Switched to Sonnet 5.5 · High` right after your message, or `Switched to Sonnet 5.5 · High (from next turn)` when the running turn could not switch; its details (`Ctrl+O`) then show the provider's reason when one was given. Picking the current value removes it from the staged change.
98
98
 
99
99
  Enter `/compact` to admit a durable main-thread context compaction control without sending a human message. Remy reports request admission immediately and shows the eventual completed, no-op, failed, or unknown provider result in retained activity. Compaction waits for a safe point and does not interrupt active work or jump ahead of an earlier Next message. While admission is pending, you can keep editing or open other commands; repeated `/compact` invocations do not send another request.
100
100
 
@@ -105,6 +105,7 @@ Drag to select visible text in any Remy view; Remy copies it to the local clipbo
105
105
  | `Esc` | Interrupt the active turn; the session stays open. |
106
106
  | `/complete` | Complete an open session after its active turn stops. |
107
107
  | `/cancel` | Cancel the current session, including an active turn. |
108
+ | `Ctrl+Enter` | Queue the message for a new turn after current work. |
108
109
  | `/compact` | Admit a main-thread context compaction request without sending a message; the provider result appears in retained activity. |
109
110
  | `/model` | Pick a model of the session's harness for your next message. |
110
111
  | `/effort` | Pick a reasoning effort for your next message. |
@@ -162,7 +163,13 @@ To submit a follow-up immediately, add one quoted positional `prompt`:
162
163
  remy --session <session-id> "Add regression coverage for that fix"
163
164
  ```
164
165
 
165
- Remy sends the prompt as **Steer**, then opens the conversation. Omitting the prompt only attaches. An explicitly empty prompt is rejected. Use `--` before a prompt beginning with `--` to treat it as text.
166
+ Remy sends the prompt as **Steer**, then opens the conversation. Add `--queue` to send it as **Next**, waiting for current work to finish:
167
+
168
+ ```bash
169
+ remy --session <session-id> --queue "Run the checks after you finish"
170
+ ```
171
+
172
+ `--queue` requires a prompt and also works with `--no-tui` or `--json`. Omitting the prompt only attaches. An explicitly empty prompt is rejected. Use `--` before a prompt beginning with `--` to treat it as text.
166
173
 
167
174
  To change the model or reasoning effort, pass `--model <name>`, `--reasoning-effort <low|medium|high|xhigh>`, or both with the prompt:
168
175
 
@@ -170,7 +177,7 @@ To change the model or reasoning effort, pass `--model <name>`, `--reasoning-eff
170
177
  remy --session <session-id> --model claude-sonnet-5-5 --reasoning-effort high "Finish the migration"
171
178
  ```
172
179
 
173
- The change travels with that message and stays the session's setting for later messages. A running turn switches from its next model request; otherwise the change applies from the turn the prompt starts. Either flag without a prompt is rejected, because settings only change with a message. The session keeps its harness, so `--model` must name one of that harness's models; Remy checks this against the session before sending and names the harness's models when it does not match. Omit both flags to keep the current settings.
180
+ The change travels with that message and stays the session's setting for later messages. With Steer, a running turn switches from its next model request; with `--queue`, the change applies when the queued message starts its turn. Either flag without a prompt is rejected, because settings only change with a message. The session keeps its harness, so `--model` must name one of that harness's models; Remy checks this against the session before sending and names the harness's models when it does not match. Omit both flags to keep the current settings.
174
181
 
175
182
  ### Automate a session
176
183
 
@@ -247,7 +254,7 @@ remy update
247
254
  remy --version | -v
248
255
  remy dashboard
249
256
  remy new [--repository <owner/name> ... --installation <id> --model <name> --reasoning-effort <low|medium|high|xhigh> --attach <path> ... --mcp <offering-id> ... --no-tui --json] <prompt>
250
- remy --session <session-id> [--model <name> --reasoning-effort <low|medium|high|xhigh> --no-tui --json] [prompt]
257
+ remy --session <session-id> [--queue --model <name> --reasoning-effort <low|medium|high|xhigh> --no-tui --json] [prompt]
251
258
  remy session open <session-id>
252
259
  remy session mcps list <session-id> [--json] | add <session-id> <offering-id> | enable|disable <session-id> <attachment-id>
253
260
  remy session workspace changes <session-id> [--json]
package/dist/remy.js CHANGED
@@ -34592,7 +34592,7 @@ function formatSessionJson({
34592
34592
  `;
34593
34593
  }
34594
34594
  // src/version.ts
34595
- var remyCliVersion = "1.25.0-rc.6";
34595
+ var remyCliVersion = "1.25.0-rc.7";
34596
34596
 
34597
34597
  // src/self-update.ts
34598
34598
  import { spawn } from "child_process";
@@ -40456,6 +40456,7 @@ function createSessionAdmissions() {
40456
40456
  try {
40457
40457
  const result = await send({
40458
40458
  text: attempt.text,
40459
+ mode: attempt.mode,
40459
40460
  attachments: structuredClone(attempt.attachments),
40460
40461
  idempotencyKey: attempt.idempotencyKey,
40461
40462
  ...attempt.agent ? { agent: structuredClone(attempt.agent) } : {}
@@ -43659,6 +43660,7 @@ ${segment.excerpt}`).join(`
43659
43660
  parent: root,
43660
43661
  tag: composerTag,
43661
43662
  topDividerLabel: turnDividerLabel,
43663
+ placeholder: "Message Remy\u2026 Enter sends \xB7 Ctrl+Enter queues",
43662
43664
  onSubmit: () => {
43663
43665
  submitComposer();
43664
43666
  },
@@ -43942,6 +43944,11 @@ ${segment.excerpt}`).join(`
43942
43944
  }
43943
43945
  if (composerPaths.handleKey(key))
43944
43946
  return;
43947
+ if ((key.name === "return" || key.name === "enter") && key.ctrl) {
43948
+ key.preventDefault();
43949
+ submitComposer("next");
43950
+ return;
43951
+ }
43945
43952
  if ((key.name === "up" || key.name === "down") && composerAtVisualEdge(key.name)) {
43946
43953
  key.preventDefault();
43947
43954
  navigatePromptHistory(key.name);
@@ -44020,7 +44027,7 @@ ${segment.excerpt}`).join(`
44020
44027
  });
44021
44028
  };
44022
44029
  }
44023
- async function submitComposer() {
44030
+ async function submitComposer(mode = "steer") {
44024
44031
  if (attachmentPreparationOwner)
44025
44032
  return;
44026
44033
  if (pendingPastedImageWrites > 0) {
@@ -44107,6 +44114,7 @@ ${segment.excerpt}`).join(`
44107
44114
  id: crypto.randomUUID(),
44108
44115
  idempotencyKey: crypto.randomUUID(),
44109
44116
  text: submittedText,
44117
+ mode,
44110
44118
  attachments: [...composerDraft.attachments],
44111
44119
  ...composerDraft.agent ? { agent: composerDraft.agent } : {},
44112
44120
  status: "admitting"
@@ -44227,6 +44235,7 @@ ${segment.excerpt}`).join(`
44227
44235
  id: failed.id,
44228
44236
  idempotencyKey: failed.idempotencyKey,
44229
44237
  text: failed.text,
44238
+ mode: failed.mode,
44230
44239
  attachments: failed.attachments,
44231
44240
  ...failed.agent ? { agent: failed.agent } : {},
44232
44241
  status: "admitting"
@@ -44870,7 +44879,7 @@ function renderSubmittedTimeline({ state, admittedSubmissions }) {
44870
44879
  const attachments = renderAttachmentSummary(submission.attachments);
44871
44880
  const header = new StyledText11([
44872
44881
  renderRoleLabel({ label: "You", role: "human" }),
44873
- dim7(fg12(PALETTE.dimText)(" (CLI)"))
44882
+ dim7(fg12(PALETTE.dimText)(submission.mode === "next" ? " (CLI \xB7 Next)" : " (CLI)"))
44874
44883
  ]);
44875
44884
  return joinStyled([
44876
44885
  header,
@@ -46605,7 +46614,7 @@ async function attachSession({
46605
46614
  sessionId,
46606
46615
  text: followUp.prompt,
46607
46616
  fileIds: [],
46608
- mode: "steer",
46617
+ mode: followUp.mode,
46609
46618
  idempotencyKey: randomUUID6(),
46610
46619
  ...followUp.agent === undefined ? {} : { agent: followUp.agent }
46611
46620
  }
@@ -46761,7 +46770,7 @@ async function runAttachedSession({
46761
46770
  text: submission.text,
46762
46771
  fileIds: submission.attachments.map((attachment) => attachment.fileId),
46763
46772
  idempotencyKey: submission.idempotencyKey,
46764
- mode: "steer",
46773
+ mode: submission.mode,
46765
46774
  ...submission.agent === undefined ? {} : { agent: submission.agent }
46766
46775
  }
46767
46776
  });
@@ -47184,13 +47193,14 @@ Options:
47184
47193
  Attach to an existing remote session. An interactive terminal opens the session view; --no-tui streams output instead.
47185
47194
 
47186
47195
  Arguments:
47187
- prompt Submit a follow-up as Steer before attaching
47196
+ prompt Submit a follow-up before attaching (Steer by default)
47188
47197
 
47189
47198
  With a prompt, JSON output waits for that message's turn result. Use -- before a prompt beginning with --.
47190
47199
  --model and --reasoning-effort require a prompt: the change travels with it and stays the session's setting.
47191
- A running turn switches from its next model request; otherwise the change applies from the turn the prompt starts.
47200
+ With --queue, the message and settings wait for a new turn after current work. Otherwise, a running turn switches from its next model request.
47192
47201
 
47193
47202
  Options:
47203
+ --queue Queue the prompt after current work (requires a prompt)
47194
47204
  --model <name> Switch to another model of the session's harness
47195
47205
  --reasoning-effort <low|medium|high|xhigh> Switch agent reasoning effort
47196
47206
  --no-tui Do not open the interactive terminal view
@@ -47235,7 +47245,7 @@ Usage:
47235
47245
  Commands:
47236
47246
  remy Open interactive dashboard
47237
47247
  remy dashboard Open interactive dashboard
47238
- remy --session <session-id> [--model <name> --reasoning-effort <low|medium|high|xhigh> --no-tui --json] [prompt]
47248
+ remy --session <session-id> [--queue --model <name> --reasoning-effort <low|medium|high|xhigh> --no-tui --json] [prompt]
47239
47249
  Attach to a session, optionally submitting a follow-up
47240
47250
  remy session mcps list <session-id> [--json] Inspect attached MCPs
47241
47251
  remy session mcps add <session-id> <offering-id>
@@ -47281,6 +47291,7 @@ function parseSessionAttach(argv) {
47281
47291
  let prompt;
47282
47292
  let model;
47283
47293
  let reasoningEffort;
47294
+ let queue = false;
47284
47295
  let positionalOnly = false;
47285
47296
  for (let index = 1;index < argv.length; index += 1) {
47286
47297
  const token = argv[index];
@@ -47288,6 +47299,10 @@ function parseSessionAttach(argv) {
47288
47299
  positionalOnly = true;
47289
47300
  continue;
47290
47301
  }
47302
+ if (!positionalOnly && token === "--queue") {
47303
+ queue = true;
47304
+ continue;
47305
+ }
47291
47306
  if (!positionalOnly && token === "--no-tui") {
47292
47307
  noTui = true;
47293
47308
  continue;
@@ -47315,6 +47330,8 @@ function parseSessionAttach(argv) {
47315
47330
  throw new Error("A follow-up prompt must not be empty.");
47316
47331
  prompt = token;
47317
47332
  }
47333
+ if (queue && prompt === undefined)
47334
+ throw new Error("--queue requires a follow-up prompt.");
47318
47335
  const agent = sessionAgentChange({ model, reasoningEffort });
47319
47336
  if (agent && prompt === undefined)
47320
47337
  throw new Error("--model and --reasoning-effort change the session with a follow-up message. Pass a prompt too.");
@@ -47323,7 +47340,7 @@ function parseSessionAttach(argv) {
47323
47340
  sessionId,
47324
47341
  noTui,
47325
47342
  json: json3,
47326
- ...prompt === undefined ? {} : { followUp: { prompt, ...agent ? { agent } : {} } }
47343
+ ...prompt === undefined ? {} : { followUp: { prompt, mode: queue ? "next" : "steer", ...agent ? { agent } : {} } }
47327
47344
  };
47328
47345
  }
47329
47346
  function parseModelFlag(value) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@meistrari/remy-cli",
3
- "version": "1.25.0-rc.6",
3
+ "version": "1.25.0-rc.7",
4
4
  "description": "Remy, the Coding Agent terminal client.",
5
5
  "type": "module",
6
6
  "bin": {