@cyanheads/congressgov-mcp-server 0.7.1 → 0.7.3

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 (47) hide show
  1. package/AGENTS.md +20 -15
  2. package/CLAUDE.md +20 -15
  3. package/Dockerfile +23 -10
  4. package/README.md +90 -93
  5. package/changelog/0.7.x/0.7.2.md +20 -0
  6. package/changelog/0.7.x/0.7.3.md +36 -0
  7. package/dist/mcp-server/tools/definitions/bill-lookup.tool.d.ts +5 -4
  8. package/dist/mcp-server/tools/definitions/bill-lookup.tool.d.ts.map +1 -1
  9. package/dist/mcp-server/tools/definitions/bill-lookup.tool.js +93 -2
  10. package/dist/mcp-server/tools/definitions/bill-lookup.tool.js.map +1 -1
  11. package/dist/mcp-server/tools/definitions/bill-summaries.tool.d.ts.map +1 -1
  12. package/dist/mcp-server/tools/definitions/bill-summaries.tool.js +32 -4
  13. package/dist/mcp-server/tools/definitions/bill-summaries.tool.js.map +1 -1
  14. package/dist/mcp-server/tools/definitions/committee-reports.tool.d.ts +2 -2
  15. package/dist/mcp-server/tools/definitions/daily-record.tool.d.ts +2 -2
  16. package/dist/mcp-server/tools/format-helpers.d.ts.map +1 -1
  17. package/dist/mcp-server/tools/format-helpers.js +85 -30
  18. package/dist/mcp-server/tools/format-helpers.js.map +1 -1
  19. package/dist/mcp-server/tools/summary-window.d.ts +112 -0
  20. package/dist/mcp-server/tools/summary-window.d.ts.map +1 -0
  21. package/dist/mcp-server/tools/summary-window.js +182 -0
  22. package/dist/mcp-server/tools/summary-window.js.map +1 -0
  23. package/dist/mcp-server/tools/tool-helpers.d.ts +21 -4
  24. package/dist/mcp-server/tools/tool-helpers.d.ts.map +1 -1
  25. package/dist/mcp-server/tools/tool-helpers.js +21 -4
  26. package/dist/mcp-server/tools/tool-helpers.js.map +1 -1
  27. package/dist/services/congress-documents/extract-text-stream.js +1 -1
  28. package/dist/services/congress-documents/extract-text-stream.js.map +1 -1
  29. package/dist/services/congress-documents/extract-text.d.ts +0 -6
  30. package/dist/services/congress-documents/extract-text.d.ts.map +1 -1
  31. package/dist/services/congress-documents/extract-text.js +4 -37
  32. package/dist/services/congress-documents/extract-text.js.map +1 -1
  33. package/dist/services/congress-mirror/normalize.d.ts +4 -1
  34. package/dist/services/congress-mirror/normalize.d.ts.map +1 -1
  35. package/dist/services/congress-mirror/normalize.js +8 -12
  36. package/dist/services/congress-mirror/normalize.js.map +1 -1
  37. package/dist/services/senate-lis/parse.d.ts.map +1 -1
  38. package/dist/services/senate-lis/parse.js +74 -2
  39. package/dist/services/senate-lis/parse.js.map +1 -1
  40. package/dist/services/senate-lis/types.d.ts +8 -1
  41. package/dist/services/senate-lis/types.d.ts.map +1 -1
  42. package/dist/utils/character-references.d.ts +27 -0
  43. package/dist/utils/character-references.d.ts.map +1 -0
  44. package/dist/utils/character-references.js +60 -0
  45. package/dist/utils/character-references.js.map +1 -0
  46. package/package.json +7 -6
  47. package/server.json +3 -3
@@ -5,7 +5,8 @@
5
5
  import { tool, z } from '@cyanheads/mcp-ts-core';
6
6
  import { validationError } from '@cyanheads/mcp-ts-core/errors';
7
7
  import { formatBills } from '../format-helpers.js';
8
- import { buildEffectiveQuery, congressErrorContracts, documentErrorContracts, documentWindowInput, listEnrichment, listOrDetail, normalizeOptionalString, notifyIfNoMatches, numericIdentifier, toIdentifierNumber, validateDateTimeRange, validateIsoDateTime, } from '../tool-helpers.js';
8
+ import { summaryContinuationCall, summaryWindowNotice, windowSummaryPage, } from '../summary-window.js';
9
+ import { buildEffectiveQuery, congressErrorContracts, documentErrorContracts, documentWindowInput, listEnrichment, listOrDetail, MAX_CONTENT_CHARACTERS, normalizeOptionalString, notifyIfNoMatches, numericIdentifier, toIdentifierNumber, validateDateTimeRange, validateIsoDateTime, } from '../tool-helpers.js';
9
10
  import { getCongressApi } from '../../../services/congress-api/congress-api-service.js';
10
11
  import { BILL_TYPE_CODES } from '../../../services/congress-api/types.js';
11
12
  import { getCongressDocuments } from '../../../services/congress-documents/congress-documents-service.js';
@@ -30,7 +31,7 @@ const SUB_RESOURCE_MAP = {
30
31
  };
31
32
  export const billLookupTool = tool('congressgov_bill_lookup', {
32
33
  title: 'Congress.gov Bill Lookup',
33
- description: `Browse and retrieve U.S. legislative bill data from Congress.gov. Discover bills by filtering on congress, bill type, and date range — there is no keyword search. Use 'list' to browse (requires congress, defaults to most-recently-updated first), 'get' for full bill detail (sponsor, policy area, CBO estimates, law info), or drill into a specific bill with 'actions', 'amendments', 'cosponsors', 'committees', 'subjects', 'summaries', 'text', 'titles', or 'related' (each requires congress + billType + billNumber). 'text' lists the published versions and their format URLs; 'content' then reads one version's actual text, a bounded character window at a time.`,
34
+ description: `Browse and retrieve U.S. legislative bill data from Congress.gov. Discover bills by filtering on congress, bill type, and date range — there is no keyword search. Use 'list' to browse (requires congress, defaults to most-recently-updated first), 'get' for full bill detail (sponsor, policy area, CBO estimates, law info), or drill into a specific bill with 'actions', 'amendments', 'cosponsors', 'committees', 'subjects', 'summaries', 'text', 'titles', or 'related' (each requires congress + billType + billNumber). 'text' lists the published versions and their format URLs; 'content' then reads one version's actual text, a bounded character window at a time. 'summaries' takes an optional versionCode selector and returns each row's text a bounded character window at a time — a row past the window carries textTotalCharacters/textTruncated/textNextOffset, and characterOffset reads on from there.`,
34
35
  annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: true },
35
36
  errors: [...congressErrorContracts, ...documentErrorContracts],
36
37
  input: z.object({
@@ -58,7 +59,13 @@ export const billLookupTool = tool('congressgov_bill_lookup', {
58
59
  .min(0)
59
60
  .default(0)
60
61
  .describe("Which text version 'content' reads, 0-based against the same order 'text' returns — 0 is the most recent version. Ignored by other operations."),
62
+ versionCode: z
63
+ .string()
64
+ .optional()
65
+ .describe("Which summary version 'summaries' returns — the versionCode a summary row carries ('00' introduced, '49' public law). Selection runs over the bill's whole summary list, which Congress.gov publishes no filter for, and limit/offset then page the matching rows. Omit to return every version. Ignored by other operations."),
61
66
  ...documentWindowInput,
67
+ characterOffset: documentWindowInput.characterOffset.describe("First character to return, 0-based — of the document on 'content', and of every returned row's summary text on 'summaries'. Offsets are exact and are never snapped to a section or paragraph break, so feeding back the response's nextOffset (or a summary row's textNextOffset) walks the whole text with every character returned exactly once."),
68
+ characterLimit: documentWindowInput.characterLimit.describe(`Maximum characters to return (1-${MAX_CONTENT_CHARACTERS}) — for the document window on 'content', and for each row's summary text on 'summaries'. Legislative documents run past a million characters and an enacted bill's summary past two hundred thousand, so either takes several windows.`),
62
69
  }),
63
70
  output: listOrDetail({ bill: 'record', content: 'record' }, "Bill record (sponsor, policy area, latest action, CBO estimates, law citation) for `get`; absent for `list` and sub-resources. For `content`, an alternative key 'content' carries {text, format, sourceUrl, documentTitle, totalCharacters, offset, truncated, nextOffset} — one exact character window of the document."),
64
71
  enrichment: listEnrichment,
@@ -167,6 +174,90 @@ export const billLookupTool = tool('congressgov_bill_lookup', {
167
174
  },
168
175
  };
169
176
  }
177
+ if (input.operation === 'summaries') {
178
+ /** Narrowed above; a closure below reads it, where the narrowing is lost. */
179
+ const billType = input.billType;
180
+ const versionCode = normalizeOptionalString(input.versionCode);
181
+ /**
182
+ * Congress.gov publishes no version filter on the summaries sub-resource,
183
+ * so a selection reads the bill's whole list — the API's own page ceiling
184
+ * — and matches client-side. Without one the caller's own page is fetched
185
+ * unchanged.
186
+ */
187
+ const result = await api.getBillSubResource({
188
+ congress: input.congress,
189
+ billType: input.billType,
190
+ billNumber,
191
+ subResource: 'summaries',
192
+ limit: versionCode ? 250 : input.limit,
193
+ offset: versionCode ? 0 : input.offset,
194
+ }, ctx);
195
+ let page = result;
196
+ if (versionCode) {
197
+ const matched = result.data.filter((row) => row.versionCode === versionCode);
198
+ const selected = matched.slice(input.offset, input.offset + input.limit);
199
+ page = {
200
+ ...result,
201
+ data: selected,
202
+ pagination: {
203
+ count: matched.length,
204
+ nextOffset: input.offset + selected.length < matched.length
205
+ ? input.offset + selected.length
206
+ : null,
207
+ },
208
+ };
209
+ }
210
+ const bounded = windowSummaryPage(page, {
211
+ offset: input.offset,
212
+ characterOffset: input.characterOffset,
213
+ characterLimit: input.characterLimit,
214
+ });
215
+ if (bounded.offsetPastEnd) {
216
+ throw ctx.fail('offset_past_end', `characterOffset ${input.characterOffset} is at or past the end of every summary returned for ${input.billType.toUpperCase()} ${billNumber}.`, {
217
+ ...ctx.recoveryFor('offset_past_end'),
218
+ characterOffset: input.characterOffset,
219
+ versionCode,
220
+ });
221
+ }
222
+ ctx.log.info('Bill summaries retrieved', {
223
+ congress: input.congress,
224
+ billType: input.billType,
225
+ billNumber,
226
+ versionCode,
227
+ count: bounded.page.data.length,
228
+ droppedRows: bounded.droppedRows,
229
+ windowedRows: bounded.windowed.length,
230
+ });
231
+ ctx.enrich.echo(buildEffectiveQuery(`summaries for ${input.billType.toUpperCase()} ${billNumber} in the ${input.congress}th Congress`, { versionCode }));
232
+ ctx.enrich.total(bounded.page.pagination.count);
233
+ /**
234
+ * `count` is the matched-row total, so gating on it says "no such version"
235
+ * only when there is none — a page whose own offset ran past the matching
236
+ * rows renders as past-the-end, the same split `notifyIfNoMatches` keeps.
237
+ */
238
+ if (versionCode && bounded.page.pagination.count === 0) {
239
+ const available = [
240
+ ...new Set(result.data
241
+ .map((row) => row.versionCode)
242
+ .filter((code) => typeof code === 'string')),
243
+ ];
244
+ ctx.enrich.notice(`No summary with versionCode '${versionCode}' for ${input.billType.toUpperCase()} ${billNumber}.${available.length > 0
245
+ ? ` Versions published: ${available.join(', ')}.`
246
+ : ' Congress.gov publishes no summaries for this bill.'}`);
247
+ return bounded.page;
248
+ }
249
+ notifyIfNoMatches(ctx, bounded.page, `No summaries found for ${input.billType.toUpperCase()} ${billNumber}.`);
250
+ const notice = summaryWindowNotice(bounded, input.limit, (row) => summaryContinuationCall({
251
+ congress: input.congress,
252
+ billType,
253
+ billNumber,
254
+ versionCode: typeof row.row.versionCode === 'string' ? row.row.versionCode : versionCode,
255
+ characterOffset: row.nextOffset ?? 0,
256
+ }));
257
+ if (notice)
258
+ ctx.enrich.notice(notice);
259
+ return bounded.page;
260
+ }
170
261
  const subResource = SUB_RESOURCE_MAP[input.operation] ?? input.operation;
171
262
  const result = await api.getBillSubResource({
172
263
  congress: input.congress,
@@ -1 +1 @@
1
- {"version":3,"file":"bill-lookup.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/bill-lookup.tool.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bill-lookup.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/bill-lookup.tool.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"bill-summaries.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/bill-summaries.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AAmBjD,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAyF5B,CAAC"}
1
+ {"version":3,"file":"bill-summaries.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/bill-summaries.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AAwBjD,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmH5B,CAAC"}
@@ -5,13 +5,14 @@
5
5
  import { tool, z } from '@cyanheads/mcp-ts-core';
6
6
  import { validationError } from '@cyanheads/mcp-ts-core/errors';
7
7
  import { formatSummaries } from '../format-helpers.js';
8
+ import { summaryContinuationCall, summaryWindowNotice, windowSummaryPage, } from '../summary-window.js';
8
9
  import { buildEffectiveQuery, congressErrorContracts, listEnrichment, listOutput, normalizeOptionalString, notifyIfNoMatches, validateDateTimeRange, validateIsoDateTime, } from '../tool-helpers.js';
9
10
  import { getCongressApi } from '../../../services/congress-api/congress-api-service.js';
10
11
  import { BILL_TYPE_CODES } from '../../../services/congress-api/types.js';
11
12
  const DEFAULT_LOOKBACK_MS = 7 * 24 * 60 * 60 * 1000;
12
13
  export const billSummariesTool = tool('congressgov_bill_summaries', {
13
14
  title: 'Congress.gov Bill Summaries',
14
- description: `Browse recent CRS (Congressional Research Service) bill summaries — plain-language summaries of bills at each legislative stage, useful for answering "what's happening in Congress?". The fromDateTime/toDateTime filters apply to the summary's update time, not the bill's action date, so results include recently rewritten summaries of older bills. Defaults to summaries updated in the last 7 days. Each item shows both the bill's action date and the summary update date. For summaries of one specific bill, use congressgov_bill_lookup with operation='summaries' instead.`,
15
+ description: `Browse recent CRS (Congressional Research Service) bill summaries — plain-language summaries of bills at each legislative stage, useful for answering "what's happening in Congress?". The fromDateTime/toDateTime filters apply to the summary's update time, not the bill's action date, so results include recently rewritten summaries of older bills. Defaults to summaries updated in the last 7 days. Each item shows both the bill's action date and the summary update date. A page stops adding rows once it reaches a fixed response-character budget, and a summary longer than the per-row window arrives as an exact character window carrying textTotalCharacters/textTruncated/textNextOffset; pagination.nextOffset continues the page and a row's textNextOffset continues its text. For summaries of one specific bill — and to read a windowed summary to the end — use congressgov_bill_lookup with operation='summaries' instead.`,
15
16
  annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: true },
16
17
  errors: congressErrorContracts,
17
18
  input: z.object({
@@ -59,7 +60,12 @@ export const billSummariesTool = tool('congressgov_bill_summaries', {
59
60
  limit: input.limit,
60
61
  offset: input.offset,
61
62
  }, ctx);
62
- ctx.log.info('Summaries listed', { count: result.data.length });
63
+ const bounded = windowSummaryPage(result, { offset: input.offset });
64
+ ctx.log.info('Summaries listed', {
65
+ count: bounded.page.data.length,
66
+ droppedRows: bounded.droppedRows,
67
+ windowedRows: bounded.windowed.length,
68
+ });
63
69
  ctx.enrich.echo(buildEffectiveQuery('bill summaries', {
64
70
  congress: input.congress,
65
71
  billType: input.billType,
@@ -67,8 +73,30 @@ export const billSummariesTool = tool('congressgov_bill_summaries', {
67
73
  toDateTime: toDateTimeInput,
68
74
  }));
69
75
  ctx.enrich.total(result.pagination.count);
70
- notifyIfNoMatches(ctx, result, 'No summaries found. Try broadening the date range or removing billType/congress filters.');
71
- return result;
76
+ notifyIfNoMatches(ctx, bounded.page, 'No summaries found. Try broadening the date range or removing billType/congress filters.');
77
+ /**
78
+ * A windowed row's continuation is a single-bill call, so it names the bill
79
+ * the row itself carries — `bill.type` arrives upper-cased upstream and the
80
+ * builder lower-cases it to the code the input enum takes.
81
+ */
82
+ const notice = summaryWindowNotice(bounded, input.limit, (row) => {
83
+ const bill = row.row.bill;
84
+ if (!bill || typeof bill !== 'object' || Array.isArray(bill))
85
+ return;
86
+ const { congress, type, number } = bill;
87
+ if (congress == null || type == null || number == null)
88
+ return;
89
+ return summaryContinuationCall({
90
+ congress: Number(congress),
91
+ billType: String(type),
92
+ billNumber: String(number),
93
+ versionCode: typeof row.row.versionCode === 'string' ? row.row.versionCode : undefined,
94
+ characterOffset: row.nextOffset ?? 0,
95
+ });
96
+ });
97
+ if (notice)
98
+ ctx.enrich.notice(notice);
99
+ return bounded.page;
72
100
  },
73
101
  });
74
102
  //# sourceMappingURL=bill-summaries.tool.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"bill-summaries.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/bill-summaries.tool.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bill-summaries.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/bill-summaries.tool.ts"],"names":[],"mappings":"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"}
@@ -93,8 +93,8 @@ export declare const committeeReportsTool: import("@cyanheads/mcp-ts-core").Tool
93
93
  readonly reason: 'offset_past_end';
94
94
  readonly thrownBy: 'service';
95
95
  readonly retryable: false;
96
- readonly when: 'characterOffset is at or beyond the last character of the document, so the window would be empty.';
97
- readonly recovery: 'Restart the walk at characterOffset 0 and follow nextOffset, which goes null once the document has been read to the end.';
96
+ readonly when: "characterOffset is at or beyond the last character of every text the call would window — the document on 'content', or every returned row's summary text on 'summaries' — so the window would be empty.";
97
+ readonly recovery: "Restart the walk at characterOffset 0 and follow the response's nextOffset (or a summary row's textNextOffset), which goes null once the text has been read to the end.";
98
98
  }], {
99
99
  effectiveQuery: z.ZodString;
100
100
  totalCount: z.ZodNumber;
@@ -87,8 +87,8 @@ export declare const dailyRecordTool: import("@cyanheads/mcp-ts-core").ToolDefin
87
87
  readonly reason: 'offset_past_end';
88
88
  readonly thrownBy: 'service';
89
89
  readonly retryable: false;
90
- readonly when: 'characterOffset is at or beyond the last character of the document, so the window would be empty.';
91
- readonly recovery: 'Restart the walk at characterOffset 0 and follow nextOffset, which goes null once the document has been read to the end.';
90
+ readonly when: "characterOffset is at or beyond the last character of every text the call would window — the document on 'content', or every returned row's summary text on 'summaries' — so the window would be empty.";
91
+ readonly recovery: "Restart the walk at characterOffset 0 and follow the response's nextOffset (or a summary row's textNextOffset), which goes null once the text has been read to the end.";
92
92
  }], {
93
93
  effectiveQuery: z.ZodString;
94
94
  totalCount: z.ZodNumber;
@@ -1 +1 @@
1
- {"version":3,"file":"format-helpers.d.ts","sourceRoot":"","sources":["../../../src/mcp-server/tools/format-helpers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,KAAK,SAAS,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAw2DhD,sFAAsF;AACtF,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EAAE,CAYxE;AAwCD,2DAA2D;AAC3D,eAAO,MAAM,eAAe,WAvEhB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,SAAS,EAuEkB,CAAC;AA8CpE,qDAAqD;AACrD,eAAO,MAAM,iBAAiB,WAtHlB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,SAAS,EAsHuB,CAAC;AAEzE,oEAAoE;AACpE,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EAAE,CAoB1E;AAWD,iFAAiF;AACjF,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EAAE,CAkB7E;AAED,kDAAkD;AAClD,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EAAE,CAWnF;AAED,mCAAmC;AACnC,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EAAE,CAK7E;AAED,4FAA4F;AAC5F,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EAAE,CAc9E;AAED,8FAA8F;AAC9F,eAAO,MAAM,UAAU,WArNX,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,SAAS,EAqNiC,CAAC;AAEnF;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EAAE,CAcxE;AAED,iEAAiE;AACjE,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EAAE,CAa9E"}
1
+ {"version":3,"file":"format-helpers.d.ts","sourceRoot":"","sources":["../../../src/mcp-server/tools/format-helpers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAIH,KAAK,SAAS,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AA45DhD,sFAAsF;AACtF,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EAAE,CAYxE;AAgDD,2DAA2D;AAC3D,eAAO,MAAM,eAAe,WA/EhB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,SAAS,EA+EkB,CAAC;AA8CpE,qDAAqD;AACrD,eAAO,MAAM,iBAAiB,WA9HlB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,SAAS,EA8HuB,CAAC;AAEzE,oEAAoE;AACpE,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EAAE,CAoB1E;AAWD,iFAAiF;AACjF,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EAAE,CAkB7E;AAED,kDAAkD;AAClD,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EAAE,CAWnF;AAED,mCAAmC;AACnC,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EAAE,CAK7E;AAED,4FAA4F;AAC5F,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EAAE,CAc9E;AAED,8FAA8F;AAC9F,eAAO,MAAM,UAAU,WA7NX,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,SAAS,EA6NiC,CAAC;AAEnF;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EAAE,CAcxE;AAED,iEAAiE;AACjE,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EAAE,CAa9E"}
@@ -26,6 +26,12 @@
26
26
  *
27
27
  * @module mcp-server/tools/format-helpers
28
28
  */
29
+ import { decodeCharacterReferences } from '../../utils/character-references.js';
30
+ /**
31
+ * Horizontal whitespace at this surface: spaces, tabs, and the literal U+00A0 in
32
+ * the class — what a decoded `&nbsp;` leaves behind, and ordinary spacing here.
33
+ */
34
+ const HORIZONTAL_WHITESPACE_RE = /[ \t ]+/g;
29
35
  // ── Primitives ──────────────────────────────────────────────────────
30
36
  function tb(content) {
31
37
  return [{ type: 'text', text: content }];
@@ -39,30 +45,35 @@ function preserveHtmlBlockBoundaries(html) {
39
45
  .replace(/<\s*\/\s*li\s*>/gi, '\n')
40
46
  .replace(/<\s*\/\s*(?:p|ul|ol)\s*>/gi, '\n\n');
41
47
  }
48
+ /**
49
+ * Collapse horizontal whitespace and blank-line runs, keeping the paragraph and
50
+ * line structure a block rendering carries.
51
+ */
52
+ function normalizeBlockWhitespace(text) {
53
+ return text
54
+ .replace(HORIZONTAL_WHITESPACE_RE, ' ')
55
+ .replace(/\n[ \t]+/g, '\n')
56
+ .replace(/[ \t]+\n/g, '\n')
57
+ .replace(/\n{3,}/g, '\n\n')
58
+ .trim();
59
+ }
42
60
  /**
43
61
  * Strip HTML to plain text while preserving paragraph and line breaks. Upstream
44
62
  * summary fields and other narrative bodies ship as HTML; we want the visible
45
63
  * structure (paragraph boundaries) to survive into the rendered Markdown.
46
64
  *
65
+ * Character references decode in one pass once the tags are gone, so text that
66
+ * literally says `&amp;lt;` reads as `&lt;` and not as a tag it never contained.
67
+ * A decoded `&nbsp;` is ordinary spacing at this surface, so it collapses with
68
+ * the rest of the horizontal whitespace.
69
+ *
47
70
  * Inline contexts that need single-line output should pass `{ inline: true }`.
48
71
  */
49
72
  function stripHtml(html, { inline = false } = {}) {
50
- const text = preserveHtmlBlockBoundaries(html)
51
- .replace(/<[^>]*>/g, '')
52
- .replace(/&nbsp;/g, ' ')
53
- .replace(/&#039;/g, "'")
54
- .replace(/&amp;/g, '&')
55
- .replace(/&lt;/g, '<')
56
- .replace(/&gt;/g, '>')
57
- .replace(/&quot;/g, '"');
73
+ const text = decodeCharacterReferences(preserveHtmlBlockBoundaries(html).replace(/<[^>]*>/g, ''));
58
74
  if (inline)
59
75
  return text.replace(/\s+/g, ' ').trim();
60
- return text
61
- .replace(/[ \t]+/g, ' ')
62
- .replace(/\n[ \t]+/g, '\n')
63
- .replace(/[ \t]+\n/g, '\n')
64
- .replace(/\n{3,}/g, '\n\n')
65
- .trim();
76
+ return normalizeBlockWhitespace(text);
66
77
  }
67
78
  /**
68
79
  * Wrap an emphasis span's content in Markdown markers with the span's own
@@ -92,23 +103,13 @@ function wrapEmphasis(inner, marker) {
92
103
  * through to the generic strip instead of leaving a stray marker.
93
104
  */
94
105
  function htmlToMarkdown(html) {
95
- return preserveHtmlBlockBoundaries(html)
106
+ const markup = preserveHtmlBlockBoundaries(html)
96
107
  .replace(/<\s*p[^>]*>/gi, '')
97
108
  .replace(/<\s*(?:strong|b)\s*>([\s\S]*?)<\s*\/\s*(?:strong|b)\s*>/gi, (_m, inner) => wrapEmphasis(inner, '**'))
98
109
  .replace(/<\s*(?:em|i)\s*>([\s\S]*?)<\s*\/\s*(?:em|i)\s*>/gi, (_m, inner) => wrapEmphasis(inner, '*'))
99
110
  .replace(/<\s*a[^>]*href=["']([^"']*)["'][^>]*>([\s\S]*?)<\s*\/\s*a\s*>/gi, '[$2]($1)')
100
- .replace(/<[^>]*>/g, '')
101
- .replace(/&nbsp;/g, ' ')
102
- .replace(/&#039;/g, "'")
103
- .replace(/&amp;/g, '&')
104
- .replace(/&lt;/g, '<')
105
- .replace(/&gt;/g, '>')
106
- .replace(/&quot;/g, '"')
107
- .replace(/[ \t]+/g, ' ')
108
- .replace(/\n[ \t]+/g, '\n')
109
- .replace(/[ \t]+\n/g, '\n')
110
- .replace(/\n{3,}/g, '\n\n')
111
- .trim();
111
+ .replace(/<[^>]*>/g, '');
112
+ return normalizeBlockWhitespace(decodeCharacterReferences(markup));
112
113
  }
113
114
  /** Safe deep access for compact field display — collapses whitespace to a single line. */
114
115
  function s(obj, ...path) {
@@ -530,6 +531,36 @@ const MEMBER_ROW_KEYS = new Set([
530
531
  'district',
531
532
  'url',
532
533
  ]);
534
+ /**
535
+ * Window metadata a bounded summary row carries. Both summary renderers show it
536
+ * as one curated line, so it stays out of their fall-through key sets.
537
+ */
538
+ const SUMMARY_WINDOW_KEYS = ['textTotalCharacters', 'textTruncated', 'textNextOffset'];
539
+ /**
540
+ * The window line a row gains once its `text` was bounded — absent on a row
541
+ * returned whole, which is what keeps an unbounded page's rendering unchanged.
542
+ *
543
+ * The row publishes the total and the next offset; this window's own start is
544
+ * derived from the text it returned, the same way the vote roster derives its
545
+ * range — `textNextOffset` is one past the last character returned.
546
+ */
547
+ function summaryWindowLine(item) {
548
+ const total = item.textTotalCharacters;
549
+ if (typeof total !== 'number')
550
+ return;
551
+ const text = typeof item.text === 'string' ? item.text : '';
552
+ const nextOffset = typeof item.textNextOffset === 'number' ? item.textNextOffset : null;
553
+ if (text.length === 0) {
554
+ return `**Summary text:** 0 of ${total.toLocaleString('en-US')} characters — characterOffset is past this summary's end`;
555
+ }
556
+ const end = nextOffset ?? total;
557
+ const start = end - text.length;
558
+ return join([
559
+ `**Summary text:** characters ${(start + 1).toLocaleString('en-US')}–${end.toLocaleString('en-US')} of ${total.toLocaleString('en-US')}`,
560
+ `**Truncated:** ${item.textTruncated === true}`,
561
+ nextOffset != null ? `next characterOffset: ${nextOffset}` : '_end of summary_',
562
+ ]);
563
+ }
533
564
  function renderSummaryItem(item, i) {
534
565
  const named = new Set(SUMMARY_ROW_KEYS);
535
566
  const billType = s(item, 'bill', 'type')?.toUpperCase() ?? '';
@@ -557,6 +588,9 @@ function renderSummaryItem(item, i) {
557
588
  lines.push(bill && typeof bill === 'object' && !Array.isArray(bill)
558
589
  ? withUnnamedFields(bill, billLine, BILL_REF_KEYS)
559
590
  : billLine);
591
+ const window = summaryWindowLine(item);
592
+ if (window)
593
+ lines.push(window);
560
594
  // The summary text is the critical data — the whole point of this tool
561
595
  lines.push('');
562
596
  lines.push(text || '_Summary text not available._');
@@ -565,7 +599,7 @@ function renderSummaryItem(item, i) {
565
599
  return withRowRest(item, lines, named);
566
600
  }
567
601
  /** `actionDesc`/`versionCode` and the two update dates are resolved by `pick`. */
568
- const SUMMARY_ROW_KEYS = ['actionDate', 'text', 'url', 'bill'];
602
+ const SUMMARY_ROW_KEYS = ['actionDate', 'text', 'url', 'bill', ...SUMMARY_WINDOW_KEYS];
569
603
  /** Fields of a summary row's nested bill reference the heading already renders. */
570
604
  const BILL_REF_KEYS = new Set(['congress', 'type', 'number', 'title', 'url']);
571
605
  function renderCrsReportItem(item, i) {
@@ -1204,7 +1238,7 @@ function renderSenateVoteItem(item, i) {
1204
1238
  if (question)
1205
1239
  lines.push(`**Question:** ${measure ? `${question} (${measure})` : question}`);
1206
1240
  const meta = join([
1207
- f('Date', s(item, 'voteDate')),
1241
+ f('Date', senateVoteDate(item)),
1208
1242
  f('Yeas', s(item, 'yeas')),
1209
1243
  f('Nays', s(item, 'nays')),
1210
1244
  ]);
@@ -1215,6 +1249,18 @@ function renderSenateVoteItem(item, i) {
1215
1249
  lines.push(title);
1216
1250
  return withRowRest(item, lines, SENATE_VOTE_ROW_KEYS);
1217
1251
  }
1252
+ /**
1253
+ * The resolved calendar date leads, with the menu's own year-less short form
1254
+ * beside it — a row carries both, and the short form is what the Senate's own
1255
+ * vote pages show.
1256
+ */
1257
+ function senateVoteDate(item) {
1258
+ const iso = s(item, 'voteDateIso');
1259
+ const published = s(item, 'voteDate');
1260
+ if (iso && published)
1261
+ return `${iso} (${published})`;
1262
+ return iso ?? published;
1263
+ }
1218
1264
  /** `chamber` is the dispatch marker, implicit in the Senate heading. */
1219
1265
  const SENATE_VOTE_ROW_KEYS = new Set([
1220
1266
  'chamber',
@@ -1224,6 +1270,7 @@ const SENATE_VOTE_ROW_KEYS = new Set([
1224
1270
  'question',
1225
1271
  'measure',
1226
1272
  'voteDate',
1273
+ 'voteDateIso',
1227
1274
  'yeas',
1228
1275
  'nays',
1229
1276
  'title',
@@ -1776,12 +1823,20 @@ function renderBillSubresourceSummaryItem(item, i) {
1776
1823
  const meta = join([f('Action Date', actionDate), f('Summary Updated', updated)]);
1777
1824
  if (meta)
1778
1825
  lines.push(meta);
1826
+ const window = summaryWindowLine(item);
1827
+ if (window)
1828
+ lines.push(window);
1779
1829
  const text = typeof item.text === 'string' ? htmlToMarkdown(item.text) : '';
1780
1830
  if (text)
1781
1831
  lines.push('', text);
1782
1832
  return withRowRest(item, lines, named);
1783
1833
  }
1784
- const BILL_SUMMARY_SUBRESOURCE_ROW_KEYS = ['actionDate', 'updateDate', 'text'];
1834
+ const BILL_SUMMARY_SUBRESOURCE_ROW_KEYS = [
1835
+ 'actionDate',
1836
+ 'updateDate',
1837
+ 'text',
1838
+ ...SUMMARY_WINDOW_KEYS,
1839
+ ];
1785
1840
  function pickBillListRenderer(first) {
1786
1841
  if ('title' in first && 'number' in first)
1787
1842
  return renderBillItem;