@goodandready/dsh-time-machine 0.1.1 → 0.1.3

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/README.md CHANGED
@@ -1,20 +1,119 @@
1
- # dsh-time-machine
1
+ # 📦 @goodandready/dsh-time-machine
2
2
 
3
- DSH plugin for smart checkpoints, workspace safety guards, and instant rollback for [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness).
3
+ <div align="center">
4
4
 
5
- ## Tools
6
- - `time_machine_checkpoint_create`
7
- - `time_machine_checkpoint_list`
8
- - `time_machine_checkpoint_rollback`
9
- - `time_machine_diff`
5
+ <h3>Automated Shadow Git Snapshots, Workspace Time-Travel & Instant Rollback for DeepSeek Harness</h3>
10
6
 
11
- ## Settings
12
- Located in **Settings -> Plugins -> Time Machine & Checkpoints**:
13
- - `autoSnapshotEnabled`: Take automatic checkpoints before file changes (default: `true`)
14
- - `maxSnapshots`: Maximum snapshots in session history (default: `20`)
15
- - `autoHealPrompt`: Prompt recovery on command failure (default: `true`)
7
+ <p align="center">
8
+ <a href="https://www.npmjs.com/package/@goodandready/dsh-time-machine"><img src="https://img.shields.io/npm/v/@goodandready/dsh-time-machine.svg?style=for-the-badge&color=6366f1&labelColor=1e1b4b" alt="npm version"></a>
9
+ <a href="LICENSE"><img src="https://img.shields.io/badge/License-MIT-10b981.svg?style=for-the-badge&color=10b981&labelColor=064e3b" alt="license"></a>
10
+ <a href="https://github.com/topics/dsh-plugin"><img src="https://img.shields.io/badge/DSH-Plugin-8b5cf6.svg?style=for-the-badge&labelColor=2e1065" alt="DSH Plugin"></a>
11
+ <a href="https://nodejs.org"><img src="https://img.shields.io/badge/Node-20%2B-f59e0b.svg?style=for-the-badge&labelColor=451a03" alt="Node version"></a>
12
+ </p>
13
+
14
+ <!-- Showcase Catalog Button -->
15
+ <p align="center">
16
+ <a href="https://goodandready.app/"><img src="https://img.shields.io/badge/All_Author_Projects-goodandready.app-ff4500.svg?style=for-the-badge&logo=rocket&logoColor=white&labelColor=1a1a2e" alt="All Author Projects"></a>
17
+ </p>
18
+
19
+ <p align="center">
20
+ <a href="README.md"><b>🇬🇧 English</b></a> •
21
+ <a href="README.ru.md"><b>🇷🇺 Русский</b></a> •
22
+ <a href="README.zh.md"><b>🇨🇳 中文说明</b></a>
23
+ </p>
24
+
25
+ </div>
26
+
27
+ ---
28
+
29
+ ## ⚡ Overview
30
+
31
+ **`dsh-time-machine`** provides an automated safety net and instantaneous rollback engine for **DeepSeek Harness** workspaces.
32
+
33
+ Autonomous agents frequently execute complex multi-file refactorings, run mutating shell commands, or install dependencies. When an unexpected regression or broken state occurs, manual git reversion can be messy and risk losing untracked files or user git history.
34
+
35
+ `dsh-time-machine` creates lightweight **shadow git snapshots** in the background without modifying user git commits or branches, providing **1-click interactive rollback, visual file diffs, and automatic recovery prompts on command failure**.
36
+
37
+ ```mermaid
38
+ graph LR
39
+ subgraph AgentAction [DSH Agent Mutating Operations]
40
+ Agent[🤖 Agent: Edits Files / Runs Commands] --> Trigger{Pre-Action Hook}
41
+ end
42
+
43
+ subgraph TimeMachine [dsh-time-machine Core Engine]
44
+ Trigger --> ShadowGit[Shadow Git Snapshot Engine]
45
+ ShadowGit --> Snapshots[(In-Memory Checkpoint Timeline)]
46
+ Snapshots --> DiffEngine[Visual Workspace Diff Calculator]
47
+ end
48
+
49
+ subgraph SafetyNet [Restoration & Web UI Studio]
50
+ DiffEngine --> Sidebar[🕒 Time Machine Sidebar Tab]
51
+ Snapshots --> Rollback[⏪ 1-Click Instant Workspace Rollback]
52
+ Rollback --> CleanState[Restored Pristine Working Tree]
53
+ Trigger -.->|Command Error| AutoHeal[🩹 Auto-Heal Rollback Prompt]
54
+ end
55
+
56
+ style AgentAction fill:#1e1e2e,stroke:#89b4fa,stroke-width:2px,color:#cdd6f4
57
+ style TimeMachine fill:#181825,stroke:#cba6f7,stroke-width:2px,color:#cdd6f4
58
+ style SafetyNet fill:#11111b,stroke:#a6e3a1,stroke-width:2px,color:#cdd6f4
59
+ ```
60
+
61
+ ---
62
+
63
+ ## ✨ Key Capabilities & Studio Features
64
+
65
+ ### 1. 🛡️ Non-Intrusive Shadow Git Snapshots (`lib/snapshot.js`)
66
+ * Captures complete working tree state, staged files, and untracked assets using shadow git refs;
67
+ * Zero pollution of user git commit history, tags, or active branches;
68
+ * Retains a rolling history of the last $N$ checkpoints with human-readable labels and timestamps.
69
+
70
+ ### 2. ⏪ Instant Safe Rollback (`time_machine_checkpoint_rollback`)
71
+ * Restores the entire workspace or specific files to any previous checkpoint in milliseconds;
72
+ * Can be triggered programmatically by the agent or interactively by the user in the UI.
73
+
74
+ ### 3. 🔍 Visual Snapshot Diff Inspector (`time_machine_diff`)
75
+ * Computes file-by-file visual diffs comparing current workspace state against any checkpoint;
76
+ * Highlights added, deleted, and modified lines with clean line numbers.
77
+
78
+ ### 4. 🕒 Interactive Sidebar Timeline (`lib/client.js`)
79
+ * Seamlessly integrates into DSH Web UI sidebar;
80
+ * Displays a chronological timeline of all session checkpoints with file change counters and 1-click "Restore Checkpoint" and "Inspect Diff" buttons.
81
+
82
+ ### 5. 🩹 Auto-Heal on Command Failure
83
+ * Automatically prompts the user/agent with a 1-click restore proposal when a destructive command exits with an error.
84
+
85
+ ---
86
+
87
+ ## 🛠️ Agent Tools Reference (4 Tools)
88
+
89
+ | Tool Name | Parameters | Description |
90
+ |---|---|---|
91
+ | `time_machine_checkpoint_create` | `label?: string` | Creates a shadow git workspace checkpoint before risky edits or operations |
92
+ | `time_machine_checkpoint_list` | *(none)* | Lists all recent workspace checkpoints newest first |
93
+ | `time_machine_checkpoint_rollback` | `id: string` | Reverts the entire workspace back to the specified checkpoint state |
94
+ | `time_machine_diff` | `id?: string` | Returns unified file diff between current workspace and target checkpoint |
95
+
96
+ ---
97
+
98
+ ## 📦 Quick Installation
16
99
 
17
- ## Verification
18
100
  ```bash
19
- npm test
101
+ dsh plugin --profile web add @goodandready/dsh-time-machine
102
+ ```
103
+
104
+ ---
105
+
106
+ ## ⚙️ Configuration Reference (`settings.yaml`)
107
+
108
+ ```yaml
109
+ dsh-time-machine:
110
+ autoSnapshotEnabled: true # Automatically take checkpoints before file modifications
111
+ maxSnapshots: 20 # Maximum rolling checkpoints retained in memory
112
+ autoHealPrompt: true # Prompt for rollback when a command fails
20
113
  ```
114
+
115
+ ---
116
+
117
+ ## 📄 License
118
+
119
+ MIT © [GooDAnDReaDY](https://github.com/GooDAnDReaDY)
package/README.ru.md ADDED
@@ -0,0 +1,115 @@
1
+ # 📦 @goodandready/dsh-time-machine
2
+
3
+ <div align="center">
4
+
5
+ <h3>Автоматические теневые снапшоты, путешествие во времени по кодовой базе и мгновенный откат изменений для DeepSeek Harness</h3>
6
+
7
+ <p align="center">
8
+ <a href="https://www.npmjs.com/package/@goodandready/dsh-time-machine"><img src="https://img.shields.io/npm/v/@goodandready/dsh-time-machine.svg?style=for-the-badge&color=6366f1&labelColor=1e1b4b" alt="npm version"></a>
9
+ <a href="LICENSE"><img src="https://img.shields.io/badge/License-MIT-10b981.svg?style=for-the-badge&color=10b981&labelColor=064e3b" alt="license"></a>
10
+ <a href="https://github.com/topics/dsh-plugin"><img src="https://img.shields.io/badge/DSH-Plugin-8b5cf6.svg?style=for-the-badge&labelColor=2e1065" alt="DSH Plugin"></a>
11
+ <a href="https://nodejs.org"><img src="https://img.shields.io/badge/Node-20%2B-f59e0b.svg?style=for-the-badge&labelColor=451a03" alt="Node version"></a>
12
+ </p>
13
+
14
+ <!-- Обязательная кнопка перехода на витрину всех проектов -->
15
+ <p align="center">
16
+ <a href="https://goodandready.app/"><img src="https://img.shields.io/badge/Все_проекты_автора-goodandready.app-ff4500.svg?style=for-the-badge&logo=rocket&logoColor=white&labelColor=1a1a2e" alt="Все проекты автора"></a>
17
+ </p>
18
+
19
+ <p align="center">
20
+ <a href="README.md"><b>🇬🇧 English</b></a> •
21
+ <a href="README.ru.md"><b>🇷🇺 Русский</b></a> •
22
+ <a href="README.zh.md"><b>🇨🇳 中文说明</b></a>
23
+ </p>
24
+
25
+ </div>
26
+
27
+ ---
28
+
29
+ ## ⚡ Обзор
30
+
31
+ **`dsh-time-machine`** предоставляет автоматическую систему безопасности и мгновенного отката для рабочего пространства агентов **DeepSeek Harness**.
32
+
33
+ Автономные агенты часто выполняют сложные рефакторинги множества файлов, выполняют терминальные команды или устанавливают пакеты. В случае ошибок или поломки кода ручной откат через git может быть затруднён и грозит потерей неотслеживаемых файлов или порчей истории коммитов.
34
+
35
+ `dsh-time-machine` создаёт легковесные **теневые снапшоты (shadow git snapshots)** в фоновом режиме без изменения пользовательских веток и коммитов, обеспечивая **откат в 1 клик, визуальный просмотр Diff и предложение авто-восстановления при сбоях**.
36
+
37
+ ```mermaid
38
+ graph LR
39
+ subgraph AgentAction [Действия агента DSH]
40
+ Agent[🤖 Агент: Правка файлов / Запуск команд] --> Trigger{Хук перед действием}
41
+ end
42
+
43
+ subgraph TimeMachine [Ядро dsh-time-machine]
44
+ Trigger --> ShadowGit[Движок теневых Git-снапшотов]
45
+ ShadowGit --> Snapshots[(Хронологическая лента чекпоинтов)]
46
+ Snapshots --> DiffEngine[Калькулятор визуальных Diff]
47
+ end
48
+
49
+ subgraph SafetyNet [Безопасность и Web UI]
50
+ DiffEngine --> Sidebar[🕒 Вкладка Time Machine в сайдбаре]
51
+ Snapshots --> Rollback[⏪ Мгновенный откат рабочего каталога]
52
+ Rollback --> CleanState[Восстановленное чистое состояние]
53
+ Trigger -.->|Ошибка команды| AutoHeal[🩹 Предложение авто-отката]
54
+ end
55
+
56
+ style AgentAction fill:#1e1e2e,stroke:#89b4fa,stroke-width:2px,color:#cdd6f4
57
+ style TimeMachine fill:#181825,stroke:#cba6f7,stroke-width:2px,color:#cdd6f4
58
+ style SafetyNet fill:#11111b,stroke:#a6e3a1,stroke-width:2px,color:#cdd6f4
59
+ ```
60
+
61
+ ---
62
+
63
+ ## ✨ Ключевые возможности
64
+
65
+ ### 1. 🛡️ Теневые снапшоты без засорения Git (`lib/snapshot.js`)
66
+ * Фиксирует всё рабочее дерево, индексированные и новые файлы через изолированные shadow-ссылки Git;
67
+ * Не создаёт лишних коммитов в пользовательской истории и не переключает активные ветки;
68
+ * Хранит скользящую историю последних $N$ чекпоинтов с понятными метками и метками времени.
69
+
70
+ ### 2. ⏪ Мгновенный безопасный откат (`time_machine_checkpoint_rollback`)
71
+ * Возвращает всё рабочее пространство к любому предыдущему состоянию за миллисекунды;
72
+ * Может вызываться как программно агентом, так и пользователем через кнопку в интерфейсе.
73
+
74
+ ### 3. 🔍 Визуальный инспектор Diff (`time_machine_diff`)
75
+ * Сравнивает текущие файлы со снапшотом и формирует наглядный пофайловый Diff.
76
+
77
+ ### 4. 🕒 Интерактивная хроника в сайдбаре (`lib/client.js`)
78
+ * Встраивается в боковую панель Web UI DSH;
79
+ * Показывает список чекпоинтов со счётчиками изменённых файлов и кнопками «Откатить» и «Сравнить Diff».
80
+
81
+ ---
82
+
83
+ ## 🛠️ Инструменты агента (4 инструмента)
84
+
85
+ | Имя инструмента | Параметры | Описание |
86
+ |---|---|---|
87
+ | `time_machine_checkpoint_create` | `label?: string` | Создаёт теневой чекпоинт перед рискованными правками |
88
+ | `time_machine_checkpoint_list` | *(нет)* | Возвращает список недавних снапшотов от новых к старым |
89
+ | `time_machine_checkpoint_rollback` | `id: string` | Откатывает файлы рабочего пространства к указанному снапшоту |
90
+ | `time_machine_diff` | `id?: string` | Возвращает пофайловый Diff между текущим состоянием и чекпоинтом |
91
+
92
+ ---
93
+
94
+ ## 📦 Быстрая установка
95
+
96
+ ```bash
97
+ dsh plugin --profile web add @goodandready/dsh-time-machine
98
+ ```
99
+
100
+ ---
101
+
102
+ ## ⚙️ Пример конфигурации (`settings.yaml`)
103
+
104
+ ```yaml
105
+ dsh-time-machine:
106
+ autoSnapshotEnabled: true # Создавать чекпоинты перед изменением файлов
107
+ maxSnapshots: 20 # Максимальное количество чекпоинтов в памяти
108
+ autoHealPrompt: true # Предлагать откат при падении терминальной команды
109
+ ```
110
+
111
+ ---
112
+
113
+ ## 📄 Лицензия
114
+
115
+ MIT © [GooDAnDReaDY](https://github.com/GooDAnDReaDY)
package/README.zh.md ADDED
@@ -0,0 +1,73 @@
1
+ # 📦 @goodandready/dsh-time-machine
2
+
3
+ <div align="center">
4
+
5
+ <h3>DeepSeek Harness 自动化影子 Git 快照、工作区时光机与一键即时回滚插件</h3>
6
+
7
+ <p align="center">
8
+ <a href="https://www.npmjs.com/package/@goodandready/dsh-time-machine"><img src="https://img.shields.io/npm/v/@goodandready/dsh-time-machine.svg?style=for-the-badge&color=6366f1&labelColor=1e1b4b" alt="npm version"></a>
9
+ <a href="LICENSE"><img src="https://img.shields.io/badge/License-MIT-10b981.svg?style=for-the-badge&color=10b981&labelColor=064e3b" alt="license"></a>
10
+ <a href="https://github.com/topics/dsh-plugin"><img src="https://img.shields.io/badge/DSH-Plugin-8b5cf6.svg?style=for-the-badge&labelColor=2e1065" alt="DSH Plugin"></a>
11
+ <a href="https://nodejs.org"><img src="https://img.shields.io/badge/Node-20%2B-f59e0b.svg?style=for-the-badge&labelColor=451a03" alt="Node version"></a>
12
+ </p>
13
+
14
+ <!-- 官方展示中心跳转按钮 -->
15
+ <p align="center">
16
+ <a href="https://goodandready.app/"><img src="https://img.shields.io/badge/作者全部项目-goodandready.app-ff4500.svg?style=for-the-badge&logo=rocket&logoColor=white&labelColor=1a1a2e" alt="作者全部项目"></a>
17
+ </p>
18
+
19
+ <p align="center">
20
+ <a href="README.md"><b>🇬🇧 English</b></a> •
21
+ <a href="README.ru.md"><b>🇷🇺 Русский</b></a> •
22
+ <a href="README.zh.md"><b>🇨🇳 中文说明</b></a>
23
+ </p>
24
+
25
+ </div>
26
+
27
+ ---
28
+
29
+ ## ⚡ 插件概览
30
+
31
+ **`dsh-time-machine`** 为 **DeepSeek Harness** 智能体提供全自动工作区安全护栏与即时状态回滚引擎。
32
+
33
+ 智能体在执行多文件批量重构、依赖安装或高危终端命令时,一旦发生代码损坏或逻辑回归,手动 Git 回退不仅繁琐,还容易丢失未跟踪的新建文件。
34
+
35
+ 本插件在后台利用**影子 Git 快照技术(Shadow Git Snapshots)**自动捕获工作区状态,不污染用户 Git 提交树与分支,支持**一键即时回退、可视化文件 Diff 对比以及命令失败时的主动自愈挽救**。
36
+
37
+ ```mermaid
38
+ graph LR
39
+ subgraph AgentAction [智能体执行操作]
40
+ Agent[🤖 智能体: 批量修改文件 / 执行终端命令] --> Trigger{执行前置拦截}
41
+ end
42
+
43
+ subgraph TimeMachine [dsh-time-machine 引擎核心]
44
+ Trigger --> ShadowGit[影子 Git 快照引擎]
45
+ ShadowGit --> Snapshots[(时序检查点历史队列)]
46
+ Snapshots --> DiffEngine[可视化工作区 Diff 计算器]
47
+ end
48
+
49
+ subgraph SafetyNet [安全防护与界面集成]
50
+ DiffEngine --> Sidebar[🕒 侧边栏 Time Machine 时间轴]
51
+ Snapshots --> Rollback[⏪ 一键毫秒级即时回滚]
52
+ Rollback --> CleanState[恢复纯净安全状态]
53
+ Trigger -.->|命令报错| AutoHeal[🩹 自动弹出回滚修复建议]
54
+ end
55
+
56
+ style AgentAction fill:#1e1e2e,stroke:#89b4fa,stroke-width:2px,color:#cdd6f4
57
+ style TimeMachine fill:#181825,stroke:#cba6f7,stroke-width:2px,color:#cdd6f4
58
+ style SafetyNet fill:#11111b,stroke:#a6e3a1,stroke-width:2px,color:#cdd6f4
59
+ ```
60
+
61
+ ---
62
+
63
+ ## 📦 安装指南
64
+
65
+ ```bash
66
+ dsh plugin --profile web add @goodandready/dsh-time-machine
67
+ ```
68
+
69
+ ---
70
+
71
+ ## 📄 开源协议
72
+
73
+ MIT © [GooDAnDReaDY](https://github.com/GooDAnDReaDY)
package/lib/client.js CHANGED
@@ -371,17 +371,84 @@ window.__ModuleLoader__.load({
371
371
  module.exports.apply = function apply(ctx) {
372
372
  ensureStyles();
373
373
  try { ctx.locale && ctx.locale.register && ctx.locale.register(NS, { en, ru }); } catch {}
374
- const t = (ctx.locale && ctx.locale.bind) ? ctx.locale.bind(NS) : (k) => k;
375
- try {
376
- ctx.slots.register({ name: 'settings.plugin.item', key: NS, locale: NS, inject: () => ({ ctx }) }, PluginCard);
377
- } catch (e) {
374
+ // declaration-safe settings registration (alpha2 SlotCore requires inject)
375
+ let settingsRegistered = false;
376
+ const doRegisterSettings = () => {
377
+ if (settingsRegistered) return;
378
+ try {
379
+ ctx.slots.register({ name: 'settings.plugin.item', key: NS, locale: NS, inject: () => ({ ctx }) }, PluginCard);
380
+ settingsRegistered = true;
381
+ } catch (e) {
382
+ const msg = String(e && e.message || e);
383
+ if (msg.includes('not declared') || msg.includes('is not declared')) {
384
+ // fallback to section if plugin.item not declared in this host build
385
+ try {
386
+ const t = (ctx.locale && ctx.locale.bind) ? ctx.locale.bind(NS) : (k) => k;
387
+ ctx.slots.register({ name: 'settings.section', id: NS, order: 30, label: () => t('title'), inject: () => ({ ctx }) }, PluginCard);
388
+ settingsRegistered = true;
389
+ } catch (e2) {
390
+ console.error('[dsh-time-machine] settings registration failed', e2);
391
+ }
392
+ } else {
393
+ console.error('[dsh-time-machine] settings.plugin.item registration failed', e);
394
+ }
395
+ }
396
+ };
397
+ // wait for host declaration; if inject not available, try direct (older DSH)
398
+ if (ctx.slots && typeof ctx.slots.inject === 'function') {
378
399
  try {
379
- ctx.slots.register({ name: 'settings.section', id: NS, order: 30, label: () => t('title'), inject: () => ({ ctx }) }, PluginCard);
380
- } catch {}
400
+ ctx.slots.inject('settings.plugin.item', () => {
401
+ doRegisterSettings();
402
+ });
403
+ // also handle delayed BetterSidebar via inject
404
+ } catch (e) {
405
+ console.error('[dsh-time-machine] slots.inject failed', e);
406
+ doRegisterSettings();
407
+ }
408
+ } else {
409
+ doRegisterSettings();
410
+ }
411
+ // BetterSidebar: single declaration-aware path via ctx.inject
412
+ let tabRegistered = false;
413
+ const doRegisterTab = (bctx) => {
414
+ if (tabRegistered) return;
415
+ const svc = (bctx && bctx.betterSidebar) || (bctx && bctx.get && (()=>{ try{return bctx.get('betterSidebar')}catch{return null}})()) || ctx.betterSidebar;
416
+ if (!svc || typeof svc.registerTab !== 'function') return;
417
+ try {
418
+ svc.registerTab({
419
+ id: 'time-machine',
420
+ title: () => {
421
+ const a = ctx.locale && ctx.locale.getSnapshot && ctx.locale.getSnapshot().active || 'en';
422
+ return a.startsWith('ru') ? 'Машина времени' : 'Time Machine';
423
+ },
424
+ order: 30,
425
+ single: true,
426
+ icon: (size) => React.createElement('svg', { width: size||16, height: size||16, viewBox: '0 0 24 24', fill: 'none', stroke: 'currentColor', strokeWidth: '2', strokeLinecap: 'round', strokeLinejoin: 'round' },
427
+ React.createElement('circle', { cx:12, cy:12, r:10 }),
428
+ React.createElement('polyline', { points:'12 6 12 12 16 14' })
429
+ ),
430
+ component: (p) => React.createElement(TimeMachineTab, { ctx, ...p })
431
+ });
432
+ tabRegistered = true;
433
+ } catch (e) {
434
+ console.error('[dsh-time-machine] betterSidebar registerTab failed', e);
435
+ }
436
+ };
437
+ if (ctx.inject) {
438
+ try {
439
+ ctx.inject(['betterSidebar'], (bctx) => {
440
+ doRegisterTab(bctx);
441
+ return () => {};
442
+ });
443
+ } catch (e) {
444
+ // betterSidebar is optional, do not hide loader failure
445
+ if (String(e && e.message || '').includes('not declared')) {
446
+ // service not declared in this host build - silently skip tab
447
+ } else {
448
+ console.error('[dsh-time-machine] betterSidebar inject failed', e);
449
+ }
450
+ }
381
451
  }
382
- // betterSidebar tab — immediate + inject fallback
383
- registerBetterSidebar(ctx);
384
- try { ctx.inject(['betterSidebar'], () => { registerBetterSidebar(ctx); }); } catch {}
385
452
  };
386
453
  return module.exports;
387
454
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@goodandready/dsh-time-machine",
3
- "version": "0.1.1",
3
+ "version": "0.1.3",
4
4
  "description": "DSH plugin for smart checkpoints, workspace safety guards, and instant rollback",
5
5
  "type": "module",
6
6
  "main": "lib/index.js",
@@ -43,7 +43,6 @@
43
43
  "client": {
44
44
  "platform": "web",
45
45
  "inject": [
46
- "@deepseek-ai/dsh-client-runtime",
47
46
  "@deepseek-ai/dsh-client-ui-slots"
48
47
  ]
49
48
  }