@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,204 @@
1
+ /**
2
+ * Output formatters for different output modes
3
+ */
4
+ import Table from 'cli-table3';
5
+ import chalk from 'chalk';
6
+ /**
7
+ * Format data based on the output format
8
+ */
9
+ export function formatOutput(data, format, columns) {
10
+ switch (format) {
11
+ case 'json':
12
+ return formatJson(data);
13
+ case 'jsonl':
14
+ return formatJsonl(data);
15
+ case 'csv':
16
+ return formatCsv(data, columns);
17
+ case 'markdown':
18
+ return formatMarkdown(data, columns);
19
+ case 'table':
20
+ default:
21
+ return formatTable(data, columns);
22
+ }
23
+ }
24
+ /**
25
+ * Format as JSON
26
+ */
27
+ export function formatJson(data) {
28
+ return JSON.stringify(data, null, 2);
29
+ }
30
+ /**
31
+ * Format as JSON Lines
32
+ */
33
+ export function formatJsonl(data) {
34
+ if (Array.isArray(data)) {
35
+ return data.map(item => JSON.stringify(item)).join('\n');
36
+ }
37
+ return JSON.stringify(data);
38
+ }
39
+ /**
40
+ * Format as CSV
41
+ */
42
+ export function formatCsv(data, columns) {
43
+ const items = Array.isArray(data) ? data : [data];
44
+ if (items.length === 0)
45
+ return '';
46
+ // Determine columns from first item if not provided
47
+ const cols = columns || Object.keys(items[0]).map(key => ({ key, header: key }));
48
+ // Header row
49
+ const header = cols.map(c => escapeCsvField(c.header)).join(',');
50
+ // Data rows
51
+ const rows = items.map(item => cols.map(c => escapeCsvField(String(item[c.key] ?? ''))).join(','));
52
+ return [header, ...rows].join('\n');
53
+ }
54
+ /**
55
+ * Escape a CSV field
56
+ */
57
+ function escapeCsvField(field) {
58
+ if (field.includes(',') || field.includes('"') || field.includes('\n')) {
59
+ return `"${field.replace(/"/g, '""')}"`;
60
+ }
61
+ return field;
62
+ }
63
+ /**
64
+ * Format as CLI table
65
+ */
66
+ export function formatTable(data, columns) {
67
+ const items = Array.isArray(data) ? data : [data];
68
+ if (items.length === 0)
69
+ return chalk.dim('No results');
70
+ // Determine columns from first item if not provided
71
+ const cols = columns || Object.keys(items[0]).map(key => ({ key, header: key, width: undefined }));
72
+ const table = new Table({
73
+ head: cols.map(c => chalk.bold(c.header)),
74
+ colWidths: cols.map(c => c.width ?? null),
75
+ style: {
76
+ head: ['cyan'],
77
+ border: ['gray'],
78
+ },
79
+ });
80
+ for (const item of items) {
81
+ table.push(cols.map(c => formatValue(item[c.key])));
82
+ }
83
+ return table.toString();
84
+ }
85
+ /**
86
+ * Format as Markdown table
87
+ */
88
+ export function formatMarkdown(data, columns) {
89
+ const items = Array.isArray(data) ? data : [data];
90
+ if (items.length === 0)
91
+ return '_No results_';
92
+ // Determine columns from first item if not provided
93
+ const cols = columns || Object.keys(items[0]).map(key => ({ key, header: key }));
94
+ // Header row
95
+ const header = `| ${cols.map(c => c.header).join(' | ')} |`;
96
+ const separator = `| ${cols.map(() => '---').join(' | ')} |`;
97
+ // Data rows
98
+ const rows = items.map(item => `| ${cols.map(c => escapeMarkdown(String(item[c.key] ?? ''))).join(' | ')} |`);
99
+ return [header, separator, ...rows].join('\n');
100
+ }
101
+ /**
102
+ * Escape markdown special characters
103
+ */
104
+ function escapeMarkdown(text) {
105
+ return text.replace(/\|/g, '\\|').replace(/\n/g, ' ');
106
+ }
107
+ /**
108
+ * Format a single value for table display
109
+ */
110
+ function formatValue(value) {
111
+ if (value === null || value === undefined) {
112
+ return chalk.dim('-');
113
+ }
114
+ if (typeof value === 'boolean') {
115
+ return value ? chalk.green('Yes') : chalk.red('No');
116
+ }
117
+ if (value instanceof Date) {
118
+ return value.toISOString();
119
+ }
120
+ if (typeof value === 'object') {
121
+ return JSON.stringify(value);
122
+ }
123
+ return String(value);
124
+ }
125
+ /**
126
+ * Print a success message
127
+ */
128
+ export function success(message) {
129
+ console.log(chalk.green('✓'), message);
130
+ }
131
+ /**
132
+ * Print an error message
133
+ */
134
+ export function error(message) {
135
+ console.error(chalk.red('✗'), message);
136
+ }
137
+ /**
138
+ * Print a warning message
139
+ */
140
+ export function warn(message) {
141
+ console.warn(chalk.yellow('!'), message);
142
+ }
143
+ /**
144
+ * Print an info message
145
+ */
146
+ export function info(message) {
147
+ console.log(chalk.blue('ℹ'), message);
148
+ }
149
+ /**
150
+ * Format file size in human readable format
151
+ */
152
+ export function formatFileSize(bytes) {
153
+ if (bytes === null)
154
+ return '-';
155
+ const units = ['B', 'KB', 'MB', 'GB'];
156
+ let unitIndex = 0;
157
+ let size = bytes;
158
+ while (size >= 1024 && unitIndex < units.length - 1) {
159
+ size /= 1024;
160
+ unitIndex++;
161
+ }
162
+ return `${size.toFixed(1)} ${units[unitIndex]}`;
163
+ }
164
+ /**
165
+ * Format a date in relative or absolute format
166
+ */
167
+ export function formatDate(dateStr) {
168
+ const date = new Date(dateStr);
169
+ const now = new Date();
170
+ const diffMs = now.getTime() - date.getTime();
171
+ const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24));
172
+ if (diffDays === 0) {
173
+ const diffHours = Math.floor(diffMs / (1000 * 60 * 60));
174
+ if (diffHours === 0) {
175
+ const diffMins = Math.floor(diffMs / (1000 * 60));
176
+ return `${diffMins}m ago`;
177
+ }
178
+ return `${diffHours}h ago`;
179
+ }
180
+ if (diffDays < 7) {
181
+ return `${diffDays}d ago`;
182
+ }
183
+ return date.toLocaleDateString();
184
+ }
185
+ /**
186
+ * Format job status with color
187
+ */
188
+ export function formatStatus(status) {
189
+ switch (status) {
190
+ case 'completed':
191
+ return chalk.green(status);
192
+ case 'running':
193
+ case 'pending':
194
+ return chalk.blue(status);
195
+ case 'queued':
196
+ return chalk.yellow(status);
197
+ case 'failed':
198
+ case 'cancelled':
199
+ return chalk.red(status);
200
+ default:
201
+ return status;
202
+ }
203
+ }
204
+ //# sourceMappingURL=output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/lib/output.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Tests for output formatters
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=output.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.test.d.ts","sourceRoot":"","sources":["../../src/lib/output.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,174 @@
1
+ /**
2
+ * Tests for output formatters
3
+ */
4
+ import { describe, it, expect } from 'vitest';
5
+ import { formatOutput, formatJson, formatJsonl, formatCsv, formatMarkdown, formatFileSize, formatDate, formatStatus, } from './output.js';
6
+ describe('output formatters', () => {
7
+ describe('formatJson', () => {
8
+ it('should format object as JSON', () => {
9
+ const data = { name: 'test', value: 123 };
10
+ const result = formatJson(data);
11
+ expect(JSON.parse(result)).toEqual(data);
12
+ });
13
+ it('should format arrays', () => {
14
+ const data = [{ id: 1 }, { id: 2 }];
15
+ const result = formatJson(data);
16
+ expect(JSON.parse(result)).toEqual(data);
17
+ });
18
+ it('should pretty print with indentation', () => {
19
+ const data = { key: 'value' };
20
+ const result = formatJson(data);
21
+ expect(result).toContain('\n');
22
+ expect(result).toContain(' ');
23
+ });
24
+ });
25
+ describe('formatJsonl', () => {
26
+ it('should format array as JSON lines', () => {
27
+ const data = [{ id: 1 }, { id: 2 }];
28
+ const result = formatJsonl(data);
29
+ const lines = result.split('\n');
30
+ expect(lines).toHaveLength(2);
31
+ expect(JSON.parse(lines[0])).toEqual({ id: 1 });
32
+ expect(JSON.parse(lines[1])).toEqual({ id: 2 });
33
+ });
34
+ it('should format single object as single line', () => {
35
+ const data = { id: 1 };
36
+ const result = formatJsonl(data);
37
+ expect(result).not.toContain('\n');
38
+ expect(JSON.parse(result)).toEqual(data);
39
+ });
40
+ });
41
+ describe('formatCsv', () => {
42
+ it('should format array as CSV', () => {
43
+ const data = [
44
+ { name: 'Alice', age: 30 },
45
+ { name: 'Bob', age: 25 },
46
+ ];
47
+ const result = formatCsv(data);
48
+ const lines = result.split('\n');
49
+ expect(lines[0]).toBe('name,age');
50
+ expect(lines[1]).toBe('Alice,30');
51
+ expect(lines[2]).toBe('Bob,25');
52
+ });
53
+ it('should escape fields with commas', () => {
54
+ const data = [{ name: 'Last, First', value: 'ok' }];
55
+ const result = formatCsv(data);
56
+ expect(result).toContain('"Last, First"');
57
+ });
58
+ it('should escape fields with quotes', () => {
59
+ const data = [{ name: 'Say "hello"', value: 'ok' }];
60
+ const result = formatCsv(data);
61
+ expect(result).toContain('"Say ""hello"""');
62
+ });
63
+ it('should use custom columns', () => {
64
+ const data = [{ first: 'A', second: 'B', third: 'C' }];
65
+ const columns = [
66
+ { key: 'first', header: 'First Column' },
67
+ { key: 'third', header: 'Third Column' },
68
+ ];
69
+ const result = formatCsv(data, columns);
70
+ const lines = result.split('\n');
71
+ expect(lines[0]).toBe('First Column,Third Column');
72
+ expect(lines[1]).toBe('A,C');
73
+ });
74
+ });
75
+ describe('formatMarkdown', () => {
76
+ it('should format as markdown table', () => {
77
+ const data = [
78
+ { name: 'Alice', age: 30 },
79
+ { name: 'Bob', age: 25 },
80
+ ];
81
+ const result = formatMarkdown(data);
82
+ expect(result).toContain('| name | age |');
83
+ expect(result).toContain('| --- | --- |');
84
+ expect(result).toContain('| Alice | 30 |');
85
+ });
86
+ it('should escape pipe characters', () => {
87
+ const data = [{ name: 'A | B', value: 'ok' }];
88
+ const result = formatMarkdown(data);
89
+ expect(result).toContain('A \\| B');
90
+ });
91
+ });
92
+ describe('formatOutput', () => {
93
+ const testData = [{ id: 1, name: 'test' }];
94
+ it('should format as json', () => {
95
+ const result = formatOutput(testData, 'json');
96
+ expect(JSON.parse(result)).toEqual(testData);
97
+ });
98
+ it('should format as jsonl', () => {
99
+ const result = formatOutput(testData, 'jsonl');
100
+ expect(JSON.parse(result)).toEqual(testData[0]);
101
+ });
102
+ it('should format as csv', () => {
103
+ const result = formatOutput(testData, 'csv');
104
+ expect(result).toContain('id,name');
105
+ });
106
+ it('should format as markdown', () => {
107
+ const result = formatOutput(testData, 'markdown');
108
+ expect(result).toContain('| id | name |');
109
+ });
110
+ it('should default to table format', () => {
111
+ const result = formatOutput(testData, 'table');
112
+ // Table format includes box-drawing characters
113
+ expect(result).toBeTruthy();
114
+ });
115
+ });
116
+ describe('formatFileSize', () => {
117
+ it('should format bytes', () => {
118
+ expect(formatFileSize(500)).toBe('500.0 B');
119
+ });
120
+ it('should format kilobytes', () => {
121
+ expect(formatFileSize(1024)).toBe('1.0 KB');
122
+ expect(formatFileSize(2048)).toBe('2.0 KB');
123
+ });
124
+ it('should format megabytes', () => {
125
+ expect(formatFileSize(1024 * 1024)).toBe('1.0 MB');
126
+ expect(formatFileSize(5 * 1024 * 1024)).toBe('5.0 MB');
127
+ });
128
+ it('should format gigabytes', () => {
129
+ expect(formatFileSize(1024 * 1024 * 1024)).toBe('1.0 GB');
130
+ });
131
+ it('should handle null', () => {
132
+ expect(formatFileSize(null)).toBe('-');
133
+ });
134
+ });
135
+ describe('formatDate', () => {
136
+ it('should format recent dates as relative', () => {
137
+ const now = new Date();
138
+ const fiveMinutesAgo = new Date(now.getTime() - 5 * 60 * 1000);
139
+ const result = formatDate(fiveMinutesAgo.toISOString());
140
+ expect(result).toContain('m ago');
141
+ });
142
+ it('should format hours ago', () => {
143
+ const now = new Date();
144
+ const twoHoursAgo = new Date(now.getTime() - 2 * 60 * 60 * 1000);
145
+ const result = formatDate(twoHoursAgo.toISOString());
146
+ expect(result).toContain('h ago');
147
+ });
148
+ it('should format days ago', () => {
149
+ const now = new Date();
150
+ const threeDaysAgo = new Date(now.getTime() - 3 * 24 * 60 * 60 * 1000);
151
+ const result = formatDate(threeDaysAgo.toISOString());
152
+ expect(result).toContain('d ago');
153
+ });
154
+ });
155
+ describe('formatStatus', () => {
156
+ it('should format completed status', () => {
157
+ const result = formatStatus('completed');
158
+ expect(result).toContain('completed');
159
+ });
160
+ it('should format failed status', () => {
161
+ const result = formatStatus('failed');
162
+ expect(result).toContain('failed');
163
+ });
164
+ it('should format running status', () => {
165
+ const result = formatStatus('running');
166
+ expect(result).toContain('running');
167
+ });
168
+ it('should format queued status', () => {
169
+ const result = formatStatus('queued');
170
+ expect(result).toContain('queued');
171
+ });
172
+ });
173
+ });
174
+ //# sourceMappingURL=output.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.test.js","sourceRoot":"","sources":["../../src/lib/output.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * Processor Plugin System
3
+ *
4
+ * Provides vendor-agnostic abstraction for different OCR/extraction providers.
5
+ * Inspired by Simon Willison's llm plugin architecture.
6
+ */
7
+ export interface ProcessorOptions {
8
+ /** Pages to process (e.g., "1-5", "1,3,5", "all") */
9
+ pages?: string;
10
+ /** Output format preference */
11
+ format?: 'markdown' | 'json' | 'html';
12
+ /** Language hint for OCR */
13
+ language?: string;
14
+ /** Enable table detection */
15
+ tables?: boolean;
16
+ /** Enable form field detection */
17
+ forms?: boolean;
18
+ /** Custom processor-specific options */
19
+ custom?: Record<string, unknown>;
20
+ }
21
+ export interface ProcessorResult {
22
+ pages: Array<{
23
+ page_number: number;
24
+ text: string;
25
+ tables?: Array<{
26
+ content: string;
27
+ confidence?: number;
28
+ }>;
29
+ entities?: Array<{
30
+ type: string;
31
+ value: string;
32
+ confidence?: number;
33
+ }>;
34
+ }>;
35
+ metadata?: Record<string, unknown>;
36
+ }
37
+ export interface Processor {
38
+ /** Unique processor identifier */
39
+ id: string;
40
+ /** Human-readable name */
41
+ name: string;
42
+ /** Description */
43
+ description: string;
44
+ /** Whether this processor is available (has required config/API keys) */
45
+ isAvailable(): Promise<boolean>;
46
+ /** Process a document */
47
+ process(documentUuid: string, options?: ProcessorOptions): Promise<ProcessorResult>;
48
+ }
49
+ export declare const BUILTIN_PROCESSORS: Record<string, {
50
+ id: string;
51
+ name: string;
52
+ description: string;
53
+ apiEndpoint: string;
54
+ requiresKey?: string;
55
+ }>;
56
+ export declare const PROCESSOR_ALIASES: Record<string, string>;
57
+ /**
58
+ * Resolve a processor name (including aliases) to a processor ID
59
+ */
60
+ export declare function resolveProcessor(nameOrAlias: string): string;
61
+ /**
62
+ * Get processor info by ID
63
+ */
64
+ export declare function getProcessor(id: string): typeof BUILTIN_PROCESSORS[string] | undefined;
65
+ /**
66
+ * List all available processors
67
+ */
68
+ export declare function listProcessors(): Array<typeof BUILTIN_PROCESSORS[string]>;
69
+ /**
70
+ * Format processor list for display
71
+ */
72
+ export declare function formatProcessorList(): string;
73
+ //# sourceMappingURL=processors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"processors.d.ts","sourceRoot":"","sources":["../../src/lib/processors.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,qDAAqD;IACrD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+BAA+B;IAC/B,MAAM,CAAC,EAAE,UAAU,GAAG,MAAM,GAAG,MAAM,CAAC;IACtC,4BAA4B;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,6BAA6B;IAC7B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,kCAAkC;IAClC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,wCAAwC;IACxC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,KAAK,CAAC;QACX,WAAW,EAAE,MAAM,CAAC;QACpB,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,CAAC,EAAE,KAAK,CAAC;YACb,OAAO,EAAE,MAAM,CAAC;YAChB,UAAU,CAAC,EAAE,MAAM,CAAC;SACrB,CAAC,CAAC;QACH,QAAQ,CAAC,EAAE,KAAK,CAAC;YACf,IAAI,EAAE,MAAM,CAAC;YACb,KAAK,EAAE,MAAM,CAAC;YACd,UAAU,CAAC,EAAE,MAAM,CAAC;SACrB,CAAC,CAAC;KACJ,CAAC,CAAC;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,SAAS;IACxB,kCAAkC;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,0BAA0B;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,kBAAkB;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,yEAAyE;IACzE,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAChC,yBAAyB;IACzB,OAAO,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;CACrF;AAGD,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE;IAC9C,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAwCA,CAAC;AAGF,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CASpD,CAAC;AAEF;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAG5D;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,kBAAkB,CAAC,MAAM,CAAC,GAAG,SAAS,CAGtF;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,KAAK,CAAC,OAAO,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAEzE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAU5C"}
@@ -0,0 +1,94 @@
1
+ /**
2
+ * Processor Plugin System
3
+ *
4
+ * Provides vendor-agnostic abstraction for different OCR/extraction providers.
5
+ * Inspired by Simon Willison's llm plugin architecture.
6
+ */
7
+ // Built-in processor definitions
8
+ export const BUILTIN_PROCESSORS = {
9
+ 'docai': {
10
+ id: 'docai',
11
+ name: 'Google Document AI',
12
+ description: 'Google Cloud Document AI for high-accuracy OCR and form parsing',
13
+ apiEndpoint: 'api/v1/ocr/google-docai',
14
+ requiresKey: 'GOOGLE_DOCAI',
15
+ },
16
+ 'qwen': {
17
+ id: 'qwen',
18
+ name: 'Qwen VL',
19
+ description: 'Qwen Vision-Language model for document understanding',
20
+ apiEndpoint: 'api/qwen/extract',
21
+ },
22
+ 'llamaparse': {
23
+ id: 'llamaparse',
24
+ name: 'LlamaParse',
25
+ description: 'LlamaIndex parser for complex document layouts',
26
+ apiEndpoint: 'api/parse/llama',
27
+ requiresKey: 'LLAMA_CLOUD',
28
+ },
29
+ 'gemini': {
30
+ id: 'gemini',
31
+ name: 'Google Gemini',
32
+ description: 'Google Gemini multimodal model for document analysis',
33
+ apiEndpoint: 'api/parse/gemini',
34
+ requiresKey: 'GOOGLE_GEMINI',
35
+ },
36
+ 'pdfplumber': {
37
+ id: 'pdfplumber',
38
+ name: 'PDFPlumber',
39
+ description: 'Local Python-based PDF text extraction (no OCR)',
40
+ apiEndpoint: 'api/extract-text',
41
+ },
42
+ 'default': {
43
+ id: 'default',
44
+ name: 'OkraPDF Default',
45
+ description: 'Automatic processor selection based on document type',
46
+ apiEndpoint: 'api/v1/extract',
47
+ },
48
+ };
49
+ // Processor aliases for convenience
50
+ export const PROCESSOR_ALIASES = {
51
+ 'google': 'docai',
52
+ 'gcp': 'docai',
53
+ 'llama': 'llamaparse',
54
+ 'lp': 'llamaparse',
55
+ 'q': 'qwen',
56
+ 'g': 'gemini',
57
+ 'local': 'pdfplumber',
58
+ 'auto': 'default',
59
+ };
60
+ /**
61
+ * Resolve a processor name (including aliases) to a processor ID
62
+ */
63
+ export function resolveProcessor(nameOrAlias) {
64
+ const lower = nameOrAlias.toLowerCase();
65
+ return PROCESSOR_ALIASES[lower] || lower;
66
+ }
67
+ /**
68
+ * Get processor info by ID
69
+ */
70
+ export function getProcessor(id) {
71
+ const resolved = resolveProcessor(id);
72
+ return BUILTIN_PROCESSORS[resolved];
73
+ }
74
+ /**
75
+ * List all available processors
76
+ */
77
+ export function listProcessors() {
78
+ return Object.values(BUILTIN_PROCESSORS);
79
+ }
80
+ /**
81
+ * Format processor list for display
82
+ */
83
+ export function formatProcessorList() {
84
+ const processors = listProcessors();
85
+ const lines = processors.map(p => {
86
+ const aliases = Object.entries(PROCESSOR_ALIASES)
87
+ .filter(([_, v]) => v === p.id)
88
+ .map(([k]) => k);
89
+ const aliasStr = aliases.length > 0 ? ` (aliases: ${aliases.join(', ')})` : '';
90
+ return ` ${p.id.padEnd(12)} ${p.name}${aliasStr}\n ${p.description}`;
91
+ });
92
+ return lines.join('\n\n');
93
+ }
94
+ //# sourceMappingURL=processors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"processors.js","sourceRoot":"","sources":["../../src/lib/processors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Tests for processor plugin system
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=processors.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"processors.test.d.ts","sourceRoot":"","sources":["../../src/lib/processors.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}