@jcy2387/dsh-conversation-ui 0.1.7-rc.1 → 0.1.7-rc.3

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.en.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # @jcy2387/dsh-conversation-ui
2
2
 
3
- This release targets Harness `0.1.7-rc.1`. The deliverables card uses an independent list entry alongside native file previews, change review, and other plugins’ Turn-tail contributions. Settings appear on the Suite or standalone bundle page. Harness `0.1.5` users should keep plugin version `0.1.5-rc.2`.
3
+ This release targets Harness `0.1.7-rc.2`. The deliverables card uses an independent list entry alongside native file previews, change review, and other plugins’ Turn-tail contributions. Settings appear on the Suite or standalone bundle page. Harness `0.1.5` users should keep plugin version `0.1.5-rc.2`.
4
4
 
5
5
  [![CI](https://github.com/DamonBao/dsh-codex-suite/actions/workflows/ci.yml/badge.svg)](https://github.com/DamonBao/dsh-codex-suite/actions/workflows/ci.yml)
6
6
  [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)
@@ -53,7 +53,7 @@ A Codex-style conversation UI enhancement plugin for DeepSeek Harness (DSH): the
53
53
  Published package:
54
54
 
55
55
  ```sh
56
- dsh plugin --profile web add @jcy2387/dsh-conversation-ui@0.1.7-rc.1
56
+ dsh plugin --profile web add @jcy2387/dsh-conversation-ui@0.1.7-rc.3
57
57
  dsh web
58
58
  ```
59
59
 
@@ -123,4 +123,4 @@ Tests run on vitest + Testing Library, covering stream smoothing, native scroll
123
123
 
124
124
  [MIT](LICENSE) © jcy2387
125
125
 
126
- This release targets DSH `0.1.7-rc.1`. It imports `conversation-ui.thinkAutoExpand` from `settings.yaml` or `settings.yaml.imported` into the active profile’s `cordis.patch.yml`, recording a marker after success and retaining the source after failure. The plugin’s compatibility import fills only missing values. Exported `locale/en.json` and `locale/zh.json` localize the name and description in DSH.
126
+ This release targets DSH `0.1.7-rc.2`. It imports `conversation-ui.thinkAutoExpand` from `settings.yaml` or `settings.yaml.imported` into the active profile’s `cordis.patch.yml`, recording a marker after success and retaining the source after failure. The plugin’s compatibility import fills only missing values. Exported `locale/en.json` and `locale/zh.json` localize the name and description in DSH.
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # @jcy2387/dsh-conversation-ui
2
2
 
3
- 本版本面向 Harness `0.1.7-rc.1`。产物卡片使用新版列表插槽中的独立条目,与原生文件预览、变更审阅及其他插件的回合尾部内容共存;插件设置位于 Suite 或独立插件的配置页。`0.1.5` 用户应继续使用插件 `0.1.5-rc.2`。
3
+ 本版本面向 Harness `0.1.7-rc.2`。产物卡片使用新版列表插槽中的独立条目,与原生文件预览、变更审阅及其他插件的回合尾部内容共存;插件设置位于 Suite 或独立插件的配置页。`0.1.5` 用户应继续使用插件 `0.1.5-rc.2`。
4
4
 
5
5
  [![CI](https://github.com/DamonBao/dsh-codex-suite/actions/workflows/ci.yml/badge.svg)](https://github.com/DamonBao/dsh-codex-suite/actions/workflows/ci.yml)
6
6
  [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)
@@ -53,7 +53,7 @@ DeepSeek Harness(DSH)的 Codex 风格对话界面增强插件:把 Web 对
53
53
  已发布版本:
54
54
 
55
55
  ```sh
56
- dsh plugin --profile web add @jcy2387/dsh-conversation-ui@0.1.7-rc.1
56
+ dsh plugin --profile web add @jcy2387/dsh-conversation-ui@0.1.7-rc.3
57
57
  dsh web
58
58
  ```
59
59
 
@@ -123,4 +123,4 @@ pnpm --filter @jcy2387/dsh-conversation-ui build
123
123
 
124
124
  [MIT](LICENSE) © jcy2387
125
125
 
126
- 本版面向 DSH `0.1.7-rc.1`。旧 `conversation-ui.thinkAutoExpand` 从 `settings.yaml` 或 `settings.yaml.imported` 导入当前 profile 的 `cordis.patch.yml`,成功后记录迁移标记;失败保留源文件供重试。插件兼容导入只补充缺失的值。名称和描述通过导出的 `locale/en.json`、`locale/zh.json` 跟随 DSH 界面语言。
126
+ 本版面向 DSH `0.1.7-rc.2`。旧 `conversation-ui.thinkAutoExpand` 从 `settings.yaml` 或 `settings.yaml.imported` 导入当前 profile 的 `cordis.patch.yml`,成功后记录迁移标记;失败保留源文件供重试。插件兼容导入只补充缺失的值。名称和描述通过导出的 `locale/en.json`、`locale/zh.json` 跟随 DSH 界面语言。
package/lib/client.js CHANGED
@@ -438,50 +438,50 @@ window.__ModuleLoader__.load({
438
438
  tag.textContent = css$2;
439
439
  }
440
440
  var TypewriterAssistantNodeView_module_css_default = {
441
- "disclosureRow": "Sp5wgW_disclosureRow",
442
- "markdownFlow": "Sp5wgW_markdownFlow",
443
- "dsh-conversation-ui-think-sweep": "Sp5wgW_dsh-conversation-ui-think-sweep",
444
- "toolGroupAnchor": "Sp5wgW_toolGroupAnchor",
445
- "toolGroupHeaderChevron": "Sp5wgW_toolGroupHeaderChevron",
441
+ "root": "Sp5wgW_root",
442
+ "toolGroupHeaderLabel": "Sp5wgW_toolGroupHeaderLabel",
446
443
  "thinkRow": "Sp5wgW_thinkRow",
447
444
  "visuallyHidden": "Sp5wgW_visuallyHidden",
448
- "dsh-codex-stream-enter": "Sp5wgW_dsh-codex-stream-enter",
449
- "turnWaiting": "Sp5wgW_turnWaiting",
445
+ "follow": "Sp5wgW_follow",
446
+ "toolGroupHeaderIcon": "Sp5wgW_toolGroupHeaderIcon",
450
447
  "toolGroupHeaderGlyph": "Sp5wgW_toolGroupHeaderGlyph",
451
- "root": "Sp5wgW_root",
452
- "streamSemanticIcon": "Sp5wgW_streamSemanticIcon",
453
448
  "thinkLeading": "Sp5wgW_thinkLeading",
454
- "toolGroupHeaderLabel": "Sp5wgW_toolGroupHeaderLabel",
455
- "eventRow": "Sp5wgW_eventRow",
456
- "disclosureRoot": "Sp5wgW_disclosureRoot",
457
449
  "toolSemanticIcon": "Sp5wgW_toolSemanticIcon",
458
- "disclosureLeading": "Sp5wgW_disclosureLeading",
450
+ "thinkSummary": "Sp5wgW_thinkSummary",
451
+ "dsh-codex-stream-enter": "Sp5wgW_dsh-codex-stream-enter",
459
452
  "reasoningDisclosure": "Sp5wgW_reasoningDisclosure",
460
- "dsh-turn-waiting-shimmer": "Sp5wgW_dsh-turn-waiting-shimmer",
461
- "reasoningSummary": "Sp5wgW_reasoningSummary",
462
- "disclosureTitle": "Sp5wgW_disclosureTitle",
463
- "turnPrelude": "Sp5wgW_turnPrelude",
464
- "thinkChevron": "Sp5wgW_thinkChevron",
465
- "disclosureTrailing": "Sp5wgW_disclosureTrailing",
466
- "body": "Sp5wgW_body",
467
- "toolGroupContent": "Sp5wgW_toolGroupContent",
468
453
  "nestedToolSemanticIcon": "Sp5wgW_nestedToolSemanticIcon",
469
- "thinkTitle": "Sp5wgW_thinkTitle",
470
- "thinkSummary": "Sp5wgW_thinkSummary",
471
- "turnFoldRow": "Sp5wgW_turnFoldRow",
472
- "turnFoldButton": "Sp5wgW_turnFoldButton",
454
+ "body": "Sp5wgW_body",
455
+ "turnWaiting": "Sp5wgW_turnWaiting",
473
456
  "toolGroupHeader": "Sp5wgW_toolGroupHeader",
474
- "turnFoldLabel": "Sp5wgW_turnFoldLabel",
475
- "toolGroupHeaderIcon": "Sp5wgW_toolGroupHeaderIcon",
476
- "thinkSeparator": "Sp5wgW_thinkSeparator",
477
- "editStats": "Sp5wgW_editStats",
457
+ "disclosureLeading": "Sp5wgW_disclosureLeading",
458
+ "disclosureContent": "Sp5wgW_disclosureContent",
459
+ "thinkBody": "Sp5wgW_thinkBody",
460
+ "toolGroupContent": "Sp5wgW_toolGroupContent",
461
+ "disclosureRoot": "Sp5wgW_disclosureRoot",
478
462
  "reasoningText": "Sp5wgW_reasoningText",
463
+ "dsh-turn-waiting-shimmer": "Sp5wgW_dsh-turn-waiting-shimmer",
464
+ "turnFoldLabel": "Sp5wgW_turnFoldLabel",
465
+ "markdownFlow": "Sp5wgW_markdownFlow",
466
+ "streamSemanticIcon": "Sp5wgW_streamSemanticIcon",
467
+ "dsh-conversation-ui-think-sweep": "Sp5wgW_dsh-conversation-ui-think-sweep",
479
468
  "toolGroupFrame": "Sp5wgW_toolGroupFrame",
469
+ "reasoningSummary": "Sp5wgW_reasoningSummary",
480
470
  "think": "Sp5wgW_think",
481
- "thinkBody": "Sp5wgW_thinkBody",
482
- "disclosureContent": "Sp5wgW_disclosureContent",
471
+ "turnFoldButton": "Sp5wgW_turnFoldButton",
472
+ "turnPrelude": "Sp5wgW_turnPrelude",
473
+ "eventRow": "Sp5wgW_eventRow",
474
+ "toolGroupHeaderChevron": "Sp5wgW_toolGroupHeaderChevron",
475
+ "turnFoldRow": "Sp5wgW_turnFoldRow",
483
476
  "stopped": "Sp5wgW_stopped",
484
- "follow": "Sp5wgW_follow"
477
+ "toolGroupAnchor": "Sp5wgW_toolGroupAnchor",
478
+ "thinkChevron": "Sp5wgW_thinkChevron",
479
+ "thinkTitle": "Sp5wgW_thinkTitle",
480
+ "disclosureTrailing": "Sp5wgW_disclosureTrailing",
481
+ "disclosureTitle": "Sp5wgW_disclosureTitle",
482
+ "disclosureRow": "Sp5wgW_disclosureRow",
483
+ "editStats": "Sp5wgW_editStats",
484
+ "thinkSeparator": "Sp5wgW_thinkSeparator"
485
485
  };
486
486
  //#endregion
487
487
  //#region src/client/FollowHost.tsx
@@ -835,7 +835,7 @@ window.__ModuleLoader__.load({
835
835
  * commits when the frame rate is degraded. Settled text uses the full Markdown
836
836
  * pipeline.
837
837
  */
838
- const TypewriterAssistantNodeView = (0, react.memo)(function TypewriterAssistantNodeView({ mode = DEFAULT_CONVERSATION_CONFIG.mode, preset = DEFAULT_CONVERSATION_CONFIG.preset, revealCharsPerSec = DEFAULT_CONVERSATION_CONFIG.revealCharsPerSec, scrollSpeedPxPerSec = DEFAULT_CONVERSATION_CONFIG.scrollSpeedPxPerSec, maxScrollSpeedPxPerSec = DEFAULT_CONVERSATION_CONFIG.maxScrollSpeedPxPerSec, thinkAutoExpand = DEFAULT_CONVERSATION_SETTINGS.thinkAutoExpand, node, turnProcess, useTurnData, useSession, openFile, renderMessageImages, fileMentions, t }) {
838
+ const TypewriterAssistantNodeView = (0, react.memo)(function TypewriterAssistantNodeView({ mode = DEFAULT_CONVERSATION_CONFIG.mode, preset = DEFAULT_CONVERSATION_CONFIG.preset, revealCharsPerSec = DEFAULT_CONVERSATION_CONFIG.revealCharsPerSec, scrollSpeedPxPerSec = DEFAULT_CONVERSATION_CONFIG.scrollSpeedPxPerSec, maxScrollSpeedPxPerSec = DEFAULT_CONVERSATION_CONFIG.maxScrollSpeedPxPerSec, thinkAutoExpand = DEFAULT_CONVERSATION_SETTINGS.thinkAutoExpand, node, groupPart, turnProcess, useTurnData, useSession, openFile, renderMessageImages, fileMentions, t }) {
839
839
  const data = node.data;
840
840
  const streaming = data.status === "running";
841
841
  const reducedMotion = usePrefersReducedMotion();
@@ -872,7 +872,8 @@ window.__ModuleLoader__.load({
872
872
  },
873
873
  footnotes: t("markdown.footnotes")
874
874
  }), [t]);
875
- const hasVisible = streaming || data.status === "interrupted" || data.blocks.some((block) => block.kind !== "tool-call");
875
+ const blocks = (0, react.useMemo)(() => groupPart === "reasoning" ? data.blocks.filter((block) => block.kind === "reasoning") : groupPart === "response" ? data.blocks.filter((block) => block.kind !== "reasoning") : data.blocks, [data.blocks, groupPart]);
876
+ const hasVisible = streaming || data.status === "interrupted" || blocks.some((block) => block.kind !== "tool-call");
876
877
  const fallbackControl = ownsFallbackProcessControl(node, turnProcess, fallbackGate);
877
878
  const fallbackMember = isFallbackProcessMember(node, turnProcess, fallbackGate);
878
879
  const reasoningHidden = (turnProcess?.foldable === true || fallbackControl) && turnProcess?.spec.answerStep === data.step && turnProcess.spec.inlineReasoning && !turnProcess.open;
@@ -887,14 +888,24 @@ window.__ModuleLoader__.load({
887
888
  }, [guardRef, seatRef]);
888
889
  if (!hasVisible) return null;
889
890
  const rendered = [];
890
- const last = data.blocks.length - 1;
891
+ const last = blocks.length - 1;
891
892
  let lastFollow = -1;
892
- for (let index = 0; index < data.blocks.length; index += 1) {
893
- const kind = data.blocks[index]?.kind;
893
+ for (let index = 0; index < blocks.length; index += 1) {
894
+ const kind = blocks[index]?.kind;
894
895
  if (kind === "text" || kind === "reasoning") lastFollow = index;
895
896
  }
896
- for (let index = 0; index < data.blocks.length; index += 1) {
897
- const block = data.blocks[index];
897
+ let nodeTailBlock;
898
+ for (let index = data.blocks.length - 1; index >= 0; index -= 1) {
899
+ const kind = data.blocks[index]?.kind;
900
+ if (kind === "text" || kind === "reasoning") {
901
+ nodeTailBlock = data.blocks[index];
902
+ break;
903
+ }
904
+ }
905
+ const followsTail = lastFollow >= 0 && lastFollow === last && blocks[lastFollow] === nodeTailBlock;
906
+ const stoppedHere = data.status === "interrupted" && (groupPart === void 0 || groupPart === "response" || !data.blocks.some((block) => block !== void 0 && block.kind !== "reasoning" && block.kind !== "tool-call"));
907
+ for (let index = 0; index < blocks.length; index += 1) {
908
+ const block = blocks[index];
898
909
  if (block === void 0) continue;
899
910
  switch (block.kind) {
900
911
  case "text":
@@ -933,8 +944,8 @@ window.__ModuleLoader__.load({
933
944
  case "image": {
934
945
  const start = index;
935
946
  const group = [block];
936
- while (index + 1 < data.blocks.length) {
937
- const next = data.blocks[index + 1];
947
+ while (index + 1 < blocks.length) {
948
+ const next = blocks[index + 1];
938
949
  if (next === void 0 || next.kind !== "image") break;
939
950
  group.push(next);
940
951
  index += 1;
@@ -960,13 +971,13 @@ window.__ModuleLoader__.load({
960
971
  "data-stream-phase": phase,
961
972
  "data-streaming": streaming || void 0,
962
973
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(FollowHost, {
963
- active: streaming && !reducedMotion,
974
+ active: streaming && !reducedMotion && followsTail,
964
975
  speedCpsRef: rootSpeedRef,
965
976
  minSpeedPxPerSec: scrollSpeedPxPerSec,
966
977
  maxSpeedPxPerSec: maxScrollSpeedPxPerSec,
967
978
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
968
979
  className: TypewriterAssistantNodeView_module_css_default.body,
969
- children: [rendered, data.status === "interrupted" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
980
+ children: [rendered, stoppedHere && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
970
981
  className: TypewriterAssistantNodeView_module_css_default.stopped,
971
982
  children: t("message.stopped")
972
983
  })]
@@ -2035,30 +2046,30 @@ window.__ModuleLoader__.load({
2035
2046
  tag.textContent = css$1;
2036
2047
  }
2037
2048
  var ConversationCard_module_css_default = {
2038
- "pending": "XFnqVW_pending",
2039
- "save": "XFnqVW_save",
2049
+ "description": "XFnqVW_description",
2040
2050
  "cardOpen": "XFnqVW_cardOpen",
2041
- "version": "XFnqVW_version",
2042
- "body": "XFnqVW_body",
2043
- "update": "XFnqVW_update",
2044
- "header": "XFnqVW_header",
2045
- "card": "XFnqVW_card",
2046
- "hint": "XFnqVW_hint",
2051
+ "metadata": "XFnqVW_metadata",
2052
+ "readOnly": "XFnqVW_readOnly",
2047
2053
  "updateRow": "XFnqVW_updateRow",
2048
- "description": "XFnqVW_description",
2054
+ "failure": "XFnqVW_failure",
2049
2055
  "toggle": "XFnqVW_toggle",
2056
+ "card": "XFnqVW_card",
2050
2057
  "fieldHead": "XFnqVW_fieldHead",
2058
+ "failed": "XFnqVW_failed",
2059
+ "field": "XFnqVW_field",
2060
+ "headText": "XFnqVW_headText",
2061
+ "version": "XFnqVW_version",
2062
+ "footer": "XFnqVW_footer",
2063
+ "pending": "XFnqVW_pending",
2064
+ "hint": "XFnqVW_hint",
2065
+ "update": "XFnqVW_update",
2051
2066
  "discard": "XFnqVW_discard",
2067
+ "label": "XFnqVW_label",
2052
2068
  "updateCopy": "XFnqVW_updateCopy",
2053
- "field": "XFnqVW_field",
2069
+ "body": "XFnqVW_body",
2070
+ "save": "XFnqVW_save",
2054
2071
  "name": "XFnqVW_name",
2055
- "failed": "XFnqVW_failed",
2056
- "metadata": "XFnqVW_metadata",
2057
- "readOnly": "XFnqVW_readOnly",
2058
- "footer": "XFnqVW_footer",
2059
- "failure": "XFnqVW_failure",
2060
- "headText": "XFnqVW_headText",
2061
- "label": "XFnqVW_label"
2072
+ "header": "XFnqVW_header"
2062
2073
  };
2063
2074
  //#endregion
2064
2075
  //#region src/client/ConversationCard.tsx
@@ -2752,7 +2763,7 @@ window.__ModuleLoader__.load({
2752
2763
  immer.createDraft.bind(immer);
2753
2764
  immer.finishDraft.bind(immer);
2754
2765
  //#endregion
2755
- //#region ../../node_modules/.pnpm/@deepseek-ai+dsh-client-store@0.1.7-rc.1_@deepseek-ai+cordis@4.0.4/node_modules/@deepseek-ai/dsh-client-store/lib/index.js
2766
+ //#region ../../node_modules/.pnpm/@deepseek-ai+dsh-client-store@0.1.7-rc.2_@deepseek-ai+cordis@4.0.4/node_modules/@deepseek-ai/dsh-client-store/lib/index.js
2756
2767
  /**
2757
2768
  * React-free snapshot store engine (zustand vanilla + immer + subscribeWithSelector +
2758
2769
  * rafFlush middleware + opt-in persist + dev freeze) plus the declarative
@@ -2997,7 +3008,7 @@ window.__ModuleLoader__.load({
2997
3008
  }
2998
3009
  };
2999
3010
  //#endregion
3000
- //#region ../../node_modules/.pnpm/@deepseek-ai+dsh-session@0.1.7-rc.1_@deepseek-ai+cordis@4.0.4_@deepseek-ai+dsh-scope@0._d0632e5334fc6fa9e0d505304507fe7f/node_modules/@deepseek-ai/dsh-session/lib/types/surface.js
3011
+ //#region ../../node_modules/.pnpm/@deepseek-ai+dsh-session@0.1.7-rc.2_@deepseek-ai+cordis@4.0.4_@deepseek-ai+dsh-scope@0._96480dbecf47e43f89b841d272151264/node_modules/@deepseek-ai/dsh-session/lib/types/surface.js
3001
3012
  /** Runtime counterpart of the message-producing event union. */
3002
3013
  const SURFACE_EVENT_TYPES = /* @__PURE__ */ new Set([
3003
3014
  "system/message",
@@ -3279,24 +3290,24 @@ window.__ModuleLoader__.load({
3279
3290
  tag.textContent = css;
3280
3291
  }
3281
3292
  var DeliverablesCard_module_css_default = {
3282
- "list": "sLyncq_list",
3283
- "header": "sLyncq_header",
3284
- "fileName": "sLyncq_fileName",
3285
- "websitePath": "sLyncq_websitePath",
3286
- "stats": "sLyncq_stats",
3287
- "moreIcon": "sLyncq_moreIcon",
3288
- "added": "sLyncq_added",
3289
- "removed": "sLyncq_removed",
3290
- "headerIcon": "sLyncq_headerIcon",
3291
- "parentPath": "sLyncq_parentPath",
3292
- "filePath": "sLyncq_filePath",
3293
3293
  "root": "sLyncq_root",
3294
- "external": "sLyncq_external",
3294
+ "list": "sLyncq_list",
3295
3295
  "subtitle": "sLyncq_subtitle",
3296
3296
  "title": "sLyncq_title",
3297
+ "header": "sLyncq_header",
3297
3298
  "item": "sLyncq_item",
3299
+ "more": "sLyncq_more",
3300
+ "filePath": "sLyncq_filePath",
3301
+ "websitePath": "sLyncq_websitePath",
3302
+ "fileName": "sLyncq_fileName",
3303
+ "parentPath": "sLyncq_parentPath",
3298
3304
  "heading": "sLyncq_heading",
3299
- "more": "sLyncq_more"
3305
+ "added": "sLyncq_added",
3306
+ "external": "sLyncq_external",
3307
+ "headerIcon": "sLyncq_headerIcon",
3308
+ "removed": "sLyncq_removed",
3309
+ "moreIcon": "sLyncq_moreIcon",
3310
+ "stats": "sLyncq_stats"
3300
3311
  };
3301
3312
  //#endregion
3302
3313
  //#region src/client/DeliverablesCard.tsx