@deepseek-ai/dsh-client-ui-chat 0.1.6-alpha.1 → 0.1.6-alpha.2
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.i18n.yaml +2 -2
- package/README.md +4 -2
- package/README.zh.md +4 -2
- package/lib/client.js +49 -34
- package/lib/types/client/chat/ChatView.d.ts +1 -1
- package/lib/types/client/chat/ReasoningRow.d.ts +3 -3
- package/lib/types/client/chat/TurnTailNodeView.d.ts +1 -1
- package/lib/types/client/contract/slots.d.ts +6 -4
- package/package.json +34 -32
package/README.i18n.yaml
CHANGED
|
@@ -2,5 +2,5 @@
|
|
|
2
2
|
# side as of the last confirmed-consistent state. Both languages carry equal authority;
|
|
3
3
|
# after editing either side, bring the other along and re-record with:
|
|
4
4
|
# pnpm run verify-translation-pairing --write packages/client/ui-chat/README.md
|
|
5
|
-
README.md:
|
|
6
|
-
README.zh.md:
|
|
5
|
+
README.md: e7d3efe37e089f4b7bcbb7d954e6791899cebfc0
|
|
6
|
+
README.zh.md: 8b49332ad39d373fcc2aae66af2e7c284bfee9bb
|
package/README.md
CHANGED
|
@@ -29,7 +29,9 @@ File-mention providers receive the viewed Session ID with the closing-turn owner
|
|
|
29
29
|
<a id="reference-previews"></a>
|
|
30
30
|
## Reference previews
|
|
31
31
|
|
|
32
|
-
|
|
32
|
+
Chat supplies file and HTTP(S) navigation through one `MarkdownDelegateProvider` around its node list. Assistant Markdown file links open in the right Sidebar after the message settles, including references to unmodified files. Relative paths resolve in the viewed Session's workspace; absolute paths retain the same Session's filesystem access. `#L24` and `#L24-L30` navigate to the first specified line and reuse an existing file tab. Missing files show the preview's error state.
|
|
33
|
+
|
|
34
|
+
HTTP(S) links in Assistant Markdown open a new right-Sidebar Browser tab on ordinary clicks when that type is registered, or the system browser otherwise; modified clicks retain the native external-link behavior. Sent file references and skills confirmed by the message’s logged invocation also open in the right Sidebar. File paths use the viewed Session; skill names resolve through its current input-trigger source. Both use the prose file-link dotted underline on hover or focus. Sessions, directories, and command labels remain non-navigating references.
|
|
33
35
|
|
|
34
36
|
<a id="system-prompt-row"></a>
|
|
35
37
|
## System prompt row
|
|
@@ -53,7 +55,7 @@ The completed-turn action footer starts 20px below the preceding prose or extens
|
|
|
53
55
|
<a id="turn-process-folding"></a>
|
|
54
56
|
## Turn Process Folding
|
|
55
57
|
|
|
56
|
-
Each reasoning row starts collapsed, including during streaming and in reasoning-only replies. Clicking the row opens or closes its complete
|
|
58
|
+
Each reasoning row starts collapsed, including during streaming and in reasoning-only replies. Clicking the row opens or closes its complete Markdown; incoming answer text, Tool calls, and stream completion preserve that choice. Expanded reasoning uses compact secondary typography: headings add bold weight without changing text size, line height, or color. The collapsed summary stays on one line, follows the latest reasoning line while streaming, and shows the first line after settlement.
|
|
57
59
|
|
|
58
60
|
Settings → General exposes a persisted, localized `Normal` / `Compact` conversation-display preference in the `ui-chat` namespace; `Compact` is the default. Normal leaves process rows visible and renders no Turn-process control. In Compact mode, the System prompt remains independently visible before the opening User throughout the Turn. Context injection, reasoning, Assistant material, Tool rows, and Retry rows remain expanded while a Turn is open. At `turn/end`, its latest Step becomes the final-answer boundary only when it contains non-blank text, an image, or an unknown visible block—and no Tool-call block; preceding Context injection, reasoning, earlier Assistant material, Tool rows, and Retry rows then collapse by default. The control reports Turn-wide durable counts for non-subagent Tool calls, reply-bearing Assistant messages before the final answer, and subagent delegation calls; zero-valued segments are omitted, the Tool and subagent figures are mutually exclusive, and neither System prompt nor Context injection contributes a count. When all three counts are zero, the process still folds and the control reads `Thought for a while`. A full-width divider below the summary separates it from the answer or expanded process rows. User and steering messages, System prompt, error, max-token, and turn-tail rows stay outside, and a closed Turn with no final answer keeps all process evidence visible. A newly available process control is inserted without changing the relative order of existing rows: opening human input precedes the control and process rows from their first projection, while System prompt remains above that input. While older history remains available through Load earlier, process controls stay absent and no members are hidden; once history is complete, every eligible closed Turn uses the collapsed default immediately. Stable Chat Node Seats keep every renderer mounted, hidden members add no flow spacing, and a closed control sits 8px above its answer only when no independent input intervenes. Completion collapse does not depend on tail-follow position, so a reader above the tail may see the transcript reflow. An automatic collapse that would hide keyboard focus keeps the group open and leaves focus in place; a manual close focuses the process control before hiding its members. The session-scoped store records only manually expanded Turn-and-answer-Step generations; a different answer generation starts collapsed.
|
|
59
61
|
|
package/README.zh.md
CHANGED
|
@@ -29,7 +29,9 @@ kind: "package-reference"
|
|
|
29
29
|
<a id="reference-previews"></a>
|
|
30
30
|
## 引用预览
|
|
31
31
|
|
|
32
|
-
|
|
32
|
+
Chat 在节点列表外通过一个 `MarkdownDelegateProvider` 提供文件及 HTTP(S) 导航。Assistant Markdown 文件链接在消息落定后可于右侧栏打开,包括未修改文件的引用。相对路径基于当前查看的 Session 工作区解析;绝对路径仍使用同一 Session 的文件系统访问。`#L24` 和 `#L24-L30` 定位到指定起始行,并复用现有文件标签。文件缺失时显示预览错误状态。
|
|
33
|
+
|
|
34
|
+
Assistant Markdown 中的 HTTP(S) 链接在普通点击时会在该类型已注册时打开新的右侧 Sidebar Browser tab,否则改用系统浏览器;带修饰键的点击保留原生外部链接行为。已发送的文件引用及消息日志确认调用的 skill 也可在右侧栏打开预览。文件路径使用当前查看的 Session;skill 名称由该 Session 当前的输入触发源解析。两者悬停或聚焦时均使用正文文件链接的虚线下划线。会话、目录和命令标签仍只作为引用展示。
|
|
33
35
|
|
|
34
36
|
<a id="system-prompt-row"></a>
|
|
35
37
|
## 系统提示词行
|
|
@@ -55,7 +57,7 @@ Assistant 回复结算后,已完成轮次的计时对话框不显示 TTFT 和
|
|
|
55
57
|
<a id="turn-process-folding"></a>
|
|
56
58
|
## 轮次过程折叠
|
|
57
59
|
|
|
58
|
-
|
|
60
|
+
每个思考行初始都折叠,包括流式输出期间和仅含思考的回复。点击该行可展开或收起完整 Markdown;后续回答文本、工具调用和流结束都保留用户的选择。展开的思考采用紧凑的次级排版:标题只加粗,不改变字号、行高或颜色。折叠摘要保持单行,在流式输出期间跟随最新思考行,结算后显示第一行。
|
|
59
61
|
|
|
60
62
|
「设置 → 通用设置」提供持久化到 `ui-chat` 命名空间的「标准」/「紧凑」对话显示偏好,默认使用「紧凑」。标准模式保持所有过程行可见且不渲染轮次过程控件。紧凑模式下,系统提示词在整个轮次中始终独立显示于开场 User 上方。轮次打开期间,上下文注入、推理、Assistant 内容、工具行与重试行始终展开。到 `turn/end` 时,最后一个步骤只有在包含非空文本、图片或未知可见块且不含工具调用块时才成为最终答案边界;边界之前的上下文注入、推理、较早 Assistant 内容、工具行与重试行随后默认收起。控件展示覆盖整个轮次的非 subagent 工具调用数、最终答案之前带回复内容的 Assistant 消息数和 subagent 委派数;值为 0 的分段省略,工具调用与 subagent 两项互斥,系统提示词与上下文注入都不增加计数。三项全为 0 时过程仍会收起,控件标题显示「已思考」(英文为 `Thought for a while`)。摘要下方的通栏分隔线将其与正文或展开后的过程行隔开。用户与 steering 消息、系统提示词、错误、最大 token 与 turn-tail 行留在过程组外;关闭时没有最终答案的轮次保留全部过程证据。新的过程控件插入时不会改变既有行的相对顺序:开场人工输入从首次投影起便位于控件和过程行之前,系统提示词则始终位于该输入上方。只要仍可通过「加载更早」获取历史,过程控件就不出现,也不会隐藏任何成员;历史加载完整后,每个合格的已关闭轮次立即使用默认收起状态。稳定 Chat Node Seat 会让每个 renderer 保持挂载,隐藏成员不产生消息流间距;只有中间没有独立输入时,收起控件才与正文相隔 8px。完成后的收起不依赖是否跟随尾部,因此正在上方阅读的用户可能看到 transcript 重排。若自动收起会隐藏当前键盘焦点,则过程组保持展开且焦点留在原处;手动收起会先把焦点移到过程控件,再隐藏成员。会话作用域存储只记录用户手动展开的「轮次 + 正文步骤」generation;不同正文 generation 默认收起。
|
|
61
63
|
|
package/lib/client.js
CHANGED
|
@@ -2030,7 +2030,7 @@ window.__ModuleLoader__.load({
|
|
|
2030
2030
|
* atomic — no duplicate, no gap — regardless of when the echo leaves the
|
|
2031
2031
|
* session snapshot.
|
|
2032
2032
|
*/
|
|
2033
|
-
function observedRpcIds(order, nodes,
|
|
2033
|
+
function observedRpcIds(order, nodes, inbox) {
|
|
2034
2034
|
const observed = /* @__PURE__ */ new Set();
|
|
2035
2035
|
for (const key of order) {
|
|
2036
2036
|
const node = nodes.get(key);
|
|
@@ -2038,7 +2038,7 @@ window.__ModuleLoader__.load({
|
|
|
2038
2038
|
const source = node.data.source;
|
|
2039
2039
|
if (source?.kind === "user" && typeof source.rpcId === "string") observed.add(source.rpcId);
|
|
2040
2040
|
}
|
|
2041
|
-
for (const
|
|
2041
|
+
for (const { source } of [...inbox?.["next-turn"] ?? [], ...inbox?.["next-step"] ?? []]) if (source.kind === "user" && "rpcId" in source) observed.add(source.rpcId);
|
|
2042
2042
|
return observed;
|
|
2043
2043
|
}
|
|
2044
2044
|
function runningTurnStartTime(timeline) {
|
|
@@ -2083,14 +2083,14 @@ window.__ModuleLoader__.load({
|
|
|
2083
2083
|
* The chat view slot entry: pure component over the composed props; each
|
|
2084
2084
|
* ordered business Node crosses the keyed renderer seat.
|
|
2085
2085
|
*/
|
|
2086
|
-
function ChatView({ useSession, useChat, useChatNode, useChatNodeProcess, useSessions, useStore, actions, renderSlot, sessionId, openFile, openSkill, loadOlder, loadThrough, loadImage, openView, chatScroll, forkAt, fileMentions, useTranscriptView, useProjection, t }) {
|
|
2086
|
+
function ChatView({ useSession, useChat, useChatNode, useChatNodeProcess, useSessions, useStore, actions, renderSlot, sessionId, openFile, openSkill, openExternalLink, loadOlder, loadThrough, loadImage, openView, chatScroll, forkAt, fileMentions, useTranscriptView, useProjection, t }) {
|
|
2087
2087
|
const order = useChat((s) => s.order);
|
|
2088
2088
|
const nodeStore = useChat((s) => s.nodes);
|
|
2089
2089
|
const turnNavigationItems = useChat((s) => s.navigation.items());
|
|
2090
2090
|
const turnOutline = useProjection("turnOutline");
|
|
2091
2091
|
const railItems = (0, react.useMemo)(() => mergeTurnRailItems(turnNavigationItems, turnOutline), [turnNavigationItems, turnOutline]);
|
|
2092
2092
|
const timeline = useChat((s) => s.timeline);
|
|
2093
|
-
const inbox =
|
|
2093
|
+
const inbox = useProjection("inbox");
|
|
2094
2094
|
const cwd = useSessions((s) => s.byId[sessionId]?.cwd);
|
|
2095
2095
|
const running = useSession((s) => s.running);
|
|
2096
2096
|
const openState = useSession((s) => s.openState);
|
|
@@ -2125,7 +2125,7 @@ window.__ModuleLoader__.load({
|
|
|
2125
2125
|
setFileOpenError(null);
|
|
2126
2126
|
setFileOpenBusy(false);
|
|
2127
2127
|
}, []);
|
|
2128
|
-
const pendingSteering = (0, react.useMemo)(() => inbox.filter((
|
|
2128
|
+
const pendingSteering = (0, react.useMemo)(() => inbox?.["next-step"].filter((message) => message.source.kind === "user") ?? [], [inbox]);
|
|
2129
2129
|
const pendingSubmissions = useSession((s) => s.pendingSubmissions);
|
|
2130
2130
|
const visibleSubmissions = (0, react.useMemo)(() => {
|
|
2131
2131
|
if (pendingSubmissions.length === 0) return pendingSubmissions;
|
|
@@ -2546,24 +2546,28 @@ window.__ModuleLoader__.load({
|
|
|
2546
2546
|
children: loadingOlder ? t("loading") : t("chat.loadOlder")
|
|
2547
2547
|
})
|
|
2548
2548
|
}),
|
|
2549
|
-
(0, react_jsx_runtime.jsx)(
|
|
2550
|
-
|
|
2551
|
-
useChatNode,
|
|
2552
|
-
useChatNodeProcess,
|
|
2553
|
-
historyIncomplete: hasMore,
|
|
2554
|
-
compactTranscript,
|
|
2555
|
-
useStore,
|
|
2556
|
-
actions,
|
|
2557
|
-
cwd,
|
|
2549
|
+
(0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.MarkdownDelegateProvider, {
|
|
2550
|
+
openExternalLink,
|
|
2558
2551
|
openFile: requestOpenFile,
|
|
2559
|
-
|
|
2560
|
-
|
|
2561
|
-
|
|
2562
|
-
|
|
2563
|
-
|
|
2564
|
-
|
|
2565
|
-
|
|
2566
|
-
|
|
2552
|
+
children: (0, react_jsx_runtime.jsx)(ChatNodeList, {
|
|
2553
|
+
order,
|
|
2554
|
+
useChatNode,
|
|
2555
|
+
useChatNodeProcess,
|
|
2556
|
+
historyIncomplete: hasMore,
|
|
2557
|
+
compactTranscript,
|
|
2558
|
+
useStore,
|
|
2559
|
+
actions,
|
|
2560
|
+
cwd,
|
|
2561
|
+
openFile: requestOpenFile,
|
|
2562
|
+
openSkill,
|
|
2563
|
+
inspectCall,
|
|
2564
|
+
forkAt,
|
|
2565
|
+
loadImage,
|
|
2566
|
+
renderMessageImages,
|
|
2567
|
+
fileMentions,
|
|
2568
|
+
renderSlot,
|
|
2569
|
+
t
|
|
2570
|
+
})
|
|
2567
2571
|
}),
|
|
2568
2572
|
running && (0, react_jsx_runtime.jsx)(TurnStatus, {
|
|
2569
2573
|
startTime: runningTurnStart,
|
|
@@ -2862,7 +2866,7 @@ window.__ModuleLoader__.load({
|
|
|
2862
2866
|
var accessibility_module_css_default = { "visuallyHidden": "TTCZqG_visuallyHidden" };
|
|
2863
2867
|
//#endregion
|
|
2864
2868
|
//#region \0dsh-css:/home/runner/work/deepseek-harness/deepseek-harness/packages/client/ui-chat/src/client/chat/ReasoningRow.module.css.mjs
|
|
2865
|
-
const css$8 = ".lcKema_root{flex-direction:column;display:flex}.lcKema_root:not([data-expanded]){contain:size layout;height:calc(24px + var(--dsh-content-font-delta,0px))}.lcKema_row{position:relative;overflow:hidden}.lcKema_root[data-expanded] [data-open] [data-disclosure-row]{z-index:1;background:var(--dsw-alias-bg-base);position:sticky;top:0}.lcKema_root[data-state=running] .lcKema_row:after{content:\"\";inset-block:0;background:linear-gradient(90deg, transparent 0%, color-mix(in srgb, var(--dsw-alias-bg-base) 60%, transparent) 55%, transparent 100%);pointer-events:none;width:300px;animation:2.6s ease-out infinite lcKema_dsh-reasoning-row-sweep;position:absolute;left:0}@keyframes lcKema_dsh-reasoning-row-sweep{0%{left:-300px}90%,to{left:100%}}.lcKema_leading{flex-shrink:0}.lcKema_chevron{color:var(--dsw-alias-label-secondary)}.lcKema_title{font-weight:400}.lcKema_separator{background:var(--dsw-alias-label-caption);border-radius:1px;flex:none;width:2px;height:2px;margin:0 8px}.lcKema_summary{min-width:0;color:var(--dsw-alias-label-tertiary);font-size:var(--dsh-content-font-size-secondary,13px);line-height:calc(20px + var(--dsh-content-font-delta-secondary,0px));white-space:nowrap;flex:auto;overflow:hidden}.lcKema_summaryText{text-overflow:ellipsis;display:block;overflow:hidden}.lcKema_summary[data-follow-end]{justify-content:flex-end;display:flex}.lcKema_summary[data-follow-end] .lcKema_summaryText{text-align:start;text-overflow:clip;flex:none;width:max-content;min-width:100%;overflow:visible}.lcKema_thinkBody{padding:4px 0 4px calc(22px + var(--dsh-content-font-delta,0px));
|
|
2869
|
+
const css$8 = ".lcKema_root{flex-direction:column;display:flex}.lcKema_root:not([data-expanded]){contain:size layout;height:calc(24px + var(--dsh-content-font-delta,0px))}.lcKema_row{position:relative;overflow:hidden}.lcKema_root[data-expanded] [data-open] [data-disclosure-row]{z-index:1;background:var(--dsw-alias-bg-base);position:sticky;top:0}.lcKema_root[data-state=running] .lcKema_row:after{content:\"\";inset-block:0;background:linear-gradient(90deg, transparent 0%, color-mix(in srgb, var(--dsw-alias-bg-base) 60%, transparent) 55%, transparent 100%);pointer-events:none;width:300px;animation:2.6s ease-out infinite lcKema_dsh-reasoning-row-sweep;position:absolute;left:0}@keyframes lcKema_dsh-reasoning-row-sweep{0%{left:-300px}90%,to{left:100%}}.lcKema_leading{flex-shrink:0}.lcKema_chevron{color:var(--dsw-alias-label-secondary)}.lcKema_title{font-weight:400}.lcKema_separator{background:var(--dsw-alias-label-caption);border-radius:1px;flex:none;width:2px;height:2px;margin:0 8px}.lcKema_summary{min-width:0;color:var(--dsw-alias-label-tertiary);font-size:var(--dsh-content-font-size-secondary,13px);line-height:calc(20px + var(--dsh-content-font-delta-secondary,0px));white-space:nowrap;flex:auto;overflow:hidden}.lcKema_summaryText{text-overflow:ellipsis;display:block;overflow:hidden}.lcKema_summary[data-follow-end]{justify-content:flex-end;display:flex}.lcKema_summary[data-follow-end] .lcKema_summaryText{text-align:start;text-overflow:clip;flex:none;width:max-content;min-width:100%;overflow:visible}.lcKema_thinkBody{padding:4px 0 4px calc(22px + var(--dsh-content-font-delta,0px));min-width:0}@media (prefers-reduced-motion:reduce){.lcKema_root[data-state=running] .lcKema_row:after{animation:none}}";
|
|
2866
2870
|
const tagId$8 = "@deepseek-ai/dsh-client-ui-chat/ReasoningRow.module.css";
|
|
2867
2871
|
if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$8) + "]") === null) {
|
|
2868
2872
|
const tag = document.createElement("style");
|
|
@@ -2897,15 +2901,16 @@ window.__ModuleLoader__.load({
|
|
|
2897
2901
|
}
|
|
2898
2902
|
/**
|
|
2899
2903
|
* Render one assistant reasoning block collapsed until the reader opens it. The
|
|
2900
|
-
* collapsed summary omits double-asterisk markers; expanded content
|
|
2901
|
-
* the complete
|
|
2904
|
+
* collapsed summary omits double-asterisk markers; expanded content renders
|
|
2905
|
+
* the complete Markdown with secondary typography.
|
|
2902
2906
|
* @param props.text - complete or streaming reasoning text.
|
|
2903
2907
|
* @param props.running - whether this block is the streaming tail.
|
|
2904
|
-
* @param props.t - conversation locale seat for
|
|
2908
|
+
* @param props.t - conversation locale seat for status and Markdown actions.
|
|
2905
2909
|
* @returns the reasoning disclosure.
|
|
2906
2910
|
*/
|
|
2907
2911
|
function ReasoningRow({ text, running, t }) {
|
|
2908
2912
|
const [expanded, setExpanded] = (0, react.useState)(false);
|
|
2913
|
+
const labels = (0, react.useMemo)(() => markdownLabels(t), [t]);
|
|
2909
2914
|
const summary = (running ? latestLine(text) : firstLine(text)).replaceAll("**", "");
|
|
2910
2915
|
return (0, react_jsx_runtime.jsxs)("div", {
|
|
2911
2916
|
className: ReasoningRow_module_css_default.root,
|
|
@@ -2941,14 +2946,19 @@ window.__ModuleLoader__.load({
|
|
|
2941
2946
|
})] }),
|
|
2942
2947
|
children: (0, react_jsx_runtime.jsx)("div", {
|
|
2943
2948
|
className: ReasoningRow_module_css_default.thinkBody,
|
|
2944
|
-
children:
|
|
2949
|
+
children: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.MarkdownText, {
|
|
2950
|
+
text,
|
|
2951
|
+
streaming: running,
|
|
2952
|
+
labels,
|
|
2953
|
+
variant: "compact"
|
|
2954
|
+
})
|
|
2945
2955
|
})
|
|
2946
2956
|
})]
|
|
2947
2957
|
});
|
|
2948
2958
|
}
|
|
2949
2959
|
//#endregion
|
|
2950
2960
|
//#region \0dsh-css:/home/runner/work/deepseek-harness/deepseek-harness/packages/client/ui-chat/src/client/chat/AssistantMarkdown.module.css.mjs
|
|
2951
|
-
const css$7 = ".hWmORq_root{font-size:var(--dsh-content-font-size,14px);line-height:calc(24px + var(--dsh-content-font-delta,0px));color:var(--dsw-alias-label-primary);flex-direction:column;display:flex}.hWmORq_body{flex-direction:column;gap:16px;display:flex}.hWmORq_body .md-table-wide{--dsh-table-spare:max(0px, calc((100cqw - var(--dsh-chat-content-width)) / 2));--dsh-table-lead:calc(var(--dsh-table-spare) + min(var(--dsh-chat-content-width), 100cqw) - 100%);box-sizing:border-box;width:calc(100% + var(--dsh-table-lead) + var(--dsh-table-spare));max-width:none;margin-left:calc(-1 * var(--dsh-table-lead));padding-left:var(--dsh-table-lead)}.hWmORq_body>[data-turn-process-inline][hidden]{margin-bottom:-16px}.hWmORq_stopped{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-tertiary);border-radius:6px;align-self:flex-start;padding:0 6px;font-size:11px;line-height:18px}.hWmORq_actions{margin-top:16px;margin-left:-6px}";
|
|
2961
|
+
const css$7 = ".hWmORq_root{font-size:var(--dsh-content-font-size,14px);line-height:calc(24px + var(--dsh-content-font-delta,0px));color:var(--dsw-alias-label-primary);flex-direction:column;display:flex}.hWmORq_body{flex-direction:column;gap:16px;display:flex}.hWmORq_body .md-table-wide{--dsh-table-spare:max(0px, calc((100cqw - var(--dsh-chat-content-width)) / 2));--dsh-table-lead:calc(var(--dsh-table-spare) + min(var(--dsh-chat-content-width), 100cqw) - 100%);box-sizing:border-box;width:calc(100% + var(--dsh-table-lead) + var(--dsh-table-spare));max-width:none;margin-left:calc(-1 * var(--dsh-table-lead));padding-left:var(--dsh-table-lead)}.hWmORq_body .md-table-wide>table{z-index:1;position:relative}.hWmORq_body>[data-turn-process-inline][hidden]{margin-bottom:-16px}.hWmORq_stopped{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-tertiary);border-radius:6px;align-self:flex-start;padding:0 6px;font-size:11px;line-height:18px}.hWmORq_actions{margin-top:16px;margin-left:-6px}";
|
|
2952
2962
|
const tagId$7 = "@deepseek-ai/dsh-client-ui-chat/AssistantMarkdown.module.css";
|
|
2953
2963
|
if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$7) + "]") === null) {
|
|
2954
2964
|
const tag = document.createElement("style");
|
|
@@ -3651,20 +3661,21 @@ window.__ModuleLoader__.load({
|
|
|
3651
3661
|
//#endregion
|
|
3652
3662
|
//#region lib/types/client/chat/TurnTailNodeView.js
|
|
3653
3663
|
/** Turn-local actions and feature tail over the Location index, independent of Assistant placement. */
|
|
3654
|
-
const TurnTailNodeView = (0, react.memo)(function TurnTailNodeView({ node, openFile, forkAt, renderSlot,
|
|
3664
|
+
const TurnTailNodeView = (0, react.memo)(function TurnTailNodeView({ node, openFile, forkAt, renderSlot, t, useChat }) {
|
|
3655
3665
|
const data = node.data;
|
|
3656
3666
|
const hasLaterChatNode = useChat((snapshot) => snapshot.locations.getTurn(data.turn).at(-1) !== node.key);
|
|
3657
3667
|
const isLatestTurn = useChat((snapshot) => snapshot.timeline.turnOrder.at(-1) === data.turn);
|
|
3658
3668
|
const turn = node.location.kind === "turn" || node.location.kind === "step" ? node.location.turn : void 0;
|
|
3659
3669
|
if (turn === void 0) return null;
|
|
3660
3670
|
const closing = data.closing;
|
|
3661
|
-
const tail =
|
|
3671
|
+
const tail = renderSlot("conversation.chat.turnTail", {
|
|
3662
3672
|
turn,
|
|
3663
3673
|
seq: closing?.finalNode.seq ?? data.seq,
|
|
3664
3674
|
openFile
|
|
3665
3675
|
});
|
|
3666
3676
|
if (closing === null) return tail === null ? null : (0, react_jsx_runtime.jsx)("div", {
|
|
3667
3677
|
className: TurnTailNodeView_module_css_default.root,
|
|
3678
|
+
"data-turn-tail": data.turn,
|
|
3668
3679
|
children: tail
|
|
3669
3680
|
});
|
|
3670
3681
|
const runMs = turn.start === void 0 || turn.end === void 0 ? void 0 : Math.max(0, turn.end.time - turn.start.time);
|
|
@@ -3774,7 +3785,7 @@ window.__ModuleLoader__.load({
|
|
|
3774
3785
|
locale: NS,
|
|
3775
3786
|
children: {
|
|
3776
3787
|
"conversation.chat.turnTail": {
|
|
3777
|
-
kind: "
|
|
3788
|
+
kind: "list",
|
|
3778
3789
|
scope: "session"
|
|
3779
3790
|
},
|
|
3780
3791
|
"conversation.chat.assistant-actions": {
|
|
@@ -3856,7 +3867,7 @@ window.__ModuleLoader__.load({
|
|
|
3856
3867
|
}
|
|
3857
3868
|
//#endregion
|
|
3858
3869
|
//#region \0dsh-css:/home/runner/work/deepseek-harness/deepseek-harness/packages/client/ui-chat/src/client/chat/StatsPills.module.css.mjs
|
|
3859
|
-
const css$1 = ".bOPqQW_root{
|
|
3870
|
+
const css$1 = ".bOPqQW_root{box-sizing:border-box;min-width:0;max-width:100%;font-size:var(--dsh-content-font-size-secondary,13px);line-height:calc(20px + var(--dsh-content-font-delta-secondary,0px));justify-content:center;gap:12px;display:flex}.bOPqQW_anchor{min-width:0;display:inline-flex}.bOPqQW_pill{box-sizing:border-box;max-width:100%;color:var(--dsw-alias-label-tertiary);font:inherit;font-variant-numeric:tabular-nums;line-height:inherit;white-space:nowrap;background:0 0;border:none;border-radius:24px;align-items:center;gap:6px;padding:1px 8px;display:inline-flex}.bOPqQW_pill svg{flex:none;width:14px;height:14px}button.bOPqQW_pill{cursor:pointer}button.bOPqQW_pill:hover,button.bOPqQW_pill[aria-expanded=true]{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-secondary)}.bOPqQW_label{text-overflow:ellipsis;min-width:0;overflow:hidden}.bOPqQW_sep{color:var(--dsw-alias-separator-primary);margin:0 6px}";
|
|
3860
3871
|
const tagId$1 = "@deepseek-ai/dsh-client-ui-chat/StatsPills.module.css";
|
|
3861
3872
|
if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$1) + "]") === null) {
|
|
3862
3873
|
const tag = document.createElement("style");
|
|
@@ -4103,7 +4114,6 @@ window.__ModuleLoader__.load({
|
|
|
4103
4114
|
if (stats.steps === 0 && !hasTokens) return null;
|
|
4104
4115
|
return (0, react_jsx_runtime.jsxs)("div", {
|
|
4105
4116
|
className: StatsPills_module_css_default.root,
|
|
4106
|
-
"data-composer-stats": true,
|
|
4107
4117
|
children: [stats.steps > 0 && (0, react_jsx_runtime.jsx)(TimePill, {
|
|
4108
4118
|
stats,
|
|
4109
4119
|
t,
|
|
@@ -8251,6 +8261,7 @@ window.__ModuleLoader__.load({
|
|
|
8251
8261
|
const inject = [
|
|
8252
8262
|
"slots",
|
|
8253
8263
|
"sessions",
|
|
8264
|
+
"uiWorkspace",
|
|
8254
8265
|
"uiSession",
|
|
8255
8266
|
"uiConversation",
|
|
8256
8267
|
"locale",
|
|
@@ -8346,6 +8357,10 @@ window.__ModuleLoader__.load({
|
|
|
8346
8357
|
if (scope === void 0) return;
|
|
8347
8358
|
ctx.get("inputTriggers")?.sessionOf(scope).openReference("skill", { ref: `/${name}` });
|
|
8348
8359
|
},
|
|
8360
|
+
openExternalLink: (url) => {
|
|
8361
|
+
if (ctx.get("sidebarRightTabs")?.get("browser") !== void 0) ctx.sidebarRight.openTab("browser", { params: { url } });
|
|
8362
|
+
else window.open(url, "_blank", "noopener,noreferrer");
|
|
8363
|
+
},
|
|
8349
8364
|
loadOlder: () => {
|
|
8350
8365
|
session.loadOlder();
|
|
8351
8366
|
},
|
|
@@ -8364,7 +8379,7 @@ window.__ModuleLoader__.load({
|
|
|
8364
8379
|
atSeq: seq,
|
|
8365
8380
|
increaseTitle: true
|
|
8366
8381
|
}).then((childId) => {
|
|
8367
|
-
ctx.
|
|
8382
|
+
ctx.uiWorkspace.openSession(childId);
|
|
8368
8383
|
}).catch(() => {});
|
|
8369
8384
|
}
|
|
8370
8385
|
};
|
|
@@ -3,5 +3,5 @@ import type { ChatViewSlotProps } from '../contract/slots.ts';
|
|
|
3
3
|
* The chat view slot entry: pure component over the composed props; each
|
|
4
4
|
* ordered business Node crosses the keyed renderer seat.
|
|
5
5
|
*/
|
|
6
|
-
export declare function ChatView({ useSession, useChat, useChatNode, useChatNodeProcess, useSessions, useStore, actions, renderSlot, sessionId, openFile, openSkill, loadOlder, loadThrough, loadImage, openView, chatScroll, forkAt, fileMentions, useTranscriptView, useProjection, t, }: ChatViewSlotProps): import("react").JSX.Element;
|
|
6
|
+
export declare function ChatView({ useSession, useChat, useChatNode, useChatNodeProcess, useSessions, useStore, actions, renderSlot, sessionId, openFile, openSkill, openExternalLink, loadOlder, loadThrough, loadImage, openView, chatScroll, forkAt, fileMentions, useTranscriptView, useProjection, t, }: ChatViewSlotProps): import("react").JSX.Element;
|
|
7
7
|
//# sourceMappingURL=ChatView.d.ts.map
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import type { ChatViewSlotProps } from '../contract/slots.ts';
|
|
2
2
|
/**
|
|
3
3
|
* Render one assistant reasoning block collapsed until the reader opens it. The
|
|
4
|
-
* collapsed summary omits double-asterisk markers; expanded content
|
|
5
|
-
* the complete
|
|
4
|
+
* collapsed summary omits double-asterisk markers; expanded content renders
|
|
5
|
+
* the complete Markdown with secondary typography.
|
|
6
6
|
* @param props.text - complete or streaming reasoning text.
|
|
7
7
|
* @param props.running - whether this block is the streaming tail.
|
|
8
|
-
* @param props.t - conversation locale seat for
|
|
8
|
+
* @param props.t - conversation locale seat for status and Markdown actions.
|
|
9
9
|
* @returns the reasoning disclosure.
|
|
10
10
|
*/
|
|
11
11
|
export declare function ReasoningRow({ text, running, t }: {
|
|
@@ -2,6 +2,6 @@ import type { PropsRenderSlots } from '@deepseek-ai/dsh-client-ui-slots';
|
|
|
2
2
|
import type { ChatNodeViewProps } from '../contract/slots.ts';
|
|
3
3
|
type TurnTailNodeViewProps = ChatNodeViewProps<'turn-tail'> & PropsRenderSlots<'conversation.chat.turnTail' | 'conversation.chat.assistant-actions'>;
|
|
4
4
|
/** Turn-local actions and feature tail over the Location index, independent of Assistant placement. */
|
|
5
|
-
export declare const TurnTailNodeView: import("react").MemoExoticComponent<({ node, openFile, forkAt, renderSlot,
|
|
5
|
+
export declare const TurnTailNodeView: import("react").MemoExoticComponent<({ node, openFile, forkAt, renderSlot, t, useChat, }: TurnTailNodeViewProps) => import("react").JSX.Element | null>;
|
|
6
6
|
export {};
|
|
7
7
|
//# sourceMappingURL=TurnTailNodeView.d.ts.map
|
|
@@ -114,6 +114,8 @@ export interface ChatViewInjected {
|
|
|
114
114
|
};
|
|
115
115
|
/** Open the current source file of a skill referenced by a sent message. */
|
|
116
116
|
openSkill: (name: string) => void;
|
|
117
|
+
/** Open one HTTP(S) message link in a Sidebar Browser tab. */
|
|
118
|
+
openExternalLink: (url: string) => void;
|
|
117
119
|
openFile: (path: string, options?: OpenFileOptions) => Promise<void>;
|
|
118
120
|
loadOlder: () => void;
|
|
119
121
|
/** Jump loader: page history back through seq; resolves when the window covers it. */
|
|
@@ -178,12 +180,12 @@ declare module '@deepseek-ai/dsh-client-ui-slots' {
|
|
|
178
180
|
owner: CommandRowOwnerProps;
|
|
179
181
|
};
|
|
180
182
|
/**
|
|
181
|
-
*
|
|
182
|
-
*
|
|
183
|
-
*
|
|
183
|
+
* Ordered feature contributions before a completed Turn's action row. Each
|
|
184
|
+
* entry receives the Turn, closing sequence, and file opener. A fresh `id`
|
|
185
|
+
* adds an entry; entries without content return null.
|
|
184
186
|
*/
|
|
185
187
|
'conversation.chat.turnTail': {
|
|
186
|
-
kind: '
|
|
188
|
+
kind: 'list';
|
|
187
189
|
scope: 'session';
|
|
188
190
|
owner: TurnTailOwnerProps;
|
|
189
191
|
};
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@deepseek-ai/dsh-client-ui-chat",
|
|
3
3
|
"description": "Chat Conversation target, node definitions, renderers, and details surface",
|
|
4
|
-
"version": "0.1.6-alpha.
|
|
4
|
+
"version": "0.1.6-alpha.2",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
7
7
|
},
|
|
@@ -53,37 +53,39 @@
|
|
|
53
53
|
"react": "^18.2.0",
|
|
54
54
|
"react-dom": "^18.2.0",
|
|
55
55
|
"@deepseek-ai/cordis": "^4.0.2",
|
|
56
|
-
"@deepseek-ai/dsh-agent": "^0.1.6-alpha.
|
|
57
|
-
"@deepseek-ai/dsh-api-
|
|
58
|
-
"@deepseek-ai/dsh-api-
|
|
59
|
-
"@deepseek-ai/dsh-
|
|
60
|
-
"@deepseek-ai/dsh-api-
|
|
61
|
-
"@deepseek-ai/dsh-
|
|
62
|
-
"@deepseek-ai/dsh-
|
|
63
|
-
"@deepseek-ai/dsh-client-store": "^0.1.6-alpha.
|
|
64
|
-
"@deepseek-ai/dsh-client-ui-
|
|
65
|
-
"@deepseek-ai/dsh-client-ui-
|
|
66
|
-
"@deepseek-ai/dsh-client-ui-
|
|
67
|
-
"@deepseek-ai/dsh-client-ui-
|
|
68
|
-
"@deepseek-ai/dsh-client-ui-
|
|
69
|
-
"@deepseek-ai/dsh-client-ui-session": "^0.1.6-alpha.
|
|
70
|
-
"@deepseek-ai/dsh-client-ui-
|
|
71
|
-
"@deepseek-ai/dsh-client-ui-
|
|
72
|
-
"@deepseek-ai/dsh-client-ui-sidebar-
|
|
73
|
-
"@deepseek-ai/dsh-client-ui-
|
|
74
|
-
"@deepseek-ai/dsh-client-ui-
|
|
75
|
-
"@deepseek-ai/dsh-
|
|
76
|
-
"@deepseek-ai/dsh-
|
|
77
|
-
"@deepseek-ai/dsh-
|
|
78
|
-
"@deepseek-ai/dsh-
|
|
79
|
-
"@deepseek-ai/dsh-
|
|
80
|
-
"@deepseek-ai/dsh-session-stats": "^0.1.6-alpha.
|
|
81
|
-
"@deepseek-ai/dsh-
|
|
82
|
-
"@deepseek-ai/dsh-
|
|
83
|
-
"@deepseek-ai/dsh-
|
|
84
|
-
"@deepseek-ai/dsh-
|
|
85
|
-
"@deepseek-ai/dsh-
|
|
86
|
-
"@deepseek-ai/dsh-
|
|
56
|
+
"@deepseek-ai/dsh-agent": "^0.1.6-alpha.2",
|
|
57
|
+
"@deepseek-ai/dsh-api-session-controller": "^0.1.6-alpha.2",
|
|
58
|
+
"@deepseek-ai/dsh-api-workspace-controller": "^0.1.6-alpha.2",
|
|
59
|
+
"@deepseek-ai/dsh-attachment": "^0.1.6-alpha.2",
|
|
60
|
+
"@deepseek-ai/dsh-api-remotes": "^0.1.6-alpha.2",
|
|
61
|
+
"@deepseek-ai/dsh-client-locale": "^0.1.6-alpha.2",
|
|
62
|
+
"@deepseek-ai/dsh-api-workspace-files": "^0.1.6-alpha.2",
|
|
63
|
+
"@deepseek-ai/dsh-client-store": "^0.1.6-alpha.2",
|
|
64
|
+
"@deepseek-ai/dsh-client-ui-approval": "^0.1.6-alpha.2",
|
|
65
|
+
"@deepseek-ai/dsh-client-ui-conversation": "^0.1.6-alpha.2",
|
|
66
|
+
"@deepseek-ai/dsh-client-ui-layout": "^0.1.6-alpha.2",
|
|
67
|
+
"@deepseek-ai/dsh-client-ui-primitives": "^0.1.6-alpha.2",
|
|
68
|
+
"@deepseek-ai/dsh-client-ui-renderer": "^0.1.6-alpha.2",
|
|
69
|
+
"@deepseek-ai/dsh-client-ui-session": "^0.1.6-alpha.2",
|
|
70
|
+
"@deepseek-ai/dsh-client-ui-input-trigger": "^0.1.6-alpha.2",
|
|
71
|
+
"@deepseek-ai/dsh-client-ui-settings": "^0.1.6-alpha.2",
|
|
72
|
+
"@deepseek-ai/dsh-client-ui-sidebar-browser": "^0.1.6-alpha.2",
|
|
73
|
+
"@deepseek-ai/dsh-client-ui-sidebar-documentpreview": "^0.1.6-alpha.2",
|
|
74
|
+
"@deepseek-ai/dsh-client-ui-sidebar-right": "^0.1.6-alpha.2",
|
|
75
|
+
"@deepseek-ai/dsh-client-ui-slots": "^0.1.6-alpha.2",
|
|
76
|
+
"@deepseek-ai/dsh-client-ui-workspace": "^0.1.6-alpha.2",
|
|
77
|
+
"@deepseek-ai/dsh-commands": "^0.1.6-alpha.2",
|
|
78
|
+
"@deepseek-ai/dsh-compaction": "^0.1.6-alpha.2",
|
|
79
|
+
"@deepseek-ai/dsh-llm": "^0.1.6-alpha.2",
|
|
80
|
+
"@deepseek-ai/dsh-session-stats": "^0.1.6-alpha.2",
|
|
81
|
+
"@deepseek-ai/dsh-session-turn-outline": "^0.1.6-alpha.2",
|
|
82
|
+
"@deepseek-ai/dsh-llm-retry": "^0.1.6-alpha.2",
|
|
83
|
+
"@deepseek-ai/dsh-session": "^0.1.6-alpha.2",
|
|
84
|
+
"@deepseek-ai/dsh-settings": "^0.1.6-alpha.2",
|
|
85
|
+
"@deepseek-ai/dsh-subagent": "^0.1.6-alpha.2",
|
|
86
|
+
"@deepseek-ai/dsh-token-meter": "^0.1.6-alpha.2",
|
|
87
|
+
"@deepseek-ai/dsh-util-workspace-path": "^0.1.6-alpha.2",
|
|
88
|
+
"@deepseek-ai/dsh-tools": "^0.1.6-alpha.2"
|
|
87
89
|
},
|
|
88
90
|
"dependencies": {
|
|
89
91
|
"@deepseek-ai/schemastery": "^3.18.2"
|