@invinite-org/invinite-data-cli 3.0.0 → 4.1.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 (129) hide show
  1. package/README.md +341 -374
  2. package/claude-plugin/.claude-plugin/plugin.json +1 -1
  3. package/claude-plugin/agents/invinite-data.md +59 -28
  4. package/claude-plugin/commands/analyze-earnings-call.md +15 -14
  5. package/claude-plugin/commands/analyze-filing.md +8 -7
  6. package/claude-plugin/commands/compare-companies.md +5 -5
  7. package/claude-plugin/commands/financial-research.md +9 -9
  8. package/claude-plugin/commands/ownership-review.md +6 -6
  9. package/claude-plugin/skills/invinite-data-cli/SKILL.md +466 -570
  10. package/dist/bin/invd.js +11 -2
  11. package/dist/bin/invd.js.map +1 -1
  12. package/dist/src/cli.d.ts +2 -0
  13. package/dist/src/cli.js +48 -29
  14. package/dist/src/cli.js.map +1 -1
  15. package/dist/src/client/api-client.d.ts +24 -24
  16. package/dist/src/client/api-client.js +52 -70
  17. package/dist/src/client/api-client.js.map +1 -1
  18. package/dist/src/client/pagination.d.ts +12 -11
  19. package/dist/src/client/pagination.js +47 -56
  20. package/dist/src/client/pagination.js.map +1 -1
  21. package/dist/src/commands/agent-setup.d.ts +21 -0
  22. package/dist/src/commands/agent-setup.js +112 -0
  23. package/dist/src/commands/agent-setup.js.map +1 -0
  24. package/dist/src/commands/api.d.ts +27 -0
  25. package/dist/src/commands/api.js +180 -0
  26. package/dist/src/commands/api.js.map +1 -0
  27. package/dist/src/commands/auth.d.ts +37 -0
  28. package/dist/src/commands/auth.js +336 -0
  29. package/dist/src/commands/auth.js.map +1 -0
  30. package/dist/src/commands/completion.d.ts +7 -0
  31. package/dist/src/commands/completion.js +115 -0
  32. package/dist/src/commands/completion.js.map +1 -0
  33. package/dist/src/commands/config.d.ts +4 -0
  34. package/dist/src/commands/config.js +85 -48
  35. package/dist/src/commands/config.js.map +1 -1
  36. package/dist/src/commands/plugin.d.ts +8 -0
  37. package/dist/src/commands/plugin.js +8 -10
  38. package/dist/src/commands/plugin.js.map +1 -1
  39. package/dist/src/config/auth.d.ts +17 -1
  40. package/dist/src/config/auth.js +50 -36
  41. package/dist/src/config/auth.js.map +1 -1
  42. package/dist/src/config/config-manager.d.ts +56 -4
  43. package/dist/src/config/config-manager.js +173 -29
  44. package/dist/src/config/config-manager.js.map +1 -1
  45. package/dist/src/config/toml.d.ts +7 -0
  46. package/dist/src/config/toml.js +79 -0
  47. package/dist/src/config/toml.js.map +1 -0
  48. package/dist/src/examples.d.ts +22 -0
  49. package/dist/src/examples.js +56 -0
  50. package/dist/src/examples.js.map +1 -0
  51. package/dist/src/generated/cli-manifest.json +5573 -5140
  52. package/dist/src/hand-written-commands.d.ts +11 -41
  53. package/dist/src/hand-written-commands.js +7 -17
  54. package/dist/src/hand-written-commands.js.map +1 -1
  55. package/dist/src/output/jq.d.ts +15 -0
  56. package/dist/src/output/jq.js +234 -0
  57. package/dist/src/output/jq.js.map +1 -0
  58. package/dist/src/output/options.d.ts +29 -0
  59. package/dist/src/output/options.js +72 -0
  60. package/dist/src/output/options.js.map +1 -0
  61. package/dist/src/output/render.d.ts +54 -0
  62. package/dist/src/output/render.js +160 -0
  63. package/dist/src/output/render.js.map +1 -0
  64. package/dist/src/shared/errors.d.ts +59 -15
  65. package/dist/src/shared/errors.js +126 -38
  66. package/dist/src/shared/errors.js.map +1 -1
  67. package/dist/src/shared/prompt.d.ts +10 -0
  68. package/dist/src/shared/prompt.js +24 -0
  69. package/dist/src/shared/prompt.js.map +1 -0
  70. package/dist/src/shared/spinner.js +2 -1
  71. package/dist/src/shared/spinner.js.map +1 -1
  72. package/dist/src/spec-commands.d.ts +14 -6
  73. package/dist/src/spec-commands.js +454 -174
  74. package/dist/src/spec-commands.js.map +1 -1
  75. package/dist/src/spec-flags.d.ts +11 -6
  76. package/dist/src/spec-flags.js +14 -7
  77. package/dist/src/spec-flags.js.map +1 -1
  78. package/dist/src/spec-manifest.d.ts +416 -116
  79. package/dist/src/spec-manifest.js +44 -13
  80. package/dist/src/spec-manifest.js.map +1 -1
  81. package/dist/src/update-notifier.d.ts +9 -0
  82. package/dist/src/update-notifier.js +63 -0
  83. package/dist/src/update-notifier.js.map +1 -0
  84. package/package.json +2 -3
  85. package/dist/src/client/earnings-live.d.ts +0 -194
  86. package/dist/src/client/earnings-live.js +0 -300
  87. package/dist/src/client/earnings-live.js.map +0 -1
  88. package/dist/src/client/news-live.d.ts +0 -72
  89. package/dist/src/client/news-live.js +0 -120
  90. package/dist/src/client/news-live.js.map +0 -1
  91. package/dist/src/client/pdf.d.ts +0 -15
  92. package/dist/src/client/pdf.js +0 -15
  93. package/dist/src/client/pdf.js.map +0 -1
  94. package/dist/src/client/websocket-client.d.ts +0 -19
  95. package/dist/src/client/websocket-client.js +0 -174
  96. package/dist/src/client/websocket-client.js.map +0 -1
  97. package/dist/src/commands/earnings.d.ts +0 -16
  98. package/dist/src/commands/earnings.js +0 -464
  99. package/dist/src/commands/earnings.js.map +0 -1
  100. package/dist/src/commands/login.d.ts +0 -15
  101. package/dist/src/commands/login.js +0 -249
  102. package/dist/src/commands/login.js.map +0 -1
  103. package/dist/src/commands/news.d.ts +0 -2
  104. package/dist/src/commands/news.js +0 -69
  105. package/dist/src/commands/news.js.map +0 -1
  106. package/dist/src/commands/sec.d.ts +0 -47
  107. package/dist/src/commands/sec.js +0 -191
  108. package/dist/src/commands/sec.js.map +0 -1
  109. package/dist/src/commands/ws.d.ts +0 -33
  110. package/dist/src/commands/ws.js +0 -116
  111. package/dist/src/commands/ws.js.map +0 -1
  112. package/dist/src/formatters/json-formatter.d.ts +0 -1
  113. package/dist/src/formatters/json-formatter.js +0 -4
  114. package/dist/src/formatters/json-formatter.js.map +0 -1
  115. package/dist/src/formatters/table-formatter.d.ts +0 -4
  116. package/dist/src/formatters/table-formatter.js +0 -73
  117. package/dist/src/formatters/table-formatter.js.map +0 -1
  118. package/dist/src/formatters/time.d.ts +0 -2
  119. package/dist/src/formatters/time.js +0 -14
  120. package/dist/src/formatters/time.js.map +0 -1
  121. package/dist/src/shared/output.d.ts +0 -3
  122. package/dist/src/shared/output.js +0 -13
  123. package/dist/src/shared/output.js.map +0 -1
  124. package/dist/src/shared/readiness.d.ts +0 -4
  125. package/dist/src/shared/readiness.js +0 -60
  126. package/dist/src/shared/readiness.js.map +0 -1
  127. package/dist/src/shared/types.d.ts +0 -11
  128. package/dist/src/shared/types.js +0 -2
  129. package/dist/src/shared/types.js.map +0 -1
@@ -1,249 +0,0 @@
1
- import { randomBytes } from 'node:crypto';
2
- import { createServer } from 'node:http';
3
- import { hostname } from 'node:os';
4
- import { spawn } from 'node:child_process';
5
- import chalk from 'chalk';
6
- import { clearApiKey, resolveApiKey, setApiKey } from '../config/auth.js';
7
- import { DASHBOARD_URL, getBaseUrl } from '../config/config-manager.js';
8
- const CALLBACK_TIMEOUT_MS = 5 * 60 * 1000;
9
- const KEY_LIFETIME_MS = 90 * 24 * 60 * 60 * 1000;
10
- const MAX_BIND_ATTEMPTS = 3;
11
- const defaultDependencies = {
12
- fetch: globalThis.fetch,
13
- openBrowser,
14
- timeoutMs: CALLBACK_TIMEOUT_MS,
15
- };
16
- function errorMessage(error) {
17
- return error instanceof Error ? error.message : String(error);
18
- }
19
- async function parseEnvelope(response) {
20
- try {
21
- return await response.json();
22
- }
23
- catch {
24
- return undefined;
25
- }
26
- }
27
- function browserCommand(url) {
28
- if (process.platform === 'darwin')
29
- return { command: 'open', args: [url] };
30
- if (process.platform === 'win32')
31
- return { command: 'cmd', args: ['/c', 'start', '', url] };
32
- return { command: 'xdg-open', args: [url] };
33
- }
34
- async function openBrowser(url) {
35
- const target = browserCommand(url);
36
- await new Promise((resolve, reject) => {
37
- const child = spawn(target.command, target.args, { detached: true, stdio: 'ignore' });
38
- child.once('error', reject);
39
- child.once('spawn', () => {
40
- child.unref();
41
- resolve();
42
- });
43
- });
44
- }
45
- function callbackHtml(title, message) {
46
- return `<!doctype html><html lang="en"><head><meta charset="utf-8"><title>${title}</title></head><body><main><h1>${title}</h1><p>${message}</p></main></body></html>`;
47
- }
48
- async function closeServer(server) {
49
- if (!server.listening)
50
- return;
51
- await new Promise((resolve) => server.close(() => resolve()));
52
- }
53
- async function listenOnRandomPort(server) {
54
- for (let attempt = 0; attempt < MAX_BIND_ATTEMPTS; attempt += 1) {
55
- const port = 49_152 + randomBytes(2).readUInt16BE(0) % (65_535 - 49_152 + 1);
56
- try {
57
- await new Promise((resolve, reject) => {
58
- const handleError = (error) => reject(error);
59
- server.once('error', handleError);
60
- server.listen(port, '127.0.0.1', () => {
61
- server.off('error', handleError);
62
- resolve();
63
- });
64
- });
65
- return port;
66
- }
67
- catch (error) {
68
- if (error.code !== 'EADDRINUSE' || attempt === MAX_BIND_ATTEMPTS - 1)
69
- throw error;
70
- }
71
- }
72
- throw new Error('Could not start the login callback server');
73
- }
74
- export async function login(dependencies = defaultDependencies) {
75
- const state = randomBytes(16).toString('hex');
76
- let resolveCallback = () => undefined;
77
- let rejectCallback = () => undefined;
78
- const callback = new Promise((resolve, reject) => {
79
- resolveCallback = resolve;
80
- rejectCallback = reject;
81
- });
82
- let settled = false;
83
- const settleError = (error) => {
84
- if (settled)
85
- return;
86
- settled = true;
87
- rejectCallback(error);
88
- };
89
- const settleSuccess = (data) => {
90
- if (settled)
91
- return;
92
- settled = true;
93
- resolveCallback(data);
94
- };
95
- const baseUrl = getBaseUrl().replace(/\/$/u, '');
96
- const server = createServer(async (request, response) => {
97
- const callbackUrl = new URL(request.url ?? '/', 'http://127.0.0.1');
98
- if (request.method !== 'GET' || callbackUrl.pathname !== '/callback') {
99
- response.writeHead(404).end();
100
- return;
101
- }
102
- if (callbackUrl.searchParams.get('state') !== state) {
103
- response.writeHead(400, { 'Content-Type': 'text/html; charset=utf-8' });
104
- response.end(callbackHtml('Login failed', 'State verification failed. Return to the terminal and try again.'));
105
- settleError(new Error('Login state verification failed'));
106
- return;
107
- }
108
- const code = callbackUrl.searchParams.get('code');
109
- if (!code) {
110
- response.writeHead(400, { 'Content-Type': 'text/html; charset=utf-8' });
111
- response.end(callbackHtml('Login failed', 'The callback did not include an exchange code.'));
112
- settleError(new Error('Login callback did not include an exchange code'));
113
- return;
114
- }
115
- try {
116
- const exchangeResponse = await dependencies.fetch(`${baseUrl}/auth/exchange`, {
117
- method: 'POST',
118
- headers: { 'Content-Type': 'application/json' },
119
- body: JSON.stringify({ code }),
120
- });
121
- const envelope = await parseEnvelope(exchangeResponse);
122
- if (!exchangeResponse.ok || !envelope?.ok) {
123
- if (exchangeResponse.status === 401)
124
- throw new Error('Login expired, run `invd login` again');
125
- throw new Error(envelope && !envelope.ok ? envelope.error : `Login exchange failed (${exchangeResponse.status})`);
126
- }
127
- await setApiKey(envelope.data.key);
128
- response.writeHead(200, {
129
- 'Cache-Control': 'no-store',
130
- 'Content-Type': 'text/html; charset=utf-8',
131
- });
132
- response.end(callbackHtml('Login complete', 'You can close this tab and return to the terminal.'));
133
- settleSuccess(envelope.data);
134
- }
135
- catch (error) {
136
- const exchangeError = error instanceof Error ? error : new Error(String(error));
137
- response.writeHead(502, {
138
- 'Cache-Control': 'no-store',
139
- 'Content-Type': 'text/html; charset=utf-8',
140
- });
141
- response.end(callbackHtml('Login failed', 'The credential exchange failed. Return to the terminal and try again.'));
142
- settleError(exchangeError);
143
- }
144
- });
145
- const port = await listenOnRandomPort(server);
146
- const loginUrl = new URL(`${baseUrl}/auth/login`);
147
- loginUrl.searchParams.set('port', String(port));
148
- loginUrl.searchParams.set('state', state);
149
- loginUrl.searchParams.set('hostname', hostname().slice(0, 64));
150
- const handleInterrupt = () => settleError(new Error('Login cancelled'));
151
- process.once('SIGINT', handleInterrupt);
152
- const timeout = setTimeout(() => settleError(new Error('Login timed out. Run `invd login` again.')), dependencies.timeoutMs);
153
- try {
154
- const preflight = await dependencies.fetch(loginUrl, { redirect: 'manual' });
155
- if (preflight.status === 503) {
156
- throw new Error('OAuth login is not enabled on this deployment. Use `invd config set-key` instead.');
157
- }
158
- if (preflight.status < 300 || preflight.status >= 400) {
159
- const envelope = await parseEnvelope(preflight);
160
- throw new Error(envelope && !envelope.ok ? envelope.error : `Could not start login (${preflight.status})`);
161
- }
162
- try {
163
- await dependencies.openBrowser(loginUrl.toString());
164
- console.log(chalk.dim('Opening your browser to complete login...'));
165
- }
166
- catch {
167
- console.warn(chalk.yellow('Could not open a browser automatically. Open this URL:'));
168
- console.log(loginUrl.toString());
169
- }
170
- const data = await callback;
171
- const approximateExpiry = new Date(Date.now() + KEY_LIFETIME_MS).toLocaleDateString();
172
- console.log(chalk.green('Logged in successfully.'));
173
- console.log(` Key hint: ${data.keyHint}`);
174
- console.log(` Label: ${data.label}`);
175
- console.log(` Expires: approximately ${approximateExpiry} (90 days)`);
176
- console.log(chalk.dim(`This sign-in is also listed on your keys page: ${DASHBOARD_URL}/keys`));
177
- console.log(`Manage keys and usage: ${DASHBOARD_URL}`);
178
- return data;
179
- }
180
- finally {
181
- clearTimeout(timeout);
182
- process.off('SIGINT', handleInterrupt);
183
- await closeServer(server);
184
- }
185
- }
186
- export async function logout(dependencies = defaultDependencies) {
187
- let resolved;
188
- try {
189
- resolved = await resolveApiKey();
190
- }
191
- catch (error) {
192
- if (error instanceof Error && error.message.startsWith('No API key configured.')) {
193
- console.log('Not logged in.');
194
- return;
195
- }
196
- throw error;
197
- }
198
- const baseUrl = getBaseUrl().replace(/\/$/u, '');
199
- try {
200
- const response = await dependencies.fetch(`${baseUrl}/auth/revoke`, {
201
- method: 'POST',
202
- headers: { Authorization: `Bearer ${resolved.key}` },
203
- });
204
- if (!response.ok) {
205
- const envelope = await parseEnvelope(response);
206
- console.warn(chalk.yellow(`Warning: remote revocation failed: ${envelope && !envelope.ok ? envelope.error : response.status}`));
207
- }
208
- }
209
- catch (error) {
210
- console.warn(chalk.yellow(`Warning: remote revocation failed: ${errorMessage(error)}`));
211
- }
212
- if (resolved.source === 'environment') {
213
- console.log('The active key comes from INVINITE_DATA_API_KEY. Remove that environment variable to finish logging out.');
214
- return;
215
- }
216
- if (resolved.source === 'dotenv') {
217
- console.log('The active key comes from the current directory\'s .env file. Remove INVINITE_DATA_API_KEY from that file to finish logging out.');
218
- return;
219
- }
220
- await clearApiKey();
221
- console.log(chalk.green('Logged out locally.'));
222
- }
223
- export function registerLoginCommands(program) {
224
- program
225
- .command('login')
226
- .description('Log in through your browser (the key belongs to your Invinite Data account)')
227
- .action(async () => {
228
- try {
229
- await login();
230
- }
231
- catch (error) {
232
- console.error(chalk.red(errorMessage(error)));
233
- process.exitCode = 1;
234
- }
235
- });
236
- program
237
- .command('logout')
238
- .description('Revoke the current login and clear local credentials')
239
- .action(async () => {
240
- try {
241
- await logout();
242
- }
243
- catch (error) {
244
- console.error(chalk.red(errorMessage(error)));
245
- process.exitCode = 1;
246
- }
247
- });
248
- }
249
- //# sourceMappingURL=login.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"login.js","sourceRoot":"","sources":["../../../src/commands/login.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import { Command } from 'commander';
2
- export declare function registerNewsCommands(program: Command): void;
@@ -1,69 +0,0 @@
1
- import chalk from 'chalk';
2
- import { apiGet } from '../client/api-client.js';
3
- import { printPdfUrl, savePdf } from '../client/pdf.js';
4
- import { flattenRows } from '../formatters/flatten.js';
5
- import { formatKeyValue } from '../formatters/table-formatter.js';
6
- import { apiErrorHint, withErrorHandling } from '../shared/errors.js';
7
- import { output } from '../shared/output.js';
8
- import { setJsonMode } from '../shared/spinner.js';
9
- /**
10
- * The hand-written `invd news get`: it can save the item's PDF, so it is not one REST call plus one view
11
- * (`src/hand-written-commands.ts`). Every other `news` action is generated and attached to the same group.
12
- */
13
- /**
14
- * The attribution block, then Invinite's summary it attributes (backend news summaries task 5, API 2.0.0): the lengths and
15
- * the PDF URL above the long text. The publisher's own text is never served.
16
- */
17
- const COLUMNS = [
18
- 'id',
19
- 'published_at',
20
- 'title',
21
- 'kind',
22
- 'source.id',
23
- 'url',
24
- 'attribution.publisher',
25
- 'attribution.publisher_host',
26
- 'attribution.source_url',
27
- 'attribution.published_at',
28
- 'attribution.rights',
29
- 'attribution.edgar.form',
30
- 'attribution.edgar.accession',
31
- 'attribution.statement',
32
- 'content_status',
33
- 'summary_words',
34
- 'source_words',
35
- 'summarized_at',
36
- 'pdf.url',
37
- 'summary_text',
38
- 'summary_html',
39
- ];
40
- export function registerNewsCommands(program) {
41
- const news = program.commands.find(command => command.name() === 'news') ?? program.command('news');
42
- news.command('get')
43
- .description("Get a news item with Invinite's summary of the publication")
44
- .requiredOption('--id <id>', 'News item id')
45
- .option('--pdf', 'Print the URL of the branded PDF of this item')
46
- .option('--pdf-out <file>', 'Save the branded PDF of this item (e.g. item.pdf)')
47
- .option('--force', 'Overwrite an existing --pdf-out file')
48
- .action(withErrorHandling(async (cmdOpts) => {
49
- const opts = program.opts();
50
- if (opts.json)
51
- setJsonMode(true);
52
- const data = await apiGet({
53
- path: `/v1/news/${encodeURIComponent(cmdOpts.id)}`,
54
- });
55
- const saved = await savePdf(data.pdf, cmdOpts, 'Downloading news PDF...');
56
- output(data, opts, () => {
57
- if (saved) {
58
- console.log(chalk.green(`Saved ${saved.path} (${saved.bytes.toLocaleString('en-US')} bytes)`));
59
- return;
60
- }
61
- if (cmdOpts.pdf) {
62
- printPdfUrl(data.pdf);
63
- return;
64
- }
65
- formatKeyValue(flattenRows([data], COLUMNS)[0]);
66
- });
67
- }, apiErrorHint));
68
- }
69
- //# sourceMappingURL=news.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"news.js","sourceRoot":"","sources":["../../../src/commands/news.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACtE,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEnD;;;GAGG;AAEH;;;GAGG;AACH,MAAM,OAAO,GAAG;IACd,IAAI;IACJ,cAAc;IACd,OAAO;IACP,MAAM;IACN,WAAW;IACX,KAAK;IACL,uBAAuB;IACvB,4BAA4B;IAC5B,wBAAwB;IACxB,0BAA0B;IAC1B,oBAAoB;IACpB,wBAAwB;IACxB,6BAA6B;IAC7B,uBAAuB;IACvB,gBAAgB;IAChB,eAAe;IACf,cAAc;IACd,eAAe;IACf,SAAS;IACT,cAAc;IACd,cAAc;CACf,CAAC;AAEF,MAAM,UAAU,oBAAoB,CAAC,OAAgB;IACnD,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAEpG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;SAChB,WAAW,CAAC,4DAA4D,CAAC;SACzE,cAAc,CAAC,WAAW,EAAE,cAAc,CAAC;SAC3C,MAAM,CAAC,OAAO,EAAE,+CAA+C,CAAC;SAChE,MAAM,CAAC,kBAAkB,EAAE,mDAAmD,CAAC;SAC/E,MAAM,CAAC,SAAS,EAAE,sCAAsC,CAAC;SACzD,MAAM,CAAC,iBAAiB,CAAC,KAAK,EAAE,OAAwE,EAAE,EAAE;QAC3G,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,IAAI,CAAC,IAAI;YAAE,WAAW,CAAC,IAAI,CAAC,CAAC;QACjC,MAAM,IAAI,GAAG,MAAM,MAAM,CAAsB;YAC7C,IAAI,EAAE,YAAY,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE;SACnD,CAAC,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,yBAAyB,CAAC,CAAC;QAC1E,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE;YACtB,IAAI,KAAK,EAAE,CAAC;gBACV,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;gBAC/F,OAAO;YACT,CAAC;YACD,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;gBAChB,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACtB,OAAO;YACT,CAAC;YACD,cAAc,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;IACL,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC;AACtB,CAAC"}
@@ -1,47 +0,0 @@
1
- import { Command } from 'commander';
2
- /**
3
- * The hand-written `sec` downloads (`src/hand-written-commands.ts`); every other `sec` action is generated from the
4
- * spec and attaches to the same group. Two kinds of bytes, never mixed up:
5
- * - originals and figures are PERMANENT PUBLIC objects: fetched from their stated `url` without the API key;
6
- * - a metric export is private: streamed from the key-authorized `GET /v1/sec/exports/{export_id}/file`.
7
- * Each download verifies what the API stated (size, SHA-256, media type) before the file appears; nothing ever
8
- * fetches the SEC's own site. A saved citation is the immutable version / block, never a URL carrying a key.
9
- */
10
- /** Exit code when a command finished but left documents unsaved (stated per document, never skipped silently). */
11
- export declare const INCOMPLETE_EXIT_CODE = 3;
12
- interface ManifestDocument {
13
- filename: string;
14
- role?: string | null;
15
- doc_type?: string | null;
16
- mime_type?: string | null;
17
- availability?: string | null;
18
- quarantine_reason?: string | null;
19
- too_large?: boolean | null;
20
- sha256?: string | null;
21
- size_bytes?: number | null;
22
- canonical?: {
23
- status?: string | null;
24
- version_id?: string | null;
25
- text_ready?: boolean;
26
- visual_ready?: boolean;
27
- } | null;
28
- source?: {
29
- url?: string | null;
30
- } | null;
31
- }
32
- export interface SavedDocument {
33
- filename: string;
34
- role: string | null;
35
- mime_type: string | null;
36
- size_bytes: number | null;
37
- sha256: string | null;
38
- version_id: string | null;
39
- status: 'saved' | 'already_complete' | 'not_saved';
40
- path: string | null;
41
- url: string | null;
42
- reason: string | null;
43
- }
44
- /** Why a manifest document has no public original to fetch (the API's own words, no guess). */
45
- export declare function notSavedReason(document: ManifestDocument): string;
46
- export declare function registerSecCommands(program: Command): void;
47
- export {};
@@ -1,191 +0,0 @@
1
- import { stat } from 'node:fs/promises';
2
- import { join } from 'node:path';
3
- import chalk from 'chalk';
4
- import { apiDownload, apiGet } from '../client/api-client.js';
5
- import { dispositionFileName, ensureDir, safeFileName, saveVerified } from '../client/download.js';
6
- import { formatKeyValue, formatTable } from '../formatters/table-formatter.js';
7
- import { apiErrorHint, withErrorHandling } from '../shared/errors.js';
8
- import { output } from '../shared/output.js';
9
- import { printReadinessNotes } from '../shared/readiness.js';
10
- import { setJsonMode } from '../shared/spinner.js';
11
- /**
12
- * The hand-written `sec` downloads (`src/hand-written-commands.ts`); every other `sec` action is generated from the
13
- * spec and attaches to the same group. Two kinds of bytes, never mixed up:
14
- * - originals and figures are PERMANENT PUBLIC objects: fetched from their stated `url` without the API key;
15
- * - a metric export is private: streamed from the key-authorized `GET /v1/sec/exports/{export_id}/file`.
16
- * Each download verifies what the API stated (size, SHA-256, media type) before the file appears; nothing ever
17
- * fetches the SEC's own site. A saved citation is the immutable version / block, never a URL carrying a key.
18
- */
19
- /** Exit code when a command finished but left documents unsaved (stated per document, never skipped silently). */
20
- export const INCOMPLETE_EXIT_CODE = 3;
21
- const EXPORT_CONTENT_TYPES = ['application/gzip', 'application/x-gzip'];
22
- const httpsUrl = (value) => {
23
- if (typeof value !== 'string')
24
- return null;
25
- try {
26
- return new URL(value).protocol === 'https:' ? value : null;
27
- }
28
- catch {
29
- return null;
30
- }
31
- };
32
- /** Why a manifest document has no public original to fetch (the API's own words, no guess). */
33
- export function notSavedReason(document) {
34
- if (document.availability && document.availability !== 'stored') {
35
- return `availability ${document.availability}${document.quarantine_reason ? ` (${document.quarantine_reason})` : ''}`;
36
- }
37
- if (document.too_large)
38
- return 'too_large';
39
- return 'no permanent public copy yet';
40
- }
41
- /** `-o`: an existing directory or a path ending in `/` is a directory; anything else a file. */
42
- async function isDirectoryTarget(target) {
43
- if (/[\\/]$/.test(target))
44
- return true;
45
- try {
46
- return (await stat(target)).isDirectory();
47
- }
48
- catch {
49
- return false;
50
- }
51
- }
52
- const publicFetch = (url) => (signal) => fetch(url, { signal });
53
- const savedLine = (file) => file.skipped
54
- ? `Already complete: ${file.path} (sha256 ${file.sha256})`
55
- : `Saved ${file.path} (${file.bytes.toLocaleString('en-US')} bytes, sha256 ${file.sha256})`;
56
- async function saveOriginal(document, dir, opts) {
57
- const url = httpsUrl(document.source?.url);
58
- const base = {
59
- filename: document.filename,
60
- role: document.role ?? null,
61
- mime_type: document.mime_type ?? null,
62
- size_bytes: document.size_bytes ?? null,
63
- sha256: document.sha256 ?? null,
64
- version_id: document.canonical?.version_id ?? null,
65
- status: 'not_saved',
66
- path: null,
67
- url,
68
- reason: null,
69
- };
70
- if (!url)
71
- return { ...base, reason: notSavedReason(document) };
72
- const file = await saveVerified(publicFetch(url), join(dir, safeFileName(document.filename, 'document')), {
73
- force: opts.force,
74
- expected: {
75
- ...(document.sha256 ? { sha256: document.sha256 } : {}),
76
- ...(typeof document.size_bytes === 'number' ? { bytes: document.size_bytes } : {}),
77
- },
78
- spinnerText: `Downloading ${document.filename}...`,
79
- });
80
- return { ...base, status: file.skipped ? 'already_complete' : 'saved', path: file.path };
81
- }
82
- export function registerSecCommands(program) {
83
- const sec = program.commands.find(command => command.name() === 'sec') ?? program.command('sec');
84
- sec.command('save')
85
- .description("Save a filing's original documents from their permanent public copies (lists every one it cannot save, with why)")
86
- .requiredOption('--accession <accession>', 'Accession number (dashed)')
87
- .option('--filename <filename>', 'Only this document of the filing (default: every document)')
88
- .option('-o, --output <dir>', 'Directory to save into', '.')
89
- .option('--force', 'Overwrite existing files')
90
- .action(withErrorHandling(async (cmdOpts) => {
91
- const opts = program.opts();
92
- if (opts.json)
93
- setJsonMode(true);
94
- const manifest = await apiGet({ path: `/v1/sec/filings/${encodeURIComponent(cmdOpts.accession)}` });
95
- const documents = (manifest.documents ?? [])
96
- .filter(document => !cmdOpts.filename || document.filename === cmdOpts.filename);
97
- if (cmdOpts.filename && documents.length === 0 && manifest.readiness?.status === 'ready') {
98
- throw new Error(`${cmdOpts.filename} is not a document of ${cmdOpts.accession} (see: invd sec filing --accession ${cmdOpts.accession})`);
99
- }
100
- const dir = await ensureDir(cmdOpts.output);
101
- const results = [];
102
- for (const document of documents)
103
- results.push(await saveOriginal(document, dir, cmdOpts));
104
- const complete = manifest.readiness?.status === 'ready' && results.every(result => result.status !== 'not_saved');
105
- const report = { accession: cmdOpts.accession, readiness: manifest.readiness ?? null, complete, documents: results };
106
- output(report, opts, () => {
107
- formatTable(results.map(result => ({
108
- filename: result.filename,
109
- role: result.role ?? '',
110
- size_bytes: result.size_bytes ?? '',
111
- status: result.status,
112
- detail: result.path ?? result.reason ?? '',
113
- })), ['filename', 'role', 'size_bytes', 'status', 'detail']);
114
- printReadinessNotes(manifest);
115
- const missing = results.filter(result => result.status === 'not_saved').length;
116
- if (missing > 0) {
117
- console.error(chalk.yellow(`${missing} of ${results.length} documents not saved (reason per row); canonical text: invd sec document --accession ${cmdOpts.accession} --filename <filename>`));
118
- }
119
- });
120
- if (!complete)
121
- process.exitCode = INCOMPLETE_EXIT_CODE;
122
- }, apiErrorHint));
123
- sec.command('save-figure')
124
- .description("Save a cited figure's image from its permanent public URL")
125
- .requiredOption('--version-id <version_id>', 'Document version id (immutable)')
126
- .requiredOption('--block-id <block_id>', 'Figure block id')
127
- .option('-o, --output <path>', 'File or directory to save into', '.')
128
- .option('--force', 'Overwrite an existing file')
129
- .action(withErrorHandling(async (cmdOpts) => {
130
- const opts = program.opts();
131
- if (opts.json)
132
- setJsonMode(true);
133
- const answer = await apiGet({
134
- path: `/v1/sec/versions/${encodeURIComponent(cmdOpts.versionId)}/figures/${encodeURIComponent(cmdOpts.blockId)}`,
135
- });
136
- const url = httpsUrl(answer.image?.url);
137
- if (!url) {
138
- printReadinessNotes(answer);
139
- const reason = answer.readiness?.reason ?? 'no public image';
140
- throw new Error(`No public image for block ${cmdOpts.blockId} of version ${cmdOpts.versionId} (${reason})`);
141
- }
142
- const name = safeFileName(new URL(url).pathname.split('/').pop(), `${cmdOpts.blockId}.img`);
143
- const target = await isDirectoryTarget(cmdOpts.output) ? join(await ensureDir(cmdOpts.output), name) : cmdOpts.output;
144
- const file = await saveVerified(publicFetch(url), target, { force: cmdOpts.force, spinnerText: 'Downloading figure...' });
145
- const citation = { version_id: cmdOpts.versionId, block_id: cmdOpts.blockId };
146
- output({ citation, path: file.path, bytes: file.bytes, sha256: file.sha256, url }, opts, () => {
147
- console.log(chalk.green(savedLine(file)));
148
- formatKeyValue({ citation: `${citation.version_id}#${citation.block_id}` });
149
- });
150
- }, apiErrorHint));
151
- sec.command('export-file')
152
- .description('Download a metric export (.csv.gz, key-authorized), verified against its SHA-256')
153
- .requiredOption('--export-id <export_id>', 'Export id (from invd sec metric-export / sec export)')
154
- .option('-o, --output <path>', 'File or directory to save into (default: the server-named file in .)', '.')
155
- .option('--sha256 <hex>', "The export's sha256 (from invd sec export): verified, and an identical existing file counts as complete without a request")
156
- .option('--force', 'Overwrite an existing file')
157
- .action(withErrorHandling(async (cmdOpts) => {
158
- const opts = program.opts();
159
- if (opts.json)
160
- setJsonMode(true);
161
- if (cmdOpts.sha256 && !/^[0-9a-f]{64}$/i.test(cmdOpts.sha256))
162
- throw new Error('--sha256 expects 64 hex characters');
163
- const request = { path: `/v1/sec/exports/${encodeURIComponent(cmdOpts.exportId)}/file`, accept: 'application/gzip' };
164
- const expected = { ...(cmdOpts.sha256 ? { sha256: cmdOpts.sha256 } : {}), contentTypes: EXPORT_CONTENT_TYPES };
165
- let file;
166
- if (await isDirectoryTarget(cmdOpts.output)) {
167
- // The name comes from the answer's Content-Disposition, so the request opens first.
168
- const response = await apiDownload(request);
169
- const name = safeFileName(dispositionFileName(response.headers.get('Content-Disposition')), `${cmdOpts.exportId}.csv.gz`);
170
- const headerSha = response.headers.get('X-Content-SHA256') ?? undefined;
171
- file = await saveVerified(async () => response, join(await ensureDir(cmdOpts.output), name), {
172
- force: cmdOpts.force,
173
- expected: { ...expected, ...(expected.sha256 ?? headerSha ? { sha256: expected.sha256 ?? headerSha } : {}) },
174
- spinnerText: 'Downloading export...',
175
- });
176
- if (file.skipped)
177
- await response.body?.cancel();
178
- }
179
- else {
180
- file = await saveVerified(signal => apiDownload({ ...request, signal }), cmdOpts.output, {
181
- force: cmdOpts.force,
182
- expected,
183
- spinnerText: 'Downloading export...',
184
- });
185
- }
186
- output({ export_id: cmdOpts.exportId, path: file.path, bytes: file.bytes, sha256: file.sha256, skipped: file.skipped }, opts, () => {
187
- console.log(chalk.green(savedLine(file)));
188
- });
189
- }, apiErrorHint));
190
- }
191
- //# sourceMappingURL=sec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sec.js","sourceRoot":"","sources":["../../../src/commands/sec.ts"],"names":[],"mappings":"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"}
@@ -1,33 +0,0 @@
1
- import { Command } from 'commander';
2
- import { type EarningsListenOptions } from '../client/websocket-client.js';
3
- import { type NewsListenOptions } from '../client/news-live.js';
4
- export interface ListenOptions {
5
- earnings?: string;
6
- allLive?: boolean;
7
- sinceSeq?: string;
8
- partials?: boolean;
9
- names?: boolean;
10
- prices?: boolean;
11
- keywords?: string;
12
- keywordMatch?: string;
13
- speakerRoles?: string;
14
- minRank?: string;
15
- news?: boolean;
16
- tickers?: string;
17
- ciks?: string;
18
- newsKinds?: string;
19
- newsSources?: string;
20
- earningsNews?: boolean;
21
- }
22
- /**
23
- * `ws listen` options → the `news.live` subscription, or null when `--news` is absent. Refused before connecting:
24
- * `--news` with `--earnings` / `--all-live` or any live-call flag, and the news filters without `--news`.
25
- */
26
- export declare function buildNewsOptions(cmdOpts: ListenOptions, json: boolean): NewsListenOptions | null;
27
- /**
28
- * `ws listen` options → the earnings subscription, or null for the filing stream. Mirrors the
29
- * API's refusals client-side: the global scope needs keywords, the alert tuning needs keywords,
30
- * the per-call replay / partials / names / prices need one call.
31
- */
32
- export declare function buildListenOptions(cmdOpts: ListenOptions, json: boolean): EarningsListenOptions | null;
33
- export declare function registerWsCommands(program: Command): void;