@zenalexa/unicli 0.221.0 → 0.221.1
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/AGENTS.md +12 -12
- package/README.md +13 -11
- package/README.zh-CN.md +13 -11
- package/dist/adapters/acl-anthology/papers.d.ts +16 -0
- package/dist/adapters/acl-anthology/papers.d.ts.map +1 -0
- package/dist/adapters/acl-anthology/papers.js +135 -0
- package/dist/adapters/acl-anthology/papers.js.map +1 -0
- package/dist/adapters/arxiv/papers.js +2 -0
- package/dist/adapters/arxiv/papers.js.map +1 -1
- package/dist/adapters/baidu-scholar/search.js +5 -0
- package/dist/adapters/baidu-scholar/search.js.map +1 -1
- package/dist/adapters/crossref/works.d.ts +42 -0
- package/dist/adapters/crossref/works.d.ts.map +1 -0
- package/dist/adapters/crossref/works.js +157 -0
- package/dist/adapters/crossref/works.js.map +1 -0
- package/dist/adapters/cvf/papers.d.ts +17 -0
- package/dist/adapters/cvf/papers.d.ts.map +1 -0
- package/dist/adapters/cvf/papers.js +124 -0
- package/dist/adapters/cvf/papers.js.map +1 -0
- package/dist/adapters/dblp/publications.js +4 -0
- package/dist/adapters/dblp/publications.js.map +1 -1
- package/dist/adapters/google-scholar/cite.js +1 -0
- package/dist/adapters/google-scholar/cite.js.map +1 -1
- package/dist/adapters/google-scholar/profile.js +5 -0
- package/dist/adapters/google-scholar/profile.js.map +1 -1
- package/dist/adapters/google-scholar/search.js +5 -0
- package/dist/adapters/google-scholar/search.js.map +1 -1
- package/dist/adapters/hf/paper.js +1 -0
- package/dist/adapters/hf/paper.js.map +1 -1
- package/dist/adapters/neurips/proceedings.d.ts +17 -0
- package/dist/adapters/neurips/proceedings.d.ts.map +1 -0
- package/dist/adapters/neurips/proceedings.js +112 -0
- package/dist/adapters/neurips/proceedings.js.map +1 -0
- package/dist/adapters/openalex/works.d.ts.map +1 -1
- package/dist/adapters/openalex/works.js +32 -0
- package/dist/adapters/openalex/works.js.map +1 -1
- package/dist/adapters/openreview/papers.js +5 -0
- package/dist/adapters/openreview/papers.js.map +1 -1
- package/dist/adapters/pmlr/proceedings.d.ts +35 -0
- package/dist/adapters/pmlr/proceedings.d.ts.map +1 -0
- package/dist/adapters/pmlr/proceedings.js +139 -0
- package/dist/adapters/pmlr/proceedings.js.map +1 -0
- package/dist/adapters/pubmed/articles.js +5 -0
- package/dist/adapters/pubmed/articles.js.map +1 -1
- package/dist/adapters/semantic-scholar/papers.d.ts +36 -0
- package/dist/adapters/semantic-scholar/papers.d.ts.map +1 -0
- package/dist/adapters/semantic-scholar/papers.js +214 -0
- package/dist/adapters/semantic-scholar/papers.js.map +1 -0
- package/dist/adapters/unpaywall/works.d.ts +33 -0
- package/dist/adapters/unpaywall/works.d.ts.map +1 -0
- package/dist/adapters/unpaywall/works.js +101 -0
- package/dist/adapters/unpaywall/works.js.map +1 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +15 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands/do.d.ts +30 -0
- package/dist/commands/do.d.ts.map +1 -0
- package/dist/commands/do.js +248 -0
- package/dist/commands/do.js.map +1 -0
- package/dist/commands/extract.d.ts +34 -0
- package/dist/commands/extract.d.ts.map +1 -0
- package/dist/commands/extract.js +316 -0
- package/dist/commands/extract.js.map +1 -0
- package/dist/commands/scholar.d.ts +33 -0
- package/dist/commands/scholar.d.ts.map +1 -0
- package/dist/commands/scholar.js +494 -0
- package/dist/commands/scholar.js.map +1 -0
- package/dist/commands/search.d.ts.map +1 -1
- package/dist/commands/search.js +2 -5
- package/dist/commands/search.js.map +1 -1
- package/dist/discovery/aliases.d.ts +2 -2
- package/dist/discovery/aliases.d.ts.map +1 -1
- package/dist/discovery/aliases.js +182 -11
- package/dist/discovery/aliases.js.map +1 -1
- package/dist/discovery/intents.d.ts +10 -0
- package/dist/discovery/intents.d.ts.map +1 -0
- package/dist/discovery/intents.js +255 -0
- package/dist/discovery/intents.js.map +1 -0
- package/dist/discovery/search.d.ts +4 -1
- package/dist/discovery/search.d.ts.map +1 -1
- package/dist/discovery/search.js +28 -140
- package/dist/discovery/search.js.map +1 -1
- package/dist/fast-path/handlers/discovery.d.ts.map +1 -1
- package/dist/fast-path/handlers/discovery.js +17 -3
- package/dist/fast-path/handlers/discovery.js.map +1 -1
- package/dist/manifest-compact.txt +13 -11
- package/dist/manifest-search.json +1 -1
- package/dist/manifest.json +462 -68
- package/dist/mcp/handler.d.ts.map +1 -1
- package/dist/mcp/handler.js +14 -2
- package/dist/mcp/handler.js.map +1 -1
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +11 -3
- package/dist/mcp/tools.js.map +1 -1
- package/dist/registry.d.ts +1 -0
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +5 -0
- package/dist/registry.js.map +1 -1
- package/dist/types/scholarly.d.ts +49 -0
- package/dist/types/scholarly.d.ts.map +1 -0
- package/dist/types/scholarly.js +16 -0
- package/dist/types/scholarly.js.map +1 -0
- package/package.json +1 -1
- package/server.json +2 -2
- package/skills/unicli/SKILL.md +1 -1
- package/skills/unicli-claude-code/SKILL.md +1 -1
- package/skills/unicli-hermes/SKILL.md +1 -1
- package/src/adapters/acl-anthology/papers.ts +157 -0
- package/src/adapters/arxiv/download.yaml +1 -1
- package/src/adapters/arxiv/paper.yaml +1 -1
- package/src/adapters/arxiv/papers.ts +2 -0
- package/src/adapters/arxiv/search.yaml +1 -1
- package/src/adapters/arxiv/trending.yaml +1 -1
- package/src/adapters/baidu-scholar/search.ts +5 -0
- package/src/adapters/crossref/works.ts +209 -0
- package/src/adapters/cvf/papers.ts +136 -0
- package/src/adapters/dblp/publications.ts +4 -0
- package/src/adapters/google-scholar/cite.ts +1 -0
- package/src/adapters/google-scholar/profile.ts +5 -0
- package/src/adapters/google-scholar/search.ts +5 -0
- package/src/adapters/hf/paper.test.ts +10 -0
- package/src/adapters/hf/paper.ts +1 -0
- package/src/adapters/hf/top.yaml +1 -1
- package/src/adapters/huggingface-papers/daily.yaml +1 -1
- package/src/adapters/huggingface-papers/search.yaml +1 -1
- package/src/adapters/neurips/proceedings.ts +126 -0
- package/src/adapters/openalex/works.ts +33 -0
- package/src/adapters/openreview/papers.ts +5 -0
- package/src/adapters/pmlr/proceedings.ts +167 -0
- package/src/adapters/pubmed/articles.ts +5 -0
- package/src/adapters/semantic-scholar/papers.ts +268 -0
- package/src/adapters/unpaywall/works.ts +138 -0
- package/src/adapters/zotero/search.yaml +1 -1
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @owner src::commands::scholar
|
|
3
|
+
* @does Top-level `unicli scholar` meta-command for academic source discovery: searches, retrieves, PDF availability, citation/reference traversal, and doctor output across adapters tagged with `scholar.*` capabilities.
|
|
4
|
+
* @needs src/registry.ts, src/types/scholarly.ts, src/engine/kernel/execute.ts, src/output/formatter.ts
|
|
5
|
+
* @feeds src/cli.ts, MCP/agent command discovery via list/search/do
|
|
6
|
+
* @breaks Missing capability tags make scholarly sources invisible to the meta-command; weak reference routing can send DOI/arXiv/PMID lookups to the wrong first source.
|
|
7
|
+
* @invariants --sources default is a conservative first-source set; --sources all is registry capability discovery; DOI is the primary dedupe key; no non-scholarly adapter is invoked as fallback.
|
|
8
|
+
* @side-effects Executes adapter commands through the engine kernel; writes stdout/stderr only.
|
|
9
|
+
* @perf Fan-out is sequential today, O(S * R), where S is source count and R is rows per source.
|
|
10
|
+
* @concurrency safe — Commander handlers run one at a time per process
|
|
11
|
+
* @test tests/unit/commands/scholar.test.ts
|
|
12
|
+
* @stability experimental
|
|
13
|
+
* @since 2026-05-19
|
|
14
|
+
*/
|
|
15
|
+
import type { Command } from "commander";
|
|
16
|
+
import type { AdapterCommand, AdapterManifest } from "../types.js";
|
|
17
|
+
import type { ScholarlyReferenceRoute, ScholarlyWorkRecord } from "../types/scholarly.js";
|
|
18
|
+
export declare const DEFAULT_SCHOLAR_SOURCES: readonly ["semantic-scholar", "openalex", "crossref", "arxiv", "dblp", "pubmed"];
|
|
19
|
+
export declare const SCHOLAR_CAPABILITIES: readonly ["scholar.search", "scholar.get", "scholar.pdf", "scholar.citations", "scholar.references", "scholar.venue", "scholar.author", "scholar.datasets", "scholar.code", "scholar.review"];
|
|
20
|
+
export type ScholarCapability = (typeof SCHOLAR_CAPABILITIES)[number];
|
|
21
|
+
export declare function listScholarAdapters(): AdapterManifest[];
|
|
22
|
+
export declare function resolveScholarSources(sourcesArg: string | undefined, fallback?: readonly string[]): string[];
|
|
23
|
+
export declare function findScholarCommandByCapability(adapter: AdapterManifest, capability: ScholarCapability): {
|
|
24
|
+
name: string;
|
|
25
|
+
command: AdapterCommand;
|
|
26
|
+
} | undefined;
|
|
27
|
+
export declare function resolveScholarReference(ref: string): ScholarlyReferenceRoute;
|
|
28
|
+
export declare function reciprocalRankFusion(rankedLists: ScholarlyWorkRecord[][], options?: {
|
|
29
|
+
k?: number;
|
|
30
|
+
topN?: number;
|
|
31
|
+
}): ScholarlyWorkRecord[];
|
|
32
|
+
export declare function registerScholarCommand(program: Command): void;
|
|
33
|
+
//# sourceMappingURL=scholar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scholar.d.ts","sourceRoot":"","sources":["../../src/commands/scholar.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWzC,OAAO,KAAK,EACV,cAAc,EACd,eAAe,EAEhB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EACV,uBAAuB,EACvB,mBAAmB,EACpB,MAAM,uBAAuB,CAAC;AAE/B,eAAO,MAAM,uBAAuB,kFAO1B,CAAC;AAEX,eAAO,MAAM,oBAAoB,+LAWvB,CAAC;AAEX,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,oBAAoB,CAAC,CAAC,MAAM,CAAC,CAAC;AAQtE,wBAAgB,mBAAmB,IAAI,eAAe,EAAE,CAIvD;AAED,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,QAAQ,GAAE,SAAS,MAAM,EAA4B,GACpD,MAAM,EAAE,CAQV;AAED,wBAAgB,8BAA8B,CAC5C,OAAO,EAAE,eAAe,EACxB,UAAU,EAAE,iBAAiB,GAC5B;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,cAAc,CAAA;CAAE,GAAG,SAAS,CAMvD;AAkBD,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,uBAAuB,CAuE5E;AASD,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,mBAAmB,EAAE,EAAE,EACpC,OAAO,GAAE;IAAE,CAAC,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAO,GAC1C,mBAAmB,EAAE,CA+BvB;AAmUD,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA+F7D"}
|
|
@@ -0,0 +1,494 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @owner src::commands::scholar
|
|
3
|
+
* @does Top-level `unicli scholar` meta-command for academic source discovery: searches, retrieves, PDF availability, citation/reference traversal, and doctor output across adapters tagged with `scholar.*` capabilities.
|
|
4
|
+
* @needs src/registry.ts, src/types/scholarly.ts, src/engine/kernel/execute.ts, src/output/formatter.ts
|
|
5
|
+
* @feeds src/cli.ts, MCP/agent command discovery via list/search/do
|
|
6
|
+
* @breaks Missing capability tags make scholarly sources invisible to the meta-command; weak reference routing can send DOI/arXiv/PMID lookups to the wrong first source.
|
|
7
|
+
* @invariants --sources default is a conservative first-source set; --sources all is registry capability discovery; DOI is the primary dedupe key; no non-scholarly adapter is invoked as fallback.
|
|
8
|
+
* @side-effects Executes adapter commands through the engine kernel; writes stdout/stderr only.
|
|
9
|
+
* @perf Fan-out is sequential today, O(S * R), where S is source count and R is rows per source.
|
|
10
|
+
* @concurrency safe — Commander handlers run one at a time per process
|
|
11
|
+
* @test tests/unit/commands/scholar.test.ts
|
|
12
|
+
* @stability experimental
|
|
13
|
+
* @since 2026-05-19
|
|
14
|
+
*/
|
|
15
|
+
import { commandStrategy, getAllAdapters, resolveCommand, } from "../registry.js";
|
|
16
|
+
import { buildInvocation, execute } from "../engine/kernel/execute.js";
|
|
17
|
+
import { makeCtx } from "../output/envelope.js";
|
|
18
|
+
import { detectFormat, format } from "../output/formatter.js";
|
|
19
|
+
import { ExitCode, Strategy } from "../types.js";
|
|
20
|
+
export const DEFAULT_SCHOLAR_SOURCES = [
|
|
21
|
+
"semantic-scholar",
|
|
22
|
+
"openalex",
|
|
23
|
+
"crossref",
|
|
24
|
+
"arxiv",
|
|
25
|
+
"dblp",
|
|
26
|
+
"pubmed",
|
|
27
|
+
];
|
|
28
|
+
export const SCHOLAR_CAPABILITIES = [
|
|
29
|
+
"scholar.search",
|
|
30
|
+
"scholar.get",
|
|
31
|
+
"scholar.pdf",
|
|
32
|
+
"scholar.citations",
|
|
33
|
+
"scholar.references",
|
|
34
|
+
"scholar.venue",
|
|
35
|
+
"scholar.author",
|
|
36
|
+
"scholar.datasets",
|
|
37
|
+
"scholar.code",
|
|
38
|
+
"scholar.review",
|
|
39
|
+
];
|
|
40
|
+
function hasAnyScholarCapability(adapter) {
|
|
41
|
+
return Object.values(adapter.commands).some((command) => (command.capabilities ?? []).some((cap) => cap.startsWith("scholar.")));
|
|
42
|
+
}
|
|
43
|
+
export function listScholarAdapters() {
|
|
44
|
+
return getAllAdapters()
|
|
45
|
+
.filter(hasAnyScholarCapability)
|
|
46
|
+
.sort((a, b) => a.name.localeCompare(b.name));
|
|
47
|
+
}
|
|
48
|
+
export function resolveScholarSources(sourcesArg, fallback = DEFAULT_SCHOLAR_SOURCES) {
|
|
49
|
+
if (!sourcesArg || sourcesArg.trim().length === 0)
|
|
50
|
+
return [...fallback];
|
|
51
|
+
if (sourcesArg.trim() === "all")
|
|
52
|
+
return listScholarAdapters().map((a) => a.name);
|
|
53
|
+
return sourcesArg
|
|
54
|
+
.split(",")
|
|
55
|
+
.map((source) => source.trim())
|
|
56
|
+
.filter(Boolean);
|
|
57
|
+
}
|
|
58
|
+
export function findScholarCommandByCapability(adapter, capability) {
|
|
59
|
+
for (const [name, command] of Object.entries(adapter.commands)) {
|
|
60
|
+
if ((command.capabilities ?? []).includes(capability))
|
|
61
|
+
return { name, command };
|
|
62
|
+
}
|
|
63
|
+
return undefined;
|
|
64
|
+
}
|
|
65
|
+
function bareDoi(value) {
|
|
66
|
+
return value
|
|
67
|
+
.trim()
|
|
68
|
+
.replace(/^doi:/i, "")
|
|
69
|
+
.replace(/^https?:\/\/(?:dx\.)?doi\.org\//i, "");
|
|
70
|
+
}
|
|
71
|
+
function bareArxiv(value) {
|
|
72
|
+
return value
|
|
73
|
+
.trim()
|
|
74
|
+
.replace(/^arxiv:/i, "")
|
|
75
|
+
.replace(/^https?:\/\/arxiv\.org\/(?:abs|pdf)\//i, "")
|
|
76
|
+
.replace(/\.pdf$/i, "")
|
|
77
|
+
.replace(/v\d+$/i, "");
|
|
78
|
+
}
|
|
79
|
+
export function resolveScholarReference(ref) {
|
|
80
|
+
const raw = ref.trim();
|
|
81
|
+
const doi = bareDoi(raw);
|
|
82
|
+
if (/^10\.\S+\/\S+/i.test(doi)) {
|
|
83
|
+
return {
|
|
84
|
+
kind: "doi",
|
|
85
|
+
value: doi,
|
|
86
|
+
preferredSources: ["openalex", "crossref", "semantic-scholar"],
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
if (/^(?:arxiv:|https?:\/\/arxiv\.org\/(?:abs|pdf)\/|\d{4}\.\d{4,5})/i.test(raw)) {
|
|
90
|
+
return {
|
|
91
|
+
kind: "arxiv",
|
|
92
|
+
value: bareArxiv(raw),
|
|
93
|
+
preferredSources: ["arxiv", "semantic-scholar", "openalex"],
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
const pmid = raw.match(/^pmid:\s*(\d+)$/i);
|
|
97
|
+
if (pmid) {
|
|
98
|
+
return {
|
|
99
|
+
kind: "pmid",
|
|
100
|
+
value: pmid[1],
|
|
101
|
+
preferredSources: ["pubmed", "semantic-scholar", "openalex"],
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
const openReview = raw.match(/^openreview:\s*([A-Za-z0-9_-]{6,20})$/i);
|
|
105
|
+
if (openReview) {
|
|
106
|
+
return {
|
|
107
|
+
kind: "openreview",
|
|
108
|
+
value: openReview[1],
|
|
109
|
+
preferredSources: ["openreview", "semantic-scholar", "openalex"],
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
const openAlex = raw.match(/^(?:https?:\/\/(?:api\.)?openalex\.org\/)?(?:works\/)?(W\d{4,})$/i);
|
|
113
|
+
if (openAlex) {
|
|
114
|
+
return {
|
|
115
|
+
kind: "openalex",
|
|
116
|
+
value: openAlex[1].toUpperCase(),
|
|
117
|
+
preferredSources: ["openalex", "semantic-scholar", "crossref"],
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
if (/^[a-f0-9]{40}$/i.test(raw)) {
|
|
121
|
+
return {
|
|
122
|
+
kind: "semantic-scholar",
|
|
123
|
+
value: raw,
|
|
124
|
+
preferredSources: ["semantic-scholar", "openalex", "crossref"],
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
if (/^[a-z]+(?:\/[A-Za-z0-9_.-]+)+$/.test(raw)) {
|
|
128
|
+
return {
|
|
129
|
+
kind: "dblp",
|
|
130
|
+
value: raw,
|
|
131
|
+
preferredSources: ["dblp", "semantic-scholar", "openalex"],
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
return {
|
|
135
|
+
kind: "unknown",
|
|
136
|
+
value: raw,
|
|
137
|
+
preferredSources: [...DEFAULT_SCHOLAR_SOURCES],
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
function dedupeKey(record) {
|
|
141
|
+
if (record.doi)
|
|
142
|
+
return `doi:${record.doi.toLowerCase()}`;
|
|
143
|
+
if (record.arxiv_id)
|
|
144
|
+
return `arxiv:${record.arxiv_id.toLowerCase()}`;
|
|
145
|
+
if (record.pmid)
|
|
146
|
+
return `pmid:${record.pmid}`;
|
|
147
|
+
return `${record.source_adapter}:${record.id}`;
|
|
148
|
+
}
|
|
149
|
+
export function reciprocalRankFusion(rankedLists, options = {}) {
|
|
150
|
+
const k = options.k ?? 60;
|
|
151
|
+
const buckets = new Map();
|
|
152
|
+
let order = 0;
|
|
153
|
+
for (const list of rankedLists) {
|
|
154
|
+
for (let rank = 0; rank < list.length; rank += 1) {
|
|
155
|
+
const record = list[rank];
|
|
156
|
+
const key = dedupeKey(record);
|
|
157
|
+
const increment = 1 / (k + rank + 1);
|
|
158
|
+
const existing = buckets.get(key);
|
|
159
|
+
if (existing) {
|
|
160
|
+
existing.score += increment;
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
buckets.set(key, { score: increment, record, firstSeen: order });
|
|
164
|
+
order += 1;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
const fused = [...buckets.values()].sort((a, b) => b.score - a.score || a.firstSeen - b.firstSeen);
|
|
169
|
+
return (options.topN ? fused.slice(0, options.topN) : fused).map((bucket) => bucket.record);
|
|
170
|
+
}
|
|
171
|
+
function numberOpt(raw, fallback, max) {
|
|
172
|
+
if (raw === undefined || raw === "")
|
|
173
|
+
return fallback;
|
|
174
|
+
const n = Number(raw);
|
|
175
|
+
if (!Number.isInteger(n) || n < 1 || n > max) {
|
|
176
|
+
throw new Error(`limit must be an integer in [1, ${max}].`);
|
|
177
|
+
}
|
|
178
|
+
return n;
|
|
179
|
+
}
|
|
180
|
+
function coerceStringArray(value) {
|
|
181
|
+
if (!Array.isArray(value))
|
|
182
|
+
return undefined;
|
|
183
|
+
const out = value.map((item) => String(item ?? "").trim()).filter(Boolean);
|
|
184
|
+
return out.length > 0 ? out : undefined;
|
|
185
|
+
}
|
|
186
|
+
function coerceNumber(value) {
|
|
187
|
+
if (typeof value === "number" && Number.isFinite(value))
|
|
188
|
+
return value;
|
|
189
|
+
if (typeof value === "string" && value.length > 0) {
|
|
190
|
+
const n = Number(value);
|
|
191
|
+
return Number.isFinite(n) ? n : undefined;
|
|
192
|
+
}
|
|
193
|
+
return undefined;
|
|
194
|
+
}
|
|
195
|
+
function coerceToScholarlyRecords(rows, source) {
|
|
196
|
+
if (!Array.isArray(rows))
|
|
197
|
+
return [];
|
|
198
|
+
const out = [];
|
|
199
|
+
for (const row of rows) {
|
|
200
|
+
if (!row || typeof row !== "object")
|
|
201
|
+
continue;
|
|
202
|
+
const record = row;
|
|
203
|
+
if (typeof record.id !== "string" || typeof record.title !== "string") {
|
|
204
|
+
continue;
|
|
205
|
+
}
|
|
206
|
+
const work = {
|
|
207
|
+
id: record.id,
|
|
208
|
+
title: record.title,
|
|
209
|
+
source_adapter: typeof record.source_adapter === "string"
|
|
210
|
+
? record.source_adapter
|
|
211
|
+
: source,
|
|
212
|
+
retrieved_at: typeof record.retrieved_at === "string" &&
|
|
213
|
+
record.retrieved_at.length > 0
|
|
214
|
+
? record.retrieved_at
|
|
215
|
+
: new Date().toISOString(),
|
|
216
|
+
};
|
|
217
|
+
const authors = coerceStringArray(record.authors);
|
|
218
|
+
if (authors)
|
|
219
|
+
work.authors = authors;
|
|
220
|
+
const year = coerceNumber(record.year);
|
|
221
|
+
if (year !== undefined)
|
|
222
|
+
work.year = year;
|
|
223
|
+
for (const field of [
|
|
224
|
+
"date",
|
|
225
|
+
"venue",
|
|
226
|
+
"type",
|
|
227
|
+
"abstract",
|
|
228
|
+
"doi",
|
|
229
|
+
"arxiv_id",
|
|
230
|
+
"pmid",
|
|
231
|
+
"openalex_id",
|
|
232
|
+
"semantic_scholar_id",
|
|
233
|
+
"dblp_key",
|
|
234
|
+
"openreview_id",
|
|
235
|
+
"oa_status",
|
|
236
|
+
"pdf_url",
|
|
237
|
+
"landing_url",
|
|
238
|
+
"code_url",
|
|
239
|
+
"dataset_url",
|
|
240
|
+
"source_url",
|
|
241
|
+
]) {
|
|
242
|
+
if (typeof record[field] === "string" && record[field].length > 0) {
|
|
243
|
+
work[field] = record[field];
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
for (const [sourceField, targetField] of [
|
|
247
|
+
["cited_by_count", "cited_by_count"],
|
|
248
|
+
["references_count", "references_count"],
|
|
249
|
+
]) {
|
|
250
|
+
const n = coerceNumber(record[sourceField]);
|
|
251
|
+
if (n !== undefined)
|
|
252
|
+
work[targetField] = n;
|
|
253
|
+
}
|
|
254
|
+
if (typeof record.is_open_access === "boolean") {
|
|
255
|
+
work.is_open_access = record.is_open_access;
|
|
256
|
+
}
|
|
257
|
+
if (record.raw !== undefined)
|
|
258
|
+
work.raw = record.raw;
|
|
259
|
+
out.push(work);
|
|
260
|
+
}
|
|
261
|
+
return out;
|
|
262
|
+
}
|
|
263
|
+
async function runAdapterCommand(source, capability, args) {
|
|
264
|
+
const adapter = getAllAdapters().find((candidate) => candidate.name === source);
|
|
265
|
+
if (!adapter) {
|
|
266
|
+
return {
|
|
267
|
+
source,
|
|
268
|
+
records: [],
|
|
269
|
+
error: {
|
|
270
|
+
code: "adapter_not_found",
|
|
271
|
+
message: `unknown source: ${source}`,
|
|
272
|
+
},
|
|
273
|
+
};
|
|
274
|
+
}
|
|
275
|
+
const found = findScholarCommandByCapability(adapter, capability);
|
|
276
|
+
if (!found) {
|
|
277
|
+
return {
|
|
278
|
+
source,
|
|
279
|
+
records: [],
|
|
280
|
+
error: {
|
|
281
|
+
code: "capability_unsupported",
|
|
282
|
+
message: `${source} does not expose ${capability}`,
|
|
283
|
+
},
|
|
284
|
+
};
|
|
285
|
+
}
|
|
286
|
+
const invocation = buildInvocation("cli", source, found.name, { args, source: "internal" }, { approved: true });
|
|
287
|
+
if (!invocation) {
|
|
288
|
+
return {
|
|
289
|
+
source,
|
|
290
|
+
records: [],
|
|
291
|
+
error: {
|
|
292
|
+
code: "build_invocation_failed",
|
|
293
|
+
message: `could not build invocation for ${source}.${found.name}`,
|
|
294
|
+
},
|
|
295
|
+
};
|
|
296
|
+
}
|
|
297
|
+
const result = await execute(invocation);
|
|
298
|
+
if (result.error) {
|
|
299
|
+
return {
|
|
300
|
+
source,
|
|
301
|
+
records: [],
|
|
302
|
+
error: {
|
|
303
|
+
code: result.error.code ?? "execution_error",
|
|
304
|
+
message: result.error.message ?? "adapter command failed",
|
|
305
|
+
},
|
|
306
|
+
};
|
|
307
|
+
}
|
|
308
|
+
return {
|
|
309
|
+
source,
|
|
310
|
+
records: coerceToScholarlyRecords(result.results, source),
|
|
311
|
+
};
|
|
312
|
+
}
|
|
313
|
+
function columns(detailed = false) {
|
|
314
|
+
return detailed
|
|
315
|
+
? [
|
|
316
|
+
"id",
|
|
317
|
+
"title",
|
|
318
|
+
"authors",
|
|
319
|
+
"year",
|
|
320
|
+
"venue",
|
|
321
|
+
"type",
|
|
322
|
+
"doi",
|
|
323
|
+
"arxiv_id",
|
|
324
|
+
"pmid",
|
|
325
|
+
"cited_by_count",
|
|
326
|
+
"references_count",
|
|
327
|
+
"is_open_access",
|
|
328
|
+
"oa_status",
|
|
329
|
+
"pdf_url",
|
|
330
|
+
"source_adapter",
|
|
331
|
+
"source_url",
|
|
332
|
+
]
|
|
333
|
+
: ["id", "title", "year", "venue", "doi", "pdf_url", "source_adapter"];
|
|
334
|
+
}
|
|
335
|
+
async function runSearch(program, query, opts) {
|
|
336
|
+
const startedAt = Date.now();
|
|
337
|
+
const fmt = detectFormat(program.opts().format);
|
|
338
|
+
const ctx = makeCtx("scholar.search", startedAt);
|
|
339
|
+
const limit = numberOpt(opts.limit, 20, 100);
|
|
340
|
+
const sources = resolveScholarSources(opts.sources);
|
|
341
|
+
const outcomes = [];
|
|
342
|
+
for (const source of sources) {
|
|
343
|
+
outcomes.push(await runAdapterCommand(source, "scholar.search", { query, limit }));
|
|
344
|
+
}
|
|
345
|
+
const fused = reciprocalRankFusion(outcomes.map((outcome) => outcome.records), { topN: limit });
|
|
346
|
+
ctx.duration_ms = Date.now() - startedAt;
|
|
347
|
+
ctx.surface = "web";
|
|
348
|
+
if (fused.length === 0) {
|
|
349
|
+
const errors = outcomes.filter((outcome) => outcome.error);
|
|
350
|
+
ctx.error = {
|
|
351
|
+
code: "SCHOLAR_NOT_FOUND",
|
|
352
|
+
message: `no scholarly works returned for "${query}" across [${sources.join(", ")}]`,
|
|
353
|
+
suggestion: errors.length > 0
|
|
354
|
+
? `Per-source errors: ${errors.map((outcome) => `${outcome.source}: ${outcome.error?.code}`).join("; ")}`
|
|
355
|
+
: "Try --sources all or a more specific query.",
|
|
356
|
+
retryable: errors.some((outcome) => outcome.error?.code === "rate_limit"),
|
|
357
|
+
};
|
|
358
|
+
console.error(format(null, undefined, fmt, ctx));
|
|
359
|
+
process.exit(ExitCode.EMPTY_RESULT);
|
|
360
|
+
}
|
|
361
|
+
console.log(format(fused, columns(opts.detailed), fmt, ctx));
|
|
362
|
+
}
|
|
363
|
+
async function runSingle(program, capability, ref, opts) {
|
|
364
|
+
const startedAt = Date.now();
|
|
365
|
+
const fmt = detectFormat(program.opts().format);
|
|
366
|
+
const ctx = makeCtx(capability, startedAt);
|
|
367
|
+
const route = resolveScholarReference(ref);
|
|
368
|
+
const sourceList = opts.source
|
|
369
|
+
? [opts.source]
|
|
370
|
+
: resolveScholarSources(opts.sources, route.preferredSources);
|
|
371
|
+
const outcomes = [];
|
|
372
|
+
for (const source of sourceList) {
|
|
373
|
+
outcomes.push(await runAdapterCommand(source, capability, {
|
|
374
|
+
ref: route.value,
|
|
375
|
+
id: route.value,
|
|
376
|
+
doi: route.kind === "doi" ? route.value : undefined,
|
|
377
|
+
arxiv_id: route.kind === "arxiv" ? route.value : undefined,
|
|
378
|
+
pmid: route.kind === "pmid" ? route.value : undefined,
|
|
379
|
+
}));
|
|
380
|
+
}
|
|
381
|
+
const fused = reciprocalRankFusion(outcomes.map((outcome) => outcome.records), { topN: capability === "scholar.pdf" ? 10 : 50 });
|
|
382
|
+
ctx.duration_ms = Date.now() - startedAt;
|
|
383
|
+
ctx.surface = "web";
|
|
384
|
+
if (fused.length === 0) {
|
|
385
|
+
const errors = outcomes.filter((outcome) => outcome.error);
|
|
386
|
+
ctx.error = {
|
|
387
|
+
code: "SCHOLAR_NOT_FOUND",
|
|
388
|
+
message: `no scholarly records returned for "${ref}" across [${sourceList.join(", ")}]`,
|
|
389
|
+
suggestion: errors.length > 0
|
|
390
|
+
? `Per-source errors: ${errors.map((outcome) => `${outcome.source}: ${outcome.error?.code}`).join("; ")}`
|
|
391
|
+
: "Run `unicli scholar doctor` to inspect available scholarly sources.",
|
|
392
|
+
retryable: errors.some((outcome) => outcome.error?.code === "rate_limit"),
|
|
393
|
+
};
|
|
394
|
+
console.error(format(null, undefined, fmt, ctx));
|
|
395
|
+
process.exit(ExitCode.EMPTY_RESULT);
|
|
396
|
+
}
|
|
397
|
+
console.log(format(fused, columns(opts.detailed), fmt, ctx));
|
|
398
|
+
}
|
|
399
|
+
async function runDoctor(program, opts) {
|
|
400
|
+
const startedAt = Date.now();
|
|
401
|
+
const fmt = detectFormat(program.opts().format);
|
|
402
|
+
const ctx = makeCtx("scholar.doctor", startedAt);
|
|
403
|
+
const selected = resolveScholarSources(opts.sources, listScholarAdapters().map((adapter) => adapter.name));
|
|
404
|
+
const rows = listScholarAdapters()
|
|
405
|
+
.filter((adapter) => selected.includes(adapter.name))
|
|
406
|
+
.map((adapter) => {
|
|
407
|
+
const caps = new Set();
|
|
408
|
+
for (const command of Object.values(adapter.commands)) {
|
|
409
|
+
for (const cap of command.capabilities ?? []) {
|
|
410
|
+
if (cap.startsWith("scholar."))
|
|
411
|
+
caps.add(cap);
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
const health = resolveCommand(adapter.name, "health");
|
|
415
|
+
const strategy = health
|
|
416
|
+
? commandStrategy(adapter, health.command)
|
|
417
|
+
: undefined;
|
|
418
|
+
return {
|
|
419
|
+
source: adapter.name,
|
|
420
|
+
capabilities: [...caps].sort(),
|
|
421
|
+
health: !health
|
|
422
|
+
? "skipped"
|
|
423
|
+
: strategy !== undefined && strategy !== Strategy.PUBLIC
|
|
424
|
+
? "blocked"
|
|
425
|
+
: "available",
|
|
426
|
+
detail: !health
|
|
427
|
+
? "no `health` command — adapter passes by capability introspection"
|
|
428
|
+
: strategy !== undefined && strategy !== Strategy.PUBLIC
|
|
429
|
+
? `health probe requires ${strategy} auth — skipped`
|
|
430
|
+
: "health probe command is public",
|
|
431
|
+
};
|
|
432
|
+
});
|
|
433
|
+
ctx.duration_ms = Date.now() - startedAt;
|
|
434
|
+
ctx.surface = "web";
|
|
435
|
+
console.log(format(rows, ["source", "capabilities", "health", "detail"], fmt, ctx));
|
|
436
|
+
}
|
|
437
|
+
export function registerScholarCommand(program) {
|
|
438
|
+
const scholar = program
|
|
439
|
+
.command("scholar")
|
|
440
|
+
.description("Scholarly meta-command — search, retrieve, PDF, citations, references, and source audit across first-source academic adapters");
|
|
441
|
+
scholar
|
|
442
|
+
.command("search <query>")
|
|
443
|
+
.description("Fan-out scholarly paper search across first-source adapters")
|
|
444
|
+
.option("--sources <csv>", "comma-separated source list, or `all`")
|
|
445
|
+
.option("--limit <n>", "maximum fused result count", "20")
|
|
446
|
+
.option("-D, --detailed", "include richer metadata columns")
|
|
447
|
+
.action(async (query, opts) => {
|
|
448
|
+
await runSearch(program, query, opts);
|
|
449
|
+
});
|
|
450
|
+
scholar
|
|
451
|
+
.command("get <ref>")
|
|
452
|
+
.description("Retrieve one paper/work by DOI, arXiv id, PMID, OpenAlex id, Semantic Scholar id, dblp key, or OpenReview forum")
|
|
453
|
+
.option("--source <site>", "force one source")
|
|
454
|
+
.option("--sources <csv>", "override auto-routed source list")
|
|
455
|
+
.option("-D, --detailed", "include richer metadata columns")
|
|
456
|
+
.action(async (ref, opts) => {
|
|
457
|
+
await runSingle(program, "scholar.get", ref, opts);
|
|
458
|
+
});
|
|
459
|
+
scholar
|
|
460
|
+
.command("pdf <ref>")
|
|
461
|
+
.description("Find open-access PDF candidates for a DOI, arXiv id, PMID, or source id")
|
|
462
|
+
.option("--source <site>", "force one source")
|
|
463
|
+
.option("--sources <csv>", "override auto-routed source list")
|
|
464
|
+
.option("-D, --detailed", "include richer metadata columns")
|
|
465
|
+
.action(async (ref, opts) => {
|
|
466
|
+
await runSingle(program, "scholar.pdf", ref, opts);
|
|
467
|
+
});
|
|
468
|
+
scholar
|
|
469
|
+
.command("citations <ref>")
|
|
470
|
+
.description("List works citing this paper when the source supports it")
|
|
471
|
+
.option("--source <site>", "force one source")
|
|
472
|
+
.option("--sources <csv>", "override auto-routed source list")
|
|
473
|
+
.option("-D, --detailed", "include richer metadata columns")
|
|
474
|
+
.action(async (ref, opts) => {
|
|
475
|
+
await runSingle(program, "scholar.citations", ref, opts);
|
|
476
|
+
});
|
|
477
|
+
scholar
|
|
478
|
+
.command("references <ref>")
|
|
479
|
+
.description("List works referenced by this paper when the source supports it")
|
|
480
|
+
.option("--source <site>", "force one source")
|
|
481
|
+
.option("--sources <csv>", "override auto-routed source list")
|
|
482
|
+
.option("-D, --detailed", "include richer metadata columns")
|
|
483
|
+
.action(async (ref, opts) => {
|
|
484
|
+
await runSingle(program, "scholar.references", ref, opts);
|
|
485
|
+
});
|
|
486
|
+
scholar
|
|
487
|
+
.command("doctor")
|
|
488
|
+
.description("Inspect registered scholarly adapters and capability tags")
|
|
489
|
+
.option("--sources <csv>", "limit to a comma-separated source list")
|
|
490
|
+
.action(async (opts) => {
|
|
491
|
+
await runDoctor(program, opts);
|
|
492
|
+
});
|
|
493
|
+
}
|
|
494
|
+
//# sourceMappingURL=scholar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scholar.js","sourceRoot":"","sources":["../../src/commands/scholar.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/commands/search.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/commands/search.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA2D5D"}
|
package/dist/commands/search.js
CHANGED
|
@@ -25,12 +25,9 @@ export function registerSearchCommand(program) {
|
|
|
25
25
|
process.exitCode = 2;
|
|
26
26
|
return;
|
|
27
27
|
}
|
|
28
|
-
const
|
|
29
|
-
? `${opts.category} ${query}`.trim()
|
|
30
|
-
: query;
|
|
31
|
-
const results = search(effectiveQuery, limit);
|
|
28
|
+
const results = search(query, limit, { category: opts.category });
|
|
32
29
|
if (results.length === 0) {
|
|
33
|
-
console.error(chalk.yellow(`No commands found for: ${
|
|
30
|
+
console.error(chalk.yellow(`No commands found for: ${[opts.category, query].filter(Boolean).join(" ")}`));
|
|
34
31
|
process.exitCode = 66; // EX_EMPTY
|
|
35
32
|
return;
|
|
36
33
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/commands/search.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAI9D,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,OAAO;SACJ,OAAO,CAAC,mBAAmB,CAAC;SAC5B,WAAW,CACV,oEAAoE,CACrE;SACA,MAAM,CAAC,iBAAiB,EAAE,aAAa,EAAE,GAAG,CAAC;SAC7C,MAAM,CAAC,kBAAkB,EAAE,oBAAoB,CAAC;SAChD,MAAM,CACL,CAAC,UAAoB,EAAE,IAA0C,EAAE,EAAE;QACnE,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACjC,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACnC,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;QAE5C,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC7B,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,GAAG,CACP,kEAAkE,CACnE,CACF,CAAC;YACF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QAED,MAAM,
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/commands/search.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAI9D,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,OAAO;SACJ,OAAO,CAAC,mBAAmB,CAAC;SAC5B,WAAW,CACV,oEAAoE,CACrE;SACA,MAAM,CAAC,iBAAiB,EAAE,aAAa,EAAE,GAAG,CAAC;SAC7C,MAAM,CAAC,kBAAkB,EAAE,oBAAoB,CAAC;SAChD,MAAM,CACL,CAAC,UAAoB,EAAE,IAA0C,EAAE,EAAE;QACnE,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACjC,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACnC,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;QAE5C,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC7B,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,GAAG,CACP,kEAAkE,CACnE,CACF,CAAC;YACF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QAElE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,MAAM,CACV,0BAA0B,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAC7E,CACF,CAAC;YACF,OAAO,CAAC,QAAQ,GAAG,EAAE,CAAC,CAAC,WAAW;YAClC,OAAO;QACT,CAAC;QAED,MAAM,GAAG,GAAG,YAAY,CACtB,OAAO,CAAC,IAAI,EAAE,CAAC,MAAkC,CAClD,CAAC;QAEF,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC/B,OAAO,EAAE,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,OAAO,EAAE;YACjC,WAAW,EAAE,CAAC,CAAC,WAAW,IAAI,GAAG,CAAC,CAAC,OAAO,QAAQ,CAAC,CAAC,IAAI,EAAE;YAC1D,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,QAAQ,EAAE,CAAC,CAAC,QAAQ;YACpB,KAAK,EAAE,CAAC,CAAC,KAAK;SACf,CAAC,CAAC,CAAC;QAEJ,MAAM,GAAG,GAAiB;YACxB,OAAO,EAAE,aAAa;YACtB,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,aAAa;YACvC,OAAO,EAAE,KAAK;SACf,CAAC;QAEF,OAAO,CAAC,GAAG,CACT,MAAM,CAAC,IAAI,EAAE,CAAC,SAAS,EAAE,aAAa,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,CACrE,CAAC;IACJ,CAAC,CACF,CAAC;AACN,CAAC"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @owner src/discovery/aliases.ts
|
|
3
|
-
* @does Define bilingual aliases, action synonyms, domain synonyms, and
|
|
3
|
+
* @does Define bilingual aliases, action synonyms, domain synonyms, site categories, and scholarly discovery vocabulary.
|
|
4
4
|
* @needs Supported site ids, discovery search scoring rules
|
|
5
|
-
* @feeds src/discovery/search.ts, generated manifest categories
|
|
5
|
+
* @feeds src/discovery/search.ts, src/registry.ts, generated manifest categories
|
|
6
6
|
* @breaks Missing aliases or categories degrade command discovery relevance.
|
|
7
7
|
*/
|
|
8
8
|
export declare const SITE_ALIASES: ReadonlyMap<string, string>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aliases.d.ts","sourceRoot":"","sources":["../../src/discovery/aliases.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,eAAO,MAAM,YAAY,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAiLnD,CAAC;AAKH,eAAO,MAAM,cAAc,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAuIhE,CAAC;AAKH,eAAO,MAAM,cAAc,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"aliases.d.ts","sourceRoot":"","sources":["../../src/discovery/aliases.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,eAAO,MAAM,YAAY,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAiLnD,CAAC;AAKH,eAAO,MAAM,cAAc,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAuIhE,CAAC;AAKH,eAAO,MAAM,cAAc,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CA8gBhE,CAAC;AAKH,eAAO,MAAM,eAAe,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAmStD,CAAC;AAKH,eAAO,MAAM,gBAAgB,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAiEvD,CAAC;AAIH;;;GAGG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAkBnD;AASD;;;GAGG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE/C;AAiCD;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAiErD"}
|