# dsh-session-delete A [DeepSeek Harness](https://github.com/deepseek-ai/dsh) (dsh) plugin for conversation lifecycle management: **archive area** and **trash** commands with stable list numbering, keyword filtering and temporary keyword scopes. 中文说明见 [README.zh.md](README.zh.md)。 > **Vibe coding notice** — this plugin was developed end-to-end through vibe > coding: built iteratively via interaction between the author and > **deepseek-v4-flash running on DeepSeek Harness**, and **published by > deepseek-v4-flash + Harness** on behalf of the author. ## Features - `/t-archive` — manage the **archive area** (conversations hidden by the sidebar's archive action) - list (grouped by workspace folder), restore, delete into trash, or purge permanently - includes an **"ungrouped (stray)"** section for orphaned fork/subagent sessions whose parent was deleted - `/t-restore` — manage the **trash** (files moved out by deletions) - list, restore to the original workspace, delete one, or clear all - **Stable list numbering** — between two list refreshes, one number always maps to one conversation; operated slots show a gap (`———— restored (slot empty)`) instead of renumbering - **Keyword-first interaction** — a keyword that matches exactly one conversation operates on it directly; multiple matches create a **temporary keyword list**, then `/t-archive --kw ` operates within it (a non-distinctive keyword is rejected, no nested lists) - Batch numbers (`--delete 1 3 5`), full `session-…` ids, `--purge`/`--clear` - Multi-workspace aware: archive listing covers all workspaces; trash is global; restore returns to each conversation's original workspace - Safety: refuses to delete sessions with active tasks (`agent.status === 'running'`); all file paths come from official APIs ## Install From GitHub (requires the repo to be published first): ```powershell dsh plugin --profile web add github:TANGBINGBINGING/dsh-session-delete ``` From a local checkout: ```powershell dsh plugin --profile web add file:C:/path/to/dsh-session-delete ``` Restart dsh (`npx @deepseek-ai/dsh web`), then type `/t-archive` or `/t-restore` in the input box. > The plugin is a **bundle** (its `package.json` declares `dsh.bundle.patch`), so it registers itself — do **not** add a manual `insert` entry in the profile's `cordis.patch.yml` (duplicate loader entry ids crash dsh on startup). ## Usage ``` /t-archive list archive area (grouped by workspace, refresh) /t-archive restore (back to conversations) /t-archive --delete delete into trash /t-archive --delete --purge purge permanently /t-archive unique match → restore directly; multiple → temporary keyword list /t-archive --delete unique match → delete directly /t-archive --kw operate within the last temporary list (keyword must be unique) /t-restore list trash (refresh) /t-restore restore to original workspace /t-restore --delete permanently delete one /t-restore --clear permanently delete all ``` Input rules: pure digits = list number; `session-…` = id; anything else = keyword. `[运行中]` marks conversations with an active task (not deletable). ## Uninstall ```powershell dsh plugin --profile web remove dsh-session-delete ``` ## Development ```bash node tools/dsh-session-delete/test.mjs # 35/35 ``` Layout: ``` package.json bundle manifest (dsh.bundle.patch) cordis.patch.yml loader insert for this bundle index.js plugin source (zero runtime dependencies) test.mjs unit tests ``` ## Localization This plugin was originally written in **Chinese** (the default output language). An **English adaptation** is provided and selected by the `DSH_LANG` environment variable: ```powershell # English output (set before launching dsh) set DSH_LANG=en npx @deepseek-ai/dsh web ``` - **Default** (no `DSH_LANG`): Chinese output - **`DSH_LANG=en`**: English output for commands, lists, success/error messages, and the `/`-menu command descriptions - Input parsing is language-independent (numbers, `session-…` ids, keywords all work the same) > **Testing note**: the English adaptation was verified **automatically by AI agents** — the unit test suite covers both locales (41/41 passing: 35 Chinese + 6 English). It has **not** been manually exercised by a human reviewer. ## Design notes - dsh has no public unarchive API; the plugin replays the official archive mutation in reverse through the registry's serialized mutation queue (`enqueueOperation` → `requireState` → `setState`), which persists to `workspace.json` and broadcasts `host/archived-sessions-changed` so the UI updates live. - Trash restore re-runs header indexing so the conversation returns to its original workspace folder. - After deletion, the archive mark is cleaned up safely (header index rebuilt first), leaving no stale records. ## License [MIT](LICENSE)