@invinite-org/invinite-data-cli 3.0.0 → 4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +341 -374
- package/claude-plugin/.claude-plugin/plugin.json +1 -1
- package/claude-plugin/agents/invinite-data.md +59 -28
- package/claude-plugin/commands/analyze-earnings-call.md +15 -14
- package/claude-plugin/commands/analyze-filing.md +8 -7
- package/claude-plugin/commands/compare-companies.md +5 -5
- package/claude-plugin/commands/financial-research.md +9 -9
- package/claude-plugin/commands/ownership-review.md +6 -6
- package/claude-plugin/skills/invinite-data-cli/SKILL.md +466 -570
- package/dist/bin/invd.js +11 -2
- package/dist/bin/invd.js.map +1 -1
- package/dist/src/cli.d.ts +2 -0
- package/dist/src/cli.js +48 -29
- package/dist/src/cli.js.map +1 -1
- package/dist/src/client/api-client.d.ts +24 -24
- package/dist/src/client/api-client.js +52 -70
- package/dist/src/client/api-client.js.map +1 -1
- package/dist/src/client/pagination.d.ts +12 -11
- package/dist/src/client/pagination.js +47 -56
- package/dist/src/client/pagination.js.map +1 -1
- package/dist/src/commands/agent-setup.d.ts +21 -0
- package/dist/src/commands/agent-setup.js +112 -0
- package/dist/src/commands/agent-setup.js.map +1 -0
- package/dist/src/commands/api.d.ts +27 -0
- package/dist/src/commands/api.js +180 -0
- package/dist/src/commands/api.js.map +1 -0
- package/dist/src/commands/auth.d.ts +37 -0
- package/dist/src/commands/auth.js +336 -0
- package/dist/src/commands/auth.js.map +1 -0
- package/dist/src/commands/completion.d.ts +7 -0
- package/dist/src/commands/completion.js +115 -0
- package/dist/src/commands/completion.js.map +1 -0
- package/dist/src/commands/config.d.ts +4 -0
- package/dist/src/commands/config.js +85 -48
- package/dist/src/commands/config.js.map +1 -1
- package/dist/src/commands/plugin.d.ts +8 -0
- package/dist/src/commands/plugin.js +8 -10
- package/dist/src/commands/plugin.js.map +1 -1
- package/dist/src/config/auth.d.ts +17 -1
- package/dist/src/config/auth.js +50 -36
- package/dist/src/config/auth.js.map +1 -1
- package/dist/src/config/config-manager.d.ts +56 -4
- package/dist/src/config/config-manager.js +173 -29
- package/dist/src/config/config-manager.js.map +1 -1
- package/dist/src/config/toml.d.ts +7 -0
- package/dist/src/config/toml.js +79 -0
- package/dist/src/config/toml.js.map +1 -0
- package/dist/src/examples.d.ts +22 -0
- package/dist/src/examples.js +56 -0
- package/dist/src/examples.js.map +1 -0
- package/dist/src/generated/cli-manifest.json +5573 -5140
- package/dist/src/hand-written-commands.d.ts +11 -41
- package/dist/src/hand-written-commands.js +7 -17
- package/dist/src/hand-written-commands.js.map +1 -1
- package/dist/src/output/jq.d.ts +15 -0
- package/dist/src/output/jq.js +234 -0
- package/dist/src/output/jq.js.map +1 -0
- package/dist/src/output/options.d.ts +29 -0
- package/dist/src/output/options.js +72 -0
- package/dist/src/output/options.js.map +1 -0
- package/dist/src/output/render.d.ts +54 -0
- package/dist/src/output/render.js +160 -0
- package/dist/src/output/render.js.map +1 -0
- package/dist/src/shared/errors.d.ts +59 -15
- package/dist/src/shared/errors.js +126 -38
- package/dist/src/shared/errors.js.map +1 -1
- package/dist/src/shared/prompt.d.ts +10 -0
- package/dist/src/shared/prompt.js +24 -0
- package/dist/src/shared/prompt.js.map +1 -0
- package/dist/src/shared/spinner.js +2 -1
- package/dist/src/shared/spinner.js.map +1 -1
- package/dist/src/spec-commands.d.ts +14 -6
- package/dist/src/spec-commands.js +454 -174
- package/dist/src/spec-commands.js.map +1 -1
- package/dist/src/spec-flags.d.ts +11 -6
- package/dist/src/spec-flags.js +14 -7
- package/dist/src/spec-flags.js.map +1 -1
- package/dist/src/spec-manifest.d.ts +416 -116
- package/dist/src/spec-manifest.js +44 -13
- package/dist/src/spec-manifest.js.map +1 -1
- package/dist/src/update-notifier.d.ts +9 -0
- package/dist/src/update-notifier.js +63 -0
- package/dist/src/update-notifier.js.map +1 -0
- package/package.json +2 -3
- package/dist/src/client/earnings-live.d.ts +0 -194
- package/dist/src/client/earnings-live.js +0 -300
- package/dist/src/client/earnings-live.js.map +0 -1
- package/dist/src/client/news-live.d.ts +0 -72
- package/dist/src/client/news-live.js +0 -120
- package/dist/src/client/news-live.js.map +0 -1
- package/dist/src/client/pdf.d.ts +0 -15
- package/dist/src/client/pdf.js +0 -15
- package/dist/src/client/pdf.js.map +0 -1
- package/dist/src/client/websocket-client.d.ts +0 -19
- package/dist/src/client/websocket-client.js +0 -174
- package/dist/src/client/websocket-client.js.map +0 -1
- package/dist/src/commands/earnings.d.ts +0 -16
- package/dist/src/commands/earnings.js +0 -464
- package/dist/src/commands/earnings.js.map +0 -1
- package/dist/src/commands/login.d.ts +0 -15
- package/dist/src/commands/login.js +0 -249
- package/dist/src/commands/login.js.map +0 -1
- package/dist/src/commands/news.d.ts +0 -2
- package/dist/src/commands/news.js +0 -69
- package/dist/src/commands/news.js.map +0 -1
- package/dist/src/commands/sec.d.ts +0 -47
- package/dist/src/commands/sec.js +0 -191
- package/dist/src/commands/sec.js.map +0 -1
- package/dist/src/commands/ws.d.ts +0 -33
- package/dist/src/commands/ws.js +0 -116
- package/dist/src/commands/ws.js.map +0 -1
- package/dist/src/formatters/json-formatter.d.ts +0 -1
- package/dist/src/formatters/json-formatter.js +0 -4
- package/dist/src/formatters/json-formatter.js.map +0 -1
- package/dist/src/formatters/table-formatter.d.ts +0 -4
- package/dist/src/formatters/table-formatter.js +0 -73
- package/dist/src/formatters/table-formatter.js.map +0 -1
- package/dist/src/formatters/time.d.ts +0 -2
- package/dist/src/formatters/time.js +0 -14
- package/dist/src/formatters/time.js.map +0 -1
- package/dist/src/shared/output.d.ts +0 -3
- package/dist/src/shared/output.js +0 -13
- package/dist/src/shared/output.js.map +0 -1
- package/dist/src/shared/readiness.d.ts +0 -4
- package/dist/src/shared/readiness.js +0 -60
- package/dist/src/shared/readiness.js.map +0 -1
- package/dist/src/shared/types.d.ts +0 -11
- package/dist/src/shared/types.js +0 -2
- package/dist/src/shared/types.js.map +0 -1
|
@@ -1,300 +0,0 @@
|
|
|
1
|
-
import chalk from 'chalk';
|
|
2
|
-
import { formatMs } from '../formatters/time.js';
|
|
3
|
-
/**
|
|
4
|
-
* Pure pieces of `invd ws listen --earnings`: the subscribe frame and one step per server
|
|
5
|
-
* frame of IDA's `earnings-calls.live` channel (`src/routes/websocket/types/earningsMessages.ts`).
|
|
6
|
-
*/
|
|
7
|
-
export const EARNINGS_LIVE_CHANNEL = 'earnings-calls.live';
|
|
8
|
-
const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
9
|
-
/** Ends the run with exit 1. */
|
|
10
|
-
const FATAL_ERRORS = new Set(['forbidden_tier', 'not_live', 'not_found', 'subscription_limit', 'bad_message']);
|
|
11
|
-
/** Retried through the reconnect backoff. */
|
|
12
|
-
const RETRY_ERRORS = new Set(['attach_failed', 'unavailable']);
|
|
13
|
-
export const KEYWORD_MATCH_MODES = ['exact', 'stem'];
|
|
14
|
-
export const SPEAKER_ROLES = ['executive', 'ir_host', 'analyst', 'operator'];
|
|
15
|
-
const KEYWORD_MAX = 20;
|
|
16
|
-
const KEYWORD_MIN_CHARS = 2;
|
|
17
|
-
const KEYWORD_MAX_CHARS = 64;
|
|
18
|
-
/** `--earnings`: a UUID is an event_id, 1–10 digits a CIK. */
|
|
19
|
-
export function parseTarget(value) {
|
|
20
|
-
const target = value.trim();
|
|
21
|
-
if (UUID_RE.test(target))
|
|
22
|
-
return { event_id: target.toLowerCase() };
|
|
23
|
-
if (/^\d{1,10}$/.test(target))
|
|
24
|
-
return { cik: target };
|
|
25
|
-
throw new Error('--earnings takes an event ID (UUID) or a CIK (digits)');
|
|
26
|
-
}
|
|
27
|
-
/** `--since-seq`: an integer ≥ -1; default -1 (the whole call from its first final). */
|
|
28
|
-
export function parseSinceSeq(value) {
|
|
29
|
-
if (value === undefined)
|
|
30
|
-
return -1;
|
|
31
|
-
const seq = Number(value);
|
|
32
|
-
if (!Number.isInteger(seq) || seq < -1)
|
|
33
|
-
throw new Error('--since-seq takes an integer ≥ -1');
|
|
34
|
-
return seq;
|
|
35
|
-
}
|
|
36
|
-
/** `--keywords`: 1–20 keywords of 2–64 characters (the API's limits), trimmed and de-duplicated. */
|
|
37
|
-
export function parseKeywords(value) {
|
|
38
|
-
const keywords = [...new Set((value ?? '').split(',').map(k => k.trim()).filter(Boolean))];
|
|
39
|
-
if (keywords.length === 0)
|
|
40
|
-
throw new Error('--keywords takes a comma-separated list of 1–20 keywords');
|
|
41
|
-
if (keywords.length > KEYWORD_MAX)
|
|
42
|
-
throw new Error(`--keywords takes at most ${KEYWORD_MAX} keywords`);
|
|
43
|
-
const bad = keywords.filter(k => k.length < KEYWORD_MIN_CHARS || k.length > KEYWORD_MAX_CHARS);
|
|
44
|
-
if (bad.length)
|
|
45
|
-
throw new Error(`--keywords: each keyword is ${KEYWORD_MIN_CHARS}–${KEYWORD_MAX_CHARS} characters (${bad.join(', ')})`);
|
|
46
|
-
return keywords;
|
|
47
|
-
}
|
|
48
|
-
/** `--keyword-match`: `exact` (default) or `stem`. */
|
|
49
|
-
export function parseKeywordMatch(value) {
|
|
50
|
-
if (value === undefined)
|
|
51
|
-
return undefined;
|
|
52
|
-
if (KEYWORD_MATCH_MODES.includes(value))
|
|
53
|
-
return value;
|
|
54
|
-
throw new Error(`--keyword-match takes ${KEYWORD_MATCH_MODES.join(' or ')}`);
|
|
55
|
-
}
|
|
56
|
-
/** `--speaker-roles`: a comma-separated subset of executive, ir_host, analyst, operator. */
|
|
57
|
-
export function parseSpeakerRoles(value) {
|
|
58
|
-
if (value === undefined)
|
|
59
|
-
return undefined;
|
|
60
|
-
const roles = [...new Set(value.split(',').map(r => r.trim()).filter(Boolean))];
|
|
61
|
-
const unknown = roles.filter(r => !SPEAKER_ROLES.includes(r));
|
|
62
|
-
if (roles.length === 0 || unknown.length) {
|
|
63
|
-
const named = unknown.length ? `Unknown role(s): ${unknown.join(', ')}. ` : '';
|
|
64
|
-
throw new Error(`${named}--speaker-roles takes a comma-separated list of: ${SPEAKER_ROLES.join(', ')}`);
|
|
65
|
-
}
|
|
66
|
-
return roles;
|
|
67
|
-
}
|
|
68
|
-
/** `--min-rank`: a positive integer (market-cap rank). */
|
|
69
|
-
export function parseMinRank(value) {
|
|
70
|
-
if (value === undefined)
|
|
71
|
-
return undefined;
|
|
72
|
-
const rank = Number(value);
|
|
73
|
-
if (!Number.isInteger(rank) || rank < 1)
|
|
74
|
-
throw new Error('--min-rank takes a positive integer');
|
|
75
|
-
return rank;
|
|
76
|
-
}
|
|
77
|
-
export function isAllLive(target) {
|
|
78
|
-
return 'scope' in target;
|
|
79
|
-
}
|
|
80
|
-
/** What a global subscription receives (the API defaults to keyword hits only; `ws listen` wants the flashes too). */
|
|
81
|
-
export const ALL_LIVE_EVENTS = ['keyword_hit', 'guidance_flash'];
|
|
82
|
-
/**
|
|
83
|
-
* The subscribe frame. One call: target + `since_seq` + `partials`. Global scope: `scope: "all_live"`
|
|
84
|
-
* carries no call target, no replay, no partials and no prices — only the keyword fields (the API refuses it
|
|
85
|
-
* without keywords, and so does `ws listen`) and `events` = keyword hits + guidance flashes.
|
|
86
|
-
*/
|
|
87
|
-
export function subscribeFrame(target, sinceSeq, partials, keywords, prices = false) {
|
|
88
|
-
const alerts = keywords
|
|
89
|
-
? {
|
|
90
|
-
keywords: keywords.keywords,
|
|
91
|
-
...(keywords.keywordMatch ? { keyword_match: keywords.keywordMatch } : {}),
|
|
92
|
-
...(keywords.speakerRoles ? { speaker_roles: keywords.speakerRoles } : {}),
|
|
93
|
-
}
|
|
94
|
-
: {};
|
|
95
|
-
if (isAllLive(target)) {
|
|
96
|
-
return {
|
|
97
|
-
type: 'subscribe',
|
|
98
|
-
channel: EARNINGS_LIVE_CHANNEL,
|
|
99
|
-
scope: 'all_live',
|
|
100
|
-
...alerts,
|
|
101
|
-
events: [...ALL_LIVE_EVENTS],
|
|
102
|
-
...(keywords?.minRank !== undefined ? { min_rank: keywords.minRank } : {}),
|
|
103
|
-
};
|
|
104
|
-
}
|
|
105
|
-
return { type: 'subscribe', channel: EARNINGS_LIVE_CHANNEL, ...target, since_seq: sinceSeq, partials, ...alerts, ...(prices ? { prices: true } : {}) };
|
|
106
|
-
}
|
|
107
|
-
export function initialLiveState(sinceSeq) {
|
|
108
|
-
return { lastSeq: sinceSeq, eventId: null, names: null };
|
|
109
|
-
}
|
|
110
|
-
/** The assignment of `label` covering `seq` (the latest-starting one wins), else null. */
|
|
111
|
-
export function nameFor(assignments, label, seq) {
|
|
112
|
-
let best = null;
|
|
113
|
-
for (const a of assignments) {
|
|
114
|
-
if (a.speaker_label !== label || a.from_seq > seq || (a.to_seq !== null && seq > a.to_seq))
|
|
115
|
-
continue;
|
|
116
|
-
if (!best || a.from_seq > best.from_seq)
|
|
117
|
-
best = a;
|
|
118
|
-
}
|
|
119
|
-
return best?.name ?? null;
|
|
120
|
-
}
|
|
121
|
-
/** `[m:ss] name: text`, the name from the snapshot, else `Speaker <label>`. */
|
|
122
|
-
export function formatSegment(segment, assignments) {
|
|
123
|
-
const name = nameFor(assignments, segment.speaker_label, segment.seq)
|
|
124
|
-
?? (segment.speaker_label === null ? 'Speaker' : `Speaker ${segment.speaker_label}`);
|
|
125
|
-
return `[${formatMs(segment.start_ms)}] ${name}: ${segment.text}`;
|
|
126
|
-
}
|
|
127
|
-
/** The speaker of a keyword hit: the name the API resolved, else `Speaker <label>`, with the role. */
|
|
128
|
-
function hitSpeaker(hit) {
|
|
129
|
-
const name = hit.speaker_name ?? (hit.speaker_label === null ? 'Speaker' : `Speaker ${hit.speaker_label}`);
|
|
130
|
-
return hit.speaker_role ? `${name} (${hit.speaker_role})` : name;
|
|
131
|
-
}
|
|
132
|
-
/** One highlighted line per keyword hit: `[m:ss] keyword "x" · speaker: text` (+ the company in the global scope). */
|
|
133
|
-
export function formatKeywordHit(hit, allLive = false) {
|
|
134
|
-
const company = allLive ? `${hit.symbol} ` : '';
|
|
135
|
-
const layer = hit.layer === 'final' ? ' (final)' : '';
|
|
136
|
-
return chalk.yellow(`${company}[${formatMs(hit.start_ms)}] keyword "${hit.keyword}"${layer} · ${chalk.bold(hitSpeaker(hit))}: ${hit.text}`);
|
|
137
|
-
}
|
|
138
|
-
function guidanceValue(flash) {
|
|
139
|
-
const number = flash.low !== null && flash.high !== null
|
|
140
|
-
? `${flash.low}–${flash.high}`
|
|
141
|
-
: String(flash.point ?? flash.low ?? flash.high ?? '?');
|
|
142
|
-
return [flash.currency, number, flash.unit].filter(Boolean).join(' ');
|
|
143
|
-
}
|
|
144
|
-
/** One line per guidance flash: `[m:ss] guidance flash · metric period: value — "sentence"`. */
|
|
145
|
-
export function formatGuidanceFlash(flash, allLive = false) {
|
|
146
|
-
const company = allLive ? `${flash.symbol} ` : '';
|
|
147
|
-
const metric = flash.metric_normalized ?? flash.metric;
|
|
148
|
-
const period = flash.period_label ? ` ${flash.period_label}` : '';
|
|
149
|
-
const revision = flash.revision > 1 ? ` (revision ${flash.revision})` : '';
|
|
150
|
-
return chalk.cyan(`${company}[${formatMs(flash.start_ms)}] guidance flash${revision} · ${chalk.bold(`${metric}${period}: ${guidanceValue(flash)}`)} — "${flash.source_sentence}"`);
|
|
151
|
-
}
|
|
152
|
-
const NY_TIME = new Intl.DateTimeFormat('en-US', {
|
|
153
|
-
timeZone: 'America/New_York', hour: '2-digit', minute: '2-digit', second: '2-digit', hourCycle: 'h23',
|
|
154
|
-
});
|
|
155
|
-
/** Basis points with an explicit sign (a real minus). */
|
|
156
|
-
function formatBps(bps) {
|
|
157
|
-
const sign = bps > 0 ? '+' : bps < 0 ? '−' : '';
|
|
158
|
-
return `${sign}${Math.abs(bps).toFixed(1)} bp`;
|
|
159
|
-
}
|
|
160
|
-
/**
|
|
161
|
-
* One price tick as the in-place line: `[16:32:05 ET · 12:34] AAPL 336.08 +42.5 bp since call −127.5 bp on day
|
|
162
|
-
* (vol 1,240)` — green / red by the since-call return, dim from the snapshot fallback.
|
|
163
|
-
*/
|
|
164
|
-
export function formatPriceTick(tick) {
|
|
165
|
-
const clock = tick.call_ms === null ? '' : ` · ${formatMs(tick.call_ms)}`;
|
|
166
|
-
const parts = [
|
|
167
|
-
`[${NY_TIME.format(new Date(tick.at))} ET${clock}] ${chalk.bold(tick.symbol)} ${tick.price.toFixed(2)}`,
|
|
168
|
-
...(tick.return_bps === null ? [] : [`${formatBps(tick.return_bps)} since call`]),
|
|
169
|
-
...(tick.day_return_bps === null ? [] : [`${formatBps(tick.day_return_bps)} on day`]),
|
|
170
|
-
`(vol ${tick.volume.toLocaleString('en-US')})${tick.source === 'snapshot' ? ' (snapshot)' : ''}`,
|
|
171
|
-
];
|
|
172
|
-
const line = parts.join(' ');
|
|
173
|
-
if (tick.source === 'snapshot')
|
|
174
|
-
return chalk.dim(line);
|
|
175
|
-
if (tick.return_bps === null || tick.return_bps === 0)
|
|
176
|
-
return line;
|
|
177
|
-
return tick.return_bps > 0 ? chalk.green(line) : chalk.red(line);
|
|
178
|
-
}
|
|
179
|
-
export function finalTranscriptHint(eventId) {
|
|
180
|
-
return `final transcript: invd earnings transcript --event ${eventId ?? '<event_id>'}`;
|
|
181
|
-
}
|
|
182
|
-
/** IDA `UNSUBSCRIBE_REASONS` → the closing line; the transcript hint only where a transcript follows. */
|
|
183
|
-
function unsubscribedNote(reason, eventId) {
|
|
184
|
-
switch (reason) {
|
|
185
|
-
case 'transcript_ready':
|
|
186
|
-
return finalTranscriptHint(eventId);
|
|
187
|
-
case 'rescheduled':
|
|
188
|
-
return 'the call was rescheduled; listen again at the new time';
|
|
189
|
-
case 'no_transcript':
|
|
190
|
-
return `no final transcript yet; check later with: invd earnings transcript --event ${eventId ?? '<event_id>'}`;
|
|
191
|
-
default:
|
|
192
|
-
return 'this call produces no more live segments';
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
function namesLines(revision, assignments) {
|
|
196
|
-
return [
|
|
197
|
-
chalk.dim(`speaker names (revision ${revision})`),
|
|
198
|
-
...assignments.map(a => {
|
|
199
|
-
const detail = [a.title, a.firm].filter(Boolean).join(', ');
|
|
200
|
-
const range = `seq ${a.from_seq}–${a.to_seq ?? '…'}`;
|
|
201
|
-
return chalk.dim(` ${a.speaker_label} → ${a.name}${detail ? ` (${detail})` : ''}${a.role ? ` [${a.role}]` : ''} ${range}`);
|
|
202
|
-
}),
|
|
203
|
-
];
|
|
204
|
-
}
|
|
205
|
-
/** One server frame → the new state and what to print / do. Unknown frames are ignored. */
|
|
206
|
-
export function liveStep(state, frame, opts) {
|
|
207
|
-
switch (frame.type) {
|
|
208
|
-
case 'subscribed': {
|
|
209
|
-
if (opts.allLive || frame.scope === 'all_live') {
|
|
210
|
-
const keywords = Array.isArray(frame.keywords) ? ` · keywords: ${frame.keywords.join(', ')}` : '';
|
|
211
|
-
return { state, lines: [chalk.bold(`all live calls${keywords}`)] };
|
|
212
|
-
}
|
|
213
|
-
const latest = frame.current_seq === null ? 'none yet' : `latest ${frame.current_seq}`;
|
|
214
|
-
return {
|
|
215
|
-
state: { ...state, eventId: frame.event_id },
|
|
216
|
-
lines: [chalk.bold(`${frame.symbol} ${frame.conference_date} · ${frame.state} · from seq ${state.lastSeq + 1} (${latest})`)],
|
|
217
|
-
};
|
|
218
|
-
}
|
|
219
|
-
// Alerts never move `lastSeq`: a hit's seq is a segment seq the subscription still replays.
|
|
220
|
-
case 'keyword_hit':
|
|
221
|
-
return { state, lines: [formatKeywordHit(frame, opts.allLive)] };
|
|
222
|
-
case 'guidance_flash':
|
|
223
|
-
return { state, lines: [formatGuidanceFlash(frame, opts.allLive)] };
|
|
224
|
-
// The in-place line (the partial path): the newest of a tick and a transcript partial owns it.
|
|
225
|
-
case 'price_tick':
|
|
226
|
-
return { state, lines: [], partial: formatPriceTick(frame) };
|
|
227
|
-
case 'warning': {
|
|
228
|
-
const note = frame.code === 'global_scope_degraded'
|
|
229
|
-
? 'global scope degraded: some live calls may be missing from the keyword alerts'
|
|
230
|
-
: `${frame.code}${frame.message ? `: ${frame.message}` : ''}`;
|
|
231
|
-
return { state, lines: [chalk.yellow(`warning: ${note}`)] };
|
|
232
|
-
}
|
|
233
|
-
case 'transcript_segment': {
|
|
234
|
-
const assignments = state.names?.assignments ?? [];
|
|
235
|
-
if (!frame.is_final) {
|
|
236
|
-
return opts.partials ? { state, lines: [], partial: chalk.dim(formatSegment(frame, assignments)) } : { state, lines: [] };
|
|
237
|
-
}
|
|
238
|
-
return {
|
|
239
|
-
state: { ...state, lastSeq: Math.max(state.lastSeq, frame.seq) },
|
|
240
|
-
lines: [formatSegment(frame, assignments)],
|
|
241
|
-
};
|
|
242
|
-
}
|
|
243
|
-
case 'speaker_names': {
|
|
244
|
-
if (state.names && frame.revision <= state.names.revision)
|
|
245
|
-
return { state, lines: [] };
|
|
246
|
-
const names = { revision: frame.revision, assignments: frame.assignments ?? [] };
|
|
247
|
-
return { state: { ...state, names }, lines: opts.names ? namesLines(names.revision, names.assignments) : [] };
|
|
248
|
-
}
|
|
249
|
-
// `gap` and `resume_unavailable` are notes only — never a re-subscribe. Verified against IDA
|
|
250
|
-
// (invinite-data-api, 2026-10-10): a final inside a reported gap is still delivered once on
|
|
251
|
-
// the SAME subscription (`deliverFinal`, src/lib/earningsLiveBridge.ts:462-476), and so are
|
|
252
|
-
// gaps of a `since_seq` replay (`recordReportedGaps`, src/routes/websocket/earningsSubscriptions.ts:273).
|
|
253
|
-
// `resume_unavailable` is sent after a successful `subscribed` (earningsSubscriptions.ts:286-293);
|
|
254
|
-
// live delivery continues, and once the call's Ably history becomes readable the bridge
|
|
255
|
-
// back-fills missed finals into the existing subscriptions (`repass`, earningsLiveBridge.ts:660-690).
|
|
256
|
-
// A second subscribe would replay from the same ring and add a duplicate subscription.
|
|
257
|
-
case 'gap':
|
|
258
|
-
return { state, lines: [chalk.dim(`gap after seq ${frame.after_seq} (next ${frame.next_seq}); late segments still arrive`)] };
|
|
259
|
-
case 'call_started':
|
|
260
|
-
return { state, lines: [chalk.bold(`call started ${frame.at}`)] };
|
|
261
|
-
case 'call_ended':
|
|
262
|
-
return { state, lines: [chalk.bold(`call ended ${frame.at}`)] };
|
|
263
|
-
case 'transcript_provisional':
|
|
264
|
-
return { state, lines: [chalk.bold(`provisional transcript v${frame.version} (${frame.word_count} words, speakers not named yet)`)] };
|
|
265
|
-
case 'rescheduled':
|
|
266
|
-
return { state, lines: [chalk.bold(`rescheduled to ${frame.new_conference_date}`)] };
|
|
267
|
-
case 'transcript_ready':
|
|
268
|
-
return {
|
|
269
|
-
state,
|
|
270
|
-
lines: [chalk.bold(`transcript ready ${frame.at}`)],
|
|
271
|
-
end: { code: 0, message: finalTranscriptHint(state.eventId) },
|
|
272
|
-
};
|
|
273
|
-
case 'unsubscribed':
|
|
274
|
-
return {
|
|
275
|
-
state,
|
|
276
|
-
lines: [chalk.bold(`subscription ended: ${frame.reason}`)],
|
|
277
|
-
end: { code: 0, message: unsubscribedNote(frame.reason, state.eventId) },
|
|
278
|
-
};
|
|
279
|
-
case 'error': {
|
|
280
|
-
if (frame.code === 'resume_unavailable') {
|
|
281
|
-
return { state, lines: [chalk.dim('missed segments cannot be replayed for this call; live delivery continues')] };
|
|
282
|
-
}
|
|
283
|
-
if (RETRY_ERRORS.has(frame.code)) {
|
|
284
|
-
return { state, lines: [chalk.dim(`${frame.code}: ${frame.message}; retrying`)], reconnect: true };
|
|
285
|
-
}
|
|
286
|
-
const message = frame.code === 'forbidden_tier'
|
|
287
|
-
? `earnings-calls.live needs the PRO plan (${frame.message})`
|
|
288
|
-
: `${frame.code}: ${frame.message}`;
|
|
289
|
-
return { state, lines: [], end: { code: 1, message: FATAL_ERRORS.has(frame.code) ? message : `${message} (unknown error code)` } };
|
|
290
|
-
}
|
|
291
|
-
default:
|
|
292
|
-
return { state, lines: [] };
|
|
293
|
-
}
|
|
294
|
-
}
|
|
295
|
-
const EARNINGS_FRAME_TYPES = new Set(['error', 'unsubscribed', 'warning', 'keyword_hit', 'guidance_flash', 'price_tick']);
|
|
296
|
-
/** Frames of the earnings channel (the socket also carries `new_filing` broadcasts and pings). */
|
|
297
|
-
export function isEarningsFrame(frame) {
|
|
298
|
-
return EARNINGS_FRAME_TYPES.has(frame.type) || typeof frame.subscription_id === 'string';
|
|
299
|
-
}
|
|
300
|
-
//# sourceMappingURL=earnings-live.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"earnings-live.js","sourceRoot":"","sources":["../../../src/client/earnings-live.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Pure pieces of `invd ws listen --news`: the subscribe frame, the option parsers and one step per server frame of
|
|
3
|
-
* IDA's `news.live` channel (`src/routes/websocket/types/newsMessages.ts`). Every news frame carries
|
|
4
|
-
* `channel: "news.live"` — that, not its `type`, tells it apart from the earnings frames (both have `error` /
|
|
5
|
-
* `subscribed` / `unsubscribed`). A `news_item` frame's `item` is the same object as a `GET /v1/news` row.
|
|
6
|
-
*/
|
|
7
|
-
export declare const NEWS_LIVE_CHANNEL = "news.live";
|
|
8
|
-
/** IDA `NEWS_KINDS` (`src/lib/news/constants.ts`) — change both or neither. */
|
|
9
|
-
export declare const NEWS_KINDS: readonly ["earnings_results", "results_date", "call_announcement", "event_announcement", "guidance", "m_and_a", "material_agreement", "management_change", "dividend", "capital_markets", "legal_spam", "promo", "other"];
|
|
10
|
-
/** IDA `NEWS_SOURCE_FILTERS`: the item's first source, SEC EDGAR or a company newsroom. */
|
|
11
|
-
export declare const NEWS_SOURCES: readonly ["edgar", "ir"];
|
|
12
|
-
export interface NewsListenOptions {
|
|
13
|
-
tickers?: string[];
|
|
14
|
-
ciks?: string[];
|
|
15
|
-
kinds?: string[];
|
|
16
|
-
sources?: string[];
|
|
17
|
-
earningsOnly: boolean;
|
|
18
|
-
/** NDJSON: every news frame as one line, nothing else on stdout. */
|
|
19
|
-
json: boolean;
|
|
20
|
-
}
|
|
21
|
-
/** The pushed item's fields `ws listen` prints (the full row is in `--json`). */
|
|
22
|
-
export interface NewsItemRow {
|
|
23
|
-
id: string;
|
|
24
|
-
title: string;
|
|
25
|
-
url: string;
|
|
26
|
-
published_at: string;
|
|
27
|
-
symbols: string[];
|
|
28
|
-
/** IDA `publicSource`: `edgar`, or `ir` with the newsroom's host in `host`. */
|
|
29
|
-
source: {
|
|
30
|
-
id: string;
|
|
31
|
-
host?: string | null;
|
|
32
|
-
};
|
|
33
|
-
is_earnings_news?: boolean;
|
|
34
|
-
attribution?: {
|
|
35
|
-
publisher?: string;
|
|
36
|
-
};
|
|
37
|
-
}
|
|
38
|
-
/** `--tickers`: 1–50 tickers (letters, digits, `.` and `-`; `BRK.B` and `BRK-B` both match). */
|
|
39
|
-
export declare function parseTickers(value: string | undefined): string[] | undefined;
|
|
40
|
-
/** `--ciks`: 1–50 CIKs (digits, padded or not). */
|
|
41
|
-
export declare function parseCiks(value: string | undefined): string[] | undefined;
|
|
42
|
-
export declare const parseNewsKinds: (value: string | undefined) => string[] | undefined;
|
|
43
|
-
export declare const parseNewsSources: (value: string | undefined) => string[] | undefined;
|
|
44
|
-
/** The `news.live` subscribe frame; an absent filter is left out (no filter = every new item). */
|
|
45
|
-
export declare function newsSubscribeFrame(opts: NewsListenOptions): {
|
|
46
|
-
sources?: string[] | undefined;
|
|
47
|
-
kinds?: string[] | undefined;
|
|
48
|
-
earnings_only?: boolean | undefined;
|
|
49
|
-
ciks?: string[] | undefined;
|
|
50
|
-
tickers?: string[] | undefined;
|
|
51
|
-
type: string;
|
|
52
|
-
channel: string;
|
|
53
|
-
};
|
|
54
|
-
/** A frame of the news channel (the socket also carries `new_filing` broadcasts, pings and earnings frames). */
|
|
55
|
-
export declare function isNewsFrame(frame: Record<string, any>): boolean;
|
|
56
|
-
/**
|
|
57
|
-
* One line per item: `2026-10-29 13:03:22Z nvidianews.nvidia.com NVDA NVIDIA Announces Rubin <url>` — time,
|
|
58
|
-
* source, tickers, headline, the original link (the headline is the publisher's, so its source travels with it).
|
|
59
|
-
*/
|
|
60
|
-
export declare function formatNewsItem(item: NewsItemRow): string;
|
|
61
|
-
export interface NewsStep {
|
|
62
|
-
lines: string[];
|
|
63
|
-
/** Stop: exit code + a closing line. */
|
|
64
|
-
end?: {
|
|
65
|
-
code: 0 | 1;
|
|
66
|
-
message: string;
|
|
67
|
-
};
|
|
68
|
-
/** Close the socket and resubscribe through the backoff (`unavailable`). */
|
|
69
|
-
reconnect?: boolean;
|
|
70
|
-
}
|
|
71
|
-
/** One news frame → what to print / do. Unknown frames are ignored. */
|
|
72
|
-
export declare function newsStep(frame: Record<string, any>): NewsStep;
|
|
@@ -1,120 +0,0 @@
|
|
|
1
|
-
import chalk from 'chalk';
|
|
2
|
-
/**
|
|
3
|
-
* Pure pieces of `invd ws listen --news`: the subscribe frame, the option parsers and one step per server frame of
|
|
4
|
-
* IDA's `news.live` channel (`src/routes/websocket/types/newsMessages.ts`). Every news frame carries
|
|
5
|
-
* `channel: "news.live"` — that, not its `type`, tells it apart from the earnings frames (both have `error` /
|
|
6
|
-
* `subscribed` / `unsubscribed`). A `news_item` frame's `item` is the same object as a `GET /v1/news` row.
|
|
7
|
-
*/
|
|
8
|
-
export const NEWS_LIVE_CHANNEL = 'news.live';
|
|
9
|
-
/** IDA `NEWS_KINDS` (`src/lib/news/constants.ts`) — change both or neither. */
|
|
10
|
-
export const NEWS_KINDS = [
|
|
11
|
-
'earnings_results', 'results_date', 'call_announcement', 'event_announcement', 'guidance', 'm_and_a',
|
|
12
|
-
'material_agreement', 'management_change', 'dividend', 'capital_markets', 'legal_spam', 'promo', 'other',
|
|
13
|
-
];
|
|
14
|
-
/** IDA `NEWS_SOURCE_FILTERS`: the item's first source, SEC EDGAR or a company newsroom. */
|
|
15
|
-
export const NEWS_SOURCES = ['edgar', 'ir'];
|
|
16
|
-
/** IDA `NEWS_WS_MAX_IDENTIFIERS`: tickers / CIKs one subscription may name. */
|
|
17
|
-
const MAX_IDENTIFIERS = 50;
|
|
18
|
-
const list = (value) => [...new Set((value ?? '').split(',').map(v => v.trim()).filter(Boolean))];
|
|
19
|
-
/** `--tickers`: 1–50 tickers (letters, digits, `.` and `-`; `BRK.B` and `BRK-B` both match). */
|
|
20
|
-
export function parseTickers(value) {
|
|
21
|
-
if (value === undefined)
|
|
22
|
-
return undefined;
|
|
23
|
-
const tickers = list(value).map(t => t.toUpperCase());
|
|
24
|
-
if (tickers.length === 0 || tickers.length > MAX_IDENTIFIERS)
|
|
25
|
-
throw new Error(`--tickers takes 1–${MAX_IDENTIFIERS} comma-separated tickers`);
|
|
26
|
-
const bad = tickers.filter(t => !/^[A-Z0-9.-]{1,20}$/.test(t));
|
|
27
|
-
if (bad.length)
|
|
28
|
-
throw new Error(`--tickers: not a ticker: ${bad.join(', ')}`);
|
|
29
|
-
return tickers;
|
|
30
|
-
}
|
|
31
|
-
/** `--ciks`: 1–50 CIKs (digits, padded or not). */
|
|
32
|
-
export function parseCiks(value) {
|
|
33
|
-
if (value === undefined)
|
|
34
|
-
return undefined;
|
|
35
|
-
const ciks = list(value);
|
|
36
|
-
if (ciks.length === 0 || ciks.length > MAX_IDENTIFIERS)
|
|
37
|
-
throw new Error(`--ciks takes 1–${MAX_IDENTIFIERS} comma-separated CIKs`);
|
|
38
|
-
const bad = ciks.filter(c => !/^\d{1,10}$/.test(c));
|
|
39
|
-
if (bad.length)
|
|
40
|
-
throw new Error(`--ciks: not a CIK: ${bad.join(', ')}`);
|
|
41
|
-
return ciks;
|
|
42
|
-
}
|
|
43
|
-
function parseEnumList(flag, value, allowed) {
|
|
44
|
-
if (value === undefined)
|
|
45
|
-
return undefined;
|
|
46
|
-
const values = list(value);
|
|
47
|
-
const unknown = values.filter(v => !allowed.includes(v));
|
|
48
|
-
if (values.length === 0 || unknown.length) {
|
|
49
|
-
const named = unknown.length ? `Unknown value(s): ${unknown.join(', ')}. ` : '';
|
|
50
|
-
throw new Error(`${named}${flag} takes a comma-separated list of: ${allowed.join(', ')}`);
|
|
51
|
-
}
|
|
52
|
-
return values;
|
|
53
|
-
}
|
|
54
|
-
export const parseNewsKinds = (value) => parseEnumList('--news-kinds', value, NEWS_KINDS);
|
|
55
|
-
export const parseNewsSources = (value) => parseEnumList('--news-sources', value, NEWS_SOURCES);
|
|
56
|
-
/** The `news.live` subscribe frame; an absent filter is left out (no filter = every new item). */
|
|
57
|
-
export function newsSubscribeFrame(opts) {
|
|
58
|
-
return {
|
|
59
|
-
type: 'subscribe',
|
|
60
|
-
channel: NEWS_LIVE_CHANNEL,
|
|
61
|
-
...(opts.tickers?.length ? { tickers: opts.tickers } : {}),
|
|
62
|
-
...(opts.ciks?.length ? { ciks: opts.ciks } : {}),
|
|
63
|
-
...(opts.earningsOnly ? { earnings_only: true } : {}),
|
|
64
|
-
...(opts.kinds?.length ? { kinds: opts.kinds } : {}),
|
|
65
|
-
...(opts.sources?.length ? { sources: opts.sources } : {}),
|
|
66
|
-
};
|
|
67
|
-
}
|
|
68
|
-
/** A frame of the news channel (the socket also carries `new_filing` broadcasts, pings and earnings frames). */
|
|
69
|
-
export function isNewsFrame(frame) {
|
|
70
|
-
return frame.channel === NEWS_LIVE_CHANNEL || frame.type === 'news_item';
|
|
71
|
-
}
|
|
72
|
-
/** `edgar` → `SEC EDGAR`, `ir` → the newsroom's host (`source.host`). */
|
|
73
|
-
function sourceName(source) {
|
|
74
|
-
if (source.id === 'edgar')
|
|
75
|
-
return 'SEC EDGAR';
|
|
76
|
-
return source.id === 'ir' ? (source.host ?? 'company newsroom') : source.id;
|
|
77
|
-
}
|
|
78
|
-
/**
|
|
79
|
-
* One line per item: `2026-10-29 13:03:22Z nvidianews.nvidia.com NVDA NVIDIA Announces Rubin <url>` — time,
|
|
80
|
-
* source, tickers, headline, the original link (the headline is the publisher's, so its source travels with it).
|
|
81
|
-
*/
|
|
82
|
-
export function formatNewsItem(item) {
|
|
83
|
-
const at = item.published_at.replace('T', ' ').replace(/\.\d+Z$/, 'Z');
|
|
84
|
-
const tickers = item.symbols.length ? item.symbols.join(',') : '—';
|
|
85
|
-
const earnings = item.is_earnings_news ? ` ${chalk.yellow('[earnings]')}` : '';
|
|
86
|
-
return `${chalk.dim(at)} ${sourceName(item.source)} ${chalk.bold(tickers)} ${item.title}${earnings} ${chalk.dim(item.url)}`;
|
|
87
|
-
}
|
|
88
|
-
/** One news frame → what to print / do. Unknown frames are ignored. */
|
|
89
|
-
export function newsStep(frame) {
|
|
90
|
-
switch (frame.type) {
|
|
91
|
-
case 'subscribed': {
|
|
92
|
-
const f = frame.filters ?? {};
|
|
93
|
-
const scope = [
|
|
94
|
-
f.tickers?.length ? `tickers ${f.tickers.join(',')}` : null,
|
|
95
|
-
f.ciks?.length ? `CIKs ${f.ciks.join(',')}` : null,
|
|
96
|
-
f.kinds?.length ? `kinds ${f.kinds.join(',')}` : null,
|
|
97
|
-
f.sources?.length ? `sources ${f.sources.join(',')}` : null,
|
|
98
|
-
f.earnings_only ? 'earnings only' : null,
|
|
99
|
-
].filter(Boolean);
|
|
100
|
-
return { lines: [chalk.bold(`news.live · ${scope.length ? scope.join(' · ') : 'every company'}`)] };
|
|
101
|
-
}
|
|
102
|
-
case 'news_item':
|
|
103
|
-
return { lines: frame.item ? [formatNewsItem(frame.item)] : [] };
|
|
104
|
-
case 'unsubscribed':
|
|
105
|
-
return { lines: [], end: { code: 0, message: 'news subscription ended' } };
|
|
106
|
-
case 'error': {
|
|
107
|
-
if (frame.code === 'unavailable')
|
|
108
|
-
return { lines: [chalk.dim(`unavailable: ${frame.message}; retrying`)], reconnect: true };
|
|
109
|
-
const message = frame.code === 'forbidden_tier'
|
|
110
|
-
? `news.live needs the STANDARD plan (${frame.message})`
|
|
111
|
-
: frame.code === 'channel_unavailable'
|
|
112
|
-
? `live news is not enabled on the API yet (${frame.message})`
|
|
113
|
-
: `${frame.code}: ${frame.message}`;
|
|
114
|
-
return { lines: [], end: { code: 1, message } };
|
|
115
|
-
}
|
|
116
|
-
default:
|
|
117
|
-
return { lines: [] };
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
//# sourceMappingURL=news-live.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"news-live.js","sourceRoot":"","sources":["../../../src/client/news-live.ts"],"names":[],"mappings":"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"}
|
package/dist/src/client/pdf.d.ts
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
/** The answer's `pdf` object (`GET /v1/earnings-calls/transcript`, `GET /v1/news/{id}`); null while none exists. */
|
|
2
|
-
interface Pdf {
|
|
3
|
-
url: string;
|
|
4
|
-
}
|
|
5
|
-
/** `--pdf-out <file>`: saves the PDF from its public URL (no API key). No PDF is an error, so a script sees it. */
|
|
6
|
-
export declare function savePdf(pdf: Pdf | null | undefined, opts: {
|
|
7
|
-
pdfOut?: string;
|
|
8
|
-
force?: boolean;
|
|
9
|
-
}, spinnerText: string): Promise<{
|
|
10
|
-
path: string;
|
|
11
|
-
bytes: number;
|
|
12
|
-
} | undefined>;
|
|
13
|
-
/** `--pdf`: the URL alone, so it can be piped; a note without a PDF. */
|
|
14
|
-
export declare function printPdfUrl(pdf: Pdf | null | undefined): void;
|
|
15
|
-
export {};
|
package/dist/src/client/pdf.js
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import chalk from 'chalk';
|
|
2
|
-
import { downloadToFile } from './download.js';
|
|
3
|
-
/** `--pdf-out <file>`: saves the PDF from its public URL (no API key). No PDF is an error, so a script sees it. */
|
|
4
|
-
export async function savePdf(pdf, opts, spinnerText) {
|
|
5
|
-
if (!opts.pdfOut)
|
|
6
|
-
return undefined;
|
|
7
|
-
if (!pdf)
|
|
8
|
-
throw new Error('No PDF yet for this version');
|
|
9
|
-
return downloadToFile(pdf.url, opts.pdfOut, { force: opts.force, spinnerText });
|
|
10
|
-
}
|
|
11
|
-
/** `--pdf`: the URL alone, so it can be piped; a note without a PDF. */
|
|
12
|
-
export function printPdfUrl(pdf) {
|
|
13
|
-
console.log(pdf ? pdf.url : chalk.yellow('No PDF yet'));
|
|
14
|
-
}
|
|
15
|
-
//# sourceMappingURL=pdf.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pdf.js","sourceRoot":"","sources":["../../../src/client/pdf.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAO/C,mHAAmH;AACnH,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,GAA2B,EAC3B,IAA0C,EAC1C,WAAmB;IAEnB,IAAI,CAAC,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IACnC,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;IACzD,OAAO,cAAc,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;AAClF,CAAC;AAED,wEAAwE;AACxE,MAAM,UAAU,WAAW,CAAC,GAA2B;IACrD,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC;AAC1D,CAAC"}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import { type KeywordOptions, type LiveTarget } from './earnings-live.js';
|
|
2
|
-
import { type NewsListenOptions } from './news-live.js';
|
|
3
|
-
export interface EarningsListenOptions {
|
|
4
|
-
target: LiveTarget;
|
|
5
|
-
sinceSeq: number;
|
|
6
|
-
partials: boolean;
|
|
7
|
-
names: boolean;
|
|
8
|
-
/** NDJSON: every earnings frame as one line, nothing else on stdout. */
|
|
9
|
-
json: boolean;
|
|
10
|
-
/** Price ticks of the call (`prices: true`; per-call only). */
|
|
11
|
-
prices?: boolean;
|
|
12
|
-
/** Keyword / guidance alerts on the subscription (required with the `all_live` target). */
|
|
13
|
-
keywords?: KeywordOptions;
|
|
14
|
-
}
|
|
15
|
-
/** `earnings` and `news` exclude each other (`ws listen` refuses both); neither = the filing stream. */
|
|
16
|
-
export declare function connectWebSocket(opts?: {
|
|
17
|
-
earnings?: EarningsListenOptions;
|
|
18
|
-
news?: NewsListenOptions;
|
|
19
|
-
}): Promise<void>;
|