dsh-better-display 0.1.1 → 0.3.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/CHANGELOG.md +188 -4
- package/README.en.md +19 -3
- package/README.md +19 -3
- package/compat/harness-rc2.json +59 -0
- package/docs/official-rendering-bridge.md +65 -0
- package/lib/client.js +8827 -7639
- package/lib/client.js.map +1 -1
- package/lib/dsh-better-display.js +51 -55
- package/lib/types/client/Blocks.d.ts +6 -2
- package/lib/types/client/Blocks.d.ts.map +1 -1
- package/lib/types/client/Blocks.js +13 -6
- package/lib/types/client/Blocks.js.map +1 -1
- package/lib/types/client/ChoreographedFlow.d.ts.map +1 -1
- package/lib/types/client/ChoreographedFlow.js +68 -20
- package/lib/types/client/ChoreographedFlow.js.map +1 -1
- package/lib/types/client/ClosedProcessSummary.d.ts.map +1 -1
- package/lib/types/client/ClosedProcessSummary.js +3 -2
- package/lib/types/client/ClosedProcessSummary.js.map +1 -1
- package/lib/types/client/DiffPanel.d.ts +13 -0
- package/lib/types/client/DiffPanel.d.ts.map +1 -0
- package/lib/types/client/DiffPanel.js +115 -0
- package/lib/types/client/DiffPanel.js.map +1 -0
- package/lib/types/client/OfficialContent.d.ts +25 -0
- package/lib/types/client/OfficialContent.d.ts.map +1 -0
- package/lib/types/client/OfficialContent.js +42 -0
- package/lib/types/client/OfficialContent.js.map +1 -0
- package/lib/types/client/Reader.d.ts.map +1 -1
- package/lib/types/client/Reader.js +123 -57
- package/lib/types/client/Reader.js.map +1 -1
- package/lib/types/client/ReasoningCard.d.ts.map +1 -1
- package/lib/types/client/ReasoningCard.js +29 -8
- package/lib/types/client/ReasoningCard.js.map +1 -1
- package/lib/types/client/SettingsSection.d.ts +35 -0
- package/lib/types/client/SettingsSection.d.ts.map +1 -0
- package/lib/types/client/SettingsSection.js +62 -0
- package/lib/types/client/SettingsSection.js.map +1 -0
- package/lib/types/client/StickyLane.d.ts.map +1 -1
- package/lib/types/client/StickyLane.js +16 -5
- package/lib/types/client/StickyLane.js.map +1 -1
- package/lib/types/client/ToolActivity.d.ts.map +1 -1
- package/lib/types/client/ToolActivity.js +59 -7
- package/lib/types/client/ToolActivity.js.map +1 -1
- package/lib/types/client/WaitClock.d.ts +16 -0
- package/lib/types/client/WaitClock.d.ts.map +1 -0
- package/lib/types/client/WaitClock.js +29 -0
- package/lib/types/client/WaitClock.js.map +1 -0
- package/lib/types/client/WaitingClock.d.ts +15 -0
- package/lib/types/client/WaitingClock.d.ts.map +1 -0
- package/lib/types/client/WaitingClock.js +30 -0
- package/lib/types/client/WaitingClock.js.map +1 -0
- package/lib/types/client/WaitingStatus.d.ts.map +1 -1
- package/lib/types/client/WaitingStatus.js +4 -14
- package/lib/types/client/WaitingStatus.js.map +1 -1
- package/lib/types/client/fold-choreography.d.ts +12 -0
- package/lib/types/client/fold-choreography.d.ts.map +1 -1
- package/lib/types/client/fold-choreography.js +18 -1
- package/lib/types/client/fold-choreography.js.map +1 -1
- package/lib/types/client/fold-intensity.d.ts +9 -0
- package/lib/types/client/fold-intensity.d.ts.map +1 -0
- package/lib/types/client/fold-intensity.js +25 -0
- package/lib/types/client/fold-intensity.js.map +1 -0
- package/lib/types/client/index.d.ts.map +1 -1
- package/lib/types/client/index.js +62 -20
- package/lib/types/client/index.js.map +1 -1
- package/lib/types/client/live-turn.d.ts.map +1 -1
- package/lib/types/client/live-turn.js +46 -0
- package/lib/types/client/live-turn.js.map +1 -1
- package/lib/types/client/markdown/MarkdownText.d.ts +3 -1
- package/lib/types/client/markdown/MarkdownText.d.ts.map +1 -1
- package/lib/types/client/markdown/MarkdownText.js +14 -7
- package/lib/types/client/markdown/MarkdownText.js.map +1 -1
- package/lib/types/client/markdown/render.d.ts +2 -0
- package/lib/types/client/markdown/render.d.ts.map +1 -1
- package/lib/types/client/markdown/render.js +22 -6
- package/lib/types/client/markdown/render.js.map +1 -1
- package/lib/types/client/motion.d.ts.map +1 -1
- package/lib/types/client/motion.js +102 -16
- package/lib/types/client/motion.js.map +1 -1
- package/lib/types/client/native/ContextInjectionRow.d.ts +12 -3
- package/lib/types/client/native/ContextInjectionRow.d.ts.map +1 -1
- package/lib/types/client/native/ContextInjectionRow.js +6 -3
- package/lib/types/client/native/ContextInjectionRow.js.map +1 -1
- package/lib/types/client/official-slots.d.ts +71 -0
- package/lib/types/client/official-slots.d.ts.map +1 -0
- package/lib/types/client/official-slots.js +183 -0
- package/lib/types/client/official-slots.js.map +1 -0
- package/lib/types/client/open-file.d.ts +6 -1
- package/lib/types/client/open-file.d.ts.map +1 -0
- package/lib/types/client/open-file.js +71 -0
- package/lib/types/client/open-file.js.map +1 -0
- package/lib/types/client/pending-submission.d.ts +28 -0
- package/lib/types/client/pending-submission.d.ts.map +1 -0
- package/lib/types/client/pending-submission.js +28 -0
- package/lib/types/client/pending-submission.js.map +1 -0
- package/lib/types/client/platform-media.d.ts +6 -0
- package/lib/types/client/platform-media.d.ts.map +1 -0
- package/lib/types/client/platform-media.js +13 -0
- package/lib/types/client/platform-media.js.map +1 -0
- package/lib/types/client/reasoning-follow.d.ts +5 -1
- package/lib/types/client/reasoning-follow.d.ts.map +1 -1
- package/lib/types/client/reasoning-follow.js +13 -4
- package/lib/types/client/reasoning-follow.js.map +1 -1
- package/lib/types/client/resource-address.d.ts +3 -0
- package/lib/types/client/resource-address.d.ts.map +1 -0
- package/lib/types/client/resource-address.js +33 -0
- package/lib/types/client/resource-address.js.map +1 -0
- package/lib/types/client/settings-copy.d.ts +3 -2
- package/lib/types/client/settings-copy.d.ts.map +1 -0
- package/lib/types/client/settings-copy.js +49 -0
- package/lib/types/client/settings-copy.js.map +1 -0
- package/lib/types/client/settings-slots.d.ts +7 -0
- package/lib/types/client/settings-slots.d.ts.map +1 -0
- package/lib/types/client/settings-slots.js +2 -0
- package/lib/types/client/settings-slots.js.map +1 -0
- package/lib/types/client/settings.d.ts +4 -0
- package/lib/types/client/settings.d.ts.map +1 -0
- package/lib/types/client/settings.js +60 -0
- package/lib/types/client/settings.js.map +1 -0
- package/lib/types/client/skill-status.d.ts +25 -0
- package/lib/types/client/skill-status.d.ts.map +1 -0
- package/lib/types/client/skill-status.js +44 -0
- package/lib/types/client/skill-status.js.map +1 -0
- package/lib/types/client/store.d.ts +15 -0
- package/lib/types/client/store.d.ts.map +1 -1
- package/lib/types/client/store.js +24 -2
- package/lib/types/client/store.js.map +1 -1
- package/lib/types/client/stream-buffer.d.ts +11 -3
- package/lib/types/client/stream-buffer.d.ts.map +1 -1
- package/lib/types/client/stream-buffer.js +39 -2
- package/lib/types/client/stream-buffer.js.map +1 -1
- package/lib/types/client/streaming.d.ts.map +1 -1
- package/lib/types/client/streaming.js +9 -2
- package/lib/types/client/streaming.js.map +1 -1
- package/lib/types/client/tool-activity.d.ts +47 -1
- package/lib/types/client/tool-activity.d.ts.map +1 -1
- package/lib/types/client/tool-activity.js +125 -2
- package/lib/types/client/tool-activity.js.map +1 -1
- package/lib/types/client/types.d.ts +28 -5
- package/lib/types/client/types.d.ts.map +1 -1
- package/lib/types/client/waiting-clock.d.ts +34 -2
- package/lib/types/client/waiting-clock.d.ts.map +1 -1
- package/lib/types/client/waiting-clock.js +62 -6
- package/lib/types/client/waiting-clock.js.map +1 -1
- package/lib/types/client/word-motion.d.ts.map +1 -1
- package/lib/types/client/word-motion.js +2 -1
- package/lib/types/client/word-motion.js.map +1 -1
- package/lib/types/client/word-timeline.d.ts +4 -0
- package/lib/types/client/word-timeline.d.ts.map +1 -1
- package/lib/types/client/word-timeline.js +21 -2
- package/lib/types/client/word-timeline.js.map +1 -1
- package/lib/types/dsh-better-display.d.ts.map +1 -1
- package/lib/types/dsh-better-display.js +42 -2
- package/lib/types/dsh-better-display.js.map +1 -1
- package/lib/types/skill-roots.d.ts +22 -0
- package/lib/types/skill-roots.d.ts.map +1 -0
- package/lib/types/skill-roots.js +126 -0
- package/lib/types/skill-roots.js.map +1 -0
- package/lib/types/skill-status.d.ts +36 -0
- package/lib/types/skill-status.d.ts.map +1 -0
- package/lib/types/skill-status.js +51 -0
- package/lib/types/skill-status.js.map +1 -0
- package/package.json +22 -16
- package/scripts/check-harness-compat.mjs +71 -0
- package/scripts/link-harness-dependencies.mjs +1 -0
- package/scripts/verify-auto-fold.mjs +114 -0
- package/scripts/verify-official-bridge.mjs +119 -0
- package/src/client/Blocks.tsx +13 -5
- package/src/client/ChoreographedFlow.tsx +68 -18
- package/src/client/ClosedProcessSummary.tsx +6 -2
- package/src/client/DiffPanel.tsx +124 -0
- package/src/client/OfficialContent.tsx +57 -0
- package/src/client/Reader.module.css +341 -13
- package/src/client/Reader.tsx +113 -49
- package/src/client/ReasoningCard.tsx +27 -6
- package/src/client/SettingsSection.module.css +37 -0
- package/src/client/SettingsSection.tsx +64 -6
- package/src/client/StickyLane.tsx +13 -3
- package/src/client/ToolActivity.tsx +67 -7
- package/src/client/WaitClock.tsx +33 -0
- package/src/client/WaitingStatus.tsx +6 -15
- package/src/client/fold-choreography.ts +18 -1
- package/src/client/fold-intensity.ts +28 -0
- package/src/client/index.tsx +29 -7
- package/src/client/live-turn.ts +43 -0
- package/src/client/markdown/MarkdownText.tsx +14 -6
- package/src/client/markdown/render.tsx +23 -7
- package/src/client/motion.tsx +91 -19
- package/src/client/native/ContextInjectionRow.tsx +19 -7
- package/src/client/official-slots.tsx +211 -0
- package/src/client/platform-media.ts +11 -0
- package/src/client/reasoning-follow.ts +20 -4
- package/src/client/settings-copy.ts +21 -0
- package/src/client/settings.tsx +1 -1
- package/src/client/store.ts +42 -2
- package/src/client/stream-buffer.ts +38 -2
- package/src/client/streaming.tsx +9 -1
- package/src/client/tool-activity.ts +148 -2
- package/src/client/types.ts +27 -6
- package/src/client/waiting-clock.ts +64 -6
- package/src/client/word-motion.tsx +2 -1
- package/src/client/word-timeline.ts +19 -2
- package/tests/browser-auto-fold.tsx +64 -0
- package/tests/browser-official-bridge.tsx +144 -0
- package/tests/fold-choreography.test.ts +16 -0
- package/tests/fold-intensity.test.ts +94 -0
- package/tests/footer-precedence.test.ts +129 -0
- package/tests/official-slots.test.ts +112 -0
- package/tests/open-file.test.ts +11 -0
- package/tests/platform-media.test.ts +17 -0
- package/tests/stock-install.test.ts +8 -0
- package/tests/stream-buffer.test.ts +8 -3
- package/tests/tool-diff.test.ts +57 -0
- package/tests/waiting-clock.test.ts +78 -19
- package/tests/word-timeline.test.ts +14 -4
package/CHANGELOG.md
CHANGED
|
@@ -1,10 +1,194 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
-
##
|
|
3
|
+
## 0.3.0 — 2026-09-21
|
|
4
|
+
|
|
5
|
+
- 修复关闭自动折叠、查看过程详情后,再开启仍无法折叠的问题;重新开启会恢复自动折叠规则,仍保留文本选择保护和之后的手动展开。
|
|
6
|
+
- 在现有阅读布局中接入官方反馈、工具详情、显式产物卡片、命令和未知节点渲染;官方渲染器负责注入、翻译、store 和子插槽。
|
|
7
|
+
- 移除直接调用工具组件及模拟点击展开的逻辑,保留现有摘要、折叠、动效和文件快捷操作。
|
|
8
|
+
- 接入官方文件链接服务,传递工具文件行号,补齐 RC2 本地 Markdown 图片及加载失败降级。
|
|
9
|
+
- 修复滚动跟随拉回底部的问题,统一阅读列轨道和吸顶区域的位置。
|
|
10
|
+
- 代码解释器结果按终端输出展示,上下文行兼容 `provenance` 和 `producer`。
|
|
11
|
+
- 增加可重放的官方组件集成测试、自动折叠交互回归和 Harness 升级兼容检查,依赖对齐 Harness `0.1.5-rc.2`。
|
|
12
|
+
- 设计范围、接口边界和待收敛模块见 `docs/official-rendering-bridge.md`。
|
|
13
|
+
|
|
14
|
+
## 0.2.1 — 2026-09-20
|
|
15
|
+
|
|
16
|
+
### Fixed
|
|
17
|
+
|
|
18
|
+
- Pinned reader lanes no longer paint over the composer. The live status row
|
|
19
|
+
(`执行过程` / `正在使用工具`) pinned at the scrollport top with `z-index: 8`,
|
|
20
|
+
while the host's sticky composer seat owns `z-index: 7` and nothing between
|
|
21
|
+
the reader and `<body>` creates a stacking context. A scrolling reader clamps
|
|
22
|
+
every turn-level sticky lane down into the footer band — the lane stops at its
|
|
23
|
+
containing block's bottom, which passes behind the input card — so the reader
|
|
24
|
+
painted its own opaque plate over the composer.
|
|
25
|
+
- The live status lane now owns the measured lane under the toolbar, exactly
|
|
26
|
+
like the closed summary rows, instead of sharing the toolbar's lane.
|
|
27
|
+
- Lanes a scroll can clamp into the footer band stay below the composer seat
|
|
28
|
+
(`z-index` 6); only the top toolbar lane keeps 7, which also keeps it above
|
|
29
|
+
the host's code-block banners.
|
|
30
|
+
- Skin mode no longer carries a second lane ladder of its own.
|
|
31
|
+
- `tests/footer-precedence.test.ts` guards the ladder in the source sheet and
|
|
32
|
+
in the committed bundle.
|
|
33
|
+
|
|
34
|
+
## 0.2.0 — 2026-09-18
|
|
35
|
+
|
|
36
|
+
### Diff review and tool presentation
|
|
37
|
+
|
|
38
|
+
- Re-engineered diff review panel: line addition/deletion statistics (`+A -R`) are pushed
|
|
39
|
+
flush to the right margin, perfectly aligned on the same 32px baseline as the summary text.
|
|
40
|
+
- Diff overlay expands cleanly within the reading column (0px horizontal overflow) with
|
|
41
|
+
independent vertical scrolling (`max-height: 420px; overscroll-behavior: contain`),
|
|
42
|
+
preventing mouse-wheel events from leaking into the conversation stream.
|
|
43
|
+
- Multi-file tabs scroll horizontally with adaptive content height on file switches.
|
|
44
|
+
- PR #12 custom tool cards: delegate tool view rendering to `tool.call.toolview` slot with
|
|
45
|
+
error boundary isolation and auto-expand capabilities.
|
|
46
|
+
|
|
47
|
+
### Translucent frosted glass and skin mode
|
|
48
|
+
|
|
49
|
+
- Translucent frosted glass mode is an opt-in toggle in Settings.
|
|
50
|
+
- When enabled, all card backgrounds, tool detail frames, and code blocks become translucent
|
|
51
|
+
with backdrop blur, eliminating opaque white patches and seamlessly adapting to third-party
|
|
52
|
+
wallpaper and window skins.
|
|
53
|
+
|
|
54
|
+
### Refined folding and liveness
|
|
55
|
+
|
|
56
|
+
- Reverted to a single, intuitive auto-fold toggle (**自动折叠开 / 关**) on the reading toolbar
|
|
57
|
+
and in Settings, removing complex multi-level rules while keeping reasoning and tools
|
|
58
|
+
completely unfolded when turned off.
|
|
59
|
+
- Fixed line-wrapping bug so digest rows stay strictly single-line when space permits.
|
|
60
|
+
- Real-time wait clocks (`WaitClock`), execution time tracking, and token throughput
|
|
61
|
+
metrics (`TurnMetrics`) fully preserved and active.
|
|
62
|
+
- Animated disclosures include fallback timeouts to prevent rendering stalls.
|
|
63
|
+
|
|
64
|
+
### Better Display settings
|
|
65
|
+
|
|
66
|
+
- Glass, auto-fold, and deliverable open-mode share the root `dsh.reader.v1` store so
|
|
67
|
+
Settings and the reading view stay in sync across refresh.
|
|
68
|
+
- Deliverable open-mode: default system app, optional Sidebar. Folder/reveal stay OS.
|
|
69
|
+
- Generative-mcpapps skill installation detection and status reporting.
|
|
70
|
+
|
|
71
|
+
### Compatibility and liveness
|
|
72
|
+
|
|
73
|
+
- A wait now restarts when a tool returns. The handover set named kinds from the
|
|
74
|
+
conversation contract (`tool-result`) while the reader matches against the chat
|
|
75
|
+
layer's kinds, where a returned tool is the `tool-call` row whose `data.root`
|
|
76
|
+
carries a result. No node ever had the old name, so the branch was dead and a
|
|
77
|
+
returned tool never restarted the clock. The set and every kind it reasons about
|
|
78
|
+
are now typed against the host's own kind union, so a wrong name fails `tsc`
|
|
79
|
+
instead of failing silently at runtime, and a tool that is still running is
|
|
80
|
+
explicitly not a wait.
|
|
81
|
+
- The fold choreography can no longer stall. Each phase advances on animation
|
|
82
|
+
promises and rendered frames, and a cancelled animation rejects while a hidden
|
|
83
|
+
tab delivers no frames — either one used to leave the machine in a non-idle
|
|
84
|
+
phase forever, which holds the frame source at the shown snapshot and pauses the
|
|
85
|
+
text reveal, so the turn looked stuck until the view remounted. Every phase now
|
|
86
|
+
also has a wall-clock deadline that forces the next phase.
|
|
87
|
+
- While the choreography holds the reveal, the stream buffer keeps absorbing the
|
|
88
|
+
source instead of returning early, so text never resumes from a stale target
|
|
89
|
+
once the fold settles.
|
|
90
|
+
- Status shows how many sub-agents the turn dispatched, read from the host's own
|
|
91
|
+
turn-process row instead of being counted again here.
|
|
92
|
+
- Drop the `command-input` render branch: that string is not a chat node kind in
|
|
93
|
+
any released host, so it only made the file look like it handled a case that
|
|
94
|
+
cannot occur.
|
|
95
|
+
- Give every animated disclosure a wall-clock deadline as well. `fill: 'both'`
|
|
96
|
+
pins the opening keyframe, so a Web Animation that never reaches `onfinish`
|
|
97
|
+
(cancelled, unmounted, or skipped by the compositor) left the row in the DOM at
|
|
98
|
+
zero height and zero opacity — clicking it looked like nothing happened.
|
|
99
|
+
- Add a Better Display settings section: deliverables still open in the system app
|
|
100
|
+
by default, with an optional right-Sidebar preview, plus generative-mcpapps
|
|
101
|
+
skill-root detection and install guidance.
|
|
102
|
+
- Guard pending-submission image echoes so a text-only send cannot crash
|
|
103
|
+
`conversation.view` (`images` / `attachments` may be missing).
|
|
104
|
+
- Install guidance names only conventional relative roots (`.dsh/skills`,
|
|
105
|
+
`.agents/skills`) and never prints host home or plugin pack absolutes.
|
|
106
|
+
|
|
107
|
+
### Reading and folding
|
|
108
|
+
|
|
109
|
+
- A later reasoning step folds only the finished process run it follows. The run
|
|
110
|
+
that is still streaming stays fully expanded, so a long turn reads as
|
|
111
|
+
alternating digests and prose instead of collapsing mid-thought.
|
|
112
|
+
- Fold intensity 2 (`过程摘要`) is PR #14's process-only mode: prose is never
|
|
113
|
+
folded; each finished run of reasoning / tool / record steps collapses into
|
|
114
|
+
one digest that names what the tools actually did (`读取 Reader.tsx`,
|
|
115
|
+
`运行 pnpm test`), read from the same tool identity the tool cards use. It is
|
|
116
|
+
not the default — standard fold (level 1) keeps current-main choreography.
|
|
117
|
+
- A finished process-only turn folds its trailing run too, and skips the
|
|
118
|
+
duplicate closed-turn counter row it no longer needs.
|
|
119
|
+
|
|
120
|
+
### Reading surface
|
|
121
|
+
|
|
122
|
+
- When frosted glass is on, sticky lanes use the same liquid glass as the
|
|
123
|
+
dsh-auto-memory pane: translucent `bg-layer-2` wash, `blur(28px)`, hairline
|
|
124
|
+
border, 16px radius and a soft lift. Detail chips stay transparent until
|
|
125
|
+
hovered or focused. When the toggle is off, chrome matches current main.
|
|
126
|
+
- The toolbar reserves the width of its whole control group. Measuring only the
|
|
127
|
+
first button let the status lane paint over every later control.
|
|
128
|
+
- A compaction divider now arrives instead of simply appearing: the rule sweeps
|
|
129
|
+
out from its centre, the pill settles in, and the dial turns once. Gated by
|
|
130
|
+
`data-motion=off` and `prefers-reduced-motion` like every other transition.
|
|
131
|
+
|
|
132
|
+
### Diff review
|
|
133
|
+
|
|
134
|
+
- Read the changed line counts from the tool result the host already attaches
|
|
135
|
+
(`meta.diffs`, `{ path, oldText, newText }`), and fall back to the call's own
|
|
136
|
+
arguments for `write` / `edit` / `str_replace_editor` when a host build does
|
|
137
|
+
not send them. The name whitelist matters: several unrelated tools take a
|
|
138
|
+
field called `content`, and counting those invented additions for calls that
|
|
139
|
+
changed no file.
|
|
140
|
+
- Fold a parent call's child calls into its own counts. A `run_code` that writes
|
|
141
|
+
files reports what its children changed rather than what its own arguments
|
|
142
|
+
contain, so a run whose edits live one level down no longer loses its counts.
|
|
143
|
+
Each child contributes through its own arguments, read from either the landed
|
|
144
|
+
result or the pending call.
|
|
145
|
+
- `+N -M` sits at the end of the row in green/red and opens a panel listing one
|
|
146
|
+
entry per changed file — the file tabs, the removed lines on a red wash and
|
|
147
|
+
the added lines on a green one, using the same `DiffBlock` primitive the
|
|
148
|
+
official tool row renders. The panel is in flow, never a floating popup, so
|
|
149
|
+
the flow cell's `overflow: clip` cannot cut it off.
|
|
150
|
+
- Opening and closing the panel animate real height in the plugin's own motion
|
|
151
|
+
language, and the card is brought back into view when it opens below the
|
|
152
|
+
fold; an open panel keeps its caret lit.
|
|
153
|
+
|
|
154
|
+
### Waiting and timing
|
|
155
|
+
|
|
156
|
+
- Show how long the model has been given the turn, next to 「深度求索中」and the
|
|
157
|
+
in-flow wait indicator. The clock is anchored to the last event that handed
|
|
158
|
+
control to the model — a returned tool, an injected context, a run command,
|
|
159
|
+
the user's own message — never to the start of the turn, so a wait that has
|
|
160
|
+
just begun does not inherit the minutes the tools already spent.
|
|
161
|
+
- Past ten seconds the readout adds a「暂未响应」badge, and the moment the model
|
|
162
|
+
produces its first block the whole indicator is withdrawn. A tool that is
|
|
163
|
+
still running is not a wait: the tool is the one working.
|
|
164
|
+
- A command that ran long keeps its duration after it returns (warning colour
|
|
165
|
+
past ten seconds); a fast one shows nothing once it is done. Running steps
|
|
166
|
+
show a live seconds readout and a shimmering summary while they work.
|
|
167
|
+
|
|
168
|
+
### Scroll
|
|
169
|
+
|
|
170
|
+
- Tail-follow only detaches on a real upward move by the reader. Content growth
|
|
171
|
+
and the follow easing itself also move `scrollTop`, and reading that as "the
|
|
172
|
+
user left the bottom" froze following mid-turn.
|
|
173
|
+
- Disable browser scroll anchoring on the conversation scroller while the reader
|
|
174
|
+
is mounted: it moved the viewport on its own as the transcript grew.
|
|
175
|
+
- Only a focused text field suspends following, and only inside the reader.
|
|
176
|
+
Focusing the composer used to stop the transcript from advancing.
|
|
177
|
+
- Stream at the source's own rate: add a feed-forward term estimated from the
|
|
178
|
+
arrival rate on top of the proportional controller. A purely proportional
|
|
179
|
+
reveal settles at a constant `catchUpMs` of lag regardless of model speed,
|
|
180
|
+
which read as 「慢」 while the backlog grew with faster models; the feed-forward
|
|
181
|
+
term drains the backlog and the proportional term absorbs transport jitter.
|
|
182
|
+
- Reveal a batch of words on one clock instead of one word per fixed gap.
|
|
183
|
+
Per-word spacing pinned the rate near 16 words/second, so a fast model still
|
|
184
|
+
arrived one word at a time; a batch now lands inside one short window while a
|
|
185
|
+
lone new word keeps the original typing cadence.
|
|
186
|
+
- The reasoning pane's own follow steps with the backlog rather than at a fixed
|
|
187
|
+
step-and-hold: it used to advance two lines every ~1.3 seconds no matter how
|
|
188
|
+
fast the text arrived, which is what made the pane look like it was lagging
|
|
189
|
+
behind a fast model.
|
|
190
|
+
### Host DOM hooks
|
|
4
191
|
|
|
5
|
-
- Add a Better Display settings section: deliverables still open in the system app by default, with an optional right-Sidebar preview, plus generative-mcpapps skill-root detection and install guidance.
|
|
6
|
-
- Guard pending-submission image echoes so a text-only send cannot crash `conversation.view` (`images` / `attachments` may be missing).
|
|
7
|
-
- Install guidance names only conventional relative roots (`.dsh/skills`, `.agents/skills`) and never prints host home or plugin pack absolutes.
|
|
8
192
|
- Keep ChatView's `data-chat-flow=""` hook on the Reader column so skins that hide `[data-composer-seat]` when the scrollport has no chat-flow (maid-atelier, phoebe-atelier, and others) still show the composer in reading view.
|
|
9
193
|
|
|
10
194
|
## 0.1.1 — 2026-09-16
|
package/README.en.md
CHANGED
|
@@ -2,25 +2,41 @@
|
|
|
2
2
|
|
|
3
3
|
[中文](./README.md)
|
|
4
4
|
|
|
5
|
+
Prefer npm (version-pinable):
|
|
6
|
+
|
|
7
|
+
```sh
|
|
8
|
+
dsh plugin --profile web add dsh-better-display@0.3.0
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
Or latest:
|
|
12
|
+
|
|
13
|
+
```sh
|
|
14
|
+
dsh plugin --profile web add dsh-better-display
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
Fallback: install from GitHub (tracks the default branch tip):
|
|
18
|
+
|
|
5
19
|
```sh
|
|
6
20
|
dsh plugin --profile web add github:aa2246740/dsh-better-display
|
|
7
21
|
```
|
|
8
22
|
|
|
9
|
-
You need official `dsh` (or `npx @deepseek-ai/dsh`) and **pnpm** on PATH. `dsh plugin add` runs pnpm in `$DSH_HOME/profiles/web`. This repo commits built `lib/`, so
|
|
23
|
+
You need official `dsh` (or `npx @deepseek-ai/dsh`) and **pnpm** on PATH. `dsh plugin add` runs pnpm in `$DSH_HOME/profiles/web`. This repo commits built `lib/`, so git / npm installs do not need `prepare` or a profile `allowBuilds` entry.
|
|
10
24
|
|
|
11
25
|
Then restart that Host and reload the page. `dsh plugin add` writes the profile. It does not hot-load a running process.
|
|
12
26
|
|
|
13
27
|
Adds a **阅读** tab to DeepSeek Harness. While a turn runs you see steps, thinking, and progress. After a successful turn those collapse and the final answer stays. Native Chat / Trajectory, the composer, model picker, tools, and approvals stay. The reading column keeps ChatView's `data-chat-flow` hook so third-party skins that gate the composer on that mark still treat Reader as an interactive conversation.
|
|
14
28
|
|
|
15
|
-
A ````mcp-app` fence in the final answer mounts as an interactive card in the reading view, inside `<iframe sandbox="allow-scripts allow-forms">` without `allow-same-origin`. The card can fill the next prompt via JSON-RPC. The skill pack is [`skills/generative-mcpapps/`](skills/generative-mcpapps/). Settings → **Better Display** can preview deliverables in the right Sidebar (system app remains the default) and reports whether that skill is installed in a harness skill root.
|
|
29
|
+
A ````mcp-app` fence in the final answer mounts as an interactive card in the reading view, inside `<iframe sandbox="allow-scripts allow-forms">` without `allow-same-origin`. The card can fill the next prompt via JSON-RPC. The skill pack is [`skills/generative-mcpapps/`](skills/generative-mcpapps/). Settings → **Better Display** can preview deliverables in the right Sidebar (system app remains the default), turn on translucent frosted glass (off by default), toggle process auto-folding (On is the default), and reports whether that skill is installed in a harness skill root.
|
|
16
30
|
|
|
17
31
|
Targets DeepSeek Harness **0.1.5-rc.2**. Display only. It does not change Agent execution, the SDK, or credentials. Node.js `^22.19.0 || >=24`. New sessions default to reading.
|
|
18
32
|
|
|
33
|
+
**0.3.0** keeps the existing reading layout, folding, and motion while using official feedback, tool details, file cards, and file links. It also fixes process content staying expanded after auto-folding is re-enabled. See the [official integration notes](docs/official-rendering-bridge.md) for coverage and upgrade checks.
|
|
34
|
+
|
|
19
35
|
From a local checkout or tarball:
|
|
20
36
|
|
|
21
37
|
```sh
|
|
22
38
|
dsh plugin --profile web add ./dsh-better-display
|
|
23
|
-
dsh plugin --profile web add ./dsh-better-display-0.
|
|
39
|
+
dsh plugin --profile web add ./dsh-better-display-0.3.0.tgz
|
|
24
40
|
```
|
|
25
41
|
|
|
26
42
|
`dsh.bundle` is captured at Host boot. Do not also insert the same row by hand in the profile `cordis.patch.yml`, or it will mount twice.
|
package/README.md
CHANGED
|
@@ -2,25 +2,41 @@
|
|
|
2
2
|
|
|
3
3
|
[English](./README.en.md)
|
|
4
4
|
|
|
5
|
+
推荐用 npm(可钉版本):
|
|
6
|
+
|
|
7
|
+
```sh
|
|
8
|
+
dsh plugin --profile web add dsh-better-display@0.3.0
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
也可以装 latest:
|
|
12
|
+
|
|
13
|
+
```sh
|
|
14
|
+
dsh plugin --profile web add dsh-better-display
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
备选:从 GitHub 直装(跟默认分支最新提交):
|
|
18
|
+
|
|
5
19
|
```sh
|
|
6
20
|
dsh plugin --profile web add github:aa2246740/dsh-better-display
|
|
7
21
|
```
|
|
8
22
|
|
|
9
|
-
PATH 上要有官方 `dsh`(没有就用 `npx @deepseek-ai/dsh`)和 **pnpm**。`dsh plugin add` 会在 `$DSH_HOME/profiles/web` 里跑 pnpm。仓库已提交编译好的 `lib/`,git
|
|
23
|
+
PATH 上要有官方 `dsh`(没有就用 `npx @deepseek-ai/dsh`)和 **pnpm**。`dsh plugin add` 会在 `$DSH_HOME/profiles/web` 里跑 pnpm。仓库已提交编译好的 `lib/`,git / npm 安装都不用 `prepare`,也不用改 profile 的 `allowBuilds`。
|
|
10
24
|
|
|
11
25
|
然后重启这个 Host,再刷新页面。`dsh plugin add` 只写 profile,不会热挂正在跑的进程。
|
|
12
26
|
|
|
13
27
|
给 DeepSeek Harness 加一个 **阅读** 页签:执行时能看到步骤、思考和进度;整轮成功结束后把过程收起来,留下最终回答。原版「对话 / 轨迹」、输入框、模型选择、工具和审批都还在。阅读列保留宿主 ChatView 的 `data-chat-flow` 钩子,依赖该标记显示输入框的第三方皮肤不会把阅读页当成仅检视视图。
|
|
14
28
|
|
|
15
|
-
最终回答里的 ````mcp-app` 代码块会在阅读视图里挂成交互卡片,跑在 `<iframe sandbox="allow-scripts allow-forms">` 里,没有 `allow-same-origin`。卡片可以通过 JSON-RPC 把下一轮 prompt 填进输入框。技能包在 [`skills/generative-mcpapps/`](skills/generative-mcpapps/)。设置里的 **Better Display**
|
|
29
|
+
最终回答里的 ````mcp-app` 代码块会在阅读视图里挂成交互卡片,跑在 `<iframe sandbox="allow-scripts allow-forms">` 里,没有 `allow-same-origin`。卡片可以通过 JSON-RPC 把下一轮 prompt 填进输入框。技能包在 [`skills/generative-mcpapps/`](skills/generative-mcpapps/)。设置里的 **Better Display** 可把产物改为右侧栏预览(默认仍用系统应用),打开半透明毛玻璃(默认关),设置过程自动折叠开关(默认开),并检测该技能是否已装进宿主技能目录。
|
|
16
30
|
|
|
17
31
|
面向 DeepSeek Harness **0.1.5-rc.2**。只改展示,不改 Agent 执行、SDK 或模型凭据。Node.js `^22.19.0 || >=24`。新会话默认进阅读。
|
|
18
32
|
|
|
33
|
+
**0.3.0** 保留现有阅读布局、折叠和动效,接入官方反馈、工具详情、文件卡片及文件链接;并修复重新开启自动折叠后仍保持展开的问题。接入范围和升级检查见 [官方能力接入说明](docs/official-rendering-bridge.md)。
|
|
34
|
+
|
|
19
35
|
本地目录或 tarball:
|
|
20
36
|
|
|
21
37
|
```sh
|
|
22
38
|
dsh plugin --profile web add ./dsh-better-display
|
|
23
|
-
dsh plugin --profile web add ./dsh-better-display-0.
|
|
39
|
+
dsh plugin --profile web add ./dsh-better-display-0.3.0.tgz
|
|
24
40
|
```
|
|
25
41
|
|
|
26
42
|
`dsh.bundle` 是开机捕获的。不要再往 profile 的 `cordis.patch.yml` 手写同一条 insert,会重复挂载。
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
{
|
|
2
|
+
"harnessVersion": "0.1.5-rc.2",
|
|
3
|
+
"hashes": {
|
|
4
|
+
"packages/client/ui-slots/src/index.ts": "07b7aec2248b6ee6b56626f7aaba5dbc97cf765f1967dc7e60d6cef07ba7c81e",
|
|
5
|
+
"packages/client/ui-slots/src/renderer.ts": "66201b2ded3ab3ea133881de76737b3a0253f94f59b84594462109f052c63b19",
|
|
6
|
+
"packages/client/ui-renderer/src/client/registry.ts": "46442dfe72c837296f9f827c681dfba55ebfe3549a3895975e945511a1fe9c25",
|
|
7
|
+
"packages/client/ui-renderer/src/client/scoped-slots.tsx": "bcdd61674a52fae843ef21b258a8a8568a49e310217cda187c73159e925fa8a0",
|
|
8
|
+
"packages/client/ui-chat/src/client/contract/slots.ts": "66deb5545891ab05cb8b7a3b43139d96a9b90271e64b7d32fadc229337ede589",
|
|
9
|
+
"packages/client/ui-tool/src/client/contract/slots.ts": "9d0bba9e047864e4c31842e8a0010de383075e12c74e7c962fc6cffdc54221bf",
|
|
10
|
+
"packages/client/ui-deliverables/src/client/Deliverables.tsx": "d599330309bd4973bdb14d4be953b5bf3113c5e4bde3ac854738fe1fce7e4991",
|
|
11
|
+
"packages/client/ui-chat/src/client/chat/AssistantMarkdown.tsx": "ad25664afa92be5436ce354b3bef37201187a1034898567cb120ca3bd34d51df",
|
|
12
|
+
"packages/client/ui-chat/src/client/chat/MessageItem.tsx": "75e0bea127342d2f4185b6d0f89d74d0c8bdd01858be85b4cc859f7596b073d6",
|
|
13
|
+
"packages/client/ui-chat/src/client/chat/AssistantNodeView.tsx": "315e5112b78a3da86417f55778cf26a204acd0eee984a762dcc87bd900f2e718",
|
|
14
|
+
"packages/client/ui-chat/src/client/chat/TurnTailNodeView.tsx": "6a0167ec521e64e58c3c5588078dd3a4e7ebe55309e276b04271b303f82ba96b",
|
|
15
|
+
"packages/client/ui-chat/src/client/chat/TurnProcessNodeView.tsx": "d397f1e92f76585fa49b924b3d43d829ad503a4ffa821660234d4b51e5cc743f",
|
|
16
|
+
"packages/client/ui-tool/src/client/tool/models/tool-call-model.ts": "dd5033d26a6ed147b70e310506d311d55ccac6a54d08a7e24834d232226a06a3",
|
|
17
|
+
"packages/client/ui-primitives/src/markdown/MarkdownText.tsx": "d8c6aa23232aa4a76339c49c02df5888f5530a7a1bbb417ef14a42a1e41d5d94",
|
|
18
|
+
"packages/client/ui-primitives/src/markdown/render.tsx": "3576c16a37846a55f215562d15df9394cf5761fc46eae8f89fdcea8420f09d3d",
|
|
19
|
+
"packages/client/ui-primitives/src/markdown/parse.ts": "6be57559995c4e717d6d704207eb2fec86db9714c2a4bcc5b0c3f6648c8990f0",
|
|
20
|
+
"packages/client/ui-primitives/src/markdown/incremental.ts": "eaa266bb77dfb646738d0fdd79be4f1c4bc5490f7bf3f4127f9ffb72ef741ff8",
|
|
21
|
+
"packages/client/ui-primitives/src/markdown/katex.tsx": "8227e04d29333d2568021ed012143237b457852bce25d82cf394d72b941e74a5"
|
|
22
|
+
},
|
|
23
|
+
"registrations": [
|
|
24
|
+
"conversation.chat.assistant-actions | feedback | packages/client/ui-message-feedback/src/client/index.ts",
|
|
25
|
+
"conversation.chat.node | assistant-step | packages/client/ui-chat/src/client/chat/register-node-renderers.ts",
|
|
26
|
+
"conversation.chat.node | command | packages/client/ui-chat/src/client/chat/register-node-renderers.ts",
|
|
27
|
+
"conversation.chat.node | command-input | packages/client/ui-goal/src/client/index.ts",
|
|
28
|
+
"conversation.chat.node | compaction | packages/client/ui-chat/src/client/chat/register-node-renderers.ts",
|
|
29
|
+
"conversation.chat.node | context | packages/client/ui-chat/src/client/chat/register-node-renderers.ts",
|
|
30
|
+
"conversation.chat.node | manual-compaction | packages/client/ui-chat/src/client/chat/register-node-renderers.ts",
|
|
31
|
+
"conversation.chat.node | model-retry | packages/client/ui-chat/src/client/chat/register-node-renderers.ts",
|
|
32
|
+
"conversation.chat.node | steering | packages/client/ui-chat/src/client/chat/register-node-renderers.ts",
|
|
33
|
+
"conversation.chat.node | system-prompt | packages/client/ui-chat/src/client/chat/register-node-renderers.ts",
|
|
34
|
+
"conversation.chat.node | tool-call | packages/client/ui-tool/src/client/apply.ts",
|
|
35
|
+
"conversation.chat.node | turn-error | packages/client/ui-chat/src/client/chat/register-node-renderers.ts",
|
|
36
|
+
"conversation.chat.node | turn-max-tokens | packages/client/ui-chat/src/client/chat/register-node-renderers.ts",
|
|
37
|
+
"conversation.chat.node | turn-process | packages/client/ui-chat/src/client/chat/register-node-renderers.ts",
|
|
38
|
+
"conversation.chat.node | turn-tail | packages/client/ui-chat/src/client/chat/register-node-renderers.ts",
|
|
39
|
+
"conversation.chat.node | unknown | packages/client/ui-chat/src/client/chat/register-node-renderers.ts",
|
|
40
|
+
"conversation.chat.node | user | packages/client/ui-chat/src/client/chat/register-node-renderers.ts",
|
|
41
|
+
"conversation.chat.node | workflow-run | packages/client/ui-workflow-run/src/client/index.ts",
|
|
42
|
+
"conversation.chat.turnTail | (chain/single) | packages/client/ui-deliverables/src/client/index.ts",
|
|
43
|
+
"conversation.message.images | (chain/single) | packages/client/ui-attachment/src/client/index.ts",
|
|
44
|
+
"tool.call.images | (chain/single) | packages/client/ui-attachment/src/client/index.ts",
|
|
45
|
+
"tool.call.toolview | ask_user_question | packages/client/ui-tool/src/client/tool/toolviews/ask-question-row.tsx",
|
|
46
|
+
"tool.call.toolview | bash | packages/client/ui-tool/src/client/tool/toolviews/bash-sample.tsx",
|
|
47
|
+
"tool.call.toolview | edit | packages/client/ui-tool/src/client/tool/toolviews/file-mutation-row.tsx",
|
|
48
|
+
"tool.call.toolview | glob | packages/client/ui-tool/src/client/tool/toolviews/search-row.tsx",
|
|
49
|
+
"tool.call.toolview | grep | packages/client/ui-tool/src/client/tool/toolviews/search-row.tsx",
|
|
50
|
+
"tool.call.toolview | present | packages/client/ui-deliverables/src/client/index.ts",
|
|
51
|
+
"tool.call.toolview | read | packages/client/ui-tool/src/client/tool/toolviews/read-row.tsx",
|
|
52
|
+
"tool.call.toolview | read_image | packages/client/ui-tool/src/client/tool/toolviews/read-image-row.tsx",
|
|
53
|
+
"tool.call.toolview | skill | packages/client/ui-skill/src/client/index.ts",
|
|
54
|
+
"tool.call.toolview | todo_write | packages/client/ui-tool/src/client/tool/toolviews/todo-row.tsx",
|
|
55
|
+
"tool.call.toolview | web_fetch | packages/client/ui-tool/src/client/tool/toolviews/web-row.tsx",
|
|
56
|
+
"tool.call.toolview | web_search | packages/client/ui-tool/src/client/tool/toolviews/web-row.tsx",
|
|
57
|
+
"tool.call.toolview | write | packages/client/ui-tool/src/client/tool/toolviews/file-mutation-row.tsx"
|
|
58
|
+
]
|
|
59
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
# 官方能力接入说明
|
|
2
|
+
|
|
3
|
+
`0.3.0` 在 `v0.2.1` 的阅读布局上接入官方内容和控件,经过试用验收后发布。当前验收目标是 Harness `0.1.5-rc.2`。后续仍需维护的自有展示逻辑和升级边界见下文。
|
|
4
|
+
|
|
5
|
+
## 一个具体例子
|
|
6
|
+
|
|
7
|
+
一条回答的持久化 `messageId` 进入 `OfficialActions`,随后进入 Reader 自己的回答操作插槽。里面的反馈组件、状态注入和弹窗控制器来自当前已加载的官方反馈插件。点击按钮后,由官方控制器打开原来的官方弹窗;Reader 不实现反馈请求、类别或状态管理。
|
|
8
|
+
|
|
9
|
+
工具详情同理:传递 `callId`、原始 `block`、工作目录、Host home、图片加载器、带行号的文件打开操作和轨迹入口,再由官方工具组件呈现。原来只取函数组件、手工传四个参数并模拟点击展开的路径已经移除。
|
|
10
|
+
|
|
11
|
+
## 代码归属
|
|
12
|
+
|
|
13
|
+
| 模块 | 负责什么 |
|
|
14
|
+
| --- | --- |
|
|
15
|
+
| `official-slots.tsx` | 用公开注册表 API 将官方注册信息映射到 Reader 的独立插槽;保留注入、locale、store、selector 和子插槽。监听贡献增删,逐条挂载和释放。 |
|
|
16
|
+
| `OfficialContent.tsx` | 将回答身份、工具、节点和产物上下文传给官方控件。这里只组合,不处理业务请求。 |
|
|
17
|
+
| `Reader.tsx`、`ToolActivity.tsx` | 原有阅读布局、过程组织、摘要和交互。工具详情里的控件采用官方形式。 |
|
|
18
|
+
| `platform-media.ts` | RC2 的本地媒体 URL 约定;读取授权仍由 Host 文件 API 负责。 |
|
|
19
|
+
| `compat/harness-rc2.json` | 已验收的官方接口、被自有展示覆盖的实现和注册清单基线。 |
|
|
20
|
+
|
|
21
|
+
## 为什么有插槽映射
|
|
22
|
+
|
|
23
|
+
RC2 的一个子插槽只能有一个声明者,只有声明它的组件能获得相应 `renderSlot` 权限。Reader 不能把官方插槽再声明一次,也不能从 `ctx.slots` 任意渲染子插槽。
|
|
24
|
+
|
|
25
|
+
本适配用 `spec`、`entriesOfSlot`、`register`、`inject`、`subscribe` 建立 Reader 自己的名字空间,交给同一个官方渲染器运行。组件声明的子插槽名称在一层薄包装中转换,其余属性原样传递。没有私有源码导入,没有修改官方注册对象或官方 DOM,没有复制官方渲染器。现有控件保持组件和注入身份;增加别的控件不会重挂它们。
|
|
26
|
+
|
|
27
|
+
这仍是 RC2 的受限适配方案。若官方将来提供可直接组合的共享渲染入口,应优先替换这层映射。
|
|
28
|
+
|
|
29
|
+
## 这版覆盖的能力
|
|
30
|
+
|
|
31
|
+
| 能力 | 处理方式 |
|
|
32
|
+
| --- | --- |
|
|
33
|
+
| 回答操作、反馈 | 官方 `conversation.chat.assistant-actions`,使用持久化 messageId;中断的临时片段不伪造身份。 |
|
|
34
|
+
| 工具详情 | 官方 `tool.call.toolview`,包括 memo、注入状态、翻译和递归子插槽;未注册的工具保留原有结果预览。 |
|
|
35
|
+
| 显式 `present` 产物 | 官方 turnTail 中的文件卡片和菜单,保留官方状态和打开操作。 |
|
|
36
|
+
| 已修改文件快捷操作 | 保持原 Reader 的复制、定位和打开模式;仅从 Reader 的官方 tail 展示参数中排除重复的 produced chips,不改变官方源数据。未知匹配结构原样呈现。 |
|
|
37
|
+
| 文件行号和正文文件链接 | 保留工具传来的行号;正文优先采用官方 file-mention 服务,现有路径匹配作为补充。 |
|
|
38
|
+
| 本地 Markdown 图片 | 和 RC2 相同的同源文件 API,加载失败保留替代文本,危险协议不直接渲染。 |
|
|
39
|
+
| 命令、新节点类型 | 接入官方节点渲染及其子插槽;无可用渲染器时保留记录并提供“在对话中查看”。 |
|
|
40
|
+
|
|
41
|
+
阅读布局、折叠、逐字动效、阅读速度、默认设置保持现版。移除了未被使用的全局 `body.dataset.readerFolding` 写入。
|
|
42
|
+
|
|
43
|
+
## 验证与升级
|
|
44
|
+
|
|
45
|
+
在选定 Harness 运行时上执行:
|
|
46
|
+
|
|
47
|
+
```sh
|
|
48
|
+
node scripts/link-harness-dependencies.mjs "$DSHX_HARNESS"
|
|
49
|
+
npm run build
|
|
50
|
+
npm test
|
|
51
|
+
npm run test:official
|
|
52
|
+
npm run test:auto-fold
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
`test:official` 使用测试目标里的真实官方 SlotRegistry、React renderer、反馈插件、ReadRow 和 Deliverables,只有远程业务服务使用内存替身。测试私有源码仅用于验证,不进入交付 bundle。浏览器验证使用本机固定的 Codex Playwright runtime,不附着用户会话。
|
|
56
|
+
|
|
57
|
+
`test:auto-fold` 使用真实 Reader 和独立的全局、会话 store,验证关闭后阅读再开启、此前步骤、设置同步、文本选择及连续切换;分别覆盖普通动画和减少动态效果。
|
|
58
|
+
|
|
59
|
+
`build` 先检查兼容基线。Harness 版本、敏感接口、尚未收敛的官方实现或相关注册清单改变时,构建明确要求审查。审查差异并通过功能与视觉测试后,才可运行 `check-harness-compat.mjs --record` 记录新基线。记录本身不构成兼容证明。
|
|
60
|
+
|
|
61
|
+
## 后续仍需完成
|
|
62
|
+
|
|
63
|
+
Markdown 定制仍保留逐字动效和 MCP 展示钩子,官方公共组件还没有对应的注入接口。上下文行、部分过程展示和工具摘要也仍有自有实现。本分支先建立官方能力的完整运行路径,后续按视觉基线逐模块收敛这些副本,并拆分 Reader 的阅读策略与动画执行。不能据此承诺所有未来版本零维护,也不承诺任意第三方插件兼容。
|
|
64
|
+
|
|
65
|
+
已有客户端通过 HMR 更新时,无需新增 Host 或改写会话数据;应先核对实际安装来源、构建产物和同页行为。正式版本保留 Git 标签及发布包,便于按版本安装和回退。
|