@invinite-org/invinite-data-cli 0.4.0 → 0.5.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 +88 -802
- package/claude-plugin/agents/invinite-data.md +1 -1
- package/claude-plugin/commands/analyze-earnings-call.md +3 -3
- package/claude-plugin/skills/invinite-data-cli/SKILL.md +444 -187
- package/dist/src/cli.d.ts +6 -0
- package/dist/src/cli.js +21 -31
- package/dist/src/cli.js.map +1 -1
- package/dist/src/client/api-client.d.ts +2 -4
- package/dist/src/client/api-client.js +3 -9
- package/dist/src/client/api-client.js.map +1 -1
- package/dist/src/client/pagination.d.ts +10 -0
- package/dist/src/client/pagination.js +40 -0
- package/dist/src/client/pagination.js.map +1 -1
- package/dist/src/commands/earnings.d.ts +0 -3
- package/dist/src/commands/earnings.js +46 -524
- package/dist/src/commands/earnings.js.map +1 -1
- package/dist/src/generated/cli-manifest.json +4983 -0
- package/dist/src/hand-written-commands.d.ts +43 -0
- package/dist/src/hand-written-commands.js +21 -0
- package/dist/src/hand-written-commands.js.map +1 -0
- package/dist/src/shared/errors.d.ts +5 -0
- package/dist/src/shared/errors.js +12 -0
- package/dist/src/shared/errors.js.map +1 -1
- package/dist/src/shared/options.d.ts +0 -13
- package/dist/src/shared/options.js +0 -13
- package/dist/src/shared/options.js.map +1 -1
- package/dist/src/spec-commands.d.ts +10 -0
- package/dist/src/spec-commands.js +207 -0
- package/dist/src/spec-commands.js.map +1 -0
- package/dist/src/spec-flags.d.ts +6 -0
- package/dist/src/spec-flags.js +9 -0
- package/dist/src/spec-flags.js.map +1 -0
- package/dist/src/spec-manifest.d.ts +382 -0
- package/dist/src/spec-manifest.js +65 -0
- package/dist/src/spec-manifest.js.map +1 -0
- package/package.json +7 -3
- package/dist/src/commands/company.d.ts +0 -2
- package/dist/src/commands/company.js +0 -220
- package/dist/src/commands/company.js.map +0 -1
- package/dist/src/commands/earnings-selector.d.ts +0 -15
- package/dist/src/commands/earnings-selector.js +0 -29
- package/dist/src/commands/earnings-selector.js.map +0 -1
- package/dist/src/commands/filings.d.ts +0 -2
- package/dist/src/commands/filings.js +0 -139
- package/dist/src/commands/filings.js.map +0 -1
- package/dist/src/commands/financials.d.ts +0 -2
- package/dist/src/commands/financials.js +0 -162
- package/dist/src/commands/financials.js.map +0 -1
- package/dist/src/commands/health.d.ts +0 -2
- package/dist/src/commands/health.js +0 -18
- package/dist/src/commands/health.js.map +0 -1
- package/dist/src/commands/insider-trades.d.ts +0 -2
- package/dist/src/commands/insider-trades.js +0 -56
- package/dist/src/commands/insider-trades.js.map +0 -1
- package/dist/src/commands/ipos.d.ts +0 -2
- package/dist/src/commands/ipos.js +0 -42
- package/dist/src/commands/ipos.js.map +0 -1
- package/dist/src/commands/market.d.ts +0 -2
- package/dist/src/commands/market.js +0 -34
- package/dist/src/commands/market.js.map +0 -1
- package/dist/src/commands/metadata.d.ts +0 -2
- package/dist/src/commands/metadata.js +0 -39
- package/dist/src/commands/metadata.js.map +0 -1
- package/dist/src/commands/metrics.d.ts +0 -2
- package/dist/src/commands/metrics.js +0 -158
- package/dist/src/commands/metrics.js.map +0 -1
- package/dist/src/commands/ownership.d.ts +0 -2
- package/dist/src/commands/ownership.js +0 -152
- package/dist/src/commands/ownership.js.map +0 -1
- package/dist/src/commands/segments.d.ts +0 -2
- package/dist/src/commands/segments.js +0 -64
- package/dist/src/commands/segments.js.map +0 -1
- package/dist/src/commands/usage.d.ts +0 -38
- package/dist/src/commands/usage.js +0 -82
- package/dist/src/commands/usage.js.map +0 -1
- package/dist/src/commands/webhooks.d.ts +0 -16
- package/dist/src/commands/webhooks.js +0 -186
- package/dist/src/commands/webhooks.js.map +0 -1
- package/dist/src/formatters/sparkline.d.ts +0 -2
- package/dist/src/formatters/sparkline.js +0 -11
- package/dist/src/formatters/sparkline.js.map +0 -1
- package/dist/src/formatters/tree-formatter.d.ts +0 -11
- package/dist/src/formatters/tree-formatter.js +0 -30
- package/dist/src/formatters/tree-formatter.js.map +0 -1
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
import { apiGet } from '../client/api-client.js';
|
|
2
|
-
import { fetchAllPages } from '../client/pagination.js';
|
|
3
|
-
import { withErrorHandling } from '../shared/errors.js';
|
|
4
|
-
import { output } from '../shared/output.js';
|
|
5
|
-
import { formatTable, printPaginationHint } from '../formatters/table-formatter.js';
|
|
6
|
-
import { setJsonMode } from '../shared/spinner.js';
|
|
7
|
-
import chalk from 'chalk';
|
|
8
|
-
export function registerSegmentsCommands(program) {
|
|
9
|
-
const segments = program
|
|
10
|
-
.command('segments')
|
|
11
|
-
.description('Segmented financials');
|
|
12
|
-
segments
|
|
13
|
-
.command('list')
|
|
14
|
-
.description('Fetch segmented financial data')
|
|
15
|
-
.requiredOption('-i, --identifier <ticker>', 'Ticker or CIK')
|
|
16
|
-
.requiredOption('-p, --period <type>', 'Fiscal period type')
|
|
17
|
-
.option('--segment-id <id>', 'Filter by segment ID')
|
|
18
|
-
.option('--detailed', 'Include detailed metadata')
|
|
19
|
-
.option('-s, --sort <dir>', 'Sort direction', 'desc')
|
|
20
|
-
.option('-l, --limit <n>', 'Max results', '10')
|
|
21
|
-
.option('--offset <n>', 'Offset', '0')
|
|
22
|
-
.action(withErrorHandling(async (cmdOpts) => {
|
|
23
|
-
const opts = program.opts();
|
|
24
|
-
if (opts.json)
|
|
25
|
-
setJsonMode(true);
|
|
26
|
-
const path = cmdOpts.detailed ? '/v1/segmented-financials/detailed' : '/v1/segmented-financials';
|
|
27
|
-
let data = await apiGet({
|
|
28
|
-
path,
|
|
29
|
-
params: {
|
|
30
|
-
identifier: cmdOpts.identifier,
|
|
31
|
-
fiscal_period_type: cmdOpts.period,
|
|
32
|
-
segment_id: cmdOpts.segmentId,
|
|
33
|
-
sort: cmdOpts.sort,
|
|
34
|
-
limit: cmdOpts.limit,
|
|
35
|
-
offset: cmdOpts.offset,
|
|
36
|
-
},
|
|
37
|
-
});
|
|
38
|
-
if (opts.all) {
|
|
39
|
-
data = await fetchAllPages(data, d => d.companies?.[0]?.next_url, (acc, page) => ({
|
|
40
|
-
companies: acc.companies.map((c, i) => ({
|
|
41
|
-
...c,
|
|
42
|
-
periods: [...c.periods, ...(page.companies[i]?.periods || [])],
|
|
43
|
-
next_url: page.companies[i]?.next_url,
|
|
44
|
-
})),
|
|
45
|
-
}));
|
|
46
|
-
}
|
|
47
|
-
output(data, opts, () => {
|
|
48
|
-
for (const c of data.companies) {
|
|
49
|
-
console.log(chalk.bold(`\n${c.ticker} (${c.cik})`));
|
|
50
|
-
for (const period of c.periods) {
|
|
51
|
-
console.log(chalk.cyan(`\n ${period.fiscal_period_type} FY${period.fiscal_year} Q${period.fiscal_quarter} (CY${period.calendar_year} Q${period.calendar_quarter}, ending ${period.period_end})`));
|
|
52
|
-
for (const [metricId, segments] of Object.entries(period.facts)) {
|
|
53
|
-
console.log(chalk.dim(` ${metricId}:`));
|
|
54
|
-
formatTable(segments, cmdOpts.detailed
|
|
55
|
-
? ['segment_id', 'value', 'axis', 'member', 'metric', 'accession_number']
|
|
56
|
-
: ['segment_id', 'value', 'axis', 'member']);
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
printPaginationHint(c.next_url);
|
|
60
|
-
}
|
|
61
|
-
});
|
|
62
|
-
}));
|
|
63
|
-
}
|
|
64
|
-
//# sourceMappingURL=segments.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"segments.js","sourceRoot":"","sources":["../../../src/commands/segments.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import { Command } from 'commander';
|
|
2
|
-
/** `GET /v1/account/usage` (invinite-data-api `src/routes/account/usage/types/routeSchemas.ts`). */
|
|
3
|
-
export interface AccountUsage {
|
|
4
|
-
window_days: number;
|
|
5
|
-
period: {
|
|
6
|
-
tier: string;
|
|
7
|
-
included_credits: number;
|
|
8
|
-
used_credits: number;
|
|
9
|
-
resets_at: string | null;
|
|
10
|
-
prepaid_balance_usd: number;
|
|
11
|
-
};
|
|
12
|
-
daily: {
|
|
13
|
-
date: string;
|
|
14
|
-
requests: number;
|
|
15
|
-
credits: number;
|
|
16
|
-
errors: Record<ErrorClass, number>;
|
|
17
|
-
}[];
|
|
18
|
-
by_family: {
|
|
19
|
-
family: string;
|
|
20
|
-
label: string;
|
|
21
|
-
requests: number;
|
|
22
|
-
credits: number;
|
|
23
|
-
}[];
|
|
24
|
-
by_key: {
|
|
25
|
-
caller: 'key' | 'oauth' | 'unknown';
|
|
26
|
-
label: string;
|
|
27
|
-
key_hint: string | null;
|
|
28
|
-
requests: number;
|
|
29
|
-
credits: number;
|
|
30
|
-
}[];
|
|
31
|
-
truncated: boolean;
|
|
32
|
-
}
|
|
33
|
-
declare const ERROR_CLASSES: readonly ["402", "403", "429", "4xx", "5xx"];
|
|
34
|
-
type ErrorClass = typeof ERROR_CLASSES[number];
|
|
35
|
-
/** The dashboard's answer as label / value rows; pure, so the command and its tests share it. */
|
|
36
|
-
export declare function usageRows(usage: AccountUsage): Record<string, string>;
|
|
37
|
-
export declare function registerUsageCommands(program: Command): void;
|
|
38
|
-
export {};
|
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
import { Option } from 'commander';
|
|
2
|
-
import chalk from 'chalk';
|
|
3
|
-
import { apiGetRaw } from '../client/api-client.js';
|
|
4
|
-
import { DASHBOARD_URL } from '../config/config-manager.js';
|
|
5
|
-
import { formatKeyValue } from '../formatters/table-formatter.js';
|
|
6
|
-
import { sparkline } from '../formatters/sparkline.js';
|
|
7
|
-
import { ApiError, withErrorHandling } from '../shared/errors.js';
|
|
8
|
-
import { createSpinner } from '../shared/spinner.js';
|
|
9
|
-
const ERROR_CLASSES = ['402', '403', '429', '4xx', '5xx'];
|
|
10
|
-
const BREAKDOWN_LIMIT = 5;
|
|
11
|
-
const count = new Intl.NumberFormat('en-US');
|
|
12
|
-
const usd = new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD' });
|
|
13
|
-
const utcDateTime = new Intl.DateTimeFormat('en-GB', {
|
|
14
|
-
day: 'numeric', month: 'short', year: 'numeric', hour: '2-digit', minute: '2-digit', timeZone: 'UTC',
|
|
15
|
-
});
|
|
16
|
-
function breakdown(items) {
|
|
17
|
-
if (items.length === 0)
|
|
18
|
-
return 'none';
|
|
19
|
-
const shown = items.slice(0, BREAKDOWN_LIMIT).map(item => `${item.name} ${count.format(item.credits)}`);
|
|
20
|
-
const rest = items.length - BREAKDOWN_LIMIT;
|
|
21
|
-
return shown.join(' · ') + (rest > 0 ? ` · +${rest} more` : '');
|
|
22
|
-
}
|
|
23
|
-
/** The dashboard's answer as label / value rows; pure, so the command and its tests share it. */
|
|
24
|
-
export function usageRows(usage) {
|
|
25
|
-
const { period, daily } = usage;
|
|
26
|
-
const tier = period.tier.charAt(0).toUpperCase() + period.tier.slice(1);
|
|
27
|
-
const resets = period.resets_at ? `resets ${utcDateTime.format(new Date(period.resets_at))} UTC` : 'no reset date';
|
|
28
|
-
const share = period.included_credits > 0
|
|
29
|
-
? ` (${Math.round((period.used_credits / period.included_credits) * 100)} %)`
|
|
30
|
-
: '';
|
|
31
|
-
const errors = ERROR_CLASSES
|
|
32
|
-
.map(status => [status, daily.reduce((sum, day) => sum + (day.errors[status] ?? 0), 0)])
|
|
33
|
-
.filter(([, total]) => total > 0)
|
|
34
|
-
.map(([status, total]) => `${status} ×${count.format(total)}`);
|
|
35
|
-
const range = daily.length > 0 ? `, ${daily[0].date} → ${daily[daily.length - 1].date} UTC` : '';
|
|
36
|
-
return {
|
|
37
|
-
'Plan': `${tier} · ${count.format(period.included_credits)} credits included · ${resets}`,
|
|
38
|
-
'Used': `${count.format(period.used_credits)} credits${share} · prepaid balance ${usd.format(period.prepaid_balance_usd)}`,
|
|
39
|
-
'Daily': `${sparkline(daily.map(day => day.credits))} (credits per day${range})`,
|
|
40
|
-
'By family': breakdown(usage.by_family.map(item => ({ name: item.label, credits: item.credits }))),
|
|
41
|
-
'By key': breakdown(usage.by_key.map(item => ({
|
|
42
|
-
name: item.key_hint ? `${item.label} (${item.key_hint})` : item.label,
|
|
43
|
-
credits: item.credits,
|
|
44
|
-
}))),
|
|
45
|
-
'Errors': errors.length > 0 ? errors.join(' · ') : 'none',
|
|
46
|
-
'Details': `${DASHBOARD_URL}/usage`,
|
|
47
|
-
};
|
|
48
|
-
}
|
|
49
|
-
export function registerUsageCommands(program) {
|
|
50
|
-
program
|
|
51
|
-
.command('usage')
|
|
52
|
-
.description('Plan allowance, prepaid balance and usage by day, endpoint family and key (costs no credits)')
|
|
53
|
-
.addOption(new Option('--days <n>', 'Window in UTC days').choices(['7', '30', '90']).default('30'))
|
|
54
|
-
.action(withErrorHandling(async (cmdOpts) => {
|
|
55
|
-
const parentOpts = program.opts();
|
|
56
|
-
const spinner = createSpinner('Fetching usage...');
|
|
57
|
-
let body;
|
|
58
|
-
try {
|
|
59
|
-
const response = await apiGetRaw({ path: '/v1/account/usage', params: { days: cmdOpts.days }, accept: 'application/json' });
|
|
60
|
-
body = await response.text();
|
|
61
|
-
spinner.succeed('Done');
|
|
62
|
-
}
|
|
63
|
-
catch (error) {
|
|
64
|
-
spinner.fail('Failed');
|
|
65
|
-
if (error instanceof ApiError && error.statusCode === 503) {
|
|
66
|
-
throw new Error('Usage is temporarily unavailable — try again in a minute.');
|
|
67
|
-
}
|
|
68
|
-
throw error;
|
|
69
|
-
}
|
|
70
|
-
if (parentOpts.json) {
|
|
71
|
-
// The route's JSON as received, byte for byte.
|
|
72
|
-
process.stdout.write(body.endsWith('\n') ? body : `${body}\n`);
|
|
73
|
-
return;
|
|
74
|
-
}
|
|
75
|
-
const usage = JSON.parse(body);
|
|
76
|
-
formatKeyValue(usageRows(usage));
|
|
77
|
-
if (usage.truncated) {
|
|
78
|
-
console.log(chalk.dim('Breakdowns are capped at their item limit; the dashboard lists every key and family.'));
|
|
79
|
-
}
|
|
80
|
-
}, error => (error.statusCode === 401 ? 'Run: invd login' : undefined)));
|
|
81
|
-
}
|
|
82
|
-
//# sourceMappingURL=usage.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"usage.js","sourceRoot":"","sources":["../../../src/commands/usage.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { Command } from 'commander';
|
|
2
|
-
/** IDA's `WEBHOOK_EVENT_NAMES` (docs/webhooks.md); the API's 400 stays the final word. */
|
|
3
|
-
export declare const WEBHOOK_EVENTS: readonly ["earnings_call.scheduled", "earnings_call.rescheduled", "earnings_call.started", "earnings_call.ended", "earnings_call.transcript_provisional", "earnings_call.transcript_ready", "earnings_call.transcript_corrected", "earnings_call.assets_ready", "earnings_call.keyword_hit", "earnings_call.guidance_flash", "ping"];
|
|
4
|
-
/** `--active` of `webhooks update`: only the two literals. */
|
|
5
|
-
export declare function parseActive(value: string): boolean;
|
|
6
|
-
export interface UpdateOptions {
|
|
7
|
-
keywords?: string;
|
|
8
|
-
ciks?: string;
|
|
9
|
-
events?: string;
|
|
10
|
-
active?: string;
|
|
11
|
-
}
|
|
12
|
-
/** The PATCH body of `webhooks update`: only the given fields; at least one is required. */
|
|
13
|
-
export declare function buildUpdateBody(cmdOpts: UpdateOptions): Record<string, unknown>;
|
|
14
|
-
/** `--events`: each name must be one of `WEBHOOK_EVENTS`. */
|
|
15
|
-
export declare function parseEvents(value: string): string[];
|
|
16
|
-
export declare function registerWebhooksCommands(program: Command): void;
|
|
@@ -1,186 +0,0 @@
|
|
|
1
|
-
import chalk from 'chalk';
|
|
2
|
-
import { apiGet, apiRequest } from '../client/api-client.js';
|
|
3
|
-
import { withErrorHandling } from '../shared/errors.js';
|
|
4
|
-
import { output } from '../shared/output.js';
|
|
5
|
-
import { splitList } from '../shared/options.js';
|
|
6
|
-
import { setJsonMode } from '../shared/spinner.js';
|
|
7
|
-
import { formatKeyValue, formatTable } from '../formatters/table-formatter.js';
|
|
8
|
-
import { planHint } from './earnings.js';
|
|
9
|
-
const BASE = '/v1/earnings-calls/webhooks';
|
|
10
|
-
/** IDA's `WEBHOOK_EVENT_NAMES` (docs/webhooks.md); the API's 400 stays the final word. */
|
|
11
|
-
export const WEBHOOK_EVENTS = [
|
|
12
|
-
'earnings_call.scheduled',
|
|
13
|
-
'earnings_call.rescheduled',
|
|
14
|
-
'earnings_call.started',
|
|
15
|
-
'earnings_call.ended',
|
|
16
|
-
'earnings_call.transcript_provisional',
|
|
17
|
-
'earnings_call.transcript_ready',
|
|
18
|
-
'earnings_call.transcript_corrected',
|
|
19
|
-
'earnings_call.assets_ready',
|
|
20
|
-
'earnings_call.keyword_hit',
|
|
21
|
-
'earnings_call.guidance_flash',
|
|
22
|
-
'ping',
|
|
23
|
-
];
|
|
24
|
-
/** `--active` of `webhooks update`: only the two literals. */
|
|
25
|
-
export function parseActive(value) {
|
|
26
|
-
if (value === 'true')
|
|
27
|
-
return true;
|
|
28
|
-
if (value === 'false')
|
|
29
|
-
return false;
|
|
30
|
-
throw new Error('--active takes true or false');
|
|
31
|
-
}
|
|
32
|
-
/** The PATCH body of `webhooks update`: only the given fields; at least one is required. */
|
|
33
|
-
export function buildUpdateBody(cmdOpts) {
|
|
34
|
-
const body = {};
|
|
35
|
-
if (cmdOpts.keywords !== undefined)
|
|
36
|
-
body.keywords = splitList(cmdOpts.keywords);
|
|
37
|
-
if (cmdOpts.ciks !== undefined)
|
|
38
|
-
body.ciks = splitList(cmdOpts.ciks);
|
|
39
|
-
if (cmdOpts.events !== undefined)
|
|
40
|
-
body.events = parseEvents(cmdOpts.events);
|
|
41
|
-
if (cmdOpts.active !== undefined)
|
|
42
|
-
body.active = parseActive(cmdOpts.active);
|
|
43
|
-
if (Object.keys(body).length === 0) {
|
|
44
|
-
throw new Error('webhooks update needs at least one of --keywords, --ciks, --events, --active');
|
|
45
|
-
}
|
|
46
|
-
return body;
|
|
47
|
-
}
|
|
48
|
-
const SUBSCRIPTION_COLUMNS = ['id', 'url', 'events', 'ciks', 'active', 'consecutive_failures', 'secret_hint', 'created_at'];
|
|
49
|
-
const DELIVERY_COLUMNS = ['delivery_id', 'event', 'attempt', 'status', 'response_status', 'duration_ms', 'at', 'next_attempt_at'];
|
|
50
|
-
/** `--events`: each name must be one of `WEBHOOK_EVENTS`. */
|
|
51
|
-
export function parseEvents(value) {
|
|
52
|
-
const events = splitList(value);
|
|
53
|
-
const unknown = events.filter(event => !WEBHOOK_EVENTS.includes(event));
|
|
54
|
-
if (events.length === 0 || unknown.length > 0) {
|
|
55
|
-
const named = unknown.length ? `Unknown event(s): ${unknown.join(', ')}. ` : '';
|
|
56
|
-
throw new Error(`${named}--events takes a comma-separated list of: ${WEBHOOK_EVENTS.join(', ')}`);
|
|
57
|
-
}
|
|
58
|
-
return events;
|
|
59
|
-
}
|
|
60
|
-
function subscriptionRow(sub) {
|
|
61
|
-
return { ...sub, ciks: sub.filters?.ciks?.length ? sub.filters.ciks : 'all' };
|
|
62
|
-
}
|
|
63
|
-
const idPath = (id, suffix = '') => `${BASE}/${encodeURIComponent(id)}${suffix}`;
|
|
64
|
-
export function registerWebhooksCommands(program) {
|
|
65
|
-
const webhooks = program
|
|
66
|
-
.command('webhooks')
|
|
67
|
-
.description('Earnings-call webhook subscriptions (PRO): signed POSTs of the call lifecycle');
|
|
68
|
-
const globalOpts = () => {
|
|
69
|
-
const opts = program.opts();
|
|
70
|
-
if (opts.json)
|
|
71
|
-
setJsonMode(true);
|
|
72
|
-
return opts;
|
|
73
|
-
};
|
|
74
|
-
const run = (fn) => withErrorHandling(fn, planHint);
|
|
75
|
-
webhooks
|
|
76
|
-
.command('list')
|
|
77
|
-
.description("Your account's webhook subscriptions (secrets are never shown)")
|
|
78
|
-
.action(run(async () => {
|
|
79
|
-
const opts = globalOpts();
|
|
80
|
-
const data = await apiGet({ path: BASE });
|
|
81
|
-
output(data, opts, () => {
|
|
82
|
-
console.log(chalk.bold('\nWebhook subscriptions\n'));
|
|
83
|
-
formatTable(data.data.map(subscriptionRow), SUBSCRIPTION_COLUMNS);
|
|
84
|
-
});
|
|
85
|
-
}));
|
|
86
|
-
webhooks
|
|
87
|
-
.command('create')
|
|
88
|
-
.description('Create a subscription (max 10 per account); prints the signing secret once')
|
|
89
|
-
.requiredOption('--url <url>', 'https endpoint (port 443, public addresses only)')
|
|
90
|
-
.requiredOption('--events <list>', `Comma-separated events: ${WEBHOOK_EVENTS.join(', ')}`)
|
|
91
|
-
.option('--ciks <list>', 'Only these companies, comma-separated CIKs (max 10; default every company)')
|
|
92
|
-
.option('--keywords <list>', 'Comma-separated keywords for earnings_call.keyword_hit (2–64 chars each, max 20)')
|
|
93
|
-
.action(run(async (cmdOpts) => {
|
|
94
|
-
const opts = globalOpts();
|
|
95
|
-
const events = parseEvents(cmdOpts.events);
|
|
96
|
-
const ciks = splitList(cmdOpts.ciks);
|
|
97
|
-
const keywords = splitList(cmdOpts.keywords);
|
|
98
|
-
const filters = ciks.length || keywords.length
|
|
99
|
-
? { ...(ciks.length ? { ciks } : {}), ...(keywords.length ? { keywords } : {}) }
|
|
100
|
-
: undefined;
|
|
101
|
-
const data = await apiRequest({
|
|
102
|
-
method: 'POST',
|
|
103
|
-
path: BASE,
|
|
104
|
-
body: { url: cmdOpts.url, events, ...(filters ? { filters } : {}) },
|
|
105
|
-
});
|
|
106
|
-
output(data, opts, () => {
|
|
107
|
-
const { secret, ...sub } = data;
|
|
108
|
-
console.log(chalk.bold('\nWebhook created\n'));
|
|
109
|
-
formatKeyValue(subscriptionRow(sub));
|
|
110
|
-
console.log(chalk.yellow('\nSigning secret — shown only this once; store it now:'));
|
|
111
|
-
console.log(secret);
|
|
112
|
-
});
|
|
113
|
-
}));
|
|
114
|
-
webhooks
|
|
115
|
-
.command('update')
|
|
116
|
-
.description('Change the keywords, companies, events or active flag of a subscription')
|
|
117
|
-
.argument('<id>', 'Subscription ID')
|
|
118
|
-
.option('--keywords <list>', 'Comma-separated keywords for earnings_call.keyword_hit (an empty value clears them)')
|
|
119
|
-
.option('--ciks <list>', 'Only these companies, comma-separated CIKs (max 10; an empty value = every company)')
|
|
120
|
-
.option('--events <list>', `Comma-separated events: ${WEBHOOK_EVENTS.join(', ')}`)
|
|
121
|
-
.option('--active <true|false>', 'Pause (false) or resume (true; resets the failure counters) the subscription')
|
|
122
|
-
.action(run(async (id, cmdOpts) => {
|
|
123
|
-
const opts = globalOpts();
|
|
124
|
-
const body = buildUpdateBody(cmdOpts);
|
|
125
|
-
const data = await apiRequest({ method: 'PATCH', path: idPath(id), body });
|
|
126
|
-
output(data, opts, () => {
|
|
127
|
-
console.log(chalk.bold('\nWebhook updated\n'));
|
|
128
|
-
formatKeyValue(subscriptionRow(data));
|
|
129
|
-
});
|
|
130
|
-
}));
|
|
131
|
-
webhooks
|
|
132
|
-
.command('delete')
|
|
133
|
-
.description('Delete a subscription')
|
|
134
|
-
.argument('<id>', 'Subscription ID')
|
|
135
|
-
.action(run(async (id) => {
|
|
136
|
-
const opts = globalOpts();
|
|
137
|
-
await apiRequest({ method: 'DELETE', path: idPath(id) });
|
|
138
|
-
output({ id, deleted: true }, opts, () => {
|
|
139
|
-
console.log(chalk.green(`Deleted webhook ${id}`));
|
|
140
|
-
});
|
|
141
|
-
}));
|
|
142
|
-
webhooks
|
|
143
|
-
.command('rotate-secret')
|
|
144
|
-
.description('New signing secret (shown once); the old one stays valid for 5 minutes')
|
|
145
|
-
.argument('<id>', 'Subscription ID')
|
|
146
|
-
.action(run(async (id) => {
|
|
147
|
-
const opts = globalOpts();
|
|
148
|
-
const data = await apiRequest({
|
|
149
|
-
method: 'POST',
|
|
150
|
-
path: idPath(id, '/rotate-secret'),
|
|
151
|
-
});
|
|
152
|
-
output(data, opts, () => {
|
|
153
|
-
console.log(chalk.yellow('\nNew signing secret — shown only this once; store it now:'));
|
|
154
|
-
console.log(data.secret);
|
|
155
|
-
console.log(chalk.dim(`\nThe previous secret stays valid until ${data.previous_secret_expires_at}.`));
|
|
156
|
-
});
|
|
157
|
-
}));
|
|
158
|
-
webhooks
|
|
159
|
-
.command('test')
|
|
160
|
-
.description('Send a signed ping delivery to the subscription')
|
|
161
|
-
.argument('<id>', 'Subscription ID')
|
|
162
|
-
.action(run(async (id) => {
|
|
163
|
-
const opts = globalOpts();
|
|
164
|
-
const data = await apiRequest({
|
|
165
|
-
method: 'POST',
|
|
166
|
-
path: idPath(id, '/test'),
|
|
167
|
-
});
|
|
168
|
-
output(data, opts, () => {
|
|
169
|
-
console.log(chalk.green(`Queued ${data.event} delivery ${data.delivery_id}`));
|
|
170
|
-
console.log(chalk.dim(`See its result with: invd webhooks deliveries ${id}`));
|
|
171
|
-
});
|
|
172
|
-
}));
|
|
173
|
-
webhooks
|
|
174
|
-
.command('deliveries')
|
|
175
|
-
.description('The last 100 delivery attempts, newest first (kept 7 days)')
|
|
176
|
-
.argument('<id>', 'Subscription ID')
|
|
177
|
-
.action(run(async (id) => {
|
|
178
|
-
const opts = globalOpts();
|
|
179
|
-
const data = await apiGet({ path: idPath(id, '/deliveries') });
|
|
180
|
-
output(data, opts, () => {
|
|
181
|
-
console.log(chalk.bold(`\nDeliveries of ${id}\n`));
|
|
182
|
-
formatTable(data.data, DELIVERY_COLUMNS);
|
|
183
|
-
});
|
|
184
|
-
}));
|
|
185
|
-
}
|
|
186
|
-
//# sourceMappingURL=webhooks.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"webhooks.js","sourceRoot":"","sources":["../../../src/commands/webhooks.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
const BLOCKS = ['▁', '▂', '▃', '▄', '▅', '▆', '▇', '█'];
|
|
2
|
-
/** One block glyph per value, scaled to the largest; an all-zero (or negative) series is a flat line of `▁`. */
|
|
3
|
-
export function sparkline(values) {
|
|
4
|
-
const max = Math.max(0, ...values);
|
|
5
|
-
if (max === 0)
|
|
6
|
-
return BLOCKS[0].repeat(values.length);
|
|
7
|
-
return values
|
|
8
|
-
.map(value => BLOCKS[Math.round((Math.max(0, value) / max) * (BLOCKS.length - 1))])
|
|
9
|
-
.join('');
|
|
10
|
-
}
|
|
11
|
-
//# sourceMappingURL=sparkline.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sparkline.js","sourceRoot":"","sources":["../../../src/formatters/sparkline.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AAExD,gHAAgH;AAChH,MAAM,UAAU,SAAS,CAAC,MAAgB;IACxC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,CAAC;IACnC,IAAI,GAAG,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACtD,OAAO,MAAM;SACV,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;SAClF,IAAI,CAAC,EAAE,CAAC,CAAC;AACd,CAAC"}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
interface TreeNode {
|
|
2
|
-
concept?: string;
|
|
3
|
-
metric_id?: string;
|
|
4
|
-
label?: string;
|
|
5
|
-
value?: number | null;
|
|
6
|
-
depth?: number;
|
|
7
|
-
isTotal?: boolean;
|
|
8
|
-
children?: TreeNode[];
|
|
9
|
-
}
|
|
10
|
-
export declare function formatTree(nodes: TreeNode[], indent?: number): void;
|
|
11
|
-
export {};
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import chalk from 'chalk';
|
|
2
|
-
export function formatTree(nodes, indent = 0) {
|
|
3
|
-
for (const node of nodes) {
|
|
4
|
-
const prefix = ' '.repeat(indent);
|
|
5
|
-
const label = node.label || node.metric_id || node.concept || 'Unknown';
|
|
6
|
-
const value = node.value !== null && node.value !== undefined ? formatTreeValue(node.value) : '';
|
|
7
|
-
if (node.isTotal) {
|
|
8
|
-
console.log(`${prefix}${chalk.bold(label)}${value ? ' ' + chalk.bold(value) : ''}`);
|
|
9
|
-
}
|
|
10
|
-
else if (node.children && node.children.length > 0) {
|
|
11
|
-
console.log(`${prefix}${chalk.cyan(label)}${value ? ' ' + value : ''}`);
|
|
12
|
-
}
|
|
13
|
-
else {
|
|
14
|
-
console.log(`${prefix}${label}${value ? ' ' + chalk.dim(value) : ''}`);
|
|
15
|
-
}
|
|
16
|
-
if (node.children) {
|
|
17
|
-
formatTree(node.children, indent + 1);
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
function formatTreeValue(n) {
|
|
22
|
-
if (Math.abs(n) >= 1_000_000) {
|
|
23
|
-
return `${(n / 1_000_000).toFixed(1)}M`;
|
|
24
|
-
}
|
|
25
|
-
if (Math.abs(n) >= 1_000) {
|
|
26
|
-
return `${(n / 1_000).toFixed(1)}K`;
|
|
27
|
-
}
|
|
28
|
-
return n.toLocaleString('en-US', { maximumFractionDigits: 2 });
|
|
29
|
-
}
|
|
30
|
-
//# sourceMappingURL=tree-formatter.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tree-formatter.js","sourceRoot":"","sources":["../../../src/formatters/tree-formatter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAY1B,MAAM,UAAU,UAAU,CAAC,KAAiB,EAAE,SAAiB,CAAC;IAC9D,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACnC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,OAAO,IAAI,SAAS,CAAC;QACxE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,KAAK,IAAI,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAEjG,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACvF,CAAC;aAAM,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrD,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC3E,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC1E,CAAC;QAED,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,CAAS;IAChC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,SAAS,EAAE,CAAC;QAC7B,OAAO,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IAC1C,CAAC;IACD,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC;QACzB,OAAO,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IACtC,CAAC;IACD,OAAO,CAAC,CAAC,cAAc,CAAC,OAAO,EAAE,EAAE,qBAAqB,EAAE,CAAC,EAAE,CAAC,CAAC;AACjE,CAAC"}
|