dsh-archived-chats 2.0.3 → 2.0.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,20 @@
4
4
 
5
5
  Entries describe behavior at each release, not necessarily current behavior. Consult the READMEs and user guides for current usage.
6
6
 
7
+ ## 2.0.4 — 2026-11-16
8
+
9
+ ### 中文
10
+
11
+ - 将已合并的作者信息更正发布到 npm:包作者统一为 Ultroncn,同步中英文安装与维护者说明。
12
+ - 发布已合并的更新弹窗复制反馈改进:使用宿主成功提示,旧宿主提供文字反馈;区分包名版本、本地路径和终端命令。
13
+ - 包含已合并的未使用翻译与内部导出清理;宿主兼容范围、归档、备份及删除行为不变。
14
+
15
+ ### English
16
+
17
+ - Publish the merged author correction to npm: use Ultroncn consistently in package metadata and bilingual installation guidance.
18
+ - Ship the merged update-dialog copy feedback: use the Host success notice with a text fallback, and distinguish the package/version, local path and terminal command.
19
+ - Include merged unused-translation and internal-export cleanup. Host compatibility, archive, backup and deletion behavior are unchanged.
20
+
7
21
  ## 2.0.3 — 2026-11-14
8
22
 
9
23
  ### 中文
package/README.md CHANGED
@@ -34,11 +34,11 @@ Archive Management adds conversation search, organization and backups to DeepSee
34
34
  - **Portable backups:** export and import JSON + Markdown ZIPs; imports preview before writing and skip existing IDs to avoid overwrites.
35
35
  - **Conversation lineage:** read-only Origins & Branches view traces sources, forks and subagent relationships across all workspaces, including archived and unarchived chats.
36
36
 
37
- > This document describes version 2.0.3. Previous recovery features are removed, with explicit retries for permanent-deletion tasks.
37
+ > This document describes version 2.0.4. Previous recovery features are removed, with explicit retries for permanent-deletion tasks.
38
38
 
39
39
  ## Install and open
40
40
 
41
- Find `dsh-archived-chats` in the DSH plugin market, verify author **Ultronen**, and install. Follow the host's restart prompt, then open **Settings → Archive Management** (Chinese: **设置 → 归档管理**).
41
+ Find `dsh-archived-chats` in the DSH plugin market, verify author **Ultroncn**, and install. Follow the host's restart prompt, then open **Settings → Archive Management** (Chinese: **设置 → 归档管理**).
42
42
 
43
43
  Alternatively, use the CLI. `web` is an example profile; replace it with your running DSH profile and use the same profile for updates and removal:
44
44
 
package/README.zh-CN.md CHANGED
@@ -1,3 +1,5 @@
1
+ [![DSH Insights health](https://dsh-insights.com/badge/Ultroncn/dsh-archived-chats.svg)](https://dsh-insights.com/p/Ultroncn/dsh-archived-chats/)
2
+
1
3
  <p align="center">
2
4
  <img src="assets/brand/archive-management-banner.png" alt="归档管理:面向 DeepSeek Harness 的本地优先归档聊天中心" width="100%">
3
5
  </p>
@@ -32,11 +34,11 @@
32
34
  - **可迁移备份:** 导出和导入 JSON + Markdown ZIP;导入前预览,跳过已有 ID,不覆盖现有数据。
33
35
  - **会话溯源:** 只读的「来源与分支」视图查看所有工作区中已归档、未归档会话的来源、分叉和子代理关系。
34
36
 
35
- > 本文描述 2.0.3,旧恢复功能已移除,永久删除支持任务重试。
37
+ > 本文描述 2.0.4,旧恢复功能已移除,永久删除支持任务重试。
36
38
 
37
39
  ## 安装与打开
38
40
 
39
- 在 DSH 插件市场搜索 `dsh-archived-chats`,核对作者 **Ultronen** 后安装。按宿主提示重启,打开 **设置 → 归档管理**(英文为 Archive Management)。
41
+ 在 DSH 插件市场搜索 `dsh-archived-chats`,核对作者 **Ultroncn** 后安装。按宿主提示重启,打开 **设置 → 归档管理**(英文为 Archive Management)。
40
42
 
41
43
  也可使用命令行。`web` 是示例 profile,请替换为实际运行 DSH 的 profile,更新和卸载也使用同一个:
42
44
 
@@ -17,6 +17,9 @@ The plugin supplements archive management; it does not replace DSH's main chat a
17
17
  | `about.js` | Local plugin identity, bounded public version checks, in-memory cache |
18
18
  | `persistence-compat.js` | Legacy inspect and modern read-handle adaptation; separate title reads |
19
19
  | `workspace-bulk-archive.js` | Eligible workspace chats, short-lived confirmation, apply-time checks |
20
+ | `deletion.js`, `deletion-tasks.js` | Permanent-deletion scheduling, durable tasks, explicit retries |
21
+ | `deletion-safety.js` | Exclusive session-directory checks before deletion |
22
+ | `session-filters.js` | Optional schedule-binding filter (schedule status per session) |
20
23
  | `export.js`, `import.js`, `restore.js` | ZIP export, bounded import validation, transactional restoration |
21
24
  | `metadata.js`, `durable.js` | Tags/notes, serialized atomic writes, durability primitives |
22
25
  | `search.js`, `stats.js` | Message projection/search and directory measurements |
@@ -18,6 +18,8 @@
18
18
  | `persistence-compat.js` | 旧版 inspect 与新版只读句柄适配,独立标题读取 |
19
19
  | `workspace-bulk-archive.js` | 工作区归档候选、短效确认、执行重检 |
20
20
  | `deletion.js`、`deletion-tasks.js` | 永久删除调度、持久化任务与明确重试 |
21
+ | `deletion-safety.js` | 会话目录独占性判定(删除前安全检查) |
22
+ | `session-filters.js` | 可选日程绑定筛选(会话的日程关联状态) |
21
23
  | `export.js`、`import.js`、`restore.js` | ZIP 导出、有界导入验证、事务恢复 |
22
24
  | `metadata.js`、`durable.js` | 标签备注、串行原子写入与持久化操作 |
23
25
  | `search.js`、`stats.js` | 消息投影与搜索、会话目录测量 |
@@ -4,7 +4,7 @@ Current source removes the previous recovery UI and keeps explicit permanent-del
4
4
 
5
5
  English · [简体中文](USER_GUIDE.zh-CN.md) · [Back to README](../README.md)
6
6
 
7
- Archive Management provides a place to browse and manage DSH's archived chats, plus workspace bulk archiving. This document describes version 2.0.3, with native integration coverage for DSH `0.1.7-rc.2`, `0.2.1-rc.2`, `0.2.1-rc.5`, `0.2.2-rc.1` and `0.2.2-rc.3`. See the [changelog](../CHANGELOG.md) for release history. For interfaces and data formats, see the [architecture](ARCHITECTURE.en.md).
7
+ Archive Management provides a place to browse and manage DSH's archived chats, plus workspace bulk archiving. This document describes version 2.0.4, with native integration coverage for DSH `0.1.7-rc.2`, `0.2.1-rc.2`, `0.2.1-rc.5`, `0.2.2-rc.1` and `0.2.2-rc.3`. See the [changelog](../CHANGELOG.md) for release history. For interfaces and data formats, see the [architecture](ARCHITECTURE.en.md).
8
8
 
9
9
  Archive Management prefers the Host’s public Modal, Button, Input, menu, Tooltip, and icon components. Search fields follow the built-in plugin inventory’s 36px height, search icon, and focus styles. Ordinary text fields use the public Input. Confirmations use the official heading, description, and action areas. Complex preview and import content use the official modal frame. Older Hosts without these exports use compatible controls. Page headings, descriptions, secondary list text, and focus states follow the official settings typography and theme variables.
10
10
 
@@ -17,7 +17,7 @@ Archive Management prefers the Host’s public Modal, Button, Input, menu, Toolt
17
17
 
18
18
  ## Install and open
19
19
 
20
- Search for `dsh-archived-chats` in DSH's plugin market, verify the author is **Ultronen**, and choose **Install**. After installation, follow the host's restart instructions. The settings entry is **归档管理** in Chinese; in English it is **Archive Management**.
20
+ Search for `dsh-archived-chats` in DSH's plugin market, verify the author is **Ultroncn**, and choose **Install**. After installation, follow the host's restart instructions. The settings entry is **归档管理** in Chinese; in English it is **Archive Management**.
21
21
 
22
22
  Alternatively, run this command on the computer running DSH. `web` is an example profile; replace it with the profile that actually runs your DSH instance. Use that same profile for updates and removal:
23
23
 
@@ -187,7 +187,7 @@ Opening Archive Management loads local metadata, then automatically checks publi
187
187
 
188
188
  When diagnosing an unchanged version after an update, also verify that you updated the profile actually running DSH.
189
189
 
190
- Check for updates and View update beside the heading open a dialog with the running version, public release, last check and current host. Copy the package spec into Add plugin in another host. A terminal command is offered only when the current launcher and profile can be verified; official Desktop uses its own bundled command, never an unrelated dsh on PATH. This detects the current host only, not other Desktop installations.
190
+ Check for updates and View update beside the heading open a dialog with the running version, public release, last check and current host. Copy package and version provides the package spec for Add plugin in another host. The copy buttons include an icon and keep their labels after copying. Successful copies show the Host's transient success Toast, with a brief inline confirmation on older Hosts. A terminal command is offered only when the current launcher and profile can be verified; official Desktop uses its own bundled command, never an unrelated dsh on PATH. This detects the current host only, not other Desktop installations.
191
191
 
192
192
  Local link:/file: installations are labeled Local checkout, offer Copy local path and are protected on the backend against registry replacement. Registry installations offer Install update when supported. The official updateBundle API is preferred, letting the Host check version compatibility, replace the plugin and attempt to restore the previous version if installation fails. Settings may close during replacement. Reopen Archive Management afterward to verify its running version. Results distinguish Host-applied updates from required restarts and report whether restoration was verified. Older Hosts use the official installation API only where replacement is supported, otherwise directing users to the Versions section on the official Plugins page. Duplicate submissions are blocked. Restarting DSH remains a user action.
193
193
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  [English](USER_GUIDE.md) · 简体中文 · [返回 README](../README.zh-CN.md)
4
4
 
5
- 归档管理为 DSH 已归档聊天提供查看和管理页面,并扩展按工作区批量归档。本文描述 2.0.3 的行为(包含未归档正文搜索),原生集成测试覆盖 DSH `0.1.7-rc.2`、`0.2.1-rc.2`、`0.2.1-rc.5`、`0.2.2-rc.1` 和 `0.2.2-rc.3`。版本变更见[更新日志](../CHANGELOG.md),接口和数据格式见[架构说明](ARCHITECTURE.md)。
5
+ 归档管理为 DSH 已归档聊天提供查看和管理页面,并扩展按工作区批量归档。本文描述 2.0.4 的行为(包含未归档正文搜索),原生集成测试覆盖 DSH `0.1.7-rc.2`、`0.2.1-rc.2`、`0.2.1-rc.5`、`0.2.2-rc.1` 和 `0.2.2-rc.3`。版本变更见[更新日志](../CHANGELOG.md),接口和数据格式见[架构说明](ARCHITECTURE.md)。
6
6
 
7
7
  归档管理优先复用宿主公开的 Modal、Button、Input、菜单、Tooltip 和图标组件。搜索框采用内置插件页面的 36px 高度、搜索图标和焦点样式,普通文本输入使用公开 Input。确认弹窗的标题、正文和操作区使用官方组件,复杂预览和导入内容使用官方弹窗框架;缺少相应导出的旧 Host 使用兼容样式。页面标题、说明、列表次要文字和焦点状态采用官方设置页的文字层级与主题变量。
8
8
 
@@ -15,7 +15,7 @@
15
15
 
16
16
  ## 安装与打开
17
17
 
18
- 在 DSH 插件市场搜索 `dsh-archived-chats`,核对作者为 **Ultronen** 后点击「安装」。安装完成后按宿主提示重启 DSH,打开 **设置 → 归档管理**。
18
+ 在 DSH 插件市场搜索 `dsh-archived-chats`,核对作者为 **Ultroncn** 后点击「安装」。安装完成后按宿主提示重启 DSH,打开 **设置 → 归档管理**。
19
19
 
20
20
  也可以在运行 DSH 的主机上使用命令行安装。以下以 `web` profile 为例,请替换为实际运行 DSH 的 profile;更新和卸载也使用同一 profile:
21
21
 
@@ -187,7 +187,7 @@ JSON 是机器可读记录,Markdown 是可读副本。新版 Host 导出 ZIP v
187
187
 
188
188
  更新后版本未变化时,还应核对更新的 profile 是否就是实际运行 DSH 的 profile。
189
189
 
190
- 「检查更新」与标题旁的「查看更新」打开更新弹窗,展示运行版本、公开版本、上次检查和当前环境。支持复制包名到另一端的「添加插件」;命令只在能验证当前启动程序和 profile 时提供,官方桌面端使用其自带命令,不依赖 PATH 中的另一套 dsh。这里只识别当前环境,不扫描或自动安装到其他桌面端。
190
+ 「检查更新」与标题旁的「查看更新」打开更新弹窗,展示运行版本、公开版本、上次检查和当前环境。「复制包名与版本」可用于另一端的「添加插件」。复制按钮带图标,复制后文字保持不变,成功时显示宿主轻提示,旧 Host 使用短暂的行内提示。命令只在能验证当前启动程序和 profile 时提供,官方桌面端使用其自带命令,不依赖 PATH 中的另一套 dsh。这里只识别当前环境,不扫描或自动安装到其他桌面端。
191
191
 
192
192
  本地 `link:` / `file:` 等来源标记为「本地开发版」,提供复制本地路径,后端拒绝用线上包覆盖。npm 安装在宿主支持时提供「安装更新」,优先调用官方 `updateBundle`,由宿主检查版本与兼容性、替换旧插件,并在安装失败时尝试恢复旧版本。更新期间设置页可能关闭,完成后重新打开归档管理核对运行版本。结果区分「宿主已应用」和「需要重启」;旧版恢复成功或未能确认恢复均有明确提示。旧 Host 缺少更新接口时,仅在允许替换的环境使用官方安装接口,其余引导前往官方插件页的版本区域更新。重复提交被阻止,DSH 重启由用户操作。
193
193
 
package/lib/client.js CHANGED
@@ -207,8 +207,6 @@ window.__ModuleLoader__.load({
207
207
  "lineage.project": "项目",
208
208
  "lineage.delegation": "委派层级",
209
209
  "lineage.noBranches": "无分支",
210
- "lineage.details": "详情",
211
- "lineage.depth": "层级",
212
210
  "lineage.crossWorkspace": "来源工作区",
213
211
  "lineage.sourceId": "来源 ID",
214
212
  "lineage.diagnostic.missing-parent": "父会话缺失",
@@ -218,7 +216,6 @@ window.__ModuleLoader__.load({
218
216
  "lineage.diagnostic.delegation-depth-mismatch": "委派深度不一致",
219
217
  "action.import": "导入备份",
220
218
  "action.export": "全部导出",
221
- "import.action": "导入备份",
222
219
  "import.title": "导入归档备份",
223
220
  "import.inspecting": "正在检查备份…",
224
221
  "import.preview": "恢复前请确认要导入的会话",
@@ -254,11 +251,8 @@ window.__ModuleLoader__.load({
254
251
  "export.timeout": "备份导出超时,未下载不完整文件,请稍后重试",
255
252
  "search.placeholder": "搜索会话标题、标签、备注和内容",
256
253
  "workspaceArchive.reason.session-ineligible": "会话已不符合归档条件,已跳过",
257
- "search.loading": "正在搜索聊天内容…",
258
- "search.error": "聊天内容搜索暂不可用",
259
254
  "search.contentMatch": "聊天内容命中",
260
255
  "preview.open": "查看对话",
261
- "preview.title": "归档对话预览",
262
256
  "preview.close": "关闭预览",
263
257
  "preview.loading": "正在读取对话…",
264
258
  "preview.error": "对话预览加载失败",
@@ -281,10 +275,6 @@ window.__ModuleLoader__.load({
281
275
  "preview.copyError": "无法复制,请允许剪贴板访问后重试",
282
276
  "preview.imageUnavailable": "图片不可用",
283
277
  "preview.readOnly": "只读预览",
284
- "preview.toolPending": "等待中",
285
- "preview.toolRunning": "运行中",
286
- "preview.toolComplete": "已完成",
287
- "preview.toolFailed": "失败",
288
278
  "filter.allChats": "全部聊天",
289
279
  "filter.type": "类型",
290
280
  "filter.normal": "普通会话",
@@ -309,10 +299,8 @@ window.__ModuleLoader__.load({
309
299
  "chat.deleteArchived": "删除已归档的聊天",
310
300
  "chat.deleteUnarchived": "删除未归档的聊天",
311
301
  "chat.deleteRunning": "请先停止会话,再删除",
312
- "chat.deleteChanged": "会话状态已变化,请刷新后重新确认删除。",
313
302
  "menu.deleteAllPermanently": "全部删除",
314
303
  "menu.unarchiveAll": "全部取消归档",
315
- "menu.deletePermanently": "全部删除",
316
304
  "action.deleteAll": "全部删除",
317
305
  "group.collapse": "折叠",
318
306
  "group.expand": "展开",
@@ -337,7 +325,6 @@ window.__ModuleLoader__.load({
337
325
  "meta.unavailable": "元数据不可用,暂无法编辑标签与备注",
338
326
  "stats.loading": "正在统计存储…",
339
327
  "stats.error": "存储统计不可用",
340
- "stats.unavailable": "部分会话无法统计",
341
328
  "workspaceArchive.action": "归档会话",
342
329
  "workspaceArchive.settingsAction": "批量归档",
343
330
  "workspaceArchive.chooseTitle": "选择工作区",
@@ -457,8 +444,6 @@ window.__ModuleLoader__.load({
457
444
  "lineage.project": "Project",
458
445
  "lineage.delegation": "Delegation level",
459
446
  "lineage.noBranches": "No branches",
460
- "lineage.details": "Details",
461
- "lineage.depth": "Level",
462
447
  "lineage.crossWorkspace": "Source workspace",
463
448
  "lineage.sourceId": "Source ID",
464
449
  "lineage.diagnostic.missing-parent": "Missing parent",
@@ -468,7 +453,6 @@ window.__ModuleLoader__.load({
468
453
  "lineage.diagnostic.delegation-depth-mismatch": "Delegation depth mismatch",
469
454
  "action.import": "Import backup",
470
455
  "action.export": "Export all",
471
- "import.action": "Import backup",
472
456
  "import.title": "Import archived backup",
473
457
  "import.inspecting": "Inspecting backup…",
474
458
  "import.preview": "Review the sessions before restoring",
@@ -504,11 +488,8 @@ window.__ModuleLoader__.load({
504
488
  "export.timeout": "Backup export timed out. No incomplete file was downloaded; try again later",
505
489
  "search.placeholder": "Search titles, tags, notes, and conversation content",
506
490
  "workspaceArchive.reason.session-ineligible": "Chat is no longer eligible for archiving; skipped",
507
- "search.loading": "Searching conversation content…",
508
- "search.error": "Conversation-content search is unavailable",
509
491
  "search.contentMatch": "Conversation match",
510
492
  "preview.open": "View conversation",
511
- "preview.title": "Archived conversation preview",
512
493
  "preview.close": "Close preview",
513
494
  "preview.loading": "Loading conversation…",
514
495
  "preview.error": "Conversation preview failed to load",
@@ -531,10 +512,6 @@ window.__ModuleLoader__.load({
531
512
  "preview.copyError": "Could not copy. Allow clipboard access and try again",
532
513
  "preview.imageUnavailable": "Image unavailable",
533
514
  "preview.readOnly": "Read-only preview",
534
- "preview.toolPending": "Pending",
535
- "preview.toolRunning": "Running",
536
- "preview.toolComplete": "Complete",
537
- "preview.toolFailed": "Failed",
538
515
  "filter.allChats": "All chats",
539
516
  "filter.type": "Type",
540
517
  "filter.normal": "Regular chats",
@@ -559,10 +536,8 @@ window.__ModuleLoader__.load({
559
536
  "chat.deleteArchived": "Delete archived chat",
560
537
  "chat.deleteUnarchived": "Delete unarchived chat",
561
538
  "chat.deleteRunning": "Stop this chat before deleting it",
562
- "chat.deleteChanged": "The chat changed. Refresh and confirm deletion again.",
563
539
  "menu.deleteAllPermanently": "Delete all",
564
540
  "menu.unarchiveAll": "Unarchive all",
565
- "menu.deletePermanently": "Delete all",
566
541
  "action.deleteAll": "Delete all",
567
542
  "group.collapse": "Collapse",
568
543
  "group.expand": "Expand",
@@ -587,7 +562,6 @@ window.__ModuleLoader__.load({
587
562
  "meta.unavailable": "Metadata unavailable, editing tags and notes is disabled",
588
563
  "stats.loading": "Measuring storage…",
589
564
  "stats.error": "Storage statistics unavailable",
590
- "stats.unavailable": "Some sessions could not be measured",
591
565
  "workspaceArchive.action": "Archive chats",
592
566
  "workspaceArchive.settingsAction": "Bulk archive",
593
567
  "workspaceArchive.chooseTitle": "Choose a workspace",
@@ -4559,15 +4533,22 @@ window.__ModuleLoader__.load({
4559
4533
 
4560
4534
  function UpdateDialog({ t, about, checking, installing, error, onCheck, onInstall, onClose, returnFocus, fallbackFocusRef }) {
4561
4535
  const zh = isZh(t), info = about?.installation, update = about?.update;
4562
- const [copied, setCopied] = _react.useState(null);
4563
- _react.useEffect(() => { setCopied(null); }, [info?.command, info?.packageSpec, info?.localPath]);
4536
+ const [copyResult, setCopyResult] = _react.useState(null);
4537
+ _react.useEffect(() => { setCopyResult(null); }, [info?.command, info?.packageSpec, info?.localPath]);
4538
+ const dismissCopy = () => setCopyResult(current => current === copyResult ? null : current);
4539
+ _react.useEffect(() => {
4540
+ if (copyResult?.status !== "success" || previewPrimitives.Toast) return;
4541
+ const timer = setTimeout(dismissCopy, 2000);
4542
+ return () => clearTimeout(timer);
4543
+ }, [copyResult]);
4564
4544
  const local = info?.source === "local", restart = about?.install?.status === "restart-required";
4565
4545
  const applied = about?.install?.status === "applied";
4566
4546
  const canInstall = info?.canInstall === true && update?.status === "available" && !local && !restart && !applied;
4567
- const copy = async (value, key) => {
4547
+ const copy = async value => {
4568
4548
  try { if (!globalThis.navigator?.clipboard?.writeText) throw new Error("clipboard unavailable");
4569
- await globalThis.navigator.clipboard.writeText(value); setCopied(key);
4570
- } catch { setCopied("failed"); }
4549
+ await globalThis.navigator.clipboard.writeText(value);
4550
+ setCopyResult(previous => ({ status: "success", sequence: (previous?.sequence ?? 0) + 1 }));
4551
+ } catch { setCopyResult({ status: "failed" }); }
4571
4552
  };
4572
4553
  const status = restart ? (zh ? `v${about.install.version} 已安装,请重启 DSH 后确认运行版本。` : `v${about.install.version} installed. Restart DSH and verify the running version.`)
4573
4554
  : applied ? (zh ? `宿主已应用 v${about.install.version},重新打开归档管理可确认运行版本。` : `The host applied v${about.install.version}. Reopen Archive Management to verify the running version.`)
@@ -4577,9 +4558,9 @@ window.__ModuleLoader__.load({
4577
4558
  : update?.status === "current" ? (local ? (zh ? "本地开发版已连接,以下为公开版本信息。" : "Local checkout connected. Public release information is shown below.") : (zh ? "当前已是最新版本" : "You’re up to date"))
4578
4559
  : update?.status === "unavailable" ? (zh ? "检查更新失败,可稍后重试" : "Update check failed. Try again later.")
4579
4560
  : (zh ? "尚未检查更新" : "Updates haven’t been checked yet");
4580
- const codeBlock = (value, label, key) => value ? (0, jsx.jsxs)("div", { className: "dac-update-command", children: [
4561
+ const codeBlock = (value, label) => value ? (0, jsx.jsxs)("div", { className: "dac-update-command", children: [
4581
4562
  (0, jsx.jsx)("code", { children: value }),
4582
- (0, jsx.jsx)(ControlButton, { type: "button", className: "dac-action-trigger", disabled: installing, onClick: () => copy(value, key), children: copied === key ? (zh ? "已复制" : "Copied") : label }),
4563
+ (0, jsx.jsxs)(ControlButton, { type: "button", className: "dac-action-trigger", disabled: installing, onClick: () => copy(value), children: [(0, jsx.jsx)(IconCopy, {}), label] }),
4583
4564
  ] }) : null;
4584
4565
  const body = (0, jsx.jsxs)("div", { className: "dac-update-content", children: [
4585
4566
  (0, jsx.jsx)("p", { role: "status", children: status }),
@@ -4595,18 +4576,21 @@ window.__ModuleLoader__.load({
4595
4576
  ] }),
4596
4577
  local ? (0, jsx.jsxs)("section", { className: "dac-update-manual", children: [
4597
4578
  (0, jsx.jsx)("p", { children: zh ? "当前连接本地源码,不会被线上更新替换。修改后重启 DSH 即可加载;在另一端接入时,粘贴下面目录到「添加插件」。" : "This local checkout is protected from registry replacement. Restart DSH after editing. To connect it in another host, paste this directory into Add plugin." }),
4598
- codeBlock(info.localPath, zh ? "复制本地路径" : "Copy local path", "path"),
4579
+ codeBlock(info.localPath, zh ? "复制本地路径" : "Copy local path"),
4599
4580
  ] }) : (0, jsx.jsxs)("section", { className: "dac-update-manual", children: [
4600
4581
  (0, jsx.jsx)("p", { children: info?.source === "external" ? (zh ? "当前由外部来源安装,请按原来源更新。以下信息可用于在其他环境安装公开版本。" : "This plugin uses an external source; update from that source. Use the information below to install a public release elsewhere.") : info?.canInstall ? (zh ? "点击「安装更新」由官方插件管理器检查兼容性并替换当前插件。更新期间本页可能关闭,完成后重新打开归档管理确认版本;需要重启时会明确提示。" : "Install update lets the official plugin manager check compatibility and replace this plugin. This page may close during replacement. Reopen Archive Management to verify the version. A required restart is reported explicitly.") : (zh ? "请前往官方插件页,找到归档管理,在版本区域更新;旧宿主要求重新安装时,按页面提示操作。下方包名也可用于在其他环境添加插件。" : "Find Archive Management on the official Plugins page and update from its Versions section. Follow reinstall instructions on older hosts. The package below can also be added in another host." ) }),
4601
- codeBlock(info?.packageSpec ?? "dsh-archived-chats@latest", zh ? "复制安装信息" : "Copy package", "package"),
4582
+ codeBlock(info?.packageSpec ?? "dsh-archived-chats@latest", zh ? "复制包名与版本" : "Copy package and version"),
4602
4583
  info?.command && (0, jsx.jsxs)("details", { className: "dac-update-terminal", children: [
4603
4584
  (0, jsx.jsx)("summary", { children: zh ? "终端更新命令" : "Terminal update command" }),
4604
4585
  (0, jsx.jsx)("p", { children: zh ? `也可在运行 DSH 的电脑${info.environment === "desktop" ? "完全退出桌面端后" : "退出当前 DSH 后"}执行以下命令。` : "Alternatively, quit this DSH host and run this command on the same computer." }),
4605
- codeBlock(info.command, zh ? "复制更新命令" : "Copy update command", "command"),
4586
+ codeBlock(info.command, zh ? "复制更新命令" : "Copy update command"),
4606
4587
  info.environment === "desktop" && (0, jsx.jsx)("p", { children: zh ? "命令使用当前桌面端自带的 dsh。" : "This command uses the current Desktop’s bundled dsh." }),
4607
4588
  ] }),
4608
4589
  ] }),
4609
- (error || copied === "failed") && (0, jsx.jsx)("p", { role: "alert", className: "dac-update-error", children: error || (zh ? "复制失败,请选中文本手动复制。" : "Copy failed. Select the text and copy it manually.") }),
4590
+ copyResult?.status === "success" && (previewPrimitives.Toast
4591
+ ? (0, jsx.jsx)(previewPrimitives.Toast, { text: zh ? "复制成功" : "Copied", tone: "success", holdMs: 2000, onDone: dismissCopy }, copyResult.sequence)
4592
+ : (0, jsx.jsx)("p", { role: "status", children: zh ? "复制成功" : "Copied" })),
4593
+ (error || copyResult?.status === "failed") && (0, jsx.jsx)("p", { role: "alert", className: "dac-update-error", children: error || (zh ? "复制失败,请选中文本手动复制。" : "Copy failed. Select the text and copy it manually.") }),
4610
4594
  (0, jsx.jsx)("p", { className: "dac-update-privacy", children: zh ? "自动检查只读取公开 npm 版本,不上传会话;不会自动安装或重启。" : "Automatic checks read public npm metadata only, without sending chats. They never install or restart automatically." }),
4611
4595
  ] });
4612
4596
  return (0, jsx.jsx)(ConfirmDialog, { title: zh ? "插件更新" : "Plugin update", body, confirmLabel: installing ? (zh ? "正在安装…" : "Installing…") : (zh ? "安装更新" : "Install update"), cancelLabel: zh ? "关闭" : "Close",
package/lib/deletion.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { createHash, randomUUID } from 'node:crypto';
2
2
  import { normalizeSessionId, resolveSubagentDescendants } from './session-graph.js';
3
3
 
4
- export class DeletionError extends Error {
4
+ class DeletionError extends Error {
5
5
  constructor(code, message, status = 500, details = undefined) {
6
6
  super(message);
7
7
  this.name = 'DeletionError';
package/package.json CHANGED
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "name": "dsh-archived-chats",
3
- "version": "2.0.3",
3
+ "version": "2.0.4",
4
4
  "description": "查看、搜索和管理会话归档,支持工作区批量归档、标签备注、ZIP 备份和会话谱系。",
5
5
  "license": "MIT",
6
- "author": "Ultronen",
6
+ "author": "Ultroncn",
7
7
  "repository": {
8
8
  "type": "git",
9
9
  "url": "git+https://github.com/Ultroncn/dsh-archived-chats.git"