@michengai/dsh-codex-ui 1.1.14 → 1.1.15
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/CHANGELOG.md +41 -0
- package/CHANGELOG.zh-CN.md +41 -0
- package/lib/client.js +260 -170
- package/lib/session-title-plugin.mjs +2 -0
- package/package.json +1 -11
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,47 @@
|
|
|
4
4
|
|
|
5
5
|
This changelog records recent releases of DSH Codex UI and its one-click installer. Earlier changes remain available in the [Git history](https://github.com/MichengAI/dsh-codex-ui/commits/main).
|
|
6
6
|
|
|
7
|
+
## 1.1.15 - 2026-09-22
|
|
8
|
+
|
|
9
|
+
- Cap project session lists at 5 items like Codex Desktop. Show more reveals 10 more at a time, and collapsing the folder restores the 5-item window.
|
|
10
|
+
- Paint only the hovered session's after-line when the next insert anchor is folded.
|
|
11
|
+
|
|
12
|
+
## suite-installer-v1.0.18 - 2026-09-19
|
|
13
|
+
|
|
14
|
+
Install or maintain 11 first-party plugins in one step. Included plugins and versions:
|
|
15
|
+
|
|
16
|
+
- `@michengai/dsh-archive-manager@0.1.44`
|
|
17
|
+
- `@michengai/dsh-codex-ui@1.1.14`
|
|
18
|
+
- `@michengai/dsh-skills-manager@0.1.53`
|
|
19
|
+
- `@michengai/dsh-agency-agents@0.1.44`
|
|
20
|
+
- `@michengai/dsh-im-connect@0.1.51`
|
|
21
|
+
- `@michengai/dsh-automation@0.1.45`
|
|
22
|
+
- `@michengai/dsh-btw@0.1.10`
|
|
23
|
+
- `@michengai/dsh-simplify@0.1.7`
|
|
24
|
+
- `@michengai/dsh-pua@0.3.16`
|
|
25
|
+
- `@michengai/dsh-code-review@0.1.4`
|
|
26
|
+
- `@michengai/dsh-codex-pet@0.1.7`
|
|
27
|
+
|
|
28
|
+
The installer uses these exact versions for reproducible installation.
|
|
29
|
+
|
|
30
|
+
## suite-installer-v1.0.17 - 2026-09-19
|
|
31
|
+
|
|
32
|
+
Install or maintain 11 first-party plugins in one step. Included plugins and versions:
|
|
33
|
+
|
|
34
|
+
- `@michengai/dsh-archive-manager@0.1.44`
|
|
35
|
+
- `@michengai/dsh-codex-ui@1.1.13`
|
|
36
|
+
- `@michengai/dsh-skills-manager@0.1.53`
|
|
37
|
+
- `@michengai/dsh-agency-agents@0.1.44`
|
|
38
|
+
- `@michengai/dsh-im-connect@0.1.51`
|
|
39
|
+
- `@michengai/dsh-automation@0.1.45`
|
|
40
|
+
- `@michengai/dsh-btw@0.1.10`
|
|
41
|
+
- `@michengai/dsh-simplify@0.1.7`
|
|
42
|
+
- `@michengai/dsh-pua@0.3.16`
|
|
43
|
+
- `@michengai/dsh-code-review@0.1.4`
|
|
44
|
+
- `@michengai/dsh-codex-pet@0.1.7`
|
|
45
|
+
|
|
46
|
+
The installer uses these exact versions for reproducible installation.
|
|
47
|
+
|
|
7
48
|
## 1.1.14 - 2026-09-19
|
|
8
49
|
|
|
9
50
|
- Keep official header actions beside the session title and conversation tabs on the right. Long titles stay on one 34px row instead of wrapping the corner slot down.
|
package/CHANGELOG.zh-CN.md
CHANGED
|
@@ -4,6 +4,47 @@
|
|
|
4
4
|
|
|
5
5
|
本日志记录 DSH Codex UI 及其一键安装器的最近发布;更早的变更可查看 [Git 提交历史](https://github.com/MichengAI/dsh-codex-ui/commits/main)。
|
|
6
6
|
|
|
7
|
+
## 1.1.15 - 2026-09-22
|
|
8
|
+
|
|
9
|
+
- 项目会话列表对齐 Codex:默认显示 5 条,「展开显示」每次再加 10 条;折叠文件夹后回到前 5 条。
|
|
10
|
+
- 下一会话被折起时,拖放蓝线只画在悬停行下方。
|
|
11
|
+
|
|
12
|
+
## suite-installer-v1.0.18 - 2026-09-19
|
|
13
|
+
|
|
14
|
+
一键维护安装 11 个自研插件。包含以下插件及版本:
|
|
15
|
+
|
|
16
|
+
- `@michengai/dsh-archive-manager@0.1.44`
|
|
17
|
+
- `@michengai/dsh-codex-ui@1.1.14`
|
|
18
|
+
- `@michengai/dsh-skills-manager@0.1.53`
|
|
19
|
+
- `@michengai/dsh-agency-agents@0.1.44`
|
|
20
|
+
- `@michengai/dsh-im-connect@0.1.51`
|
|
21
|
+
- `@michengai/dsh-automation@0.1.45`
|
|
22
|
+
- `@michengai/dsh-btw@0.1.10`
|
|
23
|
+
- `@michengai/dsh-simplify@0.1.7`
|
|
24
|
+
- `@michengai/dsh-pua@0.3.16`
|
|
25
|
+
- `@michengai/dsh-code-review@0.1.4`
|
|
26
|
+
- `@michengai/dsh-codex-pet@0.1.7`
|
|
27
|
+
|
|
28
|
+
安装器使用这些精确版本执行安装,确保可复现。
|
|
29
|
+
|
|
30
|
+
## suite-installer-v1.0.17 - 2026-09-19
|
|
31
|
+
|
|
32
|
+
一键维护安装 11 个自研插件。包含以下插件及版本:
|
|
33
|
+
|
|
34
|
+
- `@michengai/dsh-archive-manager@0.1.44`
|
|
35
|
+
- `@michengai/dsh-codex-ui@1.1.13`
|
|
36
|
+
- `@michengai/dsh-skills-manager@0.1.53`
|
|
37
|
+
- `@michengai/dsh-agency-agents@0.1.44`
|
|
38
|
+
- `@michengai/dsh-im-connect@0.1.51`
|
|
39
|
+
- `@michengai/dsh-automation@0.1.45`
|
|
40
|
+
- `@michengai/dsh-btw@0.1.10`
|
|
41
|
+
- `@michengai/dsh-simplify@0.1.7`
|
|
42
|
+
- `@michengai/dsh-pua@0.3.16`
|
|
43
|
+
- `@michengai/dsh-code-review@0.1.4`
|
|
44
|
+
- `@michengai/dsh-codex-pet@0.1.7`
|
|
45
|
+
|
|
46
|
+
安装器使用这些精确版本执行安装,确保可复现。
|
|
47
|
+
|
|
7
48
|
## 1.1.14 - 2026-09-19
|
|
8
49
|
|
|
9
50
|
- 紧凑顶栏:标准模式 / Agent Team 贴在标题旁,对话 / 轨迹靠右。长标题单行截断,不再把右栏掉到第二行。
|
package/lib/client.js
CHANGED
|
@@ -2709,6 +2709,57 @@ header [data-dcu-title-folder] svg,header [data-dcu-title-more] svg{display:bloc
|
|
|
2709
2709
|
if (isChannelSession(session.id)) return false;
|
|
2710
2710
|
return !isScheduleSession(session.id, session.displayTitle ?? session.title ?? "");
|
|
2711
2711
|
}
|
|
2712
|
+
/**
|
|
2713
|
+
* 对齐本机 Codex 26.915.4065.0 的项目会话列表。
|
|
2714
|
+
* 未展开时显示 5 条;展开后每次再加 10 条。按钮文案保持「展开显示」,全部露出后消失。
|
|
2715
|
+
* 当前会话落在窗口外时追加到末尾。
|
|
2716
|
+
*/
|
|
2717
|
+
function projectSessionWindow(ids, state, forcedId) {
|
|
2718
|
+
const page = state.page < 1 ? 1 : state.page;
|
|
2719
|
+
const limit = state.expanded ? 5 + 10 * page : 5;
|
|
2720
|
+
const head = ids.slice(0, limit);
|
|
2721
|
+
const visible = forcedId !== void 0 && ids.includes(forcedId) && !head.includes(forcedId) ? [...head, forcedId] : head;
|
|
2722
|
+
return {
|
|
2723
|
+
ids: visible,
|
|
2724
|
+
showMore: visible.length < ids.length
|
|
2725
|
+
};
|
|
2726
|
+
}
|
|
2727
|
+
/**
|
|
2728
|
+
* 折叠项目文件夹时清掉「展开显示」。
|
|
2729
|
+
* 安装包 i$n:文件夹从展开变为折叠时,对 `project:${id}` 调用 sE(..., false)。
|
|
2730
|
+
*/
|
|
2731
|
+
function collapseProjectSessionWindow() {
|
|
2732
|
+
return {
|
|
2733
|
+
expanded: false,
|
|
2734
|
+
page: 1
|
|
2735
|
+
};
|
|
2736
|
+
}
|
|
2737
|
+
/** 第一次展开把页码设为 1(可见 15 条),之后每点一次页码加 1。 */
|
|
2738
|
+
function nextProjectSessionWindow(state) {
|
|
2739
|
+
const current = state ?? {
|
|
2740
|
+
expanded: false,
|
|
2741
|
+
page: 1
|
|
2742
|
+
};
|
|
2743
|
+
if (!current.expanded) return {
|
|
2744
|
+
expanded: true,
|
|
2745
|
+
page: 1
|
|
2746
|
+
};
|
|
2747
|
+
return {
|
|
2748
|
+
expanded: true,
|
|
2749
|
+
page: current.page + 1
|
|
2750
|
+
};
|
|
2751
|
+
}
|
|
2752
|
+
/**
|
|
2753
|
+
* 会话行蓝线的落点:只在被悬停的那一行下方,且仅当它后面那条会话被折起或不存在。
|
|
2754
|
+
* 下一行仍可见时交给它自己的 before 线,避免两条平行蓝线。
|
|
2755
|
+
*/
|
|
2756
|
+
function sessionDropAfterRowId(drop, renderedIds) {
|
|
2757
|
+
const hoveredId = drop?.hoveredId;
|
|
2758
|
+
if (hoveredId === void 0 || !renderedIds.includes(hoveredId)) return void 0;
|
|
2759
|
+
const beforeId = drop?.beforeId;
|
|
2760
|
+
if (beforeId !== void 0 && renderedIds.includes(beforeId)) return void 0;
|
|
2761
|
+
return hoveredId;
|
|
2762
|
+
}
|
|
2712
2763
|
/** 过滤不应出现在工作区树中的会话。 */
|
|
2713
2764
|
function visibleSessionIds(ids, byId, archivedIds) {
|
|
2714
2765
|
const archived = new Set(archivedIds);
|
|
@@ -3376,6 +3427,9 @@ header [data-dcu-title-folder] svg,header [data-dcu-title-more] svg{display:bloc
|
|
|
3376
3427
|
.dcu-wb-collection-body>.dcu-wb-empty{padding:8px 8px 8px 26px}
|
|
3377
3428
|
.dcu-wb-collection-body>.dcu-wb-empty,.dcu-wb-nochat{font-size:13px;line-height:18px;color:var(--dcu-sidebar-tertiary)}
|
|
3378
3429
|
.dcu-wb-nochat{padding:1px 8px 5px 30px}
|
|
3430
|
+
.dcu-wb-session-more{display:flex;gap:4px;padding:2px 8px 2px 30px}
|
|
3431
|
+
.dcu-wb-session-more button{height:28px;border:0;border-radius:8px;padding:0 8px;background:transparent;color:var(--dcu-sidebar-tertiary);font:13px/20px var(--dcu-font,var(--dsw-font-family));cursor:pointer}
|
|
3432
|
+
.dcu-wb-session-more button:hover{color:var(--dcu-sidebar-secondary)}
|
|
3379
3433
|
.dcu-wb-collection:has(+.dcu-wb-collection)>.dcu-wb-collection-body>.dcu-wb-empty,.dcu-wb-collection:has(+.dcu-wb-ungrouped)>.dcu-wb-collection-body>.dcu-wb-empty{padding-top:14px;padding-bottom:2px}
|
|
3380
3434
|
.dcu-wb-collection-body::before,.dcu-wb-group-member::after{display:none}
|
|
3381
3435
|
.dcu-wb-collections{gap:12px}
|
|
@@ -3420,6 +3474,13 @@ header [data-dcu-title-folder] svg,header [data-dcu-title-more] svg{display:bloc
|
|
|
3420
3474
|
const workspaces = useWorkspaces((state) => state);
|
|
3421
3475
|
const baselinesReady = workspaceBaselinesReady(workspaces, sessions);
|
|
3422
3476
|
const [expanded, setExpanded] = (0, react.useState)(() => readTreeExpansionState(storage$1(), WORKSPACE_EXPANSION_STORAGE_KEY));
|
|
3477
|
+
const [sessionWindows, setSessionWindows] = (0, react.useState)({});
|
|
3478
|
+
const revealMoreSessions = (workspaceId) => {
|
|
3479
|
+
setSessionWindows((current) => ({
|
|
3480
|
+
...current,
|
|
3481
|
+
[workspaceId]: nextProjectSessionWindow(current[workspaceId])
|
|
3482
|
+
}));
|
|
3483
|
+
};
|
|
3423
3484
|
const [pinnedWorkspaceIds, setPinnedWorkspaceIdsState] = (0, react.useState)(() => readPinnedWorkspaceIds(storage$1()));
|
|
3424
3485
|
const initialWorkspaceGroups = (0, react.useMemo)(() => readWorkspaceGroupsCache(storage$1()), []);
|
|
3425
3486
|
const [workspaceGroups, setWorkspaceGroupsState] = (0, react.useState)(() => initialWorkspaceGroups.workspaceGroups);
|
|
@@ -3777,6 +3838,13 @@ header [data-dcu-title-folder] svg,header [data-dcu-title-more] svg{display:bloc
|
|
|
3777
3838
|
[key]: !(current[key] ?? defaultOpen)
|
|
3778
3839
|
}));
|
|
3779
3840
|
};
|
|
3841
|
+
const toggleProject = (expandKey, id) => {
|
|
3842
|
+
if (expanded[expandKey] ?? true) setSessionWindows((current) => ({
|
|
3843
|
+
...current,
|
|
3844
|
+
[id]: collapseProjectSessionWindow()
|
|
3845
|
+
}));
|
|
3846
|
+
toggleGroup(expandKey, true);
|
|
3847
|
+
};
|
|
3780
3848
|
const submitCreateGroup = () => {
|
|
3781
3849
|
if (groupTitleDraft.trim() === "") return;
|
|
3782
3850
|
try {
|
|
@@ -3981,6 +4049,12 @@ header [data-dcu-title-folder] svg,header [data-dcu-title-more] svg{display:bloc
|
|
|
3981
4049
|
} : void 0;
|
|
3982
4050
|
const isPinnedHeaderDrop = zone === "pinned" && pinnedHeaderDrop?.kind === "workspace" && pinnedHeaderDrop.workspaceId === String(workspace.workspaceId);
|
|
3983
4051
|
const workspaceId = String(workspace.workspaceId);
|
|
4052
|
+
const sessionWindow = projectSessionWindow(shownIds, sessionWindows[workspaceId] ?? {
|
|
4053
|
+
expanded: false,
|
|
4054
|
+
page: 1
|
|
4055
|
+
}, currentSessionId !== void 0 && shownIds.includes(currentSessionId) ? currentSessionId : void 0);
|
|
4056
|
+
const renderedIds = sessionWindow.ids;
|
|
4057
|
+
const dropAfterSessionId = sessionDropTarget?.workspaceId === workspaceId && sessionDropTarget.ontoProject !== true ? sessionDropAfterRowId(sessionDropTarget, renderedIds) : void 0;
|
|
3984
4058
|
const zoneIds = zone === "pinned" ? pinnedGroupIds : regularGroupIds;
|
|
3985
4059
|
const dropsBefore = workspaceDropTarget?.zone === zone && workspaceDropTarget.beforeId === workspaceId;
|
|
3986
4060
|
const dropsAfterLast = zone === "projects" && workspaceDropTarget?.zone === zone && workspaceDropTarget.beforeId === void 0 && zoneIds[zoneIds.length - 1] === workspaceId;
|
|
@@ -4078,7 +4152,7 @@ header [data-dcu-title-folder] svg,header [data-dcu-title-more] svg{display:bloc
|
|
|
4078
4152
|
setWorkspaceGroupDropTarget(void 0);
|
|
4079
4153
|
},
|
|
4080
4154
|
onClick: () => {
|
|
4081
|
-
|
|
4155
|
+
toggleProject(expandKey, workspaceId);
|
|
4082
4156
|
},
|
|
4083
4157
|
onContextMenu: (event) => {
|
|
4084
4158
|
event.preventDefault();
|
|
@@ -4109,7 +4183,7 @@ header [data-dcu-title-folder] svg,header [data-dcu-title-more] svg{display:bloc
|
|
|
4109
4183
|
onKeyDown: (event) => {
|
|
4110
4184
|
if (event.key === "Enter" || event.key === " ") {
|
|
4111
4185
|
event.preventDefault();
|
|
4112
|
-
|
|
4186
|
+
toggleProject(expandKey, workspaceId);
|
|
4113
4187
|
}
|
|
4114
4188
|
},
|
|
4115
4189
|
children: [
|
|
@@ -4188,180 +4262,194 @@ header [data-dcu-title-folder] svg,header [data-dcu-title-more] svg{display:bloc
|
|
|
4188
4262
|
}), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(DisclosureBody, {
|
|
4189
4263
|
className: "dcu-wb-project-body",
|
|
4190
4264
|
open: isExpanded,
|
|
4191
|
-
children: [
|
|
4192
|
-
|
|
4193
|
-
|
|
4194
|
-
|
|
4195
|
-
|
|
4196
|
-
|
|
4197
|
-
|
|
4198
|
-
|
|
4199
|
-
|
|
4200
|
-
|
|
4201
|
-
|
|
4202
|
-
|
|
4203
|
-
|
|
4204
|
-
|
|
4205
|
-
|
|
4206
|
-
|
|
4207
|
-
|
|
4208
|
-
"
|
|
4209
|
-
|
|
4210
|
-
|
|
4211
|
-
|
|
4212
|
-
|
|
4213
|
-
|
|
4214
|
-
event
|
|
4215
|
-
|
|
4216
|
-
|
|
4217
|
-
|
|
4218
|
-
|
|
4219
|
-
|
|
4220
|
-
|
|
4221
|
-
|
|
4222
|
-
|
|
4223
|
-
|
|
4224
|
-
|
|
4225
|
-
|
|
4226
|
-
|
|
4227
|
-
|
|
4228
|
-
|
|
4229
|
-
|
|
4230
|
-
|
|
4231
|
-
|
|
4232
|
-
|
|
4233
|
-
|
|
4234
|
-
|
|
4235
|
-
|
|
4236
|
-
|
|
4237
|
-
|
|
4238
|
-
|
|
4239
|
-
|
|
4240
|
-
|
|
4241
|
-
|
|
4242
|
-
|
|
4243
|
-
|
|
4244
|
-
|
|
4245
|
-
|
|
4246
|
-
|
|
4247
|
-
|
|
4248
|
-
|
|
4249
|
-
|
|
4250
|
-
|
|
4251
|
-
|
|
4252
|
-
|
|
4253
|
-
|
|
4254
|
-
|
|
4255
|
-
|
|
4256
|
-
|
|
4257
|
-
|
|
4258
|
-
|
|
4259
|
-
|
|
4260
|
-
|
|
4261
|
-
|
|
4262
|
-
|
|
4263
|
-
|
|
4264
|
-
|
|
4265
|
-
event
|
|
4266
|
-
|
|
4267
|
-
|
|
4268
|
-
|
|
4269
|
-
|
|
4270
|
-
|
|
4271
|
-
|
|
4272
|
-
|
|
4273
|
-
|
|
4274
|
-
|
|
4275
|
-
|
|
4276
|
-
|
|
4277
|
-
|
|
4278
|
-
|
|
4279
|
-
|
|
4280
|
-
|
|
4281
|
-
|
|
4282
|
-
|
|
4283
|
-
|
|
4284
|
-
|
|
4285
|
-
|
|
4286
|
-
|
|
4287
|
-
|
|
4288
|
-
|
|
4289
|
-
|
|
4290
|
-
|
|
4291
|
-
|
|
4292
|
-
|
|
4293
|
-
|
|
4294
|
-
|
|
4295
|
-
|
|
4296
|
-
|
|
4297
|
-
|
|
4298
|
-
|
|
4299
|
-
|
|
4300
|
-
|
|
4301
|
-
|
|
4302
|
-
|
|
4303
|
-
|
|
4304
|
-
"aria-label": t("sessions.archive"),
|
|
4305
|
-
onClick: (event) => {
|
|
4306
|
-
event.stopPropagation();
|
|
4307
|
-
run("archive", () => archiveSession(id));
|
|
4308
|
-
},
|
|
4309
|
-
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(QuickArchiveIcon, {})
|
|
4310
|
-
})
|
|
4311
|
-
}),
|
|
4312
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
4313
|
-
className: "dcu-wb-actions",
|
|
4314
|
-
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Menu, {
|
|
4315
|
-
open: sessionMenuOpen,
|
|
4316
|
-
onClose: () => {
|
|
4317
|
-
setMenu(void 0);
|
|
4318
|
-
},
|
|
4319
|
-
items: sessionMenu(id, path),
|
|
4320
|
-
onSelect: (action) => {
|
|
4321
|
-
if (busy !== void 0 || runSessionMoveAction(action, id)) return;
|
|
4322
|
-
if (action === "rename") beginRename("session", id, session.displayTitle);
|
|
4323
|
-
if (action === "unread") {
|
|
4324
|
-
setUnreadSessionIds((ids) => toggleSessionId(ids, id));
|
|
4325
|
-
setMenu(void 0);
|
|
4326
|
-
}
|
|
4327
|
-
if (action === "archive") run("archive", () => archiveSession(id));
|
|
4328
|
-
if (action === "delete") {
|
|
4329
|
-
setDeleteTarget({
|
|
4330
|
-
id,
|
|
4331
|
-
kind: "session",
|
|
4332
|
-
title: session.displayTitle
|
|
4333
|
-
});
|
|
4334
|
-
setError(void 0);
|
|
4335
|
-
setMenu(void 0);
|
|
4336
|
-
}
|
|
4337
|
-
if (action === "fork") run("fork", () => forkSession(id));
|
|
4338
|
-
if (action === "openPath" && path !== void 0) openPathImmediately(path);
|
|
4339
|
-
if (action === "copyPath") copy(path);
|
|
4340
|
-
if (action === "copyTitle") copy(session.displayTitle);
|
|
4341
|
-
if (action === "copyId") copy(id);
|
|
4342
|
-
},
|
|
4343
|
-
portal: true,
|
|
4344
|
-
dense: true,
|
|
4345
|
-
compact: true,
|
|
4346
|
-
getAnchorRect: sessionMenuAt === void 0 ? void 0 : () => pointerMenuRect(sessionMenuAt.x, sessionMenuAt.y),
|
|
4347
|
-
anchor: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
4265
|
+
children: [
|
|
4266
|
+
shownIds.length === 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
4267
|
+
className: "dcu-wb-nochat",
|
|
4268
|
+
children: t("workspace.noChat")
|
|
4269
|
+
}),
|
|
4270
|
+
renderedIds.map((id) => {
|
|
4271
|
+
const session = sessions.byId[id];
|
|
4272
|
+
if (session === void 0) return null;
|
|
4273
|
+
const pendingInteraction = pendingInteractionForSession(id, pendingInteractions, legacyPendingInteraction(session));
|
|
4274
|
+
const path = session.cwd ?? workspace.path;
|
|
4275
|
+
const selected = selectedId === id;
|
|
4276
|
+
const sessionMenuOpen = menu?.type === "session" && menu.id === id;
|
|
4277
|
+
const sessionMenuAt = sessionMenuOpen && menu.x !== void 0 && menu.y !== void 0 ? {
|
|
4278
|
+
x: menu.x,
|
|
4279
|
+
y: menu.y
|
|
4280
|
+
} : void 0;
|
|
4281
|
+
const dropsBeforeSession = sessionDropTarget?.workspaceId === workspaceId && sessionDropTarget.ontoProject !== true && sessionDropTarget.beforeId === id;
|
|
4282
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
4283
|
+
"data-dcu-session": id,
|
|
4284
|
+
className: `dcu-wb-session${selected ? " dcu-wb-selected" : ""}${sessionMenuOpen ? " dcu-wb-menu-open" : ""}${dropsBeforeSession ? " dcu-wb-drop" : ""}${dropAfterSessionId !== void 0 && id === dropAfterSessionId ? " dcu-wb-drop dcu-wb-drop-after" : ""}`,
|
|
4285
|
+
role: "treeitem",
|
|
4286
|
+
"aria-selected": selected,
|
|
4287
|
+
draggable: true,
|
|
4288
|
+
onDragStart: (event) => {
|
|
4289
|
+
event.stopPropagation();
|
|
4290
|
+
setWorkspaceDragId(void 0);
|
|
4291
|
+
setWorkspaceDropTarget(void 0);
|
|
4292
|
+
setWorkspaceGroupDragId(void 0);
|
|
4293
|
+
setWorkspaceGroupDropTarget(void 0);
|
|
4294
|
+
writeSessionDrag(event.dataTransfer, id, session.displayTitle);
|
|
4295
|
+
setDragPreview(event.dataTransfer, session.displayTitle);
|
|
4296
|
+
setSessionDrag({
|
|
4297
|
+
sessionId: id,
|
|
4298
|
+
workspaceId
|
|
4299
|
+
});
|
|
4300
|
+
},
|
|
4301
|
+
onDragEnd: () => {
|
|
4302
|
+
setSessionDrag(void 0);
|
|
4303
|
+
setSessionDropTarget(void 0);
|
|
4304
|
+
setWorkspaceGroupDropTarget(void 0);
|
|
4305
|
+
},
|
|
4306
|
+
onDragOver: (event) => {
|
|
4307
|
+
const drag = sessionDrag;
|
|
4308
|
+
if (drag === void 0 || drag.workspaceId !== workspaceId) return;
|
|
4309
|
+
event.preventDefault();
|
|
4310
|
+
event.stopPropagation();
|
|
4311
|
+
event.dataTransfer.dropEffect = "move";
|
|
4312
|
+
const rect = event.currentTarget.getBoundingClientRect();
|
|
4313
|
+
const beforeId = reorderDropBeforeId(shownIds, drag.sessionId, id, event.clientY > rect.top + rect.height / 2);
|
|
4314
|
+
setSessionDropTarget(beforeId === null ? void 0 : {
|
|
4315
|
+
workspaceId,
|
|
4316
|
+
beforeId,
|
|
4317
|
+
hoveredId: id
|
|
4318
|
+
});
|
|
4319
|
+
},
|
|
4320
|
+
onDragLeave: (event) => {
|
|
4321
|
+
if (event.currentTarget.contains(event.relatedTarget)) return;
|
|
4322
|
+
setSessionDropTarget(void 0);
|
|
4323
|
+
},
|
|
4324
|
+
onDrop: (event) => {
|
|
4325
|
+
const drag = sessionDrag;
|
|
4326
|
+
if (drag === void 0 || drag.workspaceId !== workspaceId) return;
|
|
4327
|
+
event.preventDefault();
|
|
4328
|
+
event.stopPropagation();
|
|
4329
|
+
const rect = event.currentTarget.getBoundingClientRect();
|
|
4330
|
+
setSessionDrag(void 0);
|
|
4331
|
+
setSessionDropTarget(void 0);
|
|
4332
|
+
const beforeId = reorderDropBeforeId(shownIds, drag.sessionId, id, event.clientY > rect.top + rect.height / 2);
|
|
4333
|
+
if (beforeId !== null) run("session-order", () => insertSessionBefore(workspace.workspaceId, drag.sessionId, beforeId));
|
|
4334
|
+
},
|
|
4335
|
+
onClick: () => {
|
|
4336
|
+
setUnreadSessionIds((ids) => ids.filter((item) => item !== id));
|
|
4337
|
+
openSession(id);
|
|
4338
|
+
},
|
|
4339
|
+
onContextMenu: (event) => {
|
|
4340
|
+
event.preventDefault();
|
|
4341
|
+
event.stopPropagation();
|
|
4342
|
+
dismissTip();
|
|
4343
|
+
setMenu({
|
|
4344
|
+
id,
|
|
4345
|
+
type: "session",
|
|
4346
|
+
x: event.clientX,
|
|
4347
|
+
y: event.clientY
|
|
4348
|
+
});
|
|
4349
|
+
},
|
|
4350
|
+
onMouseEnter: (event) => {
|
|
4351
|
+
const box = hoverCardAnchor(event.currentTarget.getBoundingClientRect());
|
|
4352
|
+
const branch = optionalText(session, "branch");
|
|
4353
|
+
showTip({
|
|
4354
|
+
kind: "session",
|
|
4355
|
+
id,
|
|
4356
|
+
title: session.displayTitle,
|
|
4357
|
+
project: workspace.title,
|
|
4358
|
+
path,
|
|
4359
|
+
branch,
|
|
4360
|
+
time: formatHoverTime(session.updatedAt, t, now),
|
|
4361
|
+
left: box.left,
|
|
4362
|
+
top: box.top
|
|
4363
|
+
});
|
|
4364
|
+
},
|
|
4365
|
+
onMouseLeave: hideTip,
|
|
4366
|
+
children: [
|
|
4367
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(SessionRowTitle, { title: session.displayTitle }),
|
|
4368
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(SessionState, {
|
|
4369
|
+
pendingInteraction,
|
|
4370
|
+
unread: rowUnread(id),
|
|
4371
|
+
running: rowRunning(id, session),
|
|
4372
|
+
t
|
|
4373
|
+
}),
|
|
4374
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(SessionTime, { time: formatCompactTime(session.updatedAt, t, now) }),
|
|
4375
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
4376
|
+
className: "dcu-wb-quick-actions",
|
|
4377
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
4348
4378
|
type: "button",
|
|
4349
|
-
className: "dcu-wb-more
|
|
4350
|
-
"aria-label": t("sessions.
|
|
4379
|
+
className: "dcu-wb-more",
|
|
4380
|
+
"aria-label": t("sessions.archive"),
|
|
4351
4381
|
onClick: (event) => {
|
|
4352
4382
|
event.stopPropagation();
|
|
4353
|
-
|
|
4354
|
-
id,
|
|
4355
|
-
type: "session"
|
|
4356
|
-
});
|
|
4383
|
+
run("archive", () => archiveSession(id));
|
|
4357
4384
|
},
|
|
4358
|
-
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
4385
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(QuickArchiveIcon, {})
|
|
4386
|
+
})
|
|
4387
|
+
}),
|
|
4388
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
4389
|
+
className: "dcu-wb-actions",
|
|
4390
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Menu, {
|
|
4391
|
+
open: sessionMenuOpen,
|
|
4392
|
+
onClose: () => {
|
|
4393
|
+
setMenu(void 0);
|
|
4394
|
+
},
|
|
4395
|
+
items: sessionMenu(id, path),
|
|
4396
|
+
onSelect: (action) => {
|
|
4397
|
+
if (busy !== void 0 || runSessionMoveAction(action, id)) return;
|
|
4398
|
+
if (action === "rename") beginRename("session", id, session.displayTitle);
|
|
4399
|
+
if (action === "unread") {
|
|
4400
|
+
setUnreadSessionIds((ids) => toggleSessionId(ids, id));
|
|
4401
|
+
setMenu(void 0);
|
|
4402
|
+
}
|
|
4403
|
+
if (action === "archive") run("archive", () => archiveSession(id));
|
|
4404
|
+
if (action === "delete") {
|
|
4405
|
+
setDeleteTarget({
|
|
4406
|
+
id,
|
|
4407
|
+
kind: "session",
|
|
4408
|
+
title: session.displayTitle
|
|
4409
|
+
});
|
|
4410
|
+
setError(void 0);
|
|
4411
|
+
setMenu(void 0);
|
|
4412
|
+
}
|
|
4413
|
+
if (action === "fork") run("fork", () => forkSession(id));
|
|
4414
|
+
if (action === "openPath" && path !== void 0) openPathImmediately(path);
|
|
4415
|
+
if (action === "copyPath") copy(path);
|
|
4416
|
+
if (action === "copyTitle") copy(session.displayTitle);
|
|
4417
|
+
if (action === "copyId") copy(id);
|
|
4418
|
+
},
|
|
4419
|
+
portal: true,
|
|
4420
|
+
dense: true,
|
|
4421
|
+
compact: true,
|
|
4422
|
+
getAnchorRect: sessionMenuAt === void 0 ? void 0 : () => pointerMenuRect(sessionMenuAt.x, sessionMenuAt.y),
|
|
4423
|
+
anchor: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
4424
|
+
type: "button",
|
|
4425
|
+
className: "dcu-wb-more dcu-wb-context-anchor",
|
|
4426
|
+
"aria-label": t("sessions.actions", { name: session.displayTitle }),
|
|
4427
|
+
onClick: (event) => {
|
|
4428
|
+
event.stopPropagation();
|
|
4429
|
+
setMenu((current) => current?.id === id && current?.type === "session" ? void 0 : {
|
|
4430
|
+
id,
|
|
4431
|
+
type: "session"
|
|
4432
|
+
});
|
|
4433
|
+
},
|
|
4434
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconEllipsisOutline16, { size: 16 })
|
|
4435
|
+
})
|
|
4359
4436
|
})
|
|
4360
4437
|
})
|
|
4361
|
-
|
|
4362
|
-
|
|
4363
|
-
},
|
|
4364
|
-
|
|
4438
|
+
]
|
|
4439
|
+
}, id);
|
|
4440
|
+
}),
|
|
4441
|
+
sessionWindow.showMore && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
4442
|
+
className: "dcu-wb-session-more",
|
|
4443
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
4444
|
+
type: "button",
|
|
4445
|
+
onClick: (event) => {
|
|
4446
|
+
event.stopPropagation();
|
|
4447
|
+
revealMoreSessions(workspaceId);
|
|
4448
|
+
},
|
|
4449
|
+
children: t("workspace.showMore")
|
|
4450
|
+
})
|
|
4451
|
+
})
|
|
4452
|
+
]
|
|
4365
4453
|
})]
|
|
4366
4454
|
}, workspace.workspaceId);
|
|
4367
4455
|
};
|
|
@@ -8505,6 +8593,7 @@ html[data-dcu-official-turn-navigator-supported=true] .dcu-turn-navigator,html:h
|
|
|
8505
8593
|
"workspace.recent": "最近",
|
|
8506
8594
|
"workspace.recentEmpty": "无聊天",
|
|
8507
8595
|
"workspace.noChat": "暂无聊天",
|
|
8596
|
+
"workspace.showMore": "展开显示",
|
|
8508
8597
|
"workspace.empty": "暂无项目",
|
|
8509
8598
|
"workspace.newSession": "新建会话",
|
|
8510
8599
|
"workspace.rename": "重命名项目",
|
|
@@ -8793,6 +8882,7 @@ html[data-dcu-official-turn-navigator-supported=true] .dcu-turn-navigator,html:h
|
|
|
8793
8882
|
"workspace.recent": "Recents",
|
|
8794
8883
|
"workspace.recentEmpty": "No chats",
|
|
8795
8884
|
"workspace.noChat": "No chats",
|
|
8885
|
+
"workspace.showMore": "Show more",
|
|
8796
8886
|
"workspace.empty": "No projects",
|
|
8797
8887
|
"workspace.newSession": "New conversation",
|
|
8798
8888
|
"workspace.rename": "Rename project",
|
|
@@ -120,6 +120,7 @@ const zh = {
|
|
|
120
120
|
"workspace.recent": "最近",
|
|
121
121
|
"workspace.recentEmpty": "无聊天",
|
|
122
122
|
"workspace.noChat": "暂无聊天",
|
|
123
|
+
"workspace.showMore": "展开显示",
|
|
123
124
|
"workspace.empty": "暂无项目",
|
|
124
125
|
"workspace.newSession": "新建会话",
|
|
125
126
|
"workspace.rename": "重命名项目",
|
|
@@ -408,6 +409,7 @@ const en = {
|
|
|
408
409
|
"workspace.recent": "Recents",
|
|
409
410
|
"workspace.recentEmpty": "No chats",
|
|
410
411
|
"workspace.noChat": "No chats",
|
|
412
|
+
"workspace.showMore": "Show more",
|
|
411
413
|
"workspace.empty": "No projects",
|
|
412
414
|
"workspace.newSession": "New conversation",
|
|
413
415
|
"workspace.rename": "Rename project",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@michengai/dsh-codex-ui",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.15",
|
|
4
4
|
"description": "DSH Codex UI — 为 DeepSeek Harness Web 提供 Codex 风格侧栏、工作区会话树、全局搜索和轮次导航 · A Codex-style sidebar, workspace session tree, global search, and turn navigation for DSH Web",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"publishConfig": {
|
|
@@ -87,19 +87,9 @@
|
|
|
87
87
|
"@deepseek-ai/dsh-client-ui-sidebar": ">=0.1.0-rc.5 <0.2.0 || 0.1.5-rc.1 || 0.1.5-rc.2 || 0.1.6-alpha.1 || 0.1.6-alpha.2",
|
|
88
88
|
"@deepseek-ai/dsh-client-ui-slots": ">=0.1.0-rc.5 <0.2.0 || 0.1.5-rc.1 || 0.1.5-rc.2 || 0.1.6-alpha.1 || 0.1.6-alpha.2",
|
|
89
89
|
"@deepseek-ai/dsh-client-ui-workspace": ">=0.1.0-rc.5 <0.2.0 || 0.1.5-rc.1 || 0.1.5-rc.2 || 0.1.6-alpha.1 || 0.1.6-alpha.2",
|
|
90
|
-
"@michengai/dsh-agency-agents": ">=0.1.3 <0.2.0",
|
|
91
|
-
"@michengai/dsh-skills-manager": ">=0.1.7 <0.2.0",
|
|
92
90
|
"react": "^18.2.0",
|
|
93
91
|
"react-dom": "^18.2.0"
|
|
94
92
|
},
|
|
95
|
-
"peerDependenciesMeta": {
|
|
96
|
-
"@michengai/dsh-agency-agents": {
|
|
97
|
-
"optional": true
|
|
98
|
-
},
|
|
99
|
-
"@michengai/dsh-skills-manager": {
|
|
100
|
-
"optional": true
|
|
101
|
-
}
|
|
102
|
-
},
|
|
103
93
|
"devDependencies": {
|
|
104
94
|
"@deepseek-ai/cordis": "4.0.2",
|
|
105
95
|
"@deepseek-ai/dsh-api-session-controller": "0.1.6-alpha.2",
|