dsh-edge 0.2.0 → 0.3.0-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.
@@ -6,11 +6,12 @@ window.__ModuleLoader__.load({
6
6
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
7
7
  let react_jsx_runtime = require("react/jsx-runtime");
8
8
  let react = require("react");
9
+ let react_dom = require("react-dom");
9
10
  let _deepseek_ai_dsh_client_runtime_client = require("@deepseek-ai/dsh-client-runtime/client");
10
11
  let _deepseek_ai_dsh_client_ui_primitives = require("@deepseek-ai/dsh-client-ui-primitives");
11
- //#region \0dsh-css:/home/runner/work/deepseek-harness/deepseek-harness/packages/client/ui-subagent/src/client/SubagentCatalogAction.module.css.mjs
12
- const css$1 = ".h8S2Va_root{position:relative}.h8S2Va_trigger{min-height:28px;color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:0;border-radius:6px;align-items:center;gap:3px;padding:3px 2px;font-size:12px;line-height:18px;display:inline-flex}.h8S2Va_count{margin:0 5px}.h8S2Va_activitySlot{flex:none;width:10px;height:10px;display:inline-flex}.h8S2Va_trigger:hover,.h8S2Va_trigger:focus-visible{color:var(--dsw-alias-label-secondary)}.h8S2Va_trigger svg{transition:transform .12s}.h8S2Va_triggerOpen{transform:rotate(180deg)}.h8S2Va_menu{z-index:100;box-sizing:border-box;background:var(--dsw-specific-menu);--dsh-scrollbar-thumb:var(--dsw-alias-scrollbar-bg-l2);--dsh-scrollbar-thumb-hover:var(--dsw-alias-scrollbar-hover-l2);width:336px;max-width:min(400px,100vw - 32px);max-height:min(560px,100vh - 140px);box-shadow:var(--dsw-shadow-lv3);border-radius:12px;flex-direction:column;padding:4px;display:flex;position:absolute;top:calc(100% + 5px);left:0;overflow:auto}.h8S2Va_node{min-width:0;position:relative}.h8S2Va_menu>.h8S2Va_node{margin-left:-3px}.h8S2Va_row{box-sizing:border-box;width:100%;min-height:50px;color:var(--dsw-alias-label-primary);text-align:left;cursor:pointer;background:0 0;border:0;border-radius:8px;outline:none;align-items:flex-start;gap:8px;padding:7px 8px 7px 11px;font-size:13px;line-height:18px;display:flex;position:relative}.h8S2Va_row:hover>.h8S2Va_clickarea,.h8S2Va_row:focus-visible>.h8S2Va_clickarea{background:var(--dsw-alias-interactive-bg-hover)}.h8S2Va_clickarea{box-sizing:border-box;border-radius:8px;flex:1;align-self:stretch;align-items:flex-start;gap:8px;min-width:0;margin:-7px -8px;padding:7px 8px;display:flex}.h8S2Va_row>[data-state],.h8S2Va_clickarea>[data-state]{margin-top:4px}.h8S2Va_disabled{color:var(--dsw-alias-label-dimmed);cursor:not-allowed}.h8S2Va_disabled:hover{background:0 0}.h8S2Va_loadingRow{cursor:default}.h8S2Va_disclosure,.h8S2Va_disclosureSpace{flex:none;width:14px;height:18px}.h8S2Va_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}.h8S2Va_disclosure:hover{color:var(--dsw-alias-label-primary)}.h8S2Va_disclosureOpen{transform:rotate(90deg)}.h8S2Va_content{flex-direction:column;flex:1;min-width:0;display:flex}.h8S2Va_label,.h8S2Va_summary{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.h8S2Va_label{color:inherit;font-weight:400}.h8S2Va_summary,.h8S2Va_metrics{color:var(--dsw-alias-label-tertiary);font-size:11px;line-height:16px}.h8S2Va_metrics{font-variant-numeric:tabular-nums;text-align:right;white-space:nowrap;flex:none;grid-template-rows:18px 16px;display:grid}.h8S2Va_metricToken{grid-row:1;line-height:18px}.h8S2Va_metricDuration{grid-row:2}.h8S2Va_children{margin-left:18px;padding-left:4px;position:relative}.h8S2Va_children:before,.h8S2Va_children>.h8S2Va_node:before{content:\"\";border-left:1px solid var(--dsw-alias-border-l2);position:absolute;left:0}.h8S2Va_children:before{height:26px;top:-26px}.h8S2Va_children[aria-busy=true]:before{content:none}.h8S2Va_children>.h8S2Va_node:before{top:0;bottom:0;left:-4px}.h8S2Va_children>.h8S2Va_node:last-child:before{height:17px;bottom:auto}.h8S2Va_children>.h8S2Va_node>.h8S2Va_row:before{content:\"\";border-top:1px solid var(--dsw-alias-border-l2);width:14px;position:absolute;top:16px;left:-4px}.h8S2Va_notice,.h8S2Va_error{color:var(--dsw-alias-label-tertiary);padding:10px 12px;font-size:12px;line-height:18px}.h8S2Va_error{color:var(--dsw-alias-state-error-primary);justify-content:space-between;align-items:center;gap:12px;display:flex}.h8S2Va_refresh{color:inherit;cursor:pointer;background:0 0;border:0;border-radius:6px;flex:none;align-items:center;gap:4px;padding:4px 6px;display:inline-flex}.h8S2Va_refresh:hover{background:var(--dsw-alias-interactive-bg-hover)}";
13
- const tagId$1 = "@deepseek-ai/dsh-client-ui-subagent/SubagentCatalogAction.module.css";
12
+ //#region \0dsh-css:/home/runner/work/deepseek-harness/deepseek-harness/packages/client/ui-subagent/src/client/SubagentHeaderLineage.module.css.mjs
13
+ const css$1 = ".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_separator{color:var(--dsw-alias-label-caption);font-size:14px;line-height:20px}.ZKlsPq_activitySlot{flex:none;width:10px;height:10px;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);--dsh-scrollbar-thumb:var(--dsw-alias-scrollbar-bg-l2);--dsh-scrollbar-thumb-hover:var(--dsw-alias-scrollbar-hover-l2);width:336px;max-width:min(400px,100vw - 32px);max-height:min(560px,100vh - 140px);box-shadow:var(--dsw-shadow-lv3);border-radius:12px;flex-direction:column;padding:4px;display:flex;position:fixed;overflow:auto}.ZKlsPq_node{min-width:0;position:relative}.ZKlsPq_menu>.ZKlsPq_node{margin-left:-3px}.ZKlsPq_row{box-sizing:border-box;width:100%;min-height:50px;color:var(--dsw-alias-label-primary);text-align:left;cursor:pointer;background:0 0;border:0;border-radius:8px;outline:none;align-items:flex-start;gap:8px;padding:7px 8px 7px 11px;font-size:13px;line-height:18px;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:8px;flex:1;align-self:stretch;align-items:flex-start;gap:8px;min-width:0;margin:-7px -8px;padding:7px 8px;display:flex}.ZKlsPq_row>[data-state],.ZKlsPq_clickarea>[data-state]{margin-top:4px}.ZKlsPq_disabled{color:var(--dsw-alias-label-dimmed);cursor:not-allowed}.ZKlsPq_disabled:hover{background:0 0}.ZKlsPq_loadingRow{cursor:default}.ZKlsPq_disclosure,.ZKlsPq_disclosureSpace{flex:none;width:14px;height:18px}.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: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:11px;line-height:16px}.ZKlsPq_metrics{font-variant-numeric:tabular-nums;text-align:right;white-space:nowrap;flex:none;grid-template-rows:18px 16px;display:grid}.ZKlsPq_metricToken{grid-row:1;line-height:18px}.ZKlsPq_metricDuration{grid-row:2}.ZKlsPq_children{margin-left:18px;padding-left:4px;position:relative}.ZKlsPq_children:before,.ZKlsPq_children>.ZKlsPq_node:before{content:\"\";border-left:1px solid var(--dsw-alias-border-l2);position:absolute;left:0}.ZKlsPq_children:before{height:26px;top:-26px}.ZKlsPq_children[aria-busy=true]:before{content:none}.ZKlsPq_children>.ZKlsPq_node:before{top:0;bottom:0;left:-4px}.ZKlsPq_children>.ZKlsPq_node:last-child:before{height:17px;bottom:auto}.ZKlsPq_children>.ZKlsPq_node>.ZKlsPq_row:before{content:\"\";border-top:1px solid var(--dsw-alias-border-l2);width:14px;position:absolute;top:16px;left:-4px}.ZKlsPq_notice,.ZKlsPq_error{color:var(--dsw-alias-label-tertiary);padding:10px 12px;font-size:12px;line-height:18px}.ZKlsPq_error{color:var(--dsw-alias-state-error-primary);justify-content:space-between;align-items:center;gap:12px;display:flex}.ZKlsPq_refresh{color:inherit;cursor:pointer;background:0 0;border:0;border-radius:6px;flex:none;align-items:center;gap:4px;padding:4px 6px;display:inline-flex}.ZKlsPq_refresh:hover{background:var(--dsw-alias-interactive-bg-hover)}";
14
+ const tagId$1 = "@deepseek-ai/dsh-client-ui-subagent/SubagentHeaderLineage.module.css";
14
15
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$1) + "]") === null) {
15
16
  const tag = document.createElement("style");
16
17
  tag.dataset.plugin = "@deepseek-ai/dsh-client-ui-subagent";
@@ -18,34 +19,39 @@ window.__ModuleLoader__.load({
18
19
  tag.textContent = css$1;
19
20
  document.head.appendChild(tag);
20
21
  }
21
- var SubagentCatalogAction_module_css_default = {
22
- "activitySlot": "h8S2Va_activitySlot",
23
- "children": "h8S2Va_children",
24
- "clickarea": "h8S2Va_clickarea",
25
- "content": "h8S2Va_content",
26
- "count": "h8S2Va_count",
27
- "disabled": "h8S2Va_disabled",
28
- "disclosure": "h8S2Va_disclosure",
29
- "disclosureOpen": "h8S2Va_disclosureOpen",
30
- "disclosureSpace": "h8S2Va_disclosureSpace",
31
- "error": "h8S2Va_error",
32
- "label": "h8S2Va_label",
33
- "loadingRow": "h8S2Va_loadingRow",
34
- "menu": "h8S2Va_menu",
35
- "metricDuration": "h8S2Va_metricDuration",
36
- "metricToken": "h8S2Va_metricToken",
37
- "metrics": "h8S2Va_metrics",
38
- "node": "h8S2Va_node",
39
- "notice": "h8S2Va_notice",
40
- "refresh": "h8S2Va_refresh",
41
- "root": "h8S2Va_root",
42
- "row": "h8S2Va_row",
43
- "summary": "h8S2Va_summary",
44
- "trigger": "h8S2Va_trigger",
45
- "triggerOpen": "h8S2Va_triggerOpen"
22
+ var SubagentHeaderLineage_module_css_default = {
23
+ "activitySlot": "ZKlsPq_activitySlot",
24
+ "ancestorSwitcherTrigger": "ZKlsPq_ancestorSwitcherTrigger",
25
+ "children": "ZKlsPq_children",
26
+ "clickarea": "ZKlsPq_clickarea",
27
+ "content": "ZKlsPq_content",
28
+ "currentLabel": "ZKlsPq_currentLabel",
29
+ "disabled": "ZKlsPq_disabled",
30
+ "disclosure": "ZKlsPq_disclosure",
31
+ "disclosureOpen": "ZKlsPq_disclosureOpen",
32
+ "disclosureSpace": "ZKlsPq_disclosureSpace",
33
+ "error": "ZKlsPq_error",
34
+ "label": "ZKlsPq_label",
35
+ "loadingRow": "ZKlsPq_loadingRow",
36
+ "menu": "ZKlsPq_menu",
37
+ "metricDuration": "ZKlsPq_metricDuration",
38
+ "metricToken": "ZKlsPq_metricToken",
39
+ "metrics": "ZKlsPq_metrics",
40
+ "node": "ZKlsPq_node",
41
+ "notice": "ZKlsPq_notice",
42
+ "refresh": "ZKlsPq_refresh",
43
+ "root": "ZKlsPq_root",
44
+ "row": "ZKlsPq_row",
45
+ "separator": "ZKlsPq_separator",
46
+ "summary": "ZKlsPq_summary",
47
+ "switcherRoot": "ZKlsPq_switcherRoot",
48
+ "switcherTitle": "ZKlsPq_switcherTitle",
49
+ "switcherTrigger": "ZKlsPq_switcherTrigger",
50
+ "trigger": "ZKlsPq_trigger",
51
+ "triggerOpen": "ZKlsPq_triggerOpen"
46
52
  };
47
53
  //#endregion
48
- //#region lib/types/client/SubagentCatalogAction.js
54
+ //#region lib/types/client/SubagentHeaderLineage.js
49
55
  function diagnosticReason(entry, t) {
50
56
  switch (entry.reason) {
51
57
  case "corrupt": return t("diagnostic.corrupt");
@@ -137,28 +143,46 @@ window.__ModuleLoader__.load({
137
143
  count: 0,
138
144
  runningCount: 0
139
145
  };
146
+ function SubagentSwitcherIcon() {
147
+ return (0, react_jsx_runtime.jsxs)("svg", {
148
+ width: "16",
149
+ height: "16",
150
+ viewBox: "0 0 20 20",
151
+ fill: "none",
152
+ "aria-hidden": "true",
153
+ children: [(0, react_jsx_runtime.jsx)("path", {
154
+ d: "M5.99951 12.7L8.95546 14.9478C9.40011 15.2859 9.62244 15.455 9.87526 15.488C9.95774 15.4988 10.0413 15.4988 10.1238 15.488C10.3766 15.455 10.5989 15.2859 11.0436 14.9478L13.9995 12.7",
155
+ stroke: "currentColor",
156
+ strokeWidth: "1.5"
157
+ }), (0, react_jsx_runtime.jsx)("path", {
158
+ d: "M13.9995 7.7417L11.0436 5.49387C10.5989 5.15574 10.3766 4.98668 10.1238 4.95362C10.0413 4.94283 9.95775 4.94283 9.87527 4.95362C9.62245 4.98668 9.40012 5.15574 8.95547 5.49387L5.99952 7.7417",
159
+ stroke: "currentColor",
160
+ strokeWidth: "1.5"
161
+ })]
162
+ });
163
+ }
140
164
  /** Render the known direct-child shape while its authoritative catalog hydrates. */
141
165
  function CatalogLoadingRows({ parentSessionId, summaries, level, t }) {
142
166
  const children = Object.values(summaries).filter((summary) => summary.origin === "subagent" && summary.parentId === parentSessionId);
143
167
  if (children.length === 0) return (0, react_jsx_runtime.jsx)("div", {
144
- className: SubagentCatalogAction_module_css_default.notice,
168
+ className: SubagentHeaderLineage_module_css_default.notice,
145
169
  children: t("loading.label")
146
170
  });
147
171
  return children.map((summary) => (0, react_jsx_runtime.jsx)("div", {
148
- className: SubagentCatalogAction_module_css_default.node,
172
+ className: SubagentHeaderLineage_module_css_default.node,
149
173
  children: (0, react_jsx_runtime.jsxs)("div", {
150
174
  role: "treeitem",
151
175
  "aria-disabled": "true",
152
176
  "aria-level": level,
153
177
  "aria-label": t("loading.aria"),
154
- className: `${SubagentCatalogAction_module_css_default.row} ${SubagentCatalogAction_module_css_default.disabled} ${SubagentCatalogAction_module_css_default.loadingRow}`,
178
+ className: `${SubagentHeaderLineage_module_css_default.row} ${SubagentHeaderLineage_module_css_default.disabled} ${SubagentHeaderLineage_module_css_default.loadingRow}`,
155
179
  children: [
156
- (0, react_jsx_runtime.jsx)("span", { className: SubagentCatalogAction_module_css_default.disclosureSpace }),
180
+ (0, react_jsx_runtime.jsx)("span", { className: SubagentHeaderLineage_module_css_default.disclosureSpace }),
157
181
  (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.StateDot, { state: summary.running ? "ongoing" : "done" }),
158
182
  (0, react_jsx_runtime.jsx)("span", {
159
- className: SubagentCatalogAction_module_css_default.content,
183
+ className: SubagentHeaderLineage_module_css_default.content,
160
184
  children: (0, react_jsx_runtime.jsx)("span", {
161
- className: SubagentCatalogAction_module_css_default.label,
185
+ className: SubagentHeaderLineage_module_css_default.label,
162
186
  children: t("loading.label")
163
187
  })
164
188
  })
@@ -167,7 +191,7 @@ window.__ModuleLoader__.load({
167
191
  }, summary.id));
168
192
  }
169
193
  /** Render one catalog level and recurse only through explicitly expanded rows. */
170
- function CatalogRows({ parentSessionId, catalog, catalogs, summaries, expanded, level, now, openChild, refresh, toggleBranch, closeCatalog, t }) {
194
+ function CatalogRows({ parentSessionId, currentSessionId, catalog, catalogs, summaries, expanded, level, now, openChild, refresh, toggleBranch, closeCatalog, t }) {
171
195
  const emptyLoading = catalog.state === "loading" && catalog.entries.length === 0;
172
196
  const reserveDisclosure = catalog.entries.some((entry) => entry.kind === "child" && entry.hasChildren);
173
197
  return (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
@@ -178,10 +202,10 @@ window.__ModuleLoader__.load({
178
202
  t
179
203
  }),
180
204
  catalog.state === "error" && (0, react_jsx_runtime.jsxs)("div", {
181
- className: SubagentCatalogAction_module_css_default.error,
205
+ className: SubagentHeaderLineage_module_css_default.error,
182
206
  children: [(0, react_jsx_runtime.jsx)("span", { children: catalog.error?.message ?? t("load.error") }), (0, react_jsx_runtime.jsxs)("button", {
183
207
  type: "button",
184
- className: SubagentCatalogAction_module_css_default.refresh,
208
+ className: SubagentHeaderLineage_module_css_default.refresh,
185
209
  onClick: () => {
186
210
  refresh(parentSessionId);
187
211
  },
@@ -192,24 +216,24 @@ window.__ModuleLoader__.load({
192
216
  if (entry.kind === "diagnostic") {
193
217
  const reason = diagnosticReason(entry, t);
194
218
  return (0, react_jsx_runtime.jsx)("div", {
195
- className: SubagentCatalogAction_module_css_default.node,
219
+ className: SubagentHeaderLineage_module_css_default.node,
196
220
  children: (0, react_jsx_runtime.jsxs)("div", {
197
221
  role: "treeitem",
198
222
  "aria-disabled": "true",
199
223
  "aria-level": level,
200
224
  "aria-label": `${entry.id} ${reason}`,
201
- className: `${SubagentCatalogAction_module_css_default.row} ${SubagentCatalogAction_module_css_default.disabled}`,
225
+ className: `${SubagentHeaderLineage_module_css_default.row} ${SubagentHeaderLineage_module_css_default.disabled}`,
202
226
  title: reason,
203
227
  children: [
204
- reserveDisclosure && (0, react_jsx_runtime.jsx)("span", { className: SubagentCatalogAction_module_css_default.disclosureSpace }),
228
+ reserveDisclosure && (0, react_jsx_runtime.jsx)("span", { className: SubagentHeaderLineage_module_css_default.disclosureSpace }),
205
229
  (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.StateDot, { state: "error" }),
206
230
  (0, react_jsx_runtime.jsxs)("span", {
207
- className: SubagentCatalogAction_module_css_default.content,
231
+ className: SubagentHeaderLineage_module_css_default.content,
208
232
  children: [(0, react_jsx_runtime.jsx)("span", {
209
- className: SubagentCatalogAction_module_css_default.label,
233
+ className: SubagentHeaderLineage_module_css_default.label,
210
234
  children: entry.id
211
235
  }), (0, react_jsx_runtime.jsx)("span", {
212
- className: SubagentCatalogAction_module_css_default.summary,
236
+ className: SubagentHeaderLineage_module_css_default.summary,
213
237
  children: reason
214
238
  })]
215
239
  })
@@ -218,6 +242,7 @@ window.__ModuleLoader__.load({
218
242
  }, entry.id);
219
243
  }
220
244
  const childCatalog = catalogs[entry.id];
245
+ const isCurrent = entry.id === currentSessionId;
221
246
  const isExpanded = expanded.has(entry.id);
222
247
  const knownLeaf = !entry.hasChildren;
223
248
  const childLoading = childCatalog === void 0 || childCatalog.state === "loading" && childCatalog.entries.length === 0;
@@ -263,48 +288,49 @@ window.__ModuleLoader__.load({
263
288
  toggleBranch(entry.id);
264
289
  };
265
290
  return (0, react_jsx_runtime.jsxs)("div", {
266
- className: SubagentCatalogAction_module_css_default.node,
291
+ className: SubagentHeaderLineage_module_css_default.node,
267
292
  children: [(0, react_jsx_runtime.jsxs)("div", {
268
293
  role: "treeitem",
269
294
  tabIndex: 0,
270
295
  "aria-level": level,
296
+ "aria-current": isCurrent || void 0,
271
297
  "aria-label": [
272
298
  label,
273
299
  secondary,
274
300
  metrics
275
301
  ].filter((value) => value !== "").join(" "),
276
302
  ...knownLeaf ? {} : { "aria-expanded": isExpanded },
277
- className: SubagentCatalogAction_module_css_default.row,
303
+ className: SubagentHeaderLineage_module_css_default.row,
278
304
  onClick: open,
279
305
  onKeyDown: handleKey,
280
- children: [knownLeaf ? reserveDisclosure && (0, react_jsx_runtime.jsx)("span", { className: SubagentCatalogAction_module_css_default.disclosureSpace }) : (0, react_jsx_runtime.jsx)("button", {
306
+ children: [knownLeaf ? reserveDisclosure && (0, react_jsx_runtime.jsx)("span", { className: SubagentHeaderLineage_module_css_default.disclosureSpace }) : (0, react_jsx_runtime.jsx)("button", {
281
307
  type: "button",
282
308
  tabIndex: -1,
283
- className: `${SubagentCatalogAction_module_css_default.disclosure} ${isExpanded ? SubagentCatalogAction_module_css_default.disclosureOpen : ""}`,
309
+ className: `${SubagentHeaderLineage_module_css_default.disclosure} ${isExpanded ? SubagentHeaderLineage_module_css_default.disclosureOpen : ""}`,
284
310
  "aria-label": t(isExpanded ? "branch.collapse" : "branch.expand", { label }),
285
311
  onClick: toggle,
286
312
  children: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconChevronRightOutline14, {})
287
313
  }), (0, react_jsx_runtime.jsxs)("div", {
288
- className: SubagentCatalogAction_module_css_default.clickarea,
314
+ className: SubagentHeaderLineage_module_css_default.clickarea,
289
315
  children: [
290
316
  (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.StateDot, { state: entry.activity === "running" ? "ongoing" : "done" }),
291
317
  (0, react_jsx_runtime.jsxs)("span", {
292
- className: SubagentCatalogAction_module_css_default.content,
318
+ className: SubagentHeaderLineage_module_css_default.content,
293
319
  children: [(0, react_jsx_runtime.jsx)("span", {
294
- className: SubagentCatalogAction_module_css_default.label,
320
+ className: `${SubagentHeaderLineage_module_css_default.label} ${isCurrent ? SubagentHeaderLineage_module_css_default.currentLabel : ""}`,
295
321
  children: label
296
322
  }), (0, react_jsx_runtime.jsx)("span", {
297
- className: SubagentCatalogAction_module_css_default.summary,
323
+ className: SubagentHeaderLineage_module_css_default.summary,
298
324
  children: secondary
299
325
  })]
300
326
  }),
301
327
  metrics !== "" && (0, react_jsx_runtime.jsxs)("span", {
302
- className: SubagentCatalogAction_module_css_default.metrics,
328
+ className: SubagentHeaderLineage_module_css_default.metrics,
303
329
  children: [tokenMetric !== void 0 && (0, react_jsx_runtime.jsx)("span", {
304
- className: SubagentCatalogAction_module_css_default.metricToken,
330
+ className: SubagentHeaderLineage_module_css_default.metricToken,
305
331
  children: tokenMetric
306
332
  }), durationMetric !== void 0 && (0, react_jsx_runtime.jsx)("span", {
307
- className: SubagentCatalogAction_module_css_default.metricDuration,
333
+ className: SubagentHeaderLineage_module_css_default.metricDuration,
308
334
  title: t("duration.exactTitle", { duration: durationMetric.exact }),
309
335
  children: durationMetric.compact
310
336
  })]
@@ -313,7 +339,7 @@ window.__ModuleLoader__.load({
313
339
  })]
314
340
  }), isExpanded && !knownLeaf && (0, react_jsx_runtime.jsx)("div", {
315
341
  role: "group",
316
- className: SubagentCatalogAction_module_css_default.children,
342
+ className: SubagentHeaderLineage_module_css_default.children,
317
343
  "aria-busy": childLoading || void 0,
318
344
  children: childCatalog === void 0 ? (0, react_jsx_runtime.jsx)(CatalogLoadingRows, {
319
345
  parentSessionId: entry.id,
@@ -322,6 +348,7 @@ window.__ModuleLoader__.load({
322
348
  t
323
349
  }) : (0, react_jsx_runtime.jsx)(CatalogRows, {
324
350
  parentSessionId: entry.id,
351
+ currentSessionId,
325
352
  catalog: childCatalog,
326
353
  catalogs,
327
354
  summaries,
@@ -339,34 +366,58 @@ window.__ModuleLoader__.load({
339
366
  })
340
367
  ] });
341
368
  }
342
- /**
343
- * Render the current session's direct catalog and lazily expanded descendants.
344
- * @param props - session standard props plus catalog navigation actions.
345
- * @returns The action while the catalog is pending or summaries establish descendants.
346
- */
347
- function SubagentCatalogAction({ sessionId, useSessions, openChild, refresh, setCatalogOpen, t }) {
369
+ const MENU_VIEWPORT_MARGIN = 16;
370
+ /** Place a portaled catalog below its trigger without crossing the viewport edge. */
371
+ function catalogMenuPosition(trigger) {
372
+ const rect = trigger.getBoundingClientRect();
373
+ const width = Math.min(336, window.innerWidth - MENU_VIEWPORT_MARGIN * 2);
374
+ return {
375
+ top: rect.bottom + 5,
376
+ left: Math.min(Math.max(MENU_VIEWPORT_MARGIN, rect.left), window.innerWidth - width - MENU_VIEWPORT_MARGIN)
377
+ };
378
+ }
379
+ /** One trigger-plus-tree dropdown over the catalog rooted at `rootSessionId`. */
380
+ function CatalogDropdown({ rootSessionId, currentSessionId, displayTitle, openTitle, variant, separator = false, useSessions, openChild, refresh, setCatalogOpen, t }) {
381
+ const ancestorSwitcher = variant === "switcher" && openTitle !== void 0;
348
382
  const catalogs = useSessions((state) => state.subagentsByParent);
349
383
  const summaries = useSessions((state) => state.byId);
350
- const catalog = catalogs[sessionId];
384
+ const catalog = catalogs[rootSessionId];
351
385
  const [open, setOpen] = (0, react.useState)(false);
386
+ const [menuPosition, setMenuPosition] = (0, react.useState)();
352
387
  const [now, setNow] = (0, react.useState)(() => Date.now());
353
388
  const [expanded, setExpanded] = (0, react.useState)(() => /* @__PURE__ */ new Set());
354
389
  const rootRef = (0, react.useRef)(null);
355
390
  const triggerRef = (0, react.useRef)(null);
391
+ const menuRef = (0, react.useRef)(null);
392
+ const hoverOpenTimer = (0, react.useRef)(void 0);
393
+ const hoverCloseTimer = (0, react.useRef)(void 0);
356
394
  const observedCatalogs = (0, react.useRef)(/* @__PURE__ */ new Set());
395
+ const requestedInitialCatalog = (0, react.useRef)();
357
396
  const setCatalogOpenRef = (0, react.useRef)(setCatalogOpen);
358
397
  setCatalogOpenRef.current = setCatalogOpen;
398
+ const currentEntry = currentSessionId === void 0 ? void 0 : catalog?.entries.find((entry) => entry.kind === "child" && entry.id === currentSessionId);
399
+ const switcherDisplayTitle = currentEntry?.kind === "child" ? currentEntry.label ?? currentEntry.id : displayTitle;
359
400
  const healthy = catalog?.entries.filter((entry) => entry.kind === "child") ?? [];
360
- const descendants = (0, react.useMemo)(() => (0, _deepseek_ai_dsh_client_runtime_client.indexSubagentDescendants)(summaries).get(sessionId) ?? NO_DESCENDANTS, [sessionId, summaries]);
401
+ const descendants = (0, react.useMemo)(() => (0, _deepseek_ai_dsh_client_runtime_client.indexSubagentDescendants)(summaries).get(rootSessionId) ?? NO_DESCENDANTS, [rootSessionId, summaries]);
361
402
  const descendantCount = Math.max(healthy.length, descendants.count);
362
403
  const totalCountKey = descendantCount === 1 ? "count.total.one" : "count.total.other";
363
404
  const runningCountKey = descendants.runningCount === 1 ? "count.running.one" : "count.running.other";
364
- const presentedCatalog = descendants.count > 0 && (catalog === void 0 || catalog.state === "ready" && catalog.entries.length === 0) ? {
405
+ const presentedCatalog = (descendants.count > 0 || variant === "switcher") && (catalog === void 0 || catalog.state === "ready" && catalog.entries.length === 0) ? {
365
406
  entries: [],
366
407
  parentAvailable: catalog?.parentAvailable ?? false,
367
408
  state: "loading",
368
409
  error: null
369
410
  } : catalog;
411
+ (0, react.useEffect)(() => {
412
+ if (variant !== "switcher" || catalog !== void 0 || requestedInitialCatalog.current === rootSessionId) return;
413
+ requestedInitialCatalog.current = rootSessionId;
414
+ refresh(rootSessionId);
415
+ }, [
416
+ catalog,
417
+ refresh,
418
+ rootSessionId,
419
+ variant
420
+ ]);
370
421
  const observeCatalog = (parentSessionId, next) => {
371
422
  if (next) observedCatalogs.current.add(parentSessionId);
372
423
  else observedCatalogs.current.delete(parentSessionId);
@@ -377,16 +428,53 @@ window.__ModuleLoader__.load({
377
428
  observedCatalogs.current.clear();
378
429
  setExpanded(/* @__PURE__ */ new Set());
379
430
  };
431
+ const cancelHoverClose = () => {
432
+ if (hoverCloseTimer.current === void 0) return;
433
+ clearTimeout(hoverCloseTimer.current);
434
+ hoverCloseTimer.current = void 0;
435
+ };
436
+ const cancelHoverOpen = () => {
437
+ if (hoverOpenTimer.current === void 0) return;
438
+ clearTimeout(hoverOpenTimer.current);
439
+ hoverOpenTimer.current = void 0;
440
+ };
380
441
  const changeOpen = (next, restoreFocus = false) => {
381
- setOpen(next);
442
+ cancelHoverOpen();
443
+ cancelHoverClose();
382
444
  if (next) {
445
+ const trigger = triggerRef.current;
446
+ /* v8 ignore next -- a queued callback can outlive the trigger */
447
+ if (trigger === null) return;
448
+ setOpen(true);
449
+ setMenuPosition(catalogMenuPosition(trigger));
383
450
  setNow(Date.now());
384
- observeCatalog(sessionId, true);
385
- } else closeAllCatalogs();
451
+ observeCatalog(rootSessionId, true);
452
+ } else {
453
+ setOpen(false);
454
+ setMenuPosition(void 0);
455
+ closeAllCatalogs();
456
+ }
386
457
  if (restoreFocus) queueMicrotask(() => {
387
458
  triggerRef.current?.focus();
388
459
  });
389
460
  };
461
+ const scheduleHoverOpen = () => {
462
+ cancelHoverOpen();
463
+ cancelHoverClose();
464
+ if (open) return;
465
+ hoverOpenTimer.current = setTimeout(() => {
466
+ hoverOpenTimer.current = void 0;
467
+ changeOpen(true);
468
+ }, 150);
469
+ };
470
+ const scheduleHoverClose = () => {
471
+ cancelHoverOpen();
472
+ cancelHoverClose();
473
+ hoverCloseTimer.current = setTimeout(() => {
474
+ hoverCloseTimer.current = void 0;
475
+ changeOpen(false);
476
+ }, 120);
477
+ };
390
478
  const closeBranch = (root) => {
391
479
  const closing = /* @__PURE__ */ new Set();
392
480
  const visit = (parentSessionId) => {
@@ -410,13 +498,28 @@ window.__ModuleLoader__.load({
410
498
  (0, react.useEffect)(() => {
411
499
  if (!open) return;
412
500
  const closeOutside = (event) => {
413
- if (event.target instanceof Node && !rootRef.current?.contains(event.target)) changeOpen(false);
501
+ if (event.target instanceof Node && !rootRef.current?.contains(event.target) && !menuRef.current?.contains(event.target)) changeOpen(false);
414
502
  };
415
503
  document.addEventListener("pointerdown", closeOutside);
416
504
  return () => {
417
505
  document.removeEventListener("pointerdown", closeOutside);
418
506
  };
419
507
  }, [open]);
508
+ (0, react.useEffect)(() => {
509
+ if (!open) return;
510
+ const placeMenu = () => {
511
+ const trigger = triggerRef.current;
512
+ /* v8 ignore next -- native resize or scroll can outlive the trigger */
513
+ if (trigger === null) return;
514
+ setMenuPosition(catalogMenuPosition(trigger));
515
+ };
516
+ window.addEventListener("resize", placeMenu);
517
+ document.addEventListener("scroll", placeMenu, true);
518
+ return () => {
519
+ window.removeEventListener("resize", placeMenu);
520
+ document.removeEventListener("scroll", placeMenu, true);
521
+ };
522
+ }, [open]);
420
523
  (0, react.useEffect)(() => {
421
524
  if (!open || descendants.runningCount === 0) return;
422
525
  const timer = setInterval(() => {
@@ -427,23 +530,28 @@ window.__ModuleLoader__.load({
427
530
  };
428
531
  }, [open, descendants.runningCount]);
429
532
  (0, react.useEffect)(() => () => {
533
+ cancelHoverOpen();
534
+ cancelHoverClose();
430
535
  for (const parentSessionId of observedCatalogs.current) setCatalogOpenRef.current(parentSessionId, false);
431
536
  observedCatalogs.current.clear();
432
537
  }, []);
433
- const visible = presentedCatalog !== void 0 && (presentedCatalog.state === "error" || presentedCatalog.entries.length > 0 || descendantCount > 0);
538
+ const visible = presentedCatalog !== void 0 && (variant === "switcher" || presentedCatalog.state === "error" || presentedCatalog.entries.length > 0 || descendantCount > 0);
434
539
  (0, react.useEffect)(() => {
435
- if (visible || !open) return;
540
+ if (visible) return;
541
+ cancelHoverOpen();
542
+ cancelHoverClose();
543
+ if (!open) return;
436
544
  setOpen(false);
437
545
  closeAllCatalogs();
438
546
  }, [visible, open]);
439
547
  if (!visible) return null;
440
548
  const focusAt = (index) => {
441
- const items = treeItems(rootRef.current);
549
+ const items = treeItems(menuRef.current);
442
550
  if (items.length === 0) return;
443
551
  items[(index + items.length) % items.length]?.focus();
444
552
  };
445
553
  const navigate = (event) => {
446
- const items = treeItems(rootRef.current);
554
+ const items = treeItems(menuRef.current);
447
555
  const index = items.indexOf(document.activeElement);
448
556
  if (event.key === "Escape") {
449
557
  event.preventDefault();
@@ -463,61 +571,112 @@ window.__ModuleLoader__.load({
463
571
  }
464
572
  };
465
573
  return (0, react_jsx_runtime.jsxs)("div", {
466
- className: SubagentCatalogAction_module_css_default.root,
574
+ className: `${SubagentHeaderLineage_module_css_default.root} ${variant === "switcher" ? SubagentHeaderLineage_module_css_default.switcherRoot : ""}`,
467
575
  ref: rootRef,
468
576
  onKeyDown: navigate,
469
- children: [(0, react_jsx_runtime.jsxs)("button", {
470
- ref: triggerRef,
471
- type: "button",
472
- className: SubagentCatalogAction_module_css_default.trigger,
473
- "aria-haspopup": "tree",
474
- "aria-expanded": open,
475
- "aria-label": t(descendants.runningCount > 0 ? runningCountKey : totalCountKey, { count: descendants.runningCount > 0 ? descendants.runningCount : descendantCount }),
476
- onClick: () => {
477
- changeOpen(!open);
478
- },
479
- onKeyDown: (event) => {
480
- if (event.key !== "ArrowDown") return;
481
- event.preventDefault();
482
- if (!open) changeOpen(true);
483
- queueMicrotask(() => {
484
- focusAt(0);
485
- });
486
- },
487
- children: [
488
- (0, react_jsx_runtime.jsx)("span", {
489
- className: SubagentCatalogAction_module_css_default.activitySlot,
490
- children: descendants.runningCount > 0 && (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.StateDot, { state: "ongoing" })
491
- }),
492
- (0, react_jsx_runtime.jsx)("span", {
493
- className: SubagentCatalogAction_module_css_default.count,
494
- children: t(totalCountKey, { count: descendantCount })
495
- }),
496
- (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconChevronDownOutline14, { className: open ? SubagentCatalogAction_module_css_default.triggerOpen : void 0 })
497
- ]
498
- }), open && (0, react_jsx_runtime.jsx)("div", {
499
- className: SubagentCatalogAction_module_css_default.menu,
500
- role: "tree",
501
- "aria-label": t("tree.aria"),
502
- children: (0, react_jsx_runtime.jsx)(CatalogRows, {
503
- parentSessionId: sessionId,
504
- catalog: presentedCatalog,
505
- catalogs,
506
- summaries,
507
- expanded,
508
- level: 1,
509
- now,
510
- openChild,
511
- refresh,
512
- toggleBranch,
513
- closeCatalog: () => {
514
- changeOpen(false);
577
+ onMouseEnter: scheduleHoverOpen,
578
+ onMouseLeave: scheduleHoverClose,
579
+ children: [
580
+ separator && (0, react_jsx_runtime.jsx)("span", {
581
+ className: SubagentHeaderLineage_module_css_default.separator,
582
+ children: "/"
583
+ }),
584
+ (0, react_jsx_runtime.jsxs)("button", {
585
+ ref: triggerRef,
586
+ type: "button",
587
+ className: variant === "switcher" ? `${SubagentHeaderLineage_module_css_default.switcherTrigger} ${ancestorSwitcher ? SubagentHeaderLineage_module_css_default.ancestorSwitcherTrigger : ""}` : SubagentHeaderLineage_module_css_default.trigger,
588
+ "aria-haspopup": "tree",
589
+ "aria-expanded": open,
590
+ "aria-label": variant === "switcher" ? t("switcher.aria", { title: switcherDisplayTitle }) : t(descendants.runningCount > 0 ? runningCountKey : totalCountKey, { count: descendants.runningCount > 0 ? descendants.runningCount : descendantCount }),
591
+ onClick: openTitle === void 0 ? void 0 : () => {
592
+ cancelHoverOpen();
593
+ if (open) changeOpen(false);
594
+ openTitle();
515
595
  },
516
- t
517
- })
518
- })]
596
+ onKeyDown: (event) => {
597
+ if (event.key !== "ArrowDown") return;
598
+ event.preventDefault();
599
+ if (!open) changeOpen(true);
600
+ queueMicrotask(() => {
601
+ focusAt(0);
602
+ });
603
+ },
604
+ children: [variant === "switcher" ? (0, react_jsx_runtime.jsx)("span", {
605
+ className: SubagentHeaderLineage_module_css_default.switcherTitle,
606
+ children: switcherDisplayTitle
607
+ }) : (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [descendants.runningCount > 0 && (0, react_jsx_runtime.jsx)("span", {
608
+ className: SubagentHeaderLineage_module_css_default.activitySlot,
609
+ children: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.StateDot, { state: "ongoing" })
610
+ }), (0, react_jsx_runtime.jsx)("span", {
611
+ className: SubagentHeaderLineage_module_css_default.count,
612
+ children: t(totalCountKey, { count: descendantCount })
613
+ })] }), variant === "switcher" ? (0, react_jsx_runtime.jsx)(SubagentSwitcherIcon, {}) : (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconChevronDownOutline14, { className: open ? SubagentHeaderLineage_module_css_default.triggerOpen : void 0 })]
614
+ }),
615
+ open && (0, react_dom.createPortal)((0, react_jsx_runtime.jsx)("div", {
616
+ ref: menuRef,
617
+ className: SubagentHeaderLineage_module_css_default.menu,
618
+ style: menuPosition,
619
+ role: "tree",
620
+ "aria-label": t("tree.aria"),
621
+ onMouseEnter: cancelHoverClose,
622
+ onMouseLeave: scheduleHoverClose,
623
+ children: (0, react_jsx_runtime.jsx)(CatalogRows, {
624
+ parentSessionId: rootSessionId,
625
+ currentSessionId,
626
+ catalog: presentedCatalog,
627
+ catalogs,
628
+ summaries,
629
+ expanded,
630
+ level: 1,
631
+ now,
632
+ openChild,
633
+ refresh,
634
+ toggleBranch,
635
+ closeCatalog: () => {
636
+ changeOpen(false);
637
+ },
638
+ t
639
+ })
640
+ }), document.body)
641
+ ]
519
642
  });
520
643
  }
644
+ /**
645
+ * Render one breadcrumb title together with its subagent navigation.
646
+ * @param props - Breadcrumb title, session standard props, and catalog actions.
647
+ * @returns An ordinary-title descendant count, or a title-and-chevron sibling switcher.
648
+ */
649
+ function SubagentHeaderLineage({ lineageSessionId, displayTitle, openTitle, useSessions, openChild, refresh, setCatalogOpen, t }) {
650
+ const parentId = useSessions((state) => {
651
+ const summary = state.byId[lineageSessionId];
652
+ return summary?.origin === "subagent" ? summary.parentId : void 0;
653
+ });
654
+ const shared = {
655
+ useSessions,
656
+ openChild,
657
+ refresh,
658
+ setCatalogOpen,
659
+ t
660
+ };
661
+ if (parentId === void 0) return (0, react_jsx_runtime.jsx)(CatalogDropdown, {
662
+ rootSessionId: lineageSessionId,
663
+ variant: "count",
664
+ separator: true,
665
+ ...shared
666
+ }, lineageSessionId);
667
+ return (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [(0, react_jsx_runtime.jsx)(CatalogDropdown, {
668
+ rootSessionId: parentId,
669
+ currentSessionId: lineageSessionId,
670
+ variant: "switcher",
671
+ displayTitle,
672
+ ...openTitle === void 0 ? {} : { openTitle },
673
+ ...shared
674
+ }, lineageSessionId), openTitle === void 0 && (0, react_jsx_runtime.jsx)(CatalogDropdown, {
675
+ rootSessionId: lineageSessionId,
676
+ variant: "count",
677
+ ...shared
678
+ }, lineageSessionId)] });
679
+ }
521
680
  //#endregion
522
681
  //#region \0dsh-css:/home/runner/work/deepseek-harness/deepseek-harness/packages/client/ui-subagent/src/client/SubagentReadOnlyComposer.module.css.mjs
523
682
  const css = ".XJ7liG_frame{border:1px solid var(--dsw-alias-border-l2);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}";
@@ -580,6 +739,7 @@ window.__ModuleLoader__.load({
580
739
  "count.total.other": "{count} 个子代理",
581
740
  "count.running.one": "{count} 个子代理,正在运行",
582
741
  "count.running.other": "{count} 个子代理,正在运行",
742
+ "switcher.aria": "切换子代理:{title}",
583
743
  "tree.aria": "子代理会话",
584
744
  "readonly.oneShot.title": "一次性子代理记录",
585
745
  "readonly.title": "此子代理暂时只读",
@@ -616,6 +776,7 @@ window.__ModuleLoader__.load({
616
776
  "count.total.other": "{count} subagents",
617
777
  "count.running.one": "{count} subagent running",
618
778
  "count.running.other": "{count} subagents running",
779
+ "switcher.aria": "Switch subagent: {title}",
619
780
  "tree.aria": "Subagent sessions",
620
781
  "readonly.oneShot.title": "One-shot subagent record",
621
782
  "readonly.title": "This subagent is read-only for now",
@@ -659,13 +820,11 @@ window.__ModuleLoader__.load({
659
820
  sessions.setSubagentCatalogOpen(parentSessionId, open);
660
821
  }
661
822
  });
662
- ctx.slots.inject("conversation.session.header.actions", () => ctx.slots.register({
663
- name: "conversation.session.header.actions",
664
- id: "subagent-catalog",
665
- order: 10,
823
+ ctx.slots.inject("conversation.session.header.lineage", () => ctx.slots.register({
824
+ name: "conversation.session.header.lineage",
666
825
  locale: NS,
667
826
  inject: catalogActions
668
- }, SubagentCatalogAction));
827
+ }, SubagentHeaderLineage));
669
828
  ctx.slots.inject("conversation.composer", () => ctx.slots.register({
670
829
  name: "conversation.composer",
671
830
  priority: -10,