@michengai/dsh-automation 0.1.41 → 0.1.42

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,10 @@
4
4
 
5
5
  Upcoming changes and recent published versions are listed below. Git tags and GitHub Releases now mirror these entries; historical sections retain links to their original release commits.
6
6
 
7
+ ## 0.1.42 - 2026-09-14
8
+
9
+ - Preserve a replacement sidebar tab when an older registration with the same ID is unloaded.
10
+
7
11
  ## 0.1.41 - 2026-09-14
8
12
 
9
13
  - Fix Scheduled and execution-history navigation disappearing when used with the archive and IM plugins.
@@ -4,6 +4,10 @@
4
4
 
5
5
  以下记录待发布变更及近期已发布版本。Git 标签与 GitHub Release 现已和这些条目同步;历史条目继续保留原始发布提交链接。
6
6
 
7
+ ## 0.1.42 - 2026-09-14
8
+
9
+ - 修复旧侧栏页签卸载时,可能误删同 ID 替代页签的问题。
10
+
7
11
  ## 0.1.41 - 2026-09-14
8
12
 
9
13
  - 修复与归档、IM 插件组合使用时,侧栏定时入口及执行记录入口可能消失的问题。
package/README.md CHANGED
@@ -189,6 +189,8 @@ pnpm build
189
189
 
190
190
  `pnpm check` runs typecheck, unit tests, real Host compatibility tests, and build. `pnpm test:host` bypasses runtime stubs and uses the official AgentLoop, Session V3, and permission service with a fixed local model adapter; it makes no external model calls. Browser interactions and real model calls require separate acceptance testing.
191
191
 
192
+ Cross-plugin sidebar regressions run with `pnpm test:composition <dsh-im-connect checkout>`. Build the IM checkout first; the script reads its `lib/client.js`. It executes the composition logic and tab registries of both repositories, covering registration order, delayed notifications, and uninstall handover across the archive, IM, scheduled, and Codex UI plugins; slots and timers use a simulated environment, so it does not install any plugin or replace Desktop rendering acceptance testing. This separate check requires an external checkout and is not included in `pnpm check`; use a fixed IM revision for reproducible results.
193
+
192
194
  `pnpm test:matrix` builds the package, then creates separate temporary npm environments for all four versions using network access. It checks strict peer installation, every official dependency version, the packaged entry point, real AgentLoop execution, and service regressions. All four versions pass. Persistence enumeration in service regressions uses in-memory fixtures for both cold-session formats; it does not validate on-disk migration of a real Profile. The printed evidence directory retains installation lockfiles, test logs, and `results.json`. The matrix does not modify development dependencies or connect to the user's Profile.
193
195
 
194
196
  ## License
package/README.zh-CN.md CHANGED
@@ -189,7 +189,7 @@ pnpm build
189
189
 
190
190
  `pnpm check` 会连续执行类型检查、单元测试、真实宿主兼容测试和构建。`pnpm test:host` 不加载宿主运行时桩,使用官方 AgentLoop、Session V3 和权限服务,模型响应由本地固定适配器提供,不调用外部模型。浏览器交互和真实模型调用需另行验收。
191
191
 
192
- 跨插件侧栏回归可运行 `node --import tsx scripts/verify-sidebar-composition.mjs <dsh-im-connect 检出目录>`。它执行两仓库的接入逻辑和页签注册表,覆盖归档、IM、定时及 Codex UI 的注册顺序、延迟通知与卸载接管;插槽和计时器使用模拟环境,不替代 Desktop 渲染验收,也不安装插件。
192
+ 跨插件侧栏回归可运行 `pnpm test:composition <dsh-im-connect 检出目录>`。请先构建 IM 检出目录,脚本读取其中的 `lib/client.js`。它执行两仓库的接入逻辑和页签注册表,覆盖归档、IM、定时及 Codex UI 的注册顺序、延迟通知与卸载接管;插槽和计时器使用模拟环境,不替代 Desktop 渲染验收,也不安装插件。该检查需要外部检出目录,独立于 `pnpm check`;请固定 IM revision,以便复现结果。
193
193
 
194
194
  `pnpm test:matrix` 先构建发布包,再联网为上述四个版本分别建立临时 npm 环境,执行严格 peer 安装、整棵官方依赖树版本检查、发布入口加载、真实 AgentLoop 执行和服务回归。四版均通过;服务回归中的持久化枚举使用内存夹具,覆盖新旧冷会话格式,不等同于真实 Profile 的磁盘迁移验收。脚本输出证据目录,保留各版安装锁文件、测试日志和 `results.json`。矩阵不修改开发依赖,也不连接用户 Profile。
195
195
 
package/lib/client.js CHANGED
@@ -2963,6 +2963,7 @@ function createNativeTabRegistry(officialTree) {
2963
2963
  emit();
2964
2964
  }
2965
2965
  return () => {
2966
+ if (tabs.get(tab.id) !== tab) return;
2966
2967
  tabs.delete(tab.id);
2967
2968
  rebuild();
2968
2969
  emit();
@@ -4652,7 +4653,6 @@ function apply(ctx) {
4652
4653
  let ownedRegistry;
4653
4654
  let insertedRegistry;
4654
4655
  let removeInsertedTab = () => void 0;
4655
- let wrapped = false;
4656
4656
  let syncing = false;
4657
4657
  let retryTimer;
4658
4658
  const notifyPeers = () => {
@@ -4680,7 +4680,6 @@ function apply(ctx) {
4680
4680
  originalComp = void 0;
4681
4681
  ownedWrapper = void 0;
4682
4682
  ownedRegistry = void 0;
4683
- wrapped = false;
4684
4683
  };
4685
4684
  const insertScheduleTab = (entry, openSession) => {
4686
4685
  const registry = findNativeTabRegistry(entry);
@@ -4779,7 +4778,7 @@ function apply(ctx) {
4779
4778
  ensureScheduleTab();
4780
4779
  return;
4781
4780
  }
4782
- if (occupant?.component === void 0 || wrapped) return;
4781
+ if (occupant?.component === void 0) return;
4783
4782
  const resolved = resolveOfficialTreeComponent(occupant.component);
4784
4783
  if (resolved === void 0) return;
4785
4784
  originalComp = resolved;
@@ -4796,7 +4795,6 @@ function apply(ctx) {
4796
4795
  occupant.component = marked;
4797
4796
  ownedWrapper = marked;
4798
4797
  wrappedEntry = occupant;
4799
- wrapped = true;
4800
4798
  ensureScheduleTab();
4801
4799
  notifyPeers();
4802
4800
  } catch (error) {