{"id":"readable-agent-activity","repo":"geoqiao/paseo-readable-activity","url":"https://github.com/geoqiao/paseo-readable-activity","name":"readable-agent-activity","description":"Readable tool calls and reasoning for Paseo 0.8: quiet headers, code and JSON, bounded previews. Full detail only.","categories":["productivity"],"platforms":[],"caveats":["Experimental beta: verified on Paseo 0.8.0, Full detail only; Summary is unsupported.","All connected clients must use Full detail; disable before switching to Summary.","Do not enable alongside another tool/reasoning timeline replacement.","Show all and full Raw/copy can be expensive for very large payloads.","macOS host tested; native iOS/Android untested."],"images":["https://raw.githubusercontent.com/geoqiao/paseo-readable-activity/bab4615d72a3e58b841f6adece102539aab48584/images/bounded-preview.png","https://raw.githubusercontent.com/geoqiao/paseo-readable-activity/bab4615d72a3e58b841f6adece102539aab48584/images/readable-compact.png","https://raw.githubusercontent.com/geoqiao/paseo-readable-activity/bab4615d72a3e58b841f6adece102539aab48584/images/readable-dark.png","https://raw.githubusercontent.com/geoqiao/paseo-readable-activity/bab4615d72a3e58b841f6adece102539aab48584/images/readable-exec.png","https://raw.githubusercontent.com/geoqiao/paseo-readable-activity/bab4615d72a3e58b841f6adece102539aab48584/images/readable-light.png","https://raw.githubusercontent.com/geoqiao/paseo-readable-activity/bab4615d72a3e58b841f6adece102539aab48584/images/readable-ui.png"],"health":{"manifestValid":true,"hasReadme":true,"hasLicense":true,"hasTests":true,"hasTypecheckScript":true,"updatedRecently":true},"scannedAt":"2026-09-12T18:24:23.033Z","addedAt":"2026-09-12T19:27:24+03:00","version":"0.1.0-beta.4","security":{"status":"passed","blockingFindings":0,"advisoryFindings":0,"scannedAt":"2026-09-12T18:22:29.747Z","commit":"bab4615d72a3e58b841f6adece102539aab48584"},"license":"MIT","paseoVersionRequirement":">=0.8.0 <0.9.0","manifest":{"id":"readable-agent-activity","requirements":{"paseo":">=0.8.0 <0.9.0"},"build":[["npm","ci","--ignore-scripts","--legacy-peer-deps","--no-audit","--no-fund"],["npm","run","check"]]},"repoMeta":{"stars":0,"defaultBranch":"main","pushedAt":"2026-09-12T13:34:38Z"},"owner":{"login":"geoqiao","avatarUrl":"https://avatars.githubusercontent.com/u/105639506?v=4"},"installNotesHtml":"<blockquote>\n<p>Plugins are <strong>trusted, unsandboxed code</strong>. Review the source before enabling plugins on your daemon. This plugin's runtime is presentation-only, but installation runs npm dependency installation and checks.</p>\n</blockquote>\n<ol>\n<li>Set <strong>Full detail</strong> and disable conflicting timeline plugins as described above.</li>\n<li>Enable plugins in Paseo Settings only if you accept the trust model.</li>\n<li>Install the pinned beta on your intended daemon:</li>\n</ol>\n<pre><code class=\"language-sh\">paseo plugin add geoqiao/paseo-readable-activity --ref v0.1.0-beta.4 --host &#x3C;your-host>\npaseo plugin ls --host &#x3C;your-host>\n</code></pre>\n<p>Replace <code>&#x3C;your-host></code> with your host address, such as <code>127.0.0.1:6767</code> for the standard local daemon. Installation enables the plugin; confirm <code>readable-agent-activity</code> is <code>running</code>.</p>\n<p>Before returning to Summary:</p>\n<pre><code class=\"language-sh\">paseo plugin disable readable-agent-activity --host &#x3C;your-host>\n</code></pre>\n<p>No daemon restart is needed. The tag pins this beta instead of tracking a branch. If you already installed this fork under a custom runtime alias, manage that alias rather than adding an enabled duplicate.</p>","readmeText":"<div align=\"center\">\n\n# Readable Agent Activity\n\n**Readable tool calls. 20-line previews. Full control.**\n\nA Paseo plugin that makes JSON, code and tool output easier to scan — without mounting an entire long result when you open it.\n\n[Install](#install) · [Performance](#smaller-previews-less-rendering-work) · [Technical design](#technical-design) · [Latest beta](https://github.com/geoqiao/paseo-readable-activity/releases/tag/v0.1.0-beta.4)\n\n</div>\n\n> [!IMPORTANT]\n> **Paseo 0.8.0 · Full detail only · Experimental beta.** Summary is not supported. Use Full detail on **every connected client**; disable the plugin before switching to Summary.\n\n<p align=\"center\">\n  <a href=\"images/readable-ui.png\"><img src=\"images/readable-ui.png\" alt=\"Readable JSON and UI output: indented input, multiline labels, compact paths, Raw and Copy\" width=\"440\" align=\"top\"></a>\n  <a href=\"images/bounded-preview.png\"><img src=\"images/bounded-preview.png\" alt=\"Bounded preview: the first 20 lines of a long output, with Show all\" width=\"440\" align=\"top\"></a>\n</p>\n\n*Shipped components, synthetic demo data, React Native Web — not host or on-device screenshots. Click either image for the full-size view.*\n\n<details>\n<summary>More screenshots: dark, light and compact layouts</summary>\n\n[Dark overview](images/readable-dark.png) · [Light overview](images/readable-light.png) · [Compact layout](images/readable-compact.png)\n\n</details>\n\n## What it solves\n\n| Problem | With this plugin |\n| --- | --- |\n| Tool arguments and results are hard to scan as dense JSON or escaped strings. | Formatted JSON, highlighted code, readable text blocks and cleaner UI labels/paths. |\n| Opening a large tool result can mount thousands of lines and stall the interface. | A **20-line / 4,000-character preview** by default; the rest is rendered only when you choose **Show all**. |\n| Long headers and automatic expansion make the timeline noisy. | Short summaries, recognizable icons, and manual-only expansion that survives streaming updates. |\n\n### Tool calls you can actually read\n\n- **JSON:** indented, syntax-highlighted output instead of a dense blob.\n- **Code:** known JavaScript inputs render as literal source, not a string buried in JSON.\n- **Tool responses:** typed `content` envelopes expose their text; DSH-projected ACP blocks with `type: \"content\"` and nested text are extracted one layer; attachments, unknown blocks and metadata remain available in Raw.\n- **Pi Code mode:** an outer envelope marked `details.codeMode === true` can expose a direct, schema-validated `exec_command` result as its status plus output. This unwraps exactly one layer; exit codes, running sessions and upstream truncation stay visible.\n- **UI output:** complete quoted labels decode one layer into readable lines. Repeated paths become `AXWindow ▸ AXGroup × 22 ▸ AXStaticText`.\n- **Quiet headers:** specialized icons and bounded, single-line summaries. Native messages, approvals and composer stay native.\n\n**Readable is a view, not a replacement for your data.** Raw retains the complete received response. Copy always copies the **full selected representation**, not just the visible preview: derived text in Readable, complete response in Raw.\n\n<details>\n<summary>Nested command output: visible exit status, real lines, preserved escapes</summary>\n\n![Pi Code-mode result rendered as compact status and multiline stdout, with a bounded preview](images/readable-exec.png)\n\n*Production components, synthetic data. `Script completed` describes the outer JavaScript;\n`Exit code: 2` describes the nested command. The plugin does not mistake one for the other.*\n\n</details>\n\n### Smaller previews, less rendering work\n\nA long UI tree or command log should not require rendering its entire body just to inspect the beginning.\n\n```text\nLarge tool result\n      ↓ open\nFirst 20 lines / 4,000 characters\n      ↓ Show all — only when you ask\nComplete content\n      ↓ Show less\nBack to the preview\n```\n\nThe preview bounds the text mounted in each detail section and reasoning body. One **20-line / 4,000-character budget** is shared across every status, text, JSON and unknown-block segment in a result; it does not restart per block. Tools and Thinking also start collapsed, and streaming never opens them for you. A 100,000-line regression case verifies the default preview stays bounded.\n\nThis reduces the initial rendering work; **it is not a guarantee of zero lag**. Show all deliberately removes the preview limit. Full Raw, copying, host storage and serialization can still be expensive. The limit counts newline-separated lines, so wrapping can occupy more than 20 visual lines. No pagination, hidden truncation of the source, or claimed FPS benchmark.\n\n## Compatibility: Full detail, not Summary\n\nPaseo 0.8 groups Summary calls **before** running plugin transformers. Its public API does not expose the display mode or group members to this plugin, nor a supported detail-renderer slot for those groups.\n\nConsequently, this is **not** a plugin that automatically stays inactive in Summary. If enabled there, a replacement row can hide the native group's entry point.\n\n- Select **Full detail on all connected clients** before enabling.\n- **Disable this plugin before switching to Summary.**\n- Do not enable it alongside another tool/reasoning timeline replacement, including upstream Colorful Agent Activity.\n\nVerified with Paseo app, daemon and SDK **0.8.0 on macOS**. The manifest range is `>=0.8.0 <0.9.0`; future 0.8 releases still need verification. Native iOS/Android are untested; a compact browser preview is not an on-device test. [Host evidence and compatibility tests](docs/compatibility.md).\n\n## Install\n\n> Plugins are **trusted, unsandboxed code**. Review the source before enabling plugins on your daemon. This plugin's runtime is presentation-only, but installation runs npm dependency installation and checks.\n\n1. Set **Full detail** and disable conflicting timeline plugins as described above.\n2. Enable plugins in Paseo Settings only if you accept the trust model.\n3. Install the pinned beta on your intended daemon:\n\n```sh\npaseo plugin add geoqiao/paseo-readable-activity --ref v0.1.0-beta.4 --host <your-host>\npaseo plugin ls --host <your-host>\n```\n\nReplace `<your-host>` with your host address, such as `127.0.0.1:6767` for the standard local daemon. Installation enables the plugin; confirm `readable-agent-activity` is `running`.\n\nBefore returning to Summary:\n\n```sh\npaseo plugin disable readable-agent-activity --host <your-host>\n```\n\nNo daemon restart is needed. The tag pins this beta instead of tracking a branch. If you already installed this fork under a custom runtime alias, manage that alias rather than adding an enabled duplicate.\n\n## Technical design\n\nThe implementation keeps the renderer small and predictable: **public SDK contributions → pure presentation data → bounded, theme-aware rendering**.\n\n| Design | Why it matters |\n| --- | --- |\n| **Lexical JSON formatting** | Changes whitespace while preserving received number spellings, duplicate keys, key order and escapes. Structured objects have already lost their original source whitespace. |\n| **Explicit format recognition** | Only known code fields, typed content envelopes (including the DSH ACP one-layer text projection), the marked Pi Code-mode exec-result shape and recognized UI labels get special treatment. No source execution, guessed inner tool calls, recursive field walking or global backslash replacement. |\n| **Separate work limits** | Formatting input/output and highlighting are capped at 100,000 characters; serialized envelope decoding at 1,000,000. Oversized or unrecognized text falls back to literal content. |\n| **Shared diff classification and lazy source access** | Hunk ranges distinguish file headers from `+++`/`---`-looking source lines. Diff counts and colors use the same classifier. Complete edit source and read range metadata stay in Raw without eager serialization for the preview. |\n| **Local, manual disclosure** | Expansion and Show all survive streaming/status/theme updates while mounted. Virtual-list remounts reset them; the plugin does not infer host preferences from private storage. |\n| **Host-native building blocks** | React Native primitives, public host icons and theme colors. Desktop spacing accounts for Paseo's external row gap; compact mode keeps 44px touch targets. |\n| **Presentation-only lifecycle** | No server entry, runtime network requests, process execution or filesystem access. Contributions unregister on cleanup; clipboard writes happen only after Copy. |\n\nNon-text attachments, metadata and trace payloads are not eagerly loaded or serialized into the default readable preview. Unknown blocks remain as bounded placeholders and the complete received envelope stays in Raw. A Pi upstream `[Output truncated]` marker is reported as upstream truncation; Show all cannot recreate omitted data. Async clipboard results are invalidated when the source changes, so an old copy operation cannot report success for new content.\n\n<details>\n<summary><strong>Development, tests and known gaps</strong></summary>\n\nRequires Node.js 22+ and npm. Each checkout owns its dependencies and lockfile; there are no parent-monorepo runtime imports.\n\n```sh\nnpm ci --ignore-scripts --legacy-peer-deps --no-audit --no-fund\nnpm run check\n```\n\nTypecheck, lint and **224 tests** cover fidelity, malformed/large data, explicit Pi Code-mode result wrappers, DSH-projected ACP content blocks, mixed block languages, status visibility, hunk-aware diffs, Unicode preview boundaries, lazy source access, icons, summaries, highlighting, clipboard races, manual folding, streaming and themes. Paseo tool icon names are checked against the matching Lucide release, including alias exports. Pinned host projection tests explicitly reproduce the unsupported Summary case; passing that test does not mean Summary is supported.\n\nThe new formatter cases use synthetic envelopes only. They cover malformed or partial wrappers,\nnonzero exits, running sessions, empty output, upstream truncation, formatting limits, multiple\nresults, lazy unknown/image tails, one-layer DSH ACP text extraction with mixed non-text blocks and\na shared preview budget, and complete selected-view copies. No live conversation payloads are stored\nin the plugin.\n\nThe wider browser harness checks dark/light themes, compact layout, keyboard controls, overflow and large-output previews. It is not a native mobile test. A full reconnect/enable-disable matrix and a latency/FPS benchmark remain outstanding.\n\nRun checks before installing or reloading an explicit target host; do not auto-enable a disabled installation. [Verification, dependency review and remaining gaps](docs/verification.md) · [Separate post-release code review](docs/code-review.md).\n\n</details>\n\n## Credits\n\nAn MIT fork of Matt Cowger's [Colorful Agent Activity](https://github.com/mcowger/paseo-plugins/tree/91058be73840ae11b130b6bb7d34b07652462217/colorful-agent-activity). Original copyright retained; see [LICENSE](LICENSE) and exact [upstream provenance](UPSTREAM.md). Vendored Paseo test fixtures retain their separate Apache-2.0 license.\n\nGitHub-only publication; no npm release. [paseo.cafe submission PR #86](https://github.com/paseo-cafe/paseo-cafe/pull/86) is open and awaiting review; the plugin is not yet listed. [Submission details](docs/catalog.md).\n"}