@deepseek-ai/dsh-client-ui-workflow-run 0.0.1-rc.2 → 0.0.1-rc.3

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: 66539e0c16ac4102f9e1fe881106e6881b36a7d5
6
- README.zh.md: a803857af24802e8a4645c4d5aca56c04424c85e
5
+ README.md: 3fcdc632b54be7d1f8f452c6f8b3b2e1525953aa
6
+ README.zh.md: 5f0ba0c8f8a251d0ce5977d469ee60637f0454db
package/README.md CHANGED
@@ -12,7 +12,7 @@ Phase groups come only from members that actually started. Exact phase strings s
12
12
 
13
13
  ## Presentation and navigation
14
14
 
15
- The run and each phase have independent disclosure state. 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. A running run initially expands; a terminal run loaded from history initially collapses. Local choices survive data updates while the keyed node remains mounted and reset only on a full remount.
15
+ The run and each phase derive disclosure control from their current lifecycle facts. The run stays expanded while its own status is running, failed, cancelled, or interrupted, or while any phase contains such a member; each affected phase also stays expanded. Forced-open headers are static expanded rows without button, keyboard, or `aria-expanded` promises. A phase folds once when every member completes, and the run folds once when it and every phase complete. Each clean layer then exposes an ordinary disclosure control whose local choice survives clean rerenders; new activity takes control again, and a remount derives the initial state from current data. 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.
16
16
 
17
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.
18
18
 
@@ -30,6 +30,6 @@ None.
30
30
 
31
31
  ## Known Limitations and Deferred Work
32
32
 
33
- - Only top-level calls through `dsh-tool-workflow` produce these records; nested Code Mode calls and direct `WorkflowService` consumers do not.
33
+ - Only top-level calls through `dsh-tool-workflow` produce these records; nested Code Mode calls and direct `WorkflowEngine` consumers do not.
34
34
  - Navigation is intentionally live-only. Terminal members remain visible for review but never expose a cold-session opener from this node.
35
35
  - The node shows run, phase, member identity, and status only; scripts, outputs, errors, logs, usage, static topology, and controls remain outside this surface.
package/README.zh.md CHANGED
@@ -12,7 +12,7 @@
12
12
 
13
13
  ## 展示与导航
14
14
 
15
- 运行和每个阶段分别拥有本地 disclosure 状态。运行使用 32 像素 `--dsw-alias-bg-module-platform` 背景行,常驻向右/向下 chevron,并以内联状态点加状态文字表达结局,不使用胶囊。阶段使用 32 像素 disclosure 行,在可伸缩主区显示标题与成员数,在固定尾部精确显示聚合状态且不重复状态点。成员使用 16 像素状态点槽、可省略名称区和固定 64 像素状态列。运行中记录首次挂载时展开,从历史加载的终态记录首次挂载时折叠。只要 keyed 节点仍挂载,本地选择就在数据更新时保持;只有完整 remount 才重新初始化。
15
+ 运行和每个阶段都从当前生命周期事实派生 disclosure 控制。运行自身处于运行中、失败、已取消或已中断,或者任一阶段包含这些状态的成员时,运行保持展开;受影响的阶段也保持展开。强制展开的标题行只是静态展开行,不承诺按钮、键盘操作或 `aria-expanded`。阶段在全部成员完成时折叠一次;运行在自身和全部阶段都完成时折叠一次。每个干净层级随后恢复普通 disclosure 控件,其本地选择在干净状态的 rerender 中保持;新活动会重新取得控制,remount 则从当前数据派生初始状态。运行使用 32 像素 `--dsw-alias-bg-module-platform` 背景行,常驻向右/向下 chevron,并以内联状态点加状态文字表达结局,不使用胶囊。阶段使用 32 像素 disclosure 行,在可伸缩主区显示标题与成员数,在固定尾部精确显示聚合状态且不重复状态点。成员使用 16 像素状态点槽、可省略名称区和固定 64 像素状态列。
16
16
 
17
17
  只有所有实时事实同时成立时,成员才可打开子 Session:成员仍在运行、子 id 位于普通 Session 列表、列表行为 `origin: 'subagent'`、`parentId` 等于当前 Session,且列表行仍标记运行。带下划线的成员文字是唯一可见导航提示;键盘聚焦时,名称区显示 2 像素 business-primary 焦点环,右侧状态仍只显示“运行中”。组件只调用注入的普通 `sessions.open(id)`;远程、仅地址化、父级不符或终态的行都不可交互。
18
18
 
@@ -20,7 +20,7 @@
20
20
 
21
21
  本包把 Definition、locale 字典和 `workflow-run` renderer 都注册为 Cordis effect;移除客户端 entry 会撤销三者。shipped Web bundle 在 `ui-conversation` 与 `ui-tool` 之后装配该插件。
22
22
 
23
- ## Model Experience
23
+ ## 模型体验
24
24
 
25
25
  无,因为本包只为人类展示持久 Session 事实,不增加 prompt、工具 schema、请求内容或模型可见结果。
26
26
 
@@ -28,8 +28,8 @@
28
28
 
29
29
  无。
30
30
 
31
- ## Known Limitations and Deferred Work
31
+ ## 已知限制与暂缓事项
32
32
 
33
- - 只有经 `dsh-tool-workflow` 发起的顶层调用会生成这些记录;嵌套 Code Mode 调用和直接 `WorkflowService` 消费方不会生成。
33
+ - 只有经 `dsh-tool-workflow` 发起的顶层调用会生成这些记录;嵌套 Code Mode 调用和直接 `WorkflowEngine` 消费方不会生成。
34
34
  - 导航刻意只面向实时运行。终态成员继续保留供复盘,但本节点永不为其提供冷 Session 入口。
35
35
  - 节点只显示运行、阶段、成员身份与状态;脚本、输出、错误、日志、用量、静态拓扑和控制操作都不属于本界面。
package/lib/client.js CHANGED
@@ -9,7 +9,7 @@ window.__ModuleLoader__.load({
9
9
  let _deepseek_ai_dsh_client_ui_primitives = require("@deepseek-ai/dsh-client-ui-primitives");
10
10
  let _deepseek_ai_dsh_client_runtime_client = require("@deepseek-ai/dsh-client-runtime/client");
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);cursor:pointer;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;cursor:pointer;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: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}}";
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");
@@ -19,28 +19,28 @@ window.__ModuleLoader__.load({
19
19
  document.head.appendChild(tag);
20
20
  }
21
21
  var WorkflowRunPanel_module_css_default = {
22
- "members": "DBuyfa_members",
22
+ "phaseCount": "DBuyfa_phaseCount",
23
+ "memberStatus": "DBuyfa_memberStatus",
23
24
  "runLeading": "DBuyfa_runLeading",
24
- "phaseLeading": "DBuyfa_phaseLeading",
25
+ "memberRow": "DBuyfa_memberRow",
26
+ "statusTail": "DBuyfa_statusTail",
27
+ "memberLabelWrap": "DBuyfa_memberLabelWrap",
28
+ "root": "DBuyfa_root",
25
29
  "phaseTitle": "DBuyfa_phaseTitle",
26
- "separator": "DBuyfa_separator",
27
- "memberLabel": "DBuyfa_memberLabel",
28
- "runSummary": "DBuyfa_runSummary",
29
- "dotSlot": "DBuyfa_dotSlot",
30
30
  "phaseList": "DBuyfa_phaseList",
31
- "memberStatus": "DBuyfa_memberStatus",
32
31
  "runTitle": "DBuyfa_runTitle",
33
- "memberRow": "DBuyfa_memberRow",
32
+ "runHeader": "DBuyfa_runHeader",
33
+ "runSummary": "DBuyfa_runSummary",
34
+ "phaseHeader": "DBuyfa_phaseHeader",
35
+ "phaseLeading": "DBuyfa_phaseLeading",
36
+ "dotSlot": "DBuyfa_dotSlot",
37
+ "memberLabel": "DBuyfa_memberLabel",
38
+ "phase": "DBuyfa_phase",
34
39
  "phaseStatus": "DBuyfa_phaseStatus",
40
+ "members": "DBuyfa_members",
41
+ "separator": "DBuyfa_separator",
35
42
  "empty": "DBuyfa_empty",
36
- "statusTail": "DBuyfa_statusTail",
37
- "memberButton": "DBuyfa_memberButton",
38
- "memberLabelWrap": "DBuyfa_memberLabelWrap",
39
- "phase": "DBuyfa_phase",
40
- "phaseHeader": "DBuyfa_phaseHeader",
41
- "phaseCount": "DBuyfa_phaseCount",
42
- "root": "DBuyfa_root",
43
- "runHeader": "DBuyfa_runHeader"
43
+ "memberButton": "DBuyfa_memberButton"
44
44
  };
45
45
  //#endregion
46
46
  //#region lib/types/client/WorkflowRunPanel.js
@@ -75,6 +75,31 @@ window.__ModuleLoader__.load({
75
75
  function memberCount(count, t) {
76
76
  return t(count === 1 ? "run.members.one" : "run.members.other", { count });
77
77
  }
78
+ function phaseRequiresExpansion(phase) {
79
+ return phase.members.some((member) => member.status !== "completed");
80
+ }
81
+ /* v8 ignore next -- DisclosureRow requires the callback but cannot invoke it when expandable is false. */
82
+ const forcedOpenToggle = () => {};
83
+ function ManualDisclosure(props) {
84
+ const [open, setOpen] = (0, react.useState)(false);
85
+ return (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.DisclosureRow, {
86
+ ...props,
87
+ open,
88
+ expandable: true,
89
+ onToggle: () => {
90
+ setOpen((value) => !value);
91
+ }
92
+ });
93
+ }
94
+ function StatusDisclosure({ cleanCycleKey, requiresExpansion, ...props }) {
95
+ if (!requiresExpansion) return (0, react_jsx_runtime.jsx)(ManualDisclosure, { ...props }, cleanCycleKey);
96
+ return (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.DisclosureRow, {
97
+ ...props,
98
+ open: true,
99
+ expandable: false,
100
+ onToggle: forcedOpenToggle
101
+ });
102
+ }
78
103
  function phaseStatusSummary(members, t) {
79
104
  const counts = /* @__PURE__ */ new Map();
80
105
  for (const member of members) counts.set(member.status, (counts.get(member.status) ?? 0) + 1);
@@ -97,13 +122,11 @@ window.__ModuleLoader__.load({
97
122
  }
98
123
  return result;
99
124
  }
100
- function RunHeader({ count, name, onToggle, open, status, t }) {
101
- return (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.DisclosureRow, {
125
+ function RunHeader({ children, count, name, requiresExpansion, status, t }) {
126
+ return (0, react_jsx_runtime.jsx)(StatusDisclosure, {
102
127
  icon: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconChevronRightOutline14, {}),
103
128
  title: t("run.title", { name }),
104
- open,
105
- expandable: true,
106
- onToggle,
129
+ requiresExpansion,
107
130
  expandOnRowClick: true,
108
131
  previewChevron: false,
109
132
  keepContentWhenOpen: true,
@@ -124,7 +147,8 @@ window.__ModuleLoader__.load({
124
147
  "data-status": status,
125
148
  children: [(0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.StateDot, { state: dotState(status) }), (0, react_jsx_runtime.jsx)("span", { children: t(STATUS_KEYS[status]) })]
126
149
  })
127
- ] })
150
+ ] }),
151
+ children
128
152
  });
129
153
  }
130
154
  function MemberRow({ member, navigable, openSession, t }) {
@@ -166,16 +190,11 @@ window.__ModuleLoader__.load({
166
190
  });
167
191
  }
168
192
  function PhaseSection({ phase, navigable, openSession, t }) {
169
- const [open, setOpen] = (0, react.useState)(false);
170
- const toggle = () => {
171
- setOpen((value) => !value);
172
- };
173
- return (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.DisclosureRow, {
193
+ return (0, react_jsx_runtime.jsx)(StatusDisclosure, {
174
194
  icon: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconChevronRightOutline14, {}),
175
195
  title: readablePhase(phase.phase, t),
176
- open,
177
- expandable: true,
178
- onToggle: toggle,
196
+ cleanCycleKey: phase.members.length,
197
+ requiresExpansion: phaseRequiresExpansion(phase),
179
198
  expandOnRowClick: true,
180
199
  previewChevron: false,
181
200
  keepContentWhenOpen: true,
@@ -210,36 +229,34 @@ window.__ModuleLoader__.load({
210
229
  })
211
230
  });
212
231
  }
213
- /** Render one durable workflow run with independent run and phase disclosure. */
232
+ /** Render one durable workflow run with status-driven run and phase disclosure. */
214
233
  function WorkflowRunPanel({ node, sessionId, useSessions, openSession, t }) {
215
- const [open, setOpen] = (0, react.useState)(() => node.data.status === "running");
216
- const memberCount = node.data.phases.reduce((count, phase) => count + phase.members.length, 0);
234
+ const totalMembers = node.data.phases.reduce((count, phase) => count + phase.members.length, 0);
235
+ const requiresExpansion = node.data.status !== "completed" || node.data.phases.some(phaseRequiresExpansion);
217
236
  const navigable = useSessions((sessions) => navigableMembers(sessions, node.data.phases, sessionId), _deepseek_ai_dsh_client_runtime_client.shallowEqual);
218
- return (0, react_jsx_runtime.jsxs)("section", {
237
+ return (0, react_jsx_runtime.jsx)("section", {
219
238
  className: WorkflowRunPanel_module_css_default.root,
220
239
  "data-workflow-run": true,
221
240
  "data-run-status": node.data.status,
222
- children: [(0, react_jsx_runtime.jsx)(RunHeader, {
223
- count: memberCount,
241
+ children: (0, react_jsx_runtime.jsx)(RunHeader, {
242
+ count: totalMembers,
224
243
  name: node.data.name,
225
- open,
244
+ requiresExpansion,
226
245
  status: node.data.status,
227
246
  t,
228
- onToggle: () => {
229
- setOpen((value) => !value);
230
- }
231
- }), open && (0, react_jsx_runtime.jsx)("div", {
232
- className: WorkflowRunPanel_module_css_default.phaseList,
233
- children: node.data.phases.length === 0 ? (0, react_jsx_runtime.jsx)("span", {
234
- className: WorkflowRunPanel_module_css_default.empty,
235
- children: t("run.empty")
236
- }) : node.data.phases.map((phase) => (0, react_jsx_runtime.jsx)(PhaseSection, {
237
- phase,
238
- navigable,
239
- openSession,
240
- t
241
- }, phase.key))
242
- })]
247
+ children: (0, react_jsx_runtime.jsx)("div", {
248
+ className: WorkflowRunPanel_module_css_default.phaseList,
249
+ children: node.data.phases.length === 0 ? (0, react_jsx_runtime.jsx)("span", {
250
+ className: WorkflowRunPanel_module_css_default.empty,
251
+ children: t("run.empty")
252
+ }) : node.data.phases.map((phase) => (0, react_jsx_runtime.jsx)(PhaseSection, {
253
+ phase,
254
+ navigable,
255
+ openSession,
256
+ t
257
+ }, phase.key))
258
+ })
259
+ })
243
260
  });
244
261
  }
245
262
  //#endregion
@@ -1,11 +1,11 @@
1
1
  import type { PropsLocale, PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots';
2
2
  import { type SessionId } from '@deepseek-ai/dsh-client-runtime/client';
3
- /** Navigation action injected from the plugin's own SessionsService access. */
3
+ /** Navigation action injected from the plugin's own SessionRuntime access. */
4
4
  export interface WorkflowRunInjected {
5
5
  readonly openSession: (id: SessionId) => void;
6
6
  }
7
7
  /** Complete keyed Chat renderer props. */
8
8
  export type WorkflowRunPanelProps = PropsRuntime<'conversation.chat.node', 'workflow-run'> & PropsLocale<'workflowRun'> & WorkflowRunInjected;
9
- /** Render one durable workflow run with independent run and phase disclosure. */
9
+ /** Render one durable workflow run with status-driven run and phase disclosure. */
10
10
  export declare function WorkflowRunPanel({ node, sessionId, useSessions, openSession, t }: WorkflowRunPanelProps): import("react").JSX.Element;
11
11
  //# sourceMappingURL=WorkflowRunPanel.d.ts.map
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.0.1-rc.2",
4
+ "version": "0.0.1-rc.3",
5
5
  "publishConfig": {
6
6
  "access": "restricted"
7
7
  },
@@ -50,29 +50,29 @@
50
50
  "react": "^18.2.0"
51
51
  },
52
52
  "peerDependencies": {
53
- "@deepseek-ai/dsh-client-locale": "^0.0.1-rc.2",
54
- "@deepseek-ai/dsh-client-runtime": "^0.0.1-rc.2",
55
- "@deepseek-ai/dsh-client-ui-conversation": "^0.0.1-rc.2",
56
- "@deepseek-ai/dsh-client-ui-primitives": "^0.0.1-rc.2",
57
- "@deepseek-ai/dsh-client-ui-slots": "^0.0.1-rc.2",
58
- "@deepseek-ai/dsh-invariants": "^0.0.1-rc.2",
59
- "@deepseek-ai/dsh-session": "^0.0.1-rc.2",
60
- "@deepseek-ai/dsh-tool-workflow": "^0.0.1-rc.2",
61
- "@deepseek-ai/dsh-workflow": "^0.0.1-rc.2",
62
- "@deepseek-ai/cordis": "^4.0.1-rc.1"
53
+ "@deepseek-ai/dsh-client-locale": "^0.0.1-rc.3",
54
+ "@deepseek-ai/dsh-client-runtime": "^0.0.1-rc.3",
55
+ "@deepseek-ai/dsh-client-ui-conversation": "^0.0.1-rc.3",
56
+ "@deepseek-ai/dsh-client-ui-slots": "^0.0.1-rc.3",
57
+ "@deepseek-ai/dsh-invariants": "^0.0.1-rc.3",
58
+ "@deepseek-ai/dsh-session": "^0.0.1-rc.3",
59
+ "@deepseek-ai/dsh-tool-workflow": "^0.0.1-rc.3",
60
+ "@deepseek-ai/dsh-client-ui-primitives": "^0.0.1-rc.3",
61
+ "@deepseek-ai/cordis": "^4.0.1-rc.1",
62
+ "@deepseek-ai/dsh-workflow": "^0.0.1-rc.3"
63
63
  },
64
64
  "devDependencies": {
65
65
  "@types/react": "~18.3.1",
66
- "@deepseek-ai/dsh-client-runtime": "^0.0.1-rc.2",
67
- "@deepseek-ai/dsh-client-test-runtime": "^0.0.1-rc.2",
68
- "@deepseek-ai/dsh-client-locale": "^0.0.1-rc.2",
69
- "@deepseek-ai/dsh-client-ui-conversation": "^0.0.1-rc.2",
70
- "@deepseek-ai/dsh-client-ui-primitives": "^0.0.1-rc.2",
71
- "@deepseek-ai/dsh-client-ui-slots": "^0.0.1-rc.2",
72
- "@deepseek-ai/dsh-invariants": "^0.0.1-rc.2",
73
- "@deepseek-ai/dsh-session": "^0.0.1-rc.2",
74
- "@deepseek-ai/dsh-tool-workflow": "^0.0.1-rc.2",
75
- "@deepseek-ai/dsh-workflow": "^0.0.1-rc.2",
66
+ "@deepseek-ai/dsh-client-locale": "^0.0.1-rc.3",
67
+ "@deepseek-ai/dsh-client-runtime": "^0.0.1-rc.3",
68
+ "@deepseek-ai/dsh-client-test-runtime": "^0.0.1-rc.3",
69
+ "@deepseek-ai/dsh-client-ui-conversation": "^0.0.1-rc.3",
70
+ "@deepseek-ai/dsh-client-ui-primitives": "^0.0.1-rc.3",
71
+ "@deepseek-ai/dsh-client-ui-slots": "^0.0.1-rc.3",
72
+ "@deepseek-ai/dsh-invariants": "^0.0.1-rc.3",
73
+ "@deepseek-ai/dsh-session": "^0.0.1-rc.3",
74
+ "@deepseek-ai/dsh-tool-workflow": "^0.0.1-rc.3",
75
+ "@deepseek-ai/dsh-workflow": "^0.0.1-rc.3",
76
76
  "@deepseek-ai/cordis": "^4.0.1-rc.1"
77
77
  },
78
78
  "scripts": {