@ggboy123/dsh-paper-reader 1.3.0 → 1.3.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/README.md CHANGED
@@ -42,7 +42,7 @@
42
42
  **DeepSeek 官方桌面端**([deepseek.com/download](https://www.deepseek.com/download/) 下载,即 DeepSeek Harness 桌面版):
43
43
 
44
44
  1. 安装并启动,登录 DeepSeek 账号
45
- 2. 侧栏 → **插件** → **添加插件**,输入 `@ggboy123/dsh-paper-reader@1.3.0` 安装
45
+ 2. 侧栏 → **插件** → **添加插件**,输入 `@ggboy123/dsh-paper-reader@1.3.1` 安装
46
46
  3. 装完默认**停用**:点进插件详情,打开「启用」开关
47
47
  4. **重启桌面端**(热启用状态下打开论文的链路会静默失效,重启进开机组合才正常,实测)
48
48
 
@@ -69,7 +69,7 @@ dsh plugin --profile web add @ggboy123/dsh-paper-reader
69
69
  **已装过的用户升级必须带显式版本号**——不带版本的 `add` 对已存在的依赖是 no-op(pnpm 按首次安装时记录的版本范围解析,不会追新):
70
70
 
71
71
  ```bash
72
- dsh plugin --profile web add @ggboy123/dsh-paper-reader@1.3.0
72
+ dsh plugin --profile web add @ggboy123/dsh-paper-reader@1.3.1
73
73
  # 重启 dsh web 生效;浏览器 Cmd+Shift+R 强刷,避免旧阅读器页面缓存
74
74
  ```
75
75
 
package/dist/host.js CHANGED
@@ -1,6 +1,6 @@
1
1
  // host.ts — webServer 路由:阅读器页面 + PDF 文件 + 转录数据接口 + 选中即问。
2
2
  // 壳层代码:只做 HTTP ↔ 纯函数核心(library/transcribe)的转接。
3
- import { createReadStream } from 'node:fs';
3
+ import { createReadStream, readFileSync } from 'node:fs';
4
4
  import { mkdir, readFile, stat, writeFile } from 'node:fs/promises';
5
5
  import { randomUUID } from 'node:crypto';
6
6
  import { basename, join } from 'node:path';
@@ -44,6 +44,8 @@ export function registerRoutes(ctx, config) {
44
44
  // dist/host.js → 包根/reader/index.html
45
45
  const readerHtml = new URL('../reader/index.html', import.meta.url);
46
46
  const readerVendorDir = new URL('../reader/vendor/', import.meta.url);
47
+ // 插件版本(读包根 package.json,注入阅读器顶栏——用户截图反馈时一眼可见)
48
+ const pluginVersion = 'v' + JSON.parse(readFileSync(new URL('../package.json', import.meta.url), 'utf8')).version;
47
49
  // 自带「论文伴读」agent preset → $DSH_HOME/.agent-presets/(实时扫描,免重启);
48
50
  // 失败(旧版 dsh/无权限)则回退默认 preset,功能不受影响。
49
51
  const presetDir = installPaperPreset(new URL('../', import.meta.url));
@@ -145,8 +147,15 @@ export function registerRoutes(ctx, config) {
145
147
  const dispatch = async (req, res, url) => {
146
148
  const sub = url.pathname.slice('/paper-reader'.length); // '' | '/' | '/api/...'
147
149
  if ((sub === '' || sub === '/') && req.method === 'GET') {
148
- const html = await readFile(readerHtml);
149
- res.writeHead(200, { 'content-type': 'text/html; charset=utf-8', 'content-length': html.length });
150
+ // no-cache:桌面端 webview 无法强刷(README 里浏览器 Cmd+Shift+R 的建议对桌面端
151
+ // 无效),不带缓存头时升级插件后用户会一直看到缓存的旧阅读器页面(实测空白 bug
152
+ // 「修了还在」正是这个)。版本号注入供用户截图反馈时一眼对版本。
153
+ const html = (await readFile(readerHtml)).toString('utf8').replaceAll('__DPR_VERSION__', pluginVersion);
154
+ res.writeHead(200, {
155
+ 'content-type': 'text/html; charset=utf-8',
156
+ 'content-length': Buffer.byteLength(html),
157
+ 'cache-control': 'no-cache',
158
+ });
150
159
  res.end(html);
151
160
  return;
152
161
  }
@@ -160,7 +169,7 @@ export function registerRoutes(ctx, config) {
160
169
  const mime = { '.mjs': 'text/javascript', '.js': 'text/javascript', '.css': 'text/css', '.map': 'application/json' };
161
170
  try {
162
171
  const body = await readFile(new URL(name, readerVendorDir));
163
- res.writeHead(200, { 'content-type': (mime[name.slice(name.lastIndexOf('.'))] ?? 'application/octet-stream') + '; charset=utf-8', 'content-length': body.length, 'cache-control': 'max-age=3600' });
172
+ res.writeHead(200, { 'content-type': (mime[name.slice(name.lastIndexOf('.'))] ?? 'application/octet-stream') + '; charset=utf-8', 'content-length': body.length, 'cache-control': 'no-cache' });
164
173
  res.end(body);
165
174
  }
166
175
  catch {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ggboy123/dsh-paper-reader",
3
- "version": "1.3.0",
3
+ "version": "1.3.1",
4
4
  "description": "DeepSeek Harness 插件:论文伴读工作台 — PDF 转录 / 检索 / 原生对话伴读 + 内置阅读器页面。",
5
5
  "license": "MIT",
6
6
  "type": "module",
package/reader/index.html CHANGED
@@ -48,6 +48,8 @@
48
48
  #pager { display: flex; align-items: center; gap: 4px; flex: none; }
49
49
  #page-input { width: 3.5em; padding: 3px 6px; border: 1px solid var(--border); border-radius: 6px; background: var(--panel); color: var(--text); font: inherit; font-size: 12.5px; text-align: right; }
50
50
  #page-total { flex: none; color: var(--text-2); font-size: 12px; white-space: nowrap; }
51
+ /* 插件版本号(host 注入;未被替换时隐藏——比如旧 host 配新页面的错位场景) */
52
+ #ver { flex: none; font-size: 10.5px; color: var(--text-2); opacity: .65; user-select: none; }
51
53
  .page { position: relative; background: #fff; box-shadow: 0 1px 4px rgba(0,0,0,.18); }
52
54
  .page.flash { outline: 3px solid var(--hl); outline-offset: 2px; transition: outline .15s; }
53
55
  /* textLayer CSS 必须是 pdf.js 6.x 官方规则的子集:TextLayer 只往 span 写 --font-height/--scale-x/--rotate
@@ -126,6 +128,7 @@
126
128
  <span id="zoom-label">100%</span>
127
129
  <button id="zoom-in" class="tbtn">+</button>
128
130
  <button id="zoom-fit" class="tbtn">适宽</button>
131
+ <span id="ver" title="插件版本">__DPR_VERSION__</span>
129
132
  </div>
130
133
 
131
134
  <div id="main">
@@ -871,7 +874,11 @@ bootstrap().catch((e) => {
871
874
  $('empty').textContent = '文献库加载失败:' + e.message;
872
875
  });
873
876
 
877
+ // 版本号未被 host 注入(旧宿主配新页面的错位场景)时藏掉占位符
878
+ if (!/^v\d/.test(document.getElementById('ver').textContent)) document.getElementById('ver').style.display = 'none';
879
+
874
880
  window.dpr = {
881
+ version: document.getElementById('ver').textContent,
875
882
  openPaper: (topic, name, page, q) => openPaper(topic, name, { page, q }),
876
883
  jumpToPage,
877
884
  // 伴读会话的跳转链接用:当前文档里原地跳转,不重载 —— 用户正在看中文版就落在中文版;