pi-claude-code-ui 1.0.69

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 ADDED
@@ -0,0 +1,177 @@
1
+ # Changelog
2
+
3
+ ## 1.0.69 — 2026-07-17
4
+
5
+ ### Changed
6
+
7
+ - **Package rename** — npm package is now `pi-claude-code-ui` (was `pi-claude-style-tools`). Install with `pi install npm:pi-claude-code-ui` (or your usual npm/pi install path).
8
+ - **Claude-style status dots** — pending markers no longer fall back to a hollow outlined `○`. They now blink as a bold filled `●` that is either solid or fully gone (space-kept alignment), matching Claude Code.
9
+ - **Heavier (not huge) dots** — success/error/pending use bold `●` (not oversized `⬤`) so they read a bit larger without dominating the tool title.
10
+ - **Bare branch connectors** — tree leads use `├` / `└` with no horizontal `─` arm, including Magic Context todo overlay rows (armed `├─` / `└─` input is normalized to bare).
11
+
12
+ ## 1.0.68 — 2026-07-15
13
+
14
+ ### Changed
15
+
16
+ - **Snappier spinner glyphs** — loader frame interval `250ms → 170ms` so `· ✢ ✳ ✶ ✻ ✽` cycles feel more lively while working.
17
+ - **Bigger verb pool** — many more whimsical working verbs (debugging, refactoring, brainstorming, overthinking, …) so the status line repeats less often.
18
+
19
+ ### Fixed
20
+
21
+ - **Stale tool-group headers / weird counts** — settled `ToolGroupComponent` rows no longer keep serving a cached header after a child tool finishes or updates. Child mutations now mark only the parent group dirty (no sibling cascade), so counts like `N running` clear immediately instead of lingering until the next tool/message.
22
+ - **Long-chat tool-group re-render cost** — fully-settled groups memoize their rendered lines and skip child walks on warm frames (scroll, spinner, expand elsewhere). This was the main remaining long-history regression vs stock pi when `groupToolCalls` is on.
23
+ - **Preview styling O(output)** — `buildPreviewText` now styles only the lines that will be shown; bash finished/collapsed paths collect a tail (or count-only) instead of materializing every non-empty line; live previews reuse the single-pass collector.
24
+ - **Todo overlay hot path** — non-todo containers bail after the first non-empty line instead of scanning every rendered line on every frame.
25
+ - **Shiki cache across turns** — `hlCache` is no longer wiped on every `turn_end` (still cleared on session shutdown / theme rebind). Repeated expand/scroll of the same diffs no longer re-highlights from scratch each turn.
26
+ - **Session map cleanup** — `WRITE_EXISTED_BEFORE` is cleared on `session_shutdown` so long-lived agent processes don’t retain per-write entries forever.
27
+
28
+ ### Performance notes
29
+
30
+ Bench (`bun scripts/benchmark-tools.ts`, width 120):
31
+
32
+ | Case | baseline warm | full (this package) warm |
33
+ |------|---------------|---------------------------|
34
+ | assistant-history-120 | ~0.44 ms | **~0.09 ms** (faster than stock) |
35
+ | tool-history-120 (grouped) | ~0.43 ms | **~0.27 ms** (faster than stock) |
36
+ | tool-history-240 (grouped) | ~0.90 ms | ~1.2 ms (first-render still heavier due to outlines/diffs; warm path much closer) |
37
+
38
+ Cold/first render of rich tool chrome is still intentionally heavier than stock pi (borders, branch connectors, diff previews). Warm long-chat frames — the lag users feel while scrolling — are now at or below stock for assistant history and grouped tool history.
39
+
40
+ ## 1.0.67 — 2026-07-15
41
+
42
+ ### Fixed
43
+
44
+ - **Magic Context tool rendering** — `ctx_search`, `ctx_memory`, `ctx_note`, `ctx_expand`, `ctx_reduce`, and `todowrite` now use the same Claude-style tool rows as other external tools.
45
+ - **Todo overlay labels** — task IDs no longer display a leading `#`.
46
+ - **Hermes memory notice styling** — the auto-review notice now matches thinking text color and weight instead of applying additional ANSI dimming.
47
+
48
+ ## 1.0.66 — 2026-07-15
49
+
50
+ ### Fixed
51
+
52
+ - **Thinking presentation** — thinking text is no longer italic, visible thinking uses the `∴` marker, and collapsed “Thinking…” / “Thought for…” rows omit the marker while retaining the correct text indentation.
53
+ - **Hermes memory notice styling** — the `💾 Memory auto-reviewed and updated` notification is restyled locally as a translucent `✻ Memory auto-reviewed and updated`, without modifying the pi-hermes-memory extension.
54
+ - **Todo overlay alignment** — todo headings and task rows now have the missing indent, and their `├─` / `└─` connectors follow the configured tool branch color.
55
+
56
+ ## 1.0.65 — 2026-07-01
57
+
58
+ ### Fixed
59
+
60
+ - **Idle crash / "job failed" while pi sits stale** — leaked blink entries (a tool that completed without clearing, or a turn that ended without `turn_end`) kept the 500 ms blink timer re-arming forever, forcing full TUI re-renders twice a second while idle. Each re-render re-ran the layout and either tripped pi's render width-assertion (crash) or grew RSS until the OS killed pi (silent crash → Ghostty "job failed"). Added an `agent_end` clear and a 15 s staleness watchdog so leaked entries can't sustain the re-render loop.
61
+ - **Render width-assertion crash on wide content** — `clampLineWidth`/`padRenderedLineToWidth` now cap at `process.stdout.columns`, so the extension never emits a line wider than the real terminal even when pi hands it a too-wide width (e.g. content later placed in a narrower side panel).
62
+
63
+ ## 1.0.64 — 2026-07-01
64
+
65
+ ### Added
66
+
67
+ - **`read` on `SKILL.md` shows as `[skill]`** — paths ending in `SKILL.md` use the same `[skill]` label styling as custom skill messages (krikchaip).
68
+
69
+ ### Fixed
70
+
71
+ - **Finished tool rows no longer pulse as pending after reload** — only `isPartial` marks a row pending; missing `executionStarted` on history rows no longer triggers blink timers (krikchaip).
72
+ - **Tool row backgrounds after `/reload`** — strip the outer `Box` success background ANSI on rebuilt rows so transparent/outline mode stays clean (krikchaip).
73
+ - **Unmatched partial tool calls in old branches** — partial rows without `executionStarted` show a static muted dot instead of an endless pending blink (krikchaip).
74
+ - **Partial rows at tree-navigated leaves** — when the result lives off the selected branch, blink only while an agent is actually running; settled history renders as finished (green when succeeded) (krikchaip).
75
+ - **Duplicate bash expand hint** — finished bash rows keep “expand” on the summary line only; the preserved output preview no longer repeats it (krikchaip).
76
+
77
+ ## 1.0.63 — 2026-07-01
78
+
79
+ ### Fixed
80
+
81
+ - **Random crash on large diffs** — rendering a large edit or `apply_patch` could throw `RangeError: Maximum call stack size exceeded`. Root cause: the split/unified diff renderers computed the max line number via `Math.max(...diff.lines.map(...))`, spreading the *entire* diff line array as function arguments — fine for small diffs, but a stack overflow on diffs with thousands of lines. Replaced with a loop-based `maxLineNumber()` that returns identical results. No visual or behavioral change.
82
+ - **Shiki import no longer leaves a dangling rejected promise** — a failed `import("@shikijs/cli")` (missing dep, transient error) previously left a permanently-rejected promise that could surface as an unhandled-rejection crash under strict modes. The loader now resets on failure so the next render retries.
83
+
84
+ ### Changed
85
+
86
+ - **Lower CPU / heat during long-running bash** — the bash tool's live preview re-split and re-filtered the *entire* output on every partial update (bash throttles updates every ~100ms and the pending-dot blink re-invalidates every 500ms), scaling linearly with output size. It now collects only the visible tail lines and a total count in a single pass, so cost no longer grows with output length.
87
+ - **Bounded Shiki concurrency for multi-edit / multi-file diffs** — edit and `apply_patch` call-phase previews previously fired all syntax-highlighting jobs at once via `Promise.all`, causing CPU spikes on large multi-block diffs. They now run with a small concurrency cap (2), preserving ordered output.
88
+ - **Spinner no longer keeps running after the UI stops** — the 250ms Loader animation loop (and its `requestRender` calls) kept firing after the TUI was stopped. It now short-circuits and stops itself when the UI is stopped, so it can't keep the event loop or CPU alive as an orphan.
89
+ - **More timers `unref`'d** — the deferred chrome-rebind `setTimeout` (fired on `/resume` / `/new` / `/fork`) and the same-frame working-message `setTimeout` were not unref'd, keeping the Node event loop alive. Both now `unref` so they can't hold the process open or spin idle.
90
+
91
+ No functionality changed in this release — output is byte-identical for all existing cases; the diffs above are strictly CPU/stability improvements verified by `npm run typecheck` and `bun scripts/benchmark-tools.ts`.
92
+
93
+ ## 1.0.62 — 2026-06-22
94
+
95
+ ### Fixed
96
+
97
+ - **"Turn took" line no longer appears mid-stream** — the end-of-run status line was showing while the assistant was still streaming text. Root cause: the component render path gated on `message.stopReason === "stop"`, but the Anthropic provider initializes the live message's `stopReason` to `"stop"` at creation and only updates it to the real value when `message_delta` arrives near the end of the stream — so the gate was already true during streaming. The component path now gates on the `explicitDuration` flag stamped by the `message_end` handler (which fires after `message_delta`, once the real `stopReason` is known), so the line appears only after the stream truly closes. The `message_end` path was already correct (it fires post-`message_delta`); only the live component fallback was premature.
98
+
99
+ ## 1.0.61 — 2026-06-22
100
+
101
+ ### Changed
102
+
103
+ - **Renamed "Worked for" → "Turn took"** — the end-of-run status line now reads `✻ Turn took 2m 30s (Total time 1h 12m 30s · 14 turns)`. The session-total duration now always shows seconds and only adds minutes/hours once the session has actually lasted that long (e.g. `45s`, `12m 30s`, `1h 12m 30s`); the bracket label is now capitalized as "Total time".
104
+
105
+ ## 1.0.60 — 2026-06-22
106
+
107
+ ### Changed
108
+
109
+ - **"Worked for …" only on the true end of a run** — the line now appears only when the model finishes all of its turns for a prompt (`stopReason === "stop"`), instead of after every assistant message that didn't end in a tool call. Intermediate stops that pi retries through (`error`, `aborted`, `length`/max-tokens, compaction retries) no longer get a premature "Worked for" line — it shows once, when the model is actually done.
110
+ - **Session total + turn count on the Worked line** — the line now reads `✻ Worked for 2m 30s (total time 1h 12m · 14 turns)`, where the bracket is the running session-wide elapsed time and the number of prompts you've sent. Totals are seeded from the full message history, so `/resume` picks up past prompts and the original session start. `/new` resets the counters.
111
+
112
+ ## 1.0.59 — 2026-06-19
113
+
114
+ ### Fixed
115
+
116
+ - **Scrolling / expand lag on long chats** — every re-render (scroll, tool expand, theme tick) re-ran the per-line ANSI stripping behind copy-zone markers (`applyTerminalCopyZones`), per-line glyph normalization, and user-message border boxing for *every* message in the history. That work scaled linearly with chat length and dominated CPU on long sessions (the more messages, the slower each frame). The rendered output of assistant, user, and custom-message components is now memoized per `(width, branch-visual-epoch)` on the component instance and reused on warm re-renders, with the cache dropped whenever content actually changes (`updateContent` / `rebuild`) or the theme chrome epoch bumps. Warm re-render of a 120-message history drops from ~5.9 ms to ~0.16 ms and stays flat as the chat grows instead of scaling with it. Output is byte-identical (same rendered line counts and content); no functionality changed.
117
+
118
+ ## 1.0.58 — 2026-06-17
119
+
120
+ ### Fixed
121
+
122
+ - **Transparent tool rows after `/resume`** — Pi’s `ToolExecutionComponent` uses the global theme singleton for `toolPendingBg` / `toolSuccessBg` / `toolErrorBg`. Re-apply transparent overrides on that object and before every `updateDisplay()`, with extra deferred chrome rebind after history rebuild on resume/new/fork.
123
+ - **Stale tool row chrome on theme switch** — bump branch/render epoch when the active theme name or color fingerprint changes so cached tool lines pick up new palette.
124
+
125
+ ## 1.0.57 — 2026-06-17
126
+
127
+ ### Changed
128
+
129
+ - **Branch connectors default** — `├─` `└─` `│` use **fixed rgb(72)** unless you set `/cc-tools branch theme` or a custom gray. `/cc-tools branch reset` restores that default.
130
+
131
+ ### Fixed
132
+
133
+ - **Resume / session switch theme mix** — on `session_start` (especially `resume`, `new`, `fork`), rebind tool chrome from the active pi theme (palette cache bust, Shiki light/dark, branch epoch, full UI invalidate) plus deferred passes so other extensions can `setTheme` in the same tick without cross-package coupling.
134
+ - **Hidden thinking summary** sticks on "Thinking…" when `thinking_end` lands on the same frame as Pi's `updateContent` — per-message active/duration flags plus a deferred UI refresh so "Thought for Ns" appears right away.
135
+ - **Spinner footer** applies the same deferred sync on thinking start/end so "thought for Ns" shows immediately when thinking finishes.
136
+
137
+ ### Changed
138
+
139
+ - **Unified container chrome** — user message box, tool outline rules, rounded code fences, and branch connectors share one theme-derived color (`dim` → `muted` → `borderMuted`) so light themes do not get harsh dark user borders or overly bright branches.
140
+ - **User message fill** — strip nested `Box` → `Markdown` backgrounds so the framed user row stays transparent and matches terminal chrome (fixes dark slabs inside the border).
141
+ - **Light-theme branch chrome** — when the active theme has a light panel, outline/branch colors are attenuated toward mid-gray so `├─` `└─` `│` and user borders are not washed-out bright; `/cc-tools status` no longer implies theme mode uses fixed gray 72.
142
+
143
+ ## 1.0.56 — 2026-06-17
144
+
145
+ ### Fixed
146
+
147
+ - **Theme-adaptive tool chrome** re-derives when the active pi theme’s resolved colors change (fingerprint of `success`, `borderMuted`, `accent`, etc.), not only when the theme object identity changes. Fixes stale borders/dots/diffs after external theme sync (e.g. Ghostty) without coupling to other extensions.
148
+
149
+ ### Changed
150
+
151
+ - Palette cache tracks `theme.name` plus color fingerprint; removed cross-extension global bust symbols.
152
+
153
+ ## 1.0.55 — 2026-06-17
154
+
155
+ - Internal: theme name in cache key (superseded by 1.0.56 fingerprint).
156
+
157
+ ## 1.0.54 — 2026-06-17
158
+
159
+ ### Changed
160
+
161
+ - **Branch connectors** (`├─` `└─` `│`): default **`theme`** mode (was fixed gray). Uses **dim → muted → thinkingText**, same family as thought/gray prose.
162
+ - **Pending tool dots** (○): use theme **dim** when theme-adaptive; grouped counts use the same pending color.
163
+
164
+ ### Fixed
165
+
166
+ - `/cc-tools branch reset` restores theme-following default, not fixed rgb(72).
167
+
168
+ ## 1.0.53 — 2026-06-17
169
+
170
+ ### Fixed
171
+
172
+ - **Light theme edit/write diffs**: auto-select Shiki `github-light` vs `github-dark`; light panel tint base; Shiki contrast normalization for light backgrounds.
173
+ - **Light theme tool status chrome**: pending ○ / blink uses softer `borderMuted` instead of heavy `muted`; grouped tool pending counts match.
174
+
175
+ ## 1.0.52
176
+
177
+ - Theme-adaptive diff and branch tooling updates.
package/README.md ADDED
@@ -0,0 +1,154 @@
1
+ # pi-claude-code-ui
2
+
3
+ Claude Code inspired tool rendering for Pi — Shiki-powered diffs, status dots, branch connectors, file icons, and configurable output modes.
4
+
5
+ ## Features
6
+
7
+ - **Compact built-in tool rendering** for `read`, `bash`, `grep`, `find`, `ls`, `edit`, and `write`
8
+ - **Claude-style OpenAI tool rendering** for `apply_patch` plus common Pi/OpenAI-style tools like `webfetch`, `web_search`, `fetch_content`, task tools, and context tools
9
+ - **`apply_patch` diff previews** that render parsed file patches in the call phase, similar to `edit`/`write`
10
+ - **Adaptive edit/write diffs** with split or unified layouts, syntax highlighting, and inline word-level emphasis
11
+ - **Diff stat bar** with colored add/remove summary and hunk metadata
12
+ - **Progressive collapsed diff hints** that shorten on narrow terminals
13
+ - **Thinking labels** during streaming and final messages, with context sanitization
14
+ - **MCP-aware rendering** with hidden, summary, and preview modes
15
+ - **Configurable output modes** for read, search, bash, and MCP results
16
+ - **Live running previews** that show a few output lines for active tool calls (latest lines for bash), persisting until the next tool/text activity
17
+ - **Subagent completion notifications** restyled to match the same Claude-style tool rows
18
+ - **RTK rewrite integration** that folds rewrite notices into the bash tool row with a muted `(RTK)` badge and expanded-only rewrite details
19
+ - **Transparent tool backgrounds** in `transparent` or `border` mode
20
+ - **Theme-adaptive palette** — borders, branch connectors, dim text, spinner accent, and diff backgrounds automatically follow the active pi theme (set `themeAdaptive: false` to keep the fixed Claude-style palette)
21
+ - **Light Ghostty-sync themes** — edit/write diffs use `github-light` highlighting and light-tinted diff rows; tool pending dots use softer chrome colors
22
+ - **Transparent edit/write diffs** with universal red/green diff colors
23
+ - **Grouped consecutive tool calls** with a compact status header and per-tool glance rows (set `groupToolCalls: false` to disable)
24
+ - **Extra detail toggle** with `Ctrl+Shift+O`, increasing expanded preview caps without making the default view heavy
25
+ - **Global border patch** for all tool rows, including unknown/custom tools
26
+
27
+ ## Configuration
28
+
29
+ Set in `.pi/settings.json` or `~/.pi/settings.json`:
30
+
31
+ ```json
32
+ {
33
+ "toolBackground": "border",
34
+ "readOutputMode": "preview",
35
+ "searchOutputMode": "preview",
36
+ "mcpOutputMode": "preview",
37
+ "previewLines": 8,
38
+ "expandedPreviewMaxLines": 4000,
39
+ "extraExpandedPreviewMaxLines": 12000,
40
+ "extraToolOutputExpanded": false,
41
+ "groupToolCalls": true,
42
+ "bashOutputMode": "opencode",
43
+ "bashCollapsedLines": 10,
44
+ "liveToolPreview": true,
45
+ "liveToolPreviewLines": 5,
46
+ "diffCollapsedLines": 24,
47
+ "themeAdaptive": true,
48
+ "diffTheme": "github-dark"
49
+ }
50
+ ```
51
+
52
+ ### Theme integration
53
+
54
+ When `themeAdaptive` is `true` (default), the following colors are derived from the active pi theme on every render and re-derived whenever the theme changes:
55
+
56
+ | Element | Derived from |
57
+ |---------|--------------|
58
+ | User box, tool rules, code fences | `dim` → `muted` → `borderMuted` → `thinkingText` |
59
+ | Branch connectors (`├`, `└`, `│`) | **fixed rgb(72)** by default (theme-independent); `/cc-tools branch theme` to follow pi theme |
60
+ | "✻ Turn took Ns" line (final message only, with session total + turn count) | `muted` |
61
+ | Thinking-block text and `∴` marker (marker hidden when thinking is collapsed) | `muted` |
62
+ | Diff add/remove accents | `toolDiffAdded` / `toolDiffRemoved` |
63
+ | Diff background tints | mixed against `toolSuccessBg` base |
64
+ | Spinner verb text (`Working…`) | `borderAccent` (fallback: `accent`) |
65
+ | Spinner status text | `muted` |
66
+
67
+ User-supplied `diffTheme` presets and `diffColors` overrides always win over theme-derived defaults. File-type icons (e.g. `ts`, `py`, `rs`) keep their language-identity colors and are not theme-derived.
68
+
69
+ Set `themeAdaptive: false` to keep the original fixed Claude-style palette regardless of the active pi theme.
70
+
71
+ On `/resume`, `/new`, or `/fork`, tool chrome is rebound from the **current** pi theme (no coupling to Ghostty or other theme extensions). If you use Ghostty sync, listing it **above** this extension in `settings.json` is recommended so `setTheme` runs before chrome rebind.
72
+
73
+ #### Toggle at runtime with `/cc-theme`
74
+
75
+ ```text
76
+ /cc-theme # show current setting + theme name
77
+ /cc-theme status # show current setting + color preview (incl. spinner)
78
+ /cc-theme on # follow pi theme
79
+ /cc-theme off # keep fixed Claude palette
80
+ /cc-theme toggle # flip the current value
81
+ ```
82
+
83
+ The selection is persisted to `~/.pi/settings.json` and applied to the next rendered tool row. No restart required.
84
+
85
+ #### Repaint the spinner with `/cc-spinner`
86
+
87
+ The spinner glyph itself is still colored by pi's loader using `accent`, while the verb text (e.g. `Cooking…`) follows `borderAccent` by default so it stays lively without being the exact same color as the glyph. The status suffix (e.g. `(thinking · ↓ 10 tokens · 2s)`) follows `muted`. Use `/cc-spinner` to bind either text element to any other theme color key:
88
+
89
+ ```text
90
+ /cc-spinner preview # list every common theme key with a colored sample
91
+ /cc-spinner verb <key> # change the verb color (e.g. thinkingHigh, mdHeading)
92
+ /cc-spinner status <key> # change the status suffix color
93
+ /cc-spinner reset # restore defaults (verb=borderAccent, status=muted)
94
+ ```
95
+
96
+ The selection is persisted as `spinnerVerbColor` / `spinnerStatusColor` in `~/.pi/settings.json` and applied on the next spinner tick.
97
+
98
+ ### Tool background modes
99
+
100
+ | Value | Behavior |
101
+ |-------|----------|
102
+ | `default` | Standard Pi tool backgrounds |
103
+ | `transparent` | Transparent tool backgrounds |
104
+ | `border` | Transparent backgrounds with top/bottom border lines |
105
+
106
+ Use `/cc-tools` to control tool UI at runtime:
107
+
108
+ ```text
109
+ /cc-tools status # show style, grouping, and extra-detail state
110
+ /cc-tools outlines # tool style: outlines, transparent, or default
111
+ /cc-tools group toggle # toggle grouped adjacent/concurrent tool calls
112
+ /cc-tools group off # disable grouping (also ungroups current grouped rows)
113
+ /cc-tools detail toggle # same mode as Ctrl+Shift+O
114
+ ```
115
+
116
+ ### Output modes
117
+
118
+ | Setting | Values | Default |
119
+ |---------|--------|---------|
120
+ | `readOutputMode` | `hidden`, `summary`, `preview` | `preview` |
121
+ | `searchOutputMode` | `hidden`, `count`, `preview` | `preview` |
122
+ | `mcpOutputMode` | `hidden`, `summary`, `preview` | `preview` |
123
+ | `bashOutputMode` | `opencode`, `summary`, `preview` | `opencode` |
124
+
125
+ ### Display settings
126
+
127
+ | Setting | Default | Description |
128
+ |---------|---------|-------------|
129
+ | `previewLines` | `8` | Lines shown in collapsed preview mode |
130
+ | `expandedPreviewMaxLines` | `4000` | Max lines when expanded with Ctrl+O |
131
+ | `extraExpandedPreviewMaxLines` | `12000` | Max lines after Ctrl+Shift+O extra-detail mode |
132
+ | `extraToolOutputExpanded` | `false` | Start with Ctrl+Shift+O extra-detail mode enabled |
133
+ | `groupToolCalls` | `true` | Group adjacent/concurrent tool calls under a compact status header |
134
+ | `bashCollapsedLines` | `10` | Lines for collapsed bash output |
135
+ | `liveToolPreview` | `true` | Show a small live output preview while tools are still running |
136
+ | `liveToolPreviewLines` | `5` | Lines shown in the collapsed live preview |
137
+ | `diffCollapsedLines` | `24` | Diff lines before collapsing |
138
+
139
+ ## Notes
140
+
141
+ This package targets recent Pi versions where tool renderers use:
142
+
143
+ - `renderCall(args, theme, context)`
144
+ - `renderResult(result, { expanded, isPartial }, theme, context)`
145
+
146
+ Unknown/custom tools do not have a public global renderer hook in Pi, so this package patches container rendering to add top/bottom borders for all tool executions in border mode.
147
+
148
+ ## Credits
149
+
150
+ This project builds upon and was inspired by the excellent work of:
151
+
152
+ - **[@heyhuynhgiabuu/pi-pretty](https://github.com/buddingnewinsights/pi-pretty)** by [huynhgiabuu](https://github.com/buddingnewinsights) — Pretty terminal output with syntax-highlighted file reads, colored bash output, and tree-view directory listings
153
+ - **[@heyhuynhgiabuu/pi-diff](https://github.com/buddingnewinsights/pi-diff)** by [huynhgiabuu](https://github.com/buddingnewinsights) — Shiki-powered terminal diff renderer with word-level diffs in split and unified views
154
+ - **[pi-tool-display](https://github.com/MasuRii/pi-tool-display)** by [MasuRii](https://github.com/MasuRii) — Compact tool call rendering, diff visualization, and output truncation
@@ -0,0 +1,20 @@
1
+ {
2
+ "toolBackground": "transparent",
3
+ "readOutputMode": "preview",
4
+ "searchOutputMode": "preview",
5
+ "mcpOutputMode": "preview",
6
+ "previewLines": 8,
7
+ "expandedPreviewMaxLines": 4000,
8
+ "extraExpandedPreviewMaxLines": 12000,
9
+ "extraToolOutputExpanded": false,
10
+ "groupToolCalls": true,
11
+ "bashOutputMode": "opencode",
12
+ "bashCollapsedLines": 10,
13
+ "liveToolPreview": true,
14
+ "liveToolPreviewLines": 5,
15
+ "diffCollapsedLines": 24,
16
+ "showTruncationHints": false,
17
+ "themeAdaptive": true,
18
+ "diffTheme": "github-dark",
19
+ "diffColors": {}
20
+ }