@ahggg/dsh-side-chat 0.3.0 → 0.4.1

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.
Files changed (45) hide show
  1. package/README.md +18 -15
  2. package/README.zh-CN.md +18 -15
  3. package/lib/client/apply.d.ts.map +1 -1
  4. package/lib/client/apply.js +7 -1
  5. package/lib/client/apply.js.map +1 -1
  6. package/lib/client/panel/SelectionQuote.d.ts +6 -4
  7. package/lib/client/panel/SelectionQuote.d.ts.map +1 -1
  8. package/lib/client/panel/SelectionQuote.js +32 -9
  9. package/lib/client/panel/SelectionQuote.js.map +1 -1
  10. package/lib/client/panel/SideChatPanel.d.ts +1 -2
  11. package/lib/client/panel/SideChatPanel.d.ts.map +1 -1
  12. package/lib/client/panel/SideChatPanel.js +2 -2
  13. package/lib/client/panel/SideChatPanel.js.map +1 -1
  14. package/lib/client/panel/messages.d.ts +2 -2
  15. package/lib/client/panel/messages.d.ts.map +1 -1
  16. package/lib/client/panel/messages.js +4 -4
  17. package/lib/client/panel/messages.js.map +1 -1
  18. package/lib/client/parent-composer/ParentConversationAnnotations.d.ts +27 -0
  19. package/lib/client/parent-composer/ParentConversationAnnotations.d.ts.map +1 -0
  20. package/lib/client/parent-composer/ParentConversationAnnotations.js +97 -0
  21. package/lib/client/parent-composer/ParentConversationAnnotations.js.map +1 -0
  22. package/lib/client/parent-composer/add-to-conversation.d.ts +64 -0
  23. package/lib/client/parent-composer/add-to-conversation.d.ts.map +1 -1
  24. package/lib/client/parent-composer/add-to-conversation.js +182 -0
  25. package/lib/client/parent-composer/add-to-conversation.js.map +1 -1
  26. package/lib/client/rc6/ArchivedConversation.d.ts +1 -2
  27. package/lib/client/rc6/ArchivedConversation.d.ts.map +1 -1
  28. package/lib/client/rc6/ArchivedConversation.js +97 -8
  29. package/lib/client/rc6/ArchivedConversation.js.map +1 -1
  30. package/lib/client/rc6/Rc6SideChatOverlay.d.ts.map +1 -1
  31. package/lib/client/rc6/Rc6SideChatOverlay.js +48 -10
  32. package/lib/client/rc6/Rc6SideChatOverlay.js.map +1 -1
  33. package/lib/client/rc6/context.d.ts +6 -1
  34. package/lib/client/rc6/context.d.ts.map +1 -1
  35. package/lib/client/rc6/sessions-adapter.d.ts +6 -0
  36. package/lib/client/rc6/sessions-adapter.d.ts.map +1 -1
  37. package/lib/client/rc6/sessions-adapter.js +30 -0
  38. package/lib/client/rc6/sessions-adapter.js.map +1 -1
  39. package/lib/client/selection/SelectionActions.d.ts +4 -1
  40. package/lib/client/selection/SelectionActions.d.ts.map +1 -1
  41. package/lib/client/selection/SelectionActions.js +62 -3
  42. package/lib/client/selection/SelectionActions.js.map +1 -1
  43. package/lib/client.js +758 -202
  44. package/lib/client.js.map +1 -1
  45. package/package.json +2 -1
package/README.md CHANGED
@@ -6,15 +6,16 @@ Ask a focused follow-up about selected text without leaving your current DeepSee
6
6
 
7
7
  [简体中文](README.zh-CN.md)
8
8
 
9
- ![Select text, open Side Chat, receive a Markdown reply, and close it with Escape](https://raw.githubusercontent.com/AHGGG/dsh-side-chat/master/docs/assets/side-chat-demo.gif)
9
+ ![Ask about selected text in Side Chat, then add an annotated selection to the main chat](https://raw.githubusercontent.com/AHGGG/dsh-side-chat/master/docs/assets/side-chat-demo.gif)
10
10
 
11
11
  ## Install
12
12
 
13
- Install DSH rc.6 if it is not already available, then add the plugin to the Web profile:
13
+ Install DSH rc.6 if it is not already available. Refresh only this package's registry metadata before adding it, so pnpm cannot reuse an older `latest` value immediately after a release:
14
14
 
15
15
  ```powershell
16
16
  npm install --global @deepseek-ai/dsh@0.1.0-rc.6
17
- dsh plugin --profile web add @ahggg/dsh-side-chat
17
+ pnpm cache delete "@ahggg/dsh-side-chat"
18
+ dsh plugin --profile web add @ahggg/dsh-side-chat@latest
18
19
  ```
19
20
 
20
21
  Start DSH from the project you want the agent to work in:
@@ -30,18 +31,20 @@ Open the URL printed by DSH. The plugin loads automatically in the Web client.
30
31
 
31
32
  1. Complete at least one turn in the main conversation.
32
33
  2. Select text inside one completed user or assistant message.
33
- 3. Click `More details` to send an explanation request immediately, or click `Ask in side chat` to write your own question.
34
- 4. When writing your own question, press `Enter` to send it.
34
+ 3. Click `Add to chat` to add an optional comment before attaching the passage to the main composer, `More details` to send an explanation request immediately, or `Ask in side chat` to write a focused question.
35
+ 4. When writing your own message or question, press `Enter` to send it.
35
36
  5. Press `Esc` or click `×` when you are done.
36
37
 
37
38
  Useful details:
38
39
 
39
40
  - `Shift+Enter` inserts a newline.
41
+ - After clicking `Add to chat`, press `Enter` or click `Save` to keep the annotation. Click outside the comment box or click `Cancel` to discard it.
42
+ - `Add to chat` keeps any existing draft text and can collect multiple numbered passages, each with its own optional comment, in one annotation capsule.
40
43
  - The input grows with its content and becomes scrollable at its maximum height.
41
44
  - While a reply is running, the send icon becomes a stop button.
42
45
  - Assistant replies use DSH's native Markdown rendering.
43
- - Hover over `1 annotation` to preview the selected text.
44
- - Before the first send, hover over the annotation and click `×` to remove it.
46
+ - Hover over `N annotations` to preview every selected passage and its comment.
47
+ - Before sending, hover over the annotation capsule and click `×` to remove it; after sending, the same capsule appears above the user message.
45
48
  - The main conversation stays visible and is never switched to the child Session.
46
49
 
47
50
  ## What happens to the conversation
@@ -55,20 +58,14 @@ The parent and child share the same workspace. File changes, commands, and other
55
58
  ## Current limitations
56
59
 
57
60
  - A selection must stay inside one completed message.
58
- - Attachments, `Add to conversation`, and `/side` are not supported yet.
61
+ - Attachments and `/side` are not supported yet.
59
62
  - Closed Side Chats cannot be reopened from the panel.
60
63
  - There is no automatic history cleanup or “keep as normal chat” action.
61
64
  - An archived child may briefly appear in normal Session lists.
62
65
 
63
66
  ## Upgrade or remove
64
67
 
65
- Update to the latest stable version and restart DSH:
66
-
67
- ```powershell
68
- dsh plugin --profile web update @ahggg/dsh-side-chat --latest
69
- ```
70
-
71
- Immediately after a release, pnpm may reuse stale registry metadata and leave an existing installation on an older version. Clear only this package's metadata cache, then retry the update:
68
+ Refresh this package's registry metadata, update to the latest stable version, and restart DSH:
72
69
 
73
70
  ```powershell
74
71
  pnpm cache delete "@ahggg/dsh-side-chat"
@@ -84,3 +81,9 @@ dsh plugin --profile web remove @ahggg/dsh-side-chat
84
81
  ## License
85
82
 
86
83
  MIT
84
+
85
+ ## References
86
+
87
+ - https://www.v2ex.com
88
+ - https://linux.do
89
+ - https://linux.sb
package/README.zh-CN.md CHANGED
@@ -6,15 +6,16 @@
6
6
 
7
7
  [English](README.md)
8
8
 
9
- ![选中文本、打开 Side Chat、查看 Markdown 回复并按 Escape 关闭](https://raw.githubusercontent.com/AHGGG/dsh-side-chat/master/docs/assets/side-chat-demo.gif)
9
+ ![先在 Side Chat 中询问选中文本,再把带批注的选区加入主会话](https://raw.githubusercontent.com/AHGGG/dsh-side-chat/master/docs/assets/side-chat-demo.gif)
10
10
 
11
11
  ## 安装
12
12
 
13
- 如果尚未安装 DSH rc.6,先安装它,然后把插件添加到 Web profile:
13
+ 如果尚未安装 DSH rc.6,先安装它。添加插件前只刷新这个包的 registry metadata,避免刚发布新版本时 pnpm 仍复用旧的 `latest`:
14
14
 
15
15
  ```powershell
16
16
  npm install --global @deepseek-ai/dsh@0.1.0-rc.6
17
- dsh plugin --profile web add @ahggg/dsh-side-chat
17
+ pnpm cache delete "@ahggg/dsh-side-chat"
18
+ dsh plugin --profile web add @ahggg/dsh-side-chat@latest
18
19
  ```
19
20
 
20
21
  从希望 Agent 操作的真实工程目录启动 DSH:
@@ -30,18 +31,20 @@ dsh web --port 3080
30
31
 
31
32
  1. 在主会话中至少完成一轮对话。
32
33
  2. 在一条已完成的用户或助手消息内选中文字。
33
- 3. 点击 `More details` 可以立即发送详细解释请求;点击 `Ask in side chat` 可以自己输入问题。
34
- 4. 自己输入问题时,按 `Enter` 发送。
34
+ 3. 点击 `Add to chat` 可以先填写一条可选批注,再把引用加入主会话输入框;点击 `More details` 可以立即发送详细解释请求;点击 `Ask in side chat` 可以自己输入聚焦问题。
35
+ 4. 自己输入消息或问题时,按 `Enter` 发送。
35
36
  5. 完成后按 `Esc`,或者点击 `×` 关闭。
36
37
 
37
38
  常用操作:
38
39
 
39
40
  - `Shift+Enter` 换行。
41
+ - 点击 `Add to chat` 后,按 `Enter` 或点击 `Save` 保存 annotation;点击批注框外部或点击 `Cancel` 则直接取消。
42
+ - `Add to chat` 会保留输入框中已有的草稿,并可把多段带序号的文本及各自的可选批注汇总到同一个 annotation 胶囊中。
40
43
  - 输入框会随内容自动增高,达到最大高度后在内部滚动。
41
44
  - 回复生成期间,发送图标会替换为停止按钮。
42
45
  - Assistant 回复使用 DSH 原生 Markdown 渲染。
43
- - hover `1 annotation` 可以预览所选文本。
44
- - 第一次发送前,可以 hover annotation 并点击 `×` 移除引用。
46
+ - hover `N annotations` 可以预览每一段所选文本及对应批注。
47
+ - 发送前可以 hover annotation 胶囊并点击 `×` 移除;发送后,同一个胶囊会显示在用户消息上方。
45
48
  - 主会话会一直保留在页面中,不会自动切换到 child Session。
46
49
 
47
50
  ## 会话和数据如何处理
@@ -55,20 +58,14 @@ dsh web --port 3080
55
58
  ## 当前限制
56
59
 
57
60
  - 选区必须位于同一条已完成消息内。
58
- - 暂不支持附件、`Add to conversation` 和 `/side`。
61
+ - 暂不支持附件和 `/side`。
59
62
  - 关闭后不能从面板重新打开原 Side Chat。
60
63
  - 暂无自动历史清理或“保留为普通会话”操作。
61
64
  - 已归档的 child 可能短暂出现在普通会话列表中。
62
65
 
63
66
  ## 升级或卸载
64
67
 
65
- 升级到最新稳定版并重启 DSH:
66
-
67
- ```powershell
68
- dsh plugin --profile web update @ahggg/dsh-side-chat --latest
69
- ```
70
-
71
- 刚发布新版本时,pnpm 可能复用旧的 registry metadata,导致已有安装仍停留在旧版。只清理这个包的 metadata 缓存,然后重试升级:
68
+ 刷新这个包的 registry metadata,升级到最新稳定版,然后重启 DSH:
72
69
 
73
70
  ```powershell
74
71
  pnpm cache delete "@ahggg/dsh-side-chat"
@@ -84,3 +81,9 @@ dsh plugin --profile web remove @ahggg/dsh-side-chat
84
81
  ## 许可证
85
82
 
86
83
  MIT
84
+
85
+ ## References
86
+
87
+ - https://www.v2ex.com
88
+ - https://linux.do
89
+ - https://linux.sb
@@ -1 +1 @@
1
- {"version":3,"file":"apply.d.ts","sourceRoot":"","sources":["../../src/client/apply.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAWlD,eAAO,MAAM,IAAI,qBAAqB,CAAA;AACtC,eAAO,MAAM,MAAM,UAAkC,CAAA;AAErD,wBAAsB,KAAK,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CA0BvD"}
1
+ {"version":3,"file":"apply.d.ts","sourceRoot":"","sources":["../../src/client/apply.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAalD,eAAO,MAAM,IAAI,qBAAqB,CAAA;AACtC,eAAO,MAAM,MAAM,UAAmE,CAAA;AAEtF,wBAAsB,KAAK,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAiCvD"}
@@ -1,11 +1,13 @@
1
1
  import { createElement } from 'react';
2
2
  import sideChatCss from './panel/side-chat.css';
3
+ import { selectionReferenceSource } from './parent-composer/add-to-conversation.js';
4
+ import { mountParentConversationAnnotations } from './parent-composer/ParentConversationAnnotations.js';
3
5
  import { SideChatController } from './side-chat-controller.js';
4
6
  import { mountArchivedRemote } from './rc6/remote-adapter.js';
5
7
  import { Rc6SideChatOverlay } from './rc6/Rc6SideChatOverlay.js';
6
8
  import { Rc6SideChatSessions } from './rc6/sessions-adapter.js';
7
9
  export const name = 'side-chat-client';
8
- export const inject = ['remote', 'sessions', 'slots'];
10
+ export const inject = ['conversation', 'inputTriggers', 'remote', 'sessions', 'slots'];
9
11
  export async function apply(ctx) {
10
12
  const stylesheet = document.createElement('style');
11
13
  stylesheet.textContent = sideChatCss;
@@ -14,7 +16,9 @@ export async function apply(ctx) {
14
16
  document.head.append(stylesheet);
15
17
  const clientCtx = ctx;
16
18
  const mounted = await mountArchivedRemote(clientCtx);
19
+ const removeSelectionReferenceSource = clientCtx.inputTriggers.registerSource(selectionReferenceSource);
17
20
  const sessions = new Rc6SideChatSessions(clientCtx);
21
+ const removeParentAnnotations = mountParentConversationAnnotations(clientCtx, () => { sessions.removeConversationAnnotations(); });
18
22
  const controller = new SideChatController(mounted.remote, sessions);
19
23
  const removeOverlay = clientCtx.slots.inject('shell.overlay', () => clientCtx.slots.register({
20
24
  name: 'shell.overlay',
@@ -26,6 +30,8 @@ export async function apply(ctx) {
26
30
  await controller.dispose();
27
31
  }
28
32
  finally {
33
+ removeParentAnnotations();
34
+ removeSelectionReferenceSource();
29
35
  removeOverlay();
30
36
  await mounted.dispose();
31
37
  stylesheet.remove();
@@ -1 +1 @@
1
- {"version":3,"file":"apply.js","sourceRoot":"","sources":["../../src/client/apply.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAA;AAKrC,OAAO,WAAW,MAAM,uBAAuB,CAAA;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAA;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAA;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAA;AAG/D,MAAM,CAAC,MAAM,IAAI,GAAG,kBAAkB,CAAA;AACtC,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,QAAQ,EAAE,UAAU,EAAE,OAAO,CAAC,CAAA;AAErD,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,GAAY;IACtC,MAAM,UAAU,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAA;IAClD,UAAU,CAAC,WAAW,GAAG,WAAW,CAAA;IACpC,UAAU,CAAC,OAAO,CAAC,MAAM,GAAG,eAAe,CAAA;IAC3C,UAAU,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,QAAQ,CAAA;IAC5C,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAA;IAEhC,MAAM,SAAS,GAAG,GAAkC,CAAA;IACpD,MAAM,OAAO,GAAG,MAAM,mBAAmB,CAAC,SAAS,CAAC,CAAA;IACpD,MAAM,QAAQ,GAAG,IAAI,mBAAmB,CAAC,SAAS,CAAC,CAAA;IACnD,MAAM,UAAU,GAAG,IAAI,kBAAkB,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;IACnE,MAAM,aAAa,GAAG,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,eAAe,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC;QAC3F,IAAI,EAAE,eAAe;QACrB,EAAE,EAAE,eAAe;QACnB,KAAK,EAAE,EAAE;KACV,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,kBAAkB,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAA;IAEtE,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,KAAK,IAAI,EAAE;QAC1B,IAAI,CAAC;YACH,MAAM,UAAU,CAAC,OAAO,EAAE,CAAA;QAC5B,CAAC;gBAAS,CAAC;YACT,aAAa,EAAE,CAAA;YACf,MAAM,OAAO,CAAC,OAAO,EAAE,CAAA;YACvB,UAAU,CAAC,MAAM,EAAE,CAAA;QACrB,CAAC;IACH,CAAC,EAAE,+BAA+B,CAAC,CAAA;AACrC,CAAC"}
1
+ {"version":3,"file":"apply.js","sourceRoot":"","sources":["../../src/client/apply.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAA;AAKrC,OAAO,WAAW,MAAM,uBAAuB,CAAA;AAC/C,OAAO,EAAE,wBAAwB,EAAE,MAAM,0CAA0C,CAAA;AACnF,OAAO,EAAE,kCAAkC,EAAE,MAAM,oDAAoD,CAAA;AACvG,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAA;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAA;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAA;AAG/D,MAAM,CAAC,MAAM,IAAI,GAAG,kBAAkB,CAAA;AACtC,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,cAAc,EAAE,eAAe,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,CAAC,CAAA;AAEtF,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,GAAY;IACtC,MAAM,UAAU,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAA;IAClD,UAAU,CAAC,WAAW,GAAG,WAAW,CAAA;IACpC,UAAU,CAAC,OAAO,CAAC,MAAM,GAAG,eAAe,CAAA;IAC3C,UAAU,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,QAAQ,CAAA;IAC5C,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAA;IAEhC,MAAM,SAAS,GAAG,GAAkC,CAAA;IACpD,MAAM,OAAO,GAAG,MAAM,mBAAmB,CAAC,SAAS,CAAC,CAAA;IACpD,MAAM,8BAA8B,GAAG,SAAS,CAAC,aAAa,CAAC,cAAc,CAAC,wBAAwB,CAAC,CAAA;IACvG,MAAM,QAAQ,GAAG,IAAI,mBAAmB,CAAC,SAAS,CAAC,CAAA;IACnD,MAAM,uBAAuB,GAAG,kCAAkC,CAChE,SAAS,EACT,GAAG,EAAE,GAAG,QAAQ,CAAC,6BAA6B,EAAE,CAAA,CAAC,CAAC,CACnD,CAAA;IACD,MAAM,UAAU,GAAG,IAAI,kBAAkB,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;IACnE,MAAM,aAAa,GAAG,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,eAAe,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC;QAC3F,IAAI,EAAE,eAAe;QACrB,EAAE,EAAE,eAAe;QACnB,KAAK,EAAE,EAAE;KACV,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,kBAAkB,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAA;IAEtE,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,KAAK,IAAI,EAAE;QAC1B,IAAI,CAAC;YACH,MAAM,UAAU,CAAC,OAAO,EAAE,CAAA;QAC5B,CAAC;gBAAS,CAAC;YACT,uBAAuB,EAAE,CAAA;YACzB,8BAA8B,EAAE,CAAA;YAChC,aAAa,EAAE,CAAA;YACf,MAAM,OAAO,CAAC,OAAO,EAAE,CAAA;YACvB,UAAU,CAAC,MAAM,EAAE,CAAA;QACrB,CAAC;IACH,CAAC,EAAE,+BAA+B,CAAC,CAAA;AACrC,CAAC"}
@@ -1,10 +1,12 @@
1
- import type { ConversationSelection } from '../../shared/contracts.js';
2
1
  import type { SideChatMessages } from './messages.js';
2
+ export interface SelectionQuoteItem {
3
+ readonly text: string;
4
+ readonly comment?: string;
5
+ }
3
6
  /** Selected passage displayed separately from the user's first question. */
4
- export declare function SelectionQuote({ selection, messages, onCopy, onRemove, }: {
5
- readonly selection: ConversationSelection;
7
+ export declare function SelectionQuote({ selections, messages, onRemove, }: {
8
+ readonly selections: readonly SelectionQuoteItem[];
6
9
  readonly messages: SideChatMessages;
7
- readonly onCopy?: (text: string) => void;
8
10
  readonly onRemove?: () => void;
9
11
  }): import("react/jsx-runtime").JSX.Element;
10
12
  //# sourceMappingURL=SelectionQuote.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"SelectionQuote.d.ts","sourceRoot":"","sources":["../../../src/client/panel/SelectionQuote.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAA;AACtE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAErD,4EAA4E;AAC5E,wBAAgB,cAAc,CAAC,EAC7B,SAAS,EACT,QAAQ,EACR,MAAM,EACN,QAAQ,GACT,EAAE;IACD,QAAQ,CAAC,SAAS,EAAE,qBAAqB,CAAA;IACzC,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAA;IACnC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IACxC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAA;CAC/B,2CA+DA"}
1
+ {"version":3,"file":"SelectionQuote.d.ts","sourceRoot":"","sources":["../../../src/client/panel/SelectionQuote.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAErD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAC1B;AAED,4EAA4E;AAC5E,wBAAgB,cAAc,CAAC,EAC7B,UAAU,EACV,QAAQ,EACR,QAAQ,GACT,EAAE;IACD,QAAQ,CAAC,UAAU,EAAE,SAAS,kBAAkB,EAAE,CAAA;IAClD,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAA;IACnC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAA;CAC/B,2CAiGA"}
@@ -1,25 +1,48 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { useRef, useState } from 'react';
2
+ import { useEffect, useRef, useState } from 'react';
3
3
  /** Selected passage displayed separately from the user's first question. */
4
- export function SelectionQuote({ selection, messages, onCopy, onRemove, }) {
4
+ export function SelectionQuote({ selections, messages, onRemove, }) {
5
5
  const [expanded, setExpanded] = useState(false);
6
+ const [hovered, setHovered] = useState(false);
6
7
  const quoteRef = useRef(null);
7
8
  const detailsRef = useRef(null);
8
- const constrainDetailsToPanel = () => {
9
+ const leaveTimerRef = useRef();
10
+ const keepHoverOpen = () => {
11
+ if (leaveTimerRef.current !== undefined)
12
+ window.clearTimeout(leaveTimerRef.current);
13
+ leaveTimerRef.current = undefined;
14
+ setHovered(true);
15
+ };
16
+ const closeHoverAfterGrace = () => {
17
+ if (leaveTimerRef.current !== undefined)
18
+ window.clearTimeout(leaveTimerRef.current);
19
+ leaveTimerRef.current = window.setTimeout(() => {
20
+ leaveTimerRef.current = undefined;
21
+ setHovered(false);
22
+ }, 220);
23
+ };
24
+ useEffect(() => () => {
25
+ if (leaveTimerRef.current !== undefined)
26
+ window.clearTimeout(leaveTimerRef.current);
27
+ }, []);
28
+ const constrainDetailsToBoundary = () => {
9
29
  const details = detailsRef.current;
10
- const panel = quoteRef.current?.closest('.dsh-side-chat-panel');
11
- if (details === null || panel === undefined || panel === null)
30
+ const boundary = quoteRef.current?.closest('.dsh-side-chat-panel, [data-composer-seat], [data-chat-flow-kind]');
31
+ if (details === null)
12
32
  return;
13
33
  details.style.setProperty('--dsh-side-chat-quote-offset-x', '0px');
14
34
  const detailsRect = details.getBoundingClientRect();
15
- const panelRect = panel.getBoundingClientRect();
16
- const leftEdge = panelRect.left + 16;
17
- const rightEdge = panelRect.right - 16;
35
+ const boundaryRect = boundary?.getBoundingClientRect();
36
+ const leftEdge = (boundaryRect?.left ?? 0) + 16;
37
+ const rightEdge = (boundaryRect?.right ?? window.innerWidth) - 16;
18
38
  const offset = detailsRect.left < leftEdge
19
39
  ? leftEdge - detailsRect.left
20
40
  : detailsRect.right > rightEdge ? rightEdge - detailsRect.right : 0;
21
41
  details.style.setProperty('--dsh-side-chat-quote-offset-x', `${String(offset)}px`);
22
42
  };
23
- return (_jsxs("section", { ref: quoteRef, className: "dsh-side-chat-quote", "aria-label": messages.selectedPassage, "data-expanded": expanded || undefined, onMouseEnter: constrainDetailsToPanel, onFocusCapture: constrainDetailsToPanel, children: [_jsxs("div", { className: "dsh-side-chat-quote-chip", children: [_jsxs("button", { type: "button", className: "dsh-side-chat-quote-trigger", "aria-expanded": expanded, "aria-label": `${expanded ? messages.collapse : messages.expand}: ${messages.selectedPassage}`, onClick: () => { setExpanded(value => !value); }, children: [_jsxs("svg", { className: "dsh-side-chat-quote-icon", viewBox: "0 0 24 24", "aria-hidden": "true", children: [_jsx("path", { d: "M21 15a4 4 0 0 1-4 4H7l-4 4V7a4 4 0 0 1 4-4h10a4 4 0 0 1 4 4Z" }), _jsx("path", { d: "M8 8h8M8 12h5" })] }), _jsx("strong", { children: messages.selectionAttachment })] }), onRemove !== undefined && (_jsx("button", { type: "button", className: "dsh-side-chat-quote-remove", "aria-label": messages.removeSelection, onClick: onRemove, children: "\u00D7" }))] }), _jsxs("div", { ref: detailsRef, className: "dsh-side-chat-quote-details", role: "tooltip", children: [_jsxs("div", { className: "dsh-side-chat-quote-details-header", children: [_jsxs("strong", { children: ["1. ", messages.selectionPreviewLabel, ":"] }), onCopy !== undefined && (_jsx("button", { type: "button", onClick: () => { onCopy(selection.text); }, children: messages.copy }))] }), _jsx("pre", { children: selection.text })] })] }));
43
+ return (_jsxs("section", { ref: quoteRef, className: "dsh-side-chat-quote", "aria-label": messages.selectedPassage, "data-expanded": expanded || undefined, "data-hovered": hovered || undefined, onMouseEnter: () => {
44
+ keepHoverOpen();
45
+ constrainDetailsToBoundary();
46
+ }, onMouseLeave: closeHoverAfterGrace, onFocusCapture: constrainDetailsToBoundary, children: [_jsxs("div", { className: "dsh-side-chat-quote-chip", children: [_jsxs("button", { type: "button", className: "dsh-side-chat-quote-trigger", "aria-expanded": expanded, "aria-label": `${expanded ? messages.collapse : messages.expand}: ${messages.selectedPassage}`, onClick: () => { setExpanded(value => !value); }, children: [_jsxs("svg", { className: "dsh-side-chat-quote-icon", viewBox: "0 0 24 24", "aria-hidden": "true", children: [_jsx("path", { d: "M21 15a4 4 0 0 1-4 4H7l-4 4V7a4 4 0 0 1 4-4h10a4 4 0 0 1 4 4Z" }), _jsx("path", { d: "M8 8h8M8 12h5" })] }), _jsx("strong", { children: messages.selectionAttachments(selections.length) })] }), onRemove !== undefined && (_jsx("button", { type: "button", className: "dsh-side-chat-quote-remove", "aria-label": messages.removeSelection, onClick: onRemove, children: "\u00D7" }))] }), _jsx("div", { ref: detailsRef, className: "dsh-side-chat-quote-details", role: "tooltip", children: selections.map((selection, index) => (_jsxs("div", { className: "dsh-side-chat-quote-detail", children: [_jsx("div", { className: "dsh-side-chat-quote-details-header", children: _jsxs("strong", { children: [String(index + 1), ". ", messages.selectionPreviewLabel, ":"] }) }), _jsx("pre", { children: selection.text }), selection.comment !== undefined && (_jsxs("div", { className: "dsh-side-chat-quote-comment", children: [_jsxs("strong", { children: [messages.selectionCommentLabel, ":"] }), _jsx("pre", { children: selection.comment })] }))] }, `${String(index)}-${selection.text}`))) })] }));
24
47
  }
25
48
  //# sourceMappingURL=SelectionQuote.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SelectionQuote.js","sourceRoot":"","sources":["../../../src/client/panel/SelectionQuote.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SelectionQuote.js","sourceRoot":"","sources":["../../../src/client/panel/SelectionQuote.tsx"],"names":[],"mappings":"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"}
@@ -10,8 +10,7 @@ export interface SideChatPanelProps {
10
10
  readonly onClose: () => Promise<SideChatActionResult<void>>;
11
11
  readonly onRetry: () => Promise<SideChatActionResult<unknown>>;
12
12
  readonly onFocusParent: () => void;
13
- readonly onCopySelection?: (text: string) => void;
14
13
  readonly onRemoveSelection?: () => void;
15
14
  }
16
- export declare function SideChatPanel({ state, locale, embeddedConversation, onDraftChange, onFirstSend, onClose, onRetry, onFocusParent, onCopySelection, onRemoveSelection, }: SideChatPanelProps): import("react/jsx-runtime").JSX.Element;
15
+ export declare function SideChatPanel({ state, locale, embeddedConversation, onDraftChange, onFirstSend, onClose, onRetry, onFocusParent, onRemoveSelection, }: SideChatPanelProps): import("react/jsx-runtime").JSX.Element;
17
16
  //# sourceMappingURL=SideChatPanel.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"SideChatPanel.d.ts","sourceRoot":"","sources":["../../../src/client/panel/SideChatPanel.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA4B,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAChE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AAC9D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAA;AAS3D,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAA;IAC7B,QAAQ,CAAC,MAAM,CAAC,EAAE,IAAI,GAAG,OAAO,CAAA;IAChC,QAAQ,CAAC,oBAAoB,CAAC,EAAE,SAAS,CAAA;IACzC,QAAQ,CAAC,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IAC/C,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAA;IAC/E,QAAQ,CAAC,OAAO,EAAE,MAAM,OAAO,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAA;IAC3D,QAAQ,CAAC,OAAO,EAAE,MAAM,OAAO,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC,CAAA;IAC9D,QAAQ,CAAC,aAAa,EAAE,MAAM,IAAI,CAAA;IAClC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IACjD,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,IAAI,CAAA;CACxC;AAED,wBAAgB,aAAa,CAAC,EAC5B,KAAK,EACL,MAAa,EACb,oBAAoB,EACpB,aAAa,EACb,WAAW,EACX,OAAO,EACP,OAAO,EACP,aAAa,EACb,eAAe,EACf,iBAAiB,GAClB,EAAE,kBAAkB,2CAoFpB"}
1
+ {"version":3,"file":"SideChatPanel.d.ts","sourceRoot":"","sources":["../../../src/client/panel/SideChatPanel.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA4B,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAChE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AAC9D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAA;AAS3D,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAA;IAC7B,QAAQ,CAAC,MAAM,CAAC,EAAE,IAAI,GAAG,OAAO,CAAA;IAChC,QAAQ,CAAC,oBAAoB,CAAC,EAAE,SAAS,CAAA;IACzC,QAAQ,CAAC,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IAC/C,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAA;IAC/E,QAAQ,CAAC,OAAO,EAAE,MAAM,OAAO,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAA;IAC3D,QAAQ,CAAC,OAAO,EAAE,MAAM,OAAO,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC,CAAA;IAC9D,QAAQ,CAAC,aAAa,EAAE,MAAM,IAAI,CAAA;IAClC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,IAAI,CAAA;CACxC;AAED,wBAAgB,aAAa,CAAC,EAC5B,KAAK,EACL,MAAa,EACb,oBAAoB,EACpB,aAAa,EACb,WAAW,EACX,OAAO,EACP,OAAO,EACP,aAAa,EACb,iBAAiB,GAClB,EAAE,kBAAkB,2CAmFpB"}
@@ -7,7 +7,7 @@ import { SideChatBody } from './SideChatBody.js';
7
7
  import { SideChatErrorState } from './SideChatErrorState.js';
8
8
  import { SideChatHeader } from './SideChatHeader.js';
9
9
  import { useAutoGrowingTextarea } from './use-auto-growing-textarea.js';
10
- export function SideChatPanel({ state, locale = 'en', embeddedConversation, onDraftChange, onFirstSend, onClose, onRetry, onFocusParent, onCopySelection, onRemoveSelection, }) {
10
+ export function SideChatPanel({ state, locale = 'en', embeddedConversation, onDraftChange, onFirstSend, onClose, onRetry, onFocusParent, onRemoveSelection, }) {
11
11
  const messages = SIDE_CHAT_MESSAGES[locale];
12
12
  const [submitting, setSubmitting] = useState(false);
13
13
  const draftRef = useAutoGrowingTextarea(state.draft);
@@ -25,7 +25,7 @@ export function SideChatPanel({ state, locale = 'en', embeddedConversation, onDr
25
25
  };
26
26
  return (_jsxs("aside", { className: "dsh-side-chat-panel", "data-side-chat-panel": "", "aria-label": messages.title, "aria-busy": ['creating', 'opening', 'closing'].includes(state.phase) || undefined, children: [_jsx(SideChatHeader, { phase: state.phase, messages: messages, onFocusParent: onFocusParent, onClose: () => { void onClose(); } }), state.error !== undefined && (_jsx(SideChatErrorState, { error: state.error, messages: messages, onRetry: () => { void onRetry(); } })), state.childSessionId !== undefined && embeddedConversation !== undefined
27
27
  ? _jsx(SideChatBody, { children: embeddedConversation })
28
- : (_jsxs("form", { className: "dsh-side-chat-draft", onSubmit: (event) => { void submit(event); }, children: [state.selection !== undefined && (_jsx(SelectionQuote, { selection: state.selection, messages: messages, ...onCopySelection === undefined ? {} : { onCopy: onCopySelection }, ...onRemoveSelection === undefined ? {} : { onRemove: onRemoveSelection } })), _jsx("label", { htmlFor: "dsh-side-chat-draft-input", children: messages.placeholder }), _jsx("textarea", { id: "dsh-side-chat-draft-input", ref: draftRef, autoFocus: true, rows: 1, value: state.draft, disabled: ['creating', 'opening', 'closing'].includes(state.phase), placeholder: messages.placeholder, onChange: (event) => { onDraftChange(event.target.value); }, onKeyDown: (event) => {
28
+ : (_jsxs("form", { className: "dsh-side-chat-draft", onSubmit: (event) => { void submit(event); }, children: [state.selection !== undefined && (_jsx(SelectionQuote, { selections: [state.selection], messages: messages, ...onRemoveSelection === undefined ? {} : { onRemove: onRemoveSelection } })), _jsx("label", { htmlFor: "dsh-side-chat-draft-input", children: messages.placeholder }), _jsx("textarea", { id: "dsh-side-chat-draft-input", ref: draftRef, autoFocus: true, rows: 1, value: state.draft, disabled: ['creating', 'opening', 'closing'].includes(state.phase), placeholder: messages.placeholder, onChange: (event) => { onDraftChange(event.target.value); }, onKeyDown: (event) => {
29
29
  if (event.key === 'Enter' && !event.shiftKey) {
30
30
  event.preventDefault();
31
31
  event.currentTarget.form?.requestSubmit();
@@ -1 +1 @@
1
- {"version":3,"file":"SideChatPanel.js","sourceRoot":"","sources":["../../../src/client/panel/SideChatPanel.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SideChatPanel.js","sourceRoot":"","sources":["../../../src/client/panel/SideChatPanel.tsx"],"names":[],"mappings":"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"}
@@ -4,12 +4,12 @@ export interface SideChatMessages {
4
4
  readonly placeholder: string;
5
5
  readonly send: string;
6
6
  readonly selectedPassage: string;
7
- readonly selectionAttachment: string;
7
+ readonly selectionAttachments: (count: number) => string;
8
8
  readonly selectionPreviewLabel: string;
9
+ readonly selectionCommentLabel: string;
9
10
  readonly removeSelection: string;
10
11
  readonly expand: string;
11
12
  readonly collapse: string;
12
- readonly copy: string;
13
13
  readonly temporary: string;
14
14
  readonly referenceOnly: string;
15
15
  readonly cannotReopen: string;
@@ -1 +1 @@
1
- {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../../src/client/panel/messages.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAA;IAChC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAA;IACpC,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAA;IACtC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAA;IAChC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;IAC9B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAA;IAChC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;CAC5B;AAED,eAAO,MAAM,kBAAkB,EAAE,QAAQ,CAAC,MAAM,CAAC,IAAI,GAAG,OAAO,EAAE,gBAAgB,CAAC,CAyChF,CAAA"}
1
+ {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../../src/client/panel/messages.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAA;IAChC,QAAQ,CAAC,oBAAoB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAA;IACxD,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAA;IACtC,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAA;IACtC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAA;IAChC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;IAC9B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAA;IAChC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;CAC5B;AAED,eAAO,MAAM,kBAAkB,EAAE,QAAQ,CAAC,MAAM,CAAC,IAAI,GAAG,OAAO,EAAE,gBAAgB,CAAC,CAyChF,CAAA"}
@@ -5,12 +5,12 @@ export const SIDE_CHAT_MESSAGES = Object.freeze({
5
5
  placeholder: 'Ask about this in a Side Chat',
6
6
  send: 'Send',
7
7
  selectedPassage: 'Selected passage',
8
- selectionAttachment: '1 annotation',
8
+ selectionAttachments: (count) => `${String(count)} ${count === 1 ? 'annotation' : 'annotations'}`,
9
9
  selectionPreviewLabel: 'Selected text',
10
+ selectionCommentLabel: 'User comment',
10
11
  removeSelection: 'Remove annotation',
11
12
  expand: 'Expand',
12
13
  collapse: 'Collapse',
13
- copy: 'Copy',
14
14
  temporary: 'Archived when closed; history remains on disk',
15
15
  referenceOnly: 'Inherits the complete parent conversation prefix',
16
16
  cannotReopen: 'No reopen action',
@@ -25,12 +25,12 @@ export const SIDE_CHAT_MESSAGES = Object.freeze({
25
25
  placeholder: '在侧边对话中询问这段内容',
26
26
  send: '发送',
27
27
  selectedPassage: '所选段落',
28
- selectionAttachment: '1 条引用',
28
+ selectionAttachments: (count) => `${String(count)} 条引用`,
29
29
  selectionPreviewLabel: '所选文本',
30
+ selectionCommentLabel: '用户批注',
30
31
  removeSelection: '移除引用',
31
32
  expand: '展开',
32
33
  collapse: '收起',
33
- copy: '复制',
34
34
  temporary: '关闭时归档;历史仍保存在磁盘上',
35
35
  referenceOnly: '完整继承父会话对话前缀',
36
36
  cannotReopen: '不提供重新打开操作',
@@ -1 +1 @@
1
- {"version":3,"file":"messages.js","sourceRoot":"","sources":["../../../src/client/panel/messages.ts"],"names":[],"mappings":"AAqBA,MAAM,CAAC,MAAM,kBAAkB,GAAuD,MAAM,CAAC,MAAM,CAAC;IAClG,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC;QAChB,KAAK,EAAE,WAAW;QAClB,KAAK,EAAE,iBAAiB;QACxB,WAAW,EAAE,+BAA+B;QAC5C,IAAI,EAAE,MAAM;QACZ,eAAe,EAAE,kBAAkB;QACnC,mBAAmB,EAAE,cAAc;QACnC,qBAAqB,EAAE,eAAe;QACtC,eAAe,EAAE,mBAAmB;QACpC,MAAM,EAAE,QAAQ;QAChB,QAAQ,EAAE,UAAU;QACpB,IAAI,EAAE,MAAM;QACZ,SAAS,EAAE,+CAA+C;QAC1D,aAAa,EAAE,kDAAkD;QACjE,YAAY,EAAE,kBAAkB;QAChC,eAAe,EAAE,6BAA6B;QAC9C,KAAK,EAAE,OAAO;QACd,YAAY,EAAE,iBAAiB;QAC/B,UAAU,EAAE,+BAA+B;KAC5C,CAAC;IACF,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC;QACrB,KAAK,EAAE,MAAM;QACb,KAAK,EAAE,QAAQ;QACf,WAAW,EAAE,cAAc;QAC3B,IAAI,EAAE,IAAI;QACV,eAAe,EAAE,MAAM;QACvB,mBAAmB,EAAE,OAAO;QAC5B,qBAAqB,EAAE,MAAM;QAC7B,eAAe,EAAE,MAAM;QACvB,MAAM,EAAE,IAAI;QACZ,QAAQ,EAAE,IAAI;QACd,IAAI,EAAE,IAAI;QACV,SAAS,EAAE,iBAAiB;QAC5B,aAAa,EAAE,aAAa;QAC5B,YAAY,EAAE,WAAW;QACzB,eAAe,EAAE,WAAW;QAC5B,KAAK,EAAE,IAAI;QACX,YAAY,EAAE,QAAQ;QACtB,UAAU,EAAE,UAAU;KACvB,CAAC;CACH,CAAC,CAAA"}
1
+ {"version":3,"file":"messages.js","sourceRoot":"","sources":["../../../src/client/panel/messages.ts"],"names":[],"mappings":"AAqBA,MAAM,CAAC,MAAM,kBAAkB,GAAuD,MAAM,CAAC,MAAM,CAAC;IAClG,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC;QAChB,KAAK,EAAE,WAAW;QAClB,KAAK,EAAE,iBAAiB;QACxB,WAAW,EAAE,+BAA+B;QAC5C,IAAI,EAAE,MAAM;QACZ,eAAe,EAAE,kBAAkB;QACnC,oBAAoB,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,aAAa,EAAE;QACzG,qBAAqB,EAAE,eAAe;QACtC,qBAAqB,EAAE,cAAc;QACrC,eAAe,EAAE,mBAAmB;QACpC,MAAM,EAAE,QAAQ;QAChB,QAAQ,EAAE,UAAU;QACpB,SAAS,EAAE,+CAA+C;QAC1D,aAAa,EAAE,kDAAkD;QACjE,YAAY,EAAE,kBAAkB;QAChC,eAAe,EAAE,6BAA6B;QAC9C,KAAK,EAAE,OAAO;QACd,YAAY,EAAE,iBAAiB;QAC/B,UAAU,EAAE,+BAA+B;KAC5C,CAAC;IACF,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC;QACrB,KAAK,EAAE,MAAM;QACb,KAAK,EAAE,QAAQ;QACf,WAAW,EAAE,cAAc;QAC3B,IAAI,EAAE,IAAI;QACV,eAAe,EAAE,MAAM;QACvB,oBAAoB,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM;QAC/D,qBAAqB,EAAE,MAAM;QAC7B,qBAAqB,EAAE,MAAM;QAC7B,eAAe,EAAE,MAAM;QACvB,MAAM,EAAE,IAAI;QACZ,QAAQ,EAAE,IAAI;QACd,SAAS,EAAE,iBAAiB;QAC5B,aAAa,EAAE,aAAa;QAC5B,YAAY,EAAE,WAAW;QACzB,eAAe,EAAE,WAAW;QAC5B,KAAK,EAAE,IAAI;QACX,YAAY,EAAE,QAAQ;QACtB,UAAU,EAAE,UAAU;KACvB,CAAC;CACH,CAAC,CAAA"}
@@ -0,0 +1,27 @@
1
+ import { type ElementType, type ReactNode } from 'react';
2
+ import type { Rc6ClientContext } from '../rc6/context.js';
3
+ import { SIDE_CHAT_MESSAGES } from '../panel/messages.js';
4
+ import { type ParentComposerInputSnapshot } from './add-to-conversation.js';
5
+ type Locale = keyof typeof SIDE_CHAT_MESSAGES;
6
+ interface UserNodeProps {
7
+ readonly node: {
8
+ readonly data: {
9
+ readonly content: readonly unknown[];
10
+ };
11
+ readonly [key: string]: unknown;
12
+ };
13
+ readonly [key: string]: unknown;
14
+ }
15
+ type UserNodeRenderer = ElementType<UserNodeProps>;
16
+ /** The interactive annotation capsule occupying the reserved first composer row. */
17
+ export declare function ParentComposerAnnotations({ input, onRemove, locale, }: {
18
+ readonly input: ParentComposerInputSnapshot;
19
+ readonly onRemove: () => void;
20
+ readonly locale?: Locale;
21
+ }): import("react/jsx-runtime").JSX.Element | null;
22
+ /** Wrap DSH's own user renderer only when this plugin's durable prefix exists. */
23
+ export declare function annotatedUserMessageRenderer(Original: UserNodeRenderer): (props: UserNodeProps) => ReactNode;
24
+ /** Mount the composer capsule and a thin wrapper around DSH's user renderers. */
25
+ export declare function mountParentConversationAnnotations(ctx: Rc6ClientContext, removeAnnotations: () => void): () => void;
26
+ export {};
27
+ //# sourceMappingURL=ParentConversationAnnotations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ParentConversationAnnotations.d.ts","sourceRoot":"","sources":["../../../src/client/parent-composer/ParentConversationAnnotations.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,WAAW,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AACvE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AAEzD,OAAO,EAGL,KAAK,2BAA2B,EACjC,MAAM,0BAA0B,CAAA;AAEjC,KAAK,MAAM,GAAG,MAAM,OAAO,kBAAkB,CAAA;AAC7C,UAAU,aAAa;IACrB,QAAQ,CAAC,IAAI,EAAE;QACb,QAAQ,CAAC,IAAI,EAAE;YAAE,QAAQ,CAAC,OAAO,EAAE,SAAS,OAAO,EAAE,CAAA;SAAE,CAAA;QACvD,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAChC,CAAA;IACD,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAChC;AACD,KAAK,gBAAgB,GAAG,WAAW,CAAC,aAAa,CAAC,CAAA;AAyBlD,oFAAoF;AACpF,wBAAgB,yBAAyB,CAAC,EACxC,KAAK,EACL,QAAQ,EACR,MAAwB,GACzB,EAAE;IACD,QAAQ,CAAC,KAAK,EAAE,2BAA2B,CAAA;IAC3C,QAAQ,CAAC,QAAQ,EAAE,MAAM,IAAI,CAAA;IAC7B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CACzB,kDAYA;AA4BD,kFAAkF;AAClF,wBAAgB,4BAA4B,CAAC,QAAQ,EAAE,gBAAgB,GAAG,CAAC,KAAK,EAAE,aAAa,KAAK,SAAS,CAqB5G;AAED,iFAAiF;AACjF,wBAAgB,kCAAkC,CAChD,GAAG,EAAE,gBAAgB,EACrB,iBAAiB,EAAE,MAAM,IAAI,GAC5B,MAAM,IAAI,CAyCZ"}
@@ -0,0 +1,97 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { createElement } from 'react';
3
+ import { SIDE_CHAT_MESSAGES } from '../panel/messages.js';
4
+ import { SelectionQuote } from '../panel/SelectionQuote.js';
5
+ import { conversationAnnotations, parseAnnotatedConversationPrompt, } from './add-to-conversation.js';
6
+ function currentLocale() {
7
+ return navigator.language.toLowerCase().startsWith('zh') ? 'zh-CN' : 'en';
8
+ }
9
+ /** The interactive annotation capsule occupying the reserved first composer row. */
10
+ export function ParentComposerAnnotations({ input, onRemove, locale = currentLocale(), }) {
11
+ const annotations = conversationAnnotations(input);
12
+ if (annotations.length === 0)
13
+ return null;
14
+ return (_jsx("div", { className: "dsh-side-chat-parent-annotation-dock", children: _jsx(SelectionQuote, { selections: annotations, messages: SIDE_CHAT_MESSAGES[locale], onRemove: onRemove }) }));
15
+ }
16
+ function contentText(content) {
17
+ return content.map((block) => {
18
+ if (typeof block !== 'object' || block === null)
19
+ return '';
20
+ const value = block;
21
+ return value.type === 'text' && typeof value.text === 'string' ? value.text : '';
22
+ }).join('');
23
+ }
24
+ function visibleMessage(message) {
25
+ const wrapped = /^<user_question>\n?([\s\S]*?)\n?<\/user_question>$/u.exec(message);
26
+ return wrapped?.[1]?.trim() ?? message;
27
+ }
28
+ function replaceTextContent(content, message) {
29
+ let replaced = false;
30
+ const next = content.flatMap((block) => {
31
+ if (typeof block !== 'object' || block === null)
32
+ return [block];
33
+ const value = block;
34
+ if (value.type !== 'text' || typeof value.text !== 'string')
35
+ return [block];
36
+ if (replaced)
37
+ return [];
38
+ replaced = true;
39
+ return [{ ...value, text: message }];
40
+ });
41
+ return replaced ? next : [{ type: 'text', text: message }, ...next];
42
+ }
43
+ /** Wrap DSH's own user renderer only when this plugin's durable prefix exists. */
44
+ export function annotatedUserMessageRenderer(Original) {
45
+ return function AnnotatedUserMessageRenderer(props) {
46
+ const parsed = parseAnnotatedConversationPrompt(contentText(props.node.data.content));
47
+ if (parsed === undefined)
48
+ return createElement(Original, props);
49
+ const node = {
50
+ ...props.node,
51
+ data: {
52
+ ...props.node.data,
53
+ content: replaceTextContent(props.node.data.content, visibleMessage(parsed.message)),
54
+ },
55
+ };
56
+ return (_jsxs("div", { className: "dsh-side-chat-parent-user-message", children: [_jsx(SelectionQuote, { selections: parsed.annotations, messages: SIDE_CHAT_MESSAGES[currentLocale()] }), createElement(Original, { ...props, node })] }));
57
+ };
58
+ }
59
+ /** Mount the composer capsule and a thin wrapper around DSH's user renderers. */
60
+ export function mountParentConversationAnnotations(ctx, removeAnnotations) {
61
+ const slots = ctx.slots;
62
+ const removeDock = slots.inject('conversation.input.dock', () => slots.register({
63
+ name: 'conversation.input.dock',
64
+ id: 'dsh-side-chat-annotations',
65
+ order: -100,
66
+ }, ({ input }) => (_jsx(ParentComposerAnnotations, { input: input, onRemove: removeAnnotations }))));
67
+ const shadow = (key) => slots.inject('conversation.chat.node', () => {
68
+ const ShadowedUserMessage = (props) => {
69
+ // Built-in keyed renderers can register after this declaration callback.
70
+ // Resolve the next-priority renderer at render time so load order does
71
+ // not decide whether annotations are projected.
72
+ const original = slots.entries('conversation.chat.node')
73
+ .find(entry => entry.options.key === key
74
+ && entry.component !== ShadowedUserMessage
75
+ && (entry.options.priority ?? 0) >= 0)
76
+ ?.component;
77
+ if (original === undefined)
78
+ return null;
79
+ const Renderer = annotatedUserMessageRenderer(original);
80
+ return createElement(Renderer, props);
81
+ };
82
+ return slots.register({
83
+ name: 'conversation.chat.node',
84
+ key,
85
+ priority: -100,
86
+ locale: 'conversation',
87
+ }, ShadowedUserMessage);
88
+ });
89
+ const removeUser = shadow('user');
90
+ const removeSteering = shadow('steering');
91
+ return () => {
92
+ removeSteering();
93
+ removeUser();
94
+ removeDock();
95
+ };
96
+ }
97
+ //# sourceMappingURL=ParentConversationAnnotations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ParentConversationAnnotations.js","sourceRoot":"","sources":["../../../src/client/parent-composer/ParentConversationAnnotations.tsx"],"names":[],"mappings":"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"}