← Back to home@YunongDai2005

dsh-theone

One chat for everything, no more hunting for old conversations. A DeepSeek Harness (DSH) plugin./不用再翻旧会话:所有事在一个对话框里聊,自动分到对应的那件事

Stars
6
Language
TypeScript
Created
Sep 30, 2026
Updated
Oct 7, 2026
GitHub repo

Introduction

TheOne

One chat for everything you're working on.
It knows which project each message belongs to, and keeps every project's context separate.

DSH 0.2.0-rc.2 Node.js 24 English / 中文

English | 简体中文

Demo: two unrelated requests in the main chat each get their own topic in the sidebar; going back to the first one continues it in its own topic

A GPU question, a hotel question, then the GPU again, with no cues in between. The two topics on the left made themselves; nothing was clicked. (Example conversation.)


How many sessions are sitting in your DSH sidebar? Getting back to last week's work means digging through them. Skip creating a new one and everything piles into a single session, where topics bleed into each other and the details vanish at the next compaction.

If you've ever said any of these, TheOne was probably written for you:

  • "Where was that chat again?" Too many conversations, and the old one is nowhere to be found.
  • "Not starting a new chat for this, I'll just ask here." And one chat turns into a mess.
  • "I already told you that!" The AI forgot what you talked about.

What TheOne does: you only ever talk in one main chat. In the background it opens a separate session for each thing you're working on and sends every message to the one it belongs to.

How TheOne works: main chat sends each message through the router to its topic session; answers stream back, and the topic directory keeps progress, constraints and links

Each project reasons, runs tools and compacts in its own session. What you see is always one ordinary conversation.

Why try it

Usual workflowWith TheOne
Start something newCreate a session, name itJust say it
Go back to earlier workDig through the sidebarMention it; TheOne finds it
One session gets clutteredTopics interfere; compaction drops detailsEvery project has its own context
Two projects need each otherCopy and pasteThe other project's progress comes along
Wrong projectMove it by handSay "wrong topic"
  • Feels native. Thinking streams in its usual place from the first token, and tool cards, approvals, questions, todo lists, retries and mid-reply steering all work as usual.
  • Related work connects; unrelated work stays out. Related topics share progress automatically, and which ones belong together is learned from how you use them. A topic's constraints (say, "budget figures stay out of the paper") are attached verbatim every time, so compaction never drops them.
  • Learns your words. Once a topic has replies, a short routing card is written in the background (what it is, what you call it, the people, places and files involved), so it is recognised however you phrase it. Say "wrong topic" and it remembers which terms tie that kind of message to the right one. Topics you haven't touched in a long while go to the back of the line; how long is "long" is learned from how you come back to things.
  • Your old sessions become a topic directory. After install it reads your existing sessions in the background, turns them into topics grouped into workspaces, and you pick up where you left off.
  • Nothing extra to configure. No separate API key: it uses the model you chose in DSH. When TheOne is selected, a layers icon beside the model menu shows and switches which model routes and which does the work.

Install in 30 seconds

  1. Configure an API in DSH and select a model that can chat.
  2. Open Plugins → Add plugin, enter dsh-theone under Package name or address, and install.
  3. Click TheOne · Main chat in the sidebar and start talking.

That's it. Works with DSH 0.2.0-rc.2 and Node.js 24; the interface follows DSH's language (English / Simplified Chinese).

New to DSH? A step-by-step walkthrough (about 3 minutes)

No coding needed:

  1. Make sure DSH itself can chat. Add your model provider's API key (DeepSeek's, for example) in DSH's settings, open an ordinary chat and say "hi". If it answers, you're set. TheOne uses that same model; there is no other key to enter.

  2. Install TheOne. Click Plugins in the sidebar, then Add plugin, and enter:

    dsh-theone
    

    Click install and wait for it to finish.

  3. Start. A new TheOne · Main chat appears in the sidebar. Open it and just talk about whatever is on your plate: today's work, the weekend trip, the paper you're writing. No new chats to create, nothing to name.

  4. Updates. When a new version is out, a download icon appears next to the TheOne entry. One click installs it, usually without a restart; your topics live in the database and are untouched.

  5. Changed your mind? Uninstall it on the Plugins page. Your DSH chats are all still there; TheOne organises them and never deletes them.

Small things you may run into

  • "Too new" and it won't install: DSH only installs versions published at least 24 hours ago. That's a safety rule, not an error. Wait a day, or enter the GitHub address https://github.com/YunongDai2005/dsh-theone instead, which installs right away.
  • No TheOne in the sidebar after installing: restart DSH.
  • Something wrong? Click Report a problem at the top right of Topic workspaces: versions and diagnostics (no chat content) are attached, and Send delivers it without GitHub. Or email theone@yulid.org; a screenshot helps.
  • Will it cost a lot? Each message adds one short classification call (no deep thinking), and "ok" or "go on" skips even that. With many old chats, the first pass that organises them uses some of your quota; turn History catalog off in the settings if you don't need it.
Command line and other sources
  • npm: dsh plugin --profile web add dsh-theone --ignore-scripts (use desktop instead of web for the desktop app)
  • GitHub (always the latest main): dsh plugin --profile web add github:YunongDai2005/dsh-theone --ignore-scripts

A new version from npm installs once it has been published for 24 hours; when an update is newer than that, the update button explains it and can exempt TheOne alone so it installs right away.

Unofficial community project, maintained independently. It is not affiliated with or endorsed by DeepSeek.

How well does it route?

Claims are cheap, so we built a public benchmark, InterleaveBench: one person pushing 3–5 things forward in the same chat at once (a trip, a budget, a paper, a training plan…), half in Chinese and half in English, 50 conversations and 2,466 messages, each labelled in advance with the thing it belongs to. Below, the 40-conversation dev split replayed message by message through TheOne's own routing code with DeepSeek V4.1 Flash (messages even a careful human could not attribute are not scored):

ApproachMessages routed correctly
TheOne, topic list given up front91.6%
TheOne, starting from nothing and creating topics as it goes (your first day)86.6%
Keyword search (BM25), topic list given up front73.3%
No routing, everything in one chat44.5%
Keyword search, starting from nothing39.9%
A new topic for every message9.8%

A few numbers worth knowing:

  • A message landing in another thing's topic, the mistake that hurts context most: about 3.7% when starting from nothing.
  • The main weakness today is opening new topics too eagerly: one thing ends up split over 2.1 topics on average. 0.3.21's routing cards go after exactly that.
  • The whole run cost about one US dollar. Data, code and scoring live in eval/; reproduce it, or try another model.

The conversations are model-written from a script and this version has no assistant replies, so it measures whether messages are routed right, not everything about how chatting feels.

What's next

For now, TheOne is being refined on DeepSeek Harness, whose background sessions, tools and compaction can be reused as they are: the right place to get "one chat for everything" solid first.

In progress:

  • Better routing: looking at a burst of messages together while deciding each one separately, and measuring what routing cards add.
  • Confirmed facts shared between topics: a budget, a date, where a file lives, kept current wherever you need it. It is experimental and will only be turned on by default once it passes its benchmark.

Once it is stable, the next step goes beyond DSH:

  • A standalone client: one interface over different models and providers, opening straight into a single chat;
  • or adapters for other platforms: the same automatic topics, inside the chat tools you already use.

Which comes first depends on what people need more. If you have a view, say so in Issues or by email at theone@yulid.org.

How it works

Choosing a topic. Each message is matched to the current topic, an earlier one, or a new one. By default the model you selected makes one short classification (thinking off, at most 2,048 tokens), with candidates recalled through DSH full-text search.

  • With no credible match it starts a new topic instead of asking whether it is new. It only asks when you refer to an earlier chat it cannot find, or it truly cannot tell which one you mean.
  • When one message draws on several topics, the one doing the work gets it and the others come along as reference.
  • "ok" or "go on" continues the current topic without waiting for a decision, and so does a picture or file sent without words.
  • If the classification call fails, rules decide, staying in the current topic when unsure. Rule-based routing (THEONE_ROUTER_MODE=rules) makes no model calls at all.

Linking topics. A background session starting work receives a reference briefing, and none when there is nothing new:

  • right after a topic switch, the last few turns of main chat, so "use what we just said" carries over;
  • what changed in related topics since it last heard: their latest compaction summary (dated) and the progress after it;
  • each topic's constraints, verbatim, every time.

The briefing is marked as reference, not instructions. For details, the background session can use theone_read_topic and theone_search_history. Linking scope is Learn automatically (default), Same workspace only or Off. In the directory you can link or unlink topics and mark a topic Do not share; your choices always win.

Topic directory. Each topic shows its latest progress and constraints. Under Manage you can rename, edit the summary and constraints, move to another workspace, merge, delete, or attach an existing DSH session as searchable history; + New topic starts one by hand. Recent topic routing lists where each message went, why, with which model and how long it took. With a long history, the first pass takes some time and API quota; set THEONE_HISTORY_CATALOG=false to turn it off.

TheOne main chat and topic workspaces

Settings

Right-click the TheOne button in the sidebar and choose Settings. Changes apply when saved; only the history catalog settings wait for a DSH restart.

SettingWhat it does
Topic noticesHow main chat shows topic changes: hidden, one line only when the topic changes (default), or on every message with the reason
Linking scopeLearn automatically (default), same workspace only, or off
Share confirmed facts (experimental)Off by default. Topics share only facts the user confirmed (a figure, a decision, where a file is), with version and source; a topic that used one is told when it changes or is withdrawn. Applies after a DSH restart
Record facts automatically (experimental)Off by default. With shared facts on, one small model call after each turn records facts the topic session left out; only user-confirmed ones are shared
ModelFollow DSH (default) or pin the background model from any model configured in DSH; a pinned model takes precedence over main chat's selector
RoutingLLM decision (default) or rule-based
History catalogOn/off and rescan interval
LimitsTopic descriptor length; reply length per background step, thinking included
Manual catalog fileOptional JSON file of hand-written topics, imported when saved

The database location and entry identifier switch TheOne to different data, so they are set only through environment variables: THEONE_DATABASE_PATH and THEONE_GATEWAY_KEY. Also optional: THEONE_CONTEXTS_PATH and THEONE_WORKER_PROVIDER / THEONE_WORKER_MODEL (set both).

Data and privacy
  • DSH keeps the original conversations and tool results; TheOne keeps only its catalog, summaries, links and routing records in its own SQLite database ($DSH_HOME/theone/contexts.db, ~/.dsh/theone/ by default).
  • Text sent to the router or written into briefings has API keys, passwords and similar secrets removed.
  • A topic marked Do not share never appears in other topics' briefings, recent-chat excerpts or lookups.
  • Notices from the author are read from https://yulid.org/theone/notice.json with a plain request that sends none of your data; turn them off in Settings.
  • Report a problem (top right of Topic workspaces, or Report a problem on a message under Recent topic routing) sends only when you press Send, and shows everything it would send first. By default it holds versions, settings and routing error codes and timings, no chat content; for one message, its text and reply are added only if you tick the box. Reports go to feedback.yulid.org, are used only to look into problems and are deleted after 90 days; to have one deleted sooner, email theone@yulid.org with its id.
  • When main chat grows long, DSH compacts it through TheOne: frequently used topics keep longer summaries and their latest turns, rarely used ones keep a short status. This makes no model call.
  • Updates are installed by DSH's plugin manager and reload TheOne in place; a DSH without plugin hot reload applies them at the next restart.
Known limitations
  • One request runs at a time: a message sent during a reply is taken as an addition to that topic, so for something else, wait until the reply finishes.
  • New topics write files under ~/.dsh/theone/gateway; you cannot yet choose a project folder for a new topic.
  • Main chat stores copies of tool calls, so its log grows with use; entry-log rotation is not implemented yet.
  • The main chat is remembered per browser: another browser or the desktop app gets its own main chat, sharing the same topics. Only one DSH process should use a database at a time.
  • Image output is not forwarded yet; there is no vector search; topics cannot be split yet.
  • Main chat shows tool cards without running them because TheOne sits first in DSH's tool pipeline. If another plugin also places itself first, it may see these mirrored calls, but no tool runs twice.
Development
git clone https://github.com/YunongDai2005/dsh-theone.git
cd dsh-theone
npm ci --ignore-scripts
npm run typecheck
npm test

Tests use the real DSH runtime (AgentLoop, Session, SQLite, JSONL persistence, compaction) with a simulated model, and call no external API. npm run pack:plugin builds the install package; npm run install:local and npm run start:local run a separate DSH profile in ~/.dsh-theone.

Service API: ctx.theone.searchHistoryDetailed(contextId, query, limit) searches a topic's reviewed history; store.addSource(contextId, sessionId, { startSeq, endSeq }) attaches part of a session. Earlier acceptance records: v0.1 and v0.2.

🥚

Congratulations, you found the easter egg.

In the benchmark, TheOne once made a very human mistake. The user said "the café's autumn menu was due on September 25, let's push it to October 8", and TheOne filed it under the October holiday trip to Yunnan. Both were in October, after all.

We're still training it. If it ever files something of yours in the wrong place, just say "wrong topic" in the main chat. It will remember, and it won't take it personally.


If TheOne helps, a ⭐ helps others find it. Questions or ideas? Open an issue or email theone@yulid.org.