nds-mcp 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +281 -81
- package/bin/nds-mcp.js +1 -1
- package/dist/constants.d.ts +17 -1
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +16 -0
- package/dist/constants.js.map +1 -1
- package/dist/db/chargeRadii.d.ts +19 -1
- package/dist/db/chargeRadii.d.ts.map +1 -1
- package/dist/db/chargeRadii.js +159 -2
- package/dist/db/chargeRadii.js.map +1 -1
- package/dist/db/codata.d.ts +13 -0
- package/dist/db/codata.d.ts.map +1 -0
- package/dist/db/codata.js +71 -0
- package/dist/db/codata.js.map +1 -0
- package/dist/db/dbPathCommon.d.ts +10 -0
- package/dist/db/dbPathCommon.d.ts.map +1 -0
- package/dist/db/dbPathCommon.js +48 -0
- package/dist/db/dbPathCommon.js.map +1 -0
- package/dist/db/ddep.d.ts +10 -0
- package/dist/db/ddep.d.ts.map +1 -0
- package/dist/db/ddep.js +73 -0
- package/dist/db/ddep.js.map +1 -0
- package/dist/db/ddepDb.d.ts +11 -0
- package/dist/db/ddepDb.d.ts.map +1 -0
- package/dist/db/ddepDb.js +71 -0
- package/dist/db/ddepDb.js.map +1 -0
- package/dist/db/download.d.ts +6 -0
- package/dist/db/download.d.ts.map +1 -0
- package/dist/db/download.js +114 -0
- package/dist/db/download.js.map +1 -0
- package/dist/db/ensureDb.d.ts +1 -2
- package/dist/db/ensureDb.d.ts.map +1 -1
- package/dist/db/ensureDb.js +12 -80
- package/dist/db/ensureDb.js.map +1 -1
- package/dist/db/exfor.d.ts +19 -0
- package/dist/db/exfor.d.ts.map +1 -0
- package/dist/db/exfor.js +164 -0
- package/dist/db/exfor.js.map +1 -0
- package/dist/db/exforDb.d.ts +11 -0
- package/dist/db/exforDb.d.ts.map +1 -0
- package/dist/db/exforDb.js +74 -0
- package/dist/db/exforDb.js.map +1 -0
- package/dist/db/fendlDb.d.ts +11 -0
- package/dist/db/fendlDb.d.ts.map +1 -0
- package/dist/db/fendlDb.js +71 -0
- package/dist/db/fendlDb.js.map +1 -0
- package/dist/db/irdffDb.d.ts +11 -0
- package/dist/db/irdffDb.d.ts.map +1 -0
- package/dist/db/irdffDb.js +71 -0
- package/dist/db/irdffDb.js.map +1 -0
- package/dist/db/jendl5CrossSection.d.ts +36 -0
- package/dist/db/jendl5CrossSection.d.ts.map +1 -0
- package/dist/db/jendl5CrossSection.js +351 -0
- package/dist/db/jendl5CrossSection.js.map +1 -0
- package/dist/db/jendl5Db.d.ts +11 -0
- package/dist/db/jendl5Db.d.ts.map +1 -0
- package/dist/db/jendl5Db.js +74 -0
- package/dist/db/jendl5Db.js.map +1 -0
- package/dist/db/jendl5Interpolation.d.ts +15 -0
- package/dist/db/jendl5Interpolation.d.ts.map +1 -0
- package/dist/db/jendl5Interpolation.js +84 -0
- package/dist/db/jendl5Interpolation.js.map +1 -0
- package/dist/db/jendl5RadiationSpec.d.ts +11 -0
- package/dist/db/jendl5RadiationSpec.d.ts.map +1 -0
- package/dist/db/jendl5RadiationSpec.js +96 -0
- package/dist/db/jendl5RadiationSpec.js.map +1 -0
- package/dist/db/ndsDb.d.ts +4 -0
- package/dist/db/ndsDb.d.ts.map +1 -1
- package/dist/db/ndsDb.js +11 -17
- package/dist/db/ndsDb.js.map +1 -1
- package/dist/db/sqliteFileValidation.d.ts +3 -0
- package/dist/db/sqliteFileValidation.d.ts.map +1 -0
- package/dist/db/sqliteFileValidation.js +23 -0
- package/dist/db/sqliteFileValidation.js.map +1 -0
- package/dist/db/universalQuery.d.ts +43 -0
- package/dist/db/universalQuery.d.ts.map +1 -0
- package/dist/db/universalQuery.js +126 -0
- package/dist/db/universalQuery.js.map +1 -0
- package/dist/index.js +117 -3
- package/dist/index.js.map +1 -1
- package/dist/ingest/buildCodataDb.d.ts +9 -0
- package/dist/ingest/buildCodataDb.d.ts.map +1 -0
- package/dist/ingest/buildCodataDb.js +147 -0
- package/dist/ingest/buildCodataDb.js.map +1 -0
- package/dist/ingest/buildDb.d.ts +3 -2
- package/dist/ingest/buildDb.d.ts.map +1 -1
- package/dist/ingest/buildDb.js +45 -6
- package/dist/ingest/buildDb.js.map +1 -1
- package/dist/ingest/buildDdepDb.d.ts +5 -0
- package/dist/ingest/buildDdepDb.d.ts.map +1 -0
- package/dist/ingest/buildDdepDb.js +183 -0
- package/dist/ingest/buildDdepDb.js.map +1 -0
- package/dist/ingest/buildExforDb.d.ts +4 -0
- package/dist/ingest/buildExforDb.d.ts.map +1 -0
- package/dist/ingest/buildExforDb.js +129 -0
- package/dist/ingest/buildExforDb.js.map +1 -0
- package/dist/ingest/buildFendlDb.d.ts +6 -0
- package/dist/ingest/buildFendlDb.d.ts.map +1 -0
- package/dist/ingest/buildFendlDb.js +239 -0
- package/dist/ingest/buildFendlDb.js.map +1 -0
- package/dist/ingest/buildIrdffDb.d.ts +6 -0
- package/dist/ingest/buildIrdffDb.d.ts.map +1 -0
- package/dist/ingest/buildIrdffDb.js +217 -0
- package/dist/ingest/buildIrdffDb.js.map +1 -0
- package/dist/ingest/buildJendl5Db.d.ts +8 -0
- package/dist/ingest/buildJendl5Db.d.ts.map +1 -0
- package/dist/ingest/buildJendl5Db.js +170 -0
- package/dist/ingest/buildJendl5Db.js.map +1 -0
- package/dist/ingest/cli.d.ts +2 -0
- package/dist/ingest/cli.d.ts.map +1 -0
- package/dist/ingest/cli.js +168 -0
- package/dist/ingest/cli.js.map +1 -0
- package/dist/ingest/jendl5DbCore.d.ts +10 -0
- package/dist/ingest/jendl5DbCore.d.ts.map +1 -0
- package/dist/ingest/jendl5DbCore.js +153 -0
- package/dist/ingest/jendl5DbCore.js.map +1 -0
- package/dist/ingest/metaContract.d.ts +12 -0
- package/dist/ingest/metaContract.d.ts.map +1 -0
- package/dist/ingest/metaContract.js +61 -0
- package/dist/ingest/metaContract.js.map +1 -0
- package/dist/ingest/parseJendl5Dec.d.ts +29 -0
- package/dist/ingest/parseJendl5Dec.d.ts.map +1 -0
- package/dist/ingest/parseJendl5Dec.js +54 -0
- package/dist/ingest/parseJendl5Dec.js.map +1 -0
- package/dist/ingest/parseJendl5Xs.d.ts +36 -0
- package/dist/ingest/parseJendl5Xs.d.ts.map +1 -0
- package/dist/ingest/parseJendl5Xs.js +429 -0
- package/dist/ingest/parseJendl5Xs.js.map +1 -0
- package/dist/selfUpdate.d.ts +32 -0
- package/dist/selfUpdate.d.ts.map +1 -0
- package/dist/selfUpdate.js +116 -0
- package/dist/selfUpdate.js.map +1 -0
- package/dist/shared/sqlite3Cli.d.ts +3 -1
- package/dist/shared/sqlite3Cli.d.ts.map +1 -1
- package/dist/shared/sqlite3Cli.js +101 -45
- package/dist/shared/sqlite3Cli.js.map +1 -1
- package/dist/tools/dispatcher.js +1 -1
- package/dist/tools/dispatcher.js.map +1 -1
- package/dist/tools/registry.d.ts +1 -0
- package/dist/tools/registry.d.ts.map +1 -1
- package/dist/tools/registry.js +904 -10
- package/dist/tools/registry.js.map +1 -1
- package/package.json +10 -4
package/dist/db/chargeRadii.js
CHANGED
|
@@ -9,6 +9,14 @@ function mapChargeRow(r) {
|
|
|
9
9
|
r_charge_preliminary_fm: r.r_charge_preliminary_fm,
|
|
10
10
|
r_charge_preliminary_unc_fm: r.r_charge_preliminary_unc_fm,
|
|
11
11
|
laser_spectroscopy: null,
|
|
12
|
+
observable_id: 'nuclear_rms_charge_radius',
|
|
13
|
+
mode: 'best',
|
|
14
|
+
recommended_source: null,
|
|
15
|
+
recommended_source_version: null,
|
|
16
|
+
recommended_r_charge_fm: null,
|
|
17
|
+
recommended_r_charge_unc_fm: null,
|
|
18
|
+
source_values: [],
|
|
19
|
+
max_source_diff_fm: null,
|
|
12
20
|
};
|
|
13
21
|
}
|
|
14
22
|
function mapLaserInfo(r) {
|
|
@@ -23,7 +31,132 @@ function mapLaserInfo(r) {
|
|
|
23
31
|
citations: r.citekeys ? r.citekeys.split(',') : [],
|
|
24
32
|
};
|
|
25
33
|
}
|
|
26
|
-
|
|
34
|
+
function parseCodataNumber(text) {
|
|
35
|
+
const trimmed = text.trim();
|
|
36
|
+
if (!trimmed || trimmed.includes('...'))
|
|
37
|
+
return null;
|
|
38
|
+
if (trimmed.toLowerCase() === '(exact)')
|
|
39
|
+
return 0;
|
|
40
|
+
const normalized = trimmed.replace(/\s+/g, '');
|
|
41
|
+
const parsed = Number(normalized);
|
|
42
|
+
return Number.isFinite(parsed) ? parsed : null;
|
|
43
|
+
}
|
|
44
|
+
function codataMeterToFm(valueMeters, unit) {
|
|
45
|
+
if (valueMeters === null)
|
|
46
|
+
return null;
|
|
47
|
+
const normalizedUnit = unit.trim().toLowerCase();
|
|
48
|
+
if (normalizedUnit === 'm')
|
|
49
|
+
return valueMeters * 1e15;
|
|
50
|
+
if (normalizedUnit === 'fm')
|
|
51
|
+
return valueMeters;
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
async function loadCodataChargeRadiusByIsotope(dbPath) {
|
|
55
|
+
const keyToIsotope = {
|
|
56
|
+
'proton rms charge radius': { Z: 1, A: 1 },
|
|
57
|
+
'deuteron rms charge radius': { Z: 1, A: 2 },
|
|
58
|
+
'alpha particle rms charge radius': { Z: 2, A: 4 },
|
|
59
|
+
};
|
|
60
|
+
const quantityKeys = Object.keys(keyToIsotope).map((k) => `'${k.replaceAll("'", "''")}'`).join(',');
|
|
61
|
+
let codataVersion = 'unknown';
|
|
62
|
+
const versionRows = await sqlite3JsonQuery(dbPath, "SELECT value FROM codata_meta WHERE key='upstream_version_or_snapshot' LIMIT 1");
|
|
63
|
+
if (versionRows.length > 0) {
|
|
64
|
+
const value = versionRows[0].value;
|
|
65
|
+
if (typeof value === 'string' && value.trim().length > 0)
|
|
66
|
+
codataVersion = value.trim();
|
|
67
|
+
}
|
|
68
|
+
const rows = await sqlite3JsonQuery(dbPath, `SELECT quantity_key, value_text, uncertainty_text, unit
|
|
69
|
+
FROM codata_constants
|
|
70
|
+
WHERE quantity_key IN (${quantityKeys})`);
|
|
71
|
+
const map = new Map();
|
|
72
|
+
for (const row of rows) {
|
|
73
|
+
const isotope = keyToIsotope[row.quantity_key];
|
|
74
|
+
if (!isotope)
|
|
75
|
+
continue;
|
|
76
|
+
const valueFm = codataMeterToFm(parseCodataNumber(row.value_text), row.unit);
|
|
77
|
+
const uncFm = codataMeterToFm(parseCodataNumber(row.uncertainty_text), row.unit);
|
|
78
|
+
map.set(`${isotope.Z}:${isotope.A}`, {
|
|
79
|
+
source_name: 'CODATA fundamental constants',
|
|
80
|
+
source_version: codataVersion,
|
|
81
|
+
as_of: codataVersion === 'unknown' ? 'unknown' : `${codataVersion}-01-01`,
|
|
82
|
+
method: 'CODATA least-squares adjustment',
|
|
83
|
+
value_fm: valueFm,
|
|
84
|
+
uncertainty_fm: uncFm,
|
|
85
|
+
unit: 'fm',
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
return map;
|
|
89
|
+
}
|
|
90
|
+
function sourcePriority(source) {
|
|
91
|
+
if (source.source_name.startsWith('CODATA'))
|
|
92
|
+
return 1;
|
|
93
|
+
if (source.source_name.startsWith('Li et al.'))
|
|
94
|
+
return 2;
|
|
95
|
+
if (source.source_name.startsWith('IAEA'))
|
|
96
|
+
return 3;
|
|
97
|
+
return 9;
|
|
98
|
+
}
|
|
99
|
+
function selectRecommendedSource(sources) {
|
|
100
|
+
if (sources.length === 0)
|
|
101
|
+
return null;
|
|
102
|
+
const sorted = [...sources].sort((a, b) => sourcePriority(a) - sourcePriority(b));
|
|
103
|
+
return sorted[0];
|
|
104
|
+
}
|
|
105
|
+
function computeMaxSourceDiffFm(sources) {
|
|
106
|
+
const values = sources
|
|
107
|
+
.map(source => source.value_fm)
|
|
108
|
+
.filter((value) => value !== null);
|
|
109
|
+
if (values.length < 2)
|
|
110
|
+
return null;
|
|
111
|
+
const min = Math.min(...values);
|
|
112
|
+
const max = Math.max(...values);
|
|
113
|
+
return Number((max - min).toPrecision(8));
|
|
114
|
+
}
|
|
115
|
+
function buildSourceValues(row, codataValue, mode) {
|
|
116
|
+
const all = [];
|
|
117
|
+
if (row.r_charge_fm !== null) {
|
|
118
|
+
all.push({
|
|
119
|
+
source_name: 'IAEA charge radii',
|
|
120
|
+
source_version: 'Angeli-Marinova-2013',
|
|
121
|
+
as_of: '2013-01-01',
|
|
122
|
+
method: 'IAEA evaluated compilation',
|
|
123
|
+
value_fm: row.r_charge_fm,
|
|
124
|
+
uncertainty_fm: row.r_charge_unc_fm,
|
|
125
|
+
unit: 'fm',
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
else if (row.r_charge_preliminary_fm !== null) {
|
|
129
|
+
all.push({
|
|
130
|
+
source_name: 'IAEA charge radii (preliminary)',
|
|
131
|
+
source_version: 'Angeli-Marinova-2013',
|
|
132
|
+
as_of: '2013-01-01',
|
|
133
|
+
method: 'IAEA preliminary compilation',
|
|
134
|
+
value_fm: row.r_charge_preliminary_fm,
|
|
135
|
+
uncertainty_fm: row.r_charge_preliminary_unc_fm,
|
|
136
|
+
unit: 'fm',
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
if (row.laser_spectroscopy) {
|
|
140
|
+
all.push({
|
|
141
|
+
source_name: 'Li et al. laser spectroscopy',
|
|
142
|
+
source_version: 'Li2021',
|
|
143
|
+
as_of: '2021-01-01',
|
|
144
|
+
method: 'Laser spectroscopy compilation',
|
|
145
|
+
value_fm: row.laser_spectroscopy.r_charge_fm,
|
|
146
|
+
uncertainty_fm: row.laser_spectroscopy.r_charge_unc_fm,
|
|
147
|
+
unit: 'fm',
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
if (codataValue) {
|
|
151
|
+
all.push(codataValue);
|
|
152
|
+
}
|
|
153
|
+
const sorted = all.sort((a, b) => sourcePriority(a) - sourcePriority(b));
|
|
154
|
+
const recommended = selectRecommendedSource(sorted);
|
|
155
|
+
const sources = mode === 'best' && recommended ? [recommended] : sorted;
|
|
156
|
+
const maxSourceDiffFm = mode === 'compare' ? computeMaxSourceDiffFm(sorted) : null;
|
|
157
|
+
return { sources, recommended, maxSourceDiffFm };
|
|
158
|
+
}
|
|
159
|
+
export async function getChargeRadius(dbPath, Z, A, mode = 'best') {
|
|
27
160
|
// Query 1: charge_radii (IAEA)
|
|
28
161
|
const chargeSql = A !== undefined
|
|
29
162
|
? `SELECT * FROM charge_radii WHERE Z=${Z} AND A=${A}`
|
|
@@ -67,9 +200,33 @@ export async function getChargeRadius(dbPath, Z, A) {
|
|
|
67
200
|
r_charge_preliminary_fm: null,
|
|
68
201
|
r_charge_preliminary_unc_fm: null,
|
|
69
202
|
laser_spectroscopy: mapLaserInfo(lr),
|
|
203
|
+
observable_id: 'nuclear_rms_charge_radius',
|
|
204
|
+
mode: 'best',
|
|
205
|
+
recommended_source: null,
|
|
206
|
+
recommended_source_version: null,
|
|
207
|
+
recommended_r_charge_fm: null,
|
|
208
|
+
recommended_r_charge_unc_fm: null,
|
|
209
|
+
source_values: [],
|
|
210
|
+
max_source_diff_fm: null,
|
|
70
211
|
});
|
|
71
212
|
}
|
|
213
|
+
const shouldLoadCodata = ((Z === 1 && (A === undefined || A === 1 || A === 2))
|
|
214
|
+
|| (Z === 2 && (A === undefined || A === 4)));
|
|
215
|
+
const codataByIsotope = shouldLoadCodata
|
|
216
|
+
? await loadCodataChargeRadiusByIsotope(dbPath)
|
|
217
|
+
: new Map();
|
|
72
218
|
// Sort by A
|
|
73
|
-
|
|
219
|
+
const rows = [...resultMap.values()].sort((a, b) => a.A - b.A);
|
|
220
|
+
for (const row of rows) {
|
|
221
|
+
row.mode = mode;
|
|
222
|
+
const { sources, recommended, maxSourceDiffFm } = buildSourceValues(row, codataByIsotope.get(`${row.Z}:${row.A}`), mode);
|
|
223
|
+
row.source_values = sources;
|
|
224
|
+
row.recommended_source = recommended?.source_name ?? null;
|
|
225
|
+
row.recommended_source_version = recommended?.source_version ?? null;
|
|
226
|
+
row.recommended_r_charge_fm = recommended?.value_fm ?? null;
|
|
227
|
+
row.recommended_r_charge_unc_fm = recommended?.uncertainty_fm ?? null;
|
|
228
|
+
row.max_source_diff_fm = maxSourceDiffFm;
|
|
229
|
+
}
|
|
230
|
+
return rows;
|
|
74
231
|
}
|
|
75
232
|
//# sourceMappingURL=chargeRadii.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chargeRadii.js","sourceRoot":"","sources":["../../src/db/chargeRadii.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"chargeRadii.js","sourceRoot":"","sources":["../../src/db/chargeRadii.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface GetCodataConstantParams {
|
|
2
|
+
name: string;
|
|
3
|
+
case_sensitive?: boolean;
|
|
4
|
+
}
|
|
5
|
+
export interface ListCodataConstantsParams {
|
|
6
|
+
query?: string;
|
|
7
|
+
limit: number;
|
|
8
|
+
offset: number;
|
|
9
|
+
exact_only?: boolean;
|
|
10
|
+
}
|
|
11
|
+
export declare function getCodataConstant(dbPath: string, params: GetCodataConstantParams): Promise<Record<string, unknown> | null>;
|
|
12
|
+
export declare function listCodataConstants(dbPath: string, params: ListCodataConstantsParams): Promise<Record<string, unknown>>;
|
|
13
|
+
//# sourceMappingURL=codata.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codata.d.ts","sourceRoot":"","sources":["../../src/db/codata.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,yBAAyB;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAkDD,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,uBAAuB,GAC9B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,CAczC;AAED,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,yBAAyB,GAChC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAmClC"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { invalidParams, sqlite3JsonQuery, sqlStringLiteral } from '../shared/index.js';
|
|
2
|
+
function normalizeQuantityKey(value) {
|
|
3
|
+
return value.trim().toLowerCase().replace(/\s+/g, ' ');
|
|
4
|
+
}
|
|
5
|
+
async function requireCodataSchema(dbPath) {
|
|
6
|
+
const rows = await sqlite3JsonQuery(dbPath, "SELECT value FROM codata_meta WHERE key='schema_version' LIMIT 1");
|
|
7
|
+
if (rows.length === 0) {
|
|
8
|
+
throw invalidParams('CODATA schema is not initialized. Run: nds-mcp ingest --codata', {
|
|
9
|
+
how_to: 'nds-mcp ingest --codata',
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
async function getCodataSource(dbPath) {
|
|
14
|
+
const rows = await sqlite3JsonQuery(dbPath, "SELECT value FROM codata_meta WHERE key='upstream_version_or_snapshot' LIMIT 1");
|
|
15
|
+
const version = rows.length === 0
|
|
16
|
+
? 'unknown'
|
|
17
|
+
: (rows[0].value || 'unknown');
|
|
18
|
+
return `CODATA ${version}`;
|
|
19
|
+
}
|
|
20
|
+
function formatCodataRow(row, source) {
|
|
21
|
+
return {
|
|
22
|
+
quantity: row.quantity,
|
|
23
|
+
value: row.value_text,
|
|
24
|
+
uncertainty: row.uncertainty_text,
|
|
25
|
+
unit: row.unit,
|
|
26
|
+
is_exact: row.is_exact === 1,
|
|
27
|
+
is_truncated: row.is_truncated === 1,
|
|
28
|
+
source,
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
export async function getCodataConstant(dbPath, params) {
|
|
32
|
+
await requireCodataSchema(dbPath);
|
|
33
|
+
const where = params.case_sensitive
|
|
34
|
+
? `quantity=${sqlStringLiteral(params.name.trim())}`
|
|
35
|
+
: `quantity_key=${sqlStringLiteral(normalizeQuantityKey(params.name))}`;
|
|
36
|
+
const rows = await sqlite3JsonQuery(dbPath, `SELECT quantity, value_text, uncertainty_text, unit, is_exact, is_truncated
|
|
37
|
+
FROM codata_constants
|
|
38
|
+
WHERE ${where}
|
|
39
|
+
LIMIT 1`);
|
|
40
|
+
if (rows.length === 0)
|
|
41
|
+
return null;
|
|
42
|
+
return formatCodataRow(rows[0], await getCodataSource(dbPath));
|
|
43
|
+
}
|
|
44
|
+
export async function listCodataConstants(dbPath, params) {
|
|
45
|
+
await requireCodataSchema(dbPath);
|
|
46
|
+
const conditions = [];
|
|
47
|
+
if (params.query && params.query.trim().length > 0) {
|
|
48
|
+
const normalized = normalizeQuantityKey(params.query);
|
|
49
|
+
conditions.push(`quantity_key LIKE ${sqlStringLiteral(`%${normalized}%`)}`);
|
|
50
|
+
}
|
|
51
|
+
if (params.exact_only) {
|
|
52
|
+
conditions.push('is_exact=1');
|
|
53
|
+
}
|
|
54
|
+
const where = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';
|
|
55
|
+
const countRows = await sqlite3JsonQuery(dbPath, `SELECT COUNT(*) AS total FROM codata_constants ${where}`);
|
|
56
|
+
const total = Number(countRows[0]?.total ?? 0);
|
|
57
|
+
const rows = await sqlite3JsonQuery(dbPath, `SELECT quantity, value_text, uncertainty_text, unit, is_exact, is_truncated
|
|
58
|
+
FROM codata_constants
|
|
59
|
+
${where}
|
|
60
|
+
ORDER BY quantity
|
|
61
|
+
LIMIT ${params.limit}
|
|
62
|
+
OFFSET ${params.offset}`);
|
|
63
|
+
const source = await getCodataSource(dbPath);
|
|
64
|
+
return {
|
|
65
|
+
total,
|
|
66
|
+
limit: params.limit,
|
|
67
|
+
offset: params.offset,
|
|
68
|
+
items: rows.map(row => formatCodataRow(row, source)),
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=codata.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codata.js","sourceRoot":"","sources":["../../src/db/codata.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface OptionalDbStatus {
|
|
2
|
+
status: 'ok' | 'not_configured';
|
|
3
|
+
path?: string;
|
|
4
|
+
size_mb?: number;
|
|
5
|
+
how_to: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function resolvePathFromEnv(envName: string): string | undefined;
|
|
8
|
+
export declare function resolveOptionalDbPath(envName: string, defaultPath: string): string | undefined;
|
|
9
|
+
export declare function describeOptionalDb(pathValue: string | undefined, howTo: string): OptionalDbStatus;
|
|
10
|
+
//# sourceMappingURL=dbPathCommon.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dbPathCommon.d.ts","sourceRoot":"","sources":["../../src/db/dbPathCommon.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,IAAI,GAAG,gBAAgB,CAAC;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAoBD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAItE;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAU9F;AAED,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,gBAAgB,CAWjG"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import * as fs from 'fs';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
import { invalidParams } from '../shared/index.js';
|
|
4
|
+
function validateFilePath(filePath, envName) {
|
|
5
|
+
if (!path.isAbsolute(filePath)) {
|
|
6
|
+
throw invalidParams(`${envName} must be an absolute path`, { env: envName, value: filePath });
|
|
7
|
+
}
|
|
8
|
+
const resolved = path.resolve(filePath);
|
|
9
|
+
if (!fs.existsSync(resolved)) {
|
|
10
|
+
throw invalidParams(`${envName} does not exist`, { env: envName, value: resolved });
|
|
11
|
+
}
|
|
12
|
+
const stat = fs.statSync(resolved);
|
|
13
|
+
if (!stat.isFile()) {
|
|
14
|
+
throw invalidParams(`${envName} must point to a file`, { env: envName, value: resolved });
|
|
15
|
+
}
|
|
16
|
+
return resolved;
|
|
17
|
+
}
|
|
18
|
+
export function resolvePathFromEnv(envName) {
|
|
19
|
+
const raw = process.env[envName];
|
|
20
|
+
if (!raw || raw.trim().length === 0)
|
|
21
|
+
return undefined;
|
|
22
|
+
return validateFilePath(raw.trim(), envName);
|
|
23
|
+
}
|
|
24
|
+
export function resolveOptionalDbPath(envName, defaultPath) {
|
|
25
|
+
const envPath = resolvePathFromEnv(envName);
|
|
26
|
+
if (envPath)
|
|
27
|
+
return envPath;
|
|
28
|
+
if (!fs.existsSync(defaultPath))
|
|
29
|
+
return undefined;
|
|
30
|
+
const stat = fs.statSync(defaultPath);
|
|
31
|
+
if (!stat.isFile()) {
|
|
32
|
+
throw invalidParams(`Default DB path is not a file: ${defaultPath}`, { path: defaultPath });
|
|
33
|
+
}
|
|
34
|
+
return path.resolve(defaultPath);
|
|
35
|
+
}
|
|
36
|
+
export function describeOptionalDb(pathValue, howTo) {
|
|
37
|
+
if (!pathValue) {
|
|
38
|
+
return { status: 'not_configured', how_to: howTo };
|
|
39
|
+
}
|
|
40
|
+
const stat = fs.statSync(pathValue);
|
|
41
|
+
return {
|
|
42
|
+
status: 'ok',
|
|
43
|
+
path: pathValue,
|
|
44
|
+
size_mb: Number((stat.size / (1024 * 1024)).toFixed(3)),
|
|
45
|
+
how_to: howTo,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=dbPathCommon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dbPathCommon.js","sourceRoot":"","sources":["../../src/db/dbPathCommon.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AASnD,SAAS,gBAAgB,CAAC,QAAgB,EAAE,OAAe;IACzD,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC/B,MAAM,aAAa,CAAC,GAAG,OAAO,2BAA2B,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;IAChG,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACxC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,MAAM,aAAa,CAAC,GAAG,OAAO,iBAAiB,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;IACtF,CAAC;IAED,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACnC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;QACnB,MAAM,aAAa,CAAC,GAAG,OAAO,uBAAuB,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC5F,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,OAAe;IAChD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACjC,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACtD,OAAO,gBAAgB,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,OAAO,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,OAAe,EAAE,WAAmB;IACxE,MAAM,OAAO,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAC5C,IAAI,OAAO;QAAE,OAAO,OAAO,CAAC;IAE5B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC;QAAE,OAAO,SAAS,CAAC;IAClD,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IACtC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;QACnB,MAAM,aAAa,CAAC,kCAAkC,WAAW,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;IAC9F,CAAC;IACD,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,SAA6B,EAAE,KAAa;IAC7E,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IACrD,CAAC;IACD,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IACpC,OAAO;QACL,MAAM,EAAE,IAAI;QACZ,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACvD,MAAM,EAAE,KAAK;KACd,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface DdepDecayQueryParams {
|
|
2
|
+
Z: number;
|
|
3
|
+
A: number;
|
|
4
|
+
state: number;
|
|
5
|
+
radiation_type: 'gamma' | 'xray' | 'beta-' | 'beta+' | 'alpha' | 'all';
|
|
6
|
+
min_intensity?: number;
|
|
7
|
+
limit: number;
|
|
8
|
+
}
|
|
9
|
+
export declare function queryDdepDecay(dbPath: string, params: DdepDecayQueryParams): Promise<Record<string, unknown> | null>;
|
|
10
|
+
//# sourceMappingURL=ddep.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ddep.d.ts","sourceRoot":"","sources":["../../src/db/ddep.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,oBAAoB;IACnC,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,KAAK,CAAC;IACvE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;CACf;AAkDD,wBAAsB,cAAc,CAClC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,oBAAoB,GAC3B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,CAiEzC"}
|
package/dist/db/ddep.js
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { invalidParams, sqlite3JsonQuery, sqlStringLiteral } from '../shared/index.js';
|
|
2
|
+
async function requireDdepSchema(dbPath) {
|
|
3
|
+
const rows = await sqlite3JsonQuery(dbPath, "SELECT value FROM ddep_meta WHERE key='ddep_schema_version' LIMIT 1");
|
|
4
|
+
if (rows.length === 0) {
|
|
5
|
+
throw invalidParams('DDEP schema is not initialized. Run: nds-mcp ingest --ddep', {
|
|
6
|
+
how_to: 'nds-mcp ingest --ddep',
|
|
7
|
+
});
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
async function getDdepSource(dbPath) {
|
|
11
|
+
const rows = await sqlite3JsonQuery(dbPath, "SELECT value FROM ddep_meta WHERE key='ddep_release' LIMIT 1");
|
|
12
|
+
if (rows.length === 0)
|
|
13
|
+
return 'DDEP';
|
|
14
|
+
const release = rows[0].value;
|
|
15
|
+
return `DDEP (${release})`;
|
|
16
|
+
}
|
|
17
|
+
export async function queryDdepDecay(dbPath, params) {
|
|
18
|
+
await requireDdepSchema(dbPath);
|
|
19
|
+
const nuclides = await sqlite3JsonQuery(dbPath, `SELECT id, Z, A, state, nuclide, half_life_value, half_life_uncertainty, half_life_unit, half_life_seconds,
|
|
20
|
+
decay_mode, source_label, evaluation_date, doi
|
|
21
|
+
FROM ddep_nuclides
|
|
22
|
+
WHERE Z=${params.Z} AND A=${params.A} AND state=${params.state}
|
|
23
|
+
ORDER BY evaluation_date DESC, id ASC`);
|
|
24
|
+
if (nuclides.length === 0)
|
|
25
|
+
return null;
|
|
26
|
+
const source = await getDdepSource(dbPath);
|
|
27
|
+
const nuclideRows = nuclides;
|
|
28
|
+
const nuclideIds = nuclideRows.map((row) => row.id);
|
|
29
|
+
const where = [`r.nuclide_id IN (${nuclideIds.join(',')})`];
|
|
30
|
+
if (params.radiation_type !== 'all') {
|
|
31
|
+
where.push(`r.radiation_type=${sqlStringLiteral(params.radiation_type)}`);
|
|
32
|
+
}
|
|
33
|
+
if (params.min_intensity !== undefined) {
|
|
34
|
+
where.push(`COALESCE(r.intensity, 0) >= ${params.min_intensity}`);
|
|
35
|
+
}
|
|
36
|
+
const radiation = await sqlite3JsonQuery(dbPath, `SELECT r.radiation_type, r.energy_keV, r.energy_unc_keV, r.intensity, r.intensity_unc, r.is_primary, n.source_label
|
|
37
|
+
FROM ddep_radiation r
|
|
38
|
+
JOIN ddep_nuclides n ON n.id = r.nuclide_id
|
|
39
|
+
WHERE ${where.join(' AND ')}
|
|
40
|
+
ORDER BY r.is_primary DESC, r.intensity DESC, r.energy_keV ASC
|
|
41
|
+
LIMIT ${params.limit}`);
|
|
42
|
+
const halfLifeValues = nuclideRows.map((row) => ({
|
|
43
|
+
source: row.source_label ?? source,
|
|
44
|
+
source_tag: 'DDEP',
|
|
45
|
+
value: row.half_life_value,
|
|
46
|
+
uncertainty: row.half_life_uncertainty,
|
|
47
|
+
unit: row.half_life_unit,
|
|
48
|
+
seconds: row.half_life_seconds,
|
|
49
|
+
decay_mode: row.decay_mode,
|
|
50
|
+
evaluation_date: row.evaluation_date,
|
|
51
|
+
doi: row.doi,
|
|
52
|
+
}));
|
|
53
|
+
return {
|
|
54
|
+
Z: nuclideRows[0].Z,
|
|
55
|
+
A: nuclideRows[0].A,
|
|
56
|
+
state: nuclideRows[0].state,
|
|
57
|
+
nuclide: nuclideRows[0].nuclide,
|
|
58
|
+
source,
|
|
59
|
+
half_life_values: halfLifeValues,
|
|
60
|
+
recommended_half_life: halfLifeValues[0] ?? null,
|
|
61
|
+
radiation: radiation.map((row) => ({
|
|
62
|
+
source: row.source_label ?? source,
|
|
63
|
+
source_tag: 'DDEP',
|
|
64
|
+
type: row.radiation_type,
|
|
65
|
+
energy_keV: row.energy_keV,
|
|
66
|
+
energy_unc_keV: row.energy_unc_keV,
|
|
67
|
+
intensity: row.intensity,
|
|
68
|
+
intensity_unc: row.intensity_unc,
|
|
69
|
+
is_primary: row.is_primary === 1,
|
|
70
|
+
})),
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=ddep.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ddep.js","sourceRoot":"","sources":["../../src/db/ddep.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type OptionalDbStatus } from './dbPathCommon.js';
|
|
2
|
+
export declare const NDS_DDEP_DB_PATH_ENV = "NDS_DDEP_DB_PATH";
|
|
3
|
+
export declare const NDS_DDEP_DB_DOWNLOAD_URL_ENV = "NDS_DDEP_DB_DOWNLOAD_URL";
|
|
4
|
+
export declare const DEFAULT_DDEP_DB_PATH: string;
|
|
5
|
+
export declare const DEFAULT_DDEP_DB_DOWNLOAD_URL = "https://github.com/fkguo/nds-mcp/releases/latest/download/ddep.sqlite.gz";
|
|
6
|
+
export declare function getDdepDbPathFromEnv(): string | undefined;
|
|
7
|
+
export declare function getDdepDbPath(): string | undefined;
|
|
8
|
+
export declare function requireDdepDbPath(): string;
|
|
9
|
+
export declare function getDdepDbStatus(): OptionalDbStatus;
|
|
10
|
+
export declare function ensureDdepDb(): Promise<string>;
|
|
11
|
+
//# sourceMappingURL=ddepDb.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ddepDb.d.ts","sourceRoot":"","sources":["../../src/db/ddepDb.ts"],"names":[],"mappings":"AAIA,OAAO,EAAiE,KAAK,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAIzH,eAAO,MAAM,oBAAoB,qBAAqB,CAAC;AACvD,eAAO,MAAM,4BAA4B,6BAA6B,CAAC;AACvE,eAAO,MAAM,oBAAoB,QAAqD,CAAC;AACvF,eAAO,MAAM,4BAA4B,6EACmC,CAAC;AAG7E,wBAAgB,oBAAoB,IAAI,MAAM,GAAG,SAAS,CAEzD;AAED,wBAAgB,aAAa,IAAI,MAAM,GAAG,SAAS,CAElD;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CAM1C;AAED,wBAAgB,eAAe,IAAI,gBAAgB,CAElD;AAED,wBAAsB,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC,CAyCpD"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import * as fs from 'fs';
|
|
2
|
+
import * as os from 'os';
|
|
3
|
+
import * as path from 'path';
|
|
4
|
+
import { invalidParams } from '../shared/index.js';
|
|
5
|
+
import { describeOptionalDb, resolveOptionalDbPath, resolvePathFromEnv } from './dbPathCommon.js';
|
|
6
|
+
import { downloadFile } from './download.js';
|
|
7
|
+
import { validateSqliteFile } from './sqliteFileValidation.js';
|
|
8
|
+
export const NDS_DDEP_DB_PATH_ENV = 'NDS_DDEP_DB_PATH';
|
|
9
|
+
export const NDS_DDEP_DB_DOWNLOAD_URL_ENV = 'NDS_DDEP_DB_DOWNLOAD_URL';
|
|
10
|
+
export const DEFAULT_DDEP_DB_PATH = path.join(os.homedir(), '.nds-mcp', 'ddep.sqlite');
|
|
11
|
+
export const DEFAULT_DDEP_DB_DOWNLOAD_URL = 'https://github.com/fkguo/nds-mcp/releases/latest/download/ddep.sqlite.gz';
|
|
12
|
+
const DDEP_HOW_TO = 'Auto-download on first use, or run: nds-mcp ingest --ddep';
|
|
13
|
+
export function getDdepDbPathFromEnv() {
|
|
14
|
+
return resolvePathFromEnv(NDS_DDEP_DB_PATH_ENV);
|
|
15
|
+
}
|
|
16
|
+
export function getDdepDbPath() {
|
|
17
|
+
return resolveOptionalDbPath(NDS_DDEP_DB_PATH_ENV, DEFAULT_DDEP_DB_PATH);
|
|
18
|
+
}
|
|
19
|
+
export function requireDdepDbPath() {
|
|
20
|
+
const dbPath = getDdepDbPath();
|
|
21
|
+
if (!dbPath) {
|
|
22
|
+
throw invalidParams('DDEP database not configured.', { how_to: DDEP_HOW_TO });
|
|
23
|
+
}
|
|
24
|
+
return dbPath;
|
|
25
|
+
}
|
|
26
|
+
export function getDdepDbStatus() {
|
|
27
|
+
return describeOptionalDb(getDdepDbPath(), DDEP_HOW_TO);
|
|
28
|
+
}
|
|
29
|
+
export async function ensureDdepDb() {
|
|
30
|
+
try {
|
|
31
|
+
const explicit = getDdepDbPathFromEnv();
|
|
32
|
+
if (explicit) {
|
|
33
|
+
await validateSqliteFile(explicit);
|
|
34
|
+
return explicit;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
if (process.env[NDS_DDEP_DB_PATH_ENV]) {
|
|
39
|
+
throw new Error(`${NDS_DDEP_DB_PATH_ENV} is set to "${process.env[NDS_DDEP_DB_PATH_ENV]}" but is invalid. ` +
|
|
40
|
+
`Unset it to use auto-download, or fix the path.`);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
if (fs.existsSync(DEFAULT_DDEP_DB_PATH)) {
|
|
44
|
+
try {
|
|
45
|
+
await validateSqliteFile(DEFAULT_DDEP_DB_PATH);
|
|
46
|
+
process.env[NDS_DDEP_DB_PATH_ENV] = DEFAULT_DDEP_DB_PATH;
|
|
47
|
+
return DEFAULT_DDEP_DB_PATH;
|
|
48
|
+
}
|
|
49
|
+
catch (err) {
|
|
50
|
+
console.error('[nds-mcp] Cached DDEP DB validation failed, re-downloading:', err instanceof Error ? err.message : String(err));
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
const url = process.env[NDS_DDEP_DB_DOWNLOAD_URL_ENV] || DEFAULT_DDEP_DB_DOWNLOAD_URL;
|
|
54
|
+
fs.mkdirSync(path.dirname(DEFAULT_DDEP_DB_PATH), { recursive: true });
|
|
55
|
+
const tmpPath = `${DEFAULT_DDEP_DB_PATH}.download.${process.pid}`;
|
|
56
|
+
try {
|
|
57
|
+
await downloadFile(url, tmpPath, 'DDEP DB', { timeoutMs: 30 * 60 * 1000 });
|
|
58
|
+
await validateSqliteFile(tmpPath);
|
|
59
|
+
fs.renameSync(tmpPath, DEFAULT_DDEP_DB_PATH);
|
|
60
|
+
process.env[NDS_DDEP_DB_PATH_ENV] = DEFAULT_DDEP_DB_PATH;
|
|
61
|
+
return DEFAULT_DDEP_DB_PATH;
|
|
62
|
+
}
|
|
63
|
+
catch (err) {
|
|
64
|
+
try {
|
|
65
|
+
fs.unlinkSync(tmpPath);
|
|
66
|
+
}
|
|
67
|
+
catch { /* ignore */ }
|
|
68
|
+
throw err;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=ddepDb.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ddepDb.js","sourceRoot":"","sources":["../../src/db/ddepDb.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/** Check if curl is available on the system. */
|
|
2
|
+
export declare function hasCurl(): boolean;
|
|
3
|
+
export declare function downloadFile(url: string, destPath: string, label: string, options?: {
|
|
4
|
+
timeoutMs?: number;
|
|
5
|
+
}): Promise<void>;
|
|
6
|
+
//# sourceMappingURL=download.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"download.d.ts","sourceRoot":"","sources":["../../src/db/download.ts"],"names":[],"mappings":"AAOA,gDAAgD;AAChD,wBAAgB,OAAO,IAAI,OAAO,CAOjC;AA+FD,wBAAsB,YAAY,CAChC,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAC/B,OAAO,CAAC,IAAI,CAAC,CASf"}
|