@michengai/dsh-codex-ui 1.1.2 → 1.1.4

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 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.4 - 2026-09-14
8
+
9
+ - Manage companion plugins in Settings → About, with PUA, Code Review, and Codex Pet included in a consistent order.
10
+ - Show total npm downloads beside each plugin name using a compact icon and text.
11
+
12
+ ## suite-installer-v1.0.5 - 2026-09-12
13
+
14
+ Resolved and pinned the following member versions from the official npm registry:
15
+
16
+ - `@michengai/dsh-archive-manager@0.1.39`
17
+ - `@michengai/dsh-codex-ui@1.1.3`
18
+ - `@michengai/dsh-skills-manager@0.1.48`
19
+ - `@michengai/dsh-agency-agents@0.1.41`
20
+ - `@michengai/dsh-im-connect@0.1.45`
21
+ - `@michengai/dsh-automation@0.1.39`
22
+ - `@michengai/dsh-btw@0.1.6`
23
+ - `@michengai/dsh-simplify@0.1.4`
24
+ - `@michengai/dsh-codex-pet@0.1.5`
25
+
26
+ The installer uses these exact versions for reproducible installation.
27
+
28
+ ## 1.1.3 - 2026-09-12
29
+
30
+ - With Pet 0.1.5 or later, keep the pet visible and accessible by mouse and keyboard on settings pages while other background content remains isolated.
31
+
32
+ ## suite-installer-v1.0.4 - 2026-09-11
33
+
34
+ Resolved and pinned the following member versions from the official npm registry:
35
+
36
+ - `@michengai/dsh-archive-manager@0.1.38`
37
+ - `@michengai/dsh-codex-ui@1.1.2`
38
+ - `@michengai/dsh-skills-manager@0.1.48`
39
+ - `@michengai/dsh-agency-agents@0.1.40`
40
+ - `@michengai/dsh-im-connect@0.1.45`
41
+ - `@michengai/dsh-automation@0.1.38`
42
+ - `@michengai/dsh-btw@0.1.6`
43
+ - `@michengai/dsh-simplify@0.1.4`
44
+ - `@michengai/dsh-codex-pet@0.1.4`
45
+
46
+ The installer uses these exact versions for reproducible installation.
47
+
7
48
  ## 1.1.2 - 2026-09-11
8
49
 
9
50
  - Support attachment drafts and global panels in DSH 0.1.5-rc.1 / rc.2, fix prefill and history recall, and support compact-sidebar navigation and returning to existing conversations. Later release candidates still require separate validation.
@@ -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.4 - 2026-09-14
8
+
9
+ - 在「设置 → 关于」集中管理配套插件,补齐 PUA、Code Review 和 Codex Pet,并统一插件排序。
10
+ - 在插件名称后显示 npm 累计下载量,以紧凑的图标和文字呈现。
11
+
12
+ ## suite-installer-v1.0.5 - 2026-09-12
13
+
14
+ 从官方 npm 解析并锁定以下成员版本:
15
+
16
+ - `@michengai/dsh-archive-manager@0.1.39`
17
+ - `@michengai/dsh-codex-ui@1.1.3`
18
+ - `@michengai/dsh-skills-manager@0.1.48`
19
+ - `@michengai/dsh-agency-agents@0.1.41`
20
+ - `@michengai/dsh-im-connect@0.1.45`
21
+ - `@michengai/dsh-automation@0.1.39`
22
+ - `@michengai/dsh-btw@0.1.6`
23
+ - `@michengai/dsh-simplify@0.1.4`
24
+ - `@michengai/dsh-codex-pet@0.1.5`
25
+
26
+ 安装器使用这些精确版本执行安装,确保可复现。
27
+
28
+ ## 1.1.3 - 2026-09-12
29
+
30
+ - 配合 Pet 0.1.5 或更新版本,进入设置页后宠物仍可显示、点击和通过键盘操作;其他背景内容继续保持隔离。
31
+
32
+ ## suite-installer-v1.0.4 - 2026-09-11
33
+
34
+ 从官方 npm 解析并锁定以下成员版本:
35
+
36
+ - `@michengai/dsh-archive-manager@0.1.38`
37
+ - `@michengai/dsh-codex-ui@1.1.2`
38
+ - `@michengai/dsh-skills-manager@0.1.48`
39
+ - `@michengai/dsh-agency-agents@0.1.40`
40
+ - `@michengai/dsh-im-connect@0.1.45`
41
+ - `@michengai/dsh-automation@0.1.38`
42
+ - `@michengai/dsh-btw@0.1.6`
43
+ - `@michengai/dsh-simplify@0.1.4`
44
+ - `@michengai/dsh-codex-pet@0.1.4`
45
+
46
+ 安装器使用这些精确版本执行安装,确保可复现。
47
+
7
48
  ## 1.1.2 - 2026-09-11
8
49
 
9
50
  - 兼容 DSH 0.1.5-rc.1 / rc.2 的附件草稿与全局面板,修复预填和历史召回,支持紧凑侧栏导航及返回已有会话。后续 RC 仍需单独验证。
package/README.md CHANGED
@@ -53,7 +53,7 @@ Conversation menu: rename, pin, unread, archive, fork, copy, and delete.
53
53
 
54
54
  ![Conversation menu](assets/screenshots/session-menu.png)
55
55
 
56
- **Settings → Codex UI** lists the companion plugins and their install state.
56
+ **Settings → About** lists the companion plugins and their install state.
57
57
 
58
58
  ![About page and companion plugins](assets/screenshots/settings-about.png)
59
59
 
@@ -65,18 +65,21 @@ Conversation menu: rename, pin, unread, archive, fork, copy, and delete.
65
65
 
66
66
  ## DSH product ecosystem
67
67
 
68
- For a ready-to-use workbench, download [DSH Codex Desktop](https://github.com/MichengAI/dsh-codex-desktop/releases). If you already use [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness), install any of these eight plugins individually. The desktop app includes all eight.
68
+ For a desktop workbench, download [DSH Codex Desktop](https://github.com/MichengAI/dsh-codex-desktop/releases). Existing [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) installations can add plugins as needed by following each project's README. Below are 11 first-party plugins; consult the corresponding desktop release notes and bundled catalog for what that version includes.
69
69
 
70
70
  | Plugin | What you can do |
71
71
  | --- | --- |
72
72
  | [Codex UI](https://github.com/MichengAI/dsh-codex-ui) | Organize projects and conversations, search tasks, and navigate chat turns |
73
- | [IM Connect](https://github.com/MichengAI/dsh-im-connect) | Send tasks and receive replies through your usual messenger |
74
- | [Automation](https://github.com/MichengAI/dsh-automation) | Schedule tasks and review each run |
73
+ | [Agency Agents](https://github.com/MichengAI/dsh-agency-agents) | Choose and summon specialists for your task |
75
74
  | [Skills Manager](https://github.com/MichengAI/dsh-skills-manager) | Find, enable, create, and import local skills |
76
75
  | [Archive Manager](https://github.com/MichengAI/dsh-archive-manager) | Search, restore, or clean up archived conversations |
77
- | [Agency Agents](https://github.com/MichengAI/dsh-agency-agents) | Choose and summon specialists for your task |
76
+ | [IM Connect](https://github.com/MichengAI/dsh-im-connect) | Send tasks and receive replies through messaging platforms |
77
+ | [Automation](https://github.com/MichengAI/dsh-automation) | Schedule tasks and review each run |
78
78
  | [BTW](https://github.com/MichengAI/dsh-btw) | Ask side questions without interrupting the main task |
79
- | [Simplify](https://github.com/MichengAI/dsh-simplify) | Use /simplify to improve code within your Git changes |
79
+ | [Simplify](https://github.com/MichengAI/dsh-simplify) | Use `/simplify` to improve code within your Git changes |
80
+ | [PUA](https://github.com/MichengAI/dsh-pua) | Guide the Agent to try new approaches after failures, investigate causes, and verify results before completion |
81
+ | [Code Review](https://github.com/MichengAI/dsh-code-review) | Use `/review` to request an independent Agent code review and receive the report in the current conversation |
82
+ | [Codex Pet](https://github.com/MichengAI/dsh-codex-pet) | View conversation notifications and respond to tool approvals and questions through a desktop pet |
80
83
 
81
84
  ## Installation
82
85
 
package/README.zh-CN.md CHANGED
@@ -53,7 +53,7 @@
53
53
 
54
54
  ![会话菜单](assets/screenshots/session-menu.png)
55
55
 
56
- 「设置 → Codex UI」列出配套插件及其安装状态。
56
+ 「设置 → 关于」列出配套插件及其安装状态。
57
57
 
58
58
  ![关于页与配套插件](assets/screenshots/settings-about.png)
59
59
 
@@ -65,18 +65,21 @@
65
65
 
66
66
  ## DSH 产品生态
67
67
 
68
- 想直接使用完整工作台,可下载 [DSH Codex Desktop](https://github.com/MichengAI/dsh-codex-desktop/releases);已有 [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) 环境,可按需独立安装以下 8 个自研插件。桌面端已随附这些插件。
68
+ 想使用桌面工作台,可下载 [DSH Codex Desktop](https://github.com/MichengAI/dsh-codex-desktop/releases);已有 [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) 环境,可按各项目 README 按需安装。以下列出 11 个自研插件;桌面端实际随附范围以对应版本的发行说明和内置清单为准。
69
69
 
70
70
  | 插件 | 你可以用它做什么 |
71
71
  | --- | --- |
72
72
  | [Codex UI](https://github.com/MichengAI/dsh-codex-ui) | 整理项目与会话、搜索任务、跳转对话轮次 |
73
- | [IM Connect](https://github.com/MichengAI/dsh-im-connect) | 从微信、飞书、钉钉等消息平台下任务、收回复 |
74
- | [Automation](https://github.com/MichengAI/dsh-automation) | 按计划执行任务,查看每次运行的结果 |
73
+ | [Agency Agents](https://github.com/MichengAI/dsh-agency-agents) | 按任务选择并召唤专业角色 |
75
74
  | [Skills Manager](https://github.com/MichengAI/dsh-skills-manager) | 统一查找、启停、创建和导入本机技能 |
76
75
  | [Archive Manager](https://github.com/MichengAI/dsh-archive-manager) | 搜索、恢复或清理已归档会话 |
77
- | [Agency Agents](https://github.com/MichengAI/dsh-agency-agents) | 按任务选择并召唤专业角色 |
76
+ | [IM Connect](https://github.com/MichengAI/dsh-im-connect) | 从消息平台下任务、收回复 |
77
+ | [Automation](https://github.com/MichengAI/dsh-automation) | 按计划执行任务,查看每次运行的结果 |
78
78
  | [BTW](https://github.com/MichengAI/dsh-btw) | 在当前上下文中临时旁问,不打断主任务 |
79
- | [Simplify](https://github.com/MichengAI/dsh-simplify) | 用 /simplify 整理 Git 改动范围内的代码 |
79
+ | [Simplify](https://github.com/MichengAI/dsh-simplify) | 用 `/simplify` 整理 Git 改动范围内的代码 |
80
+ | [PUA](https://github.com/MichengAI/dsh-pua) | 引导 Agent 在失败时换方法、查原因,并在完成前验证结果 |
81
+ | [Code Review](https://github.com/MichengAI/dsh-code-review) | 用 `/review` 发起独立 Agent 代码审查,在当前会话接收报告 |
82
+ | [Codex Pet](https://github.com/MichengAI/dsh-codex-pet) | 通过桌面宠物查看会话提醒、处理工具审批和问题回答 |
80
83
 
81
84
  ## 安装
82
85
 
package/lib/client.js CHANGED
@@ -7286,10 +7286,6 @@ html[data-dcu-official-turn-navigator-supported=true] .dcu-turn-navigator,html:h
7286
7286
  //#endregion
7287
7287
  //#region src/dependencies.ts
7288
7288
  const MANAGED_DEPENDENCIES = [
7289
- {
7290
- id: "dsh",
7291
- packageName: "@deepseek-ai/dsh"
7292
- },
7293
7289
  {
7294
7290
  id: "ui",
7295
7291
  packageName: "@michengai/dsh-codex-ui"
@@ -7314,10 +7310,6 @@ html[data-dcu-official-turn-navigator-supported=true] .dcu-turn-navigator,html:h
7314
7310
  id: "schedule",
7315
7311
  packageName: "@michengai/dsh-automation"
7316
7312
  },
7317
- {
7318
- id: "pet",
7319
- packageName: "@michengai/dsh-codex-pet"
7320
- },
7321
7313
  {
7322
7314
  id: "btw",
7323
7315
  packageName: "@michengai/dsh-btw"
@@ -7326,6 +7318,18 @@ html[data-dcu-official-turn-navigator-supported=true] .dcu-turn-navigator,html:h
7326
7318
  id: "simplify",
7327
7319
  packageName: "@michengai/dsh-simplify"
7328
7320
  },
7321
+ {
7322
+ id: "pua",
7323
+ packageName: "@michengai/dsh-pua"
7324
+ },
7325
+ {
7326
+ id: "review",
7327
+ packageName: "@michengai/dsh-code-review"
7328
+ },
7329
+ {
7330
+ id: "pet",
7331
+ packageName: "@michengai/dsh-codex-pet"
7332
+ },
7329
7333
  {
7330
7334
  id: "market",
7331
7335
  packageName: "dshmarket"
@@ -7344,6 +7348,7 @@ html[data-dcu-official-turn-navigator-supported=true] .dcu-turn-navigator,html:h
7344
7348
  .dcu-about{color:var(--dsw-alias-label-primary)}.dcu-about h2{margin:0;font-size:20px;line-height:28px}.dcu-about-intro{margin:6px 0 22px;color:var(--dsw-alias-label-secondary);font-size:13px;line-height:20px}.dcu-about h3{margin:24px 0 8px;font-size:14px;line-height:20px}.dcu-about-features{margin:0;padding-left:20px;color:var(--dsw-alias-label-secondary);font-size:13px;line-height:24px}.dcu-about-dependencies-heading{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-top:24px}.dcu-about-dependencies-heading h3{margin:0}.dcu-about-dependencies-heading+.dcu-about-intro{margin-bottom:14px}.dcu-about-dependencies{overflow:hidden;border:1px solid var(--dsw-alias-border-l2);border-radius:10px}.dcu-about-dependency{display:flex;align-items:center;gap:12px;min-height:64px;padding:12px;border-bottom:1px solid var(--dsw-alias-border-l2)}.dcu-about-dependency:last-child{border-bottom:0}.dcu-about-copy{min-width:0;flex:1}.dcu-about-name{font-size:13px;line-height:20px;font-weight:600}.dcu-about-package{overflow:hidden;margin-top:2px;color:var(--dsw-alias-label-tertiary);font-size:12px;text-overflow:ellipsis;white-space:nowrap}.dcu-about-status{display:flex;align-items:center;gap:5px;font-size:12px}.dcu-about-status[data-installed=true]{color:var(--dsw-alias-state-success-primary)}.dcu-about-status[data-installed=false]{color:var(--dsw-alias-state-error-primary)}.dcu-about-status[data-update=true]{color:var(--dsw-alias-state-warning-primary)}.dcu-about-install{display:inline-flex;align-items:center;justify-content:center;gap:5px;min-height:32px;border:1px solid var(--dsw-alias-border-l2);border-radius:7px;padding:6px 9px;background:transparent;color:var(--dsw-alias-label-primary);font:inherit;font-size:12px;cursor:pointer}.dcu-about-install:hover:not(:disabled){background:var(--dsw-specific-menu-item-hover)}.dcu-about-install:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:2px}.dcu-about-install:disabled{cursor:wait;opacity:.65}.dcu-about-update-all{min-width:92px}.dcu-about-message{margin:10px 0 0;border-radius:8px;padding:9px 10px;background:color-mix(in srgb,var(--dsw-alias-state-business-primary) 12%,transparent);color:var(--dsw-alias-label-secondary);font-size:12px;line-height:18px}.dcu-about-message[data-error=true]{background:color-mix(in srgb,var(--dsw-alias-state-error-primary) 12%,transparent);color:var(--dsw-alias-state-error-primary)}.dcu-about-progress{display:grid;grid-template-columns:auto 1fr auto;gap:8px 10px;align-items:center;margin-top:10px;border:1px solid var(--dsw-alias-border-l2);border-radius:8px;padding:9px 10px}.dcu-about-progress code{min-width:0;color:var(--dsw-alias-label-secondary);font-size:12px;line-height:18px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dcu-about-progress-pct{color:var(--dsw-alias-label-tertiary);font-size:12px;font-variant-numeric:tabular-nums}.dcu-about-progress-bar{grid-column:1/-1;height:4px;overflow:hidden;border-radius:99px;background:var(--dsw-alias-border-l2)}.dcu-about-progress-fill{height:100%;background:var(--dsw-alias-state-business-primary);transition:width .2s ease}.dcu-about-progress-fill[data-wave=true]{width:28%;animation:dcu-about-progress-wave 1.2s ease-in-out infinite}@keyframes dcu-about-progress-wave{0%{transform:translateX(-60%)}100%{transform:translateX(280%)}}
7345
7349
  .dcu-about-title-row{display:flex;align-items:center;gap:8px;min-width:0}.dcu-about-links{display:flex;align-items:center;gap:4px}.dcu-about-external-link{display:inline-flex;align-items:center;gap:5px;min-height:28px;padding:0 8px;color:var(--dsw-alias-label-secondary);background:transparent;border:1px solid var(--dsw-alias-border-l2);border-radius:7px;font-size:12px;font-weight:500;line-height:18px;text-decoration:none;white-space:nowrap}.dcu-about-external-link:hover{color:var(--dsw-alias-label-primary);background:var(--dsw-alias-interactive-bg-hover)}.dcu-about-external-link:focus-visible{outline:2px solid var(--dsw-alias-state-success-primary);outline-offset:2px}.dcu-about-external-link svg{flex:none}@media(max-width:720px){.dcu-about-title-row{flex-wrap:wrap}}
7346
7350
  .dcu-about-version{margin-left:8px;color:var(--dsw-alias-label-tertiary);font-family:inherit;font-size:12px;font-weight:500;line-height:18px;letter-spacing:0;white-space:nowrap;vertical-align:baseline}
7351
+ .dcu-about-name-row{display:flex;align-items:center;gap:10px;min-width:0}.dcu-about-name-row .dcu-about-name{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dcu-about-downloads{display:inline-flex;align-items:center;gap:4px;flex:none;color:var(--dsw-alias-label-secondary);font-size:11px;line-height:20px;font-weight:400;font-variant-numeric:tabular-nums;text-decoration:none;white-space:nowrap}.dcu-about-downloads svg{flex:none;opacity:.75}.dcu-about-downloads:hover{color:var(--dsw-alias-label-primary)}.dcu-about-downloads:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:3px;border-radius:2px}@media(max-width:480px){.dcu-about-dependency{flex-wrap:wrap;gap:8px}.dcu-about-copy{flex-basis:100%}}
7347
7352
  `;
7348
7353
  /** 宿主图标库不提供 GitHub 品牌标识,内联后可离线使用并继承当前文字颜色。 */
7349
7354
  function GithubMark16() {
@@ -7628,11 +7633,29 @@ html[data-dcu-official-turn-navigator-supported=true] .dcu-turn-navigator,html:h
7628
7633
  children: [
7629
7634
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7630
7635
  className: "dcu-about-copy",
7631
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
7632
- className: "dcu-about-name",
7633
- children: title(dependency.id)
7636
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7637
+ className: "dcu-about-name-row",
7638
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
7639
+ className: "dcu-about-name",
7640
+ children: title(dependency.id)
7641
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("a", {
7642
+ className: "dcu-about-downloads",
7643
+ href: `https://www.npmjs.com/package/${dependency.packageName}`,
7644
+ target: "_blank",
7645
+ rel: "noreferrer",
7646
+ title: t("about.downloadsSource"),
7647
+ "aria-label": `${dependency.packageName} · ${t("about.totalDownloads")} · ${typeof dependency.totalDownloads === "number" && Number.isSafeInteger(dependency.totalDownloads) && dependency.totalDownloads >= 0 ? dependency.totalDownloads.toLocaleString() : t("about.downloadsUnavailable")}`,
7648
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconDownloadOutline16, {
7649
+ size: 12,
7650
+ "aria-hidden": "true"
7651
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
7652
+ className: "dcu-about-downloads-count",
7653
+ children: typeof dependency.totalDownloads === "number" && Number.isSafeInteger(dependency.totalDownloads) && dependency.totalDownloads >= 0 ? dependency.totalDownloads.toLocaleString() : "—"
7654
+ })]
7655
+ })]
7634
7656
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7635
7657
  className: "dcu-about-package",
7658
+ title: dependency.packageName,
7636
7659
  children: [
7637
7660
  dependency.packageName,
7638
7661
  dependency.version === void 0 ? "" : ` · ${dependency.version}`,
@@ -8092,7 +8115,7 @@ html[data-dcu-official-turn-navigator-supported=true] .dcu-turn-navigator,html:h
8092
8115
  "about.feature.conversation": "保留原生消息、工具调用、输入、权限和模型选择,仅调整容器视觉",
8093
8116
  "about.feature.navigator": "当前会话提供轮次缩略导航,可快速跳转至每一次用户提问",
8094
8117
  "about.dependencies": "配套管理插件",
8095
- "about.dependenciesDescription": "每个配套插件都可单独安装和更新,也可一键安装缺失项并更新旧版本。可分别检查 Codex UI、专家、技能、归档、IM、定时任务、宠物、BTW、Simplify 和第三方插件市场。",
8118
+ "about.dependenciesDescription": "每个配套插件都可单独安装和更新,也可一键安装缺失项并更新旧版本。可分别检查 Codex UI、专家、技能、归档、IM、定时任务、BTW、Simplify、PUA、代码审查、宠物和应用市场。",
8096
8119
  "about.loading": "正在读取依赖安装状态…",
8097
8120
  "about.statusFailed": "暂时无法读取依赖安装状态。",
8098
8121
  "about.refreshFailed": "依赖状态刷新失败,当前显示上次成功读取的结果。",
@@ -8135,7 +8158,12 @@ html[data-dcu-official-turn-navigator-supported=true] .dcu-turn-navigator,html:h
8135
8158
  "about.dependency.pet": "Codex 宠物",
8136
8159
  "about.dependency.btw": "BTW 旁问",
8137
8160
  "about.dependency.simplify": "Simplify",
8138
- "about.dependency.market": "插件市场",
8161
+ "about.dependency.pua": "PUA",
8162
+ "about.dependency.review": "代码审查",
8163
+ "about.dependency.market": "应用市场",
8164
+ "about.totalDownloads": "npm 累计下载",
8165
+ "about.downloadsUnavailable": "暂不可用",
8166
+ "about.downloadsSource": "npm 官方统计:自包创建日至昨日的累计下载次数,点击查看 npm 包",
8139
8167
  "turns.label": "当前会话轮次导航",
8140
8168
  "turns.untitled": "未命名提问",
8141
8169
  "turns.jump": "跳转到第 {index} 轮:{summary}",
@@ -8361,7 +8389,7 @@ html[data-dcu-official-turn-navigator-supported=true] .dcu-turn-navigator,html:h
8361
8389
  "about.feature.conversation": "Keeps native messages, tool calls, composer, permissions, and model selection while refining the container visuals",
8362
8390
  "about.feature.navigator": "Navigate directly to each user prompt with the current conversation turn navigator",
8363
8391
  "about.dependencies": "Companion management plugins",
8364
- "about.dependenciesDescription": "Install or update each companion separately, or install missing plugins and update old versions in one action. Check Codex UI, expert, skill, archive, IM, scheduled-task, pet, BTW, Simplify, and marketplace plugins on their own.",
8392
+ "about.dependenciesDescription": "Install or update each companion separately, or install missing plugins and update old versions in one action. Check Codex UI, expert, skill, archive, IM, scheduled-task, BTW, Simplify, PUA, code review, pet, and marketplace plugins on their own.",
8365
8393
  "about.loading": "Loading dependency status…",
8366
8394
  "about.statusFailed": "Dependency status is temporarily unavailable.",
8367
8395
  "about.refreshFailed": "Dependency status refresh failed. Showing the last successful result.",
@@ -8404,7 +8432,12 @@ html[data-dcu-official-turn-navigator-supported=true] .dcu-turn-navigator,html:h
8404
8432
  "about.dependency.pet": "Codex Pet",
8405
8433
  "about.dependency.btw": "BTW",
8406
8434
  "about.dependency.simplify": "Simplify",
8407
- "about.dependency.market": "Plugin Market",
8435
+ "about.dependency.pua": "PUA",
8436
+ "about.dependency.review": "Code Review",
8437
+ "about.dependency.market": "App Market",
8438
+ "about.totalDownloads": "npm total downloads",
8439
+ "about.downloadsUnavailable": "Unavailable",
8440
+ "about.downloadsSource": "Cumulative npm downloads from package creation through yesterday. View package on npm.",
8408
8441
  "turns.label": "Conversation turn navigation",
8409
8442
  "turns.untitled": "Untitled prompt",
8410
8443
  "turns.jump": "Jump to turn {index}: {summary}",
@@ -9012,6 +9045,7 @@ html[data-dsh-native-backdrop=mica] .dcu-settings-page,html[data-dsh-native-back
9012
9045
  const hidden = /* @__PURE__ */ new Map();
9013
9046
  const guideModals = step === void 0 ? [] : settingsOverlays("[role=\"dialog\"][aria-modal=\"true\"],[role=\"alertdialog\"][aria-modal=\"true\"]");
9014
9047
  const isolate = (element) => {
9048
+ if (element.parentElement === document.body && element.hasAttribute("data-dsh-pet-overlay")) return;
9015
9049
  if (element === onboardingRoot.current || guideModals.includes(element)) return;
9016
9050
  if (guideModals.some((modal) => element.contains(modal))) {
9017
9051
  for (const child of element.children) if (child instanceof HTMLElement && !/^(STYLE|SCRIPT|LINK)$/.test(child.tagName)) isolate(child);
@@ -9042,12 +9076,16 @@ html[data-dsh-native-backdrop=mica] .dcu-settings-page,html[data-dsh-native-back
9042
9076
  const keepFocus = (event) => {
9043
9077
  const target = event.target;
9044
9078
  if (!(target instanceof Node) || page.current === null || !settingsElementAvailable(page.current)) return;
9045
- if (page.current.contains(target) || onboardingRoot.current?.contains(target) || settingsOverlays().some((overlay) => overlay.contains(target))) return;
9079
+ if (page.current.contains(target) || onboardingRoot.current?.contains(target) || [...document.querySelectorAll("body > [data-dsh-pet-overlay]")].some((root) => root.contains(target)) || settingsOverlays().some((overlay) => overlay.contains(target))) return;
9046
9080
  back.current?.focus();
9047
9081
  };
9048
9082
  const wrapFocus = (event) => {
9049
9083
  if (event.key !== "Tab" || event.defaultPrevented || page.current === null || !settingsElementAvailable(page.current) || settingsOverlays().length > 0) return;
9050
- const items = [page.current, onboardingRoot.current].filter((root) => root !== null).flatMap((root) => [...root.querySelectorAll("button,input,select,textarea,a[href],[tabindex]")]).filter((element) => element.tabIndex >= 0 && !element.matches(":disabled") && settingsElementAvailable(element));
9084
+ const items = [
9085
+ page.current,
9086
+ onboardingRoot.current,
9087
+ ...document.querySelectorAll("body > [data-dsh-pet-overlay]")
9088
+ ].filter((root) => root !== null).flatMap((root) => [...root.querySelectorAll("button,input,select,textarea,a[href],[tabindex]")]).filter((element) => element.tabIndex >= 0 && !element.matches(":disabled") && settingsElementAvailable(element));
9051
9089
  const next = event.shiftKey ? items.at(-1) : items[0];
9052
9090
  if (document.activeElement === (event.shiftKey ? items[0] : items.at(-1))) {
9053
9091
  event.preventDefault();
package/lib/index.mjs CHANGED
@@ -42,6 +42,62 @@ const CODEX_UI_API_ENDPOINTS = Object.freeze({
42
42
  sessionMove: `${CODEX_UI_API_BASE}/session-move`
43
43
  });
44
44
  //#endregion
45
+ //#region src/npm-downloads.ts
46
+ /** 关于页使用的 npm 累计下载量;历史不完整时返回 undefined,不把局部统计当总量。 */
47
+ const cache = /* @__PURE__ */ new Map();
48
+ const pending = /* @__PURE__ */ new Map();
49
+ function npmTotalDownloads(packageName) {
50
+ const hit = cache.get(packageName);
51
+ if (hit !== void 0 && hit.expires > Date.now()) return Promise.resolve(hit.value);
52
+ const active = pending.get(packageName);
53
+ if (active !== void 0) return active;
54
+ const request = query(packageName).then((value) => {
55
+ cache.set(packageName, {
56
+ value,
57
+ expires: Date.now() + (value === void 0 ? 3e5 : 216e5)
58
+ });
59
+ return value;
60
+ }).finally(() => {
61
+ pending.delete(packageName);
62
+ });
63
+ pending.set(packageName, request);
64
+ return request;
65
+ }
66
+ async function query(packageName) {
67
+ try {
68
+ const signal = AbortSignal.timeout(5e3);
69
+ const encoded = encodeURIComponent(packageName);
70
+ const metadata = await fetch(`https://registry.npmjs.org/${encoded}`, { signal });
71
+ if (!metadata.ok) return void 0;
72
+ const created = (await metadata.json())?.time?.created;
73
+ if (typeof created !== "string") return void 0;
74
+ const createdAt = Date.parse(created);
75
+ if (!Number.isFinite(createdAt) || createdAt < Date.parse("2015-01-10T00:00:00Z") || createdAt > Date.now()) return void 0;
76
+ const day = 864e5;
77
+ const start = Math.floor(createdAt / day) * day;
78
+ const end = Math.floor(Date.now() / day) * day - day;
79
+ if (start > end) return 0;
80
+ const ranges = [];
81
+ for (let from = start; from <= end; from += 365 * day) ranges.push({
82
+ start: new Date(from).toISOString().slice(0, 10),
83
+ end: new Date(Math.min(from + 364 * day, end)).toISOString().slice(0, 10)
84
+ });
85
+ const values = await Promise.all(ranges.map(async (range) => {
86
+ const response = await fetch(`https://api.npmjs.org/downloads/point/${range.start}:${range.end}/${encoded}`, { signal });
87
+ if (!response.ok) return void 0;
88
+ const data = await response.json();
89
+ if (data === null || typeof data !== "object") return void 0;
90
+ const { package: name, downloads, start, end } = data;
91
+ return name === packageName && start === range.start && end === range.end && typeof downloads === "number" && Number.isSafeInteger(downloads) && downloads >= 0 ? downloads : void 0;
92
+ }));
93
+ if (values.some((value) => value === void 0)) return void 0;
94
+ const total = values.reduce((sum, value) => sum + value, 0);
95
+ return Number.isSafeInteger(total) ? total : void 0;
96
+ } catch {
97
+ return;
98
+ }
99
+ }
100
+ //#endregion
45
101
  //#region src/dependencies.ts
46
102
  const SUITE_PACKAGE = "@michengai/dsh-codex-suite";
47
103
  const SUITE_MEMBER_PACKAGES = [
@@ -53,10 +109,6 @@ const SUITE_MEMBER_PACKAGES = [
53
109
  "@michengai/dsh-automation"
54
110
  ];
55
111
  const MANAGED_DEPENDENCIES = [
56
- {
57
- id: "dsh",
58
- packageName: "@deepseek-ai/dsh"
59
- },
60
112
  {
61
113
  id: "ui",
62
114
  packageName: "@michengai/dsh-codex-ui"
@@ -81,10 +133,6 @@ const MANAGED_DEPENDENCIES = [
81
133
  id: "schedule",
82
134
  packageName: "@michengai/dsh-automation"
83
135
  },
84
- {
85
- id: "pet",
86
- packageName: "@michengai/dsh-codex-pet"
87
- },
88
136
  {
89
137
  id: "btw",
90
138
  packageName: "@michengai/dsh-btw"
@@ -93,6 +141,18 @@ const MANAGED_DEPENDENCIES = [
93
141
  id: "simplify",
94
142
  packageName: "@michengai/dsh-simplify"
95
143
  },
144
+ {
145
+ id: "pua",
146
+ packageName: "@michengai/dsh-pua"
147
+ },
148
+ {
149
+ id: "review",
150
+ packageName: "@michengai/dsh-code-review"
151
+ },
152
+ {
153
+ id: "pet",
154
+ packageName: "@michengai/dsh-codex-pet"
155
+ },
96
156
  {
97
157
  id: "market",
98
158
  packageName: "dshmarket"
@@ -351,7 +411,14 @@ async function runtimeSupportsOfficialTurnNavigator(runtime = resolveDependencyR
351
411
  /** 返回当前 profile 中固定管理插件的实际安装版本与 npm latest 状态。 */
352
412
  async function dependencyStatuses(runtime = resolveDependencyRuntime()) {
353
413
  const bundleNames = await profileBundleNames(runtime);
354
- return Promise.all(MANAGED_DEPENDENCIES.map(async (dependency) => {
414
+ return Promise.all(MANAGED_DEPENDENCIES.map(async (entry) => {
415
+ const [status, totalDownloads] = await Promise.all([readStatus(entry), npmTotalDownloads(entry.packageName)]);
416
+ return {
417
+ ...status,
418
+ totalDownloads
419
+ };
420
+ }));
421
+ async function readStatus(dependency) {
355
422
  const version = await installedPackageVersion(dependency.packageName, runtime);
356
423
  if (version === void 0 && runtime.environmentKind === "desktop" && isOfficialRuntimePackage(dependency.packageName)) return {
357
424
  ...dependency,
@@ -375,7 +442,7 @@ async function dependencyStatuses(runtime = resolveDependencyRuntime()) {
375
442
  latestVersion,
376
443
  updateAvailable: latestVersion !== void 0 && newerVersion(version, latestVersion)
377
444
  };
378
- }));
445
+ }
379
446
  }
380
447
  /**
381
448
  * 把当前进程的 CLI 入口收成绝对路径。源码启动时 argv[1] 常是相对路径,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@michengai/dsh-codex-ui",
3
- "version": "1.1.2",
3
+ "version": "1.1.4",
4
4
  "description": "以 Codex 风格重构 DSH Web 侧栏的独立客户端插件",
5
5
  "license": "Apache-2.0",
6
6
  "publishConfig": {