@qilin-agent/client-ui-chat 3.1.3 → 3.1.5

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 CHANGED
@@ -5,51 +5,51 @@
5
5
  /:
6
6
  en: d88f75fc0178ba53
7
7
  zh: 52bc7ae9551ab1cf
8
- /qilin-client-ui-chat:
9
- en: 506d97db5618d95c
10
- zh: b369944a84588939
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: 58053b729a151ddc
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: 95840b34ca98d3ff
34
- zh: 32ba11293bd1b4e2
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: 8ea74e997efa882e
40
- zh: 05be7975fe2ea14c
41
- /qilin-client-ui-chat/scroll-ownership:
42
- en: 56685a8a28d433d7
43
- zh: e9b0ca321c84522a
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 与推理共用按帧合并的发布节奏;持久调用和结果立即发布。重复具名 delta 在投影调用、锚点、位置及可见性均未变化时保留 Tool 节点及其数据引用。历史窗口不会把已结束的 Assistant 消息重新展开为实时 delta,因此回放直接呈现 start → result。
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