dsh-theone 0.3.21 → 0.3.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -10,20 +10,28 @@
10
10
 
11
11
  <p align="center">English | <a href="./README.zh.md">简体中文</a></p>
12
12
 
13
- <p align="center"><img src="docs/images/theone-film-preview.webp" alt="TheOne promo film: the One button turns into a 3D key that routes each message to its session" width="100%"></p>
13
+ <p align="center"><img src="https://raw.githubusercontent.com/YunongDai2005/dsh-theone/main/docs/images/theone-demo-en.webp" alt="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" width="100%"></p>
14
+
15
+ <p align="center"><sub>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.)</sub></p>
14
16
 
15
17
  ---
16
18
 
17
19
  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.
18
20
 
19
- **TheOne takes care of that.** You just talk in one main chat:
21
+ If you've ever said any of these, TheOne was probably written for you:
22
+
23
+ - "Where was that chat again?" Too many conversations, and the old one is nowhere to be found.
24
+ - "Not starting a new chat for this, I'll just ask here." And one chat turns into a mess.
25
+ - "I already told you that!" The AI forgot what you talked about.
26
+
27
+ **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.
20
28
 
21
29
  <picture>
22
30
  <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/YunongDai2005/dsh-theone/main/docs/images/theone-architecture-en-dark.svg">
23
31
  <img alt="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" src="https://raw.githubusercontent.com/YunongDai2005/dsh-theone/main/docs/images/theone-architecture-en-light.svg" width="100%">
24
32
  </picture>
25
33
 
26
- Each project gets its own background session that reasons, runs tools and compacts on its own. What you see is always one ordinary conversation.
34
+ Each project reasons, runs tools and compacts in its own session. What you see is always one ordinary conversation.
27
35
 
28
36
  ## Why try it
29
37
 
@@ -36,13 +44,10 @@ Each project gets its own background session that reasons, runs tools and compac
36
44
  | Wrong project | Move it by hand | Say "wrong topic" |
37
45
 
38
46
  - **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.
39
- - **Related work connects; unrelated work stays out.** Related topics share progress automatically and TheOne learns which ones belong together 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.
40
- - **Gets better with use.** Say "wrong topic" or click **Move to…** in the directory, and TheOne learns which terms tie that kind of message to the right topic (one small model call), so similar messages go there from then on. The directory shows how often routing was kept as is.
41
- - **Knows each topic early.** After a topic's first reply, and once more when it is clearer, a short card (what it is, other names you use for it, the people, places and files involved, what is still open) is written in the background, so routing recognises the topic in your own words from the start. Routing also sees when each topic was last active; topics left alone longer than you usually come back to one (learned from your own use, 7 days until there is enough) are set aside: still reachable, just considered last. Nothing to set up and nothing shown.
47
+ - **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.
48
+ - **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.
42
49
  - **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.
43
- - **Nothing extra to configure.** No separate API key: routing and the background sessions use the model you chose in DSH. When TheOne is the selected model, a button with a layers icon appears beside the model menu: it shows which model does the routing and the work, and switches it.
44
-
45
- ![TheOne main chat and topic workspaces](https://raw.githubusercontent.com/YunongDai2005/dsh-theone/main/docs/images/theone-topic-workspaces-en.png)
50
+ - **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.
46
51
 
47
52
  ## Install in 30 seconds
48
53
 
@@ -66,14 +71,15 @@ No coding needed:
66
71
 
67
72
  Click install and wait for it to finish.
68
73
  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.
69
- 4. **Updates.** When a new version is out, a download icon appears next to the TheOne entry. One click installs it, no restart.
74
+ 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.
70
75
  5. **Changed your mind?** Uninstall it on the Plugins page. Your DSH chats are all still there; TheOne organises them and never deletes them.
71
76
 
72
77
  **Small things you may run into**
73
78
 
74
79
  - **"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.
75
80
  - **No TheOne in the sidebar after installing:** restart DSH.
76
- - **Will it cost a lot?** Each message adds one short classification call (no deep thinking, at most 2,048 output tokens), and "ok" or "go on" skips even that. After installing, TheOne also organises your existing chats into a topic directory in the background; with many chats that first pass uses some of your quota. You can turn **History catalog** off in the settings.
81
+ - **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](mailto:theone@yulid.org); a screenshot helps.
82
+ - **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.
77
83
  </details>
78
84
 
79
85
  <details>
@@ -89,7 +95,7 @@ A new version from npm installs once it has been published for 24 hours; when an
89
95
 
90
96
  ## How well does it route?
91
97
 
92
- 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. We replayed them message by message through TheOne's own routing code with DeepSeek V4.1 Flash (dev split, 40 conversations; messages even a careful human could not attribute are not scored):
98
+ 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):
93
99
 
94
100
  | Approach | Messages routed correctly |
95
101
  | --- | --- |
@@ -103,11 +109,27 @@ Claims are cheap, so we built a public benchmark, **InterleaveBench**: one perso
103
109
  A few numbers worth knowing:
104
110
 
105
111
  - **A message landing in another thing's topic**, the mistake that hurts context most: about 3.7% when starting from nothing.
106
- - 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 topic cards go after exactly that.
112
+ - 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.
107
113
  - The whole run cost about one US dollar. Data, code and scoring live in [`eval/`](./eval/README.md); reproduce it, or try another model.
108
114
 
109
115
  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.
110
116
 
117
+ ## What's next
118
+
119
+ 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.
120
+
121
+ In progress:
122
+
123
+ - **Better routing**: looking at a burst of messages together while deciding each one separately, and measuring what routing cards add.
124
+ - **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.
125
+
126
+ Once it is stable, the next step goes beyond DSH:
127
+
128
+ - **A standalone client**: one interface over different models and providers, opening straight into a single chat;
129
+ - **or adapters for other platforms**: the same automatic topics, inside the chat tools you already use.
130
+
131
+ Which comes first depends on what people need more. If you have a view, say so in [Issues](https://github.com/YunongDai2005/dsh-theone/issues) or by email at [theone@yulid.org](mailto:theone@yulid.org).
132
+
111
133
  ## How it works
112
134
 
113
135
  **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.
@@ -125,7 +147,9 @@ The conversations are model-written from a script and this version has no assist
125
147
 
126
148
  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.
127
149
 
128
- **Topic directory.** Each topic card 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.
150
+ **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.
151
+
152
+ ![TheOne main chat and topic workspaces](https://raw.githubusercontent.com/YunongDai2005/dsh-theone/main/docs/images/theone-topic-workspaces-en.png)
129
153
 
130
154
  <details>
131
155
  <summary><b>Settings</b></summary>
@@ -154,14 +178,15 @@ The database location and entry identifier switch TheOne to different data, so t
154
178
  - Text sent to the router or written into briefings has API keys, passwords and similar secrets removed.
155
179
  - A topic marked **Do not share** never appears in other topics' briefings, recent-chat excerpts or lookups.
156
180
  - 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.
181
+ - **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.
157
182
  - 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.
158
- - When a new version is out, a download icon appears on the right of the TheOne entry in the sidebar: one click installs it through DSH's plugin manager and reloads TheOne in place, without restarting DSH (a DSH without plugin hot reload applies it at the next restart). Your topics stay in the database.
183
+ - 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.
159
184
  </details>
160
185
 
161
186
  <details>
162
187
  <summary><b>Known limitations</b></summary>
163
188
 
164
- - One request runs at a time; messages queued during a reply wait for it to finish.
189
+ - 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.
165
190
  - New topics write files under `~/.dsh/theone/gateway`; you cannot yet choose a project folder for a new topic.
166
191
  - Main chat stores copies of tool calls, so its log grows with use; entry-log rotation is not implemented yet.
167
192
  - 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.
@@ -185,7 +210,6 @@ Tests use the real DSH runtime (AgentLoop, Session, SQLite, JSONL persistence, c
185
210
  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](./docs/plugin-v0.1.md) and [v0.2](./docs/plugin-v0.2.md).
186
211
  </details>
187
212
 
188
-
189
213
  <details>
190
214
  <summary>🥚</summary>
191
215
 
@@ -195,10 +219,10 @@ Congratulations, you found the easter egg.
195
219
 
196
220
  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.
197
221
 
198
- We're still training it; 0.3.21's topic cards came out of moments like this. 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.
222
+ 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.
199
223
 
200
224
  </details>
201
225
 
202
226
  ---
203
227
 
204
- <p align="center">If TheOne helps, a ⭐ helps others find it. Questions or ideas? <a href="https://github.com/YunongDai2005/dsh-theone/issues">Open an issue</a>.</p>
228
+ <p align="center">If TheOne helps, a ⭐ helps others find it. Questions or ideas? <a href="https://github.com/YunongDai2005/dsh-theone/issues">Open an issue</a> or email <a href="mailto:theone@yulid.org">theone@yulid.org</a>.</p>
package/README.zh.md CHANGED
@@ -10,20 +10,28 @@
10
10
 
11
11
  <p align="center"><a href="./README.md">English</a> | 简体中文</p>
12
12
 
13
- <p align="center"><img src="docs/images/theone-film-preview.webp" alt="TheOne 宣传片:One 按钮化作 3D 钥匙,把每条消息路由到对应的会话" width="100%"></p>
13
+ <p align="center"><img src="https://raw.githubusercontent.com/YunongDai2005/dsh-theone/main/docs/images/theone-demo-zh.webp" alt="演示:在主聊天里先后说显卡和旅行两件事,左侧各自出现一个话题;回到显卡那件事时,它接着原来的话题回答" width="100%"></p>
14
+
15
+ <p align="center"><sub>先问显卡,再问旅馆,然后接着问显卡,中间没有任何提示语。左边的两个话题是它自己建的,什么都没点。(示例对话)</sub></p>
14
16
 
15
17
  ---
16
18
 
17
19
  你的 DSH 侧边栏里是不是躺着几十个会话?想回到上周那件事,得一个个翻;懒得新建,就在一个会话里什么都聊,结果上下文越聊越乱,压缩一次细节就没了。
18
20
 
19
- **TheOne 把这些都交给它。** 你只管在一个主聊天里说话:
21
+ 如果你也说过下面任何一句,TheOne 大概就是为你写的:
22
+
23
+ - 「之前聊过的那个在哪来着?」:对话太多,旧会话找不到
24
+ - 「懒得新建了,就在这儿接着问吧」:结果一个会话越聊越杂
25
+ - 「我不是跟你说过了吗?」:AI 忘了之前聊过的内容
26
+
27
+ **TheOne 的做法:** 你只在一个主聊天里说话,它在后台替每件事开一个独立的会话,把每句话送到该去的地方。
20
28
 
21
29
  <picture>
22
30
  <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/YunongDai2005/dsh-theone/main/docs/images/theone-architecture-zh-dark.svg">
23
31
  <img alt="TheOne 的结构:主聊天把每条消息交给分配话题,送到对应的后台会话,结果实时回到主聊天;话题目录保存进展、约束和关联" src="https://raw.githubusercontent.com/YunongDai2005/dsh-theone/main/docs/images/theone-architecture-zh-light.svg" width="100%">
24
32
  </picture>
25
33
 
26
- 每件事都有自己的后台会话,在里面推理、调用工具、压缩上下文;你看到的始终是一个普通的对话。
34
+ 每件事在自己的会话里推理、调用工具、压缩上下文;你看到的始终是一个普通的对话。
27
35
 
28
36
  ## 为什么值得一试
29
37
 
@@ -36,13 +44,10 @@
36
44
  | 分错了 | 手动挪 | 说一句「分错了」 |
37
45
 
38
46
  - **和原生会话一模一样**:思考从第一个字起就在原位置,工具卡片、授权、提问、待办、重试、回答中途插话,全都照常。
39
- - **相关的事会互通,无关的事互不打扰**:相关话题自动共享进展,并从你的使用中学习哪些话题有关联;话题的约束(比如「预算数字不能写进论文」)每次都原样带上,压缩不会把它丢掉。
40
- - **越用越准**:说「分错了」或在目录里点「改到…」,TheOne 会学到哪些词把这类消息和正确话题联系起来(只需一次很小的模型调用),类似的消息以后直接分对;话题目录里能看到分配的准确率。
41
- - **新话题也认得出**:话题第一次回复后(以及事情更清楚时再一次),后台会写一张简短的卡片:这件事是什么、你会用哪些别的说法叫它、涉及的人名地名和文件、还有什么没定,所以换个说法也能分对。路由还知道每个话题多久前活跃过;超过你平时回头的间隔没动的话题(从你自己的使用中学出来,数据不够时按 7 天)会被视为搁置:仍然可以被分到,只是排在最后。无需设置,也不会打扰你。
42
- - **旧会话自动变成话题目录**:装上后它会在后台读取你已有的会话,整理成话题并按工作区分组,直接接着聊。
43
- - **零额外配置**:不用另填 API Key,路由和后台都用你在 DSH 里选好的模型。选中 TheOne 时,模型按钮旁边会出现一个带图层图标的按钮,显示并切换分配话题和干活用的模型。
44
-
45
- ![TheOne 主聊天与话题工作区](https://raw.githubusercontent.com/YunongDai2005/dsh-theone/main/docs/images/theone-topic-workspaces-en.png)
47
+ - **相关的事会互通,无关的事互不打扰**:相关话题自动共享进展,哪些话题有关联从你的使用中学;话题的约束(比如「预算数字不能写进论文」)每次原样带上,压缩不会丢。
48
+ - **越用越认得你的说法**:每个话题有了回复后,后台会写一张简短的路由卡片(这件事是什么、你会怎么叫它、涉及哪些人名地名和文件),换个说法也能分对。分错了说一句「分错了」,它会记住是哪些词把这类消息连到正确话题。很久没动的话题排在候选最后,「很久」是多久,从你自己回头的习惯里学。
49
+ - **旧会话自动变成话题目录**:装上后它在后台读一遍你已有的会话,整理成话题、按工作区分组,点进去就能接着聊。
50
+ - **零额外配置**:不用另填 API Key,用的就是你在 DSH 里选好的模型。选中 TheOne 时,模型按钮旁边有一个图层图标,可以查看和切换分配话题、干活各用哪个模型。
46
51
 
47
52
  ## 30 秒装好
48
53
 
@@ -66,14 +71,15 @@
66
71
 
67
72
  点安装,等它跑完。
68
73
  3. **开始用。** 左侧会多出一个 **TheOne · 主聊天**。点进去,把你手头的事一件件说出来就行:今天的工作、周末的旅行、要写的论文……不用新建会话,也不用起名字。
69
- 4. **以后更新。** 有新版本时,TheOne 入口右边会出现一个下载图标,点一下就装好,不用重启。
74
+ 4. **以后更新。** 有新版本时,TheOne 入口右边会出现一个下载图标,点一下就装好,一般不用重启;话题都在数据库里,不受影响。
70
75
  5. **不想用了?** 在插件页卸载即可。你原来的 DSH 会话都还在,TheOne 只是帮你整理,从来不删它们。
71
76
 
72
77
  **可能遇到的小状况**
73
78
 
74
79
  - **提示版本「太新」、装不上:** DSH 默认只安装发布满 24 小时的版本,这是它的安全规则,不是出错。可以等一天再装,也可以改填 GitHub 地址 `https://github.com/YunongDai2005/dsh-theone`,马上就能装。
75
80
  - **装完左侧没看到 TheOne:** 重启一下 DSH。
76
- - **会不会很费钱:** 每条消息多一次很短的分类调用(关闭深度思考,输出不超过 2048 token),「好的」「继续」这类连调用都省了。装好后它会在后台把你已有的会话整理成话题目录,会话多的话,这一次会用掉一些额度;不需要的话可以在设置里关掉「历史整理」。
81
+ - **遇到问题:** 在 **话题工作区** 右上角点「反馈问题」,会自动带上版本和诊断信息(不含聊天内容),点「发送」即可,不需要打开 GitHub。也可以发邮件到 [theone@yulid.org](mailto:theone@yulid.org),有截图更好。
82
+ - **会不会很费钱:** 每条消息多一次很短的分类调用(不开深度思考),「好的」「继续」这类连这次调用都省了。第一次整理旧会话时,会话多的话会用掉一些额度;不需要可以在设置里关掉「历史整理」。
77
83
  </details>
78
84
 
79
85
  <details>
@@ -89,7 +95,7 @@
89
95
 
90
96
  ## 它分得有多准
91
97
 
92
- 口说无凭,我们做了一套公开评测 **InterleaveBench**:模拟一个人在同一个对话框里同时推进 3–5 件事(旅行、记账、论文、健身……),中英文各半,共 50 段对话、2466 条消息,每条消息属于哪件事都事先定好。再用 TheOne 自己的路由代码、DeepSeek V4.1 Flash 逐条重放(开发集 40 段;连人都分不清的消息不计分):
98
+ 口说无凭,我们做了一套公开评测 **InterleaveBench**:模拟一个人在同一个对话框里同时推进 3–5 件事(旅行、记账、论文、健身……),中英文各半,共 50 段对话、2466 条消息,每条属于哪件事都事先定好。下面是用 TheOne 自己的路由代码和 DeepSeek V4.1 Flash,在其中 40 段开发集上逐条重放的结果(连人都分不清的消息不计分):
93
99
 
94
100
  | 做法 | 分对的比例 |
95
101
  | --- | --- |
@@ -103,11 +109,27 @@
103
109
  几个值得一说的数字:
104
110
 
105
111
  - **把一件事的消息放进另一件事的话题**(最伤上下文的那种错):从零开始时约占 3.7%。
106
- - 现在最主要的毛病是**太爱开新话题**:同一件事平均被拆成 2.1 个话题。0.3.21 的「话题卡片」就是冲着它去的。
112
+ - 现在最主要的毛病是**太爱开新话题**:同一件事平均被拆成 2.1 个话题。0.3.21 的路由卡片就是冲着它去的。
107
113
  - 整套评测花了大约 1 美元。数据、代码和打分脚本都在 [`eval/`](./eval/README.md),可以自己复现,换成别的模型也行。
108
114
 
109
115
  评测数据是模型按剧本生成的,而且这一版还没有助手回复,所以它衡量的是「能不能分对」,不代表真实聊天体验的全部。
110
116
 
117
+ ## 接下来
118
+
119
+ TheOne 现在先在 DeepSeek Harness 上打磨:DSH 的后台会话、工具、压缩都能直接复用,适合先把「一个对话框聊所有事」做扎实。
120
+
121
+ 近期在做的:
122
+
123
+ - **分得更准**:连着发的几句话合在一起看、分开判断;测出路由卡片到底带来多少提升。
124
+ - **话题之间互通确认过的要点**:比如预算、日期、文件位置,换了话题也能用上最新的值。目前是实验功能,评测达标后才会默认开启。
125
+
126
+ 等它足够稳定,下一步会走出 DSH:
127
+
128
+ - **一个独立的客户端**:统一接口,背后接不同的模型和服务,打开就是一个对话框;
129
+ - **或者各个平台的适配版本**:把同样的「自动分话题」带到你已经在用的聊天工具里。
130
+
131
+ 两条路先走哪一条,取决于大家更需要哪个。有想法的话,欢迎在 [Issues](https://github.com/YunongDai2005/dsh-theone/issues) 里说一声,或者发邮件到 [theone@yulid.org](mailto:theone@yulid.org)。
132
+
111
133
  ## 它是怎么工作的
112
134
 
113
135
  **分配话题。** 每条消息先判断:接着当前话题、回到某个旧话题,还是开个新的。默认用你选的模型做一次简短分类(关闭深度思考,最多 2048 token),候选话题由 DSH 全文搜索召回。
@@ -125,7 +147,9 @@
125
147
 
126
148
  简报标注为参考资料而非指令;需要细节时,后台可以用 `theone_read_topic`、`theone_search_history` 去查。联动范围可选「自动学习」(默认)、「仅同一工作区」或「关闭」。在目录里可以手动关联或解除关联、把话题标记为「不共享」,你的设置永远优先。
127
149
 
128
- **话题目录。** 每个话题卡片显示最新进展和约束。点 **管理** 可以重命名、改摘要和约束、移到别的工作区、合并、删除,或把已有的 DSH 会话关联为可检索的历史;**+ 新话题** 手动新建。**最近的话题分配** 列出每条消息去了哪里、原因、所用模型和耗时。历史较多时,第一次整理需要一些时间和 API 额度;设置 `THEONE_HISTORY_CATALOG=false` 可关闭。
150
+ **话题目录。** 每个话题显示最新进展和约束。点 **管理** 可以重命名、改摘要和约束、移到别的工作区、合并、删除,或把已有的 DSH 会话关联为可检索的历史;**+ 新话题** 手动新建。**最近的话题分配** 列出每条消息去了哪里、原因、所用模型和耗时。历史较多时,第一次整理需要一些时间和 API 额度;设置 `THEONE_HISTORY_CATALOG=false` 可关闭。
151
+
152
+ ![TheOne 主聊天与话题工作区](https://raw.githubusercontent.com/YunongDai2005/dsh-theone/main/docs/images/theone-topic-workspaces-en.png)
129
153
 
130
154
  <details>
131
155
  <summary><b>设置</b></summary>
@@ -154,14 +178,15 @@
154
178
  - 发给路由和写进参考简报的内容会去掉 API Key、密码等敏感信息。
155
179
  - 标记为「不共享」的话题,不会出现在其他话题的简报、最近对话和查阅结果里。
156
180
  - 作者发布的公告从 `https://yulid.org/theone/notice.json` 读取,只是一次普通的下载,不发送你的任何数据;可以在设置里关闭。
181
+ - **反馈问题**(话题工作区右上角,或「最近的话题分配」里每条的「报告问题」)只在你点「发送」时才发出,发送前能看到全部内容。默认只含版本、设置、路由的错误码和耗时,不含聊天内容;报告某条回复时,勾选后才附上那条消息和回复的原文。报告发到 `feedback.yulid.org`,只用于排查问题,90 天后自动删除;想删掉已发的报告,写信到 theone@yulid.org 并附上编号。
157
182
  - 主聊天变长时,DSH 通过 TheOne 压缩它:常用话题保留较长摘要和最近几轮,不常用的只保留简短状态,不额外调用模型。
158
- - 有新版本时,左侧 TheOne 入口右边会出现一个下载图标,点一下由 DSH 的插件管理器安装,并就地重新加载 TheOne,不用重启 DSH(不支持插件热加载的 DSH 会在下次启动时生效);话题都保存在数据库里,不受影响。
183
+ - 更新由 DSH 的插件管理器安装,并就地重新加载 TheOne;不支持插件热加载的 DSH 会在下次启动时生效。
159
184
  </details>
160
185
 
161
186
  <details>
162
187
  <summary><b>已知限制</b></summary>
163
188
 
164
- - 同一时间只处理一个请求;回答期间排队的消息要等本轮结束。
189
+ - 同一时间只处理一个请求:回答进行中发的消息会当作对当前话题的补充,想说别的事,等这一轮结束再发。
165
190
  - 新话题的文件默认写在 `~/.dsh/theone/gateway`,暂时不能指定项目目录。
166
191
  - 主聊天保存了工具调用的副本,长期使用记录会变大;入口日志轮换尚未实现。
167
192
  - 主聊天身份按浏览器保存:换浏览器或桌面端会出现另一个主聊天,话题仍然共用。同一数据库同时只应由一个 DSH 进程使用。
@@ -194,10 +219,10 @@ npm test
194
219
 
195
220
  在评测里,TheOne 犯过一个很有人味的错:用户说「咖啡店秋季新品本来定 9 月 25 上,现在想推到 10 月 8 号」,它把这句话放进了「国庆云南六日游」,因为都在十月。
196
221
 
197
- 我们还在调教它,0.3.21 的话题卡片就是这么来的。如果你也被它分错了,在主聊天里说一句「分错了」就行,它会记住,不会生气。
222
+ 我们还在调教它。如果你也被它分错了,在主聊天里说一句「分错了」就行,它会记住,不会生气。
198
223
 
199
224
  </details>
200
225
 
201
226
  ---
202
227
 
203
- <p align="center">觉得有用的话,点个 ⭐ 让更多人看到。遇到问题或有想法,欢迎 <a href="https://github.com/YunongDai2005/dsh-theone/issues">提 Issue</a>。</p>
228
+ <p align="center">觉得有用的话,点个 ⭐ 让更多人看到。遇到问题或有想法,欢迎 <a href="https://github.com/YunongDai2005/dsh-theone/issues">提 Issue</a>,打不开 GitHub 就发邮件到 <a href="mailto:theone@yulid.org">theone@yulid.org</a>。</p>
@@ -117,6 +117,9 @@ export declare const zh: {
117
117
  readonly 'settings.help.gatewayKey': "区分不同的主聊天入口状态(当前话题、路由记录、设置)。改动相当于换一个新的入口,因此只能用环境变量 THEONE_GATEWAY_KEY 修改,通常保留 default。";
118
118
  readonly 'catalog.title': "话题工作区";
119
119
  readonly 'catalog.subtitle': "相关的事情放在一起,随时回到主聊天继续。";
120
+ readonly 'catalog.figTopics': "话题";
121
+ readonly 'catalog.figGroups': "工作区";
122
+ readonly 'catalog.figKept': "没被更正";
120
123
  readonly 'catalog.refresh': "整理历史";
121
124
  readonly 'link.label': "关联:";
122
125
  readonly 'link.none': "暂无关联话题";
@@ -150,6 +153,7 @@ export declare const zh: {
150
153
  readonly 'catalog.unassignedSummary': "这些话题还在等待自动归类。";
151
154
  readonly 'topic.opening': "正在打开…";
152
155
  readonly 'topic.continue': "继续聊天";
156
+ readonly 'topic.continueHidden': "这个话题的原会话已不在(已删除或已归档),没有可以接着聊的内容。取消归档后即可继续。";
153
157
  readonly 'topic.source': "查看原会话";
154
158
  readonly 'topic.state': "进展:";
155
159
  readonly 'topic.constraints': "约束:";
@@ -195,6 +199,35 @@ export declare const zh: {
195
199
  readonly 'routes.error': "分类出错:{code}";
196
200
  readonly 'routes.rules': "规则判断";
197
201
  readonly 'routes.removed': "(已删除的话题)";
202
+ readonly 'routes.report': "报告问题";
203
+ readonly 'feedback.open': "反馈问题";
204
+ readonly 'feedback.title': "反馈问题";
205
+ readonly 'feedback.titleMessage': "报告这条回复的问题";
206
+ readonly 'feedback.intro': "说说发生了什么。下面能看到要发出的全部内容,点「发送」之前什么都不会发出。";
207
+ readonly 'feedback.description': "发生了什么?比如:回复里出现乱码、分错了话题、某个按钮没反应";
208
+ readonly 'feedback.contact': "联系方式(选填):邮箱、QQ 或微信,方便作者回复你";
209
+ readonly 'feedback.includeReply': "附上这条消息和回复的原文(排查乱码这类问题时需要)";
210
+ readonly 'feedback.preview': "要发送的内容";
211
+ readonly 'feedback.privacy': "发送到 feedback.yulid.org,只用于排查问题,由 TheOne 作者保存 90 天后自动删除。默认只含版本、设置和路由的错误码与耗时,不含聊天内容。";
212
+ readonly 'feedback.loading': "正在整理诊断信息…";
213
+ readonly 'feedback.loadError': "诊断信息没有整理出来,你仍然可以写下问题,复制后发邮件到 {email}。";
214
+ readonly 'feedback.send': "发送";
215
+ readonly 'feedback.sending': "正在发送…";
216
+ readonly 'feedback.copy': "复制内容";
217
+ readonly 'feedback.copied': "已复制";
218
+ readonly 'feedback.email': "发邮件";
219
+ readonly 'feedback.cancel': "取消";
220
+ readonly 'feedback.close': "关闭";
221
+ readonly 'feedback.sent': "已发送,编号 {id}。在评论或邮件里提到这个编号,作者就能找到它。谢谢!";
222
+ readonly 'feedback.fallback': "也可以点「复制内容」,发邮件到 {email}。";
223
+ readonly 'feedback.error.UNREACHABLE': "连不上反馈服务器。";
224
+ readonly 'feedback.error.RATE_LIMITED': "发送得太频繁了,请一小时后再试。";
225
+ readonly 'feedback.error.REJECTED': "反馈服务器没有接收这份报告。";
226
+ readonly 'feedback.error.SERVER_ERROR': "反馈服务器暂时出了问题。";
227
+ readonly 'feedback.error.DESCRIPTION_REQUIRED': "先写一句发生了什么。";
228
+ readonly 'feedback.error.TOO_LARGE': "内容太长了,请缩短描述,或去掉回复原文。";
229
+ readonly 'feedback.error.DIRECT_OFF': "这个 DSH 关闭了直接发送。";
230
+ readonly 'feedback.error.other': "没有发送成功。";
198
231
  readonly 'route.reason.steering': "回复中补充";
199
232
  readonly 'route.reason.short-continuation': "接着说";
200
233
  readonly 'route.reason.attachment-only': "只有附件";
@@ -117,6 +117,9 @@ export const zh = {
117
117
  'settings.help.gatewayKey': '区分不同的主聊天入口状态(当前话题、路由记录、设置)。改动相当于换一个新的入口,因此只能用环境变量 THEONE_GATEWAY_KEY 修改,通常保留 default。',
118
118
  'catalog.title': '话题工作区',
119
119
  'catalog.subtitle': '相关的事情放在一起,随时回到主聊天继续。',
120
+ 'catalog.figTopics': '话题',
121
+ 'catalog.figGroups': '工作区',
122
+ 'catalog.figKept': '没被更正',
120
123
  'catalog.refresh': '整理历史',
121
124
  'link.label': '关联:',
122
125
  'link.none': '暂无关联话题',
@@ -150,6 +153,7 @@ export const zh = {
150
153
  'catalog.unassignedSummary': '这些话题还在等待自动归类。',
151
154
  'topic.opening': '正在打开…',
152
155
  'topic.continue': '继续聊天',
156
+ 'topic.continueHidden': '这个话题的原会话已不在(已删除或已归档),没有可以接着聊的内容。取消归档后即可继续。',
153
157
  'topic.source': '查看原会话',
154
158
  'topic.state': '进展:',
155
159
  'topic.constraints': '约束:',
@@ -195,6 +199,35 @@ export const zh = {
195
199
  'routes.error': '分类出错:{code}',
196
200
  'routes.rules': '规则判断',
197
201
  'routes.removed': '(已删除的话题)',
202
+ 'routes.report': '报告问题',
203
+ 'feedback.open': '反馈问题',
204
+ 'feedback.title': '反馈问题',
205
+ 'feedback.titleMessage': '报告这条回复的问题',
206
+ 'feedback.intro': '说说发生了什么。下面能看到要发出的全部内容,点「发送」之前什么都不会发出。',
207
+ 'feedback.description': '发生了什么?比如:回复里出现乱码、分错了话题、某个按钮没反应',
208
+ 'feedback.contact': '联系方式(选填):邮箱、QQ 或微信,方便作者回复你',
209
+ 'feedback.includeReply': '附上这条消息和回复的原文(排查乱码这类问题时需要)',
210
+ 'feedback.preview': '要发送的内容',
211
+ 'feedback.privacy': '发送到 feedback.yulid.org,只用于排查问题,由 TheOne 作者保存 90 天后自动删除。默认只含版本、设置和路由的错误码与耗时,不含聊天内容。',
212
+ 'feedback.loading': '正在整理诊断信息…',
213
+ 'feedback.loadError': '诊断信息没有整理出来,你仍然可以写下问题,复制后发邮件到 {email}。',
214
+ 'feedback.send': '发送',
215
+ 'feedback.sending': '正在发送…',
216
+ 'feedback.copy': '复制内容',
217
+ 'feedback.copied': '已复制',
218
+ 'feedback.email': '发邮件',
219
+ 'feedback.cancel': '取消',
220
+ 'feedback.close': '关闭',
221
+ 'feedback.sent': '已发送,编号 {id}。在评论或邮件里提到这个编号,作者就能找到它。谢谢!',
222
+ 'feedback.fallback': '也可以点「复制内容」,发邮件到 {email}。',
223
+ 'feedback.error.UNREACHABLE': '连不上反馈服务器。',
224
+ 'feedback.error.RATE_LIMITED': '发送得太频繁了,请一小时后再试。',
225
+ 'feedback.error.REJECTED': '反馈服务器没有接收这份报告。',
226
+ 'feedback.error.SERVER_ERROR': '反馈服务器暂时出了问题。',
227
+ 'feedback.error.DESCRIPTION_REQUIRED': '先写一句发生了什么。',
228
+ 'feedback.error.TOO_LARGE': '内容太长了,请缩短描述,或去掉回复原文。',
229
+ 'feedback.error.DIRECT_OFF': '这个 DSH 关闭了直接发送。',
230
+ 'feedback.error.other': '没有发送成功。',
198
231
  'route.reason.steering': '回复中补充',
199
232
  'route.reason.short-continuation': '接着说',
200
233
  'route.reason.attachment-only': '只有附件',
@@ -334,6 +367,9 @@ export const en = {
334
367
  'settings.help.gatewayKey': 'Separates main-chat entry state (current topic, routing records, settings). Changing it amounts to a new entry, so it can only be set through THEONE_GATEWAY_KEY; usually leave it as default.',
335
368
  'catalog.title': 'Topic workspaces',
336
369
  'catalog.subtitle': 'Keep related topics together and pick up the conversation in main chat.',
370
+ 'catalog.figTopics': 'Topics',
371
+ 'catalog.figGroups': 'Workspaces',
372
+ 'catalog.figKept': 'Kept as routed',
337
373
  'catalog.refresh': 'Organize history',
338
374
  'link.label': 'Related:',
339
375
  'link.none': 'No related topics',
@@ -367,6 +403,7 @@ export const en = {
367
403
  'catalog.unassignedSummary': 'These topics are waiting to be grouped.',
368
404
  'topic.opening': 'Opening…',
369
405
  'topic.continue': 'Continue chatting',
406
+ 'topic.continueHidden': 'This topic’s conversations are gone (deleted or archived), so there is nothing to continue. Unarchive them to pick it up again.',
370
407
  'topic.source': 'View original chat',
371
408
  'topic.state': 'Progress:',
372
409
  'topic.constraints': 'Constraints:',
@@ -412,6 +449,35 @@ export const en = {
412
449
  'routes.error': 'Classifier error: {code}',
413
450
  'routes.rules': 'rules',
414
451
  'routes.removed': '(deleted topic)',
452
+ 'routes.report': 'Report a problem',
453
+ 'feedback.open': 'Report a problem',
454
+ 'feedback.title': 'Report a problem',
455
+ 'feedback.titleMessage': 'Report a problem with this reply',
456
+ 'feedback.intro': 'Tell us what happened. Everything that would be sent is shown below; nothing leaves this computer until you press Send.',
457
+ 'feedback.description': 'What happened? For example: garbled text in a reply, the wrong topic, a button that does nothing',
458
+ 'feedback.contact': 'Contact (optional): email or any handle, so the author can reply',
459
+ 'feedback.includeReply': 'Include this message and its reply as text (needed for problems like garbled replies)',
460
+ 'feedback.preview': 'What will be sent',
461
+ 'feedback.privacy': 'Sent to feedback.yulid.org, used only to look into the problem, and deleted by TheOne\'s author after 90 days. By default it holds versions, settings and routing error codes and timings, no chat content.',
462
+ 'feedback.loading': 'Gathering diagnostics…',
463
+ 'feedback.loadError': 'Diagnostics could not be gathered. You can still describe the problem, copy it and email {email}.',
464
+ 'feedback.send': 'Send',
465
+ 'feedback.sending': 'Sending…',
466
+ 'feedback.copy': 'Copy',
467
+ 'feedback.copied': 'Copied',
468
+ 'feedback.email': 'Email',
469
+ 'feedback.cancel': 'Cancel',
470
+ 'feedback.close': 'Close',
471
+ 'feedback.sent': 'Sent as {id}. Mention this id in a comment or email and the author can find it. Thank you!',
472
+ 'feedback.fallback': 'You can also press Copy and email {email}.',
473
+ 'feedback.error.UNREACHABLE': 'The feedback server cannot be reached.',
474
+ 'feedback.error.RATE_LIMITED': 'Too many reports in a short time; try again in an hour.',
475
+ 'feedback.error.REJECTED': 'The feedback server did not accept this report.',
476
+ 'feedback.error.SERVER_ERROR': 'The feedback server has a problem right now.',
477
+ 'feedback.error.DESCRIPTION_REQUIRED': 'Say in a sentence what happened first.',
478
+ 'feedback.error.TOO_LARGE': 'Too long; shorten the description or leave out the reply text.',
479
+ 'feedback.error.DIRECT_OFF': 'Sending directly is turned off in this DSH.',
480
+ 'feedback.error.other': 'The report was not sent.',
415
481
  'route.reason.steering': 'Added during a reply',
416
482
  'route.reason.short-continuation': 'Continuation',
417
483
  'route.reason.attachment-only': 'Attachment only',