Skip to content
dsh.fish
Bundle

dsh-memory-panel

Long-term memory for DeepSeek Harness: memory_save/recall/list/delete/clear tools plus a bilingual sidebar panel visualizing what the agent remembers about you

Source
x2it
stars
2 stars
License
MIT
Updated
Updated 10 hours ago

Readme

# dsh-memory-panel

Long-term memory for [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) (`dsh`): durable, cross-session memory tools plus a sidebar panel that shows what the agent remembers about you.

[English](README.md) | [中文](README.zh.md)

## What it does

- **`memory_save`** — store a memory (creates or updates by key)
- **`memory_recall`** — search memories by keyword or category
- **`memory_list`** — list all memories, optionally filtered by category
- **`memory_delete`** — delete one memory by its exact key
- **`memory_clear`** — delete ALL memories (requires `confirm: true`)
- **Sidebar memory panel** — a "Memory" button in the web sidebar opens a panel visualizing the memory store (bilingual, follows the UI language)

Memories live in `~/.dsh/memory.json` — plain JSON on your machine, nothing leaves it.

## Features

- **Atomic writes**: write-to-temp + rename, readers never see a torn file
- **Write serialization**: concurrent `memory_save` calls queue instead of clobbering each other
- **Corruption recovery**: a broken `memory.json` is backed up to `memory.json.corrupt-<ts>` before continuing fresh — no silent data loss
- **Growth control**: content capped at 4000 chars, store capped at 500 entries (oldest evicted), recall results capped at 30
- **Optional filter**: `memory_list` works with or without `category_filter`
- **Delete & clear**: `memory_delete` removes one memory; `memory_clear` empties the whole store after an explicit `confirm: true`
- **Bilingual UI**: the panel follows the UI language (zh / en) via the dsh locale service
- **Tunnel-aware UI**: the panel warns when accessed through a tunnel where the browser-trust fence blocks `/api/*`

## Install

```sh
# web profile (interactive GUI)
dsh plugin --profile web add dsh-memory-panel

# headless profile (one-shot runs) — same bundle, separate install
dsh plugin --profile headless add dsh-memory-panel
```

Install from GitHub directly (no npm needed):

```sh
dsh plugin --profile web add github:x2it/dsh-memory-panel
```

Restart `dsh web` after installing, then open the sidebar "记忆" button.

## Verify

```sh
dsh --profile web --dump-config | grep memory-panel
```

The agent should now list `memory_save` / `memory_recall` / `memory_list` among its tools.

## How it works

```
agent tools (memory_save/recall/list)
        │  ctx.tools.register
        ▼
  host plugin (lib/index.js)
        │  GET /api/memory  (ctx.webServer)
        ▼
  client panel (lib/client.js, sidebar.footer.action slot)
```

One plugin row (`memory-panel`) carries both halves: the host loader imports `main`, the web client loads `./client`.

## Development

```sh
npm install
npm run typecheck   # tsc --noEmit
npm run build       # esbuild → lib/index.js + lib/client.js
npm pack            # tarball
```

Install the local tarball to test before publishing:

```sh
npm pack
dsh plugin --profile web add ./dsh-memory-panel-0.1.0.tgz
```

## Layout

```
src/index.ts          # host half: memory tools + /api/memory endpoint
src/client/index.tsx  # client half: sidebar memory panel
lib/                  # built artifacts (generated by build.mjs)
cordis.patch.yml      # bundle patch (dsh.bundle.patch)
```

## Security

The `/api/memory` endpoint has no authentication — bind dsh web to localhost or a trusted network. The plugin stores memory content in plaintext at `~/.dsh/memory.json`; do not save secrets you would not write to a local file.

## License

MIT

Install

dsh plugin --profile web add github:x2it/dsh-memory-panel

Profile: web

  • This package builds from source on install. pnpm will ask you to allow its build script — that is permission to run the package’s code on your machine, outside the agent sandbox. Only allow sources you trust.
  • This source has no pinned commit, so a later push upstream changes what installs. Prefer pinning a commit.
Source