@michengai/dsh-automation 0.1.40 → 0.1.41

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.41 - 2026-09-14
8
+
9
+ - Fix Scheduled and execution-history navigation disappearing when used with the archive and IM plugins.
10
+
7
11
  ## 0.1.40 - 2026-09-12
8
12
 
9
13
  - Configure concurrency per automation to allow overlapping executions of the same task. The default is `1`, preserving existing task behavior. When full, scheduled triggers are skipped and manual starts are rejected; lowering the limit does not cancel existing runs.
@@ -4,6 +4,10 @@
4
4
 
5
5
  以下记录待发布变更及近期已发布版本。Git 标签与 GitHub Release 现已和这些条目同步;历史条目继续保留原始发布提交链接。
6
6
 
7
+ ## 0.1.41 - 2026-09-14
8
+
9
+ - 修复与归档、IM 插件组合使用时,侧栏定时入口及执行记录入口可能消失的问题。
10
+
7
11
  ## 0.1.40 - 2026-09-12
8
12
 
9
13
  - 支持为单个自动化设置并发数量,让同一任务的多次执行可以同时进行。默认 `1`,旧任务保持原有行为;满额时跳过定时触发并拒绝手动启动,调低上限不取消已有运行。
package/README.md CHANGED
@@ -55,18 +55,21 @@ Run history stays in Settings and can be filtered by day, week, month, task, or
55
55
 
56
56
  ## DSH product ecosystem
57
57
 
58
- 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.
58
+ 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.
59
59
 
60
60
  | Plugin | What you can do |
61
61
  | --- | --- |
62
62
  | [Codex UI](https://github.com/MichengAI/dsh-codex-ui) | Organize projects and conversations, search tasks, and navigate chat turns |
63
- | [IM Connect](https://github.com/MichengAI/dsh-im-connect) | Send tasks and receive replies through your usual messenger |
64
- | [Automation](https://github.com/MichengAI/dsh-automation) | Schedule tasks and review each run |
63
+ | [Agency Agents](https://github.com/MichengAI/dsh-agency-agents) | Choose and summon specialists for your task |
65
64
  | [Skills Manager](https://github.com/MichengAI/dsh-skills-manager) | Find, enable, create, and import local skills |
66
65
  | [Archive Manager](https://github.com/MichengAI/dsh-archive-manager) | Search, restore, or clean up archived conversations |
67
- | [Agency Agents](https://github.com/MichengAI/dsh-agency-agents) | Choose and summon specialists for your task |
66
+ | [IM Connect](https://github.com/MichengAI/dsh-im-connect) | Send tasks and receive replies through messaging platforms |
67
+ | [Automation](https://github.com/MichengAI/dsh-automation) | Schedule tasks and review each run |
68
68
  | [BTW](https://github.com/MichengAI/dsh-btw) | Ask side questions without interrupting the main task |
69
- | [Simplify](https://github.com/MichengAI/dsh-simplify) | Use /simplify to improve code within your Git changes |
69
+ | [Simplify](https://github.com/MichengAI/dsh-simplify) | Use `/simplify` to improve code within your Git changes |
70
+ | [PUA](https://github.com/MichengAI/dsh-pua) | Guide the Agent to try new approaches after failures, investigate causes, and verify results before completion |
71
+ | [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 |
72
+ | [Codex Pet](https://github.com/MichengAI/dsh-codex-pet) | View conversation notifications and respond to tool approvals and questions through a desktop pet |
70
73
 
71
74
  ## Prerequisites
72
75
 
package/README.zh-CN.md CHANGED
@@ -55,18 +55,21 @@
55
55
 
56
56
  ## DSH 产品生态
57
57
 
58
- 想直接使用完整工作台,可下载 [DSH Codex Desktop](https://github.com/MichengAI/dsh-codex-desktop/releases);已有 [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) 环境,可按需独立安装以下 8 个自研插件。桌面端已随附这些插件。
58
+ 想使用桌面工作台,可下载 [DSH Codex Desktop](https://github.com/MichengAI/dsh-codex-desktop/releases);已有 [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) 环境,可按各项目 README 按需安装。以下列出 11 个自研插件;桌面端实际随附范围以对应版本的发行说明和内置清单为准。
59
59
 
60
60
  | 插件 | 你可以用它做什么 |
61
61
  | --- | --- |
62
62
  | [Codex UI](https://github.com/MichengAI/dsh-codex-ui) | 整理项目与会话、搜索任务、跳转对话轮次 |
63
- | [IM Connect](https://github.com/MichengAI/dsh-im-connect) | 从微信、飞书、钉钉等消息平台下任务、收回复 |
64
- | [Automation](https://github.com/MichengAI/dsh-automation) | 按计划执行任务,查看每次运行的结果 |
63
+ | [Agency Agents](https://github.com/MichengAI/dsh-agency-agents) | 按任务选择并召唤专业角色 |
65
64
  | [Skills Manager](https://github.com/MichengAI/dsh-skills-manager) | 统一查找、启停、创建和导入本机技能 |
66
65
  | [Archive Manager](https://github.com/MichengAI/dsh-archive-manager) | 搜索、恢复或清理已归档会话 |
67
- | [Agency Agents](https://github.com/MichengAI/dsh-agency-agents) | 按任务选择并召唤专业角色 |
66
+ | [IM Connect](https://github.com/MichengAI/dsh-im-connect) | 从消息平台下任务、收回复 |
67
+ | [Automation](https://github.com/MichengAI/dsh-automation) | 按计划执行任务,查看每次运行的结果 |
68
68
  | [BTW](https://github.com/MichengAI/dsh-btw) | 在当前上下文中临时旁问,不打断主任务 |
69
- | [Simplify](https://github.com/MichengAI/dsh-simplify) | 用 /simplify 整理 Git 改动范围内的代码 |
69
+ | [Simplify](https://github.com/MichengAI/dsh-simplify) | 用 `/simplify` 整理 Git 改动范围内的代码 |
70
+ | [PUA](https://github.com/MichengAI/dsh-pua) | 引导 Agent 在失败时换方法、查原因,并在完成前验证结果 |
71
+ | [Code Review](https://github.com/MichengAI/dsh-code-review) | 用 `/review` 发起独立 Agent 代码审查,在当前会话接收报告 |
72
+ | [Codex Pet](https://github.com/MichengAI/dsh-codex-pet) | 通过桌面宠物查看会话提醒、处理工具审批和问题回答 |
70
73
 
71
74
  ## 前置条件
72
75
 
@@ -186,6 +189,8 @@ pnpm build
186
189
 
187
190
  `pnpm check` 会连续执行类型检查、单元测试、真实宿主兼容测试和构建。`pnpm test:host` 不加载宿主运行时桩,使用官方 AgentLoop、Session V3 和权限服务,模型响应由本地固定适配器提供,不调用外部模型。浏览器交互和真实模型调用需另行验收。
188
191
 
192
+ 跨插件侧栏回归可运行 `node --import tsx scripts/verify-sidebar-composition.mjs <dsh-im-connect 检出目录>`。它执行两仓库的接入逻辑和页签注册表,覆盖归档、IM、定时及 Codex UI 的注册顺序、延迟通知与卸载接管;插槽和计时器使用模拟环境,不替代 Desktop 渲染验收,也不安装插件。
193
+
189
194
  `pnpm test:matrix` 先构建发布包,再联网为上述四个版本分别建立临时 npm 环境,执行严格 peer 安装、整棵官方依赖树版本检查、发布入口加载、真实 AgentLoop 执行和服务回归。四版均通过;服务回归中的持久化枚举使用内存夹具,覆盖新旧冷会话格式,不等同于真实 Profile 的磁盘迁移验收。脚本输出证据目录,保留各版安装锁文件、测试日志和 `results.json`。矩阵不修改开发依赖,也不连接用户 Profile。
190
195
 
191
196
  ## 许可证
package/lib/client.js CHANGED
@@ -4648,10 +4648,16 @@ function apply(ctx) {
4648
4648
  ctx.slots.inject("sidebar.workspaces", () => {
4649
4649
  let wrappedEntry;
4650
4650
  let originalComp;
4651
+ let ownedWrapper;
4652
+ let ownedRegistry;
4653
+ let insertedRegistry;
4651
4654
  let removeInsertedTab = () => void 0;
4652
4655
  let wrapped = false;
4653
4656
  let syncing = false;
4654
4657
  let retryTimer;
4658
+ const notifyPeers = () => {
4659
+ queueMicrotask(() => window.dispatchEvent(new Event("dsh-native-sidebar-change")));
4660
+ };
4655
4661
  const listenChannels = (listener) => ctx.slots.subscribe?.("sidebar.channels", listener) ?? (() => void 0);
4656
4662
  const stopRetry = () => {
4657
4663
  if (retryTimer !== void 0) {
@@ -4663,19 +4669,27 @@ function apply(ctx) {
4663
4669
  stopRetry();
4664
4670
  removeInsertedTab();
4665
4671
  removeInsertedTab = () => void 0;
4666
- if (wrappedEntry !== void 0 && originalComp !== void 0) {
4667
- try {
4668
- wrappedEntry.component = originalComp;
4669
- } catch {
4670
- }
4672
+ insertedRegistry = void 0;
4673
+ if (wrappedEntry !== void 0) {
4674
+ if (originalComp !== void 0 && wrappedEntry.component === ownedWrapper) wrappedEntry.component = originalComp;
4675
+ const record = wrappedEntry;
4676
+ if (record.__dshNativeTabs === ownedRegistry) delete record.__dshNativeTabs;
4677
+ notifyPeers();
4671
4678
  }
4672
4679
  wrappedEntry = void 0;
4673
4680
  originalComp = void 0;
4681
+ ownedWrapper = void 0;
4682
+ ownedRegistry = void 0;
4674
4683
  wrapped = false;
4675
4684
  };
4676
4685
  const insertScheduleTab = (entry, openSession) => {
4677
4686
  const registry = findNativeTabRegistry(entry);
4678
4687
  if (registry === void 0) return false;
4688
+ if (insertedRegistry !== registry) {
4689
+ removeInsertedTab();
4690
+ removeInsertedTab = () => void 0;
4691
+ insertedRegistry = registry;
4692
+ }
4679
4693
  if (registry.getTabs().some((item) => item.id === "schedule")) return true;
4680
4694
  removeInsertedTab = registry.insert({
4681
4695
  id: "schedule",
@@ -4707,7 +4721,7 @@ function apply(ctx) {
4707
4721
  const record = entry;
4708
4722
  if (insertScheduleTab(entry) || insertScheduleTab(record.component)) return true;
4709
4723
  }
4710
- return wrappedEntry !== void 0 && insertScheduleTab(wrappedEntry);
4724
+ return false;
4711
4725
  };
4712
4726
  const ensureScheduleTab = () => {
4713
4727
  if (insertIntoKnownHosts()) {
@@ -4740,7 +4754,7 @@ function apply(ctx) {
4740
4754
  ...innerProps.useSessions === void 0 ? {} : { useSessions: innerProps.useSessions },
4741
4755
  ...innerProps.useWorkspaces === void 0 ? {} : { useWorkspaces: innerProps.useWorkspaces },
4742
4756
  ...innerProps.renderSlot === void 0 ? {} : { renderSlot: innerProps.renderSlot },
4743
- ...originalComp === void 0 ? {} : { officialTree: originalComp }
4757
+ officialTree: tree
4744
4758
  });
4745
4759
  };
4746
4760
  var AutomationNativeWorkspaceShell = AutomationNativeWorkspaceShell2;
@@ -4749,13 +4763,19 @@ function apply(ctx) {
4749
4763
  return;
4750
4764
  }
4751
4765
  const entries = readSlotEntries(ctx, "sidebar.workspaces");
4752
- const occupant = pickWrappableWorkspacesEntry(entries);
4753
- const current = occupant?.component;
4754
- if (current !== void 0 && isForeignSidebarHost(current)) {
4766
+ const active = entries.find((entry) => entry?.component !== void 0);
4767
+ if (wrappedEntry !== void 0 && (active !== wrappedEntry || active.component !== ownedWrapper)) unwrap();
4768
+ if (active === wrappedEntry && active?.component === ownedWrapper && ownedWrapper !== void 0) {
4755
4769
  ensureScheduleTab();
4756
4770
  return;
4757
4771
  }
4758
- if (wrappedEntry?.component !== void 0 && wrappedEntry.component.__dshAutomationWrapped === true) {
4772
+ if (active === void 0) {
4773
+ unwrap();
4774
+ return;
4775
+ }
4776
+ const occupant = pickWrappableWorkspacesEntry(entries);
4777
+ const current = occupant?.component;
4778
+ if (current !== void 0 && isForeignSidebarHost(current)) {
4759
4779
  ensureScheduleTab();
4760
4780
  return;
4761
4781
  }
@@ -4764,17 +4784,21 @@ function apply(ctx) {
4764
4784
  if (resolved === void 0) return;
4765
4785
  originalComp = resolved;
4766
4786
  const registry = createNativeTabRegistry(originalComp);
4787
+ ownedRegistry = registry;
4767
4788
  attachNativeTabRegistry(occupant, registry);
4768
4789
  const marked = AutomationNativeWorkspaceShell2;
4769
4790
  marked.displayName = "AutomationNativeWorkspaceShell";
4770
4791
  marked.__dshNativeTabHost = true;
4771
4792
  marked.__dshAutomationWrapped = true;
4772
4793
  marked.__dshAutomationOriginal = originalComp;
4794
+ const tree = originalComp;
4773
4795
  attachNativeTabRegistry(marked, registry);
4774
4796
  occupant.component = marked;
4797
+ ownedWrapper = marked;
4775
4798
  wrappedEntry = occupant;
4776
4799
  wrapped = true;
4777
4800
  ensureScheduleTab();
4801
+ notifyPeers();
4778
4802
  } catch (error) {
4779
4803
  console.warn("[dsh-automation] \u5305\u88F9\u5B98\u65B9\u4EFB\u52A1\u6811\u5931\u8D25", error);
4780
4804
  } finally {
@@ -4783,9 +4807,13 @@ function apply(ctx) {
4783
4807
  };
4784
4808
  sync();
4785
4809
  const unsub = typeof ctx.slots.subscribe === "function" ? ctx.slots.subscribe("sidebar.workspaces", sync) : () => void 0;
4810
+ const unsubSidebar = ctx.slots.subscribe?.("sidebar", sync) ?? (() => void 0);
4811
+ window.addEventListener("dsh-native-sidebar-change", sync);
4786
4812
  ensureScheduleTab();
4787
4813
  return () => {
4788
4814
  unsub();
4815
+ unsubSidebar();
4816
+ window.removeEventListener("dsh-native-sidebar-change", sync);
4789
4817
  unwrap();
4790
4818
  };
4791
4819
  });