@deepseek-ai/dsh-client-ui-subagent 0.1.7-alpha.2 → 0.1.7-rc.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
@@ -1,6 +1,64 @@
1
- # Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each
2
- # side as of the last confirmed-consistent state. Both languages carry equal authority;
3
- # after editing either side, bring the other along and re-record with:
1
+ # Bilingual-pair consistency record for README.md (docs/i18n/README.md): per heading
2
+ # section, a hash of its English and Chinese blocks outside code blocks and generated regions.
3
+ # After editing either side, bring the other along and re-record with:
4
4
  # pnpm run verify-translation-pairing --write packages/client/ui-subagent/README.md
5
- README.md: b3dfb4a3aa56dbf240f4b76db410d45cc6ae5651
6
- README.zh.md: a6ebd6da3c3caba2a3bd015da450b5a33ab79d67
5
+ /:
6
+ en: ff1b1fbd0d7f629b
7
+ zh: c68a59640e73c0ce
8
+ /deepseek-ai-dsh-client-ui-subagent:
9
+ en: 930db612ece65ad4
10
+ zh: ad7e9d9afb4545ac
11
+ /deepseek-ai-dsh-client-ui-subagent/summary:
12
+ en: 50f267d55833a683
13
+ zh: 89d6b827576baa8b
14
+ /deepseek-ai-dsh-client-ui-subagent/table-of-contents:
15
+ en: d152484eb41ac6b4
16
+ zh: 09388d293f9be9cb
17
+ /deepseek-ai-dsh-client-ui-subagent/use-this-package:
18
+ en: 06f6bac3153361f5
19
+ zh: e8b23941cbd16036
20
+ /deepseek-ai-dsh-client-ui-subagent/use-this-package/browsing-the-tree:
21
+ en: 3508631091820123
22
+ zh: ec7da9e5bedb22ba
23
+ /deepseek-ai-dsh-client-ui-subagent/use-this-package/continuing-a-conversation:
24
+ en: 876e7152c8b9c4a6
25
+ zh: f89f5e2a812e8451
26
+ /deepseek-ai-dsh-client-ui-subagent/use-this-package/the-reference-source:
27
+ en: 6a5f91b7dfcefafe
28
+ zh: 2d11441952cfea53
29
+ /deepseek-ai-dsh-client-ui-subagent/understand-the-implementation:
30
+ en: 8dc3c556cd57bdd8
31
+ zh: f5c86a690bba7f7d
32
+ /deepseek-ai-dsh-client-ui-subagent/understand-the-implementation/catalog-derivation:
33
+ en: 5e1c83ef8eb26c52
34
+ zh: f5be8f1e78c74859
35
+ /deepseek-ai-dsh-client-ui-subagent/understand-the-implementation/duration-completion-and-tokens:
36
+ en: b817e9907392f59c
37
+ zh: e42feb97d572a989
38
+ /deepseek-ai-dsh-client-ui-subagent/understand-the-implementation/composer-election:
39
+ en: 1c15af4dd7c0b791
40
+ zh: f789737ab4dd8cb2
41
+ /deepseek-ai-dsh-client-ui-subagent/further-exploration:
42
+ en: 3b9b3cb4ad8f65f6
43
+ zh: 63a2c10a4613cca1
44
+ /deepseek-ai-dsh-client-ui-subagent/model-experience:
45
+ en: 215e7ba838619b7b
46
+ zh: a311da3843709f90
47
+ /deepseek-ai-dsh-client-ui-subagent/model-experience/subagent-label-text-in-the-user-prompt:
48
+ en: 7207881f1c032278
49
+ zh: 911d6e8b319da21a
50
+ /deepseek-ai-dsh-client-ui-subagent/model-experience/subagent-label-text-in-the-user-prompt/what-the-model-sees:
51
+ en: 5688696ee061a0e1
52
+ zh: 7199ef8cb8697960
53
+ /deepseek-ai-dsh-client-ui-subagent/model-experience/subagent-label-text-in-the-user-prompt/token-effect:
54
+ en: bf3c483598710d54
55
+ zh: 32742fbb880db1b2
56
+ /deepseek-ai-dsh-client-ui-subagent/model-experience/subagent-label-text-in-the-user-prompt/kv-cache-effect:
57
+ en: de2762a99572475f
58
+ zh: 9b41107ad14ebf8a
59
+ /deepseek-ai-dsh-client-ui-subagent/known-limitations-and-deferred-work:
60
+ en: ee310ff3cd487639
61
+ zh: 23793aa1c28a23af
62
+ /deepseek-ai-dsh-client-ui-subagent/known-limitations-and-deferred-work/dev-note:
63
+ en: 3dd148cecbb1a4df
64
+ zh: 626cc5ed9f65c72a
package/README.md CHANGED
@@ -25,12 +25,14 @@ Use this package to browse every subagent conversation beneath a parent session,
25
25
  <a id="use-this-package"></a>
26
26
  ## Use this package
27
27
 
28
- The session header keeps the current session title as the lineage breadcrumb; when the session's direct catalog has entries or a read has failed, the descendant-count trigger renders in the header actions band after the task list, with no breadcrumb separator. An absent catalog, an empty loading catalog, or a successfully loaded empty catalog hides the count trigger. The trigger opens that direct catalog, reports its total and running counts, and loads nested catalogs only when their rows expand. Select any depth to open that child's conversation with its exact `{parentSessionId, childSessionId, mode}` address, or use the row's trailing arrow to open the same address in the right Sidebar, preferring a separate pane when room permits.
28
+ The session header keeps the current session title as the lineage breadcrumb; when the session's direct catalog has entries or a read has failed, the descendant-count trigger renders at the start of the header actions band, with no breadcrumb separator. An absent catalog, an empty loading catalog, or a successfully loaded empty catalog hides the count trigger. The trigger opens that direct catalog, reports its total and running counts, and loads nested catalogs only when their rows expand. Select any depth to open that child's conversation with its exact `{parentSessionId, childSessionId, mode}` address, or use the row's trailing arrow to open the same address in the right Sidebar, preferring a separate pane when room permits.
29
29
 
30
30
  This package registers the `dsh-resource://subagentchat/session/<child>?parent=<parent>&mode=<mode>` resource and builtin Sidebar tab type. The resource retains the child `SessionReference` directly from its address without refreshing the parent catalog, and releases the reference when the tab record closes. The tab renders the shared `conversation.content` Factory through `sidebar.chat.conversation`, fixes the local View to Chat, and omits the main Conversation header and width controls.
31
31
 
32
32
  ### Browsing the tree
33
33
 
34
+ Hovering a trigger opens its catalog after 150ms; leaving both trigger and catalog closes it after 120ms. Clicking the descendant-count trigger pins its catalog until outside click or Escape from the trigger or tree. Breadcrumb-title clicks navigate to the corresponding conversation.
35
+
34
36
  Rows display mode plus activity and an optional log-backed title; running uses the shared ongoing loader, an inactive child whose latest closed turn completed normally uses the shared success dot, and other inactive children use the shared idle dot. Every row reserves the same 14px status column, centering smaller dots so titles align with the loader state. The compact header trigger vertically centers its activity glyph and count with a 4px gap. The trailing column stacks total durable provider usage above active-turn duration. Keyboard navigation works with ArrowRight/ArrowLeft to expand and collapse branches and ArrowUp/ArrowDown, Home, End, and Escape to navigate or close the tree. An unlabeled one-shot row falls back to its session id. A row is a known leaf only after its own catalog loads empty.
35
37
 
36
38
  ### Continuing a conversation
package/README.zh.md CHANGED
@@ -25,12 +25,14 @@ kind: "package-reference"
25
25
  <a id="use-this-package"></a>
26
26
  ## 使用本包
27
27
 
28
- 会话页头把当前会话标题作为谱系面包屑;当会话的直接目录有子项或读取失败时,后代数量触发器渲染在页头操作区、任务列表之后,不带任何面包屑分隔符。目录缺席、空目录加载中或成功加载为空时,均隐藏数量触发器。触发器打开该直接目录,报告总数与运行数,并且只在行展开时加载嵌套目录。选择任意深度,即可用该子会话的确切 `{parentSessionId, childSessionId, mode}` 地址打开其对话;也可以使用行尾箭头在右侧 Sidebar 打开同一地址,并在空间允许时优先使用独立分栏。
28
+ 会话页头把当前会话标题作为谱系面包屑;当会话的直接目录有子项或读取失败时,后代数量触发器渲染在页头操作区的最前方,不带任何面包屑分隔符。目录缺席、空目录加载中或成功加载为空时,均隐藏数量触发器。触发器打开该直接目录,报告总数与运行数,并且只在行展开时加载嵌套目录。选择任意深度,即可用该子会话的确切 `{parentSessionId, childSessionId, mode}` 地址打开其对话;也可以使用行尾箭头在右侧 Sidebar 打开同一地址,并在空间允许时优先使用独立分栏。
29
29
 
30
30
  本包注册 `dsh-resource://subagentchat/session/<child>?parent=<parent>&mode=<mode>` 资源与 builtin Sidebar tab 类型。资源直接根据地址保留 child 的 `SessionReference`,不刷新 parent 目录,并在 tab 记录关闭时释放 reference。tab 通过 `sidebar.chat.conversation` 渲染共享 `conversation.content` Factory,把局部 View 固定为 Chat,并省略主 Conversation 的 Header 与宽度控制。
31
31
 
32
32
  ### 浏览目录
33
33
 
34
+ 悬停触发器 150ms 后打开目录;指针离开触发器和目录后,经过 120ms 关闭。点击后代数量触发器会固定目录,直到点击外部,或在触发器或树内按 Escape 关闭。点击面包屑标题会导航至对应会话。
35
+
34
36
  行显示 mode、活动状态与由日志支撑的可选 title;running 使用共享 ongoing loading,最近一个已结束轮次正常完成的 inactive child 使用共享 success 绿点,其他 inactive child 使用共享 idle 灰点。每行都为状态图标预留相同的 14px 列宽,并将较小的圆点居中,使 title 与 loading 状态对齐。紧凑的页头触发器会垂直居中活动图标与数量,并保留 4px 水平间距。尾随列在上行显示提供方的持久化 token 用量总计,在下行显示活跃轮次耗时。键盘导航:ArrowRight/ArrowLeft 展开和折叠分支;ArrowUp/ArrowDown、Home、End 与 Escape 用于导航或关闭树。没有 label 的 one-shot 行回退到其会话 id。只有一行自身的目录加载为空后,它才是已知叶子。
35
37
 
36
38
  ### 续接对话
package/lib/client.js CHANGED
@@ -9,7 +9,7 @@ window.__ModuleLoader__.load({
9
9
  let react_dom = require("react-dom");
10
10
  let _deepseek_ai_dsh_client_ui_primitives = require("@deepseek-ai/dsh-client-ui-primitives");
11
11
  //#region \0dsh-css:/home/runner/work/deepseek-harness/deepseek-harness/packages/client/ui-subagent/src/client/SubagentHeaderLineage.module.css.mjs
12
- const css$2 = ".ZKlsPq_root{align-items:center;gap:10px;min-width:0;display:inline-flex;position:relative}.ZKlsPq_switcherRoot{min-width:0;margin-left:6px}.ZKlsPq_trigger,.ZKlsPq_switcherTrigger{min-height:28px;color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:0;border-radius:6px;align-items:center;padding:3px 2px;font-size:12px;line-height:18px;display:inline-flex}.ZKlsPq_trigger{gap:4px}.ZKlsPq_switcherTrigger{min-width:0;max-width:244px;color:var(--dsw-alias-label-primary);gap:4px;font-weight:500}.ZKlsPq_ancestorSwitcherTrigger{color:var(--dsw-alias-label-tertiary);font-weight:400}.ZKlsPq_switcherTitle{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.ZKlsPq_switcherTrigger svg{flex:none}.ZKlsPq_activitySlot{flex:none;justify-content:center;align-items:center;width:14px;height:14px;display:inline-flex}.ZKlsPq_trigger:hover,.ZKlsPq_trigger:focus-visible{color:var(--dsw-alias-label-secondary)}.ZKlsPq_switcherTrigger:hover,.ZKlsPq_switcherTrigger:focus-visible{color:var(--dsw-alias-label-primary)}.ZKlsPq_ancestorSwitcherTrigger:hover,.ZKlsPq_ancestorSwitcherTrigger:focus-visible{color:var(--dsw-alias-label-tertiary)}.ZKlsPq_trigger svg,.ZKlsPq_switcherTrigger svg{transition:transform .12s}.ZKlsPq_triggerOpen{transform:rotate(180deg)}.ZKlsPq_menu{z-index:100;box-sizing:border-box;background:var(--dsw-specific-menu);width:336px;max-width:min(400px,100vw - 32px);max-height:min(560px,100vh - 140px);backdrop-filter:var(--dsw-menu-backdrop-filter);--dsh-scrollbar-thumb:var(--dsw-alias-scrollbar-bg-l2);--dsh-scrollbar-thumb-hover:var(--dsw-alias-scrollbar-hover-l2);--dsw-elevation-stroke-color:var(--dsw-alias-border-l1);box-shadow:var(--dsw-elevation-prominent);border-radius:16px;flex-direction:column;padding:3px;display:flex;position:fixed;overflow:auto}.ZKlsPq_node{min-width:0;position:relative}.ZKlsPq_menu>.ZKlsPq_node{margin-left:-2px}.ZKlsPq_row{box-sizing:border-box;width:100%;min-height:44px;color:var(--dsw-alias-label-primary);text-align:left;cursor:pointer;background:0 0;border:0;border-radius:7px;outline:none;align-items:flex-start;gap:6px;padding:6px 7px 6px 9px;font-size:12px;line-height:17px;display:flex;position:relative}.ZKlsPq_row:hover>.ZKlsPq_clickarea,.ZKlsPq_row:focus-visible>.ZKlsPq_clickarea{background:var(--dsw-alias-interactive-bg-hover)}.ZKlsPq_clickarea{box-sizing:border-box;border-radius:7px;flex:1;align-self:stretch;align-items:flex-start;gap:6px;min-width:0;margin:-6px -7px;padding:6px 7px;display:flex}.ZKlsPq_rowActivitySlot{flex:none;justify-content:center;align-items:center;width:14px;height:17px;display:inline-flex}.ZKlsPq_disclosure,.ZKlsPq_disclosureSpace{flex:none;width:14px;height:17px}.ZKlsPq_disclosure{color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:0;justify-content:center;align-items:center;padding:0;transition:transform .12s;display:inline-flex}.ZKlsPq_disclosure svg{width:12px;height:12px}.ZKlsPq_disclosure:hover{color:var(--dsw-alias-label-primary)}.ZKlsPq_disclosureOpen{transform:rotate(90deg)}.ZKlsPq_content{flex-direction:column;flex:1;min-width:0;display:flex}.ZKlsPq_label,.ZKlsPq_summary{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.ZKlsPq_label{color:inherit;font-weight:400}.ZKlsPq_currentLabel{font-weight:600}.ZKlsPq_summary,.ZKlsPq_metrics{color:var(--dsw-alias-label-tertiary);font-size:10px;line-height:15px}.ZKlsPq_metrics{font-variant-numeric:tabular-nums;text-align:right;white-space:nowrap;flex:none;grid-template-rows:17px 15px;display:grid}.ZKlsPq_metricToken{grid-row:1;line-height:17px}.ZKlsPq_metricDuration{grid-row:2}.ZKlsPq_sidebarButton{corner-shape:round;width:28px;height:28px;color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:0;border-radius:50%;flex:none;justify-content:center;align-items:center;margin:4px 0;padding:6px;display:inline-flex}.ZKlsPq_sidebarButton:hover,.ZKlsPq_sidebarButton:focus-visible{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.ZKlsPq_children{margin-left:16px;padding-left:3px;position:relative}.ZKlsPq_children:before,.ZKlsPq_children>.ZKlsPq_node:before{content:\"\";border-left:.5px solid var(--dsw-alias-border-l2);position:absolute;left:0}.ZKlsPq_children:before{height:23px;top:-23px}.ZKlsPq_children[aria-busy=true]:before{content:none}.ZKlsPq_children>.ZKlsPq_node:before{top:0;bottom:0;left:-3px}.ZKlsPq_children>.ZKlsPq_node:last-child:before{height:15px;bottom:auto}.ZKlsPq_children>.ZKlsPq_node>.ZKlsPq_row:before{content:\"\";border-top:.5px solid var(--dsw-alias-border-l2);width:12px;position:absolute;top:14px;left:-3px}.ZKlsPq_notice,.ZKlsPq_error{color:var(--dsw-alias-label-tertiary);padding:8px 10px;font-size:11px;line-height:16px}.ZKlsPq_error{color:var(--dsw-alias-state-error-primary);justify-content:space-between;align-items:center;gap:10px;display:flex}.ZKlsPq_refresh{color:inherit;cursor:pointer;background:0 0;border:0;border-radius:5px;flex:none;align-items:center;gap:3px;padding:3px 5px;display:inline-flex}.ZKlsPq_refresh svg{width:12px;height:12px}.ZKlsPq_refresh:hover{background:var(--dsw-alias-interactive-bg-hover)}";
12
+ const css$2 = ".ZKlsPq_root{align-items:center;gap:10px;min-width:0;display:inline-flex;position:relative}.ZKlsPq_switcherRoot{min-width:0;margin-left:6px}.ZKlsPq_trigger,.ZKlsPq_switcherTrigger{border-radius:var(--dsw-radius-sm);min-height:28px;color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:0;align-items:center;padding:3px 2px;font-size:12px;line-height:18px;display:inline-flex}.ZKlsPq_trigger{gap:4px}.ZKlsPq_switcherTrigger{min-width:0;max-width:244px;color:var(--dsw-alias-label-primary);gap:4px;font-weight:500}.ZKlsPq_ancestorSwitcherTrigger{color:var(--dsw-alias-label-tertiary);font-weight:400}.ZKlsPq_switcherTitle{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.ZKlsPq_switcherTrigger svg{flex:none}.ZKlsPq_activitySlot{flex:none;justify-content:center;align-items:center;width:14px;height:14px;display:inline-flex}.ZKlsPq_trigger:hover,.ZKlsPq_trigger:focus-visible,.ZKlsPq_switcherTrigger:hover,.ZKlsPq_switcherTrigger:focus-visible{color:var(--dsw-alias-label-primary)}.ZKlsPq_ancestorSwitcherTrigger:hover,.ZKlsPq_ancestorSwitcherTrigger:focus-visible{color:var(--dsw-alias-label-tertiary)}.ZKlsPq_trigger svg,.ZKlsPq_switcherTrigger svg{transition:transform .12s}.ZKlsPq_triggerOpen{transform:rotate(180deg)}.ZKlsPq_menu{z-index:100;box-sizing:border-box;border-radius:var(--dsw-radius-lg);--dsh-scrollbar-thumb:var(--dsw-alias-scrollbar-bg-l2);--dsh-scrollbar-thumb-hover:var(--dsw-alias-scrollbar-hover-l2);--dsw-elevation-stroke-color:var(--dsw-alias-border-l1);width:336px;max-width:min(400px,100vw - 32px);max-height:min(560px,100vh - 140px);box-shadow:var(--dsw-elevation-prominent);flex-direction:column;padding:3px;display:flex;position:fixed;overflow:hidden}.ZKlsPq_menu:before{content:\"\";z-index:-1;border-radius:inherit;background:var(--dsw-specific-menu);backdrop-filter:var(--dsw-menu-backdrop-filter);position:absolute;inset:0}.ZKlsPq_menuBody{flex-direction:column;flex:auto;min-height:0;display:flex;overflow:auto}.ZKlsPq_node{min-width:0;position:relative}.ZKlsPq_menuBody>.ZKlsPq_node{margin-left:-2px}.ZKlsPq_row{box-sizing:border-box;border-radius:var(--dsw-radius-lg);width:100%;min-height:44px;color:var(--dsw-alias-label-primary);text-align:left;cursor:pointer;background:0 0;border:0;outline:none;align-items:flex-start;gap:6px;padding:6px 7px 6px 9px;font-size:12px;line-height:17px;display:flex;position:relative}.ZKlsPq_row:hover>.ZKlsPq_clickarea,.ZKlsPq_row:focus-visible>.ZKlsPq_clickarea{background:var(--dsw-alias-interactive-bg-hover)}.ZKlsPq_clickarea{box-sizing:border-box;border-radius:var(--dsw-radius-lg);flex:1;align-self:stretch;align-items:flex-start;gap:6px;min-width:0;margin:-6px -7px;padding:6px 7px;display:flex}.ZKlsPq_rowActivitySlot{flex:none;justify-content:center;align-items:center;width:14px;height:17px;display:inline-flex}.ZKlsPq_disclosure,.ZKlsPq_disclosureSpace{flex:none;width:14px;height:17px}.ZKlsPq_disclosure{color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:0;justify-content:center;align-items:center;padding:0;transition:transform .12s;display:inline-flex}.ZKlsPq_disclosure svg{width:12px;height:12px}.ZKlsPq_disclosure:hover{color:var(--dsw-alias-label-primary)}.ZKlsPq_disclosureOpen{transform:rotate(90deg)}.ZKlsPq_content{flex-direction:column;flex:1;min-width:0;display:flex}.ZKlsPq_label,.ZKlsPq_summary{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.ZKlsPq_label{color:inherit;font-weight:400}.ZKlsPq_currentLabel{font-weight:600}.ZKlsPq_summary,.ZKlsPq_metrics{color:var(--dsw-alias-label-tertiary);font-size:10px;line-height:15px}.ZKlsPq_metrics{font-variant-numeric:tabular-nums;text-align:right;white-space:nowrap;flex:none;grid-template-rows:17px 15px;display:grid}.ZKlsPq_metricToken{grid-row:1;line-height:17px}.ZKlsPq_metricDuration{grid-row:2}.ZKlsPq_sidebarButton{border-radius:var(--dsw-radius-sm);width:28px;height:28px;color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:0;flex:none;justify-content:center;align-items:center;margin:4px 0;padding:6px;display:inline-flex}.ZKlsPq_sidebarButton:hover,.ZKlsPq_sidebarButton:focus-visible{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.ZKlsPq_children{margin-left:16px;padding-left:3px;position:relative}.ZKlsPq_children:before,.ZKlsPq_children>.ZKlsPq_node:before{content:\"\";border-left:.5px solid var(--dsw-alias-border-l2);position:absolute;left:0}.ZKlsPq_children:before{height:23px;top:-23px}.ZKlsPq_children[aria-busy=true]:before{content:none}.ZKlsPq_children>.ZKlsPq_node:before{top:0;bottom:0;left:-3px}.ZKlsPq_children>.ZKlsPq_node:last-child:before{height:15px;bottom:auto}.ZKlsPq_children>.ZKlsPq_node>.ZKlsPq_row:before{content:\"\";border-top:.5px solid var(--dsw-alias-border-l2);width:12px;position:absolute;top:14px;left:-3px}.ZKlsPq_notice,.ZKlsPq_error{color:var(--dsw-alias-label-tertiary);padding:8px 10px;font-size:11px;line-height:16px}.ZKlsPq_error{color:var(--dsw-alias-state-error-primary);justify-content:space-between;align-items:center;gap:10px;display:flex}.ZKlsPq_refresh{border-radius:var(--dsw-radius-sm);color:inherit;cursor:pointer;background:0 0;border:0;flex:none;align-items:center;gap:3px;padding:3px 5px;display:inline-flex}.ZKlsPq_refresh svg{width:12px;height:12px}.ZKlsPq_refresh:hover{background:var(--dsw-alias-interactive-bg-hover)}";
13
13
  const tagId$2 = "@deepseek-ai/dsh-client-ui-subagent/SubagentHeaderLineage.module.css";
14
14
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$2) + "]") === null) {
15
15
  const tag = document.createElement("style");
@@ -31,6 +31,7 @@ window.__ModuleLoader__.load({
31
31
  "error": "ZKlsPq_error",
32
32
  "label": "ZKlsPq_label",
33
33
  "menu": "ZKlsPq_menu",
34
+ "menuBody": "ZKlsPq_menuBody",
34
35
  "metricDuration": "ZKlsPq_metricDuration",
35
36
  "metricToken": "ZKlsPq_metricToken",
36
37
  "metrics": "ZKlsPq_metrics",
@@ -296,16 +297,20 @@ window.__ModuleLoader__.load({
296
297
  children: durationMetric.compact
297
298
  })]
298
299
  }),
299
- !isCurrent && (0, react_jsx_runtime.jsx)("button", {
300
- type: "button",
301
- className: SubagentHeaderLineage_module_css_default.sidebarButton,
302
- "aria-label": t("open.sidebar", { label }),
303
- title: t("open.sidebar", { label }),
304
- onClick: openAside,
305
- onKeyDown: (event) => {
306
- event.stopPropagation();
307
- },
308
- children: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconChevronRightOutlineRegular, {})
300
+ !isCurrent && (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
301
+ label: t("open.sidebar"),
302
+ side: "bottom",
303
+ align: "end",
304
+ children: (0, react_jsx_runtime.jsx)("button", {
305
+ type: "button",
306
+ className: SubagentHeaderLineage_module_css_default.sidebarButton,
307
+ "aria-label": t("open.sidebar.aria", { label }),
308
+ onClick: openAside,
309
+ onKeyDown: (event) => {
310
+ event.stopPropagation();
311
+ },
312
+ children: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconChevronRightOutlineRegular, {})
313
+ })
309
314
  })
310
315
  ]
311
316
  })]
@@ -370,6 +375,7 @@ window.__ModuleLoader__.load({
370
375
  const menuRef = (0, react.useRef)(null);
371
376
  const hoverOpenTimer = (0, react.useRef)(void 0);
372
377
  const hoverCloseTimer = (0, react.useRef)(void 0);
378
+ const pinnedRef = (0, react.useRef)(false);
373
379
  const currentEntry = currentSessionId === void 0 ? void 0 : catalog?.entries.find((entry) => entry.id === currentSessionId);
374
380
  const switcherDisplayTitle = currentEntry !== void 0 ? currentEntry.label ?? currentEntry.id : displayTitle;
375
381
  const directChildren = catalog?.entries ?? [];
@@ -402,6 +408,7 @@ window.__ModuleLoader__.load({
402
408
  setOpen(true);
403
409
  setMenuPosition(catalogMenuPosition(trigger));
404
410
  } else {
411
+ pinnedRef.current = false;
405
412
  setOpen(false);
406
413
  setMenuPosition(void 0);
407
414
  setExpanded(/* @__PURE__ */ new Set());
@@ -422,6 +429,7 @@ window.__ModuleLoader__.load({
422
429
  const scheduleHoverClose = () => {
423
430
  cancelHoverOpen();
424
431
  cancelHoverClose();
432
+ if (pinnedRef.current) return;
425
433
  hoverCloseTimer.current = setTimeout(() => {
426
434
  hoverCloseTimer.current = void 0;
427
435
  changeOpen(false);
@@ -481,6 +489,7 @@ window.__ModuleLoader__.load({
481
489
  cancelHoverOpen();
482
490
  cancelHoverClose();
483
491
  if (!open) return;
492
+ pinnedRef.current = false;
484
493
  setOpen(false);
485
494
  setExpanded(/* @__PURE__ */ new Set());
486
495
  }, [visible, open]);
@@ -514,16 +523,21 @@ window.__ModuleLoader__.load({
514
523
  className: `${SubagentHeaderLineage_module_css_default.root} ${variant === "switcher" ? SubagentHeaderLineage_module_css_default.switcherRoot : ""}`,
515
524
  ref: rootRef,
516
525
  onKeyDown: navigate,
517
- onMouseEnter: scheduleHoverOpen,
518
526
  onMouseLeave: scheduleHoverClose,
519
527
  children: [(0, react_jsx_runtime.jsxs)("button", {
520
528
  ref: triggerRef,
529
+ onMouseEnter: scheduleHoverOpen,
521
530
  type: "button",
522
531
  className: variant === "switcher" ? `${SubagentHeaderLineage_module_css_default.switcherTrigger} ${ancestorSwitcher ? SubagentHeaderLineage_module_css_default.ancestorSwitcherTrigger : ""}` : SubagentHeaderLineage_module_css_default.trigger,
523
532
  "aria-haspopup": "tree",
524
533
  "aria-expanded": open,
525
534
  "aria-label": variant === "switcher" ? t("switcher.aria", { title: switcherDisplayTitle }) : t(runningCount > 0 ? runningCountKey : totalCountKey, { count: runningCount > 0 ? runningCount : directCount }),
526
- onClick: openTitle === void 0 ? void 0 : () => {
535
+ onClick: openTitle === void 0 ? () => {
536
+ cancelHoverOpen();
537
+ cancelHoverClose();
538
+ pinnedRef.current = true;
539
+ if (!open) changeOpen(true);
540
+ } : () => {
527
541
  cancelHoverOpen();
528
542
  if (open) changeOpen(false);
529
543
  openTitle();
@@ -550,33 +564,36 @@ window.__ModuleLoader__.load({
550
564
  ref: menuRef,
551
565
  className: SubagentHeaderLineage_module_css_default.menu,
552
566
  style: menuPosition,
553
- role: "tree",
554
- "aria-label": t("tree.aria"),
555
567
  onMouseEnter: cancelHoverClose,
556
568
  onMouseLeave: scheduleHoverClose,
557
- children: (0, react_jsx_runtime.jsx)(CatalogRows, {
558
- parentSessionId: rootSessionId,
559
- currentSessionId,
560
- catalog: presentedCatalog,
561
- catalogs,
562
- summaries,
563
- expanded,
564
- level: 1,
565
- openChild,
566
- openChildAside,
567
- refreshProjection,
568
- toggleBranch,
569
- closeCatalog: () => {
570
- changeOpen(false);
571
- },
572
- t
569
+ children: (0, react_jsx_runtime.jsx)("div", {
570
+ className: SubagentHeaderLineage_module_css_default.menuBody,
571
+ role: "tree",
572
+ "aria-label": t("tree.aria"),
573
+ children: (0, react_jsx_runtime.jsx)(CatalogRows, {
574
+ parentSessionId: rootSessionId,
575
+ currentSessionId,
576
+ catalog: presentedCatalog,
577
+ catalogs,
578
+ summaries,
579
+ expanded,
580
+ level: 1,
581
+ openChild,
582
+ openChildAside,
583
+ refreshProjection,
584
+ toggleBranch,
585
+ closeCatalog: () => {
586
+ changeOpen(false);
587
+ },
588
+ t
589
+ })
573
590
  })
574
591
  }), document.body)]
575
592
  });
576
593
  }
577
594
  /**
578
595
  * Session-header catalog action for root sessions: the descendant count and
579
- * its dropdown, ordered after the task list. Child sessions render nothing
596
+ * its dropdown at the start of the header actions band. Child sessions render nothing
580
597
  * here — their breadcrumb switcher in the lineage slot owns the same
581
598
  * navigation.
582
599
  * @param props - Session standard props plus the catalog actions and translator.
@@ -630,7 +647,7 @@ window.__ModuleLoader__.load({
630
647
  }
631
648
  //#endregion
632
649
  //#region \0dsh-css:/home/runner/work/deepseek-harness/deepseek-harness/packages/client/ui-subagent/src/client/SubagentReadOnlyComposer.module.css.mjs
633
- const css$1 = ".XJ7liG_frame{border:.5px solid var(--dsw-alias-border-l4);background:var(--dsw-alias-bg-layer-1);min-height:54px;color:var(--dsw-alias-label-tertiary);border-radius:14px;justify-content:center;align-items:center;gap:8px;margin:0 24px 20px;padding:10px 16px;font-size:13px;line-height:20px;display:flex}.XJ7liG_frame strong{color:var(--dsw-alias-label-primary);font-weight:510}";
650
+ const css$1 = ".XJ7liG_frame{border:.5px solid var(--dsw-alias-border-l4);border-radius:var(--dsw-radius-lg);background:var(--dsw-alias-bg-layer-1);min-height:54px;color:var(--dsw-alias-label-tertiary);justify-content:center;align-items:center;gap:8px;margin:0 24px 20px;padding:10px 16px;font-size:13px;line-height:20px;display:flex}.XJ7liG_frame strong{color:var(--dsw-alias-label-primary);font-weight:510}";
634
651
  const tagId$1 = "@deepseek-ai/dsh-client-ui-subagent/SubagentReadOnlyComposer.module.css";
635
652
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$1) + "]") === null) {
636
653
  const tag = document.createElement("style");
@@ -830,8 +847,8 @@ window.__ModuleLoader__.load({
830
847
  "tokens.thousand": "{value}K",
831
848
  "tokens.million": "{value}M",
832
849
  "tokens.total": "{value} tok",
833
- "loading.label": "正在加载子代理…",
834
- "load.error": "无法加载子代理",
850
+ "loading.label": "正在加载子智能体…",
851
+ "load.error": "无法加载子智能体",
835
852
  "retry": "重试",
836
853
  "mode.oneShot": "一次性",
837
854
  "mode.continuable": "可继续",
@@ -840,18 +857,19 @@ window.__ModuleLoader__.load({
840
857
  "activity.running": "正在运行",
841
858
  "activity.completed": "已完成",
842
859
  "activity.inactive": "当前未运行",
843
- "branch.collapse": "收起 {label} 的下级子代理",
844
- "branch.expand": "展开 {label} 的下级子代理",
845
- "count.total.one": "{count} 个子代理",
846
- "count.total.other": "{count} 个子代理",
847
- "count.running.one": "{count} 个子代理,正在运行",
848
- "count.running.other": "{count} 个子代理,正在运行",
849
- "switcher.aria": "切换子代理:{title}",
850
- "tree.aria": "子代理会话",
851
- "open.sidebar": "在侧边栏打开 {label}",
860
+ "branch.collapse": "收起 {label} 的下级子智能体",
861
+ "branch.expand": "展开 {label} 的下级子智能体",
862
+ "count.total.one": "{count} 个子智能体",
863
+ "count.total.other": "{count} 个子智能体",
864
+ "count.running.one": "{count} 个子智能体,正在运行",
865
+ "count.running.other": "{count} 个子智能体,正在运行",
866
+ "switcher.aria": "切换子智能体:{title}",
867
+ "tree.aria": "子智能体会话",
868
+ "open.sidebar": "在侧边栏打开",
869
+ "open.sidebar.aria": "在侧边栏打开 {label}",
852
870
  "sidebar.chat": "聊天",
853
- "readonly.oneShot.title": "一次性子代理记录",
854
- "readonly.title": "此子代理暂时只读",
871
+ "readonly.oneShot.title": "一次性子智能体记录",
872
+ "readonly.title": "此子智能体暂时只读",
855
873
  "readonly.oneShot.body": "一次性任务不支持后续消息,可在这里查看完整执行记录。",
856
874
  "readonly.body": "父会话当前不在线,重新打开父会话后即可继续发送消息。"
857
875
  };
@@ -889,7 +907,8 @@ window.__ModuleLoader__.load({
889
907
  "count.running.other": "{count} subagents running",
890
908
  "switcher.aria": "Switch subagent: {title}",
891
909
  "tree.aria": "Subagent sessions",
892
- "open.sidebar": "Open {label} in sidebar",
910
+ "open.sidebar": "Open in sidebar",
911
+ "open.sidebar.aria": "Open {label} in sidebar",
893
912
  "sidebar.chat": "Chat",
894
913
  "readonly.oneShot.title": "One-shot subagent record",
895
914
  "readonly.title": "This subagent is read-only for now",
@@ -949,7 +968,7 @@ window.__ModuleLoader__.load({
949
968
  ctx.slots.inject("conversation.session.header.actions", () => ctx.slots.register({
950
969
  name: "conversation.session.header.actions",
951
970
  id: "subagent-catalog",
952
- order: 30,
971
+ order: -30,
953
972
  locale: NS,
954
973
  inject: catalogActions
955
974
  }, SubagentCatalogAction));
@@ -14,7 +14,7 @@ export type SubagentHeaderLineageProps = PropsRuntime<'conversation.session.head
14
14
  export type SubagentCatalogActionProps = PropsRuntime<'conversation.session.header.actions'> & SubagentCatalogInjected & PropsLocale<typeof NS>;
15
15
  /**
16
16
  * Session-header catalog action for root sessions: the descendant count and
17
- * its dropdown, ordered after the task list. Child sessions render nothing
17
+ * its dropdown at the start of the header actions band. Child sessions render nothing
18
18
  * here — their breadcrumb switcher in the lineage slot owns the same
19
19
  * navigation.
20
20
  * @param props - Session standard props plus the catalog actions and translator.
@@ -17,8 +17,8 @@ export declare const zh: {
17
17
  readonly 'tokens.thousand': "{value}K";
18
18
  readonly 'tokens.million': "{value}M";
19
19
  readonly 'tokens.total': "{value} tok";
20
- readonly 'loading.label': "正在加载子代理…";
21
- readonly 'load.error': "无法加载子代理";
20
+ readonly 'loading.label': "正在加载子智能体…";
21
+ readonly 'load.error': "无法加载子智能体";
22
22
  readonly retry: "重试";
23
23
  readonly 'mode.oneShot': "一次性";
24
24
  readonly 'mode.continuable': "可继续";
@@ -27,18 +27,19 @@ export declare const zh: {
27
27
  readonly 'activity.running': "正在运行";
28
28
  readonly 'activity.completed': "已完成";
29
29
  readonly 'activity.inactive': "当前未运行";
30
- readonly 'branch.collapse': "收起 {label} 的下级子代理";
31
- readonly 'branch.expand': "展开 {label} 的下级子代理";
32
- readonly 'count.total.one': "{count} 个子代理";
33
- readonly 'count.total.other': "{count} 个子代理";
34
- readonly 'count.running.one': "{count} 个子代理,正在运行";
35
- readonly 'count.running.other': "{count} 个子代理,正在运行";
36
- readonly 'switcher.aria': "切换子代理:{title}";
37
- readonly 'tree.aria': "子代理会话";
38
- readonly 'open.sidebar': "在侧边栏打开 {label}";
30
+ readonly 'branch.collapse': "收起 {label} 的下级子智能体";
31
+ readonly 'branch.expand': "展开 {label} 的下级子智能体";
32
+ readonly 'count.total.one': "{count} 个子智能体";
33
+ readonly 'count.total.other': "{count} 个子智能体";
34
+ readonly 'count.running.one': "{count} 个子智能体,正在运行";
35
+ readonly 'count.running.other': "{count} 个子智能体,正在运行";
36
+ readonly 'switcher.aria': "切换子智能体:{title}";
37
+ readonly 'tree.aria': "子智能体会话";
38
+ readonly 'open.sidebar': "在侧边栏打开";
39
+ readonly 'open.sidebar.aria': "在侧边栏打开 {label}";
39
40
  readonly 'sidebar.chat': "聊天";
40
- readonly 'readonly.oneShot.title': "一次性子代理记录";
41
- readonly 'readonly.title': "此子代理暂时只读";
41
+ readonly 'readonly.oneShot.title': "一次性子智能体记录";
42
+ readonly 'readonly.title': "此子智能体暂时只读";
42
43
  readonly 'readonly.oneShot.body': "一次性任务不支持后续消息,可在这里查看完整执行记录。";
43
44
  readonly 'readonly.body': "父会话当前不在线,重新打开父会话后即可继续发送消息。";
44
45
  };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@deepseek-ai/dsh-client-ui-subagent",
3
3
  "description": "Subagent conversation catalog, continuation routing UI, and '@' reference source",
4
- "version": "0.1.7-alpha.2",
4
+ "version": "0.1.7-rc.2",
5
5
  "publishConfig": {
6
6
  "access": "public"
7
7
  },
@@ -50,24 +50,24 @@
50
50
  "@types/react-dom": "~18.3.0",
51
51
  "react": "^18.2.0",
52
52
  "react-dom": "^18.2.0",
53
- "@deepseek-ai/dsh-client-locale": "0.1.7-alpha.2",
54
- "@deepseek-ai/dsh-client-resources": "0.1.7-alpha.2",
55
- "@deepseek-ai/dsh-client-test-runtime": "0.1.7-alpha.2",
56
- "@deepseek-ai/dsh-client-ui-chat": "0.1.7-alpha.2",
57
- "@deepseek-ai/dsh-client-ui-conversation": "0.1.7-alpha.2",
58
- "@deepseek-ai/dsh-client-ui-input-trigger": "0.1.7-alpha.2",
59
- "@deepseek-ai/dsh-client-ui-slots": "0.1.7-alpha.2",
60
- "@deepseek-ai/dsh-token-meter": "0.1.7-alpha.2",
61
- "@deepseek-ai/dsh-subagent": "0.1.7-alpha.2",
53
+ "@deepseek-ai/dsh-client-locale": "0.1.7-rc.2",
54
+ "@deepseek-ai/dsh-client-resources": "0.1.7-rc.2",
55
+ "@deepseek-ai/dsh-client-ui-conversation": "0.1.7-rc.2",
56
+ "@deepseek-ai/dsh-client-ui-chat": "0.1.7-rc.2",
57
+ "@deepseek-ai/dsh-client-ui-input-trigger": "0.1.7-rc.2",
58
+ "@deepseek-ai/dsh-client-test-runtime": "0.1.7-rc.2",
59
+ "@deepseek-ai/dsh-client-ui-primitives": "0.1.7-rc.2",
60
+ "@deepseek-ai/dsh-client-ui-slots": "0.1.7-rc.2",
61
+ "@deepseek-ai/dsh-subagent": "0.1.7-rc.2",
62
+ "@deepseek-ai/dsh-token-meter": "0.1.7-rc.2",
62
63
  "@deepseek-ai/cordis": "~4.0.4",
63
- "@deepseek-ai/dsh-client-ui-primitives": "0.1.7-alpha.2",
64
- "@deepseek-ai/dsh-client-connection": "0.1.7-alpha.2",
65
- "@deepseek-ai/dsh-session": "0.1.7-alpha.2",
66
- "@deepseek-ai/dsh-client-ui-renderer": "0.1.7-alpha.2",
67
- "@deepseek-ai/dsh-client-ui-sidebar-right": "0.1.7-alpha.2",
68
- "@deepseek-ai/dsh-client-ui-session": "0.1.7-alpha.2",
69
- "@deepseek-ai/dsh-client-ui-workspace": "0.1.7-alpha.2",
70
- "@deepseek-ai/dsh-api-session-controller": "0.1.7-alpha.2"
64
+ "@deepseek-ai/dsh-api-session-controller": "0.1.7-rc.2",
65
+ "@deepseek-ai/dsh-client-connection": "0.1.7-rc.2",
66
+ "@deepseek-ai/dsh-session": "0.1.7-rc.2",
67
+ "@deepseek-ai/dsh-client-ui-renderer": "0.1.7-rc.2",
68
+ "@deepseek-ai/dsh-client-ui-sidebar-right": "0.1.7-rc.2",
69
+ "@deepseek-ai/dsh-client-ui-session": "0.1.7-rc.2",
70
+ "@deepseek-ai/dsh-client-ui-workspace": "0.1.7-rc.2"
71
71
  },
72
72
  "files": [
73
73
  "lib/index.js",