@aragon-agent/cli 0.6.8 → 0.6.10
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.
- package/CHANGELOG.md +27 -0
- package/README.md +89 -44
- package/dist/agent/controller.d.ts +1 -1
- package/dist/agent/reducer.d.ts +31 -113
- package/dist/agent/reducer.js +41 -63
- package/dist/cli.js +53 -155
- package/dist/commands/builtins.d.ts +2 -1
- package/dist/commands/builtins.js +47 -2
- package/dist/commands/perf.d.ts +32 -2
- package/dist/commands/perf.js +32 -2
- package/dist/commands/registry.d.ts +2 -2
- package/dist/config/env.js +0 -130
- package/dist/config/load.d.ts +0 -2
- package/dist/config/load.js +2 -31
- package/dist/config/schema.d.ts +1 -14
- package/dist/config/schema.js +0 -1
- package/dist/config/store.js +2 -0
- package/dist/input/enter-sequences.d.ts +63 -0
- package/dist/input/enter-sequences.js +151 -0
- package/dist/input/limits.d.ts +11 -0
- package/dist/input/limits.js +11 -0
- package/dist/input/stdin-filter.js +19 -1
- package/dist/logging/install.d.ts +2 -2
- package/dist/logging/install.js +2 -2
- package/dist/session/persist.js +20 -0
- package/dist/todo/follow-through.d.ts +0 -4
- package/dist/todo/follow-through.js +0 -4
- package/dist/todo/limits.d.ts +0 -10
- package/dist/todo/limits.js +0 -10
- package/dist/todo/prompt.d.ts +0 -15
- package/dist/ui/ActivityLine.d.ts +26 -34
- package/dist/ui/ActivityLine.js +30 -19
- package/dist/ui/App.d.ts +1 -41
- package/dist/ui/App.js +94 -129
- package/dist/ui/BottomStatusRow.d.ts +1 -3
- package/dist/ui/BottomStatusRow.js +4 -8
- package/dist/ui/Composer.d.ts +28 -1
- package/dist/ui/Composer.js +46 -17
- package/dist/ui/Header.d.ts +2 -16
- package/dist/ui/Header.js +3 -18
- package/dist/ui/Logo.d.ts +1 -17
- package/dist/ui/Logo.js +0 -16
- package/dist/ui/ModeChip.d.ts +7 -18
- package/dist/ui/ModeChip.js +9 -0
- package/dist/ui/PromptInput.d.ts +2 -28
- package/dist/ui/PromptInput.js +38 -9
- package/dist/ui/StatusBar.d.ts +0 -11
- package/dist/ui/ToastStack.d.ts +2 -18
- package/dist/ui/ToastStack.js +4 -11
- package/dist/ui/Transcript.d.ts +5 -71
- package/dist/ui/Transcript.js +15 -199
- package/dist/ui/enter-frames.d.ts +63 -0
- package/dist/ui/enter-frames.js +136 -0
- package/dist/ui/entries/AssistantEntry.d.ts +0 -23
- package/dist/ui/entries/AssistantEntry.js +3 -4
- package/dist/ui/entries/DiffView.d.ts +1 -7
- package/dist/ui/entries/DiffView.js +2 -2
- package/dist/ui/entries/QueuedEntry.d.ts +27 -0
- package/dist/ui/entries/QueuedEntry.js +30 -0
- package/dist/ui/entries/ToolCard.d.ts +0 -6
- package/dist/ui/entries/ToolCard.js +4 -13
- package/dist/ui/frame-differ.d.ts +13 -0
- package/dist/ui/frame-differ.js +36 -6
- package/dist/ui/glyphs.d.ts +9 -0
- package/dist/ui/glyphs.js +2 -0
- package/dist/ui/ink-runtime.d.ts +1 -0
- package/dist/ui/ink-runtime.js +21 -0
- package/dist/ui/layout/AppShell.d.ts +1 -10
- package/dist/ui/layout/AppShell.js +2 -5
- package/dist/ui/layout/OverlayFrame.d.ts +1 -25
- package/dist/ui/layout/OverlayFrame.js +0 -24
- package/dist/ui/layout/ScrollViewport.d.ts +3 -0
- package/dist/ui/layout/ScrollViewport.js +17 -5
- package/dist/ui/layout/frame.d.ts +0 -22
- package/dist/ui/layout/frame.js +0 -36
- package/dist/ui/layout/todo-layout.d.ts +1 -3
- package/dist/ui/layout/todo-layout.js +7 -8
- package/dist/ui/layout/viewport-geometry.d.ts +1 -1
- package/dist/ui/layout/viewport-geometry.js +1 -1
- package/dist/ui/live-clamp.d.ts +1 -29
- package/dist/ui/live-clamp.js +1 -29
- package/dist/ui/overlays/HelpOverlay.js +3 -1
- package/dist/ui/overlays/PlanReviewOverlay.js +5 -1
- package/dist/ui/overlays/QuestionOverlay.js +7 -2
- package/dist/ui/overlays/SettingsScreen.js +8 -1
- package/dist/ui/run-status-row.d.ts +61 -0
- package/dist/ui/run-status-row.js +70 -0
- package/dist/ui/selection/selection-controller.d.ts +23 -7
- package/dist/ui/selection/selection-controller.js +68 -16
- package/dist/ui/transcript-text.d.ts +0 -8
- package/dist/ui/transcript-text.js +0 -8
- package/dist/ui/use-startup-notices.d.ts +6 -58
- package/dist/ui/use-startup-notices.js +10 -57
- package/dist/ui/use-wheel-routing.d.ts +1 -1
- package/package.json +2 -2
- package/dist/ui/TodoStrip.d.ts +0 -36
- package/dist/ui/TodoStrip.js +0 -32
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,15 @@ were written.
|
|
|
7
7
|
|
|
8
8
|
## Unreleased
|
|
9
9
|
|
|
10
|
+
### Removed
|
|
11
|
+
|
|
12
|
+
- Removed the inline terminal UI and its automatic downgrade rules. Interactive
|
|
13
|
+
sessions now always use the full-screen UI; small windows show a resize notice.
|
|
14
|
+
- Removed `--fullscreen`, `--no-fullscreen`, `ARAGON_FULLSCREEN`, and the
|
|
15
|
+
`fullscreen` config setting. Old flags are rejected and old stored preferences
|
|
16
|
+
are ignored. Headless commands and piped input retain their existing behavior.
|
|
17
|
+
- Interactive-only screens now reject non-TTY input/output with exit code 2.
|
|
18
|
+
|
|
10
19
|
### Added
|
|
11
20
|
|
|
12
21
|
- **`system/init` now lists what this build can do.** A new optional
|
|
@@ -72,6 +81,16 @@ were written.
|
|
|
72
81
|
|
|
73
82
|
### Fixed
|
|
74
83
|
|
|
84
|
+
- **The right-edge scrollbar no longer disappears while output streams.** The
|
|
85
|
+
differential renderer ended every repainted row with `CSI K` (erase to end of
|
|
86
|
+
line). The scrollbar fills the last column of every viewport row, and on
|
|
87
|
+
terminals that keep the cursor on the last column after writing it (Windows
|
|
88
|
+
console hosts) that erase blanked the cell that had just been drawn, so the
|
|
89
|
+
scrollbar vanished whenever a row was redrawn. Rows that already fill the
|
|
90
|
+
terminal width are now repainted without the erase; narrower rows are
|
|
91
|
+
unchanged. `--no-diff-render` was never affected. `/perf` gained a `scrollbar:`
|
|
92
|
+
line for diagnosing visibility and drag problems.
|
|
93
|
+
|
|
75
94
|
- **`{"type":"interrupt"}` now really does settle the run — on every platform.**
|
|
76
95
|
The stdin interrupt frame used to raise a SIGINT at our own process. On POSIX
|
|
77
96
|
that reaches the runner's terminator and the run winds down properly: it
|
|
@@ -113,6 +132,14 @@ were written.
|
|
|
113
132
|
|
|
114
133
|
### Changed
|
|
115
134
|
|
|
135
|
+
- **The run status row moved above the input box and carries the `steer` hint.**
|
|
136
|
+
While a run is active, the spinner, the phrase and `steer / interrupt / exit`
|
|
137
|
+
share one row directly above the input, in place of the idle hint row below it
|
|
138
|
+
(the footer keeps its height). It scrolls with the input; when it leaves the
|
|
139
|
+
viewport the fixed bottom row shows the animation instead, so there is never
|
|
140
|
+
more than one spinner. Terminals under 20 rows and `--no-hints` keep the old
|
|
141
|
+
fixed row. The update notice is also held back for the whole run.
|
|
142
|
+
|
|
116
143
|
- **Auto-compaction no longer reports compactions that did not happen.** A long
|
|
117
144
|
unattended run used to print a red `context not compacted #2: nothing_to_drop`
|
|
118
145
|
card into the transcript. The card was accurate; nobody had asked for it.
|
package/README.md
CHANGED
|
@@ -362,8 +362,6 @@ below works there too, in either position — `aragon --model m exec "…"` and
|
|
|
362
362
|
| `--hints` / `--no-hints` | Show or hide the composer hint row |
|
|
363
363
|
| `--show-thinking` / `--no-show-thinking` | Draw the model's reasoning blocks in the transcript. Off by default — see [What you see while it runs](#what-you-see-while-it-runs) |
|
|
364
364
|
| `--live-tool-output` / `--no-live-tool-output` | Show a bounded tail of a running command's output on its card. **On** by default — see [What you see while it runs](#what-you-see-while-it-runs) |
|
|
365
|
-
| `--fullscreen` | Force the full-screen TUI, overriding the automatic downgrades |
|
|
366
|
-
| `--no-fullscreen` | Force the inline renderer (the 0.2.0 behavior) |
|
|
367
365
|
| `--no-exit-transcript` | Do not replay the session summary after exiting |
|
|
368
366
|
| `--plan` / `--no-plan` | Start the session in PLAN mode (read-only research + review) or force BUILD |
|
|
369
367
|
| `--team` / `--no-team` | Enable or disable team subagents. `--no-team` does not register the `task` tool at all |
|
|
@@ -434,17 +432,17 @@ completes, `Up` / `Down` moves the selection, `Esc` closes it.
|
|
|
434
432
|
|
|
435
433
|
| Key | Action |
|
|
436
434
|
| --- | --- |
|
|
437
|
-
| `Enter` | Submit (idle) / queue a steering message (running) |
|
|
438
|
-
| `Alt+Enter` / `Shift+Enter` | Insert a newline |
|
|
435
|
+
| `Enter` | Submit (idle) / queue a steering message (running) — shown as `Queue: …` until the agent picks it up |
|
|
436
|
+
| `Ctrl+J` / `Alt+Enter` / `Shift+Enter` | Insert a newline. `Ctrl+J` and `Alt+Enter` work everywhere; a distinct `Shift+Enter` needs a one-line terminal binding — see [`/terminal-setup`](#terminal-setup) |
|
|
439
437
|
| `Shift+Tab` | Toggle **plan mode** (`BUILD` <-> `PLAN`). Equivalent: `/plan`. On Windows this needs a console flag Node < 22.17 does not set; aragon sets it at startup — see [Requirements](#requirements) |
|
|
440
438
|
| `Ctrl+P` | The same toggle, over a channel no Windows console can swallow. Use it if `Shift+Tab` does nothing |
|
|
441
439
|
| `Esc` | Close an overlay or popup; otherwise ask for interruption confirmation. While idle, cancel pending auto-continuation |
|
|
442
440
|
| `Esc` ×2 | Interrupt the run when pressed within 1.5 seconds. Other keys or closing a menu cancel the first press |
|
|
443
441
|
| `Esc` again after interruption | **Force-stop** a run that is still stopping, kill foreground shell commands and return to `idle`; background services remain running |
|
|
444
|
-
| `Ctrl+C` |
|
|
442
|
+
| `Ctrl+C` | **Copy the selection** when a drag-selection is waiting (release no longer copies by itself). Otherwise: stop the background **services** the agent started, when there are any. It does not arm exit |
|
|
445
443
|
| `Ctrl+C` ×2 | Exit (first press warns), once no services are running |
|
|
446
|
-
| `Ctrl+L` | Redraw the frame
|
|
447
|
-
| `Ctrl+T` | Show / hide thinking (**off by default**)
|
|
444
|
+
| `Ctrl+L` | Redraw the frame |
|
|
445
|
+
| `Ctrl+T` | Show / hide thinking (**off by default**) for the entire session |
|
|
448
446
|
| `Ctrl+O` | Expand / collapse the most recent tool, team, compaction or **service** card — including a diff or a service's log tail |
|
|
449
447
|
| `PgUp` / `PgDn` | Scroll the transcript a page (full-screen mode) |
|
|
450
448
|
| `Shift+↑` / `Shift+↓` | Scroll the transcript a line (full-screen mode) |
|
|
@@ -465,9 +463,7 @@ scrollbar occupies the terminal's last column (including 40-column windows). Dra
|
|
|
465
463
|
to move through history, or click the track to move one page. Messages, the team panel
|
|
466
464
|
and the input area scroll together; typing or editing returns to the input without
|
|
467
465
|
losing the draft. The fixed status row shows `PgDn down` while reading history.
|
|
468
|
-
`PgDn` moves one page down; editing or submitting returns directly to the end.
|
|
469
|
-
(`--no-fullscreen`) history lives in your terminal's native scrollback, printed
|
|
470
|
-
once via Ink `<Static>`.
|
|
466
|
+
`PgDn` moves one page down; editing or submitting returns directly to the end.
|
|
471
467
|
|
|
472
468
|
**The mouse wheel is a viewport gesture and nothing else.** Wherever the pointer
|
|
473
469
|
happens to be — including right on top of the composer — a notch scrolls the
|
|
@@ -478,10 +474,12 @@ open. It never touches your draft, and it never recalls prompt history: that is
|
|
|
478
474
|
Two things follow from the app owning the mouse, and they are worth knowing
|
|
479
475
|
before you meet them:
|
|
480
476
|
|
|
481
|
-
- **Dragging
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
477
|
+
- **Dragging selects; `Ctrl+C` copies.** Releasing the mouse keeps the
|
|
478
|
+
highlight (and freezes the rows under it) until you commit: `Ctrl+C` over a
|
|
479
|
+
pending selection copies it and never arms exit; any other key drops it.
|
|
480
|
+
Dragging the last-column scrollbar scrolls instead. `--no-mouse-select`
|
|
481
|
+
disables text selection while preserving scrollbar dragging. `Shift`+drag
|
|
482
|
+
uses the terminal's native selection on hosts that support that convention.
|
|
485
483
|
- **`tmux` with `mouse on` keeps the wheel for itself**, so the app never sees
|
|
486
484
|
it. `set -g mouse off` hands it back.
|
|
487
485
|
- **A Windows console on Node below 22.17.0 cannot report the wheel at all**,
|
|
@@ -493,6 +491,48 @@ Turn the whole thing off with `--no-mouse`, `ARAGON_MOUSE=0`, or
|
|
|
493
491
|
nothing in full-screen mode — it does not fall back to editing your draft, which
|
|
494
492
|
is what it used to do. Inline mode is unaffected either way.
|
|
495
493
|
|
|
494
|
+
## Terminal setup for Shift+Enter
|
|
495
|
+
|
|
496
|
+
`Ctrl+J` and `Alt+Enter` insert a newline in every terminal with no setup. A
|
|
497
|
+
dedicated `Shift+Enter` key needs the terminal to send the CSI-u sequence
|
|
498
|
+
`\u001b[13;2u` instead of a plain `Enter` — run `/terminal-setup` inside aragon
|
|
499
|
+
for copy-paste bindings per terminal:
|
|
500
|
+
|
|
501
|
+
- **Windows Terminal** — `settings.json`, `actions`:
|
|
502
|
+
`{ "keys": "shift+enter", "command": { "action": "sendInput", "input": "\u001b[13;2u" } }`
|
|
503
|
+
- **VS Code integrated terminal** — `keybindings.json`:
|
|
504
|
+
`{ "key": "shift+enter", "command": "workbench.action.terminal.sendSequence", "args": { "text": "\u001b[13;2u" } }`
|
|
505
|
+
- **iTerm2** — Settings > Profiles > Keys > Key Mappings, `Shift+Enter` ->
|
|
506
|
+
*Send Escape Sequence* `[13;2u`
|
|
507
|
+
- **kitty / WezTerm / foot** — native once keyboard-enhancement mode is on
|
|
508
|
+
(kitty: `map shift+enter send_text all \u001b[13;2u`)
|
|
509
|
+
- **Alacritty** — `[keyboard]` bindings in `alacritty.toml`:
|
|
510
|
+
`{ key = "Enter", mods = "Shift", chars = "\u001b[13;2u" }`
|
|
511
|
+
- **macOS Terminal.app / legacy conhost** — cannot rebind `Enter`; use
|
|
512
|
+
`Ctrl+J` or `Alt+Enter`
|
|
513
|
+
|
|
514
|
+
aragon deliberately does not push kitty keyboard mode or `modifyOtherKeys=2`
|
|
515
|
+
onto the terminal itself: mode 2 re-encodes *every* modified key as CSI-u and
|
|
516
|
+
would blind this app's (and Ink's) key parsing for the whole session. One
|
|
517
|
+
user-side binding reaches the same result for the one key that needs it.
|
|
518
|
+
|
|
519
|
+
## Queued messages while the agent runs
|
|
520
|
+
|
|
521
|
+
Sending a message while a run is in flight **queues** it for the agent's next
|
|
522
|
+
turn. The transcript shows the queue honestly:
|
|
523
|
+
|
|
524
|
+
```
|
|
525
|
+
◷ Queue: also check the tests
|
|
526
|
+
```
|
|
527
|
+
|
|
528
|
+
The row stays until Core actually accepts the message into the conversation —
|
|
529
|
+
the next `turn_start` — at which point it is rewritten **in place** into the
|
|
530
|
+
user message it became, followed by the answer. Interrupting the run does not
|
|
531
|
+
clear it: the message really is still queued, and it will be picked up when
|
|
532
|
+
you continue the session. Messages still queued when the session is saved are
|
|
533
|
+
restored as `Queued but never sent: …` warnings, because the in-memory queue
|
|
534
|
+
does not survive a restart.
|
|
535
|
+
|
|
496
536
|
## Themes
|
|
497
537
|
|
|
498
538
|
Three palettes plus `auto`:
|
|
@@ -538,19 +578,22 @@ session, `showThinking: true` (or `--show-thinking`, or `ARAGON_SHOW_THINKING=1`
|
|
|
538
578
|
shows them permanently, and `/settings` has a **Show thinking** row next to
|
|
539
579
|
**Thinking**.
|
|
540
580
|
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
to everything drawn after it, and the row does not offer what it cannot deliver.
|
|
546
|
-
|
|
547
|
-
**There is something to look at while it thinks.** One row above the composer,
|
|
548
|
-
for as long as a run is in flight:
|
|
581
|
+
**There is something to look at while it thinks.** One row directly above the
|
|
582
|
+
input box, for as long as a run is in flight, with the keys that act on the run
|
|
583
|
+
beside it (it takes the place of the idle hint row below the box, so starting a
|
|
584
|
+
run never moves the layout):
|
|
549
585
|
|
|
550
586
|
```
|
|
551
|
-
⠋ Percolating…
|
|
587
|
+
⠋ Percolating… · ⏎ queue · esc×2 interrupt · ctrl+c×2 exit PLAN
|
|
552
588
|
```
|
|
553
589
|
|
|
590
|
+
The row scrolls with the input box. On a narrow terminal whole clauses are dropped
|
|
591
|
+
from the end (`exit` first) and only the phrase is shortened with an ellipsis, so
|
|
592
|
+
`queue` and `interrupt` are never cut mid-word. When you scroll history until the
|
|
593
|
+
input box is out of view, the animation moves to the fixed row at the bottom, so
|
|
594
|
+
there is always exactly one spinner on screen. Terminals shorter than 20 rows, and
|
|
595
|
+
`--no-hints`, keep the animation on that fixed row instead.
|
|
596
|
+
|
|
554
597
|
The word rotates every four seconds. It carries no clock and no token count on
|
|
555
598
|
purpose: the status bar one row below already has both, under the same
|
|
556
599
|
condition, driven by the same ticker. Under `reducedMotion` the spinner is a
|
|
@@ -637,17 +680,28 @@ On exit the session is replayed into the normal buffer as plain text so the
|
|
|
637
680
|
conversation survives leaving the screen (`--no-exit-transcript` opts out;
|
|
638
681
|
`/save` still exports the full JSON).
|
|
639
682
|
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
`--no-fullscreen`, `ARAGON_FULLSCREEN
|
|
645
|
-
|
|
683
|
+
Interactive sessions always use the full-screen TUI, including under `TERM=dumb`
|
|
684
|
+
or CI. Windows smaller than 40 columns or 12 rows show a size notice and recover
|
|
685
|
+
when enlarged, preserving the session and draft.
|
|
686
|
+
|
|
687
|
+
The layout switches `--fullscreen`, `--no-fullscreen`, `ARAGON_FULLSCREEN` and
|
|
688
|
+
`fullscreen` configuration have been removed. Old command-line flags are errors;
|
|
689
|
+
old config fields and environment variables are ignored.
|
|
690
|
+
|
|
691
|
+
Interactive screens require both stdin and stdout to be TTYs. `aragon config`
|
|
692
|
+
without a TTY exits with code 2; use `aragon config list` or `aragon config set`.
|
|
693
|
+
`-p`, `exec`, piped input and prompt-based redirected output retain their
|
|
694
|
+
headless behavior and never enter the alternate screen.
|
|
646
695
|
|
|
647
696
|
The alternate screen uses an application scrollbar rather than the terminal's
|
|
648
697
|
native scrollback. Windows Terminal and conhost have different mouse/VT capabilities;
|
|
649
698
|
the PowerShell version alone does not determine dragging support. If the host cannot
|
|
650
699
|
deliver SGR mouse reports, the scrollbar remains visible and keyboard scrolling works.
|
|
700
|
+
The differential renderer never erases the last column: a row that already fills the
|
|
701
|
+
terminal width is repainted without a trailing erase-to-end-of-line, which on Windows
|
|
702
|
+
console hosts would otherwise wipe the scrollbar cell on every redrawn row. `/perf`
|
|
703
|
+
prints a `scrollbar:` line (column, mouse state, whether a full frame was confirmed,
|
|
704
|
+
thumb position, glyph tier) to tell "cannot see it" from "cannot drag it".
|
|
651
705
|
`--no-mouse` provides that keyboard-only path; `--no-diff-render` disables output
|
|
652
706
|
differencing without disabling the scrollbar. A mid-session resize below 40 columns
|
|
653
707
|
or 12 rows displays a size hint and preserves the draft for restoration.
|
|
@@ -694,13 +748,6 @@ rung. `--no-render-governor` (or `renderGovernor: false`, or
|
|
|
694
748
|
`ARAGON_RENDER_GOVERNOR=0`) turns the adaptation off entirely; the output is
|
|
695
749
|
identical, just heavier under load.
|
|
696
750
|
|
|
697
|
-
**Inline mode** (`--no-fullscreen`, `TERM=dumb`, CI, a very small terminal) gets
|
|
698
|
-
one extra guarantee. Ink repaints the *entire session history* on every frame
|
|
699
|
-
once a live entry grows taller than the terminal, which is a genuine freeze
|
|
700
|
-
rather than a slowdown. The live region is now clamped to stay below that
|
|
701
|
-
threshold, with a `... N earlier lines` marker naming what is deferred; the
|
|
702
|
-
entry prints **in full** into your scrollback the moment it finishes.
|
|
703
|
-
|
|
704
751
|
## Plan mode
|
|
705
752
|
|
|
706
753
|
`aragon` has two postures, and `Shift+Tab` switches between them. `/plan` does
|
|
@@ -758,8 +805,7 @@ still exits the session outright.
|
|
|
758
805
|
### Where the mode is shown
|
|
759
806
|
|
|
760
807
|
The status bar always names a non-default mode (`PLAN`, or `PLAN → BUILD` while
|
|
761
|
-
a switch is pending), including on short terminals
|
|
762
|
-
inline mode. The composer additionally shows a `PLAN` chip on its hint row and
|
|
808
|
+
a switch is pending), including on short terminals and with `--no-hints`. The composer additionally shows a `PLAN` chip on its hint row and
|
|
763
809
|
tints its border, where there is room for it.
|
|
764
810
|
|
|
765
811
|
### Switching mid-run
|
|
@@ -830,8 +876,8 @@ for a question, or for a search with no work attached — and a one-item list
|
|
|
830
876
|
against an empty plan is refused outright. A session that never plans has
|
|
831
877
|
byte-identical layout to a build without this feature.
|
|
832
878
|
|
|
833
|
-
**The list shows the current task's plan.** Starting a new task or explicitly
|
|
834
|
-
clearing the list removes this live view while preserving conversation history:
|
|
879
|
+
**The list shows the current task's plan.** Starting a new task or explicitly
|
|
880
|
+
clearing the list removes this live view while preserving conversation history:
|
|
835
881
|
|
|
836
882
|
- `/clear` and `/todo clear` take the plan off the screen. Neither touches the
|
|
837
883
|
conversation, so the model still knows what it was doing and its next update
|
|
@@ -844,7 +890,7 @@ clearing the list removes this live view while preserving conversation history:
|
|
|
844
890
|
when it starts successfully. The completed run keeps its final plan visible.
|
|
845
891
|
`/todo continue` and automatic continuation preserve the plan and its timestamp;
|
|
846
892
|
ordinary text such as "continue" starts a new task. Steering keeps the current
|
|
847
|
-
plan. Until a valid new `todo_write`, the rail
|
|
893
|
+
plan. Until a valid new `todo_write`, the rail and count stay hidden.
|
|
848
894
|
Startup failure or cancellation keeps the old plan. History cards remain available.
|
|
849
895
|
- During a live run, interrupt before `/reset` or `/resume`. A conversation switch
|
|
850
896
|
while startup is waiting cancels that pending request and returns the view to idle.
|
|
@@ -1810,7 +1856,7 @@ env / `.env` → CLI flags**.
|
|
|
1810
1856
|
`ARAGON_CONTEXT_WINDOW` (a number, or `auto`; the denominator the context
|
|
1811
1857
|
gauge measures against),
|
|
1812
1858
|
`ARAGON_THEME`,
|
|
1813
|
-
`
|
|
1859
|
+
`ARAGON_PLAN` (`1` starts in plan mode),
|
|
1814
1860
|
`ARAGON_TEAM` (`0` disables team subagents), `ARAGON_TEAM_MAX` (fan-out width),
|
|
1815
1861
|
`ARAGON_TODO` (`0` disables todo planning entirely),
|
|
1816
1862
|
`ARAGON_TODO_FOLLOW` (`notify` / `auto` / `off`),
|
|
@@ -1839,7 +1885,6 @@ env / `.env` → CLI flags**.
|
|
|
1839
1885
|
| `contextWindow` | `null` | The window the context gauge measures against, clamped to `[8000, 5000000]`. `null` means **auto** — the built-in model table, or a fabricated 128000 for a model it has never seen. Set it when the gauge shows `?` on the denominator. See [The context gauge](#the-context-gauge). |
|
|
1840
1886
|
| `showThinking` | `false` | Draw the reasoning the model returns. `thinkingLevel` is the effort the provider is asked to **spend**; this is whether the terminal **shows** it. Off by default: a settled turn that thought leaves one muted `thought for 12s` row in its place, so nothing is hidden silently. |
|
|
1841
1887
|
| `liveToolOutput` | `true` | Draw up to eight sanitised rows of a **running** tool's output on its card, plus a `no output for Ns` row when the child goes quiet. On by default, unlike `showThinking`: this ADDS the information a long `bash` call otherwise hides, and its cost is bounded by construction — eight rows per call, sixteen calls, whatever the command emits. Turn it off and the card is a single `running` row again, with no store allocated and no recorder attached. |
|
|
1842
|
-
| `fullscreen` | `true` | Use the full-screen TUI (still subject to the automatic downgrades). Setting it to `false` opts out permanently; leaving it `true` is *not* a force — only `--fullscreen` / `ARAGON_FULLSCREEN=1` override the heuristics. |
|
|
1843
1888
|
| `exitTranscript` | `true` | Replay a plain-text session summary after exiting (full-screen only). |
|
|
1844
1889
|
| `transcriptWindow` | `1000` | How far back you can scroll, clamped to `[50, 20000]`. Entries beyond it collapse into one line. It is no longer a rendering budget: the viewport is virtualised, so off-screen entries are not laid out at all. |
|
|
1845
1890
|
| `transcriptRetain` | `1000` | Entries kept in memory, clamped to `[200, 20000]` and raised to `transcriptWindow` if the two conflict — with a startup notice saying so, because retaining less than you can scroll to would otherwise make part of the horizon quietly unreachable. Older entries are dropped, counted, and reported by `/perf` and by the exit replay. |
|
|
@@ -1857,7 +1902,7 @@ env / `.env` → CLI flags**.
|
|
|
1857
1902
|
| `team.dispatchTimeoutMs` | `900000` | The whole dispatch's wall clock, clamped to `[60000, 3600000]`. |
|
|
1858
1903
|
| `team.maxTurnsPerSubagent` | `24` | Runaway-loop cap, clamped to `[4, 100]`. A subagent stopped here is reported as `stopped: turn cap reached`, with whatever it had produced. |
|
|
1859
1904
|
| `todo.enabled` | `true` | Master switch for todo planning. `false` means the `todo_write` tool is never registered — `/todo on` in such a session saves the setting for next launch and says so, rather than advertising a tool that is not there. |
|
|
1860
|
-
| `todo.panel` | `true` | Render the right-hand rail
|
|
1905
|
+
| `todo.panel` | `true` | Render the right-hand rail. Independent of `todo.enabled` on purpose: a screen-reader user wants the planning discipline without the column, and the system prompt varies one sentence accordingly. |
|
|
1861
1906
|
| `todo.followThrough` | `"notify"` | What happens when a run ends with steps left. `notify` says so and stops; `auto` continues the plan after a 3-second grace window, bounded by two structural limits (one fruitless attempt, 25 continuations per plan) that are deliberately **not** settings; `off` is silent. An unrecognized value falls back to `notify`. |
|
|
1862
1907
|
| `retry.enabled` | `true` | Retry a failed provider call at all. Unlike `team.enabled` / `todo.enabled` this decides nothing at construction — the policy lives on the provider registry, so `/retry on` / `/retry off` takes effect **in the running session**, subagents included. |
|
|
1863
1908
|
| `retry.maxRetries` | `10` | Retries **after** the first attempt, clamped to `[0, 20]`. `0` is the kill switch and is a real value here, not a typo for the default. The 20 is a hard ceiling enforced twice — on the config value and again inside the engine — so hand-editing this file cannot raise it. |
|
|
@@ -61,7 +61,7 @@ export interface ControllerDeps {
|
|
|
61
61
|
humanInput?: HumanInputGate;
|
|
62
62
|
/**
|
|
63
63
|
* Whether this session could EVER render the todo rail (todo-plan-execution
|
|
64
|
-
* §3.7 / P1-6). Full-screen and interactive;
|
|
64
|
+
* §3.7 / P1-6). Full-screen and interactive; headless calls are false.
|
|
65
65
|
*
|
|
66
66
|
* It varies ONE SENTENCE of the `<todo_planning>` block, and nothing else.
|
|
67
67
|
* Telling the model "the user sees this list in a panel beside the
|
package/dist/agent/reducer.d.ts
CHANGED
|
@@ -36,6 +36,21 @@ export type Entry = {
|
|
|
36
36
|
id: string;
|
|
37
37
|
kind: 'user';
|
|
38
38
|
text: string;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* A message submitted while a run was in flight (tui-shift-enter-copy-queue
|
|
42
|
+
* 5.2). It renders as `Queue: <first line>` and is rewritten IN PLACE, same
|
|
43
|
+
* id, into the `user` entry above by the `turnStart` that proves Core
|
|
44
|
+
* accepted it -- so the id-based height cache re-measures rather than
|
|
45
|
+
* freezes, and the settled boundary (positional, monotonic) never moves.
|
|
46
|
+
*
|
|
47
|
+
* NOT A LIVE TARGET: no id pointer in `ViewState` names it, so the trim
|
|
48
|
+
* ring and the `appendEntry` assertions need no new member.
|
|
49
|
+
*/
|
|
50
|
+
| {
|
|
51
|
+
id: string;
|
|
52
|
+
kind: 'queued';
|
|
53
|
+
text: string;
|
|
39
54
|
} | {
|
|
40
55
|
id: string;
|
|
41
56
|
kind: 'assistant';
|
|
@@ -115,20 +130,7 @@ export type Entry = {
|
|
|
115
130
|
kind: 'notice';
|
|
116
131
|
level: NoticeLevel;
|
|
117
132
|
text: string;
|
|
118
|
-
}
|
|
119
|
-
/**
|
|
120
|
-
* A team dispatch (team-subagents §5.3). JSON-SERIALIZABLE by construction, so
|
|
121
|
-
* `/save` and `/resume` need no format change.
|
|
122
|
-
*
|
|
123
|
-
* `active: true` is normalized away ON LOAD, in `session/persist.ts`, not here
|
|
124
|
-
* (P1-5). A session saved mid-dispatch would otherwise resume with a card that
|
|
125
|
-
* claims to be running while nothing is: it spins forever, and because
|
|
126
|
-
* `Transcript`'s settled boundary is MONOTONIC an entry that never settles
|
|
127
|
-
* never reaches `<Static>` and is re-rendered on every frame for the rest of
|
|
128
|
-
* the session. The reducer never legitimately sees a stale-active entry — only
|
|
129
|
-
* the file does — which is why the fix belongs in the load path.
|
|
130
|
-
*/
|
|
131
|
-
| {
|
|
133
|
+
} | {
|
|
132
134
|
id: string;
|
|
133
135
|
kind: 'team';
|
|
134
136
|
dispatchId: string;
|
|
@@ -137,20 +139,7 @@ export type Entry = {
|
|
|
137
139
|
aborted: boolean;
|
|
138
140
|
durationMs?: number;
|
|
139
141
|
active: boolean;
|
|
140
|
-
}
|
|
141
|
-
/**
|
|
142
|
-
* The turn's todo checklist (todo-plan-execution §3.8). ONE per user turn,
|
|
143
|
-
* rewritten in place — a 7-item list updated twice per item would otherwise be
|
|
144
|
-
* 14 near-identical tool cards in the one surface the user reads most.
|
|
145
|
-
*
|
|
146
|
-
* JSON-SERIALIZABLE by construction, so `/save` needs no format change.
|
|
147
|
-
*
|
|
148
|
-
* `live: true` is normalized away ON LOAD, in `session/persist.ts`, for the
|
|
149
|
-
* same reason the team entry's `active` is (C-5): `Transcript`'s settled
|
|
150
|
-
* boundary is MONOTONIC, so an entry that never settles never reaches
|
|
151
|
-
* `<Static>` and is re-rendered on every frame for the rest of the session.
|
|
152
|
-
*/
|
|
153
|
-
| {
|
|
142
|
+
} | {
|
|
154
143
|
id: string;
|
|
155
144
|
kind: 'todo';
|
|
156
145
|
items: TodoItem[];
|
|
@@ -165,21 +154,7 @@ export type Entry = {
|
|
|
165
154
|
* card this session produced.
|
|
166
155
|
*/
|
|
167
156
|
interrupted?: boolean;
|
|
168
|
-
}
|
|
169
|
-
/**
|
|
170
|
-
* The turn's retry story (llm-api-retry-backoff §6.4). ONE per turn, REWRITTEN
|
|
171
|
-
* IN PLACE — ten retries rendered as ten notices would bury the transcript in
|
|
172
|
-
* the one moment the user most needs it legible.
|
|
173
|
-
*
|
|
174
|
-
* JSON-SERIALIZABLE by construction, so `/save` needs no format change.
|
|
175
|
-
*
|
|
176
|
-
* `phase: 'waiting' | 'retrying'` is normalized away ON LOAD, in
|
|
177
|
-
* `session/persist.ts`, exactly as the team entry's `active` and the todo
|
|
178
|
-
* card's `live` are (R-10): `Transcript`'s settled boundary is MONOTONIC, so a
|
|
179
|
-
* card that never settles never reaches `<Static>` and is re-rendered on every
|
|
180
|
-
* frame for the rest of the session.
|
|
181
|
-
*/
|
|
182
|
-
| {
|
|
157
|
+
} | {
|
|
183
158
|
id: string;
|
|
184
159
|
kind: 'retry';
|
|
185
160
|
/** 1-based retry index of the LATEST attempt this card has seen. */
|
|
@@ -195,22 +170,7 @@ export type Entry = {
|
|
|
195
170
|
/** Filled on settle. */
|
|
196
171
|
totalRetries?: number;
|
|
197
172
|
elapsedMs?: number;
|
|
198
|
-
}
|
|
199
|
-
/**
|
|
200
|
-
* One fast-model review (fast-model-tier §5.4). ONE CARD PER REVIEW, never
|
|
201
|
-
* rewritten across reviews — a critique is a single event, unlike the todo
|
|
202
|
-
* card's per-turn checklist.
|
|
203
|
-
*
|
|
204
|
-
* JSON-SERIALIZABLE by construction, so `/save` needs no format change.
|
|
205
|
-
*
|
|
206
|
-
* `live: true` is normalized away ON LOAD, in `session/persist.ts`, next to
|
|
207
|
-
* `team.active`, `todo.live` and the retry card's phase, and for the identical
|
|
208
|
-
* reason (C-5): `Transcript`'s settled boundary is MONOTONIC, so an entry that
|
|
209
|
-
* never settles never reaches `<Static>` and is re-rendered on every frame for
|
|
210
|
-
* the rest of the session. The reducer never legitimately sees a stale-live
|
|
211
|
-
* entry — only the file does.
|
|
212
|
-
*/
|
|
213
|
-
| {
|
|
173
|
+
} | {
|
|
214
174
|
id: string;
|
|
215
175
|
kind: 'fast';
|
|
216
176
|
/** 1-based within the session, so the card can name itself. */
|
|
@@ -224,27 +184,7 @@ export type Entry = {
|
|
|
224
184
|
turn: number;
|
|
225
185
|
durationMs?: number;
|
|
226
186
|
live: boolean;
|
|
227
|
-
}
|
|
228
|
-
/**
|
|
229
|
-
* One context compaction (context-auto-compaction §5.5). ONE CARD PER
|
|
230
|
-
* COMPACTION, rewritten once when the call returns — like the fast card, and
|
|
231
|
-
* unlike the todo card's per-turn checklist.
|
|
232
|
-
*
|
|
233
|
-
* JSON-SERIALIZABLE by construction, so `/save` and `/resume` need no format
|
|
234
|
-
* change.
|
|
235
|
-
*
|
|
236
|
-
* `live: true` is normalized away ON LOAD, in `session/persist.ts`, next to
|
|
237
|
-
* `team.active`, `todo.live`, the retry card's phase and `fast.live`, and for
|
|
238
|
-
* the identical reason (C-8): `Transcript`'s settled boundary is MONOTONIC, so
|
|
239
|
-
* an entry that never settles never reaches `<Static>` and is re-rendered on
|
|
240
|
-
* every frame for the rest of the session.
|
|
241
|
-
*
|
|
242
|
-
* EVERY STRING ON THIS CARD DESCRIBES THE HISTORY, NEVER THE SCREEN (P2-9).
|
|
243
|
-
* `/clear` empties the transcript view but not `messages`, so a compaction can
|
|
244
|
-
* legitimately fire against a visually empty transcript and report
|
|
245
|
-
* "112 -> 9 messages" with nine visible rows.
|
|
246
|
-
*/
|
|
247
|
-
| {
|
|
187
|
+
} | {
|
|
248
188
|
id: string;
|
|
249
189
|
kind: 'compaction';
|
|
250
190
|
/** 1-based within the session, so the card can name itself. */
|
|
@@ -275,29 +215,7 @@ export type Entry = {
|
|
|
275
215
|
charsRemoved: number;
|
|
276
216
|
};
|
|
277
217
|
live: boolean;
|
|
278
|
-
}
|
|
279
|
-
/**
|
|
280
|
-
* One supervised background service (background-service-supervision §3.10).
|
|
281
|
-
*
|
|
282
|
-
* JSON-SERIALIZABLE by construction, so `/save` needs no format change.
|
|
283
|
-
*
|
|
284
|
-
* IT IS THE ONE LIVE CARD THAT DOES **NOT** BLOCK THE SETTLED BOUNDARY ONCE IT
|
|
285
|
-
* IS UP (D-11 / P0-4). Every other live clause in
|
|
286
|
-
* `Transcript.tsx::computeSettledCount` is bounded by an OPERATION — a
|
|
287
|
-
* dispatch, a turn, one LLM call, one countdown — and each carries a comment
|
|
288
|
-
* saying that an entry which never settles is re-rendered on every frame for
|
|
289
|
-
* the rest of the session. A service is bounded by the USER'S INTENT: a dev
|
|
290
|
-
* server left up for an hour is the normal case. So only `starting` blocks
|
|
291
|
-
* (bounded by `readyTimeoutMs`), a `ready`/`running` card commits its body to
|
|
292
|
-
* `<Static>`, and a later terminal transition appends a NEW one-row entry
|
|
293
|
-
* rather than trying to rewrite a card `<Static>` has already printed.
|
|
294
|
-
*
|
|
295
|
-
* `terminal: true` marks that second entry. `session/persist.ts` rewrites any
|
|
296
|
-
* restored non-terminal card to `stopped`, next to `team.active`, `todo.live`,
|
|
297
|
-
* the retry phase, `fast.live` and `compaction.live`, and for the identical
|
|
298
|
-
* reason.
|
|
299
|
-
*/
|
|
300
|
-
| {
|
|
218
|
+
} | {
|
|
301
219
|
id: string;
|
|
302
220
|
kind: 'service';
|
|
303
221
|
/** `s1`, `s2`, ... — the id the model quotes back. */
|
|
@@ -476,6 +394,15 @@ export declare function initialViewState(seed?: ViewStateSeed): ViewState;
|
|
|
476
394
|
export type ViewAction = {
|
|
477
395
|
type: 'submit';
|
|
478
396
|
text: string;
|
|
397
|
+
}
|
|
398
|
+
/**
|
|
399
|
+
* `controller.steer` was accepted; append the persistent queue marker
|
|
400
|
+
* (5.2.2). Dispatched from exactly one place -- `App.submitMessage`'s
|
|
401
|
+
* running branch -- beside the `controller.steer` call it mirrors.
|
|
402
|
+
*/
|
|
403
|
+
| {
|
|
404
|
+
type: 'steerQueued';
|
|
405
|
+
text: string;
|
|
479
406
|
} | {
|
|
480
407
|
type: 'runStart';
|
|
481
408
|
} | {
|
|
@@ -677,16 +604,7 @@ export type ViewAction = {
|
|
|
677
604
|
} | {
|
|
678
605
|
type: 'serviceUpdate';
|
|
679
606
|
service: ServiceSnapshot;
|
|
680
|
-
}
|
|
681
|
-
/**
|
|
682
|
-
* A service reached a terminal state.
|
|
683
|
-
*
|
|
684
|
-
* IT APPENDS A NEW ONE-ROW ENTRY rather than rewriting the card (D-11). The
|
|
685
|
-
* card may already have been printed into `<Static>`, and `<Static>` cannot
|
|
686
|
-
* un-print — so any design that rewrites a printed card is wrong whatever it
|
|
687
|
-
* claims. A second event at a second time is also simply more honest.
|
|
688
|
-
*/
|
|
689
|
-
| {
|
|
607
|
+
} | {
|
|
690
608
|
type: 'serviceEnd';
|
|
691
609
|
service: ServiceSnapshot;
|
|
692
610
|
};
|