@okrapdf/cli 0.1.0 → 0.1.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.
Files changed (115) hide show
  1. package/README.md +163 -0
  2. package/dist/cli.d.ts +19 -0
  3. package/dist/cli.d.ts.map +1 -0
  4. package/dist/cli.js +175 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/commands/auth.d.ts +6 -0
  7. package/dist/commands/auth.d.ts.map +1 -0
  8. package/dist/commands/auth.js +154 -0
  9. package/dist/commands/auth.js.map +1 -0
  10. package/dist/commands/chat.d.ts +6 -0
  11. package/dist/commands/chat.d.ts.map +1 -0
  12. package/dist/commands/chat.js +218 -0
  13. package/dist/commands/chat.js.map +1 -0
  14. package/dist/commands/docs.d.ts +6 -0
  15. package/dist/commands/docs.d.ts.map +1 -0
  16. package/dist/commands/docs.js +181 -0
  17. package/dist/commands/docs.js.map +1 -0
  18. package/dist/commands/jobs.d.ts +6 -0
  19. package/dist/commands/jobs.d.ts.map +1 -0
  20. package/dist/commands/jobs.js +348 -0
  21. package/dist/commands/jobs.js.map +1 -0
  22. package/dist/commands/jobs.test.d.ts +5 -0
  23. package/dist/commands/jobs.test.d.ts.map +1 -0
  24. package/dist/commands/jobs.test.js +118 -0
  25. package/dist/commands/jobs.test.js.map +1 -0
  26. package/dist/commands/logs.d.ts +8 -0
  27. package/dist/commands/logs.d.ts.map +1 -0
  28. package/dist/commands/logs.js +186 -0
  29. package/dist/commands/logs.js.map +1 -0
  30. package/dist/commands/processors.d.ts +8 -0
  31. package/dist/commands/processors.d.ts.map +1 -0
  32. package/dist/commands/processors.js +91 -0
  33. package/dist/commands/processors.js.map +1 -0
  34. package/dist/commands/review.d.ts +3 -0
  35. package/dist/commands/review.d.ts.map +1 -0
  36. package/dist/commands/review.js +370 -0
  37. package/dist/commands/review.js.map +1 -0
  38. package/dist/commands/shortcuts.d.ts +20 -0
  39. package/dist/commands/shortcuts.d.ts.map +1 -0
  40. package/dist/commands/shortcuts.js +405 -0
  41. package/dist/commands/shortcuts.js.map +1 -0
  42. package/dist/commands/tables.d.ts +6 -0
  43. package/dist/commands/tables.d.ts.map +1 -0
  44. package/dist/commands/tables.js +189 -0
  45. package/dist/commands/tables.js.map +1 -0
  46. package/dist/commands/templates.d.ts +8 -0
  47. package/dist/commands/templates.d.ts.map +1 -0
  48. package/dist/commands/templates.js +202 -0
  49. package/dist/commands/templates.js.map +1 -0
  50. package/dist/index.d.ts +14 -412
  51. package/dist/index.d.ts.map +1 -0
  52. package/dist/index.js +23 -46
  53. package/dist/index.js.map +1 -1
  54. package/dist/lib/browser.d.ts +11 -0
  55. package/dist/lib/browser.d.ts.map +1 -0
  56. package/dist/lib/browser.js +33 -0
  57. package/dist/lib/browser.js.map +1 -0
  58. package/dist/lib/client.d.ts +57 -0
  59. package/dist/lib/client.d.ts.map +1 -0
  60. package/dist/lib/client.js +176 -0
  61. package/dist/lib/client.js.map +1 -0
  62. package/dist/lib/config.d.ts +56 -0
  63. package/dist/lib/config.d.ts.map +1 -0
  64. package/dist/lib/config.js +110 -0
  65. package/dist/lib/config.js.map +1 -0
  66. package/dist/lib/config.test.d.ts +5 -0
  67. package/dist/lib/config.test.d.ts.map +1 -0
  68. package/dist/lib/config.test.js +81 -0
  69. package/dist/lib/config.test.js.map +1 -0
  70. package/dist/lib/logs.d.ts +89 -0
  71. package/dist/lib/logs.d.ts.map +1 -0
  72. package/dist/lib/logs.js +196 -0
  73. package/dist/lib/logs.js.map +1 -0
  74. package/dist/lib/logs.test.d.ts +5 -0
  75. package/dist/lib/logs.test.d.ts.map +1 -0
  76. package/dist/lib/logs.test.js +183 -0
  77. package/dist/lib/logs.test.js.map +1 -0
  78. package/dist/lib/output.d.ts +73 -0
  79. package/dist/lib/output.d.ts.map +1 -0
  80. package/dist/lib/output.js +204 -0
  81. package/dist/lib/output.js.map +1 -0
  82. package/dist/lib/output.test.d.ts +5 -0
  83. package/dist/lib/output.test.d.ts.map +1 -0
  84. package/dist/lib/output.test.js +174 -0
  85. package/dist/lib/output.test.js.map +1 -0
  86. package/dist/lib/processors.d.ts +73 -0
  87. package/dist/lib/processors.d.ts.map +1 -0
  88. package/dist/lib/processors.js +94 -0
  89. package/dist/lib/processors.js.map +1 -0
  90. package/dist/lib/processors.test.d.ts +5 -0
  91. package/dist/lib/processors.test.d.ts.map +1 -0
  92. package/dist/lib/processors.test.js +83 -0
  93. package/dist/lib/processors.test.js.map +1 -0
  94. package/dist/lib/progress.d.ts +44 -0
  95. package/dist/lib/progress.d.ts.map +1 -0
  96. package/dist/lib/progress.js +102 -0
  97. package/dist/lib/progress.js.map +1 -0
  98. package/dist/lib/templates.d.ts +56 -0
  99. package/dist/lib/templates.d.ts.map +1 -0
  100. package/dist/lib/templates.js +204 -0
  101. package/dist/lib/templates.js.map +1 -0
  102. package/dist/lib/templates.test.d.ts +5 -0
  103. package/dist/lib/templates.test.d.ts.map +1 -0
  104. package/dist/lib/templates.test.js +101 -0
  105. package/dist/lib/templates.test.js.map +1 -0
  106. package/dist/types.d.ts +144 -0
  107. package/dist/types.d.ts.map +1 -0
  108. package/dist/types.js +5 -0
  109. package/dist/types.js.map +1 -0
  110. package/package.json +56 -25
  111. package/dist/bin.d.ts +0 -1
  112. package/dist/bin.js +0 -152
  113. package/dist/bin.js.map +0 -1
  114. package/dist/chunk-A6YTW4WL.js +0 -499
  115. package/dist/chunk-A6YTW4WL.js.map +0 -1
@@ -0,0 +1,89 @@
1
+ /**
2
+ * Local SQLite Logging
3
+ *
4
+ * Stores job history, results cache, and usage metrics locally.
5
+ * Inspired by Simon Willison's llm logging system.
6
+ */
7
+ export interface JobLogEntry {
8
+ id: string;
9
+ job_id: string;
10
+ document_uuid?: string;
11
+ file_name?: string;
12
+ processor: string;
13
+ template?: string;
14
+ status: string;
15
+ pages?: number;
16
+ tables_count?: number;
17
+ started_at: string;
18
+ completed_at?: string;
19
+ duration_ms?: number;
20
+ error?: string;
21
+ result_summary?: string;
22
+ }
23
+ export interface ChatLogEntry {
24
+ id: string;
25
+ document_uuid: string;
26
+ message: string;
27
+ response: string;
28
+ model?: string;
29
+ timestamp: string;
30
+ duration_ms?: number;
31
+ tokens_used?: number;
32
+ }
33
+ /**
34
+ * Get the logs directory path
35
+ */
36
+ export declare function getLogsDir(): string;
37
+ /**
38
+ * Log a job
39
+ */
40
+ export declare function logJob(entry: Omit<JobLogEntry, 'id'>): JobLogEntry;
41
+ /**
42
+ * Update a job log entry
43
+ */
44
+ export declare function updateJobLog(id: string, updates: Partial<JobLogEntry>): void;
45
+ /**
46
+ * Log a chat message
47
+ */
48
+ export declare function logChat(entry: Omit<ChatLogEntry, 'id'>): ChatLogEntry;
49
+ /**
50
+ * Get recent job logs
51
+ */
52
+ export declare function getJobLogs(options?: {
53
+ limit?: number;
54
+ status?: string;
55
+ processor?: string;
56
+ search?: string;
57
+ }): JobLogEntry[];
58
+ /**
59
+ * Get recent chat logs
60
+ */
61
+ export declare function getChatLogs(options?: {
62
+ limit?: number;
63
+ documentUuid?: string;
64
+ search?: string;
65
+ }): ChatLogEntry[];
66
+ /**
67
+ * Get job stats
68
+ */
69
+ export declare function getJobStats(): {
70
+ total: number;
71
+ completed: number;
72
+ failed: number;
73
+ byProcessor: Record<string, number>;
74
+ totalPages: number;
75
+ avgDuration: number;
76
+ };
77
+ /**
78
+ * Clear all logs
79
+ */
80
+ export declare function clearLogs(type?: 'jobs' | 'chats'): void;
81
+ /**
82
+ * Export logs to JSON
83
+ */
84
+ export declare function exportLogs(): string;
85
+ /**
86
+ * Format job log for display
87
+ */
88
+ export declare function formatJobLog(entry: JobLogEntry): string;
89
+ //# sourceMappingURL=logs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logs.d.ts","sourceRoot":"","sources":["../../src/lib/logs.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAWD;;GAEG;AACH,wBAAgB,UAAU,IAAI,MAAM,CAMnC;AAwCD;;GAEG;AACH,wBAAgB,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,GAAG,WAAW,CAelE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,IAAI,CAO5E;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,GAAG,YAAY,CAerE;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,OAAO,GAAE;IAClC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACZ,GAAG,WAAW,EAAE,CAsBrB;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,GAAE;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;CACZ,GAAG,YAAY,EAAE,CAiBtB;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB,CA0BA;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI,CASvD;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,MAAM,CAGnC;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CAQvD"}
@@ -0,0 +1,196 @@
1
+ /**
2
+ * Local SQLite Logging
3
+ *
4
+ * Stores job history, results cache, and usage metrics locally.
5
+ * Inspired by Simon Willison's llm logging system.
6
+ */
7
+ import { existsSync, mkdirSync, writeFileSync, readFileSync } from 'fs';
8
+ import { join } from 'path';
9
+ import { homedir } from 'os';
10
+ const LOG_VERSION = 1;
11
+ /**
12
+ * Get the logs directory path
13
+ */
14
+ export function getLogsDir() {
15
+ const dir = join(homedir(), '.okrapdf', 'logs');
16
+ if (!existsSync(dir)) {
17
+ mkdirSync(dir, { recursive: true });
18
+ }
19
+ return dir;
20
+ }
21
+ /**
22
+ * Get the log file path
23
+ */
24
+ function getLogPath() {
25
+ return join(getLogsDir(), 'history.json');
26
+ }
27
+ /**
28
+ * Load the log store
29
+ */
30
+ function loadStore() {
31
+ const path = getLogPath();
32
+ if (existsSync(path)) {
33
+ try {
34
+ const content = readFileSync(path, 'utf-8');
35
+ return JSON.parse(content);
36
+ }
37
+ catch {
38
+ // Return empty store on error
39
+ }
40
+ }
41
+ return { jobs: [], chats: [], version: LOG_VERSION };
42
+ }
43
+ /**
44
+ * Save the log store
45
+ */
46
+ function saveStore(store) {
47
+ const path = getLogPath();
48
+ writeFileSync(path, JSON.stringify(store, null, 2), 'utf-8');
49
+ }
50
+ /**
51
+ * Generate a unique log ID
52
+ */
53
+ function generateId() {
54
+ return `${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
55
+ }
56
+ /**
57
+ * Log a job
58
+ */
59
+ export function logJob(entry) {
60
+ const store = loadStore();
61
+ const logEntry = {
62
+ id: generateId(),
63
+ ...entry,
64
+ };
65
+ store.jobs.unshift(logEntry); // Most recent first
66
+ // Keep only last 1000 entries
67
+ if (store.jobs.length > 1000) {
68
+ store.jobs = store.jobs.slice(0, 1000);
69
+ }
70
+ saveStore(store);
71
+ return logEntry;
72
+ }
73
+ /**
74
+ * Update a job log entry
75
+ */
76
+ export function updateJobLog(id, updates) {
77
+ const store = loadStore();
78
+ const index = store.jobs.findIndex(j => j.id === id);
79
+ if (index >= 0) {
80
+ store.jobs[index] = { ...store.jobs[index], ...updates };
81
+ saveStore(store);
82
+ }
83
+ }
84
+ /**
85
+ * Log a chat message
86
+ */
87
+ export function logChat(entry) {
88
+ const store = loadStore();
89
+ const logEntry = {
90
+ id: generateId(),
91
+ ...entry,
92
+ };
93
+ store.chats.unshift(logEntry);
94
+ // Keep only last 500 chat entries
95
+ if (store.chats.length > 500) {
96
+ store.chats = store.chats.slice(0, 500);
97
+ }
98
+ saveStore(store);
99
+ return logEntry;
100
+ }
101
+ /**
102
+ * Get recent job logs
103
+ */
104
+ export function getJobLogs(options = {}) {
105
+ const store = loadStore();
106
+ let jobs = store.jobs;
107
+ if (options.status) {
108
+ jobs = jobs.filter(j => j.status === options.status);
109
+ }
110
+ if (options.processor) {
111
+ jobs = jobs.filter(j => j.processor === options.processor);
112
+ }
113
+ if (options.search) {
114
+ const search = options.search.toLowerCase();
115
+ jobs = jobs.filter(j => j.file_name?.toLowerCase().includes(search) ||
116
+ j.job_id.toLowerCase().includes(search) ||
117
+ j.document_uuid?.toLowerCase().includes(search));
118
+ }
119
+ return jobs.slice(0, options.limit || 50);
120
+ }
121
+ /**
122
+ * Get recent chat logs
123
+ */
124
+ export function getChatLogs(options = {}) {
125
+ const store = loadStore();
126
+ let chats = store.chats;
127
+ if (options.documentUuid) {
128
+ chats = chats.filter(c => c.document_uuid === options.documentUuid);
129
+ }
130
+ if (options.search) {
131
+ const search = options.search.toLowerCase();
132
+ chats = chats.filter(c => c.message.toLowerCase().includes(search) ||
133
+ c.response.toLowerCase().includes(search));
134
+ }
135
+ return chats.slice(0, options.limit || 50);
136
+ }
137
+ /**
138
+ * Get job stats
139
+ */
140
+ export function getJobStats() {
141
+ const store = loadStore();
142
+ const jobs = store.jobs;
143
+ const byProcessor = {};
144
+ let totalPages = 0;
145
+ let totalDuration = 0;
146
+ let durationCount = 0;
147
+ for (const job of jobs) {
148
+ byProcessor[job.processor] = (byProcessor[job.processor] || 0) + 1;
149
+ if (job.pages)
150
+ totalPages += job.pages;
151
+ if (job.duration_ms) {
152
+ totalDuration += job.duration_ms;
153
+ durationCount++;
154
+ }
155
+ }
156
+ return {
157
+ total: jobs.length,
158
+ completed: jobs.filter(j => j.status === 'completed').length,
159
+ failed: jobs.filter(j => j.status === 'failed').length,
160
+ byProcessor,
161
+ totalPages,
162
+ avgDuration: durationCount > 0 ? Math.round(totalDuration / durationCount) : 0,
163
+ };
164
+ }
165
+ /**
166
+ * Clear all logs
167
+ */
168
+ export function clearLogs(type) {
169
+ const store = loadStore();
170
+ if (!type || type === 'jobs') {
171
+ store.jobs = [];
172
+ }
173
+ if (!type || type === 'chats') {
174
+ store.chats = [];
175
+ }
176
+ saveStore(store);
177
+ }
178
+ /**
179
+ * Export logs to JSON
180
+ */
181
+ export function exportLogs() {
182
+ const store = loadStore();
183
+ return JSON.stringify(store, null, 2);
184
+ }
185
+ /**
186
+ * Format job log for display
187
+ */
188
+ export function formatJobLog(entry) {
189
+ const duration = entry.duration_ms
190
+ ? `${(entry.duration_ms / 1000).toFixed(1)}s`
191
+ : '-';
192
+ return [
193
+ `${entry.started_at.slice(0, 19)} | ${entry.status.padEnd(10)} | ${entry.processor.padEnd(10)} | ${duration.padStart(6)} | ${entry.file_name || entry.job_id}`,
194
+ ].join('');
195
+ }
196
+ //# sourceMappingURL=logs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logs.js","sourceRoot":"","sources":["../../src/lib/logs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Tests for local logging
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=logs.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logs.test.d.ts","sourceRoot":"","sources":["../../src/lib/logs.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,183 @@
1
+ /**
2
+ * Tests for local logging
3
+ */
4
+ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
5
+ import { mkdirSync, rmSync, existsSync } from 'fs';
6
+ import { join } from 'path';
7
+ import { tmpdir } from 'os';
8
+ // Store original HOME
9
+ const originalHome = process.env.HOME;
10
+ describe('logs', () => {
11
+ let testDir;
12
+ beforeEach(() => {
13
+ // Create temp directory for tests
14
+ testDir = join(tmpdir(), `okrapdf-test-${Date.now()}`);
15
+ mkdirSync(testDir, { recursive: true });
16
+ // Point HOME to temp dir so config goes there
17
+ process.env.HOME = testDir;
18
+ // Reset module cache
19
+ vi.resetModules();
20
+ });
21
+ afterEach(() => {
22
+ // Restore HOME
23
+ process.env.HOME = originalHome;
24
+ // Clean up temp directory
25
+ if (existsSync(testDir)) {
26
+ rmSync(testDir, { recursive: true, force: true });
27
+ }
28
+ });
29
+ describe('logJob', () => {
30
+ it('should log a job and return entry with id', async () => {
31
+ const { logJob } = await import('./logs.js');
32
+ const entry = logJob({
33
+ job_id: 'test-job-123',
34
+ file_name: 'test.pdf',
35
+ processor: 'docai',
36
+ status: 'running',
37
+ started_at: new Date().toISOString(),
38
+ });
39
+ expect(entry.id).toBeTruthy();
40
+ expect(entry.job_id).toBe('test-job-123');
41
+ expect(entry.file_name).toBe('test.pdf');
42
+ expect(entry.processor).toBe('docai');
43
+ expect(entry.status).toBe('running');
44
+ });
45
+ it('should persist logs', async () => {
46
+ const { logJob, getJobLogs } = await import('./logs.js');
47
+ logJob({
48
+ job_id: 'job-1',
49
+ processor: 'docai',
50
+ status: 'completed',
51
+ started_at: new Date().toISOString(),
52
+ });
53
+ logJob({
54
+ job_id: 'job-2',
55
+ processor: 'gemini',
56
+ status: 'running',
57
+ started_at: new Date().toISOString(),
58
+ });
59
+ const logs = getJobLogs();
60
+ expect(logs.length).toBe(2);
61
+ });
62
+ });
63
+ describe('updateJobLog', () => {
64
+ it('should update existing log entry', async () => {
65
+ const { logJob, updateJobLog, getJobLogs } = await import('./logs.js');
66
+ const entry = logJob({
67
+ job_id: 'update-test',
68
+ processor: 'docai',
69
+ status: 'running',
70
+ started_at: new Date().toISOString(),
71
+ });
72
+ updateJobLog(entry.id, {
73
+ status: 'completed',
74
+ completed_at: new Date().toISOString(),
75
+ duration_ms: 5000,
76
+ });
77
+ const logs = getJobLogs();
78
+ const updated = logs.find(l => l.id === entry.id);
79
+ expect(updated?.status).toBe('completed');
80
+ expect(updated?.duration_ms).toBe(5000);
81
+ });
82
+ });
83
+ describe('getJobLogs', () => {
84
+ it('should return logs in reverse chronological order', async () => {
85
+ const { logJob, getJobLogs } = await import('./logs.js');
86
+ logJob({
87
+ job_id: 'first',
88
+ processor: 'docai',
89
+ status: 'completed',
90
+ started_at: '2024-01-01T00:00:00Z',
91
+ });
92
+ logJob({
93
+ job_id: 'second',
94
+ processor: 'docai',
95
+ status: 'completed',
96
+ started_at: '2024-01-02T00:00:00Z',
97
+ });
98
+ const logs = getJobLogs();
99
+ expect(logs[0].job_id).toBe('second'); // Most recent first
100
+ expect(logs[1].job_id).toBe('first');
101
+ });
102
+ it('should filter by status', async () => {
103
+ const { logJob, getJobLogs } = await import('./logs.js');
104
+ logJob({ job_id: '1', processor: 'docai', status: 'completed', started_at: new Date().toISOString() });
105
+ logJob({ job_id: '2', processor: 'docai', status: 'failed', started_at: new Date().toISOString() });
106
+ logJob({ job_id: '3', processor: 'docai', status: 'completed', started_at: new Date().toISOString() });
107
+ const completed = getJobLogs({ status: 'completed' });
108
+ expect(completed.length).toBe(2);
109
+ expect(completed.every(l => l.status === 'completed')).toBe(true);
110
+ });
111
+ it('should filter by processor', async () => {
112
+ const { logJob, getJobLogs } = await import('./logs.js');
113
+ logJob({ job_id: '1', processor: 'docai', status: 'completed', started_at: new Date().toISOString() });
114
+ logJob({ job_id: '2', processor: 'gemini', status: 'completed', started_at: new Date().toISOString() });
115
+ logJob({ job_id: '3', processor: 'docai', status: 'completed', started_at: new Date().toISOString() });
116
+ const docaiLogs = getJobLogs({ processor: 'docai' });
117
+ expect(docaiLogs.length).toBe(2);
118
+ expect(docaiLogs.every(l => l.processor === 'docai')).toBe(true);
119
+ });
120
+ it('should limit results', async () => {
121
+ const { logJob, getJobLogs } = await import('./logs.js');
122
+ for (let i = 0; i < 10; i++) {
123
+ logJob({ job_id: `job-${i}`, processor: 'docai', status: 'completed', started_at: new Date().toISOString() });
124
+ }
125
+ const limited = getJobLogs({ limit: 5 });
126
+ expect(limited.length).toBe(5);
127
+ });
128
+ it('should search by filename', async () => {
129
+ const { logJob, getJobLogs } = await import('./logs.js');
130
+ logJob({ job_id: '1', file_name: 'invoice.pdf', processor: 'docai', status: 'completed', started_at: new Date().toISOString() });
131
+ logJob({ job_id: '2', file_name: 'report.pdf', processor: 'docai', status: 'completed', started_at: new Date().toISOString() });
132
+ const results = getJobLogs({ search: 'invoice' });
133
+ expect(results.length).toBe(1);
134
+ expect(results[0].file_name).toBe('invoice.pdf');
135
+ });
136
+ });
137
+ describe('getJobStats', () => {
138
+ it('should return correct statistics', async () => {
139
+ const { logJob, getJobStats } = await import('./logs.js');
140
+ logJob({ job_id: '1', processor: 'docai', status: 'completed', pages: 10, duration_ms: 1000, started_at: new Date().toISOString() });
141
+ logJob({ job_id: '2', processor: 'gemini', status: 'completed', pages: 5, duration_ms: 2000, started_at: new Date().toISOString() });
142
+ logJob({ job_id: '3', processor: 'docai', status: 'failed', started_at: new Date().toISOString() });
143
+ const stats = getJobStats();
144
+ expect(stats.total).toBe(3);
145
+ expect(stats.completed).toBe(2);
146
+ expect(stats.failed).toBe(1);
147
+ expect(stats.totalPages).toBe(15);
148
+ expect(stats.avgDuration).toBe(1500);
149
+ expect(stats.byProcessor.docai).toBe(2);
150
+ expect(stats.byProcessor.gemini).toBe(1);
151
+ });
152
+ });
153
+ describe('clearLogs', () => {
154
+ it('should clear all logs', async () => {
155
+ const { logJob, getJobLogs, clearLogs } = await import('./logs.js');
156
+ logJob({ job_id: '1', processor: 'docai', status: 'completed', started_at: new Date().toISOString() });
157
+ logJob({ job_id: '2', processor: 'docai', status: 'completed', started_at: new Date().toISOString() });
158
+ expect(getJobLogs().length).toBe(2);
159
+ clearLogs();
160
+ expect(getJobLogs().length).toBe(0);
161
+ });
162
+ it('should clear only job logs when specified', async () => {
163
+ const { logJob, logChat, getJobLogs, getChatLogs, clearLogs } = await import('./logs.js');
164
+ logJob({ job_id: '1', processor: 'docai', status: 'completed', started_at: new Date().toISOString() });
165
+ logChat({ document_uuid: 'doc-1', message: 'hello', response: 'hi', timestamp: new Date().toISOString() });
166
+ clearLogs('jobs');
167
+ expect(getJobLogs().length).toBe(0);
168
+ expect(getChatLogs().length).toBe(1);
169
+ });
170
+ });
171
+ describe('exportLogs', () => {
172
+ it('should export logs as JSON', async () => {
173
+ const { logJob, exportLogs } = await import('./logs.js');
174
+ logJob({ job_id: '1', processor: 'docai', status: 'completed', started_at: new Date().toISOString() });
175
+ const exported = exportLogs();
176
+ const parsed = JSON.parse(exported);
177
+ expect(parsed.jobs).toBeDefined();
178
+ expect(parsed.chats).toBeDefined();
179
+ expect(parsed.version).toBeDefined();
180
+ });
181
+ });
182
+ });
183
+ //# sourceMappingURL=logs.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logs.test.js","sourceRoot":"","sources":["../../src/lib/logs.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * Output formatters for different output modes
3
+ */
4
+ import type { OutputFormat } from '../types.js';
5
+ type TableRow = Record<string, any>;
6
+ /**
7
+ * Format data based on the output format
8
+ */
9
+ export declare function formatOutput(data: unknown, format: OutputFormat, columns?: {
10
+ key: string;
11
+ header: string;
12
+ width?: number;
13
+ }[]): string;
14
+ /**
15
+ * Format as JSON
16
+ */
17
+ export declare function formatJson<T>(data: T): string;
18
+ /**
19
+ * Format as JSON Lines
20
+ */
21
+ export declare function formatJsonl<T>(data: T): string;
22
+ /**
23
+ * Format as CSV
24
+ */
25
+ export declare function formatCsv<T extends TableRow | TableRow[]>(data: T, columns?: {
26
+ key: string;
27
+ header: string;
28
+ }[]): string;
29
+ /**
30
+ * Format as CLI table
31
+ */
32
+ export declare function formatTable<T extends TableRow | TableRow[]>(data: T, columns?: {
33
+ key: string;
34
+ header: string;
35
+ width?: number;
36
+ }[]): string;
37
+ /**
38
+ * Format as Markdown table
39
+ */
40
+ export declare function formatMarkdown<T extends TableRow | TableRow[]>(data: T, columns?: {
41
+ key: string;
42
+ header: string;
43
+ }[]): string;
44
+ /**
45
+ * Print a success message
46
+ */
47
+ export declare function success(message: string): void;
48
+ /**
49
+ * Print an error message
50
+ */
51
+ export declare function error(message: string): void;
52
+ /**
53
+ * Print a warning message
54
+ */
55
+ export declare function warn(message: string): void;
56
+ /**
57
+ * Print an info message
58
+ */
59
+ export declare function info(message: string): void;
60
+ /**
61
+ * Format file size in human readable format
62
+ */
63
+ export declare function formatFileSize(bytes: number | null): string;
64
+ /**
65
+ * Format a date in relative or absolute format
66
+ */
67
+ export declare function formatDate(dateStr: string): string;
68
+ /**
69
+ * Format job status with color
70
+ */
71
+ export declare function formatStatus(status: string): string;
72
+ export {};
73
+ //# sourceMappingURL=output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/lib/output.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGhD,KAAK,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAEpC;;GAEG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,OAAO,EACb,MAAM,EAAE,YAAY,EACpB,OAAO,CAAC,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,GAC1D,MAAM,CAcR;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,MAAM,CAE7C;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,MAAM,CAK9C;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,CAAC,SAAS,QAAQ,GAAG,QAAQ,EAAE,EACvD,IAAI,EAAE,CAAC,EACP,OAAO,CAAC,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,EAAE,GAC1C,MAAM,CAgBR;AAYD;;GAEG;AACH,wBAAgB,WAAW,CAAC,CAAC,SAAS,QAAQ,GAAG,QAAQ,EAAE,EACzD,IAAI,EAAE,CAAC,EACP,OAAO,CAAC,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,GAC1D,MAAM,CAqBR;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,CAAC,SAAS,QAAQ,GAAG,QAAQ,EAAE,EAC5D,IAAI,EAAE,CAAC,EACP,OAAO,CAAC,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,EAAE,GAC1C,MAAM,CAiBR;AAgCD;;GAEG;AACH,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE7C;AAED;;GAEG;AACH,wBAAgB,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE3C;AAED;;GAEG;AACH,wBAAgB,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE1C;AAED;;GAEG;AACH,wBAAgB,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE1C;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAa3D;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAoBlD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAenD"}