OpenViking
volcengine
Self-evolving Context Database for AI Agents. Unify Agent Memory, Knowledge RAG and Skills.
PROJECT TOPICS
INSTALL REFERENCE
dsh plugin --profile web add github:dingyi580/dsh-conversation-rail
该命令指向仓库当前默认分支;尚无绑定当前 commit 的完整验证结果。
PROJECT README
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)
▏──────── └──────────────────────────────┘
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:
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.user/message event seq, live winning over outline.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.
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.
#, -, 1. and
emphasis marks are stripped, fenced code is removed entirely.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).
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
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.
BSD-3-Clause
CLASSIFICATION EVIDENCE
系统优先读取 GitHub Topics,再与站内分类词典和词根规则比对。当前命中: conversation-minimap。