@mantra-ai/core 0.1.5 → 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/dist/discovery/ranking.d.ts +31 -0
- package/dist/discovery/ranking.d.ts.map +1 -0
- package/dist/discovery/ranking.js +195 -0
- package/dist/discovery/ranking.js.map +1 -0
- package/dist/discovery/registry.d.ts +32 -0
- package/dist/discovery/registry.d.ts.map +1 -0
- package/dist/discovery/registry.js +90 -0
- package/dist/discovery/registry.js.map +1 -0
- package/dist/discovery/types.d.ts +92 -0
- package/dist/discovery/types.d.ts.map +1 -0
- package/dist/discovery/types.js +8 -0
- package/dist/discovery/types.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/sources/semantic-scholar/client.d.ts +69 -0
- package/dist/sources/semantic-scholar/client.d.ts.map +1 -0
- package/dist/sources/semantic-scholar/client.js +129 -0
- package/dist/sources/semantic-scholar/client.js.map +1 -0
- package/dist/sources/semantic-scholar/provider.d.ts +17 -0
- package/dist/sources/semantic-scholar/provider.d.ts.map +1 -0
- package/dist/sources/semantic-scholar/provider.js +63 -0
- package/dist/sources/semantic-scholar/provider.js.map +1 -0
- package/dist/types/version.d.ts +84 -84
- package/dist/types/work.d.ts +216 -216
- package/package.json +1 -1
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { DiscoverCandidateCore, DiscoverSourceKind } from "./types";
|
|
2
|
+
/**
|
|
3
|
+
* Normalize a raw source-specific score to 0–1 (lower = better).
|
|
4
|
+
*
|
|
5
|
+
* Each source uses a different scoring system:
|
|
6
|
+
* - Mantra FTS: BM25 rank (negative float, lower = better match)
|
|
7
|
+
* - Zotero: match-location score (negative int, e.g. -15 for title match)
|
|
8
|
+
* - Semantic Scholar: position in relevance-ordered results (0-based index)
|
|
9
|
+
* - null score: treated as 0.5 (neutral)
|
|
10
|
+
*/
|
|
11
|
+
export declare function normalizeScore(raw: number | null, sourceKind: DiscoverSourceKind, opts?: {
|
|
12
|
+
resultCount?: number;
|
|
13
|
+
}): number;
|
|
14
|
+
/**
|
|
15
|
+
* Merge candidates from multiple sources.
|
|
16
|
+
* Primary key: normalized DOI.
|
|
17
|
+
* Secondary key: normalized title (for DOI-less papers, min 10 chars).
|
|
18
|
+
*/
|
|
19
|
+
export declare function mergeCandidates(candidates: DiscoverCandidateCore[]): DiscoverCandidateCore[];
|
|
20
|
+
export interface RankOpts {
|
|
21
|
+
/** Limit output to top N candidates. */
|
|
22
|
+
limit?: number;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Unified ranking pipeline:
|
|
26
|
+
* 1. Normalize each candidate's raw score to 0–1.
|
|
27
|
+
* 2. Apply boosts for locality, citations, and recency.
|
|
28
|
+
* 3. Sort ascending (lower = better). Deterministic tiebreak by title.
|
|
29
|
+
*/
|
|
30
|
+
export declare function rankCandidates(candidates: DiscoverCandidateCore[], opts?: RankOpts): DiscoverCandidateCore[];
|
|
31
|
+
//# sourceMappingURL=ranking.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ranking.d.ts","sourceRoot":"","sources":["../../src/discovery/ranking.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAkBzE;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAC5B,GAAG,EAAE,MAAM,GAAG,IAAI,EAClB,UAAU,EAAE,kBAAkB,EAC9B,IAAI,CAAC,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,GAC9B,MAAM,CA+BR;AA4ED;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,UAAU,EAAE,qBAAqB,EAAE,GAClC,qBAAqB,EAAE,CAiDzB;AAID,MAAM,WAAW,QAAQ;IACvB,wCAAwC;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAC5B,UAAU,EAAE,qBAAqB,EAAE,EACnC,IAAI,CAAC,EAAE,QAAQ,GACd,qBAAqB,EAAE,CA0BzB"}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
// ── Boost weights (tunable) ──────────────────────────────────────────
|
|
2
|
+
/** Boost applied when the paper exists in a local source. */
|
|
3
|
+
const LOCAL_BOOST = 0.15;
|
|
4
|
+
/** Max boost for highly-cited papers (log-scaled). */
|
|
5
|
+
const CITATION_BOOST_MAX = 0.15;
|
|
6
|
+
/** Max boost for recent papers (< 3 years old). */
|
|
7
|
+
const RECENCY_BOOST_MAX = 0.10;
|
|
8
|
+
/** Citation count at which the citation boost saturates. */
|
|
9
|
+
const CITATION_SATURATION = 10_000;
|
|
10
|
+
// ── Score normalization ──────────────────────────────────────────────
|
|
11
|
+
/**
|
|
12
|
+
* Normalize a raw source-specific score to 0–1 (lower = better).
|
|
13
|
+
*
|
|
14
|
+
* Each source uses a different scoring system:
|
|
15
|
+
* - Mantra FTS: BM25 rank (negative float, lower = better match)
|
|
16
|
+
* - Zotero: match-location score (negative int, e.g. -15 for title match)
|
|
17
|
+
* - Semantic Scholar: position in relevance-ordered results (0-based index)
|
|
18
|
+
* - null score: treated as 0.5 (neutral)
|
|
19
|
+
*/
|
|
20
|
+
export function normalizeScore(raw, sourceKind, opts) {
|
|
21
|
+
if (raw === null)
|
|
22
|
+
return 0.5;
|
|
23
|
+
switch (sourceKind) {
|
|
24
|
+
case "mantra": {
|
|
25
|
+
// BM25 rank: typically -20 (best) to 0 (worst).
|
|
26
|
+
// Clamp to [-30, 0] then map to [0, 1].
|
|
27
|
+
const clamped = Math.max(-30, Math.min(0, raw));
|
|
28
|
+
return (clamped + 30) / 30;
|
|
29
|
+
}
|
|
30
|
+
case "zotero": {
|
|
31
|
+
// Zotero scores: -15 (title match) to -2 (author match).
|
|
32
|
+
// Map [-20, 0] → [0, 1].
|
|
33
|
+
const clamped = Math.max(-20, Math.min(0, raw));
|
|
34
|
+
return (clamped + 20) / 20;
|
|
35
|
+
}
|
|
36
|
+
case "semantic-scholar": {
|
|
37
|
+
// S2 results are ordered by relevance (position 0 = best).
|
|
38
|
+
// Normalize by result count, fallback to 20 if unknown.
|
|
39
|
+
const count = opts?.resultCount ?? 20;
|
|
40
|
+
return Math.min(1, raw / Math.max(1, count));
|
|
41
|
+
}
|
|
42
|
+
default: {
|
|
43
|
+
// Unknown source: assume raw is already roughly 0–1 or treat as neutral.
|
|
44
|
+
if (raw >= 0 && raw <= 1)
|
|
45
|
+
return raw;
|
|
46
|
+
return 0.5;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
// ── Boost functions ──────────────────────────────────────────────────
|
|
51
|
+
function localBoost(candidate) {
|
|
52
|
+
const hasLocal = candidate.sources.some((s) => s === "mantra" || s === "zotero" || s === "pdf-index");
|
|
53
|
+
return hasLocal ? LOCAL_BOOST : 0;
|
|
54
|
+
}
|
|
55
|
+
function citationBoost(candidate) {
|
|
56
|
+
const count = candidate.citationCount;
|
|
57
|
+
if (count == null || count <= 0)
|
|
58
|
+
return 0;
|
|
59
|
+
// Log-scaled: log(1 + count) / log(1 + SATURATION), capped at max.
|
|
60
|
+
return Math.min(CITATION_BOOST_MAX, (Math.log(1 + count) / Math.log(1 + CITATION_SATURATION)) * CITATION_BOOST_MAX);
|
|
61
|
+
}
|
|
62
|
+
function recencyBoost(candidate) {
|
|
63
|
+
if (candidate.year == null)
|
|
64
|
+
return 0;
|
|
65
|
+
const currentYear = new Date().getFullYear();
|
|
66
|
+
const age = currentYear - candidate.year;
|
|
67
|
+
if (age < 0)
|
|
68
|
+
return RECENCY_BOOST_MAX; // future-dated = very recent
|
|
69
|
+
if (age >= 3)
|
|
70
|
+
return 0;
|
|
71
|
+
// Linear decay: 0 years → full boost, 3 years → 0.
|
|
72
|
+
return RECENCY_BOOST_MAX * (1 - age / 3);
|
|
73
|
+
}
|
|
74
|
+
// ── Dedup ────────────────────────────────────────────────────────────
|
|
75
|
+
/**
|
|
76
|
+
* Normalize a title for dedup comparison:
|
|
77
|
+
* lowercase, strip punctuation and extra whitespace.
|
|
78
|
+
*/
|
|
79
|
+
function normalizeTitle(title) {
|
|
80
|
+
return title
|
|
81
|
+
.toLowerCase()
|
|
82
|
+
.replace(/[^\w\s]/g, "")
|
|
83
|
+
.replace(/\s+/g, " ")
|
|
84
|
+
.trim();
|
|
85
|
+
}
|
|
86
|
+
function mergeTwo(a, b) {
|
|
87
|
+
return {
|
|
88
|
+
doi: a.doi ?? b.doi,
|
|
89
|
+
title: a.title ?? b.title,
|
|
90
|
+
authors: a.authors ?? b.authors,
|
|
91
|
+
year: a.year ?? b.year,
|
|
92
|
+
sources: [...new Set([...a.sources, ...b.sources])],
|
|
93
|
+
score: bestRawScore(a.score, b.score),
|
|
94
|
+
// Merge materialization metadata (prefer non-null)
|
|
95
|
+
mantraId: a.mantraId ?? b.mantraId,
|
|
96
|
+
zoteroKey: a.zoteroKey ?? b.zoteroKey,
|
|
97
|
+
pdfPath: a.pdfPath ?? b.pdfPath,
|
|
98
|
+
// Merge remote metadata (prefer non-null)
|
|
99
|
+
semanticScholarId: a.semanticScholarId ?? b.semanticScholarId,
|
|
100
|
+
citationCount: a.citationCount ?? b.citationCount,
|
|
101
|
+
influentialCitationCount: a.influentialCitationCount ?? b.influentialCitationCount,
|
|
102
|
+
abstractSnippet: a.abstractSnippet ?? b.abstractSnippet,
|
|
103
|
+
venue: a.venue ?? b.venue,
|
|
104
|
+
url: a.url ?? b.url,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
function bestRawScore(a, b) {
|
|
108
|
+
if (a === null)
|
|
109
|
+
return b;
|
|
110
|
+
if (b === null)
|
|
111
|
+
return a;
|
|
112
|
+
return Math.min(a, b);
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Merge candidates from multiple sources.
|
|
116
|
+
* Primary key: normalized DOI.
|
|
117
|
+
* Secondary key: normalized title (for DOI-less papers, min 10 chars).
|
|
118
|
+
*/
|
|
119
|
+
export function mergeCandidates(candidates) {
|
|
120
|
+
const byDoi = new Map();
|
|
121
|
+
const byTitle = new Map();
|
|
122
|
+
const unkeyed = [];
|
|
123
|
+
for (const c of candidates) {
|
|
124
|
+
if (c.doi) {
|
|
125
|
+
const key = c.doi.toLowerCase();
|
|
126
|
+
const existing = byDoi.get(key);
|
|
127
|
+
if (existing) {
|
|
128
|
+
byDoi.set(key, mergeTwo(existing, c));
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
byDoi.set(key, { ...c });
|
|
132
|
+
}
|
|
133
|
+
continue;
|
|
134
|
+
}
|
|
135
|
+
if (c.title) {
|
|
136
|
+
const key = normalizeTitle(c.title);
|
|
137
|
+
if (key.length >= 10) {
|
|
138
|
+
const existing = byTitle.get(key);
|
|
139
|
+
if (existing) {
|
|
140
|
+
byTitle.set(key, mergeTwo(existing, c));
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
byTitle.set(key, { ...c });
|
|
144
|
+
}
|
|
145
|
+
continue;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
unkeyed.push(c);
|
|
149
|
+
}
|
|
150
|
+
// Cross-check: title-keyed entries that also match a DOI-keyed entry
|
|
151
|
+
for (const [titleKey, titleCandidate] of byTitle) {
|
|
152
|
+
let merged = false;
|
|
153
|
+
for (const [, doiCandidate] of byDoi) {
|
|
154
|
+
if (doiCandidate.title && normalizeTitle(doiCandidate.title) === titleKey) {
|
|
155
|
+
byDoi.set(doiCandidate.doi.toLowerCase(), mergeTwo(doiCandidate, titleCandidate));
|
|
156
|
+
merged = true;
|
|
157
|
+
break;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
if (!merged) {
|
|
161
|
+
unkeyed.push(titleCandidate);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
return [...byDoi.values(), ...unkeyed];
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Unified ranking pipeline:
|
|
168
|
+
* 1. Normalize each candidate's raw score to 0–1.
|
|
169
|
+
* 2. Apply boosts for locality, citations, and recency.
|
|
170
|
+
* 3. Sort ascending (lower = better). Deterministic tiebreak by title.
|
|
171
|
+
*/
|
|
172
|
+
export function rankCandidates(candidates, opts) {
|
|
173
|
+
const scored = candidates.map((c) => {
|
|
174
|
+
// Use the first source for normalization context
|
|
175
|
+
const primarySource = c.sources[0] ?? "unknown";
|
|
176
|
+
const normalized = normalizeScore(c.score, primarySource);
|
|
177
|
+
// Boosts are subtracted (lower = better)
|
|
178
|
+
const finalScore = normalized -
|
|
179
|
+
localBoost(c) -
|
|
180
|
+
citationBoost(c) -
|
|
181
|
+
recencyBoost(c);
|
|
182
|
+
return { candidate: c, finalScore };
|
|
183
|
+
});
|
|
184
|
+
// Sort: lower finalScore = better. Tiebreak by title.
|
|
185
|
+
scored.sort((a, b) => {
|
|
186
|
+
if (a.finalScore !== b.finalScore)
|
|
187
|
+
return a.finalScore - b.finalScore;
|
|
188
|
+
const aTitle = (a.candidate.title ?? "").toLowerCase();
|
|
189
|
+
const bTitle = (b.candidate.title ?? "").toLowerCase();
|
|
190
|
+
return aTitle.localeCompare(bTitle);
|
|
191
|
+
});
|
|
192
|
+
const limit = opts?.limit ?? scored.length;
|
|
193
|
+
return scored.slice(0, limit).map((s) => s.candidate);
|
|
194
|
+
}
|
|
195
|
+
//# sourceMappingURL=ranking.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ranking.js","sourceRoot":"","sources":["../../src/discovery/ranking.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { DiscoverCapability, DiscoverCandidateCore, DiscoverProvider, ProviderError, RegistrySearchOpts, RegistrySearchResult } from "./types";
|
|
2
|
+
/**
|
|
3
|
+
* Holds registered discovery providers, runs searches in parallel,
|
|
4
|
+
* and isolates per-provider failures.
|
|
5
|
+
*/
|
|
6
|
+
export declare class ProviderRegistry {
|
|
7
|
+
private providers;
|
|
8
|
+
register(provider: DiscoverProvider): void;
|
|
9
|
+
/** Get providers filtered by capability and/or locality. */
|
|
10
|
+
getProviders(filter?: {
|
|
11
|
+
capability?: DiscoverCapability;
|
|
12
|
+
local?: boolean;
|
|
13
|
+
}): DiscoverProvider[];
|
|
14
|
+
/**
|
|
15
|
+
* Run all search-capable providers in parallel.
|
|
16
|
+
*
|
|
17
|
+
* Returns results split by local vs remote. A failure in one
|
|
18
|
+
* provider does not abort the others — it is captured in `errors`.
|
|
19
|
+
*/
|
|
20
|
+
searchAll(query: string, opts?: RegistrySearchOpts): Promise<RegistrySearchResult>;
|
|
21
|
+
/**
|
|
22
|
+
* Run all augment-capable providers on a candidate list.
|
|
23
|
+
*
|
|
24
|
+
* Augmenters run sequentially (each may depend on prior enrichment).
|
|
25
|
+
* Failures are captured but do not abort the chain.
|
|
26
|
+
*/
|
|
27
|
+
augmentAll(candidates: DiscoverCandidateCore[]): Promise<{
|
|
28
|
+
candidates: DiscoverCandidateCore[];
|
|
29
|
+
errors: ProviderError[];
|
|
30
|
+
}>;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/discovery/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,kBAAkB,EAClB,qBAAqB,EACrB,gBAAgB,EAChB,aAAa,EACb,kBAAkB,EAClB,oBAAoB,EACrB,MAAM,SAAS,CAAC;AAEjB;;;GAGG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,SAAS,CAA0B;IAE3C,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,GAAG,IAAI;IAI1C,4DAA4D;IAC5D,YAAY,CAAC,MAAM,CAAC,EAAE;QACpB,UAAU,CAAC,EAAE,kBAAkB,CAAC;QAChC,KAAK,CAAC,EAAE,OAAO,CAAC;KACjB,GAAG,gBAAgB,EAAE;IAetB;;;;;OAKG;IACG,SAAS,CACb,KAAK,EAAE,MAAM,EACb,IAAI,CAAC,EAAE,kBAAkB,GACxB,OAAO,CAAC,oBAAoB,CAAC;IA0ChC;;;;;OAKG;IACG,UAAU,CACd,UAAU,EAAE,qBAAqB,EAAE,GAClC,OAAO,CAAC;QAAE,UAAU,EAAE,qBAAqB,EAAE,CAAC;QAAC,MAAM,EAAE,aAAa,EAAE,CAAA;KAAE,CAAC;CAoB7E"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Holds registered discovery providers, runs searches in parallel,
|
|
3
|
+
* and isolates per-provider failures.
|
|
4
|
+
*/
|
|
5
|
+
export class ProviderRegistry {
|
|
6
|
+
providers = [];
|
|
7
|
+
register(provider) {
|
|
8
|
+
this.providers.push(provider);
|
|
9
|
+
}
|
|
10
|
+
/** Get providers filtered by capability and/or locality. */
|
|
11
|
+
getProviders(filter) {
|
|
12
|
+
let list = this.providers;
|
|
13
|
+
if (filter?.capability) {
|
|
14
|
+
const cap = filter.capability;
|
|
15
|
+
list = list.filter((p) => p.capabilities.includes(cap));
|
|
16
|
+
}
|
|
17
|
+
if (filter?.local !== undefined) {
|
|
18
|
+
const local = filter.local;
|
|
19
|
+
list = list.filter((p) => p.isLocal === local);
|
|
20
|
+
}
|
|
21
|
+
return list;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Run all search-capable providers in parallel.
|
|
25
|
+
*
|
|
26
|
+
* Returns results split by local vs remote. A failure in one
|
|
27
|
+
* provider does not abort the others — it is captured in `errors`.
|
|
28
|
+
*/
|
|
29
|
+
async searchAll(query, opts) {
|
|
30
|
+
const searchProviders = this.getProviders({ capability: "search" });
|
|
31
|
+
const active = opts?.localOnly
|
|
32
|
+
? searchProviders.filter((p) => p.isLocal)
|
|
33
|
+
: searchProviders;
|
|
34
|
+
const local = [];
|
|
35
|
+
const remote = [];
|
|
36
|
+
const errors = [];
|
|
37
|
+
const settled = await Promise.allSettled(active.map(async (provider) => {
|
|
38
|
+
const results = await provider.search(query, { limit: opts?.limit });
|
|
39
|
+
return { provider, results };
|
|
40
|
+
}));
|
|
41
|
+
for (const outcome of settled) {
|
|
42
|
+
if (outcome.status === "fulfilled") {
|
|
43
|
+
const { provider, results } = outcome.value;
|
|
44
|
+
const bucket = provider.isLocal ? local : remote;
|
|
45
|
+
bucket.push(...results);
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
// Extract provider info from the rejected promise
|
|
49
|
+
// Promise.allSettled doesn't give us the input, so we match by index
|
|
50
|
+
const idx = settled.indexOf(outcome);
|
|
51
|
+
const provider = active[idx];
|
|
52
|
+
errors.push({
|
|
53
|
+
provider: provider?.name ?? "unknown",
|
|
54
|
+
sourceKind: provider?.sourceKind ?? "unknown",
|
|
55
|
+
error: outcome.reason instanceof Error
|
|
56
|
+
? outcome.reason.message
|
|
57
|
+
: String(outcome.reason),
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return { local, remote, errors };
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Run all augment-capable providers on a candidate list.
|
|
65
|
+
*
|
|
66
|
+
* Augmenters run sequentially (each may depend on prior enrichment).
|
|
67
|
+
* Failures are captured but do not abort the chain.
|
|
68
|
+
*/
|
|
69
|
+
async augmentAll(candidates) {
|
|
70
|
+
const augmenters = this.getProviders({ capability: "augment" });
|
|
71
|
+
const errors = [];
|
|
72
|
+
let result = candidates;
|
|
73
|
+
for (const provider of augmenters) {
|
|
74
|
+
if (!provider.augment)
|
|
75
|
+
continue;
|
|
76
|
+
try {
|
|
77
|
+
result = await provider.augment(result);
|
|
78
|
+
}
|
|
79
|
+
catch (e) {
|
|
80
|
+
errors.push({
|
|
81
|
+
provider: provider.name,
|
|
82
|
+
sourceKind: provider.sourceKind,
|
|
83
|
+
error: e instanceof Error ? e.message : String(e),
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return { candidates: result, errors };
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/discovery/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core discovery contracts.
|
|
3
|
+
*
|
|
4
|
+
* Every discovery source (local or remote) implements DiscoverProvider.
|
|
5
|
+
* The registry orchestrates providers by capability and phase.
|
|
6
|
+
*/
|
|
7
|
+
/** What a provider can do. */
|
|
8
|
+
export type DiscoverCapability = "search" | "augment";
|
|
9
|
+
/**
|
|
10
|
+
* Extensible source identifier.
|
|
11
|
+
* Built-in kinds are listed here; providers may add new ones.
|
|
12
|
+
*/
|
|
13
|
+
export type DiscoverSourceKind = "mantra" | "zotero" | "pdf-index" | "semantic-scholar" | (string & {});
|
|
14
|
+
/**
|
|
15
|
+
* A paper found during discovery, before materialization.
|
|
16
|
+
*
|
|
17
|
+
* Core fields are source-agnostic. Optional fields carry richer
|
|
18
|
+
* metadata from remote sources (citation counts, venue, etc.).
|
|
19
|
+
*/
|
|
20
|
+
export interface DiscoverCandidateCore {
|
|
21
|
+
doi: string | null;
|
|
22
|
+
title: string | null;
|
|
23
|
+
authors: string | null;
|
|
24
|
+
year: number | null;
|
|
25
|
+
/** Which sources contributed to this candidate. */
|
|
26
|
+
sources: DiscoverSourceKind[];
|
|
27
|
+
/** Raw relevance score from the source (interpretation varies). */
|
|
28
|
+
score: number | null;
|
|
29
|
+
/** Mantra store paper ID — set by MantraProvider when the paper is already ingested. */
|
|
30
|
+
mantraId?: number | null;
|
|
31
|
+
/** Zotero item key — set by ZoteroProvider for materialization. */
|
|
32
|
+
zoteroKey?: string | null;
|
|
33
|
+
/** Resolved local PDF path — set by PDF index augmenter or Zotero. */
|
|
34
|
+
pdfPath?: string | null;
|
|
35
|
+
/** Semantic Scholar paper ID. */
|
|
36
|
+
semanticScholarId?: string | null;
|
|
37
|
+
/** Total citation count. */
|
|
38
|
+
citationCount?: number | null;
|
|
39
|
+
/** Influential citation count (Semantic Scholar). */
|
|
40
|
+
influentialCitationCount?: number | null;
|
|
41
|
+
/** Short abstract or snippet. */
|
|
42
|
+
abstractSnippet?: string | null;
|
|
43
|
+
/** Publication venue name. */
|
|
44
|
+
venue?: string | null;
|
|
45
|
+
/** Canonical URL to the paper. */
|
|
46
|
+
url?: string | null;
|
|
47
|
+
}
|
|
48
|
+
export interface DiscoverSearchOpts {
|
|
49
|
+
limit?: number;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Contract every discovery source implements.
|
|
53
|
+
*
|
|
54
|
+
* - `search` providers return candidates for a text query.
|
|
55
|
+
* - `augment` providers enrich an existing candidate list (e.g. attach PDF paths).
|
|
56
|
+
*/
|
|
57
|
+
export interface DiscoverProvider {
|
|
58
|
+
/** Human-readable name (e.g. "Semantic Scholar"). */
|
|
59
|
+
readonly name: string;
|
|
60
|
+
/** Machine identifier for this source. */
|
|
61
|
+
readonly sourceKind: DiscoverSourceKind;
|
|
62
|
+
/** What this provider can do. */
|
|
63
|
+
readonly capabilities: readonly DiscoverCapability[];
|
|
64
|
+
/** True for sources backed by local data (store, Zotero, PDF dirs). */
|
|
65
|
+
readonly isLocal: boolean;
|
|
66
|
+
/**
|
|
67
|
+
* Search for papers matching a query.
|
|
68
|
+
* Only called on providers with the "search" capability.
|
|
69
|
+
*/
|
|
70
|
+
search(query: string, opts?: DiscoverSearchOpts): Promise<DiscoverCandidateCore[]>;
|
|
71
|
+
/**
|
|
72
|
+
* Enrich candidates with additional metadata.
|
|
73
|
+
* Only called on providers with the "augment" capability.
|
|
74
|
+
* Mutates candidates in-place and returns the same array.
|
|
75
|
+
*/
|
|
76
|
+
augment?(candidates: DiscoverCandidateCore[]): Promise<DiscoverCandidateCore[]>;
|
|
77
|
+
}
|
|
78
|
+
export interface RegistrySearchOpts {
|
|
79
|
+
limit?: number;
|
|
80
|
+
localOnly?: boolean;
|
|
81
|
+
}
|
|
82
|
+
export interface RegistrySearchResult {
|
|
83
|
+
local: DiscoverCandidateCore[];
|
|
84
|
+
remote: DiscoverCandidateCore[];
|
|
85
|
+
errors: ProviderError[];
|
|
86
|
+
}
|
|
87
|
+
export interface ProviderError {
|
|
88
|
+
provider: string;
|
|
89
|
+
sourceKind: DiscoverSourceKind;
|
|
90
|
+
error: string;
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/discovery/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,8BAA8B;AAC9B,MAAM,MAAM,kBAAkB,GAAG,QAAQ,GAAG,SAAS,CAAC;AAItD;;;GAGG;AACH,MAAM,MAAM,kBAAkB,GAC1B,QAAQ,GACR,QAAQ,GACR,WAAW,GACX,kBAAkB,GAClB,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;AAIlB;;;;;GAKG;AACH,MAAM,WAAW,qBAAqB;IACpC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAEpB,mDAAmD;IACnD,OAAO,EAAE,kBAAkB,EAAE,CAAC;IAE9B,mEAAmE;IACnE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAIrB,wFAAwF;IACxF,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,mEAAmE;IACnE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,sEAAsE;IACtE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAIxB,iCAAiC;IACjC,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,4BAA4B;IAC5B,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,qDAAqD;IACrD,wBAAwB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzC,iCAAiC;IACjC,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,8BAA8B;IAC9B,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,kCAAkC;IAClC,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACrB;AAID,MAAM,WAAW,kBAAkB;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;GAKG;AACH,MAAM,WAAW,gBAAgB;IAC/B,qDAAqD;IACrD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,0CAA0C;IAC1C,QAAQ,CAAC,UAAU,EAAE,kBAAkB,CAAC;IAExC,iCAAiC;IACjC,QAAQ,CAAC,YAAY,EAAE,SAAS,kBAAkB,EAAE,CAAC;IAErD,uEAAuE;IACvE,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAE1B;;;OAGG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAAC;IAEnF;;;;OAIG;IACH,OAAO,CAAC,CAAC,UAAU,EAAE,qBAAqB,EAAE,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAAC;CACjF;AAID,MAAM,WAAW,kBAAkB;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAID,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,qBAAqB,EAAE,CAAC;IAC/B,MAAM,EAAE,qBAAqB,EAAE,CAAC;IAChC,MAAM,EAAE,aAAa,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,kBAAkB,CAAC;IAC/B,KAAK,EAAE,MAAM,CAAC;CACf"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/discovery/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|
package/dist/index.d.ts
CHANGED
|
@@ -18,6 +18,13 @@ export { pickFirstString, parseArxivIdFromUrl, parseArxivIdFromDoi, parseBiorxiv
|
|
|
18
18
|
export { createWorkId } from "./works/util/work-id";
|
|
19
19
|
export { NormalizedDocSchema, SectionCategoryEnum, } from "./normalization/normalized-doc-schema";
|
|
20
20
|
export type { NormalizedDoc } from "./normalization/normalized-doc-schema";
|
|
21
|
+
export type { DiscoverCapability, DiscoverSourceKind, DiscoverCandidateCore, DiscoverProvider, DiscoverSearchOpts, RegistrySearchOpts, RegistrySearchResult, ProviderError, } from "./discovery/types";
|
|
22
|
+
export { ProviderRegistry } from "./discovery/registry";
|
|
23
|
+
export { normalizeScore, mergeCandidates, rankCandidates, } from "./discovery/ranking";
|
|
24
|
+
export type { RankOpts } from "./discovery/ranking";
|
|
25
|
+
export { SemanticScholarProvider } from "./sources/semantic-scholar/provider";
|
|
26
|
+
export { searchPapers as s2SearchPapers, getPaperDetails as s2GetPaperDetails, } from "./sources/semantic-scholar/client";
|
|
27
|
+
export type { S2Paper, S2Author, S2ExternalIds, S2SearchResponse, S2ClientOpts, } from "./sources/semantic-scholar/client";
|
|
21
28
|
export type { PaperDigest, HypothesisSet, Hypothesis } from "./analysis/schemas";
|
|
22
29
|
export { PaperDigestSchema, HypothesisSetSchema } from "./analysis/schemas";
|
|
23
30
|
export { extractFindings } from "./analysis/extract-findings";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AAGjC,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACrE,YAAY,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAGxD,YAAY,EACV,aAAa,EACb,mBAAmB,EACnB,aAAa,EACb,WAAW,EACX,YAAY,EACZ,UAAU,EACV,cAAc,EACd,aAAa,EACb,aAAa,EACb,cAAc,EACd,WAAW,EACX,gBAAgB,EAChB,WAAW,EACX,YAAY,EACZ,cAAc,EACd,gBAAgB,EAChB,WAAW,EACX,gBAAgB,EAChB,YAAY,EACZ,UAAU,EACV,iBAAiB,EACjB,YAAY,EACZ,UAAU,EACV,IAAI,EACJ,eAAe,EACf,YAAY,EACZ,eAAe,EACf,WAAW,EACX,eAAe,EACf,gBAAgB,EAChB,WAAW,GACZ,MAAM,eAAe,CAAC;AAGvB,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGzC,YAAY,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAC3E,OAAO,EACL,YAAY,EACZ,SAAS,EACT,aAAa,EACb,cAAc,EACd,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,6BAA6B,EAAE,MAAM,0BAA0B,CAAC;AACzE,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AACvE,YAAY,EAAE,MAAM,EAAE,MAAM,kCAAkC,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,YAAY,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAGvE,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC3E,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EACL,eAAe,EACf,mBAAmB,EACnB,mBAAmB,EACnB,4BAA4B,GAC7B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAGpD,OAAO,EACL,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,uCAAuC,CAAC;AAC/C,YAAY,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AAG3E,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACjF,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC5E,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -18,6 +18,11 @@ export { pickFirstString, parseArxivIdFromUrl, parseArxivIdFromDoi, parseBiorxiv
|
|
|
18
18
|
export { createWorkId } from "./works/util/work-id";
|
|
19
19
|
// ── Normalization ──────────────────────────────────────────────────
|
|
20
20
|
export { NormalizedDocSchema, SectionCategoryEnum, } from "./normalization/normalized-doc-schema";
|
|
21
|
+
export { ProviderRegistry } from "./discovery/registry";
|
|
22
|
+
export { normalizeScore, mergeCandidates, rankCandidates, } from "./discovery/ranking";
|
|
23
|
+
// ── Sources: Semantic Scholar ────────────────────────────────────
|
|
24
|
+
export { SemanticScholarProvider } from "./sources/semantic-scholar/provider";
|
|
25
|
+
export { searchPapers as s2SearchPapers, getPaperDetails as s2GetPaperDetails, } from "./sources/semantic-scholar/client";
|
|
21
26
|
export { PaperDigestSchema, HypothesisSetSchema } from "./analysis/schemas";
|
|
22
27
|
export { extractFindings } from "./analysis/extract-findings";
|
|
23
28
|
export { generateHypotheses } from "./analysis/generate-hypotheses";
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,iCAAiC;AAEjC,sEAAsE;AACtE,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AAEjC,sEAAsE;AACtE,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAsCrE,sEAAsE;AACtE,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAIzC,OAAO,EACL,YAAY,EACZ,SAAS,EACT,aAAa,EACb,cAAc,EACd,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,6BAA6B,EAAE,MAAM,0BAA0B,CAAC;AACzE,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AAEvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAGhE,sEAAsE;AACtE,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC3E,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EACL,eAAe,EACf,mBAAmB,EACnB,mBAAmB,EACnB,4BAA4B,GAC7B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpD,sEAAsE;AACtE,OAAO,EACL,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,uCAAuC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,iCAAiC;AAEjC,sEAAsE;AACtE,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AAEjC,sEAAsE;AACtE,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAsCrE,sEAAsE;AACtE,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAIzC,OAAO,EACL,YAAY,EACZ,SAAS,EACT,aAAa,EACb,cAAc,EACd,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,6BAA6B,EAAE,MAAM,0BAA0B,CAAC;AACzE,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AAEvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAGhE,sEAAsE;AACtE,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC3E,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EACL,eAAe,EACf,mBAAmB,EACnB,mBAAmB,EACnB,4BAA4B,GAC7B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpD,sEAAsE;AACtE,OAAO,EACL,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,uCAAuC,CAAC;AAc/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EACL,cAAc,EACd,eAAe,EACf,cAAc,GACf,MAAM,qBAAqB,CAAC;AAG7B,oEAAoE;AACpE,OAAO,EAAE,uBAAuB,EAAE,MAAM,qCAAqC,CAAC;AAC9E,OAAO,EACL,YAAY,IAAI,cAAc,EAC9B,eAAe,IAAI,iBAAiB,GACrC,MAAM,mCAAmC,CAAC;AAW3C,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC5E,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Typed client for the Semantic Scholar Academic Graph API.
|
|
3
|
+
*
|
|
4
|
+
* Unauthenticated: 100 requests per 5 minutes.
|
|
5
|
+
* Authenticated (x-api-key header): higher limits.
|
|
6
|
+
*
|
|
7
|
+
* @see https://api.semanticscholar.org/api-docs/graph
|
|
8
|
+
*/
|
|
9
|
+
import type { AdapterResult } from "../../works/types";
|
|
10
|
+
export interface S2Author {
|
|
11
|
+
authorId: string | null;
|
|
12
|
+
name: string | null;
|
|
13
|
+
}
|
|
14
|
+
export interface S2ExternalIds {
|
|
15
|
+
DOI?: string | null;
|
|
16
|
+
ArXiv?: string | null;
|
|
17
|
+
PubMed?: string | null;
|
|
18
|
+
PMCID?: string | null;
|
|
19
|
+
MAG?: string | null;
|
|
20
|
+
CorpusId?: number | null;
|
|
21
|
+
}
|
|
22
|
+
export interface S2Paper {
|
|
23
|
+
paperId: string;
|
|
24
|
+
title: string | null;
|
|
25
|
+
abstract: string | null;
|
|
26
|
+
year: number | null;
|
|
27
|
+
authors: S2Author[];
|
|
28
|
+
citationCount: number | null;
|
|
29
|
+
influentialCitationCount: number | null;
|
|
30
|
+
venue: string | null;
|
|
31
|
+
externalIds: S2ExternalIds | null;
|
|
32
|
+
url: string | null;
|
|
33
|
+
referenceCount?: number | null;
|
|
34
|
+
isOpenAccess?: boolean | null;
|
|
35
|
+
openAccessPdf?: {
|
|
36
|
+
url: string;
|
|
37
|
+
} | null;
|
|
38
|
+
publicationDate?: string | null;
|
|
39
|
+
journal?: {
|
|
40
|
+
name: string | null;
|
|
41
|
+
} | null;
|
|
42
|
+
}
|
|
43
|
+
export interface S2SearchResponse {
|
|
44
|
+
total: number;
|
|
45
|
+
offset: number;
|
|
46
|
+
next?: number;
|
|
47
|
+
data: S2Paper[];
|
|
48
|
+
}
|
|
49
|
+
export interface S2ClientOpts {
|
|
50
|
+
apiKey?: string;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Search for papers by keyword query.
|
|
54
|
+
*
|
|
55
|
+
* @see https://api.semanticscholar.org/api-docs/graph#tag/Paper-Data/operation/post_graph_get_papers_search
|
|
56
|
+
*/
|
|
57
|
+
export declare function searchPapers(query: string, opts?: S2ClientOpts & {
|
|
58
|
+
limit?: number;
|
|
59
|
+
offset?: number;
|
|
60
|
+
}): Promise<AdapterResult<S2SearchResponse>>;
|
|
61
|
+
/**
|
|
62
|
+
* Get detailed information about a single paper.
|
|
63
|
+
*
|
|
64
|
+
* Accepts S2 paper ID, DOI (prefixed with "DOI:"), ArXiv ID ("ARXIV:"), etc.
|
|
65
|
+
*
|
|
66
|
+
* @see https://api.semanticscholar.org/api-docs/graph#tag/Paper-Data/operation/post_graph_get_paper
|
|
67
|
+
*/
|
|
68
|
+
export declare function getPaperDetails(paperId: string, opts?: S2ClientOpts): Promise<AdapterResult<S2Paper>>;
|
|
69
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/sources/semantic-scholar/client.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAkCvD,MAAM,WAAW,QAAQ;IACvB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,OAAO;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,OAAO,EAAE,QAAQ,EAAE,CAAC;IACpB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,wBAAwB,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,WAAW,EAAE,aAAa,GAAG,IAAI,CAAC;IAClC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAEnB,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,YAAY,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAC9B,aAAa,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IACvC,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,OAAO,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,GAAG,IAAI,CAAC;CAC1C;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,OAAO,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAiDD;;;;GAIG;AACH,wBAAsB,YAAY,CAChC,KAAK,EAAE,MAAM,EACb,IAAI,CAAC,EAAE,YAAY,GAAG;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GACxD,OAAO,CAAC,aAAa,CAAC,gBAAgB,CAAC,CAAC,CA4B1C;AAED;;;;;;GAMG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE,YAAY,GAClB,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAkBjC"}
|