@cyanheads/openalex-mcp-server 0.7.15 → 0.8.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.
Files changed (54) hide show
  1. package/AGENTS.md +32 -30
  2. package/CLAUDE.md +32 -30
  3. package/Dockerfile +88 -32
  4. package/README.md +12 -6
  5. package/changelog/0.7.x/0.7.16.md +32 -0
  6. package/changelog/0.8.x/0.8.0.md +38 -0
  7. package/dist/index.js +1 -1
  8. package/dist/index.js.map +1 -1
  9. package/dist/mcp-server/prompts/definitions/literature-review.prompt.js +1 -1
  10. package/dist/mcp-server/tools/definitions/analyze-trends.tool.d.ts +4 -3
  11. package/dist/mcp-server/tools/definitions/analyze-trends.tool.d.ts.map +1 -1
  12. package/dist/mcp-server/tools/definitions/analyze-trends.tool.js +62 -19
  13. package/dist/mcp-server/tools/definitions/analyze-trends.tool.js.map +1 -1
  14. package/dist/mcp-server/tools/definitions/citation-graph.tool.d.ts +21 -1
  15. package/dist/mcp-server/tools/definitions/citation-graph.tool.d.ts.map +1 -1
  16. package/dist/mcp-server/tools/definitions/citation-graph.tool.js +42 -42
  17. package/dist/mcp-server/tools/definitions/citation-graph.tool.js.map +1 -1
  18. package/dist/mcp-server/tools/definitions/describe-fields.tool.d.ts.map +1 -1
  19. package/dist/mcp-server/tools/definitions/describe-fields.tool.js +82 -15
  20. package/dist/mcp-server/tools/definitions/describe-fields.tool.js.map +1 -1
  21. package/dist/mcp-server/tools/definitions/resolve-name.tool.d.ts +8 -1
  22. package/dist/mcp-server/tools/definitions/resolve-name.tool.d.ts.map +1 -1
  23. package/dist/mcp-server/tools/definitions/resolve-name.tool.js +18 -7
  24. package/dist/mcp-server/tools/definitions/resolve-name.tool.js.map +1 -1
  25. package/dist/mcp-server/tools/definitions/search-entities.tool.d.ts +45 -1
  26. package/dist/mcp-server/tools/definitions/search-entities.tool.d.ts.map +1 -1
  27. package/dist/mcp-server/tools/definitions/search-entities.tool.js +140 -64
  28. package/dist/mcp-server/tools/definitions/search-entities.tool.js.map +1 -1
  29. package/dist/mcp-server/tools/escape-markdown.d.ts +32 -0
  30. package/dist/mcp-server/tools/escape-markdown.d.ts.map +1 -0
  31. package/dist/mcp-server/tools/escape-markdown.js +389 -0
  32. package/dist/mcp-server/tools/escape-markdown.js.map +1 -0
  33. package/dist/mcp-server/tools/render-entity-record.d.ts +14 -2
  34. package/dist/mcp-server/tools/render-entity-record.d.ts.map +1 -1
  35. package/dist/mcp-server/tools/render-entity-record.js +46 -15
  36. package/dist/mcp-server/tools/render-entity-record.js.map +1 -1
  37. package/dist/mcp-server/tools/response-budget.d.ts +159 -0
  38. package/dist/mcp-server/tools/response-budget.d.ts.map +1 -0
  39. package/dist/mcp-server/tools/response-budget.js +480 -0
  40. package/dist/mcp-server/tools/response-budget.js.map +1 -0
  41. package/dist/services/openalex/html-entities.json +2237 -0
  42. package/dist/services/openalex/openalex-service.d.ts +14 -1
  43. package/dist/services/openalex/openalex-service.d.ts.map +1 -1
  44. package/dist/services/openalex/openalex-service.js +147 -101
  45. package/dist/services/openalex/openalex-service.js.map +1 -1
  46. package/dist/services/openalex/provider-text.d.ts +27 -0
  47. package/dist/services/openalex/provider-text.d.ts.map +1 -0
  48. package/dist/services/openalex/provider-text.js +600 -0
  49. package/dist/services/openalex/provider-text.js.map +1 -0
  50. package/dist/services/openalex/types.d.ts +6 -1
  51. package/dist/services/openalex/types.d.ts.map +1 -1
  52. package/dist/services/openalex/types.js +1 -1
  53. package/package.json +11 -7
  54. package/server.json +3 -3
@@ -0,0 +1,600 @@
1
+ /**
2
+ * @fileoverview Normalization of provider text — the titles, abstracts, names, and affiliation
3
+ * strings OpenAlex passes through from its sources unsanitized. Decodes HTML character
4
+ * references against the full WHATWG table in one pass, then, in a second single pass, removes
5
+ * HTML comments, unwraps a small allowlist of HTML/JATS/MathML elements, unwraps CDATA sections
6
+ * and IOP's `<?CDATA …?>` instructions, drops the `<?MML …?>` instructions that restate them, and
7
+ * turns a double-escaped line break (a literal backslash + `n`) into a space. Everything else
8
+ * stays literal, so text such as `A < B`, `Fish <Actinopterygii>`, a SICI DOI, or TeX like `\nu`
9
+ * survives untouched. Output is plain text; Markdown escaping for `content[]` happens at the
10
+ * render boundary, never here. Identifier and URL fields of a record are not provider text and
11
+ * pass through byte-identical, so each one resolves when passed back.
12
+ * @module services/openalex/provider-text
13
+ */
14
+ import entityTable from './html-entities.json' with { type: 'json' };
15
+ /**
16
+ * Named character references, keyed without the `&` and `;`. The data is the WHATWG table
17
+ * (https://html.spec.whatwg.org/entities.json), which the HTML standard freezes — it is never
18
+ * extended — so a vendored copy cannot drift. A `Map` rather than an object literal, because an
19
+ * object answers `constructor` and every other `Object.prototype` member as if it were a name.
20
+ */
21
+ const NAMED_REFERENCES = new Map(Object.entries(entityTable.named));
22
+ /** The 106 legacy names the standard also accepts without a trailing `;` (`&amp`, `&copy`, …). */
23
+ const LEGACY_REFERENCES = new Set(entityTable.legacy);
24
+ /**
25
+ * Common references OpenAlex also carries with their case changed, because a source upper- or
26
+ * title-cased the whole title entities and all (`BLEEDING IN&NBSP;CHILDREN`, `Nations:&Nbsp;`).
27
+ * A spelling the table does not hold decodes as the lowercase name; one it does hold keeps its
28
+ * own meaning, so `&Lt;` stays ≪.
29
+ */
30
+ const CASE_FOLDED_REFERENCES = new Set([
31
+ 'amp',
32
+ 'apos',
33
+ 'gt',
34
+ 'lt',
35
+ 'nbsp',
36
+ 'quot',
37
+ ]);
38
+ function namedReference(name) {
39
+ const exact = NAMED_REFERENCES.get(name);
40
+ if (exact !== undefined)
41
+ return exact;
42
+ const folded = name.toLowerCase();
43
+ return CASE_FOLDED_REFERENCES.has(folded) ? NAMED_REFERENCES.get(folded) : undefined;
44
+ }
45
+ const MAX_UNICODE_CODE_POINT = 0x10ffff;
46
+ /**
47
+ * One character reference: decimal, hex, or a maximal alphanumeric name, each with an optional
48
+ * `;`. The name run is maximal, so the character after an unterminated name is never an
49
+ * alphanumeric — the only lookahead the legacy rule still needs is `=`.
50
+ */
51
+ const CHARACTER_REFERENCE = /&(?:#(\d+)|#[xX]([0-9a-fA-F]+)|([A-Za-z][A-Za-z0-9]*))(;?)/g;
52
+ /** Whether `&name;` is a named character reference, for callers that must not let one decode. */
53
+ export function isNamedCharacterReference(name) {
54
+ return NAMED_REFERENCES.has(name);
55
+ }
56
+ function codePointToString(code, fallback) {
57
+ return Number.isInteger(code) && code >= 0 && code <= MAX_UNICODE_CODE_POINT
58
+ ? String.fromCodePoint(code)
59
+ : fallback;
60
+ }
61
+ /**
62
+ * Decode HTML character references in a single pass, so `&amp;lt;` becomes `&lt;` and never `<`.
63
+ *
64
+ * - Numeric references (`&#38;`, `&#x27E9;`) decode with or without the `;` — OpenAlex sends
65
+ * `&#38 Hepatology` — and a code point past U+10FFFF stays literal rather than corrupting text.
66
+ * - Named references are case-sensitive (`&Alpha;` is Α, `&alpha;` is α) and need the `;`,
67
+ * except for the legacy names, which follow the standard's attribute-value rule: decoded
68
+ * without the `;` unless an `=` follows, so a URL's `&copy=2` query parameter stays intact.
69
+ * A recased common reference with its `;` (`&NBSP;`, `&Quot;`) decodes as the lowercase name.
70
+ * - Anything else — `&constructor;`, `AT&T`, `&madeupentity;` — stays literal.
71
+ */
72
+ function decodeCharacterReferences(text) {
73
+ if (!text.includes('&'))
74
+ return text;
75
+ return text.replace(CHARACTER_REFERENCE, (match, decimal, hex, name, semicolon, offset) => {
76
+ if (decimal !== undefined)
77
+ return codePointToString(Number.parseInt(decimal, 10), match);
78
+ if (hex !== undefined)
79
+ return codePointToString(Number.parseInt(hex, 16), match);
80
+ const reference = name;
81
+ if (semicolon)
82
+ return namedReference(reference) ?? match;
83
+ const next = text[offset + match.length];
84
+ return LEGACY_REFERENCES.has(reference) && next !== '='
85
+ ? (NAMED_REFERENCES.get(reference) ?? match)
86
+ : match;
87
+ });
88
+ }
89
+ /** Inline elements whose tags are dropped and whose text is kept. */
90
+ const INLINE_ELEMENTS = new Set([
91
+ 'b',
92
+ 'em',
93
+ 'i',
94
+ 'inline-formula',
95
+ 'jats:bold',
96
+ 'jats:italic',
97
+ 'sc',
98
+ 'scp',
99
+ 'span',
100
+ 'strong',
101
+ 'tex-math',
102
+ // MathML presentation markup, bare; `mml:`-prefixed names are matched by prefix.
103
+ 'math',
104
+ 'menclose',
105
+ 'mfenced',
106
+ 'mfrac',
107
+ 'mi',
108
+ 'mmultiscripts',
109
+ 'mn',
110
+ 'mo',
111
+ 'mover',
112
+ 'mpadded',
113
+ 'mphantom',
114
+ 'mroot',
115
+ 'mrow',
116
+ 'mspace',
117
+ 'msqrt',
118
+ 'mstyle',
119
+ 'msub',
120
+ 'msubsup',
121
+ 'msup',
122
+ 'mtable',
123
+ 'mtd',
124
+ 'mtext',
125
+ 'mtr',
126
+ 'munder',
127
+ 'munderover',
128
+ 'semantics',
129
+ ]);
130
+ /** Block elements, each replaced by a paragraph break. */
131
+ const BLOCK_ELEMENTS = new Set([
132
+ 'br',
133
+ 'jats:p',
134
+ 'jats:sec',
135
+ 'jats:title',
136
+ 'li',
137
+ 'p',
138
+ ]);
139
+ const PARAGRAPH_BREAK = '\n\n';
140
+ /**
141
+ * Sub/superscripts open as TeX-style `_{`/`^{` and close with `}`. Unicode has no
142
+ * sub/superscript for most letters, unwrapping would read `10<sup>-3</sup>` as `10-3`, and
143
+ * OpenAlex's TeX-bearing abstracts already use this notation.
144
+ */
145
+ const SCRIPT_OPENERS = new Map([
146
+ ['sub', '_{'],
147
+ ['jats:sub', '_{'],
148
+ ['sup', '^{'],
149
+ ['jats:sup', '^{'],
150
+ ]);
151
+ /** A complete tag, checked against one `<…>` candidate that holds no other `<` or `>`. */
152
+ const TAG = /^<(\/?)([A-Za-z][\w:.-]*)(?:\s[^<>]*)?\/?>$/;
153
+ function isAllowlistedElement(name) {
154
+ return (INLINE_ELEMENTS.has(name) ||
155
+ name.startsWith('mml:') ||
156
+ BLOCK_ELEMENTS.has(name) ||
157
+ SCRIPT_OPENERS.has(name));
158
+ }
159
+ /**
160
+ * What an allowlisted tag becomes, or `undefined` for any other `<…>` span, which stays literal.
161
+ * Matching a whole tag name — never a prefix — is what keeps `i1<i2<` and `<Actinopterygii>`.
162
+ */
163
+ function replaceTag(candidate) {
164
+ const tag = TAG.exec(candidate);
165
+ if (!tag)
166
+ return;
167
+ const closing = tag[1] === '/';
168
+ const name = tag[2].toLowerCase();
169
+ if (INLINE_ELEMENTS.has(name) || name.startsWith('mml:'))
170
+ return '';
171
+ if (BLOCK_ELEMENTS.has(name))
172
+ return PARAGRAPH_BREAK;
173
+ const opener = SCRIPT_OPENERS.get(name);
174
+ if (opener === undefined)
175
+ return;
176
+ if (candidate.endsWith('/>'))
177
+ return '';
178
+ return closing ? '}' : opener;
179
+ }
180
+ const COMMENT_OPEN = '<!--';
181
+ /** `<!---->` — the shortest span that closes a comment it opened. */
182
+ const MIN_COMMENT_LENGTH = 7;
183
+ /**
184
+ * `<!--inline-formula>`: an A&A/JATS formula opener written as a comment opener that never
185
+ * closes. An allowlisted name straight after `<!--` makes it a tag to remove, not a comment —
186
+ * left open, it would delete everything up to the next `-->`, which math text supplies as an
187
+ * arrow (`--->`). A space after `<!--`, as every real comment in the corpus has, keeps it a
188
+ * comment. The length cap bounds the check to the one `>` that can end such a name.
189
+ */
190
+ const FORMULA_OPENER = /^<!--([A-Za-z][\w:.-]*)>$/;
191
+ const MAX_FORMULA_OPENER_LENGTH = 64;
192
+ const CDATA_OPEN = '<![CDATA[';
193
+ const CDATA_CLOSE = ']]>';
194
+ /** The closer without its `>`, which some sources end a section with. */
195
+ const CDATA_BARE_CLOSE = ']]';
196
+ /**
197
+ * Processing instructions IOP wraps inline math in: `<?CDATA x?>` carries the TeX and is
198
+ * unwrapped; the `<?MML y?>` that always follows restates it flattened (`10^4` reads `10 4`) and
199
+ * is removed whole. Only these two targets — a generic `<?name` rule would eat `<?php` text.
200
+ */
201
+ const INSTRUCTION_CDATA = '<?CDATA';
202
+ const INSTRUCTION_MML = '<?MML';
203
+ const INSTRUCTION_CLOSE = '?>';
204
+ /**
205
+ * The longest `<?MML … ?>` removed, `<?MML` through `?>`. Every one in a 3,543-record sample
206
+ * spans at most 64 characters; one that runs longer lost its `?>` and stays literal rather than
207
+ * deleting prose up to some later `?>`.
208
+ */
209
+ const MAX_MML_SPAN = 128;
210
+ /** A double-escaped line break: the two characters `\` and `n`, not a newline. */
211
+ const LITERAL_NEWLINE = '\\n';
212
+ function endsWith(out, suffix) {
213
+ if (out.length < suffix.length)
214
+ return false;
215
+ for (let i = 0; i < suffix.length; i++) {
216
+ if (out[out.length - suffix.length + i] !== suffix[i])
217
+ return false;
218
+ }
219
+ return true;
220
+ }
221
+ const isBlank = (ch) => ch === ' ' || ch === '\t';
222
+ const isAsciiLetter = (ch) => ch !== undefined && ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z'));
223
+ /** Characters that end a processing-instruction target. */
224
+ const endsInstructionTarget = (ch) => ch === ' ' || ch === '\t' || ch === '\n' || ch === '\r' || ch === '?';
225
+ /** Whether `out` ends with a formula opener whose `<` sits at `start`. */
226
+ function isFormulaOpener(out, start) {
227
+ if (out.length - start > MAX_FORMULA_OPENER_LENGTH)
228
+ return false;
229
+ if (out[start + 1] !== '!' || !isAsciiLetter(out[start + COMMENT_OPEN.length]))
230
+ return false;
231
+ const name = FORMULA_OPENER.exec(out.slice(start).join(''))?.[1];
232
+ return name !== undefined && isAllowlistedElement(name.toLowerCase());
233
+ }
234
+ /**
235
+ * Handle markup in one left-to-right pass, reaching the result that repeating a regex
236
+ * replacement until nothing changes would reach — no allowlisted tag, comment, or delimiter can
237
+ * re-form in the output — in linear time. A replace-until-stable loop costs one full pass per
238
+ * nesting level, which is quadratic on nested input such as `<<<i>i>i>`.
239
+ *
240
+ * Characters are copied to `out`. Removing a tag, comment, or delimiter can join the text on
241
+ * either side into a new one (`<<i>i>`, `<!-<!---->- x -->`, `<![CDA<i></i>TA[`), so every
242
+ * removal truncates `out` and scanning simply continues, and every delimiter is recognized by
243
+ * how `out` ends rather than by the input: `opens` holds the positions of each `<` that could
244
+ * still begin a tag, and `commentStart` the earliest unclosed `<!--`. A tag ends at the first `>`
245
+ * after its `<`, so a `>` settles the innermost open `<`: kept as text, it also blocks every `<`
246
+ * below it, except those before an unclosed comment, which come back into play if that comment
247
+ * closes. Each character is examined a bounded number of times.
248
+ *
249
+ * CDATA: the `<![CDATA[` opener is dropped where it forms and `cdataStart` marks where the
250
+ * section's text begins. `]]>` closes it. Sources also drop the `>`, so a bare `]]` followed by
251
+ * anything but `>` or `]` — the end of the text included — closes it as well, unless the text
252
+ * still holds a `]]>` before its next opener: then the `]]` belongs to the section, as in TeX's
253
+ * `k[[x]]`. A bare `]]` at most one space before an opener closed a section whose opener was
254
+ * lost, and goes with it. With no open section, `]]` and `]]>` are text.
255
+ *
256
+ * `<?MML`: a pending instruction closes at the next `?>` unless another `<?` forms first or the
257
+ * span passes `MAX_MML_SPAN`; either way it stays literal, since its `?>` was lost. A `?>` that
258
+ * closes nothing is dropped when another pass would pair it with such a literal `<?MML` — no
259
+ * `<?` between them, within the cap — so the output stays a fixed point.
260
+ *
261
+ * Literal `\n`: sources that double-escaped their line breaks leave a backslash and an `n`. One
262
+ * whose backslash is not itself escaped and which no ASCII letter follows becomes a single
263
+ * space, merged with the spaces around it and dropped at either end of the text. Most wrap
264
+ * mid-sentence, so it is never a paragraph break. A letter after it reads as TeX (`\nu`,
265
+ * `\neq`, `\nabla`, a custom `\np`), and no local rule tells those from a glued `\nand`, so
266
+ * those stay. A backslash just before a removed opener forms one with the `n` after it; the
267
+ * section or instruction that opener began stays open.
268
+ */
269
+ function stripMarkup(text) {
270
+ if (!text.includes('<') && !text.includes(LITERAL_NEWLINE))
271
+ return text;
272
+ const out = [];
273
+ const opens = [];
274
+ const instructions = [];
275
+ let commentStart = -1;
276
+ let cdataStart = -1;
277
+ /** A space standing where text was removed, dropped if nothing follows it. */
278
+ let softSpace = -1;
279
+ /** Swallow spaces and tabs up to the next other character. */
280
+ let skipBlanks = false;
281
+ /** An unescaped `\n` was just copied; the next character decides what it is. */
282
+ let newlinePending = false;
283
+ /** A pending `<?MML` was left literal, so a stray `?>` may pair with it on another pass. */
284
+ let literalMml = false;
285
+ /**
286
+ * Where the next `]]>` and `<![CDATA[` start in `text`, -1 for none. The scan position only
287
+ * advances, so each is searched again only once passed, and every search covers new ground.
288
+ */
289
+ let nextSectionClose = -2;
290
+ let nextSectionOpen = -2;
291
+ /** Whether `text` holds a `]]>` at or after `from`, before any further section opener. */
292
+ const sectionCloseAhead = (from) => {
293
+ if (nextSectionClose !== -1 && nextSectionClose < from) {
294
+ nextSectionClose = text.indexOf(CDATA_CLOSE, from);
295
+ }
296
+ if (nextSectionClose < 0)
297
+ return false;
298
+ if (nextSectionOpen !== -1 && nextSectionOpen < from) {
299
+ nextSectionOpen = text.indexOf(CDATA_OPEN, from);
300
+ }
301
+ return nextSectionOpen < 0 || nextSectionClose < nextSectionOpen;
302
+ };
303
+ const truncate = (length) => {
304
+ out.length = length;
305
+ while (opens.length > 0 && opens.at(-1) >= length)
306
+ opens.pop();
307
+ if (commentStart >= length)
308
+ commentStart = -1;
309
+ if (cdataStart > length)
310
+ cdataStart = -1;
311
+ while (instructions.length > 0) {
312
+ const { kind, start } = instructions.at(-1);
313
+ if (kind === 'mml' ? start < length : start <= length)
314
+ break;
315
+ instructions.pop();
316
+ }
317
+ if (softSpace >= length)
318
+ softSpace = -1;
319
+ };
320
+ /**
321
+ * Open a processing instruction when `out` ends with its target and `separator` ends that
322
+ * target — whitespace, a `?`, or the space or break a removal leaves. Returns whether the
323
+ * separator is consumed: the whitespace after a CDATA target only separates it from the content.
324
+ */
325
+ const openInstruction = (separator) => {
326
+ if (endsWith(out, INSTRUCTION_CDATA)) {
327
+ truncate(out.length - INSTRUCTION_CDATA.length);
328
+ instructions.push({ kind: 'cdata', start: out.length });
329
+ return separator !== '?';
330
+ }
331
+ if (endsWith(out, INSTRUCTION_MML)) {
332
+ instructions.push({ kind: 'mml', start: out.length - INSTRUCTION_MML.length });
333
+ }
334
+ return false;
335
+ };
336
+ /** Replace the `\n` that ends `out` with one space, merging the blanks before it. */
337
+ const replaceNewline = () => {
338
+ // Blanks before a section or instruction opener stay, so the opener keeps its position.
339
+ const instruction = instructions.at(-1);
340
+ const floor = Math.max(cdataStart, instruction?.start ?? -1);
341
+ let length = out.length - LITERAL_NEWLINE.length;
342
+ while (length > floor && length > 0 && isBlank(out[length - 1]))
343
+ length--;
344
+ // The backslash sits before a removed opener whose section or instruction the `n` began.
345
+ const reopenSection = cdataStart > length;
346
+ const reopenInstruction = instruction?.kind === 'cdata' && instruction.start > length;
347
+ truncate(length);
348
+ if (reopenSection)
349
+ cdataStart = length;
350
+ if (reopenInstruction)
351
+ instructions.push({ kind: 'cdata', start: length });
352
+ skipBlanks = true;
353
+ if (!openInstruction(' ') && length > 0 && !isBlank(out[length - 1])) {
354
+ out.push(' ');
355
+ softSpace = length;
356
+ }
357
+ };
358
+ /**
359
+ * Whether the `?>` ending `out` would close a literal `<?MML` on another pass: the nearest `<?`
360
+ * before it, within `MAX_MML_SPAN` of its end, begins one.
361
+ */
362
+ const pairsWithLiteralMml = () => {
363
+ const floor = Math.max(0, out.length - MAX_MML_SPAN);
364
+ for (let at = out.length - INSTRUCTION_CLOSE.length - 1; at >= floor; at--) {
365
+ if (out[at] !== '<' || out[at + 1] !== '?')
366
+ continue;
367
+ for (let i = 2; i < INSTRUCTION_MML.length; i++) {
368
+ if (out[at + i] !== INSTRUCTION_MML[i])
369
+ return false;
370
+ }
371
+ const separator = out[at + INSTRUCTION_MML.length];
372
+ return separator !== undefined && endsInstructionTarget(separator);
373
+ }
374
+ return false;
375
+ };
376
+ /** After removing a span: merge the blanks around it, and drop it cleanly at either end. */
377
+ const settleRemoval = () => {
378
+ if (out.length === 0) {
379
+ skipBlanks = true;
380
+ }
381
+ else if (isBlank(out.at(-1))) {
382
+ skipBlanks = true;
383
+ softSpace = out.length - 1;
384
+ }
385
+ };
386
+ const openSection = () => {
387
+ let start = out.length - CDATA_OPEN.length;
388
+ const gap = out[start - 1] === ' ' ? 1 : 0;
389
+ const lostClose = out[start - 1 - gap] === ']' && out[start - 2 - gap] === ']';
390
+ if (lostClose)
391
+ start -= CDATA_BARE_CLOSE.length + gap;
392
+ truncate(start);
393
+ if (lostClose && gap > 0 && out.length > 0 && !isBlank(out.at(-1)) && !openInstruction(' ')) {
394
+ out.push(' ');
395
+ }
396
+ // Sections do not nest; a second opener inside one only goes.
397
+ if (cdataStart < 0)
398
+ cdataStart = out.length;
399
+ };
400
+ let offset = 0;
401
+ for (const ch of text) {
402
+ const at = offset;
403
+ offset += ch.length;
404
+ if (newlinePending) {
405
+ newlinePending = false;
406
+ if (!isAsciiLetter(ch))
407
+ replaceNewline();
408
+ }
409
+ if (skipBlanks) {
410
+ if (isBlank(ch))
411
+ continue;
412
+ skipBlanks = false;
413
+ }
414
+ if (cdataStart >= 0 &&
415
+ ch !== '>' &&
416
+ ch !== ']' &&
417
+ out.length - CDATA_BARE_CLOSE.length >= cdataStart &&
418
+ endsWith(out, CDATA_BARE_CLOSE) &&
419
+ !sectionCloseAhead(at)) {
420
+ truncate(out.length - CDATA_BARE_CLOSE.length);
421
+ cdataStart = -1;
422
+ // `x ]] y` leaves one space, not two.
423
+ if (isBlank(ch) && isBlank(out.at(-1)))
424
+ continue;
425
+ }
426
+ if (endsInstructionTarget(ch) && openInstruction(ch))
427
+ continue;
428
+ out.push(ch);
429
+ if (ch === 'n' && out.at(-2) === '\\' && out.at(-3) !== '\\') {
430
+ newlinePending = true;
431
+ continue;
432
+ }
433
+ if (ch === '<') {
434
+ opens.push(out.length - 1);
435
+ continue;
436
+ }
437
+ if (ch === '[') {
438
+ if (endsWith(out, CDATA_OPEN))
439
+ openSection();
440
+ continue;
441
+ }
442
+ if (ch === '-') {
443
+ if (commentStart < 0 && endsWith(out, COMMENT_OPEN))
444
+ commentStart = out.length - 4;
445
+ continue;
446
+ }
447
+ if (ch === '?') {
448
+ if (out.at(-2) === '<' && instructions.at(-1)?.kind === 'mml') {
449
+ instructions.pop();
450
+ literalMml = true;
451
+ }
452
+ continue;
453
+ }
454
+ if (ch !== '>')
455
+ continue;
456
+ if (cdataStart >= 0 &&
457
+ out.length - CDATA_CLOSE.length >= cdataStart &&
458
+ endsWith(out, CDATA_CLOSE)) {
459
+ truncate(out.length - CDATA_CLOSE.length);
460
+ cdataStart = -1;
461
+ continue;
462
+ }
463
+ if (endsWith(out, INSTRUCTION_CLOSE)) {
464
+ let instruction = instructions.at(-1);
465
+ if (instruction?.kind === 'mml' && out.length - instruction.start > MAX_MML_SPAN) {
466
+ instructions.pop();
467
+ instruction = instructions.at(-1);
468
+ }
469
+ if (instruction) {
470
+ instructions.pop();
471
+ if (instruction.kind === 'cdata') {
472
+ truncate(out.length - INSTRUCTION_CLOSE.length);
473
+ }
474
+ else {
475
+ truncate(instruction.start);
476
+ settleRemoval();
477
+ }
478
+ continue;
479
+ }
480
+ if (literalMml && pairsWithLiteralMml()) {
481
+ truncate(out.length - INSTRUCTION_CLOSE.length);
482
+ settleRemoval();
483
+ continue;
484
+ }
485
+ }
486
+ if (commentStart >= 0 &&
487
+ out.length - commentStart >= MIN_COMMENT_LENGTH &&
488
+ endsWith(out, '-->')) {
489
+ truncate(commentStart);
490
+ continue;
491
+ }
492
+ // Like a tag, a formula opener goes even inside an unclosed comment.
493
+ const top = opens.at(-1);
494
+ if (top !== undefined && isFormulaOpener(out, top)) {
495
+ truncate(top);
496
+ continue;
497
+ }
498
+ // Inside an unclosed comment, only a `<` opened after it can form a tag.
499
+ if (top === undefined || top <= commentStart)
500
+ continue;
501
+ opens.pop();
502
+ const replacement = replaceTag(out.slice(top).join(''));
503
+ if (replacement === undefined) {
504
+ while (opens.length > 0 && opens.at(-1) > commentStart)
505
+ opens.pop();
506
+ continue;
507
+ }
508
+ truncate(top);
509
+ if (replacement === PARAGRAPH_BREAK && openInstruction(replacement))
510
+ continue;
511
+ if (replacement)
512
+ out.push(replacement);
513
+ }
514
+ if (newlinePending)
515
+ replaceNewline();
516
+ if (cdataStart >= 0 &&
517
+ out.length - CDATA_BARE_CLOSE.length >= cdataStart &&
518
+ endsWith(out, CDATA_BARE_CLOSE)) {
519
+ truncate(out.length - CDATA_BARE_CLOSE.length);
520
+ }
521
+ if (softSpace >= 0 && softSpace === out.length - 1)
522
+ out.length = softSpace;
523
+ // A break element can only come from a block tag (input is copied one character at a time),
524
+ // and one inside a comment was truncated with it.
525
+ const stripped = out.join('');
526
+ if (!out.includes(PARAGRAPH_BREAK))
527
+ return stripped;
528
+ // Block tags leave runs of breaks and stray edge whitespace; keep one break between paragraphs.
529
+ return stripped
530
+ .split(PARAGRAPH_BREAK)
531
+ .map((paragraph) => paragraph.trim())
532
+ .filter(Boolean)
533
+ .join(PARAGRAPH_BREAK);
534
+ }
535
+ /**
536
+ * Normalize one provider string to plain text: decode character references once, then handle
537
+ * markup. Decoding first is what lets an encoded tag (`&lt;i&gt;x&lt;/i&gt;`) unwrap; decoding
538
+ * never runs again afterward, so double-encoded text keeps its remaining level.
539
+ */
540
+ export function normalizeProviderText(text) {
541
+ return stripMarkup(decodeCharacterReferences(text));
542
+ }
543
+ function isRecord(value) {
544
+ return value !== null && typeof value === 'object' && !Array.isArray(value);
545
+ }
546
+ /**
547
+ * Keys holding identifiers and URLs — what a caller passes back to look a record up, filter on,
548
+ * or open. Their strings stay byte-identical to upstream: OpenAlex stores some DOIs with a
549
+ * literal `&amp;`, and only that spelling resolves. Named by the key holding the string or the
550
+ * array of strings, at any depth: these, and any key ending in `_id`, `_ids`, `_url`, or
551
+ * `_lineage`. No display-text field (`title`, `display_name`, `abstract`, `raw_*`,
552
+ * `host_organization_name`, `description`, `hint`, …) matches.
553
+ */
554
+ const IDENTIFIER_KEYS = new Set([
555
+ 'doi',
556
+ 'host_organization',
557
+ 'id',
558
+ 'issn',
559
+ 'issn_l',
560
+ 'lineage',
561
+ 'orcid',
562
+ 'parent_publisher',
563
+ 'raw_orcid',
564
+ 'referenced_works',
565
+ 'related_works',
566
+ 'ror',
567
+ 'url',
568
+ 'wikidata',
569
+ ]);
570
+ const IDENTIFIER_SUFFIX = /_(?:id|ids|url|lineage)$/;
571
+ /** Objects whose every value is an identifier or URL (`ids.doi`, `content_urls.pdf`). */
572
+ const IDENTIFIER_MAPS = new Set(['content_urls', 'ids']);
573
+ function isIdentifierKey(key) {
574
+ return IDENTIFIER_KEYS.has(key) || IDENTIFIER_SUFFIX.test(key);
575
+ }
576
+ function normalizeLeaves(value, identifier) {
577
+ if (typeof value === 'string')
578
+ return identifier ? value : normalizeProviderText(value);
579
+ if (Array.isArray(value))
580
+ return value.map((item) => normalizeLeaves(item, identifier));
581
+ if (!isRecord(value))
582
+ return value;
583
+ // `fromEntries` defines each key as an own data property; assigning an own `__proto__` key
584
+ // onto an object literal would run the inherited setter and drop it. An object under an
585
+ // identifier key is still walked by its own keys, so a `display_name` inside it is normalized.
586
+ return Object.fromEntries(Object.entries(value).map(([key, item]) => [
587
+ key,
588
+ IDENTIFIER_MAPS.has(key) && isRecord(item)
589
+ ? item
590
+ : normalizeLeaves(item, isIdentifierKey(key)),
591
+ ]));
592
+ }
593
+ /**
594
+ * Normalize every string leaf of a JSON value except identifiers and URLs, which pass through
595
+ * byte-identical; keys, numbers, booleans, and nulls pass through too.
596
+ */
597
+ export function normalizeProviderValue(value) {
598
+ return normalizeLeaves(value, false);
599
+ }
600
+ //# sourceMappingURL=provider-text.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-text.js","sourceRoot":"","sources":["../../../src/services/openalex/provider-text.ts"],"names":[],"mappings":"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"}
@@ -5,7 +5,7 @@
5
5
  export declare const ENTITY_TYPES: readonly ['works', 'authors', 'sources', 'institutions', 'topics', 'keywords', 'publishers', 'funders'];
6
6
  export type EntityType = (typeof ENTITY_TYPES)[number];
7
7
  /**
8
- * Default `select` fields applied to search queries (not single-entity lookups) when the caller
8
+ * Default `select` fields applied to searches and single-entity lookups alike when the caller
9
9
  * doesn't specify `select`. Prevents 20-70KB-per-record responses from blowing up context windows.
10
10
  *
11
11
  * `best_oa_location` earns its place on works despite the payload it adds (~36% on a 25-record
@@ -83,6 +83,11 @@ export interface EntityRecord {
83
83
  }
84
84
  export interface GroupRecord {
85
85
  count: number;
86
+ /**
87
+ * Set only on the missing-value bucket `include_unknown` adds, whose key is an OpenAlex
88
+ * sentinel (`-111`, `unknown`, `…/unknown`) rather than a measured value.
89
+ */
90
+ is_unknown?: true;
86
91
  key: string;
87
92
  key_display_name: string;
88
93
  }
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/services/openalex/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,eAAO,MAAM,YAAY,YACvB,OAAO,EACP,SAAS,EACT,SAAS,EACT,cAAc,EACd,QAAQ,EACR,UAAU,EACV,YAAY,EACZ,SAAS,CACD,CAAC;AAEX,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC;AAEvD;;;;;;;;;GASG;AACH,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,CAwDvD,CAAC;AAEF,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,UAAU,EAAE,UAAU,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;IAC7C,EAAE,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACxB;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,UAAU,CAAC,EAAE,SAAS,GAAG,OAAO,GAAG,UAAU,GAAG,SAAS,CAAC;IAC1D,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IAC9B,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC3B;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE;QACJ,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;KAC5B,CAAC;IACF,OAAO,EAAE,YAAY,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,UAAU,EAAE,UAAU,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;IAC7C,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACrC;;;;OAIG;IACH,KAAK,CAAC,EAAE,OAAO,GAAG,KAAK,GAAG,SAAS,CAAC;IACpC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC9B;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,IAAI,EAAE;QACJ,KAAK,EAAE,MAAM,CAAC;QACd,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;QAC5B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;KAC5B,CAAC;CACH;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;IAC7C,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,kBAAkB,EAAE,CAAC;CAC/B;AAED,MAAM,WAAW,YAAY;IAC3B;;;;OAIG;IACH,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,kBAAkB;IACjC,cAAc,EAAE,MAAM,CAAC;IACvB;;;;OAIG;IACH,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/services/openalex/types.ts"],"names":[],"mappings":"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"}