@okrapdf/cli 0.1.0 → 0.1.2
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 +163 -0
- package/dist/cli.d.ts +19 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +175 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/auth.d.ts +6 -0
- package/dist/commands/auth.d.ts.map +1 -0
- package/dist/commands/auth.js +155 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/chat.d.ts +6 -0
- package/dist/commands/chat.d.ts.map +1 -0
- package/dist/commands/chat.js +218 -0
- package/dist/commands/chat.js.map +1 -0
- package/dist/commands/docs.d.ts +6 -0
- package/dist/commands/docs.d.ts.map +1 -0
- package/dist/commands/docs.js +181 -0
- package/dist/commands/docs.js.map +1 -0
- package/dist/commands/jobs.d.ts +6 -0
- package/dist/commands/jobs.d.ts.map +1 -0
- package/dist/commands/jobs.js +348 -0
- package/dist/commands/jobs.js.map +1 -0
- package/dist/commands/jobs.test.d.ts +5 -0
- package/dist/commands/jobs.test.d.ts.map +1 -0
- package/dist/commands/jobs.test.js +118 -0
- package/dist/commands/jobs.test.js.map +1 -0
- package/dist/commands/logs.d.ts +8 -0
- package/dist/commands/logs.d.ts.map +1 -0
- package/dist/commands/logs.js +186 -0
- package/dist/commands/logs.js.map +1 -0
- package/dist/commands/processors.d.ts +8 -0
- package/dist/commands/processors.d.ts.map +1 -0
- package/dist/commands/processors.js +91 -0
- package/dist/commands/processors.js.map +1 -0
- package/dist/commands/review.d.ts +3 -0
- package/dist/commands/review.d.ts.map +1 -0
- package/dist/commands/review.js +370 -0
- package/dist/commands/review.js.map +1 -0
- package/dist/commands/shortcuts.d.ts +20 -0
- package/dist/commands/shortcuts.d.ts.map +1 -0
- package/dist/commands/shortcuts.js +405 -0
- package/dist/commands/shortcuts.js.map +1 -0
- package/dist/commands/tables.d.ts +6 -0
- package/dist/commands/tables.d.ts.map +1 -0
- package/dist/commands/tables.js +189 -0
- package/dist/commands/tables.js.map +1 -0
- package/dist/commands/templates.d.ts +8 -0
- package/dist/commands/templates.d.ts.map +1 -0
- package/dist/commands/templates.js +202 -0
- package/dist/commands/templates.js.map +1 -0
- package/dist/index.d.ts +14 -412
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +23 -46
- package/dist/index.js.map +1 -1
- package/dist/lib/browser.d.ts +11 -0
- package/dist/lib/browser.d.ts.map +1 -0
- package/dist/lib/browser.js +33 -0
- package/dist/lib/browser.js.map +1 -0
- package/dist/lib/client.d.ts +57 -0
- package/dist/lib/client.d.ts.map +1 -0
- package/dist/lib/client.js +176 -0
- package/dist/lib/client.js.map +1 -0
- package/dist/lib/config.d.ts +56 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +110 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/config.test.d.ts +5 -0
- package/dist/lib/config.test.d.ts.map +1 -0
- package/dist/lib/config.test.js +81 -0
- package/dist/lib/config.test.js.map +1 -0
- package/dist/lib/logs.d.ts +89 -0
- package/dist/lib/logs.d.ts.map +1 -0
- package/dist/lib/logs.js +196 -0
- package/dist/lib/logs.js.map +1 -0
- package/dist/lib/logs.test.d.ts +5 -0
- package/dist/lib/logs.test.d.ts.map +1 -0
- package/dist/lib/logs.test.js +183 -0
- package/dist/lib/logs.test.js.map +1 -0
- package/dist/lib/output.d.ts +73 -0
- package/dist/lib/output.d.ts.map +1 -0
- package/dist/lib/output.js +204 -0
- package/dist/lib/output.js.map +1 -0
- package/dist/lib/output.test.d.ts +5 -0
- package/dist/lib/output.test.d.ts.map +1 -0
- package/dist/lib/output.test.js +174 -0
- package/dist/lib/output.test.js.map +1 -0
- package/dist/lib/processors.d.ts +73 -0
- package/dist/lib/processors.d.ts.map +1 -0
- package/dist/lib/processors.js +94 -0
- package/dist/lib/processors.js.map +1 -0
- package/dist/lib/processors.test.d.ts +5 -0
- package/dist/lib/processors.test.d.ts.map +1 -0
- package/dist/lib/processors.test.js +83 -0
- package/dist/lib/processors.test.js.map +1 -0
- package/dist/lib/progress.d.ts +44 -0
- package/dist/lib/progress.d.ts.map +1 -0
- package/dist/lib/progress.js +102 -0
- package/dist/lib/progress.js.map +1 -0
- package/dist/lib/templates.d.ts +56 -0
- package/dist/lib/templates.d.ts.map +1 -0
- package/dist/lib/templates.js +204 -0
- package/dist/lib/templates.js.map +1 -0
- package/dist/lib/templates.test.d.ts +5 -0
- package/dist/lib/templates.test.d.ts.map +1 -0
- package/dist/lib/templates.test.js +101 -0
- package/dist/lib/templates.test.js.map +1 -0
- package/dist/types.d.ts +144 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/package.json +56 -25
- package/dist/bin.d.ts +0 -1
- package/dist/bin.js +0 -152
- package/dist/bin.js.map +0 -1
- package/dist/chunk-A6YTW4WL.js +0 -499
- package/dist/chunk-A6YTW4WL.js.map +0 -1
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for processor plugin system
|
|
3
|
+
*/
|
|
4
|
+
import { describe, it, expect } from 'vitest';
|
|
5
|
+
import { resolveProcessor, getProcessor, listProcessors, BUILTIN_PROCESSORS, PROCESSOR_ALIASES, } from './processors.js';
|
|
6
|
+
describe('processors', () => {
|
|
7
|
+
describe('BUILTIN_PROCESSORS', () => {
|
|
8
|
+
it('should have expected processors', () => {
|
|
9
|
+
expect(BUILTIN_PROCESSORS).toHaveProperty('docai');
|
|
10
|
+
expect(BUILTIN_PROCESSORS).toHaveProperty('qwen');
|
|
11
|
+
expect(BUILTIN_PROCESSORS).toHaveProperty('llamaparse');
|
|
12
|
+
expect(BUILTIN_PROCESSORS).toHaveProperty('gemini');
|
|
13
|
+
expect(BUILTIN_PROCESSORS).toHaveProperty('pdfplumber');
|
|
14
|
+
expect(BUILTIN_PROCESSORS).toHaveProperty('default');
|
|
15
|
+
});
|
|
16
|
+
it('should have required fields for each processor', () => {
|
|
17
|
+
for (const [id, proc] of Object.entries(BUILTIN_PROCESSORS)) {
|
|
18
|
+
expect(proc.id).toBe(id);
|
|
19
|
+
expect(proc.name).toBeTruthy();
|
|
20
|
+
expect(proc.description).toBeTruthy();
|
|
21
|
+
expect(proc.apiEndpoint).toBeTruthy();
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
describe('resolveProcessor', () => {
|
|
26
|
+
it('should return processor ID as-is if not an alias', () => {
|
|
27
|
+
expect(resolveProcessor('docai')).toBe('docai');
|
|
28
|
+
expect(resolveProcessor('gemini')).toBe('gemini');
|
|
29
|
+
});
|
|
30
|
+
it('should resolve aliases to processor IDs', () => {
|
|
31
|
+
expect(resolveProcessor('google')).toBe('docai');
|
|
32
|
+
expect(resolveProcessor('gcp')).toBe('docai');
|
|
33
|
+
expect(resolveProcessor('llama')).toBe('llamaparse');
|
|
34
|
+
expect(resolveProcessor('lp')).toBe('llamaparse');
|
|
35
|
+
expect(resolveProcessor('auto')).toBe('default');
|
|
36
|
+
});
|
|
37
|
+
it('should be case-insensitive', () => {
|
|
38
|
+
expect(resolveProcessor('DOCAI')).toBe('docai');
|
|
39
|
+
expect(resolveProcessor('Google')).toBe('docai');
|
|
40
|
+
});
|
|
41
|
+
it('should return unknown processor as-is', () => {
|
|
42
|
+
expect(resolveProcessor('unknown')).toBe('unknown');
|
|
43
|
+
});
|
|
44
|
+
});
|
|
45
|
+
describe('getProcessor', () => {
|
|
46
|
+
it('should return processor info for valid ID', () => {
|
|
47
|
+
const proc = getProcessor('docai');
|
|
48
|
+
expect(proc).toBeDefined();
|
|
49
|
+
expect(proc?.id).toBe('docai');
|
|
50
|
+
expect(proc?.name).toBe('Google Document AI');
|
|
51
|
+
});
|
|
52
|
+
it('should resolve aliases', () => {
|
|
53
|
+
const proc = getProcessor('google');
|
|
54
|
+
expect(proc).toBeDefined();
|
|
55
|
+
expect(proc?.id).toBe('docai');
|
|
56
|
+
});
|
|
57
|
+
it('should return undefined for unknown processor', () => {
|
|
58
|
+
expect(getProcessor('nonexistent')).toBeUndefined();
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
describe('listProcessors', () => {
|
|
62
|
+
it('should return all processors', () => {
|
|
63
|
+
const processors = listProcessors();
|
|
64
|
+
expect(processors.length).toBe(Object.keys(BUILTIN_PROCESSORS).length);
|
|
65
|
+
});
|
|
66
|
+
it('should return processors with required fields', () => {
|
|
67
|
+
const processors = listProcessors();
|
|
68
|
+
for (const proc of processors) {
|
|
69
|
+
expect(proc.id).toBeTruthy();
|
|
70
|
+
expect(proc.name).toBeTruthy();
|
|
71
|
+
expect(proc.description).toBeTruthy();
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
describe('PROCESSOR_ALIASES', () => {
|
|
76
|
+
it('should map to valid processors', () => {
|
|
77
|
+
for (const [alias, target] of Object.entries(PROCESSOR_ALIASES)) {
|
|
78
|
+
expect(BUILTIN_PROCESSORS[target]).toBeDefined();
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
//# sourceMappingURL=processors.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"processors.test.js","sourceRoot":"","sources":["../../src/lib/processors.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Progress indicators and spinners
|
|
3
|
+
*/
|
|
4
|
+
import { type Ora } from 'ora';
|
|
5
|
+
/**
|
|
6
|
+
* Create a spinner
|
|
7
|
+
*/
|
|
8
|
+
export declare function createSpinner(text: string): Ora;
|
|
9
|
+
/**
|
|
10
|
+
* Run an async operation with a spinner
|
|
11
|
+
*/
|
|
12
|
+
export declare function withSpinner<T>(text: string, operation: () => Promise<T>, successText?: string): Promise<T>;
|
|
13
|
+
/**
|
|
14
|
+
* Simple progress bar
|
|
15
|
+
*/
|
|
16
|
+
export declare class ProgressBar {
|
|
17
|
+
private current;
|
|
18
|
+
private total;
|
|
19
|
+
private width;
|
|
20
|
+
private label;
|
|
21
|
+
constructor(total: number, label?: string, width?: number);
|
|
22
|
+
update(current: number): void;
|
|
23
|
+
increment(amount?: number): void;
|
|
24
|
+
private render;
|
|
25
|
+
complete(): void;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Poll a job until completion with progress
|
|
29
|
+
*/
|
|
30
|
+
export declare function pollWithProgress<T>(pollFn: () => Promise<{
|
|
31
|
+
done: boolean;
|
|
32
|
+
progress?: number;
|
|
33
|
+
total?: number;
|
|
34
|
+
data: T;
|
|
35
|
+
}>, options?: {
|
|
36
|
+
interval?: number;
|
|
37
|
+
timeout?: number;
|
|
38
|
+
label?: string;
|
|
39
|
+
}): Promise<T>;
|
|
40
|
+
/**
|
|
41
|
+
* Sleep helper
|
|
42
|
+
*/
|
|
43
|
+
export declare function sleep(ms: number): Promise<void>;
|
|
44
|
+
//# sourceMappingURL=progress.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"progress.d.ts","sourceRoot":"","sources":["../../src/lib/progress.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAY,EAAE,KAAK,GAAG,EAAE,MAAM,KAAK,CAAC;AAGpC;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,CAK/C;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,CAAC,EACjC,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC3B,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,CAAC,CAAC,CAYZ;AAED;;GAEG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,OAAO,CAAK;IACpB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,KAAK,CAAS;gBAEV,KAAK,EAAE,MAAM,EAAE,KAAK,SAAa,EAAE,KAAK,SAAK;IAMzD,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAK7B,SAAS,CAAC,MAAM,SAAI,GAAG,IAAI;IAK3B,OAAO,CAAC,MAAM;IAWd,QAAQ,IAAI,IAAI;CAKjB;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,CAAC,EACtC,MAAM,EAAE,MAAM,OAAO,CAAC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,CAAC,CAAA;CAAE,CAAC,EACpF,OAAO,GAAE;IACP,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CACX,GACL,OAAO,CAAC,CAAC,CAAC,CAiCZ;AAED;;GAEG;AACH,wBAAgB,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE/C"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Progress indicators and spinners
|
|
3
|
+
*/
|
|
4
|
+
import ora from 'ora';
|
|
5
|
+
import chalk from 'chalk';
|
|
6
|
+
/**
|
|
7
|
+
* Create a spinner
|
|
8
|
+
*/
|
|
9
|
+
export function createSpinner(text) {
|
|
10
|
+
return ora({
|
|
11
|
+
text,
|
|
12
|
+
spinner: 'dots',
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Run an async operation with a spinner
|
|
17
|
+
*/
|
|
18
|
+
export async function withSpinner(text, operation, successText) {
|
|
19
|
+
const spinner = createSpinner(text);
|
|
20
|
+
spinner.start();
|
|
21
|
+
try {
|
|
22
|
+
const result = await operation();
|
|
23
|
+
spinner.succeed(successText || text);
|
|
24
|
+
return result;
|
|
25
|
+
}
|
|
26
|
+
catch (error) {
|
|
27
|
+
spinner.fail();
|
|
28
|
+
throw error;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Simple progress bar
|
|
33
|
+
*/
|
|
34
|
+
export class ProgressBar {
|
|
35
|
+
current = 0;
|
|
36
|
+
total;
|
|
37
|
+
width;
|
|
38
|
+
label;
|
|
39
|
+
constructor(total, label = 'Progress', width = 30) {
|
|
40
|
+
this.total = total;
|
|
41
|
+
this.width = width;
|
|
42
|
+
this.label = label;
|
|
43
|
+
}
|
|
44
|
+
update(current) {
|
|
45
|
+
this.current = current;
|
|
46
|
+
this.render();
|
|
47
|
+
}
|
|
48
|
+
increment(amount = 1) {
|
|
49
|
+
this.current = Math.min(this.current + amount, this.total);
|
|
50
|
+
this.render();
|
|
51
|
+
}
|
|
52
|
+
render() {
|
|
53
|
+
const percent = this.total > 0 ? this.current / this.total : 0;
|
|
54
|
+
const filled = Math.round(this.width * percent);
|
|
55
|
+
const empty = this.width - filled;
|
|
56
|
+
const bar = chalk.green('█'.repeat(filled)) + chalk.gray('░'.repeat(empty));
|
|
57
|
+
const percentStr = (percent * 100).toFixed(0).padStart(3);
|
|
58
|
+
process.stdout.write(`\r${this.label}: ${bar} ${percentStr}% (${this.current}/${this.total})`);
|
|
59
|
+
}
|
|
60
|
+
complete() {
|
|
61
|
+
this.current = this.total;
|
|
62
|
+
this.render();
|
|
63
|
+
console.log(); // New line after completion
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Poll a job until completion with progress
|
|
68
|
+
*/
|
|
69
|
+
export async function pollWithProgress(pollFn, options = {}) {
|
|
70
|
+
const { interval = 2000, timeout = 300000, label = 'Processing' } = options;
|
|
71
|
+
const startTime = Date.now();
|
|
72
|
+
const spinner = createSpinner(label);
|
|
73
|
+
spinner.start();
|
|
74
|
+
let lastProgress = 0;
|
|
75
|
+
let lastTotal = 0;
|
|
76
|
+
while (true) {
|
|
77
|
+
const elapsed = Date.now() - startTime;
|
|
78
|
+
if (elapsed > timeout) {
|
|
79
|
+
spinner.fail('Timeout waiting for completion');
|
|
80
|
+
throw new Error('Operation timed out');
|
|
81
|
+
}
|
|
82
|
+
const result = await pollFn();
|
|
83
|
+
if (result.progress !== undefined && result.total !== undefined) {
|
|
84
|
+
lastProgress = result.progress;
|
|
85
|
+
lastTotal = result.total;
|
|
86
|
+
const percent = lastTotal > 0 ? Math.round((lastProgress / lastTotal) * 100) : 0;
|
|
87
|
+
spinner.text = `${label}: ${percent}% (${lastProgress}/${lastTotal} pages)`;
|
|
88
|
+
}
|
|
89
|
+
if (result.done) {
|
|
90
|
+
spinner.succeed(`${label}: Complete`);
|
|
91
|
+
return result.data;
|
|
92
|
+
}
|
|
93
|
+
await sleep(interval);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Sleep helper
|
|
98
|
+
*/
|
|
99
|
+
export function sleep(ms) {
|
|
100
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=progress.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"progress.js","sourceRoot":"","sources":["../../src/lib/progress.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extraction Templates
|
|
3
|
+
*
|
|
4
|
+
* Reusable patterns for common document types.
|
|
5
|
+
* Users can create custom templates stored in ~/.okrapdf/templates/
|
|
6
|
+
*/
|
|
7
|
+
export interface ExtractField {
|
|
8
|
+
name: string;
|
|
9
|
+
description: string;
|
|
10
|
+
type: 'string' | 'number' | 'date' | 'currency' | 'array' | 'table';
|
|
11
|
+
required?: boolean;
|
|
12
|
+
format?: string;
|
|
13
|
+
}
|
|
14
|
+
export interface Template {
|
|
15
|
+
id: string;
|
|
16
|
+
name: string;
|
|
17
|
+
description: string;
|
|
18
|
+
/** Document type this template is for */
|
|
19
|
+
documentType: string;
|
|
20
|
+
/** Preferred processor for this template */
|
|
21
|
+
processor?: string;
|
|
22
|
+
/** Fields to extract */
|
|
23
|
+
fields: ExtractField[];
|
|
24
|
+
/** System prompt for LLM-based extraction */
|
|
25
|
+
systemPrompt?: string;
|
|
26
|
+
/** Example output format */
|
|
27
|
+
exampleOutput?: Record<string, unknown>;
|
|
28
|
+
/** Whether this is a built-in template */
|
|
29
|
+
builtin?: boolean;
|
|
30
|
+
}
|
|
31
|
+
export declare const BUILTIN_TEMPLATES: Record<string, Template>;
|
|
32
|
+
/**
|
|
33
|
+
* Get the templates directory path
|
|
34
|
+
*/
|
|
35
|
+
export declare function getTemplatesDir(): string;
|
|
36
|
+
/**
|
|
37
|
+
* Load a template by ID (checks user templates first, then builtins)
|
|
38
|
+
*/
|
|
39
|
+
export declare function loadTemplate(id: string): Template | undefined;
|
|
40
|
+
/**
|
|
41
|
+
* Save a custom template
|
|
42
|
+
*/
|
|
43
|
+
export declare function saveTemplate(template: Template): void;
|
|
44
|
+
/**
|
|
45
|
+
* List all available templates (user + builtin)
|
|
46
|
+
*/
|
|
47
|
+
export declare function listTemplates(): Template[];
|
|
48
|
+
/**
|
|
49
|
+
* Delete a user template
|
|
50
|
+
*/
|
|
51
|
+
export declare function deleteTemplate(id: string): boolean;
|
|
52
|
+
/**
|
|
53
|
+
* Format template for display
|
|
54
|
+
*/
|
|
55
|
+
export declare function formatTemplateInfo(template: Template): string;
|
|
56
|
+
//# sourceMappingURL=templates.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/lib/templates.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,GAAG,OAAO,GAAG,OAAO,CAAC;IACpE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,yCAAyC;IACzC,YAAY,EAAE,MAAM,CAAC;IACrB,4CAA4C;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wBAAwB;IACxB,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,6CAA6C;IAC7C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,4BAA4B;IAC5B,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,0CAA0C;IAC1C,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAGD,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAmGtD,CAAC;AAEF;;GAEG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAMxC;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAc7D;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAGrD;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,QAAQ,EAAE,CA4B1C;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAQlD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAe7D"}
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extraction Templates
|
|
3
|
+
*
|
|
4
|
+
* Reusable patterns for common document types.
|
|
5
|
+
* Users can create custom templates stored in ~/.okrapdf/templates/
|
|
6
|
+
*/
|
|
7
|
+
import { readFileSync, writeFileSync, existsSync, mkdirSync, readdirSync } from 'fs';
|
|
8
|
+
import { join } from 'path';
|
|
9
|
+
import { homedir } from 'os';
|
|
10
|
+
// Built-in templates for common document types
|
|
11
|
+
export const BUILTIN_TEMPLATES = {
|
|
12
|
+
'invoice': {
|
|
13
|
+
id: 'invoice',
|
|
14
|
+
name: 'Invoice',
|
|
15
|
+
description: 'Extract data from invoices and bills',
|
|
16
|
+
documentType: 'invoice',
|
|
17
|
+
processor: 'docai',
|
|
18
|
+
fields: [
|
|
19
|
+
{ name: 'vendor_name', description: 'Vendor/supplier name', type: 'string', required: true },
|
|
20
|
+
{ name: 'invoice_number', description: 'Invoice number', type: 'string', required: true },
|
|
21
|
+
{ name: 'invoice_date', description: 'Invoice date', type: 'date', format: 'YYYY-MM-DD' },
|
|
22
|
+
{ name: 'due_date', description: 'Payment due date', type: 'date', format: 'YYYY-MM-DD' },
|
|
23
|
+
{ name: 'total_amount', description: 'Total amount due', type: 'currency', required: true },
|
|
24
|
+
{ name: 'tax_amount', description: 'Tax amount', type: 'currency' },
|
|
25
|
+
{ name: 'line_items', description: 'Line items', type: 'table' },
|
|
26
|
+
],
|
|
27
|
+
systemPrompt: 'Extract invoice data. Return structured JSON with vendor_name, invoice_number, invoice_date, due_date, total_amount, tax_amount, and line_items array.',
|
|
28
|
+
builtin: true,
|
|
29
|
+
},
|
|
30
|
+
'receipt': {
|
|
31
|
+
id: 'receipt',
|
|
32
|
+
name: 'Receipt',
|
|
33
|
+
description: 'Extract data from receipts',
|
|
34
|
+
documentType: 'receipt',
|
|
35
|
+
processor: 'gemini',
|
|
36
|
+
fields: [
|
|
37
|
+
{ name: 'merchant_name', description: 'Store/merchant name', type: 'string', required: true },
|
|
38
|
+
{ name: 'date', description: 'Transaction date', type: 'date' },
|
|
39
|
+
{ name: 'total', description: 'Total amount', type: 'currency', required: true },
|
|
40
|
+
{ name: 'tax', description: 'Tax amount', type: 'currency' },
|
|
41
|
+
{ name: 'items', description: 'Purchased items', type: 'array' },
|
|
42
|
+
{ name: 'payment_method', description: 'Payment method', type: 'string' },
|
|
43
|
+
],
|
|
44
|
+
builtin: true,
|
|
45
|
+
},
|
|
46
|
+
'financial-statement': {
|
|
47
|
+
id: 'financial-statement',
|
|
48
|
+
name: 'Financial Statement',
|
|
49
|
+
description: 'Extract data from financial statements (balance sheet, income statement)',
|
|
50
|
+
documentType: 'financial',
|
|
51
|
+
processor: 'llamaparse',
|
|
52
|
+
fields: [
|
|
53
|
+
{ name: 'company_name', description: 'Company name', type: 'string', required: true },
|
|
54
|
+
{ name: 'period', description: 'Reporting period', type: 'string', required: true },
|
|
55
|
+
{ name: 'statement_type', description: 'Type of statement', type: 'string' },
|
|
56
|
+
{ name: 'total_assets', description: 'Total assets', type: 'currency' },
|
|
57
|
+
{ name: 'total_liabilities', description: 'Total liabilities', type: 'currency' },
|
|
58
|
+
{ name: 'total_equity', description: 'Total equity', type: 'currency' },
|
|
59
|
+
{ name: 'revenue', description: 'Total revenue', type: 'currency' },
|
|
60
|
+
{ name: 'net_income', description: 'Net income', type: 'currency' },
|
|
61
|
+
{ name: 'tables', description: 'Financial tables', type: 'table' },
|
|
62
|
+
],
|
|
63
|
+
builtin: true,
|
|
64
|
+
},
|
|
65
|
+
'contract': {
|
|
66
|
+
id: 'contract',
|
|
67
|
+
name: 'Contract',
|
|
68
|
+
description: 'Extract key terms from contracts and agreements',
|
|
69
|
+
documentType: 'contract',
|
|
70
|
+
processor: 'qwen',
|
|
71
|
+
fields: [
|
|
72
|
+
{ name: 'parties', description: 'Contracting parties', type: 'array', required: true },
|
|
73
|
+
{ name: 'effective_date', description: 'Effective date', type: 'date' },
|
|
74
|
+
{ name: 'termination_date', description: 'Termination/expiry date', type: 'date' },
|
|
75
|
+
{ name: 'contract_value', description: 'Contract value', type: 'currency' },
|
|
76
|
+
{ name: 'key_terms', description: 'Key terms and conditions', type: 'array' },
|
|
77
|
+
{ name: 'obligations', description: 'Key obligations', type: 'array' },
|
|
78
|
+
],
|
|
79
|
+
builtin: true,
|
|
80
|
+
},
|
|
81
|
+
'resume': {
|
|
82
|
+
id: 'resume',
|
|
83
|
+
name: 'Resume/CV',
|
|
84
|
+
description: 'Extract structured data from resumes',
|
|
85
|
+
documentType: 'resume',
|
|
86
|
+
processor: 'gemini',
|
|
87
|
+
fields: [
|
|
88
|
+
{ name: 'name', description: 'Full name', type: 'string', required: true },
|
|
89
|
+
{ name: 'email', description: 'Email address', type: 'string' },
|
|
90
|
+
{ name: 'phone', description: 'Phone number', type: 'string' },
|
|
91
|
+
{ name: 'location', description: 'Location', type: 'string' },
|
|
92
|
+
{ name: 'summary', description: 'Professional summary', type: 'string' },
|
|
93
|
+
{ name: 'experience', description: 'Work experience', type: 'array' },
|
|
94
|
+
{ name: 'education', description: 'Education', type: 'array' },
|
|
95
|
+
{ name: 'skills', description: 'Skills', type: 'array' },
|
|
96
|
+
],
|
|
97
|
+
builtin: true,
|
|
98
|
+
},
|
|
99
|
+
'table': {
|
|
100
|
+
id: 'table',
|
|
101
|
+
name: 'Table Extraction',
|
|
102
|
+
description: 'Extract all tables from a document',
|
|
103
|
+
documentType: 'any',
|
|
104
|
+
processor: 'default',
|
|
105
|
+
fields: [
|
|
106
|
+
{ name: 'tables', description: 'All tables in the document', type: 'table', required: true },
|
|
107
|
+
],
|
|
108
|
+
builtin: true,
|
|
109
|
+
},
|
|
110
|
+
};
|
|
111
|
+
/**
|
|
112
|
+
* Get the templates directory path
|
|
113
|
+
*/
|
|
114
|
+
export function getTemplatesDir() {
|
|
115
|
+
const dir = join(homedir(), '.okrapdf', 'templates');
|
|
116
|
+
if (!existsSync(dir)) {
|
|
117
|
+
mkdirSync(dir, { recursive: true });
|
|
118
|
+
}
|
|
119
|
+
return dir;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Load a template by ID (checks user templates first, then builtins)
|
|
123
|
+
*/
|
|
124
|
+
export function loadTemplate(id) {
|
|
125
|
+
// Check user templates first
|
|
126
|
+
const userPath = join(getTemplatesDir(), `${id}.json`);
|
|
127
|
+
if (existsSync(userPath)) {
|
|
128
|
+
try {
|
|
129
|
+
const content = readFileSync(userPath, 'utf-8');
|
|
130
|
+
return JSON.parse(content);
|
|
131
|
+
}
|
|
132
|
+
catch {
|
|
133
|
+
// Fall through to builtin
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
// Check builtins
|
|
137
|
+
return BUILTIN_TEMPLATES[id];
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Save a custom template
|
|
141
|
+
*/
|
|
142
|
+
export function saveTemplate(template) {
|
|
143
|
+
const path = join(getTemplatesDir(), `${template.id}.json`);
|
|
144
|
+
writeFileSync(path, JSON.stringify(template, null, 2), 'utf-8');
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* List all available templates (user + builtin)
|
|
148
|
+
*/
|
|
149
|
+
export function listTemplates() {
|
|
150
|
+
const templates = [];
|
|
151
|
+
// Add user templates
|
|
152
|
+
const userDir = getTemplatesDir();
|
|
153
|
+
if (existsSync(userDir)) {
|
|
154
|
+
const files = readdirSync(userDir).filter(f => f.endsWith('.json'));
|
|
155
|
+
for (const file of files) {
|
|
156
|
+
try {
|
|
157
|
+
const content = readFileSync(join(userDir, file), 'utf-8');
|
|
158
|
+
const template = JSON.parse(content);
|
|
159
|
+
template.builtin = false;
|
|
160
|
+
templates.push(template);
|
|
161
|
+
}
|
|
162
|
+
catch {
|
|
163
|
+
// Skip invalid templates
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
// Add builtins (that aren't overridden)
|
|
168
|
+
const userIds = new Set(templates.map(t => t.id));
|
|
169
|
+
for (const builtin of Object.values(BUILTIN_TEMPLATES)) {
|
|
170
|
+
if (!userIds.has(builtin.id)) {
|
|
171
|
+
templates.push(builtin);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
return templates.sort((a, b) => a.id.localeCompare(b.id));
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Delete a user template
|
|
178
|
+
*/
|
|
179
|
+
export function deleteTemplate(id) {
|
|
180
|
+
const path = join(getTemplatesDir(), `${id}.json`);
|
|
181
|
+
if (existsSync(path)) {
|
|
182
|
+
const { unlinkSync } = require('fs');
|
|
183
|
+
unlinkSync(path);
|
|
184
|
+
return true;
|
|
185
|
+
}
|
|
186
|
+
return false;
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Format template for display
|
|
190
|
+
*/
|
|
191
|
+
export function formatTemplateInfo(template) {
|
|
192
|
+
const lines = [
|
|
193
|
+
`ID: ${template.id}${template.builtin ? ' (builtin)' : ''}`,
|
|
194
|
+
`Name: ${template.name}`,
|
|
195
|
+
`Description: ${template.description}`,
|
|
196
|
+
`Document Type: ${template.documentType}`,
|
|
197
|
+
template.processor ? `Processor: ${template.processor}` : null,
|
|
198
|
+
'',
|
|
199
|
+
'Fields:',
|
|
200
|
+
...template.fields.map(f => ` - ${f.name} (${f.type})${f.required ? ' *required' : ''}: ${f.description}`),
|
|
201
|
+
].filter(Boolean);
|
|
202
|
+
return lines.join('\n');
|
|
203
|
+
}
|
|
204
|
+
//# sourceMappingURL=templates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/lib/templates.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templates.test.d.ts","sourceRoot":"","sources":["../../src/lib/templates.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for extraction templates
|
|
3
|
+
*/
|
|
4
|
+
import { describe, it, expect } from 'vitest';
|
|
5
|
+
import { BUILTIN_TEMPLATES, loadTemplate, listTemplates, formatTemplateInfo, } from './templates.js';
|
|
6
|
+
describe('templates', () => {
|
|
7
|
+
describe('BUILTIN_TEMPLATES', () => {
|
|
8
|
+
it('should have expected templates', () => {
|
|
9
|
+
expect(BUILTIN_TEMPLATES).toHaveProperty('invoice');
|
|
10
|
+
expect(BUILTIN_TEMPLATES).toHaveProperty('receipt');
|
|
11
|
+
expect(BUILTIN_TEMPLATES).toHaveProperty('financial-statement');
|
|
12
|
+
expect(BUILTIN_TEMPLATES).toHaveProperty('contract');
|
|
13
|
+
expect(BUILTIN_TEMPLATES).toHaveProperty('resume');
|
|
14
|
+
expect(BUILTIN_TEMPLATES).toHaveProperty('table');
|
|
15
|
+
});
|
|
16
|
+
it('should have required fields for each template', () => {
|
|
17
|
+
for (const [id, tpl] of Object.entries(BUILTIN_TEMPLATES)) {
|
|
18
|
+
expect(tpl.id).toBe(id);
|
|
19
|
+
expect(tpl.name).toBeTruthy();
|
|
20
|
+
expect(tpl.description).toBeTruthy();
|
|
21
|
+
expect(tpl.documentType).toBeTruthy();
|
|
22
|
+
expect(Array.isArray(tpl.fields)).toBe(true);
|
|
23
|
+
expect(tpl.builtin).toBe(true);
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
it('invoice template should have expected fields', () => {
|
|
27
|
+
const invoice = BUILTIN_TEMPLATES.invoice;
|
|
28
|
+
const fieldNames = invoice.fields.map(f => f.name);
|
|
29
|
+
expect(fieldNames).toContain('vendor_name');
|
|
30
|
+
expect(fieldNames).toContain('invoice_number');
|
|
31
|
+
expect(fieldNames).toContain('total_amount');
|
|
32
|
+
});
|
|
33
|
+
it('receipt template should have expected fields', () => {
|
|
34
|
+
const receipt = BUILTIN_TEMPLATES.receipt;
|
|
35
|
+
const fieldNames = receipt.fields.map(f => f.name);
|
|
36
|
+
expect(fieldNames).toContain('merchant_name');
|
|
37
|
+
expect(fieldNames).toContain('total');
|
|
38
|
+
expect(fieldNames).toContain('items');
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
describe('loadTemplate', () => {
|
|
42
|
+
it('should load builtin templates', () => {
|
|
43
|
+
const invoice = loadTemplate('invoice');
|
|
44
|
+
expect(invoice).toBeDefined();
|
|
45
|
+
expect(invoice?.id).toBe('invoice');
|
|
46
|
+
expect(invoice?.builtin).toBe(true);
|
|
47
|
+
});
|
|
48
|
+
it('should return undefined for unknown templates', () => {
|
|
49
|
+
expect(loadTemplate('nonexistent')).toBeUndefined();
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
describe('listTemplates', () => {
|
|
53
|
+
it('should return all builtin templates', () => {
|
|
54
|
+
const templates = listTemplates();
|
|
55
|
+
const builtinCount = Object.keys(BUILTIN_TEMPLATES).length;
|
|
56
|
+
// Should have at least all builtins
|
|
57
|
+
expect(templates.length).toBeGreaterThanOrEqual(builtinCount);
|
|
58
|
+
// All builtins should be present
|
|
59
|
+
for (const id of Object.keys(BUILTIN_TEMPLATES)) {
|
|
60
|
+
expect(templates.find(t => t.id === id)).toBeDefined();
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
it('should return sorted templates', () => {
|
|
64
|
+
const templates = listTemplates();
|
|
65
|
+
const ids = templates.map(t => t.id);
|
|
66
|
+
const sortedIds = [...ids].sort();
|
|
67
|
+
expect(ids).toEqual(sortedIds);
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
describe('formatTemplateInfo', () => {
|
|
71
|
+
it('should format template info as string', () => {
|
|
72
|
+
const invoice = BUILTIN_TEMPLATES.invoice;
|
|
73
|
+
const formatted = formatTemplateInfo(invoice);
|
|
74
|
+
expect(formatted).toContain('invoice');
|
|
75
|
+
expect(formatted).toContain('Invoice');
|
|
76
|
+
expect(formatted).toContain('Fields:');
|
|
77
|
+
expect(formatted).toContain('vendor_name');
|
|
78
|
+
});
|
|
79
|
+
it('should indicate builtin status', () => {
|
|
80
|
+
const invoice = BUILTIN_TEMPLATES.invoice;
|
|
81
|
+
const formatted = formatTemplateInfo(invoice);
|
|
82
|
+
expect(formatted).toContain('builtin');
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
describe('template fields', () => {
|
|
86
|
+
it('should have valid field types', () => {
|
|
87
|
+
const validTypes = ['string', 'number', 'date', 'currency', 'array', 'table'];
|
|
88
|
+
for (const tpl of Object.values(BUILTIN_TEMPLATES)) {
|
|
89
|
+
for (const field of tpl.fields) {
|
|
90
|
+
expect(validTypes).toContain(field.type);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
it('required fields should be marked', () => {
|
|
95
|
+
const invoice = BUILTIN_TEMPLATES.invoice;
|
|
96
|
+
const vendorField = invoice.fields.find(f => f.name === 'vendor_name');
|
|
97
|
+
expect(vendorField?.required).toBe(true);
|
|
98
|
+
});
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
//# sourceMappingURL=templates.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templates.test.js","sourceRoot":"","sources":["../../src/lib/templates.test.ts"],"names":[],"mappings":"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"}
|