@cliwant/mcp-sam-gov 1.9.0 → 1.11.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.ja.md +5 -5
- package/README.ko.md +5 -5
- package/README.md +19 -7
- package/dist/arcgis-feature.d.ts +68 -0
- package/dist/arcgis-feature.d.ts.map +1 -0
- package/dist/arcgis-feature.js +206 -0
- package/dist/arcgis-feature.js.map +1 -0
- package/dist/arcgis-hub.d.ts +90 -0
- package/dist/arcgis-hub.d.ts.map +1 -0
- package/dist/arcgis-hub.js +210 -0
- package/dist/arcgis-hub.js.map +1 -0
- package/dist/bonfire.d.ts +69 -0
- package/dist/bonfire.d.ts.map +1 -0
- package/dist/bonfire.js +212 -0
- package/dist/bonfire.js.map +1 -0
- package/dist/cbp-border.d.ts +9 -5
- package/dist/cbp-border.d.ts.map +1 -1
- package/dist/cbp-border.js +31 -11
- package/dist/cbp-border.js.map +1 -1
- package/dist/gao.d.ts.map +1 -1
- package/dist/gao.js +25 -0
- package/dist/gao.js.map +1 -1
- package/dist/grants.js +1 -1
- package/dist/grants.js.map +1 -1
- package/dist/gsa-perdiem.d.ts +16 -2
- package/dist/gsa-perdiem.d.ts.map +1 -1
- package/dist/gsa-perdiem.js +25 -4
- package/dist/gsa-perdiem.js.map +1 -1
- package/dist/integrity.d.ts.map +1 -1
- package/dist/integrity.js +18 -3
- package/dist/integrity.js.map +1 -1
- package/dist/lda.d.ts.map +1 -1
- package/dist/lda.js +17 -4
- package/dist/lda.js.map +1 -1
- package/dist/nhtsa.d.ts +9 -5
- package/dist/nhtsa.d.ts.map +1 -1
- package/dist/nhtsa.js +90 -26
- package/dist/nhtsa.js.map +1 -1
- package/dist/nist-controls.d.ts +3 -1
- package/dist/nist-controls.d.ts.map +1 -1
- package/dist/nist-controls.js +34 -12
- package/dist/nist-controls.js.map +1 -1
- package/dist/ofac.d.ts.map +1 -1
- package/dist/ofac.js +10 -1
- package/dist/ofac.js.map +1 -1
- package/dist/opengov.d.ts +96 -0
- package/dist/opengov.d.ts.map +1 -0
- package/dist/opengov.js +244 -0
- package/dist/opengov.js.map +1 -0
- package/dist/pricing.d.ts +1 -1
- package/dist/sam-gov/client.d.ts.map +1 -1
- package/dist/sam-gov/client.js +13 -4
- package/dist/sam-gov/client.js.map +1 -1
- package/dist/server.d.ts +4 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +199 -8
- package/dist/server.js.map +1 -1
- package/dist/socrata.d.ts +27 -16
- package/dist/socrata.d.ts.map +1 -1
- package/dist/socrata.js +149 -18
- package/dist/socrata.js.map +1 -1
- package/package.json +11 -3
- package/src/arcgis-feature.ts +232 -0
- package/src/arcgis-hub.ts +270 -0
- package/src/bonfire.ts +249 -0
- package/src/cbp-border.ts +30 -9
- package/src/gao.ts +27 -0
- package/src/grants.ts +1 -1
- package/src/gsa-perdiem.ts +28 -4
- package/src/integrity.ts +18 -3
- package/src/lda.ts +21 -5
- package/src/nhtsa.ts +92 -27
- package/src/nist-controls.ts +58 -9
- package/src/ofac.ts +12 -1
- package/src/opengov.ts +309 -0
- package/src/sam-gov/client.ts +13 -4
- package/src/server.ts +213 -8
- package/src/socrata.ts +153 -18
package/dist/lda.js
CHANGED
|
@@ -169,10 +169,20 @@ export async function searchFilings(args) {
|
|
|
169
169
|
setFilter("lobbyist_name", args.lobbyistName, "lobbyistName");
|
|
170
170
|
setFilter("filing_year", args.filingYear, "filingYear");
|
|
171
171
|
setFilter("filing_type", args.filingType, "filingType");
|
|
172
|
-
setFilter("government_entity", args.agency, "agency");
|
|
173
172
|
setFilter("filing_specific_lobbying_issues", args.issue, "issue");
|
|
174
173
|
params.set("page", String(page));
|
|
175
174
|
params.set("page_size", String(pageSize));
|
|
175
|
+
// [filter honesty] `agency` maps to NO server-side filter on /filings/: the LDA
|
|
176
|
+
// API silently ignores `government_entity` (live-verified — adding it does NOT
|
|
177
|
+
// narrow `count`; government entities are nested per lobbying activity, not a
|
|
178
|
+
// top-level filter). So we NEVER send it (an ignored param buys nothing) and
|
|
179
|
+
// disclose it as DROPPED — reporting it as applied while returning the full
|
|
180
|
+
// corpus would be a silent-filter-drop lie (filtersApplied + totalAvailable
|
|
181
|
+
// overstated as if agency-scoped).
|
|
182
|
+
const filtersDropped = [];
|
|
183
|
+
if (args.agency !== undefined && args.agency !== "") {
|
|
184
|
+
filtersDropped.push("agency");
|
|
185
|
+
}
|
|
176
186
|
const url = `https://${LDA_HOST}${LDA_FILINGS_PATH}?${params.toString()}`;
|
|
177
187
|
// Belt-and-suspenders: the fixed host + strictly-built query leave nothing to
|
|
178
188
|
// steer the authority; assert the built URL cannot have been moved off-host.
|
|
@@ -213,8 +223,8 @@ export async function searchFilings(args) {
|
|
|
213
223
|
kind: "invalid_input",
|
|
214
224
|
retryable: false,
|
|
215
225
|
message: apiMsg
|
|
216
|
-
? `LDA rejected the request (HTTP 400): ${apiMsg}. Check the filter parameters (filingYear, filingType,
|
|
217
|
-
: "LDA rejected the request (HTTP 400) — check the filter parameters (filingYear, filingType,
|
|
226
|
+
? `LDA rejected the request (HTTP 400): ${apiMsg}. Check the filter parameters (filingYear, filingType, issue, …).`
|
|
227
|
+
: "LDA rejected the request (HTTP 400) — check the filter parameters (filingYear, filingType, issue, …).",
|
|
218
228
|
upstreamStatus: 400,
|
|
219
229
|
upstreamEndpoint: LDA_FILINGS_LABEL,
|
|
220
230
|
});
|
|
@@ -243,13 +253,16 @@ export async function searchFilings(args) {
|
|
|
243
253
|
if (hasMore) {
|
|
244
254
|
notes.push(`This is page ${page} (pageSize ${pageSize}) of ~${Math.ceil(totalAvailable / pageSize)} — pass page=${page + 1} for the next page.`);
|
|
245
255
|
}
|
|
256
|
+
if (filtersDropped.includes("agency")) {
|
|
257
|
+
notes.push("The `agency` filter was NOT applied: the keyless LDA /filings/ endpoint has no server-side government-entity filter (the API silently ignores it and returns the full corpus), so it is reported in filtersDropped rather than falsely narrowed — totalAvailable and filtersApplied reflect ONLY the filters actually applied. Government entities are nested per lobbying activity: each returned filing's lobbyingActivities[].governmentEntities lists them. To find lobbying that targeted a specific agency, narrow by registrantName/clientName/issue and inspect those nested governmentEntities.");
|
|
258
|
+
}
|
|
246
259
|
return withMeta({ filings }, {
|
|
247
260
|
source: `${LDA_HOST} /api/v1/filings (US Senate LDA lobbying; keyless)`,
|
|
248
261
|
keylessMode: true, // ★KEYLESS — the optional key only raises the rate limit
|
|
249
262
|
returned,
|
|
250
263
|
totalAvailable,
|
|
251
264
|
filtersApplied,
|
|
252
|
-
filtersDropped
|
|
265
|
+
filtersDropped,
|
|
253
266
|
fieldsUnavailable: [],
|
|
254
267
|
pagination: { offset, limit: pageSize, hasMore, nextOffset },
|
|
255
268
|
notes,
|
package/dist/lda.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lda.js","sourceRoot":"","sources":["../src/lda.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"lda.js","sourceRoot":"","sources":["../src/lda.ts"],"names":[],"mappings":"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"}
|
package/dist/nhtsa.d.ts
CHANGED
|
@@ -19,16 +19,20 @@
|
|
|
19
19
|
* entirely — never surfaced, logged, or stored. The B2G value is the
|
|
20
20
|
* manufacturer / component / safety signal, NOT the VIN.
|
|
21
21
|
*
|
|
22
|
-
* ★ THE HONESTY PILLARS (P1
|
|
22
|
+
* ★ THE HONESTY PILLARS (P1/P3/P4 live-verified 2026-07-15; P2 corrected +
|
|
23
|
+
* re-verified 2026-07-20):
|
|
23
24
|
* P1: totalAvailable = `Count` (recalls) / `count` (complaints) — the REAL total.
|
|
24
25
|
* NHTSA returns the COMPLETE filtered set (no pagination), so in the normal
|
|
25
26
|
* case Count === results.length ⇒ complete:true. totalAvailable is NEVER
|
|
26
27
|
* fabricated: a PRESENT numeric Count is trusted verbatim; a MISSING Count
|
|
27
28
|
* falls back to results.length WITH an honest note (never invented).
|
|
28
|
-
* P2:
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
29
|
+
* P2: ★NHTSA returns HTTP 400 (NOT 200) + {Count/count:0, results:[]} (Message
|
|
30
|
+
* "Results returned successfully") for a VALID make/model/year that simply
|
|
31
|
+
* has ZERO records (live-verified 2026-07-20). getNhtsa reads the body and
|
|
32
|
+
* reclassifies THAT idiom as an HONEST EMPTY (returned:0, totalAvailable:0,
|
|
33
|
+
* complete:true) with a note; any OTHER 400 ⇒ invalid_input, a 404 ⇒
|
|
34
|
+
* not_found, a 5xx/timeout ⇒ THROW (never a fake empty), a 200 non-JSON
|
|
35
|
+
* body ⇒ schema_drift.
|
|
32
36
|
* P3: booleans (crash/fire/parkIt/parkOutSide/overTheAirUpdate) preserved AS
|
|
33
37
|
* booleans (a non-boolean ⇒ null, never a fabricated false); counts
|
|
34
38
|
* (numberOfInjuries/numberOfDeaths) via `num` (a genuine 0 stays 0, NEVER
|
package/dist/nhtsa.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nhtsa.d.ts","sourceRoot":"","sources":["../src/nhtsa.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"nhtsa.d.ts","sourceRoot":"","sources":["../src/nhtsa.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AAKH,OAAO,EAAY,KAAK,UAAU,EAAqB,MAAM,WAAW,CAAC;AAGzE,eAAO,MAAM,UAAU,kBAAkB,CAAC;AAY1C,eAAO,MAAM,mBAAmB,QAAY,CAAC;AAC7C,eAAO,MAAM,mBAAmB,QAAqB,CAAC;AActD,MAAM,MAAM,gBAAgB,GAAG;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AA8KF,MAAM,MAAM,WAAW,GAAG;IACxB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,MAAM,EAAE,OAAO,GAAG,IAAI,CAAC;IACvB,WAAW,EAAE,OAAO,GAAG,IAAI,CAAC;IAC5B,gBAAgB,EAAE,OAAO,GAAG,IAAI,CAAC;CAClC,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;IACtB,IAAI,EAAE,OAAO,GAAG,IAAI,CAAC;IACrB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;CACnC,CAAC;AA4CF;;;;;GAKG;AACH,wBAAsB,OAAO,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,UAAU,CAAC,CAmCzE;AAGD;;;;;GAKG;AACH,wBAAsB,UAAU,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,UAAU,CAAC,CAuC5E"}
|
package/dist/nhtsa.js
CHANGED
|
@@ -19,16 +19,20 @@
|
|
|
19
19
|
* entirely — never surfaced, logged, or stored. The B2G value is the
|
|
20
20
|
* manufacturer / component / safety signal, NOT the VIN.
|
|
21
21
|
*
|
|
22
|
-
* ★ THE HONESTY PILLARS (P1
|
|
22
|
+
* ★ THE HONESTY PILLARS (P1/P3/P4 live-verified 2026-07-15; P2 corrected +
|
|
23
|
+
* re-verified 2026-07-20):
|
|
23
24
|
* P1: totalAvailable = `Count` (recalls) / `count` (complaints) — the REAL total.
|
|
24
25
|
* NHTSA returns the COMPLETE filtered set (no pagination), so in the normal
|
|
25
26
|
* case Count === results.length ⇒ complete:true. totalAvailable is NEVER
|
|
26
27
|
* fabricated: a PRESENT numeric Count is trusted verbatim; a MISSING Count
|
|
27
28
|
* falls back to results.length WITH an honest note (never invented).
|
|
28
|
-
* P2:
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
29
|
+
* P2: ★NHTSA returns HTTP 400 (NOT 200) + {Count/count:0, results:[]} (Message
|
|
30
|
+
* "Results returned successfully") for a VALID make/model/year that simply
|
|
31
|
+
* has ZERO records (live-verified 2026-07-20). getNhtsa reads the body and
|
|
32
|
+
* reclassifies THAT idiom as an HONEST EMPTY (returned:0, totalAvailable:0,
|
|
33
|
+
* complete:true) with a note; any OTHER 400 ⇒ invalid_input, a 404 ⇒
|
|
34
|
+
* not_found, a 5xx/timeout ⇒ THROW (never a fake empty), a 200 non-JSON
|
|
35
|
+
* body ⇒ schema_drift.
|
|
32
36
|
* P3: booleans (crash/fire/parkIt/parkOutSide/overTheAirUpdate) preserved AS
|
|
33
37
|
* booleans (a non-boolean ⇒ null, never a fabricated false); counts
|
|
34
38
|
* (numberOfInjuries/numberOfDeaths) via `num` (a genuine 0 stays 0, NEVER
|
|
@@ -41,8 +45,8 @@
|
|
|
41
45
|
* ^\d{4}$; make/model are charclass-validated (letters/digits/space/hyphen,
|
|
42
46
|
* so a `../` or `%` can never reach the fixed path).
|
|
43
47
|
*/
|
|
44
|
-
import { ToolErrorCarrier } from "./errors.js";
|
|
45
|
-
import {
|
|
48
|
+
import { ToolErrorCarrier, errorFromResponse } from "./errors.js";
|
|
49
|
+
import { driftError, isRedirectError } from "./datasource.js";
|
|
46
50
|
import { num, str } from "./coerce.js";
|
|
47
51
|
import { withMeta } from "./meta.js";
|
|
48
52
|
// ─── Fixed endpoint (SSRF core — compile-time CONSTANTS) ──────────
|
|
@@ -92,10 +96,31 @@ function validateVehicleArgs(args, label) {
|
|
|
92
96
|
}
|
|
93
97
|
// ─── SSRF-guarded fetch (fixed host + hostname assertion + redirect) ──
|
|
94
98
|
/**
|
|
95
|
-
*
|
|
96
|
-
* `
|
|
97
|
-
*
|
|
98
|
-
* `
|
|
99
|
+
* ★ NHTSA's "400-for-empty" idiom. A VALID make/model/year that simply has ZERO
|
|
100
|
+
* records returns HTTP 400 with a body `{Count/count:0, ..., results:[]}` and
|
|
101
|
+
* `Message/message:"Results returned successfully"` (live-verified 2026-07-20:
|
|
102
|
+
* `make=tesla&model=model 3&modelYear=2015` → HTTP 400, Count 0). Recalls use
|
|
103
|
+
* `Count`/`Message`, complaints use lowercase `count`/`message` — accept either.
|
|
104
|
+
* This is a genuine no-match, NOT a bad request; the caller reclassifies it to an
|
|
105
|
+
* honest empty. (A 400 that is NOT this idiom stays a real invalid_input.)
|
|
106
|
+
*/
|
|
107
|
+
function isNhtsaEmptyIdiom(body) {
|
|
108
|
+
if (body === null || typeof body !== "object")
|
|
109
|
+
return false;
|
|
110
|
+
const b = body;
|
|
111
|
+
const rawCount = b.Count ?? b.count;
|
|
112
|
+
return num(rawCount) === 0 && Array.isArray(b.results) && b.results.length === 0;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* GET one NHTSA JSON resource on the FIXED host. Bespoke `fetch` (NOT the shared
|
|
116
|
+
* getJson) because we must READ a non-2xx body: NHTSA returns HTTP 400 for a valid
|
|
117
|
+
* query with zero records (the ★400-for-empty idiom above), and getJson would
|
|
118
|
+
* throw invalid_input and DISCARD the body — turning "zero recalls" (a valid,
|
|
119
|
+
* high-value answer) into a phantom "Bad request". Asserts the constructed URL's
|
|
120
|
+
* hostname === the fixed host over https (belt-and-suspenders) + `redirect:"error"`
|
|
121
|
+
* (fail closed on any off-host 3xx). Keyless — no header/token. Non-2xx that is NOT
|
|
122
|
+
* the empty idiom keeps the standard taxonomy (400→invalid_input, 404→not_found,
|
|
123
|
+
* 429→rate_limited, 5xx→upstream_unavailable); a 200 non-JSON body ⇒ schema_drift.
|
|
99
124
|
*/
|
|
100
125
|
async function getNhtsa(path, label, params) {
|
|
101
126
|
const url = `https://${NHTSA_HOST}${path}?${params.toString()}`;
|
|
@@ -108,7 +133,55 @@ async function getNhtsa(path, label, params) {
|
|
|
108
133
|
upstreamEndpoint: label,
|
|
109
134
|
});
|
|
110
135
|
}
|
|
111
|
-
|
|
136
|
+
let res;
|
|
137
|
+
try {
|
|
138
|
+
res = await fetch(built.toString(), {
|
|
139
|
+
redirect: "error",
|
|
140
|
+
signal: AbortSignal.timeout(15_000),
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
catch (e) {
|
|
144
|
+
if (isRedirectError(e)) {
|
|
145
|
+
throw driftError(label, `NHTSA returned an off-host redirect (redirect:"error") while fetching ${label} — refusing to follow it (SSRF safety).`);
|
|
146
|
+
}
|
|
147
|
+
if (e instanceof Error && (e.name === "TimeoutError" || e.name === "AbortError")) {
|
|
148
|
+
throw new ToolErrorCarrier({
|
|
149
|
+
kind: "upstream_unavailable",
|
|
150
|
+
retryable: false,
|
|
151
|
+
message: `Request to ${label} timed out.`,
|
|
152
|
+
upstreamEndpoint: label,
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
throw new ToolErrorCarrier({
|
|
156
|
+
kind: "upstream_unavailable",
|
|
157
|
+
retryable: true,
|
|
158
|
+
retryAfterSeconds: 30,
|
|
159
|
+
message: `Network error reaching ${label}: ${e instanceof Error ? e.message : String(e)}`,
|
|
160
|
+
upstreamEndpoint: label,
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
if (!res.ok) {
|
|
164
|
+
// ★P2 CRUX: read the body — a 400 that is NHTSA's empty idiom is an HONEST
|
|
165
|
+
// no-match (returned via resolveTotal as Count 0 → total 0), NOT an error.
|
|
166
|
+
let body = null;
|
|
167
|
+
try {
|
|
168
|
+
body = await res.json();
|
|
169
|
+
}
|
|
170
|
+
catch {
|
|
171
|
+
body = null;
|
|
172
|
+
}
|
|
173
|
+
if (res.status === 400 && isNhtsaEmptyIdiom(body))
|
|
174
|
+
return body;
|
|
175
|
+
// Any other non-2xx keeps the standard taxonomy (never a fabricated empty).
|
|
176
|
+
// errorFromResponse returns a plain ToolError → wrap it in the carrier to throw.
|
|
177
|
+
throw new ToolErrorCarrier(errorFromResponse(res, label));
|
|
178
|
+
}
|
|
179
|
+
try {
|
|
180
|
+
return await res.json();
|
|
181
|
+
}
|
|
182
|
+
catch {
|
|
183
|
+
throw driftError(label, `NHTSA ${label} returned a non-JSON body at HTTP 200 — schema drift (never read as an empty result).`);
|
|
184
|
+
}
|
|
112
185
|
}
|
|
113
186
|
/** Build the shared make/model/modelYear query (module-built; no raw passthrough). */
|
|
114
187
|
function vehicleParams(args) {
|
|
@@ -119,22 +192,13 @@ function vehicleParams(args) {
|
|
|
119
192
|
return params;
|
|
120
193
|
}
|
|
121
194
|
/**
|
|
122
|
-
*
|
|
123
|
-
*
|
|
124
|
-
*
|
|
125
|
-
* error
|
|
195
|
+
* Build the vehicle query and fetch through getNhtsa, which fully classifies the
|
|
196
|
+
* response: the ★400-for-empty idiom → an honest empty; every other non-2xx → the
|
|
197
|
+
* standard taxonomy; a 200 non-JSON body → schema_drift. A thin wrapper — getNhtsa
|
|
198
|
+
* owns the error contract.
|
|
126
199
|
*/
|
|
127
200
|
async function fetchNhtsa(path, label, args) {
|
|
128
|
-
|
|
129
|
-
return await getNhtsa(path, label, vehicleParams(args));
|
|
130
|
-
}
|
|
131
|
-
catch (e) {
|
|
132
|
-
if (e instanceof ToolErrorCarrier)
|
|
133
|
-
throw e;
|
|
134
|
-
if (e instanceof SyntaxError)
|
|
135
|
-
throw driftError(label, `NHTSA ${label} returned a non-JSON body at HTTP 200 — schema drift (never read as an empty result).`);
|
|
136
|
-
throw e;
|
|
137
|
-
}
|
|
201
|
+
return await getNhtsa(path, label, vehicleParams(args));
|
|
138
202
|
}
|
|
139
203
|
/**
|
|
140
204
|
* Resolve the total from a Count/count field (P1/P4). A PRESENT numeric value is
|
package/dist/nhtsa.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nhtsa.js","sourceRoot":"","sources":["../src/nhtsa.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"nhtsa.js","sourceRoot":"","sources":["../src/nhtsa.ts"],"names":[],"mappings":"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"}
|
package/dist/nist-controls.d.ts
CHANGED
|
@@ -25,8 +25,10 @@ export type NistControl = {
|
|
|
25
25
|
id: string;
|
|
26
26
|
family: string;
|
|
27
27
|
title: string;
|
|
28
|
-
|
|
28
|
+
status: string | null;
|
|
29
|
+
statement: string | null;
|
|
29
30
|
guidance: string | null;
|
|
31
|
+
incorporatedInto: string[];
|
|
30
32
|
enhancements: {
|
|
31
33
|
id: string;
|
|
32
34
|
title: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nist-controls.d.ts","sourceRoot":"","sources":["../src/nist-controls.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAIH,OAAO,EAAY,KAAK,UAAU,EAAqB,MAAM,WAAW,CAAC;AAEzE,eAAO,MAAM,UAAU,8BAA8B,CAAC;AAkBtD,MAAM,MAAM,WAAW,GAAG;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"nist-controls.d.ts","sourceRoot":"","sources":["../src/nist-controls.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAIH,OAAO,EAAY,KAAK,UAAU,EAAqB,MAAM,WAAW,CAAC;AAEzE,eAAO,MAAM,UAAU,8BAA8B,CAAC;AAkBtD,MAAM,MAAM,WAAW,GAAG;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,YAAY,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAC/C,CAAC;AAyIF;;;;;GAKG;AACH,wBAAsB,cAAc,CAAC,IAAI,EAAE;IACzC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,OAAO,CAAC,UAAU,CAAC,CAiEtB"}
|
package/dist/nist-controls.js
CHANGED
|
@@ -69,24 +69,31 @@ function partProse(control, name) {
|
|
|
69
69
|
return text.length > 0 ? text : null;
|
|
70
70
|
}
|
|
71
71
|
function mapControl(control, family) {
|
|
72
|
+
const status = (control.props ?? []).find((p) => p.name === "status")?.value?.trim() || null;
|
|
73
|
+
// A withdrawn control carries `links[] rel="incorporated-into"` → the control(s)
|
|
74
|
+
// it was folded into (e.g. AC-13 → AC-2, AU-6). Surface them so a withdrawn
|
|
75
|
+
// control is never mistaken for an active requirement.
|
|
76
|
+
const incorporatedInto = (control.links ?? [])
|
|
77
|
+
.filter((l) => l.rel === "incorporated-into" && typeof l.href === "string")
|
|
78
|
+
.map((l) => displayId(String(l.href).replace(/^#/, "")))
|
|
79
|
+
.filter((x) => x.length > 0);
|
|
72
80
|
return {
|
|
73
81
|
id: displayId(control.id ?? ""),
|
|
74
82
|
family,
|
|
75
83
|
title: (control.title ?? "").trim(),
|
|
76
|
-
|
|
84
|
+
status,
|
|
85
|
+
// [P3] absent statement ⇒ null, NEVER "" — a withdrawn control has no
|
|
86
|
+
// requirement text; "" would misread as "an active control with a blank
|
|
87
|
+
// requirement".
|
|
88
|
+
statement: partProse(control, "statement"),
|
|
77
89
|
guidance: partProse(control, "guidance"),
|
|
90
|
+
incorporatedInto,
|
|
78
91
|
enhancements: (control.controls ?? []).map((e) => ({
|
|
79
92
|
id: displayId(e.id ?? ""),
|
|
80
93
|
title: (e.title ?? "").trim(),
|
|
81
94
|
})),
|
|
82
95
|
};
|
|
83
96
|
}
|
|
84
|
-
/**
|
|
85
|
-
* Fetch + parse the OSCAL catalog into a flat list of TOP-LEVEL controls, memoized
|
|
86
|
-
* 6h. Header/shape guarded: `catalog.groups` MUST be an array with ≥ FAMILY_FLOOR
|
|
87
|
-
* families (else driftError — a truncated catalog is NEVER a fake empty). Enhancements
|
|
88
|
-
* are carried on each control (not indexed as top-level entries).
|
|
89
|
-
*/
|
|
90
97
|
async function loadControls() {
|
|
91
98
|
return memoize("nist:sp800-53r5", async () => {
|
|
92
99
|
const built = new URL(OSCAL_URL);
|
|
@@ -102,13 +109,21 @@ async function loadControls() {
|
|
|
102
109
|
if (!Array.isArray(groups) || groups.length < FAMILY_FLOOR) {
|
|
103
110
|
throw driftError(OSCAL_LABEL, `OSCAL catalog.groups missing or implausibly small (${Array.isArray(groups) ? groups.length : "not-an-array"} < ${FAMILY_FLOOR} families) — treating as schema drift / truncation, never a fake-empty catalog.`);
|
|
104
111
|
}
|
|
112
|
+
// [P5 freshness] The OSCAL catalog is a moving static file on the `main`
|
|
113
|
+
// branch — surface its exact version + last-modified so a compliance caller
|
|
114
|
+
// knows WHICH point-release (5.1.1 / 5.2.0 …) they are reading.
|
|
115
|
+
const md = body.catalog?.metadata ?? {};
|
|
116
|
+
const metadata = {
|
|
117
|
+
version: typeof md.version === "string" ? md.version : null,
|
|
118
|
+
lastModified: typeof md["last-modified"] === "string" ? md["last-modified"] : null,
|
|
119
|
+
};
|
|
105
120
|
const controls = [];
|
|
106
121
|
for (const g of groups) {
|
|
107
122
|
const family = `${(g.id ?? "").toUpperCase()} — ${(g.title ?? "").trim()}`;
|
|
108
123
|
for (const c of g.controls ?? [])
|
|
109
124
|
controls.push(mapControl(c, family));
|
|
110
125
|
}
|
|
111
|
-
return controls;
|
|
126
|
+
return { controls, metadata };
|
|
112
127
|
}, OSCAL_CACHE_TTL_MS);
|
|
113
128
|
}
|
|
114
129
|
// ─── Tool: nist_800_53_controls ───────────────────────────────────
|
|
@@ -121,7 +136,7 @@ async function loadControls() {
|
|
|
121
136
|
export async function searchControls(args) {
|
|
122
137
|
const limit = args.limit ?? 25;
|
|
123
138
|
const offset = args.offset ?? 0;
|
|
124
|
-
const all = await loadControls();
|
|
139
|
+
const { controls: all, metadata } = await loadControls();
|
|
125
140
|
const filtersApplied = [];
|
|
126
141
|
const idQ = args.controlId !== undefined ? displayId(args.controlId) : undefined;
|
|
127
142
|
const famQ = args.family?.trim().toLowerCase();
|
|
@@ -147,7 +162,7 @@ export async function searchControls(args) {
|
|
|
147
162
|
// Search the title + requirement statement AND each enhancement's title, so a
|
|
148
163
|
// term that lives only in an enhancement (e.g. "multi-factor" → IA-2(1)) still
|
|
149
164
|
// surfaces the parent control. filtersApplied still lists 'keyword'.
|
|
150
|
-
const hay = `${c.title}\n${c.statement}\n${c.enhancements.map((e) => e.title).join("\n")}`.toLowerCase();
|
|
165
|
+
const hay = `${c.title}\n${c.statement ?? ""}\n${c.enhancements.map((e) => e.title).join("\n")}`.toLowerCase();
|
|
151
166
|
if (!hay.includes(kwQ))
|
|
152
167
|
return false;
|
|
153
168
|
}
|
|
@@ -158,8 +173,15 @@ export async function searchControls(args) {
|
|
|
158
173
|
const returned = page.length;
|
|
159
174
|
const hasMore = offset + returned < totalAvailable;
|
|
160
175
|
const nextOffset = hasMore ? offset + returned : null;
|
|
176
|
+
const versionLabel = metadata.version ? `Rev ${metadata.version}` : "Rev 5";
|
|
177
|
+
const notes = [PROVENANCE_NOTE, CLIENT_FILTER_NOTE, REFERENCE_NOTE];
|
|
178
|
+
notes.push(`OSCAL catalog ${metadata.version ? `version ${metadata.version}` : "revision 5"}${metadata.lastModified ? `, last-modified ${metadata.lastModified.slice(0, 10)}` : ""} — fetched live from the usnistgov/oscal-content \`main\` branch (a MOVING target; control text can change between point releases, e.g. 5.1.1 → 5.2.0). Cite the version above, not just "Rev 5".`);
|
|
179
|
+
const withdrawnOnPage = page.filter((c) => c.status === "withdrawn").length;
|
|
180
|
+
if (withdrawnOnPage > 0) {
|
|
181
|
+
notes.push(`${withdrawnOnPage} of the returned control(s) are WITHDRAWN (status:"withdrawn") — a withdrawn control has NO requirement text (statement:null) and is NOT an active requirement; see its incorporatedInto for the control(s) that superseded it.`);
|
|
182
|
+
}
|
|
161
183
|
return withMeta({ controls: page }, {
|
|
162
|
-
source:
|
|
184
|
+
source: `NIST SP 800-53 ${versionLabel} (OSCAL catalog, keyless)`,
|
|
163
185
|
keylessMode: true,
|
|
164
186
|
returned,
|
|
165
187
|
totalAvailable,
|
|
@@ -168,7 +190,7 @@ export async function searchControls(args) {
|
|
|
168
190
|
filtersDropped: [],
|
|
169
191
|
fieldsUnavailable: [],
|
|
170
192
|
pagination: { offset, limit, hasMore, nextOffset },
|
|
171
|
-
notes
|
|
193
|
+
notes,
|
|
172
194
|
});
|
|
173
195
|
}
|
|
174
196
|
//# sourceMappingURL=nist-controls.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nist-controls.js","sourceRoot":"","sources":["../src/nist-controls.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAsC,MAAM,WAAW,CAAC;AAEzE,MAAM,CAAC,MAAM,UAAU,GAAG,2BAA2B,CAAC;AACtD,MAAM,SAAS,GACb,6HAA6H,CAAC;AAChI,MAAM,WAAW,GAAG,uBAAuB,CAAC;AAC5C,MAAM,gBAAgB,GAAG,MAAM,CAAC;AAChC,MAAM,kBAAkB,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAC9C,gFAAgF;AAChF,kFAAkF;AAClF,MAAM,YAAY,GAAG,EAAE,CAAC;AAExB,MAAM,eAAe,GACnB,kNAAkN,CAAC;AACrN,MAAM,kBAAkB,GACtB,mPAAmP,CAAC;AACtP,MAAM,cAAc,GAClB,yOAAyO,CAAC;
|
|
1
|
+
{"version":3,"file":"nist-controls.js","sourceRoot":"","sources":["../src/nist-controls.ts"],"names":[],"mappings":"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"}
|
package/dist/ofac.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ofac.d.ts","sourceRoot":"","sources":["../src/ofac.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AAKH,OAAO,EAAY,KAAK,UAAU,EAAE,MAAM,WAAW,CAAC;AAItD,0EAA0E;AAC1E,eAAO,MAAM,SAAS;;;;;CAKZ,CAAC;AAEX,MAAM,MAAM,WAAW,GAAG,MAAM,OAAO,SAAS,CAAC;AAwBjD;;;;;;;GAOG;AACH,eAAO,MAAM,YAAY,kEACwC,CAAC;AAElE,iFAAiF;AACjF,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAWlD;AAED,yEAAyE;AACzE,eAAO,MAAM,MAAM,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAK9C,CAAC;AA2BF;;;GAGG;AACH,eAAO,MAAM,2BAA2B,8eACgc,CAAC;AAcze;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAU7D;AAED,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;AAQvD;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAC3B,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,GAChB,YAAY,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"ofac.d.ts","sourceRoot":"","sources":["../src/ofac.ts"],"names":[],"mappings":"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"}
|
package/dist/ofac.js
CHANGED
|
@@ -176,7 +176,16 @@ export function classifyMatch(queryNorm, entryNorm) {
|
|
|
176
176
|
const allEinQ = et.length > 0 && et.every((t) => qSet.has(t));
|
|
177
177
|
if (allQinE || allEinQ)
|
|
178
178
|
return "strong";
|
|
179
|
-
|
|
179
|
+
// Substring containment is "strong" ONLY when the CONTAINED (shorter) string is
|
|
180
|
+
// a substantial fragment. Without a floor, a tiny sub-word substring graded
|
|
181
|
+
// "strong" ("TS" ⊂ "WIDGETS", "IBB" ⊂ "QUIBBLEFARB", "D" ⊂ "WIDGETS") —
|
|
182
|
+
// overstating confidence and flooding nearly every input with false "strong"
|
|
183
|
+
// matches (alert fatigue). Whole-token containment is already handled above by
|
|
184
|
+
// allQinE/allEinQ; this mid-word tier is for the space-stripped joined form and
|
|
185
|
+
// must clear the same ≥3 bar the token "weak" tier uses — here a slightly higher
|
|
186
|
+
// floor since a contiguous substring is a weaker signal than a shared whole token.
|
|
187
|
+
if (Math.min(queryNorm.length, entryNorm.length) >= 5 &&
|
|
188
|
+
(entryNorm.includes(queryNorm) || queryNorm.includes(entryNorm))) {
|
|
180
189
|
return "strong";
|
|
181
190
|
}
|
|
182
191
|
for (const t of qt) {
|