Commit Graph

1217 Commits

Author SHA1 Message Date
can1357 22439b6be2 Merge PR #8896: fix(settings): hide excluded search providers from summary (@poorpaper) 2026-08-19 01:38:34 +02:00
can1357 cc5068bd17 Merge PR #8872: fix(tui): render xdev tool images inline (@daandden) 2026-08-19 01:37:01 +02:00
poorpaper 6862ac08f0 fix(settings): hide excluded search providers from summary 2026-08-18 22:30:03 +08:00
Vu Anh Nguyen cea6ecd3d7 fix(tui): render xdev tool images inline 2026-08-18 12:09:39 +07:00
roboomp 49f22987d5 fix(tui): consolidate live tool spinner timers into one shared ticker
Every live tool block (streaming args, a running partial tool, or a task
subagent) armed its own 80ms setInterval driving requestComponentRender,
so N concurrent live blocks created N unsynchronized repaint timers that
kept the 30fps render scheduler awake near-continuously during
multi-subagent / workflowz / orchestrate work.

Replaced the per-component intervals with a single shared spinner ticker
that advances the already-phase-locked glyph once per step and repaints
every registered live block in one coalesced frame, independent of block
count. Verified 3 live blocks now share 1 timer instead of 3.

Fixes #8731
2026-08-16 14:58:57 +00:00
can1357 a4e5979d70 Merge PR #8658: fix(tui): preserve welcome columns for long model names (@roboomp) 2026-08-16 02:43:31 +02:00
can1357 d5fd412115 fix(tui): labeled single multi-select Enter as submit 2026-08-16 02:13:40 +02:00
can1357 f83111c8d4 Merge PR #8265: fix(tui): multi-select ask dialog submits on Enter instead of dead-ending (@zhang17-24) 2026-08-16 02:13:40 +02:00
can1357 8de929c393 Merge PR #8285: fix(tui): preserve scrollback after hidden tool snapshots (@dannyboy-ai) 2026-08-16 02:03:16 +02:00
can1357 5cc9aa74bc fix(ask): used full dialog width for wrapped labels 2026-08-16 02:03:15 +02:00
roboomp bb1de6d0e4 fix(tui): preserved welcome columns for long model names
Allowed the preferred left column to grow to fit model and provider labels while retaining the minimum right-column width.

Added a regression test at the 55-column layout boundary.

Fixes #8657
2026-08-15 13:48:29 +00:00
Slava Zavadsky 00043ef3ba fix(ask): wrap long option labels in the rich ask dialog instead of truncating
The rich AskDialogComponent (merged in PR #4375) hard-truncated every
option row via truncateToWidth(firstLine, width, Ellipsis.Unicode),
clipping the disambiguating tail of long labels with no way to read it.
The legacy HookSelector dialog has wrapped labels since June 1
(3c7d50d292), so the rich dialog was the remaining truncation path.

renderRowLabel now wraps the label with wrapTextWithAnsi, indenting
continuation lines under the radio/checkbox marker so the cursor stays
visually anchored; the body ScrollView carries vertical overflow. The
note marker is reserved on the first line. Fixes #1243, #8594.
2026-08-15 09:11:32 -04:00
Daniel Anderson-Little 44834fdd23 fix(tui): preserve scrollback after hidden tool snapshots 2026-08-13 15:07:39 -04:00
can1357 6563b16424 fix(coding-agent): stat-poll git HEAD instead of fs.watch for branch display
- Bun's inotify-backed fs.watch permanently stops delivering events after
  observing git's atomic HEAD.lock -> HEAD rename in the watched directory
  (oven-sh/bun#24875), so the directory-watch fix for issue #8412 still froze
  the status-line branch on Linux after the first switch; CI caught it as a
  30s timeout in status-line-vcs-refresh.test.ts.
- Added git.head.watch: fs.watchFile stat-poll of the HEAD path (reftable dir
  for reftable repos) with a disposer; path-based polling survives inode swaps
  on every platform.
- Status line and footer now consume the helper; the footer previously bound
  fs.watch to the HEAD file inode and died after one switch on all platforms.
- Dropped the FSWatcher error-listener plumbing (StatWatcher has no error
  mode) and reworked the watcher lifecycle tests to the stat-poll contract;
  verified the atomic-rename regression test passes on Linux bun 1.3.14 in
  Docker where it previously timed out.
2026-08-13 20:20:49 +02:00
roboomp e62814b4b0 fix(coding-agent): watch git dir so branch display tracks switches
The status-line branch watcher bound fs.watch to the .git/HEAD file.
git updates HEAD via a lock file plus an atomic rename (HEAD.lock ->
HEAD), which unlinks the watched inode, so the watch fired for the
first branch switch and then died on the stale inode. The displayed
branch froze on the previous branch while later switches went unseen.

Watch the git directory instead of the HEAD file (and, for reftable
repos, the reftable dir as before) and filter directory events for the
HEAD entry. The directory inode is stable across renames, so the watch
survives every switch.

Fixes #8412
2026-08-13 07:05:32 +00:00
can1357 a53e4e790d feat(coding-agent/modes): introduced fullscreen agents hub and creation flow
- Replace the obsolete agent dashboard control center with a new fullscreen agents hub component.
- Integrate AI-assisted agent creation architect flow using model sessions.
- Provide interactive property strips and model browser integration for agent configuration.
- Update tests and documentation to support the redesigned agents hub.
2026-08-13 05:09:58 +02:00
can1357 e8eed95130 feat(coding-agent): introduced fine grained per agent advisor configuration
- Replaced blanket subagent advisor global settings with fine-grained per-agent configuration and frontmatter support.
- Added dashboard keybindings and inline override editors for managing agent advisor patterns.
- Implemented settings migration logic to convert legacy global options into per-agent settings.
- Updated session persistence and execution layers to restore and enforce per-agent advisor behaviors.
2026-08-13 04:59:50 +02:00
can1357 eafefaccf7 Merge PR #8337: fix(usage): use authoritative OpenCode Go quotas (@will-bogusz) 2026-08-13 01:14:53 +02:00
can1357 338abf4881 Merge PR #8266: fix(omp): prevent false reset fireworks (@oleksoleksoleks) 2026-08-13 01:14:51 +02:00
can1357 0068580fe6 Merge PR #8202: fix(agent): support array model overrides in dashboard (@roboomp) 2026-08-13 01:14:50 +02:00
left-to-right b245be11c5 fix(ask): address review comments on multi-select Enter submit
- Multi-question dialogs now advance on Enter in multi-select mode
  instead of submitting every question at once (roboomp blocking)
- Ask tool accepts an empty multi-select submission as a "select none"
  answer instead of aborting as a cancellation (codex P2)
- Footer hint reflects advance vs submit for multi-question dialogs
- Move the #8252 changelog entry to Unreleased (codex P2)

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-08-12 22:58:02 +08:00
Will Bogusz 9eff02d36c fix(usage): use authoritative OpenCode Go quotas 2026-08-12 13:26:01 +02:00
Shawn Koh 16c2832404 fix(tui): validate leading width epoch blocks
Amp-Thread-ID: https://ampcode.com/threads/T-019ff125-f53d-739b-8462-6027fe70f914
Co-authored-by: Amp <amp@ampcode.com>
2026-08-12 16:16:20 +08:00
Shawn Koh c948d7a289 fix(tui): preserve lazy border render contract
Amp-Thread-ID: https://ampcode.com/threads/T-019ff125-f53d-739b-8462-6027fe70f914
Co-authored-by: Amp <amp@ampcode.com>
2026-08-12 15:56:33 +08:00
Shawn Koh d131b61227 fix(tui): preserve non-prefix width appends
Amp-Thread-ID: https://ampcode.com/threads/T-019ff125-f53d-739b-8462-6027fe70f914
Co-authored-by: Amp <amp@ampcode.com>
2026-08-12 10:14:42 +08:00
Shawn Koh 8751a9571f fix(tui): preserve live output across width epochs
Amp-Thread-ID: https://ampcode.com/threads/T-019ff125-f53d-739b-8462-6027fe70f914
Co-authored-by: Amp <amp@ampcode.com>
2026-08-12 10:14:42 +08:00
Shawn Koh fb0bcdbba0 fix(tui): preserve mutable Markdown row on resize
Amp-Thread-ID: https://ampcode.com/threads/T-019ff125-f53d-739b-8462-6027fe70f914
Co-authored-by: Amp <amp@ampcode.com>
2026-08-12 10:14:41 +08:00
Shawn Koh d164a6407a fix(tui): avoid unwatermarked width-epoch appends
Amp-Thread-ID: https://ampcode.com/threads/T-019ff125-f53d-739b-8462-6027fe70f914
Co-authored-by: Amp <amp@ampcode.com>
2026-08-12 10:14:41 +08:00
Shawn Koh ef803e3880 fix(tui): rebuild direct HerdR scrollback from source 2026-08-12 10:14:41 +08:00
can1357 a4d8860a6c feat: added google reasoning controls mcp stream resumption and tar support
- Added Google provider thinking configuration parameters and force-reasoning-off controls.
- Implemented MCP SSE stream resumption using Last-Event-ID and `SSEResumeError`.
- Added support for TAR old-GNU sparse extension blocks, path length checks, and archive entry overrides.
- Restricted external thinking support to specific models and added semver fallback parsing.
2026-08-12 02:32:45 +02:00
Daniel Anderson-Little cbd7dc2e70 fix(coding-agent): centralize hidden activity state 2026-08-11 17:07:20 -04:00
Daniel Anderson-Little 3a4ea6a376 fix(coding-agent): hide internal tool activity blocks 2026-08-11 16:59:53 -04:00
Alexander Kirilin d1741f04e6 fix(omp): prevent false reset fireworks 2026-08-11 13:52:48 -04:00
left-to-right b3b95e769f fix(tui): multi-select ask dialog submits on Enter instead of dead-ending
Enter in a multi-select ask question toggled the focused option exactly
like Space, with the only submit path hidden behind the Submit tab that
appears only for multi/multi-question dialogs. Enter now submits the
current selection (matching single-select), Space still toggles, and the
footer hint reflects it.

Fixes #8252
2026-08-12 01:36:25 +08:00
can1357 64baa7c1bd chore(format): applied biome formatting and removed dead code from merged prs 2026-08-11 15:14:15 +02:00
can1357 600bac9615 Merge PR #8213: Fix/8030 osc133 command start (@Mustaqeem66) 2026-08-11 15:07:43 +02:00
can1357 24c348862f Merge PR #8197: fix(status-line): recognized kimi-code subscription windows in the usage segment (@tehfiend) 2026-08-11 15:06:16 +02:00
can1357 d57656f283 Merge PR #8074: fix(coding-agent): display subagent registration time locally (@anatoli-tsinovoy) 2026-08-11 15:06:13 +02:00
can1357 dedddb86f5 Merge PR #7998: fix(ai): map Cursor plan rails to dashboard percents and show mo N% (@dnth) 2026-08-11 15:06:12 +02:00
Muhammad Mustaqeem d5e2bb9299 fix(tui): close the OSC 133 prompt zone so terminals clear input state
OSC 133;B latches a sticky `.input` cursor semantic in Ghostty (and
Ghostty-derived terminals such as cmux) that only a command-start marker
clears. UserMessageComponent emitted A/B and never C, so for the rest of
the session `cursorIsAtPrompt()` stayed true and every painted cell was
tagged `.input`. With `cursor-click-to-move = true` (Ghostty's default)
every left-click released inside the pane injects a burst of arrow keys
into omp's pty and the editor caret jumps to column 0.

Emit C immediately followed by D;0 at the end of the bubble. The zone is
opened and closed within the same render, so the sticky input state is
cleared while the grouping behaviour the original comment protected is
preserved: no later assistant/tool output can be grouped under this
prompt because the command zone never stays open.

Refs #8030, #6115
2026-08-11 10:29:38 +05:00
roboomp f59a966aab fix(agent): supported array model overrides in dashboard
- Normalized string and array override chains through the shared model-pattern parser.
- Aligned the settings type and covered dashboard loading with an array override.

Fixes #8201
2026-08-11 02:51:58 +00:00
Bejay Cole e7f487381b fix(status-line): recognized kimi-code subscription windows in the usage segment
Kimi's usage provider built window ids from the raw duration/timeUnit ("300time_unit_minute") and left the aggregate quota on "default", so the status-line usage segment, which matches canonical "5h"/"7d" windows, never rendered for kimi-code sessions.

Derive window ids from the reported span instead (300 minutes -> "5h", 7 days -> "7d"), mirroring the minimax-code convention, and tag the aggregate quota as the weekly window. The payload carries only resetTime for the aggregate, but the observed reset horizon matches the plan's weekly cycle. The segment aggregator also falls back to the reported span (duration within a minute of 5h or 7d) when the id isn't canonical, so cache rows written by older builds still light up the 5h meter in mixed-version fleets.
2026-08-10 17:01:41 -06:00
Anatoli Tsinovoy 5d8214ea77 fix(coding-agent): keep lineage timezone visible 2026-08-09 16:49:13 +03:00
Anatoli Tsinovoy d725ab10c1 fix(coding-agent): display subagent registration time locally 2026-08-09 16:35:07 +03:00
dnth aa92c7e97c fix(ai): address Cursor usage review feedback
Gate status-line monthly rendering to Cursor, prefer personal dashboard
rails over legacy /auth/usage request fractions, fall back from unusable
overall buckets to plan, ignore disabled plan percent fields, and keep
on-demand when the included bucket is empty. Also add changelog PR/author
attribution for the external contribution.
2026-08-08 17:36:19 +08:00
dnth 69f790fa6e fix(ai): map Cursor plan rails to dashboard percents
Cursor Pro/Pro+ usage-summary still uses individualUsage.plan, but the
web dashboard percent is autoPercentUsed / apiPercentUsed — not
plan.used/limit cents. Prefer those rails for Cursor Models / Other
Models, keep overall+cents fallbacks, floor monthly status-line %, and
repaint after async usage fetch so mo N% does not stay blank.
2026-08-08 17:26:40 +08:00
dnth cc3835342e fix(ai): parse Cursor plan/onDemand usage and show monthly status-line
Cursor's /api/usage-summary now returns individualUsage.plan (and optional
onDemand) for Pro/Pro+/Ultra instead of the overall bucket that #7613
parsed. Fall back to plan when overall is absent, keep overall preferred
when both exist, and render monthly Cursor quotas in the status-line usage
segment.

Verified locally against a live Pro+ account and with focused unit tests.
2026-08-08 16:46:01 +08:00
enieuwy a1e60c3450 refactor(session): fold the pending-fallback surface into servingModel
Final review found `pendingRetryFallbackModel` unreachable. `servingModel`
returns `undefined` only when the session has no model at all, and the
pending getter required one, so the badge term guarding on it could never
fire. Its case — a fallback armed before anything has served — is already
answered by `servingModel`'s bootstrap, which names the current model and
flags it as fallback-routed. Removed, the same duplicate-surface cleanup
that removed `retryFallbackModel`.

Attribution now anchors on the session id rather than the session file. An
unpersisted session has no file, so two `undefined`s compared equal and
stale attribution survived `/new` and branch switches there; every real
switch mints a new id, persisted or not.

The cooldown-expiry restore keeps `#fallbackRouted` when the stored primary
selector cannot be parsed. Nothing is restored on that path, so the session
is still running on the fallback and its remaining turns are still fallback
work; clearing the flag reported them as the configured primary.

`executor-prewalk`'s fake session predates this work and never set
`servingModel`, so the prewalk hand-off stopped advancing the reported
model once the executor began reading attribution from the session. It now
mirrors the hand-off the way the other executor fixtures do.
2026-08-08 13:16:41 +08:00
enieuwy 0a075662ac fix(session): attribute a run to the model that produced its output
An Agent Hub row reported a subagent as having run on a model that never
spoke. All 97 of its requests, 421K tokens and $6.19 of cost were served
by the primary; a transient stall then armed a fallback, that fallback
errored on its first request with an exhausted quota, and the run died.
Attribution followed the routing switch rather than the output.

Three surfaces lied independently, each re-deriving "the current model"
and calling it the run's model: the executor's progress snapshot, the
session's fallback selector that the hub row reads first, and the
transcript walk behind a settled row.

Sessions now own attribution. `AgentSession.servingModel` names the model
that produced this session's output, holding the last model that actually
served while a candidate is armed but unproven. A switch is a routing
decision, not evidence the target can produce anything, so the answer only
moves once a turn on the target settles.

Consumers read it instead of reconstructing it. The executor's observer
dropped its own event bookkeeping: that bus also carries advisor turns
running on a different model, and it was reading `retry_fallback_applied`
as proof of service. The hub row reads the same getter, so the main
session — which has no executor progress and no persisted history — stops
rendering an unproven candidate as its plain configured model. A fallback
armed before anything has served is still shown, marked as a fallback,
because there is no earlier work to miscredit there.

One predicate decides "this turn produced output", shared by the live
session and the offline replay so they cannot disagree. `error` and
`aborted` are both failures — a stalled stream is finalized as `aborted`
with its partial block still attached, so a stop reason alone proves
nothing — and a turn needs actionable content, which a `length` stop
burning its budget on unsigned thinking does not have. It tolerates
malformed content blocks: transcripts outlive the shapes that wrote them,
and one bad line previously blanked a whole row's history.

Ordering matters at two swap sites. Both the chain advance and the
cooldown-expiry restore move the model and fan `model_changed` out to
subscribers synchronously, so each now updates fallback state before the
swap rather than after; otherwise an observer reading attribution inside
that window sees the incoming candidate carrying the outgoing one's proof.

A startup-selected fallback owns the run from its first request only on a
fresh session. A resumed transcript already holds turns another model
produced, so there the candidate stays unproven until it answers.

`retryFallbackModel` is removed: every consumer reads `servingModel`, and
keeping a parallel derived getter alive for tests is the duplicate surface
this change set exists to remove.
2026-08-08 13:16:11 +08:00
can1357 7cebe901b7 refactor(coding-agent): narrowed over-exported internal symbols
- 28 symbols across discovery, mcp header policy, agent-hub projection and
  rendering, the agent registry, shell tokenizing and changelog comparison
  were exported but referenced only inside their own module; they are now
  module-private, shrinking the deep-import surface.
- Kept AGENT_PLUGIN_MANIFEST_SCHEMA, AGENT_PLUGIN_MCP_SCHEMA,
  parseAgentPluginManifest, clearAgentPluginRootCache and mergeMCPHeaders
  exported: each is a seam for tests that defend real parsing or header
  precedence behavior.
- Nothing reachable from an explicit exports entry or public barrel changed.
2026-08-08 06:32:01 +02:00