pi-copy-message
v2.1.0
Published
Pi extension with a searchable TUI picker for copying raw session messages
Downloads
444
Maintainers
Readme
pi copy-message extension
A pi extension that adds /copy-message: a keyboard-first picker for copying raw session message text without terminal wrapping, padding, or rendered TUI artifacts. It also adds /copy-user as a direct shortcut for the most recent user message.
pi-copy-message supersedes pi-copy-user-message, which only copied the most recent user message.
What it does
- Adds
/copy-message - Adds
/copy-userfor copying the most recent user message directly - Copies raw stored session message text, not rendered terminal lines
- Shows messages in chat order: oldest at top, newest at bottom
- Selects the newest visible message by default
- Supports role filters for user, assistant, tool/bash, and custom messages
- Hides tool/bash messages by default
- Supports type-to-filter search across role and message text, with
time:<term>for timestamp search - Supports Home/End jumps for oldest/newest visible messages
- Uses Pi's configured selection bindings for navigation, copy, and cancel
- Includes fast paths:
/copy-message latest,/copy-message last, and/copy-message newest - Supports direct numbered copies like
/copy-message 3 - Supports metadata copies with
--with-meta,--with-metadata, or--with-role
Install
Install it from npm with pi:
pi install npm:pi-copy-messageOr install it directly from GitHub with pi:
pi install https://github.com/fitchmultz/pi-copy-messageThen reload pi from inside the app:
/reloadIf you prefer to load it directly from a local checkout during development:
pi -e ./extensions/copy-message.tsUsage
Open the picker:
/copy-messageCopy the most recent user message directly:
/copy-userCopy the latest visible default message directly:
/copy-message latestAliases:
/copy-message last
/copy-message newestCopy the 3rd default-visible message directly, matching the picker's 1-based oldest-to-newest numbering:
/copy-message 3Copy with role and timestamp metadata instead of raw text only:
/copy-message latest --with-meta
/copy-message 3 --with-role
/copy-user --with-metaKeyboard controls
| Key | Action |
|---|---|
| Configured tui.select.up (default: ↑) | Move to older visible message |
| Configured tui.select.down (default: ↓) | Move to newer visible message |
| Configured tui.select.pageUp / tui.select.pageDown (default: PageUp / PageDown) | Move by one visible page in regular mode |
| Ctrl+PageUp / Ctrl+PageDown | Move by one visible page in fullscreen mode |
| Home / End | Jump to oldest/newest visible message in regular mode |
| Ctrl+Home / Ctrl+End | Jump to oldest/newest visible message in fullscreen mode |
| Type text | Filter visible messages |
| time:<term> | Search timestamps |
| Backspace | Delete one search character |
| Ctrl+U | Toggle user messages |
| Ctrl+A | Toggle assistant messages |
| Ctrl+T | Toggle tool/bash messages |
| Alt+C | Toggle custom messages |
| Tab | Toggle a wrapped preview of the selected message |
| Alt+M | Toggle raw vs metadata copy format |
| Configured tui.select.confirm (default: Enter) | Copy selected message text |
| Configured tui.select.cancel (default: Esc/Ctrl+C) | Cancel |
Behavior notes
- Entry IDs are hidden from the picker.
- The picker caps visible rows and scrolls instead of filling the screen.
- Search preserves your original selected message and restores it when the search is cleared.
- General search does not match timestamps; use
time:<term>when you want to search by displayed time. - Filter labels honor the active pi theme.
- Selection key hints show the active Pi bindings. Configured selection actions take precedence if they collide with the picker's filter, preview, or format shortcuts.
- Only custom messages with
display: truecan appear or be copied from currentcustom_messageentries or legacy message-wrapped entries; visible ones can be toggled withAlt+C. - Copy notifications include the role and a short preview so you can verify what was copied.
/copy-message latestand numbered selectors include user, assistant, and visible custom messages by default while hiding tool/bash messages.Alt+Conly affects the picker. If only hidden messages exist,latestfalls back to the newest message so the command still does something useful./copy-messagewith no direct selector requires interactive TUI mode because the picker is a custom TUI component.- Direct commands such as
/copy-user,/copy-message latest, and/copy-message 3do not require TUI mode, though non-UI modes may not display notifications.
Compatibility
- Requires and is tested with Pi 0.84.0 or later
- Pi includes
Ctrl+Xfor copying the latest assistant response; this extension remains useful for searchable history, other roles, metadata, and direct selectors. - Supported Node.js range for local repo tooling:
>=22.19.0 .nvmrcpins Node 22.19.0 for local development
This package keeps pi core packages as wildcard peers (*) per pi package guidance. Pi aliases these imports to its own bundled copies when loading the extension, so the package never bundles or shadows pi core. Local development uses @earendil-works/pi-coding-agent and @earendil-works/pi-tui as dev dependencies for typechecking and tests.
Development
npm install
npm run checkKey files:
extensions/copy-message.ts— publishable extension implementationtests/copy-message.test.ts— regression tests for command wiring, filtering, search, navigation, and copy formatting
