@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.
Files changed (50) hide show
  1. package/README.md +304 -6
  2. package/claude-plugin/.claude-plugin/plugin.json +2 -2
  3. package/claude-plugin/agents/invinite-data.md +5 -1
  4. package/claude-plugin/commands/analyze-earnings-call.md +24 -0
  5. package/claude-plugin/commands/financial-research.md +2 -1
  6. package/claude-plugin/skills/invinite-data-cli/SKILL.md +82 -1
  7. package/dist/src/cli.d.ts +2 -0
  8. package/dist/src/cli.js +22 -1
  9. package/dist/src/cli.js.map +1 -1
  10. package/dist/src/client/api-client.d.ts +13 -1
  11. package/dist/src/client/api-client.js +46 -13
  12. package/dist/src/client/api-client.js.map +1 -1
  13. package/dist/src/client/download.d.ts +23 -0
  14. package/dist/src/client/download.js +116 -0
  15. package/dist/src/client/download.js.map +1 -0
  16. package/dist/src/client/earnings-live.d.ts +79 -0
  17. package/dist/src/client/earnings-live.js +156 -0
  18. package/dist/src/client/earnings-live.js.map +1 -0
  19. package/dist/src/client/pagination.js +2 -1
  20. package/dist/src/client/pagination.js.map +1 -1
  21. package/dist/src/client/websocket-client.d.ts +12 -1
  22. package/dist/src/client/websocket-client.js +114 -37
  23. package/dist/src/client/websocket-client.js.map +1 -1
  24. package/dist/src/commands/earnings-selector.d.ts +15 -0
  25. package/dist/src/commands/earnings-selector.js +29 -0
  26. package/dist/src/commands/earnings-selector.js.map +1 -0
  27. package/dist/src/commands/earnings.d.ts +13 -0
  28. package/dist/src/commands/earnings.js +705 -0
  29. package/dist/src/commands/earnings.js.map +1 -0
  30. package/dist/src/commands/plugin.d.ts +11 -0
  31. package/dist/src/commands/plugin.js +23 -8
  32. package/dist/src/commands/plugin.js.map +1 -1
  33. package/dist/src/commands/webhooks.d.ts +6 -0
  34. package/dist/src/commands/webhooks.js +144 -0
  35. package/dist/src/commands/webhooks.js.map +1 -0
  36. package/dist/src/commands/ws.js +23 -3
  37. package/dist/src/commands/ws.js.map +1 -1
  38. package/dist/src/formatters/flatten.d.ts +4 -0
  39. package/dist/src/formatters/flatten.js +15 -0
  40. package/dist/src/formatters/flatten.js.map +1 -0
  41. package/dist/src/formatters/time.d.ts +2 -0
  42. package/dist/src/formatters/time.js +14 -0
  43. package/dist/src/formatters/time.js.map +1 -0
  44. package/dist/src/shared/errors.d.ts +2 -1
  45. package/dist/src/shared/errors.js +5 -1
  46. package/dist/src/shared/errors.js.map +1 -1
  47. package/dist/src/shared/options.d.ts +2 -0
  48. package/dist/src/shared/options.js +6 -0
  49. package/dist/src/shared/options.js.map +1 -1
  50. 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
- export async function connectWebSocket() {
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
- function connect() {
11
- console.log(chalk.dim('Connecting to WebSocket...'));
12
- const ws = new WebSocket(url);
13
- ws.addEventListener('open', () => {
14
- console.log(chalk.green('Connected to filing stream'));
15
- reconnectDelay = 1000;
16
- });
17
- ws.addEventListener('message', (event) => {
18
- try {
19
- const data = JSON.parse(String(event.data));
20
- if (data.type === 'ping')
21
- return;
22
- if (data.type === 'new_filing') {
23
- const f = data.filing;
24
- console.log(chalk.bold(`[${f.form_type}]`) + ` ${f.cik} - Filed ${f.filing_date}`);
25
- if (f.html_url)
26
- console.log(chalk.dim(` ${f.html_url}`));
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
- console.log(JSON.stringify(data, null, 2));
62
+ finish(new Error(step.end.message));
30
63
  }
31
64
  }
32
- catch {
33
- console.log(String(event.data));
65
+ else if (step.reconnect) {
66
+ ws.close();
34
67
  }
35
- });
36
- ws.addEventListener('close', () => {
37
- if (shouldReconnect) {
38
- console.log(chalk.yellow(`Disconnected. Reconnecting in ${reconnectDelay / 1000}s...`));
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
- ws.addEventListener('error', (error) => {
44
- console.error(chalk.red('WebSocket error:'), error);
45
- });
46
- process.on('SIGINT', () => {
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
- ws.close();
49
- console.log(chalk.dim('\nDisconnected.'));
126
+ clearPartial();
127
+ current?.close();
128
+ status(chalk.dim('\nDisconnected.'));
50
129
  process.exit(0);
51
130
  });
52
- }
53
- connect();
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":"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"}
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 {};