@michengai/dsh-codex-ui 0.2.100 → 0.2.101
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 +17 -0
- package/CHANGELOG.zh-CN.md +17 -0
- package/dist/client.js +20 -8
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,23 @@
|
|
|
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
|
+
## 0.2.101 — 2026-09-01
|
|
8
|
+
|
|
9
|
+
Companion release: `@michengai/dsh-codex-suite-installer@0.1.18`.
|
|
10
|
+
|
|
11
|
+
### Fixed
|
|
12
|
+
|
|
13
|
+
- Restored the host pending-interaction store as a fallback for workspace, channel, and scheduled-task trees when `SessionSummary.pendingInteraction` is absent, so approvals, questions, and plan reviews remain visible in Web and Desktop sidebars.
|
|
14
|
+
- Kept valid `SessionSummary.pendingInteraction` values authoritative while preserving a stable empty-store fallback for older hosts that do not inject the hook.
|
|
15
|
+
|
|
16
|
+
### Tests
|
|
17
|
+
|
|
18
|
+
- Added DOM integration coverage for all three trees using the real pending-interaction store path, alongside the existing `SessionSummary` snapshot coverage.
|
|
19
|
+
|
|
20
|
+
### Dependencies
|
|
21
|
+
|
|
22
|
+
- The Suite Installer release workflow will resolve Codex UI `0.2.101` after this release is published.
|
|
23
|
+
|
|
7
24
|
## 0.2.100 — 2026-09-01
|
|
8
25
|
|
|
9
26
|
Companion release: `@michengai/dsh-codex-suite-installer@0.1.17`.
|
package/CHANGELOG.zh-CN.md
CHANGED
|
@@ -4,6 +4,23 @@
|
|
|
4
4
|
|
|
5
5
|
本日志记录 DSH Codex UI 及其一键安装器的最近发布;更早的变更可查看 [Git 提交历史](https://github.com/MichengAI/dsh-codex-ui/commits/main)。
|
|
6
6
|
|
|
7
|
+
## 0.2.101 — 2026-09-01
|
|
8
|
+
|
|
9
|
+
配套版本:`@michengai/dsh-codex-suite-installer@0.1.18`。
|
|
10
|
+
|
|
11
|
+
### 修复
|
|
12
|
+
|
|
13
|
+
- 当 `SessionSummary.pendingInteraction` 缺失时,任务、频道和定时任务树恢复回退读取宿主待处理交互 Store,确保 Web 与 Desktop 侧栏继续显示等待审批、等待回答和计划待审状态。
|
|
14
|
+
- 有效的 `SessionSummary.pendingInteraction` 仍保持最高优先级;旧宿主未注入 Hook 时使用稳定空 Store 安全降级。
|
|
15
|
+
|
|
16
|
+
### 测试
|
|
17
|
+
|
|
18
|
+
- 在原有 `SessionSummary` 快照覆盖之外,为三棵树补充真实待处理交互 Store 路径的 DOM 集成测试。
|
|
19
|
+
|
|
20
|
+
### 依赖
|
|
21
|
+
|
|
22
|
+
- Suite Installer 发布 workflow 会在本版本发布后解析 Codex UI `0.2.101`。
|
|
23
|
+
|
|
7
24
|
## 0.2.100 — 2026-09-01
|
|
8
25
|
|
|
9
26
|
配套版本:`@michengai/dsh-codex-suite-installer@0.1.17`。
|
package/dist/client.js
CHANGED
|
@@ -655,6 +655,10 @@ window.__ModuleLoader__.load({
|
|
|
655
655
|
}
|
|
656
656
|
//#endregion
|
|
657
657
|
//#region src/client/session-pending.ts
|
|
658
|
+
const EMPTY_PENDING_INTERACTIONS = /* @__PURE__ */ new Map();
|
|
659
|
+
function useEmptySessionPendingInteraction(selector) {
|
|
660
|
+
return selector(EMPTY_PENDING_INTERACTIONS);
|
|
661
|
+
}
|
|
658
662
|
function visiblePendingKind(kind) {
|
|
659
663
|
switch (kind) {
|
|
660
664
|
case "approval":
|
|
@@ -663,6 +667,9 @@ window.__ModuleLoader__.load({
|
|
|
663
667
|
default: return;
|
|
664
668
|
}
|
|
665
669
|
}
|
|
670
|
+
function pendingInteractionForSession(sessionId, pendingInteractions, summaryKind) {
|
|
671
|
+
return visiblePendingKind(summaryKind) ?? visiblePendingKind(pendingInteractions.get(sessionId)?.kind);
|
|
672
|
+
}
|
|
666
673
|
//#endregion
|
|
667
674
|
//#region src/client/pinned-workspaces.ts
|
|
668
675
|
/** 浏览器本地持久化键;置顶只影响本插件中的工作区分区。 */
|
|
@@ -1436,8 +1443,9 @@ header [data-dcu-title-folder] svg,header [data-dcu-title-more] svg{display:bloc
|
|
|
1436
1443
|
function CodexWorkspaceBrowser(props) {
|
|
1437
1444
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(HoverShell, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(CodexWorkspaceTree, { ...props }) });
|
|
1438
1445
|
}
|
|
1439
|
-
function CodexWorkspaceTree({ wide, useSessions, useWorkspaces, t, archiveSession, deleteSession, deleteWorkspace, forkSession, insertSessionBefore, insertWorkspaceBefore, openPath, openSession, renameSession, renameWorkspace, startSession }) {
|
|
1446
|
+
function CodexWorkspaceTree({ wide, useSessions, useSessionPendingInteraction, useWorkspaces, t, archiveSession, deleteSession, deleteWorkspace, forkSession, insertSessionBefore, insertWorkspaceBefore, openPath, openSession, renameSession, renameWorkspace, startSession }) {
|
|
1440
1447
|
const sessions = useSessions((state) => state);
|
|
1448
|
+
const pendingInteractions = (useSessionPendingInteraction ?? useEmptySessionPendingInteraction)((state) => state);
|
|
1441
1449
|
const workspaces = useWorkspaces((state) => state);
|
|
1442
1450
|
const [expanded, setExpanded] = (0, react.useState)(() => readTreeExpansionState(storage$1(), WORKSPACE_EXPANSION_STORAGE_KEY));
|
|
1443
1451
|
const [pinnedWorkspaceIds, setPinnedWorkspaceIdsState] = (0, react.useState)(() => readPinnedWorkspaceIds(storage$1()));
|
|
@@ -1949,7 +1957,7 @@ header [data-dcu-title-folder] svg,header [data-dcu-title-more] svg{display:bloc
|
|
|
1949
1957
|
isExpanded && shownIds.map((id) => {
|
|
1950
1958
|
const session = sessions.byId[id];
|
|
1951
1959
|
if (session === void 0) return null;
|
|
1952
|
-
const pendingInteraction =
|
|
1960
|
+
const pendingInteraction = pendingInteractionForSession(id, pendingInteractions, session.pendingInteraction);
|
|
1953
1961
|
const path = session.cwd ?? workspace.path;
|
|
1954
1962
|
const selected = sessions.current === id;
|
|
1955
1963
|
const sessionMenuOpen = menu?.type === "session" && menu.id === id;
|
|
@@ -2362,7 +2370,7 @@ header [data-dcu-title-folder] svg,header [data-dcu-title-more] svg{display:bloc
|
|
|
2362
2370
|
const title = session.displayTitle;
|
|
2363
2371
|
const pinned = pinnedSessionIds.includes(id);
|
|
2364
2372
|
const unread = unreadSessionIds.includes(id);
|
|
2365
|
-
const pendingInteraction =
|
|
2373
|
+
const pendingInteraction = pendingInteractionForSession(id, pendingInteractions, session.pendingInteraction);
|
|
2366
2374
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(SessionRow, {
|
|
2367
2375
|
id,
|
|
2368
2376
|
title,
|
|
@@ -2869,8 +2877,9 @@ header [data-dcu-title-folder] svg,header [data-dcu-title-more] svg{display:bloc
|
|
|
2869
2877
|
})
|
|
2870
2878
|
});
|
|
2871
2879
|
}
|
|
2872
|
-
function ChannelBrowserTree({ openSession, archiveSession, deleteSession, forkSession, renameSession, useSessions, t, menu, setMenu }) {
|
|
2880
|
+
function ChannelBrowserTree({ openSession, archiveSession, deleteSession, forkSession, renameSession, useSessions, useSessionPendingInteraction, t, menu, setMenu }) {
|
|
2873
2881
|
const sessions = useSessions((state) => state);
|
|
2882
|
+
const pendingInteractions = (useSessionPendingInteraction ?? useEmptySessionPendingInteraction)((state) => state);
|
|
2874
2883
|
const [groups, setGroups] = (0, react.useState)([]);
|
|
2875
2884
|
const [pollError, setPollError] = (0, react.useState)();
|
|
2876
2885
|
const [expanded, setExpanded] = (0, react.useState)(() => readTreeExpansionState(browserStorage(), CHANNEL_EXPANSION_STORAGE_KEY));
|
|
@@ -2968,7 +2977,7 @@ header [data-dcu-title-folder] svg,header [data-dcu-title-more] svg{display:bloc
|
|
|
2968
2977
|
const updatedAt = session.updatedAt ?? sessions.byId[id]?.updatedAt;
|
|
2969
2978
|
const pinned = flags.pinnedSessionIds.includes(id);
|
|
2970
2979
|
const unread = flags.unreadSessionIds.includes(id);
|
|
2971
|
-
const pendingInteraction =
|
|
2980
|
+
const pendingInteraction = pendingInteractionForSession(id, pendingInteractions, sessions.byId[id]?.pendingInteraction);
|
|
2972
2981
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(SessionRow, {
|
|
2973
2982
|
id,
|
|
2974
2983
|
title,
|
|
@@ -3125,8 +3134,9 @@ header [data-dcu-title-folder] svg,header [data-dcu-title-more] svg{display:bloc
|
|
|
3125
3134
|
})]
|
|
3126
3135
|
});
|
|
3127
3136
|
}
|
|
3128
|
-
function ScheduleBrowserTree({ openSession, archiveSession, deleteSession, forkSession, renameSession, useSessions, useWorkspaces, t, openTaskSettings, menu, setMenu }) {
|
|
3137
|
+
function ScheduleBrowserTree({ openSession, archiveSession, deleteSession, forkSession, renameSession, useSessions, useSessionPendingInteraction, useWorkspaces, t, openTaskSettings, menu, setMenu }) {
|
|
3129
3138
|
const sessions = useSessions((state) => state);
|
|
3139
|
+
const pendingInteractions = (useSessionPendingInteraction ?? useEmptySessionPendingInteraction)((state) => state);
|
|
3130
3140
|
const workspaces = useWorkspaces((state) => state);
|
|
3131
3141
|
const [expanded, setExpanded] = (0, react.useState)(() => readTreeExpansionState(browserStorage(), SCHEDULE_EXPANSION_STORAGE_KEY));
|
|
3132
3142
|
const [groupMenu, setGroupMenu] = (0, react.useState)();
|
|
@@ -3259,7 +3269,7 @@ header [data-dcu-title-folder] svg,header [data-dcu-title-more] svg{display:bloc
|
|
|
3259
3269
|
const title = session.title;
|
|
3260
3270
|
const pinned = flags.pinnedSessionIds.includes(id);
|
|
3261
3271
|
const unread = flags.unreadSessionIds.includes(id);
|
|
3262
|
-
const pendingInteraction =
|
|
3272
|
+
const pendingInteraction = pendingInteractionForSession(id, pendingInteractions, sessions.byId[id]?.pendingInteraction);
|
|
3263
3273
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(SessionRow, {
|
|
3264
3274
|
id,
|
|
3265
3275
|
title,
|
|
@@ -3873,7 +3883,7 @@ html[data-dcu-official-turn-navigator-supported=true] .dcu-turn-navigator,html:h
|
|
|
3873
3883
|
});
|
|
3874
3884
|
});
|
|
3875
3885
|
/** Codex 风格的 DSH 侧栏,只替换导航外观,项目浏览和设置仍由 DSH 官方组件提供。 */
|
|
3876
|
-
function CodexSidebar({ collapsed, width, openSession, startSession, toggleSidebar, archiveSession, deleteSession, forkSession, renameSession, openPath, companionSlots, renderSlot, t, useSessions, useWorkspaces }) {
|
|
3886
|
+
function CodexSidebar({ collapsed, width, openSession, startSession, toggleSidebar, archiveSession, deleteSession, forkSession, renameSession, openPath, companionSlots, renderSlot, t, useSessions, useSessionPendingInteraction, useWorkspaces }) {
|
|
3877
3887
|
const compact = collapsed || width < 80;
|
|
3878
3888
|
const [visualCompact, setVisualCompact] = (0, react.useState)(compact);
|
|
3879
3889
|
const [collapsing, setCollapsing] = (0, react.useState)(false);
|
|
@@ -4157,6 +4167,7 @@ html[data-dcu-official-turn-navigator-supported=true] .dcu-turn-navigator,html:h
|
|
|
4157
4167
|
forkSession,
|
|
4158
4168
|
renameSession,
|
|
4159
4169
|
useSessions,
|
|
4170
|
+
useSessionPendingInteraction,
|
|
4160
4171
|
t
|
|
4161
4172
|
})
|
|
4162
4173
|
}) : imTab === "schedule" && showSchedule ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
@@ -4168,6 +4179,7 @@ html[data-dcu-official-turn-navigator-supported=true] .dcu-turn-navigator,html:h
|
|
|
4168
4179
|
forkSession,
|
|
4169
4180
|
renameSession,
|
|
4170
4181
|
useSessions,
|
|
4182
|
+
useSessionPendingInteraction,
|
|
4171
4183
|
useWorkspaces,
|
|
4172
4184
|
t,
|
|
4173
4185
|
overviewContent: scheduleOverviewSlot,
|