@invinite-org/invinite-data-cli 0.1.22 → 0.2.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 +304 -6
- package/claude-plugin/.claude-plugin/plugin.json +2 -2
- package/claude-plugin/agents/invinite-data.md +5 -1
- package/claude-plugin/commands/analyze-earnings-call.md +24 -0
- package/claude-plugin/commands/financial-research.md +2 -1
- package/claude-plugin/skills/invinite-data-cli/SKILL.md +82 -1
- package/dist/src/cli.d.ts +2 -0
- package/dist/src/cli.js +22 -1
- package/dist/src/cli.js.map +1 -1
- package/dist/src/client/api-client.d.ts +13 -1
- package/dist/src/client/api-client.js +46 -13
- package/dist/src/client/api-client.js.map +1 -1
- package/dist/src/client/download.d.ts +23 -0
- package/dist/src/client/download.js +116 -0
- package/dist/src/client/download.js.map +1 -0
- package/dist/src/client/earnings-live.d.ts +79 -0
- package/dist/src/client/earnings-live.js +156 -0
- package/dist/src/client/earnings-live.js.map +1 -0
- package/dist/src/client/pagination.js +2 -1
- package/dist/src/client/pagination.js.map +1 -1
- package/dist/src/client/websocket-client.d.ts +12 -1
- package/dist/src/client/websocket-client.js +114 -37
- package/dist/src/client/websocket-client.js.map +1 -1
- package/dist/src/commands/earnings-selector.d.ts +15 -0
- package/dist/src/commands/earnings-selector.js +29 -0
- package/dist/src/commands/earnings-selector.js.map +1 -0
- package/dist/src/commands/earnings.d.ts +13 -0
- package/dist/src/commands/earnings.js +705 -0
- package/dist/src/commands/earnings.js.map +1 -0
- package/dist/src/commands/plugin.d.ts +11 -0
- package/dist/src/commands/plugin.js +23 -8
- package/dist/src/commands/plugin.js.map +1 -1
- package/dist/src/commands/webhooks.d.ts +6 -0
- package/dist/src/commands/webhooks.js +144 -0
- package/dist/src/commands/webhooks.js.map +1 -0
- package/dist/src/commands/ws.js +23 -3
- package/dist/src/commands/ws.js.map +1 -1
- package/dist/src/formatters/flatten.d.ts +4 -0
- package/dist/src/formatters/flatten.js +15 -0
- package/dist/src/formatters/flatten.js.map +1 -0
- package/dist/src/formatters/time.d.ts +2 -0
- package/dist/src/formatters/time.js +14 -0
- package/dist/src/formatters/time.js.map +1 -0
- package/dist/src/shared/errors.d.ts +2 -1
- package/dist/src/shared/errors.js +5 -1
- package/dist/src/shared/errors.js.map +1 -1
- package/dist/src/shared/options.d.ts +2 -0
- package/dist/src/shared/options.js +6 -0
- package/dist/src/shared/options.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,57 +1,134 @@
|
|
|
1
1
|
import { getApiKey } from '../config/auth.js';
|
|
2
2
|
import { getBaseUrl } from '../config/config-manager.js';
|
|
3
3
|
import chalk from 'chalk';
|
|
4
|
-
|
|
4
|
+
import { initialLiveState, isEarningsFrame, liveStep, subscribeFrame, } from './earnings-live.js';
|
|
5
|
+
/** Close codes of `/v1/ws` that a reconnect cannot fix (bad key, plan, connection limit). */
|
|
6
|
+
const PERMANENT_CLOSE_CODES = new Set([4001, 4003, 4029]);
|
|
7
|
+
const CLEAR_LINE = '\r\x1b[2K';
|
|
8
|
+
export async function connectWebSocket(opts = {}) {
|
|
5
9
|
const apiKey = await getApiKey();
|
|
6
10
|
const base = getBaseUrl().replace(/\/+$/, '').replace(/^http/, 'ws');
|
|
7
11
|
const url = `${base}/v1/ws?api_key=${encodeURIComponent(apiKey)}`;
|
|
12
|
+
const earnings = opts.earnings;
|
|
13
|
+
const status = (line) => {
|
|
14
|
+
if (!earnings?.json)
|
|
15
|
+
console.log(line);
|
|
16
|
+
};
|
|
8
17
|
let reconnectDelay = 1000;
|
|
9
18
|
let shouldReconnect = true;
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
19
|
+
let current = null;
|
|
20
|
+
let live = earnings ? initialLiveState(earnings.sinceSeq) : null;
|
|
21
|
+
let partialShown = false;
|
|
22
|
+
return new Promise((resolve, reject) => {
|
|
23
|
+
function clearPartial() {
|
|
24
|
+
if (partialShown) {
|
|
25
|
+
process.stdout.write(CLEAR_LINE);
|
|
26
|
+
partialShown = false;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
function finish(error) {
|
|
30
|
+
shouldReconnect = false;
|
|
31
|
+
clearPartial();
|
|
32
|
+
current?.close();
|
|
33
|
+
if (error)
|
|
34
|
+
reject(error);
|
|
35
|
+
else
|
|
36
|
+
resolve();
|
|
37
|
+
}
|
|
38
|
+
function handleEarnings(ws, data) {
|
|
39
|
+
if (!earnings || !live || !isEarningsFrame(data))
|
|
40
|
+
return;
|
|
41
|
+
if (earnings.json)
|
|
42
|
+
console.log(JSON.stringify(data));
|
|
43
|
+
const step = liveStep(live, data, earnings);
|
|
44
|
+
live = step.state;
|
|
45
|
+
if (!earnings.json) {
|
|
46
|
+
if (step.lines.length)
|
|
47
|
+
clearPartial();
|
|
48
|
+
for (const line of step.lines)
|
|
49
|
+
console.log(line);
|
|
50
|
+
if (step.partial && process.stdout.isTTY) {
|
|
51
|
+
const width = (process.stdout.columns ?? 80) - 1;
|
|
52
|
+
process.stdout.write(CLEAR_LINE + step.partial.slice(0, width));
|
|
53
|
+
partialShown = true;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
if (step.end) {
|
|
57
|
+
if (step.end.code === 0) {
|
|
58
|
+
status(chalk.dim(step.end.message));
|
|
59
|
+
finish();
|
|
27
60
|
}
|
|
28
61
|
else {
|
|
29
|
-
|
|
62
|
+
finish(new Error(step.end.message));
|
|
30
63
|
}
|
|
31
64
|
}
|
|
32
|
-
|
|
33
|
-
|
|
65
|
+
else if (step.reconnect) {
|
|
66
|
+
ws.close();
|
|
34
67
|
}
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
68
|
+
}
|
|
69
|
+
function connect() {
|
|
70
|
+
status(chalk.dim('Connecting to WebSocket...'));
|
|
71
|
+
const ws = new WebSocket(url);
|
|
72
|
+
current = ws;
|
|
73
|
+
ws.addEventListener('open', () => {
|
|
74
|
+
reconnectDelay = 1000;
|
|
75
|
+
if (earnings && live) {
|
|
76
|
+
status(chalk.green(`Connected; subscribing to ${earnings.partials ? 'live transcript + partials' : 'live transcript'}`));
|
|
77
|
+
// A reconnect resumes after the last printed final (the API replays the gap).
|
|
78
|
+
ws.send(JSON.stringify(subscribeFrame(earnings.target, live.lastSeq, earnings.partials)));
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
console.log(chalk.green('Connected to filing stream'));
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
ws.addEventListener('message', (event) => {
|
|
85
|
+
try {
|
|
86
|
+
const data = JSON.parse(String(event.data));
|
|
87
|
+
if (data.type === 'ping')
|
|
88
|
+
return;
|
|
89
|
+
if (earnings) {
|
|
90
|
+
handleEarnings(ws, data);
|
|
91
|
+
}
|
|
92
|
+
else if (data.type === 'new_filing') {
|
|
93
|
+
const f = data.filing;
|
|
94
|
+
console.log(chalk.bold(`[${f.form_type}]`) + ` ${f.cik} - Filed ${f.filing_date}`);
|
|
95
|
+
if (f.html_url)
|
|
96
|
+
console.log(chalk.dim(` ${f.html_url}`));
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
console.log(JSON.stringify(data, null, 2));
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
if (!earnings)
|
|
104
|
+
console.log(String(event.data));
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
ws.addEventListener('close', (event) => {
|
|
108
|
+
if (!shouldReconnect)
|
|
109
|
+
return;
|
|
110
|
+
if (PERMANENT_CLOSE_CODES.has(event.code)) {
|
|
111
|
+
finish(new Error(`WebSocket closed (${event.code}): ${event.reason || 'refused'}`));
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
clearPartial();
|
|
115
|
+
status(chalk.yellow(`Disconnected. Reconnecting in ${reconnectDelay / 1000}s...`));
|
|
39
116
|
setTimeout(connect, reconnectDelay);
|
|
40
117
|
reconnectDelay = Math.min(reconnectDelay * 2, 30000);
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
118
|
+
});
|
|
119
|
+
ws.addEventListener('error', (error) => {
|
|
120
|
+
if (!earnings?.json)
|
|
121
|
+
console.error(chalk.red('WebSocket error:'), error);
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
process.once('SIGINT', () => {
|
|
47
125
|
shouldReconnect = false;
|
|
48
|
-
|
|
49
|
-
|
|
126
|
+
clearPartial();
|
|
127
|
+
current?.close();
|
|
128
|
+
status(chalk.dim('\nDisconnected.'));
|
|
50
129
|
process.exit(0);
|
|
51
130
|
});
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
// Keep process alive
|
|
55
|
-
await new Promise(() => { });
|
|
131
|
+
connect();
|
|
132
|
+
});
|
|
56
133
|
}
|
|
57
134
|
//# sourceMappingURL=websocket-client.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"websocket-client.js","sourceRoot":"","sources":["../../../src/client/websocket-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AACzD,OAAO,KAAK,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"websocket-client.js","sourceRoot":"","sources":["../../../src/client/websocket-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
/** IDA's own wording (`eventSelectorSchema`) for an incomplete selector. */
|
|
3
|
+
export declare const SELECTOR_MESSAGE = "Provide event_id, or identifier with year+quarter or date";
|
|
4
|
+
export interface SelectorOptions {
|
|
5
|
+
event?: string;
|
|
6
|
+
identifier?: string;
|
|
7
|
+
year?: string;
|
|
8
|
+
quarter?: string;
|
|
9
|
+
date?: string;
|
|
10
|
+
}
|
|
11
|
+
/** Adds the event selector: `--event <uuid>`, or `-i` with `--year` + `--quarter` or `--date`. */
|
|
12
|
+
export declare function selectorOptions(cmd: Command): Command;
|
|
13
|
+
export declare function selectorParams(opts: SelectorOptions): Record<string, string | undefined>;
|
|
14
|
+
/** Throws (→ `withErrorHandling` exits 1) unless one selector form is complete. */
|
|
15
|
+
export declare function validateSelector(opts: SelectorOptions): void;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/** IDA's own wording (`eventSelectorSchema`) for an incomplete selector. */
|
|
2
|
+
export const SELECTOR_MESSAGE = 'Provide event_id, or identifier with year+quarter or date';
|
|
3
|
+
/** Adds the event selector: `--event <uuid>`, or `-i` with `--year` + `--quarter` or `--date`. */
|
|
4
|
+
export function selectorOptions(cmd) {
|
|
5
|
+
return cmd
|
|
6
|
+
.option('--event <event_id>', 'Event ID (wins over the other selectors)')
|
|
7
|
+
.option('-i, --identifier <ticker>', 'Ticker or CIK (with --year + --quarter, or --date)')
|
|
8
|
+
.option('--year <n>', 'Fiscal year of the call (with --quarter)')
|
|
9
|
+
.option('--quarter <n>', 'Fiscal quarter of the call (with --year)')
|
|
10
|
+
.option('--date <date>', 'New York calendar day of the call (YYYY-MM-DD)');
|
|
11
|
+
}
|
|
12
|
+
export function selectorParams(opts) {
|
|
13
|
+
return {
|
|
14
|
+
event_id: opts.event,
|
|
15
|
+
identifier: opts.identifier,
|
|
16
|
+
year: opts.year,
|
|
17
|
+
quarter: opts.quarter,
|
|
18
|
+
date: opts.date,
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
/** Throws (→ `withErrorHandling` exits 1) unless one selector form is complete. */
|
|
22
|
+
export function validateSelector(opts) {
|
|
23
|
+
if (opts.event)
|
|
24
|
+
return;
|
|
25
|
+
if (opts.identifier && ((opts.year && opts.quarter) || opts.date))
|
|
26
|
+
return;
|
|
27
|
+
throw new Error(SELECTOR_MESSAGE);
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=earnings-selector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"earnings-selector.js","sourceRoot":"","sources":["../../../src/commands/earnings-selector.ts"],"names":[],"mappings":"AAEA,4EAA4E;AAC5E,MAAM,CAAC,MAAM,gBAAgB,GAAG,2DAA2D,CAAC;AAU5F,kGAAkG;AAClG,MAAM,UAAU,eAAe,CAAC,GAAY;IAC1C,OAAO,GAAG;SACP,MAAM,CAAC,oBAAoB,EAAE,0CAA0C,CAAC;SACxE,MAAM,CAAC,2BAA2B,EAAE,oDAAoD,CAAC;SACzF,MAAM,CAAC,YAAY,EAAE,0CAA0C,CAAC;SAChE,MAAM,CAAC,eAAe,EAAE,0CAA0C,CAAC;SACnE,MAAM,CAAC,eAAe,EAAE,gDAAgD,CAAC,CAAC;AAC/E,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,IAAqB;IAClD,OAAO;QACL,QAAQ,EAAE,IAAI,CAAC,KAAK;QACpB,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,IAAI,EAAE,IAAI,CAAC,IAAI;KAChB,CAAC;AACJ,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,gBAAgB,CAAC,IAAqB;IACpD,IAAI,IAAI,CAAC,KAAK;QAAE,OAAO;IACvB,IAAI,IAAI,CAAC,UAAU,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO;IAC1E,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;AACpC,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { ApiError } from '../shared/errors.js';
|
|
3
|
+
type Row = Record<string, any>;
|
|
4
|
+
/** One dim line after a 403 whose message names the plan the route needs. */
|
|
5
|
+
export declare function planHint(error: ApiError): string | undefined;
|
|
6
|
+
/** "Q&A starts at m:ss" for the transcript header; undefined without a Q&A boundary. */
|
|
7
|
+
export declare function qaStartLine(qaStartMs: unknown): string | undefined;
|
|
8
|
+
/** Plain-text rendering of a transcript `data` (console and `--output`); `words` stays JSON. */
|
|
9
|
+
export declare function transcriptText(data: unknown, format: string): string;
|
|
10
|
+
/** `documents --output`: the warning for a document without a signed URL. */
|
|
11
|
+
export declare function skippedDocumentWarning(doc: Row): string;
|
|
12
|
+
export declare function registerEarningsCommands(program: Command): void;
|
|
13
|
+
export {};
|