DeepSHPlugins
dsh-conversation-rail 專案預覽
GITHUB / COMMUNITY PROJECT

dsh-conversation-rail

UI 增強TypeScriptBSD-3-Clause

對話左緣的導航軌:一根槓一輪對話,槓長按該輪文字型量,懸停出提問與回答預覽,點選跳轉;槓來自 host 側讀整份會話日誌折出的大綱,未載入進視窗的輪次也畫得出來,點選時再翻頁補歷史。

1 Starsdingyi580 更新時間 2026-08-19
訪問 GitHub 倉庫
dsh-conversation-rail 專案預覽

專案介紹

中文

對話左緣的導航軌:一根槓一輪對話,槓長按該輪文字型量,懸停出提問與回答預覽,點選跳轉;槓來自 host 側讀整份會話日誌折出的大綱,未載入進視窗的輪次也畫得出來,點選時再翻頁補歷史。

English

Left-edge conversation rail for the Web UI: one bar per turn, length scaled to the turn text, hover for a question and answer preview, click to jump; bars come from a host-side outline of the whole session log, so turns outside the loaded window are drawn too and history is paged in on click.

專案資訊與收錄訊號

快照 2026-09-11
作者 / 組織
dingyi580
倉庫
dingyi580/dsh-conversation-rail
GitHub Stars
1
Forks
0
開發語言
TypeScript
許可證
BSD-3-Clause
最近推送
2026-08-19
Manifest
資料中檢測到宣告

公開倉庫不自動等於可商用;許可證與當前相容性以原專案文件為準。Manifest 和資料評分不構成安裝安全認證。

資料評分

51/ 100
維護活躍
85
文件與實用資訊
85
生態關注度
9
安裝便捷訊號
75
專案宣告訊號
100

近 23 天仍在更新;README 含完整安裝與使用說明;關注度尚低(1)。

評分來自已有資料快照的五維模型,僅作瀏覽參考,不是實際使用評測或安全檢測結論。

安裝與使用

所有專案資料與許可均以對應 GitHub 倉庫為準。

dsh plugin --profile web add github:dingyi580/dsh-conversation-rail

複製命令不會自動執行。請先閱讀倉庫文件,確認環境要求與許可證。

專案截圖

倉庫 README

GitHub 原文

已儲存的倉庫文件快照;文件抓取時間未記錄,可能與上方目錄介紹處於不同版本。安裝前請核對當前倉庫說明。

儲存庫檔案保留原文,指令與授權文字不作自動改寫。

dsh-conversation-rail · session minimap

English | 中文

A locator for long conversations in DSH Web. A vertical rail sits along the left edge of the conversation, one bar per turn; hover a bar for a preview card, click it to jump to that turn.

  ▏─────                 ┌──────────────────────────────┐
  ▏───────────           │ Can you patch this without…  │  ← question (one line, dark)
  ▏━━━━━━━━━━━━━━  ◀━━━━━┤ CRLF is already ruled out…   │
  ▏──────                │ only the legal re-encodes…   │  ← answer (up to four lines, dimmed)
  ▏────────              └──────────────────────────────┘
  • Bar length = how much text that turn holds (square-root compressed, 10–34px).
  • The bold bar = the turn currently at the top of the scroll area.
  • The preview card carries prose only: your question plus the assistant's plain

text. Fenced code blocks, tool calls, shell commands, reasoning traces and injected context never reach the card — you cannot skim JSON.

It draws the whole session, not the loaded window

Conversation history is paginated: the front-end snapshot usually holds only the most recent stretch, so an 8-turn session may have 1 turn in the window. The rail is not bound by that:

  • The skeleton comes from the host's outline endpoint

(GET /dsh-conversation-rail/api/outline?sessionId=). The host reads the full log with ctx.sessionQuery.readSession(), folds it into a table of contents of roughly a hundred bytes per turn, and returns that — the history itself never crosses the network.

  • The live snapshot overrides the part that is loaded: it carries jumpable DOM

anchors, and for a turn that is still streaming it is the only current source. The two are aligned by the user/message event seq, live winning over outline.

  • Clicking a bar that isn't loaded yet calls session.loadOlder() repeatedly

until that turn enters the window, then jumps. The bar pulses while paging, with a ceiling of 40 pages — better to not reach a turn than to page through an entire log because of one click.

The outline uses readSession rather than the lighter filterEvents because the latter does not return source. The user/message event type carries both real questions and context injected by agent.inject() (file-change notices, AGENTS.md, skill bodies…); the official docs state all three project content verbatim and are told apart by source. Without that field, injected context would be drawn as turns.

How it attaches

It takes one seat: conversation.session.header.utilities. Not to draw anything in the header — that slot is session-scoped, so the component receives the framework's useSession snapshot hook and sessionId, and its lifetime follows the session. The component renders null in the header; the actual rail is a fixed overlay on body, aligned to the measured rectangle of [data-conversation-scroll]. It stays out of the host layout, so switching skins, collapsing the sidebar or changing the grid cannot squeeze it.

Turn data comes from ConversationSnapshot.chat: walk order, open a turn on a user node, attribute the following assistant-step text blocks to it. Jumping uses the host's own anchors ([data-chat-anchor-key]), the same path its internal scroll positioning takes.

Known boundaries

  • The outline is fetched once per session. New turns arrive through the live

snapshot and do not trigger a refetch; only leaving and returning to the session refetches (a 5-second host-side cache absorbs the back-and-forth).

  • Jumping to a very early turn loads every page between it and the window.

That is what pagination means: to show turn 1, everything from there up to the loaded window has to come in. Jumping to recent turns pages almost not at all.

  • If the outline endpoint fails, the rail degrades to drawing only the loaded

stretch rather than disappearing.

  • Previews are rendered as plain text, not markdown: leading #, -, 1. and

emphasis marks are stripped, fenced code is removed entirely.

Install

dsh plugin --profile web add github:dingyi580/dsh-conversation-rail

Then restart dsh web (a newly assembled plugin needs a restart; later code changes can be hot-reloaded with dev_reload_package).

Installing from a local checkout

Put the plugin at ~/.dsh/plugins/dsh-conversation-rail, then add two entries to ~/.dsh/profiles/web/package.json:

{
  "dsh": { "profile": { "bundles": ["…", "dsh-conversation-rail"] } },
  "dependencies": {
    "dsh-conversation-rail": "link:/Users/<you>/.dsh/plugins/dsh-conversation-rail"
  }
}

and link it into the profile's node_modules:

ln -sfn ../../../plugins/dsh-conversation-rail ~/.dsh/profiles/web/node_modules/dsh-conversation-rail

Build

npm run build       # tsc for the host entry + tsdown for src/client → lib/client.js
npm run typecheck   # type check only

lib/ is committed so the plugin installs from GitHub without a build step. Assembly goes through cordis.patch.yml plus the profile's dsh.profile.bundles.

License

BSD-3-Clause

使用前核對

安裝步驟、相容版本與授權範圍以原專案當前文件為準。Stars 和評分是快照中的導航訊號。

安裝與排錯 · 專案問題反饋

同類專案