Commit Graph
2890 Commits
Author SHA1 Message Date
can1357 baafa3c027 feat(render): added task renderContext propagation to hide preview rows
- Propagated task `renderContext` through `ToolExecutionComponent` so call rendering can detect result state.
- Suppressed task call-preview rows when a result snapshot exists to avoid duplicate task lines.
2026-05-30 16:22:12 +02:00
can1357 2d49cfbfa5 fix(coding-agent): fixed hashline edit preview deduping for final stream completion
- Updated the edit preview coalescing key to include streaming state plus a hash so final non-streaming diffs are not skipped when payload bytes match.
- Used a hashed partial-stream key as fallback when tool args are not JSON-serializable, keeping deterministic dedup cache keys.
- Added a regression test that verifies single-line hashline streaming edits render the completed preview diff instead of "No changes would be made".
2026-05-30 16:11:24 +02:00
can1357 f559f6b10c ux(coding-agent): added ? fallback for %/window context in status/task
- Added formatContextUsage to render context as `%/window` with `?` fallback across status and task views.
- Updated task renderCall to show dispatched agents as tree entries with `Tasks (2)` header and `#3` fallback.
- Capped task preview collapse at 12 entries and added `... N more agents` overflow messaging.
- Replaced hard-coded dot separators with `theme.sep.dot` in subagent cost and context output.
- Added tests for streaming task preview rendering and updated nested-live expectations for percent/context output.
2026-05-30 15:30:05 +02:00
can1357 a03611e006 Merge pull request #1520 from can1357/farm/a99664f4/respect-select-keybindings
fix(tui): respected selector navigation keybindings
2026-05-30 14:48:49 +02:00
can1357 3ecc48fdf6 feat(memory): added Mnemosyne local SQLite memory backend
- Introduced `@oh-my-pi/pi-mnemosyne` workspace package with BeamMemory, recall/retain, FTS, and optional fastembed ONNX embeddings.
- Wired `memory.backend = "mnemosyne"` into the coding-agent settings schema and backend resolver.
- Added `MnemosyneSessionState` for per-session auto-recall on first turn and auto-retain after completed turns.
- Documented configuration, environment variables, and operational notes in `docs/mnemosyne-memory-backend.md`.
2026-05-30 14:47:45 +02:00
roboomp 8178c9d5d9 fix(tui): respected selector navigation keybindings
Replaced raw Up/Down arrow matching in selector-style components with the shared tui.select navigation keybindings.

Added regression coverage for Ctrl+P/Ctrl+N selector remaps across the reported components.

Fixes #1535
2026-05-30 08:37:53 +00:00
can1357 377ed34e08 refactor(coding-agent): replaced ctx/Σ labels with icon and cleaner cost separator
- Removed "ctx" suffix and cumulative Σ-token display from status lines.
- Replaced "N tools" text with tool count + extensionTool icon.
- Changed cost separator to ` . ` to visually distinguish it from dim stats.
- Added test asserting new format and absence of old labels.
2026-05-30 06:38:09 +02:00
can1357 04f9402696 refactor(coding-agent): split registry refresh from in-memory model load
- Extracted `#loadModelsFromCurrentRegistryState()` for pure in-memory reads.
- `#loadModels()` now calls `registry.refresh()` only when no scoped models are set.
- Background provider refresh reuses the extracted method to avoid a redundant whole-registry reload after network round-trip.
- Added assertions verifying `registry.refresh` is called exactly once per selector lifecycle.
2026-05-30 04:34:55 +02:00
can1357 06aafb93f3 fix(coding-agent): debounced provider refresh on tab switch
- Decoupled provider tab changes from immediate model refresh by scheduling background provider refreshes with a 120ms debounce.
- Added refresh-state tracking and spinner-based status text so the tab bar updates while a provider refresh is in progress.
- Updated model-selector tests to verify tab switches stay responsive, refreshes are delayed, and loading spinner frames appear before completion.
2026-05-30 03:58:20 +02:00
can1357 de90713c76 fix(coding-agent): reverted todo glyphs and patched thinking block stripping
- Reverted in-progress/completed todo icons to pre-15.5.12 checkbox glyphs instead of status glyphs.
- Extended dangling tool_use cleanup to also strip `redacted_thinking` blocks and clear `thinking` signatures on the trailing assistant turn, fixing 400 handoff rejections from Anthropic on navigation.
2026-05-30 02:06:17 +02:00
can1357 3b75597aa6 fix(coding-agent): removed todo spinner and validated dangling tool_use stripping
- Removed todo spinner interval state and rendering hooks from InteractiveMode, and in-progress or active-matched todos now use the static running glyph.
- Removed spinner-driven matcher caching and render updates from todo list generation so running state is based on direct content matching.
- Added build-session context tests that remove dangling assistant `toolCall` entries and drop trailing assistant turns that contain only tool calls.
2026-05-30 01:24:58 +02:00
can1357 9eea27619c feat(tui): added inline color swatches for markdown hex color mentions
- Enhanced markdown rendering to insert a painted theme swatch before matching inline hex colors in prose and code spans.
- Skipped short numeric-only 3- and 4-digit values in plain text so issue-like references do not get swatches.
- Added `colorSwatch` to symbol themes and added tests for swatch rendering and surrounding-style preservation.
2026-05-30 01:04:46 +02:00
can1357 a21d95c605 fix(coding-agent): corrected cache hit rate denominator to include all tokens
- Used cacheRead + cacheWrite + input as the denominator for an accurate hit rate.
- Previous logic excluded uncached input tokens, overstating the hit rate for providers that report all three fields.
- DeepSeek (cacheWrite=0) still yields correct hit/(hit+miss) with the new formula.
2026-05-30 00:54:40 +02:00
can1357 0c0cd7de46 fix(tui): fixed Ghostty caret fallback by honoring requested hardware cursor
- Removed Ghostty-specific hardware-cursor forcing from TUI preference resolution and dropped the redundant terminal-cursor marker flag.
- Updated interactive mode editors to use `ui.getShowHardwareCursor()` so cursor mode now follows actual hardware-cursor visibility.
- Reworked terminal regressions tests to assert Ghostty respects the requested cursor preference and only emits cursor-show output when enabled.
2026-05-30 00:39:48 +02:00
can1357 2f13f6d4f2 feat(coding-agent): added context usage percentage to keep-context option
- Rendered the plan review "keep context" selector label with the session context usage percentage when available.
- Kept the fallback label unchanged when context usage data was unavailable.
- Added coverage asserting both the percentage label and fallback label in plan review tests.

Fixes #1458
2026-05-30 00:32:54 +02:00
Britandcan1357 7a3d027276 fix(tui): replayed scrollback on prompt submit 2026-05-30 00:27:04 +02:00
Can BölükandGitHub 923dafcf62 Merge pull request #1502 from ZergRocks/fix-tui-native-visible-width
Fix TUI width, editor inserts, and Ghostty cursor trails
2026-05-30 01:21:55 +03:00
Can BölükandGitHub 01e046bbe6 Merge pull request #1517 from ForeverYoungPp/feat/cache-hit-rate-segment
feat: support DeepSeek prompt cache format and add cache hit rate segment
2026-05-30 01:20:41 +03:00
Can BölükandGitHub 0ff4596b78 chore: remove cache_hit from defaults 2026-05-30 00:20:19 +02:00
ian_p 674698546d feat: support DeepSeek prompt cache format and add cache hit rate segment
- Added prompt_cache_hit_tokens / prompt_cache_miss_tokens parsing in
  parseChunkUsage for DeepSeek's prompt cache format where
  prompt_tokens = hit_tokens + miss_tokens.
- DeepSeek formula: input = prompt_tokens - hit_tokens (= miss, billed input),
  total = input + output + hit_tokens (avoid double-counting miss in cacheWrite).
- Added cache_hit status line segment showing cache hit rate:
  rate = cacheRead / (cacheRead + cacheWrite) x 100%.
- Added cache_hit to all status line presets.
2026-05-30 06:12:18 +08:00
Can BölükandGitHub 9598b75c26 Merge branch 'main' into feat/sticky-todo-live-window 2026-05-29 15:07:44 +03:00
changhee.an 91ce2ac4af Suppress Ghostty input cursor glyph trails
Ghostty/cmux continued to show trails after hiding the hardware cursor because OMP switched to a blinking software cursor glyph. Keep editor cursor markers enabled when hardware cursor display is requested, but hide the actual hardware cursor on Ghostty; this gives the TUI a cursor position without emitting any cursor glyph. Also preserve the history-anchor cursor exit before public insertText, as flagged in PR review.

Constraint: Ghostty leaves visible trails for both hardware bar cursors and blinking software cursor cells during rapid input-row repaints.

Rejected: Only removing SGR blink | PTY writes still emitted the cursor glyph, so glyph afterimages could still accumulate.

Rejected: Ignoring the PR comment | public insertText callers bypass typed-character history-exit behavior.

Confidence: high

Scope-risk: moderate

Directive: Keep cursor-marker mode separate from actual hardware cursor visibility; callers that decide editor rendering must not use getShowHardwareCursor as a proxy.

Tested: bun test packages/tui/test/editor.test.ts packages/tui/test/render-regressions.test.ts; bun test packages/tui/test/*.test.ts; bun run check; Ghostty-env PTY capture of installed omp while typing abcdef emitted zero cursor-show writes, zero blink SGR, and zero input cursor glyph bytes before shell restore.
2026-05-29 19:25:48 +09:00
can1357 f852d8763f Merge remote-tracking branch 'H4vC/main' 2026-05-29 12:21:11 +02:00
oldschoola 98fdcdcf63 feat(coding-agent): live cube, fuzzier matcher, auto-checkmark, close animation
Four refinements to the sticky Todos panel on top of the live SessionObserverRegistry linkage:

- Cube animates whenever any visible open todo is "live" (in_progress, or a still-pending todo with a matching in-flight subagent). The previous subagent-only gate left lone in_progress rows on the static '⟳' fallback; ticking on an orphan in_progress row is the correct "still open" signal.
- 'normalizeForTodoMatch' now collapses any non-alphanumeric run to one space, so subagent descriptions with '#', '.', ':' etc. match todo content that omits the punctuation. Fixes the case where 3 subagents were spawned but only 2 of 3 matching todos lit up because the matcher's normalizer collapsed whitespace but left '#' intact.
- New '#reconcileTodosWithSubagents' runs on every observer-registry change and auto-checkmarks any pending/in_progress todo whose content matches a 'status === "completed"' subagent description. Failed/aborted subagents intentionally don't auto-flip - those stay open for the user (or next agent turn) to decide.
- All-done close animation: when every visible task is closed, fold the panel away over ~1.4s. A 900ms celebratory frame holds the bright bold "Todos ✓" header so the user can read the final checkmarks, then a fade through 'muted' / 'dim' with rows progressively dropped from the bottom. '#todoClosingState' state machine plays the animation exactly once per open->all-closed transition and aborts cleanly if a new open task arrives mid-animation.

Verification:
  bun test test/tools/todo-write.test.ts → 24 pass / 0 fail (one new case for # punctuation tolerance)
  bun run check                          → biome + tsgo clean
2026-05-29 02:49:18 -07:00
oldschoola cea3ac53b0 feat(coding-agent): advance the sticky todo panel as tasks close
The always-on Todos panel above the editor pinned to the first 5 tasks of the active phase, so each todo_write flip mutated at most one row (color + strikethrough) and the +N more hint only shrank at end-of-phase. Marking task 1 done left tasks 6,7,... invisible until tasks 1-5 were all closed.

Introduce selectStickyTodoWindow(tasks, maxVisible=5) — returns up to 5 open (pending / in_progress) tasks in original phase order plus the count of remaining open tasks for +N more. When every task is closed, falls back to the trailing window (with +N more suppressed) so the panel keeps useful context until getActivePhase walks to the next phase. The collapsed branch of #renderTodoList now uses it; the expanded branch is untouched.
2026-05-29 00:16:36 -07:00
can1357 f874837d9c feat(coding-agent): added ultrathink keyword detection and prompt notice injection
- Added a new ultrathink mode module with standalone, case-insensitive detection, rainbow editor highlighting, and a hidden notice payload.
- Updated `CustomEditor` and the shared TUI `Editor` to support optional zero-width text decoration and apply the `ultrathink` styling during input rendering.
- Extended `AgentSession` prompt handling to append the hidden ultrathink notice after user turns in both streaming and non-streaming message flows, excluding synthetic messages.
2026-05-29 07:12:43 +02:00
Brit a8dabe2cf8 fix(tui): deferred native scrollback rebuilds 2026-05-28 15:45:33 +02:00
can1357 5053a6a4d3 fix(coding-agent): corrected coding-agent incomplete stop recovery logic
- Handled "incomplete" stop reasons in session recovery and auto-compaction workflows.
- Dropped the prior assistant turn before attempting recovery on incomplete-length stops.
- Expanded auto-compaction reason types and triggers to include "incomplete".
- Updated internal URLs parsing internals, export order, tests, and Obsidian URI prompt docs.
2026-05-28 10:10:34 +02:00
can1357 c1fa0e9f50 refactor(agent): replaced keepalive utility with disposable EventLoopKeepalive
- Replaced the `keepaliveWhile` Promise wrapper with a new `EventLoopKeepalive` class that registers and disposes an interval timer through `Symbol.dispose`.
- Updated `Agent` to instantiate `EventLoopKeepalive` via `using` during prompt execution instead of manually managing an interval.
- Wrapped interactive mode's await path with the new helper and removed redundant `keepaliveWhile` usage from the CLI entrypoint.
2026-05-28 09:51:57 +02:00
can1357 7dd00c015b feat: hashline improvements for spark
- Redesigned hashline patch syntax from anchor-based (`A-B:`) to hunk-header format (`@@ A..B @@`) with unified-diff compatibility.
- Removed `autoDropPureInsertDuplicates` option and simplified apply behavior to preserve duplicated boundary and context lines.
- Changed repeat operator from `^A-B` to `&A..B` and range separator from `-` to `..` for consistency with hunk-header syntax.
- Added image resizing and dimension notes to eval tool output; improved write tool hashline header sanitation for legacy formats.
- Removed 521 lines of boundary-duplicate absorption code and simplified parser to auto-convert bare body rows and unified-diff contamination.
2026-05-28 03:06:52 +02:00
can1357 7c64576524 feat(hashline): replaced file-hash anchors with opaque snapshot-store tags
- Replaced 4-hex content-derived file hashes with 3-hex opaque tags minted by InMemorySnapshotStore, making tags session-bound pointers rather than content fingerprints.
- Removed lru-cache dependency; replaced LRU-bounded per-path rings with a flat 4096-slot global ring using a scrambled permutation to prevent LLM tag extrapolation.
- Made SnapshotStore required in Patcher (was optional); tag resolution now drives stale-anchor detection instead of recomputing hashes at apply time.
- Changed literal payload sigil from `|` to `+` and accepted `^A` shorthand for `^A-A`; added lenient recovery for bare bodies, lone `-` rows, and overlapping bare/concrete block pairs.
2026-05-28 01:00:23 +02:00
metaphorics b76f39d3a6 fix(coding-agent): reopen approved plan on plan-mode reentry
Patch axis: extend

Displacement: net-zero; reuses existing plan reference state instead of adding persistence or overwriting approved artifacts

Rule violations averted: no approved-plan overwrite, no transcript format migration, no public CLI/API expansion

PASS/FAIL: PASS after plan-mode focused tests and package check. Note: system-prompt-templates has an unrelated HOME=/tmp path-shortening expectation failure.
2026-05-27 16:32:40 +00:00
can1357 ff94f91104 feat: added extraBody support, xAI fixes, and image provider updates
- Added `extraBody` merging into OpenAI Responses request params.
- Fixed xAI OAuth redirect URI to fail fast on port conflicts.
- Exposed `antigravity` and `xai` as explicit `providers.image` options.
- Added `isImageProviderPreference` guard, replacing inline string checks.
- Fixed TTS tool to resolve output path relative to cwd and require write approval.
2026-05-27 15:20:55 +02:00
can1357 6643178d6a refactor: replaced instanceof Promise checks with isPromise utility
- Imported isPromise from node:util/types in four modules.
- Replaced four instanceof Promise checks with isPromise calls for more reliable promise detection.
2026-05-27 13:02:52 +02:00
can1357 6f33af09b8 fix(coding-agent/modes): resorted filtered model matches by MRU ordering
- Added optional skipRoleRank controls to model and canonical-model sort helpers to make role ranking conditional.
- Re-sorted fuzzy-filtered model and canonical model results with role rank skipped so stronger query matches are not outranked by weak default-role matches.
2026-05-26 22:50:38 +02:00
can1357 39299597f2 fix(coding-agent/modes): preserved fuzzy relevance ordering when filtering models
- Removed post-filter re-sorting for canonical model matches so fuzzyFilter's relevance order is preserved.
- Stopped reapplying role, MRU, and version sorting after fuzzy filtering canonical and non-canonical models.
- Documented the stable-sort rationale so fuzzy text relevance remains the primary ordering.
2026-05-26 21:56:09 +02:00
Can BölükandGitHub 8448a67602 Merge pull request #1374 from superhedge22/fix-review-enter-submit
Fix /review custom instructions submission
2026-05-26 21:40:15 +03:00
can1357 8a32eceb53 fix(utils): clamped usage durations to suppress stale negative reset countdowns
- Clamped `formatDuration` to return `0ms` for non-positive, NaN, or infinite inputs.
- Updated usage report rendering to suppress reset countdowns when `resetsAt` is absent or no longer in the future.
- Added unit tests for `formatDuration` covering clamped values and standard duration formatting.
2026-05-26 20:22:25 +02:00
Can BölükandGitHub 0e1807a49c Merge pull request #1407 from faizhasim/oauth-path-prefix-fix
feat(coding-agent): support OAuth discovery for path-prefixed auth servers behind gateways
2026-05-26 21:20:29 +03:00
Brit 884980bafa feat(settings): highlighted changed settings 2026-05-26 17:40:19 +02:00
Mohd Faiz Hasim 96d4a4ce3b Merge branch 'main' of github.com:can1357/oh-my-pi into oauth-path-prefix-fix 2026-05-26 22:53:11 +08:00
Mohd Faiz Hasim 5be0f01a91 feat(coding-agent): support OAuth discovery for path-prefixed auth servers behind gateways
- Extract resource_metadata URL from WWW-Authenticate and follow RFC 9728 chain
- Add buildWellKnownUrls with path-prefixed well-known fallback for gateways
- Fix resolveRegistrationEndpoint to try path-prefixed well-known (was missing await)
- Support relative Mcp-Auth-Server URL resolution against server URL
- Pass resourceMetadataUrl through all discoverOAuthEndpoints call sites
- Add comprehensive tests for path-prefixed, resource_metadata, and relative URL flows
2026-05-26 22:50:32 +08:00
can1357 796c437dc1 feat: overhauled stream timeout and eval session management
- Replaced external watchdog timers with per-request SDK timeouts for first-event budget across OpenAI, Anthropic, and Azure providers.
- Keyed Python shared kernels by (sessionId, cwd) to prevent cross-directory state bleed.
- Deduplicated concurrent cold-start session acquisition for JS and Python executors.
- Moved `isOpenAIResponsesProgressEvent` to shared module and scoped display output routing per run for interleaved async cells.
2026-05-26 16:49:11 +02:00
can1357 5364a9bfd0 refactor(tool-discovery): simplified tool discovery API by removing MCP-specific shims
- Removed deprecated MCP-specific type aliases and functions from tool-discovery module, consolidating to unified generic tool discovery API.
- Migrated session and SDK code to use generic filterBySource() and collectDiscoverableTools() instead of MCP-specific variants.
- Removed deprecated interface members including hasQueuedMessages(), FocusPane, AcpBuiltinCommandRuntime, and legacy settings methods.
- Updated test suites to use renamed generic discovery methods and removed back-compat test coverage for legacy MCP shapes.
2026-05-26 15:27:05 +02:00
roboomp e6a88fa9c0 fix(tui): cleared history after slash new
Avoid rendering the pre-reset transcript during /new and force the final new-session frame through the clear-scrollback path so the cursor and prompt land with the replacement transcript.

Fixes #1295
2026-05-25 18:54:22 +00:00
SuperHedge 70e873aa8d Fix review custom instructions submission 2026-05-25 20:48:46 +02:00
roboomp aec33a2f7b fix(tui): cleared history on session replacement
Add an explicit clear-scrollback render option for intentional transcript replacement and use it when switching, branching, reloading, or creating sessions. Regular active redraws continue to preserve terminal scrollback.

Fixes #1295
2026-05-25 18:44:22 +00:00
can1357 d6acef8b76 perf(status-line): replaced index-based token cache with message sidecar cache
- Added Symbol-keyed sidecar on each AgentMessage to memoize estimateTokens, with a cheap content fingerprint to detect in-place mutations.
- Fixed stale cache on same-length replaceMessages, post-hoc error attachment, and branch rebuild edge cases.
- Fixed usage fetch error backoff: stamped fetchedAt on failure so the 5-min TTL also gates retries during outages.
- Extracted computeNonMessageBreakdown as shared helper to prevent drift between status-line and context panel token counts.
2026-05-25 14:06:05 +02:00
can1357 1b58e484ab chore(coding-agent): remove unused status-line segment editor 2026-05-25 12:55:48 +02:00
roboompandcan1357 294f0067d0 fix(tui): refreshed model tabs by provider id
Separated model selector provider tab labels from provider ids so human-readable labels like Ollama Cloud refresh and filter the underlying ollama-cloud models.

Fixes #1153
2026-05-25 12:25:12 +02:00