Skip to content
dsh.fish
Bundle

@wellorbetter/dsh-input-history

Arrow-key input history for the DeepSeek Harness Web GUI: press Up/Down in the chat composer to recall previously sent messages, with a floating history dropdown.

Source
wellorbetter
stars
1 stars
License
MIT
Updated
Updated yesterday

Readme

<h1 align="center">Input History</h1>

<p align="center">
  <a href="README.md">English</a>&nbsp;|&nbsp;<a href="README.zh.md">中文</a>
</p>

<p align="center">
  <a href="https://github.com/wellorbetter/dsh-input-history/blob/main/LICENSE"><img alt="License MIT" src="https://img.shields.io/badge/License-MIT-blue.svg?style=flat-square"></a>
  <a href="https://github.com/deepseek-ai/deepseek-harness"><img alt="For DeepSeek Harness" src="https://img.shields.io/badge/For-DeepSeek%20Harness-8257D0.svg?style=flat-square"></a>
  <a href="https://github.com/topics/dsh-plugin"><img alt="dsh-plugin" src="https://img.shields.io/badge/topic-dsh--plugin-0969da.svg?style=flat-square"></a>
</p>

<p align="center">
  <strong>Arrow-key input history for the DeepSeek Harness Web GUI.</strong><br>
  <em>Press <kbd>↑</kbd> / <kbd>↓</kbd> in the chat composer to walk back and forth through what you already sent — with a floating history dropdown.</em>
</p>

<p align="center">
  <img src="docs/screenshot.png" alt="Input history panel" width="520">
</p>

<p align="center"><em>Demo screenshot with sample data — message content is blurred.</em></p>

## What this plugin provides

Installing this bundle adds one **client (browser) plugin** to every session of the target dsh profile. It registers a floating history dropdown above the composer (`conversation.input.overlay`) and a clock **history button** in the composer's tool row (`conversation.input.right`):

- **↑ recalls the previous message** when the caret is at the very start of the input (an empty input qualifies); **↓ steps forward**, and past the newest entry restores the draft you were typing.
- **Enter accepts**, **Esc / click-outside cancels** (restores the pre-recall draft), and **clicking a row** jumps straight to that message.
- **Date grouping** (today / yesterday / earlier) plus **per-row timestamps** keep long histories scannable.
- **Long messages** render as a 3-line clamped preview with the full text on hover (`title`), and recall puts the complete multi-line text back into the composer.
- Consecutive duplicate messages are collapsed, and the list is capped at the latest 500 entries.

The plugin is pure client UI — no host-side behavior, no persistence, no network. The history is read live from the session's conversation snapshot, so it is always scoped to the session you are looking at.

## How it behaves

```text
composer caret ──↑ at start ──▶ open history (most recent)
        ▲                       │
        │                       ├── ↑  older
        │                       ├── ↓  newer  ── past newest ──▶ restore saved draft, close
        │                       ├── Enter  accept (keep draft)
        │                       ├── Esc    cancel (restore saved draft)
        │                       └── click  jump to that message
        └── ↓ at end ──────────▶ open history (oldest), then ↓ steps newer
```

Recall never fights the slash (`/`) or mention (`@`) menus: when the trigger menu is open, its own up/down arbitration owns the arrows. Modified chords (Ctrl/Cmd/Alt) and IME composition pass through untouched, and multi-line editing is unaffected until the caret reaches a boundary.

## Install

Requires the `dsh` CLI ([install DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness)).

```sh
# from GitHub (recommended)
dsh plugin --profile web add github:wellorbetter/dsh-input-history

# or from a local checkout
dsh plugin --profile web add ./dsh-input-history
```

Restart the profile (`dsh web` / `dsh --profile <name>`) after installing. The plugin is a [bundle](https://github.com/deepseek-ai/deepseek-harness/blob/master/docs/user/develop/basic/publish.md): it declares `dsh.bundle.patch`, so `dsh plugin` reconciles it into the profile's `dsh.profile.bundles` layer list automatically, and `dsh.client` so the web shell loads its browser half. It ships plain JavaScript (`lib/index.js` + `lib/client.js`), so a GitHub install needs no build step or `allowBuilds` permission.

## Use

Focus the chat composer in any session and press <kbd>↑</kbd> at the start of the input (or <kbd>↓</kbd> at the end) to open the history dropdown, then navigate with the arrows and press <kbd>Enter</kbd> to accept, or click a row to jump to it. You can also click the clock button in the composer's tool row to open the same panel.

## Development

```sh
pnpm install
pnpm verify     # asserts the host half, the client bundle, and the patch manifest
```

## License

MIT

Install

dsh plugin --profile web add github:wellorbetter/dsh-input-history

Profile: web

  • This source has no pinned commit, so a later push upstream changes what installs. Prefer pinning a commit.
Source