@cyanheads/pubmed-mcp-server 2.10.18 → 2.10.20

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.
Files changed (121) hide show
  1. package/AGENTS.md +16 -15
  2. package/CLAUDE.md +16 -15
  3. package/Dockerfile +86 -36
  4. package/README.md +86 -109
  5. package/changelog/2.10.x/2.10.19.md +42 -0
  6. package/changelog/2.10.x/2.10.20.md +63 -0
  7. package/dist/mcp-server/resources/definitions/database-info.resource.d.ts +43 -1
  8. package/dist/mcp-server/resources/definitions/database-info.resource.d.ts.map +1 -1
  9. package/dist/mcp-server/resources/definitions/database-info.resource.js +2 -0
  10. package/dist/mcp-server/resources/definitions/database-info.resource.js.map +1 -1
  11. package/dist/mcp-server/tools/definitions/_text.d.ts.map +1 -1
  12. package/dist/mcp-server/tools/definitions/_text.js +10 -5
  13. package/dist/mcp-server/tools/definitions/_text.js.map +1 -1
  14. package/dist/mcp-server/tools/definitions/_visible-text.d.ts +19 -0
  15. package/dist/mcp-server/tools/definitions/_visible-text.d.ts.map +1 -0
  16. package/dist/mcp-server/tools/definitions/_visible-text.js +22 -0
  17. package/dist/mcp-server/tools/definitions/_visible-text.js.map +1 -0
  18. package/dist/mcp-server/tools/definitions/convert-ids.tool.d.ts +11 -4
  19. package/dist/mcp-server/tools/definitions/convert-ids.tool.d.ts.map +1 -1
  20. package/dist/mcp-server/tools/definitions/convert-ids.tool.js +1 -1
  21. package/dist/mcp-server/tools/definitions/convert-ids.tool.js.map +1 -1
  22. package/dist/mcp-server/tools/definitions/fetch-articles.tool.d.ts +20 -7
  23. package/dist/mcp-server/tools/definitions/fetch-articles.tool.d.ts.map +1 -1
  24. package/dist/mcp-server/tools/definitions/fetch-articles.tool.js +68 -15
  25. package/dist/mcp-server/tools/definitions/fetch-articles.tool.js.map +1 -1
  26. package/dist/mcp-server/tools/definitions/fetch-fulltext.tool.d.ts +37 -12
  27. package/dist/mcp-server/tools/definitions/fetch-fulltext.tool.d.ts.map +1 -1
  28. package/dist/mcp-server/tools/definitions/fetch-fulltext.tool.js +590 -481
  29. package/dist/mcp-server/tools/definitions/fetch-fulltext.tool.js.map +1 -1
  30. package/dist/mcp-server/tools/definitions/find-related.tool.d.ts +5 -5
  31. package/dist/mcp-server/tools/definitions/find-related.tool.d.ts.map +1 -1
  32. package/dist/mcp-server/tools/definitions/find-related.tool.js +31 -13
  33. package/dist/mcp-server/tools/definitions/find-related.tool.js.map +1 -1
  34. package/dist/mcp-server/tools/definitions/format-citations.tool.d.ts +11 -4
  35. package/dist/mcp-server/tools/definitions/format-citations.tool.d.ts.map +1 -1
  36. package/dist/mcp-server/tools/definitions/lookup-citation.tool.d.ts +26 -21
  37. package/dist/mcp-server/tools/definitions/lookup-citation.tool.d.ts.map +1 -1
  38. package/dist/mcp-server/tools/definitions/lookup-citation.tool.js +109 -55
  39. package/dist/mcp-server/tools/definitions/lookup-citation.tool.js.map +1 -1
  40. package/dist/mcp-server/tools/definitions/lookup-mesh.tool.d.ts +15 -7
  41. package/dist/mcp-server/tools/definitions/lookup-mesh.tool.d.ts.map +1 -1
  42. package/dist/mcp-server/tools/definitions/lookup-mesh.tool.js +19 -11
  43. package/dist/mcp-server/tools/definitions/lookup-mesh.tool.js.map +1 -1
  44. package/dist/mcp-server/tools/definitions/pubmed-europepmc-fetch.tool.d.ts +20 -2
  45. package/dist/mcp-server/tools/definitions/pubmed-europepmc-fetch.tool.d.ts.map +1 -1
  46. package/dist/mcp-server/tools/definitions/pubmed-europepmc-fetch.tool.js +98 -14
  47. package/dist/mcp-server/tools/definitions/pubmed-europepmc-fetch.tool.js.map +1 -1
  48. package/dist/mcp-server/tools/definitions/pubmed-europepmc-search.tool.d.ts +21 -6
  49. package/dist/mcp-server/tools/definitions/pubmed-europepmc-search.tool.d.ts.map +1 -1
  50. package/dist/mcp-server/tools/definitions/pubmed-europepmc-search.tool.js +42 -10
  51. package/dist/mcp-server/tools/definitions/pubmed-europepmc-search.tool.js.map +1 -1
  52. package/dist/mcp-server/tools/definitions/search-articles.tool.d.ts +42 -18
  53. package/dist/mcp-server/tools/definitions/search-articles.tool.d.ts.map +1 -1
  54. package/dist/mcp-server/tools/definitions/search-articles.tool.js +220 -48
  55. package/dist/mcp-server/tools/definitions/search-articles.tool.js.map +1 -1
  56. package/dist/mcp-server/tools/definitions/spell-check.tool.d.ts +15 -7
  57. package/dist/mcp-server/tools/definitions/spell-check.tool.d.ts.map +1 -1
  58. package/dist/mcp-server/tools/definitions/spell-check.tool.js +13 -9
  59. package/dist/mcp-server/tools/definitions/spell-check.tool.js.map +1 -1
  60. package/dist/services/error-contracts.d.ts +43 -72
  61. package/dist/services/error-contracts.d.ts.map +1 -1
  62. package/dist/services/error-contracts.js +44 -76
  63. package/dist/services/error-contracts.js.map +1 -1
  64. package/dist/services/europe-pmc/api-client.d.ts +8 -2
  65. package/dist/services/europe-pmc/api-client.d.ts.map +1 -1
  66. package/dist/services/europe-pmc/api-client.js +13 -8
  67. package/dist/services/europe-pmc/api-client.js.map +1 -1
  68. package/dist/services/europe-pmc/europe-pmc-service.d.ts +25 -2
  69. package/dist/services/europe-pmc/europe-pmc-service.d.ts.map +1 -1
  70. package/dist/services/europe-pmc/europe-pmc-service.js +90 -25
  71. package/dist/services/europe-pmc/europe-pmc-service.js.map +1 -1
  72. package/dist/services/europe-pmc/types.d.ts +6 -1
  73. package/dist/services/europe-pmc/types.d.ts.map +1 -1
  74. package/dist/services/ncbi/api-client.d.ts.map +1 -1
  75. package/dist/services/ncbi/api-client.js +2 -3
  76. package/dist/services/ncbi/api-client.js.map +1 -1
  77. package/dist/services/ncbi/formatting/citation-formatter.d.ts +24 -0
  78. package/dist/services/ncbi/formatting/citation-formatter.d.ts.map +1 -1
  79. package/dist/services/ncbi/formatting/citation-formatter.js +147 -46
  80. package/dist/services/ncbi/formatting/citation-formatter.js.map +1 -1
  81. package/dist/services/ncbi/ncbi-service.d.ts +18 -2
  82. package/dist/services/ncbi/ncbi-service.d.ts.map +1 -1
  83. package/dist/services/ncbi/ncbi-service.js +182 -90
  84. package/dist/services/ncbi/ncbi-service.js.map +1 -1
  85. package/dist/services/ncbi/parsing/article-parser.d.ts +15 -1
  86. package/dist/services/ncbi/parsing/article-parser.d.ts.map +1 -1
  87. package/dist/services/ncbi/parsing/article-parser.js +67 -29
  88. package/dist/services/ncbi/parsing/article-parser.js.map +1 -1
  89. package/dist/services/ncbi/parsing/esummary-parser.d.ts +9 -0
  90. package/dist/services/ncbi/parsing/esummary-parser.d.ts.map +1 -1
  91. package/dist/services/ncbi/parsing/esummary-parser.js +26 -2
  92. package/dist/services/ncbi/parsing/esummary-parser.js.map +1 -1
  93. package/dist/services/ncbi/parsing/pmc-article-parser.d.ts.map +1 -1
  94. package/dist/services/ncbi/parsing/pmc-article-parser.js +395 -147
  95. package/dist/services/ncbi/parsing/pmc-article-parser.js.map +1 -1
  96. package/dist/services/ncbi/parsing/pmc-xml-helpers.d.ts +73 -5
  97. package/dist/services/ncbi/parsing/pmc-xml-helpers.d.ts.map +1 -1
  98. package/dist/services/ncbi/parsing/pmc-xml-helpers.js +223 -27
  99. package/dist/services/ncbi/parsing/pmc-xml-helpers.js.map +1 -1
  100. package/dist/services/ncbi/parsing/text-helpers.d.ts +8 -6
  101. package/dist/services/ncbi/parsing/text-helpers.d.ts.map +1 -1
  102. package/dist/services/ncbi/parsing/text-helpers.js +95 -19
  103. package/dist/services/ncbi/parsing/text-helpers.js.map +1 -1
  104. package/dist/services/ncbi/response-handler.d.ts +20 -12
  105. package/dist/services/ncbi/response-handler.d.ts.map +1 -1
  106. package/dist/services/ncbi/response-handler.js +134 -38
  107. package/dist/services/ncbi/response-handler.js.map +1 -1
  108. package/dist/services/ncbi/types.d.ts +35 -2
  109. package/dist/services/ncbi/types.d.ts.map +1 -1
  110. package/dist/services/openalex/api-client.d.ts.map +1 -1
  111. package/dist/services/openalex/api-client.js +6 -7
  112. package/dist/services/openalex/api-client.js.map +1 -1
  113. package/dist/services/openalex/openalex-service.d.ts +10 -6
  114. package/dist/services/openalex/openalex-service.d.ts.map +1 -1
  115. package/dist/services/openalex/openalex-service.js +14 -12
  116. package/dist/services/openalex/openalex-service.js.map +1 -1
  117. package/dist/services/unpaywall/unpaywall-service.d.ts.map +1 -1
  118. package/dist/services/unpaywall/unpaywall-service.js +1 -3
  119. package/dist/services/unpaywall/unpaywall-service.js.map +1 -1
  120. package/package.json +16 -13
  121. package/server.json +10 -24
@@ -6,10 +6,9 @@
6
6
  * deadline that covers queue wait, attempts, and backoff. Uses init/accessor pattern.
7
7
  * @module src/services/ncbi/ncbi-service
8
8
  */
9
- import { JsonRpcErrorCode, McpError, rateLimited, serializationError, timeout, validationError, } from '@cyanheads/mcp-ts-core/errors';
9
+ import { invalidParams, JsonRpcErrorCode, McpError, rateLimited, serializationError, timeout, validationError, } from '@cyanheads/mcp-ts-core/errors';
10
10
  import { defaultIsTransient, logger, requestContextService, withRetry, } from '@cyanheads/mcp-ts-core/utils';
11
11
  import { getServerConfig } from '../../config/server-config.js';
12
- import { recoveryFor } from '../error-contracts.js';
13
12
  import { NcbiApiClient } from './api-client.js';
14
13
  import { createNcbiRequestQueue } from './request-queue.js';
15
14
  import { emptyEFetchResultFor, NcbiResponseHandler, reclassifyNcbiHttpError, } from './response-handler.js';
@@ -41,19 +40,63 @@ function normalizeDiagnosticList(list) {
41
40
  return normalized;
42
41
  }
43
42
  /**
44
- * The tracking token each citation is submitted to ECitMatch under — echoed
45
- * back verbatim on that citation's response row, and unique within the request.
43
+ * The tracking token a citation is submitted to ECitMatch under — echoed back
44
+ * verbatim on that citation's response row, and unique within the call.
46
45
  *
47
- * Always the citation's 1-based position, never `ECitMatchCitation.key`. That
48
- * label is caller-supplied, so reconciling response rows on it collapses two
49
- * citations carrying the same label onto one row and hands the second
50
- * citation's PMID to the first (#113); and a `|` inside it shifts the
51
- * pipe-delimited field layout of the submitted line, so NCBI's echoed row no
52
- * longer reconciles and a citation it matched comes back as not_found (#125).
53
- * Keeping the label off the wire entirely removes both.
46
+ * Always the citation's 1-based position in the call, never
47
+ * `ECitMatchCitation.key`, and the same in every request that carries it, so a
48
+ * re-requested line reconciles without renumbering (#193). The label is
49
+ * caller-supplied, so reconciling response rows on it collapses two citations
50
+ * carrying the same label onto one row and hands the second citation's PMID to
51
+ * the first (#113); and a `|` inside it shifts the pipe-delimited field layout
52
+ * of the submitted line, so NCBI's echoed row no longer reconciles and a
53
+ * citation it matched comes back as not_found (#125). Keeping the label off the
54
+ * wire entirely removes both.
54
55
  */
55
- function wireKeysFor(citations) {
56
- return citations.map((_, i) => String(i + 1));
56
+ function wireKeyFor(index) {
57
+ return String(index + 1);
58
+ }
59
+ /** One submitted citation as an ECitMatch `bdata` line. */
60
+ function bdataLine(c, index) {
61
+ return `${c.journal ?? ''}|${c.year ?? ''}|${c.volume ?? ''}|${c.firstPage ?? ''}|${c.authorName ?? ''}|${wireKeyFor(index)}|`;
62
+ }
63
+ /** ECitMatch's response rows, each carrying the wire key its line was submitted under. */
64
+ function parseECitMatchRows(text) {
65
+ return text
66
+ .split(/[\r\n]+/)
67
+ .filter((line) => line.trim().length > 0)
68
+ .map((line) => {
69
+ const parts = line.split('|');
70
+ const key = parts[5]?.trim() ?? '';
71
+ const rawOutcome = parts[6]?.trim() ?? '';
72
+ if (/^\d+$/.test(rawOutcome)) {
73
+ return { key, matched: true, pmid: rawOutcome, status: 'matched' };
74
+ }
75
+ if (rawOutcome.startsWith('AMBIGUOUS')) {
76
+ const csv = /^AMBIGUOUS\s+([\d,\s]+)/.exec(rawOutcome)?.[1];
77
+ const candidatePmids = csv
78
+ ? csv
79
+ .split(',')
80
+ .map((p) => p.trim())
81
+ .filter((p) => /^\d+$/.test(p))
82
+ : undefined;
83
+ return {
84
+ key,
85
+ matched: false,
86
+ pmid: null,
87
+ status: 'ambiguous',
88
+ detail: rawOutcome,
89
+ ...(candidatePmids?.length && { candidatePmids }),
90
+ };
91
+ }
92
+ return {
93
+ key,
94
+ matched: false,
95
+ pmid: null,
96
+ status: 'not_found',
97
+ ...(rawOutcome && { detail: rawOutcome }),
98
+ };
99
+ });
57
100
  }
58
101
  /** Ceiling on one backoff sleep, so a high retry count cannot grow it without bound. */
59
102
  const MAX_BACKOFF_MS = 30_000;
@@ -72,18 +115,50 @@ const QUEUE_WAIT_MARGIN_MS = 1;
72
115
  * loop is a defect or a response that cannot parse — retrying it only repeats it.
73
116
  */
74
117
  const isTransient = (error) => error instanceof McpError && defaultIsTransient(error);
118
+ /** The reason each code a retry loop can end on is stamped with; a Timeout gets none. */
119
+ const REASON_BY_CODE = new Map([
120
+ [JsonRpcErrorCode.ServiceUnavailable, 'ncbi_unreachable'],
121
+ [JsonRpcErrorCode.RateLimited, 'ncbi_rate_limited'],
122
+ ]);
123
+ /**
124
+ * A retry loop that ran out, reported as its last attempt's failure: that attempt's
125
+ * code with `endpoint`, `attempts`, and NCBI's `ncbiErrors` when the attempt carried
126
+ * them. A ServiceUnavailable is stamped `ncbi_unreachable`; a RateLimited is stamped
127
+ * `ncbi_rate_limited` and keeps the `retryAfter` its 429 named; a Timeout keeps its
128
+ * code with no reason.
129
+ */
130
+ function retriesSpent(last, message, attempts, endpoint, cause) {
131
+ const reason = REASON_BY_CODE.get(last.code);
132
+ const retryAfter = last.code === JsonRpcErrorCode.RateLimited ? last.data?.retryAfter : undefined;
133
+ return new McpError(last.code, message, {
134
+ ...(reason && { reason }),
135
+ endpoint,
136
+ attempts,
137
+ ...(last.data?.ncbiErrors !== undefined && { ncbiErrors: last.data.ncbiErrors }),
138
+ ...(retryAfter !== undefined && { retryAfter }),
139
+ }, { cause });
140
+ }
75
141
  /**
76
142
  * Maps what the retry loop throws onto this service's declared failure reasons. Runs
77
143
  * outside the loop, so the loop itself still sees the framework's `pacer_shed` — which
78
144
  * it never retries — and `retry_deadline_exceeded`.
79
145
  *
80
146
  * - `pacer_shed` → `queue_full` (RateLimited), keeping the shed's `retryAfter`.
81
- * - `retry_deadline_exceeded` → `ncbi_deadline_exceeded` (Timeout).
82
- * - Retries exhausted → the last attempt's code and message with `endpoint` and
83
- * `attempts`; a ServiceUnavailable is stamped `ncbi_unreachable`.
147
+ * - `retry_deadline_exceeded` with the deadline fired — mid-request, in the queue, or
148
+ * mid-backoff → `ncbi_deadline_exceeded` (Timeout), with NCBI's `ncbiErrors` from the
149
+ * latest attempt that carried any, wherever the timer landed.
150
+ * - `retry_deadline_exceeded` with the deadline not fired — the loop stopped because
151
+ * the next backoff would not fit the time left → retries spent, as below. The error's
152
+ * own cause or timing cannot tell the two apart (a request aborted mid-flight fails as
153
+ * the client's ServiceUnavailable, and timers can fire early), so `deadlineFired` — the
154
+ * loop's own signal — does. (#174)
155
+ * - Retries exhausted → retries spent: the last attempt's code and message (the
156
+ * framework appends the attempt count) with `endpoint`, `attempts`, and `ncbiErrors`.
157
+ * - A 429 never retried because its `Retry-After` outlasts the time left or the backoff
158
+ * cap → the attempt's own error, stamped `ncbi_rate_limited`.
84
159
  * - Anything else — a failure that was never retried — passes through unchanged.
85
160
  */
86
- function toServiceError(error, endpoint, deadlineMs) {
161
+ function toServiceError(error, endpoint, loop) {
87
162
  if (!(error instanceof McpError))
88
163
  return error;
89
164
  const data = error.data ?? {};
@@ -93,22 +168,28 @@ function toServiceError(error, endpoint, deadlineMs) {
93
168
  endpoint,
94
169
  queueSize: data.queueDepth,
95
170
  retryAfter: data.retryAfter,
96
- ...recoveryFor('queue_full'),
97
171
  }, { cause: error });
98
172
  }
99
173
  if (data.reason === 'retry_deadline_exceeded') {
100
- return timeout(`NCBI request deadline (${deadlineMs}ms) exceeded`, { reason: 'ncbi_deadline_exceeded', deadlineMs, ...recoveryFor('ncbi_deadline_exceeded') }, { cause: error });
174
+ const last = error.cause;
175
+ const attempts = data.retryAttempts;
176
+ if (!loop.deadlineFired && last instanceof McpError && typeof attempts === 'number') {
177
+ const count = `${attempts} attempt${attempts > 1 ? 's' : ''}`;
178
+ return retriesSpent(last, `${last.message} (failed after ${count})`, attempts, endpoint, error);
179
+ }
180
+ return timeout(`NCBI request deadline (${loop.deadlineMs}ms) exceeded`, {
181
+ reason: 'ncbi_deadline_exceeded',
182
+ deadlineMs: loop.deadlineMs,
183
+ ...(loop.ncbiErrors !== undefined && { ncbiErrors: loop.ncbiErrors }),
184
+ }, { cause: error });
101
185
  }
102
- if (typeof data.retryAttempts !== 'number')
103
- return error;
104
- // Other retryable codes (Timeout, RateLimited) keep their code with no reason.
105
- const reason = error.code === JsonRpcErrorCode.ServiceUnavailable ? 'ncbi_unreachable' : undefined;
106
- return new McpError(error.code, error.message, {
107
- ...(reason && { reason, ...recoveryFor(reason) }),
108
- endpoint,
109
- attempts: data.retryAttempts,
110
- ...(data.ncbiErrors !== undefined && { ncbiErrors: data.ncbiErrors }),
111
- }, { cause: error.cause ?? error });
186
+ if (typeof data.retryAttempts === 'number') {
187
+ return retriesSpent(error, error.message, data.retryAttempts, endpoint, error.cause ?? error);
188
+ }
189
+ if (error.code === JsonRpcErrorCode.RateLimited) {
190
+ return new McpError(error.code, error.message, { ...data, reason: 'ncbi_rate_limited' }, { cause: error });
191
+ }
192
+ return error;
112
193
  }
113
194
  /**
114
195
  * Facade over NCBI's E-utility suite. Each public method corresponds to a
@@ -203,60 +284,50 @@ export class NcbiService {
203
284
  *
204
285
  * Results come back one per submitted citation, in submission order, carrying
205
286
  * the caller's `key`. Correlation runs on the wire key (see
206
- * {@link wireKeysFor}), never on `key` itself — that label is caller-supplied,
287
+ * {@link wireKeyFor}), never on `key` itself — that label is caller-supplied,
207
288
  * so it may repeat and may carry characters that break the wire format.
208
289
  * (#113, #125)
290
+ *
291
+ * A journal-less citation ECitMatch finds no candidate for ends the response:
292
+ * that line and every line after it come back with no row. So the response
293
+ * stops at the line after the last one answered; that line is reported
294
+ * `not_found`, and the lines after it are requested again without it, until
295
+ * every line has a result. A complete response costs one request, each
296
+ * dropped line at most one more — 25 requests for 25 such citations. Every
297
+ * request draws on one deadline and one retry allowance for the whole call.
298
+ * A line with no row ahead of one that has a row is not a stop and is never
299
+ * re-requested; it stays `not_found`, as every missing row did before. (#54, #193)
209
300
  */
210
301
  async eCitMatch(citations, options) {
211
- const wireKeys = wireKeysFor(citations);
212
- const bdata = citations
213
- .map((c, i) => `${c.journal ?? ''}|${c.year ?? ''}|${c.volume ?? ''}|${c.firstPage ?? ''}|${c.authorName ?? ''}|${wireKeys[i]}|`)
214
- .join('\r');
215
- const text = await this.performRequest('ecitmatch.cgi', { db: 'pubmed', retmode: 'xml', bdata }, { retmode: 'text', ...(options?.signal && { signal: options.signal }) });
216
- const parsed = text
217
- .split(/[\r\n]+/)
218
- .filter((line) => line.trim().length > 0)
219
- .map((line) => {
220
- const parts = line.split('|');
221
- const key = parts[5]?.trim() ?? '';
222
- const rawOutcome = parts[6]?.trim() ?? '';
223
- if (/^\d+$/.test(rawOutcome)) {
224
- return { key, matched: true, pmid: rawOutcome, status: 'matched' };
225
- }
226
- if (rawOutcome.startsWith('AMBIGUOUS')) {
227
- const csv = /^AMBIGUOUS\s+([\d,\s]+)/.exec(rawOutcome)?.[1];
228
- const candidatePmids = csv
229
- ? csv
230
- .split(',')
231
- .map((p) => p.trim())
232
- .filter((p) => /^\d+$/.test(p))
233
- : undefined;
234
- return {
235
- key,
236
- matched: false,
237
- pmid: null,
238
- status: 'ambiguous',
239
- detail: rawOutcome,
240
- ...(candidatePmids?.length && { candidatePmids }),
241
- };
302
+ const budget = {
303
+ expiresAt: Date.now() + this.totalDeadlineMs,
304
+ retriesLeft: this.maxRetries,
305
+ };
306
+ const rowByIndex = new Map();
307
+ let pending = citations.map((citation, index) => ({ citation, index }));
308
+ while (pending.length > 0) {
309
+ const bdata = pending.map(({ citation, index }) => bdataLine(citation, index)).join('\r');
310
+ const text = await this.performRequest('ecitmatch.cgi', { db: 'pubmed', retmode: 'xml', bdata }, { retmode: 'text', ...(options?.signal && { signal: options.signal }) }, budget);
311
+ // Reconcile on the wire key each line was submitted under — unique within
312
+ // the call, so one row can never stand in for a second citation. The line
313
+ // after the last one answered is where the response stopped: it keeps no
314
+ // row, and only the lines after it go out again.
315
+ const rowByWireKey = new Map(parseECitMatchRows(text).map((r) => [r.key, r]));
316
+ let lastAnswered = -1;
317
+ for (const [position, { index }] of pending.entries()) {
318
+ const row = rowByWireKey.get(wireKeyFor(index));
319
+ if (!row)
320
+ continue;
321
+ rowByIndex.set(index, row);
322
+ lastAnswered = position;
242
323
  }
243
- return {
244
- key,
245
- matched: false,
246
- pmid: null,
247
- status: 'not_found',
248
- ...(rawOutcome && { detail: rawOutcome }),
249
- };
250
- });
251
- // ECitMatch omits lines for citations it cannot classify. Reconcile on the
252
- // wire key each citation was submitted under — unique within the request, so
253
- // one row can never stand in for a second citation — then restore the
254
- // caller's label on the way out. Every input gets a result row, so callers
255
- // can rely on results.length === citations.length and on results[i]
256
- // describing citations[i]. (#54, #113, #125)
257
- const parsedByWireKey = new Map(parsed.map((r) => [r.key, r]));
324
+ pending = pending.slice(lastAnswered + 2);
325
+ }
326
+ // Every input gets a result row, so callers can rely on results.length ===
327
+ // citations.length and on results[i] describing citations[i]; the caller's
328
+ // label is restored on the way out. (#54, #113, #125)
258
329
  return citations.map((c, i) => {
259
- const row = parsedByWireKey.get(wireKeys[i] ?? '');
330
+ const row = rowByIndex.get(i);
260
331
  return row
261
332
  ? { ...row, key: c.key }
262
333
  : { key: c.key, matched: false, pmid: null, status: 'not_found' };
@@ -298,14 +369,15 @@ export class NcbiService {
298
369
  }
299
370
  catch (error) {
300
371
  // PMC ID Converter returns 400 (InvalidParams) for malformed inputs and
301
- // leaks the upstream HTML/text body into `data.body`. Rewrite to a typed
302
- // validation error with idType-specific guidance and drop the leaky body.
372
+ // leaks the upstream HTML/text body into `data.body`. Rewrite the message
373
+ // with idType-specific guidance and drop the leaky body, keeping the
374
+ // InvalidParams code every other NCBI 400 carries.
303
375
  if (error instanceof McpError && error.code === JsonRpcErrorCode.InvalidParams) {
304
376
  const hint = ID_CONVERT_FORMAT_HINTS[idtype ?? ''];
305
377
  const message = hint
306
378
  ? `PMC ID Converter rejected one or more inputs as malformed (idType="${idtype}"). Expected: ${hint}.`
307
379
  : `PMC ID Converter rejected the input as malformed (idType="${idtype ?? 'unspecified'}").`;
308
- throw validationError(message, { idType: idtype, idCount: ids.length }, { cause: error });
380
+ throw invalidParams(message, { idType: idtype, idCount: ids.length }, { cause: error });
309
381
  }
310
382
  throw error;
311
383
  }
@@ -317,7 +389,6 @@ export class NcbiService {
317
389
  throw serializationError('Failed to parse ID Converter JSON response.', {
318
390
  reason: 'ncbi_invalid_response',
319
391
  responseSnippet: text.substring(0, 200),
320
- ...recoveryFor('ncbi_invalid_response'),
321
392
  }, { cause: error });
322
393
  }
323
394
  return parsed.records ?? [];
@@ -330,19 +401,32 @@ export class NcbiService {
330
401
  * and the HTTP request, and each attempt offers the queue only the time left, so
331
402
  * a call that cannot start in time is shed at once instead of waiting it out.
332
403
  *
404
+ * With a `budget`, the request is one of several in a call: its deadline is the
405
+ * time the call has left and its retries are the ones the call has not spent,
406
+ * which it then spends from. A failure is still reported against the call's
407
+ * full deadline.
408
+ *
333
409
  * A caller abort rethrows the caller's own reason; every other failure is mapped
334
- * onto this service's reasons by {@link toServiceError}, after the loop.
410
+ * onto this service's reasons by {@link toServiceError}, after the loop. Once the
411
+ * caller is ruled out, the loop's signal has aborted only if the deadline fired.
335
412
  */
336
- async runPaced(endpoint, callerSignal, execute) {
413
+ async runPaced(endpoint, callerSignal, execute, budget) {
414
+ const maxRetries = budget?.retriesLeft ?? this.maxRetries;
337
415
  let attempt = 0;
416
+ let loopSignal;
417
+ let ncbiErrors;
338
418
  try {
339
419
  return await withRetry(({ signal, remainingMs }) => {
420
+ loopSignal = signal;
340
421
  attempt += 1;
341
422
  return this.queue
342
423
  .run(execute, { signal, maxWaitMs: remainingMs + QUEUE_WAIT_MARGIN_MS })
343
424
  .catch((error) => {
344
- if (attempt <= this.maxRetries && isTransient(error)) {
345
- logger.warning(`NCBI request to ${endpoint} failed on attempt ${attempt} of ${this.maxRetries + 1}.`, requestContextService.createRequestContext({
425
+ if (error instanceof McpError && error.data?.ncbiErrors !== undefined) {
426
+ ncbiErrors = error.data.ncbiErrors;
427
+ }
428
+ if (attempt <= maxRetries && isTransient(error)) {
429
+ logger.warning(`NCBI request to ${endpoint} failed on attempt ${attempt} of ${maxRetries + 1}.`, requestContextService.createRequestContext({
346
430
  operation: 'NcbiRetry',
347
431
  additionalContext: {
348
432
  endpoint,
@@ -354,9 +438,9 @@ export class NcbiService {
354
438
  throw error;
355
439
  });
356
440
  }, {
357
- maxRetries: this.maxRetries,
441
+ maxRetries,
358
442
  maxDelayMs: MAX_BACKOFF_MS,
359
- deadlineMs: this.totalDeadlineMs,
443
+ deadlineMs: budget ? Math.max(0, budget.expiresAt - Date.now()) : this.totalDeadlineMs,
360
444
  isTransient,
361
445
  operation: `NCBI ${endpoint}`,
362
446
  ...(callerSignal && { signal: callerSignal }),
@@ -365,7 +449,15 @@ export class NcbiService {
365
449
  catch (error) {
366
450
  if (callerSignal?.aborted)
367
451
  throw callerSignal.reason;
368
- throw toServiceError(error, endpoint, this.totalDeadlineMs);
452
+ throw toServiceError(error, endpoint, {
453
+ deadlineMs: this.totalDeadlineMs,
454
+ deadlineFired: loopSignal?.aborted === true,
455
+ ncbiErrors,
456
+ });
457
+ }
458
+ finally {
459
+ if (budget)
460
+ budget.retriesLeft -= attempt - 1;
369
461
  }
370
462
  }
371
463
  /**
@@ -373,7 +465,7 @@ export class NcbiService {
373
465
  * all-invalid-ID rejection resolves as the empty set NCBI returns for an unknown
374
466
  * ID, and a backend-failure envelope is reclassified as transient so it retries.
375
467
  */
376
- performRequest(endpoint, params, options) {
468
+ performRequest(endpoint, params, options, budget) {
377
469
  return this.runPaced(endpoint, options?.signal, async (signal) => {
378
470
  const text = await this.apiClient
379
471
  .makeRequest(endpoint, params, { ...options, signal })
@@ -384,7 +476,7 @@ export class NcbiService {
384
476
  throw reclassifyNcbiHttpError(error, endpoint);
385
477
  });
386
478
  return this.responseHandler.parseAndHandleResponse(text, endpoint, options);
387
- });
479
+ }, budget);
388
480
  }
389
481
  }
390
482
  // ─── Init / Accessor ────────────────────────────────────────────────────────
@@ -1 +1 @@
1
- {"version":3,"file":"ncbi-service.js","sourceRoot":"","sources":["../../../src/services/ncbi/ncbi-service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ncbi-service.js","sourceRoot":"","sources":["../../../src/services/ncbi/ncbi-service.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,QAAQ,EACR,WAAW,EACX,kBAAkB,EAClB,OAAO,EACP,eAAe,GAChB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,kBAAkB,EAClB,MAAM,EAEN,qBAAqB,EACrB,SAAS,GACV,MAAM,8BAA8B,CAAC;AAEtC,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,uBAAuB,GACxB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAaL,mBAAmB,GAKpB,MAAM,YAAY,CAAC;AAEpB;;;;;GAKG;AACH,MAAM,uBAAuB,GAA2B;IACtD,IAAI,EAAE,iCAAiC;IACvC,KAAK,EAAE,+DAA+D;IACtE,GAAG,EAAE,+CAA+C;CACrD,CAAC;AAKF;;;;;GAKG;AACH,SAAS,uBAAuB,CAC9B,IAAoC;IAEpC,IAAI,CAAC,IAAI;QAAE,OAAO;IAClB,MAAM,UAAU,GAAuB,EAAE,CAAC;IAC1C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QAChD,UAAU,CAAC,GAA+B,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CACxF,MAAM,CACP,CAAC;IACJ,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,SAAS,UAAU,CAAC,KAAa;IAC/B,OAAO,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;AAC3B,CAAC;AAED,2DAA2D;AAC3D,SAAS,SAAS,CAAC,CAAoB,EAAE,KAAa;IACpD,OAAO,GAAG,CAAC,CAAC,OAAO,IAAI,EAAE,IAAI,CAAC,CAAC,IAAI,IAAI,EAAE,IAAI,CAAC,CAAC,MAAM,IAAI,EAAE,IAAI,CAAC,CAAC,SAAS,IAAI,EAAE,IAAI,CAAC,CAAC,UAAU,IAAI,EAAE,IAAI,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC;AACjI,CAAC;AAED,0FAA0F;AAC1F,SAAS,kBAAkB,CAAC,IAAY;IACtC,OAAO,IAAI;SACR,KAAK,CAAC,SAAS,CAAC;SAChB,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;SACxC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACZ,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC9B,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QACnC,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QAE1C,IAAI,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;YAC7B,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,SAAkB,EAAE,CAAC;QAC9E,CAAC;QAED,IAAI,UAAU,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YACvC,MAAM,GAAG,GAAG,yBAAyB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAC5D,MAAM,cAAc,GAAG,GAAG;gBACxB,CAAC,CAAC,GAAG;qBACA,KAAK,CAAC,GAAG,CAAC;qBACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;qBACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBACnC,CAAC,CAAC,SAAS,CAAC;YACd,OAAO;gBACL,GAAG;gBACH,OAAO,EAAE,KAAK;gBACd,IAAI,EAAE,IAAI;gBACV,MAAM,EAAE,WAAoB;gBAC5B,MAAM,EAAE,UAAU;gBAClB,GAAG,CAAC,cAAc,EAAE,MAAM,IAAI,EAAE,cAAc,EAAE,CAAC;aAClD,CAAC;QACJ,CAAC;QAED,OAAO;YACL,GAAG;YACH,OAAO,EAAE,KAAK;YACd,IAAI,EAAE,IAAI;YACV,MAAM,EAAE,WAAoB;YAC5B,GAAG,CAAC,UAAU,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;SAC1C,CAAC;IACJ,CAAC,CAAC,CAAC;AACP,CAAC;AAaD,wFAAwF;AACxF,MAAM,cAAc,GAAG,MAAM,CAAC;AAE9B;;;;;;;GAOG;AACH,MAAM,oBAAoB,GAAG,CAAC,CAAC;AAE/B;;;;GAIG;AACH,MAAM,WAAW,GAAG,CAAC,KAAc,EAAW,EAAE,CAC9C,KAAK,YAAY,QAAQ,IAAI,kBAAkB,CAAC,KAAK,CAAC,CAAC;AAEzD,yFAAyF;AACzF,MAAM,cAAc,GAAG,IAAI,GAAG,CAA2B;IACvD,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,kBAAkB,CAAC;IACzD,CAAC,gBAAgB,CAAC,WAAW,EAAE,mBAAmB,CAAC;CACpD,CAAC,CAAC;AAEH;;;;;;GAMG;AACH,SAAS,YAAY,CACnB,IAAc,EACd,OAAe,EACf,QAAgB,EAChB,QAAgB,EAChB,KAAc;IAEd,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,KAAK,gBAAgB,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;IAClG,OAAO,IAAI,QAAQ,CACjB,IAAI,CAAC,IAAI,EACT,OAAO,EACP;QACE,GAAG,CAAC,MAAM,IAAI,EAAE,MAAM,EAAE,CAAC;QACzB,QAAQ;QACR,QAAQ;QACR,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,KAAK,SAAS,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;QAChF,GAAG,CAAC,UAAU,KAAK,SAAS,IAAI,EAAE,UAAU,EAAE,CAAC;KAChD,EACD,EAAE,KAAK,EAAE,CACV,CAAC;AACJ,CAAC;AAeD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,SAAS,cAAc,CAAC,KAAc,EAAE,QAAgB,EAAE,IAAiB;IACzE,IAAI,CAAC,CAAC,KAAK,YAAY,QAAQ,CAAC;QAAE,OAAO,KAAK,CAAC;IAC/C,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC;IAE9B,IAAI,IAAI,CAAC,MAAM,KAAK,YAAY,EAAE,CAAC;QACjC,OAAO,WAAW,CAChB,6EAA6E,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,qBAAqB,EACzH;YACE,MAAM,EAAE,YAAY;YACpB,QAAQ;YACR,SAAS,EAAE,IAAI,CAAC,UAAU;YAC1B,UAAU,EAAE,IAAI,CAAC,UAAU;SAC5B,EACD,EAAE,KAAK,EAAE,KAAK,EAAE,CACjB,CAAC;IACJ,CAAC;IAED,IAAI,IAAI,CAAC,MAAM,KAAK,yBAAyB,EAAE,CAAC;QAC9C,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC;QACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC;QACpC,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,IAAI,YAAY,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;YACpF,MAAM,KAAK,GAAG,GAAG,QAAQ,WAAW,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;YAC9D,OAAO,YAAY,CACjB,IAAI,EACJ,GAAG,IAAI,CAAC,OAAO,kBAAkB,KAAK,GAAG,EACzC,QAAQ,EACR,QAAQ,EACR,KAAK,CACN,CAAC;QACJ,CAAC;QACD,OAAO,OAAO,CACZ,0BAA0B,IAAI,CAAC,UAAU,cAAc,EACvD;YACE,MAAM,EAAE,wBAAwB;YAChC,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,GAAG,CAAC,IAAI,CAAC,UAAU,KAAK,SAAS,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC;SACtE,EACD,EAAE,KAAK,EAAE,KAAK,EAAE,CACjB,CAAC;IACJ,CAAC;IAED,IAAI,OAAO,IAAI,CAAC,aAAa,KAAK,QAAQ,EAAE,CAAC;QAC3C,OAAO,YAAY,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,aAAa,EAAE,QAAQ,EAAE,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,CAAC;IAChG,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,gBAAgB,CAAC,WAAW,EAAE,CAAC;QAChD,OAAO,IAAI,QAAQ,CACjB,KAAK,CAAC,IAAI,EACV,KAAK,CAAC,OAAO,EACb,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,mBAAmB,EAAE,EACxC,EAAE,KAAK,EAAE,KAAK,EAAE,CACjB,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;GAGG;AACH,MAAM,OAAO,WAAW;IAEH,SAAS;IACT,KAAK;IACL,eAAe;IACf,UAAU;IACV,eAAe;IALlC,YACmB,SAAwB,EACxB,KAAY,EACZ,eAAoC,EACpC,UAAkB,EAClB,eAAuB;yBAJvB,SAAS;qBACT,KAAK;+BACL,eAAe;0BACf,UAAU;+BACV,eAAe;IAC/B,CAAC;IAEJ,KAAK,CAAC,OAAO,CAAC,MAAyB,EAAE,OAAyB;QAChE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,cAAc,CAA2B,SAAS,EAAE,MAAM,EAAE;YACtF,OAAO,EAAE,KAAK;YACd,GAAG,CAAC,OAAO,EAAE,MAAM,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;SACnD,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC;QACxC,MAAM,SAAS,GAAG,uBAAuB,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QAC9D,MAAM,WAAW,GAAG,uBAAuB,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;QAClE,OAAO;YACL,KAAK,EAAE,QAAQ,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC;YACxC,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC;YAC1C,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,CAAC;YAC9C,GAAG,CAAC,QAAQ,CAAC,QAAQ,KAAK,SAAS,IAAI,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC;YACvE,GAAG,CAAC,QAAQ,CAAC,MAAM,KAAK,SAAS,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC;YACjE,MAAM,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC;YAC/C,gBAAgB,EAAE,QAAQ,CAAC,gBAAgB;YAC3C,GAAG,CAAC,SAAS,KAAK,SAAS,IAAI,EAAE,SAAS,EAAE,CAAC;YAC7C,GAAG,CAAC,WAAW,KAAK,SAAS,IAAI,EAAE,WAAW,EAAE,CAAC;SAClD,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,MAAyB,EAAE,OAAyB;QACjE,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,KAAK,KAAK,IAAI,MAAM,CAAC,OAAO,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;QACvF,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,cAAc,CAA4B,UAAU,EAAE,MAAM,EAAE;YACxF,OAAO;YACP,GAAG,CAAC,OAAO,EAAE,MAAM,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;SACnD,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC,cAAc,CAAC;IACjC,CAAC;IAED,MAAM,CACJ,MAAyB,EACzB,OAAO,GAAuB,EAAE,OAAO,EAAE,KAAK,EAAE;QAEhD,MAAM,OAAO,GACX,OAAO,CAAC,OAAO,IAAI,CAAC,OAAO,MAAM,CAAC,EAAE,KAAK,QAAQ,IAAI,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC;QAC1F,OAAO,IAAI,CAAC,cAAc,CAAI,QAAQ,EAAE,MAAM,EAAE,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;IAC3E,CAAC;IAED,KAAK,CACH,MAAyB,EACzB,OAAyB;QAEzB,OAAO,IAAI,CAAC,cAAc,CAAI,OAAO,EAAE,MAAM,EAAE;YAC7C,OAAO,EAAE,KAAK;YACd,GAAG,CAAC,OAAO,EAAE,MAAM,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;SACnD,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,MAAyB,EAAE,OAAyB;QAC/D,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,cAAc,CAA0B,QAAQ,EAAE,MAAM,EAAE;YACpF,OAAO,EAAE,KAAK;YACd,wEAAwE;YACxE,yEAAyE;YACzE,iEAAiE;YACjE,iBAAiB,EAAE,IAAI;YACvB,GAAG,CAAC,OAAO,EAAE,MAAM,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;SACnD,CAAC,CAAC;QAEH,MAAM,WAAW,GAAG,QAAQ,CAAC,YAAY,CAAC;QAC1C,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,IAAK,MAAM,CAAC,IAAe,IAAI,EAAE,CAAC;QACpE,MAAM,SAAS,GAAG,WAAW,CAAC,cAAc,IAAI,EAAE,CAAC;QAEnD,MAAM,CAAC,KAAK,CACV,uBAAuB,EACvB,qBAAqB,CAAC,oBAAoB,CAAC;YACzC,SAAS,EAAE,YAAY;YACvB,iBAAiB,EAAE;gBACjB,QAAQ;gBACR,SAAS;gBACT,aAAa,EAAE,SAAS,CAAC,MAAM,GAAG,CAAC,IAAI,SAAS,KAAK,QAAQ;aAC9D;SACF,CAAC,CACH,CAAC;QAEF,OAAO;YACL,QAAQ;YACR,SAAS,EAAE,SAAS,IAAI,QAAQ;YAChC,aAAa,EAAE,SAAS,CAAC,MAAM,GAAG,CAAC,IAAI,SAAS,KAAK,QAAQ;SAC9D,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,MAAyB,EAAE,OAAyB;QACxD,OAAO,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE;YAC1C,OAAO,EAAE,KAAK;YACd,GAAG,CAAC,OAAO,EAAE,MAAM,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;SACnD,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;;;;;;;;;;;;OAmBG;IACH,KAAK,CAAC,SAAS,CACb,SAA8B,EAC9B,OAAyB;QAEzB,MAAM,MAAM,GAAe;YACzB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,eAAe;YAC5C,WAAW,EAAE,IAAI,CAAC,UAAU;SAC7B,CAAC;QACF,MAAM,UAAU,GAAG,IAAI,GAAG,EAA2B,CAAC;QACtD,IAAI,OAAO,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;QAExE,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1B,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1F,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,cAAc,CACpC,eAAe,EACf,EAAE,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,EACvC,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,OAAO,EAAE,MAAM,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EACvE,MAAM,CACP,CAAC;YAEF,0EAA0E;YAC1E,0EAA0E;YAC1E,yEAAyE;YACzE,iDAAiD;YACjD,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9E,IAAI,YAAY,GAAG,CAAC,CAAC,CAAC;YACtB,KAAK,MAAM,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;gBACtD,MAAM,GAAG,GAAG,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;gBAChD,IAAI,CAAC,GAAG;oBAAE,SAAS;gBACnB,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;gBAC3B,YAAY,GAAG,QAAQ,CAAC;YAC1B,CAAC;YACD,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC;QAC5C,CAAC;QAED,2EAA2E;QAC3E,2EAA2E;QAC3E,sDAAsD;QACtD,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAmB,EAAE;YAC7C,MAAM,GAAG,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAC9B,OAAO,GAAG;gBACR,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE;gBACxB,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,WAAoB,EAAE,CAAC;QAC/E,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,SAAS,CACb,GAAa,EACb,MAAe,EACf,OAAyB;QAEzB,wEAAwE;QACxE,wEAAwE;QACxE,qEAAqE;QACrE,0EAA0E;QAC1E,uEAAuE;QACvE,gBAAgB;QAChB,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;QAClD,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,MAAM,eAAe,CACnB,gCAAgC,MAAM,uGAAuG,EAC7I,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,CACxC,CAAC;QACJ,CAAC;QAED,4EAA4E;QAC5E,2EAA2E;QAC3E,wEAAwE;QACxE,yDAAyD;QACzD,MAAM,aAAa,GACjB,MAAM,KAAK,OAAO;YAChB,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE;gBACb,MAAM,OAAO,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC;gBAC1B,OAAO,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;YAC3D,CAAC,CAAC;YACJ,CAAC,CAAC,GAAG,CAAC;QACV,MAAM,MAAM,GAAsB;YAChC,GAAG,EAAE,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC;YAC5B,MAAM,EAAE,MAAM;YACd,GAAG,CAAC,MAAM,IAAI,EAAE,MAAM,EAAE,CAAC;SAC1B,CAAC;QAEF,IAAI,IAAY,CAAC;QACjB,IAAI,CAAC;YACH,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,CAC/D,IAAI,CAAC,SAAS,CAAC,mBAAmB,CAAC,mBAAmB,EAAE,MAAM,EAAE,MAAM,CAAC,CACxE,CAAC;QACJ,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,wEAAwE;YACxE,0EAA0E;YAC1E,qEAAqE;YACrE,mDAAmD;YACnD,IAAI,KAAK,YAAY,QAAQ,IAAI,KAAK,CAAC,IAAI,KAAK,gBAAgB,CAAC,aAAa,EAAE,CAAC;gBAC/E,MAAM,IAAI,GAAG,uBAAuB,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;gBACnD,MAAM,OAAO,GAAG,IAAI;oBAClB,CAAC,CAAC,sEAAsE,MAAM,iBAAiB,IAAI,GAAG;oBACtG,CAAC,CAAC,6DAA6D,MAAM,IAAI,aAAa,KAAK,CAAC;gBAC9F,MAAM,aAAa,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;YAC1F,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;QAED,IAAI,MAAe,CAAC;QACpB,IAAI,CAAC;YACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,MAAM,kBAAkB,CACtB,6CAA6C,EAC7C;gBACE,MAAM,EAAE,uBAAuB;gBAC/B,eAAe,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC;aACxC,EACD,EAAE,KAAK,EAAE,KAAK,EAAE,CACjB,CAAC;QACJ,CAAC;QAED,OAAQ,MAA4B,CAAC,OAAO,IAAI,EAAE,CAAC;IACrD,CAAC;IAED;;;;;;;;;;;;;;;;OAgBG;IACK,KAAK,CAAC,QAAQ,CACpB,QAAgB,EAChB,YAAqC,EACrC,OAA4C,EAC5C,MAAmB;QAEnB,MAAM,UAAU,GAAG,MAAM,EAAE,WAAW,IAAI,IAAI,CAAC,UAAU,CAAC;QAC1D,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,IAAI,UAAmC,CAAC;QACxC,IAAI,UAAmB,CAAC;QACxB,IAAI,CAAC;YACH,OAAO,MAAM,SAAS,CACpB,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,EAAE;gBAC1B,UAAU,GAAG,MAAM,CAAC;gBACpB,OAAO,IAAI,CAAC,CAAC;gBACb,OAAO,IAAI,CAAC,KAAK;qBACd,GAAG,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,GAAG,oBAAoB,EAAE,CAAC;qBACvE,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;oBACxB,IAAI,KAAK,YAAY,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,UAAU,KAAK,SAAS,EAAE,CAAC;wBACtE,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC;oBACrC,CAAC;oBACD,IAAI,OAAO,IAAI,UAAU,IAAI,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;wBAChD,MAAM,CAAC,OAAO,CACZ,mBAAmB,QAAQ,sBAAsB,OAAO,OAAO,UAAU,GAAG,CAAC,GAAG,EAChF,qBAAqB,CAAC,oBAAoB,CAAC;4BACzC,SAAS,EAAE,WAAW;4BACtB,iBAAiB,EAAE;gCACjB,QAAQ;gCACR,OAAO;gCACP,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;6BAC9D;yBACF,CAAC,CACH,CAAC;oBACJ,CAAC;oBACD,MAAM,KAAK,CAAC;gBACd,CAAC,CAAC,CAAC;YACP,CAAC,EACD;gBACE,UAAU;gBACV,UAAU,EAAE,cAAc;gBAC1B,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe;gBACtF,WAAW;gBACX,SAAS,EAAE,QAAQ,QAAQ,EAAE;gBAC7B,GAAG,CAAC,YAAY,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;aAC9C,CACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,IAAI,YAAY,EAAE,OAAO;gBAAE,MAAM,YAAY,CAAC,MAAM,CAAC;YACrD,MAAM,cAAc,CAAC,KAAK,EAAE,QAAQ,EAAE;gBACpC,UAAU,EAAE,IAAI,CAAC,eAAe;gBAChC,aAAa,EAAE,UAAU,EAAE,OAAO,KAAK,IAAI;gBAC3C,UAAU;aACX,CAAC,CAAC;QACL,CAAC;gBAAS,CAAC;YACT,IAAI,MAAM;gBAAE,MAAM,CAAC,WAAW,IAAI,OAAO,GAAG,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IAED;;;;OAIG;IACK,cAAc,CACpB,QAAgB,EAChB,MAAyB,EACzB,OAA4B,EAC5B,MAAmB;QAEnB,OAAO,IAAI,CAAC,QAAQ,CAClB,QAAQ,EACR,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EAAE,EAAE;YACf,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,SAAS;iBAC9B,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,CAAC;iBACrD,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;gBACxB,MAAM,KAAK,GAAG,oBAAoB,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;gBAC/D,IAAI,KAAK,KAAK,SAAS;oBAAE,OAAO,KAAK,CAAC;gBACtC,MAAM,uBAAuB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;YACjD,CAAC,CAAC,CAAC;YACL,OAAO,IAAI,CAAC,eAAe,CAAC,sBAAsB,CAAI,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;QACjF,CAAC,EACD,MAAM,CACP,CAAC;IACJ,CAAC;CACF;AAED,+EAA+E;AAE/E,IAAI,QAAiC,CAAC;AAEtC,qEAAqE;AACrE,MAAM,UAAU,eAAe;IAC7B,MAAM,MAAM,GAAG,eAAe,EAAE,CAAC;IACjC,MAAM,SAAS,GAAG,IAAI,aAAa,CAAC;QAClC,cAAc,EAAE,MAAM,CAAC,cAAc;QACrC,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,GAAG,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;QAC/C,GAAG,CAAC,MAAM,CAAC,UAAU,IAAI,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC;KAC5D,CAAC,CAAC;IACH,MAAM,KAAK,GAAG,sBAAsB,CAAC;QACnC,aAAa,EAAE,MAAM,CAAC,cAAc;QACpC,aAAa,EAAE,MAAM,CAAC,aAAa;KACpC,CAAC,CAAC;IACH,MAAM,eAAe,GAAG,IAAI,mBAAmB,EAAE,CAAC;IAClD,QAAQ,GAAG,IAAI,WAAW,CACxB,SAAS,EACT,KAAK,EACL,eAAe,EACf,MAAM,CAAC,UAAU,EACjB,MAAM,CAAC,eAAe,CACvB,CAAC;IACF,MAAM,CAAC,IAAI,CACT,2BAA2B,EAC3B,qBAAqB,CAAC,oBAAoB,CAAC;QACzC,SAAS,EAAE,UAAU;QACrB,iBAAiB,EAAE;YACjB,cAAc,EAAE,MAAM,CAAC,cAAc;YACrC,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM;YAC1B,cAAc,EAAE,MAAM,CAAC,cAAc;YACrC,aAAa,EAAE,MAAM,CAAC,aAAa;YACnC,eAAe,EAAE,MAAM,CAAC,eAAe;SACxC;KACF,CAAC,CACH,CAAC;AACJ,CAAC;AAED,mEAAmE;AACnE,MAAM,UAAU,cAAc;IAC5B,IAAI,CAAC,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC;IAC9F,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -3,7 +3,7 @@
3
3
  * typically from EFetch results.
4
4
  * @module src/services/ncbi/parsing/article-parser
5
5
  */
6
- import type { ParsedArticle, ParsedArticleAuthor, ParsedArticleDate, ParsedBookInfo, ParsedGrant, ParsedJournalInfo, ParsedMeshTerm, ParseFullArticleOptions, XmlArticle, XmlArticleIdList, XmlAuthorList, XmlBookDocument, XmlGrantList, XmlJournal, XmlKeywordList, XmlMedlineCitation, XmlMeshHeadingList, XmlPublicationTypeList, XmlPubmedArticle, XmlPubmedArticleSet, XmlPubmedBookArticle } from '../types.js';
6
+ import type { ParsedArticle, ParsedArticleAuthor, ParsedArticleDate, ParsedBookInfo, ParsedCommentsCorrection, ParsedGrant, ParsedJournalInfo, ParsedMeshTerm, ParseFullArticleOptions, XmlArticle, XmlArticleIdList, XmlAuthorList, XmlBookDocument, XmlCommentsCorrectionsList, XmlGrantList, XmlJournal, XmlKeywordList, XmlMedlineCitation, XmlMeshHeadingList, XmlPublicationTypeList, XmlPubmedArticle, XmlPubmedArticleSet, XmlPubmedBookArticle } from '../types.js';
7
7
  /**
8
8
  * Result of extracting authors with deduplicated affiliations.
9
9
  */
@@ -61,6 +61,20 @@ export declare function extractPmcId(articleXml?: XmlArticle, pubmedDataArticleI
61
61
  * @returns An array of publication type strings.
62
62
  */
63
63
  export declare function extractPublicationTypes(publicationTypeListXml?: XmlPublicationTypeList): string[];
64
+ /**
65
+ * Extracts the linked notices from `MedlineCitation/CommentsCorrectionsList` —
66
+ * retractions, errata, expressions of concern, comments, updates — in upstream
67
+ * order. `Cites` entries are dropped: they list a bibliography rather than a
68
+ * linked record, which NLM now carries in `PubmedData/ReferenceList`. (#178)
69
+ *
70
+ * `RefSource` and `Note` reach this function as the text NCBI wrote: the response
71
+ * handler exempts both from numeric coercion, which would otherwise reduce `007` to
72
+ * `7`. A `PMID` is still coerced, and `getText` turns it back into a string — PMIDs
73
+ * carry no leading zeros, so none is lost.
74
+ * @param commentsCorrectionsListXml - The XML CommentsCorrectionsList element.
75
+ * @returns The linked notices; empty when the record carries none.
76
+ */
77
+ export declare function extractCommentsCorrections(commentsCorrectionsListXml?: XmlCommentsCorrectionsList): ParsedCommentsCorrection[];
64
78
  /**
65
79
  * Extracts keywords from XML. Handles single or multiple KeywordList elements.
66
80
  * @param keywordListsXml - The XML KeywordList element or an array of them.
@@ -1 +1 @@
1
- {"version":3,"file":"article-parser.d.ts","sourceRoot":"","sources":["../../../../src/services/ncbi/parsing/article-parser.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACV,aAAa,EACb,mBAAmB,EACnB,iBAAiB,EAEjB,cAAc,EACd,WAAW,EACX,iBAAiB,EAEjB,cAAc,EACd,uBAAuB,EAEvB,UAAU,EAEV,gBAAgB,EAEhB,aAAa,EACb,eAAe,EAEf,YAAY,EAEZ,UAAU,EAEV,cAAc,EACd,kBAAkB,EAElB,kBAAkB,EAGlB,sBAAsB,EACtB,gBAAgB,EAChB,mBAAmB,EACnB,oBAAoB,EACrB,MAAM,aAAa,CAAC;AAUrB;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,OAAO,EAAE,mBAAmB,EAAE,CAAC;CAChC;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,aAAa,CAAC,EAAE,aAAa,GAAG,gBAAgB,CAqD9E;AA2BD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,UAAU,CAAC,EAAE,UAAU,EACvB,UAAU,CAAC,EAAE,UAAU,GACtB,iBAAiB,GAAG,SAAS,CAmC/B;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,kBAAkB,CAAC,EAAE,kBAAkB,GAAG,cAAc,EAAE,CA8B1F;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,YAAY,CAAC,EAAE,YAAY,GAAG,WAAW,EAAE,CAmBxE;AAED;;;;;;;GAOG;AACH,wBAAgB,UAAU,CACxB,UAAU,CAAC,EAAE,UAAU,EACvB,uBAAuB,CAAC,EAAE,gBAAgB,GACzC,MAAM,GAAG,SAAS,CAyCpB;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAC1B,UAAU,CAAC,EAAE,UAAU,EACvB,uBAAuB,CAAC,EAAE,gBAAgB,GACzC,MAAM,GAAG,SAAS,CAsBpB;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,sBAAsB,CAAC,EAAE,sBAAsB,GAAG,MAAM,EAAE,CAIjG;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,eAAe,CAAC,EAAE,cAAc,EAAE,GAAG,cAAc,GAAG,MAAM,EAAE,CAa7F;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,CAAC,EAAE,UAAU,CAAC,UAAU,CAAC,GAAG,MAAM,GAAG,SAAS,CAyB5F;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,kBAAkB,CAAC,EAAE,kBAAkB,GAAG,MAAM,GAAG,SAAS,CAGvF;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,CAAC,EAAE,UAAU,GAAG,iBAAiB,EAAE,CAShF;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,gBAAgB,EAC5B,OAAO,GAAE,uBAA4B,GACpC,aAAa,CAkCf;AAkCD;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,eAAe,EAAE,eAAe,GAAG,cAAc,CAgDhF;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,oBAAoB,CAAC,cAAc,EAAE,oBAAoB,GAAG,aAAa,CAsDxF;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,eAAe,CAC7B,UAAU,EAAE,mBAAmB,GAAG,SAAS,EAC3C,OAAO,GAAE,uBAA4B,GACpC,aAAa,EAAE,CAejB"}
1
+ {"version":3,"file":"article-parser.d.ts","sourceRoot":"","sources":["../../../../src/services/ncbi/parsing/article-parser.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACV,aAAa,EACb,mBAAmB,EACnB,iBAAiB,EAEjB,cAAc,EACd,wBAAwB,EACxB,WAAW,EACX,iBAAiB,EAEjB,cAAc,EACd,uBAAuB,EAEvB,UAAU,EAEV,gBAAgB,EAEhB,aAAa,EACb,eAAe,EACf,0BAA0B,EAE1B,YAAY,EAEZ,UAAU,EAEV,cAAc,EACd,kBAAkB,EAElB,kBAAkB,EAGlB,sBAAsB,EACtB,gBAAgB,EAChB,mBAAmB,EACnB,oBAAoB,EACrB,MAAM,aAAa,CAAC;AAUrB;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,OAAO,EAAE,mBAAmB,EAAE,CAAC;CAChC;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,aAAa,CAAC,EAAE,aAAa,GAAG,gBAAgB,CAsD9E;AA2BD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,UAAU,CAAC,EAAE,UAAU,EACvB,UAAU,CAAC,EAAE,UAAU,GACtB,iBAAiB,GAAG,SAAS,CA0C/B;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,kBAAkB,CAAC,EAAE,kBAAkB,GAAG,cAAc,EAAE,CA8B1F;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,YAAY,CAAC,EAAE,YAAY,GAAG,WAAW,EAAE,CAmBxE;AAED;;;;;;;GAOG;AACH,wBAAgB,UAAU,CACxB,UAAU,CAAC,EAAE,UAAU,EACvB,uBAAuB,CAAC,EAAE,gBAAgB,GACzC,MAAM,GAAG,SAAS,CAyCpB;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAC1B,UAAU,CAAC,EAAE,UAAU,EACvB,uBAAuB,CAAC,EAAE,gBAAgB,GACzC,MAAM,GAAG,SAAS,CAsBpB;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,sBAAsB,CAAC,EAAE,sBAAsB,GAAG,MAAM,EAAE,CAIjG;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,0BAA0B,CACxC,0BAA0B,CAAC,EAAE,0BAA0B,GACtD,wBAAwB,EAAE,CAa5B;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,eAAe,CAAC,EAAE,cAAc,EAAE,GAAG,cAAc,GAAG,MAAM,EAAE,CAa7F;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,CAAC,EAAE,UAAU,CAAC,UAAU,CAAC,GAAG,MAAM,GAAG,SAAS,CAyB5F;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,kBAAkB,CAAC,EAAE,kBAAkB,GAAG,MAAM,GAAG,SAAS,CAGvF;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,CAAC,EAAE,UAAU,GAAG,iBAAiB,EAAE,CAShF;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,gBAAgB,EAC5B,OAAO,GAAE,uBAA4B,GACpC,aAAa,CAoCf;AAkCD;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,eAAe,EAAE,eAAe,GAAG,cAAc,CAgDhF;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,oBAAoB,CAAC,cAAc,EAAE,oBAAoB,GAAG,aAAa,CAmDxF;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,eAAe,CAC7B,UAAU,EAAE,mBAAmB,GAAG,SAAS,EAC3C,OAAO,GAAE,uBAA4B,GACpC,aAAa,EAAE,CAejB"}