Commit Graph
2890 Commits
Author SHA1 Message Date
can1357 d435385ab1 feat: introduced max reasoning effort tier across model and rpc systems
- Introduced `Max` as a first-class reasoning effort tier across all packages, including AI providers, coding agent configurations, and RPC protocols.
- Refactored model effort ladders to use wire-exact mappings and removed legacy effort aliasing (e.g., `max-to-xhigh` mapping).
- Updated model registry and provider configurations to support `Max` tier routing, color themes, and UI icon associations.
- Expanded test suites to provide end-to-end coverage for the new reasoning tier, including updated compatibility and fallback scenarios.
2026-07-10 13:39:42 +02:00
can1357 f4283e035a Merge PR #4994: fix(auth): decouple login success from model refresh 2026-07-10 12:37:36 +02:00
can1357 5d6e9a92d7 Merge PR #4999: fix(coding-agent): restore ask tool timeout fallback 2026-07-10 12:37:36 +02:00
Tommaso Fontana 705a6118f6 feat(coding-agent): added timestamp to per-turn token-usage row
The token-usage row shown under assistant messages (display.showTokenUsage) now leads with the turn's local wall-clock time down to the second (YYYY-MM-DD HH:mm:ss), sourced from the assistant message's persisted timestamp so live, rebuilt, and restored transcripts all show the turn time rather than the view time.

createUsageRowBlock takes timestamp as an optional trailing argument, preserving its (usage, durationMs, ttftMs) public call contract on the package's ./modes/components/* export surface.
2026-07-10 10:32:41 +02:00
Matt Wilkinsonandseal 2f5f4eb91a fix(todo): one-line blocker notes and reconcile blocked subagent todos
Two review findings on the blocked-todo support:

- A blocker `reason` with an embedded newline corrupted the Markdown
  round-trip: `phasesToMarkdown` writes the note as a trailing HTML comment
  on one checklist line, so a newline split it across two lines — the first
  an unclosed `<!-- blocker: …`, the second an unrecognized-syntax error —
  losing the reason on `/todo edit` and export/import. Normalize the reason
  to a single line (collapse whitespace runs) at the `block` op source, so
  the round-trip, HUD, and summary consumers all stay one-line-safe.

- The todo prompt now directs the agent to `block` a task waiting on
  another agent, but `#reconcileTodosWithSubagents` only auto-completed
  pending/in_progress todos. A todo blocked on a detached subagent would
  stay blocked after that subagent completed, and since blocked todos are
  excluded from the stop reminder it stranded silently. Include `blocked`
  in the reconciliation (a matching subagent completing is the unblock
  signal) and drop the now-stale blocker note when completing.

Both paths are revert-proven by new regression tests.

Co-Authored-By: seal <noreply@sealedsecurity.com>
2026-07-10 02:26:47 -04:00
Matt Wilkinsonandseal edbe4c4d97 fix(statusline): drop stale jj label after same-root invalidation
The throttled jj branch/status caches guarded in-flight results only by
root equality (`#jjRoot === root`). When a HEAD or bookmark move fires the
git watcher's `invalidate()` while a query for the *same* root is still in
flight, `#invalidateGitCaches()` resets `#jjRoot` but the next render
re-resolves it to the identical root string — so the root-only guard
accepts the pre-invalidation result, caches a superseded bookmark/status,
and advances the 5s throttle on it. The stale label then persists for a
full TTL after the move.

Replace the root-equality guard with a generation token bumped on every
cache reset (cwd switch in `#jjRootFor` and HEAD/bookmark move in
`#invalidateGitCaches`). Each query captures the generation at launch and,
on resolve, drops its result and refuses to advance the throttle if the
generation changed. This subsumes the old root check (a root change always
resets, bumping the generation) and additionally catches the same-root
case it structurally could not.

Regression test (revert-proven): a same-root invalidation mid-flight
renders the stale label without the fix, is dropped with it.

Co-Authored-By: seal <noreply@sealedsecurity.com>
2026-07-10 01:08:44 -04:00
roboomp bc9f4c4be6 fix(coding-agent): armed ask timeout for legacy ui
Added an explicit timeout presentation capability so interactive queued dialogs defer the fallback while older UI implementations still get an immediate tool-owned timeout.

Refs #4995
2026-07-10 04:13:18 +00:00
Matt Wilkinsonandseal 439fdb4b67 fix(statusline): clear biome check in jj-cache test
Whole-repo `biome check .` (CI `check:tools`) failed on the jj-cache
test with two diagnostics that a changed-files-only local check missed:

- assist/source/organizeImports (error): the named imports in
  `import { settings, Settings }` were unsorted. Fixed via biome's safe
  autofix -> `{ Settings, settings }`.
- suppressions/unused (warning): a `biome-ignore
  noControlCharactersInRegex` sat on the `visible()` helper, but biome
  does not flag the `\xNN` escape-sequence form used there, so the rule
  never fired and the suppression had no effect. Removed it per biome's
  own instruction; the regex is unchanged.

No behavioral change: the jj-cache test still passes (2/2).

Co-Authored-By: seal <noreply@sealedsecurity.com>
2026-07-10 00:12:01 -04:00
Matt Wilkinsonandseal 13547e784a fix(coding-agent): dispose title spinner on shutdown
The run-state `working` spinner arms a periodic setInterval that re-emits
the terminal title as an OSC-0 write each tick. shutdown() restored the
shell title via popTerminalTitle() but never stopped the interval, so a
pending tick could fire after the restore and leave the parent shell tab
reading a stale spinner title post-exit. Wire the existing
disposeTerminalTitleState() into shutdown() before popTerminalTitle().

Co-Authored-By: seal <noreply@sealedsecurity.com>
2026-07-09 23:26:01 -04:00
Matt Wilkinson 55630876f5 fix(coding-agent): reconcile terminal title run-state with session lifecycle
Reset the run-state title to idle when focusing an idle session (was inheriting the previous session's stuck spinner); drive the title to attention while a tool blocks on an approval prompt (not just ask), returning to working at its end; let an extension setTitle() own the terminal verbatim so neither the run-state prefix nor the spinner tick clobbers it, cleared when the app sets an authoritative session title; use NodeJS.Timeout for the spinner timer field.
2026-07-09 22:51:32 -04:00
Matt Wilkinson 997f2c5e8b feat(coding-agent): reflect agent run state in terminal title
The terminal title (OSC 0) now carries a run-state prefix: an animated spinner while the agent is working and a steady dot when idle, so a backgrounded tab/pane shows which session is busy vs done. `setTerminalTitleState` also exposes an `attention` ([!]) state for callers; rendering is gated by `tui.titleState` (default on), dedups writes, and is TTY-guarded.
Refs can1357/oh-my-pi#3587
2026-07-09 22:51:32 -04:00
roboomp fcf389ae72 fix(coding-agent): deferred ask timeout until display
Started the ask tool fallback timeout from the selector presentation callback so queued dialogs do not consume the user's response window.

Refs #4995
2026-07-10 02:49:33 +00:00
roboomp facfb3c35a fix(coding-agent): synced ask fallback timeout resets
Reset the ask tool fallback timeout whenever the interactive selector resets its UI countdown, preventing late keypresses from falling back to the original recommended option.

Refs #4995
2026-07-09 23:37:50 +00:00
roboomp 497d385ce0 fix(auth): decoupled login success from model refresh
Switched interactive OAuth login to start model discovery in the background after credentials are saved.

Added a regression test that keeps model refresh pending and asserts the success transcript appears immediately.

Fixes #4989
2026-07-09 22:12:17 +00:00
roboomp bf64806474 fix(mcp): kept macos stdio servers attached
Left Darwin stdio MCP server launches in the inherited session so macOS TCC can prompt for Apple Events permissions used by xcrun mcpbridge.

Added resolver coverage for Darwin while preserving Linux detach and Windows console behavior.

Fixes #4987
2026-07-09 21:39:42 +00:00
DarkPhilosophy 8a82b1d5b1 Merge remote-tracking branch 'can1357/main' into feat/advisor-per-agent-toggle 2026-07-09 22:47:06 +03:00
roboomp e7c678dbe5 fix(prompting): allowed magic keyword punctuation
Magic keyword matching now treats sentence punctuation and quotes as prose boundaries while still rejecting casing changes, inflections, and path/file-extension occurrences.

Added regression coverage for detection and highlighting across ultrathink, orchestrate, and workflowz.

Fixes #4965
2026-07-09 18:52:40 +00:00
can1357 4a20b51ca8 feat: implemented auto-sealing for transcript blocks and TUI row emission
- Added auto-sealing logic to `FinalizableBlock` to finalize displaceable snapshots when they enter the scrollback area.
- Updated TUI frame emission to publish committed rows and clamp them to segment bounds, ensuring accurate component updates.
- Introduced component tracking and cleanup in event controller tests to prevent resource leaks during finalization.
- Validated state transitions and post-emit synchronization through comprehensive new test suites for transcript and TUI components.
2026-07-09 20:37:09 +02:00
can1357 7c560c7151 fix(acp): flushed final assistant text lost to agent_end race
The assistant message_end fan-out is fire-and-forget in the session layer
and can be parked on extension delivery while agent_end is flushed through
#endInFlight, so agent_end can overtake it. #finishPrompt then unsubscribes
the prompt turn and the mapAssistantMessageEnd fallback never runs: an ACP
client that only received agent_thought_chunk updates (thinking streamed,
text arrived only on the trailing message) stays stuck on the thinking
block with no visible answer. On agent_end, emit the last assistant
message's text before resolving the prompt when live-message progress shows
no text was ever delivered, and defer the live-state reset past that flush
so a late message_end cannot resurrect fresh progress and double-emit.

Fixes #4902
2026-07-09 18:36:39 +02:00
can1357 efc90d26b8 style: applied biome fixes to integrated issue fixes 2026-07-09 18:34:06 +02:00
can1357 cde9ee7501 fix(tui): repainted write first partial result over pending tail preview
The first-result viewport-repaint gate assumed only streamed
__partialJson placeholder shapes (SSH) could re-anchor; the write
renderer's collapsed pending preview paints a tail window from decoded
content, so its first partial result re-anchored to the top of the file
and left the committed tail rows stale above the new frame.

Resolve forceFirstResultViewportRepaint per renderer as a boolean or an
(args, options) predicate evaluated at paint time: write opts in when a
collapsed preview outgrew the streaming tail window, SSH stays scoped to
the streamed-placeholder shape it always covered.

Adopted from PR #4478 (roboomp) with an allocation-free line-count scan
and terminal-buffer regression coverage.

Fixes #4477
2026-07-09 18:30:48 +02:00
roboompandcan1357 894cf489ff fix(tui): canceled streaming prompts on first escape
Esc during an active streaming turn required a second press within 2s
(two-step arm from #3493). In the no-input-waiter submit path the turn
starts with isStreaming=true but no working loader, so Esc fell into
the two-step branch and the agent_start subscription then wiped the
arm — repeated presses kept re-arming and never aborted. The loader-up
path already aborted on a single press, so the confirmation guarded no
coherent state. First Esc now aborts the streaming turn directly.

Adopted from PR #4938 (test + input-controller + changelog hunks only;
unrelated workflow-notice.md churn dropped).

Fixes #4921
2026-07-09 18:30:48 +02:00
can1357 c944870566 fix(coding-agent): implemented pi's ui.addAutocompleteProvider API
Extensions calling ctx.ui.addAutocompleteProvider (e.g. @ff-labs/pi-fff)
crashed at load with 'TypeError: ... is not a function' because omp's
ExtensionAPI.ui omitted pi's autocomplete-provider API; the throw also
aborted the rest of a try/catch-guarded session_start init.

ExtensionUIContext now declares addAutocompleteProvider(factory).
Interactive mode stacks each factory on the built-in editor provider in
registration order, re-applies the stack on every slash-command refresh,
and skips throwing/malformed factories; RPC, ACP, and headless contexts
accept the factory as a no-op, matching upstream pi's RPC behavior.

Fixes #4919
2026-07-09 18:27:23 +02:00
e429166673 fix(coding-agent): queued extension sendUserMessage as steer while streaming
Extension sendUserMessage() without deliverAs fell through to prompt(),
which throws AgentBusyError during an active stream; the message was
dropped and surfaced as 'Extension sendUserMessage failed'. Route the
omitted-deliverAs path through prompt() with streamingBehavior 'steer'
so streaming queues a steer with normal prompt-flow side effects
(keyword notices, advisor auto-resume reset) and idle still starts a
turn.

ACP skill-command prompts now pass streamingBehavior 'steer'; the RPC
skill fast-path honors the prompt command's streamingBehavior field
(default steer) like the plain-prompt path already did. Documented the
extension-facing delivery semantics.

Synthesized from PR #4942 (prompt-flow steer routing, docs, tests) and
PR #4922 (RPC streamingBehavior threading, steer regression test);
dropped PR #4942's unrelated workflow-notice.md ellipsis churn.

Fixes #4923

Co-authored-by: roboomp <omp@can.ac>
Co-authored-by: metaphorics <metaphorics@users.noreply.github.com>
2026-07-09 18:27:22 +02:00
can1357 ba91877b6e fix(tui): restored read selector previews for explicit selector args
The v16.3.12 explicit `selector` field (ff3b0c795c) was consumed by the
read tool but never threaded into the TUI renderers: ReadRenderArgs in
both readToolRenderer (read.ts) and ReadToolGroupComponent only derived
selectors from path-embedded `:sel` suffixes, so split-arg calls like
{ path, selector: "2-3" } rendered bare paths without line ranges or
raw modifiers.

Joined the explicit selector (trimmed, leading colons stripped, non-string
guarded) back onto the display path in renderCall, renderResult error and
success branches, and the grouped read summary, keeping hyperlinks on the
base path only.

Adopted from PR #4904 (both commits squashed), minus its unrelated
workflow-notice.md prompt churn.

Fixes #4899
2026-07-09 18:27:21 +02:00
roboomp 1a3e137f19 fix(cli): showed print-mode working indicator
- Wrote a one-shot stderr working indicator before text print-mode prompts wait on the model.

- Covered pending text/json print-mode behavior with focused tests.

Fixes #4901
2026-07-09 08:00:02 +00:00
can1357 f2651e2eff Merge pull request #3277 from Jaaneek/xai-grok-oauth-login
fix(ai): use code login for xAI OAuth
2026-07-09 08:03:39 +02:00
Matt Wilkinson bcad7918c8 fix(statusline): keep jj caches coherent and gate jj status to jj-like HEAD
Reset the jj label/status caches in invalidateGitCaches so a watcher HEAD move refetches; key the async jj lookups by their captured root so a mid-flight repo switch can't land one repo's label/counts in another's cache; thread effectiveGitCwd through the jj lookups so an active child repo uses its own jj root. Gate jj status on a detached/absent git HEAD (mirroring the jj branch overlay) so a nested ordinary git checkout under a jj workspace keeps its own git status instead of the ancestor jj status. Adds cache-coherence + mid-flight-race regression tests.
2026-07-08 23:14:31 -04:00
Matt Wilkinson b112604c8c fix(todo): thread blocked status through clone, guards, and renderers
Carry task.blocker through AgentSession clone so a blocker reason survives storage round-trips; skip non-open tasks when blocking a phase so completed/abandoned work is never reopened; reject targetless block/unblock; render blocked rows distinctly (warning fg + reason) in the tool renderer and keep them visible in the collapsed HUD. Adds regression tests (red-green verified on the clone path).
2026-07-08 22:32:37 -04:00
DarkPhilosophy c93e38b145 fix(advisor): include limit identity when compacting quota windows 2026-07-08 21:33:05 +03:00
DarkPhilosophy 01f518ed77 fix(advisor): live status override in overview, account-filtered quota in config preview 2026-07-08 20:49:11 +03:00
DarkPhilosophy 3d99535972 fix(advisor): address review — per-advisor account quota, status overview, no_model status fix 2026-07-08 19:13:12 +03:00
DarkPhilosophy 8b4d644b4e fix(advisor): address review — no arbitrary auto-resume, active-account quota filter, dedup imports 2026-07-08 18:33:22 +03:00
DarkPhilosophy 55b58aa2e5 fix(advisor): resolved-model quota fallback, paused roster in text status 2026-07-08 18:08:53 +03:00
DarkPhilosophy 36b17cd12d fix(advisor): call onTurnError before quota pause, preserve disabled default advisor on save 2026-07-08 18:01:36 +03:00
Mathews-Tom 570e2acbaa Merge remote-tracking branch 'upstream/main' into feat/error-notify 2026-07-08 20:27:10 +05:30
Mathews-Tom 66ebfcfa2b Merge remote-tracking branch 'upstream/main' into feat/secret-friendly-names 2026-07-08 20:26:45 +05:30
DarkPhilosophy be19be8223 Merge remote-tracking branch 'can1357/main' into feat/advisor-per-agent-toggle 2026-07-08 17:47:41 +03:00
DarkPhilosophy 3e92c6d95b fix(advisor): address review — ES private fields, restore instructions body, legacy slug 2026-07-08 17:19:22 +03:00
DarkPhilosophy b55e6b91fe fix(advisor): show all quota windows (5h + 7d) sorted by urgency 2026-07-08 17:09:44 +03:00
DarkPhilosophy 13572f308b feat(advisor): real quota display in status + config, scrollbar in editor 2026-07-08 16:46:07 +03:00
can1357 355314262f merge PR #3224: feat(coding-agent): recognize #<number> as a GitHub issue/PR reference 2026-07-08 15:23:50 +02:00
DarkPhilosophy ceae7f34fd feat(advisor): scrollbar in instructions editor, quota/cost in config preview, merge upstream credential-blocking 2026-07-08 16:21:32 +03:00
can1357 ba7a8fc420 merge PR #4693: fix(tui): dispose stale session UI renderers 2026-07-08 15:19:40 +02:00
can1357 ac9216a0be merge PR #4728: fix: preserve status line path under overflow 2026-07-08 15:19:39 +02:00
can1357 17a510c57e merge PR #4785: fix(plan): carry local artifacts into approve execute 2026-07-08 15:19:39 +02:00
can1357 92b2923f7b fix(coding-agent): normalize fallback chain picker writes 2026-07-08 15:19:39 +02:00
can1357 8d484435c2 merge PR #4535: fix(coding-agent): restore fallback model selection 2026-07-08 15:19:38 +02:00
can1357 41f2074ec4 fix(coding-agent): align python prompt mode detection 2026-07-08 15:19:36 +02:00
can1357 b1bfaa7b55 merge PR #4681: fix(coding-agent): guard pasted shell prompts from python 2026-07-08 15:19:36 +02:00