@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.
- package/AGENTS.md +8 -6
- package/CLAUDE.md +8 -6
- package/Dockerfile +3 -3
- package/README.md +2 -2
- package/changelog/0.15.x/0.15.14.md +31 -0
- package/dist/index.js +7 -5
- package/dist/index.js.map +1 -1
- package/dist/mcp-server/tools/definitions/company-search.tool.d.ts +2 -2
- package/dist/mcp-server/tools/definitions/company-search.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/company-search.tool.js +8 -10
- package/dist/mcp-server/tools/definitions/company-search.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/compare-companies.tool.d.ts +2 -2
- package/dist/mcp-server/tools/definitions/compare-companies.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/compare-companies.tool.js +6 -4
- package/dist/mcp-server/tools/definitions/compare-companies.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/dataframe-describe.tool.d.ts +1 -1
- package/dist/mcp-server/tools/definitions/dataframe-describe.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/dataframe-describe.tool.js +1 -1
- package/dist/mcp-server/tools/definitions/dataframe-describe.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/dataframe-drop.tool.d.ts +1 -1
- package/dist/mcp-server/tools/definitions/dataframe-drop.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/dataframe-drop.tool.js +1 -1
- package/dist/mcp-server/tools/definitions/dataframe-drop.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/dataframe-query.tool.d.ts +1 -1
- package/dist/mcp-server/tools/definitions/dataframe-query.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/dataframe-query.tool.js +1 -1
- package/dist/mcp-server/tools/definitions/dataframe-query.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/fetch-frames.tool.d.ts +2 -2
- package/dist/mcp-server/tools/definitions/fetch-frames.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/fetch-frames.tool.js +6 -4
- package/dist/mcp-server/tools/definitions/fetch-frames.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/find-holders.tool.d.ts +2 -2
- package/dist/mcp-server/tools/definitions/find-holders.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/find-holders.tool.js +6 -4
- package/dist/mcp-server/tools/definitions/find-holders.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/get-beneficial-owners.tool.d.ts +2 -2
- package/dist/mcp-server/tools/definitions/get-beneficial-owners.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/get-beneficial-owners.tool.js +7 -5
- package/dist/mcp-server/tools/definitions/get-beneficial-owners.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/get-filing.tool.d.ts +2 -2
- package/dist/mcp-server/tools/definitions/get-filing.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/get-filing.tool.js +59 -33
- package/dist/mcp-server/tools/definitions/get-filing.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/get-financials.tool.d.ts +2 -2
- package/dist/mcp-server/tools/definitions/get-financials.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/get-financials.tool.js +11 -8
- package/dist/mcp-server/tools/definitions/get-financials.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/get-fund-holdings.tool.d.ts +2 -2
- package/dist/mcp-server/tools/definitions/get-fund-holdings.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/get-fund-holdings.tool.js +22 -20
- package/dist/mcp-server/tools/definitions/get-fund-holdings.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/get-insider-transactions.tool.d.ts +2 -2
- package/dist/mcp-server/tools/definitions/get-insider-transactions.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/get-insider-transactions.tool.js +9 -11
- package/dist/mcp-server/tools/definitions/get-insider-transactions.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/get-institutional-holdings.tool.d.ts +2 -2
- package/dist/mcp-server/tools/definitions/get-institutional-holdings.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/get-institutional-holdings.tool.js +11 -12
- package/dist/mcp-server/tools/definitions/get-institutional-holdings.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/get-material-events.tool.d.ts +2 -2
- package/dist/mcp-server/tools/definitions/get-material-events.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/get-material-events.tool.js +8 -10
- package/dist/mcp-server/tools/definitions/get-material-events.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/get-snapshot.tool.d.ts +2 -2
- package/dist/mcp-server/tools/definitions/get-snapshot.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/get-snapshot.tool.js +6 -4
- package/dist/mcp-server/tools/definitions/get-snapshot.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/index.d.ts +30 -35
- package/dist/mcp-server/tools/definitions/index.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/search-filings.tool.d.ts +3 -8
- package/dist/mcp-server/tools/definitions/search-filings.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/search-filings.tool.js +117 -59
- package/dist/mcp-server/tools/definitions/search-filings.tool.js.map +1 -1
- package/dist/services/edgar/call-scope.d.ts +41 -0
- package/dist/services/edgar/call-scope.d.ts.map +1 -0
- package/dist/services/edgar/call-scope.js +53 -0
- package/dist/services/edgar/call-scope.js.map +1 -0
- package/dist/services/edgar/edgar-api-service.d.ts +80 -50
- package/dist/services/edgar/edgar-api-service.d.ts.map +1 -1
- package/dist/services/edgar/edgar-api-service.js +483 -211
- package/dist/services/edgar/edgar-api-service.js.map +1 -1
- package/dist/services/edgar/filing-to-text.d.ts +53 -14
- package/dist/services/edgar/filing-to-text.d.ts.map +1 -1
- package/dist/services/edgar/filing-to-text.js +181 -33
- package/dist/services/edgar/filing-to-text.js.map +1 -1
- package/dist/services/edgar/submissions-archive.d.ts +6 -3
- package/dist/services/edgar/submissions-archive.d.ts.map +1 -1
- package/dist/services/edgar/submissions-archive.js +6 -3
- package/dist/services/edgar/submissions-archive.js.map +1 -1
- package/package.json +4 -4
- 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.
|
|
217
|
-
*
|
|
218
|
-
*
|
|
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
|
|
278
|
-
*
|
|
279
|
-
* the
|
|
280
|
-
*
|
|
281
|
-
*
|
|
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
|
-
*
|
|
287
|
-
*
|
|
288
|
-
*
|
|
289
|
-
*
|
|
290
|
-
|
|
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
|
|
299
|
-
* at a time, 15 s each, and the
|
|
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
|
|
333
|
-
* no rows and a `retryAt`, so
|
|
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":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"edgar-api-service.d.ts","sourceRoot":"","sources":["../../../src/services/edgar/edgar-api-service.ts"],"names":[],"mappings":"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"}
|