@knowledgesdk/cli 0.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 (59) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +263 -0
  3. package/dist/commands/classify.d.ts +3 -0
  4. package/dist/commands/classify.d.ts.map +1 -0
  5. package/dist/commands/classify.js +45 -0
  6. package/dist/commands/classify.js.map +1 -0
  7. package/dist/commands/config.d.ts +3 -0
  8. package/dist/commands/config.d.ts.map +1 -0
  9. package/dist/commands/config.js +63 -0
  10. package/dist/commands/config.js.map +1 -0
  11. package/dist/commands/extract.d.ts +3 -0
  12. package/dist/commands/extract.d.ts.map +1 -0
  13. package/dist/commands/extract.js +136 -0
  14. package/dist/commands/extract.js.map +1 -0
  15. package/dist/commands/jobs.d.ts +3 -0
  16. package/dist/commands/jobs.d.ts.map +1 -0
  17. package/dist/commands/jobs.js +121 -0
  18. package/dist/commands/jobs.js.map +1 -0
  19. package/dist/commands/scrape.d.ts +3 -0
  20. package/dist/commands/scrape.d.ts.map +1 -0
  21. package/dist/commands/scrape.js +48 -0
  22. package/dist/commands/scrape.js.map +1 -0
  23. package/dist/commands/screenshot.d.ts +3 -0
  24. package/dist/commands/screenshot.d.ts.map +1 -0
  25. package/dist/commands/screenshot.js +58 -0
  26. package/dist/commands/screenshot.js.map +1 -0
  27. package/dist/commands/search.d.ts +3 -0
  28. package/dist/commands/search.d.ts.map +1 -0
  29. package/dist/commands/search.js +51 -0
  30. package/dist/commands/search.js.map +1 -0
  31. package/dist/commands/sitemap.d.ts +3 -0
  32. package/dist/commands/sitemap.d.ts.map +1 -0
  33. package/dist/commands/sitemap.js +45 -0
  34. package/dist/commands/sitemap.js.map +1 -0
  35. package/dist/commands/webhooks.d.ts +3 -0
  36. package/dist/commands/webhooks.d.ts.map +1 -0
  37. package/dist/commands/webhooks.js +118 -0
  38. package/dist/commands/webhooks.js.map +1 -0
  39. package/dist/index.d.ts +3 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +68 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/lib/api.d.ts +71 -0
  44. package/dist/lib/api.d.ts.map +1 -0
  45. package/dist/lib/api.js +212 -0
  46. package/dist/lib/api.js.map +1 -0
  47. package/dist/lib/config.d.ts +23 -0
  48. package/dist/lib/config.d.ts.map +1 -0
  49. package/dist/lib/config.js +59 -0
  50. package/dist/lib/config.js.map +1 -0
  51. package/dist/lib/output.d.ts +73 -0
  52. package/dist/lib/output.d.ts.map +1 -0
  53. package/dist/lib/output.js +149 -0
  54. package/dist/lib/output.js.map +1 -0
  55. package/dist/types.d.ts +127 -0
  56. package/dist/types.d.ts.map +1 -0
  57. package/dist/types.js +3 -0
  58. package/dist/types.js.map +1 -0
  59. package/package.json +43 -0
@@ -0,0 +1,71 @@
1
+ export declare class ApiError extends Error {
2
+ readonly statusCode: number;
3
+ readonly body?: unknown | undefined;
4
+ constructor(statusCode: number, message: string, body?: unknown | undefined);
5
+ }
6
+ export declare function apiGet<T>(path: string): Promise<T>;
7
+ export declare function apiPost<T>(path: string, body?: unknown): Promise<T>;
8
+ export declare function apiDelete<T>(path: string): Promise<T>;
9
+ import type { ClassifyResult, ExtractionJob, Job, ScrapeResult, SearchResult, SitemapResult, ScreenshotResult, Webhook, WebhookListResult, WebhookEvent } from '../types.js';
10
+ export declare function extractUrl(url: string, options?: {
11
+ async?: boolean;
12
+ callbackUrl?: string;
13
+ maxPages?: number;
14
+ }): Promise<ExtractionJob>;
15
+ export declare function scrapeUrl(url: string): Promise<ScrapeResult>;
16
+ export declare function classifyUrl(url: string): Promise<ClassifyResult>;
17
+ export declare function getSitemap(url: string): Promise<SitemapResult>;
18
+ export declare function takeScreenshot(url: string): Promise<ScreenshotResult>;
19
+ export declare function searchKnowledge(query: string, limit?: number): Promise<SearchResult>;
20
+ export declare function listWebhooks(): Promise<WebhookListResult>;
21
+ export declare function createWebhook(url: string, events: WebhookEvent[]): Promise<Webhook>;
22
+ export declare function deleteWebhook(id: string): Promise<void>;
23
+ export declare function getJob(jobId: string): Promise<Job>;
24
+ export type ExtractStreamEvent = {
25
+ type: 'connected';
26
+ message: string;
27
+ } | {
28
+ type: 'progress';
29
+ message: string;
30
+ } | {
31
+ type: 'business_classified';
32
+ business: {
33
+ businessName: string;
34
+ businessType: string;
35
+ };
36
+ } | {
37
+ type: 'pages_planned';
38
+ pages: Array<{
39
+ url: string;
40
+ purpose: string;
41
+ }>;
42
+ } | {
43
+ type: 'page_scraped';
44
+ url: string;
45
+ index: number;
46
+ total: number;
47
+ status: 'done' | 'failed';
48
+ } | {
49
+ type: 'urls_triaged';
50
+ suggestedUrls: Array<{
51
+ url: string;
52
+ reason: string;
53
+ }>;
54
+ } | {
55
+ type: 'complete';
56
+ result: {
57
+ business: {
58
+ businessName: string;
59
+ };
60
+ knowledgeItems: unknown[];
61
+ pagesScraped: number;
62
+ durationMs?: number;
63
+ };
64
+ } | {
65
+ type: 'error';
66
+ message: string;
67
+ };
68
+ export declare function extractUrlStream(url: string, options?: {
69
+ maxPages?: number;
70
+ }): AsyncGenerator<ExtractStreamEvent>;
71
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/lib/api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,212 @@
1
+ import { resolveApiKey, resolveBaseUrl } from './config.js';
2
+ import { fetchEventSource } from '@microsoft/fetch-event-source';
3
+ export class ApiError extends Error {
4
+ statusCode;
5
+ body;
6
+ constructor(statusCode, message, body) {
7
+ super(message);
8
+ this.statusCode = statusCode;
9
+ this.body = body;
10
+ this.name = 'ApiError';
11
+ }
12
+ }
13
+ /**
14
+ * Friendly messages for common HTTP error codes.
15
+ */
16
+ function friendlyErrorMessage(status, body) {
17
+ const bodyMsg = body &&
18
+ typeof body === 'object' &&
19
+ 'message' in body &&
20
+ typeof body['message'] === 'string'
21
+ ? body['message']
22
+ : undefined;
23
+ switch (status) {
24
+ case 401:
25
+ return (bodyMsg ??
26
+ 'Invalid API key. Run `knowledgesdk config --key <your-key>` to set your API key.');
27
+ case 403:
28
+ return bodyMsg ?? 'Access forbidden. Check your API key permissions.';
29
+ case 404:
30
+ return bodyMsg ?? 'Resource not found.';
31
+ case 422:
32
+ return bodyMsg ?? 'Invalid request parameters.';
33
+ case 429:
34
+ return (bodyMsg ??
35
+ 'Rate limit exceeded. Please wait a moment before retrying.');
36
+ case 500:
37
+ case 502:
38
+ case 503:
39
+ return bodyMsg ?? 'KnowledgeSDK server error. Please try again later.';
40
+ default:
41
+ return bodyMsg ?? `Request failed with status ${status}.`;
42
+ }
43
+ }
44
+ /**
45
+ * Core fetch wrapper — attaches auth header and handles errors.
46
+ */
47
+ async function apiFetch(path, options = {}) {
48
+ const apiKey = resolveApiKey();
49
+ if (!apiKey) {
50
+ throw new ApiError(0, 'No API key configured. Run `knowledgesdk config --key <your-key>` or set the KNOWLEDGESDK_API_KEY environment variable.');
51
+ }
52
+ const baseUrl = resolveBaseUrl();
53
+ const url = `${baseUrl}${path}`;
54
+ const headers = {
55
+ 'x-api-key': apiKey,
56
+ 'Content-Type': 'application/json',
57
+ 'User-Agent': '@knowledgesdk/cli/0.1.0',
58
+ ...options.headers,
59
+ };
60
+ const response = await fetch(url, { ...options, headers });
61
+ // For binary responses (e.g. screenshot) return the raw Response object
62
+ // wrapped in a special marker that callers can check
63
+ const contentType = response.headers.get('content-type') ?? '';
64
+ if (!response.ok) {
65
+ let body;
66
+ try {
67
+ body = await response.json();
68
+ }
69
+ catch {
70
+ body = await response.text().catch(() => undefined);
71
+ }
72
+ throw new ApiError(response.status, friendlyErrorMessage(response.status, body), body);
73
+ }
74
+ if (contentType.startsWith('image/') || contentType === 'application/octet-stream') {
75
+ return response;
76
+ }
77
+ // Some endpoints return 204 No Content
78
+ if (response.status === 204) {
79
+ return undefined;
80
+ }
81
+ return response.json();
82
+ }
83
+ // ─── API methods ──────────────────────────────────────────────────────────────
84
+ export async function apiGet(path) {
85
+ return apiFetch(path, { method: 'GET' });
86
+ }
87
+ export async function apiPost(path, body) {
88
+ return apiFetch(path, {
89
+ method: 'POST',
90
+ body: body !== undefined ? JSON.stringify(body) : undefined,
91
+ });
92
+ }
93
+ export async function apiDelete(path) {
94
+ return apiFetch(path, { method: 'DELETE' });
95
+ }
96
+ export async function extractUrl(url, options = {}) {
97
+ return apiPost('/v1/extract', {
98
+ url,
99
+ async: options.async,
100
+ callbackUrl: options.callbackUrl,
101
+ maxPages: options.maxPages,
102
+ });
103
+ }
104
+ export async function scrapeUrl(url) {
105
+ return apiPost('/v1/scrape', { url });
106
+ }
107
+ export async function classifyUrl(url) {
108
+ return apiPost('/v1/classify', { url });
109
+ }
110
+ export async function getSitemap(url) {
111
+ return apiPost('/v1/sitemap', { url });
112
+ }
113
+ export async function takeScreenshot(url) {
114
+ return apiPost('/v1/screenshot', { url });
115
+ }
116
+ export async function searchKnowledge(query, limit) {
117
+ const params = new URLSearchParams({ q: query });
118
+ if (limit !== undefined)
119
+ params.set('limit', String(limit));
120
+ return apiGet(`/v1/search?${params.toString()}`);
121
+ }
122
+ export async function listWebhooks() {
123
+ return apiGet('/v1/webhooks');
124
+ }
125
+ export async function createWebhook(url, events) {
126
+ return apiPost('/v1/webhooks', { url, events });
127
+ }
128
+ export async function deleteWebhook(id) {
129
+ return apiDelete(`/v1/webhooks/${id}`);
130
+ }
131
+ export async function getJob(jobId) {
132
+ return apiGet(`/v1/jobs/${jobId}`);
133
+ }
134
+ export async function* extractUrlStream(url, options = {}) {
135
+ const apiKey = resolveApiKey();
136
+ if (!apiKey) {
137
+ throw new ApiError(0, 'No API key configured. Run `knowledgesdk config --key <your-key>` or set the KNOWLEDGESDK_API_KEY environment variable.');
138
+ }
139
+ const endpoint = `${resolveBaseUrl()}/v1/extract/stream`;
140
+ const queue = [];
141
+ let waitResolve = null;
142
+ let done = false;
143
+ let streamError = null;
144
+ const controller = new AbortController();
145
+ const enqueue = (item) => {
146
+ queue.push(item);
147
+ waitResolve?.();
148
+ waitResolve = null;
149
+ };
150
+ const finish = (err) => {
151
+ done = true;
152
+ streamError = err ?? null;
153
+ waitResolve?.();
154
+ waitResolve = null;
155
+ };
156
+ fetchEventSource(endpoint, {
157
+ method: 'POST',
158
+ headers: {
159
+ 'x-api-key': apiKey,
160
+ 'Content-Type': 'application/json',
161
+ Accept: 'text/event-stream',
162
+ 'User-Agent': '@knowledgesdk/cli/0.1.0',
163
+ },
164
+ body: JSON.stringify({ url, ...options }),
165
+ signal: controller.signal,
166
+ async onopen(response) {
167
+ if (!response.ok) {
168
+ let body;
169
+ try {
170
+ body = await response.json();
171
+ }
172
+ catch {
173
+ body = await response.text().catch(() => undefined);
174
+ }
175
+ throw new ApiError(response.status, friendlyErrorMessage(response.status, body), body);
176
+ }
177
+ },
178
+ onmessage(ev) {
179
+ if (!ev.data)
180
+ return;
181
+ try {
182
+ const parsed = JSON.parse(ev.data);
183
+ enqueue({ type: ev.event || 'message', ...parsed });
184
+ }
185
+ catch { }
186
+ },
187
+ onclose() { finish(); },
188
+ onerror(err) {
189
+ finish(err instanceof Error ? err : new Error(String(err)));
190
+ throw err; // prevent automatic retry
191
+ },
192
+ }).catch((err) => {
193
+ if (!done)
194
+ finish(err instanceof Error ? err : new Error(String(err)));
195
+ });
196
+ try {
197
+ while (!done || queue.length > 0) {
198
+ if (queue.length > 0) {
199
+ yield queue.shift();
200
+ }
201
+ else {
202
+ await new Promise((r) => { waitResolve = r; });
203
+ }
204
+ }
205
+ }
206
+ finally {
207
+ controller.abort();
208
+ }
209
+ if (streamError)
210
+ throw streamError;
211
+ }
212
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/lib/api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type { CLIConfig } from '../types.js';
2
+ export declare const DEFAULT_BASE_URL = "https://api.knowledgesdk.com";
3
+ /**
4
+ * Read the stored config from disk.
5
+ */
6
+ export declare function readConfig(): CLIConfig;
7
+ /**
8
+ * Write updated config to disk, merging with existing values.
9
+ */
10
+ export declare function writeConfig(updates: Partial<CLIConfig>): void;
11
+ /**
12
+ * Resolve the API key from env var or config file.
13
+ */
14
+ export declare function resolveApiKey(): string | undefined;
15
+ /**
16
+ * Resolve the base URL from env var or config file, with fallback.
17
+ */
18
+ export declare function resolveBaseUrl(): string;
19
+ /**
20
+ * Returns the path to the config file for display purposes.
21
+ */
22
+ export declare function getConfigFilePath(): string;
23
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAK7C,eAAO,MAAM,gBAAgB,iCAAiC,CAAC;AAE/D;;GAEG;AACH,wBAAgB,UAAU,IAAI,SAAS,CAUtC;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,IAAI,CAO7D;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,MAAM,GAAG,SAAS,CAMlD;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAMvC;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C"}
@@ -0,0 +1,59 @@
1
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';
2
+ import { homedir } from 'os';
3
+ import { join } from 'path';
4
+ const CONFIG_DIR = join(homedir(), '.knowledgesdk');
5
+ const CONFIG_FILE = join(CONFIG_DIR, 'config.json');
6
+ export const DEFAULT_BASE_URL = 'https://api.knowledgesdk.com';
7
+ /**
8
+ * Read the stored config from disk.
9
+ */
10
+ export function readConfig() {
11
+ if (!existsSync(CONFIG_FILE)) {
12
+ return {};
13
+ }
14
+ try {
15
+ const raw = readFileSync(CONFIG_FILE, 'utf-8');
16
+ return JSON.parse(raw);
17
+ }
18
+ catch {
19
+ return {};
20
+ }
21
+ }
22
+ /**
23
+ * Write updated config to disk, merging with existing values.
24
+ */
25
+ export function writeConfig(updates) {
26
+ if (!existsSync(CONFIG_DIR)) {
27
+ mkdirSync(CONFIG_DIR, { recursive: true });
28
+ }
29
+ const current = readConfig();
30
+ const merged = { ...current, ...updates };
31
+ writeFileSync(CONFIG_FILE, JSON.stringify(merged, null, 2), 'utf-8');
32
+ }
33
+ /**
34
+ * Resolve the API key from env var or config file.
35
+ */
36
+ export function resolveApiKey() {
37
+ if (process.env['KNOWLEDGESDK_API_KEY']) {
38
+ return process.env['KNOWLEDGESDK_API_KEY'];
39
+ }
40
+ const config = readConfig();
41
+ return config.apiKey;
42
+ }
43
+ /**
44
+ * Resolve the base URL from env var or config file, with fallback.
45
+ */
46
+ export function resolveBaseUrl() {
47
+ if (process.env['KNOWLEDGESDK_BASE_URL']) {
48
+ return process.env['KNOWLEDGESDK_BASE_URL'];
49
+ }
50
+ const config = readConfig();
51
+ return config.baseUrl ?? DEFAULT_BASE_URL;
52
+ }
53
+ /**
54
+ * Returns the path to the config file for display purposes.
55
+ */
56
+ export function getConfigFilePath() {
57
+ return CONFIG_FILE;
58
+ }
59
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AACxE,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAG5B,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,eAAe,CAAC,CAAC;AACpD,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AAEpD,MAAM,CAAC,MAAM,gBAAgB,GAAG,8BAA8B,CAAC;AAE/D;;GAEG;AACH,MAAM,UAAU,UAAU;IACxB,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC7B,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QAC/C,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAc,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,OAA2B;IACrD,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7C,CAAC;IACD,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,MAAM,MAAM,GAAG,EAAE,GAAG,OAAO,EAAE,GAAG,OAAO,EAAE,CAAC;IAC1C,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AACvE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa;IAC3B,IAAI,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,EAAE,CAAC;QACxC,OAAO,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;IAC7C,CAAC;IACD,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,OAAO,MAAM,CAAC,MAAM,CAAC;AACvB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc;IAC5B,IAAI,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,EAAE,CAAC;QACzC,OAAO,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;IAC9C,CAAC;IACD,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,OAAO,MAAM,CAAC,OAAO,IAAI,gBAAgB,CAAC;AAC5C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB;IAC/B,OAAO,WAAW,CAAC;AACrB,CAAC"}
@@ -0,0 +1,73 @@
1
+ export declare const theme: {
2
+ brand: import("chalk").ChalkInstance;
3
+ success: import("chalk").ChalkInstance;
4
+ error: import("chalk").ChalkInstance;
5
+ warning: import("chalk").ChalkInstance;
6
+ info: import("chalk").ChalkInstance;
7
+ muted: import("chalk").ChalkInstance;
8
+ bold: import("chalk").ChalkInstance;
9
+ url: import("chalk").ChalkInstance;
10
+ key: import("chalk").ChalkInstance;
11
+ value: import("chalk").ChalkInstance;
12
+ label: import("chalk").ChalkInstance;
13
+ dim: import("chalk").ChalkInstance;
14
+ highlight: import("chalk").ChalkInstance;
15
+ };
16
+ export declare const sym: {
17
+ check: string;
18
+ cross: string;
19
+ arrow: string;
20
+ dot: string;
21
+ info: string;
22
+ warn: string;
23
+ bullet: string;
24
+ };
25
+ /**
26
+ * Print a formatted key/value pair.
27
+ */
28
+ export declare function printField(label: string, value: string | number | boolean | undefined | null): void;
29
+ /**
30
+ * Print a section header.
31
+ */
32
+ export declare function printHeader(title: string): void;
33
+ /**
34
+ * Print a success message.
35
+ */
36
+ export declare function printSuccess(message: string): void;
37
+ /**
38
+ * Print an error message and exit.
39
+ */
40
+ export declare function printError(message: string, hint?: string): void;
41
+ /**
42
+ * Print a warning.
43
+ */
44
+ export declare function printWarning(message: string): void;
45
+ /**
46
+ * Print info.
47
+ */
48
+ export declare function printInfo(message: string): void;
49
+ /**
50
+ * Output raw JSON (for --json flag).
51
+ */
52
+ export declare function printJson(data: unknown): void;
53
+ /**
54
+ * Save output to a file.
55
+ */
56
+ export declare function saveToFile(filePath: string, content: string | Buffer): void;
57
+ /**
58
+ * Format a job status with appropriate color.
59
+ */
60
+ export declare function colorizeStatus(status: string): string;
61
+ /**
62
+ * Format a confidence value (0-1) as a percentage with color.
63
+ */
64
+ export declare function colorizeConfidence(confidence: number): string;
65
+ /**
66
+ * Print a banner line.
67
+ */
68
+ export declare function printBanner(): void;
69
+ /**
70
+ * Handle an error from an API call and exit.
71
+ */
72
+ export declare function handleApiError(err: unknown): never;
73
+ //# sourceMappingURL=output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/lib/output.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,KAAK;;;;;;;;;;;;;;CAcjB,CAAC;AAIF,eAAO,MAAM,GAAG;;;;;;;;CAQf,CAAC;AAIF;;GAEG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,GAAG,IAAI,GAAG,IAAI,CAGnG;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAI/C;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAElD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAK/D;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAElD;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE/C;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAE7C;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAG3E;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAarD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAK7D;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,IAAI,CAMlC;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,GAAG,KAAK,CAyBlD"}
@@ -0,0 +1,149 @@
1
+ import chalk from 'chalk';
2
+ import { writeFileSync } from 'fs';
3
+ // ─── Color theme ──────────────────────────────────────────────────────────────
4
+ export const theme = {
5
+ brand: chalk.hex('#6366f1'), // indigo
6
+ success: chalk.green,
7
+ error: chalk.red,
8
+ warning: chalk.yellow,
9
+ info: chalk.cyan,
10
+ muted: chalk.gray,
11
+ bold: chalk.bold,
12
+ url: chalk.cyan.underline,
13
+ key: chalk.magenta,
14
+ value: chalk.white,
15
+ label: chalk.bold.white,
16
+ dim: chalk.dim,
17
+ highlight: chalk.hex('#f59e0b'), // amber
18
+ };
19
+ // ─── Symbols ──────────────────────────────────────────────────────────────────
20
+ export const sym = {
21
+ check: chalk.green('✓'),
22
+ cross: chalk.red('✗'),
23
+ arrow: chalk.cyan('→'),
24
+ dot: chalk.gray('·'),
25
+ info: chalk.cyan('ℹ'),
26
+ warn: chalk.yellow('⚠'),
27
+ bullet: chalk.gray('•'),
28
+ };
29
+ // ─── Helpers ──────────────────────────────────────────────────────────────────
30
+ /**
31
+ * Print a formatted key/value pair.
32
+ */
33
+ export function printField(label, value) {
34
+ if (value === undefined || value === null)
35
+ return;
36
+ console.log(` ${theme.label(label.padEnd(18))} ${theme.value(String(value))}`);
37
+ }
38
+ /**
39
+ * Print a section header.
40
+ */
41
+ export function printHeader(title) {
42
+ console.log('');
43
+ console.log(theme.brand.bold(` ${title}`));
44
+ console.log(theme.muted(' ' + '─'.repeat(Math.max(title.length, 40))));
45
+ }
46
+ /**
47
+ * Print a success message.
48
+ */
49
+ export function printSuccess(message) {
50
+ console.log(`\n ${sym.check} ${theme.success(message)}`);
51
+ }
52
+ /**
53
+ * Print an error message and exit.
54
+ */
55
+ export function printError(message, hint) {
56
+ console.error(`\n ${sym.cross} ${theme.error(message)}`);
57
+ if (hint) {
58
+ console.error(` ${sym.info} ${theme.muted(hint)}`);
59
+ }
60
+ }
61
+ /**
62
+ * Print a warning.
63
+ */
64
+ export function printWarning(message) {
65
+ console.warn(` ${sym.warn} ${theme.warning(message)}`);
66
+ }
67
+ /**
68
+ * Print info.
69
+ */
70
+ export function printInfo(message) {
71
+ console.log(` ${sym.info} ${theme.info(message)}`);
72
+ }
73
+ /**
74
+ * Output raw JSON (for --json flag).
75
+ */
76
+ export function printJson(data) {
77
+ console.log(JSON.stringify(data, null, 2));
78
+ }
79
+ /**
80
+ * Save output to a file.
81
+ */
82
+ export function saveToFile(filePath, content) {
83
+ writeFileSync(filePath, content);
84
+ printSuccess(`Saved to ${theme.url(filePath)}`);
85
+ }
86
+ /**
87
+ * Format a job status with appropriate color.
88
+ */
89
+ export function colorizeStatus(status) {
90
+ switch (status.toUpperCase()) {
91
+ case 'COMPLETED':
92
+ return theme.success(status);
93
+ case 'RUNNING':
94
+ case 'PENDING':
95
+ return theme.info(status);
96
+ case 'FAILED':
97
+ case 'CANCELLED':
98
+ return theme.error(status);
99
+ default:
100
+ return theme.muted(status);
101
+ }
102
+ }
103
+ /**
104
+ * Format a confidence value (0-1) as a percentage with color.
105
+ */
106
+ export function colorizeConfidence(confidence) {
107
+ const pct = Math.round(confidence * 100);
108
+ if (pct >= 80)
109
+ return theme.success(`${pct}%`);
110
+ if (pct >= 50)
111
+ return theme.warning(`${pct}%`);
112
+ return theme.error(`${pct}%`);
113
+ }
114
+ /**
115
+ * Print a banner line.
116
+ */
117
+ export function printBanner() {
118
+ console.log('');
119
+ console.log(theme.brand.bold(' KnowledgeSDK') + theme.muted(' CLI v0.1.0'));
120
+ console.log('');
121
+ }
122
+ /**
123
+ * Handle an error from an API call and exit.
124
+ */
125
+ export function handleApiError(err) {
126
+ if (err instanceof Error &&
127
+ err.name === 'ApiError') {
128
+ const apiErr = err;
129
+ printError(err.message);
130
+ if (apiErr.statusCode === 0) {
131
+ // No API key
132
+ printInfo('Run: knowledgesdk config --key <your-api-key>');
133
+ printInfo('Or set: export KNOWLEDGESDK_API_KEY=<your-api-key>');
134
+ }
135
+ }
136
+ else if (err instanceof Error) {
137
+ if (err.message.includes('fetch')) {
138
+ printError('Network error — could not connect to KnowledgeSDK API.', 'Check your internet connection or KNOWLEDGESDK_BASE_URL.');
139
+ }
140
+ else {
141
+ printError(err.message);
142
+ }
143
+ }
144
+ else {
145
+ printError('An unexpected error occurred.');
146
+ }
147
+ process.exit(1);
148
+ }
149
+ //# sourceMappingURL=output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/lib/output.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AAEnC,iFAAiF;AAEjF,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,EAAQ,SAAS;IAC5C,OAAO,EAAE,KAAK,CAAC,KAAK;IACpB,KAAK,EAAE,KAAK,CAAC,GAAG;IAChB,OAAO,EAAE,KAAK,CAAC,MAAM;IACrB,IAAI,EAAE,KAAK,CAAC,IAAI;IAChB,KAAK,EAAE,KAAK,CAAC,IAAI;IACjB,IAAI,EAAE,KAAK,CAAC,IAAI;IAChB,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,SAAS;IACzB,GAAG,EAAE,KAAK,CAAC,OAAO;IAClB,KAAK,EAAE,KAAK,CAAC,KAAK;IAClB,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK;IACvB,GAAG,EAAE,KAAK,CAAC,GAAG;IACd,SAAS,EAAE,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,EAAI,QAAQ;CAC5C,CAAC;AAEF,iFAAiF;AAEjF,MAAM,CAAC,MAAM,GAAG,GAAG;IACjB,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC;IACvB,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;IACrB,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC;IACtB,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC;IACpB,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC;IACrB,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC;IACvB,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC;CACxB,CAAC;AAEF,iFAAiF;AAEjF;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,KAAa,EAAE,KAAmD;IAC3F,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO;IAClD,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;AAClF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC;IAC5C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1E,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,OAAe;IAC1C,OAAO,CAAC,GAAG,CAAC,OAAO,GAAG,CAAC,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;AAC5D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,OAAe,EAAE,IAAa;IACvD,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC1D,IAAI,IAAI,EAAE,CAAC;QACT,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACtD,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,OAAe;IAC1C,OAAO,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;AAC1D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,OAAe;IACvC,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;AACtD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,IAAa;IACrC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,QAAgB,EAAE,OAAwB;IACnE,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACjC,YAAY,CAAC,YAAY,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;AAClD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,MAAc;IAC3C,QAAQ,MAAM,CAAC,WAAW,EAAE,EAAE,CAAC;QAC7B,KAAK,WAAW;YACd,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC/B,KAAK,SAAS,CAAC;QACf,KAAK,SAAS;YACZ,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC5B,KAAK,QAAQ,CAAC;QACd,KAAK,WAAW;YACd,OAAO,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC7B;YACE,OAAO,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC/B,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,UAAkB;IACnD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,GAAG,CAAC,CAAC;IACzC,IAAI,GAAG,IAAI,EAAE;QAAE,OAAO,KAAK,CAAC,OAAO,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;IAC/C,IAAI,GAAG,IAAI,EAAE;QAAE,OAAO,KAAK,CAAC,OAAO,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;IAC/C,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;AAChC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW;IACzB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,CAChE,CAAC;IACF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,GAAY;IACzC,IACE,GAAG,YAAY,KAAK;QACpB,GAAG,CAAC,IAAI,KAAK,UAAU,EACvB,CAAC;QACD,MAAM,MAAM,GAAG,GAAsC,CAAC;QACtD,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACxB,IAAI,MAAM,CAAC,UAAU,KAAK,CAAC,EAAE,CAAC;YAC5B,aAAa;YACb,SAAS,CAAC,+CAA+C,CAAC,CAAC;YAC3D,SAAS,CAAC,oDAAoD,CAAC,CAAC;QAClE,CAAC;IACH,CAAC;SAAM,IAAI,GAAG,YAAY,KAAK,EAAE,CAAC;QAChC,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YAClC,UAAU,CACR,wDAAwD,EACxD,0DAA0D,CAC3D,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;SAAM,CAAC;QACN,UAAU,CAAC,+BAA+B,CAAC,CAAC;IAC9C,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC"}