@huanlin/dsh-focus-chat 0.1.23 → 0.1.25

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/lib/client.js CHANGED
@@ -18,15 +18,24 @@ window.__ModuleLoader__.load({
18
18
  return /^[A-Za-z]:[/\\]/.test(value) || value.startsWith("\\\\");
19
19
  }
20
20
  /**
21
+ * Whether a path is absolute in either spelling the Host accepts: POSIX (`/a/b`) or Windows drive or UNC.
22
+ * @param path - the path to classify.
23
+ * @returns `true` for an absolute path; `false` for a Workspace-relative one.
24
+ */
25
+ function isAbsoluteWorkspacePath(path) {
26
+ return path.startsWith("/") || isWindowsStylePath(path);
27
+ }
28
+ /**
21
29
  * Resolve a Workspace-relative path into the Host-facing spelling used by path operations.
22
30
  * @param cwd - Session Workspace root, when known.
23
31
  * @param path - Absolute or Workspace-relative path.
24
32
  * @returns an absolute path when a Workspace root is available, otherwise the original path.
25
33
  */
26
34
  function resolveWorkspacePath(cwd, path) {
27
- if (path.startsWith("/") || isWindowsStylePath(path)) return path;
35
+ if (isAbsoluteWorkspacePath(path)) return path;
28
36
  if (cwd === void 0 || cwd === "") return path;
29
- return `${cwd.replace(/[/\\]+$/, "")}/${path.replace(/^[/\\]+/, "")}`;
37
+ const separator = isWindowsStylePath(cwd) && cwd.includes("\\") ? "\\" : "/";
38
+ return `${cwd.replace(/[/\\]+$/, "")}${separator}${path.replace(/^[/\\]+/, "")}`;
30
39
  }
31
40
  /**
32
41
  * Abbreviate a POSIX home directory for display.
@@ -961,7 +970,9 @@ window.__ModuleLoader__.load({
961
970
  nodeKey: key,
962
971
  role: node.kind,
963
972
  content: message.content,
964
- time: message.time
973
+ time: message.time,
974
+ referenceLabels: message.referenceLabels,
975
+ skillNames: message.skillNames
965
976
  };
966
977
  if (node.kind !== "context") return base;
967
978
  const context = message;
@@ -1555,10 +1566,10 @@ window.__ModuleLoader__.load({
1555
1566
  document.head.appendChild(tag);
1556
1567
  }
1557
1568
  var ImageLightbox_module_css_default = {
1558
- "close": "zKLoba_close",
1569
+ "backdrop": "zKLoba_backdrop",
1559
1570
  "mask": "zKLoba_mask",
1560
- "image": "zKLoba_image",
1561
- "backdrop": "zKLoba_backdrop"
1571
+ "close": "zKLoba_close",
1572
+ "image": "zKLoba_image"
1562
1573
  };
1563
1574
  //#endregion
1564
1575
  //#region src/client/view/chrome/ImageLightbox.tsx
@@ -1896,15 +1907,15 @@ window.__ModuleLoader__.load({
1896
1907
  document.head.appendChild(tag);
1897
1908
  }
1898
1909
  var ThinkRow_module_css_default = {
1899
- "thinkPreviewClip": "dJ1PEG_thinkPreviewClip",
1900
- "thinkWrap": "dJ1PEG_thinkWrap",
1901
- "thinkPreviewText": "dJ1PEG_thinkPreviewText",
1902
- "dsh-focus-reasoning-sweep": "dJ1PEG_dsh-focus-reasoning-sweep",
1903
1910
  "thinkSeparator": "dJ1PEG_thinkSeparator",
1904
1911
  "thinkPreview": "dJ1PEG_thinkPreview",
1905
1912
  "thinkSummary": "dJ1PEG_thinkSummary",
1906
- "thinkBody": "dJ1PEG_thinkBody",
1907
- "thinkRow": "dJ1PEG_thinkRow"
1913
+ "thinkWrap": "dJ1PEG_thinkWrap",
1914
+ "dsh-focus-reasoning-sweep": "dJ1PEG_dsh-focus-reasoning-sweep",
1915
+ "thinkPreviewClip": "dJ1PEG_thinkPreviewClip",
1916
+ "thinkRow": "dJ1PEG_thinkRow",
1917
+ "thinkPreviewText": "dJ1PEG_thinkPreviewText",
1918
+ "thinkBody": "dJ1PEG_thinkBody"
1908
1919
  };
1909
1920
  //#endregion
1910
1921
  //#region src/client/view/rows/ThinkRow.tsx
@@ -2120,38 +2131,38 @@ window.__ModuleLoader__.load({
2120
2131
  document.head.appendChild(tag);
2121
2132
  }
2122
2133
  var ContextRow_module_css_default = {
2123
- "contextEntries": "_179bCq_contextEntries",
2124
- "contextFoldRow": "_179bCq_contextFoldRow",
2134
+ "contextBody": "_179bCq_contextBody",
2135
+ "contextFile": "_179bCq_contextFile",
2136
+ "contextText": "_179bCq_contextText",
2137
+ "contextNotice": "_179bCq_contextNotice",
2138
+ "contextFields": "_179bCq_contextFields",
2139
+ "contextSections": "_179bCq_contextSections",
2140
+ "contextRecalls": "_179bCq_contextRecalls",
2141
+ "contextEntry": "_179bCq_contextEntry",
2125
2142
  "contextSectionText": "_179bCq_contextSectionText",
2126
- "contextEntryDescription": "_179bCq_contextEntryDescription",
2127
- "contextSectionName": "_179bCq_contextSectionName",
2143
+ "contextRelaySender": "_179bCq_contextRelaySender",
2144
+ "thinkSeparator": "_179bCq_thinkSeparator",
2145
+ "contextEntryName": "_179bCq_contextEntryName",
2146
+ "contextSection": "_179bCq_contextSection",
2128
2147
  "contextField": "_179bCq_contextField",
2129
- "contextChevron": "_179bCq_contextChevron",
2148
+ "contextFileAction": "_179bCq_contextFileAction",
2130
2149
  "contextRecallCounts": "_179bCq_contextRecallCounts",
2131
- "contextText": "_179bCq_contextText",
2150
+ "contextSectionName": "_179bCq_contextSectionName",
2151
+ "contextFoldBody": "_179bCq_contextFoldBody",
2132
2152
  "contextFold": "_179bCq_contextFold",
2133
- "contextFiles": "_179bCq_contextFiles",
2134
- "contextEntryName": "_179bCq_contextEntryName",
2135
- "contextRelaySender": "_179bCq_contextRelaySender",
2136
- "contextBody": "_179bCq_contextBody",
2137
- "contextRecalls": "_179bCq_contextRecalls",
2138
- "contextFileAction": "_179bCq_contextFileAction",
2153
+ "contextFoldRow": "_179bCq_contextFoldRow",
2154
+ "contextEntryDescription": "_179bCq_contextEntryDescription",
2155
+ "contextRecallLabel": "_179bCq_contextRecallLabel",
2139
2156
  "contextRecall": "_179bCq_contextRecall",
2140
- "contextSource": "_179bCq_contextSource",
2141
2157
  "contextRow": "_179bCq_contextRow",
2142
- "contextRecallLabel": "_179bCq_contextRecallLabel",
2158
+ "contextChevron": "_179bCq_contextChevron",
2143
2159
  "contextFieldKey": "_179bCq_contextFieldKey",
2144
- "contextSection": "_179bCq_contextSection",
2145
- "contextFoldBody": "_179bCq_contextFoldBody",
2146
- "contextFields": "_179bCq_contextFields",
2147
- "contextSummary": "_179bCq_contextSummary",
2148
- "contextSections": "_179bCq_contextSections",
2149
- "contextFile": "_179bCq_contextFile",
2150
- "thinkSeparator": "_179bCq_thinkSeparator",
2151
- "contextFilePath": "_179bCq_contextFilePath",
2152
2160
  "contextFieldValue": "_179bCq_contextFieldValue",
2153
- "contextNotice": "_179bCq_contextNotice",
2154
- "contextEntry": "_179bCq_contextEntry"
2161
+ "contextFiles": "_179bCq_contextFiles",
2162
+ "contextSource": "_179bCq_contextSource",
2163
+ "contextFilePath": "_179bCq_contextFilePath",
2164
+ "contextSummary": "_179bCq_contextSummary",
2165
+ "contextEntries": "_179bCq_contextEntries"
2155
2166
  };
2156
2167
  //#endregion
2157
2168
  //#region src/client/view/rows/ContextRow.tsx
@@ -2713,31 +2724,31 @@ window.__ModuleLoader__.load({
2713
2724
  document.head.appendChild(tag);
2714
2725
  }
2715
2726
  var ToolCallRow_module_css_default = {
2727
+ "ioSection": "_4yws7G_ioSection",
2728
+ "callLeading": "_4yws7G_callLeading",
2729
+ "webBody": "_4yws7G_webBody",
2730
+ "callRowInner": "_4yws7G_callRowInner",
2731
+ "readBody": "_4yws7G_readBody",
2716
2732
  "diffBody": "_4yws7G_diffBody",
2733
+ "ioLabel": "_4yws7G_ioLabel",
2717
2734
  "searchRecovery": "_4yws7G_searchRecovery",
2718
- "ioText": "_4yws7G_ioText",
2719
- "ioDivider": "_4yws7G_ioDivider",
2735
+ "dsh-focus-tool-row-sweep": "_4yws7G_dsh-focus-tool-row-sweep",
2720
2736
  "callBodyWrap": "_4yws7G_callBodyWrap",
2721
- "ioSection": "_4yws7G_ioSection",
2722
- "callLeading": "_4yws7G_callLeading",
2723
- "callFileLink": "_4yws7G_callFileLink",
2724
- "subcalls": "_4yws7G_subcalls",
2725
- "callChevron": "_4yws7G_callChevron",
2726
2737
  "ioCard": "_4yws7G_ioCard",
2727
- "callTitle": "_4yws7G_callTitle",
2728
- "callRowInner": "_4yws7G_callRowInner",
2738
+ "ioDivider": "_4yws7G_ioDivider",
2729
2739
  "callSummary": "_4yws7G_callSummary",
2740
+ "codeBody": "_4yws7G_codeBody",
2730
2741
  "terminalBody": "_4yws7G_terminalBody",
2731
- "ioLabel": "_4yws7G_ioLabel",
2732
- "webBody": "_4yws7G_webBody",
2742
+ "subcalls": "_4yws7G_subcalls",
2743
+ "callFileLink": "_4yws7G_callFileLink",
2744
+ "callErrorSummary": "_4yws7G_callErrorSummary",
2745
+ "ioText": "_4yws7G_ioText",
2733
2746
  "callSeparator": "_4yws7G_callSeparator",
2747
+ "callChevron": "_4yws7G_callChevron",
2748
+ "searchBody": "_4yws7G_searchBody",
2749
+ "callTitle": "_4yws7G_callTitle",
2734
2750
  "callRow": "_4yws7G_callRow",
2735
- "dsh-focus-tool-row-sweep": "_4yws7G_dsh-focus-tool-row-sweep",
2736
- "codeBody": "_4yws7G_codeBody",
2737
- "callErrorSummary": "_4yws7G_callErrorSummary",
2738
- "readBody": "_4yws7G_readBody",
2739
- "bodyScroll": "_4yws7G_bodyScroll",
2740
- "searchBody": "_4yws7G_searchBody"
2751
+ "bodyScroll": "_4yws7G_bodyScroll"
2741
2752
  };
2742
2753
  //#endregion
2743
2754
  //#region src/client/view/rows/ToolCallRow.tsx
@@ -2986,11 +2997,11 @@ window.__ModuleLoader__.load({
2986
2997
  document.head.appendChild(tag);
2987
2998
  }
2988
2999
  var ToolGroupRow_module_css_default = {
2989
- "groupRow": "AZoo5a_groupRow",
2990
- "calls": "AZoo5a_calls",
2991
3000
  "groupRowInner": "AZoo5a_groupRowInner",
2992
- "groupTitleFailed": "AZoo5a_groupTitleFailed",
2993
- "groupTitleLine": "AZoo5a_groupTitleLine"
3001
+ "groupTitleLine": "AZoo5a_groupTitleLine",
3002
+ "calls": "AZoo5a_calls",
3003
+ "groupRow": "AZoo5a_groupRow",
3004
+ "groupTitleFailed": "AZoo5a_groupTitleFailed"
2994
3005
  };
2995
3006
  //#endregion
2996
3007
  //#region src/client/view/rows/ToolGroupRow.tsx
@@ -3060,10 +3071,10 @@ window.__ModuleLoader__.load({
3060
3071
  document.head.appendChild(tag);
3061
3072
  }
3062
3073
  var SystemPromptRow_module_css_default = {
3063
- "chevron": "OTeFQG_chevron",
3074
+ "text": "OTeFQG_text",
3064
3075
  "root": "OTeFQG_root",
3065
- "body": "OTeFQG_body",
3066
- "text": "OTeFQG_text"
3076
+ "chevron": "OTeFQG_chevron",
3077
+ "body": "OTeFQG_body"
3067
3078
  };
3068
3079
  //#endregion
3069
3080
  //#region src/client/view/rows/SystemPromptRow.tsx
@@ -3097,69 +3108,27 @@ window.__ModuleLoader__.load({
3097
3108
  });
3098
3109
  });
3099
3110
  //#endregion
3100
- //#region \0dsh-css:D:\Projects\deepseek-harness\dsh-focus-chat\src\client\view\rows\UserBubble.module.css.mjs
3101
- const css$12 = ".F9H9aG_userRow{flex-direction:column;align-items:flex-end;gap:6px;display:flex}.F9H9aG_userStack{flex-direction:column;align-items:flex-end;gap:8px;min-width:0;max-width:min(525px,82%);display:flex}.F9H9aG_bubble{background:var(--dsw-specific-bubble);max-width:100%;font-size:var(--dsh-content-font-size,14px);line-height:calc(22px + var(--dsh-content-font-delta,0px));color:var(--dsw-alias-label-primary);border-radius:22px;padding:10px 16px}.F9H9aG_refChip{color:var(--dsw-alias-label-primary);white-space:nowrap;vertical-align:baseline;background:#6187d838;border-radius:6px;margin:0 2px;padding:0 8px;font-size:.85em;line-height:1.6;display:inline-block}";
3102
- const tagId$12 = "@huanlin/dsh-focus-chat/UserBubble.module.css";
3103
- if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$12) + "]") === null) {
3104
- const tag = document.createElement("style");
3105
- tag.dataset.plugin = "@huanlin/dsh-focus-chat";
3106
- tag.dataset.pluginCss = tagId$12;
3107
- tag.textContent = css$12;
3108
- document.head.appendChild(tag);
3109
- }
3110
- var UserBubble_module_css_default = {
3111
- "userStack": "F9H9aG_userStack",
3112
- "refChip": "F9H9aG_refChip",
3113
- "bubble": "F9H9aG_bubble",
3114
- "userRow": "F9H9aG_userRow"
3115
- };
3116
- //#endregion
3117
3111
  //#region src/client/view/helpers/message.tsx
3112
+ /** User message text join (the chat bubble's text source). */
3118
3113
  function messageText(content) {
3119
3114
  return content.flatMap((block) => block.type === "text" ? [block.text ?? ""] : []).join("");
3120
3115
  }
3121
- /**
3122
- * Display projection of reference forms in a user bubble: `/name` / `@name`
3123
- * word-boundary tokens decorate as chips, everything else stays plain text
3124
- * (the chat bubble's projection — sent tokens were validated at compose time,
3125
- * so shape alone decorates).
3126
- */
3127
- function projectUserText(text) {
3128
- const re = /(^|\s)([/@][\w-]+)(?=\s|$)/g;
3129
- const parts = [];
3130
- let cursor = 0;
3131
- let m;
3132
- while ((m = re.exec(text)) !== null) {
3133
- const tokenStart = m.index + (m[1]?.length ?? 0);
3134
- const label = m[2] ?? "";
3135
- if (tokenStart > cursor) parts.push(/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.MessageText, { text: text.slice(cursor, tokenStart) }, cursor));
3136
- parts.push(/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
3137
- className: UserBubble_module_css_default.refChip,
3138
- "data-ref-chip": label.startsWith("@") ? "subagent" : "skill",
3139
- children: label
3140
- }, tokenStart));
3141
- cursor = tokenStart + label.length;
3142
- }
3143
- if (parts.length === 0) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.MessageText, { text });
3144
- if (cursor < text.length) parts.push(/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.MessageText, { text: text.slice(cursor) }, cursor));
3145
- return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_jsx_runtime.Fragment, { children: parts });
3146
- }
3147
3116
  //#endregion
3148
3117
  //#region \0dsh-css:D:\Projects\deepseek-harness\dsh-focus-chat\src\client\view\chrome\MessageActions.module.css.mjs
3149
- const css$11 = "._4s79ma_messageActions{align-items:center;gap:10px;height:28px;display:flex}._4s79ma_messageActions[data-clock=start] ._4s79ma_messageClock{padding-right:12px}._4s79ma_messageActions[data-clock=end] ._4s79ma_messageClock{padding-left:12px}._4s79ma_messageActions[data-clock=end]{margin-left:-6px}._4s79ma_messageClock{font-size:var(--dsh-content-font-size,14px);line-height:calc(24px + var(--dsh-content-font-delta,0px));color:var(--dsw-alias-label-tertiary);white-space:nowrap;font-variant-numeric:tabular-nums}@media (hover:hover){[data-time-hover-root] ._4s79ma_messageClock{opacity:0;transition:opacity 80ms}[data-time-hover-root]:hover ._4s79ma_messageClock,[data-time-hover-root]:focus-within ._4s79ma_messageClock{opacity:1}}._4s79ma_messageClockDot{margin:0 10px}._4s79ma_messageAction{width:28px;height:28px;color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:none;border-radius:28px;justify-content:center;align-items:center;padding:6px;display:inline-flex}._4s79ma_messageAction:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-secondary)}._4s79ma_messageAction[data-unavailable]{cursor:default;opacity:.4}._4s79ma_messageAction[data-unavailable]:hover{color:var(--dsw-alias-label-tertiary);background:0 0}";
3150
- const tagId$11 = "@huanlin/dsh-focus-chat/MessageActions.module.css";
3151
- if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$11) + "]") === null) {
3118
+ const css$12 = "._4s79ma_messageActions{align-items:center;gap:10px;height:28px;display:flex}._4s79ma_messageActions[data-clock=start] ._4s79ma_messageClock{padding-right:12px}._4s79ma_messageActions[data-clock=end] ._4s79ma_messageClock{padding-left:12px}._4s79ma_messageActions[data-clock=end]{margin-left:-6px}._4s79ma_messageClock{font-size:var(--dsh-content-font-size,14px);line-height:calc(24px + var(--dsh-content-font-delta,0px));color:var(--dsw-alias-label-tertiary);white-space:nowrap;font-variant-numeric:tabular-nums}@media (hover:hover){[data-time-hover-root] ._4s79ma_messageClock{opacity:0;transition:opacity 80ms}[data-time-hover-root]:hover ._4s79ma_messageClock,[data-time-hover-root]:focus-within ._4s79ma_messageClock{opacity:1}}._4s79ma_messageClockDot{margin:0 10px}._4s79ma_messageAction{width:28px;height:28px;color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:none;border-radius:28px;justify-content:center;align-items:center;padding:6px;display:inline-flex}._4s79ma_messageAction:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-secondary)}._4s79ma_messageAction[data-unavailable]{cursor:default;opacity:.4}._4s79ma_messageAction[data-unavailable]:hover{color:var(--dsw-alias-label-tertiary);background:0 0}";
3119
+ const tagId$12 = "@huanlin/dsh-focus-chat/MessageActions.module.css";
3120
+ if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$12) + "]") === null) {
3152
3121
  const tag = document.createElement("style");
3153
3122
  tag.dataset.plugin = "@huanlin/dsh-focus-chat";
3154
- tag.dataset.pluginCss = tagId$11;
3155
- tag.textContent = css$11;
3123
+ tag.dataset.pluginCss = tagId$12;
3124
+ tag.textContent = css$12;
3156
3125
  document.head.appendChild(tag);
3157
3126
  }
3158
3127
  var MessageActions_module_css_default = {
3159
- "messageActions": "_4s79ma_messageActions",
3160
3128
  "messageClock": "_4s79ma_messageClock",
3161
- "messageClockDot": "_4s79ma_messageClockDot",
3162
- "messageAction": "_4s79ma_messageAction"
3129
+ "messageActions": "_4s79ma_messageActions",
3130
+ "messageAction": "_4s79ma_messageAction",
3131
+ "messageClockDot": "_4s79ma_messageClockDot"
3163
3132
  };
3164
3133
  //#endregion
3165
3134
  //#region src/client/view/chrome/MessageActions.tsx
@@ -3260,6 +3229,23 @@ window.__ModuleLoader__.load({
3260
3229
  });
3261
3230
  });
3262
3231
  //#endregion
3232
+ //#region \0dsh-css:D:\Projects\deepseek-harness\dsh-focus-chat\src\client\view\rows\UserBubble.module.css.mjs
3233
+ const css$11 = ".F9H9aG_userRow{flex-direction:column;align-items:flex-end;gap:6px;display:flex}.F9H9aG_userStack{flex-direction:column;align-items:flex-end;gap:8px;min-width:0;max-width:min(525px,82%);display:flex}.F9H9aG_bubble{background:var(--dsw-specific-bubble);max-width:100%;font-size:var(--dsh-content-font-size,14px);line-height:calc(22px + var(--dsh-content-font-delta,0px));color:var(--dsw-alias-label-primary);border-radius:22px;padding:10px 16px}.F9H9aG_refChip{color:var(--dsw-alias-label-primary);white-space:nowrap;vertical-align:baseline;background:#6187d838;border-radius:6px;margin:0 2px;padding:0 8px;font-size:.85em;line-height:1.6;display:inline-block}";
3234
+ const tagId$11 = "@huanlin/dsh-focus-chat/UserBubble.module.css";
3235
+ if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$11) + "]") === null) {
3236
+ const tag = document.createElement("style");
3237
+ tag.dataset.plugin = "@huanlin/dsh-focus-chat";
3238
+ tag.dataset.pluginCss = tagId$11;
3239
+ tag.textContent = css$11;
3240
+ document.head.appendChild(tag);
3241
+ }
3242
+ var UserBubble_module_css_default = {
3243
+ "userRow": "F9H9aG_userRow",
3244
+ "bubble": "F9H9aG_bubble",
3245
+ "refChip": "F9H9aG_refChip",
3246
+ "userStack": "F9H9aG_userStack"
3247
+ };
3248
+ //#endregion
3263
3249
  //#region src/client/view/rows/UserBubble.tsx
3264
3250
  const MessageRow = (0, react.memo)(function MessageRow({ item, t, mdLabels, loadImage }) {
3265
3251
  const text = (0, react.useMemo)(() => messageText(item.content), [item.content]);
@@ -3279,7 +3265,7 @@ window.__ModuleLoader__.load({
3279
3265
  labels: messageImageLabels(t)
3280
3266
  }), showBubble && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
3281
3267
  className: UserBubble_module_css_default.bubble,
3282
- children: [projectUserText(text), others.map((block, index) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.JsonBlock, {
3268
+ children: [(0, _deepseek_ai_dsh_client_ui_primitives.projectUserText)(text, item.referenceLabels ?? [], item.skillNames ?? []), others.map((block, index) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.JsonBlock, {
3283
3269
  label: t("extraBlock"),
3284
3270
  payload: block,
3285
3271
  truncatedLabel: jsonTruncated(t)
@@ -3314,7 +3300,7 @@ window.__ModuleLoader__.load({
3314
3300
  labels: messageImageLabels(t)
3315
3301
  }), showBubble && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
3316
3302
  className: UserBubble_module_css_default.bubble,
3317
- children: [projectUserText(text), others.map((block, index) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.JsonBlock, {
3303
+ children: [(0, _deepseek_ai_dsh_client_ui_primitives.projectUserText)(text, []), others.map((block, index) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.JsonBlock, {
3318
3304
  label: t("extraBlock"),
3319
3305
  payload: block,
3320
3306
  truncatedLabel: jsonTruncated(t)
@@ -3373,13 +3359,13 @@ window.__ModuleLoader__.load({
3373
3359
  document.head.appendChild(tag);
3374
3360
  }
3375
3361
  var MessageFeedbackActions_module_css_default = {
3376
- "failure": "-anQya_failure",
3377
- "noteActions": "-anQya_noteActions",
3378
3362
  "noteSave": "-anQya_noteSave",
3379
3363
  "action": "-anQya_action",
3364
+ "failure": "-anQya_failure",
3365
+ "noteOpen": "-anQya_noteOpen",
3366
+ "noteActions": "-anQya_noteActions",
3380
3367
  "noteCancel": "-anQya_noteCancel",
3381
3368
  "notePanel": "-anQya_notePanel",
3382
- "noteOpen": "-anQya_noteOpen",
3383
3369
  "noteInput": "-anQya_noteInput"
3384
3370
  };
3385
3371
  //#endregion
@@ -3665,15 +3651,15 @@ window.__ModuleLoader__.load({
3665
3651
  document.head.appendChild(tag);
3666
3652
  }
3667
3653
  var TurnUsageDisclosure_module_css_default = {
3668
- "route": "xrt96a_route",
3654
+ "root": "xrt96a_root",
3669
3655
  "details": "xrt96a_details",
3670
- "separator": "xrt96a_separator",
3671
- "totalValue": "xrt96a_totalValue",
3672
3656
  "summary": "xrt96a_summary",
3673
- "chevron": "xrt96a_chevron",
3674
- "root": "xrt96a_root",
3657
+ "separator": "xrt96a_separator",
3675
3658
  "reasoning": "xrt96a_reasoning",
3676
- "totalLabel": "xrt96a_totalLabel"
3659
+ "totalValue": "xrt96a_totalValue",
3660
+ "route": "xrt96a_route",
3661
+ "totalLabel": "xrt96a_totalLabel",
3662
+ "chevron": "xrt96a_chevron"
3677
3663
  };
3678
3664
  //#endregion
3679
3665
  //#region src/client/view/rows/TurnUsageDisclosure.tsx
@@ -3770,14 +3756,14 @@ window.__ModuleLoader__.load({
3770
3756
  document.head.appendChild(tag);
3771
3757
  }
3772
3758
  var TurnTailRow_module_css_default = {
3773
- "producedFile": "g6Vo2a_producedFile",
3774
- "producedMore": "g6Vo2a_producedMore",
3775
- "producedRow": "g6Vo2a_producedRow",
3776
3759
  "producedLabel": "g6Vo2a_producedLabel",
3777
- "producedShowFolder": "g6Vo2a_producedShowFolder",
3778
3760
  "producedLane": "g6Vo2a_producedLane",
3761
+ "producedMeasure": "g6Vo2a_producedMeasure",
3762
+ "producedRow": "g6Vo2a_producedRow",
3763
+ "producedShowFolder": "g6Vo2a_producedShowFolder",
3779
3764
  "turnTail": "g6Vo2a_turnTail",
3780
- "producedMeasure": "g6Vo2a_producedMeasure"
3765
+ "producedMore": "g6Vo2a_producedMore",
3766
+ "producedFile": "g6Vo2a_producedFile"
3781
3767
  };
3782
3768
  //#endregion
3783
3769
  //#region src/client/view/rows/TurnTailRow.tsx
@@ -3919,12 +3905,12 @@ window.__ModuleLoader__.load({
3919
3905
  document.head.appendChild(tag);
3920
3906
  }
3921
3907
  var CommandRow_module_css_default = {
3922
- "commandSummary": "EhZFdG_commandSummary",
3923
3908
  "dsh-focus-command-row-sweep": "EhZFdG_dsh-focus-command-row-sweep",
3924
- "commandRow": "EhZFdG_commandRow",
3925
3909
  "commandRowInner": "EhZFdG_commandRowInner",
3926
3910
  "thinkSeparator": "EhZFdG_thinkSeparator",
3927
- "commandBody": "EhZFdG_commandBody"
3911
+ "commandBody": "EhZFdG_commandBody",
3912
+ "commandRow": "EhZFdG_commandRow",
3913
+ "commandSummary": "EhZFdG_commandSummary"
3928
3914
  };
3929
3915
  //#endregion
3930
3916
  //#region src/client/view/rows/CommandRow.tsx
@@ -3982,15 +3968,15 @@ window.__ModuleLoader__.load({
3982
3968
  document.head.appendChild(tag);
3983
3969
  }
3984
3970
  var CompactionRow_module_css_default = {
3985
- "compactionRow": "MjDQ7W_compactionRow",
3986
3971
  "compactionBody": "MjDQ7W_compactionBody",
3987
3972
  "compactionSep": "MjDQ7W_compactionSep",
3988
3973
  "compactionTitle": "MjDQ7W_compactionTitle",
3989
- "compactionButton": "MjDQ7W_compactionButton",
3974
+ "compactionRow": "MjDQ7W_compactionRow",
3975
+ "compactionLeading": "MjDQ7W_compactionLeading",
3990
3976
  "compactionContextIcon": "MjDQ7W_compactionContextIcon",
3977
+ "compactionButton": "MjDQ7W_compactionButton",
3991
3978
  "compactionDisclosureIcon": "MjDQ7W_compactionDisclosureIcon",
3992
- "compactionSummary": "MjDQ7W_compactionSummary",
3993
- "compactionLeading": "MjDQ7W_compactionLeading"
3979
+ "compactionSummary": "MjDQ7W_compactionSummary"
3994
3980
  };
3995
3981
  //#endregion
3996
3982
  //#region src/client/view/rows/CompactionRow.tsx
@@ -4091,12 +4077,12 @@ window.__ModuleLoader__.load({
4091
4077
  document.head.appendChild(tag);
4092
4078
  }
4093
4079
  var RetryRow_module_css_default = {
4094
- "retryRow": "Z1bpSa_retryRow",
4095
- "retrySummary": "Z1bpSa_retrySummary",
4096
4080
  "dsh-focus-retry-shimmer": "Z1bpSa_dsh-focus-retry-shimmer",
4097
4081
  "retryText": "Z1bpSa_retryText",
4082
+ "retryDetailLabel": "Z1bpSa_retryDetailLabel",
4098
4083
  "retryDetails": "Z1bpSa_retryDetails",
4099
- "retryDetailLabel": "Z1bpSa_retryDetailLabel"
4084
+ "retrySummary": "Z1bpSa_retrySummary",
4085
+ "retryRow": "Z1bpSa_retryRow"
4100
4086
  };
4101
4087
  //#endregion
4102
4088
  //#region src/client/view/rows/RetryRow.tsx
@@ -4182,8 +4168,8 @@ window.__ModuleLoader__.load({
4182
4168
  "turnFold": "Gcx_5W_turnFold",
4183
4169
  "label": "Gcx_5W_label",
4184
4170
  "turnFoldBody": "Gcx_5W_turnFoldBody",
4185
- "chevron": "Gcx_5W_chevron",
4186
- "root": "Gcx_5W_root"
4171
+ "root": "Gcx_5W_root",
4172
+ "chevron": "Gcx_5W_chevron"
4187
4173
  };
4188
4174
  //#endregion
4189
4175
  //#region src/client/view/rows/TurnFoldRow.tsx
@@ -4243,14 +4229,14 @@ window.__ModuleLoader__.load({
4243
4229
  }
4244
4230
  var FlowRow_module_css_default = {
4245
4231
  "turnErrorCode": "W4FZQG_turnErrorCode",
4246
- "assistant": "W4FZQG_assistant",
4247
- "turnErrorDot": "W4FZQG_turnErrorDot",
4248
- "turnErrorMessage": "W4FZQG_turnErrorMessage",
4249
4232
  "stopped": "W4FZQG_stopped",
4250
4233
  "turnErrorRow": "W4FZQG_turnErrorRow",
4234
+ "assistant": "W4FZQG_assistant",
4235
+ "turnErrorDot": "W4FZQG_turnErrorDot",
4236
+ "turnErrorTitle": "W4FZQG_turnErrorTitle",
4251
4237
  "contextRow": "W4FZQG_contextRow",
4252
4238
  "turnErrorCopy": "W4FZQG_turnErrorCopy",
4253
- "turnErrorTitle": "W4FZQG_turnErrorTitle"
4239
+ "turnErrorMessage": "W4FZQG_turnErrorMessage"
4254
4240
  };
4255
4241
  //#endregion
4256
4242
  //#region src/client/view/rows/FlowRow.tsx
@@ -4435,8 +4421,8 @@ window.__ModuleLoader__.load({
4435
4421
  }
4436
4422
  var RunningStatus_module_css_default = {
4437
4423
  "dsh-focus-turn-shimmer": "_1zwjxa_dsh-focus-turn-shimmer",
4438
- "turnStatusClock": "_1zwjxa_turnStatusClock",
4439
- "turnStatus": "_1zwjxa_turnStatus"
4424
+ "turnStatus": "_1zwjxa_turnStatus",
4425
+ "turnStatusClock": "_1zwjxa_turnStatusClock"
4440
4426
  };
4441
4427
  //#endregion
4442
4428
  //#region src/client/view/chrome/RunningStatus.tsx
@@ -4479,18 +4465,18 @@ window.__ModuleLoader__.load({
4479
4465
  document.head.appendChild(tag);
4480
4466
  }
4481
4467
  var TurnNavigator_module_css_default = {
4482
- "mark": "jXLS-q_mark",
4483
- "preview": "jXLS-q_preview",
4484
- "previewResponse": "jXLS-q_previewResponse",
4485
- "dsh-focus-turn-preview-enter": "jXLS-q_dsh-focus-turn-preview-enter",
4486
4468
  "markPreview": "jXLS-q_markPreview",
4487
- "dsh-focus-turn-mark-enter": "jXLS-q_dsh-focus-turn-mark-enter",
4469
+ "markActive": "jXLS-q_markActive",
4470
+ "marks": "jXLS-q_marks",
4488
4471
  "previewPrompt": "jXLS-q_previewPrompt",
4472
+ "previewResponse": "jXLS-q_previewResponse",
4473
+ "rail": "jXLS-q_rail",
4474
+ "dsh-focus-turn-preview-enter": "jXLS-q_dsh-focus-turn-preview-enter",
4475
+ "preview": "jXLS-q_preview",
4489
4476
  "markPosition": "jXLS-q_markPosition",
4490
- "marks": "jXLS-q_marks",
4477
+ "dsh-focus-turn-mark-enter": "jXLS-q_dsh-focus-turn-mark-enter",
4491
4478
  "slot": "jXLS-q_slot",
4492
- "rail": "jXLS-q_rail",
4493
- "markActive": "jXLS-q_markActive"
4479
+ "mark": "jXLS-q_mark"
4494
4480
  };
4495
4481
  //#endregion
4496
4482
  //#region src/client/view/chrome/TurnNavigator.tsx
@@ -4602,19 +4588,19 @@ window.__ModuleLoader__.load({
4602
4588
  document.head.appendChild(tag);
4603
4589
  }
4604
4590
  var FocusView_module_css_default = {
4605
- "empty": "VkMv3G_empty",
4606
- "older": "VkMv3G_older",
4591
+ "runningCalls": "VkMv3G_runningCalls",
4592
+ "toBottom": "VkMv3G_toBottom",
4593
+ "modalAction": "VkMv3G_modalAction",
4607
4594
  "hint": "VkMv3G_hint",
4595
+ "scroll": "VkMv3G_scroll",
4596
+ "root": "VkMv3G_root",
4597
+ "column": "VkMv3G_column",
4608
4598
  "flowItem": "VkMv3G_flowItem",
4599
+ "older": "VkMv3G_older",
4609
4600
  "olderButton": "VkMv3G_olderButton",
4610
- "root": "VkMv3G_root",
4611
4601
  "openError": "VkMv3G_openError",
4612
- "column": "VkMv3G_column",
4613
- "scroll": "VkMv3G_scroll",
4614
4602
  "toBottomSlot": "VkMv3G_toBottomSlot",
4615
- "toBottom": "VkMv3G_toBottom",
4616
- "runningCalls": "VkMv3G_runningCalls",
4617
- "modalAction": "VkMv3G_modalAction"
4603
+ "empty": "VkMv3G_empty"
4618
4604
  };
4619
4605
  //#endregion
4620
4606
  //#region src/client/view/FocusView.tsx
@@ -6014,7 +6000,7 @@ window.__ModuleLoader__.load({
6014
6000
  }).catch(() => {});
6015
6001
  },
6016
6002
  fileMentions: (owner) => {
6017
- return ctx.get("chatFileMentions")?.forClosing(owner);
6003
+ return ctx.get("chatFileMentions")?.forClosing(owner, sessionId);
6018
6004
  },
6019
6005
  isLoopback: connection.isLoopback,
6020
6006
  scroll: {
@@ -1,8 +1,8 @@
1
1
  /** Pure type face of the focus flow model (React-free). */
2
2
  import type { DiffHunk, ReadBlockLine, SearchBlockProps, WebBlockProps } from '@deepseek-ai/dsh-client-ui-primitives';
3
3
  import type { ContentBlock } from '@deepseek-ai/dsh-llm/types';
4
- import type { AssistantBlock, ChatNodeDataMap, ContextMessageNode } from '@deepseek-ai/dsh-client-ui-chat/client';
5
- import type { TurnTokenUsage } from '@deepseek-ai/dsh-client-ui-chat/src/client/contract/chat-nodes.ts';
4
+ import type { AssistantBlock, ChatNodeDataMap, ContextMessageNode, TurnTailChatData } from '@deepseek-ai/dsh-client-ui-chat/client';
5
+ type TurnTokenUsage = NonNullable<TurnTailChatData['tokenUsage']>;
6
6
  /** Locale-owned label surfaces the render sites add to the shared card primitives. */
7
7
  type DistributiveOmit<T, K extends keyof T> = T extends unknown ? Omit<T, K> : never;
8
8
  /** Search-card data the model owns; render adds `labels`/`maxLines`/`className`. */
@@ -150,6 +150,10 @@ export type FocusFlowItem = {
150
150
  role: 'user' | 'steering' | 'context';
151
151
  content: readonly ContentBlock[];
152
152
  time: number;
153
+ /** Session labels cited by an adjacent recall (the chat bubble's chip sources). */
154
+ referenceLabels?: readonly string[];
155
+ /** Skill names the step's skill-invocation injections loaded for this message. */
156
+ skillNames?: readonly string[];
153
157
  /** Context-injection chrome (the chat ContextInjectionRow); absent for user/steering. */
154
158
  context?: {
155
159
  source: ContextMessageNode['source'];
@@ -1,13 +1,5 @@
1
- /** User message text projection (the chat bubble join and reference chips). */
2
- import type { ReactNode } from 'react';
1
+ /** User message text join (the chat bubble's text source). */
3
2
  export declare function messageText(content: readonly {
4
3
  type?: string;
5
4
  text?: string;
6
5
  }[]): string;
7
- /**
8
- * Display projection of reference forms in a user bubble: `/name` / `@name`
9
- * word-boundary tokens decorate as chips, everything else stays plain text
10
- * (the chat bubble's projection — sent tokens were validated at compose time,
11
- * so shape alone decorates).
12
- */
13
- export declare function projectUserText(text: string): ReactNode;
@@ -1,4 +1,5 @@
1
- import type { TurnTokenUsage } from '@deepseek-ai/dsh-client-ui-chat/src/client/contract/chat-nodes.ts';
1
+ import type { TurnTailChatData } from '@deepseek-ai/dsh-client-ui-chat/client';
2
+ type TurnTokenUsage = NonNullable<TurnTailChatData['tokenUsage']>;
2
3
  import type { FocusTranslate } from '../../contract/props.ts';
3
4
  /** Compact per-Turn usage summary with an opt-in bucket breakdown (the
4
5
  * official TurnUsageDisclosure chrome: data icon, summary line, and the
@@ -7,3 +8,4 @@ export declare const TurnUsageDisclosure: import("react").MemoExoticComponent<({
7
8
  usage: TurnTokenUsage;
8
9
  t: FocusTranslate;
9
10
  }) => import("react").JSX.Element>;
11
+ export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@huanlin/dsh-focus-chat",
3
- "version": "0.1.23",
3
+ "version": "0.1.25",
4
4
  "description": "Claude Code-style focus view for the dsh web GUI: the conversation's condensed reading surface — tool calls folded into expandable metric summaries, chat 1:1 row chrome, and streaming think rows",
5
5
  "type": "module",
6
6
  "main": "lib/index.js",
@@ -43,36 +43,45 @@
43
43
  },
44
44
  "peerDependencies": {
45
45
  "@deepseek-ai/cordis": ">=4.0.1",
46
- "@deepseek-ai/dsh-api-remotes": ">=0.1.2-rc.1",
47
- "@deepseek-ai/dsh-attachment": ">=0.1.2-rc.1",
48
- "@deepseek-ai/dsh-client-connection": ">=0.1.2-rc.1",
49
- "@deepseek-ai/dsh-client-locale": ">=0.1.2-rc.1",
50
- "@deepseek-ai/dsh-client-ui-chat": ">=0.1.2-rc.1",
51
- "@deepseek-ai/dsh-client-ui-conversation": ">=0.1.2-rc.1",
52
- "@deepseek-ai/dsh-client-ui-primitives": ">=0.1.2-rc.1",
53
- "@deepseek-ai/dsh-client-ui-renderer": ">=0.1.2-rc.1",
54
- "@deepseek-ai/dsh-client-ui-slots": ">=0.1.2-rc.1",
55
- "@deepseek-ai/dsh-llm": ">=0.1.2-rc.1",
56
- "@deepseek-ai/dsh-message-feedback": ">=0.1.2-rc.1",
57
- "@deepseek-ai/dsh-session": ">=0.1.2-rc.1",
58
- "@deepseek-ai/dsh-typert-protocol": ">=0.1.2-rc.1",
59
- "@deepseek-ai/dsh-util-workspace-path": ">=0.1.2-rc.1"
46
+ "@deepseek-ai/dsh-api-remotes": ">=0.1.5-rc.1",
47
+ "@deepseek-ai/dsh-attachment": ">=0.1.5-rc.1",
48
+ "@deepseek-ai/dsh-client-connection": ">=0.1.5-rc.1",
49
+ "@deepseek-ai/dsh-client-locale": ">=0.1.5-rc.1",
50
+ "@deepseek-ai/dsh-client-ui-chat": ">=0.1.5-rc.1",
51
+ "@deepseek-ai/dsh-client-ui-conversation": ">=0.1.5-rc.1",
52
+ "@deepseek-ai/dsh-client-ui-primitives": ">=0.1.5-rc.1",
53
+ "@deepseek-ai/dsh-client-ui-renderer": ">=0.1.5-rc.1",
54
+ "@deepseek-ai/dsh-client-ui-slots": ">=0.1.5-rc.1",
55
+ "@deepseek-ai/dsh-llm": ">=0.1.5-rc.1",
56
+ "@deepseek-ai/dsh-message-feedback": ">=0.1.5-rc.1",
57
+ "@deepseek-ai/dsh-session": ">=0.1.5-rc.1",
58
+ "@deepseek-ai/dsh-typert-protocol": ">=0.1.5-rc.1",
59
+ "@deepseek-ai/dsh-util-workspace-path": ">=0.1.5-rc.1"
60
60
  },
61
61
  "devDependencies": {
62
62
  "@deepseek-ai/cordis": "^4.0.1",
63
- "@deepseek-ai/dsh-api-remotes": "0.1.2-rc.1",
64
- "@deepseek-ai/dsh-attachment": "^0.1.2-rc.1",
65
- "@deepseek-ai/dsh-client-connection": "^0.1.2-rc.1",
66
- "@deepseek-ai/dsh-client-locale": "^0.1.2-rc.1",
67
- "@deepseek-ai/dsh-client-test-runtime": "0.1.0-rc.7",
68
- "@deepseek-ai/dsh-client-ui-attachment": "^0.1.2-rc.1",
69
- "@deepseek-ai/dsh-client-ui-conversation": "^0.1.2-rc.1",
70
- "@deepseek-ai/dsh-client-ui-primitives": "^0.1.2-rc.1",
71
- "@deepseek-ai/dsh-client-ui-renderer": "^0.1.2-rc.1",
72
- "@deepseek-ai/dsh-client-ui-slots": "^0.1.2-rc.1",
73
- "@deepseek-ai/dsh-llm": "^0.1.2-rc.1",
74
- "@deepseek-ai/dsh-message-feedback": "0.1.2-rc.1",
75
- "@deepseek-ai/dsh-typert-protocol": "^0.1.2-rc.1",
63
+ "@deepseek-ai/dsh-api-gateway": "link:D:/Projects/deepseek-harness/dsh/packages/api/gateway",
64
+ "@deepseek-ai/dsh-api-remotes": "link:D:/Projects/deepseek-harness/dsh/packages/api/remotes",
65
+ "@deepseek-ai/dsh-api-session-controller": "link:D:/Projects/deepseek-harness/dsh/packages/api/session-controller",
66
+ "@deepseek-ai/dsh-api-workspace-controller": "link:D:/Projects/deepseek-harness/dsh/packages/api/workspace-controller",
67
+ "@deepseek-ai/dsh-attachment": "link:D:/Projects/deepseek-harness/dsh/packages/attachment/attachment",
68
+ "@deepseek-ai/dsh-client-connection": "link:D:/Projects/deepseek-harness/dsh/packages/client/connection",
69
+ "@deepseek-ai/dsh-client-locale": "link:D:/Projects/deepseek-harness/dsh/packages/client/locale",
70
+ "@deepseek-ai/dsh-client-test-runtime": "link:D:/Projects/deepseek-harness/dsh/packages/test-support/client-runtime",
71
+ "@deepseek-ai/dsh-client-ui-attachment": "link:D:/Projects/deepseek-harness/dsh/packages/client/ui-attachment",
72
+ "@deepseek-ai/dsh-client-ui-chat": "link:D:/Projects/deepseek-harness/dsh/packages/client/ui-chat",
73
+ "@deepseek-ai/dsh-client-ui-conversation": "link:D:/Projects/deepseek-harness/dsh/packages/client/ui-conversation",
74
+ "@deepseek-ai/dsh-client-ui-deliverables": "link:D:/Projects/deepseek-harness/dsh/packages/client/ui-deliverables",
75
+ "@deepseek-ai/dsh-client-ui-primitives": "link:D:/Projects/deepseek-harness/dsh/packages/client/ui-primitives",
76
+ "@deepseek-ai/dsh-client-ui-renderer": "link:D:/Projects/deepseek-harness/dsh/packages/client/ui-renderer",
77
+ "@deepseek-ai/dsh-client-ui-session": "link:D:/Projects/deepseek-harness/dsh/packages/client/ui-session",
78
+ "@deepseek-ai/dsh-client-ui-slots": "link:D:/Projects/deepseek-harness/dsh/packages/client/ui-slots",
79
+ "@deepseek-ai/dsh-client-store": "link:D:/Projects/deepseek-harness/dsh/packages/client/store",
80
+ "@deepseek-ai/dsh-llm": "link:D:/Projects/deepseek-harness/dsh/packages/llm/llm",
81
+ "@deepseek-ai/dsh-message-feedback": "link:D:/Projects/deepseek-harness/dsh/packages/feedback/message-feedback",
82
+ "@deepseek-ai/dsh-session": "link:D:/Projects/deepseek-harness/dsh/packages/core/session",
83
+ "@deepseek-ai/dsh-typert-protocol": "link:D:/Projects/deepseek-harness/dsh/packages/typert/protocol",
84
+ "@deepseek-ai/dsh-util-workspace-path": "link:D:/Projects/deepseek-harness/dsh/packages/util/workspace-path",
76
85
  "@testing-library/dom": "^10.4.0",
77
86
  "@testing-library/react": "^16.1.0",
78
87
  "@types/node": "^22.0.0",