@deepseek-ai/dsh-client-ui-workflow-run 0.1.1-rc.2 → 0.1.2-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 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-workflow-run/README.md
5
- README.md: 5093050ac7bd7e5d8a8779c4fe9848ee4f7da28b
6
- README.zh.md: 5c18bbaa8281f278f7a7707f89940737eb2dad40
5
+ README.md: 1cf482bb8f9d0f8c41e82a639fa6cb656f5fd563
6
+ README.zh.md: 2b559c666b1ea00374717b9f401ea02113459ac6
package/README.md CHANGED
@@ -1,35 +1,100 @@
1
+ ---
2
+ description: "Durable workflow-run Conversation Node for the dsh web client: reconstructs top-level workflow runs as independent chat nodes with nested member disclosure."
3
+ kind: "package-reference"
4
+ ---
5
+
1
6
  # @deepseek-ai/dsh-client-ui-workflow-run
2
7
 
3
8
  English | [中文](README.zh.md)
4
9
 
5
- The browser plugin that reconstructs durable top-level workflow runs as independent Chat nodes. It consumes the four `tool-workflow/*` Session events owned by [`dsh-tool-workflow`](../../workflow/tool-workflow/README.md), registers one `ConversationNodeDefinition`, and renders through the keyed `conversation.chat.node` slot without changing the existing workflow tool card.
10
+ ## Summary
11
+
12
+ `dsh-client-ui-workflow-run` is the browser plugin that reconstructs durable top-level workflow runs as independent Chat nodes in the dsh web client. It consumes the four `tool-workflow/*` Session events owned by `dsh-tool-workflow`, registers one `ConversationNodeDefinition`, and renders through the keyed `conversation.chat.node` slot without changing the existing workflow tool card. The run and each phase are controlled disclosures: a mount opens running, failed, cancelled, and interrupted levels and closes fully completed levels, and users can toggle either level with the full row, Enter, or Space. A member opens a child Session only while every current fact agrees, and the node shows run, phase, member identity, and status only.
13
+
14
+ ## Table of Contents
15
+
16
+ - [Use this package](#use-this-package)
17
+ - [Understand the implementation](#understand-the-implementation)
18
+ - [Further Exploration](#further-exploration)
19
+ - [Model Experience](#model-experience)
20
+ - [Known Limitations and Deferred Work](#known-limitations-and-deferred-work)
21
+ - [Dev Note](#dev-note)
22
+
23
+ -----
24
+
25
+ <a id="use-this-package"></a>
26
+ ## Use this package
27
+
28
+ A top-level workflow run through `dsh-tool-workflow` appears in the conversation as its own node: expand the run to see its phases, and expand a phase to see its members. Phase groups come only from members that started, and settlement changes status without removing or reordering members.
29
+
30
+ ### Navigating the node
31
+
32
+ The run uses a 32-pixel row with persistent chevrons, an inline state dot, and status text; phases use disclosure rows with title and member count in the main area and a fixed aggregate-status tail; members use a 16-pixel dot slot, a truncating name area, and a fixed status column. Opening a member's child Session requires the member to be running, the child id to be in the ordinary Session list, the row to have `origin: 'subagent'`, its `parentId` to be the current Session, and the list row to still be running — remote, addressed-only, wrong-parent, or terminal rows remain non-interactive.
33
+
34
+ ### State and completion
35
+
36
+ Completion updates the visible status immediately but delays its automatic close while focus remains inside the content. A closed Turn or Step with missing terminal events presents the affected run or members as interrupted without changing the tool result.
37
+
38
+ -----
39
+
40
+ <a id="understand-the-implementation"></a>
41
+ ## Understand the implementation
6
42
 
7
- ## Durable state and replay
43
+ <details>
44
+ <summary>Implementation internals — click to expand</summary>
8
45
 
9
- `tool-workflow/run-start` creates one Context keyed by `runId`; member starts, member endings, and the run ending update that Context in log order. A history tail containing only updates remains pending until an older page supplies the unique start, after which prepend, complete replay, and live append produce the same state. A closed Turn or Step with missing terminal events presents the affected run or members as interrupted without changing the tool result.
46
+ The node is a deterministic replay of durable session events: `tool-workflow/run-start` creates one Context keyed by `runId`, and member starts, member endings, and the run ending update that Context in log order. A history tail containing only updates remains pending until an older page supplies the unique start, after which prepend, complete replay, and live append produce the same state.
10
47
 
11
- Phase groups come only from members that actually started. Exact phase strings share a group, an omitted phase is distinct from the empty string, and settlement changes status without removing or reordering members.
48
+ ### Disclosure choices
12
49
 
13
- ## Presentation and navigation
50
+ Ordinary running updates preserve the current choice, the first abnormal edge opens once, normal completion closes once, and a completed phase plus the outer run open again when a new running member starts under the same phase key. If an entire new clean cycle arrives in one render while the run remains active, the phase finishes folded but the outer run opens once to expose its updated summary. `WorkflowRunPanel` owns the phase choices, so closing and reopening the outer run does not reset them; a renderer remount reconstructs every initial choice from durable facts.
14
51
 
15
- The run and each phase are controlled disclosures in every status. A mount opens running, failed, cancelled, and interrupted levels and closes fully completed levels; users can then toggle either level with the full row, Enter, or Space. Ordinary running updates preserve the current choice, the first abnormal edge opens once, normal completion closes once, and a completed phase plus the outer run open again when a new running member starts under the same phase key. If an entire new clean cycle arrives in one render while the run remains active, the phase finishes folded but the outer run opens once to expose its updated summary. Completion updates the visible status immediately but delays its automatic close while focus remains inside the content. `WorkflowRunPanel` owns the phase choices, so closing and reopening the outer run does not reset them; a renderer remount reconstructs every initial choice from durable facts. The run uses a 32-pixel `--dsw-alias-bg-module-platform` row with persistent right/down chevrons and an inline state dot plus status text, without a badge. Phases use 32-pixel disclosure rows with title and member count in the flexible main area and a fixed precise aggregate-status tail, without another dot. Members use a 16-pixel dot slot, a truncating name area, and a fixed 64-pixel status column.
52
+ ### Composition
16
53
 
17
- A member opens a child Session only while every current fact agrees: the member is running, the child id is in the ordinary Session list, the row has `origin: 'subagent'`, its `parentId` is the current Session, and the list row is still running. Underlined member text is the only visible navigation affordance; keyboard focus draws a two-pixel business-primary ring around the name area, while status copy remains `Running`. The component calls only the injected ordinary `sessions.open(id)` action; remote, addressed-only, wrong-parent, or terminal rows remain non-interactive.
54
+ The package registers its Definition, locale dictionary, and `workflow-run` renderer as Cordis effects; removing the client entry retracts all three contributions. The shipped Web bundle includes the plugin after `ui-conversation` and `ui-tool`.
18
55
 
19
- ## Composition
56
+ </details>
20
57
 
21
- The package registers its Definition, locale dictionary, and `workflow-run` renderer as Cordis effects. Removing the client entry retracts all three contributions. The shipped Web bundle includes the plugin after `ui-conversation` and `ui-tool`.
58
+ -----
22
59
 
60
+ <a id="further-exploration"></a>
61
+ ## Further Exploration
62
+
63
+ These pages cover the tool seam, the conversation host, and the tool presentation layer.
64
+
65
+ - [tool-workflow](../../workflow/tool-workflow/README.md) — the tool that owns the four `tool-workflow/*` Session events.
66
+ - [ui-conversation](../ui-conversation/README.md) — the chat surface hosting the `conversation.chat.node` slot.
67
+ - [ui-tool](../ui-tool/README.md) — the tool-call presentation layer this node sits beside.
68
+ - [Conversation subsystem](../../../docs/subsystems/conversation.md) — how a business-owned feature registers a Conversation node.
69
+
70
+ -----
71
+
72
+ <a id="model-experience"></a>
23
73
  ## Model Experience
24
74
 
25
- None, as this package renders durable Session facts for humans and adds no prompt, tool schema, request content, or model-visible result.
75
+ None, as the package is a browser-side UI plugin layer that renders durable workflow records without changing model context.
26
76
 
27
77
  #### KV Cache effect
28
78
 
29
- None.
79
+ None; this package neither assembles nor sends a provider request.
30
80
 
31
81
  ## Known Limitations and Deferred Work
32
82
 
33
- - Only top-level calls through `dsh-tool-workflow` produce these records; nested Code Mode calls and direct `WorkflowEngine` consumers do not.
34
- - Navigation is intentionally live-only. Terminal members remain visible for review but never expose a cold-session opener from this node.
35
- - The node shows run, phase, member identity, and status only; scripts, outputs, errors, logs, usage, static topology, and controls remain outside this surface.
83
+ <a id="known-limitations-and-deferred-work"></a>
84
+
85
+
86
+ These limits define which runs produce records and what the node exposes; they are current package constraints.
87
+
88
+ - **Only top-level calls through `dsh-tool-workflow` produce these records** — nested PTC mode calls and direct `WorkflowEngine` consumers do not.
89
+ - **Navigation is intentionally live-only** — terminal members remain visible for review but never expose a cold-session opener from this node.
90
+ - **The node shows run, phase, member identity, and status only** — scripts, outputs, errors, logs, usage, static topology, and controls remain outside this surface.
91
+
92
+ <a id="dev-note"></a>
93
+ ### Dev Note
94
+
95
+ <details>
96
+ <summary>Working context for maintainers — click to expand</summary>
97
+
98
+ None.
99
+
100
+ </details>
package/README.zh.md CHANGED
@@ -1,35 +1,100 @@
1
+ ---
2
+ description: "dsh Web 客户端的持久化工作流运行 Conversation Node:把顶层工作流运行重建为带嵌套成员折叠的独立聊天节点。"
3
+ kind: "package-reference"
4
+ ---
5
+
1
6
  # @deepseek-ai/dsh-client-ui-workflow-run
2
7
 
3
8
  [English](README.md) | 中文
4
9
 
5
- 这个浏览器插件把持久化的顶层工作流运行重建为独立 Chat 节点。它消费由 [`dsh-tool-workflow`](../../workflow/tool-workflow/README.zh.md) 拥有的四类 `tool-workflow/*` Session 事件,注册一个 `ConversationNodeDefinition`,并通过 keyed `conversation.chat.node` slot 渲染,不改变现有工作流工具卡。
10
+ ## 概述
11
+
12
+ `dsh-client-ui-workflow-run` 是浏览器插件,把持久化的顶层工作流运行重建为 dsh Web 客户端中的独立 Chat 节点。它消费由 `dsh-tool-workflow` 拥有的四类 `tool-workflow/*` Session 事件,注册一个 `ConversationNodeDefinition`,并通过 keyed `conversation.chat.node` slot 渲染,不改变现有工作流工具卡。运行与每个阶段都是受控 disclosure:挂载时运行中、失败、已取消与已中断层级默认展开,全部完成的层级默认折叠,用户可以点击整行或按 Enter、Space 切换任一层级。只有当所有实时事实同时成立时,成员才可打开子 Session;节点只显示运行、阶段、成员身份与状态。
13
+
14
+ ## 目录
15
+
16
+ - [使用本包](#use-this-package)
17
+ - [理解实现](#understand-the-implementation)
18
+ - [进一步探索](#further-exploration)
19
+ - [模型体验](#model-experience)
20
+ - [已知限制与延期工作](#known-limitations-and-deferred-work)
21
+ - [开发备注](#dev-note)
22
+
23
+ -----
24
+
25
+ <a id="use-this-package"></a>
26
+ ## 使用本包
27
+
28
+ 经 `dsh-tool-workflow` 发起的顶层工作流运行会在对话中显示为独立节点:展开运行查看其阶段,展开阶段查看其成员。阶段组只来自开始过的成员;成员结算只改变状态,不删除或重排成员。
29
+
30
+ ### 导航节点
31
+
32
+ 运行使用 32 像素行,带常驻 chevron、行内状态点与状态文字;阶段使用 disclosure 行,在主区显示标题与成员数、在固定尾部显示聚合状态;成员使用 16 像素状态点槽、可省略名称区与固定状态列。打开成员的子 Session 需要成员仍在运行、子 id 位于普通 Session 列表、列表行为 `origin: 'subagent'`、`parentId` 等于当前 Session,且列表行仍标记运行——远程、仅地址化、父级不符或终态的行都不可交互。
33
+
34
+ ### 状态与完成
35
+
36
+ 完成状态会立即更新,但只要焦点仍位于展开内容内,自动折叠就会等待焦点离开。若所属 Turn 或 Step 已关闭但终点事件缺失,界面把相应运行或成员显示为已中断,而不改写工具结果。
37
+
38
+ -----
39
+
40
+ <a id="understand-the-implementation"></a>
41
+ ## 理解实现
6
42
 
7
- ## 持久状态与回放
43
+ <details>
44
+ <summary>实现细节——点击展开</summary>
8
45
 
9
- `tool-workflow/run-start` 以 `runId` 创建唯一 Context;成员开始、成员结束和运行结束事件按日志顺序更新该 Context。只有 update 的历史尾页会保持 pending,直到更早页面补入唯一 start;此后 prepend、完整回放和实时 append 得到相同状态。若所属 Turn 或 Step 已关闭但终点事件缺失,界面把相应运行或成员显示为已中断,而不改写工具结果。
46
+ 节点是持久化会话事件的确定性回放:`tool-workflow/run-start` 以 `runId` 创建唯一 Context,成员开始、成员结束与运行结束事件按日志顺序更新该 Context。只有 update 的历史尾页会保持 pending,直到更早页面补入唯一 start;此后 prepend、完整回放与实时 append 得到相同状态。
10
47
 
11
- 阶段组只来自真正开始过的成员。完全相同的阶段字符串归入同一组,字段缺省与空字符串保持不同身份;成员结算只改变状态,不删除或重排成员。
48
+ ### 展开选择
12
49
 
13
- ## 展示与导航
50
+ 普通运行更新保留当前选择,首次异常边沿只自动展开一次,正常完成只自动折叠一次;已完成阶段在同一 phase key 下开始新的运行成员时,该 Phase 与外层运行会再次自动展开。若一个完整的新干净周期在同一次渲染中送达且运行仍处于活动状态,Phase 保持折叠,但外层运行会自动展开一次以展示更新后的摘要。Phase 选择由 `WorkflowRunPanel` 持有,因此关闭并重新打开外层运行不会重置它们;renderer remount 会从持久事实重建每层的初始选择。
14
51
 
15
- 运行和每个阶段在所有状态下都是受控 disclosure。挂载时,运行中、失败、已取消和已中断层级默认展开,全部完成的层级默认折叠;此后用户可以点击整行,或按 Enter、Space 切换任一层级。普通运行更新保留当前选择,首次异常边沿只自动展开一次,正常完成只自动折叠一次;已完成阶段在同一 phase key 下开始新的运行成员时,该 Phase 与外层运行会再次自动展开。若一个完整的新干净周期在同一次渲染中送达,且运行仍处于活动状态,Phase 保持折叠,但外层运行会自动展开一次以展示更新后的摘要。完成状态会立即更新,但只要焦点仍位于展开内容内,自动折叠就会等待焦点离开。Phase 选择由 `WorkflowRunPanel` 持有,因此关闭并重新打开外层运行不会重置它们;renderer remount 会从持久事实重建每层的初始选择。运行使用 32 像素 `--dsw-alias-bg-module-platform` 背景行,常驻向右/向下 chevron,并以内联状态点加状态文字表达结局,不使用胶囊。阶段使用 32 像素 disclosure 行,在可伸缩主区显示标题与成员数,在固定尾部精确显示聚合状态且不重复状态点。成员使用 16 像素状态点槽、可省略名称区和固定 64 像素状态列。
52
+ ### 装配
16
53
 
17
- 只有所有实时事实同时成立时,成员才可打开子 Session:成员仍在运行、子 id 位于普通 Session 列表、列表行为 `origin: 'subagent'`、`parentId` 等于当前 Session,且列表行仍标记运行。带下划线的成员文字是唯一可见导航提示;键盘聚焦时,名称区显示 2 像素 business-primary 焦点环,右侧状态仍只显示“运行中”。组件只调用注入的普通 `sessions.open(id)`;远程、仅地址化、父级不符或终态的行都不可交互。
54
+ 本包把 Definition、locale 字典与 `workflow-run` renderer 都注册为 Cordis effect;移除客户端 entry 会撤销三者。shipped Web bundle 在 `ui-conversation` `ui-tool` 之后装配该插件。
18
55
 
19
- ## 装配
56
+ </details>
20
57
 
21
- 本包把 Definition、locale 字典和 `workflow-run` renderer 都注册为 Cordis effect;移除客户端 entry 会撤销三者。shipped Web bundle 在 `ui-conversation` 与 `ui-tool` 之后装配该插件。
58
+ -----
22
59
 
60
+ <a id="further-exploration"></a>
61
+ ## 进一步探索
62
+
63
+ 以下页面覆盖工具 seam、对话宿主与工具展示层。
64
+
65
+ - [tool-workflow](../../workflow/tool-workflow/README.zh.md)——拥有四类 `tool-workflow/*` Session 事件的工具。
66
+ - [ui-conversation](../ui-conversation/README.zh.md)——承载 `conversation.chat.node` slot 的聊天界面。
67
+ - [ui-tool](../ui-tool/README.zh.md)——本节点相邻的工具调用展示层。
68
+ - [Conversation 子系统](../../../docs/subsystems/conversation.zh.md)——业务自有功能如何注册 Conversation node。
69
+
70
+ -----
71
+
72
+ <a id="model-experience"></a>
23
73
  ## 模型体验
24
74
 
25
- 无,因为本包只为人类展示持久 Session 事实,不增加 prompt、工具 schema、请求内容或模型可见结果。
75
+ 无。该包是浏览器端 UI 插件层,只渲染持久化工作流记录,不改变模型上下文。
26
76
 
27
- #### KV Cache effect
77
+ #### KV Cache 影响
28
78
 
29
- 无。
79
+ 无;该包既不组装也不发送提供方请求。
80
+
81
+ ## 已知限制与延期工作
82
+
83
+ <a id="known-limitations-and-deferred-work"></a>
30
84
 
31
- ## 已知限制与暂缓事项
32
85
 
33
- - 只有经 `dsh-tool-workflow` 发起的顶层调用会生成这些记录;嵌套 Code Mode 调用和直接 `WorkflowEngine` 消费方不会生成。
34
- - 导航刻意只面向实时运行。终态成员继续保留供复盘,但本节点永不为其提供冷 Session 入口。
35
- - 节点只显示运行、阶段、成员身份与状态;脚本、输出、错误、日志、用量、静态拓扑和控制操作都不属于本界面。
86
+ 这些限制定义哪些运行会产生记录、节点暴露什么;它们是当前包约束。
87
+
88
+ - **只有经 `dsh-tool-workflow` 发起的顶层调用会生成这些记录**:嵌套 PTC mode 调用和直接 `WorkflowEngine` 消费方不会生成。
89
+ - **导航刻意只面向实时运行**:终态成员继续保留供复盘,但本节点永不为其提供冷 Session 入口。
90
+ - **节点只显示运行、阶段、成员身份与状态**:脚本、输出、错误、日志、用量、静态拓扑与控制操作都不属于本界面。
91
+
92
+ <a id="dev-note"></a>
93
+ ### 开发备注
94
+
95
+ <details>
96
+ <summary>维护者的工作上下文——点击展开</summary>
97
+
98
+ 无。
99
+
100
+ </details>
package/lib/client.js CHANGED
@@ -7,9 +7,9 @@ window.__ModuleLoader__.load({
7
7
  let react_jsx_runtime = require("react/jsx-runtime");
8
8
  let react = require("react");
9
9
  let _deepseek_ai_dsh_client_ui_primitives = require("@deepseek-ai/dsh-client-ui-primitives");
10
- let _deepseek_ai_dsh_client_runtime_client = require("@deepseek-ai/dsh-client-runtime/client");
10
+ let _deepseek_ai_dsh_client_store = require("@deepseek-ai/dsh-client-store");
11
11
  //#region \0dsh-css:/home/runner/work/deepseek-harness/deepseek-harness/packages/client/ui-workflow-run/src/client/WorkflowRunPanel.module.css.mjs
12
- const css = ".DBuyfa_root{width:100%;min-width:0}.DBuyfa_runHeader{box-sizing:border-box;background:var(--dsw-alias-bg-module-platform);border-radius:8px;align-items:center;gap:6px;width:100%;min-width:0;height:32px;padding:0 8px;display:flex}.DBuyfa_runHeader:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:-2px}.DBuyfa_runLeading{width:16px;height:16px;color:var(--dsw-alias-label-tertiary);flex:none;justify-content:center;align-items:center;margin-right:0;display:inline-flex}.DBuyfa_runTitle{max-width:42%;color:var(--dsw-alias-label-secondary);text-overflow:ellipsis;white-space:nowrap;flex:none;font-size:14px;font-weight:510;line-height:24px;overflow:hidden}.DBuyfa_runSummary{min-width:0;color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;flex:1;font-size:12px;line-height:18px;overflow:hidden}.DBuyfa_statusTail{height:20px;color:var(--dsw-alias-label-secondary);white-space:nowrap;flex:none;align-items:center;gap:4px;font-size:11px;font-weight:510;line-height:16px;display:inline-flex;overflow:hidden}.DBuyfa_phaseHeader{box-sizing:border-box;align-items:center;gap:6px;width:100%;min-width:0;height:32px;display:flex}.DBuyfa_phaseHeader:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:-2px;border-radius:4px}.DBuyfa_phaseLeading{width:16px;height:16px;color:var(--dsw-alias-label-tertiary);flex:none;justify-content:center;align-items:center;margin-right:0;display:inline-flex}.DBuyfa_phaseTitle{min-width:0;max-width:42%;color:var(--dsw-alias-label-secondary);text-overflow:ellipsis;white-space:nowrap;flex:0 auto;font-size:14px;line-height:24px;overflow:hidden}.DBuyfa_phaseCount{min-width:0;color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;flex:1;font-size:13px;line-height:20px;overflow:hidden}.DBuyfa_phaseStatus{width:132px;color:var(--dsw-alias-label-secondary);text-align:right;text-overflow:ellipsis;white-space:nowrap;flex:none;font-size:13px;line-height:20px;overflow:hidden}.DBuyfa_separator{background:var(--dsw-alias-label-tertiary);border-radius:50%;flex:none;width:2px;height:2px}.DBuyfa_phaseList{flex-direction:column;gap:4px;min-width:0;padding:4px 0 0 16px;display:flex}.DBuyfa_phase{min-width:0}.DBuyfa_members{flex-direction:column;gap:2px;min-width:0;padding:0 0 0 16px;display:flex}.DBuyfa_memberRow,.DBuyfa_memberButton{width:100%;min-width:0;min-height:24px;color:var(--dsw-alias-label-secondary);font:inherit;text-align:left;background:0 0;border:0;border-radius:4px;align-items:center;gap:12px;padding:0;display:flex}.DBuyfa_memberButton{cursor:pointer}.DBuyfa_memberButton .DBuyfa_memberLabel{color:var(--dsw-alias-state-business-primary);text-underline-position:from-font;text-decoration:underline}.DBuyfa_dotSlot{flex:none;justify-content:center;align-items:center;width:16px;height:24px;display:inline-flex;overflow:hidden}.DBuyfa_memberButton:focus-visible{outline:none}.DBuyfa_memberButton:focus-visible .DBuyfa_memberLabelWrap{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:-1px}.DBuyfa_memberLabelWrap{border-radius:4px;flex:1;align-items:center;min-width:0;height:24px;padding:0 2px;display:flex;overflow:hidden}.DBuyfa_memberLabel{min-width:0;color:var(--dsw-alias-label-secondary);text-overflow:ellipsis;white-space:nowrap;flex:1;font-size:14px;line-height:24px;overflow:hidden}.DBuyfa_memberStatus{width:64px;color:var(--dsw-alias-label-secondary);text-align:right;text-overflow:ellipsis;white-space:nowrap;flex:none;font-size:13px;line-height:20px;overflow:hidden}.DBuyfa_empty{color:var(--dsw-alias-label-tertiary);padding:0;font-size:13px;line-height:20px}@media (width<=560px){.DBuyfa_phaseList,.DBuyfa_members{padding-left:12px}}";
12
+ const css = ".DBuyfa_root{width:100%;min-width:0}.DBuyfa_runHeader{box-sizing:border-box;background:var(--dsw-alias-bg-module-platform);border-radius:8px;align-items:center;gap:6px;width:100%;min-width:0;height:32px;padding:0 8px;display:flex}.DBuyfa_runHeader:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:-2px}.DBuyfa_runLeading{width:calc(16px + var(--dsh-content-font-delta,0px));height:calc(16px + var(--dsh-content-font-delta,0px));color:var(--dsw-alias-label-tertiary);flex:none;justify-content:center;align-items:center;margin-right:0;display:inline-flex}.DBuyfa_runTitle{max-width:42%;color:var(--dsw-alias-label-secondary);font-size:var(--dsh-content-font-size-secondary,13px);font-weight:510;line-height:calc(24px + var(--dsh-content-font-delta,0px));text-overflow:ellipsis;white-space:nowrap;flex:none;overflow:hidden}.DBuyfa_runSummary{min-width:0;color:var(--dsw-alias-label-tertiary);font-size:var(--dsh-content-font-size-secondary,13px);line-height:calc(18px + var(--dsh-content-font-delta-secondary,0px));text-overflow:ellipsis;white-space:nowrap;flex:1;overflow:hidden}.DBuyfa_statusTail{height:20px;color:var(--dsw-alias-label-secondary);white-space:nowrap;flex:none;align-items:center;gap:4px;font-size:11px;font-weight:510;line-height:16px;display:inline-flex;overflow:hidden}.DBuyfa_phaseHeader{box-sizing:border-box;align-items:center;gap:6px;width:100%;min-width:0;height:32px;display:flex}.DBuyfa_phaseHeader:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:-2px;border-radius:4px}.DBuyfa_phaseLeading{width:calc(16px + var(--dsh-content-font-delta,0px));height:calc(16px + var(--dsh-content-font-delta,0px));color:var(--dsw-alias-label-tertiary);flex:none;justify-content:center;align-items:center;margin-right:0;display:inline-flex}.DBuyfa_phaseTitle{min-width:0;max-width:42%;color:var(--dsw-alias-label-secondary);font-size:var(--dsh-content-font-size-secondary,13px);line-height:calc(24px + var(--dsh-content-font-delta,0px));text-overflow:ellipsis;white-space:nowrap;flex:0 auto;overflow:hidden}.DBuyfa_phaseCount{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));text-overflow:ellipsis;white-space:nowrap;flex:1;overflow:hidden}.DBuyfa_phaseStatus{width:calc(132px + var(--dsh-content-font-delta-secondary,0px) * 10);color:var(--dsw-alias-label-secondary);font-size:var(--dsh-content-font-size-secondary,13px);line-height:calc(20px + var(--dsh-content-font-delta-secondary,0px));text-align:right;text-overflow:ellipsis;white-space:nowrap;flex:none;overflow:hidden}.DBuyfa_separator{background:var(--dsw-alias-label-tertiary);border-radius:50%;flex:none;width:2px;height:2px}.DBuyfa_phaseList{flex-direction:column;gap:4px;min-width:0;padding:4px 0 0 16px;display:flex}.DBuyfa_phase{min-width:0}.DBuyfa_members{flex-direction:column;gap:2px;min-width:0;padding:0 0 0 16px;display:flex}.DBuyfa_memberRow,.DBuyfa_memberButton{width:100%;min-width:0;min-height:calc(24px + var(--dsh-content-font-delta,0px));color:var(--dsw-alias-label-secondary);font:inherit;text-align:left;background:0 0;border:0;border-radius:4px;align-items:center;gap:12px;padding:0;display:flex}.DBuyfa_memberButton{cursor:pointer}.DBuyfa_memberButton .DBuyfa_memberLabel{color:var(--dsw-alias-state-business-primary);text-underline-position:from-font;text-decoration:underline}.DBuyfa_dotSlot{width:16px;height:calc(24px + var(--dsh-content-font-delta,0px));flex:none;justify-content:center;align-items:center;display:inline-flex;overflow:hidden}.DBuyfa_memberButton:focus-visible{outline:none}.DBuyfa_memberButton:focus-visible .DBuyfa_memberLabelWrap{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:-1px}.DBuyfa_memberLabelWrap{min-width:0;height:calc(24px + var(--dsh-content-font-delta,0px));border-radius:4px;flex:1;align-items:center;padding:0 2px;display:flex;overflow:hidden}.DBuyfa_memberLabel{min-width:0;color:var(--dsw-alias-label-secondary);font-size:var(--dsh-content-font-size,14px);line-height:calc(24px + var(--dsh-content-font-delta,0px));text-overflow:ellipsis;white-space:nowrap;flex:1;overflow:hidden}.DBuyfa_memberStatus{width:64px;color:var(--dsw-alias-label-secondary);font-size:var(--dsh-content-font-size-secondary,13px);line-height:calc(20px + var(--dsh-content-font-delta-secondary,0px));text-align:right;text-overflow:ellipsis;white-space:nowrap;flex:none;overflow:hidden}.DBuyfa_empty{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));padding:0}@media (width<=560px){.DBuyfa_phaseList,.DBuyfa_members{padding-left:12px}}";
13
13
  const tagId = "@deepseek-ai/dsh-client-ui-workflow-run/WorkflowRunPanel.module.css";
14
14
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId) + "]") === null) {
15
15
  const tag = document.createElement("style");
@@ -311,7 +311,7 @@ window.__ModuleLoader__.load({
311
311
  }));
312
312
  const runContentRef = (0, react.useRef)(null);
313
313
  const phaseContentRefs = (0, react.useRef)(/* @__PURE__ */ new Map());
314
- const navigable = useSessions((sessions) => navigableMembers(sessions, node.data.phases, sessionId), _deepseek_ai_dsh_client_runtime_client.shallowEqual);
314
+ const navigable = useSessions((sessions) => navigableMembers(sessions, node.data.phases, sessionId), _deepseek_ai_dsh_client_store.shallowEqual);
315
315
  (0, react.useLayoutEffect)(() => {
316
316
  setDisclosures((current) => {
317
317
  const phases = /* @__PURE__ */ new Map();
@@ -618,14 +618,14 @@ window.__ModuleLoader__.load({
618
618
  /** Browser plugin for durable workflow-run Conversation Nodes. */
619
619
  /** Required services for Definition, keyed renderer, navigation, and copy. */
620
620
  const inject = [
621
- "conversationEvents",
621
+ "uiConversation",
622
622
  "slots",
623
623
  "sessions",
624
624
  "locale"
625
625
  ];
626
626
  /** Register the workflow Definition, dictionary, and keyed Chat renderer. */
627
627
  function apply(ctx) {
628
- ctx.conversationEvents.register(workflowRunDefinition);
628
+ ctx.uiConversation.events.register(workflowRunDefinition);
629
629
  ctx.effect(() => ctx.locale.register(NS, {
630
630
  zh,
631
631
  en
@@ -1,6 +1,6 @@
1
1
  import type { PropsLocale, PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots';
2
- import { type SessionId } from '@deepseek-ai/dsh-client-runtime/client';
3
- /** Navigation action injected from the plugin's own SessionRuntime access. */
2
+ import type { SessionId } from '@deepseek-ai/dsh-session/types';
3
+ /** Navigation action injected from the plugin's own Session Controller access. */
4
4
  export interface WorkflowRunInjected {
5
5
  readonly openSession: (id: SessionId) => void;
6
6
  }
@@ -1,5 +1,5 @@
1
1
  /** Browser plugin for durable workflow-run Conversation Nodes. */
2
- import type { ClientContext } from '@deepseek-ai/dsh-client-runtime/client';
2
+ import type { Context as ClientContext } from '@deepseek-ai/cordis';
3
3
  import { type WorkflowRunKey } from './locales.ts';
4
4
  declare module '@deepseek-ai/dsh-client-ui-slots' {
5
5
  interface LocaleNamespaceMap {
@@ -1,4 +1,4 @@
1
- import type { ConversationNodeDefinition } from '@deepseek-ai/dsh-client-runtime/client';
1
+ import type { ConversationNodeDefinition } from '@deepseek-ai/dsh-client-ui-conversation/client';
2
2
  import type { SessionId } from '@deepseek-ai/dsh-session/types';
3
3
  import type { ToolWorkflowAgentStartData } from '@deepseek-ai/dsh-tool-workflow/types';
4
4
  import type { WorkflowAgentOutcome, WorkflowStopReason } from '@deepseek-ai/dsh-workflow/types';
@@ -24,7 +24,7 @@ export interface WorkflowRunChatData {
24
24
  readonly status: WorkflowRunStatus;
25
25
  readonly phases: readonly WorkflowRunPhaseData[];
26
26
  }
27
- declare module '@deepseek-ai/dsh-client-ui-conversation/client' {
27
+ declare module '@deepseek-ai/dsh-client-ui-chat/client' {
28
28
  interface ChatNodeDataMap {
29
29
  /** Durable top-level workflow run and all members that actually started. */
30
30
  'workflow-run': WorkflowRunChatData;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@deepseek-ai/dsh-client-ui-workflow-run",
3
3
  "description": "Durable workflow-run Conversation Node and nested member disclosure for dsh web",
4
- "version": "0.1.1-rc.2",
4
+ "version": "0.1.2-alpha.2",
5
5
  "publishConfig": {
6
6
  "access": "public"
7
7
  },
@@ -32,9 +32,12 @@
32
32
  "dsh": {
33
33
  "client": {
34
34
  "inject": [
35
+ "@deepseek-ai/dsh-api-session-controller",
35
36
  "@deepseek-ai/dsh-client-locale",
36
- "@deepseek-ai/dsh-client-runtime",
37
- "@deepseek-ai/dsh-client-ui-conversation"
37
+ "@deepseek-ai/dsh-client-ui-chat",
38
+ "@deepseek-ai/dsh-client-ui-conversation",
39
+ "@deepseek-ai/dsh-client-ui-renderer",
40
+ "@deepseek-ai/dsh-client-ui-session"
38
41
  ],
39
42
  "platform": "web"
40
43
  }
@@ -47,29 +50,26 @@
47
50
  ],
48
51
  "license": "MIT",
49
52
  "peerDependencies": {
50
- "@deepseek-ai/dsh-client-locale": "^0.1.1-rc.2",
51
- "@deepseek-ai/dsh-client-runtime": "^0.1.1-rc.2",
52
- "@deepseek-ai/dsh-client-ui-conversation": "^0.1.1-rc.2",
53
- "@deepseek-ai/dsh-invariants": "^0.1.1-rc.2",
54
- "@deepseek-ai/dsh-session": "^0.1.1-rc.2",
55
- "@deepseek-ai/dsh-tool-workflow": "^0.1.1-rc.2",
56
- "@deepseek-ai/dsh-workflow": "^0.1.1-rc.2",
57
- "@deepseek-ai/cordis": "^4.0.1"
53
+ "@deepseek-ai/cordis": "^4.0.2"
58
54
  },
59
55
  "devDependencies": {
60
56
  "@types/react": "~18.3.1",
61
57
  "react": "^18.2.0",
62
- "@deepseek-ai/dsh-client-locale": "^0.1.1-rc.2",
63
- "@deepseek-ai/dsh-client-runtime": "^0.1.1-rc.2",
64
- "@deepseek-ai/dsh-client-test-runtime": "^0.1.1-rc.2",
65
- "@deepseek-ai/dsh-client-ui-conversation": "^0.1.1-rc.2",
66
- "@deepseek-ai/dsh-client-ui-primitives": "^0.1.1-rc.2",
67
- "@deepseek-ai/dsh-client-ui-slots": "^0.1.1-rc.2",
68
- "@deepseek-ai/dsh-session": "^0.1.1-rc.2",
69
- "@deepseek-ai/dsh-invariants": "^0.1.1-rc.2",
70
- "@deepseek-ai/dsh-tool-workflow": "^0.1.1-rc.2",
71
- "@deepseek-ai/dsh-workflow": "^0.1.1-rc.2",
72
- "@deepseek-ai/cordis": "^4.0.1"
58
+ "@deepseek-ai/dsh-api-session-controller": "^0.1.2-alpha.2",
59
+ "@deepseek-ai/dsh-client-locale": "^0.1.2-alpha.2",
60
+ "@deepseek-ai/dsh-client-test-runtime": "^0.1.2-alpha.2",
61
+ "@deepseek-ai/dsh-client-ui-chat": "^0.1.2-alpha.2",
62
+ "@deepseek-ai/dsh-client-ui-conversation": "^0.1.2-alpha.2",
63
+ "@deepseek-ai/dsh-client-ui-primitives": "^0.1.2-alpha.2",
64
+ "@deepseek-ai/dsh-client-ui-slots": "^0.1.2-alpha.2",
65
+ "@deepseek-ai/dsh-client-ui-renderer": "^0.1.2-alpha.2",
66
+ "@deepseek-ai/dsh-client-ui-session": "^0.1.2-alpha.2",
67
+ "@deepseek-ai/dsh-invariants": "^0.1.2-alpha.2",
68
+ "@deepseek-ai/dsh-session": "^0.1.2-alpha.2",
69
+ "@deepseek-ai/dsh-tool-workflow": "^0.1.2-alpha.2",
70
+ "@deepseek-ai/dsh-workflow": "^0.1.2-alpha.2",
71
+ "@deepseek-ai/cordis": "^4.0.2",
72
+ "@deepseek-ai/dsh-client-store": "^0.1.2-alpha.2"
73
73
  },
74
74
  "scripts": {
75
75
  "bundle": "tsdown",