@cyanheads/secedgar-mcp-server 0.15.13 → 0.15.14

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 (91) hide show
  1. package/AGENTS.md +8 -6
  2. package/CLAUDE.md +8 -6
  3. package/Dockerfile +3 -3
  4. package/README.md +2 -2
  5. package/changelog/0.15.x/0.15.14.md +31 -0
  6. package/dist/index.js +7 -5
  7. package/dist/index.js.map +1 -1
  8. package/dist/mcp-server/tools/definitions/company-search.tool.d.ts +2 -2
  9. package/dist/mcp-server/tools/definitions/company-search.tool.d.ts.map +1 -1
  10. package/dist/mcp-server/tools/definitions/company-search.tool.js +8 -10
  11. package/dist/mcp-server/tools/definitions/company-search.tool.js.map +1 -1
  12. package/dist/mcp-server/tools/definitions/compare-companies.tool.d.ts +2 -2
  13. package/dist/mcp-server/tools/definitions/compare-companies.tool.d.ts.map +1 -1
  14. package/dist/mcp-server/tools/definitions/compare-companies.tool.js +6 -4
  15. package/dist/mcp-server/tools/definitions/compare-companies.tool.js.map +1 -1
  16. package/dist/mcp-server/tools/definitions/dataframe-describe.tool.d.ts +1 -1
  17. package/dist/mcp-server/tools/definitions/dataframe-describe.tool.d.ts.map +1 -1
  18. package/dist/mcp-server/tools/definitions/dataframe-describe.tool.js +1 -1
  19. package/dist/mcp-server/tools/definitions/dataframe-describe.tool.js.map +1 -1
  20. package/dist/mcp-server/tools/definitions/dataframe-drop.tool.d.ts +1 -1
  21. package/dist/mcp-server/tools/definitions/dataframe-drop.tool.d.ts.map +1 -1
  22. package/dist/mcp-server/tools/definitions/dataframe-drop.tool.js +1 -1
  23. package/dist/mcp-server/tools/definitions/dataframe-drop.tool.js.map +1 -1
  24. package/dist/mcp-server/tools/definitions/dataframe-query.tool.d.ts +1 -1
  25. package/dist/mcp-server/tools/definitions/dataframe-query.tool.d.ts.map +1 -1
  26. package/dist/mcp-server/tools/definitions/dataframe-query.tool.js +1 -1
  27. package/dist/mcp-server/tools/definitions/dataframe-query.tool.js.map +1 -1
  28. package/dist/mcp-server/tools/definitions/fetch-frames.tool.d.ts +2 -2
  29. package/dist/mcp-server/tools/definitions/fetch-frames.tool.d.ts.map +1 -1
  30. package/dist/mcp-server/tools/definitions/fetch-frames.tool.js +6 -4
  31. package/dist/mcp-server/tools/definitions/fetch-frames.tool.js.map +1 -1
  32. package/dist/mcp-server/tools/definitions/find-holders.tool.d.ts +2 -2
  33. package/dist/mcp-server/tools/definitions/find-holders.tool.d.ts.map +1 -1
  34. package/dist/mcp-server/tools/definitions/find-holders.tool.js +6 -4
  35. package/dist/mcp-server/tools/definitions/find-holders.tool.js.map +1 -1
  36. package/dist/mcp-server/tools/definitions/get-beneficial-owners.tool.d.ts +2 -2
  37. package/dist/mcp-server/tools/definitions/get-beneficial-owners.tool.d.ts.map +1 -1
  38. package/dist/mcp-server/tools/definitions/get-beneficial-owners.tool.js +7 -5
  39. package/dist/mcp-server/tools/definitions/get-beneficial-owners.tool.js.map +1 -1
  40. package/dist/mcp-server/tools/definitions/get-filing.tool.d.ts +2 -2
  41. package/dist/mcp-server/tools/definitions/get-filing.tool.d.ts.map +1 -1
  42. package/dist/mcp-server/tools/definitions/get-filing.tool.js +59 -33
  43. package/dist/mcp-server/tools/definitions/get-filing.tool.js.map +1 -1
  44. package/dist/mcp-server/tools/definitions/get-financials.tool.d.ts +2 -2
  45. package/dist/mcp-server/tools/definitions/get-financials.tool.d.ts.map +1 -1
  46. package/dist/mcp-server/tools/definitions/get-financials.tool.js +11 -8
  47. package/dist/mcp-server/tools/definitions/get-financials.tool.js.map +1 -1
  48. package/dist/mcp-server/tools/definitions/get-fund-holdings.tool.d.ts +2 -2
  49. package/dist/mcp-server/tools/definitions/get-fund-holdings.tool.d.ts.map +1 -1
  50. package/dist/mcp-server/tools/definitions/get-fund-holdings.tool.js +22 -20
  51. package/dist/mcp-server/tools/definitions/get-fund-holdings.tool.js.map +1 -1
  52. package/dist/mcp-server/tools/definitions/get-insider-transactions.tool.d.ts +2 -2
  53. package/dist/mcp-server/tools/definitions/get-insider-transactions.tool.d.ts.map +1 -1
  54. package/dist/mcp-server/tools/definitions/get-insider-transactions.tool.js +9 -11
  55. package/dist/mcp-server/tools/definitions/get-insider-transactions.tool.js.map +1 -1
  56. package/dist/mcp-server/tools/definitions/get-institutional-holdings.tool.d.ts +2 -2
  57. package/dist/mcp-server/tools/definitions/get-institutional-holdings.tool.d.ts.map +1 -1
  58. package/dist/mcp-server/tools/definitions/get-institutional-holdings.tool.js +11 -12
  59. package/dist/mcp-server/tools/definitions/get-institutional-holdings.tool.js.map +1 -1
  60. package/dist/mcp-server/tools/definitions/get-material-events.tool.d.ts +2 -2
  61. package/dist/mcp-server/tools/definitions/get-material-events.tool.d.ts.map +1 -1
  62. package/dist/mcp-server/tools/definitions/get-material-events.tool.js +8 -10
  63. package/dist/mcp-server/tools/definitions/get-material-events.tool.js.map +1 -1
  64. package/dist/mcp-server/tools/definitions/get-snapshot.tool.d.ts +2 -2
  65. package/dist/mcp-server/tools/definitions/get-snapshot.tool.d.ts.map +1 -1
  66. package/dist/mcp-server/tools/definitions/get-snapshot.tool.js +6 -4
  67. package/dist/mcp-server/tools/definitions/get-snapshot.tool.js.map +1 -1
  68. package/dist/mcp-server/tools/definitions/index.d.ts +30 -35
  69. package/dist/mcp-server/tools/definitions/index.d.ts.map +1 -1
  70. package/dist/mcp-server/tools/definitions/search-filings.tool.d.ts +3 -8
  71. package/dist/mcp-server/tools/definitions/search-filings.tool.d.ts.map +1 -1
  72. package/dist/mcp-server/tools/definitions/search-filings.tool.js +117 -59
  73. package/dist/mcp-server/tools/definitions/search-filings.tool.js.map +1 -1
  74. package/dist/services/edgar/call-scope.d.ts +41 -0
  75. package/dist/services/edgar/call-scope.d.ts.map +1 -0
  76. package/dist/services/edgar/call-scope.js +53 -0
  77. package/dist/services/edgar/call-scope.js.map +1 -0
  78. package/dist/services/edgar/edgar-api-service.d.ts +80 -50
  79. package/dist/services/edgar/edgar-api-service.d.ts.map +1 -1
  80. package/dist/services/edgar/edgar-api-service.js +483 -211
  81. package/dist/services/edgar/edgar-api-service.js.map +1 -1
  82. package/dist/services/edgar/filing-to-text.d.ts +53 -14
  83. package/dist/services/edgar/filing-to-text.d.ts.map +1 -1
  84. package/dist/services/edgar/filing-to-text.js +181 -33
  85. package/dist/services/edgar/filing-to-text.js.map +1 -1
  86. package/dist/services/edgar/submissions-archive.d.ts +6 -3
  87. package/dist/services/edgar/submissions-archive.d.ts.map +1 -1
  88. package/dist/services/edgar/submissions-archive.js +6 -3
  89. package/dist/services/edgar/submissions-archive.js.map +1 -1
  90. package/package.json +4 -4
  91. package/server.json +3 -3
@@ -0,0 +1,53 @@
1
+ /**
2
+ * @fileoverview The scope one tool call's SEC requests run under: the caller's
3
+ * cancellation signal and the call's failure budget (#179). Built once per tool
4
+ * call from `ctx.signal` and passed to every `EdgarApiService` method that reaches
5
+ * SEC, which takes it as a required parameter.
6
+ * @module services/edgar/call-scope
7
+ */
8
+ /**
9
+ * The most time one tool call may spend on SEC failing it: waits on attempts that
10
+ * got no response or a 5xx, retry backoff, and the idle wait a body stalled on
11
+ * (#179). Healthy progress never counts — pacer queue time, answered requests, a
12
+ * body still arriving — so no call SEC keeps answering with a 2xx is cut. Each attempt's
13
+ * header wait and each body-idle wait is the lesser of its own 15 s cap and the
14
+ * budget left; once it is spent no further attempt or backoff starts. Under the
15
+ * MCP SDK client's 60 s default request timeout with room for the response.
16
+ */
17
+ export const CALL_FAILURE_BUDGET_MS = 40_000;
18
+ /** What a shared load runs under: no one caller owns it, so nothing cancels it. */
19
+ const UNOWNED_SIGNAL = new AbortController().signal;
20
+ /**
21
+ * One tool call's hold on SEC. `signal` is the caller's: once it fires, every SEC
22
+ * request the call has queued, in flight, reading a body, or sleeping a backoff
23
+ * ends with its reason, unretried and unclassified. The budget is charged by the
24
+ * service as SEC fails the call, and only by the service.
25
+ */
26
+ export class CallScope {
27
+ signal;
28
+ #spentMs = 0;
29
+ constructor(signal) {
30
+ this.signal = signal;
31
+ }
32
+ /**
33
+ * A scope for work several calls await — the ticker-index load: a full budget of
34
+ * its own and a signal that never fires, so one waiter's cancel ends only its own
35
+ * wait.
36
+ */
37
+ static unowned() {
38
+ return new CallScope(UNOWNED_SIGNAL);
39
+ }
40
+ /** Budget left, in ms; 0 once spent. */
41
+ get remainingMs() {
42
+ return Math.max(0, CALL_FAILURE_BUDGET_MS - this.#spentMs);
43
+ }
44
+ /** Failure time charged so far, in ms. */
45
+ get spentMs() {
46
+ return this.#spentMs;
47
+ }
48
+ /** Charge `ms` of time SEC spent failing this call. */
49
+ charge(ms) {
50
+ this.#spentMs += ms;
51
+ }
52
+ }
53
+ //# sourceMappingURL=call-scope.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"call-scope.js","sourceRoot":"","sources":["../../../src/services/edgar/call-scope.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,MAAM,CAAC;AAE7C,mFAAmF;AACnF,MAAM,cAAc,GAAG,IAAI,eAAe,EAAE,CAAC,MAAM,CAAC;AAEpD;;;;;GAKG;AACH,MAAM,OAAO,SAAS;IACX,MAAM,CAAc;IAC7B,QAAQ,GAAG,CAAC,CAAC;IAEb,YAAY,MAAmB;QAC7B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,OAAO;QACZ,OAAO,IAAI,SAAS,CAAC,cAAc,CAAC,CAAC;IACvC,CAAC;IAED,wCAAwC;IACxC,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,sBAAsB,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC7D,CAAC;IAED,0CAA0C;IAC1C,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED,uDAAuD;IACvD,MAAM,CAAC,EAAU;QACf,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC;IACtB,CAAC;CACF"}
@@ -4,8 +4,14 @@
4
4
  * with backoff, CIK resolution, and ticker/entity caching.
5
5
  * @module services/edgar/edgar-api-service
6
6
  */
7
+ import { CallScope } from './call-scope.js';
7
8
  import { type FilingHeaders, type SubmissionHeader } from './filing-headers.js';
8
9
  import type { CikMatch, CompanyConceptResponse, CompanyFactsResponse, EftsResponse, FilingIndex, FilingsRecent, FramesResponse, FullIndexEntry, SubmissionsResponse } from './types.js';
10
+ /** Where a head read stops: once `stopAt` appears in the text so far, or `maxBytes` have arrived. */
11
+ interface HeadCutoff {
12
+ readonly maxBytes: number;
13
+ readonly stopAt: string;
14
+ }
9
15
  /** A candidate suggestion from the trigram scan on no-result name search. */
10
16
  export interface CompanySuggestion {
11
17
  cik: string;
@@ -77,14 +83,14 @@ declare class EdgarApiService {
77
83
  * any request made afterwards. Requests already sent are left to finish.
78
84
  */
79
85
  dispose(): void;
80
- /** Fetch and parse JSON, throwing on non-OK responses. */
81
- fetchJson<T>(url: string): Promise<T>;
86
+ /** Fetch and parse JSON, throwing on non-OK responses and on a body that is not JSON. */
87
+ fetchJson<T>(url: string, scope: CallScope): Promise<T>;
82
88
  /** Fetch JSON, returning `null` on 404 and throwing on other non-OK responses. */
83
- tryFetchJson<T>(url: string): Promise<T | null>;
89
+ tryFetchJson<T>(url: string, scope: CallScope): Promise<T | null>;
84
90
  /** Fetch raw text content (HTML filing documents). */
85
- fetchText(url: string): Promise<string>;
91
+ fetchText(url: string, scope: CallScope): Promise<string>;
86
92
  /** Fetch raw text content, returning `null` on 404 and throwing on other failures. */
87
- tryFetchText(url: string): Promise<string | null>;
93
+ tryFetchText(url: string, scope: CallScope): Promise<string | null>;
88
94
  /**
89
95
  * Resolve a query (ticker, name, or CIK) to company match(es).
90
96
  * - Numeric input → direct CIK lookup
@@ -95,7 +101,7 @@ declare class EdgarApiService {
95
101
  * On no-result name search, the returned empty array carries `suggestions` on
96
102
  * the thrown error at the handler layer — call `suggestCompanies` there.
97
103
  */
98
- resolveCik(query: string): Promise<CikMatch | CikMatch[]>;
104
+ resolveCik(query: string, scope: CallScope): Promise<CikMatch | CikMatch[]>;
99
105
  /**
100
106
  * Resolve an entity name to CIK candidates via EFTS entity-autocomplete
101
107
  * (`search-index?keysTyped=`). Covers any EDGAR filer — institutional managers,
@@ -107,15 +113,15 @@ declare class EdgarApiService {
107
113
  * Distinct from `searchFilings`: same URL path, different query param (`keysTyped`)
108
114
  * and response shape (`_source.entity`, not the filing-document `_source`).
109
115
  */
110
- resolveEntityByName(name: string): Promise<EntityNameMatch[]>;
116
+ resolveEntityByName(name: string, scope: CallScope): Promise<EntityNameMatch[]>;
111
117
  /** Reverse lookup: CIK → ticker symbol. */
112
- cikToTicker(cik: string): Promise<string | undefined>;
118
+ cikToTicker(cik: string, scope: CallScope): Promise<string | undefined>;
113
119
  /**
114
120
  * Resolve a fund series ID (`S000002839`) to its registrant trust. Backed by
115
121
  * company_tickers_mf.json, which lists a series only once one of its share classes has a
116
122
  * ticker — a series with no listed class resolves to `undefined` rather than a wrong trust.
117
123
  */
118
- resolveFundSeries(seriesId: string): Promise<CikMatch | undefined>;
124
+ resolveFundSeries(seriesId: string, scope: CallScope): Promise<CikMatch | undefined>;
119
125
  /**
120
126
  * List a registrant's fund series, from the same company_tickers_mf.json index. A trust
121
127
  * files one NPORT-P per series per period, so this is what tells a caller holding only a
@@ -123,7 +129,7 @@ declare class EdgarApiService {
123
129
  * class only — a trust whose series carry no ticker returns an empty list, which is not
124
130
  * the same as having no series.
125
131
  */
126
- listFundSeries(cik: string): Promise<FundSeriesEntry[]>;
132
+ listFundSeries(cik: string, scope: CallScope): Promise<FundSeriesEntry[]>;
127
133
  /**
128
134
  * List a fund series' own filings of one form type. EDGAR's company browse accepts a
129
135
  * series ID (`S000002839`) in place of a CIK and answers with just that series' filings,
@@ -133,17 +139,18 @@ declare class EdgarApiService {
133
139
  * response also names the registrant, so a bare series ID resolves without a second call.
134
140
  * Entries come back newest-filed first and include amendments of the form.
135
141
  */
136
- getFundSeriesFilings(seriesId: string, formType: string, count: number): Promise<SeriesFilingFeed>;
142
+ getFundSeriesFilings(seriesId: string, formType: string, count: number, scope: CallScope): Promise<SeriesFilingFeed>;
137
143
  /** Return the current in-memory entry list (used by the handler for trigram suggestions). */
138
- getAllEntries(): Promise<CikMatch[]>;
144
+ getAllEntries(scope: CallScope): Promise<CikMatch[]>;
139
145
  /**
140
146
  * Fetch a filer's submissions document (entity metadata + the `recent` window —
141
147
  * the last year or 1,000 filings, whichever holds more — + the `files[]`
142
148
  * archive-page manifest). Cached per CIK within
143
149
  * the ticker-cache TTL — the doc is large and re-read on every archive-paging
144
- * scan (#78). A 404 throws (uncached) so a bad CIK still surfaces.
150
+ * scan (#78). A 404 throws (uncached) so a bad CIK still surfaces. Like every
151
+ * cache here, written only by a completed read — a cancelled one caches nothing.
145
152
  */
146
- getSubmissions(cik: string): Promise<SubmissionsResponse>;
153
+ getSubmissions(cik: string, scope: CallScope): Promise<SubmissionsResponse>;
147
154
  /**
148
155
  * Fetch a submissions archive page (`filings.files[].name`, e.g.
149
156
  * `CIK0000320193-submissions-001.json`) — the older filings that don't fit the
@@ -151,7 +158,7 @@ declare class EdgarApiService {
151
158
  * field-compatible with `FilingsRecent`. Cached per page within the ticker-cache
152
159
  * TTL (pages are large and effectively immutable once archived).
153
160
  */
154
- fetchArchivePage(name: string): Promise<FilingsRecent>;
161
+ fetchArchivePage(name: string, scope: CallScope): Promise<FilingsRecent>;
155
162
  /**
156
163
  * Fetch and parse a quarterly EDGAR full-index (`master.idx`) — the
157
164
  * pipe-delimited manifest of every filing accepted that quarter, available
@@ -161,7 +168,7 @@ declare class EdgarApiService {
161
168
  * bound how many quarters they scan and filter client-side (#77). Cached per
162
169
  * quarter within the ticker-cache TTL — an archived quarter is immutable.
163
170
  */
164
- fetchFullIndexQuarter(year: number, quarter: number): Promise<FullIndexEntry[]>;
171
+ fetchFullIndexQuarter(year: number, quarter: number, scope: CallScope): Promise<FullIndexEntry[]>;
165
172
  /** True when a cache entry loaded at `at` is still within the ticker-cache TTL. */
166
173
  private isFresh;
167
174
  searchFilings(params: {
@@ -172,33 +179,33 @@ declare class EdgarApiService {
172
179
  endDate?: string | undefined;
173
180
  from?: number | undefined;
174
181
  size?: number | undefined;
175
- }): Promise<EftsResponse>;
182
+ }, scope: CallScope): Promise<EftsResponse>;
176
183
  /**
177
184
  * Resolve likely company CIKs for a filing accession number using SEC search metadata.
178
185
  * Returns zero or more padded 10-digit CIKs in SEC-provided order.
179
186
  */
180
- findFilingCiks(accessionNumber: string): Promise<string[]>;
187
+ findFilingCiks(accessionNumber: string, scope: CallScope): Promise<string[]>;
181
188
  /** Fetch a filing's document index. Returns `null` if the filing does not exist. */
182
- tryGetFilingIndex(cik: string, accessionNumber: string): Promise<FilingIndex | null>;
189
+ tryGetFilingIndex(cik: string, accessionNumber: string, scope: CallScope): Promise<FilingIndex | null>;
183
190
  /**
184
191
  * Fetch the SEC submission header page (`<accession>-index-headers.html`) and parse
185
192
  * it into the `filename → metadata` map plus the submission's own form, filing date,
186
193
  * and period. Returns `null` if the page is absent. The page exposes canonical SEC
187
194
  * document TYPE values (e.g. "EX-21.1") that the directory listing JSON does not.
188
195
  */
189
- tryGetFilingHeaders(cik: string, accessionNumber: string): Promise<FilingHeaders | null>;
196
+ tryGetFilingHeaders(cik: string, accessionNumber: string, scope: CallScope): Promise<FilingHeaders | null>;
190
197
  /**
191
198
  * Fetch the bare SGML submission header (`<accession>.hdr.sgml`, under 1 KB) and read
192
199
  * its form, filing date, and period. Returns `null` if the file is absent. The
193
200
  * fallback for filings whose index-headers page is missing — common among filings
194
201
  * made before 2014; it lists no documents.
195
202
  */
196
- tryGetSubmissionHeader(cik: string, accessionNumber: string): Promise<SubmissionHeader | null>;
197
- getFilingDocument(cik: string, accessionNumber: string, document: string): Promise<string>;
203
+ tryGetSubmissionHeader(cik: string, accessionNumber: string, scope: CallScope): Promise<SubmissionHeader | null>;
204
+ getFilingDocument(cik: string, accessionNumber: string, document: string, scope: CallScope): Promise<string>;
198
205
  /**
199
206
  * Fetch a filing document, returning `null` when the archive path exists but this document does not.
200
207
  */
201
- tryGetFilingDocument(cik: string, accessionNumber: string, document: string): Promise<string | null>;
208
+ tryGetFilingDocument(cik: string, accessionNumber: string, document: string, scope: CallScope): Promise<string | null>;
202
209
  /**
203
210
  * Fetch the leading bytes of a filing document, stopping as soon as `stopAt` appears in
204
211
  * the decoded text or `maxBytes` have arrived. Returns `null` on 404, and the whole
@@ -213,20 +220,17 @@ declare class EdgarApiService {
213
220
  * appears 1.5 KB in still costs 256 KB, and a `maxBytes` below that costs the same. Treat
214
221
  * both as "one chunk, not the file" rather than as a byte budget; `maxBytes` binds only on
215
222
  * a document long enough to arrive in several chunks, which is what stops a document
216
- * missing `stopAt` entirely from being read to the end. A runtime that hands back no
217
- * readable body (a stubbed fetch, for one) falls through to reading it whole, which costs
218
- * bandwidth but returns the same text.
223
+ * missing `stopAt` entirely from being read to the end. The head is read inside the
224
+ * retry ladder like any other body, so a read that breaks off before the cutoff is
225
+ * retried; stopping at the cutoff is not a failure (#181).
219
226
  */
220
- tryGetFilingDocumentHead(cik: string, accessionNumber: string, document: string, options: {
221
- maxBytes: number;
222
- stopAt: string;
223
- }): Promise<string | null>;
227
+ tryGetFilingDocumentHead(cik: string, accessionNumber: string, document: string, options: HeadCutoff, scope: CallScope): Promise<string | null>;
224
228
  /**
225
229
  * Search EDGAR submissions for recent filings of specified form types, newest first.
226
230
  * Returns up to `limit` matches from the submissions recent-filings window. Each carries
227
231
  * `reportDate` (the period-of-report end date) for callers that target a specific period.
228
232
  */
229
- getRecentFilingsByForm(cik: string, formTypes: string[], limit: number): Promise<Array<{
233
+ getRecentFilingsByForm(cik: string, formTypes: string[], limit: number, scope: CallScope): Promise<Array<{
230
234
  accessionNumber: string;
231
235
  filingDate: string;
232
236
  primaryDocument: string;
@@ -241,7 +245,7 @@ declare class EdgarApiService {
241
245
  * lookup; the live API is the fallback. A concept unit that arrives as
242
246
  * anything but an array is dropped (#141).
243
247
  */
244
- tryGetCompanyFacts(cik: string): Promise<CompanyFactsResponse | null>;
248
+ tryGetCompanyFacts(cik: string, scope: CallScope): Promise<CompanyFactsResponse | null>;
245
249
  /**
246
250
  * Fetch XBRL data for a concept. Returns `null` if the company does not report this tag.
247
251
  * Served from the local mirror when enabled and synced; the live API is the
@@ -249,7 +253,7 @@ declare class EdgarApiService {
249
253
  * A payload whose every unit arrives malformed comes back with no units — the
250
254
  * tag is named but carries nothing (#141).
251
255
  */
252
- tryGetCompanyConcept(cik: string, taxonomy: string, tag: string): Promise<CompanyConceptResponse | null>;
256
+ tryGetCompanyConcept(cik: string, taxonomy: string, tag: string, scope: CallScope): Promise<CompanyConceptResponse | null>;
253
257
  /**
254
258
  * Fetch cross-company frame data. Returns `null` if no companies report this combination.
255
259
  * A frame is a full scan of the company-facts store, so it is served from the
@@ -258,7 +262,7 @@ declare class EdgarApiService {
258
262
  * fall back to the live API until the mirror is complete. The live API is also
259
263
  * the fallback on a genuine miss.
260
264
  */
261
- tryGetFrames(taxonomy: string, tag: string, unit: string, period: string): Promise<FramesResponse | null>;
265
+ tryGetFrames(taxonomy: string, tag: string, unit: string, period: string, scope: CallScope): Promise<FramesResponse | null>;
262
266
  /**
263
267
  * Route a company-facts query through the local mirror when ready, with live-API
264
268
  * fallback. The `ready` predicate is the caller's readiness gate — point lookups
@@ -274,20 +278,37 @@ declare class EdgarApiService {
274
278
  */
275
279
  private mirrorOrLive;
276
280
  /**
277
- * Paced fetch with retry/backoff. Returns the response on 2xx or 404. A 5xx, and
278
- * an attempt that got no HTTP response, retry up to `MAX_RETRIES` attempts; then
279
- * the 5xx throws its status-classified `McpError` and the no-response case throws
280
- * `sec_unreachable`. Other non-OK statuses throw at once, as does the local
281
- * refusal while SEC's rate-limit block is active, and the pacer's
281
+ * Paced fetch with retry/backoff. Returns the body's text on 2xx — only its head
282
+ * when `cutoff` is given — and `null` on 404, whose body is left unread. The body
283
+ * is read inside the ladder (#181): a 5xx, an attempt that got no HTTP response,
284
+ * and a 2xx whose body failed to read all retry up to `MAX_RETRIES` attempts, and
285
+ * then the last attempt decides — a 5xx throws its status-classified `McpError`,
286
+ * the other two `sec_unreachable`. Other non-OK statuses throw at once, as does
287
+ * the local refusal while SEC's rate-limit block is active, and the pacer's
282
288
  * `RequestCancelled` — those are `McpError`s from `send()`, never retried.
289
+ *
290
+ * Every failed attempt and every backoff is charged to the call's failure budget,
291
+ * and the ladder ends early once the budget cannot cover another backoff and
292
+ * attempt (#179). Once the caller's signal has fired, whatever rejects is rethrown
293
+ * untouched — a queued request leaves the pacer unsent, and an attempt in flight,
294
+ * a body read, or a backoff sleep ends at once — never retried or classified.
283
295
  */
284
296
  private rawFetch;
285
297
  /**
286
- * One attempt through the block gate and the pacer. A 429 closes the gate
287
- * before the response is handed back, so no call admitted after it sends. A
288
- * `fetch` rejection comes back as an unanswered attempt, and so does a probe
289
- * this call waited on that got no HTTP response; the gate's refusal and the
290
- * pacer's `RequestCancelled` throw.
298
+ * The error a request's last attempt earned: `sec_unreachable` for no response or
299
+ * an unreadable body; for an HTTP answer, its status-classified `McpError`, with
300
+ * the 403 and 429 hints. A 5xx ladder the failure budget stopped keeps its status
301
+ * mapping and `data`, and its message says the budget stopped it (#179).
302
+ */
303
+ private ladderFailure;
304
+ /**
305
+ * One attempt through the block gate and the pacer, under the caller's signal. A
306
+ * 429 closes the gate before the response is handed back, so no call admitted
307
+ * after it sends. A `fetch` rejection comes back as an unanswered attempt, and so
308
+ * does a probe this call waited on that got no HTTP response; an attempt the spent
309
+ * failure budget kept from going out comes back as `budget_spent`. The gate's
310
+ * refusal and the pacer's `RequestCancelled` throw, and so does the caller's
311
+ * cancel, with its own reason — then a probe settles as having got no answer.
291
312
  */
292
313
  private send;
293
314
  /**
@@ -295,8 +316,10 @@ declare class EdgarApiService {
295
316
  * cool-down runs. The first call after the cool-down becomes the probe; every
296
317
  * call behind it waits for the probe to resolve and then reads the gate again —
297
318
  * unless the probe got no HTTP response, which each waiter takes as its own
298
- * unanswered attempt. Otherwise calls queued behind a silent SEC would probe one
299
- * at a time, 15 s each, and the last of N would wait about 45·N s (#173).
319
+ * unanswered attempt, its wait on the probe charged to its own budget. Otherwise
320
+ * calls queued behind a silent SEC would probe one at a time, 15 s each, and the
321
+ * last of N would wait about 45·N s (#173). A waiter whose call is cancelled
322
+ * leaves with the caller's reason and leaves the gate as it found it (#179).
300
323
  */
301
324
  private admit;
302
325
  /** The error for a call made while the cool-down runs — nothing was sent. */
@@ -307,7 +330,11 @@ declare class EdgarApiService {
307
330
  /**
308
331
  * Singleflight: concurrent callers (e.g. fetch-frames enriching ~5k reporters
309
332
  * in parallel) share one in-flight load instead of each queuing its own SEC
310
- * fetch through the pacer.
333
+ * fetch through the pacer. The load runs under a scope of its own — its own
334
+ * failure budget, and no caller's signal — so one waiter's cancel ends only its
335
+ * own wait while the load completes and caches for the rest; each waiter is
336
+ * charged the failure time the load spent while it waited (#179). A call already
337
+ * cancelled starts no load.
311
338
  */
312
339
  private loadTickerCacheOnce;
313
340
  /** Load the whole ticker index: its base, then the live fund slice when the base calls for one. */
@@ -329,11 +356,14 @@ declare class EdgarApiService {
329
356
  * Fetch company_tickers_mf.json (ETFs and mutual funds) as fund rows carrying
330
357
  * series and class IDs. Never throws: operating-company resolution must not
331
358
  * depend on the fund file. A failed load — any HTTP failure, no HTTP response
332
- * at all (#173), a malformed body, or the block gate's local refusal — returns
333
- * no rows and a `retryAt`, so the index without funds stands for the retry
359
+ * at all (#173), a body that fails to read or is not JSON (#181), a malformed
360
+ * body, or the block gate's local refusal — returns no rows and a `retryAt`, so
361
+ * the index without funds stands for the retry
334
362
  * window rather than the whole TTL (#119). The window is at least the error's
335
363
  * `retryAfter`, so a load refused by the rate-limit gate is not retried until
336
- * the cool-down ends.
364
+ * the cool-down ends. It runs only inside the shared ticker load, whose scope no
365
+ * caller can cancel, so a failure here is always SEC's — a spent failure budget
366
+ * included (#179).
337
367
  */
338
368
  private loadMfTickers;
339
369
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"edgar-api-service.d.ts","sourceRoot":"","sources":["../../../src/services/edgar/edgar-api-service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"edgar-api-service.d.ts","sourceRoot":"","sources":["../../../src/services/edgar/edgar-api-service.ts"],"names":[],"mappings":"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"}