@supertiny99/dsh-plugin-guardian 0.0.0-stage → 0.1.1

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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 supertiny99
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,3 +1,75 @@
1
- # Temporary Holding Version
1
+ # @supertiny99/dsh-plugin-guardian
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ DeepSeek Harness(桌面版)插件管家与防灾恢复工作台:解决第三方插件发生致命异常后宿主全盘禁用的痛点,提供自动健康快照、一键勾选恢复、配置挽回与跨平台桌面脱机应急恢复脚本。
4
+
5
+ ---
6
+
7
+ ## 解决的核心痛点
8
+
9
+ 在 DSH 开发或安装第三方插件时,若某个插件发生致命异常导致宿主启动崩溃,DSH 官方的致命错误恢复机制(`sanitizeProfile`)会一刀切**将所有第三方插件全部移出激活列表**,并将用户配置文件重命名为 `cordis.patch.yml.bak-<时间戳>`。
10
+
11
+ 这导致用户重启后:
12
+ 1. **记忆负担重**:必须回忆崩溃前到底开启了哪几个插件;
13
+ 2. **操作繁琐**:必须在插件列表里逐一翻找并手动重新点击开启;
14
+ 3. **二次闪退风险**:若不慎又开启了刚才引发崩溃的异常插件,会再次闪退;
15
+ 4. **配置丢失**:用户自定义的模型与参数配置被归档为 `.bak`,当前变为纯空配置。
16
+
17
+ ## 插件管家核心能力
18
+
19
+ 1. **自动健康快照**:
20
+ - 每次 DSH 正常启动及运行时,自动在本地维护健康快照(记录 `bundles` 顺序与完整配置);
21
+ - 内置智能防膨胀机制(最大保留 20 份自动轮转,单份仅约 1~14 KB,支持手动删除与一键清理)。
22
+ 2. **事故高亮预警与一键恢复**:
23
+ - 遭遇崩溃清空后,用户**只需在官方插件页开启【插件管家】这 1 个插件**;
24
+ - 进入插件管家面板,页面将弹出醒目告警横幅,列出被停用的全部插件清单;
25
+ - 支持**「一键全量恢复」**瞬间复原所有插件。
26
+ 3. **排除特定坏插件(隔离排错)**:
27
+ - 支持多选框取消勾选可疑插件,只恢复其余稳定插件,避免陷入死循环崩溃。
28
+ 4. **用户配置(.bak)智能挽回**:
29
+ - 自动扫描被官方重命名的 `cordis.patch.yml.bak` 文件,支持一键对比并覆盖还原。
30
+ 5. **跨平台脱机应急脚本(双击秒级恢复)**:
31
+ - 自动在 Profile 目录生成(并支持一键导出到桌面)免依赖的应急脚本:
32
+ - **Windows**:`restore-plugins.bat`(原生批处理)
33
+ - **macOS**:`restore-plugins.command`(原生终端脚本)
34
+ - DSH 彻底打不开时,直接在桌面双击该脚本,1 秒钟在后台脱机复原。
35
+
36
+ ---
37
+
38
+ ## 安装方式
39
+
40
+ 在 DSH 桌面版「设置/侧栏 → 插件 → 添加插件」,任选一种 spec 安装:
41
+
42
+ ### 1. npm 渠道(推荐)
43
+
44
+ ```
45
+ @supertiny99/dsh-plugin-guardian
46
+ ```
47
+
48
+ ### 2. GitHub 渠道(源码安装,tag 定版本)
49
+
50
+ ```
51
+ github:supertiny99/dsh-plugin-guardian#v0.1.1
52
+ ```
53
+
54
+ ### 3. 本地 tarball 离线安装
55
+
56
+ 下载 release 的 `.tgz` 包后,在输入框填写本地绝对路径:
57
+
58
+ ```
59
+ file:/你的绝对路径/supertiny99-dsh-plugin-guardian-0.1.1.tgz
60
+ ```
61
+
62
+ > **注意**:安装后请完全退出 DSH 桌面应用并重新打开(冷启动),左侧栏即可出现 **🛡️ 插件管家** 图标。
63
+
64
+ ---
65
+
66
+ ## 技术规范与安全性
67
+
68
+ - **零外呼、零第三方重依赖**:纯本地读写 `~/.dsh/profiles/desktop/` 相关配置文件;
69
+ - **原子级写保护**:修改 `package.json` 与 `cordis.patch.yml` 均采用临时文件重命名(atomic rename),杜绝半写损坏;
70
+ - **UI 规范**:严格遵循 DSH `ui-style-guide`,样式全走 `--dsw-alias-*` token,全矢量 SVG 图标(无 emoji),完美自适应明暗主题;
71
+ - **构建规范**:产物仅约 20 KB,经本地沙箱 `selfcheck` 预检,确保不会拖垮宿主。
72
+
73
+ ## License
74
+
75
+ [MIT](LICENSE)
@@ -0,0 +1,4 @@
1
+ # @supertiny99/dsh-plugin-guardian bundle patch
2
+ - insert:
3
+ - id: plugin-guardian
4
+ name: '@supertiny99/dsh-plugin-guardian'
package/dist/client.js ADDED
@@ -0,0 +1,271 @@
1
+ window.__ModuleLoader__.load({id:"@supertiny99/dsh-plugin-guardian",factory:(require)=>{const module={exports:{}};const exports=module.exports;
2
+ var V=Object.create;var x=Object.defineProperty;var A=Object.getOwnPropertyDescriptor;var D=Object.getOwnPropertyNames;var J=Object.getPrototypeOf,K=Object.prototype.hasOwnProperty;var W=(e,n)=>{for(var r in n)x(e,r,{get:n[r],enumerable:!0})},I=(e,n,r,f)=>{if(n&&typeof n=="object"||typeof n=="function")for(let d of D(n))!K.call(e,d)&&d!==r&&x(e,d,{get:()=>n[d],enumerable:!(f=A(n,d))||f.enumerable});return e};var $=(e,n,r)=>(r=e!=null?V(J(e)):{},I(n||!e||!e.__esModule?x(r,"default",{value:e,enumerable:!0}):r,e)),E=e=>I(x({},"__esModule",{value:!0}),e);var rs={};W(rs,{apply:()=>ts,inject:()=>ns});module.exports=E(rs);var s=$(require("react"),1);var w=`/* plugin-guardian \xB7 \u6837\u5F0F\u8868 (token \u5316\uFF0C\u660E\u6697\u81EA\u9002\u5E94) */
3
+
4
+ .pg-container {
5
+ display: flex;
6
+ flex-direction: column;
7
+ height: 100%;
8
+ width: 100%;
9
+ background: var(--dsw-alias-surface-overlay, #ffffff);
10
+ color: var(--dsw-alias-text-primary, #1e293b);
11
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
12
+ box-sizing: border-box;
13
+ overflow-y: auto;
14
+ }
15
+
16
+ .pg-header {
17
+ display: flex;
18
+ align-items: center;
19
+ justify-content: space-between;
20
+ padding: 20px 28px;
21
+ border-bottom: 1px solid var(--dsw-alias-border-subtle, rgba(0, 0, 0, 0.08));
22
+ background: var(--dsw-alias-surface-raised, rgba(0, 0, 0, 0.02));
23
+ }
24
+
25
+ .pg-header-left {
26
+ display: flex;
27
+ align-items: center;
28
+ gap: 14px;
29
+ }
30
+
31
+ .pg-icon-badge {
32
+ width: 42px;
33
+ height: 42px;
34
+ border-radius: 10px;
35
+ background: var(--dsw-alias-accent-subtle, rgba(59, 130, 246, 0.12));
36
+ display: flex;
37
+ align-items: center;
38
+ justify-content: center;
39
+ font-size: 22px;
40
+ }
41
+
42
+ .pg-title-wrap h2 {
43
+ margin: 0;
44
+ font-size: 18px;
45
+ font-weight: 600;
46
+ color: var(--dsw-alias-text-primary, #0f172a);
47
+ }
48
+
49
+ .pg-title-wrap p {
50
+ margin: 3px 0 0 0;
51
+ font-size: 12px;
52
+ color: var(--dsw-alias-text-tertiary, #64748b);
53
+ }
54
+
55
+ .pg-actions {
56
+ display: flex;
57
+ align-items: center;
58
+ gap: 10px;
59
+ }
60
+
61
+ .pg-btn {
62
+ display: inline-flex;
63
+ align-items: center;
64
+ gap: 6px;
65
+ padding: 7px 14px;
66
+ font-size: 13px;
67
+ font-weight: 500;
68
+ border-radius: 6px;
69
+ border: 1px solid var(--dsw-alias-border-subtle, rgba(0, 0, 0, 0.15));
70
+ background: var(--dsw-alias-control-bg-neutral, #ffffff);
71
+ color: var(--dsw-alias-text-primary, #1e293b);
72
+ cursor: pointer;
73
+ transition: background-color 0.15s ease, border-color 0.15s ease;
74
+ }
75
+
76
+ .pg-btn:hover {
77
+ background: var(--dsw-alias-control-bg-neutral-hover, rgba(0, 0, 0, 0.05));
78
+ border-color: var(--dsw-alias-border-strong, rgba(0, 0, 0, 0.3));
79
+ }
80
+
81
+ .pg-btn:disabled {
82
+ opacity: 0.5;
83
+ cursor: not-allowed;
84
+ }
85
+
86
+ .pg-btn-primary {
87
+ background: var(--dsw-alias-accent-primary, #2563eb);
88
+ color: #ffffff;
89
+ border-color: transparent;
90
+ }
91
+
92
+ .pg-btn-primary:hover {
93
+ background: var(--dsw-alias-accent-hover, #1d4ed8);
94
+ }
95
+
96
+ .pg-btn-danger {
97
+ background: var(--dsw-alias-intent-danger, #ef4444);
98
+ color: #ffffff;
99
+ border-color: transparent;
100
+ }
101
+
102
+ .pg-content {
103
+ padding: 24px 28px;
104
+ display: flex;
105
+ flex-direction: column;
106
+ gap: 20px;
107
+ }
108
+
109
+ /* \u4E8B\u6545\u544A\u8B66\u6A2A\u5E45 (Incident Banner) */
110
+ .pg-incident-banner {
111
+ background: var(--dsw-alias-surface-sunken, rgba(239, 68, 68, 0.08));
112
+ border: 1px solid var(--dsw-alias-intent-danger, rgba(239, 68, 68, 0.4));
113
+ border-radius: 10px;
114
+ padding: 18px 22px;
115
+ display: flex;
116
+ flex-direction: column;
117
+ gap: 14px;
118
+ }
119
+
120
+ .pg-incident-header {
121
+ display: flex;
122
+ align-items: center;
123
+ gap: 12px;
124
+ }
125
+
126
+ .pg-incident-title {
127
+ font-size: 15px;
128
+ font-weight: 600;
129
+ color: var(--dsw-alias-intent-danger, #b91c1c);
130
+ }
131
+
132
+ .pg-incident-desc {
133
+ font-size: 13px;
134
+ color: var(--dsw-alias-text-secondary, #475569);
135
+ line-height: 1.5;
136
+ }
137
+
138
+ .pg-plugin-selection-box {
139
+ background: var(--dsw-alias-surface-overlay, #ffffff);
140
+ border: 1px solid var(--dsw-alias-border-subtle, rgba(0, 0, 0, 0.1));
141
+ border-radius: 8px;
142
+ padding: 12px 16px;
143
+ max-height: 240px;
144
+ overflow-y: auto;
145
+ display: flex;
146
+ flex-direction: column;
147
+ gap: 8px;
148
+ }
149
+
150
+ .pg-plugin-item {
151
+ display: flex;
152
+ align-items: center;
153
+ justify-content: space-between;
154
+ padding: 6px 8px;
155
+ border-radius: 6px;
156
+ cursor: pointer;
157
+ }
158
+
159
+ .pg-plugin-item:hover {
160
+ background: var(--dsw-alias-control-bg-neutral-hover, rgba(0, 0, 0, 0.04));
161
+ }
162
+
163
+ .pg-plugin-item-left {
164
+ display: flex;
165
+ align-items: center;
166
+ gap: 10px;
167
+ }
168
+
169
+ .pg-plugin-name {
170
+ font-size: 13px;
171
+ font-weight: 500;
172
+ color: var(--dsw-alias-text-primary, #0f172a);
173
+ }
174
+
175
+ .pg-plugin-tag {
176
+ font-size: 11px;
177
+ padding: 2px 6px;
178
+ border-radius: 4px;
179
+ background: var(--dsw-alias-accent-subtle, rgba(59, 130, 246, 0.1));
180
+ color: var(--dsw-alias-accent-primary, #2563eb);
181
+ }
182
+
183
+ .pg-card {
184
+ background: var(--dsw-alias-surface-raised, rgba(0, 0, 0, 0.02));
185
+ border: 1px solid var(--dsw-alias-border-subtle, rgba(0, 0, 0, 0.08));
186
+ border-radius: 10px;
187
+ padding: 18px 22px;
188
+ display: flex;
189
+ flex-direction: column;
190
+ gap: 12px;
191
+ }
192
+
193
+ .pg-card-title {
194
+ font-size: 14px;
195
+ font-weight: 600;
196
+ color: var(--dsw-alias-text-primary, #1e293b);
197
+ display: flex;
198
+ align-items: center;
199
+ justify-content: space-between;
200
+ }
201
+
202
+ .pg-dot {
203
+ display: inline-block;
204
+ width: 6px;
205
+ height: 6px;
206
+ border-radius: 50%;
207
+ background: var(--dsw-alias-intent-success, #16a34a);
208
+ }
209
+
210
+ .pg-incident-icon {
211
+ color: var(--dsw-alias-intent-danger, #ef4444);
212
+ display: flex;
213
+ align-items: center;
214
+ justify-content: center;
215
+ }
216
+
217
+ .pg-badge-healthy {
218
+ display: inline-flex;
219
+ align-items: center;
220
+ gap: 6px;
221
+ font-size: 12px;
222
+ font-weight: 500;
223
+ color: var(--dsw-alias-intent-success, #16a34a);
224
+ background: rgba(22, 163, 74, 0.1);
225
+ padding: 3px 10px;
226
+ border-radius: 12px;
227
+ }
228
+
229
+ .pg-list {
230
+ display: flex;
231
+ flex-direction: column;
232
+ gap: 6px;
233
+ }
234
+
235
+ .pg-row {
236
+ display: flex;
237
+ align-items: center;
238
+ justify-content: space-between;
239
+ padding: 8px 12px;
240
+ background: var(--dsw-alias-surface-overlay, #ffffff);
241
+ border: 1px solid var(--dsw-alias-border-subtle, rgba(0, 0, 0, 0.06));
242
+ border-radius: 6px;
243
+ font-size: 13px;
244
+ }
245
+
246
+ .pg-row-name {
247
+ font-weight: 500;
248
+ color: var(--dsw-alias-text-primary, #1e293b);
249
+ }
250
+
251
+ .pg-row-meta {
252
+ font-size: 12px;
253
+ color: var(--dsw-alias-text-tertiary, #94a3b8);
254
+ }
255
+
256
+ .pg-toast {
257
+ position: fixed;
258
+ bottom: 24px;
259
+ right: 28px;
260
+ background: var(--dsw-alias-text-primary, #0f172a);
261
+ color: var(--dsw-alias-surface-overlay, #ffffff);
262
+ padding: 10px 18px;
263
+ border-radius: 8px;
264
+ font-size: 13px;
265
+ font-weight: 500;
266
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
267
+ z-index: 9999;
268
+ transition: opacity 0.2s ease;
269
+ }
270
+ `;var l=({children:e,size:n=15,className:r=""})=>s.default.createElement("svg",{width:n,height:n,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",className:r,"aria-hidden":"true",style:{flexShrink:0}},e),U=({size:e=16})=>s.default.createElement(l,{size:e},s.default.createElement("path",{d:"M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z"})),_=({size:e=14})=>s.default.createElement(l,{size:e},s.default.createElement("path",{d:"M19 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11l5 5v11a2 2 0 0 1-2 2z"}),s.default.createElement("polyline",{points:"17 21 17 13 7 13 7 21"}),s.default.createElement("polyline",{points:"7 3 7 8 15 8"})),q=({size:e=14})=>s.default.createElement(l,{size:e},s.default.createElement("polyline",{points:"4 17 10 11 4 5"}),s.default.createElement("line",{x1:"12",y1:"19",x2:"20",y2:"19"})),Q=({size:e=14})=>s.default.createElement(l,{size:e},s.default.createElement("polyline",{points:"23 4 23 10 17 10"}),s.default.createElement("path",{d:"M20.49 15a9 9 0 1 1-2.12-9.36L23 10"})),X=({size:e=18})=>s.default.createElement(l,{size:e},s.default.createElement("path",{d:"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z"}),s.default.createElement("line",{x1:"12",y1:"9",x2:"12",y2:"13"}),s.default.createElement("line",{x1:"12",y1:"17",x2:"12.01",y2:"17"})),Y=({size:e=14})=>s.default.createElement(l,{size:e},s.default.createElement("polyline",{points:"1 4 1 10 7 10"}),s.default.createElement("path",{d:"M3.51 15a9 9 0 1 0 2.13-9.36L1 10"})),Z=({size:e=14})=>s.default.createElement(l,{size:e},s.default.createElement("polyline",{points:"20 6 9 17 4 12"})),C=({size:e=15})=>s.default.createElement(l,{size:e},s.default.createElement("line",{x1:"16.5",y1:"9.4",x2:"7.5",y2:"4.21"}),s.default.createElement("path",{d:"M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z"}),s.default.createElement("polyline",{points:"3.27 6.96 12 12.01 20.73 6.96"}),s.default.createElement("line",{x1:"12",y1:"22.08",x2:"12",y2:"12"})),R=({size:e=15})=>s.default.createElement(l,{size:e},s.default.createElement("path",{d:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"}),s.default.createElement("polyline",{points:"14 2 14 8 20 8"}),s.default.createElement("line",{x1:"16",y1:"13",x2:"8",y2:"13"}),s.default.createElement("line",{x1:"16",y1:"17",x2:"8",y2:"17"})),ss=({size:e=14})=>s.default.createElement(l,{size:e},s.default.createElement("circle",{cx:"12",cy:"12",r:"10"}),s.default.createElement("polyline",{points:"12 6 12 12 16 14"})),P=({size:e=14})=>s.default.createElement(l,{size:e},s.default.createElement("polyline",{points:"3 6 5 6 21 6"}),s.default.createElement("path",{d:"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2"})),es=({size:e=14})=>s.default.createElement(l,{size:e},s.default.createElement("path",{d:"M18.36 6.64a9 9 0 1 1-12.73 0"}),s.default.createElement("line",{x1:"12",y1:"2",x2:"12",y2:"12"}));function as(){let[e,n]=(0,s.useState)(null),[r,f]=(0,s.useState)(!0),[d,k]=(0,s.useState)(new Set),[h,j]=(0,s.useState)(!0),[z,S]=(0,s.useState)(null),[p,o]=(0,s.useState)(!1),t=a=>{S(a),setTimeout(()=>S(null),3500)},g=(0,s.useCallback)(async()=>{try{f(!0);let a=await fetch("/plugin-guardian/status");if(a.ok){let i=await a.json();n(i),i.disabledFromHealthy&&i.disabledFromHealthy.length>0&&k(new Set(i.disabledFromHealthy))}}catch(a){console.error("Failed to fetch guardian status:",a)}finally{f(!1)}},[]);(0,s.useEffect)(()=>{g()},[g]);let T=a=>{let i=new Set(d);i.has(a)?i.delete(a):i.add(a),k(i)},v=async(a,i)=>{if(a.length===0){t("\u672A\u9009\u62E9\u4EFB\u4F55\u9700\u8981\u6062\u590D\u7684\u63D2\u4EF6");return}try{o(!0);let N=await(await fetch("/plugin-guardian/restore",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({bundles:a,restorePatch:i})})).json();N.ok?(t("\u6062\u590D\u5199\u5165\u6210\u529F\uFF01\u8BF7\u5B8C\u5168\u9000\u51FA\u5E76\u91CD\u542F DSH \u751F\u6548"),await g()):t("\u6062\u590D\u5931\u8D25: "+(N.error||"\u672A\u77E5\u9519\u8BEF"))}catch(c){t("\u8BF7\u6C42\u5931\u8D25: "+c.message)}finally{o(!1)}},B=async()=>{try{o(!0),(await(await fetch("/plugin-guardian/snapshot",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({reason:"manual"})})).json()).ok&&(t("\u5DF2\u6210\u529F\u521B\u5EFA\u5F53\u524D\u5065\u5EB7\u5FEB\u7167\uFF01"),await g())}catch(a){t("\u521B\u5EFA\u5FEB\u7167\u5931\u8D25: "+a.message)}finally{o(!1)}},F=async a=>{try{o(!0);let c=await(await fetch("/plugin-guardian/restore-patch",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({fileName:a})})).json();c.ok?(t("\u914D\u7F6E\u5DF2\u6210\u529F\u633D\u56DE\uFF01"),await g()):t("\u633D\u56DE\u5931\u8D25: "+c.error)}catch(i){t("\u8BF7\u6C42\u5931\u8D25: "+i.message)}finally{o(!1)}},H=async()=>{try{o(!0);let i=await(await fetch("/plugin-guardian/export-script",{method:"POST"})).json();i.ok&&t(`\u5E94\u6025\u811A\u672C\u5DF2\u751F\u6210\u81F3\u684C\u9762 (${i.fileName})\uFF0C\u7CFB\u7EDF\u5DF2\u5B9A\u4F4D\u8BE5\u6587\u4EF6`)}catch(a){t("\u5BFC\u51FA\u5931\u8D25: "+a.message)}finally{o(!1)}},M=async a=>{try{o(!0);let c=await(await fetch("/plugin-guardian/delete-snapshot",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({id:a})})).json();c.ok?(t("\u5DF2\u5220\u9664\u5FEB\u7167 "+a),await g()):t("\u5220\u9664\u5931\u8D25: "+c.error)}catch(i){t("\u8BF7\u6C42\u5931\u8D25: "+i.message)}finally{o(!1)}},O=async()=>{try{o(!0);let i=await(await fetch("/plugin-guardian/clean-snapshots",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({keepCount:2})})).json();i.ok&&(t(`\u5DF2\u6E05\u7406 ${i.deletedCount} \u4EFD\u65E7\u5FEB\u7167\uFF0C\u4FDD\u7559\u4E86\u6700\u65B0 ${i.retained} \u4EFD`),await g())}catch(a){t("\u6E05\u7406\u5931\u8D25: "+a.message)}finally{o(!1)}};if(r&&!e)return s.default.createElement("div",{className:"pg-container"},s.default.createElement("style",null,w),s.default.createElement("div",{style:{padding:32,textAlign:"center",color:"var(--dsw-alias-text-tertiary)"}},"\u6B63\u5728\u8BFB\u53D6\u63D2\u4EF6\u72B6\u6001\u4E0E\u5FEB\u7167..."));let m=e?.isIncident,y=e?.disabledFromHealthy||[],u=e?.currentThirdParty||[],b=e?.inactiveInstalled||[],L=(()=>{if(e?.snapshotsTotalSize&&e.snapshotsTotalSize!=="0 KB")return e.snapshotsTotalSize;let a=e?.snapshotsCount||0;if(a===0)return"0 KB";let i=(e?.currentPatchSize||0)+1500;return(a*i/1024).toFixed(1)+" KB"})();return s.default.createElement("div",{className:"pg-container"},s.default.createElement("style",null,w),s.default.createElement("div",{className:"pg-header"},s.default.createElement("div",{className:"pg-header-left"},s.default.createElement("div",{className:"pg-icon-badge"},s.default.createElement(U,{size:22})),s.default.createElement("div",{className:"pg-title-wrap"},s.default.createElement("h2",null,"DSH \u63D2\u4EF6\u7BA1\u5BB6"),s.default.createElement("p",null,"Profile \u72B6\u6001\u5B88\u62A4 \xB7 \u81EA\u52A8\u5FEB\u7167 \xB7 \u4E8B\u6545\u4E00\u952E\u6062\u590D \xB7 \u8131\u673A\u5E94\u6025\u4FEE\u590D"))),s.default.createElement("div",{className:"pg-actions"},s.default.createElement("button",{className:"pg-btn",onClick:B,disabled:p,title:"\u624B\u52A8\u5C06\u5F53\u524D\u6240\u6709\u5F00\u542F\u7684\u63D2\u4EF6\u4E0E\u914D\u7F6E\u8BB0\u5F55\u4E3A\u65B0\u5FEB\u7167"},s.default.createElement(_,{size:14}),s.default.createElement("span",null,"\u4FDD\u5B58\u5FEB\u7167")),s.default.createElement("button",{className:"pg-btn",onClick:H,disabled:p,title:"\u5728\u684C\u9762\u751F\u6210\u4E00\u4E2A\u53CC\u51FB\u5373\u53EF\u6062\u590D\u7684\u811A\u672C\uFF0CDSH \u95EA\u9000\u4E0D\u5F00\u65F6\u53EF\u7528"},s.default.createElement(q,{size:14}),s.default.createElement("span",null,"\u5BFC\u51FA\u684C\u9762\u5E94\u6025\u811A\u672C")),s.default.createElement("button",{className:"pg-btn",onClick:g,disabled:p},s.default.createElement(Q,{size:14}),s.default.createElement("span",null,"\u5237\u65B0")))),s.default.createElement("div",{className:"pg-content"},m&&s.default.createElement("div",{className:"pg-incident-banner"},s.default.createElement("div",{className:"pg-incident-header"},s.default.createElement("div",{className:"pg-incident-icon"},s.default.createElement(X,{size:20})),s.default.createElement("div",{className:"pg-incident-title"},"\u68C0\u6D4B\u5230\u7CFB\u7EDF\u6B64\u524D\u6267\u884C\u4E86\u5168\u76D8\u7981\u7528\uFF0C\u53D1\u73B0\u7B2C\u4E09\u65B9\u63D2\u4EF6\u88AB\u505C\u7528")),s.default.createElement("div",{className:"pg-incident-desc"},"\u68C0\u6D4B\u5230\u4E0A\u4E00\u6B21\u5065\u5EB7\u5FEB\u7167\u4E2D\u6FC0\u6D3B\u7684 ",s.default.createElement("strong",null,y.length)," \u4E2A\u7B2C\u4E09\u65B9\u63D2\u4EF6\u5F53\u524D\u5DF2\u88AB\u5BBF\u4E3B\u79FB\u51FA\u6FC0\u6D3B\u5217\u8868\u3002 \u4F60\u53EF\u4EE5\u76F4\u63A5\u4E00\u952E\u5168\u90E8\u6062\u590D\uFF0C\u6216\u52FE\u9009\u6392\u9664\u521A\u624D\u5BFC\u81F4\u95EA\u9000\u7684\u53EF\u7591\u63D2\u4EF6\uFF1A"),s.default.createElement("div",{className:"pg-plugin-selection-box"},y.map(a=>{let i=d.has(a);return s.default.createElement("div",{key:a,className:"pg-plugin-item",onClick:()=>T(a)},s.default.createElement("div",{className:"pg-plugin-item-left"},s.default.createElement("input",{type:"checkbox",checked:i,onChange:()=>{},style:{cursor:"pointer"}}),s.default.createElement(C,{size:14}),s.default.createElement("span",{className:"pg-plugin-name"},a)),s.default.createElement("span",{className:"pg-plugin-tag"},"\u5F85\u6062\u590D"))})),e?.patchNeedsRecovery&&s.default.createElement("div",{style:{display:"flex",alignItems:"center",gap:8,fontSize:13}},s.default.createElement("input",{type:"checkbox",id:"restorePatchCheck",checked:h,onChange:a=>j(a.target.checked),style:{cursor:"pointer"}}),s.default.createElement("label",{htmlFor:"restorePatchCheck",style:{cursor:"pointer",color:"var(--dsw-alias-text-primary)"}},"\u540C\u65F6\u4ECE\u6700\u65B0\u7684 ",s.default.createElement("code",null,"cordis.patch.yml.bak")," \u4E2D\u627E\u56DE\u88AB\u6E05\u7A7A\u7684\u7528\u6237\u914D\u7F6E")),s.default.createElement("div",{style:{display:"flex",gap:10,marginTop:4}},s.default.createElement("button",{className:"pg-btn pg-btn-primary",onClick:()=>v(y,h),disabled:p},s.default.createElement(Y,{size:14}),s.default.createElement("span",null,"\u4E00\u952E\u5168\u91CF\u6062\u590D\u6240\u6709\u63D2\u4EF6 (",y.length,")")),s.default.createElement("button",{className:"pg-btn",onClick:()=>v(Array.from(d),h),disabled:p||d.size===0},s.default.createElement(Z,{size:14}),s.default.createElement("span",null,"\u6062\u590D\u52FE\u9009\u63D2\u4EF6 (",d.size,")")))),s.default.createElement("div",{className:"pg-card"},s.default.createElement("div",{className:"pg-card-title"},s.default.createElement("span",null,"\u5F53\u524D Profile \u63D2\u4EF6\u8FD0\u884C\u72B6\u6001"),s.default.createElement("span",{className:"pg-badge-healthy"},s.default.createElement("span",{className:"pg-dot"}),m?"\u5904\u4E8E\u6062\u590D\u6392\u67E5\u6A21\u5F0F":"\u5065\u5EB7\u8FD0\u884C\u4E2D")),s.default.createElement("div",{style:{fontSize:13,color:"var(--dsw-alias-text-secondary)",lineHeight:1.6}},"\u5F53\u524D\u5171\u6FC0\u6D3B ",s.default.createElement("strong",null,e?.currentBundles?.length||0)," \u4E2A\u7EC4\u5408\u884C\uFF08\u542B"," ",s.default.createElement("strong",null,u.length)," \u4E2A\u7B2C\u4E09\u65B9\u63D2\u4EF6\uFF09\u3002",e?.latestHealthy?s.default.createElement("span",null," \u6700\u8FD1\u5065\u5EB7\u5FEB\u7167\u5EFA\u7ACB\u4E8E\uFF1A",s.default.createElement("strong",null,e.latestHealthy.timeString),"\u3002"):s.default.createElement("span",null," \u5C1A\u672A\u5EFA\u7ACB\u5065\u5EB7\u57FA\u51C6\u5FEB\u7167\u3002")),s.default.createElement("div",{className:"pg-list",style:{marginTop:8}},u.map(a=>s.default.createElement("div",{key:a,className:"pg-row"},s.default.createElement("div",{style:{display:"flex",alignItems:"center",gap:8}},s.default.createElement(C,{size:15}),s.default.createElement("span",{className:"pg-row-name"},a)),s.default.createElement("span",{className:"pg-plugin-tag",style:{background:"rgba(22, 163, 74, 0.1)",color:"#16a34a"}},"\u5DF2\u6FC0\u6D3B"))),u.length===0&&s.default.createElement("div",{style:{padding:"12px 0",fontSize:13,color:"var(--dsw-alias-text-tertiary)"}},"\u6682\u65E0\u5DF2\u6FC0\u6D3B\u7684\u7B2C\u4E09\u65B9\u63D2\u4EF6\u3002"))),b.length>0&&!m&&s.default.createElement("div",{className:"pg-card"},s.default.createElement("div",{className:"pg-card-title"},s.default.createElement("span",null,"\u5DF2\u5728 dependencies \u5B89\u88C5\u3001\u4F46\u672A\u6FC0\u6D3B\u7684\u7B2C\u4E09\u65B9\u63D2\u4EF6 (",b.length,")")),s.default.createElement("div",{className:"pg-list"},b.map(a=>s.default.createElement("div",{key:a,className:"pg-row"},s.default.createElement("div",{style:{display:"flex",alignItems:"center",gap:8}},s.default.createElement(es,{size:14}),s.default.createElement("span",{className:"pg-row-name"},a)),s.default.createElement("button",{className:"pg-btn",style:{padding:"4px 10px",fontSize:12},onClick:()=>v([...u,a],!1),disabled:p},"\u4E00\u952E\u6FC0\u6D3B\u6B64\u63D2\u4EF6"))))),e?.bakFiles?.length>0&&s.default.createElement("div",{className:"pg-card"},s.default.createElement("div",{className:"pg-card-title"},s.default.createElement("span",null,"cordis.patch.yml \u914D\u7F6E\u5907\u4EFD\u5386\u53F2 (",e.bakFiles.length," \u4EFD)")),s.default.createElement("div",{style:{fontSize:12,color:"var(--dsw-alias-text-tertiary)"}},"\u5F53 DSH \u53D1\u751F\u5D29\u6E83\u6062\u590D\u65F6\uFF0C\u539F\u914D\u7F6E\u4F1A\u88AB\u91CD\u547D\u540D\u4E3A bak \u4FDD\u5B58\u3002\u4F60\u53EF\u4EE5\u968F\u65F6\u5BF9\u6BD4\u5E76\u627E\u56DE\u914D\u7F6E\uFF1A"),s.default.createElement("div",{className:"pg-list"},e.bakFiles.slice(0,3).map(a=>s.default.createElement("div",{key:a.fileName,className:"pg-row"},s.default.createElement("div",{style:{display:"flex",alignItems:"center",gap:10}},s.default.createElement(R,{size:16}),s.default.createElement("div",null,s.default.createElement("div",{className:"pg-row-name"},a.fileName),s.default.createElement("div",{className:"pg-row-meta"},"\u65F6\u95F4: ",a.mtimeString," \xB7 \u5927\u5C0F: ",a.size," \u5B57\u8282"))),s.default.createElement("button",{className:"pg-btn",style:{padding:"4px 10px",fontSize:12},onClick:()=>F(a.fileName),disabled:p},"\u4ECE\u5907\u4EFD\u8986\u76D6\u8FD8\u539F\u914D\u7F6E"))))),s.default.createElement("div",{className:"pg-card"},s.default.createElement("div",{className:"pg-card-title"},s.default.createElement("div",{style:{display:"flex",alignItems:"center",gap:10}},s.default.createElement("span",null,"\u5386\u53F2\u5065\u5EB7\u5FEB\u7167 (",e?.snapshotsCount||0,")"),s.default.createElement("span",{style:{fontSize:12,fontWeight:"normal",color:"var(--dsw-alias-text-tertiary)"}},"\u5360\u7528\u78C1\u76D8: ",L)),e?.snapshotsCount>2&&s.default.createElement("button",{className:"pg-btn",style:{padding:"3px 8px",fontSize:12},onClick:O,disabled:p,title:"\u4EC5\u4FDD\u7559\u6700\u8FD1 2 \u4EFD\u5FEB\u7167\uFF0C\u6E05\u7406\u66F4\u65E9\u7684\u5386\u53F2\u8BB0\u5F55"},s.default.createElement(P,{size:12}),s.default.createElement("span",null,"\u6E05\u7406\u65E7\u5FEB\u7167"))),s.default.createElement("div",{className:"pg-list"},e?.recentSnapshots?.map(a=>s.default.createElement("div",{key:a.id,className:"pg-row"},s.default.createElement("div",{style:{display:"flex",alignItems:"center",gap:10}},s.default.createElement(ss,{size:15}),s.default.createElement("div",null,s.default.createElement("div",{className:"pg-row-name",style:{display:"flex",alignItems:"center",gap:8}},s.default.createElement("span",null,a.timeString),s.default.createElement("span",{style:{fontSize:11,color:"var(--dsw-alias-text-tertiary)"}},"(",a.sizeText||(((e?.currentPatchSize||0)+1500)/1024).toFixed(1)+" KB",")")),s.default.createElement("div",{className:"pg-row-meta"},"\u539F\u56E0: ",a.reason==="startup_auto"?"\u542F\u52A8\u81EA\u52A8\u5FEB\u7167":a.reason==="manual"?"\u624B\u52A8\u5FEB\u7167":a.reason," \xB7 \u7B2C\u4E09\u65B9\u63D2\u4EF6\u6570: ",a.thirdPartyCount))),s.default.createElement("div",{style:{display:"flex",alignItems:"center",gap:8}},s.default.createElement("button",{className:"pg-btn",style:{padding:"4px 10px",fontSize:12},onClick:()=>v(a.thirdPartyBundles,!1),disabled:p||a.thirdPartyCount===0,title:"\u5C06\u63D2\u4EF6\u6FC0\u6D3B\u72B6\u6001\u56DE\u6EDA\u4E3A\u6B64\u5FEB\u7167"},"\u6062\u590D\u4E3A\u6B64\u5FEB\u7167"),s.default.createElement("button",{className:"pg-btn",style:{padding:"4px 8px",fontSize:12,color:"var(--dsw-alias-intent-danger, #ef4444)"},onClick:()=>M(a.id),disabled:p,title:"\u5220\u9664\u6B64\u4EFD\u5FEB\u7167"},s.default.createElement(P,{size:13})))))))),z&&s.default.createElement("div",{className:"pg-toast"},z))}function is({size:e=20,active:n=!1}){return s.default.createElement("svg",{width:e,height:e,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:n?2.2:1.6,strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true"},s.default.createElement("path",{d:"M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z"}))}var ns=["slots"];function ts(e){e.slots.inject("sidebar.panellist",()=>e.slots.register({name:"sidebar.panellist",id:"plugin-guardian",order:70,label:"\u63D2\u4EF6\u7BA1\u5BB6"},is)),e.slots.inject("main",()=>e.slots.register({name:"main",key:"plugin-guardian"},as))}
271
+ return module.exports}})
package/dist/meta.json ADDED
@@ -0,0 +1,46 @@
1
+ {
2
+ "inputs": {
3
+ "src/guardian.css": {
4
+ "bytes": 5592,
5
+ "imports": []
6
+ },
7
+ "src/client.jsx": {
8
+ "bytes": 19888,
9
+ "imports": [
10
+ {
11
+ "path": "react",
12
+ "kind": "import-statement",
13
+ "external": true
14
+ },
15
+ {
16
+ "path": "src/guardian.css",
17
+ "kind": "import-statement",
18
+ "original": "./guardian.css"
19
+ }
20
+ ],
21
+ "format": "esm"
22
+ }
23
+ },
24
+ "outputs": {
25
+ "dist/client.js": {
26
+ "imports": [
27
+ {
28
+ "path": "react",
29
+ "kind": "require-call",
30
+ "external": true
31
+ }
32
+ ],
33
+ "exports": [],
34
+ "entryPoint": "src/client.jsx",
35
+ "inputs": {
36
+ "src/client.jsx": {
37
+ "bytesInOutput": 17543
38
+ },
39
+ "src/guardian.css": {
40
+ "bytesInOutput": 5651
41
+ }
42
+ },
43
+ "bytes": 23921
44
+ }
45
+ }
46
+ }
package/package.json CHANGED
@@ -1,6 +1,67 @@
1
1
  {
2
- "name": "@supertiny99/dsh-plugin-guardian",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
2
+ "name": "@supertiny99/dsh-plugin-guardian",
3
+ "version": "0.1.1",
4
+ "description": "DeepSeek Harness (DSH) 插件管家与防灾恢复:解决异常插件崩溃后全盘禁用的痛点,提供自动快照、一键勾选恢复、配置挽回与跨平台桌面脱机应急恢复脚本。",
5
+ "type": "module",
6
+ "main": "src/index.js",
7
+ "author": "supertiny99",
8
+ "license": "MIT",
9
+ "repository": {
10
+ "type": "git",
11
+ "url": "git+https://github.com/supertiny99/dsh-plugin-guardian.git"
12
+ },
13
+ "bugs": {
14
+ "url": "https://github.com/supertiny99/dsh-plugin-guardian/issues"
15
+ },
16
+ "homepage": "https://github.com/supertiny99/dsh-plugin-guardian#readme",
17
+ "exports": {
18
+ ".": "./src/index.js",
19
+ "./client": "./dist/client.js",
20
+ "./cordis.patch.yml": "./cordis.patch.yml",
21
+ "./package.json": "./package.json"
22
+ },
23
+ "publishConfig": {
24
+ "access": "public",
25
+ "registry": "https://registry.npmjs.org/"
26
+ },
27
+ "dsh": {
28
+ "bundle": {
29
+ "patch": "./cordis.patch.yml"
30
+ },
31
+ "client": {
32
+ "platform": "web",
33
+ "immediately": true,
34
+ "inject": [
35
+ "@deepseek-ai/dsh-client-ui-conversation"
36
+ ]
37
+ }
38
+ },
39
+ "engines": {
40
+ "node": ">=20",
41
+ "dsh": ">=0.2.1-rc.5 <0.3.0"
42
+ },
43
+ "keywords": [
44
+ "dsh",
45
+ "deepseek-harness",
46
+ "dsh-plugin",
47
+ "guardian",
48
+ "backup",
49
+ "restore",
50
+ "safe-mode",
51
+ "plugin-manager"
52
+ ],
53
+ "scripts": {
54
+ "build": "node scripts/build.mjs && node scripts/selfcheck.mjs",
55
+ "test": "node test-host.mjs"
56
+ },
57
+ "devDependencies": {
58
+ "esbuild": "^0.25.10"
59
+ },
60
+ "files": [
61
+ "src",
62
+ "dist",
63
+ "cordis.patch.yml",
64
+ "README.md",
65
+ "LICENSE"
66
+ ]
67
+ }