@tianyulinfeng1/dsh-plugin-deepseek-chat 1.1.1 → 1.1.2

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/locale/en.json CHANGED
@@ -1,6 +1,6 @@
1
- {
2
- "meta": {
3
- "title": "DeepSeek Chat",
4
- "description": "Adds a chat.deepseek.com panel to the sidebar: full main-area chat with last-conversation memory, a stable login session across panel switches, and DSH account status."
5
- }
6
- }
1
+ {
2
+ "meta": {
3
+ "title": "DeepSeek Chat",
4
+ "description": "Adds a chat.deepseek.com panel to the sidebar: full main-area chat with last-conversation memory, a stable login session across panel switches, and DSH account status."
5
+ }
6
+ }
package/locale/zh.json CHANGED
@@ -1,6 +1,6 @@
1
- {
2
- "meta": {
3
- "title": "DeepSeek 聊天",
4
- "description": "在左侧栏加入 chat.deepseek.com 聊天面板,占满主内容区、记住上次会话,固定登录会话不因切换面板而重新扫码,并显示 DSH 账号状态。"
5
- }
6
- }
1
+ {
2
+ "meta": {
3
+ "title": "DeepSeek 聊天",
4
+ "description": "在左侧栏加入 chat.deepseek.com 聊天面板,占满主内容区、记住上次会话,固定登录会话不因切换面板而重新扫码,并显示 DSH 账号状态。"
5
+ }
6
+ }
package/package.json CHANGED
@@ -1,67 +1,68 @@
1
- {
2
- "name": "@tianyulinfeng1/dsh-plugin-deepseek-chat",
3
- "version": "1.1.1",
4
- "description": "DeepSeek Chat (chat.deepseek.com) as a DSH sidebar panel: full main-area chat, last-conversation memory, DSH account awareness, a stable login session, and crash containment.",
5
- "type": "module",
6
- "main": "lib/index.js",
7
- "icon": "./icon.svg",
8
- "exports": {
9
- ".": "./lib/index.js",
10
- "./client": "./lib/client.js",
11
- "./locale/*.json": "./locale/*.json",
12
- "./package.json": "./package.json"
13
- },
14
- "files": [
15
- "lib",
16
- "locale",
17
- "scripts",
18
- "docs/login-persistence.md",
19
- "docs/RELEASE_NOTES_v1.1.1.md",
20
- "docs/screenshot.png",
21
- "icon.svg",
22
- "cordis.patch.yml",
23
- "README.md",
24
- "README.en.md",
25
- "CHANGELOG.md",
26
- "LICENSE"
27
- ],
28
- "scripts": {
29
- "test": "node test/check-client.mjs"
30
- },
31
- "keywords": [
32
- "deepseek-harness",
33
- "dsh-plugin",
34
- "deepseek",
35
- "chat",
36
- "webview"
37
- ],
38
- "author": "sweet560",
39
- "license": "MIT",
40
- "publishConfig": {
41
- "access": "public"
42
- },
43
- "repository": {
44
- "type": "git",
45
- "url": "git+https://github.com/sweet560/dsh-plugin-deepseek-chat.git"
46
- },
47
- "bugs": {
48
- "url": "https://github.com/sweet560/dsh-plugin-deepseek-chat/issues"
49
- },
50
- "homepage": "https://github.com/sweet560/dsh-plugin-deepseek-chat#readme",
51
- "engines": {
52
- "node": ">=20",
53
- "dsh": ">=0.2.2-rc.1"
54
- },
55
- "dsh": {
56
- "manifestVersion": 1,
57
- "bundle": {
58
- "patch": "./cordis.patch.yml"
59
- },
60
- "client": {
61
- "platform": "web",
62
- "inject": [
63
- "@deepseek-ai/dsh-client-ui-sidebar"
64
- ]
65
- }
66
- }
67
- }
1
+ {
2
+ "name": "@tianyulinfeng1/dsh-plugin-deepseek-chat",
3
+ "version": "1.1.2",
4
+ "description": "DeepSeek Chat (chat.deepseek.com) as a DSH sidebar panel: full main-area chat, last-conversation memory, DSH account awareness, a stable login session, and crash containment.",
5
+ "type": "module",
6
+ "main": "lib/index.js",
7
+ "icon": "./icon.svg",
8
+ "exports": {
9
+ ".": "./lib/index.js",
10
+ "./client": "./lib/client.js",
11
+ "./locale/*.json": "./locale/*.json",
12
+ "./package.json": "./package.json"
13
+ },
14
+ "files": [
15
+ "lib",
16
+ "locale",
17
+ "scripts",
18
+ "docs/login-persistence.md",
19
+ "docs/RELEASE_NOTES_v1.1.1.md",
20
+ "docs/RELEASE_NOTES_v1.1.2.md",
21
+ "docs/screenshot.png",
22
+ "icon.svg",
23
+ "cordis.patch.yml",
24
+ "README.md",
25
+ "README.en.md",
26
+ "CHANGELOG.md",
27
+ "LICENSE"
28
+ ],
29
+ "scripts": {
30
+ "test": "node test/check-client.mjs"
31
+ },
32
+ "keywords": [
33
+ "deepseek-harness",
34
+ "dsh-plugin",
35
+ "deepseek",
36
+ "chat",
37
+ "webview"
38
+ ],
39
+ "author": "sweet560",
40
+ "license": "MIT",
41
+ "publishConfig": {
42
+ "access": "public"
43
+ },
44
+ "repository": {
45
+ "type": "git",
46
+ "url": "git+https://github.com/sweet560/dsh-plugin-deepseek-chat.git"
47
+ },
48
+ "bugs": {
49
+ "url": "https://github.com/sweet560/dsh-plugin-deepseek-chat/issues"
50
+ },
51
+ "homepage": "https://github.com/sweet560/dsh-plugin-deepseek-chat#readme",
52
+ "engines": {
53
+ "node": ">=20",
54
+ "dsh": ">=0.2.2-rc.1"
55
+ },
56
+ "dsh": {
57
+ "manifestVersion": 1,
58
+ "bundle": {
59
+ "patch": "./cordis.patch.yml"
60
+ },
61
+ "client": {
62
+ "platform": "web",
63
+ "inject": [
64
+ "@deepseek-ai/dsh-client-ui-sidebar"
65
+ ]
66
+ }
67
+ }
68
+ }
@@ -1,174 +1,174 @@
1
- /**
2
- * patch-dsh-persistent-partition.cjs (upstream: sweet560/dsh-plugin-deepseek-chat)
3
- *
4
- * Make the DSH Desktop sidebar-browser guest partition persistent so a
5
- * chat.deepseek.com login survives an app restart.
6
- *
7
- * The desktop shell creates one in-memory partition per workspace:
8
- * partition = `dsh-sidebar-browser-${randomUUID()}`;
9
- * Electron only persists cookies/localStorage for partitions whose name starts
10
- * with "persist:", so every restart lost the login. This script rewrites that
11
- * statement to a fixed persist: partition with the exact same byte length, so
12
- * ASAR file offsets stay valid.
13
- *
14
- * Builds that ship per-file ASAR `integrity` metadata (0.2.1-rc.3+, including
15
- * 0.2.2-rc.1) ALSO need lib/main.js's SHA256 updated; a byte-only replacement
16
- * would trigger "ASAR Integrity Violation" and kill the app on restart.
17
- * This script recomputes and syncs it, then verifies every file/block hash in
18
- * the archive before and after writing.
19
- *
20
- * Usage:
21
- * node patch-dsh-persistent-partition.cjs "<path to resources/app.asar>" [--dry-run]
22
- * node patch-dsh-persistent-partition.cjs --verify (state only, via the .mjs wrapper)
23
- *
24
- * Exit codes: 0 patched or already patched, 1 refused/failed, 2 usage.
25
- *
26
- * IMPORTANT: app.asar is exclusively locked while DSH Desktop runs. Exit DSH
27
- * completely from the tray before applying (a --dry-run only reads and is safe).
28
- */
29
- const fs = require('node:fs');
30
- const crypto = require('node:crypto');
31
-
32
- const ORIGINAL = "partition = `dsh-sidebar-browser-${randomUUID()}`;";
33
- const PATCHED = "partition = `persist:dsh-sidebar-browser-chat-v1`;";
34
-
35
- const target = process.argv[2];
36
- const dryRun = process.argv.includes('--dry-run');
37
- if (!target || !fs.existsSync(target)) {
38
- console.error('usage: node patch-dsh-persistent-partition.cjs <path to app.asar> [--dry-run]');
39
- process.exit(2);
40
- }
41
- if (ORIGINAL.length !== PATCHED.length) {
42
- console.error('refusing: replacement statement length differs');
43
- process.exit(1);
44
- }
45
-
46
- function readHeader(buffer) {
47
- const jsonLen = buffer.readUInt32LE(12);
48
- const pickleSize = buffer.readUInt32LE(4);
49
- const headerBuf = buffer.subarray(16, 16 + jsonLen);
50
- return { jsonLen, pickleSize, headerBuf, json: JSON.parse(headerBuf.toString('utf8')) };
51
- }
52
-
53
- function sha256(buf) {
54
- return crypto.createHash('sha256').update(buf).digest('hex');
55
- }
56
-
57
- function mainFileEntry(json) {
58
- const entry = json && json.files && json.files.lib && json.files.lib.files && json.files.lib.files['main.js'];
59
- if (!entry || !entry.integrity) return undefined;
60
- return entry;
61
- }
62
-
63
- function verifyAllIntegrity(buffer, header) {
64
- const dataStart = 8 + header.pickleSize;
65
- let checked = 0;
66
- let failed = 0;
67
- const failures = [];
68
- const walk = (node, base) => {
69
- for (const [name, entry] of Object.entries((node && node.files) || {})) {
70
- const full = base ? `${base}/${name}` : name;
71
- if (entry.files) { walk(entry, full); continue; }
72
- const integrity = entry.integrity;
73
- if (!integrity || !Array.isArray(integrity.blocks) || integrity.blocks.length === 0) continue;
74
- const size = Number(entry.size);
75
- const offset = Number(entry.offset);
76
- if (!Number.isFinite(size) || !Number.isFinite(offset)) continue;
77
- const abs = dataStart + offset;
78
- const blockSize = integrity.blockSize || size;
79
- let ok = true;
80
- for (let i = 0; i < integrity.blocks.length; i += 1) {
81
- const len = Math.min(blockSize, size - i * blockSize);
82
- if (len <= 0) break;
83
- if (sha256(buffer.subarray(abs + i * blockSize, abs + i * blockSize + len)) !== integrity.blocks[i]) {
84
- ok = false;
85
- break;
86
- }
87
- }
88
- checked += 1;
89
- if (!ok) { failed += 1; if (failures.length < 5) failures.push(full); }
90
- }
91
- };
92
- walk(header.json, '');
93
- return { checked, failed, failures };
94
- }
95
-
96
- const buffer = fs.readFileSync(target);
97
- const text = buffer.toString('latin1');
98
- const header = readHeader(buffer);
99
-
100
- if (text.includes(PATCHED)) {
101
- const result = verifyAllIntegrity(buffer, header);
102
- console.log(`already patched: ${target}`);
103
- console.log(`integrity: ${result.checked} file(s) verified, ${result.failed} failed`);
104
- process.exit(result.failed === 0 ? 0 : 1);
105
- }
106
-
107
- const first = text.indexOf(ORIGINAL);
108
- if (first === -1) {
109
- console.error('target statement not found; this DSH build differs - inspect lib/main.js first');
110
- process.exit(1);
111
- }
112
- if (text.indexOf(ORIGINAL, first + 1) !== -1) {
113
- console.error('target statement appears more than once; refusing to patch');
114
- process.exit(1);
115
- }
116
-
117
- let out = text.slice(0, first) + PATCHED + text.slice(first + ORIGINAL.length);
118
- if (Buffer.byteLength(out, 'latin1') !== buffer.length) {
119
- console.error('patched size differs from original; refusing to write');
120
- process.exit(1);
121
- }
122
-
123
- // Keep per-file ASAR integrity metadata consistent with the patched bytes.
124
- const entry = mainFileEntry(header.json);
125
- if (entry) {
126
- const dataStart = 8 + header.pickleSize;
127
- const mainStart = dataStart + Number(entry.offset);
128
- const mainSize = Number(entry.size);
129
- const mainBytes = Buffer.from(out.slice(mainStart, mainStart + mainSize), 'latin1');
130
- const nextHash = sha256(mainBytes);
131
- const oldHashes = new Set([entry.integrity.hash, ...(entry.integrity.blocks || [])].filter(Boolean));
132
- if (nextHash === entry.integrity.hash || !oldHashes.has(entry.integrity.hash)) {
133
- console.error('refusing: lib/main.js integrity metadata is not usable for this build');
134
- process.exit(1);
135
- }
136
- // Multi-block layouts need per-block hashes; refuse rather than guess.
137
- const nextValue = entry.integrity.blocks && entry.integrity.blocks.length > 1 ? null : nextHash;
138
- if (nextValue === null) {
139
- console.error('refusing: multi-block integrity layout for lib/main.js is unsupported');
140
- process.exit(1);
141
- }
142
- // Replace only inside the header JSON region.
143
- const headerText = out.slice(16, 16 + header.jsonLen);
144
- let updatedHeader = headerText;
145
- for (const oldHash of oldHashes) {
146
- updatedHeader = updatedHeader.split(oldHash).join(nextHash);
147
- }
148
- if (updatedHeader.length !== headerText.length) {
149
- console.error('refusing: header JSON length would change');
150
- process.exit(1);
151
- }
152
- out = out.slice(0, 16) + updatedHeader + out.slice(16 + header.jsonLen);
153
- }
154
-
155
- const patched = Buffer.from(out, 'latin1');
156
- const patchedHeader = readHeader(patched);
157
- const result = verifyAllIntegrity(patched, patchedHeader);
158
- if (result.failed !== 0) {
159
- console.error(`refusing: ${result.failed} integrity check(s) failed for the patched archive`, result.failures);
160
- process.exit(1);
161
- }
162
-
163
- if (dryRun) {
164
- console.log('dry-run: patch would be applied');
165
- console.log(`integrity: ${result.checked} file(s) verified, 0 failed`);
166
- process.exit(0);
167
- }
168
-
169
- const backup = `${target}.bak-${new Date().toISOString().replaceAll(/[:.]/gu, '-')}`;
170
- fs.copyFileSync(target, backup);
171
- fs.writeFileSync(target, patched);
172
- console.log(`patched: ${target}`);
173
- console.log(`backup : ${backup}`);
174
- console.log(`integrity: ${result.checked} file(s) verified, 0 failed`);
1
+ /**
2
+ * patch-dsh-persistent-partition.cjs (upstream: sweet560/dsh-plugin-deepseek-chat)
3
+ *
4
+ * Make the DSH Desktop sidebar-browser guest partition persistent so a
5
+ * chat.deepseek.com login survives an app restart.
6
+ *
7
+ * The desktop shell creates one in-memory partition per workspace:
8
+ * partition = `dsh-sidebar-browser-${randomUUID()}`;
9
+ * Electron only persists cookies/localStorage for partitions whose name starts
10
+ * with "persist:", so every restart lost the login. This script rewrites that
11
+ * statement to a fixed persist: partition with the exact same byte length, so
12
+ * ASAR file offsets stay valid.
13
+ *
14
+ * Builds that ship per-file ASAR `integrity` metadata (0.2.1-rc.3+, including
15
+ * 0.2.2-rc.1) ALSO need lib/main.js's SHA256 updated; a byte-only replacement
16
+ * would trigger "ASAR Integrity Violation" and kill the app on restart.
17
+ * This script recomputes and syncs it, then verifies every file/block hash in
18
+ * the archive before and after writing.
19
+ *
20
+ * Usage:
21
+ * node patch-dsh-persistent-partition.cjs "<path to resources/app.asar>" [--dry-run]
22
+ * node patch-dsh-persistent-partition.cjs --verify (state only, via the .mjs wrapper)
23
+ *
24
+ * Exit codes: 0 patched or already patched, 1 refused/failed, 2 usage.
25
+ *
26
+ * IMPORTANT: app.asar is exclusively locked while DSH Desktop runs. Exit DSH
27
+ * completely from the tray before applying (a --dry-run only reads and is safe).
28
+ */
29
+ const fs = require('node:fs');
30
+ const crypto = require('node:crypto');
31
+
32
+ const ORIGINAL = "partition = `dsh-sidebar-browser-${randomUUID()}`;";
33
+ const PATCHED = "partition = `persist:dsh-sidebar-browser-chat-v1`;";
34
+
35
+ const target = process.argv[2];
36
+ const dryRun = process.argv.includes('--dry-run');
37
+ if (!target || !fs.existsSync(target)) {
38
+ console.error('usage: node patch-dsh-persistent-partition.cjs <path to app.asar> [--dry-run]');
39
+ process.exit(2);
40
+ }
41
+ if (ORIGINAL.length !== PATCHED.length) {
42
+ console.error('refusing: replacement statement length differs');
43
+ process.exit(1);
44
+ }
45
+
46
+ function readHeader(buffer) {
47
+ const jsonLen = buffer.readUInt32LE(12);
48
+ const pickleSize = buffer.readUInt32LE(4);
49
+ const headerBuf = buffer.subarray(16, 16 + jsonLen);
50
+ return { jsonLen, pickleSize, headerBuf, json: JSON.parse(headerBuf.toString('utf8')) };
51
+ }
52
+
53
+ function sha256(buf) {
54
+ return crypto.createHash('sha256').update(buf).digest('hex');
55
+ }
56
+
57
+ function mainFileEntry(json) {
58
+ const entry = json && json.files && json.files.lib && json.files.lib.files && json.files.lib.files['main.js'];
59
+ if (!entry || !entry.integrity) return undefined;
60
+ return entry;
61
+ }
62
+
63
+ function verifyAllIntegrity(buffer, header) {
64
+ const dataStart = 8 + header.pickleSize;
65
+ let checked = 0;
66
+ let failed = 0;
67
+ const failures = [];
68
+ const walk = (node, base) => {
69
+ for (const [name, entry] of Object.entries((node && node.files) || {})) {
70
+ const full = base ? `${base}/${name}` : name;
71
+ if (entry.files) { walk(entry, full); continue; }
72
+ const integrity = entry.integrity;
73
+ if (!integrity || !Array.isArray(integrity.blocks) || integrity.blocks.length === 0) continue;
74
+ const size = Number(entry.size);
75
+ const offset = Number(entry.offset);
76
+ if (!Number.isFinite(size) || !Number.isFinite(offset)) continue;
77
+ const abs = dataStart + offset;
78
+ const blockSize = integrity.blockSize || size;
79
+ let ok = true;
80
+ for (let i = 0; i < integrity.blocks.length; i += 1) {
81
+ const len = Math.min(blockSize, size - i * blockSize);
82
+ if (len <= 0) break;
83
+ if (sha256(buffer.subarray(abs + i * blockSize, abs + i * blockSize + len)) !== integrity.blocks[i]) {
84
+ ok = false;
85
+ break;
86
+ }
87
+ }
88
+ checked += 1;
89
+ if (!ok) { failed += 1; if (failures.length < 5) failures.push(full); }
90
+ }
91
+ };
92
+ walk(header.json, '');
93
+ return { checked, failed, failures };
94
+ }
95
+
96
+ const buffer = fs.readFileSync(target);
97
+ const text = buffer.toString('latin1');
98
+ const header = readHeader(buffer);
99
+
100
+ if (text.includes(PATCHED)) {
101
+ const result = verifyAllIntegrity(buffer, header);
102
+ console.log(`already patched: ${target}`);
103
+ console.log(`integrity: ${result.checked} file(s) verified, ${result.failed} failed`);
104
+ process.exit(result.failed === 0 ? 0 : 1);
105
+ }
106
+
107
+ const first = text.indexOf(ORIGINAL);
108
+ if (first === -1) {
109
+ console.error('target statement not found; this DSH build differs - inspect lib/main.js first');
110
+ process.exit(1);
111
+ }
112
+ if (text.indexOf(ORIGINAL, first + 1) !== -1) {
113
+ console.error('target statement appears more than once; refusing to patch');
114
+ process.exit(1);
115
+ }
116
+
117
+ let out = text.slice(0, first) + PATCHED + text.slice(first + ORIGINAL.length);
118
+ if (Buffer.byteLength(out, 'latin1') !== buffer.length) {
119
+ console.error('patched size differs from original; refusing to write');
120
+ process.exit(1);
121
+ }
122
+
123
+ // Keep per-file ASAR integrity metadata consistent with the patched bytes.
124
+ const entry = mainFileEntry(header.json);
125
+ if (entry) {
126
+ const dataStart = 8 + header.pickleSize;
127
+ const mainStart = dataStart + Number(entry.offset);
128
+ const mainSize = Number(entry.size);
129
+ const mainBytes = Buffer.from(out.slice(mainStart, mainStart + mainSize), 'latin1');
130
+ const nextHash = sha256(mainBytes);
131
+ const oldHashes = new Set([entry.integrity.hash, ...(entry.integrity.blocks || [])].filter(Boolean));
132
+ if (nextHash === entry.integrity.hash || !oldHashes.has(entry.integrity.hash)) {
133
+ console.error('refusing: lib/main.js integrity metadata is not usable for this build');
134
+ process.exit(1);
135
+ }
136
+ // Multi-block layouts need per-block hashes; refuse rather than guess.
137
+ const nextValue = entry.integrity.blocks && entry.integrity.blocks.length > 1 ? null : nextHash;
138
+ if (nextValue === null) {
139
+ console.error('refusing: multi-block integrity layout for lib/main.js is unsupported');
140
+ process.exit(1);
141
+ }
142
+ // Replace only inside the header JSON region.
143
+ const headerText = out.slice(16, 16 + header.jsonLen);
144
+ let updatedHeader = headerText;
145
+ for (const oldHash of oldHashes) {
146
+ updatedHeader = updatedHeader.split(oldHash).join(nextHash);
147
+ }
148
+ if (updatedHeader.length !== headerText.length) {
149
+ console.error('refusing: header JSON length would change');
150
+ process.exit(1);
151
+ }
152
+ out = out.slice(0, 16) + updatedHeader + out.slice(16 + header.jsonLen);
153
+ }
154
+
155
+ const patched = Buffer.from(out, 'latin1');
156
+ const patchedHeader = readHeader(patched);
157
+ const result = verifyAllIntegrity(patched, patchedHeader);
158
+ if (result.failed !== 0) {
159
+ console.error(`refusing: ${result.failed} integrity check(s) failed for the patched archive`, result.failures);
160
+ process.exit(1);
161
+ }
162
+
163
+ if (dryRun) {
164
+ console.log('dry-run: patch would be applied');
165
+ console.log(`integrity: ${result.checked} file(s) verified, 0 failed`);
166
+ process.exit(0);
167
+ }
168
+
169
+ const backup = `${target}.bak-${new Date().toISOString().replaceAll(/[:.]/gu, '-')}`;
170
+ fs.copyFileSync(target, backup);
171
+ fs.writeFileSync(target, patched);
172
+ console.log(`patched: ${target}`);
173
+ console.log(`backup : ${backup}`);
174
+ console.log(`integrity: ${result.checked} file(s) verified, 0 failed`);
@@ -1,16 +1,16 @@
1
- /**
2
- * DEPRECATED — do not use. Kept only so old bookmarks fail loudly.
3
- *
4
- * This byte-only replacement does NOT update the per-file SHA256 `integrity`
5
- * metadata in ASAR builds from 0.2.1-rc.3 onward (including 0.2.2-rc.1).
6
- * Applying it makes Electron abort with "ASAR Integrity Violation" on the next
7
- * DSH restart.
8
- *
9
- * Use scripts/patch-dsh-persistent-partition.cjs instead: it recomputes the
10
- * lib/main.js hash, syncs the ASAR header, and verifies every block.
11
- *
12
- * See docs/login-persistence.md for the current procedure.
13
- */
14
- console.error("DEPRECATED: this script omits ASAR integrity and would break DSH on restart.");
15
- console.error("Use scripts/patch-dsh-persistent-partition.cjs instead (see docs/login-persistence.md).");
16
- process.exit(1);
1
+ /**
2
+ * DEPRECATED — do not use. Kept only so old bookmarks fail loudly.
3
+ *
4
+ * This byte-only replacement does NOT update the per-file SHA256 `integrity`
5
+ * metadata in ASAR builds from 0.2.1-rc.3 onward (including 0.2.2-rc.1).
6
+ * Applying it makes Electron abort with "ASAR Integrity Violation" on the next
7
+ * DSH restart.
8
+ *
9
+ * Use scripts/patch-dsh-persistent-partition.cjs instead: it recomputes the
10
+ * lib/main.js hash, syncs the ASAR header, and verifies every block.
11
+ *
12
+ * See docs/login-persistence.md for the current procedure.
13
+ */
14
+ console.error("DEPRECATED: this script omits ASAR integrity and would break DSH on restart.");
15
+ console.error("Use scripts/patch-dsh-persistent-partition.cjs instead (see docs/login-persistence.md).");
16
+ process.exit(1);