@disclosure-api/cli 0.0.1
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 +79 -0
- package/dist/catalog.d.ts +38 -0
- package/dist/catalog.js +455 -0
- package/dist/catalog.js.map +1 -0
- package/dist/client.d.ts +42 -0
- package/dist/client.js +170 -0
- package/dist/client.js.map +1 -0
- package/dist/help.d.ts +56 -0
- package/dist/help.js +200 -0
- package/dist/help.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +304 -0
- package/dist/index.js.map +1 -0
- package/package.json +23 -0
package/dist/client.js
ADDED
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import { DEFAULT_BASE_URL } from './catalog.js';
|
|
2
|
+
export class ApiRequestError extends Error {
|
|
3
|
+
code;
|
|
4
|
+
status;
|
|
5
|
+
details;
|
|
6
|
+
rateLimit;
|
|
7
|
+
constructor(input) {
|
|
8
|
+
super(input.message);
|
|
9
|
+
this.name = 'ApiRequestError';
|
|
10
|
+
this.code = input.code;
|
|
11
|
+
this.status = input.status;
|
|
12
|
+
this.details = input.details;
|
|
13
|
+
this.rateLimit = input.rateLimit;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
export class DisclosureApiClient {
|
|
17
|
+
baseUrl;
|
|
18
|
+
apiKey;
|
|
19
|
+
constructor(env = process.env) {
|
|
20
|
+
this.baseUrl = normalizeBaseUrl(env.DISCLOSURE_API_BASE_URL ?? DEFAULT_BASE_URL);
|
|
21
|
+
this.apiKey = env.DISCLOSURE_API_KEY;
|
|
22
|
+
}
|
|
23
|
+
async getJson(path, query, authRequired) {
|
|
24
|
+
const url = buildUrl(this.baseUrl, path, query);
|
|
25
|
+
const headers = {
|
|
26
|
+
accept: 'application/json'
|
|
27
|
+
};
|
|
28
|
+
if (authRequired) {
|
|
29
|
+
if (!this.apiKey) {
|
|
30
|
+
throw new ApiRequestError({
|
|
31
|
+
code: 'missing_api_key',
|
|
32
|
+
message: 'DISCLOSURE_API_KEY is required for this command. Set it to your Disclosure API bearer token.'
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
headers.authorization = `Bearer ${this.apiKey}`;
|
|
36
|
+
}
|
|
37
|
+
let response;
|
|
38
|
+
try {
|
|
39
|
+
response = await fetch(url, { headers });
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
throw new ApiRequestError({
|
|
43
|
+
code: 'network_error',
|
|
44
|
+
message: error instanceof Error ? error.message : 'Network request failed'
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
const body = await readBody(response);
|
|
48
|
+
if (!response.ok) {
|
|
49
|
+
const apiError = parseApiError(body);
|
|
50
|
+
throw new ApiRequestError({
|
|
51
|
+
code: apiError.code,
|
|
52
|
+
message: apiError.message,
|
|
53
|
+
status: response.status,
|
|
54
|
+
details: apiError.details,
|
|
55
|
+
rateLimit: readRateLimitHeaders(response.headers)
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
return body;
|
|
59
|
+
}
|
|
60
|
+
async getAllPages(path, query, authRequired) {
|
|
61
|
+
const rows = [];
|
|
62
|
+
let pages = 0;
|
|
63
|
+
let nextOffset = typeof query.offset === 'number'
|
|
64
|
+
? query.offset
|
|
65
|
+
: Number.parseInt(String(query.offset ?? '0'), 10);
|
|
66
|
+
const initialOffset = Number.isFinite(nextOffset) ? nextOffset : 0;
|
|
67
|
+
const pageQuery = { ...query };
|
|
68
|
+
for (;;) {
|
|
69
|
+
pageQuery.offset = nextOffset;
|
|
70
|
+
const page = (await this.getJson(path, pageQuery, authRequired));
|
|
71
|
+
pages += 1;
|
|
72
|
+
if (!Array.isArray(page.data)) {
|
|
73
|
+
throw new ApiRequestError({
|
|
74
|
+
code: 'unexpected_response',
|
|
75
|
+
message: 'Expected a paginated response with a data array while using --all.',
|
|
76
|
+
details: { page }
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
rows.push(...page.data);
|
|
80
|
+
const pagination = page.pagination;
|
|
81
|
+
if (!pagination?.has_more ||
|
|
82
|
+
pagination.next_offset === null ||
|
|
83
|
+
pagination.next_offset === undefined) {
|
|
84
|
+
return {
|
|
85
|
+
data: rows,
|
|
86
|
+
pagination: {
|
|
87
|
+
limit: pagination?.limit ?? parseNullableNumber(query.limit),
|
|
88
|
+
offset: initialOffset,
|
|
89
|
+
has_more: false,
|
|
90
|
+
next_offset: null,
|
|
91
|
+
total_retrieved: rows.length,
|
|
92
|
+
pages
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
if (pages > 1000) {
|
|
97
|
+
throw new ApiRequestError({
|
|
98
|
+
code: 'pagination_limit_exceeded',
|
|
99
|
+
message: 'Stopped after 1000 pages while following --all pagination.',
|
|
100
|
+
details: { next_offset: pagination.next_offset }
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
nextOffset = pagination.next_offset;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
function normalizeBaseUrl(value) {
|
|
108
|
+
const url = new URL(value);
|
|
109
|
+
url.hash = '';
|
|
110
|
+
url.search = '';
|
|
111
|
+
url.pathname = url.pathname.replace(/\/+$/, '');
|
|
112
|
+
if (url.pathname === '/v1') {
|
|
113
|
+
url.pathname = '';
|
|
114
|
+
}
|
|
115
|
+
return url.toString().replace(/\/+$/, '');
|
|
116
|
+
}
|
|
117
|
+
function buildUrl(baseUrl, path, query) {
|
|
118
|
+
const url = new URL(path.replace(/^\//, ''), `${baseUrl}/`);
|
|
119
|
+
for (const [key, value] of Object.entries(query)) {
|
|
120
|
+
url.searchParams.set(key, String(value));
|
|
121
|
+
}
|
|
122
|
+
return url;
|
|
123
|
+
}
|
|
124
|
+
async function readBody(response) {
|
|
125
|
+
const text = await response.text();
|
|
126
|
+
if (!text)
|
|
127
|
+
return null;
|
|
128
|
+
try {
|
|
129
|
+
return JSON.parse(text);
|
|
130
|
+
}
|
|
131
|
+
catch {
|
|
132
|
+
return text;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
function parseApiError(body) {
|
|
136
|
+
if (isRecord(body)) {
|
|
137
|
+
const error = body.error;
|
|
138
|
+
if (isRecord(error)) {
|
|
139
|
+
return {
|
|
140
|
+
code: typeof error.code === 'string' ? error.code : 'api_error',
|
|
141
|
+
message: typeof error.message === 'string' ? error.message : 'API request failed',
|
|
142
|
+
details: error.details
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
return {
|
|
147
|
+
code: 'api_error',
|
|
148
|
+
message: typeof body === 'string' ? body : 'API request failed',
|
|
149
|
+
details: body
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
function readRateLimitHeaders(headers) {
|
|
153
|
+
const output = {};
|
|
154
|
+
for (const name of ['ratelimit-limit', 'ratelimit-remaining', 'ratelimit-reset', 'retry-after']) {
|
|
155
|
+
const value = headers.get(name);
|
|
156
|
+
if (value)
|
|
157
|
+
output[name] = value;
|
|
158
|
+
}
|
|
159
|
+
return Object.keys(output).length ? output : undefined;
|
|
160
|
+
}
|
|
161
|
+
function parseNullableNumber(value) {
|
|
162
|
+
if (value === undefined)
|
|
163
|
+
return null;
|
|
164
|
+
const number = typeof value === 'number' ? value : Number.parseInt(String(value), 10);
|
|
165
|
+
return Number.isFinite(number) ? number : null;
|
|
166
|
+
}
|
|
167
|
+
function isRecord(value) {
|
|
168
|
+
return typeof value === 'object' && value !== null;
|
|
169
|
+
}
|
|
170
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/help.d.ts
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { type CommandSpec } from './catalog.js';
|
|
2
|
+
export declare function rootHelp(): string;
|
|
3
|
+
export declare function commandHelp(command: CommandSpec): string;
|
|
4
|
+
export declare function helpCatalogJson(): {
|
|
5
|
+
name: string;
|
|
6
|
+
binary: string;
|
|
7
|
+
version: string;
|
|
8
|
+
defaultBaseUrl: string;
|
|
9
|
+
env: ({
|
|
10
|
+
name: string;
|
|
11
|
+
requiredForProtectedCommands: boolean;
|
|
12
|
+
description: string;
|
|
13
|
+
required?: undefined;
|
|
14
|
+
default?: undefined;
|
|
15
|
+
} | {
|
|
16
|
+
name: string;
|
|
17
|
+
required: boolean;
|
|
18
|
+
default: string;
|
|
19
|
+
description: string;
|
|
20
|
+
requiredForProtectedCommands?: undefined;
|
|
21
|
+
})[];
|
|
22
|
+
output: {
|
|
23
|
+
success: string;
|
|
24
|
+
error: string;
|
|
25
|
+
pagination: string;
|
|
26
|
+
};
|
|
27
|
+
agentGuidance: string[];
|
|
28
|
+
commands: {
|
|
29
|
+
id: string;
|
|
30
|
+
command: string;
|
|
31
|
+
description: string;
|
|
32
|
+
authRequired: boolean;
|
|
33
|
+
list: boolean;
|
|
34
|
+
endpoint: {
|
|
35
|
+
method: string;
|
|
36
|
+
path: string;
|
|
37
|
+
};
|
|
38
|
+
positionals: {
|
|
39
|
+
name: string;
|
|
40
|
+
label: string;
|
|
41
|
+
required: boolean;
|
|
42
|
+
description: string;
|
|
43
|
+
pathParam: string | undefined;
|
|
44
|
+
queryParam: string | undefined;
|
|
45
|
+
}[];
|
|
46
|
+
flags: {
|
|
47
|
+
name: string;
|
|
48
|
+
kind: string;
|
|
49
|
+
valueName: string | undefined;
|
|
50
|
+
apiName: string | undefined;
|
|
51
|
+
description: string;
|
|
52
|
+
}[];
|
|
53
|
+
examples: readonly string[];
|
|
54
|
+
notes: readonly string[];
|
|
55
|
+
}[];
|
|
56
|
+
};
|
package/dist/help.js
ADDED
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
import { CLI_NAME, CLI_VERSION, COMMANDS, DEFAULT_BASE_URL, commandName } from './catalog.js';
|
|
2
|
+
export function rootHelp() {
|
|
3
|
+
const commands = COMMANDS.map((command) => ` ${pad(commandName(command), 36)} ${command.summary}`).join('\n');
|
|
4
|
+
return `${CLI_NAME} ${CLI_VERSION}
|
|
5
|
+
|
|
6
|
+
Agent-friendly CLI for the Disclosure API.
|
|
7
|
+
|
|
8
|
+
Usage:
|
|
9
|
+
${CLI_NAME} <command> [args] [flags]
|
|
10
|
+
${CLI_NAME} --help
|
|
11
|
+
${CLI_NAME} --version
|
|
12
|
+
${CLI_NAME} help --json
|
|
13
|
+
${CLI_NAME} help <command>
|
|
14
|
+
|
|
15
|
+
Environment:
|
|
16
|
+
DISCLOSURE_API_KEY Required for all protected /v1 commands.
|
|
17
|
+
DISCLOSURE_API_BASE_URL Optional API origin. Defaults to ${DEFAULT_BASE_URL}.
|
|
18
|
+
|
|
19
|
+
Output contract:
|
|
20
|
+
Success writes JSON to stdout.
|
|
21
|
+
List commands support --format jsonl to write one data row per line.
|
|
22
|
+
Errors write a JSON error envelope to stderr and exit non-zero.
|
|
23
|
+
Use --all on list commands to follow pagination until has_more is false.
|
|
24
|
+
|
|
25
|
+
For coding agents:
|
|
26
|
+
Prefer --format json unless a streaming row format is easier to consume.
|
|
27
|
+
Use --all only when a complete dataset is needed.
|
|
28
|
+
Avoid --include-text unless full extracted filing text is required.
|
|
29
|
+
On non-zero exit, parse stderr JSON and inspect error.code and error.details.
|
|
30
|
+
Cite returned SEC/source URLs when relevant.
|
|
31
|
+
|
|
32
|
+
Commands:
|
|
33
|
+
${commands}
|
|
34
|
+
|
|
35
|
+
Examples:
|
|
36
|
+
${CLI_NAME} status
|
|
37
|
+
${CLI_NAME} companies search AAPL --limit 5
|
|
38
|
+
${CLI_NAME} filings list --ticker AAPL --form-type 8-K --format jsonl
|
|
39
|
+
${CLI_NAME} filings sections 0000320193-24-000037 --item-code 2.02
|
|
40
|
+
${CLI_NAME} help filings list
|
|
41
|
+
`;
|
|
42
|
+
}
|
|
43
|
+
export function commandHelp(command) {
|
|
44
|
+
const usage = buildUsage(command);
|
|
45
|
+
const positionals = command.positionals?.length
|
|
46
|
+
? `\nArguments:\n${command.positionals
|
|
47
|
+
.map((arg) => ` ${pad(arg.label, 22)} ${arg.description}`)
|
|
48
|
+
.join('\n')}\n`
|
|
49
|
+
: '';
|
|
50
|
+
const flags = renderFlags(command);
|
|
51
|
+
const examples = command.examples.map((example) => ` ${example}`).join('\n');
|
|
52
|
+
const notes = command.notes?.length
|
|
53
|
+
? `\nNotes:\n${command.notes.map((note) => ` ${note}`).join('\n')}\n`
|
|
54
|
+
: '';
|
|
55
|
+
return `${CLI_NAME} ${commandName(command)}
|
|
56
|
+
|
|
57
|
+
${command.summary}
|
|
58
|
+
|
|
59
|
+
${command.description}
|
|
60
|
+
|
|
61
|
+
Usage:
|
|
62
|
+
${usage}
|
|
63
|
+
|
|
64
|
+
Auth:
|
|
65
|
+
${command.authRequired ? 'Requires DISCLOSURE_API_KEY.' : 'No API key required.'}
|
|
66
|
+
|
|
67
|
+
Endpoint:
|
|
68
|
+
GET ${command.endpoint}
|
|
69
|
+
|
|
70
|
+
Output:
|
|
71
|
+
Success writes JSON to stdout.
|
|
72
|
+
${command.list
|
|
73
|
+
? 'This list command supports --format jsonl and --all pagination.'
|
|
74
|
+
: 'This command supports --format json only.'}
|
|
75
|
+
Errors write JSON to stderr and exit non-zero.
|
|
76
|
+
${positionals}${flags}${notes}
|
|
77
|
+
Examples:
|
|
78
|
+
${examples}
|
|
79
|
+
`;
|
|
80
|
+
}
|
|
81
|
+
export function helpCatalogJson() {
|
|
82
|
+
return {
|
|
83
|
+
name: '@disclosure-api/cli',
|
|
84
|
+
binary: CLI_NAME,
|
|
85
|
+
version: CLI_VERSION,
|
|
86
|
+
defaultBaseUrl: DEFAULT_BASE_URL,
|
|
87
|
+
env: [
|
|
88
|
+
{
|
|
89
|
+
name: 'DISCLOSURE_API_KEY',
|
|
90
|
+
requiredForProtectedCommands: true,
|
|
91
|
+
description: 'Bearer token for protected Disclosure API commands.'
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
name: 'DISCLOSURE_API_BASE_URL',
|
|
95
|
+
required: false,
|
|
96
|
+
default: DEFAULT_BASE_URL,
|
|
97
|
+
description: 'API origin override. A trailing /v1 is accepted and normalized.'
|
|
98
|
+
}
|
|
99
|
+
],
|
|
100
|
+
output: {
|
|
101
|
+
success: 'JSON to stdout. List commands may use JSONL with --format jsonl.',
|
|
102
|
+
error: 'JSON error envelope to stderr with a non-zero exit code.',
|
|
103
|
+
pagination: '--all follows pagination.has_more and pagination.next_offset on list commands.'
|
|
104
|
+
},
|
|
105
|
+
agentGuidance: [
|
|
106
|
+
'Prefer --format json unless JSONL row streaming is easier.',
|
|
107
|
+
'Use --all only when a complete dataset is required.',
|
|
108
|
+
'Avoid --include-text unless full extracted source text is needed.',
|
|
109
|
+
'On non-zero exit, parse stderr JSON and inspect error.code and error.details.',
|
|
110
|
+
'Cite returned SEC/source URLs when relevant.'
|
|
111
|
+
],
|
|
112
|
+
commands: COMMANDS.map((command) => ({
|
|
113
|
+
id: command.id,
|
|
114
|
+
command: commandName(command),
|
|
115
|
+
description: command.description,
|
|
116
|
+
authRequired: command.authRequired,
|
|
117
|
+
list: command.list,
|
|
118
|
+
endpoint: {
|
|
119
|
+
method: 'GET',
|
|
120
|
+
path: command.endpoint
|
|
121
|
+
},
|
|
122
|
+
positionals: command.positionals?.map((arg) => ({
|
|
123
|
+
name: arg.name,
|
|
124
|
+
label: arg.label,
|
|
125
|
+
required: arg.required,
|
|
126
|
+
description: arg.description,
|
|
127
|
+
pathParam: arg.pathParam,
|
|
128
|
+
queryParam: arg.queryParam
|
|
129
|
+
})) ?? [],
|
|
130
|
+
flags: [...renderOutputFlagJson(command), ...(command.flags?.map(flagJson) ?? [])],
|
|
131
|
+
examples: command.examples,
|
|
132
|
+
notes: command.notes ?? []
|
|
133
|
+
}))
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
function buildUsage(command) {
|
|
137
|
+
const args = command.positionals?.map((arg) => arg.label).join(' ');
|
|
138
|
+
return [CLI_NAME, commandName(command), args, '[flags]'].filter(Boolean).join(' ');
|
|
139
|
+
}
|
|
140
|
+
function renderFlags(command) {
|
|
141
|
+
const flags = [...outputFlags(command), ...(command.flags ?? [])];
|
|
142
|
+
if (!flags.length)
|
|
143
|
+
return '';
|
|
144
|
+
return `Flags:\n${flags.map(formatFlag).join('\n')}\n`;
|
|
145
|
+
}
|
|
146
|
+
function outputFlags(command) {
|
|
147
|
+
return [
|
|
148
|
+
{
|
|
149
|
+
name: 'format',
|
|
150
|
+
apiName: '',
|
|
151
|
+
kind: 'string',
|
|
152
|
+
valueName: command.list ? 'json|jsonl' : 'json',
|
|
153
|
+
description: command.list
|
|
154
|
+
? 'Output format. Defaults to json.'
|
|
155
|
+
: 'Output format. Only json is supported.'
|
|
156
|
+
},
|
|
157
|
+
...(command.list
|
|
158
|
+
? [
|
|
159
|
+
{
|
|
160
|
+
name: 'all',
|
|
161
|
+
apiName: '',
|
|
162
|
+
kind: 'boolean-string',
|
|
163
|
+
description: 'Follow pagination until has_more is false.'
|
|
164
|
+
}
|
|
165
|
+
]
|
|
166
|
+
: []),
|
|
167
|
+
{
|
|
168
|
+
name: 'help',
|
|
169
|
+
apiName: '',
|
|
170
|
+
kind: 'boolean-string',
|
|
171
|
+
description: 'Show help for this command.'
|
|
172
|
+
}
|
|
173
|
+
];
|
|
174
|
+
}
|
|
175
|
+
function renderOutputFlagJson(command) {
|
|
176
|
+
return outputFlags(command).map((flag) => ({
|
|
177
|
+
name: `--${flag.name}`,
|
|
178
|
+
kind: flag.name === 'all' || flag.name === 'help' ? 'boolean' : flag.kind,
|
|
179
|
+
valueName: flag.valueName,
|
|
180
|
+
apiName: flag.apiName || undefined,
|
|
181
|
+
description: flag.description
|
|
182
|
+
}));
|
|
183
|
+
}
|
|
184
|
+
function flagJson(flag) {
|
|
185
|
+
return {
|
|
186
|
+
name: `--${flag.name}`,
|
|
187
|
+
kind: flag.kind,
|
|
188
|
+
valueName: flag.valueName,
|
|
189
|
+
apiName: flag.apiName,
|
|
190
|
+
description: flag.description
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
function formatFlag(flag) {
|
|
194
|
+
const label = flag.valueName ? `--${flag.name} <${flag.valueName}>` : `--${flag.name}`;
|
|
195
|
+
return ` ${pad(label, 30)} ${flag.description}`;
|
|
196
|
+
}
|
|
197
|
+
function pad(value, width) {
|
|
198
|
+
return value.length >= width ? value : `${value}${' '.repeat(width - value.length)}`;
|
|
199
|
+
}
|
|
200
|
+
//# sourceMappingURL=help.js.map
|
package/dist/help.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"help.js","sourceRoot":"","sources":["../src/help.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED