# Changelog All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased] ## [0.4.6] - 2026-09-13 ### Installation and version pairing This stable release keeps the same DSH compatibility range as 0.4.5: the minimum is `0.1.5-rc.1`, and `0.1.5-rc.2` is also compatible. We recommend rc.2; its native install scripts must be explicitly allowed: ```sh npm install -g --allow-scripts=@deepseek-ai/dsh-subprocess-local,koffi,node-pty,@google/genai,protobufjs,fs-ext @deepseek-ai/dsh@0.1.5-rc.2 dsh plugin --profile pi-tui -- add @xmoon76/dsh-pi-tui@0.4.6 dsh --profile pi-tui ``` Do not pair this release with the historical DSH `0.1.3-alpha.2` line. Users who must keep an older DSH should install the matching historical TUI: use `@xmoon76/dsh-pi-tui@0.4.1` for DSH `0.1.2-rc.1`, `@xmoon76/dsh-pi-tui@0.4.3-alpha.2` for DSH `0.1.3-alpha.2`, and `@xmoon76/dsh-pi-tui@0.3` for the older DSH `0.1.1-rc.1`/`rc.2` line. ### Added - **Explicit delivered-file presentation.** `present` tool cards now show a human-readable file list, while the final assistant answer summarizes the delivered paths and descriptions in a compact turn tail. ### Fixed - **Focus live presentation stability.** Streaming Markdown in expanded Focus no longer jitters when content height grows or shrinks; historical updates, preparing-tool transitions, completion, and Focus/fullscreen changes release stale height baselines correctly while preserving explicit user scroll intent. > **Known limitation:** The production default backend remains Direct; remote attach is not supported. ## [0.4.5] - 2026-09-11 ### Installation and version pairing This stable release has a minimum DSH version of `0.1.5-rc.1` and is also compatible with `0.1.5-rc.2`. We recommend rc.2; its native install scripts must be explicitly allowed: ```sh npm install -g --allow-scripts=@deepseek-ai/dsh-subprocess-local,koffi,node-pty,@google/genai,protobufjs,fs-ext @deepseek-ai/dsh@0.1.5-rc.2 dsh plugin --profile pi-tui -- add @xmoon76/dsh-pi-tui@0.4.5 dsh --profile pi-tui ``` Do not pair this release with the historical DSH `0.1.3-alpha.2` line. Users who must keep an older DSH should install the matching historical TUI: use `@xmoon76/dsh-pi-tui@0.4.1` for DSH `0.1.2-rc.1`, `@xmoon76/dsh-pi-tui@0.4.3-alpha.2` for DSH `0.1.3-alpha.2`, and `@xmoon76/dsh-pi-tui@0.3` for the older DSH `0.1.1-rc.1`/`rc.2` line. ### Added - **PTC / `run_code` nested tool tree.** Sub-calls inside a `run_code` program now render as a recursive tree under the root Code card instead of scattered top-level tool rows; Focus, `/search`, and Markdown export preserve the nesting and show a compact active-child hint. - **Session presentation aligns with DSH Session semantics across V2/V3 persistence generations.** Live answers, tool results, Thinking, and cold-resumed sessions now render consistently; Focus, Transcript, and Stats no longer duplicate transient stream content. - **`/search` converges into the Session Browser.** `/sessions`, `/resume`, and `/search` share one global view for session metadata and content; older sessions are searchable, and metadata filtering remains available when content search fails. - **Unified attachment intake.** `@` mentions, `/image` arguments, and pasted content now share one pipeline, keeping image, file, placeholder, and draft submission behavior consistent. - **Inline `/skill` references complete in drafts.** `/name` tokens can complete from the detached skill catalog; acceptance inserts only the reference, and the final ordinary prompt lets the Host inject the recognized skill. - **Scalable Workflow UI.** Run/Phase cards show members for small runs and aggregate summaries, abnormal previews, and a filterable Task Viewer for large runs; completed, cancelled, and interrupted states are presented distinctly. - **Workflow lifecycle/model parity with DSH alpha.2.** Workflow preserves complete run and member statuses, with cold replay, live records, search, and `/transcript` using the same result model. - **`/export` saves the full Session archive.** The command now produces the official full Session-tree archive (descendants + attachments) and asks for a Client-local save directory after the command succeeds; the file name is fixed to the full Session id. The old single-log JSONL export is gone. - **New `/transcript` command.** Saves a readable Markdown transcript of the current Session to a Client-local directory, with the same no-argument/save-location UX as `/export`. - **Welcome card visual refresh.** The session-head card now shows an original round-backed whale ASCII mascot (five variants, one picked per process) with three responsive layouts: side-by-side (whale left, facts right) at 72+ columns, stacked (whale centered above the facts) at 24–71 columns, and a compact text layout (🐋 title) below 24 columns. The whale keeps a fixed cyan → blue brand gradient that does not follow theme switches; facts still render in full (long values wrap, never truncate); the idle invitation, the `setWelcomeCard()` contract, and fullscreen scroll/anchor/click mapping are unchanged. ### Changed - **Updated builtin default Footer layout.** The default statusline (no custom Footer) now uses two rows: row 1 keeps permission, model, tasks, cwd, branch and extension items on the left, with plan state and Focus Mode on the right; row 2 composes token usage, cache hit, TTFB, throughput and the turn/step counters on the left (the semantic decomposition of the stats line), with the full context pressure (`used/window (percent)`) on the right. Users with a saved custom `footerLayout` are unaffected. ### Improved - **Streaming tool preparation UX.** Preparing cards migrate more reliably around block completion: delayed names keep a bounded prefix, empty call ids migrate to the authoritative block-end id, and parallel previews keep independent bytes and summaries. - **Content-block presentation.** Open opaque assistant blocks render immediately (no longer waiting for the stream to end), pending finals are fenced, stale confirmed assistant previews refresh, and the continuable subagent viewer keeps its viewing history. - **Commands are decided by the whole LINE, not by the command name.** The DSH decision table (`CommandDescriptor.input`) distinguishes a `leadingInput` command (e.g. `/goal`), whose arguments are part of the invocation, from an execute-kind one (e.g. `/compact`), where only the BARE token is an invocation. Previously any name present in the command catalog sent the whole line to the command plane — `/compact anything` executed the command, ignored the busy queue/steer policy while running, and was even refused by the command attachment rule when it carried an image. Such a line now behaves exactly like an ordinary prompt: it follows the busy policy (queue/steer, and Ctrl+Enter takes the opposite), and its image is delivered to the model as a multimodal prompt. Real invocations — `/compact`, `/goal `, `/plan ` — still execute through the command plane, and the attachment rule only applies to a line a command actually claims. - **`!`/`!!` shell lines refuse attachments instead of passing the placeholder to the shell.** The local shell never admitted or consumed drafts, so `!echo [image #1]` used to run with the placeholder as ordinary shell arguments and leave the image staged. The line is now refused like any other local command, and the draft comes back with its attachment intact. - **Command attachments follow the command's own declaration.** A command may be invoked with attachments only when its descriptor declares `input.attachments`; anything else refuses the line up front (`/ does not accept attachments; remove them first`) instead of handing the host a placeholder with no payload. A declaring command receives the submitted images as encoded attachments on the host command call, and a command submission consumes them only after handler success — a failed command restores the draft WITH its attachments. File attachments are refused for commands (the host expects an upload receipt this client cannot produce yet). Skill invocations are unaffected: an explicit `/skill [image #1]` and a skill wrapper stay agent-facing, so their images ride the delivered prompt instead of the command wire. The policy follows the FINAL authority: an unknown `/name [image #1]` line whose command only appears with the session (a session-scoped host command) is checked again after the session resolves — an undeclared command refuses it instead of running with an empty payload and consuming the draft. - **An attachment-bearing `/name args` line is no longer treated as a client command.** A client command contribution claims the BARE `/name` token only, so a line such as `/deploy [image #1]` (an attachment always brings input with it) was never a contribution invocation: it is an ordinary multimodal submission that reaches the model — the plugin handler does not run and no "local command" attachment refusal is raised. - **A plugin reload during a deferred start never runs the next generation.** If the contribution is unloaded/replaced while the first submission resolves its session (even under the same owner and id), the submitted command does **not** run the new handler and is **never** downgraded to a model prompt: the submission is aborted with `/ is no longer available` and the draft is restored for a retry. - **Ctrl+Enter now follows the web submission semantics.** While the agent is running, Ctrl+Enter takes the **opposite** of the busy-Enter behavior: it steers under the default `busyEnter=queue` and queues under `busyEnter=steer` (an idle agent always queues). The old `app.input.queue` action is kept as a deprecated, key-less action, so a stored remap still means "queue" instead of being silently turned into the opposite behavior; the new `app.input.submitAccelerated` owns Ctrl+Enter. - **Throughput statistics use observable decode throughput.** Footer tok/s now uses counted output tokens over the observable decode window; burst samples are not mixed with full LLM wall time or counts from other response stages. - **Focus steer chronology is more reliable.** Early, late, and same-timestamp steer/answer events use the provable boundary; answers crossed by a steer are not lost or shown twice. ### Fixed - **A stale command handle can no longer remove a newer registration.** A dispose handle names ONE registration: a repeated or late `dispose()` (a fiber cleanup arriving after an HMR reload re-registered the same id) no longer removes the newer contribution or drops its health record. - **Text-input keyboard ownership is corrected.** Free-text editing no longer loses its line-editing keys to the parent: in Question's “Type something.” edit, `←/→` are the text cursor (previously they could commit and move on, or page back), and `Home/End/Ctrl+A/E/B/F/Delete` etc. all reach the shared Input. Optionless questions now use an explicit two-layer state: in the EDIT layer `←/→` move the text cursor, `↵` commits, and `Esc/Ctrl+C` only leave the edit for the NAVIGATION layer, where `↵` re-enters the edit, `←/→` page between questions (or skip), and `Esc/Ctrl+C` cancel the whole flow (previously Esc either stranded such a question in a half-dead, uneditable state or cancelled the whole flow outright). The Question edit-mode and Task Center search-mode footers only advertise what the current mode actually does (no more `↑↓ select` / `A active/all` list actions while typing). Transcript search now closes on Esc or Ctrl+C (the `app.transcript.search.close` defaults were extended — previously the overlay's Input swallowed Ctrl+C), and shows a `↵ next · ⇧↵ prev · esc/ctrl+c close` hint under the input. The `/keybindings` search box is rendered by the shared Input: full cursor/Home/End/Delete/word-move editing works, and the hint flips between `Esc: clear` (non-empty query) and `Esc: close`. - **Direct sessions are now fully retired on exit.** Exiting the TUI now retires the main Agent, its continuable subagents and Agent-scoped background jobs in a fixed order: cancel the main Agent and await quiescence → drain continuable descendants → final persistence flush → release the AgentHandle. Previously the process could linger for ~5 minutes after exit while a continuable subagent stayed alive; exit now completes within seconds, and the diagnostics distinguish surface close, Host retirement and launcher exit. Session switches (/new, /fork, rewind, /sessions) also retire the old owner's continuable descendants after the commit. - **Presentation details.** Diff presentation aligns with official DSH semantics (folded multi-hunk diffs stay bounded; edit headers and result parity are preserved); `@` file completion keeps full paths and fixes marquee routing and host cleanup; model selection survives fork and rewind; steers after a Focus thought are kept for non-user turns and opening steers are distinguished from mid-turn input; assistant tool-result presentation survives the presentation pipeline. - **Session open/switch robustness.** Opening or switching sessions (/new, /resume, fork, rewind, /sessions) no longer drops state: the previous session stays visible and usable until the new one is ready, a failed initial bootstrap no longer strands the surface (retry still opens), the old Agent keeps write authority until the new session takes over, and late-arriving assistant stream fragments are reassembled per official semantics without half-built or orphan blocks. ### Compatibility - **Client command contributions are bare-token invocations only (breaking).** DSH `matchEnter` parity: a contribution is a slash-MENU entry, so it claims the BARE `/name` token only — `/name args` is not an invocation. It is an ordinary submission that reaches the model (busy policy and attachments included), and the plugin `handler` never runs for it. Previously `/deploy prod` ran the plugin handler. A plugin that needs arguments should open its own picker from the bare command, or expose the capability to the model as a tool. - **The extension API version is now 2 (breaking).** `api().apiVersion` reports `2` because the plugin command contribution contract below is a breaking change to the STABLE surface (removed `execution`/`argumentProvider`, required `handler`); `1` stays the M0–M3 foundation, so a plugin can tell the two schemas apart. A plugin still declaring the removed v1 shape is rejected at registration instead of being silently reinterpreted. - **Plugin command contributions now follow the DSH client command model (breaking).** The `execution: 'local' | 'submission'` ownership metadata is REMOVED: a contribution IS a client-owned command (a required `handler`, no host descriptor) that joins the `/` menu and executes locally, never steered. A name that collides with the current host catalog FAILS the candidate synthesis as a whole (no menu rows are installed, the collision is recorded on the contribution's health and surfaced once, naming every colliding contribution of that failed pass) while the host command keeps its claim — it can never be downgraded to a model prompt. A contribution used to advertise a prompt-style name should simply not be registered (an unclaimed `/name args` line is already a prompt; the host-side skill owns discovery). `sessionless: true` runs the command before a session exists; the default `false` resolves/creates the session first. A collision with the SESSION's host catalog fails the whole candidate pass at synthesis time (upstream `source-failed` parity: the source's command rows are withdrawn until a synthesis succeeds again) while the host claims stay refreshed — input authority is never lost — and the collision is recorded on the contribution's health and surfaced once per identity/failure generation (the notice names every collision of that pass); a collision with the TUI's own static command names is rejected at registration. The never-wired `argumentProvider` field is removed too (use `registerAutocomplete`). - **Standalone composition callers retain `ModelSelectionRef` compatibility.** The root `composeAgent(ctx, ref)` form remains supported, and its setup installs the caller-owned selection without requiring an Agent; the Direct runner continues to use the explicit Agent-local installer form. > **Known limitation:** The production default backend remains Direct; remote > attach is not supported. ## [0.4.3-alpha.2] - 2026-09-08 ### Installation and version pairing For this prerelease line, install the matching DSH first and then add the TUI bundle into a profile: ```sh npm install -g @deepseek-ai/dsh@0.1.3-alpha.2 dsh plugin --profile pi-tui -- add @xmoon76/dsh-pi-tui@0.4.3-alpha.2 dsh --profile pi-tui ``` Users who must keep an older DSH should pin the matching TUI: `0.1.1-rc.2` → `@xmoon76/dsh-pi-tui@0.3`; `0.1.2-alpha.2`/`alpha.3` → `@xmoon76/dsh-pi-tui@0.4.0-alpha.1`; `0.1.2-alpha.4`/`alpha.5` → `@xmoon76/dsh-pi-tui@0.4.0-alpha.2`; `0.1.2-rc.1` → `@xmoon76/dsh-pi-tui@0.4.1`. The complete version matrix and update/remove commands are in the README's “Install into a DSH profile” section. ### Added - **PTC / `run_code` nested tool tree.** Sub-calls dispatched inside a `run_code` program now render as a recursive sub-call tree under the root Code card: a full identity chain (`subCallId`/`parentCallId`/`rootCallId`) supports grandchild topology, and orphan start/settle facts are parked privately and connected when their parent appears — never promoted to top-level surface rows. The tree is aligned with Focus, display and search: in collapsed Focus, `run_code` stays the formal Tool slot with a compact active-child hint (e.g. `Bash running` / `Bash ×2 running` / `Bash +1 running`, with a width-degradation ladder); the `/search` corpus recursively includes sub-call descendants (matches locate the root Code card); markdown export keeps nested output. - **Session presentation aligns with DSH v2 semantics.** The Direct adapter ingests official `agent/assistant-stream` live frames (completed-turn fences, revision-gap resynchronization); Transcript/Focus/Stats fold the transient plane; cold replay restores thinking from assistant/message blocks; the old durable assistant/chunk private path is gone. - **`/search` converges into the Session Browser.** `/sessions`, `/resume` and `/search` now share one session browser: typing a query enters a global search view (local metadata matches ∪ content matches) that is never scoped by the workspace tabs, and hit snippets render on the matching session rows; when content search is unavailable or fails, local metadata filtering keeps working and the browser stays open. - **Session content search aligns with official DSH semantics.** The Direct adapter now uses `sessionQuery.searchSessions()` (matching DSH master `ApiSessionList.search()`: visibility authorization, dedupe, cursor pagination, 20-result window), removing the old “newest 100 sessions + filterEvents” private rule — matches in old sessions are now found. - **Unified attachment intake.** `@` mentions, `/image` arguments and pasted content share one attachment intake pipeline: a bounded signature probe separates images from generic files, generic files keep their metadata and stream at submit time, and placeholder/draft submission behavior is unified. - **Inline `/skill` references complete in drafts.** A `/name` token at a whitespace boundary in a prompt-mode draft completes against the detached human skill catalog; accepting inserts the literal reference without submitting, and the final ordinary prompt lets the Host `dsh-tool-skill` pre-step inject every recognized skill. ### Improved - **Streaming tool preparation UX.** Preparing cards migrate more reliably around block completion: delayed names keep a bounded prefix, empty call ids migrate to the authoritative block-end id, and parallel previews keep independent bytes and summaries. - **Content-block presentation.** Open opaque assistant blocks render immediately (no longer waiting for the stream to end), pending finals are fenced, stale confirmed assistant previews refresh, and the continuable subagent viewer keeps its viewing history. ### Fixed - **A stale command handle can no longer remove a newer registration.** A dispose handle names ONE registration: a repeated or late `dispose()` (a fiber cleanup arriving after an HMR reload re-registered the same id) no longer removes the newer contribution or drops its health record. - **Text-input keyboard ownership is corrected.** Free-text editing no longer loses its line-editing keys to the parent: in Question's “Type something.” edit, `←/→` are the text cursor (previously they could commit and move on, or page back), and `Home/End/Ctrl+A/E/B/F/Delete` etc. all reach the shared Input. Optionless questions now use an explicit two-layer state: in the EDIT layer `←/→` move the text cursor, `↵` commits, and `Esc/Ctrl+C` only leave the edit for the NAVIGATION layer, where `↵` re-enters the edit, `←/→` page between questions (or skip), and `Esc/Ctrl+C` cancel the whole flow (previously Esc either stranded such a question in a half-dead, uneditable state or cancelled the whole flow outright). The Question edit-mode and Task Center search-mode footers only advertise what the current mode actually does (no more `↑↓ select` / `A active/all` list actions while typing). Transcript search now closes on Esc or Ctrl+C (the `app.transcript.search.close` defaults were extended — previously the overlay's Input swallowed Ctrl+C), and shows a `↵ next · ⇧↵ prev · esc/ctrl+c close` hint under the input. The `/keybindings` search box is rendered by the shared Input: full cursor/Home/End/Delete/word-move editing works, and the hint flips between `Esc: clear` (non-empty query) and `Esc: close`. - **Direct sessions are now fully retired on exit.** Exiting the TUI now retires the main Agent, its continuable subagents and Agent-scoped background jobs in a fixed order: cancel the main Agent and await quiescence → drain continuable descendants → final persistence flush → release the AgentHandle. Previously the process could linger for ~5 minutes after exit while a continuable subagent stayed alive; exit now completes within seconds, and the diagnostics distinguish surface close, Host retirement and launcher exit. Session switches (/new, /fork, rewind, /sessions) also retire the old owner's continuable descendants after the commit. - **Presentation details.** Diff presentation aligns with official DSH semantics (folded multi-hunk diffs stay bounded; edit headers and result parity are preserved); `@` file completion keeps full paths and fixes marquee routing and host cleanup; model selection survives fork and rewind; steers after a Focus thought are kept for non-user turns and opening steers are distinguished from mid-turn input; assistant tool-result presentation survives the presentation pipeline. - **Session open/switch robustness.** Opening or switching sessions (/new, /resume, fork, rewind, /sessions) no longer drops state: the previous session stays visible and usable until the new one is ready, a failed initial bootstrap no longer strands the surface (retry still opens), the old Agent keeps write authority until the new session takes over, and late-arriving assistant stream fragments are reassembled per official semantics without half-built or orphan blocks. ### Compatibility - **The `next` line now requires DeepSeek Harness `0.1.3-alpha.2` or later.** The startup notice on an old runtime now gives the exact npm upgrade command (`npm install -g @deepseek-ai/dsh@0.1.3-alpha.2`) instead of referencing an unpublished master source baseline. - **This release is validated against the exact npm `0.1.3-alpha.2` family.** The peer floor is `>=0.1.3-alpha.2`, dev/test dependencies and the frozen lockfile resolve to that exact family, and compatibility/preset/boundary smokes run against that family from the registry. > **Known limitation:** The production default backend remains Direct; remote > attach is not supported. ## [0.4.1] - 2026-09-04 ### Installation and version pairing For this stable release, install the matching DSH first and then add the TUI bundle into a profile: ```sh npm install -g @deepseek-ai/dsh@0.1.2-rc.1 dsh plugin --profile pi-tui -- add @xmoon76/dsh-pi-tui@0.4.1 dsh --profile pi-tui ``` Users who must keep DSH `0.1.1-rc.2` should use `@xmoon76/dsh-pi-tui@0.3`. The complete version matrix and update/remove commands are in the README's “Install into a DSH profile” section. ### Added - **Streaming tool preparation cards.** Tool calls now show live cards during preparation; Focus also shows a compact summary of preparing tools and keeps a stable position when a tool name arrives late. ### Improved - **Focus preparing projection.** Preparing-tool state keeps the correct order across the regular view, the expanded Focus view, and viewer changes; when a block ends it is migrated to the formal tool card or safely cleared. - **Unified keyboard exit confirmation.** Built-in exit entries such as Ctrl+C and Ctrl+D require a same-key second press, so different keys cannot confirm one another. Ctrl+D remains editor-owned forward-delete for a non-empty draft, and custom exit-key mappings remain intact. ### Fixed - Fixed preparing-tool identity migration across block completion and viewer changes, avoiding duplicate, misplaced, or incorrectly cleared cards from late events. - Fixed exit-confirmation hints and editor/command-surface routing so narrow terminals retain the necessary prompt. ### Compatibility - **Continue using DSH `0.1.2-rc.1`.** Version 0.4.1 retains the `>=0.1.2-rc.1` support range; users who must keep DSH `0.1.1-rc.2` should use `@xmoon76/dsh-pi-tui@0.3`. - Version 0.4.1 retains the 0.4 line's Session and legacy-data compatibility. > **Known limitation:** The production default backend remains Direct; remote > attach is not supported. ## [0.4.0] - 2026-09-03 ### Installation and version pairing For this stable release, install the matching DSH first and then add the TUI bundle into a profile: ```sh npm install -g @deepseek-ai/dsh@0.1.2-rc.1 dsh plugin --profile pi-tui -- add @xmoon76/dsh-pi-tui@0.4.0 dsh --profile pi-tui ``` Users who must keep DSH `0.1.1-rc.2` should use `@xmoon76/dsh-pi-tui@0.3`; users on the DSH `0.1.2-alpha.2`/`alpha.3` baseline should pin `@xmoon76/dsh-pi-tui@0.4.0-alpha.1`, and users on the alpha.4/alpha.5 baseline should pin `@xmoon76/dsh-pi-tui@0.4.0-alpha.2`. The complete matrix and update/remove commands are in the README's “Install into a DSH profile” section. ### Added - **Task Center.** `/tasks` is rebuilt as a three-layer task surface: footer badge → Quick Tasks (footer down, Active scope) → the full Task Center (`/tasks`, All scope). An explicit search mode treats printable keys as query text only — they can never fire destructive actions, and Esc exits search before closing the panel. `Stop` (`S` → `Y` confirmed) replaces the old bare-`i` interrupt and is re-validated at dispatch time against the session fence and the Agent registry. The footer badge shows separate running/total agent and job counts plus unacknowledged failure attention; opening either surface acknowledges only the failure rows actually visible. - **Terminal completion notification.** When the main agent settles while the terminal is not focused, a system notification fires (OSC 9 / OSC 777 / bell, chosen by the terminal environment). It triggers only on a true settle — never on retries, compaction, queued continuations or subagent ends. `/settings` gains `Completion notification` mode (Unfocused / Always / Off) and method (Auto / OSC 9 / OSC 777 / Bell) rows. - **`/settings` gains Subagent model selection.** The toggle and the "Subagent allowed models" route picker read and write the official `subagent-model-selection` settings section directly (default off; enabling requires at least one route; sampled at NEW session composition, never rewriting a running session). - **Tool-card action payloads are first-class.** Compact tool cards show the action payload directly, expanded payloads keep their blank lines, and narrow/zero-width rows are handled explicitly. - **Footer custom command items.** The `/footer` Add picker gains `+ Create Custom Command` — items with a refresh interval, timeout and semantic tone. Commands activate only from the USER-layer trusted source (project configuration can never supply or activate a command), and the render path never spawns. - **`/model` selection is persisted per live Agent.** Each live Agent owns its own selection reference; the footer and `/model` follow the current Agent, with latest-wins fencing between the global default and session-local choices. - **The Focus expanded view preserves user steer chronology.** The initial user stays before the Thought and later steers/users return to their actual chronological position; the compact Message becomes the third process slot (Think → Tool → Message) showing the newest up to three rows. - **The fullscreen mouse-wheel step is configurable.** `/settings` gains a `Mouse wheel lines` row (1/2/3/5/8, default 1). - **Todo panel interaction polish.** With five or fewer items the panel is a two-state summary ↔ list; rapid consecutive clicks coalesce into one gesture instead of flashing the panel away. - **Long-session search is a stable indexed projection.** Fullscreen search uses stable item identities over a single corpus; a query iterates only the entries dirtied since the last run, and jumps anchor by the stable turn. - **Status-line and `/status` context readings are unified and deduplicated.** Ordinary refreshes read the cache; `/status` forces one measurement into the cache, so the panel and footer can no longer disagree. ### Improved - **`/sessions` and `/resume` are faster and cancellable.** The picker opens input-first (Enter while loading can never resume); each session gets one combined projection read (live rows read the in-memory snapshot, cold rows read the durable cache, and only genuine cache misses run a bounded observe); progressive enrichment is cancellable — closing, quitting or re-opening aborts the scan; `/resume ` shares the same lifecycle. - **Paste handling is more reliable.** A large paste followed by `Ctrl+G` no longer loses content in the external editor (`$EDITOR` sees the expanded text); outbound drafts (steer / submit / queue / subagent submission) expand paste markers uniformly instead of leaking literal markers onto the wire. - **The editor submit binding is independent.** A dedicated `tui.editor.submit` binding (Editor-only) means question free-text and search boxes are no longer submitted by `submit: ctrl+x`-style configs. ### Fixed - **Surfaces keep their state across terminal resizes.** The queue pane, todo panel, history-search overlay and approval dialog rebuild from raw state at the live geometry without losing component state, focus or overlay semantics. - **The diff view no longer shows unprovable line numbers.** When the DSH FileDiff contract carries no hunk anchors, the gutter is hidden — absolute line numbers are never guessed. - **The Focus expanded view keeps the initial user prompt before the Thought.** Injected system rows no longer push the first user message below the Thought. - **The builtin todo summary returns after the panel closes.** With an extension host attached, closing the panel no longer leaves the dock's todo summary permanently empty. - **Stability hardening.** The process slot is held until the final dispose and editor-mount/component disposal is hardened, reducing races on exit and HMR. - Explicit cold resume shows startup progress before the TUI mounts (`Resuming session…` / `Preparing conversation…`) instead of a blank terminal that reads as a hang. - Search overlay Next/Prev no longer skip newly arrived matches. - A live tail append refreshes the whole read group, so search jumps never anchor a stale window. - An instantly-exiting footer command child no longer crashes the TUI (EPIPE swallowed). ### Migration notes and compatibility - **The 0.4 line moves to DeepSeek Harness 0.1.2.** The declared support range is `>=0.1.2-rc.1`; runtimes below rc.1 get a startup notice: alpha.4/alpha.5 fall back to `@xmoon76/dsh-pi-tui@0.4.0-alpha.2`, alpha.2/alpha.3 fall back to `@xmoon76/dsh-pi-tui@0.4.0-alpha.1`, and older runtimes fall back to 0.3. - Development/test dependencies and the Source Mode pin move to `dsh-v0.1.2-rc.1`; the published peer floor stays `>=0.1.2-rc.1`. - Agent preset identity is roster-aware; an omitted legacy `code` default falls back to `ptc` when the roster proves `code` is absent. - Upstream alpha caveat: DSH 0.1.2-alpha.1 still has an upstream subagent-dispose caveat. > **Known limitation:** the production default backend remains Direct; remote > attach is not supported yet. ## [0.4.0-alpha.2] - 2026-09-03 ### Installation and version pairing For this prerelease, install the matching DSH first and then add the TUI bundle into a profile: ```sh npm install -g @deepseek-ai/dsh@0.1.2-alpha.5 dsh plugin --profile pi-tui -- add @xmoon76/dsh-pi-tui@0.4.0-alpha.2 dsh --profile pi-tui ``` Users who must keep DSH `0.1.1-rc.2` should use `@xmoon76/dsh-pi-tui@0.3`; users on the DSH `0.1.2-alpha.2`/`alpha.3` baseline should pin `@xmoon76/dsh-pi-tui@0.4.0-alpha.1`. The complete matrix and update/remove commands are in the README's “Install into a DSH profile” section. ### Added - **Task Center.** `/tasks` is rebuilt as a three-layer task surface: footer badge → Quick Tasks (footer down, Active scope) → the full Task Center (`/tasks`, All scope). An explicit search mode treats printable keys as query text only — they can never fire destructive actions, and Esc exits search before closing the panel. `Stop` (`S` → `Y` confirmed) replaces the old bare-`i` interrupt and is re-validated at dispatch time against the session fence and the Agent registry. The footer badge shows separate running/total agent and job counts plus unacknowledged failure attention; opening either surface acknowledges only the failure rows actually visible. - **Terminal completion notification.** When the main agent settles while the terminal is not focused, a system notification fires (OSC 9 / OSC 777 / bell, chosen by the terminal environment). It triggers only on a true settle — never on retries, compaction, queued continuations or subagent ends. `/settings` gains `Completion notification` mode (Unfocused / Always / Off) and method (Auto / OSC 9 / OSC 777 / Bell) rows. - **`/settings` gains Subagent model selection.** The toggle and the "Subagent allowed models" route picker read and write the official `subagent-model-selection` settings section directly (default off; enabling requires at least one route; sampled at NEW session composition, never rewriting a running session). - **Tool-card action payloads are first-class.** Compact tool cards show the action payload directly, expanded payloads keep their blank lines, and narrow/zero-width rows are handled explicitly. ### Improved - **`/sessions` and `/resume` are faster and cancellable.** The picker opens input-first (Enter while loading can never resume); each session gets one combined projection read (live rows read the in-memory snapshot, cold rows read the durable cache, and only genuine cache misses run a bounded observe); progressive enrichment is cancellable — closing, quitting or re-opening aborts the scan; `/resume ` shares the same lifecycle. - **Paste handling is more reliable.** A large paste followed by `Ctrl+G` no longer loses content in the external editor (`$EDITOR` sees the expanded text); outbound drafts (steer / submit / queue / subagent submission) expand paste markers uniformly instead of leaking literal markers onto the wire. - **The editor submit binding is independent.** A dedicated `tui.editor.submit` binding (Editor-only) means question free-text and search boxes are no longer submitted by `submit: ctrl+x`-style configs. ### Fixed - **Surfaces keep their state across terminal resizes.** The queue pane, todo panel, history-search overlay and approval dialog rebuild from raw state at the live geometry without losing component state, focus or overlay semantics. - **The diff view no longer shows unprovable line numbers.** When the DSH FileDiff contract carries no hunk anchors, the gutter is hidden — absolute line numbers are never guessed. - **The Focus expanded view keeps the initial user prompt before the Thought.** Injected system rows no longer push the first user message below the Thought. - **The builtin todo summary returns after the panel closes.** With an extension host attached, closing the panel no longer leaves the dock's todo summary permanently empty. - **Stability hardening.** The process slot is held until the final dispose and editor-mount/component disposal is hardened, reducing races on exit and HMR. ### Compatibility - **The minimum DSH is raised to `>=0.1.2-alpha.4`** (from `>=0.1.2-alpha.2`). Runtimes below alpha.4 get a startup notice: alpha.2/alpha.3 fall back to `@xmoon76/dsh-pi-tui@0.4.0-alpha.1`, older runtimes fall back to 0.3. - Development/test dependencies and the Source Mode pin move to `dsh-v0.1.2-alpha.5`; the published peer floor stays `>=0.1.2-alpha.4`. > **Known limitation:** the production default backend remains Direct; remote > attach is not supported yet. ## [0.4.0-alpha.1] - 2026-09-01 ### Installation and version pairing ```sh npm install -g @deepseek-ai/dsh@0.1.2-alpha.3 dsh plugin --profile pi-tui -- add @xmoon76/dsh-pi-tui@0.4.0-alpha.1 dsh --profile pi-tui ``` Users who must keep DSH `0.1.1-rc.2` should use `@xmoon76/dsh-pi-tui@0.3`. ### Added - **Footer custom command items.** The `/footer` Add picker gains `+ Create Custom Command` — items with a refresh interval, timeout and semantic tone. Commands activate only from the USER-layer trusted source (project configuration can never supply or activate a command), and the render path never spawns. - **`/model` selection is persisted per live Agent.** Each live Agent owns its own selection reference; the footer and `/model` follow the current Agent, with latest-wins fencing between the global default and session-local choices. - **The Focus expanded view preserves user steer chronology.** The initial user stays before the Thought and later steers/users return to their actual chronological position; the compact Message becomes the third process slot (Think → Tool → Message) showing the newest up to three rows. - **The fullscreen mouse-wheel step is configurable.** `/settings` gains a `Mouse wheel lines` row (1/2/3/5/8, default 1). - **Todo panel interaction polish.** With five or fewer items the panel is a two-state summary ↔ list; rapid consecutive clicks coalesce into one gesture instead of flashing the panel away. - **Long-session search is a stable indexed projection.** Fullscreen search uses stable item identities over a single corpus; a query iterates only the entries dirtied since the last run, and jumps anchor by the stable turn. - **Status-line and `/status` context readings are unified and deduplicated.** Ordinary refreshes read the cache; `/status` forces one measurement into the cache, so the panel and footer can no longer disagree. ### Fixed - Explicit cold resume shows startup progress before the TUI mounts (`Resuming session…` / `Preparing conversation…`) instead of a blank terminal that reads as a hang. - Search overlay Next/Prev no longer skip newly arrived matches. - A live tail append refreshes the whole read group, so search jumps never anchor a stale window. - An instantly-exiting footer command child no longer crashes the TUI (EPIPE swallowed). ### Migration notes - **0.4.0-alpha.1 moves to DeepSeek Harness 0.1.2.** The declared support range is `>=0.1.2-alpha.2`; users keeping DSH 0.1.1 should pin `@xmoon76/dsh-pi-tui@0.3`. - Agent preset identity is roster-aware; an omitted legacy `code` default falls back to `ptc` when the roster proves `code` is absent. - Upstream alpha caveat: DSH 0.1.2-alpha.1 still has an upstream subagent-dispose caveat. ## [0.3.6] - 2026-08-31 ### Added - `@` mentions and `/image` arguments share one file-completion engine (path parsing, ranking, quoting, directory continuation). - Long sessions use a bounded transcript window (overlapping paging, `Ctrl+End` back to the latest, preserved window anchors). - Submission has immediate feedback and an observable latency timeline (`Submitting…` / `Queued…`). ### Changed - `/footer` saving is discoverable and transactional (Save changes / Unsaved states, Esc confirmation). - Session writes use a fail-closed ownership model (owner lock + single-writer boundary). ### Fixed - Async completion results always repaint the active screen. - The footer honors the real available budget on narrow terminals, fullscreen changes and command surfaces. - Transcript window changes, search and live follow no longer lose viewport anchors. > **Known limitation:** the production default backend remains Direct; remote > attach is not supported while M2–M8 are unfinished. ## [0.3.5] - 2026-08-28 ### Added - **The `/footer` configurator is redesigned as a hierarchical status-line editor.** Row Selector → Edit Row → Item Editor; `A` opens a searchable Add Picker; the preview and help are a fixed shell; the save key moves to `S`. - **Footer supports user-defined static text items.** `+ Create Custom Text`, read only from the USER settings layer. - **Builtin footer items expose meaningful finite styles.** Model / Permission / Working directory / Context / Token usage / Performance / Turns gain distinguishable variants. - **Plugin theme selections are SOURCE-QUALIFIED (`plugin:/`).** Plugin and file themes no longer share a bare name namespace; an unloaded plugin degrades deterministically to the built-in dark palette. - **An `Icon style` setting** switches between Emoji, Symbols and Minimal structural icon palettes, applied immediately. - **Keybindings are user-orchestrable.** Semantic actions resolved through a context-aware keymap; `/keybindings` shows the effective table, `conflicts` lists conflicts, `reload` re-reads, `reset` clears; `X` multi-key bindings; `DSH_PI_TUI_SAFE_KEYBINDINGS=1` ignores all overrides. - **The `/help` and `/settings` key copy is key-neutral.** It never claims a physical key that a remap could make stale. - **A trusted command status line (Claude/Kimi style).** `footer: command` hands the status surface to a user-configured command (JSON snapshot on stdin, stdout rendered, periodic refresh, fallback to the native layout on failure); only a USER-layer `footerCommand` is ever executed. ### Changed - The footer is a composable, user-configurable surface (`custom` preset + versioned `footerLayout`). - Plugins can contribute configurable footer items (`chrome.footer.item` slot). - The question flow and task browser route keys through semantic component actions. ### Fixed - Empty input no longer manufactures a message or a side effect (Enter / Ctrl+Enter / Ctrl+S are silent no-ops). - Editor ↑/↓ history is projected onto the active session. - Terminal window titles are human-readable (`dsh · `, sanitized against ANSI/OSC). - Ghost Tool Cards after compaction/prune are gone. ## [0.3.4] - 2026-08-25 ### Added - **Ctrl+R searches your input history.** A modal panel filters live; `Tab` cycles Current session / Current directory / All directories; bounded recent-first scanning (5000-line global budget); paged continuation; `Enter` puts the selection back into the editor for editing. - **`/tasks` shows the full subagent lineage as a tree.** Depth indentation with `├─` connectors in stable pre-order; nested descendants are read-only. - **The selected row's long label marquees** instead of truncating. ### Changed - **Thinking blocks are disclosure, not visibility.** `Alt+T` is the one bulk owner; `Ctrl+O` owns only tool/system/compaction detail. - **`!` / `!!` shell lines are a first-class editor mode.** The prompt itself becomes `!`/`!!`; pasting `!git status` lands as mode + command. - **Local shell cards preview instead of flooding the screen.** A running card collapses to the newest 5 lines, a settled card to at most 20; `Alt+K` quick-dismisses settled cards. ### Fixed - A startup-time TDZ (footer command lifecycle slots declared too late). - Ctrl+V image paste works again on Linux Wayland/X11 (forced buffer encoding). - Task overlays no longer draw a black mask beside the border. ## [0.3.3] - 2026-08-24 ### Added - **Continuable subagent viewers are interactive.** A live conversation surface with the child's own draft, FIFO delivery, and failed deliveries merged back into the draft; one-shot children stay read-only. - **The task browser shows the subagent mode** (`continuable` / `one-shot`). - **Focus Mode** folds a running turn's intermediate activity into a live Thought block; clicking expands it and streaming continues into the open region. - **`Home/End keys` are configurable in `/settings`** (Input / Viewport). - **`@`-file mentions reach the model as absolute paths.** - **The task browser filters by row type** (Tab cycles All → subagent → bash → pwsh). - **Pi-style rewind: `Esc Esc` (or `/rewind`)** forks the conversation from an earlier user turn; the original session is never modified. - **`/fork` and `/rewind` share one fork chain.** ### Changed - Esc never destroys your queue again (keepInbox semantics). - `/sessions` scopes by directory (Current directory / All directories). - The question review page is a pure review (Enter submits, Esc cancels, `←` returns). ### Fixed - Session transitions are a single-writer transaction: a switch waits for the current activity, failures leave no half-created branch, and two processes can never write one session. - The double-Esc rewind chord is truly consecutive. - Fullscreen drag selection and `/copy` no longer fake a successful copy (tmux / platform helpers / OSC 52 fallback). - The `Press Ctrl+C again to exit` hint lives in the footer for exactly the exit window. - A settled background job card keeps its command. - `@dir` completion no longer depends on a trailing slash. ## [0.3.2] - 2026-08-22 ### Added - **User input renders as a brand-blue bubble** with a matching `❯` prompt (overridable palette token). - **`/image <path>` completes paths.** - **Mixed image messages keep an inline `🖼️` placeholder.** - **Fullscreen: click an attachment to collapse/expand the picture** (with a constant identity line). ### Fixed - Injected context rows never leak their XML envelopes when expanded. - The image summary marker `🖼️` (U+FE0F) no longer overlaps the filename. - Write / skill / read_image cards fold their content, never the raw XML envelope. ## [0.3.1] - 2026-08-21 ### Changed - A startup gate explains an unsupported harness (detected version, minimum version, upgrade command). - The `/login` surface separates the two credential planes in its copy. ## [0.3.0] - 2026-08-21 ### Added - **Provider-native sign-in.** `/login` understands the two credential planes: the API-key path and OAuth / device-code native login; secret prompts render masked. - **`/logout` clears both credential planes.** ### Changed - **Minimum compatible DeepSeek Harness is `dsh-v0.1.1-rc.1` or later** (no longer 0.1.0-rc.8). - The header version badge shows the dsh version first, then the `tui-` version. ### Security - Authorization secrets are never printed, logged, put in input history, written to the transcript, or shown in `/status`. ## [0.2.2] - 2026-08-21 ### Added - **Merged task browser as the single background surface.** `/tasks` opens one searchable list over jobs AND subagents; `/subagents` became an alias. - **Alias registration for TUI commands** (`/quit`, `/resume`, `/rename`, `/subagents`). - **Subagent-family tool cards show their model.** - **`!` / `!!` shell lines complete like a real shell** (command names, `$VAR`, git subcommands). - **Local shell sandbox preference.** User-typed commands bypass the dsh sandbox by default. - **Question cards show their answers; goal cards are readable.** Folded previews never leak raw JSON. - **Fullscreen todo dock click.** ### Changed - Queue pane notice classification (user rows `❯` / notice rows `⏳`). - Ctrl+J is no longer a host keybinding. - `!` / `!!` run in the session workspace. ### Removed - **`/queue` command removed outright.** The queue pane is the single queue surface. ### Fixed - Alt+↑ dequeue only pulls the user's own messages back. - The double-Ctrl+C exit chord is visible and forgiving (1.5s window + hint). - Folded cards never leak raw JSON. ## [0.2.1] - 2026-08-21 ### Changed - The repository root is now the published package (no behavior change for npm consumers). ## [0.2.0] - 2026-08-21 ### Added - **Extension platform v1.** A third-party Cordis plugin can contribute chrome, widgets, slash commands, themes, settings rows, autocomplete, keybindings, renderers, overlays, and even replace the editor; plugins import only `@xmoon76/dsh-pi-tui/extensions` and are fully lifecycle-owned. - **Tiered extension surface.** Stable `extensions` + `advanced` (experimental) + `unstable` (no compatibility guarantee). - **`/login` can add a provider the deployment has never configured** (a guided wizard + endpoint model probing). - **Real-plugin validation.** A vim modal editor, a questionnaire form and an interactive shell example. - **`@dir/` mention completion reopens after Tab.** - **`/sessions` and `/resume` categorize the session list** (Main / All / Subagents). - **Faster session-title loading** (progressive batches + local cache). - **Context-compaction progress and results** (notices + an expandable compaction card). - **`/model` dismisses after applying an effort.** - **The footer wraps on narrow terminals.** ### Changed - A TUI surface has an explicit lifetime (generation / dispose). - Ctrl+C and Esc follow pi's editor semantics. ### Security - Plugin text can no longer inject terminal control sequences. ### Fixed - The host can never be shadowed or stalled by a plugin. - Editor replacement is safe (atomic handoff, stale handles become inert). - Narrow terminals stay intact. ## [0.1.8] - 2026-08-18 ### Changed - The question dialog's back/skip verbs are now the arrow keys (`→` / `←` / `↑↓`). ### Fixed - Arrow/Esc/Tab work again on Kitty-keyboard-protocol terminals (zellij, WezTerm, Windows Terminal, kitty). - Skill slash commands no longer swallow the user's arguments. ## [0.1.7] - 2026-08-18 ### Fixed - A user-loaded skill now actually runs (an idle agent starts a fresh turn with it). - The subagent transcript viewer no longer freezes the main transcript. ## [0.1.6] - 2026-08-18 ### Added - Open-time session lock (a second live process is refused; a crashed owner's stale lock is taken over automatically). - Plain `exit` quits the TUI. - `/login` and `/logout` resolve credential targets. - Per-cwd input history stored as JSONL. - Inline skill autocomplete in the editor. - Web-parity tool cards (web results, todo checklists, plan review). - Task browser panel (status dots, live ticking). ### Changed - Background-subagent settlement notices leave the queue pane. - Editor-area chrome (todo summary moves into the dock strip). ### Fixed - Question dialog arrow keys scroll at the scrollport edges. - Session repair strips the trailing empty zstd frame. ### Removed - Dead `@deepseek-ai/dsh-session-query` peer dependency. ## [0.1.5] - 2026-08-17 ### Added - Surface catalog coordinator (resume prefetch, cold-skill reads). - Unified question page scrollport (expand, scroll-position preservation). ## [0.1.4] - 2026-08-16 ### Added - Busy-Enter setting (Enter steers while the agent is running). - `!` shell submits command + output to the session; `!!` stays local. - Subagent viewer covering the editor with a read-only viewer bar. - Task browser merges continuable subagents with the jobs registry. - `/rename` alias of `/title`. ### Changed - Question dialogs live in the editor seat. - Transcript markdown reflows on resize. ## [0.1.3] - 2026-08-16 ### Added - Background jobs get their own surface (queue notices, footer badge, task browser, output viewer). - Theme detection chain and diff tokens. - `@` file mentions. - `/quit` as a native alias of `/exit`. ### Changed - Multi-row tool cards with command/diff previews. - Performance: window projection, cross-turn read groups, message component cache. ### Fixed - Question flows serialize FIFO. - Repair-session (torn zstd tail safety, fsynced backup). - Local-shell output is bounded. ## [0.1.2] - 2026-08-15 ### Added - Queued-input pane and `/queue` management; Ctrl+S steers the whole queue. - `ask_user_question` rebuilt as a navigable flow with review. - Session creation deferred until the first user message. - `/yolo` alias; permission mode badge. - Real LCS diff rendering for edit/write tool cards. ### Fixed - Notify survives repaints. - Slash-command autocomplete no longer lags a keystroke. ## [0.1.1] - 2026-08-15 ### Fixed - `@deepseek-ai/*` declared as peerDependencies (no duplicate copies in the profile). ## [0.1.0] - 2026-08-15 ### Added - First public release: `@xmoon76/dsh-pi-tui`, a TUI surface for DeepSeek Harness profiles (`dsh --profile pi-tui`), built on a vendored pi-tui fork and bundled as a single self-contained package. - Transcript engine (windowing, incremental folding, web-parity tool cards). - Approval dialogs and permission modes; a complete slash-command set. - Fullscreen layout, Ctrl+F transcript search, theme system. - Single-package release model. [Unreleased]: https://github.com/XMoon/dsh-pi-tui/compare/v0.4.6...HEAD [0.4.6]: https://github.com/XMoon/dsh-pi-tui/compare/v0.4.5...v0.4.6 [0.4.5]: https://github.com/XMoon/dsh-pi-tui/compare/v0.4.1...v0.4.5 [0.4.3-alpha.2]: https://github.com/XMoon/dsh-pi-tui/compare/v0.4.1...next-v0.4.3-alpha.2 [0.4.1]: https://github.com/XMoon/dsh-pi-tui/compare/v0.4.0...v0.4.1 [0.4.0]: https://github.com/XMoon/dsh-pi-tui/compare/v0.3.6...v0.4.0 [0.4.0-alpha.2]: https://github.com/XMoon/dsh-pi-tui/compare/next-v0.4.0-alpha.1...next-v0.4.0-alpha.2 [0.4.0-alpha.1]: https://github.com/XMoon/dsh-pi-tui/compare/v0.3.6...next-v0.4.0-alpha.1 [0.3.6]: https://github.com/XMoon/dsh-pi-tui/compare/v0.3.5...v0.3.6 [0.3.5]: https://github.com/XMoon/dsh-pi-tui/compare/v0.3.4...v0.3.5 [0.3.4]: https://github.com/XMoon/dsh-pi-tui/compare/v0.3.3...v0.3.4 [0.3.3]: https://github.com/XMoon/dsh-pi-tui/compare/v0.3.2...v0.3.3 [0.3.2]: https://github.com/XMoon/dsh-pi-tui/compare/v0.3.1...v0.3.2 [0.3.1]: https://github.com/XMoon/dsh-pi-tui/compare/v0.3.0...v0.3.1 [0.3.0]: https://github.com/XMoon/dsh-pi-tui/compare/v0.2.2...v0.3.0 [0.2.2]: https://github.com/XMoon/dsh-pi-tui/compare/v0.2.1...v0.2.2 [0.2.1]: https://github.com/XMoon/dsh-pi-tui/compare/v0.2.0...v0.2.1 [0.2.0]: https://github.com/XMoon/dsh-pi-tui/compare/v0.1.8...v0.2.0 [0.1.8]: https://github.com/XMoon/dsh-pi-tui/compare/v0.1.7...v0.1.8 [0.1.7]: https://github.com/XMoon/dsh-pi-tui/compare/v0.1.6...v0.1.7 [0.1.6]: https://github.com/XMoon/dsh-pi-tui/compare/v0.1.5...v0.1.6 [0.1.5]: https://github.com/XMoon/dsh-pi-tui/compare/v0.1.4...v0.1.5 [0.1.4]: https://github.com/XMoon/dsh-pi-tui/compare/v0.1.3...v0.1.4 [0.1.3]: https://github.com/XMoon/dsh-pi-tui/compare/v0.1.2...v0.1.3 [0.1.2]: https://github.com/XMoon/dsh-pi-tui/compare/v0.1.1...v0.1.2 [0.1.1]: https://github.com/XMoon/dsh-pi-tui/compare/v0.1.0...v0.1.1 [0.1.0]: https://github.com/XMoon/dsh-pi-tui/releases/tag/v0.1.0