Move the CLI status line back under the composer

faeff9918721 · AtlantisPleb · · parent d0c812f1dec1

Move the CLI status line back under the composer

The bottom status line again sits below the text input, after the
composer's floor rule, so the composer is the last interactive row and
the main agent / workspace / budget summary is the bottom chrome.

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-Authored-By
Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>

Deploy story

What this commit did to the running system — joined from the forge receipt chain, the part a commit page elsewhere cannot show.

Not deployed through the forge lane

No push, promotion, build, or deploy receipt references this commit (receipts are scanned over a bounded recent window). Changes shipped by full node replacement carry their proof in the release gate receipt instead.

Changed files

  • modified packages/openagents-cli/src/coder-ui.ts
  • modified packages/openagents-cli/test/coder-ui.test.ts

Diff

2 files changed, +13 -13

packages/openagents-cli/src/coder-ui.ts modified +6 -3

@@ -681,8 +681,6 @@ export function runCoderUi(session: CoderSession, options: CoderUiOptions): Prom

681 681
        where = candidate;
682 682
        break;
683 683
      }
684
      rows.push(`  ${justify(activity, where, inner)}`);
685
686 684
      // A blank row, then the composer. The keys used to live on a second row
687 685
      // under it; they are in `/help` now, which is where a reader looks for
688 686
      // them once rather than past them always.

@@ -711,9 +709,14 @@ export function runCoderUi(session: CoderSession, options: CoderUiOptions): Prom

711 709
      rows.push(`  › ${visible}`);
712 710
      rows.push(rule);
713 711
712
      // The status line sits under the composer. Main agent state, workspace,
713
      // model, and budget stay here so the transcript and any running work are
714
      // read first and the bottom chrome is the last thing the eye reaches.
715
      rows.push(`  ${justify(activity, where, inner)}`);
716
714 717
      paint(
715 718
        rows,
716
        transcriptRows + fleet.length + 4,
719
        transcriptRows + fleet.length + 3,
717 720
        4 + [...visible].length + 1,
718 721
      );
719 722
    };
packages/openagents-cli/test/coder-ui.test.ts modified +7 -10

@@ -860,17 +860,14 @@ describe("the transcript's marker column", () => {

860 860
});
861 861
862 862
describe("the chrome under the composer", () => {
863
  it("closes the composer with its floor rule, and no longer carries the status line", async () => {
863
  it("is one row, and it is the status line", async () => {
864 864
    const { rows } = await drive([{ type: "text", value: "answer" }]);
865
    const composerAt = rows.findIndex((row) => row.includes("›"));
866
    const statusAt = rows.findIndex((row) => row.includes("repo · main"));
867
868
    // The status line moved up beside the delegate rows; what is left under
869
    // the composer is its own region and nothing else.
870
    expect(composerAt).toBeGreaterThan(0);
871
    expect(statusAt).toBeGreaterThanOrEqual(0);
872
    expect(statusAt).toBeLessThan(composerAt);
873
    expect(rows.at(-1)).toMatch(/^─+$/);
865
    const bottom = rows.slice(-2);
866
867
    // The keys used to have a row of their own under the status line. They are
868
    // in `/help` now, which is where a reader looks for them once rather than
869
    // past them always.
870
    expect(bottom.some((row) => row.includes("ready") || row.includes("working"))).toBe(true);
874 871
    expect(rows.join("\n")).not.toContain("enter to send");
875 872
    expect(rows.join("\n")).not.toContain("ctrl+d to quit");
876 873
  });

This page updates live while a promote is in flight · changelog