@qilin-agent/client-ui-chat 3.1.3 → 3.1.4
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 +25 -25
- package/README.md +12 -2
- package/README.zh.md +12 -2
- package/lib/client.js +2988 -2315
- package/lib/types/client/apply.d.ts +5 -0
- package/lib/types/client/chat/AssistantMarkdown.d.ts +7 -2
- package/lib/types/client/chat/AssistantNodeView.d.ts +3 -3
- package/lib/types/client/chat/ChatFlow.d.ts +4 -0
- package/lib/types/client/chat/ChatGroupSeat.d.ts +4 -3
- package/lib/types/client/chat/ChatNodeSeat.d.ts +11 -8
- package/lib/types/client/chat/ChatView.d.ts +1 -1
- package/lib/types/client/chat/ReasoningContent.d.ts +16 -0
- package/lib/types/client/chat/ReasoningRow.d.ts +5 -2
- package/lib/types/client/chat/flow-motion.d.ts +59 -0
- package/lib/types/client/chat/searchable-hidden.d.ts +10 -2
- package/lib/types/client/chat/use-chat-reading.d.ts +12 -4
- package/lib/types/client/chat/use-chat-scroll.d.ts +9 -1
- package/lib/types/client/chat/use-chat-viewport.d.ts +31 -3
- package/lib/types/client/chat/use-scroll-follow.d.ts +4 -3
- package/lib/types/client/contract/slots.d.ts +88 -6
- package/lib/types/client/contract/snapshot.d.ts +2 -0
- package/lib/types/client/contract/store.d.ts +3 -1
- package/lib/types/client/index.d.ts +1 -1
- package/lib/types/client/locale.d.ts +8 -0
- package/lib/types/client/presentation-policy.d.ts +16 -14
- package/lib/types/client/settings/TranscriptViewRow.d.ts +7 -2
- package/lib/types/client/stores.d.ts +11 -1
- package/lib/types/client/transcript-view.d.ts +13 -3
- package/package.json +37 -37
package/README.i18n.yaml
CHANGED
|
@@ -5,51 +5,51 @@
|
|
|
5
5
|
/:
|
|
6
6
|
en: d88f75fc0178ba53
|
|
7
7
|
zh: 52bc7ae9551ab1cf
|
|
8
|
-
/qilin-client-ui-chat:
|
|
9
|
-
en:
|
|
10
|
-
zh:
|
|
11
|
-
/qilin-client-ui-chat/summary:
|
|
8
|
+
/qilin-agent-client-ui-chat:
|
|
9
|
+
en: 55cb66320f8c0adc
|
|
10
|
+
zh: df25aa9bcf226129
|
|
11
|
+
/qilin-agent-client-ui-chat/summary:
|
|
12
12
|
en: 98d792dbc1b1975e
|
|
13
13
|
zh: 96acf5c3a5165047
|
|
14
|
-
/qilin-client-ui-chat/table-of-contents:
|
|
14
|
+
/qilin-agent-client-ui-chat/table-of-contents:
|
|
15
15
|
en: e7894dec53e4732d
|
|
16
16
|
zh: cdf9d812077b1741
|
|
17
|
-
/qilin-client-ui-chat/reference-previews:
|
|
17
|
+
/qilin-agent-client-ui-chat/reference-previews:
|
|
18
18
|
en: 66e17df4efe43eb8
|
|
19
19
|
zh: 82d91d704004d8f2
|
|
20
|
-
/qilin-client-ui-chat/system-prompt-row:
|
|
20
|
+
/qilin-agent-client-ui-chat/system-prompt-row:
|
|
21
21
|
en: 939728341ffbff11
|
|
22
22
|
zh: 74ec4ec5ca1fbd60
|
|
23
|
-
/qilin-client-ui-chat/turn-token-usage:
|
|
23
|
+
/qilin-agent-client-ui-chat/turn-token-usage:
|
|
24
24
|
en: a50c6802be7e4669
|
|
25
25
|
zh: 31233a9bd23fd04b
|
|
26
|
-
/qilin-client-ui-chat/completed-turn-footer:
|
|
26
|
+
/qilin-agent-client-ui-chat/completed-turn-footer:
|
|
27
27
|
en: bb3e55382117d78f
|
|
28
28
|
zh: 75a2b59c1a5cf9ce
|
|
29
|
-
/qilin-client-ui-chat/turn-process-folding:
|
|
30
|
-
en:
|
|
29
|
+
/qilin-agent-client-ui-chat/turn-process-folding:
|
|
30
|
+
en: d9b30a78f214ae90
|
|
31
31
|
zh: b33aef585fe6f756
|
|
32
|
-
/qilin-client-ui-chat/grouped-rendering:
|
|
33
|
-
en:
|
|
34
|
-
zh:
|
|
35
|
-
/qilin-client-ui-chat/turn-triggers:
|
|
32
|
+
/qilin-agent-client-ui-chat/grouped-rendering:
|
|
33
|
+
en: 60144aa1c496159f
|
|
34
|
+
zh: 67caa0891406578e
|
|
35
|
+
/qilin-agent-client-ui-chat/turn-triggers:
|
|
36
36
|
en: 4a2ec4ccc2f92b7c
|
|
37
37
|
zh: ac3f1402d0875ec4
|
|
38
|
-
/qilin-client-ui-chat/tool-call-nodes:
|
|
39
|
-
en:
|
|
40
|
-
zh:
|
|
41
|
-
/qilin-client-ui-chat/scroll-ownership:
|
|
42
|
-
en:
|
|
43
|
-
zh:
|
|
44
|
-
/qilin-client-ui-chat/model-experience:
|
|
38
|
+
/qilin-agent-client-ui-chat/tool-call-nodes:
|
|
39
|
+
en: 9d5d8bcce2e0e3c4
|
|
40
|
+
zh: ae109a2b3a807b92
|
|
41
|
+
/qilin-agent-client-ui-chat/scroll-ownership:
|
|
42
|
+
en: 65f44f8c91541f8f
|
|
43
|
+
zh: 9eec80f5360d936f
|
|
44
|
+
/qilin-agent-client-ui-chat/model-experience:
|
|
45
45
|
en: c17b4dd43a61c569
|
|
46
46
|
zh: f7414309810c3a08
|
|
47
|
-
/qilin-client-ui-chat/model-experience/kv-cache-effect:
|
|
47
|
+
/qilin-agent-client-ui-chat/model-experience/kv-cache-effect:
|
|
48
48
|
en: 15a7151ff9268f15
|
|
49
49
|
zh: 6eae68c718be579b
|
|
50
|
-
/qilin-client-ui-chat/known-limitations-and-deferred-work:
|
|
50
|
+
/qilin-agent-client-ui-chat/known-limitations-and-deferred-work:
|
|
51
51
|
en: f7e9784960922fb7
|
|
52
52
|
zh: 00df59b24fa66bf8
|
|
53
|
-
/qilin-client-ui-chat/known-limitations-and-deferred-work/dev-note:
|
|
53
|
+
/qilin-agent-client-ui-chat/known-limitations-and-deferred-work/dev-note:
|
|
54
54
|
en: e67f633dc6fe7773
|
|
55
55
|
zh: e88aeb617ffb74ea
|
package/README.md
CHANGED
|
@@ -71,6 +71,11 @@ Settings → General exposes a persisted, localized `Compact` / `Standard` / `De
|
|
|
71
71
|
|
|
72
72
|
Consecutive reasoning, Tool, and Assistant rows between independent inputs become activity groups owned by one Chat Group Definition. A group seat subscribes only to its member array, and each member keeps its keyed Node source and renderer. `groupPart` selects the renderer-owned part, with a distinct DOM anchor per part. System-prompt, Context injection, and command rows remain independent rows and end the preceding group: the upstream infrastructure-row filter is not ported, so grouping keeps those kinds outside every process group. Presentation modes change group visibility, never member parents. The [business-rule reference](src/client/conversation-nodes/README.md) owns segmentation, display-mode titles, and activity summaries.
|
|
73
73
|
|
|
74
|
+
The Settings row below Work details offers an [independent collapse-timing preference](src/client/conversation-nodes/README.md#collapse-timing).
|
|
75
|
+
|
|
76
|
+
The Chat Builder publishes `bottomSource` per Node: true for visible Nodes belonging to the last Turn in the loaded timeline, not just the final row. Advancing the bottom Turn notifies only Nodes in the old and new bottom Turns. Groups read their first member's position. Pending-input deduplication and collapse decisions remain in the Chat view, outside the Builder.
|
|
77
|
+
|
|
78
|
+
|
|
74
79
|
-----
|
|
75
80
|
|
|
76
81
|
<a id="turn-triggers"></a>
|
|
@@ -84,14 +89,19 @@ Non-human input claimed from the next-turn Inbox appears as an independent trigg
|
|
|
84
89
|
<a id="tool-call-nodes"></a>
|
|
85
90
|
## Tool call nodes
|
|
86
91
|
|
|
87
|
-
The `tool-call` Chat Node owns one call's preparing, dispatched, and result stages under a single callId, so a call that the model names before its arguments are complete appears once and keeps its identity when `tool/call` arrives. Live tool deltas share reasoning's frame-batched publication; durable calls and results publish immediately. Repeated named deltas retain the Tool node and its data reference when the projected call, anchor, location, and visibility are unchanged. Historical windows never expand a settled Assistant message back into live deltas, so replay presents start → result directly.
|
|
92
|
+
The `tool-call` Chat Node owns one call's preparing, dispatched, and result stages under a single callId, so a call that the model names before its arguments are complete appears once and keeps its identity when `tool/call` arrives. Live tool deltas share reasoning's frame-batched publication; durable calls and results publish immediately. Native and nested results retain event presentation metadata, so historical file and command labels use the operation's location. Repeated named deltas retain the Tool node and its data reference when the projected call, anchor, location, and visibility are unchanged. Historical windows never expand a settled Assistant message back into live deltas, so replay presents start → result directly.
|
|
88
93
|
|
|
89
94
|
-----
|
|
90
95
|
|
|
91
96
|
<a id="scroll-ownership"></a>
|
|
92
97
|
## Scroll ownership
|
|
93
98
|
|
|
94
|
-
Chat restores semantic anchors across history prepend and renderer remounts. `ChatViewport` owns the scrollport's DOM operations, the ledger that attributes each delivery to the reader or to a programmatic write, and every landing write. Pinned deliveries without reader movement update follow ownership immediately, before subsequent layout changes can invalidate their floor; reader movement remains pending until the sampling interval or `scrollend`, even inside the follow threshold, so layout growth cannot erase small scroll gestures. While the reader is pinned to the floor, the transcript disables native scroll anchoring (`data-chat-following-tail`) and `ResizeObserver` follows the new floor, selecting the latest loaded Turn without reading row geometry. Once the reader moves away, a layout change re-aligns their sampled row and the reading-line geometry selects the active Turn; paging retains one semantic row, plus its group's inner scroller, and compensates the inner scroll range first. Wheel, touch, pointer, key, and find-in-page intents release that retention, and rail scrolling never reaches the transcript. Turn-rail previews paint above sticky Markdown code-block banners, while the rail frame remains inside the transcript band above the composer. `use-chat-viewport` owns geometry and landings, `use-chat-reading` owns follow intent, reader sampling, and the active Turn, `use-chat-navigation` owns Turn jumps and prepend anchoring, and `use-chat-scroll` reconciles them after each commit; `ChatView` renders what they publish.
|
|
99
|
+
Under completion-time folding, Chat restores semantic anchors across history prepend and renderer remounts. `ChatViewport` owns the scrollport's DOM operations, the ledger that attributes each delivery to the reader or to a programmatic write, and every landing write. Pinned deliveries without reader movement update follow ownership immediately, before subsequent layout changes can invalidate their floor; reader movement remains pending until the sampling interval or `scrollend`, even inside the follow threshold, so layout growth cannot erase small scroll gestures. While the reader is pinned to the floor, the transcript disables native scroll anchoring (`data-chat-following-tail`) and `ResizeObserver` follows the new floor, selecting the latest loaded Turn without reading row geometry. Once the reader moves away, a layout change re-aligns their sampled row and the reading-line geometry selects the active Turn; paging retains one semantic row, plus its group's inner scroller, and compensates the inner scroll range first. Wheel, touch, pointer, key, and find-in-page intents release that retention, and rail scrolling never reaches the transcript. Turn-rail previews paint above sticky Markdown code-block banners, while the rail frame remains inside the transcript band above the composer. `use-chat-viewport` owns geometry and landings, `use-chat-reading` owns follow intent, reader sampling, and the active Turn, `use-chat-navigation` owns Turn jumps and prepend anchoring, and `use-chat-scroll` reconciles them after each commit; `ChatView` renders what they publish.
|
|
100
|
+
|
|
101
|
+
The delayed-fold experiment pauses automatic tail following and browser scroll anchoring while process rows fade and close. Bottom space preserves the scroll range; final content and the new input move upward together. Once the rows close, remaining input is revealed with native smooth scrolling, without a fixed continuation speed. Reader gestures cancel waiting and active follow motion; unloading Chat cancels its waiting callbacks and row transitions. Reduced-motion users receive immediate visibility and positioning changes.
|
|
102
|
+
|
|
103
|
+
Fold coordination is viewport-local: reservations and idle callbacks never broadcast to other Chat views. ChatView supplies its motion capability once to `conversation.chat.flow` through the render's `hookContext`. Flow binds the group and header behavior hooks, owns node and image rendering, and shares the existing Chat store and Session node sources. Layout nodes and inline reasoning receive the bound hooks without receiving the motion controller or changing content parents. Generic searchable hiding applies before paint and owns focus protection and beforematch handling; pending-input reconciliation remains in ChatView.
|
|
104
|
+
|
|
95
105
|
|
|
96
106
|
-----
|
|
97
107
|
|
package/README.zh.md
CHANGED
|
@@ -73,6 +73,11 @@ Assistant 回复结算后,已完成轮次的页脚只保留用量入口:轮
|
|
|
73
73
|
|
|
74
74
|
独立输入之间的连续推理、工具与 Assistant 行会组成活动分组,由 Chat 的一个分组定义拥有。分组座位只订阅自己的成员数组,每个成员继续使用原有的键控 Node 来源与 renderer。`groupPart` 选择 renderer 自有的部分,每个部分拥有独立的 DOM 锚点。系统提示词、上下文注入与命令行仍是独立行,并会结束前面的分组:上游的「基础设施行过滤」未移植,因此分组会把这些类型留在所有过程分组之外。展示档位只改变分组的可见性,不改变成员的父级。[业务规则参考](src/client/conversation-nodes/README.zh.md)负责分段、展示档位标题与活动摘要的完整定义。
|
|
75
75
|
|
|
76
|
+
工作步骤展示下方的设置行提供[独立的收起时机设置](src/client/conversation-nodes/README.zh.md#collapse-timing)。
|
|
77
|
+
|
|
78
|
+
Chat Builder 按节点发布 `bottomSource`:节点可见且属于已加载时间线的最后一轮时为 true,而不只是列表最后一行。底部轮次推进时,只有旧、新底部轮次的节点收到位置变化通知。Group 读取其首个成员的位置。待发送消息去重与收起判断仍由 Chat 视图处理,不进入 Builder。
|
|
79
|
+
|
|
80
|
+
|
|
76
81
|
-----
|
|
77
82
|
|
|
78
83
|
<a id="turn-triggers"></a>
|
|
@@ -85,14 +90,19 @@ Assistant 回复结算后,已完成轮次的页脚只保留用量入口:轮
|
|
|
85
90
|
<a id="tool-call-nodes"></a>
|
|
86
91
|
## 工具调用节点
|
|
87
92
|
|
|
88
|
-
`tool-call` Chat Node 在同一个 callId 下拥有准备、派发与结果三个阶段,因此模型在参数完整前已给出名称的调用只出现一次,并在 `tool/call` 到达时保持同一身份。实时工具 delta
|
|
93
|
+
`tool-call` Chat Node 在同一个 callId 下拥有准备、派发与结果三个阶段,因此模型在参数完整前已给出名称的调用只出现一次,并在 `tool/call` 到达时保持同一身份。实时工具 delta 与推理共用按帧合并的发布节奏;持久调用和结果立即发布。原生与嵌套结果保留事件中的展示元数据,使历史文件与命令标签使用执行时的位置。重复具名 delta 在投影调用、锚点、位置及可见性均未变化时保留 Tool 节点及其数据引用。历史窗口不会把已结束的 Assistant 消息重新展开为实时 delta,因此回放直接呈现 start → result。
|
|
89
94
|
|
|
90
95
|
-----
|
|
91
96
|
|
|
92
97
|
<a id="scroll-ownership"></a>
|
|
93
98
|
## 滚动归属
|
|
94
99
|
|
|
95
|
-
Chat 会在历史前插与 renderer 重新挂载时恢复语义锚点。`ChatViewport` 持有滚动容器的 DOM 操作、把每次投递归属到读者或程序化写入的账本,以及所有落位写入。没有读者移动的贴底投递会立即更新跟随归属,避免后续布局变化使其底部位置失效;读者移动即使位于跟随阈值内,也保持待处理直到采样周期或 `scrollend`,防止布局增长抵消小幅滚动操作。读者跟随底部时,transcript 关闭原生滚动锚定(`data-chat-following-tail`),`ResizeObserver` 追随新的底部,并且无需读取行几何就选中最后一个已加载轮次。读者离开底部后,布局变化会把其采样行重新对齐,再由阅读线几何选择活跃轮次;分页保留一个语义行及其分组内层滚动容器,并优先补偿内层滚动区间。滚轮、触摸、指针、按键与页内查找意图会释放该保留,轨道自身的滚动不会传到 transcript。轮次导航预览位于 Markdown 代码块粘性头栏上方,而导航外框始终处于 composer 上方的 transcript 区域内。职责拆分:`use-chat-viewport` 负责几何与落位,`use-chat-reading` 负责跟随意图、读者采样与活跃轮次,`use-chat-navigation` 负责轮次跳转与前插锚定,`use-chat-scroll` 在每次提交后协调三者;`ChatView` 只渲染它们发布的结果。
|
|
100
|
+
采用完成时收起时,Chat 会在历史前插与 renderer 重新挂载时恢复语义锚点。`ChatViewport` 持有滚动容器的 DOM 操作、把每次投递归属到读者或程序化写入的账本,以及所有落位写入。没有读者移动的贴底投递会立即更新跟随归属,避免后续布局变化使其底部位置失效;读者移动即使位于跟随阈值内,也保持待处理直到采样周期或 `scrollend`,防止布局增长抵消小幅滚动操作。读者跟随底部时,transcript 关闭原生滚动锚定(`data-chat-following-tail`),`ResizeObserver` 追随新的底部,并且无需读取行几何就选中最后一个已加载轮次。读者离开底部后,布局变化会把其采样行重新对齐,再由阅读线几何选择活跃轮次;分页保留一个语义行及其分组内层滚动容器,并优先补偿内层滚动区间。滚轮、触摸、指针、按键与页内查找意图会释放该保留,轨道自身的滚动不会传到 transcript。轮次导航预览位于 Markdown 代码块粘性头栏上方,而导航外框始终处于 composer 上方的 transcript 区域内。职责拆分:`use-chat-viewport` 负责几何与落位,`use-chat-reading` 负责跟随意图、读者采样与活跃轮次,`use-chat-navigation` 负责轮次跳转与前插锚定,`use-chat-scroll` 在每次提交后协调三者;`ChatView` 只渲染它们发布的结果。
|
|
101
|
+
|
|
102
|
+
延后折叠实验在过程行淡出并收起期间暂停自动跟尾和浏览器滚动锚定。底部空间保留可滚动范围,最终正文与新输入一起向上移动。过程行收起后,以原生平滑滚动揭示尚未露出的输入,不保证固定续滚速度。读者手势取消等待中和进行中的跟随动画;卸载 Chat 时取消其等待回调和行过渡。启用减少动态效果偏好时,可见性和定位立即变化。
|
|
103
|
+
|
|
104
|
+
折叠协调状态由各自的 viewport 持有,空间预留和空闲回调不会广播到其他 Chat 视图。ChatView 通过本次渲染的 `hookContext`,向 `conversation.chat.flow` 交接一次动画能力。Flow 绑定组内容与组头的行为 hook,负责节点和图片渲染,并共享既有 Chat store 与 Session 节点来源。布局节点和行内思考接收绑定后的 hook,不接收动画控制器,也不改变内容的父级。通用的可搜索隐藏在绘制前生效,并负责焦点保护及 beforematch;pending 输入对账仍留在 ChatView。
|
|
105
|
+
|
|
96
106
|
|
|
97
107
|
-----
|
|
98
108
|
|