@cliwant/mcp-sam-gov 0.2.1 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (228) hide show
  1. package/LICENSE +21 -21
  2. package/README.ja.md +48 -16
  3. package/README.ko.md +48 -16
  4. package/README.md +279 -67
  5. package/dist/attachments.d.ts +63 -0
  6. package/dist/attachments.d.ts.map +1 -0
  7. package/dist/attachments.js +576 -0
  8. package/dist/attachments.js.map +1 -0
  9. package/dist/bls.d.ts +267 -0
  10. package/dist/bls.d.ts.map +1 -0
  11. package/dist/bls.js +1549 -0
  12. package/dist/bls.js.map +1 -0
  13. package/dist/cache.d.ts +42 -0
  14. package/dist/cache.d.ts.map +1 -0
  15. package/dist/cache.js +64 -0
  16. package/dist/cache.js.map +1 -0
  17. package/dist/census.d.ts +182 -0
  18. package/dist/census.d.ts.map +1 -0
  19. package/dist/census.js +576 -0
  20. package/dist/census.js.map +1 -0
  21. package/dist/ckan.d.ts +141 -0
  22. package/dist/ckan.d.ts.map +1 -0
  23. package/dist/ckan.js +393 -0
  24. package/dist/ckan.js.map +1 -0
  25. package/dist/clinicaltrials.d.ts +180 -0
  26. package/dist/clinicaltrials.d.ts.map +1 -0
  27. package/dist/clinicaltrials.js +730 -0
  28. package/dist/clinicaltrials.js.map +1 -0
  29. package/dist/cms.d.ts +140 -0
  30. package/dist/cms.d.ts.map +1 -0
  31. package/dist/cms.js +482 -0
  32. package/dist/cms.js.map +1 -0
  33. package/dist/coerce.d.ts +32 -0
  34. package/dist/coerce.d.ts.map +1 -0
  35. package/dist/coerce.js +50 -0
  36. package/dist/coerce.js.map +1 -0
  37. package/dist/datagov-catalog.d.ts +84 -0
  38. package/dist/datagov-catalog.d.ts.map +1 -0
  39. package/dist/datagov-catalog.js +233 -0
  40. package/dist/datagov-catalog.js.map +1 -0
  41. package/dist/datagov.d.ts +146 -0
  42. package/dist/datagov.d.ts.map +1 -0
  43. package/dist/datagov.js +689 -0
  44. package/dist/datagov.js.map +1 -0
  45. package/dist/datagovKey.d.ts +36 -0
  46. package/dist/datagovKey.d.ts.map +1 -0
  47. package/dist/datagovKey.js +60 -0
  48. package/dist/datagovKey.js.map +1 -0
  49. package/dist/datasource.d.ts +313 -0
  50. package/dist/datasource.d.ts.map +1 -0
  51. package/dist/datasource.js +551 -0
  52. package/dist/datasource.js.map +1 -0
  53. package/dist/disclosure.d.ts +55 -0
  54. package/dist/disclosure.d.ts.map +1 -0
  55. package/dist/disclosure.js +57 -0
  56. package/dist/disclosure.js.map +1 -0
  57. package/dist/ecfr.d.ts +4 -2
  58. package/dist/ecfr.d.ts.map +1 -1
  59. package/dist/ecfr.js +92 -17
  60. package/dist/ecfr.js.map +1 -1
  61. package/dist/echo.d.ts +143 -0
  62. package/dist/echo.d.ts.map +1 -0
  63. package/dist/echo.js +424 -0
  64. package/dist/echo.js.map +1 -0
  65. package/dist/edgar.d.ts +377 -0
  66. package/dist/edgar.d.ts.map +1 -0
  67. package/dist/edgar.js +2418 -0
  68. package/dist/edgar.js.map +1 -0
  69. package/dist/errors.d.ts +102 -0
  70. package/dist/errors.d.ts.map +1 -0
  71. package/dist/errors.js +247 -0
  72. package/dist/errors.js.map +1 -0
  73. package/dist/fac.d.ts +180 -0
  74. package/dist/fac.d.ts.map +1 -0
  75. package/dist/fac.js +416 -0
  76. package/dist/fac.js.map +1 -0
  77. package/dist/far.d.ts +170 -0
  78. package/dist/far.d.ts.map +1 -0
  79. package/dist/far.js +804 -0
  80. package/dist/far.js.map +1 -0
  81. package/dist/fdic.d.ts +599 -0
  82. package/dist/fdic.d.ts.map +1 -0
  83. package/dist/fdic.js +1624 -0
  84. package/dist/fdic.js.map +1 -0
  85. package/dist/federal-register.d.ts +139 -2
  86. package/dist/federal-register.d.ts.map +1 -1
  87. package/dist/federal-register.js +432 -15
  88. package/dist/federal-register.js.map +1 -1
  89. package/dist/fema.d.ts +181 -0
  90. package/dist/fema.d.ts.map +1 -0
  91. package/dist/fema.js +436 -0
  92. package/dist/fema.js.map +1 -0
  93. package/dist/fpds.d.ts +108 -0
  94. package/dist/fpds.d.ts.map +1 -0
  95. package/dist/fpds.js +519 -0
  96. package/dist/fpds.js.map +1 -0
  97. package/dist/gao.d.ts +64 -0
  98. package/dist/gao.d.ts.map +1 -0
  99. package/dist/gao.js +640 -0
  100. package/dist/gao.js.map +1 -0
  101. package/dist/govinfo.d.ts +111 -0
  102. package/dist/govinfo.d.ts.map +1 -0
  103. package/dist/govinfo.js +422 -0
  104. package/dist/govinfo.js.map +1 -0
  105. package/dist/grants.d.ts +27 -4
  106. package/dist/grants.d.ts.map +1 -1
  107. package/dist/grants.js +114 -11
  108. package/dist/grants.js.map +1 -1
  109. package/dist/gsa-csv.d.ts +249 -0
  110. package/dist/gsa-csv.d.ts.map +1 -0
  111. package/dist/gsa-csv.js +784 -0
  112. package/dist/gsa-csv.js.map +1 -0
  113. package/dist/integrity.d.ts +212 -0
  114. package/dist/integrity.d.ts.map +1 -0
  115. package/dist/integrity.js +707 -0
  116. package/dist/integrity.js.map +1 -0
  117. package/dist/meta.d.ts +165 -0
  118. package/dist/meta.d.ts.map +1 -0
  119. package/dist/meta.js +162 -0
  120. package/dist/meta.js.map +1 -0
  121. package/dist/nih.d.ts +117 -0
  122. package/dist/nih.d.ts.map +1 -0
  123. package/dist/nih.js +291 -0
  124. package/dist/nih.js.map +1 -0
  125. package/dist/nppes.d.ts +157 -0
  126. package/dist/nppes.d.ts.map +1 -0
  127. package/dist/nppes.js +648 -0
  128. package/dist/nppes.js.map +1 -0
  129. package/dist/nsf.d.ts +176 -0
  130. package/dist/nsf.d.ts.map +1 -0
  131. package/dist/nsf.js +554 -0
  132. package/dist/nsf.js.map +1 -0
  133. package/dist/nvd.d.ts +176 -0
  134. package/dist/nvd.d.ts.map +1 -0
  135. package/dist/nvd.js +912 -0
  136. package/dist/nvd.js.map +1 -0
  137. package/dist/ofac.d.ts +205 -0
  138. package/dist/ofac.d.ts.map +1 -0
  139. package/dist/ofac.js +919 -0
  140. package/dist/ofac.js.map +1 -0
  141. package/dist/pricing.d.ts +110 -0
  142. package/dist/pricing.d.ts.map +1 -0
  143. package/dist/pricing.js +843 -0
  144. package/dist/pricing.js.map +1 -0
  145. package/dist/sam-gov/client.d.ts +60 -2
  146. package/dist/sam-gov/client.d.ts.map +1 -1
  147. package/dist/sam-gov/client.js +320 -54
  148. package/dist/sam-gov/client.js.map +1 -1
  149. package/dist/sam-gov/index.d.ts +1 -1
  150. package/dist/sam-gov/index.d.ts.map +1 -1
  151. package/dist/sam-gov/index.js +1 -1
  152. package/dist/sam-gov/index.js.map +1 -1
  153. package/dist/sam-gov/types.d.ts +24 -0
  154. package/dist/sam-gov/types.d.ts.map +1 -1
  155. package/dist/sba.d.ts +72 -0
  156. package/dist/sba.d.ts.map +1 -0
  157. package/dist/sba.js +281 -0
  158. package/dist/sba.js.map +1 -0
  159. package/dist/server.d.ts +14 -2
  160. package/dist/server.d.ts.map +1 -1
  161. package/dist/server.js +3897 -295
  162. package/dist/server.js.map +1 -1
  163. package/dist/snapshot.d.ts +98 -0
  164. package/dist/snapshot.d.ts.map +1 -0
  165. package/dist/snapshot.js +146 -0
  166. package/dist/snapshot.js.map +1 -0
  167. package/dist/socrata.d.ts +157 -0
  168. package/dist/socrata.d.ts.map +1 -0
  169. package/dist/socrata.js +448 -0
  170. package/dist/socrata.js.map +1 -0
  171. package/dist/treasury.d.ts +143 -0
  172. package/dist/treasury.d.ts.map +1 -0
  173. package/dist/treasury.js +436 -0
  174. package/dist/treasury.js.map +1 -0
  175. package/dist/usaspending.d.ts +260 -65
  176. package/dist/usaspending.d.ts.map +1 -1
  177. package/dist/usaspending.js +1664 -228
  178. package/dist/usaspending.js.map +1 -1
  179. package/dist/usitc.d.ts +142 -0
  180. package/dist/usitc.d.ts.map +1 -0
  181. package/dist/usitc.js +339 -0
  182. package/dist/usitc.js.map +1 -0
  183. package/package.json +24 -2
  184. package/src/attachments.ts +652 -0
  185. package/src/bls.ts +1943 -0
  186. package/src/cache.ts +73 -0
  187. package/src/census.ts +735 -0
  188. package/src/ckan.ts +495 -0
  189. package/src/clinicaltrials.ts +923 -0
  190. package/src/cms.ts +634 -0
  191. package/src/coerce.ts +47 -0
  192. package/src/datagov-catalog.ts +296 -0
  193. package/src/datagov.ts +907 -0
  194. package/src/datagovKey.ts +68 -0
  195. package/src/datasource.ts +721 -0
  196. package/src/disclosure.ts +61 -0
  197. package/src/ecfr.ts +231 -127
  198. package/src/echo.ts +496 -0
  199. package/src/edgar.ts +3014 -0
  200. package/src/errors.ts +303 -0
  201. package/src/fac.ts +529 -0
  202. package/src/far.ts +1007 -0
  203. package/src/fdic.ts +2052 -0
  204. package/src/federal-register.ts +706 -191
  205. package/src/fema.ts +541 -0
  206. package/src/fpds.ts +620 -0
  207. package/src/gao.ts +744 -0
  208. package/src/govinfo.ts +497 -0
  209. package/src/grants.ts +290 -155
  210. package/src/gsa-csv.ts +992 -0
  211. package/src/integrity.ts +928 -0
  212. package/src/meta.ts +292 -0
  213. package/src/nih.ts +375 -0
  214. package/src/nppes.ts +834 -0
  215. package/src/nsf.ts +706 -0
  216. package/src/nvd.ts +1124 -0
  217. package/src/ofac.ts +1166 -0
  218. package/src/pricing.ts +1075 -0
  219. package/src/sam-gov/client.ts +345 -63
  220. package/src/sam-gov/index.ts +5 -1
  221. package/src/sam-gov/types.ts +22 -0
  222. package/src/sba.ts +357 -0
  223. package/src/server.ts +4559 -327
  224. package/src/snapshot.ts +192 -0
  225. package/src/socrata.ts +532 -0
  226. package/src/treasury.ts +575 -0
  227. package/src/usaspending.ts +2680 -925
  228. package/src/usitc.ts +420 -0
package/dist/census.js ADDED
@@ -0,0 +1,576 @@
1
+ /**
2
+ * US Census Bureau Geocoder — keyless source #22 (ADR-0023). A NEW capability
3
+ * domain: TERRITORY / GEOSPATIAL — resolve a one-line address (or a lon/lat point)
4
+ * to its Census GEOGRAPHIES (State, County, Congressional District, Census Tract,
5
+ * Census Block, Incorporated Place, CBSA/CSA, State Legislative Districts). This is
6
+ * the geographic backbone of set-aside / place-of-performance analysis: a bidder
7
+ * needs a location's congressional district + census tract to reason about HUBZone
8
+ * / Opportunity-Zone eligibility and to file/verify a contract's place-of-performance.
9
+ *
10
+ * The GET source on the R2 `DataSource` port: census.ts writes ZERO fetch/coercion/
11
+ * error/meta code — it REUSES `getJson` / `driftError` / `num`·`str` / `withMeta`,
12
+ * and COPIES (does NOT import) the ECHO fixed-host SSRF idiom. Fully PUBLIC, KEYLESS
13
+ * (byte-clean init — NO headers, NO UA; live-verified 2026-07-12).
14
+ *
15
+ * Address → geographies: https://geocoding.geo.census.gov/geocoder/geographies/onelineaddress
16
+ * ?address=…&benchmark=…&vintage=…&format=json
17
+ * → { result:{ input, addressMatches:[ { matchedAddress,
18
+ * coordinates:{x,y}, tigerLine, addressComponents,
19
+ * geographies:{ …layer keys… } } ] } }
20
+ * Point → geographies: https://geocoding.geo.census.gov/geocoder/geographies/coordinates
21
+ * ?x=<lon>&y=<lat>&benchmark=…&vintage=…&format=json
22
+ * → { result:{ input:{ location:{x,y}, … }, geographies:{ … } } }
23
+ * (NO addressMatches wrapper — a point resolves to ONE geography set)
24
+ *
25
+ * ★ SSRF GUARD (policy① — a verbatim copy of the ECHO fixed-host shape):
26
+ * (1) SINGLE fixed host constant `CENSUS_GEO_HOST` — the caller NEVER supplies a host.
27
+ * (2) TWO fixed endpoint-path constants (a frozen Set) — the caller NEVER supplies a
28
+ * path fragment; there is NO id interpolated into the path (both endpoints are
29
+ * query-param-only), so there is no path-segment-injection surface at all. A path
30
+ * outside the Set ⇒ invalid_input before any fetch.
31
+ * (3) `address`/`x`/`y`/`benchmark`/`vintage`/`format` ride in a module-built
32
+ * URLSearchParams (encoded VALUES — an embedded &/=/?/# inside `address` stays
33
+ * inside the value, never touching the host/path). `benchmark`/`vintage` are
34
+ * enum-whitelisted; `x`/`y` are re-guarded finite-in-range and sent as String().
35
+ * `format=json` is ALWAYS module-set (never a caller arg).
36
+ * (4) Construct the URL, then ASSERT `new URL(built).hostname === CENSUS_GEO_HOST`
37
+ * and `protocol === "https:"` ⇒ invalid_input on mismatch (belt-and-suspenders).
38
+ * (5) `redirect:"error"` on every getJson — a 3xx off geocoding.geo.census.gov throws;
39
+ * its body is never read.
40
+ *
41
+ * ★ HONESTY (load-bearing — 02-truthful-outputs-spec §2.1; ADR-0023 v2 AUTHORITATIVE):
42
+ * [B1] The layer mapper resolves each canonical layer by a SUFFIX pattern on the
43
+ * layer-key (never a literal versioned key — the key names ROLL: "119th
44
+ * Congressional Districts", "2020 Census Blocks", "2024 State Legislative
45
+ * Districts - Upper"). It handles >1 KEY PER SUFFIX: a historical vintage
46
+ * (live-verified `Census2010_Current`) returns TWO `/Congressional Districts$/`
47
+ * keys (113th=GEOID 0102 AND 111th=GEOID 0103 for Montgomery AL — a redistricted
48
+ * location with DISTINCT district GEOIDs). Single-pick-and-drop would present one
49
+ * as THE district and hide the other — a data-lie by omission. So when >1 key
50
+ * matches: pick deterministically (highest leading session/year number), surface
51
+ * EVERY matched layerKey (the chosen object + an `alternates[]`), AND emit a
52
+ * MANDATORY `_meta` note naming the N keys + the chosen one. NEVER silently drop.
53
+ * [M1] The drift-guard is scoped to the FOUR always-present sentinel layers only —
54
+ * States, Counties, Census Tracts, Congressional Districts. driftError fires ONLY
55
+ * when a sentinel matches ZERO keys while `geographies` is a NON-EMPTY object.
56
+ * Optional/vintage-dependent layers (Census Blocks, SLD-Upper/Lower, CBSA/CSA)
57
+ * → honest `null` on absence (live-verified: ACS2023_Current omits Census Blocks;
58
+ * DC omits SLD-Lower — LEGITIMATE absences, NOT drift).
59
+ * [M2] The vintage enum is the UNION of live-valid vintages across the four shipped
60
+ * benchmarks (25 distinct — enumerated via /benchmarks + /vintages 2026-07-12),
61
+ * so a VALID non-default pair (e.g. Public_AR_Census2020 + Census2020_Census2020,
62
+ * live 200) is NOT Zod-rejected. An INVALID (benchmark,vintage) pair LOUD-fails
63
+ * at HTTP 400 (the module relies on that backstop) and the tool DISCLOSES that
64
+ * vintage must be benchmark-compatible.
65
+ * • Genuine-empty is HTTP-200 and is NEVER thrown; a 400/500/outage is NEVER read as
66
+ * empty. Address: `addressMatches:[]` ⇒ matches:[], matchCount:0, complete:true.
67
+ * Coordinates: `geographies:{}` ⇒ all layers null, matchCount:0, complete:true. An
68
+ * invalid/missing benchmark/vintage or a non-numeric coord ⇒ HTTP 400 ⇒ getJson
69
+ * THROWS invalid_input; a 5xx/timeout ⇒ THROWS upstream_unavailable.
70
+ * • Multi-match (addressMatches.length > 1, live-forced: "100 Main St, Springfield"
71
+ * → 7 matches with DISTINCT state/CD geographies) ⇒ surface ALL matches (each with
72
+ * its own matchedAddress + geographies) + matchCount + a mandatory note.
73
+ * • The RESOLVED benchmark/vintage is echoed in EVERY response (data.vintageResolved
74
+ * from result.input.{benchmark.benchmarkName, vintage.vintageName}) + a mandatory
75
+ * "Current is a MOVING vintage" note.
76
+ * • GEOIDs are `str` (null-never-empty-string). Leading zeros are REAL and MUST
77
+ * survive: State "01", County "01101", Tract "01101000200", CD "0102" — `num()`
78
+ * would corrupt "01"→1, so a GEOID is NEVER num-coerced.
79
+ * • The KILLER caveat, in EVERY response: Census geographies are a NOMINAL input, NOT
80
+ * an authoritative HUBZone / Opportunity-Zone / set-aside determination.
81
+ * • No fabricated pagination/cursor — both tools are single-shot lookups.
82
+ *
83
+ * ★ `tokenizeForDisclosure` (src/disclosure.ts, C110) is DELIBERATELY N/A: the geocoder
84
+ * is a STRUCTURED address PARSER, not an Essie whitespace-AND/OR keyword search. A
85
+ * multi-word `address` is EXPECTED and is not tokenized into a co-occurrence trap — an
86
+ * under-specified address returns a clean genuine-empty (live-verified), not a silent
87
+ * broaden. There is NO upstream token-drop to disclose, so this module builds NO
88
+ * whitespace-split disclosure note (the lint-invariants disclosure check stays green).
89
+ */
90
+ import { ToolErrorCarrier } from "./errors.js";
91
+ import { getJson, driftError } from "./datasource.js";
92
+ import { num, str } from "./coerce.js";
93
+ import { withMeta } from "./meta.js";
94
+ // Re-export the shared honesty coercion (single audited copy in ./coerce.js —
95
+ // ADR-0005 v2 FIX-C) so the fault suite's num-parity guard resolves the SAME `num`
96
+ // from this module (census.num === coerce.num === echo.num === …). NO local num/str.
97
+ export { num };
98
+ // ─── SSRF core: the single fixed host + two fixed endpoint paths ──
99
+ const CENSUS_GEO_HOST = "geocoding.geo.census.gov";
100
+ const CENSUS_GEO_BASE = `https://${CENSUS_GEO_HOST}/geocoder`;
101
+ // The ONLY two endpoint paths we ever build (frozen constants — the caller never
102
+ // supplies a path fragment; NO id is interpolated into the path). A path outside this
103
+ // Set ⇒ invalid_input (the path-injection guard — mirror ECHO_SERVICES).
104
+ const PATH_ONELINE = "/geographies/onelineaddress"; // address → addressMatches[].geographies
105
+ const PATH_COORDINATES = "/geographies/coordinates"; // lon/lat → geographies
106
+ const CENSUS_PATHS = new Set([
107
+ PATH_ONELINE,
108
+ PATH_COORDINATES,
109
+ ]);
110
+ // ─── Frozen enums (the Zod source of truth + in-handler re-guard) ──
111
+ // Live-enumerated via /benchmarks (2026-07-12): 4 benchmarks.
112
+ export const CENSUS_BENCHMARKS = [
113
+ "Public_AR_Current",
114
+ "Public_AR_ACS2025",
115
+ "Public_AR_LUCA",
116
+ "Public_AR_Census2020",
117
+ ];
118
+ // [M2] The UNION of live-valid vintages across ALL four benchmarks (live-enumerated
119
+ // via /vintages?benchmark=<b> 2026-07-12 — 25 distinct). The valid vintage set is a
120
+ // (benchmark, vintage) MATRIX, so this enum is intentionally the UNION: it must NOT
121
+ // reject a VALID non-default pair (e.g. Census2020_Census2020, live 200). An INVALID
122
+ // pair fails-closed at HTTP 400 (the module relies on the LOUD 400 backstop).
123
+ export const CENSUS_VINTAGES = [
124
+ // Public_AR_Current (11)
125
+ "Current_Current",
126
+ "Census2010_Current",
127
+ "ACS2017_Current",
128
+ "ACS2018_Current",
129
+ "ACS2019_Current",
130
+ "Census2020_Current",
131
+ "ACS2021_Current",
132
+ "ACS2022_Current",
133
+ "ACS2023_Current",
134
+ "ACS2024_Current",
135
+ "ACS2025_Current",
136
+ // Public_AR_LUCA (1)
137
+ "LUCA_Current",
138
+ // Public_AR_ACS2025 (11)
139
+ "Current_ACS2025",
140
+ "Census2010_ACS2025",
141
+ "ACS2017_ACS2025",
142
+ "ACS2018_ACS2025",
143
+ "ACS2019_ACS2025",
144
+ "Census2020_ACS2025",
145
+ "ACS2021_ACS2025",
146
+ "ACS2022_ACS2025",
147
+ "ACS2023_ACS2025",
148
+ "ACS2024_ACS2025",
149
+ "ACS2025_ACS2025",
150
+ // Public_AR_Census2020 (2)
151
+ "Census2020_Census2020",
152
+ "Census2010_Census2020",
153
+ ];
154
+ const DEFAULT_BENCHMARK = "Public_AR_Current";
155
+ const DEFAULT_VINTAGE = "Current_Current";
156
+ // ─── Notes (honesty disclosures — ADR-0023 required set) ──────────
157
+ // The KILLER caveat — in EVERY response (§Honesty #4).
158
+ const HUBZONE_OZ_CAVEAT = "Census geographies are a NOMINAL input, NOT an authoritative HUBZone / Opportunity-Zone / set-aside determination. censusTract.geoid is the tract-level identifier used to look up Opportunity-Zone status (Treasury's designated-OZ-tract list), and county/censusTract are inputs to a HUBZone determination (SBA's HUBZone map / qualified-tract & qualified-county lists) — but an authoritative eligibility finding requires those SBA/Treasury sources, not this geocoder.";
159
+ const BENCHMARK_VINTAGE_NOTE = "vintage must be COMPATIBLE with the chosen benchmark (the valid vintage set is a (benchmark, vintage) matrix); an incompatible pair fails-closed with an HTTP 400 (invalid_input), never a silent mis-resolution.";
160
+ const GEOID_STRING_NOTE = "GEOIDs are STRINGS with real leading zeros (State '01', County '01101', Tract '01101000200', CD '0102') — they are never numeric (a leading zero must survive); a missing value is null, never an empty string.";
161
+ // ─── fetch layer (SSRF-guarded; reuses the R2 getJson port) ───────
162
+ /**
163
+ * GET one Census geocoder endpoint. SSRF guard: `path` ∈ the frozen 2-member Set
164
+ * (the path-injection guard), params via a module-built URLSearchParams (encoded
165
+ * values, no host-alteration surface), `format=json` ALWAYS module-set, then the
166
+ * CONSTRUCTED URL's hostname === CENSUS_GEO_HOST (https) assertion. Sets
167
+ * `redirect:"error"`; NO headers (keyless — byte-clean init). Reuses errors.ts
168
+ * retry/timeout/taxonomy (429 → rate_limited; 5xx → upstream_unavailable; 404 →
169
+ * not_found; 400 → invalid_input — the P6–P10 400s become the thrown error, NEVER a
170
+ * fake-empty). Returns the parsed JSON (unknown; the caller validates the envelope).
171
+ */
172
+ export async function censusGet(path, params) {
173
+ if (!CENSUS_PATHS.has(path)) {
174
+ throw new ToolErrorCarrier({
175
+ kind: "invalid_input",
176
+ message: `Census geocoder path ${JSON.stringify(path)} is not one of the two fixed endpoint paths (${PATH_ONELINE} / ${PATH_COORDINATES}) — refusing to fetch (SSRF path guard).`,
177
+ retryable: false,
178
+ });
179
+ }
180
+ // `format=json` is ALWAYS module-set — never a caller arg (structural guarantee).
181
+ params.set("format", "json");
182
+ const url = `${CENSUS_GEO_BASE}${path}?${params.toString()}`;
183
+ // Belt-and-suspenders: the FIXED host + FIXED path leave nothing to steer the
184
+ // authority; assert the built URL cannot have been moved off-host.
185
+ const built = new URL(url);
186
+ if (built.hostname !== CENSUS_GEO_HOST || built.protocol !== "https:") {
187
+ throw new ToolErrorCarrier({
188
+ kind: "invalid_input",
189
+ message: `Constructed Census URL host ${JSON.stringify(built.hostname)} (${built.protocol}) is not ${CENSUS_GEO_HOST} over https — refusing to fetch (SSRF safety).`,
190
+ retryable: false,
191
+ });
192
+ }
193
+ // Shared fetch envelope: keyless ⇒ NO headers key (byte-clean init); redirect:"error";
194
+ // the label surfaces as ToolError.upstreamEndpoint — host+path only, no token.
195
+ return getJson(url, { label: "census:" + path, redirect: "error" });
196
+ }
197
+ // The canonical layer specs, resolved by SUFFIX PATTERN (never a literal versioned
198
+ // key). Order = the emitted field order. The FOUR sentinels ([M1]) are marked.
199
+ const LAYER_SPECS = [
200
+ { field: "state", re: /^States$/, label: "States", sentinel: true },
201
+ { field: "county", re: /^Counties$/, label: "Counties", sentinel: true },
202
+ {
203
+ field: "congressionalDistrict",
204
+ re: /Congressional Districts$/,
205
+ label: "Congressional Districts",
206
+ sentinel: true,
207
+ },
208
+ {
209
+ field: "censusTract",
210
+ re: /Census Tracts$/,
211
+ label: "Census Tracts",
212
+ sentinel: true,
213
+ },
214
+ {
215
+ field: "censusBlock",
216
+ re: /Census Blocks$/,
217
+ label: "Census Blocks",
218
+ sentinel: false,
219
+ },
220
+ {
221
+ field: "place",
222
+ re: /Incorporated Places$/,
223
+ label: "Incorporated Places",
224
+ sentinel: false,
225
+ },
226
+ {
227
+ field: "cbsaOrCsa",
228
+ re: /Statistical Areas?$/,
229
+ label: "Statistical Areas (CBSA/CSA)",
230
+ sentinel: false,
231
+ },
232
+ {
233
+ field: "stateLegislativeUpper",
234
+ re: /State Legislative Districts - Upper$/,
235
+ label: "State Legislative Districts - Upper",
236
+ sentinel: false,
237
+ },
238
+ {
239
+ field: "stateLegislativeLower",
240
+ re: /State Legislative Districts - Lower$/,
241
+ label: "State Legislative Districts - Lower",
242
+ sentinel: false,
243
+ },
244
+ ];
245
+ /** The leading integer of a layer key ("113th …" → 113, "2012 …" → 2012), else -1. */
246
+ function leadingNumber(key) {
247
+ const m = /^(\d+)/.exec(key.trim());
248
+ return m ? Number(m[1]) : -1;
249
+ }
250
+ /** Build a GeoLayer from a raw layer key + its first entry (GEOID/NAME are str). */
251
+ function toGeoLayer(layerKey, entry) {
252
+ return {
253
+ layerKey,
254
+ geoid: str(entry.GEOID), // NEVER num — leading zeros must survive ("01" ≠ 1)
255
+ name: str(entry.NAME),
256
+ };
257
+ }
258
+ /**
259
+ * Map a `geographies` object to the STABLE canonical set by SUFFIX pattern, handling
260
+ * >1 key per suffix ([B1]) and the sentinel drift-guard ([M1]). Returns the mapped
261
+ * geographies + any multi-key `_meta` notes. `label` scopes the driftError;
262
+ * `vintageName` names the vintage in the multi-key note.
263
+ */
264
+ export function mapGeographies(geographies, label, vintageName) {
265
+ const allKeys = Object.keys(geographies);
266
+ const nonEmpty = allKeys.length > 0;
267
+ const geo = {};
268
+ const notes = [];
269
+ for (const spec of LAYER_SPECS) {
270
+ // ALL keys matching this suffix that carry a usable (non-empty array) value.
271
+ const matched = allKeys.filter((k) => {
272
+ if (!spec.re.test(k))
273
+ return false;
274
+ const v = geographies[k];
275
+ return Array.isArray(v) && v.length > 0 && typeof v[0] === "object" && v[0] !== null;
276
+ });
277
+ if (matched.length === 0) {
278
+ // [M1] a SENTINEL absent from a NON-EMPTY geographies object ⇒ schema drift
279
+ // (the four sentinels are live-observed present in EVERY non-empty 200).
280
+ // Optional layers absent ⇒ honest null (never drift).
281
+ if (spec.sentinel && nonEmpty) {
282
+ throw driftError(label, `census: expected sentinel layer "${spec.label}" matched ZERO keys in a non-empty geographies object (keys: ${JSON.stringify(allKeys)}) — treating as schema drift (the layer-key suffix may have changed).`);
283
+ }
284
+ geo[spec.field] = null;
285
+ continue;
286
+ }
287
+ // [B1] Deterministic pick: highest leading session/year number, tiebreak by the
288
+ // key string DESC (so the choice is stable). NEVER silently drop the others.
289
+ const ordered = [...matched].sort((a, b) => {
290
+ const na = leadingNumber(a);
291
+ const nb = leadingNumber(b);
292
+ if (na !== nb)
293
+ return nb - na;
294
+ return a < b ? 1 : a > b ? -1 : 0;
295
+ });
296
+ const layers = ordered.map((k) => toGeoLayer(k, geographies[k][0]));
297
+ const chosen = layers[0];
298
+ if (layers.length > 1) {
299
+ const alternates = layers.slice(1);
300
+ geo[spec.field] = { ...chosen, alternates };
301
+ // MANDATORY multi-key note ([B1]) — name every matched key + the chosen one.
302
+ notes.push(`vintage ${vintageName ?? "(unknown)"} returned ${layers.length} "${spec.label}" layers: ${ordered
303
+ .map((k) => JSON.stringify(k))
304
+ .join(", ")}; showing "${chosen.layerKey}" (highest session/year) as ${spec.field}, the other ${layers.length - 1} in ${spec.field}.alternates[] — a redistricted location can carry DISTINCT GEOIDs across these, so do NOT treat the shown one as the sole answer.`);
305
+ }
306
+ else {
307
+ geo[spec.field] = chosen;
308
+ }
309
+ }
310
+ return { geo, notes };
311
+ }
312
+ /** Build one curated AddressMatch from a raw addressMatches[i] + its geographies. */
313
+ function buildAddressMatch(m, label, vintageName) {
314
+ const coordsRaw = (m.coordinates ?? {});
315
+ const tiger = (m.tigerLine ?? {});
316
+ const ac = (m.addressComponents ?? {});
317
+ const g = m.geographies;
318
+ const geoObj = g !== null && typeof g === "object" && !Array.isArray(g)
319
+ ? g
320
+ : {};
321
+ const { geo, notes } = mapGeographies(geoObj, label, vintageName);
322
+ // A one-line street from the parsed components (fromAddress + streetName + suffixType).
323
+ const street = [str(ac.fromAddress), str(ac.streetName), str(ac.suffixType)]
324
+ .filter((p) => p !== null)
325
+ .join(" ") || null;
326
+ return {
327
+ match: {
328
+ matchedAddress: str(m.matchedAddress),
329
+ coordinates: { x: num(coordsRaw.x), y: num(coordsRaw.y) },
330
+ tigerLineId: str(tiger.tigerLineId),
331
+ addressComponents: {
332
+ street,
333
+ city: str(ac.city),
334
+ state: str(ac.state),
335
+ zip: str(ac.zip),
336
+ },
337
+ geographies: geo,
338
+ },
339
+ notes,
340
+ };
341
+ }
342
+ /** Echo the RESOLVED benchmark/vintage from result.input (the ACTUAL pair upstream used). */
343
+ function resolvedVintage(input) {
344
+ const b = (input?.benchmark ?? {});
345
+ const v = (input?.vintage ?? {});
346
+ return { benchmark: str(b.benchmarkName), vintage: str(v.vintageName) };
347
+ }
348
+ /** The mandatory "resolved + moving vintage" note (echoes the actual resolved pair). */
349
+ function movingVintageNote(res) {
350
+ return `Resolved to benchmark ${JSON.stringify(res.benchmark)} / vintage ${JSON.stringify(res.vintage)}. 'Current' is a MOVING vintage — these geographies reflect today's resolution and may change as the Census Bureau refreshes (the same address can return a different tract/CD across cycles); the congressional-district layerKey reflects the current congressional session (redistricting changes it).`;
351
+ }
352
+ // ─── Enum re-guards (belt-and-suspenders behind the server's Zod enums) ──
353
+ function guardBenchmark(benchmark) {
354
+ if (!CENSUS_BENCHMARKS.includes(benchmark)) {
355
+ throw new ToolErrorCarrier({
356
+ kind: "invalid_input",
357
+ message: `Invalid benchmark ${JSON.stringify(benchmark)} — expected one of ${JSON.stringify(CENSUS_BENCHMARKS)}.`,
358
+ retryable: false,
359
+ });
360
+ }
361
+ }
362
+ function guardVintage(vintage) {
363
+ if (!CENSUS_VINTAGES.includes(vintage)) {
364
+ throw new ToolErrorCarrier({
365
+ kind: "invalid_input",
366
+ message: `Invalid vintage ${JSON.stringify(vintage)} — expected one of the ${CENSUS_VINTAGES.length} live-valid vintages (it must also be COMPATIBLE with the chosen benchmark; an incompatible pair fails-closed with a 400).`,
367
+ retryable: false,
368
+ });
369
+ }
370
+ }
371
+ const SOURCE = `${CENSUS_GEO_HOST} via US Census Geocoder (keyless)`;
372
+ // ─── Tool 1: census_geocode_address ───────────────────────────────
373
+ /**
374
+ * Resolve a one-line US address → its matched address(es) + the Census geographies
375
+ * that drive set-aside / place-of-performance analysis (congressional district,
376
+ * census tract, county, state, block). Handles the addressMatches ARRAY (the
377
+ * multi-match "which location" honesty surface — every match carries its own
378
+ * matchedAddress + geographies). Disclose-not-refuse: an unmatched address is NOT an
379
+ * error (matches:[], matchCount:0, complete:true + a note).
380
+ */
381
+ export async function geocodeAddress(args) {
382
+ const benchmark = args.benchmark ?? DEFAULT_BENCHMARK;
383
+ const vintage = args.vintage ?? DEFAULT_VINTAGE;
384
+ guardBenchmark(benchmark); // re-guard behind Zod (a direct handler call bypasses it)
385
+ guardVintage(vintage);
386
+ if (typeof args.address !== "string" || args.address.trim() === "") {
387
+ throw new ToolErrorCarrier({
388
+ kind: "invalid_input",
389
+ message: "address is required (a non-empty one-line US address).",
390
+ retryable: false,
391
+ });
392
+ }
393
+ const params = new URLSearchParams();
394
+ params.set("address", args.address); // URLSearchParams-encoded VALUE (no param smuggle)
395
+ params.set("benchmark", benchmark); // ALWAYS sent (REQUIRED — a missing benchmark 400s)
396
+ params.set("vintage", vintage); // ALWAYS sent (REQUIRED — a missing vintage 400s)
397
+ const body = await censusGet(PATH_ONELINE, params);
398
+ const result = body?.result;
399
+ if (result === null || typeof result !== "object" || Array.isArray(result)) {
400
+ throw driftError("census:" + PATH_ONELINE, "census: onelineaddress returned an unexpected shape (missing result object).");
401
+ }
402
+ const r = result;
403
+ const addressMatches = r.addressMatches;
404
+ if (!Array.isArray(addressMatches)) {
405
+ throw driftError("census:" + PATH_ONELINE, "census: onelineaddress returned a non-array addressMatches with no error — treating as schema drift (never a fake empty).");
406
+ }
407
+ const res = resolvedVintage(r.input);
408
+ const notes = [movingVintageNote(res), HUBZONE_OZ_CAVEAT, BENCHMARK_VINTAGE_NOTE, GEOID_STRING_NOTE];
409
+ // Genuine-empty (200 addressMatches:[]) — honest complete:true / matchCount:0 (NOT
410
+ // an error; DISTINCT from the LOUD 400 of a bad benchmark/vintage).
411
+ if (addressMatches.length === 0) {
412
+ notes.push("No address match — the address did not geocode. Verify spelling and add city, state, and ZIP (an under-specified address returns 0, a genuine empty, not an error).");
413
+ return withMeta({
414
+ matches: [],
415
+ matchCount: 0,
416
+ benchmark,
417
+ vintage,
418
+ vintageResolved: res,
419
+ }, {
420
+ source: SOURCE,
421
+ keylessMode: true,
422
+ returned: 0,
423
+ totalAvailable: 0,
424
+ filtersApplied: ["benchmark", "vintage"],
425
+ filtersDropped: [],
426
+ fieldsUnavailable: [],
427
+ notes,
428
+ });
429
+ }
430
+ const matches = [];
431
+ for (const m of addressMatches) {
432
+ const built = buildAddressMatch((m ?? {}), "census:" + PATH_ONELINE, res.vintage);
433
+ matches.push(built.match);
434
+ for (const n of built.notes)
435
+ if (!notes.includes(n))
436
+ notes.push(n);
437
+ }
438
+ // Multi-match disclosure (§Honesty #5) — surface ALL matches + matchCount + a note.
439
+ // NOTE: an upstream cap on addressMatches was NOT observed (live-forced 7 matches for
440
+ // "100 Main St, Springfield"); no cap has been seen, so complete:true. If a future
441
+ // cap is found, surface truncated:true.
442
+ if (matches.length > 1) {
443
+ notes.push(`${matches.length} addresses matched — the geographies are listed PER match; matchedAddress shows what each resolved to. Refine the address (add ZIP / unit / state) if the intended location is ambiguous.`);
444
+ }
445
+ return withMeta({
446
+ matches,
447
+ matchCount: matches.length,
448
+ benchmark,
449
+ vintage,
450
+ vintageResolved: res,
451
+ }, {
452
+ source: SOURCE,
453
+ keylessMode: true,
454
+ returned: matches.length,
455
+ totalAvailable: matches.length,
456
+ filtersApplied: ["benchmark", "vintage"],
457
+ filtersDropped: [],
458
+ fieldsUnavailable: [],
459
+ notes,
460
+ });
461
+ }
462
+ // ─── Tool 2: census_geographies_by_coordinates ────────────────────
463
+ /**
464
+ * Resolve a longitude/latitude point → the Census geographies at that point (no
465
+ * address parsing). For a caller that already holds coordinates. `x`/`longitude`
466
+ * (required) and `y`/`latitude` (required) are aliases; the handler coalesces + re-
467
+ * guards them finite-in-range (belt-and-suspenders behind Zod — a non-finite value ⇒
468
+ * invalid_input PRE-fetch, 0 fetch, mirroring the LOUD 400 of a non-numeric coord but
469
+ * caught locally). A point outside any US Census geography ⇒ geographies:{} ⇒ all
470
+ * layers null, matchCount:0, complete:true + a note (NOT an error).
471
+ */
472
+ export async function geographiesByCoordinates(args) {
473
+ const benchmark = args.benchmark ?? DEFAULT_BENCHMARK;
474
+ const vintage = args.vintage ?? DEFAULT_VINTAGE;
475
+ guardBenchmark(benchmark);
476
+ guardVintage(vintage);
477
+ const xVal = args.x ?? args.longitude;
478
+ const yVal = args.y ?? args.latitude;
479
+ if (xVal === undefined || yVal === undefined) {
480
+ throw new ToolErrorCarrier({
481
+ kind: "invalid_input",
482
+ message: "both x (longitude) and y (latitude) are required.",
483
+ retryable: false,
484
+ });
485
+ }
486
+ // Coordinate FINITENESS re-guard (belt-and-suspenders behind the Zod min/max — a live
487
+ // x=NaN is a misclassified upstream 500 the pre-fetch guard prevents; 0 fetch).
488
+ if (!Number.isFinite(xVal) || xVal < -180 || xVal > 180) {
489
+ throw new ToolErrorCarrier({
490
+ kind: "invalid_input",
491
+ message: `Invalid x (longitude) ${JSON.stringify(xVal)} — expected a finite number in [-180, 180].`,
492
+ retryable: false,
493
+ });
494
+ }
495
+ if (!Number.isFinite(yVal) || yVal < -90 || yVal > 90) {
496
+ throw new ToolErrorCarrier({
497
+ kind: "invalid_input",
498
+ message: `Invalid y (latitude) ${JSON.stringify(yVal)} — expected a finite number in [-90, 90].`,
499
+ retryable: false,
500
+ });
501
+ }
502
+ const params = new URLSearchParams();
503
+ params.set("x", String(xVal));
504
+ params.set("y", String(yVal));
505
+ params.set("benchmark", benchmark);
506
+ params.set("vintage", vintage);
507
+ const body = await censusGet(PATH_COORDINATES, params);
508
+ const result = body?.result;
509
+ if (result === null || typeof result !== "object" || Array.isArray(result)) {
510
+ throw driftError("census:" + PATH_COORDINATES, "census: coordinates returned an unexpected shape (missing result object).");
511
+ }
512
+ const r = result;
513
+ const geographiesRaw = r.geographies;
514
+ // A missing / non-object (null / array) geographies with no error ⇒ hard drift (an
515
+ // empty OBJECT {} is a GENUINE out-of-US empty, handled below — NOT drift).
516
+ if (geographiesRaw === null ||
517
+ typeof geographiesRaw !== "object" ||
518
+ Array.isArray(geographiesRaw)) {
519
+ throw driftError("census:" + PATH_COORDINATES, "census: coordinates returned a non-object geographies with no error — treating as schema drift (never a fake empty).");
520
+ }
521
+ const res = resolvedVintage(r.input);
522
+ const loc = r.input?.location;
523
+ const coordinates = {
524
+ x: num(loc?.x) ?? xVal,
525
+ y: num(loc?.y) ?? yVal,
526
+ };
527
+ const notes = [movingVintageNote(res), HUBZONE_OZ_CAVEAT, BENCHMARK_VINTAGE_NOTE, GEOID_STRING_NOTE];
528
+ const geoObj = geographiesRaw;
529
+ // Genuine-empty (200 geographies:{}) — an out-of-US point. All canonical layers null,
530
+ // matchCount:0, complete:true (NOT thrown; DISTINCT from the LOUD 400 of a bad coord).
531
+ if (Object.keys(geoObj).length === 0) {
532
+ const empty = {};
533
+ for (const spec of LAYER_SPECS)
534
+ empty[spec.field] = null;
535
+ notes.push("The point is not within a US Census geography (offshore / outside the US) — an honest empty (geographies:{}), not an error.");
536
+ return withMeta({
537
+ found: false,
538
+ coordinates,
539
+ geographies: empty,
540
+ benchmark,
541
+ vintage,
542
+ vintageResolved: res,
543
+ }, {
544
+ source: SOURCE,
545
+ keylessMode: true,
546
+ returned: 0,
547
+ totalAvailable: 0,
548
+ filtersApplied: ["benchmark", "vintage"],
549
+ filtersDropped: [],
550
+ fieldsUnavailable: [],
551
+ notes,
552
+ });
553
+ }
554
+ const { geo, notes: multiKeyNotes } = mapGeographies(geoObj, "census:" + PATH_COORDINATES, res.vintage);
555
+ for (const n of multiKeyNotes)
556
+ if (!notes.includes(n))
557
+ notes.push(n);
558
+ return withMeta({
559
+ found: true,
560
+ coordinates,
561
+ geographies: geo,
562
+ benchmark,
563
+ vintage,
564
+ vintageResolved: res,
565
+ }, {
566
+ source: SOURCE,
567
+ keylessMode: true,
568
+ returned: 1,
569
+ totalAvailable: 1,
570
+ filtersApplied: ["benchmark", "vintage"],
571
+ filtersDropped: [],
572
+ fieldsUnavailable: [],
573
+ notes,
574
+ });
575
+ }
576
+ //# sourceMappingURL=census.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"census.js","sourceRoot":"","sources":["../src/census.ts"],"names":[],"mappings":"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"}