dsh-sidenote 0.7.6 → 0.8.0

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
@@ -37,7 +37,7 @@ dsh plugin --profile web add dsh-sidenote
37
37
 
38
38
  打开 DSH Web,点击会话顶栏的 **「侧边」**,或划选一段回复开始。也可输入 `/side` 打开侧聊,用 `Alt+S` 切换主、侧输入焦点。
39
39
 
40
- 当前主线支持 DSH 0.2.1-rc.2(当前)、0.2.0-rc.2(过渡)及 0.2.1-rc.3(已准入预览),无需安装 `dsh-better-sidebar`。公开安装范围以对应 Release 为准;旧宿主固定最后兼容的 `dsh-sidenote@0.6.5`,具体命令见[兼容政策](docs/compatibility.md)。
40
+ 自 dsh-sidenote **0.8.0** 起,主线维护 DSH **0.2.1 系列(rc.2 起)**,允许同系列后续 RC 及正式版安装,无需 `dsh-better-sidebar`。已验证版本为 0.2.1-rc.2/rc.3/rc.4/rc.5;未来 RC 允许安装不等于已经验证,历史包声明不变。DSH 0.2.0-rc.2 固定 `dsh-sidenote@0.7.6`,更早宿主固定各自最后兼容包,详见[兼容政策](docs/compatibility.md)。
41
41
 
42
42
  ## 一个任务,容得下更多思路
43
43
 
@@ -82,7 +82,7 @@ dsh plugin --profile web add dsh-sidenote
82
82
 
83
83
  ## 兼容与帮助
84
84
 
85
- 维护窗口按 **当前常规版本+过渡版本+至多一个已准入预览版** 滚动,侧聊共用原生 Conversation。新 next 不挤掉常规版本;新常规版本验收并发布后才滚动过渡位置。`package.json` 的 `dshSupport` 精确清单生成 CI 矩阵,固定汇总检查要求全部通过。窗口外保留最后兼容插件,不回补每个新功能或回测所有旧宿主。详见[兼容与维护政策](docs/compatibility.md);已发布版本请查看对应 Release。
85
+ 维护窗口按 **当前基础版本系列** 滚动,侧聊共用原生 Conversation。同系列 RC 持续覆盖;新系列完成验收并随插件发布后,再停止维护原系列。日常 PR 检查当前系列的最低版和最新已验证版,每日探测新增宿主、每周回归全部窗口内版本。窗口外保留最后兼容插件。详见[兼容与维护政策](docs/compatibility.md);公开安装以对应 Release 为准。
86
86
 
87
87
  遇到问题时,可在 **设置 → 通用设置 → dsh-sidenote 诊断模式** 开启诊断,查看并手动导出接入状态。[报告问题或提出建议](https://github.com/g-yixuan/dsh-sidenote/issues/new/choose)。
88
88
 
@@ -1,8 +1,8 @@
1
1
  # README and storefront media / 首页与商店素材
2
2
 
3
- Captured on **2026-10-25** with the published **dsh-sidenote 0.7.2** package (source: `0d55fcd`) and **DSH 0.2.1-rc.2**, using native Conversation and the native right sidebar. The mounted plugin's version and bundle digest, plus the host's active conversation, composer, and sidebar packages, were checked before capture.
3
+ Chinese media was captured on **2026-10-25** with the published **dsh-sidenote 0.7.2** package (source: `0d55fcd`). English media was captured on **2026-10-29** with published **dsh-sidenote 0.7.6** (source: `3f0de44`), with both the interface and conversation in English. Both use **DSH 0.2.1-rc.2**, native Conversation, and the native right sidebar. The mounted plugin's version and bundle digest, plus the host's active conversation, composer, and sidebar packages, were checked before capture.
4
4
 
5
- 素材于 **2026-10-25** 重新录制,使用已发布的 **dsh-sidenote 0.7.2**(源码 `0d55fcd`)与 **DSH 0.2.1-rc.2** 原生对话和右侧栏。录制前核对了实际挂载的插件版本与构建摘要,以及宿主正在运行的对话、输入框和侧栏组件版本。
5
+ 中文素材于 **2026-10-25** 录制,使用已发布的 **dsh-sidenote 0.7.2**(源码 `0d55fcd`)。英文素材于 **2026-10-29** 录制,使用已发布的 **dsh-sidenote 0.7.6**(源码 `3f0de44`),界面和对话内容均为英文。两套素材均使用 **DSH 0.2.1-rc.2** 原生对话和右侧栏。录制前核对了实际挂载的插件版本与构建摘要,以及宿主正在运行的对话、输入框和侧栏组件版本。
6
6
 
7
7
  ## Real model responses / 真实模型回答
8
8
 
@@ -16,18 +16,19 @@ The recording starts with the real main-chat answer already visible. It then sho
16
16
 
17
17
  ## Assets / 文件
18
18
 
19
- - `workflow.jpg`: a follow-up capture showing the selection toolbar's two destinations, a real side-chat answer, pending annotation and handback chips, and context bubbles in sent messages / 补拍主图:同屏展示划选菜单的两种去向、真实侧聊回答、待发送的批注与回流标签,以及已发送消息中的上下文气泡。
20
- - `context-preview.jpg`: a compact preview with the selected passage, editable note, and horizontal context chips / 紧凑悬浮层中的原文、可编辑注解与横向标签。
21
- - `selection.jpg`: selected text and the two annotation destinations, taken from the recording / 从录屏提取的划选画面与两种批注去向。
22
- - `sidechat.jpg`: a real side-chat answer and the hovered reply-toolbar handback icon / 真实侧聊回答与悬停中的回流图标。
23
- - `demo.gif`, `demo.mp4`: the same approximately **43-second** continuous workflow / 同一段约 **43 秒**的连续操作。
19
+ - `workflow.jpg` / `workflow-en.jpg`: Chinese / English follow-up captures showing the selection toolbar's two destinations, a real side-chat answer, pending annotation and handback chips, and context bubbles in sent messages / 中文与英文补拍主图:同屏展示划选菜单的两种去向、真实侧聊回答、待发送的批注与回流标签,以及已发送消息中的上下文气泡。
20
+ - `context-preview.jpg` / `context-preview-en.jpg`: Chinese / English compact previews with the selected passage, editable note, and horizontal context chips / 中文与英文的紧凑悬浮层,展示原文、可编辑注解与横向标签。
21
+ - `selection.jpg` / `selection-en.jpg`: Chinese / English selected text and the two annotation destinations, captured during each recording / 分别在中文与英文录制中采集的划选画面与两种批注去向。
22
+ - `sidechat.jpg` / `sidechat-en.jpg`: Chinese / English real side-chat answers and the hovered reply-toolbar handback icon / 中文与英文的真实侧聊回答与悬停中的回流图标。
23
+ - `demo.gif`, `demo.mp4`: the same approximately **43-second** continuous Chinese workflow / 同一段约 **43 秒**的中文连续操作。
24
+ - `demo-en.gif`, `demo-en.mp4`: the same approximately **38-second** continuous English workflow / 同一段约 **38 秒**的英文连续操作。
24
25
  - `hero.svg`, `hero-en.svg` and their `-compact.svg` variants: vector brand covers; regenerate with `python3 scripts/build-brand-assets.py` / 品牌矢量封面,可用该命令重新生成。
25
26
 
26
27
  ## Capture and distribution / 录制与展示
27
28
 
28
- The real interface uses the host's **light theme** and **18 px** conversation font. The hero uses a **1440 × 780** viewport and is exported at 2160 × 1170 so the selection menu and both composers fit together. Other stills use a **1440 × 900** viewport, captured at 2× pixel density and exported at 2160 × 1350; the selection still is a native 1440 × 900 recording frame. MP4 is 1440 × 900 at 30 fps; GIF is 1120 × 700 at 12 fps. Encoding preserves the browser's frame timing without speeding up responses. A small pointer overlay follows actual mouse events in the recording; product controls and model replies are not redrawn or substituted.
29
+ The real interface uses the host's **light theme** and **18 px** conversation font. The Chinese hero uses a **1440 × 780** viewport and is exported at 2160 × 1170; the English hero uses **1440 × 840**, exported at 2160 × 1260, so the selection menu, sent-message labels, and both composers fit together. Other stills use a **1440 × 900** viewport, captured at 2× pixel density and exported at 2160 × 1350; the Chinese selection still is a native 1440 × 900 recording frame. MP4 is 1440 × 900 at 30 fps; GIF is 1120 × 700 at 12 fps. Encoding preserves the browser's frame timing without speeding up responses. A small pointer overlay follows actual mouse events in the recording; product controls and model replies are not redrawn or substituted.
29
30
 
30
- 真实界面使用宿主的**浅色主题**和 **18 px** 会话字号。主图以 **1440 × 780** 视口补拍,导出为 2160 × 1170,让划选菜单和两侧输入框完整同屏。其余静态截图使用 **1440 × 900** 视口,按 2 倍像素密度采集后导出为 2160 × 1350;划选截图直接取自 1440 × 900 的录屏帧。MP4 为 1440 × 900 / 30 fps,GIF 为 1120 × 700 / 12 fps,均按浏览器帧时间编码,没有加速模型响应。录屏中仅添加跟随真实鼠标事件的小光标辅助层,没有重绘产品控件或替换模型回答。
31
+ 真实界面使用宿主的**浅色主题**和 **18 px** 会话字号。中文主图以 **1440 × 780** 视口补拍,导出为 2160 × 1170;英文主图使用 **1440 × 840** 视口,导出为 2160 × 1260,让划选菜单、已发送消息中的标签和两侧输入框完整同屏。其余静态截图使用 **1440 × 900** 视口,按 2 倍像素密度采集后导出为 2160 × 1350;中文划选截图直接取自 1440 × 900 的录屏帧。MP4 为 1440 × 900 / 30 fps,GIF 为 1120 × 700 / 12 fps,均按浏览器帧时间编码,没有加速模型响应。录屏中仅添加跟随真实鼠标事件的小光标辅助层,没有重绘产品控件或替换模型回答。
31
32
 
32
33
  [`screenshots.json`](../../screenshots.json) declares the storefront gallery. The [catalog's screenshot convention](https://github.com/awesome-dsh-plugin/awesome-dsh-plugin/blob/main/contributing.md#screenshots--截图optional-recommended--可选推荐) resolves those paths from this repository, and the next catalog build refreshes the gallery. Existing screenshot paths remain available for cached catalogs.
33
34
 
package/lib/client.js CHANGED
@@ -740,7 +740,7 @@ window.__ModuleLoader__.load({
740
740
  let dockRegistered = false;
741
741
  let report = {
742
742
  versions: {
743
- sidenote: "0.7.6",
743
+ sidenote: "0.8.0",
744
744
  dsh: "unknown",
745
745
  betterSidebar: null
746
746
  },
@@ -1409,15 +1409,15 @@ window.__ModuleLoader__.load({
1409
1409
  document.head.appendChild(tag);
1410
1410
  }
1411
1411
  var diagnostics_module_css_default = {
1412
- "actions": "tGe0LW_actions",
1413
- "settingTitle": "tGe0LW_settingTitle",
1414
- "trigger": "tGe0LW_trigger",
1415
- "versions": "tGe0LW_versions",
1416
1412
  "panel": "tGe0LW_panel",
1413
+ "header": "tGe0LW_header",
1414
+ "list": "tGe0LW_list",
1417
1415
  "description": "tGe0LW_description",
1416
+ "trigger": "tGe0LW_trigger",
1418
1417
  "setting": "tGe0LW_setting",
1419
- "header": "tGe0LW_header",
1420
- "list": "tGe0LW_list"
1418
+ "actions": "tGe0LW_actions",
1419
+ "settingTitle": "tGe0LW_settingTitle",
1420
+ "versions": "tGe0LW_versions"
1421
1421
  };
1422
1422
  //#endregion
1423
1423
  //#region src/client/diagnostics/index.tsx
@@ -2213,6 +2213,19 @@ window.__ModuleLoader__.load({
2213
2213
  };
2214
2214
  }
2215
2215
  //#endregion
2216
+ //#region src/client/host/reasoning.ts
2217
+ /** Match rc.5's display preparation without changing persisted model output.
2218
+ * Older hosts expose only the raw block; the context reader uses this same
2219
+ * preparation on every supported host, including incomplete streaming tags. */
2220
+ function reasoningDisplayText(raw) {
2221
+ if (!raw.startsWith("<")) return raw;
2222
+ const opening = "<signature>";
2223
+ if (opening.startsWith(raw)) return "";
2224
+ if (!raw.startsWith(opening)) return raw;
2225
+ const end = raw.indexOf("</signature>", 11);
2226
+ return end < 0 ? "" : raw.slice(end + 12).replace(/^(?:\r?\n)*/, "");
2227
+ }
2228
+ //#endregion
2216
2229
  //#region src/snapshotProtocol.ts
2217
2230
  /** Durable first-send marker, shared by the host projection and client reader. */
2218
2231
  const decodeSnapshotXml = (value) => value.replace(/&lt;/g, "<").replace(/&gt;/g, ">").replace(/&quot;/g, "\"").replace(/&amp;/g, "&");
@@ -2350,33 +2363,33 @@ window.__ModuleLoader__.load({
2350
2363
  document.head.appendChild(tag);
2351
2364
  }
2352
2365
  var annotations_module_css_default = {
2353
- "contextSource": "SVnebq_contextSource",
2354
- "contextFooter": "SVnebq_contextFooter",
2355
- "contextNumber": "SVnebq_contextNumber",
2356
- "contextLabel": "SVnebq_contextLabel",
2357
2366
  "chip": "SVnebq_chip",
2358
- "contextItem": "SVnebq_contextItem",
2359
- "contextText": "SVnebq_contextText",
2360
- "sentChips": "SVnebq_sentChips",
2367
+ "chipDismissShade": "SVnebq_chipDismissShade",
2368
+ "chipClearAll": "SVnebq_chipClearAll",
2361
2369
  "sentChipGroup": "SVnebq_sentChipGroup",
2362
- "storageNotice": "SVnebq_storageNotice",
2363
- "sentChevron": "SVnebq_sentChevron",
2364
- "sentChevronOpen": "SVnebq_sentChevronOpen",
2365
- "chipDismiss": "SVnebq_chipDismiss",
2366
- "sentChip": "SVnebq_sentChip",
2367
- "sentPreview": "SVnebq_sentPreview",
2368
- "userContextHost": "SVnebq_userContextHost",
2369
2370
  "contextAction": "SVnebq_contextAction",
2370
- "chipClearAll": "SVnebq_chipClearAll",
2371
- "chipMain": "SVnebq_chipMain",
2372
- "chipDismissShade": "SVnebq_chipDismissShade",
2371
+ "sentChip": "SVnebq_sentChip",
2372
+ "sentChevron": "SVnebq_sentChevron",
2373
2373
  "contextEditor": "SVnebq_contextEditor",
2374
+ "contextLabel": "SVnebq_contextLabel",
2375
+ "contextFooter": "SVnebq_contextFooter",
2374
2376
  "chipWrap": "SVnebq_chipWrap",
2375
- "contextAppear": "SVnebq_contextAppear",
2376
- "contextPanel": "SVnebq_contextPanel",
2377
- "contextList": "SVnebq_contextList",
2377
+ "userContextHost": "SVnebq_userContextHost",
2378
+ "sentPreview": "SVnebq_sentPreview",
2379
+ "contextContent": "SVnebq_contextContent",
2380
+ "contextText": "SVnebq_contextText",
2381
+ "contextNumber": "SVnebq_contextNumber",
2378
2382
  "contextActions": "SVnebq_contextActions",
2379
- "contextContent": "SVnebq_contextContent"
2383
+ "storageNotice": "SVnebq_storageNotice",
2384
+ "contextItem": "SVnebq_contextItem",
2385
+ "contextList": "SVnebq_contextList",
2386
+ "sentChips": "SVnebq_sentChips",
2387
+ "chipMain": "SVnebq_chipMain",
2388
+ "sentChevronOpen": "SVnebq_sentChevronOpen",
2389
+ "contextPanel": "SVnebq_contextPanel",
2390
+ "contextSource": "SVnebq_contextSource",
2391
+ "contextAppear": "SVnebq_contextAppear",
2392
+ "chipDismiss": "SVnebq_chipDismiss"
2380
2393
  };
2381
2394
  //#endregion
2382
2395
  //#region src/client/annotations/NativeUserContext.tsx
@@ -2850,39 +2863,39 @@ window.__ModuleLoader__.load({
2850
2863
  document.head.appendChild(tag);
2851
2864
  }
2852
2865
  var sidechat_module_css_default = {
2853
- "stateDetail": "_5KEEsG_stateDetail",
2854
- "contextBubble": "_5KEEsG_contextBubble",
2855
- "progressContent": "_5KEEsG_progressContent",
2856
- "stateScreen": "_5KEEsG_stateScreen",
2866
+ "contextChevronOpen": "_5KEEsG_contextChevronOpen",
2857
2867
  "emptyIcon": "_5KEEsG_emptyIcon",
2858
- "contextChevron": "_5KEEsG_contextChevron",
2859
- "errorRow": "_5KEEsG_errorRow",
2860
- "contextImage": "_5KEEsG_contextImage",
2861
- "nativeToolbarActions": "_5KEEsG_nativeToolbarActions",
2862
- "emptyText": "_5KEEsG_emptyText",
2863
- "nativeConversation": "_5KEEsG_nativeConversation",
2864
2868
  "progressEntry": "_5KEEsG_progressEntry",
2865
- "nativeHost": "_5KEEsG_nativeHost",
2866
- "root": "_5KEEsG_root",
2869
+ "visibilitySetting": "_5KEEsG_visibilitySetting",
2870
+ "progressProcess": "_5KEEsG_progressProcess",
2871
+ "progressPreview": "_5KEEsG_progressPreview",
2867
2872
  "historyToggle": "_5KEEsG_historyToggle",
2868
- "headerSide": "_5KEEsG_headerSide",
2869
- "reflowAction": "_5KEEsG_reflowAction",
2873
+ "progressContent": "_5KEEsG_progressContent",
2874
+ "nativeConversation": "_5KEEsG_nativeConversation",
2875
+ "contextBubble": "_5KEEsG_contextBubble",
2870
2876
  "nativeToolbar": "_5KEEsG_nativeToolbar",
2871
- "contextChevronOpen": "_5KEEsG_contextChevronOpen",
2872
- "progress": "_5KEEsG_progress",
2873
- "mainContext": "_5KEEsG_mainContext",
2874
- "nativeAction": "_5KEEsG_nativeAction",
2875
- "visibilitySetting": "_5KEEsG_visibilitySetting",
2876
- "contextColumn": "_5KEEsG_contextColumn",
2877
2877
  "emptyTitle": "_5KEEsG_emptyTitle",
2878
- "progressProcess": "_5KEEsG_progressProcess",
2879
- "progressDetail": "_5KEEsG_progressDetail",
2878
+ "nativeHost": "_5KEEsG_nativeHost",
2879
+ "stateDetail": "_5KEEsG_stateDetail",
2880
+ "headerSide": "_5KEEsG_headerSide",
2881
+ "contextChevron": "_5KEEsG_contextChevron",
2880
2882
  "contextHint": "_5KEEsG_contextHint",
2881
- "chatView": "_5KEEsG_chatView",
2882
- "progressPreview": "_5KEEsG_progressPreview",
2883
2883
  "contextUserRow": "_5KEEsG_contextUserRow",
2884
+ "progress": "_5KEEsG_progress",
2885
+ "errorRow": "_5KEEsG_errorRow",
2886
+ "nativeToolbarActions": "_5KEEsG_nativeToolbarActions",
2887
+ "reflowAction": "_5KEEsG_reflowAction",
2888
+ "nativeAction": "_5KEEsG_nativeAction",
2889
+ "root": "_5KEEsG_root",
2884
2890
  "progressLatest": "_5KEEsG_progressLatest",
2885
- "progressEntries": "_5KEEsG_progressEntries"
2891
+ "emptyText": "_5KEEsG_emptyText",
2892
+ "progressEntries": "_5KEEsG_progressEntries",
2893
+ "progressDetail": "_5KEEsG_progressDetail",
2894
+ "mainContext": "_5KEEsG_mainContext",
2895
+ "chatView": "_5KEEsG_chatView",
2896
+ "contextColumn": "_5KEEsG_contextColumn",
2897
+ "contextImage": "_5KEEsG_contextImage",
2898
+ "stateScreen": "_5KEEsG_stateScreen"
2886
2899
  };
2887
2900
  //#endregion
2888
2901
  //#region src/client/sidechat/ContextProgress.tsx
@@ -2924,6 +2937,8 @@ window.__ModuleLoader__.load({
2924
2937
  },
2925
2938
  footnotes: t("contextFootnotes")
2926
2939
  }), [t("contextCopy")]);
2940
+ const text = entry.kind === "thinking" ? reasoningDisplayText(entry.text) : entry.text;
2941
+ if (entry.kind === "thinking" && text !== entry.text && text.trim() === "") return null;
2927
2942
  const unfinished = entry.unfinished || entry.kind === "streaming";
2928
2943
  const status = unfinished ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
2929
2944
  className: sidechat_module_css_default.contextHint,
@@ -2977,17 +2992,17 @@ window.__ModuleLoader__.load({
2977
2992
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: entry.kind === "tool" ? entry.toolName : t("contextthinking") }),
2978
2993
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
2979
2994
  className: sidechat_module_css_default.progressPreview,
2980
- children: entry.text
2995
+ children: text
2981
2996
  }),
2982
2997
  status,
2983
2998
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconChevronDownOutline14, { size: 12 })
2984
2999
  ] }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
2985
3000
  className: sidechat_module_css_default.progressDetail,
2986
3001
  children: entry.kind === "thinking" ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.MarkdownText, {
2987
- text: entry.text,
3002
+ text,
2988
3003
  streaming: live && unfinished,
2989
3004
  labels
2990
- }) : entry.text
3005
+ }) : text
2991
3006
  })]
2992
3007
  });
2993
3008
  });
@@ -6597,34 +6612,34 @@ ${body}
6597
6612
  document.head.appendChild(tag);
6598
6613
  }
6599
6614
  var annotate_module_css_default = {
6600
- "highlight": "_SVViG_highlight",
6601
- "editorSpacer": "_SVViG_editorSpacer",
6602
- "sentCardNote": "_SVViG_sentCardNote",
6603
6615
  "toolbarButton": "_SVViG_toolbarButton",
6604
- "cancelButton": "_SVViG_cancelButton",
6605
- "deleteButton": "_SVViG_deleteButton",
6606
6616
  "badge": "_SVViG_badge",
6617
+ "editorAskRow": "_SVViG_editorAskRow",
6618
+ "editorNew": "_SVViG_editorNew",
6619
+ "toolbar": "_SVViG_toolbar",
6620
+ "editorTarget": "_SVViG_editorTarget",
6621
+ "hint": "_SVViG_hint",
6622
+ "sentCardQuote": "_SVViG_sentCardQuote",
6607
6623
  "confirmButton": "_SVViG_confirmButton",
6608
- "editorEdit": "_SVViG_editorEdit",
6609
6624
  "saveButton": "_SVViG_saveButton",
6610
- "editorError": "_SVViG_editorError",
6611
- "sentCardQuote": "_SVViG_sentCardQuote",
6612
- "hint": "_SVViG_hint",
6625
+ "sentChip": "_SVViG_sentChip",
6613
6626
  "dshSidenoteHintIn": "_SVViG_dshSidenoteHintIn",
6614
- "badgeSent": "_SVViG_badgeSent",
6627
+ "hintClose": "_SVViG_hintClose",
6628
+ "editorEdit": "_SVViG_editorEdit",
6615
6629
  "editorFooter": "_SVViG_editorFooter",
6616
- "editorTextarea": "_SVViG_editorTextarea",
6617
6630
  "toolbarBelow": "_SVViG_toolbarBelow",
6618
- "hintClose": "_SVViG_hintClose",
6631
+ "highlight": "_SVViG_highlight",
6632
+ "editorTextarea": "_SVViG_editorTextarea",
6619
6633
  "sentChipRow": "_SVViG_sentChipRow",
6620
- "toolbar": "_SVViG_toolbar",
6621
- "editorNew": "_SVViG_editorNew",
6622
- "sentCardTitle": "_SVViG_sentCardTitle",
6623
- "editorAskRow": "_SVViG_editorAskRow",
6624
- "editorTarget": "_SVViG_editorTarget",
6625
- "sentChip": "_SVViG_sentChip",
6634
+ "cancelButton": "_SVViG_cancelButton",
6626
6635
  "editorAsk": "_SVViG_editorAsk",
6627
- "editorInput": "_SVViG_editorInput"
6636
+ "deleteButton": "_SVViG_deleteButton",
6637
+ "editorInput": "_SVViG_editorInput",
6638
+ "editorError": "_SVViG_editorError",
6639
+ "badgeSent": "_SVViG_badgeSent",
6640
+ "editorSpacer": "_SVViG_editorSpacer",
6641
+ "sentCardTitle": "_SVViG_sentCardTitle",
6642
+ "sentCardNote": "_SVViG_sentCardNote"
6628
6643
  };
6629
6644
  //#endregion
6630
6645
  //#region src/client/annotate/hint.tsx
@@ -0,0 +1,4 @@
1
+ /** Match rc.5's display preparation without changing persisted model output.
2
+ * Older hosts expose only the raw block; the context reader uses this same
3
+ * preparation on every supported host, including incomplete streaming tags. */
4
+ export declare function reasoningDisplayText(raw: string): string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-sidenote",
3
- "version": "0.7.6",
3
+ "version": "0.8.0",
4
4
  "description": "Follow the tangent. Keep the thread. Annotate, explore on the side, and bring answers back to DeepSeek Harness. / 思路可以分岔,主线始终向前。划选注释、侧边追问,再把结论带回正在推进的任务。",
5
5
  "icon": "docs/assets/logo.svg",
6
6
  "type": "module",
@@ -21,7 +21,7 @@
21
21
  },
22
22
  "engines": {
23
23
  "node": ">=20",
24
- "dsh": "=0.2.0-rc.2 || =0.2.1-rc.2 || =0.2.1-rc.3"
24
+ "dsh": ">=0.2.1-rc.2 <0.2.2-0"
25
25
  },
26
26
  "dsh": {
27
27
  "bundle": {
@@ -37,13 +37,17 @@
37
37
  "platform": "web"
38
38
  },
39
39
  "engines": {
40
- "dsh": "=0.2.0-rc.2 || =0.2.1-rc.2 || =0.2.1-rc.3"
40
+ "dsh": ">=0.2.1-rc.2 <0.2.2-0"
41
41
  }
42
42
  },
43
43
  "dshSupport": {
44
- "current": "0.2.1-rc.2",
45
- "previous": "0.2.0-rc.2",
46
- "preview": "0.2.1-rc.3"
44
+ "minimum": "0.2.1-rc.2",
45
+ "verified": [
46
+ "0.2.1-rc.2",
47
+ "0.2.1-rc.3",
48
+ "0.2.1-rc.4",
49
+ "0.2.1-rc.5"
50
+ ]
47
51
  },
48
52
  "files": [
49
53
  "lib/index.js",
@@ -56,7 +60,7 @@
56
60
  "LICENSE"
57
61
  ],
58
62
  "peerDependencies": {
59
- "@deepseek-ai/dsh-client-ui-primitives": "=0.2.0-rc.2 || =0.2.1-rc.2 || =0.2.1-rc.3",
63
+ "@deepseek-ai/dsh-client-ui-primitives": ">=0.2.1-rc.2 <0.2.2-0",
60
64
  "cordis": "^4.0.2",
61
65
  "react": "^18.2.0",
62
66
  "react-dom": "^18.2.0"
@@ -98,6 +102,7 @@
98
102
  "micromark-util-types": "^2.0.2",
99
103
  "react": "^18.2.0",
100
104
  "react-dom": "^18.2.0",
105
+ "semver": "^7.8.5",
101
106
  "shiki": "^4.4.3",
102
107
  "tsdown": "^0.22.2",
103
108
  "typescript": "^5.6.0",
@@ -0,0 +1,12 @@
1
+ /** Match rc.5's display preparation without changing persisted model output.
2
+ * Older hosts expose only the raw block; the context reader uses this same
3
+ * preparation on every supported host, including incomplete streaming tags. */
4
+ export function reasoningDisplayText(raw: string): string {
5
+ if (!raw.startsWith('<')) return raw
6
+ const opening = '<signature>'
7
+ if (opening.startsWith(raw)) return ''
8
+ if (!raw.startsWith(opening)) return raw
9
+ const closing = '</signature>'
10
+ const end = raw.indexOf(closing, opening.length)
11
+ return end < 0 ? '' : raw.slice(end + closing.length).replace(/^(?:\r?\n)*/, '')
12
+ }
@@ -3,6 +3,7 @@ import { MarkdownText } from '@deepseek-ai/dsh-client-ui-primitives'
3
3
  import { IconChevronDownOutline14, IconCodeOutline16, IconThinkOutline16 } from '../host/icons.ts'
4
4
  import { t } from '../locales.ts'
5
5
  import { conversationViewOf } from '../host/dom.ts'
6
+ import { reasoningDisplayText } from '../host/reasoning.ts'
6
7
  import { SentContext, sentContextRule } from '../annotations/NativeUserContext.tsx'
7
8
  import type { SnapshotEntry } from './snapshot.ts'
8
9
  import type { ContextEntry } from './context.ts'
@@ -24,6 +25,8 @@ const ProgressEntry = memo(function ProgressEntry({ entry, live, loadImage }: {
24
25
  const protocol = entry.kind === 'request' ? sentContextRule.match(entry.text, 0) : undefined
25
26
  const process = entry.kind === 'thinking' || entry.kind === 'tool'
26
27
  const labels = useMemo(() => ({ code: { copyLabel: t('contextCopy'), copiedLabel: t('contextCopied') }, footnotes: t('contextFootnotes') }), [t('contextCopy')])
28
+ const text = entry.kind === 'thinking' ? reasoningDisplayText(entry.text) : entry.text
29
+ if (entry.kind === 'thinking' && text !== entry.text && text.trim() === '') return null
27
30
  const unfinished = entry.unfinished || entry.kind === 'streaming'
28
31
  const status = unfinished ? <span className={css.contextHint}>{t(live ? 'contextstreaming' : 'contextUnfinished')}</span> : null
29
32
  if (entry.kind === 'request') return <div className={css.contextUserRow} data-context-kind="request" data-context-key={entry.key}>
@@ -40,10 +43,10 @@ const ProgressEntry = memo(function ProgressEntry({ entry, live, loadImage }: {
40
43
  </div>
41
44
  return <details className={css.progressProcess} data-context-kind={entry.kind} data-context-key={entry.key}>
42
45
  <summary>{entry.kind === 'tool' ? <IconCodeOutline16 size={14} /> : <IconThinkOutline16 size={14} />}
43
- <span>{entry.kind === 'tool' ? entry.toolName : t('contextthinking')}</span><span className={css.progressPreview}>{entry.text}</span>{status}
46
+ <span>{entry.kind === 'tool' ? entry.toolName : t('contextthinking')}</span><span className={css.progressPreview}>{text}</span>{status}
44
47
  <IconChevronDownOutline14 size={12} />
45
48
  </summary>
46
- <div className={css.progressDetail}>{entry.kind === 'thinking' ? <MarkdownText text={entry.text} streaming={live && unfinished} labels={labels} /> : entry.text}</div>
49
+ <div className={css.progressDetail}>{entry.kind === 'thinking' ? <MarkdownText text={text} streaming={live && unfinished} labels={labels} /> : text}</div>
47
50
  </details>
48
51
  })
49
52