dsh-plugin-litsearch 0.0.0-stage → 0.2.0
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 +21 -0
- package/README.md +157 -2
- package/client/client.js +9036 -0
- package/cordis.patch.yml +10 -0
- package/lib/host/events.d.ts +19 -0
- package/lib/host/events.js +58 -0
- package/lib/host/export/bibtex.d.ts +3 -0
- package/lib/host/export/bibtex.js +42 -0
- package/lib/host/export/common.d.ts +18 -0
- package/lib/host/export/common.js +25 -0
- package/lib/host/export/csv.d.ts +8 -0
- package/lib/host/export/csv.js +68 -0
- package/lib/host/export/index.d.ts +5 -0
- package/lib/host/export/index.js +25 -0
- package/lib/host/export/markdown.d.ts +6 -0
- package/lib/host/export/markdown.js +120 -0
- package/lib/host/export/ris.d.ts +3 -0
- package/lib/host/export/ris.js +35 -0
- package/lib/host/paths.d.ts +43 -0
- package/lib/host/paths.js +128 -0
- package/lib/host/pdf/store.d.ts +57 -0
- package/lib/host/pdf/store.js +291 -0
- package/lib/host/router.d.ts +20 -0
- package/lib/host/router.js +852 -0
- package/lib/host/tasks/compare.d.ts +8 -0
- package/lib/host/tasks/compare.js +49 -0
- package/lib/host/tasks/filter.d.ts +42 -0
- package/lib/host/tasks/filter.js +100 -0
- package/lib/host/tasks/rounds.d.ts +28 -0
- package/lib/host/tasks/rounds.js +74 -0
- package/lib/host/tasks/runner.d.ts +29 -0
- package/lib/host/tasks/runner.js +208 -0
- package/lib/host/tasks/service.d.ts +171 -0
- package/lib/host/tasks/service.js +976 -0
- package/lib/host/tasks/states.d.ts +28 -0
- package/lib/host/tasks/states.js +223 -0
- package/lib/host/tasks/stats.d.ts +13 -0
- package/lib/host/tasks/stats.js +233 -0
- package/lib/host/tasks/store.d.ts +64 -0
- package/lib/host/tasks/store.js +280 -0
- package/lib/host/tasks/summary.d.ts +9 -0
- package/lib/host/tasks/summary.js +54 -0
- package/lib/host/tools.d.ts +47 -0
- package/lib/host/tools.js +1138 -0
- package/lib/host/zotero/connector.d.ts +46 -0
- package/lib/host/zotero/connector.js +263 -0
- package/lib/index.d.ts +107 -0
- package/lib/index.js +153 -0
- package/lib/search/aggregate.d.ts +17 -0
- package/lib/search/aggregate.js +60 -0
- package/lib/search/config.d.ts +96 -0
- package/lib/search/config.js +96 -0
- package/lib/search/errors.d.ts +22 -0
- package/lib/search/errors.js +24 -0
- package/lib/search/health.d.ts +13 -0
- package/lib/search/health.js +53 -0
- package/lib/search/http.d.ts +13 -0
- package/lib/search/http.js +81 -0
- package/lib/search/identity.d.ts +27 -0
- package/lib/search/identity.js +154 -0
- package/lib/search/normalize.d.ts +17 -0
- package/lib/search/normalize.js +47 -0
- package/lib/search/oa.d.ts +21 -0
- package/lib/search/oa.js +149 -0
- package/lib/search/providers/arxiv.d.ts +9 -0
- package/lib/search/providers/arxiv.js +99 -0
- package/lib/search/providers/crossref.d.ts +8 -0
- package/lib/search/providers/crossref.js +107 -0
- package/lib/search/providers/europepmc.d.ts +8 -0
- package/lib/search/providers/europepmc.js +105 -0
- package/lib/search/providers/index.d.ts +13 -0
- package/lib/search/providers/index.js +34 -0
- package/lib/search/providers/openalex.d.ts +8 -0
- package/lib/search/providers/openalex.js +109 -0
- package/lib/search/providers/pubmed.d.ts +10 -0
- package/lib/search/providers/pubmed.js +143 -0
- package/lib/search/providers/pubtator.d.ts +9 -0
- package/lib/search/providers/pubtator.js +79 -0
- package/lib/search/providers/semanticscholar.d.ts +9 -0
- package/lib/search/providers/semanticscholar.js +97 -0
- package/lib/search/pubtator-entities.d.ts +9 -0
- package/lib/search/pubtator-entities.js +19 -0
- package/lib/search/pubtator-parse.d.ts +3 -0
- package/lib/search/pubtator-parse.js +42 -0
- package/lib/search/query-adapter.d.ts +15 -0
- package/lib/search/query-adapter.js +69 -0
- package/lib/search/rate-limit.d.ts +31 -0
- package/lib/search/rate-limit.js +219 -0
- package/lib/search/types.d.ts +577 -0
- package/lib/search/types.js +15 -0
- package/lib/search/xml.d.ts +20 -0
- package/lib/search/xml.js +63 -0
- package/package.json +75 -4
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 peijiping
|
|
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,158 @@
|
|
|
1
|
-
#
|
|
1
|
+
# dsh-plugin-litsearch
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
**给 DSH 加一个免费的文献检索助手。**
|
|
4
|
+
|
|
5
|
+
装上这个插件,大模型可以直接检索开放学术文献,你也可以在 DSH 右侧栏用同一套数据源检索,并把感兴趣的论文一键带进对话。无需账号、无需 API Key、无需本地服务。
|
|
6
|
+
|
|
7
|
+
> 当前为 P4:七个免费数据源聚合,支持多检索式(可命名、启停、按源覆写)、去重、筛选与概览;可预览 / 下载开放获取 PDF、用 Europe PMC 兜底 HTML 全文、同步到本机 Zotero,并对结果做批量筛读、分组、备注、导出与批量插入对话。每篇论文还能打开独立论文页,查看 PubTator 实体标注;检索式带字段语法时会提示哪些源只按自然语言处理。
|
|
8
|
+
|
|
9
|
+
## 能做什么
|
|
10
|
+
|
|
11
|
+
- **模型侧检索**:内置 `literature_search`、`literature_sources`、`literature_task`、`literature_export` 四个工具,可提交多条检索式与年份、开放获取、文献类型等条件;任务可被读取、筛读、分组、对比、查看轮次历史与导出。同一主题的多轮检索复用同一个任务,不会连续弹出新 tab;一个对话只保留一个任务 tab,模型可在执行前用 `literature_task`(`action=current`)确认这个对话当前的任务。
|
|
12
|
+
- **人侧检索**:右侧栏「文献检索」面板,可加多条检索式、勾选数据源,结果显示来源、被引与开放获取状态;任务自动保存,可随时回来继续。
|
|
13
|
+
- **高级检索式编辑**:每条检索式可改自定义名称、单独启用 / 停用、并针对某个数据源写覆写式(例如 PubMed 用 MeSH、OpenAlex 用概念检索);未覆写的源仍用主检索式。
|
|
14
|
+
- **任务条件编辑**:任务完成后仍可在面板内「改条件」调整检索式、数据源、年份、开放获取、语言、类型、排序与每源条数,保存后一键重跑,无需新建任务。每次重跑都会记为任务内新的一轮。
|
|
15
|
+
- **轮次历史时间轴**:任务页右上角历史图标打开时间轴,按时间列出每一轮的发起方、检索条件、命中数、完成状态;可一键把某一轮的条件回填后重跑。
|
|
16
|
+
- **任务列表**:主页与任务页右上角都有任务列表图标,可打开、重命名、删除任意任务;从列表点开某任务即「进入」该任务,右侧栏原有的任务 tab 会被原位替换(一个对话只保留一个任务 tab),之后的模型检索默认落在这里。
|
|
17
|
+
- **数据源语法提示**:检索式含字段标签或布尔语法时,提示 Semantic Scholar / PubTator 会按自然语言处理;数据源按钮悬浮可查看各自支持的语法,必要时用单源覆写保留查询意图。
|
|
18
|
+
- **独立论文页**:任意结果可打开独立论文 tab,集中展示完整摘要、标识符、筛读 / 分组 / 备注 / 标签 / 必读序号、PDF 与 HTML 全文预览,并可插入对话。
|
|
19
|
+
- **PubTator 实体**:有 PMID 的论文可查看 PubTator3 标注的基因、疾病、化学物等实体,按标准标识符去重并显示出现次数。
|
|
20
|
+
- **筛选与概览**:结果可按关键词、来源、年份、类型、语言、人工筛读状态、缺全文、全文获取状态等条件过滤并排序;结果页顶部常驻全任务口径的全文覆盖横幅,可一键筛出缺全文或跳到全文台账;「概览」页展示漏斗、年份分布、来源与检索式贡献,点击即可反向筛选结果。
|
|
21
|
+
- **筛读工作流**:每篇论文可标记未读 / 已读 / 纳入 / 排除,写备注、打标签、加入必读顺序;任务内可建「研究分组」,按为什么读归类,并导出分层报告。
|
|
22
|
+
- **全文预览与下载**:在结果卡片里直接预览开放获取 PDF,或下载到本地;文件按「作者年份_标题_标识.pdf」命名,支持断点式 Range 读取。没有 PDF 但有 PMCID 时,用 Europe PMC 全文渲染可读 HTML。
|
|
23
|
+
- **全文台账**:「全文」页按全任务口径(与概览一致、不受结果页筛选影响)列出覆盖率;状态数字可点击切换清单,缺全文、有全文直链、已下载、需订阅、被出版商拒绝、获取失败等各自成表,可分页加载、多选批量下载 PDF / 存入 Zotero,并可把当前清单带进结果页(会清空其他筛选,保证篇数一致)。
|
|
24
|
+
- **Zotero 同步**:通过本机 Zotero 桌面端 connector 保存条目,可选同时附上 PDF;未连接 Zotero、同步失败、部分成功都会给出明确提示,并保留一条带当前条目范围的 RIS 导出入口。
|
|
25
|
+
- **批量操作**:结果页与全文页均可多选后批量下载 PDF、存入 Zotero;结果页还支持批量改筛读状态、归入或移出分组、按选中导出。
|
|
26
|
+
- **导出与对比**:按当前筛选或选中条目导出 CSV 台账、RIS、BibTeX、Markdown 报告;也可选一个旧任务做新增 / 共有 / 缺失对比,并把「新增」整批标记为纳入。
|
|
27
|
+
- **带进对话**:点击「插入到对话」,把论文元数据与摘要写入当前会话草稿(不自动发送),模型可据此继续工作;勾选多篇后可一次插入,按序号编号。
|
|
28
|
+
- **任务带入对话**:任务页的「带入对话」把任务 id、标题与当前检索条件写入会话草稿(不自动发送),在新会话里也能明确续接同一任务的下一轮,而不是新建任务。
|
|
29
|
+
- **免费数据源**:全部无需付费或申请密钥;NCBI 与 Semantic Scholar 可选填 Key 提高额度。限流在本地按源串行排队:冷却期内排队等待而非报错,收到 429 会退避重试并自适应放大该源间隔,连续成功后回落;只有上游要求冷却过久才优雅跳过该源,此时任务不会变「部分完成」、面板也只给中性提示。单个源触发限流只影响该源。超时 / 临时网络故障会重试一次;Europe PMC 的 `resultType=core` 检索单独享有 25s 超时下限。
|
|
30
|
+
|
|
31
|
+
## 搜索任务与轮次
|
|
32
|
+
|
|
33
|
+
**一个研究主题 = 一个任务 = 一个右侧栏 tab;一个对话只保留一个任务 tab。** 一次检索不满意时,在同一个任务里调整条件再搜一轮,而不是新开一个任务:
|
|
34
|
+
|
|
35
|
+
- 模型第一次检索会新建任务并用 `title` 自己命名;后续检索默认复用「当前任务」,在同一任务内开新一轮,任务 id 与 tab 都不变。模型也可以显式传 `taskId` 复用指定任务,或在用户明确要求时传 `newTask: true` 新建。
|
|
36
|
+
- **每个对话在右侧栏只开一个任务 tab。** 切换任务从任务列表(主页 / 任务页右上角)进行:点开另一个任务时,会原位替换当前任务 tab,而不是并排再开一个。切回某个对话时,面板里打开的那个任务就是该对话当前的任务。
|
|
37
|
+
- **建议不同的检索任务使用不同对话。** 一个对话跟进一个任务,上下文和任务一一对应,模型不用猜「现在在改哪个任务」;要在一个新对话里续接已有任务,点任务页的「带入对话」把任务 id 与当前条件写进草稿即可。
|
|
38
|
+
- 模型在执行检索或任务操作前,可先调用 `literature_task`(`action=current`)读取这个对话当前的任务:标题、id、状态、检索式、完整条件、轮次与筛读漏斗。没有任务时会明确返回「当前没有任务」,避免误建新任务。
|
|
39
|
+
- 每次执行记为一条 `SearchRound`:时间、检索条件快照、发起方(模型 / 面板)、原始与去重命中数、已加载篇数、结束状态。**只记元数据,不保存文献列表**;当前结果始终是最新一轮,已标过的已读 / 纳入 / 排除 / 备注按 paperId 跨轮保留。每任务最多保留最近 30 轮,落盘时自动裁剪。
|
|
40
|
+
- 轮次可通过任务页右上角历史图标(时间轴)查看,也可用 `literature_task rounds` 或 `GET /tasks/:id/rounds` 读取。
|
|
41
|
+
- **每轮结束模型只给「如何完善检索」的建议,不会自行发起下一轮**:工具描述与每次返回尾句都写死这条约束,`literature_task run` 这条旁路同样受限。用户看过结果后,在右侧栏改条件重跑、或在对话里明确要求调整,才进入下一轮。
|
|
42
|
+
|
|
43
|
+
「当前任务」是持久化的最近一次使用或打开的任务:不按对话、也不按时间过期,宿主重启后仍会恢复;任务被删除时自动回退到最近更新的任务。模型每次运行任务都会请求客户端打开 / 聚焦对应 tab(可在设置中关闭自动打开),面板关着也会重新打开;聚焦请求只会送到发起检索的那个对话,不会抢占其他对话的面板。打开任务 tab、从任务列表切换、或切回已开着某任务的对话,都会把该任务设为「当前任务」。只有用户明确要求新建查询任务时才使用 `newTask`。
|
|
44
|
+
|
|
45
|
+
## 安装
|
|
46
|
+
|
|
47
|
+
要求 dsh ≥ 0.2.1-rc.3(`package.json` 的 `engines.dsh` 为 `>=0.2.1-rc.3 <0.3.0-0`)。
|
|
48
|
+
|
|
49
|
+
```sh
|
|
50
|
+
dsh plugin --profile <profile> add dsh-plugin-litsearch
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
包内是预构建产物(`lib/` + `client/client.js`),安装时不运行构建脚本。
|
|
54
|
+
|
|
55
|
+
## 配置
|
|
56
|
+
|
|
57
|
+
插件页 → `dsh-plugin-litsearch` → 配置(保存即生效):
|
|
58
|
+
|
|
59
|
+
| 字段 | 说明 | 默认 |
|
|
60
|
+
|---|---|---|
|
|
61
|
+
| `contactEmail` | 联系邮箱,作为 OpenAlex / Crossref / NCBI 的 polite pool 标识,留空也可用 | 空 |
|
|
62
|
+
| `ncbiApiKey` | 可选,PubMed E-utilities 额度 3 → 10 次/秒;界面不回显 | 空 |
|
|
63
|
+
| `s2ApiKey` | 可选,Semantic Scholar 配额;界面不回显 | 空 |
|
|
64
|
+
| `pubmedIntervalMs` / `s2IntervalMs` / `arxivIntervalMs` | 各源最小请求间隔 | 350 / 3000 / 3000 |
|
|
65
|
+
| `defaultPageSize` | 每个来源默认取多少条 | 20 |
|
|
66
|
+
| `requestTimeoutMs` | 单次上游请求超时(毫秒);Europe PMC 检索另有 25000 下限 | 20000 |
|
|
67
|
+
| `defaultSources` / `defaultSort` / `defaultLanguage` | 新任务默认勾选的数据源、排序与语言 | 全部 / 相关度 / 不限 |
|
|
68
|
+
| `autoOpenTaskTab` / `maxTaskTabs` | 模型发起检索后自动打开 / 聚焦任务 tab;每个对话只保留一个任务 tab,打开新任务会替换旧的。`maxTaskTabs` 为自动打开的兜底上限(按最近真实打开过的 tab 计数,30 分钟后释放名额) | 开 / 5 |
|
|
69
|
+
| `taskRetentionDays` / `taskRetentionCount` / `taskMaxPapers` | 未置顶任务保留天数、保留条数、单任务结果上限 | 90 / 120 / 1500 |
|
|
70
|
+
| `pdfRoot` / `pdfMaxMb` / `autoDownloadPdf` | PDF 保存目录、单文件上限(MB)、检索完成后自动下载 | `~/Downloads/dsh-litsearch` / 30 / 关 |
|
|
71
|
+
| `enableEpmcFulltext` | 没有 PDF 时用 Europe PMC JATS 全文兜底为可读 HTML | 开 |
|
|
72
|
+
| `zoteroEnabled` / `zoteroBaseUrl` | 启用 Zotero 同步及 connector 地址(只允许本机回环) | 开 / `http://127.0.0.1:23119` |
|
|
73
|
+
| `zoteroAttachPdf` / `zoteroTag` | 同步时附带 PDF、附加标签 | 开 / `dsh-litsearch` |
|
|
74
|
+
|
|
75
|
+
设置页还提供诊断与清理:逐源查看最近成功 / 失败与限流冷却并做探活;测试 PDF 下载目录可写性;测试 Zotero connector 连接并读取当前选中分类;按任务 / PDF 缓存 / 全部三种范围清理文件。
|
|
76
|
+
|
|
77
|
+
## 数据目录
|
|
78
|
+
|
|
79
|
+
任务的全部元数据都用本地 JSON 文件保存,位于平台统一存储区(不依赖数据库):
|
|
80
|
+
|
|
81
|
+
```
|
|
82
|
+
$DSH_HOME/storages/dsh-plugin-litsearch/
|
|
83
|
+
├── tasks/index.json # 任务摘要索引(缺失时按任务文件重建)
|
|
84
|
+
├── tasks/<taskId>.json # 单任务全量元数据:条件、轮次、结果、分组、筛读状态、备注
|
|
85
|
+
├── current.json # 当前任务绑定
|
|
86
|
+
├── out/<taskId>/ # CSV / RIS / BibTeX / Markdown 导出
|
|
87
|
+
└── pdfs/<sha256>.pdf # PDF 去重缓存
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
- `DSH_HOME` 由宿主注入,未设置时回落 `~/.dsh`;设置页「存储目录」展示当前实际生效的路径。
|
|
91
|
+
- 旧版本的数据写在 `~/.dsh/dsh-litsearch/`。首次启动时若新目录为空而旧目录有任务,会把任务、导出文件与缓存**复制**到新目录并重建索引,**旧目录原样保留作备份**;新目录已有任务时不再迁移,复制失败则暂时回退到旧目录读取,不会丢标注。
|
|
92
|
+
- **PDF 可读文件不在这里**:它由 `pdfRoot` 决定(默认 `~/Downloads/dsh-litsearch`),任务里记录的 `pdfFile` 是该目录下的绝对路径,升级不影响已下载的文件;只有内部去重缓存 `pdfs/` 随任务目录一起搬迁。
|
|
93
|
+
|
|
94
|
+
## Zotero 同步
|
|
95
|
+
|
|
96
|
+
同步走 Zotero 桌面端自带的 connector(默认 `http://127.0.0.1:23119`),不需要 Web API Key:
|
|
97
|
+
|
|
98
|
+
1. 启动 Zotero 桌面端,保持运行;
|
|
99
|
+
2. 在「设置 → 高级」中允许其他应用与本机通信(若该版本提供此开关);
|
|
100
|
+
3. 如有需要,先在 Zotero 里选中目标分类——未选中时条目会保存到「我的文库」。
|
|
101
|
+
|
|
102
|
+
同步会写入条目元数据、标签与可选 PDF 附件。连接失败、当前分类不可写附件、单篇条目或附件失败都会在界面给出对应提示;分类只读时只保存条目,不尝试上传 PDF。同步失败或部分失败时,任务页会保留一条 RIS 导出入口(只含本次同步的条目),可先导出备用。
|
|
103
|
+
|
|
104
|
+
## 隐私
|
|
105
|
+
|
|
106
|
+
- 检索词会发送给所选数据源(PubMed、Europe PMC、OpenAlex、Crossref、Semantic Scholar、arXiv、PubTator)的公开 API。
|
|
107
|
+
- PDF 下载与 Zotero 连接都只在本机进行;Zotero connector 仅允许回环地址。
|
|
108
|
+
- API Key 只保存在本机配置文件(明文)中,界面不回显、不写日志。
|
|
109
|
+
|
|
110
|
+
## 本地开发
|
|
111
|
+
|
|
112
|
+
```bash
|
|
113
|
+
pnpm install
|
|
114
|
+
pnpm build # Host: src -> lib
|
|
115
|
+
pnpm build:client # Client: src/client -> client/client.js
|
|
116
|
+
pnpm typecheck:client
|
|
117
|
+
pnpm test # node:test 单元测试(test/**/*.test.ts)
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
构建后用独立的本地 profile 启动调试:
|
|
121
|
+
|
|
122
|
+
```bash
|
|
123
|
+
pnpm build && pnpm build:client
|
|
124
|
+
dsh --profile litsearch
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
该 profile 位于 `~/.dsh/profiles/litsearch`,通过 `link:` 指向本仓库,包含 `@deepseek-ai/dsh-base`、`@deepseek-ai/dsh-web-app` 与本插件,不会影响 demo 等其他测试 profile。
|
|
128
|
+
|
|
129
|
+
## 架构
|
|
130
|
+
|
|
131
|
+
- `src/search/`:数据源无关的检索层(类型、聚合、身份合并、查询适配、限流、健康状态)。
|
|
132
|
+
- `src/search/providers/`:每家免费 API 一个 provider,新增数据源只需实现 `Provider` 并注册。
|
|
133
|
+
- `src/host/`:`/dsh-litsearch/api/*` 端点、任务执行 / 持久化 / 统计 / 导出、模型侧工具注册。
|
|
134
|
+
- `src/host/paths.ts`:`$DSH_HOME` 解析、统一存储区路径、旧目录一次性迁移与失败回退。
|
|
135
|
+
- `src/host/pdf/`:PDF 候选链、SSRF 防护的抓取与本地缓存、可读文件名、Europe PMC 全文兜底。
|
|
136
|
+
- `src/host/zotero/`:本机 Zotero connector 协议封装(探测、保存条目、上传附件)。
|
|
137
|
+
- `src/client/`:右侧栏检索面板、任务 tab(结果 / 概览 / 分组 / 笔记 / 对比 / 全文)、独立论文 tab 与设置页。
|
|
138
|
+
|
|
139
|
+
## 路线图
|
|
140
|
+
|
|
141
|
+
- [x] arXiv(Atom XML)
|
|
142
|
+
- [x] PubMed / Europe PMC
|
|
143
|
+
- [x] Semantic Scholar
|
|
144
|
+
- [x] 多检索式与跨式去重
|
|
145
|
+
- [x] 结果筛选、排序与概览统计
|
|
146
|
+
- [x] 筛读、分组、备注与任务对比
|
|
147
|
+
- [x] 续页加载与导出(CSV / RIS / BibTeX / Markdown)
|
|
148
|
+
- [x] PDF 预览 / 下载、Europe PMC 全文兜底、全文台账
|
|
149
|
+
- [x] Zotero 同步与批量操作
|
|
150
|
+
- [x] 高级检索式编辑、任务条件修改与批量插入对话
|
|
151
|
+
- [x] 独立论文页、PubTator 实体与数据源语法提示
|
|
152
|
+
- [x] 对比视图整批纳入、Zotero 失败回退 RIS
|
|
153
|
+
- [x] Unpaywall(按 DOI 补全开放获取全文地址;需配置 `contactEmail`)
|
|
154
|
+
- [ ] DOAJ
|
|
155
|
+
|
|
156
|
+
## License
|
|
157
|
+
|
|
158
|
+
MIT
|