@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
@@ -0,0 +1,143 @@
1
+ /**
2
+ * US Treasury — Fiscal Data API wrappers (keyless).
3
+ *
4
+ * First non-SAM macro/fiscal source (ADR-0002). Fully PUBLIC, KEYLESS — the
5
+ * Treasury Fiscal Data service (https://fiscaldata.treasury.gov) needs no API
6
+ * key and documents no numeric rate limit. Base:
7
+ * https://api.fiscaldata.treasury.gov/services/api/fiscal_service/
8
+ *
9
+ * Three clean layers (seed the future common DataSource port, R2):
10
+ * fetch — `getTreasury(path, query)` builds the URL + envelope, reusing
11
+ * errors.ts retry/timeout/taxonomy.
12
+ * map — per-dataset PURE mappers Row → domain object, coercing string
13
+ * amounts through the shared `num()`.
14
+ * meta — `treasuryMeta(...)` hands `{ totalAvailable, returned, pagination }`
15
+ * to `withMeta`; meta.ts's `buildMeta` DERIVES complete/truncated.
16
+ *
17
+ * HONESTY TRAPS (live-verified 2026-07-10 — see ADR-0002 Review outcome v2):
18
+ * F1/F9 — `meta.count` / `meta['total-count']` / `meta['total-pages']` are
19
+ * JSON NUMBERS (not strings). `totalAvailable = meta['total-count']`
20
+ * directly; never `num()` them.
21
+ * F2 — VALUE fields are inconsistently typed across datasets (debt/rate
22
+ * amounts are strings; even `rates_of_exchange.exchange_rate`, whose
23
+ * dataType metadata says NUMBER, arrives as a string on the wire).
24
+ * Row value fields are typed `string | number | null` and ALWAYS go
25
+ * through `num()`.
26
+ * F3 — `num(x)` returns null (NEVER 0) for absent values. The literal
27
+ * string "null" is common (early history + MTS parent/summary rows);
28
+ * returning 0 would be a data-absence-as-zero masquerade.
29
+ * F4 — `mts_table_1` mixes child line-items (real amounts) with
30
+ * fiscal-year PARENT/SUMMARY rows whose amounts are all "null".
31
+ * `monthlyStatement` excludes them by default via the LIVE-VERIFIED
32
+ * server-side filter `current_month_gross_outly_amt:gt:0` (3039 →
33
+ * 2769 rows; the 270 dropped rows are exactly the `parent_id="null"`
34
+ * header rows).
35
+ * F5 — `queryDataset` accepts only an ENUM of 5 confirmed paths (no free
36
+ * path) — removes the SSRF surface for this slice.
37
+ */
38
+ import { num } from "./coerce.js";
39
+ import { type MetaBundle } from "./meta.js";
40
+ export { num };
41
+ /**
42
+ * Test-only: reset the resilience circuit breaker between OFFLINE fixtures (the
43
+ * breaker is module-level process state; a fresh instance isolates cases). Not a
44
+ * runtime API — mirrors the `_reset*Cache` convention in the fault suite.
45
+ */
46
+ export declare function _resetTreasuryBreakerForTests(): void;
47
+ export declare const TREASURY_DATASETS: {
48
+ readonly debt_to_penny: "/v2/accounting/od/debt_to_penny";
49
+ readonly avg_interest_rates: "/v2/accounting/od/avg_interest_rates";
50
+ readonly mts_table_1: "/v1/accounting/mts/mts_table_1";
51
+ readonly rates_of_exchange: "/v1/accounting/od/rates_of_exchange";
52
+ readonly debt_outstanding: "/v2/accounting/od/debt_outstanding";
53
+ };
54
+ export type TreasuryDatasetKey = keyof typeof TREASURY_DATASETS;
55
+ export type TreasuryValue = string | number | null;
56
+ export type TreasuryRow = Record<string, TreasuryValue>;
57
+ export type TreasuryEnvelopeMeta = {
58
+ /** rows in THIS page — a JSON number (F1). */
59
+ count: number;
60
+ /** the truthful grand total for the query — a JSON number (F1). */
61
+ "total-count": number;
62
+ /** a JSON number (F1). */
63
+ "total-pages": number;
64
+ labels?: Record<string, string>;
65
+ dataTypes?: Record<string, string>;
66
+ dataFormats?: Record<string, string>;
67
+ };
68
+ export type TreasuryEnvelope<Row = TreasuryRow> = {
69
+ data: Row[];
70
+ meta: TreasuryEnvelopeMeta;
71
+ links?: {
72
+ self?: string;
73
+ first?: string;
74
+ prev?: string | null;
75
+ next?: string | null;
76
+ last?: string;
77
+ };
78
+ };
79
+ /**
80
+ * Generic escape hatch over the 5 confirmed datasets (covers debt_outstanding +
81
+ * rates_of_exchange without a dedicated tool). Rows are passed through RAW
82
+ * (value fields as strings exactly as upstream provides) — the `_meta` note
83
+ * warns that the literal string "null" means "no value", never zero.
84
+ */
85
+ export declare function queryDataset(args: {
86
+ dataset: TreasuryDatasetKey;
87
+ fields?: string;
88
+ filter?: string;
89
+ sort?: string;
90
+ pageSize?: number;
91
+ pageNumber?: number;
92
+ }): Promise<MetaBundle>;
93
+ /**
94
+ * Daily total US public debt ("Debt to the Penny"). `latest` (default true) ⇒
95
+ * the single most-recent day; else the `startDate/endDate` range, newest first.
96
+ * Amounts are USD, coerced via num() (null, never 0, for absent).
97
+ */
98
+ export declare function debtToPenny(args: {
99
+ latest?: boolean;
100
+ startDate?: string;
101
+ endDate?: string;
102
+ pageSize?: number;
103
+ pageNumber?: number;
104
+ }): Promise<MetaBundle>;
105
+ /**
106
+ * Monthly Treasury Statement (MTS) table 1 — federal receipts, outlays, and the
107
+ * deficit/surplus by month. `startDate/endDate` (ISO) filter record_date;
108
+ * default is the trailing ~12 months.
109
+ *
110
+ * F4 — SUMMARY-ROW EXCLUSION (live-verified 2026-07-10): mts_table_1 interleaves
111
+ * child line-items (real amounts) with fiscal-year PARENT/SUMMARY header rows
112
+ * whose `parent_id` is the string "null" and whose amount fields are all the
113
+ * string "null". `excludeSummaryRows` (default true) appends the server-side
114
+ * filter `current_month_gross_outly_amt:gt:0`, which drops EXACTLY those parent
115
+ * rows (total-count 3039 → 2769; the 270 dropped rows == the parent_id="null"
116
+ * set). Because the exclusion is server-side, `total-count` (and hence
117
+ * `_meta.totalAvailable` / pagination) reflect the child rows only — no
118
+ * client-side filtering that would desync `returned` from the envelope count.
119
+ */
120
+ export declare function monthlyStatement(args: {
121
+ startDate?: string;
122
+ endDate?: string;
123
+ excludeSummaryRows?: boolean;
124
+ pageSize?: number;
125
+ pageNumber?: number;
126
+ }): Promise<MetaBundle>;
127
+ /**
128
+ * Average interest rate the Treasury pays by security type/description.
129
+ * `latest` (default true) returns the most-recent month's full breakdown across
130
+ * security types (pinned to the latest record_date, memoized — a slow-changing
131
+ * reference read); else the `startDate/endDate` range. Optional `securityType`
132
+ * narrows by `security_type_desc` (e.g. "Marketable", "Non-marketable").
133
+ * `avg_interest_rate_amt` is a PERCENT, coerced via num() (null, never 0).
134
+ */
135
+ export declare function avgInterestRates(args: {
136
+ securityType?: string;
137
+ latest?: boolean;
138
+ startDate?: string;
139
+ endDate?: string;
140
+ pageSize?: number;
141
+ pageNumber?: number;
142
+ }): Promise<MetaBundle>;
143
+ //# sourceMappingURL=treasury.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"treasury.d.ts","sourceRoot":"","sources":["../src/treasury.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,436 @@
1
+ /**
2
+ * US Treasury — Fiscal Data API wrappers (keyless).
3
+ *
4
+ * First non-SAM macro/fiscal source (ADR-0002). Fully PUBLIC, KEYLESS — the
5
+ * Treasury Fiscal Data service (https://fiscaldata.treasury.gov) needs no API
6
+ * key and documents no numeric rate limit. Base:
7
+ * https://api.fiscaldata.treasury.gov/services/api/fiscal_service/
8
+ *
9
+ * Three clean layers (seed the future common DataSource port, R2):
10
+ * fetch — `getTreasury(path, query)` builds the URL + envelope, reusing
11
+ * errors.ts retry/timeout/taxonomy.
12
+ * map — per-dataset PURE mappers Row → domain object, coercing string
13
+ * amounts through the shared `num()`.
14
+ * meta — `treasuryMeta(...)` hands `{ totalAvailable, returned, pagination }`
15
+ * to `withMeta`; meta.ts's `buildMeta` DERIVES complete/truncated.
16
+ *
17
+ * HONESTY TRAPS (live-verified 2026-07-10 — see ADR-0002 Review outcome v2):
18
+ * F1/F9 — `meta.count` / `meta['total-count']` / `meta['total-pages']` are
19
+ * JSON NUMBERS (not strings). `totalAvailable = meta['total-count']`
20
+ * directly; never `num()` them.
21
+ * F2 — VALUE fields are inconsistently typed across datasets (debt/rate
22
+ * amounts are strings; even `rates_of_exchange.exchange_rate`, whose
23
+ * dataType metadata says NUMBER, arrives as a string on the wire).
24
+ * Row value fields are typed `string | number | null` and ALWAYS go
25
+ * through `num()`.
26
+ * F3 — `num(x)` returns null (NEVER 0) for absent values. The literal
27
+ * string "null" is common (early history + MTS parent/summary rows);
28
+ * returning 0 would be a data-absence-as-zero masquerade.
29
+ * F4 — `mts_table_1` mixes child line-items (real amounts) with
30
+ * fiscal-year PARENT/SUMMARY rows whose amounts are all "null".
31
+ * `monthlyStatement` excludes them by default via the LIVE-VERIFIED
32
+ * server-side filter `current_month_gross_outly_amt:gt:0` (3039 →
33
+ * 2769 rows; the 270 dropped rows are exactly the `parent_id="null"`
34
+ * header rows).
35
+ * F5 — `queryDataset` accepts only an ENUM of 5 confirmed paths (no free
36
+ * path) — removes the SSRF surface for this slice.
37
+ */
38
+ import { getJson, driftError, throughPathChain, CircuitBreaker, } from "./datasource.js";
39
+ import { snapshotPath } from "./snapshot.js";
40
+ import { num, str } from "./coerce.js";
41
+ import { memoize } from "./cache.js";
42
+ import { withMeta } from "./meta.js";
43
+ // Re-export the shared honesty coercion (single audited copy now lives in
44
+ // ./coerce.js — ADR-0005 v2 FIX-C) so existing importers and the fault suite's
45
+ // num-parity guard keep resolving `num` from this module.
46
+ export { num };
47
+ const BASE = "https://api.fiscaldata.treasury.gov/services/api/fiscal_service";
48
+ // ─── Resilience wiring (ADR-0045 Phase 2 pilot — INERT by default) ─────────
49
+ // The Treasury live host, and a per-host circuit breaker keyed on the FIXED set
50
+ // {this host} (bounded — m3-regression). The breaker is CONSULTED only by
51
+ // `throughPathChain` for a ≥2-path chain; when no snapshot is configured the
52
+ // chain is single-path (live only) and the breaker is a pure no-op. See
53
+ // datasource.ts §"RESILIENCE PORT".
54
+ const TREASURY_HOST = "api.fiscaldata.treasury.gov";
55
+ let treasuryBreaker = new CircuitBreaker([TREASURY_HOST]);
56
+ /**
57
+ * Test-only: reset the resilience circuit breaker between OFFLINE fixtures (the
58
+ * breaker is module-level process state; a fresh instance isolates cases). Not a
59
+ * runtime API — mirrors the `_reset*Cache` convention in the fault suite.
60
+ */
61
+ export function _resetTreasuryBreakerForTests() {
62
+ treasuryBreaker = new CircuitBreaker([TREASURY_HOST]);
63
+ }
64
+ // ─── Confirmed dataset paths (F5 allowlist enum) ──────────────────
65
+ // Live-verified 2026-07-10: path + total-count + key fields (ADR-0002 §Context).
66
+ export const TREASURY_DATASETS = {
67
+ debt_to_penny: "/v2/accounting/od/debt_to_penny",
68
+ avg_interest_rates: "/v2/accounting/od/avg_interest_rates",
69
+ mts_table_1: "/v1/accounting/mts/mts_table_1",
70
+ rates_of_exchange: "/v1/accounting/od/rates_of_exchange",
71
+ debt_outstanding: "/v2/accounting/od/debt_outstanding",
72
+ };
73
+ // ─── HONESTY-CRITICAL coercions (F1/F2/F3) ────────────────────────
74
+ // `num`/`str` are the shared, audited null-never-0 coercions in ./coerce.js
75
+ // (imported above, `num` re-exported). F3: `num` returns null (NEVER 0) for
76
+ // absent values — the literal string "null" (early history + MTS parent rows),
77
+ // ""/whitespace (Number("") is 0!), and "(-)"/"-" all become null.
78
+ // ─── fetch layer ──────────────────────────────────────────────────
79
+ /**
80
+ * GET one Treasury Fiscal Data page. Reuses errors.ts (retry/backoff/timeout +
81
+ * the 429/5xx/404/400 taxonomy: an invalid `fields`/`filter` column ⇒ upstream
82
+ * 400 ⇒ `invalid_input`, surfaced as an error, never a silent drop). Throws a
83
+ * `schema_drift` ToolErrorCarrier if the envelope's `total-count` is not a
84
+ * number (so a future upstream retype can't silently corrupt `_meta`).
85
+ */
86
+ async function getTreasury(path, query, snapshotKey) {
87
+ const params = new URLSearchParams();
88
+ if (query.fields)
89
+ params.set("fields", query.fields);
90
+ if (query.filter)
91
+ params.set("filter", query.filter);
92
+ if (query.sort)
93
+ params.set("sort", query.sort);
94
+ params.set("page[size]", String(query.pageSize));
95
+ params.set("page[number]", String(query.pageNumber));
96
+ const url = `${BASE}${path}?${params.toString()}`;
97
+ const label = "treasury:" + path;
98
+ // ★ADR-0045 Phase 2 pilot — route the fetch through `throughPathChain` INSTEAD
99
+ // of a bare getJson. The LIVE path is byte-identical to the prior hand-rolled
100
+ // fetch (init === { signal }, no headers/redirect — the same getJson call).
101
+ const livePath = {
102
+ host: TREASURY_HOST,
103
+ provenance: { dataPath: "live" },
104
+ run: () => getJson(url, { label }),
105
+ };
106
+ // The snapshot fallback is added ONLY when (a) this call declares a canned
107
+ // snapshot key AND (b) SAMGOV_SNAPSHOT_BASE_URL is configured (else
108
+ // snapshotPath returns null). ★When either is absent the chain is SINGLE-ENTRY
109
+ // (live only) ⇒ throughPathChain fast-paths (no breaker consult, no overhead)
110
+ // ⇒ behavior byte-identical to before this ADR (the INERT guarantee).
111
+ const snap = snapshotKey
112
+ ? snapshotPath(snapshotKey)
113
+ : null;
114
+ const paths = snap ? [livePath, snap] : [livePath];
115
+ const { body: env, provenance } = await throughPathChain(paths, treasuryBreaker);
116
+ // Drift guard applies to BOTH paths (a malformed snapshot fails as loudly as a
117
+ // malformed live body) — schema_drift is non-retryable, so it does not fall
118
+ // through nor trip the breaker.
119
+ if (!env ||
120
+ typeof env.meta !== "object" ||
121
+ env.meta === null ||
122
+ typeof env.meta["total-count"] !== "number" ||
123
+ !Array.isArray(env.data)) {
124
+ throw driftError(label, `treasury:${path} returned an unexpected envelope shape (meta['total-count'] must be a number and data an array).`);
125
+ }
126
+ return { env, provenance };
127
+ }
128
+ // ─── meta layer ───────────────────────────────────────────────────
129
+ const STRING_COERCION_NOTE = "Treasury value/amount fields arrive as strings (or, for some datasets, numbers) and are coerced via num(): the literal string \"null\" and empty values become null (NOT 0) — a null amount means 'no value reported', never zero.";
130
+ /**
131
+ * Build the partial `_meta`. Passes `totalAvailable` (= the numeric
132
+ * `total-count`, NEVER data.length/count/page-size) + offset-pagination, and
133
+ * lets meta.ts's `buildMeta` DERIVE `complete`/`truncated` from those signals
134
+ * (do NOT recompute here).
135
+ */
136
+ function treasuryMeta(opts) {
137
+ const totalAvailable = opts.env.meta["total-count"];
138
+ const returned = opts.env.data.length;
139
+ const offset = (opts.pageNumber - 1) * opts.pageSize;
140
+ const hasMore = offset + returned < totalAvailable;
141
+ const meta = {
142
+ source: `api.fiscaldata.treasury.gov (keyless) ${opts.path}`,
143
+ keylessMode: true,
144
+ returned,
145
+ totalAvailable,
146
+ pagination: {
147
+ offset,
148
+ limit: opts.pageSize,
149
+ hasMore,
150
+ nextOffset: hasMore ? offset + returned : null,
151
+ },
152
+ filtersApplied: opts.filtersApplied ?? [],
153
+ filtersDropped: [],
154
+ fieldsUnavailable: opts.fieldsUnavailable ?? [],
155
+ notes: opts.notes,
156
+ };
157
+ // P5 threading (ADR-0045 B2): surface dataPath/asOf ONLY when NON-live, so a
158
+ // live response omits the keys and stays byte-identical. No `??` default.
159
+ if (opts.provenance && opts.provenance.dataPath !== "live") {
160
+ meta.dataPath = opts.provenance.dataPath;
161
+ if (opts.provenance.asOf !== undefined)
162
+ meta.asOf = opts.provenance.asOf;
163
+ }
164
+ return meta;
165
+ }
166
+ /** Build `record_date` gte/lte filter clauses from optional ISO dates. */
167
+ function dateFilters(startDate, endDate) {
168
+ const f = [];
169
+ if (startDate)
170
+ f.push(`record_date:gte:${startDate}`);
171
+ if (endDate)
172
+ f.push(`record_date:lte:${endDate}`);
173
+ return f;
174
+ }
175
+ /** UTC "today minus N months" as YYYY-MM-DD, for trailing-window defaults. */
176
+ function isoMonthsAgo(months) {
177
+ const d = new Date();
178
+ d.setUTCMonth(d.getUTCMonth() - months);
179
+ return d.toISOString().slice(0, 10);
180
+ }
181
+ /**
182
+ * The most recent `record_date` for a dataset (memoized 5-min — slow-changing
183
+ * reference read). Used to pin the "latest" period for the per-date-breakdown
184
+ * datasets (avg_interest_rates) where a single-row page would bleed across
185
+ * months.
186
+ */
187
+ async function latestRecordDate(path) {
188
+ return memoize(`treasury:latestdate:${path}`, async () => {
189
+ const { env } = await getTreasury(path, {
190
+ fields: "record_date",
191
+ sort: "-record_date",
192
+ pageSize: 1,
193
+ pageNumber: 1,
194
+ });
195
+ return str(env.data[0]?.record_date);
196
+ });
197
+ }
198
+ // ─── Tool: queryDataset (escape hatch, F5 enum-only) ──────────────
199
+ /**
200
+ * Generic escape hatch over the 5 confirmed datasets (covers debt_outstanding +
201
+ * rates_of_exchange without a dedicated tool). Rows are passed through RAW
202
+ * (value fields as strings exactly as upstream provides) — the `_meta` note
203
+ * warns that the literal string "null" means "no value", never zero.
204
+ */
205
+ export async function queryDataset(args) {
206
+ const path = TREASURY_DATASETS[args.dataset];
207
+ const pageSize = args.pageSize ?? 100;
208
+ const pageNumber = args.pageNumber ?? 1;
209
+ const { env, provenance } = await getTreasury(path, {
210
+ fields: args.fields,
211
+ filter: args.filter,
212
+ sort: args.sort,
213
+ pageSize,
214
+ pageNumber,
215
+ });
216
+ const filtersApplied = [];
217
+ if (args.filter)
218
+ filtersApplied.push("filter");
219
+ if (args.fields)
220
+ filtersApplied.push("fields");
221
+ return withMeta({ dataset: args.dataset, path, rows: env.data }, treasuryMeta({
222
+ env,
223
+ path,
224
+ pageNumber,
225
+ pageSize,
226
+ filtersApplied,
227
+ provenance,
228
+ notes: [
229
+ "Raw pass-through: value/amount fields are the upstream strings (or numbers) verbatim — the literal string \"null\" or an empty value means 'no value reported', NOT zero. Parse client-side.",
230
+ ],
231
+ }));
232
+ }
233
+ // ─── Tool: debtToPenny ────────────────────────────────────────────
234
+ const DEBT_TO_PENNY_FIELDS = "record_date,tot_pub_debt_out_amt,debt_held_public_amt,intragov_hold_amt";
235
+ /**
236
+ * Daily total US public debt ("Debt to the Penny"). `latest` (default true) ⇒
237
+ * the single most-recent day; else the `startDate/endDate` range, newest first.
238
+ * Amounts are USD, coerced via num() (null, never 0, for absent).
239
+ */
240
+ export async function debtToPenny(args) {
241
+ const path = TREASURY_DATASETS.debt_to_penny;
242
+ const latest = args.latest ?? true;
243
+ const pageNumber = args.pageNumber ?? 1;
244
+ const pageSize = latest ? 1 : args.pageSize ?? 100;
245
+ const filter = latest
246
+ ? undefined
247
+ : dateFilters(args.startDate, args.endDate).join(",") || undefined;
248
+ // ★Snapshot fallback ONLY for the canned "latest" read (a single, well-defined
249
+ // most-recent-day snapshot the builder can pre-fetch). Range/paginated reads
250
+ // pass no key ⇒ live only. Even for latest, the snapshot is INERT unless
251
+ // SAMGOV_SNAPSHOT_BASE_URL is configured (snapshotPath returns null).
252
+ const snapshotKey = latest ? "treasury_debt_to_penny_latest" : undefined;
253
+ const { env, provenance } = await getTreasury(path, {
254
+ fields: DEBT_TO_PENNY_FIELDS,
255
+ filter,
256
+ sort: "-record_date",
257
+ pageSize,
258
+ pageNumber,
259
+ }, snapshotKey);
260
+ const data = {
261
+ records: env.data.map((r) => ({
262
+ recordDate: str(r.record_date),
263
+ totalPublicDebtOutstanding: num(r.tot_pub_debt_out_amt),
264
+ debtHeldByPublic: num(r.debt_held_public_amt),
265
+ intragovernmentalHoldings: num(r.intragov_hold_amt),
266
+ })),
267
+ };
268
+ const filtersApplied = [];
269
+ if (!latest && (args.startDate || args.endDate))
270
+ filtersApplied.push("recordDate");
271
+ return withMeta(data, treasuryMeta({
272
+ env,
273
+ path,
274
+ pageNumber,
275
+ pageSize,
276
+ filtersApplied,
277
+ provenance,
278
+ notes: [
279
+ latest
280
+ ? "latest=true returns only the single most-recent day (page[size]=1)."
281
+ : "Range mode: rows filtered by record_date, sorted newest-first.",
282
+ STRING_COERCION_NOTE,
283
+ ],
284
+ }));
285
+ }
286
+ // ─── Tool: monthlyStatement (MTS table 1) — F4 summary-row exclusion ──
287
+ const MTS_FIELDS = "record_date,classification_desc,parent_id,line_code_nbr,current_month_gross_rcpt_amt,current_month_gross_outly_amt,current_month_dfct_sur_amt";
288
+ /**
289
+ * Monthly Treasury Statement (MTS) table 1 — federal receipts, outlays, and the
290
+ * deficit/surplus by month. `startDate/endDate` (ISO) filter record_date;
291
+ * default is the trailing ~12 months.
292
+ *
293
+ * F4 — SUMMARY-ROW EXCLUSION (live-verified 2026-07-10): mts_table_1 interleaves
294
+ * child line-items (real amounts) with fiscal-year PARENT/SUMMARY header rows
295
+ * whose `parent_id` is the string "null" and whose amount fields are all the
296
+ * string "null". `excludeSummaryRows` (default true) appends the server-side
297
+ * filter `current_month_gross_outly_amt:gt:0`, which drops EXACTLY those parent
298
+ * rows (total-count 3039 → 2769; the 270 dropped rows == the parent_id="null"
299
+ * set). Because the exclusion is server-side, `total-count` (and hence
300
+ * `_meta.totalAvailable` / pagination) reflect the child rows only — no
301
+ * client-side filtering that would desync `returned` from the envelope count.
302
+ */
303
+ export async function monthlyStatement(args) {
304
+ const path = TREASURY_DATASETS.mts_table_1;
305
+ const excludeSummary = args.excludeSummaryRows ?? true;
306
+ const pageNumber = args.pageNumber ?? 1;
307
+ const pageSize = args.pageSize ?? 100;
308
+ // Default to the trailing ~12 months when no explicit window is given.
309
+ const startDate = args.startDate ?? (args.endDate ? undefined : isoMonthsAgo(12));
310
+ const filters = dateFilters(startDate, args.endDate);
311
+ if (excludeSummary)
312
+ filters.push("current_month_gross_outly_amt:gt:0");
313
+ const filter = filters.length ? filters.join(",") : undefined;
314
+ const { env, provenance } = await getTreasury(path, {
315
+ fields: MTS_FIELDS,
316
+ filter,
317
+ sort: "-record_date,line_code_nbr",
318
+ pageSize,
319
+ pageNumber,
320
+ });
321
+ const data = {
322
+ records: env.data.map((r) => ({
323
+ recordDate: str(r.record_date),
324
+ classification: str(r.classification_desc),
325
+ grossReceipts: num(r.current_month_gross_rcpt_amt),
326
+ grossOutlays: num(r.current_month_gross_outly_amt),
327
+ deficitSurplus: num(r.current_month_dfct_sur_amt),
328
+ })),
329
+ };
330
+ const filtersApplied = [];
331
+ if (startDate || args.endDate)
332
+ filtersApplied.push("recordDate");
333
+ if (excludeSummary)
334
+ filtersApplied.push("excludeSummaryRows");
335
+ const notes = [
336
+ excludeSummary
337
+ ? "Summary/parent rows excluded (default): the server-side filter current_month_gross_outly_amt:gt:0 drops the fiscal-year header rows (parent_id=\"null\", all amounts \"null\"). totalAvailable reflects child line-item rows only. Pass excludeSummaryRows=false to include them."
338
+ : "excludeSummaryRows=false: fiscal-year parent/summary rows (parent_id=\"null\") ARE included; their amount fields are all null — do NOT read those null-amount rows as data.",
339
+ STRING_COERCION_NOTE,
340
+ ];
341
+ return withMeta(data, treasuryMeta({
342
+ env,
343
+ path,
344
+ pageNumber,
345
+ pageSize,
346
+ filtersApplied,
347
+ notes,
348
+ provenance,
349
+ }));
350
+ }
351
+ // ─── Tool: avgInterestRates ───────────────────────────────────────
352
+ const AVG_INTEREST_FIELDS = "record_date,security_type_desc,security_desc,avg_interest_rate_amt";
353
+ /**
354
+ * Average interest rate the Treasury pays by security type/description.
355
+ * `latest` (default true) returns the most-recent month's full breakdown across
356
+ * security types (pinned to the latest record_date, memoized — a slow-changing
357
+ * reference read); else the `startDate/endDate` range. Optional `securityType`
358
+ * narrows by `security_type_desc` (e.g. "Marketable", "Non-marketable").
359
+ * `avg_interest_rate_amt` is a PERCENT, coerced via num() (null, never 0).
360
+ */
361
+ export async function avgInterestRates(args) {
362
+ const latest = args.latest ?? true;
363
+ if (latest) {
364
+ const key = `treasury:avg_interest_rates:latest:${args.securityType ?? "*"}`;
365
+ return memoize(key, () => avgInterestRatesLatest(args.securityType));
366
+ }
367
+ return avgInterestRatesQuery({
368
+ securityType: args.securityType,
369
+ startDate: args.startDate,
370
+ endDate: args.endDate,
371
+ pageSize: args.pageSize ?? 100,
372
+ pageNumber: args.pageNumber ?? 1,
373
+ latest: false,
374
+ });
375
+ }
376
+ async function avgInterestRatesLatest(securityType) {
377
+ const path = TREASURY_DATASETS.avg_interest_rates;
378
+ const maxDate = await latestRecordDate(path);
379
+ return avgInterestRatesQuery({
380
+ securityType,
381
+ startDate: maxDate ?? undefined,
382
+ endDate: maxDate ?? undefined,
383
+ pageSize: 100,
384
+ pageNumber: 1,
385
+ latest: true,
386
+ latestDate: maxDate,
387
+ });
388
+ }
389
+ async function avgInterestRatesQuery(opts) {
390
+ const path = TREASURY_DATASETS.avg_interest_rates;
391
+ const filters = dateFilters(opts.startDate, opts.endDate);
392
+ if (opts.securityType) {
393
+ filters.push(`security_type_desc:eq:${opts.securityType}`);
394
+ }
395
+ const filter = filters.length ? filters.join(",") : undefined;
396
+ const { env, provenance } = await getTreasury(path, {
397
+ fields: AVG_INTEREST_FIELDS,
398
+ filter,
399
+ sort: "-record_date,security_type_desc",
400
+ pageSize: opts.pageSize,
401
+ pageNumber: opts.pageNumber,
402
+ });
403
+ const data = {
404
+ records: env.data.map((r) => ({
405
+ recordDate: str(r.record_date),
406
+ securityType: str(r.security_type_desc),
407
+ securityDescription: str(r.security_desc),
408
+ avgInterestRatePercent: num(r.avg_interest_rate_amt),
409
+ })),
410
+ };
411
+ const filtersApplied = [];
412
+ if (opts.startDate || opts.endDate)
413
+ filtersApplied.push("recordDate");
414
+ if (opts.securityType)
415
+ filtersApplied.push("securityType");
416
+ const notes = [];
417
+ if (opts.latest) {
418
+ notes.push(opts.latestDate
419
+ ? `latest=true: pinned to the most-recent record_date (${opts.latestDate}); served from a 5-minute TTL cache.`
420
+ : "latest=true: could not resolve the most-recent record_date (upstream returned no rows).");
421
+ }
422
+ else {
423
+ notes.push("Range mode: rows filtered by record_date, sorted newest-first.");
424
+ }
425
+ notes.push(STRING_COERCION_NOTE);
426
+ return withMeta(data, treasuryMeta({
427
+ env,
428
+ path,
429
+ pageNumber: opts.pageNumber,
430
+ pageSize: opts.pageSize,
431
+ filtersApplied,
432
+ notes,
433
+ provenance,
434
+ }));
435
+ }
436
+ //# sourceMappingURL=treasury.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"treasury.js","sourceRoot":"","sources":["../src/treasury.ts"],"names":[],"mappings":"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"}