Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
DSH Desktop packages the local DeepSeek Harness web experience as a desktop application. It launches a local Harness instance automatically, manages a random loopback port, persists profiles, plugins, and sessions, and opens the full interface as soon as Harness is ready. Project workspaces are added and managed entirely in the Harness interface.

> [!IMPORTANT]
> DSH Desktop is currently an early preview and depends on the rapidly evolving `@deepseek-ai/dsh@0.1.0-rc.6`. macOS releases are code-signed and notarized by Apple; current installers are distributed through the official website.
> DSH Desktop is currently an early preview and depends on the rapidly evolving `@deepseek-ai/dsh@0.1.0-rc.7`. macOS releases are code-signed and notarized by Apple; current installers are distributed through the official website.

## Download

Expand Down Expand Up @@ -155,7 +155,7 @@ build/ Application icon assets

## Upstream version and patches

The project currently pins `@deepseek-ai/dsh@0.1.0-rc.6`. The initial provider list and desktop preset-transfer surface are captured with [`patch-package`](https://github.com/ds300/patch-package) under [`patches/`](patches/) rather than relying on untracked changes in `node_modules`.
The project currently pins `@deepseek-ai/dsh@0.1.0-rc.7`. The initial provider list and desktop preset-transfer surface are captured with [`patch-package`](https://github.com/ds300/patch-package) under [`patches/`](patches/) rather than relying on untracked changes in `node_modules`.

When upgrading DSH:

Expand Down
4 changes: 2 additions & 2 deletions README.zh.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
DSH Desktop 把 DeepSeek Harness 的本地 Web 体验封装为桌面应用:应用会自动启动本地 Harness、管理随机回环端口、持久化 Profile/插件/会话,并在 Harness 就绪后直接进入完整界面。项目工作区在 Harness 界面中统一添加和管理。

> [!IMPORTANT]
> DSH Desktop 当前处于早期预览阶段,并依赖仍在快速迭代的 `@deepseek-ai/dsh@0.1.0-rc.6`。macOS 正式包已完成代码签名并通过 Apple 公证,当前安装包统一通过官网分发。
> DSH Desktop 当前处于早期预览阶段,并依赖仍在快速迭代的 `@deepseek-ai/dsh@0.1.0-rc.7`。macOS 正式包已完成代码签名并通过 Apple 公证,当前安装包统一通过官网分发。
## 下载安装

Expand Down Expand Up @@ -155,7 +155,7 @@ build/ 应用图标资源

## 上游版本与补丁

项目当前固定依赖 `@deepseek-ai/dsh@0.1.0-rc.6`。首启 Provider 列表与桌面端 Preset 导入导出界面由 [`patch-package`](https://github.com/ds300/patch-package) 固化在 [`patches/`](patches/) 中,而不是依赖未跟踪的 `node_modules` 修改。
项目当前固定依赖 `@deepseek-ai/dsh@0.1.0-rc.7`。首启 Provider 列表与桌面端 Preset 导入导出界面由 [`patch-package`](https://github.com/ds300/patch-package) 固化在 [`patches/`](patches/) 中,而不是依赖未跟踪的 `node_modules` 修改。

升级 DSH 时必须:

Expand Down
2 changes: 1 addition & 1 deletion docs/preset-packages.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ preset/
"id": "my-agent",
"name": "My agent",
"description": "Optional display copy",
"sourceDshVersion": "0.1.0-rc.6",
"sourceDshVersion": "0.1.0-rc.7",
"exportedAt": "2026-08-14T12:00:00.000Z"
}
```
Expand Down
2 changes: 1 addition & 1 deletion docs/preset-square-mvp.md
Original file line number Diff line number Diff line change
Expand Up @@ -254,7 +254,7 @@ publisherEmail=name@example.com
"sha256": "...",
"sizeBytes": 12345,
"formatVersion": 1,
"sourceDshVersion": "0.1.0-rc.6"
"sourceDshVersion": "0.1.0-rc.7"
},
"detailUrl": "https://square.dsh.example/p/tender-extract-a1b2c3",
"downloadCount": 0,
Expand Down
3,951 changes: 1,922 additions & 2,029 deletions package-lock.json

Large diffs are not rendered by default.

38 changes: 19 additions & 19 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -41,25 +41,25 @@
},
"dependencies": {
"@deepseek-ai/cordis-plugin-group": "1.0.1",
"@deepseek-ai/dsh": "0.1.0-rc.6",
"@deepseek-ai/dsh-anonymous-user-id": "0.1.0-rc.6",
"@deepseek-ai/dsh-atomic-write": "0.1.0-rc.6",
"@deepseek-ai/dsh-bash-local": "0.1.0-rc.6",
"@deepseek-ai/dsh-code-runtime": "0.1.0-rc.6",
"@deepseek-ai/dsh-compaction": "0.1.0-rc.6",
"@deepseek-ai/dsh-fs": "0.1.0-rc.6",
"@deepseek-ai/dsh-invariants": "0.1.0-rc.6",
"@deepseek-ai/dsh-output-retention": "0.1.0-rc.6",
"@deepseek-ai/dsh-sandbox": "0.1.0-rc.6",
"@deepseek-ai/dsh-scope": "0.1.0-rc.6",
"@deepseek-ai/dsh-session-telemetry": "0.1.0-rc.6",
"@deepseek-ai/dsh-session-title-llm": "0.1.0-rc.6",
"@deepseek-ai/dsh-shell": "0.1.0-rc.6",
"@deepseek-ai/dsh-spill": "0.1.0-rc.6",
"@deepseek-ai/dsh-subagent-in-process-driver": "0.1.0-rc.6",
"@deepseek-ai/dsh-subprocess": "0.1.0-rc.6",
"@deepseek-ai/dsh-timeout": "0.1.0-rc.6",
"@deepseek-ai/dsh-workflow": "0.1.0-rc.6",
"@deepseek-ai/dsh": "0.1.0-rc.7",
"@deepseek-ai/dsh-anonymous-user-id": "0.1.0-rc.7",
"@deepseek-ai/dsh-atomic-write": "0.1.0-rc.7",
"@deepseek-ai/dsh-bash-local": "0.1.0-rc.7",
"@deepseek-ai/dsh-code-runtime": "0.1.0-rc.7",
"@deepseek-ai/dsh-compaction": "0.1.0-rc.7",
"@deepseek-ai/dsh-fs": "0.1.0-rc.7",
"@deepseek-ai/dsh-invariants": "0.1.0-rc.7",
"@deepseek-ai/dsh-output-retention": "0.1.0-rc.7",
"@deepseek-ai/dsh-sandbox": "0.1.0-rc.7",
"@deepseek-ai/dsh-scope": "0.1.0-rc.7",
"@deepseek-ai/dsh-session-telemetry": "0.1.0-rc.7",
"@deepseek-ai/dsh-session-title-llm": "0.1.0-rc.7",
"@deepseek-ai/dsh-shell": "0.1.0-rc.7",
"@deepseek-ai/dsh-spill": "0.1.0-rc.7",
"@deepseek-ai/dsh-subagent-in-process-driver": "0.1.0-rc.7",
"@deepseek-ai/dsh-subprocess": "0.1.0-rc.7",
"@deepseek-ai/dsh-timeout": "0.1.0-rc.7",
"@deepseek-ai/dsh-workflow": "0.1.0-rc.7",
"dsh-desktop-market-installer": "file:packages/dsh-desktop-market-installer",
"electron-updater": "^6.8.9",
"node": "24.9.0",
Expand Down
2 changes: 1 addition & 1 deletion packages/dsh-desktop-market-installer/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
"license": "MIT",
"peerDependencies": {
"@deepseek-ai/cordis": "^4.0.1",
"@deepseek-ai/dsh-host-webserver": "^0.1.0-rc.6"
"@deepseek-ai/dsh-host-webserver": "^0.1.0-rc.7"
},
"dependencies": {
"pnpm": "10.34.5"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
diff --git a/node_modules/@deepseek-ai/dsh-client-ui-agent-preset/lib/client.js b/node_modules/@deepseek-ai/dsh-client-ui-agent-preset/lib/client.js
index 9f92ac8..69a0970 100644
index 259765c..ca9dd68 100644
--- a/node_modules/@deepseek-ai/dsh-client-ui-agent-preset/lib/client.js
+++ b/node_modules/@deepseek-ai/dsh-client-ui-agent-preset/lib/client.js
@@ -64,7 +64,30 @@ window.__ModuleLoader__.load({
Expand Down Expand Up @@ -75,10 +75,14 @@ index 9f92ac8..69a0970 100644
const tagId$1 = "@deepseek-ai/dsh-client-ui-agent-preset/AgentPresetSeat.module.css";
if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$1) + "]") === null) {
const tag = document.createElement("style");
@@ -349,6 +395,17 @@ window.__ModuleLoader__.load({
"seat-icon-in": "cubgiG_seat-icon-in",
"item": "cubgiG_item",
"seat-char-in": "cubgiG_seat-char-in",
@@ -346,6 +392,21 @@ window.__ModuleLoader__.load({
"seatIcon": "cubgiG_seatIcon",
"introChar": "cubgiG_introChar",
"chevron": "cubgiG_chevron",
+ "seat": "cubgiG_seat",
+ "seat-icon-in": "cubgiG_seat-icon-in",
+ "item": "cubgiG_item",
+ "seat-char-in": "cubgiG_seat-char-in",
+ "picker": "cubgiG_picker",
+ "searchShell": "cubgiG_searchShell",
+ "searchIcon": "cubgiG_searchIcon",
Expand All @@ -90,10 +94,10 @@ index 9f92ac8..69a0970 100644
+ "awesomeIcon": "cubgiG_awesomeIcon",
+ "awesomeText": "cubgiG_awesomeText",
+ "awesomeArrow": "cubgiG_awesomeArrow",
"itemName": "cubgiG_itemName",
"introIcon": "cubgiG_introIcon",
"itemDesc": "cubgiG_itemDesc",
"seatIcon": "cubgiG_seatIcon",
@@ -374,6 +431,8 @@ window.__ModuleLoader__.load({
@@ -374,6 +435,8 @@ window.__ModuleLoader__.load({
const INTRO_CHAR_STAGGER_MS = 40;
const INTRO_TEXT_REVEAL_MS = 200;
const INTRO_CHAR_FADE_MS = 400;
Expand All @@ -102,7 +106,7 @@ index 9f92ac8..69a0970 100644
/**
* Per-character start offset for the introduce reveal.
* @param count - character count of the shown preset name.
@@ -391,6 +450,15 @@ window.__ModuleLoader__.load({
@@ -391,6 +454,15 @@ window.__ModuleLoader__.load({
function AgentPresetSeat({ load, select, introduced, useAgentPresetSeat, t }) {
const state = useAgentPresetSeat((snapshot) => snapshot);
const [open, setOpen] = (0, react.useState)(false);
Expand All @@ -118,7 +122,7 @@ index 9f92ac8..69a0970 100644
(0, react.useEffect)(() => {
load();
}, [load]);
@@ -430,34 +498,114 @@ window.__ModuleLoader__.load({
@@ -430,34 +502,114 @@ window.__ModuleLoader__.load({
children: character
}, index))
}) : label;
Expand Down Expand Up @@ -249,7 +253,7 @@ index 9f92ac8..69a0970 100644
anchor: (0, react_jsx_runtime.jsxs)("button", {
type: "button",
className: AgentPresetSeat_module_css_default.seat,
@@ -707,6 +855,8 @@ window.__ModuleLoader__.load({
@@ -707,6 +859,8 @@ window.__ModuleLoader__.load({
rows: [],
copy: null,
view: null,
Expand All @@ -258,7 +262,7 @@ index 9f92ac8..69a0970 100644
pendingDelete: null,
deleting: false,
revealedPaths: {}
@@ -724,6 +874,13 @@ window.__ModuleLoader__.load({
@@ -724,6 +878,13 @@ window.__ModuleLoader__.load({
if (!PRESET_ID.test(draft.id)) return "idInvalid";
if (rows.some((row) => row.id === draft.id)) return "idTaken";
}
Expand All @@ -272,7 +276,7 @@ index 9f92ac8..69a0970 100644
/** Reads the roster and drives the copy dialog, viewer, and location reveals. */
var AgentPresetSectionController = class {
api;
@@ -911,6 +1068,143 @@ window.__ModuleLoader__.load({
@@ -911,6 +1072,143 @@ window.__ModuleLoader__.load({
this.set({ error: messageOf(error) });
}
}
Expand Down Expand Up @@ -416,7 +420,7 @@ index 9f92ac8..69a0970 100644
/**
* Ask for confirmation before deleting one preset.
* @param id - the preset to delete, or null to dismiss the confirmation.
@@ -974,17 +1268,24 @@ window.__ModuleLoader__.load({
@@ -974,16 +1272,25 @@ window.__ModuleLoader__.load({
};
//#endregion
//#region \0dsh-css:/home/runner/work/deepseek-harness/deepseek-harness/packages/client/ui-agent-preset/src/client/AgentPresetSection.module.css.mjs
Expand All @@ -432,18 +436,19 @@ index 9f92ac8..69a0970 100644
document.head.appendChild(tag);
}
var AgentPresetSection_module_css_default = {
"cardMain": "rtSEdW_cardMain",
+ "cardMain": "rtSEdW_cardMain",
+ "sectionHead": "rtSEdW_sectionHead",
+ "sectionActions": "rtSEdW_sectionActions",
+ "importButton": "rtSEdW_importButton",
+ "hiddenInput": "rtSEdW_hiddenInput",
+ "importSecurity": "rtSEdW_importSecurity",
+ "importSummary": "rtSEdW_importSummary",
+ "importWarnings": "rtSEdW_importWarnings",
"field": "rtSEdW_field",
"cardDesc": "rtSEdW_cardDesc",
"dialog": "rtSEdW_dialog",
@@ -1104,6 +1405,84 @@ window.__ModuleLoader__.load({
+ "field": "rtSEdW_field",
"brokenBadge": "rtSEdW_brokenBadge",
"inUse": "rtSEdW_inUse",
"cards": "rtSEdW_cards",
@@ -1104,6 +1411,84 @@ window.__ModuleLoader__.load({
})
});
}
Expand Down Expand Up @@ -528,15 +533,15 @@ index 9f92ac8..69a0970 100644
/**
* Render one card's description, clamped by CSS and offered in full on hover.
* The tooltip is attached only while the text is actually cut off, so a short
@@ -1151,6 +1530,7 @@ window.__ModuleLoader__.load({
@@ -1151,6 +1536,7 @@ window.__ModuleLoader__.load({
function AgentPresetSection(props) {
const { useAgentPresetSection, t, load } = props;
const state = useAgentPresetSection((snapshot) => snapshot);
+ const importInput = (0, react.useRef)(null);
const viewedId = state.view?.id;
const viewedRow = viewedId === void 0 ? void 0 : state.rows.find((row) => row.id === viewedId);
const viewedTitle = state.view === null ? "" : viewedRow === void 0 ? state.view.title : presetDisplayText(viewedRow, t).name;
@@ -1191,9 +1571,40 @@ window.__ModuleLoader__.load({
@@ -1191,9 +1577,40 @@ window.__ModuleLoader__.load({
return (0, react_jsx_runtime.jsxs)("div", {
className: AgentPresetSection_module_css_default.section,
children: [
Expand Down Expand Up @@ -580,7 +585,7 @@ index 9f92ac8..69a0970 100644
}),
(0, react_jsx_runtime.jsx)("p", {
className: AgentPresetSection_module_css_default.intro,
@@ -1289,7 +1700,7 @@ window.__ModuleLoader__.load({
@@ -1289,7 +1706,7 @@ window.__ModuleLoader__.load({
},
children: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconFolderOpenOutline16, {})
}),
Expand All @@ -589,7 +594,7 @@ index 9f92ac8..69a0970 100644
type: "button",
className: AgentPresetSection_module_css_default.iconButton,
disabled: !state.authorable || row.broken !== void 0,
@@ -1298,9 +1709,20 @@ window.__ModuleLoader__.load({
@@ -1298,9 +1715,20 @@ window.__ModuleLoader__.load({
onClick: () => {
props.beginCopy(row.id);
},
Expand All @@ -613,7 +618,7 @@ index 9f92ac8..69a0970 100644
type: "button",
className: `${AgentPresetSection_module_css_default.iconButton} ${AgentPresetSection_module_css_default.iconDanger}`,
"data-tip": t("delete"),
@@ -1329,13 +1751,22 @@ window.__ModuleLoader__.load({
@@ -1329,13 +1757,22 @@ window.__ModuleLoader__.load({
(0, react_jsx_runtime.jsx)(CopyDialog, {
state,
t,
Expand All @@ -639,7 +644,7 @@ index 9f92ac8..69a0970 100644
(0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Modal, {
open: state.view !== null,
onClose: () => {
@@ -1689,6 +2120,15 @@ window.__ModuleLoader__.load({
@@ -1689,6 +2126,15 @@ window.__ModuleLoader__.load({
},
confirmCopy: () => section.confirmCopy(),
openLocation: (id) => section.openLocation(id),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
diff --git a/node_modules/@deepseek-ai/dsh-client-ui-conversation/lib/client.js b/node_modules/@deepseek-ai/dsh-client-ui-conversation/lib/client.js
index 86e7906..7cd6351 100644
index 1dd0e89..dd1c233 100644
--- a/node_modules/@deepseek-ai/dsh-client-ui-conversation/lib/client.js
+++ b/node_modules/@deepseek-ai/dsh-client-ui-conversation/lib/client.js
@@ -5194,6 +5194,15 @@ window.__ModuleLoader__.load({
"dsh-turn-status-shimmer": "Md3f7G_dsh-turn-status-shimmer",
"openError": "Md3f7G_openError"
@@ -5233,6 +5233,15 @@ window.__ModuleLoader__.load({
"toBottom": "Md3f7G_toBottom",
"scroll": "Md3f7G_scroll"
};
+ const queryRailCss = ".dshQueryRail_root{z-index:7;width:46px;pointer-events:none;position:fixed}.dshQueryRail_scroller{width:40px;height:100%;padding:8px 2px;overflow-x:hidden;overflow-y:auto;overscroll-behavior-y:contain;scrollbar-width:none;flex-direction:column;align-items:flex-start;gap:2px;display:flex;position:relative}.dshQueryRail_scroller::-webkit-scrollbar{width:0;height:0;display:none}.dshQueryRail_item{width:34px;height:12px;min-height:12px;cursor:pointer;background:transparent;border:0;outline:none;flex:none;padding:0;position:relative}.dshQueryRail_item:before{content:\"\";width:10px;height:1px;background:var(--dsw-alias-label-dimmed);border-radius:2px;transition:width .14s ease,background-color .14s ease,opacity .14s ease;display:block}.dshQueryRail_item:hover:before,.dshQueryRail_item:focus-visible:before{width:20px;background:var(--dsw-alias-label-secondary)}.dshQueryRail_itemActive:before{width:28px;height:2px;background:var(--dsw-alias-label-primary)}.dshQueryRail_tooltip{width:276px;max-width:min(276px,calc(100vw - 64px));color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-module-platform);border:1px solid var(--dsw-alias-border-l2);box-shadow:var(--dsw-shadow-lv2);pointer-events:none;border-radius:12px;padding:10px 12px;position:absolute;left:42px}.dshQueryRail_tooltipLabel{color:var(--dsw-alias-label-caption);text-transform:uppercase;letter-spacing:.06em;margin-bottom:4px;font-size:11px;line-height:16px}.dshQueryRail_tooltipText{-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden;font-size:13px;line-height:19px;display:-webkit-box}@media(max-width:980px){.dshQueryRail_root{display:none}}@media(prefers-reduced-motion:reduce){.dshQueryRail_item:before{transition:none}}";
+ const queryRailTagId = "@deepseek-ai/dsh-client-ui-conversation/QueryRail.css";
Expand All @@ -18,7 +18,7 @@ index 86e7906..7cd6351 100644
//#endregion
//#region lib/types/client/chat/ChatNodeSeat.js
/** Subscribe and dispatch one stable Context key without observing sibling Nodes. */
@@ -5250,6 +5259,21 @@ window.__ModuleLoader__.load({
@@ -5289,6 +5298,21 @@ window.__ModuleLoader__.load({
for (const row of list.querySelectorAll("[data-chat-anchor-key]")) if (row.dataset.chatAnchorKey === key) return row;
return null;
}
Expand All @@ -40,7 +40,7 @@ index 86e7906..7cd6351 100644
/** Row position in scrollport coordinates (viewport-independent). */
function flowTop(row, scrollport) {
return row.getBoundingClientRect().top - scrollport.getBoundingClientRect().top;
@@ -5325,6 +5349,106 @@ window.__ModuleLoader__.load({
@@ -5364,6 +5388,106 @@ window.__ModuleLoader__.load({
})]
});
}
Expand Down Expand Up @@ -147,7 +147,7 @@ index 86e7906..7cd6351 100644
/**
* The chat view slot entry: pure component over the composed props; each
* ordered business Node crosses the keyed renderer seat.
@@ -5342,11 +5466,25 @@ window.__ModuleLoader__.load({
@@ -5381,11 +5505,25 @@ window.__ModuleLoader__.load({
const loadingOlder = useSession((s) => s.loadingOlder);
const selectedCallId = useStore((s) => s.selection?.callId);
const pendingSteering = (0, react.useMemo)(() => inbox.filter((item) => item.placement === "steering"), [inbox]);
Expand All @@ -173,7 +173,7 @@ index 86e7906..7cd6351 100644
/** Last position delivered or written on the main thread. */
const observedTopRef = (0, react.useRef)(0);
/** Paging anchor: semantic row/position at click, updated by reader scrolls
@@ -5366,6 +5504,12 @@ window.__ModuleLoader__.load({
@@ -5405,6 +5543,12 @@ window.__ModuleLoader__.load({
const lastNode = lastKey === null ? void 0 : nodeStore.get(lastKey);
const lastSteeringId = pendingSteering[pendingSteering.length - 1]?.id ?? null;
const followSig = `${openState}:${firstSeq}:${lastKey}:${order.length}:${running ? 1 : 0}:${lastSteeringId ?? ""}`;
Expand All @@ -186,7 +186,7 @@ index 86e7906..7cd6351 100644
const toBottom = (el) => {
anchorRef.current = null;
el.scrollTop = el.scrollHeight;
@@ -5373,6 +5517,8 @@ window.__ModuleLoader__.load({
@@ -5412,6 +5556,8 @@ window.__ModuleLoader__.load({
atBottomRef.current = true;
setAtBottom(true);
chatScroll.save(null);
Expand All @@ -195,15 +195,15 @@ index 86e7906..7cd6351 100644
};
(0, react.useLayoutEffect)(() => {
const local = listRef.current;
@@ -5429,6 +5575,7 @@ window.__ModuleLoader__.load({
@@ -5468,6 +5614,7 @@ window.__ModuleLoader__.load({
/* v8 ignore next -- ref-null guard: the handler only fires while mounted. */
if (local === null) return;
const el = scrollerOf(local);
+ syncActiveQuery(local, el);
const floor = Math.max(0, el.scrollHeight - el.clientHeight);
const movedByReader = Math.abs(el.scrollTop - Math.min(observedTopRef.current, floor)) > .5;
const isAtBottom = movedByReader ? floor - el.scrollTop <= 25 : atBottomRef.current;
@@ -5448,6 +5595,10 @@ window.__ModuleLoader__.load({
@@ -5487,6 +5634,10 @@ window.__ModuleLoader__.load({
else if (position !== null) chatScroll.save(position);
observedTopRef.current = el.scrollTop;
};
Expand All @@ -214,7 +214,7 @@ index 86e7906..7cd6351 100644
(0, react.useEffect)(() => {
const local = listRef.current;
/* v8 ignore next -- ref-null guard: effect runs after the list node commits. */
@@ -5501,9 +5652,29 @@ window.__ModuleLoader__.load({
@@ -5540,9 +5691,29 @@ window.__ModuleLoader__.load({
}
loadOlder();
};
Expand Down Expand Up @@ -245,7 +245,7 @@ index 86e7906..7cd6351 100644
ref: listRef,
className: ChatView_module_css_default.scroll,
children: [(0, react_jsx_runtime.jsxs)("div", {
@@ -5568,7 +5739,7 @@ window.__ModuleLoader__.load({
@@ -5607,7 +5778,7 @@ window.__ModuleLoader__.load({
children: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconChevronDownOutline14, {})
})
})]
Expand Down
Loading
Loading