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
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TaskService:任务工作台的唯一事实源。
|
|
3
|
+
*
|
|
4
|
+
* 负责校验/规范化任务条件、维护内存与磁盘状态、串行化执行并广播 rev。
|
|
5
|
+
* 模型工具与面板 HTTP 路由都只调用这里,保证两边操作同一份状态。
|
|
6
|
+
*/
|
|
7
|
+
import type { AnnotationInput, AnnotationResult, CleanupResult, CleanupScope, CompareResult, EventsPage, ExportFile, ExportFormat, HealthInfo, PaperDetail, PaperEntities, PdfDownloadResult, ProbeResult, QueryBlock, ResultsPage, SearchRound, SearchTask, SortMode, SourceId, StorageProbeResult, TaskDetail, TaskGroup, TaskLanguage, TaskOrigin, TaskStatsReport, TaskSummary, ZoteroProbeResult, ZoteroSyncResult } from '../../search/types.js';
|
|
8
|
+
import { type PaperFilter } from './filter.js';
|
|
9
|
+
export interface QueryInput {
|
|
10
|
+
name?: string;
|
|
11
|
+
text: string;
|
|
12
|
+
perSource?: QueryBlock['perSource'];
|
|
13
|
+
enabled?: boolean;
|
|
14
|
+
}
|
|
15
|
+
export interface CreateTaskInput {
|
|
16
|
+
title?: string;
|
|
17
|
+
query?: string;
|
|
18
|
+
queries?: QueryInput[];
|
|
19
|
+
sources?: SourceId[];
|
|
20
|
+
pageSize?: number;
|
|
21
|
+
yearFrom?: number;
|
|
22
|
+
yearTo?: number;
|
|
23
|
+
openAccessOnly?: boolean;
|
|
24
|
+
language?: TaskLanguage;
|
|
25
|
+
types?: string[];
|
|
26
|
+
sort?: SortMode;
|
|
27
|
+
origin: TaskOrigin;
|
|
28
|
+
fromTaskId?: string;
|
|
29
|
+
runNow?: boolean;
|
|
30
|
+
}
|
|
31
|
+
export interface TaskPatch {
|
|
32
|
+
title?: string;
|
|
33
|
+
notes?: string;
|
|
34
|
+
pinned?: boolean;
|
|
35
|
+
groups?: TaskGroup[];
|
|
36
|
+
conditions?: {
|
|
37
|
+
queries?: QueryInput[];
|
|
38
|
+
sources?: SourceId[];
|
|
39
|
+
pageSize?: number;
|
|
40
|
+
yearFrom?: number | null;
|
|
41
|
+
yearTo?: number | null;
|
|
42
|
+
openAccessOnly?: boolean;
|
|
43
|
+
language?: TaskLanguage;
|
|
44
|
+
types?: string[] | null;
|
|
45
|
+
sort?: SortMode;
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
export interface ResultsFilter extends PaperFilter {
|
|
49
|
+
offset?: number;
|
|
50
|
+
limit?: number;
|
|
51
|
+
sort?: SortMode;
|
|
52
|
+
}
|
|
53
|
+
export interface TaskListFilter {
|
|
54
|
+
q?: string;
|
|
55
|
+
origin?: TaskOrigin;
|
|
56
|
+
pinned?: boolean;
|
|
57
|
+
}
|
|
58
|
+
export declare class TaskService {
|
|
59
|
+
readonly ready: Promise<void>;
|
|
60
|
+
private readonly store;
|
|
61
|
+
private readonly events;
|
|
62
|
+
private readonly runner;
|
|
63
|
+
/**
|
|
64
|
+
* 全局「当前任务」:最后一次使用或打开的任务。
|
|
65
|
+
*
|
|
66
|
+
* 不按对话、也不按时间过期——同一主题的后续检索必须在原任务里加一轮,
|
|
67
|
+
* 跨对话、宿主重启都成立。只有用户显式新建任务或点开别的任务时才会改变。
|
|
68
|
+
*/
|
|
69
|
+
private currentTaskId;
|
|
70
|
+
private currentTaskAt;
|
|
71
|
+
constructor();
|
|
72
|
+
/**
|
|
73
|
+
* 先加载任务索引,再恢复「当前任务」快照。
|
|
74
|
+
*
|
|
75
|
+
* 快照缺失或指向已删除任务时,自举为最近更新的任务,避免下一轮检索
|
|
76
|
+
* 又新建一个同名任务。
|
|
77
|
+
*/
|
|
78
|
+
private restore;
|
|
79
|
+
/** 没有可用快照时,把最近更新的任务设为当前任务并落盘。 */
|
|
80
|
+
private bootstrapCurrentTask;
|
|
81
|
+
get globalRev(): number;
|
|
82
|
+
get root(): string;
|
|
83
|
+
isRunning(id: string): boolean;
|
|
84
|
+
health(): HealthInfo;
|
|
85
|
+
eventsSince(sinceRev: number): Promise<EventsPage>;
|
|
86
|
+
list(filter?: TaskListFilter): Promise<TaskSummary[]>;
|
|
87
|
+
get(id: string): Promise<SearchTask>;
|
|
88
|
+
getDetail(id: string): Promise<TaskDetail>;
|
|
89
|
+
/** 任务内轮次历史(时间升序、深拷贝)。 */
|
|
90
|
+
getRounds(id: string): Promise<SearchRound[]>;
|
|
91
|
+
/**
|
|
92
|
+
* 当前任务:最近一次使用或打开的任务。
|
|
93
|
+
*
|
|
94
|
+
* 没有时间窗口、也不区分对话;只要任务还在就一直有效。任务被全部删除后
|
|
95
|
+
* 返回 undefined,由调用方决定是否新建。
|
|
96
|
+
*/
|
|
97
|
+
currentTask(): Promise<SearchTask | undefined>;
|
|
98
|
+
/** 记住最近使用的任务(下一次模型检索默认落在这里)。 */
|
|
99
|
+
setCurrentTask(id: string): void;
|
|
100
|
+
/** 请求客户端打开/聚焦某任务 tab(面板被关掉时重新打开)。 */
|
|
101
|
+
focusTask(id: string, title: string, sessionId?: string): void;
|
|
102
|
+
private persistCurrent;
|
|
103
|
+
/** 用户从任务列表点开某任务 = 进入该任务,之后的模型检索默认落在这里。 */
|
|
104
|
+
activate(id: string): Promise<SearchTask>;
|
|
105
|
+
/** 等待该任务当前这一轮结束;返回是否确实已空闲。 */
|
|
106
|
+
waitUntilIdle(id: string, timeoutMs: number, signal?: AbortSignal): Promise<boolean>;
|
|
107
|
+
create(input: CreateTaskInput): Promise<SearchTask>;
|
|
108
|
+
update(id: string, patch: TaskPatch, expectedRev?: number): Promise<SearchTask>;
|
|
109
|
+
remove(id: string): Promise<void>;
|
|
110
|
+
/**
|
|
111
|
+
* 启动一次执行(任务内新一轮);返回的 Promise 在运行结束后 resolve 为最新任务。
|
|
112
|
+
*
|
|
113
|
+
* 任务已缓存时同步登记运行态,调用方紧接着调 `waitUntilIdle` 也不会误判为空闲。
|
|
114
|
+
*/
|
|
115
|
+
run(id: string, mode?: 'new' | 'more', origin?: TaskOrigin): Promise<SearchTask>;
|
|
116
|
+
/**
|
|
117
|
+
* 在同一任务内开新一轮:全量替换检索条件后执行,**不新建任务、不新开 tab**。
|
|
118
|
+
*
|
|
119
|
+
* 与 `update` 的增量 patch 不同,这里按 CreateTaskInput 重算条件,缺省项回落到
|
|
120
|
+
* 当前设置而不是沿用旧值,保证「提交完整新条件」的语义明确。
|
|
121
|
+
*/
|
|
122
|
+
rerun(id: string, input: CreateTaskInput, origin: TaskOrigin): Promise<SearchTask>;
|
|
123
|
+
cancel(id: string): Promise<SearchTask>;
|
|
124
|
+
results(id: string, filter?: ResultsFilter): Promise<ResultsPage>;
|
|
125
|
+
stats(id: string, filter?: PaperFilter, scope?: 'task' | 'filtered'): Promise<TaskStatsReport>;
|
|
126
|
+
/** 写入筛读 / 分组 / 必读 / 备注;返回新的 rev 与命中条数。 */
|
|
127
|
+
annotate(id: string, inputs: readonly AnnotationInput[], expectedRev?: number): Promise<AnnotationResult>;
|
|
128
|
+
compare(id: string, withTaskId: string): Promise<CompareResult>;
|
|
129
|
+
/** 生成导出内容;`paperIds` 为空表示按当前筛选导出全部。 */
|
|
130
|
+
export(id: string, format: ExportFormat, filter?: PaperFilter, paperIds?: readonly string[]): Promise<ExportFile>;
|
|
131
|
+
/** 把导出内容写到 `<storage>/out/<taskId>/`,供模型工具返回落盘路径。 */
|
|
132
|
+
exportToDisk(id: string, format: ExportFormat, filter?: PaperFilter, paperIds?: readonly string[]): Promise<{
|
|
133
|
+
path: string;
|
|
134
|
+
file: ExportFile;
|
|
135
|
+
count: number;
|
|
136
|
+
}>;
|
|
137
|
+
/** 设置页清理:任务文件与 PDF 缓存。 */
|
|
138
|
+
cleanup(scope: CleanupScope): Promise<CleanupResult>;
|
|
139
|
+
/** 下载单篇 PDF;失败时写入失败状态,若有 EPMC 全文则降级为 html-only。 */
|
|
140
|
+
downloadPdf(id: string, paperId: string): Promise<PdfDownloadResult>;
|
|
141
|
+
/** PDF 预览:优先用已落地文件;没有则临时抓取一次但不落盘。 */
|
|
142
|
+
previewPdf(id: string, paperId: string): Promise<{
|
|
143
|
+
buffer: Buffer;
|
|
144
|
+
filename: string;
|
|
145
|
+
}>;
|
|
146
|
+
/** Europe PMC 全文(JATS → 只含安全标签的 HTML)。 */
|
|
147
|
+
fullText(id: string, paperId: string): Promise<string>;
|
|
148
|
+
/** 单篇论文详情:独立论文页使用,含任务标题与分组。 */
|
|
149
|
+
paperDetail(id: string, paperId: string): Promise<PaperDetail>;
|
|
150
|
+
/** PubTator3 实体标注;无 PMID 时明确告知不可标注。 */
|
|
151
|
+
entities(id: string, paperId: string, signal?: AbortSignal): Promise<PaperEntities>;
|
|
152
|
+
/** 测试 Zotero connector 是否可达,并返回当前选中的分类。 */
|
|
153
|
+
zoteroProbe(): Promise<ZoteroProbeResult>;
|
|
154
|
+
/** 把选中论文同步到 Zotero(含本地 PDF 附件)。 */
|
|
155
|
+
zoteroSync(id: string, paperIds?: readonly string[]): Promise<ZoteroSyncResult>;
|
|
156
|
+
/** 下载目录可写性测试(设置页)。 */
|
|
157
|
+
storageProbe(): Promise<StorageProbeResult>;
|
|
158
|
+
private ensureLocalPdf;
|
|
159
|
+
private setPdfState;
|
|
160
|
+
/** 单源诊断:用固定短查询测一次连通性与延迟(不受冷却影响)。 */
|
|
161
|
+
probe(source: SourceId): Promise<ProbeResult>;
|
|
162
|
+
private tryGet;
|
|
163
|
+
private baseInfo;
|
|
164
|
+
/** `newOnly` 需要基准任务的论文集合;基准已删除时忽略该条件。 */
|
|
165
|
+
private withBaseFilter;
|
|
166
|
+
dispose(): void;
|
|
167
|
+
private begin;
|
|
168
|
+
/** 任务完成后按设置自动下载少量开放获取 PDF(上限 10 篇,避免长时间占用网络)。 */
|
|
169
|
+
private autoDownloadPdfs;
|
|
170
|
+
private readConditions;
|
|
171
|
+
}
|