Commit Graph
96 Commits
Author SHA1 Message Date
Paulo Camopy bf345d9920 fix(coding-agent): avoid placeholder crash before theme init 2026-06-14 14:45:25 -03:00
can1357 d4f6d39d88 Merge remote-tracking branch 'origin/farm/bbef5632/fix-theme-session-export-with-custom-lig' 2026-06-14 17:10:19 +02:00
roboomp b3e1173bb5 fix(theme): aligned export text with export surface
Derived HTML default text from the resolved export card/page surface, falling back to the derived user-message export base when themes omit export overrides.

Covered light-status custom themes whose dark userMessageBg drives derived export backgrounds.

Fixes #2516
2026-06-14 07:26:15 +00:00
can1357 ca779a9eef Merge PR #2519: classify HTML export theme defaults by status-line luminance 2026-06-14 03:32:54 +02:00
metaphorics ee45472c05 fix(coding-agent): memoize tool-result rendering to stop per-frame re-shape stalls
ToolExecutionComponent.#updateDisplay() re-ran renderResult (O(result-size)) on every invalidate - spinner ticks, stream chunks, resizes, keystrokes - so large results blocked the loop for seconds and typing lagged. It now early-returns on an unchanged dirty key (result version, expanded, partial, spinner frame, image visibility, theme epoch), and theme.ts exposes getThemeEpoch() bumped on every theme swap so cached blocks re-render on theme change.
2026-06-14 08:23:57 +09:00
roboomp 9e90d23168 fix(theme): classify HTML export defaults by status-line luminance
The HTML session export rendered empty text tokens (text, userMessageText,
customMessageText, toolTitle) as the dark-theme grey #e5e5e7 on every theme
whose name was not literally 'light'. getResolvedThemeColors picked
defaultText off name === 'light', and the standalone isLightTheme helper
classified on userMessageBg — both diverged from Theme.isLight, which has
classified on statusLineBg since porcelain proved userMessageBg unreliable.

Factor the status-line luminance into isLightThemeJson(themeJson) and route
both helpers through it. defaultText now falls back to #000000 on every
light theme (sandstone, limestone, porcelain, light, …) and to #e5e5e7
elsewhere, matching Theme.getColorHex.

Regression test extends test/theme-islight.test.ts with the standalone
helper and getResolvedThemeColors HTML-default coverage for sandstone +
dark.

Fixes #2516
2026-06-13 21:58:26 +00:00
can1357 64aa558e62 chore: consistency 2026-06-13 00:03:27 +02:00
can1357 c938fe4d27 feat(coding-agent): added focused subagent session mode for main-agent hub navigation
- Added a SessionFocusController to switch transcript and input context between main and subagent sessions.
- Added agent-hub Enter activation and double-left return behavior for focused local agents.
- Added view-session-based event and render logic to avoid stale focus-session state.
- Added status-line focused agent display with ghost icon and focused-mode border dimming.
2026-06-12 15:37:56 +02:00
can1357 35d3afc929 feat(coding-agent): refactored usage command into show/reset subcommands
- Added `handleUsageResetCommand` support to list and redeem usage reset credits.
- Refactored `/usage` into `show` and `reset` subcommands and removed `/reset-usage`.
- Handled ACP/TUI `/usage` flows so `show` reports usage and `reset` redeems credits.
- Kept selected theme setting values dirty-colored while selected in the UI list.
2026-06-12 06:18:44 +02:00
can1357 557c79f72c fix(coding-agent): stabilized subagent HUD ordering by parent and spawn index
- Added `parentToolCallId` and `index` fields to subagent session records and propagated them from task lifecycle and progress events.
- Reworked subagent ordering to sort by parent-group order, spawn index, and stable creation order so out-of-order updates no longer reshuffled active HUD rows.
- Updated task execution to pass spawn indices through sync and async paths, switched the `tool.task` icon to Octicons tasklist, and added a registry test for out-of-order progress ordering.
2026-06-12 05:57:54 +02:00
can1357 c35b41ed41 feat(coding-agent): added mouse-driven /settings overlay navigation across tabs and sections
- Added mouse hover, wheel, and click routing for `/settings` rows and tabs.
- Changed `/settings` to open as a fullscreen alternate-screen overlay.
- Added hover, hit-testing, and wheel APIs across TabBar, SelectList, and SettingsList.
- Added SGR mouse parsing plus `routeMouse` dispatch and exported it from the `tui` entrypoint.
2026-06-12 03:27:50 +02:00
Can BölükandGitHub 5a2a33658a Merge pull request #2256 from H4vC/accent-colors
session accent: derive from theme mode with collision avoidance
2026-06-12 02:36:45 +02:00
can1357 c276cd6eff feat(coding-agent): reorganized /settings into titled sections with a sidebar layout
Also normalizes setting labels/descriptions and carries the package changelog entries for this batch (adjacent unreleased bullets are not splittable per commit), restoring section placement disturbed by the two prior changelog hunks.
2026-06-12 02:33:48 +02:00
can1357 b2b213f394 Merge PR #2310: Avoid transient syntax highlight work 2026-06-11 17:54:23 +02:00
can1357 43238ce49a ux(coding-agent/modes): updated status line job indicator to use a dedicated icon
- Added a new `icon.job` symbol entry to all symbol sets and exposed it on the theme icon map.
- Updated the status line to render running background jobs with the new job icon and count instead of the previous text label.
- Reordered the job status segment insertion so the job indicator is added to the leading position in the right-side parts.
2026-06-11 16:58:49 +02:00
ben 8a55ce7b85 Use supplied theme for LSP hover highlighting 2026-06-11 22:41:06 +08:00
can1357 9df951d667 Merge remote-tracking branch 'origin/farm/232e592f/fix-thinking-autopending-icon' 2026-06-10 21:50:38 +02:00
roboomp dab23f76a4 fix(tui): replaced thinking.autoPending question-mark glyphs with loading indicators
The status-bar auto-thinking pending indicator used `?`-bearing symbols
in all three presets (`▣?` Unicode, nf-md-help_box Nerd Font, `[?]`
ASCII), which is visually indistinguishable from a terminal missing-
glyph fallback. Users assumed the icon was broken and toggled presets
to no effect.

Replaced each preset with an unambiguous loading indicator:
- Unicode: `⟳` (Clockwise Open Circle Arrow)
- Nerd Font: `\uf1ce` (fa-circle-o-notch)
- ASCII: `[~]`

Fixes #2267
2026-06-10 19:27:19 +00:00
can1357 2b28816010 feat(coding-agent): replaced session observer with Agent Hub and inline compaction divider
The session-observer overlay is gone. The Agent Hub (ctrl+s, alt+a, or double-tap left arrow on an empty editor) presents one overlay with two views: a live registry table (status, unread irc count, current task, last activity; j/k to navigate, r to revive, x to abort/release) and per-agent chat (transcript + input line) — submitting revives a parked agent and steers it via the normal prompt path. Main is the ambient chat and stays out of the table.\n\nrenderInitialMessages no longer takes a prebuilt context: every redraw now reaches for AgentSession.buildTranscriptSessionContext() (full-history transcript with each compaction emitted inline at the point it fired, snapcompact frames re-attached on rebuild). UiHelpers drops the deferred-compaction render and the IRC autoreply branch that the new mailbox bus deprecated. CompactionSummaryMessage renders as a slim divider (── 📷 compacted · ctrl+o ──), expanding to the summary + snapcompact frame count. session-manager.buildSessionContext gains a { transcript: true } mode; an exported buildSessionContextFromFile() reads a session file without taking the writer lock so the hub chat view can tail any agent (parked or live). Theme picks up icon.camera + tool.irc symbol entries.
2026-06-10 17:51:42 +02:00
Brit 0160d0dbf2 session accent: derive from theme mode with collision avoidance
- Dark themes: warm hues (0-120), Light themes: cool hues (180-300)
- Collision check against 17 major theme colors with 10° threshold,
  clamped to the hue band so it never drifts into an unrelated range
- Hex values stored at construction instead of round-tripping through
  ANSI escape parsing (removes #ansiToHex)
- WCAG AA contrast bisection on light surfaces
- Per-session uniqueness via name hash within the hue band
2026-06-10 14:12:07 +02:00
can1357 bda3102451 ux(coding-agent): updated status glyphs and fixed extension model discovery refresh
- Added status.done and tool.* symbols to theme mappings and presets.
- Replaced generic success glyphs with contextual +/-, tool icons, and warnings.
- Mapped tool/task/job completions to status.done or status.enabled with icon overrides.
- Triggered runtime provider refresh after extension registration and warned on failure.
2026-06-08 18:28:15 +02:00
can1357 1b2373425b feat(packages/coding-agent): set 30fps stream and stabilized read groups
- Reduced shimmer-driven UI animations and borders to a 30fps cadence.
- Collapsed consecutive read tool calls into one finalized transcript block.
- Tracked visible assistant content to finalize and reset read groups correctly.
- Updated running task rows to static bullet markers with shimmer-only subagent labels.
2026-06-07 08:42:51 +02:00
can1357 eedf9bc6a8 feat(search-tooling): added search-tool icon lists with framed output
- Added `icon.search` to theme symbol maps and used it for Search, Find, AST Grep, and BM25 success headers.
- Reworked `searchToolBm25Renderer` results into framed bullet lists with expand-item hints.
- Updated renderer tests to match the new search-tool output contract.
2026-06-07 05:13:58 +02:00
can1357 8b077cde58 perf(coding-agent): memoized native syntax highlighting
- Cached (lang, code) highlight output via LRU, invalidated on theme change.
- Stopped re-tokenizing unchanged code through Rust FFI every render frame.
- Prevented TUI freeze from animated tool blocks overrunning the frame budget.
2026-06-06 15:00:33 +02:00
Can BölükandGitHub a6997b1b7f Merge branch 'main' into fix/session-accent-light-contrast 2026-06-04 06:28:21 +03:00
can1357 1379772628 refactor(utils): consolidate color utilities into pi-utils
Move the color math added for the session-accent fix into the shared
@oh-my-pi/pi-utils color module instead of a coding-agent-local file:

- colorLuma, relativeLuminance, and hslToHex now live in
  packages/utils/src/color.ts (hslToHex lifted out of session-color.ts).
- Drop the duplicate hex parser: toRgb reuses the existing hexToRgb and
  paletteToRgb returns the shared RGB type, so hex parsing lives once.
- Delete packages/coding-agent/src/utils/color.ts; theme.ts and
  session-color.ts import from @oh-my-pi/pi-utils.
- Move the color unit test into the utils package; repoint session-color
  test imports.

No behavior change to accent luminance capping.
2026-06-04 05:27:11 +02:00
can1357 9a544b6ee0 feat(coding-agent): added radio markers for single-choice ask options
- Rendered single-choice questions with circular radio glyphs instead of checkboxes.
- Kept rectangular checkboxes for multi-select questions.
- Added radio.selected/unselected symbols to unicode, nerd-font, and ASCII presets.
2026-06-03 22:21:06 +02:00
Paweł J. Wal 34e8a79994 Opus: fix(tui): use WCAG relative luminance for accent contrast caps
Per review on #1715: the cap fed gamma-encoded luma into the WCAG contrast formula, so the >=3:1 target wasn't real (light-poimandres #340df2 was ~2.5:1 actual). Split the color helpers into colorLuma (perceptual, for light/dark classification — unchanged behavior) and relativeLuminance (WCAG-linearized sRGB, for contrast ratios). Session accents are now sized, and tests asserted, against relativeLuminance, so >=3:1 holds against the actual surface. Theme keeps luma for isLight/isLightTheme and exposes the WCAG status-line luminance for the cap.
2026-06-02 17:07:05 +02:00
Paweł J. Wal 1c78f19c93 Opus: fix(tui): size session accent by status-line contrast, not a fixed cap
Per review on #1715: the light-theme cap was a fixed absolute luminance (0.2) tuned for near-white backgrounds. On a mid-light shipped theme like light-poimandres (statusLineBg #7390aa, luminance ~0.55) that still left accents at only ~1.8-2.4:1. Theme now exposes statusLineLuminance + accentSurfaceLuminance; getSessionAccentHex takes the surface luminance and caps the accent to guarantee >=3:1 (WCAG AA large) against the actual surface, so near-white and mid-light light themes are both legible. Tests assert contrast across light + mid-light surfaces.
2026-06-02 16:53:01 +02:00
Paweł J. Wal e58863238e Opus: fix(tui): classify numeric (256-palette) theme backgrounds
Per review on #1715: theme color values may be a 256-color palette index (colorValueSchema = string | number), so a custom theme can set a light statusLineBg numerically (e.g. 15 = white). bgIsLight only handled hex strings and returned false for numbers, routing those light themes through the dark-accent path and reintroducing the unreadable accent. Add paletteLuminance (0-15 xterm defaults, 16-231 color cube, 232-255 grayscale) and a colorLuminance(string|number) dispatcher; route bgIsLight and isLightTheme through it. Tests added.
2026-06-02 16:19:08 +02:00
Paweł J. Wal 4856c1dd3b Opus: refactor(tui): unify accent luminance math, accept #rgb shorthand
Per review on #1715 (nits 3 & 4): the BT.709 relative-luminance + #rrggbb parsing was duplicated three ways (session-color relativeLuminance, theme bgIsLight, isLightTheme), and each rejected #rgb shorthand via length !== 7 — so a custom theme using shorthand backgrounds silently kept the washed-out accent. Lift it into utils/color.ts hexLuminance() (accepts #rgb and #rrggbb), route all three call sites through it, and add tests.
2026-06-02 15:41:16 +02:00
Paweł J. Wal 405b1006e3 Opus: fix(tui): classify session accent by statusLineBg, not userMessageBg
Per review on #1715: Theme.isLight drove accent darkening from userMessageBg, but the accents render on the status line / editor chrome. Themes that style the chat bubble darker than the status line (e.g. built-in porcelain: userMessageBg #5070a0, statusLineBg #f8f9fc) misclassified, leaving the bright dark-theme accent on a light status line. Derive isLight from statusLineBg; add a regression test over porcelain / light-catppuccin / dark-catppuccin.
2026-06-02 15:32:45 +02:00
Paweł J. Wal 06eb1d709f Opus: fix(tui): cap session accent luminance on light themes
The status line session_name (plus editor border / gap fill) colors itself with a per-session accent hashed from the name via hslToHex(hue, 0.9, 0.72). The fixed lightness is tuned for dark backgrounds; on light themes high-luminance hues (yellow/lime/cyan) render near-invisible (~1.3:1 contrast). statusLine.sessionAccent (#918) only gates the border/gap fill, not the segment text, so there was no way to make the title legible on a light theme.

Add Theme.isLight (from userMessageBg luminance) and make getSessionAccentHex bisect lightness to cap perceived luminance on light themes, keeping the per-session hue while staying readable. Pass theme.isLight at all four accent call sites; add a unit test.

Refs #918, #680.
2026-06-02 15:09:02 +02:00
Can BölükandGitHub b2175bf581 Merge pull request #1555 from can1357/farm/aeb6ba9d/make-indicator-glyphs-and-colorizing-con
feat(theme): make spinner frames overridable per custom theme
2026-06-01 18:21:11 +03:00
can1357 7f866a48a8 feat(coding-agent): added per-turn AUTO_THINKING in coding-agent session
- Added AUTO_THINKING as a configured thinking level in settings, schema, SDK, and session plumbing.
- Implemented per-turn auto reasoning classification with online/local prompts, effort clamping, and skip guards.
- Updated model selectors, ACP options, footer/status UI, and events to render auto and auto->resolved states.
- Added AUTO_THINKING parse/clamp tests and fixed local-module cycle and hashline preview regressions.
2026-05-31 03:32:21 +02:00
can1357 7e2971b1f6 ux(coding-agent/modes): introduced shared segment track renderer for model and role views
- Added a shared `renderSegmentTrack` helper to render colored segment tracks with a filled active chip style.
- Updated hook selector and role-cycle status-line rendering to use the shared track renderer and aligned role-cycle output.
- Added contrast text-color logic to `Theme` so active chip labels stay legible across fill colors.
2026-05-31 00:53:19 +02:00
can1357 5f63165637 feat(setup-wizard): added interactive onboarding wizard on first launch
- Added setup wizard with provider login, glyph mode, and theme scenes shown once per setup version.
- Wired `omp setup` (no args) to trigger the wizard in a TTY; `--check`/`--json` still show help.
- Extracted `gradientEscape` and exported `PI_LOGO`/`ShineConfig` from welcome for shared use in splash/outro.
- Fixed race condition in `setSymbolPreset`/`setColorBlindMode` by tracking load request IDs.
2026-05-31 00:07:14 +02:00
roboomp 2eab0644d7 feat(theme): make spinner frames overridable per custom theme
Adds a `symbols.spinnerFrames` field to the custom theme JSON schema so themes can override the loader/tool-execution spinner that drives `theme.spinnerFrames` / `theme.getSpinnerFrames(type)`. Accepts either a flat `string[]` (used for both spinner types) or an object `{ status?, activity? }` to override each type independently; anything not specified falls back to the active symbol preset (unicode/nerd/ascii). The override is plumbed through `createTheme` and the `Theme` constructor, normalized via `normalizeSpinnerFramesOverride`, and read in `getSpinnerFrames`.

Mirrors the field in `theme-schema.json`, documents it in `docs/theme.md`, and adds a test covering flat-array, per-type, validation-rejection, and preset-fallback paths.

Fixes #1553
2026-05-30 20:59:35 +00: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
Brit 884980bafa feat(settings): highlighted changed settings 2026-05-26 17:40:19 +02:00
can1357 6943b5baa3 chore: reformat 2026-05-25 12:17:30 +02:00
Leo Kimandcan1357 7d0987bc61 feat(coding-agent): add status-line usage segment and thinking.max symbol
- New 'usage' status-line segment showing Anthropic 5h/7d quota
- Background refresh (5min TTL) via fetchUsageReports
- thinking.max symbol added to UNICODE_SYMBOLS

Personal patch consolidated into branch.
2026-05-25 12:11:15 +02:00
can1357 2867e1f4e3 feat(deps): added pi.zod exports and removed TypeBox package exports
- Added canonical `pi.zod` schema API exports and removed TypeBox package exports/imports.
- Migrated Tool schema typing from TypeBox to shared `TSchema`/Zod flow with legacy TypeBox compatibility.
- Updated AI provider adapters and MCP/agent builders to convert tool params through `toolWireSchema()`.
- Reworked schema validation from AJV to Zod-safe parsing with `fromTypeBox`, `toolWireSchema`, and meta schema checks.
2026-05-15 14:46:54 +02:00
can1357 ba2928da6b feat(coding-agent): added scratch-directory handling to status-line path segment
- Updated the status-line path segment to detect project directories under OS scratch roots and strip the scratch root when rendering.
- Switched scratch-root paths to use the new icon.scratchFolder glyph and registered that symbol across theme variants.
- Added tests covering scratch-root trimming, nested scratch subpaths, and non-scratch fallback icon behavior.
2026-05-15 00:47:05 +02:00
can1357 933058a241 feat(goals): added per-session goal mode with token budget tracking
- Added GoalRuntime with wall-clock and token accounting, budget steering, and lifecycle operations (create, pause, resume, drop, complete).
- Exposed goal tool as a hidden agent tool, activated only when goal mode is enabled.
- Integrated goal continuation loop in InteractiveMode with auto-submit between turns.
- Added status line segment and theme icons for goal mode state.
2026-05-14 06:40:41 +02:00
can1357 f1f6516056 refactor: reorganized exports and removed obsolete helper branches
- Removed export leakage by demoting many helper and const symbols to module-local scope.
- Renamed underscore-prefixed internals and cache fields, then updated related references and `satisfies never` checks.
- Deleted obsolete logic branches and helpers, including harmony-stream interruption flow and unused benchmark runtime helpers.
- Updated Biome config and manifests by broadening lint coverage and removing an unused `@napi-rs/cli` dev dependency.
- Adjusted tests and utilities to use renamed test helpers and remove redundant private test-only helpers/locals.
2026-05-14 04:36:19 +02:00
can1357 a4d86a075a feat(coding-agent): added verbatim unicode rule to hashline prompt 2026-05-12 05:25:55 +02:00
can1357 ce2a109c09 feat(coding-agent): added hindsight memory backends and tools
- Added `memory.backend` and `hindsight.*` settings schema with migration from `memories.enabled` legacy mode.
- Added Hindsight memory backend runtime modules for resolved config, client creation, bank ID derivation, and state lifecycle.
- Added off/local/hindsight backends and resolver wiring across SDK, commands, and compaction context.
- Added `hindsight_recall`, `hindsight_reflect`, and `hindsight_retain` tools with schema validation and backend gating.
- Added Memory tab metadata and symbols to expose backend selection in the settings UI.
- Added package export barrels and tests for bank ID, content formatting, and hindsight config env precedence.
2026-05-03 07:39:52 +02:00
Can BölükandGitHub 57e912e462 Merge pull request #822 from metaphorics/perf/markdown-global-render-cache
perf(tui): module-level LRU for Markdown render cache
2026-04-30 03:39:59 +02:00
can1357 4f45cf1fb4 feat(coding-agent/modes): added loop mode command and status-line mode segment support
- Added loop-mode command handling in interactive mode, including enable/disable toggling, repeated auto-submission scheduling, and Escape-based cancellation.
- Propagated loop mode state to the status line via a renamed `mode` segment that now renders plan or loop status, and updated presets/theme assets for the new loop icon.
- Migrated persisted status-line segment usage from `plan_mode` to `mode` in configuration defaults and normalization so legacy settings continue to load.
2026-04-29 16:55:14 +02:00