@cyanheads/secedgar-mcp-server 0.1.11 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +19 -6
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/mcp-server/resources/definitions/concepts.resource.d.ts.map +1 -1
- package/dist/mcp-server/resources/definitions/concepts.resource.js +15 -38
- package/dist/mcp-server/resources/definitions/concepts.resource.js.map +1 -1
- package/dist/mcp-server/tools/definitions/company-search.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/company-search.tool.js +5 -5
- package/dist/mcp-server/tools/definitions/company-search.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/compare-metric.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/compare-metric.tool.js +11 -26
- package/dist/mcp-server/tools/definitions/compare-metric.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/get-filing.tool.d.ts +3 -3
- package/dist/mcp-server/tools/definitions/get-filing.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/get-filing.tool.js +105 -71
- package/dist/mcp-server/tools/definitions/get-filing.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/get-financials.tool.d.ts +1 -1
- package/dist/mcp-server/tools/definitions/get-financials.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/get-financials.tool.js +28 -37
- package/dist/mcp-server/tools/definitions/get-financials.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/search-concepts.tool.d.ts +43 -0
- package/dist/mcp-server/tools/definitions/search-concepts.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/search-concepts.tool.js +113 -0
- package/dist/mcp-server/tools/definitions/search-concepts.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/search-filings.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/search-filings.tool.js +22 -10
- package/dist/mcp-server/tools/definitions/search-filings.tool.js.map +1 -1
- package/dist/services/edgar/concept-map.d.ts +14 -0
- package/dist/services/edgar/concept-map.d.ts.map +1 -1
- package/dist/services/edgar/concept-map.js +47 -0
- package/dist/services/edgar/concept-map.js.map +1 -1
- package/dist/services/edgar/edgar-api-service.d.ts +24 -3
- package/dist/services/edgar/edgar-api-service.d.ts.map +1 -1
- package/dist/services/edgar/edgar-api-service.js +87 -15
- package/dist/services/edgar/edgar-api-service.js.map +1 -1
- package/dist/services/edgar/types.d.ts +8 -3
- package/dist/services/edgar/types.d.ts.map +1 -1
- package/package.json +6 -11
- package/server.json +3 -3
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Search supported XBRL financial concepts by keyword, statement group, or taxonomy.
|
|
3
|
+
* Discovery tool for the friendly names accepted by secedgar_get_financials and secedgar_compare_metric.
|
|
4
|
+
* Also performs reverse lookup: passing a raw XBRL tag returns the friendly mapping(s) it belongs to.
|
|
5
|
+
* @module mcp-server/tools/definitions/search-concepts
|
|
6
|
+
*/
|
|
7
|
+
import { tool, z } from '@cyanheads/mcp-ts-core';
|
|
8
|
+
import { searchConcepts } from '../../../services/edgar/concept-map.js';
|
|
9
|
+
const GROUP_VALUES = [
|
|
10
|
+
'income_statement',
|
|
11
|
+
'balance_sheet',
|
|
12
|
+
'cash_flow',
|
|
13
|
+
'per_share',
|
|
14
|
+
'entity_info',
|
|
15
|
+
];
|
|
16
|
+
const TAXONOMY_VALUES = [
|
|
17
|
+
'us-gaap',
|
|
18
|
+
'ifrs-full',
|
|
19
|
+
'dei',
|
|
20
|
+
];
|
|
21
|
+
export const searchConceptsTool = tool('secedgar_search_concepts', {
|
|
22
|
+
description: 'Search supported XBRL financial concepts by keyword, statement group, or taxonomy. Use before secedgar_get_financials or secedgar_compare_metric to discover the right friendly name, or pass a raw XBRL tag (e.g., "NetIncomeLoss") to reverse-lookup which friendly names map to it. Empty search with no filters returns the full catalog.',
|
|
23
|
+
annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: false },
|
|
24
|
+
input: z.object({
|
|
25
|
+
search: z
|
|
26
|
+
.string()
|
|
27
|
+
.optional()
|
|
28
|
+
.describe('Case-insensitive substring matched against friendly name, label, and XBRL tags. Examples: "cash" finds cash and operating_cash_flow; "earnings" finds eps_basic and eps_diluted; "NetIncomeLoss" reverse-maps to net_income. Omit to list all concepts.'),
|
|
29
|
+
group: z
|
|
30
|
+
.enum(GROUP_VALUES)
|
|
31
|
+
.optional()
|
|
32
|
+
.describe('Filter to a single financial statement group. income_statement covers P&L items; balance_sheet covers position items (use instant periods in compare_metric); cash_flow covers CF statement items; per_share covers EPS; entity_info covers DEI items like shares outstanding.'),
|
|
33
|
+
taxonomy: z
|
|
34
|
+
.enum(TAXONOMY_VALUES)
|
|
35
|
+
.optional()
|
|
36
|
+
.describe('Filter to a single XBRL taxonomy. us-gaap for US filers, ifrs-full for foreign filers, dei for entity info.'),
|
|
37
|
+
}),
|
|
38
|
+
output: z.object({
|
|
39
|
+
total: z.number().describe('Number of concepts matching the filters.'),
|
|
40
|
+
concepts: z
|
|
41
|
+
.array(z.object({
|
|
42
|
+
name: z
|
|
43
|
+
.string()
|
|
44
|
+
.describe('Friendly name to pass as the concept argument to secedgar_get_financials or secedgar_compare_metric.'),
|
|
45
|
+
label: z.string().describe('Human-readable concept label.'),
|
|
46
|
+
tags: z
|
|
47
|
+
.array(z.string())
|
|
48
|
+
.describe('XBRL tags this friendly name resolves to, tried in order. Multiple tags cover historical naming changes (e.g., pre- vs post-ASC 606 revenue).'),
|
|
49
|
+
taxonomy: z.enum(TAXONOMY_VALUES).describe('XBRL taxonomy.'),
|
|
50
|
+
unit: z
|
|
51
|
+
.string()
|
|
52
|
+
.describe('Unit of measure (USD, USD/shares, shares, pure). Note: secedgar_compare_metric expects the dashed form USD-per-shares.'),
|
|
53
|
+
group: z.enum(GROUP_VALUES).describe('Financial statement group.'),
|
|
54
|
+
}))
|
|
55
|
+
.describe('Matching concepts, ordered by group then alphabetical by name.'),
|
|
56
|
+
}),
|
|
57
|
+
handler(input, ctx) {
|
|
58
|
+
let results = searchConcepts(input.search ?? '');
|
|
59
|
+
if (input.group) {
|
|
60
|
+
results = results.filter((c) => c.group === input.group);
|
|
61
|
+
}
|
|
62
|
+
if (input.taxonomy) {
|
|
63
|
+
results = results.filter((c) => c.taxonomy === input.taxonomy);
|
|
64
|
+
}
|
|
65
|
+
ctx.log.info('Concept search completed', {
|
|
66
|
+
search: input.search,
|
|
67
|
+
group: input.group,
|
|
68
|
+
taxonomy: input.taxonomy,
|
|
69
|
+
matches: results.length,
|
|
70
|
+
});
|
|
71
|
+
return {
|
|
72
|
+
total: results.length,
|
|
73
|
+
concepts: results.map((c) => ({
|
|
74
|
+
name: c.name,
|
|
75
|
+
label: c.label,
|
|
76
|
+
tags: c.tags,
|
|
77
|
+
taxonomy: c.taxonomy,
|
|
78
|
+
unit: c.unit,
|
|
79
|
+
group: c.group,
|
|
80
|
+
})),
|
|
81
|
+
};
|
|
82
|
+
},
|
|
83
|
+
format: (result) => {
|
|
84
|
+
if (result.total === 0) {
|
|
85
|
+
return [
|
|
86
|
+
{
|
|
87
|
+
type: 'text',
|
|
88
|
+
text: 'No concepts matched. Try a broader search, different group, or call with no filters to see the full catalog.',
|
|
89
|
+
},
|
|
90
|
+
];
|
|
91
|
+
}
|
|
92
|
+
const lines = [`Found ${result.total} concept${result.total === 1 ? '' : 's'}:`, ''];
|
|
93
|
+
let currentGroup;
|
|
94
|
+
for (const c of result.concepts) {
|
|
95
|
+
if (c.group !== currentGroup) {
|
|
96
|
+
if (currentGroup)
|
|
97
|
+
lines.push('');
|
|
98
|
+
lines.push(`## ${formatGroup(c.group)} (\`${c.group}\`)`);
|
|
99
|
+
currentGroup = c.group;
|
|
100
|
+
}
|
|
101
|
+
const tagList = c.tags.map((t) => `\`${t}\``).join(', ');
|
|
102
|
+
lines.push(`- \`${c.name}\` — ${c.label} (${c.taxonomy}, ${c.unit}) → ${tagList}`);
|
|
103
|
+
}
|
|
104
|
+
return [{ type: 'text', text: lines.join('\n') }];
|
|
105
|
+
},
|
|
106
|
+
});
|
|
107
|
+
function formatGroup(group) {
|
|
108
|
+
return group
|
|
109
|
+
.split('_')
|
|
110
|
+
.map((w) => w[0]?.toUpperCase() + w.slice(1))
|
|
111
|
+
.join(' ');
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=search-concepts.tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search-concepts.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/search-concepts.tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-filings.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/search-filings.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"search-filings.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/search-filings.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AA6DjD,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;kBAsK5B,CAAC"}
|
|
@@ -5,6 +5,18 @@
|
|
|
5
5
|
import { tool, z } from '@cyanheads/mcp-ts-core';
|
|
6
6
|
import { validationError } from '@cyanheads/mcp-ts-core/errors';
|
|
7
7
|
import { getEdgarApiService } from '../../../services/edgar/edgar-api-service.js';
|
|
8
|
+
/**
|
|
9
|
+
* EDGAR's `display_names[0]` embeds the ticker(s) and CIK in trailing parentheticals
|
|
10
|
+
* (e.g., "Apple Inc. (AAPL) (CIK 0000320193)"). Strip them so consumers see a clean
|
|
11
|
+
* company name — ticker and CIK are already surfaced as their own fields.
|
|
12
|
+
*/
|
|
13
|
+
function cleanCompanyName(displayName) {
|
|
14
|
+
return displayName
|
|
15
|
+
.replace(/\s*\(CIK\s*\d+\)/gi, '')
|
|
16
|
+
.replace(/\s*\([A-Z0-9,\s.]+\)\s*$/, '')
|
|
17
|
+
.replace(/\s+/g, ' ')
|
|
18
|
+
.trim();
|
|
19
|
+
}
|
|
8
20
|
/**
|
|
9
21
|
* Extract entity targeting (cik: or ticker:) from a query string,
|
|
10
22
|
* resolve to a CIK, and return the cleaned query + resolved CIK.
|
|
@@ -43,17 +55,13 @@ async function resolveEntityTargeting(query) {
|
|
|
43
55
|
return { query };
|
|
44
56
|
}
|
|
45
57
|
export const searchFilingsTool = tool('secedgar_search_filings', {
|
|
46
|
-
description: 'Full-text search across all EDGAR filing documents since 1993. '
|
|
47
|
-
'Supports exact phrases, boolean operators, wildcards, and entity targeting (ticker:AAPL or cik:320193 in query).',
|
|
58
|
+
description: 'Full-text search across all EDGAR filing documents since 1993. Supports exact phrases, boolean operators, wildcards, and entity targeting (ticker:AAPL or cik:320193 in query).',
|
|
48
59
|
annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: true },
|
|
49
60
|
input: z.object({
|
|
50
61
|
query: z
|
|
51
62
|
.string()
|
|
52
63
|
.min(1)
|
|
53
|
-
.describe('Full-text search query. Supports: exact phrases ("material weakness"), '
|
|
54
|
-
'boolean operators (revenue OR income), exclusion (-preliminary), ' +
|
|
55
|
-
'wildcard suffix (account*), entity targeting (ticker:AAPL or cik:320193 in the query). ' +
|
|
56
|
-
"Terms are AND'd by default."),
|
|
64
|
+
.describe('Full-text search query. Supports: exact phrases ("material weakness"), boolean operators (revenue OR income), exclusion (-preliminary), wildcard suffix (account*), entity targeting (ticker:AAPL or cik:320193 in the query). Terms are AND\'d by default.'),
|
|
57
65
|
forms: z
|
|
58
66
|
.array(z.string())
|
|
59
67
|
.optional()
|
|
@@ -77,8 +85,9 @@ export const searchFilingsTool = tool('secedgar_search_filings', {
|
|
|
77
85
|
.number()
|
|
78
86
|
.int()
|
|
79
87
|
.min(0)
|
|
88
|
+
.max(9999)
|
|
80
89
|
.default(0)
|
|
81
|
-
.describe('Pagination offset. Increment by limit for next page.
|
|
90
|
+
.describe('Pagination offset. Increment by limit for the next page. EDGAR caps total accessible results at 10,000 — offsets past this return nothing.'),
|
|
82
91
|
}),
|
|
83
92
|
output: z.object({
|
|
84
93
|
total: z.number().describe('Total matching filings (capped at 10,000).'),
|
|
@@ -140,7 +149,7 @@ export const searchFilingsTool = tool('secedgar_search_filings', {
|
|
|
140
149
|
form: hit._source.form ?? undefined,
|
|
141
150
|
filing_date: hit._source.file_date,
|
|
142
151
|
period_ending: hit._source.period_ending ?? undefined,
|
|
143
|
-
company_name: hit._source.display_names?.[0] || '',
|
|
152
|
+
company_name: cleanCompanyName(hit._source.display_names?.[0] || ''),
|
|
144
153
|
cik: hit._source.ciks?.[0] || '',
|
|
145
154
|
file_description: hit._source.file_description ?? undefined,
|
|
146
155
|
sic: hit._source.sics?.[0] ?? undefined,
|
|
@@ -163,11 +172,14 @@ export const searchFilingsTool = tool('secedgar_search_filings', {
|
|
|
163
172
|
return { total, total_is_exact: totalIsExact, results, form_distribution: formDistribution };
|
|
164
173
|
},
|
|
165
174
|
format: (result) => {
|
|
166
|
-
const
|
|
175
|
+
const exactness = result.total_is_exact ? 'exact' : 'capped at 10,000';
|
|
176
|
+
const lines = [`Found ${result.total} filings (${exactness})`];
|
|
167
177
|
for (const r of result.results) {
|
|
168
178
|
const period = r.period_ending ? ` (period: ${r.period_ending})` : '';
|
|
169
179
|
const desc = r.file_description ? ` — ${r.file_description}` : '';
|
|
170
|
-
|
|
180
|
+
const sic = r.sic ? ` | SIC ${r.sic}` : '';
|
|
181
|
+
const loc = r.location ? ` | ${r.location}` : '';
|
|
182
|
+
lines.push(`- ${r.form ?? 'N/A'} ${r.filing_date}${period} — ${r.company_name} (CIK ${r.cik})${sic}${loc}${desc} [${r.accession_number}]`);
|
|
171
183
|
}
|
|
172
184
|
if (result.form_distribution) {
|
|
173
185
|
const dist = Object.entries(result.form_distribution)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-filings.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/search-filings.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,uCAAuC,CAAC;AAE3E;;;GAGG;AACH,KAAK,UAAU,sBAAsB,CACnC,KAAa;IAEb,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;IACnD,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;IAE7C,MAAM,GAAG,GAAG,kBAAkB,EAAE,CAAC;IAEjC,IAAI,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrB,MAAM,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;QAC7B,MAAM,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;QAC9B,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC9C,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;QAC/D,IAAI,KAAK,EAAE,IAAI,EAAE,CAAC;YAChB,OAAO;gBACL,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE;gBACrD,SAAS,EAAE,KAAK,CAAC,GAAG;aACrB,CAAC;QACJ,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;IACpD,CAAC;IAED,IAAI,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAClB,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC1B,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC3B,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QACxC,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC9C,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;QAC/D,IAAI,KAAK,EAAE,IAAI,EAAE,CAAC;YAChB,OAAO;gBACL,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE;gBACrD,SAAS,EAAE,MAAM;aAClB,CAAC;QACJ,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;IACvE,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,CAAC;AACnB,CAAC;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,CAAC,yBAAyB,EAAE;IAC/D,WAAW,EACT,
|
|
1
|
+
{"version":3,"file":"search-filings.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/search-filings.tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,4 +10,18 @@ import type { ConceptMapping } from './types.js';
|
|
|
10
10
|
export declare function resolveConcept(input: string): ConceptMapping | undefined;
|
|
11
11
|
/** Get all concept mappings for reference resource generation. */
|
|
12
12
|
export declare function getAllConcepts(): Record<string, ConceptMapping>;
|
|
13
|
+
/** Entry returned by search/list operations — friendly name paired with its mapping. */
|
|
14
|
+
export interface ConceptEntry extends ConceptMapping {
|
|
15
|
+
name: string;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Return every concept entry as a flat, stable-ordered array (by group, then alphabetical by name).
|
|
19
|
+
*/
|
|
20
|
+
export declare function listConcepts(): ConceptEntry[];
|
|
21
|
+
/**
|
|
22
|
+
* Search concepts by substring against friendly name, label, and XBRL tags.
|
|
23
|
+
* Passing a raw XBRL tag will reverse-lookup the friendly mapping(s).
|
|
24
|
+
* Empty/whitespace query returns all entries.
|
|
25
|
+
*/
|
|
26
|
+
export declare function searchConcepts(query: string): ConceptEntry[];
|
|
13
27
|
//# sourceMappingURL=concept-map.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"concept-map.d.ts","sourceRoot":"","sources":["../../../src/services/edgar/concept-map.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"concept-map.d.ts","sourceRoot":"","sources":["../../../src/services/edgar/concept-map.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AA6GjD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAGxE;AAED,kEAAkE;AAClE,wBAAgB,cAAc,IAAI,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAE/D;AAED,wFAAwF;AACxF,MAAM,WAAW,YAAa,SAAQ,cAAc;IAClD,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,YAAY,EAAE,CAI7C;AAUD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,EAAE,CAY5D"}
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
/** Friendly name → XBRL tag mapping. Tags are tried in order for companyconcept lookups. */
|
|
6
6
|
const CONCEPT_MAP = {
|
|
7
7
|
revenue: {
|
|
8
|
+
group: 'income_statement',
|
|
8
9
|
tags: [
|
|
9
10
|
'RevenueFromContractWithCustomerExcludingAssessedTax',
|
|
10
11
|
'Revenues',
|
|
@@ -16,78 +17,91 @@ const CONCEPT_MAP = {
|
|
|
16
17
|
label: 'Revenue',
|
|
17
18
|
},
|
|
18
19
|
net_income: {
|
|
20
|
+
group: 'income_statement',
|
|
19
21
|
tags: ['NetIncomeLoss'],
|
|
20
22
|
taxonomy: 'us-gaap',
|
|
21
23
|
unit: 'USD',
|
|
22
24
|
label: 'Net Income (Loss)',
|
|
23
25
|
},
|
|
24
26
|
operating_income: {
|
|
27
|
+
group: 'income_statement',
|
|
25
28
|
tags: ['OperatingIncomeLoss'],
|
|
26
29
|
taxonomy: 'us-gaap',
|
|
27
30
|
unit: 'USD',
|
|
28
31
|
label: 'Operating Income (Loss)',
|
|
29
32
|
},
|
|
30
33
|
gross_profit: {
|
|
34
|
+
group: 'income_statement',
|
|
31
35
|
tags: ['GrossProfit'],
|
|
32
36
|
taxonomy: 'us-gaap',
|
|
33
37
|
unit: 'USD',
|
|
34
38
|
label: 'Gross Profit',
|
|
35
39
|
},
|
|
36
40
|
eps_basic: {
|
|
41
|
+
group: 'per_share',
|
|
37
42
|
tags: ['EarningsPerShareBasic'],
|
|
38
43
|
taxonomy: 'us-gaap',
|
|
39
44
|
unit: 'USD/shares',
|
|
40
45
|
label: 'Earnings Per Share (Basic)',
|
|
41
46
|
},
|
|
42
47
|
eps_diluted: {
|
|
48
|
+
group: 'per_share',
|
|
43
49
|
tags: ['EarningsPerShareDiluted'],
|
|
44
50
|
taxonomy: 'us-gaap',
|
|
45
51
|
unit: 'USD/shares',
|
|
46
52
|
label: 'Earnings Per Share (Diluted)',
|
|
47
53
|
},
|
|
48
54
|
assets: {
|
|
55
|
+
group: 'balance_sheet',
|
|
49
56
|
tags: ['Assets'],
|
|
50
57
|
taxonomy: 'us-gaap',
|
|
51
58
|
unit: 'USD',
|
|
52
59
|
label: 'Total Assets',
|
|
53
60
|
},
|
|
54
61
|
liabilities: {
|
|
62
|
+
group: 'balance_sheet',
|
|
55
63
|
tags: ['Liabilities'],
|
|
56
64
|
taxonomy: 'us-gaap',
|
|
57
65
|
unit: 'USD',
|
|
58
66
|
label: 'Total Liabilities',
|
|
59
67
|
},
|
|
60
68
|
equity: {
|
|
69
|
+
group: 'balance_sheet',
|
|
61
70
|
tags: ['StockholdersEquity'],
|
|
62
71
|
taxonomy: 'us-gaap',
|
|
63
72
|
unit: 'USD',
|
|
64
73
|
label: "Stockholders' Equity",
|
|
65
74
|
},
|
|
66
75
|
cash: {
|
|
76
|
+
group: 'balance_sheet',
|
|
67
77
|
tags: ['CashAndCashEquivalentsAtCarryingValue'],
|
|
68
78
|
taxonomy: 'us-gaap',
|
|
69
79
|
unit: 'USD',
|
|
70
80
|
label: 'Cash and Cash Equivalents',
|
|
71
81
|
},
|
|
72
82
|
debt: {
|
|
83
|
+
group: 'balance_sheet',
|
|
73
84
|
tags: ['LongTermDebt', 'LongTermDebtNoncurrent'],
|
|
74
85
|
taxonomy: 'us-gaap',
|
|
75
86
|
unit: 'USD',
|
|
76
87
|
label: 'Long-Term Debt',
|
|
77
88
|
},
|
|
78
89
|
shares_outstanding: {
|
|
90
|
+
group: 'entity_info',
|
|
79
91
|
tags: ['EntityCommonStockSharesOutstanding'],
|
|
80
92
|
taxonomy: 'dei',
|
|
81
93
|
unit: 'shares',
|
|
82
94
|
label: 'Shares Outstanding',
|
|
83
95
|
},
|
|
84
96
|
operating_cash_flow: {
|
|
97
|
+
group: 'cash_flow',
|
|
85
98
|
tags: ['NetCashProvidedByUsedInOperatingActivities'],
|
|
86
99
|
taxonomy: 'us-gaap',
|
|
87
100
|
unit: 'USD',
|
|
88
101
|
label: 'Operating Cash Flow',
|
|
89
102
|
},
|
|
90
103
|
capex: {
|
|
104
|
+
group: 'cash_flow',
|
|
91
105
|
tags: ['PaymentsToAcquirePropertyPlantAndEquipment'],
|
|
92
106
|
taxonomy: 'us-gaap',
|
|
93
107
|
unit: 'USD',
|
|
@@ -106,4 +120,37 @@ export function resolveConcept(input) {
|
|
|
106
120
|
export function getAllConcepts() {
|
|
107
121
|
return CONCEPT_MAP;
|
|
108
122
|
}
|
|
123
|
+
/**
|
|
124
|
+
* Return every concept entry as a flat, stable-ordered array (by group, then alphabetical by name).
|
|
125
|
+
*/
|
|
126
|
+
export function listConcepts() {
|
|
127
|
+
return Object.entries(CONCEPT_MAP)
|
|
128
|
+
.map(([name, mapping]) => ({ name, ...mapping }))
|
|
129
|
+
.sort((a, b) => a.group.localeCompare(b.group) || a.name.localeCompare(b.name));
|
|
130
|
+
}
|
|
131
|
+
/** Normalize a string for fuzzy matching: lowercase, collapse non-alphanumerics to spaces. */
|
|
132
|
+
function normalizeForSearch(s) {
|
|
133
|
+
return s
|
|
134
|
+
.toLowerCase()
|
|
135
|
+
.replace(/[^a-z0-9]+/g, ' ')
|
|
136
|
+
.trim();
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Search concepts by substring against friendly name, label, and XBRL tags.
|
|
140
|
+
* Passing a raw XBRL tag will reverse-lookup the friendly mapping(s).
|
|
141
|
+
* Empty/whitespace query returns all entries.
|
|
142
|
+
*/
|
|
143
|
+
export function searchConcepts(query) {
|
|
144
|
+
const needle = normalizeForSearch(query);
|
|
145
|
+
if (!needle)
|
|
146
|
+
return listConcepts();
|
|
147
|
+
return listConcepts().filter((entry) => {
|
|
148
|
+
const haystacks = [
|
|
149
|
+
normalizeForSearch(entry.name),
|
|
150
|
+
normalizeForSearch(entry.label),
|
|
151
|
+
...entry.tags.map(normalizeForSearch),
|
|
152
|
+
];
|
|
153
|
+
return haystacks.some((h) => h.includes(needle));
|
|
154
|
+
});
|
|
155
|
+
}
|
|
109
156
|
//# sourceMappingURL=concept-map.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"concept-map.js","sourceRoot":"","sources":["../../../src/services/edgar/concept-map.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,4FAA4F;AAC5F,MAAM,WAAW,GAAmC;IAClD,OAAO,EAAE;QACP,IAAI,EAAE;YACJ,qDAAqD;YACrD,UAAU;YACV,iBAAiB;YACjB,sBAAsB;SACvB;QACD,QAAQ,EAAE,SAAS;QACnB,IAAI,EAAE,KAAK;QACX,KAAK,EAAE,SAAS;KACjB;IACD,UAAU,EAAE;QACV,IAAI,EAAE,CAAC,eAAe,CAAC;QACvB,QAAQ,EAAE,SAAS;QACnB,IAAI,EAAE,KAAK;QACX,KAAK,EAAE,mBAAmB;KAC3B;IACD,gBAAgB,EAAE;QAChB,IAAI,EAAE,CAAC,qBAAqB,CAAC;QAC7B,QAAQ,EAAE,SAAS;QACnB,IAAI,EAAE,KAAK;QACX,KAAK,EAAE,yBAAyB;KACjC;IACD,YAAY,EAAE;QACZ,IAAI,EAAE,CAAC,aAAa,CAAC;QACrB,QAAQ,EAAE,SAAS;QACnB,IAAI,EAAE,KAAK;QACX,KAAK,EAAE,cAAc;KACtB;IACD,SAAS,EAAE;QACT,IAAI,EAAE,CAAC,uBAAuB,CAAC;QAC/B,QAAQ,EAAE,SAAS;QACnB,IAAI,EAAE,YAAY;QAClB,KAAK,EAAE,4BAA4B;KACpC;IACD,WAAW,EAAE;QACX,IAAI,EAAE,CAAC,yBAAyB,CAAC;QACjC,QAAQ,EAAE,SAAS;QACnB,IAAI,EAAE,YAAY;QAClB,KAAK,EAAE,8BAA8B;KACtC;IACD,MAAM,EAAE;QACN,IAAI,EAAE,CAAC,QAAQ,CAAC;QAChB,QAAQ,EAAE,SAAS;QACnB,IAAI,EAAE,KAAK;QACX,KAAK,EAAE,cAAc;KACtB;IACD,WAAW,EAAE;QACX,IAAI,EAAE,CAAC,aAAa,CAAC;QACrB,QAAQ,EAAE,SAAS;QACnB,IAAI,EAAE,KAAK;QACX,KAAK,EAAE,mBAAmB;KAC3B;IACD,MAAM,EAAE;QACN,IAAI,EAAE,CAAC,oBAAoB,CAAC;QAC5B,QAAQ,EAAE,SAAS;QACnB,IAAI,EAAE,KAAK;QACX,KAAK,EAAE,sBAAsB;KAC9B;IACD,IAAI,EAAE;QACJ,IAAI,EAAE,CAAC,uCAAuC,CAAC;QAC/C,QAAQ,EAAE,SAAS;QACnB,IAAI,EAAE,KAAK;QACX,KAAK,EAAE,2BAA2B;KACnC;IACD,IAAI,EAAE;QACJ,IAAI,EAAE,CAAC,cAAc,EAAE,wBAAwB,CAAC;QAChD,QAAQ,EAAE,SAAS;QACnB,IAAI,EAAE,KAAK;QACX,KAAK,EAAE,gBAAgB;KACxB;IACD,kBAAkB,EAAE;QAClB,IAAI,EAAE,CAAC,oCAAoC,CAAC;QAC5C,QAAQ,EAAE,KAAK;QACf,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,oBAAoB;KAC5B;IACD,mBAAmB,EAAE;QACnB,IAAI,EAAE,CAAC,4CAA4C,CAAC;QACpD,QAAQ,EAAE,SAAS;QACnB,IAAI,EAAE,KAAK;QACX,KAAK,EAAE,qBAAqB;KAC7B;IACD,KAAK,EAAE;QACL,IAAI,EAAE,CAAC,4CAA4C,CAAC;QACpD,QAAQ,EAAE,SAAS;QACnB,IAAI,EAAE,KAAK;QACX,KAAK,EAAE,sBAAsB;KAC9B;CACF,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,KAAa;IAC1C,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IAC7D,OAAO,WAAW,CAAC,UAAU,CAAC,CAAC;AACjC,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,cAAc;IAC5B,OAAO,WAAW,CAAC;AACrB,CAAC"}
|
|
1
|
+
{"version":3,"file":"concept-map.js","sourceRoot":"","sources":["../../../src/services/edgar/concept-map.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,13 +9,18 @@ declare class EdgarApiService {
|
|
|
9
9
|
private lastRequestAt;
|
|
10
10
|
private minIntervalMs;
|
|
11
11
|
private tickerCache;
|
|
12
|
+
private throttleQueue;
|
|
12
13
|
constructor();
|
|
13
14
|
/** Rate-limited, retried fetch with User-Agent header. */
|
|
14
15
|
fetch(url: string): Promise<Response>;
|
|
15
16
|
/** Fetch and parse JSON, throwing on non-OK responses. */
|
|
16
17
|
fetchJson<T>(url: string): Promise<T>;
|
|
18
|
+
/** Fetch JSON, returning `null` on 404 and throwing on other non-OK responses. */
|
|
19
|
+
tryFetchJson<T>(url: string): Promise<T | null>;
|
|
17
20
|
/** Fetch raw text content (HTML filing documents). */
|
|
18
21
|
fetchText(url: string): Promise<string>;
|
|
22
|
+
/** Fetch raw text content, returning `null` on 404 and throwing on other failures. */
|
|
23
|
+
tryFetchText(url: string): Promise<string | null>;
|
|
19
24
|
/**
|
|
20
25
|
* Resolve a query (ticker, name, or CIK) to company match(es).
|
|
21
26
|
* - Numeric input → direct CIK lookup
|
|
@@ -34,10 +39,26 @@ declare class EdgarApiService {
|
|
|
34
39
|
from?: number | undefined;
|
|
35
40
|
size?: number | undefined;
|
|
36
41
|
}): Promise<EftsResponse>;
|
|
37
|
-
|
|
42
|
+
/**
|
|
43
|
+
* Resolve likely company CIKs for a filing accession number using SEC search metadata.
|
|
44
|
+
* Returns zero or more padded 10-digit CIKs in SEC-provided order.
|
|
45
|
+
*/
|
|
46
|
+
findFilingCiks(accessionNumber: string): Promise<string[]>;
|
|
47
|
+
/** Fetch a filing's document index. Returns `null` if the filing does not exist. */
|
|
48
|
+
tryGetFilingIndex(cik: string, accessionNumber: string): Promise<FilingIndex | null>;
|
|
38
49
|
getFilingDocument(cik: string, accessionNumber: string, document: string): Promise<string>;
|
|
39
|
-
|
|
40
|
-
|
|
50
|
+
/**
|
|
51
|
+
* Fetch a filing document, returning `null` when the archive path exists but this document does not.
|
|
52
|
+
*/
|
|
53
|
+
tryGetFilingDocument(cik: string, accessionNumber: string, document: string): Promise<string | null>;
|
|
54
|
+
/** Fetch XBRL data for a concept. Returns `null` if the company does not report this tag. */
|
|
55
|
+
tryGetCompanyConcept(cik: string, taxonomy: string, tag: string): Promise<CompanyConceptResponse | null>;
|
|
56
|
+
/** Fetch cross-company frame data. Returns `null` if no companies report this combination. */
|
|
57
|
+
tryGetFrames(taxonomy: string, tag: string, unit: string, period: string): Promise<FramesResponse | null>;
|
|
58
|
+
/**
|
|
59
|
+
* Serialize throttle checks through a promise chain so concurrent callers
|
|
60
|
+
* can't observe a stale `lastRequestAt` and fire in parallel within one window.
|
|
61
|
+
*/
|
|
41
62
|
private throttle;
|
|
42
63
|
private getTickerCache;
|
|
43
64
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"edgar-api-service.d.ts","sourceRoot":"","sources":["../../../src/services/edgar/edgar-api-service.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EACV,QAAQ,EACR,sBAAsB,EACtB,YAAY,EACZ,WAAW,EACX,cAAc,EACd,mBAAmB,EAEpB,MAAM,YAAY,CAAC;AAapB,cAAM,eAAe;IACnB,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,WAAW,CAA0B;;
|
|
1
|
+
{"version":3,"file":"edgar-api-service.d.ts","sourceRoot":"","sources":["../../../src/services/edgar/edgar-api-service.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EACV,QAAQ,EACR,sBAAsB,EACtB,YAAY,EACZ,WAAW,EACX,cAAc,EACd,mBAAmB,EAEpB,MAAM,YAAY,CAAC;AAapB,cAAM,eAAe;IACnB,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,WAAW,CAA0B;IAC7C,OAAO,CAAC,aAAa,CAAoC;;IAOzD,0DAA0D;IACpD,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAwC3C,0DAA0D;IACpD,SAAS,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;IAW3C,kFAAkF;IAC5E,YAAY,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAYrD,sDAAsD;IAChD,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAiB7C,sFAAsF;IAChF,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAoBvD;;;;;OAKG;IACG,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,QAAQ,EAAE,CAAC;IAiD/D,2CAA2C;IACrC,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAO3D,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAOzD,aAAa,CAAC,MAAM,EAAE;QACpB,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;QAC7B,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QAC/B,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QAC7B,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QAC1B,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;KAC3B,GAAG,OAAO,CAAC,YAAY,CAAC;IAezB;;;OAGG;IACG,cAAc,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAoBhE,oFAAoF;IACpF,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAQpF,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAQ1F;;OAEG;IACH,oBAAoB,CAClB,GAAG,EAAE,MAAM,EACX,eAAe,EAAE,MAAM,EACvB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAQzB,6FAA6F;IAC7F,oBAAoB,CAClB,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,sBAAsB,GAAG,IAAI,CAAC;IAOzC,8FAA8F;IAC9F,YAAY,CACV,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAQjC;;;OAGG;IACH,OAAO,CAAC,QAAQ;YAcF,cAAc;CA8B7B;AASD,wBAAgB,mBAAmB,IAAI,IAAI,CAE1C;AAED,wBAAgB,kBAAkB,IAAI,eAAe,CAIpD"}
|
|
@@ -12,6 +12,7 @@ class EdgarApiService {
|
|
|
12
12
|
lastRequestAt = 0;
|
|
13
13
|
minIntervalMs;
|
|
14
14
|
tickerCache;
|
|
15
|
+
throttleQueue = Promise.resolve();
|
|
15
16
|
constructor() {
|
|
16
17
|
const config = getServerConfig();
|
|
17
18
|
this.minIntervalMs = Math.ceil(1000 / config.rateLimitRps);
|
|
@@ -57,6 +58,19 @@ class EdgarApiService {
|
|
|
57
58
|
}
|
|
58
59
|
return response.json();
|
|
59
60
|
}
|
|
61
|
+
/** Fetch JSON, returning `null` on 404 and throwing on other non-OK responses. */
|
|
62
|
+
async tryFetchJson(url) {
|
|
63
|
+
const response = await this.fetch(url);
|
|
64
|
+
if (response.status === 404)
|
|
65
|
+
return null;
|
|
66
|
+
if (!response.ok) {
|
|
67
|
+
throw serviceUnavailable(`SEC EDGAR API returned ${response.status} for ${url}`, {
|
|
68
|
+
url,
|
|
69
|
+
status: response.status,
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
return response.json();
|
|
73
|
+
}
|
|
60
74
|
/** Fetch raw text content (HTML filing documents). */
|
|
61
75
|
async fetchText(url) {
|
|
62
76
|
await this.throttle();
|
|
@@ -72,6 +86,23 @@ class EdgarApiService {
|
|
|
72
86
|
}
|
|
73
87
|
return response.text();
|
|
74
88
|
}
|
|
89
|
+
/** Fetch raw text content, returning `null` on 404 and throwing on other failures. */
|
|
90
|
+
async tryFetchText(url) {
|
|
91
|
+
await this.throttle();
|
|
92
|
+
const config = getServerConfig();
|
|
93
|
+
const response = await globalThis.fetch(url, {
|
|
94
|
+
headers: { 'User-Agent': config.userAgent },
|
|
95
|
+
});
|
|
96
|
+
if (response.status === 404)
|
|
97
|
+
return null;
|
|
98
|
+
if (!response.ok) {
|
|
99
|
+
throw serviceUnavailable(`SEC EDGAR returned ${response.status} for ${url}`, {
|
|
100
|
+
url,
|
|
101
|
+
status: response.status,
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
return response.text();
|
|
105
|
+
}
|
|
75
106
|
// --- CIK Resolution ---
|
|
76
107
|
/**
|
|
77
108
|
* Resolve a query (ticker, name, or CIK) to company match(es).
|
|
@@ -88,8 +119,9 @@ class EdgarApiService {
|
|
|
88
119
|
const match = cache.byCik.get(padded);
|
|
89
120
|
if (match)
|
|
90
121
|
return match;
|
|
91
|
-
//
|
|
92
|
-
return
|
|
122
|
+
// CIK may be valid even if absent from the tickers file (e.g. individual filers) —
|
|
123
|
+
// return a CIK-only match and let the caller resolve identity from submissions.
|
|
124
|
+
return { cik: padded };
|
|
93
125
|
}
|
|
94
126
|
// Short alphabetic → ticker
|
|
95
127
|
const upper = trimmed.toUpperCase();
|
|
@@ -104,6 +136,8 @@ class EdgarApiService {
|
|
|
104
136
|
const prefix = [];
|
|
105
137
|
const substring = [];
|
|
106
138
|
for (const entry of cache.allEntries) {
|
|
139
|
+
if (!entry.name)
|
|
140
|
+
continue;
|
|
107
141
|
const name = entry.name.toLowerCase();
|
|
108
142
|
if (name === lower) {
|
|
109
143
|
exact.push(entry);
|
|
@@ -147,31 +181,69 @@ class EdgarApiService {
|
|
|
147
181
|
url.searchParams.set('size', String(params.size ?? 20));
|
|
148
182
|
return this.fetchJson(url.toString());
|
|
149
183
|
}
|
|
150
|
-
|
|
184
|
+
/**
|
|
185
|
+
* Resolve likely company CIKs for a filing accession number using SEC search metadata.
|
|
186
|
+
* Returns zero or more padded 10-digit CIKs in SEC-provided order.
|
|
187
|
+
*/
|
|
188
|
+
async findFilingCiks(accessionNumber) {
|
|
189
|
+
const response = await this.searchFilings({ query: accessionNumber, size: 10 });
|
|
190
|
+
const normalizedAccession = accessionNumber.replace(/[^0-9]/g, '');
|
|
191
|
+
const ciks = new Set();
|
|
192
|
+
for (const hit of response.hits.hits) {
|
|
193
|
+
const hitAccession = (hit._source.adsh || hit._id.split(':')[0] || hit._id).replace(/[^0-9]/g, '');
|
|
194
|
+
if (hitAccession !== normalizedAccession)
|
|
195
|
+
continue;
|
|
196
|
+
for (const cik of hit._source.ciks ?? []) {
|
|
197
|
+
ciks.add(cik.padStart(10, '0'));
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
return [...ciks];
|
|
201
|
+
}
|
|
202
|
+
/** Fetch a filing's document index. Returns `null` if the filing does not exist. */
|
|
203
|
+
tryGetFilingIndex(cik, accessionNumber) {
|
|
151
204
|
const padded = cik.padStart(10, '0');
|
|
152
205
|
const noDashes = accessionNumber.replace(/-/g, '');
|
|
153
|
-
return this.
|
|
206
|
+
return this.tryFetchJson(`https://www.sec.gov/Archives/edgar/data/${padded}/${noDashes}/index.json`);
|
|
154
207
|
}
|
|
155
208
|
getFilingDocument(cik, accessionNumber, document) {
|
|
156
209
|
const padded = cik.padStart(10, '0');
|
|
157
210
|
const noDashes = accessionNumber.replace(/-/g, '');
|
|
158
211
|
return this.fetchText(`https://www.sec.gov/Archives/edgar/data/${padded}/${noDashes}/${document}`);
|
|
159
212
|
}
|
|
160
|
-
|
|
213
|
+
/**
|
|
214
|
+
* Fetch a filing document, returning `null` when the archive path exists but this document does not.
|
|
215
|
+
*/
|
|
216
|
+
tryGetFilingDocument(cik, accessionNumber, document) {
|
|
217
|
+
const padded = cik.padStart(10, '0');
|
|
218
|
+
const noDashes = accessionNumber.replace(/-/g, '');
|
|
219
|
+
return this.tryFetchText(`https://www.sec.gov/Archives/edgar/data/${padded}/${noDashes}/${document}`);
|
|
220
|
+
}
|
|
221
|
+
/** Fetch XBRL data for a concept. Returns `null` if the company does not report this tag. */
|
|
222
|
+
tryGetCompanyConcept(cik, taxonomy, tag) {
|
|
161
223
|
const padded = cik.padStart(10, '0');
|
|
162
|
-
return this.
|
|
224
|
+
return this.tryFetchJson(`https://data.sec.gov/api/xbrl/companyconcept/CIK${padded}/${taxonomy}/${tag}.json`);
|
|
163
225
|
}
|
|
164
|
-
|
|
165
|
-
|
|
226
|
+
/** Fetch cross-company frame data. Returns `null` if no companies report this combination. */
|
|
227
|
+
tryGetFrames(taxonomy, tag, unit, period) {
|
|
228
|
+
return this.tryFetchJson(`https://data.sec.gov/api/xbrl/frames/${taxonomy}/${tag}/${unit}/${period}.json`);
|
|
166
229
|
}
|
|
167
230
|
// --- Internals ---
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
231
|
+
/**
|
|
232
|
+
* Serialize throttle checks through a promise chain so concurrent callers
|
|
233
|
+
* can't observe a stale `lastRequestAt` and fire in parallel within one window.
|
|
234
|
+
*/
|
|
235
|
+
throttle() {
|
|
236
|
+
const next = this.throttleQueue.then(async () => {
|
|
237
|
+
const elapsed = Date.now() - this.lastRequestAt;
|
|
238
|
+
if (elapsed < this.minIntervalMs) {
|
|
239
|
+
await sleep(this.minIntervalMs - elapsed);
|
|
240
|
+
}
|
|
241
|
+
this.lastRequestAt = Date.now();
|
|
242
|
+
});
|
|
243
|
+
this.throttleQueue = next.catch(() => {
|
|
244
|
+
/* swallow: errors propagate to the caller's awaited chain, not the queue */
|
|
245
|
+
});
|
|
246
|
+
return next;
|
|
175
247
|
}
|
|
176
248
|
async getTickerCache() {
|
|
177
249
|
const config = getServerConfig();
|