@okrapdf/cli 0.2.10 → 0.2.12

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 (124) hide show
  1. package/README.md +8 -0
  2. package/dist/cli.d.ts.map +1 -1
  3. package/dist/cli.js +25 -4
  4. package/dist/cli.js.map +1 -1
  5. package/dist/cli.test.d.ts +2 -0
  6. package/dist/cli.test.d.ts.map +1 -0
  7. package/dist/cli.test.js +35 -0
  8. package/dist/cli.test.js.map +1 -0
  9. package/dist/commands/auth.d.ts.map +1 -1
  10. package/dist/commands/auth.js +5 -5
  11. package/dist/commands/auth.js.map +1 -1
  12. package/dist/commands/docs.js +3 -3
  13. package/dist/commands/docs.js.map +1 -1
  14. package/dist/commands/entities.js +3 -3
  15. package/dist/commands/entities.js.map +1 -1
  16. package/dist/commands/exit-codes.d.ts +6 -0
  17. package/dist/commands/exit-codes.d.ts.map +1 -0
  18. package/dist/commands/exit-codes.js +51 -0
  19. package/dist/commands/exit-codes.js.map +1 -0
  20. package/dist/commands/exit-codes.test.d.ts +2 -0
  21. package/dist/commands/exit-codes.test.d.ts.map +1 -0
  22. package/dist/commands/exit-codes.test.js +20 -0
  23. package/dist/commands/exit-codes.test.js.map +1 -0
  24. package/dist/commands/jobs.js +4 -4
  25. package/dist/commands/jobs.js.map +1 -1
  26. package/dist/commands/logs.js +5 -5
  27. package/dist/commands/logs.js.map +1 -1
  28. package/dist/commands/processors.js +5 -5
  29. package/dist/commands/processors.js.map +1 -1
  30. package/dist/commands/providers.js +3 -3
  31. package/dist/commands/providers.js.map +1 -1
  32. package/dist/commands/query.d.ts +13 -0
  33. package/dist/commands/query.d.ts.map +1 -0
  34. package/dist/commands/query.js +213 -0
  35. package/dist/commands/query.js.map +1 -0
  36. package/dist/commands/review.d.ts.map +1 -1
  37. package/dist/commands/review.js +4 -12
  38. package/dist/commands/review.js.map +1 -1
  39. package/dist/commands/schema.d.ts +6 -0
  40. package/dist/commands/schema.d.ts.map +1 -0
  41. package/dist/commands/schema.js +117 -0
  42. package/dist/commands/schema.js.map +1 -0
  43. package/dist/commands/schema.test.d.ts +2 -0
  44. package/dist/commands/schema.test.d.ts.map +1 -0
  45. package/dist/commands/schema.test.js +23 -0
  46. package/dist/commands/schema.test.js.map +1 -0
  47. package/dist/commands/shortcuts.d.ts.map +1 -1
  48. package/dist/commands/shortcuts.js +40 -27
  49. package/dist/commands/shortcuts.js.map +1 -1
  50. package/dist/commands/step.d.ts +17 -0
  51. package/dist/commands/step.d.ts.map +1 -0
  52. package/dist/commands/step.js +212 -0
  53. package/dist/commands/step.js.map +1 -0
  54. package/dist/commands/tables.js +2 -2
  55. package/dist/commands/tables.js.map +1 -1
  56. package/dist/commands/templates.js +8 -8
  57. package/dist/commands/templates.js.map +1 -1
  58. package/dist/commands/toc.d.ts +12 -0
  59. package/dist/commands/toc.d.ts.map +1 -0
  60. package/dist/commands/toc.js +129 -0
  61. package/dist/commands/toc.js.map +1 -0
  62. package/dist/commands/workflow.d.ts +18 -0
  63. package/dist/commands/workflow.d.ts.map +1 -0
  64. package/dist/commands/workflow.js +340 -0
  65. package/dist/commands/workflow.js.map +1 -0
  66. package/dist/lib/cache.d.ts +91 -0
  67. package/dist/lib/cache.d.ts.map +1 -0
  68. package/dist/lib/cache.js +307 -0
  69. package/dist/lib/cache.js.map +1 -0
  70. package/dist/lib/client.d.ts.map +1 -1
  71. package/dist/lib/client.js +4 -1
  72. package/dist/lib/client.js.map +1 -1
  73. package/dist/lib/config.d.ts +5 -0
  74. package/dist/lib/config.d.ts.map +1 -1
  75. package/dist/lib/config.js +11 -1
  76. package/dist/lib/config.js.map +1 -1
  77. package/dist/lib/dom-emitter.d.ts +14 -0
  78. package/dist/lib/dom-emitter.d.ts.map +1 -0
  79. package/dist/lib/dom-emitter.js +66 -0
  80. package/dist/lib/dom-emitter.js.map +1 -0
  81. package/dist/lib/dom-ops.d.ts +55 -0
  82. package/dist/lib/dom-ops.d.ts.map +1 -0
  83. package/dist/lib/dom-ops.js +93 -0
  84. package/dist/lib/dom-ops.js.map +1 -0
  85. package/dist/lib/output.d.ts +4 -0
  86. package/dist/lib/output.d.ts.map +1 -1
  87. package/dist/lib/output.js +15 -0
  88. package/dist/lib/output.js.map +1 -1
  89. package/dist/lib/pdfquery-adapter.d.ts +43 -0
  90. package/dist/lib/pdfquery-adapter.d.ts.map +1 -0
  91. package/dist/lib/pdfquery-adapter.js +82 -0
  92. package/dist/lib/pdfquery-adapter.js.map +1 -0
  93. package/dist/lib/pdfquery.d.ts +57 -0
  94. package/dist/lib/pdfquery.d.ts.map +1 -0
  95. package/dist/lib/pdfquery.js +101 -0
  96. package/dist/lib/pdfquery.js.map +1 -0
  97. package/dist/lib/progress.d.ts.map +1 -1
  98. package/dist/lib/progress.js +15 -5
  99. package/dist/lib/progress.js.map +1 -1
  100. package/dist/lib/runtime.d.ts +10 -0
  101. package/dist/lib/runtime.d.ts.map +1 -0
  102. package/dist/lib/runtime.js +37 -0
  103. package/dist/lib/runtime.js.map +1 -0
  104. package/dist/lib/sinks/file.d.ts +8 -0
  105. package/dist/lib/sinks/file.d.ts.map +1 -0
  106. package/dist/lib/sinks/file.js +30 -0
  107. package/dist/lib/sinks/file.js.map +1 -0
  108. package/dist/lib/sinks/index.d.ts +6 -0
  109. package/dist/lib/sinks/index.d.ts.map +1 -0
  110. package/dist/lib/sinks/index.js +30 -0
  111. package/dist/lib/sinks/index.js.map +1 -0
  112. package/dist/lib/sinks/partykit.d.ts +14 -0
  113. package/dist/lib/sinks/partykit.d.ts.map +1 -0
  114. package/dist/lib/sinks/partykit.js +124 -0
  115. package/dist/lib/sinks/partykit.js.map +1 -0
  116. package/dist/lib/sinks/stdout.d.ts +6 -0
  117. package/dist/lib/sinks/stdout.d.ts.map +1 -0
  118. package/dist/lib/sinks/stdout.js +9 -0
  119. package/dist/lib/sinks/stdout.js.map +1 -0
  120. package/dist/lib/validator.d.ts +58 -0
  121. package/dist/lib/validator.d.ts.map +1 -0
  122. package/dist/lib/validator.js +181 -0
  123. package/dist/lib/validator.js.map +1 -0
  124. package/package.json +2 -1
@@ -0,0 +1,8 @@
1
+ import type { DomOp, DomOpSink } from '../dom-ops.js';
2
+ export declare class FileSink implements DomOpSink {
3
+ private stream;
4
+ constructor(filePath: string);
5
+ emit(ops: DomOp[]): Promise<void>;
6
+ close(): Promise<void>;
7
+ }
8
+ //# sourceMappingURL=file.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file.d.ts","sourceRoot":"","sources":["../../../src/lib/sinks/file.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAEtD,qBAAa,QAAS,YAAW,SAAS;IACxC,OAAO,CAAC,MAAM,CAAc;gBAEhB,QAAQ,EAAE,MAAM;IAItB,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAWjC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAQ7B"}
@@ -0,0 +1,30 @@
1
+ import { createWriteStream } from 'fs';
2
+ export class FileSink {
3
+ stream;
4
+ constructor(filePath) {
5
+ this.stream = createWriteStream(filePath, { flags: 'a' });
6
+ }
7
+ async emit(ops) {
8
+ for (const op of ops) {
9
+ await new Promise((resolve, reject) => {
10
+ this.stream.write(JSON.stringify(op) + '\n', (err) => {
11
+ if (err)
12
+ reject(err);
13
+ else
14
+ resolve();
15
+ });
16
+ });
17
+ }
18
+ }
19
+ async close() {
20
+ await new Promise((resolve, reject) => {
21
+ this.stream.end((err) => {
22
+ if (err)
23
+ reject(err);
24
+ else
25
+ resolve();
26
+ });
27
+ });
28
+ }
29
+ }
30
+ //# sourceMappingURL=file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file.js","sourceRoot":"","sources":["../../../src/lib/sinks/file.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAoB,MAAM,IAAI,CAAC;AAGzD,MAAM,OAAO,QAAQ;IACX,MAAM,CAAc;IAE5B,YAAY,QAAgB;QAC1B,IAAI,CAAC,MAAM,GAAG,iBAAiB,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;IAC5D,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAAY;QACrB,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;YACrB,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBAC1C,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE;oBACnD,IAAI,GAAG;wBAAE,MAAM,CAAC,GAAG,CAAC,CAAC;;wBAChB,OAAO,EAAE,CAAC;gBACjB,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC1C,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,GAA6B,EAAE,EAAE;gBAChD,IAAI,GAAG;oBAAE,MAAM,CAAC,GAAG,CAAC,CAAC;;oBAChB,OAAO,EAAE,CAAC;YACjB,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;CACF"}
@@ -0,0 +1,6 @@
1
+ import type { DomOpSink } from '../dom-ops.js';
2
+ export { PartyKitSink } from './partykit.js';
3
+ export { StdoutSink } from './stdout.js';
4
+ export { FileSink } from './file.js';
5
+ export declare function parseSinkUrl(url: string): DomOpSink;
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/sinks/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAK/C,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAIrC,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CA2BnD"}
@@ -0,0 +1,30 @@
1
+ import { PartyKitSink } from './partykit.js';
2
+ import { StdoutSink } from './stdout.js';
3
+ import { FileSink } from './file.js';
4
+ export { PartyKitSink } from './partykit.js';
5
+ export { StdoutSink } from './stdout.js';
6
+ export { FileSink } from './file.js';
7
+ const DEFAULT_PARTYKIT_HOST = 'document-tree-party.steventsao.partykit.dev';
8
+ export function parseSinkUrl(url) {
9
+ if (url === 'stdout' || url === '-') {
10
+ return new StdoutSink();
11
+ }
12
+ if (url.startsWith('partykit://')) {
13
+ const parsed = new URL(url);
14
+ const host = parsed.host || DEFAULT_PARTYKIT_HOST;
15
+ const roomId = parsed.pathname.replace(/^\//, '');
16
+ if (!roomId) {
17
+ throw new Error('PartyKit URL must include room ID: partykit://host/room-id');
18
+ }
19
+ return new PartyKitSink(host, roomId);
20
+ }
21
+ if (url.startsWith('file://')) {
22
+ const filePath = url.replace('file://', '');
23
+ return new FileSink(filePath);
24
+ }
25
+ if (url.endsWith('.ndjson') || url.endsWith('.jsonl')) {
26
+ return new FileSink(url);
27
+ }
28
+ throw new Error(`Unknown sink URL format: ${url}. Use partykit://, file://, stdout, or a .ndjson file path`);
29
+ }
30
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/sinks/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAErC,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAErC,MAAM,qBAAqB,GAAG,6CAA6C,CAAC;AAE5E,MAAM,UAAU,YAAY,CAAC,GAAW;IACtC,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,GAAG,EAAE,CAAC;QACpC,OAAO,IAAI,UAAU,EAAE,CAAC;IAC1B,CAAC;IAED,IAAI,GAAG,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QAC5B,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,qBAAqB,CAAC;QAClD,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAElD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;QAChF,CAAC;QAED,OAAO,IAAI,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACxC,CAAC;IAED,IAAI,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QAC5C,OAAO,IAAI,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAChC,CAAC;IAED,IAAI,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QACtD,OAAO,IAAI,QAAQ,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,4BAA4B,GAAG,4DAA4D,CAAC,CAAC;AAC/G,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { DomOp, DomOpSink } from '../dom-ops.js';
2
+ export declare class PartyKitSink implements DomOpSink {
3
+ private host;
4
+ private roomId;
5
+ private nodePathCache;
6
+ constructor(host: string, roomId: string);
7
+ emit(ops: DomOp[]): Promise<void>;
8
+ close(): Promise<void>;
9
+ private toJdomPatches;
10
+ private resolvePath;
11
+ private toJdom;
12
+ private typeToTag;
13
+ }
14
+ //# sourceMappingURL=partykit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"partykit.d.ts","sourceRoot":"","sources":["../../../src/lib/sinks/partykit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,SAAS,EAAa,MAAM,eAAe,CAAC;AAEjE,qBAAa,YAAa,YAAW,SAAS;IAI1C,OAAO,CAAC,IAAI;IACZ,OAAO,CAAC,MAAM;IAJhB,OAAO,CAAC,aAAa,CAA0C;gBAGrD,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM;IAGlB,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAuBjC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAI5B,OAAO,CAAC,aAAa;IAkErB,OAAO,CAAC,WAAW;IASnB,OAAO,CAAC,MAAM;IAYd,OAAO,CAAC,SAAS;CAelB"}
@@ -0,0 +1,124 @@
1
+ export class PartyKitSink {
2
+ host;
3
+ roomId;
4
+ nodePathCache = new Map();
5
+ constructor(host, roomId) {
6
+ this.host = host;
7
+ this.roomId = roomId;
8
+ }
9
+ async emit(ops) {
10
+ const patches = ops.flatMap(op => this.toJdomPatches(op));
11
+ if (patches.length === 0)
12
+ return;
13
+ const url = `https://${this.host}/parties/document/${this.roomId}/tree`;
14
+ const response = await fetch(url, {
15
+ method: 'PATCH',
16
+ headers: { 'Content-Type': 'application/json' },
17
+ body: JSON.stringify({
18
+ patches,
19
+ reason: 'cli-extraction',
20
+ mutatedBy: 'cli',
21
+ mutatedByName: 'OkraPDF CLI'
22
+ })
23
+ });
24
+ if (!response.ok) {
25
+ const text = await response.text();
26
+ throw new Error(`PartyKit PATCH failed: ${response.status} ${text}`);
27
+ }
28
+ }
29
+ async close() {
30
+ this.nodePathCache.clear();
31
+ }
32
+ toJdomPatches(op) {
33
+ switch (op.op) {
34
+ case 'ADD_NODE': {
35
+ const parentPath = this.resolvePath(op.parentId);
36
+ const childPath = [...parentPath, 'children', op.index ?? -1];
37
+ this.nodePathCache.set(op.node.id, [...parentPath, 'children', op.index ?? this.nodePathCache.size]);
38
+ return [{
39
+ op: 'add',
40
+ path: childPath,
41
+ value: this.toJdom(op.node),
42
+ }];
43
+ }
44
+ case 'REMOVE_NODE': {
45
+ const nodePath = this.resolvePath(op.nodeId);
46
+ this.nodePathCache.delete(op.nodeId);
47
+ return [{
48
+ op: 'remove',
49
+ path: nodePath,
50
+ }];
51
+ }
52
+ case 'UPDATE_NODE': {
53
+ const patches = [];
54
+ const nodePath = this.resolvePath(op.nodeId);
55
+ if (op.patch.text !== undefined) {
56
+ patches.push({
57
+ op: 'replace',
58
+ path: [...nodePath, 'textContent'],
59
+ value: op.patch.text,
60
+ });
61
+ }
62
+ if (op.patch.attrs) {
63
+ for (const [key, value] of Object.entries(op.patch.attrs)) {
64
+ patches.push({
65
+ op: 'replace',
66
+ path: [...nodePath, 'attributes', key],
67
+ value,
68
+ });
69
+ }
70
+ }
71
+ return patches;
72
+ }
73
+ case 'SET_TEXT':
74
+ return [{
75
+ op: 'replace',
76
+ path: [...this.resolvePath(op.nodeId), 'textContent'],
77
+ value: op.text,
78
+ }];
79
+ case 'SET_ATTR':
80
+ return [{
81
+ op: 'replace',
82
+ path: [...this.resolvePath(op.nodeId), 'attributes', op.key],
83
+ value: op.value,
84
+ }];
85
+ default:
86
+ return [];
87
+ }
88
+ }
89
+ resolvePath(nodeId) {
90
+ if (!nodeId || nodeId === '')
91
+ return [];
92
+ const cached = this.nodePathCache.get(nodeId);
93
+ if (cached)
94
+ return cached;
95
+ return [nodeId];
96
+ }
97
+ toJdom(node) {
98
+ return {
99
+ id: node.id,
100
+ type: node.type,
101
+ tagName: this.typeToTag(node.type),
102
+ page: node.attrs?.page ?? node.attrs?.num ?? 0,
103
+ textContent: node.text ?? null,
104
+ attributes: node.attrs ?? {},
105
+ children: [],
106
+ };
107
+ }
108
+ typeToTag(type) {
109
+ const map = {
110
+ document: 'article',
111
+ page: 'section',
112
+ table: 'table',
113
+ figure: 'figure',
114
+ paragraph: 'p',
115
+ heading: 'h1',
116
+ footnote: 'aside',
117
+ list: 'ul',
118
+ 'list-item': 'li',
119
+ 'ocr-block': 'div',
120
+ };
121
+ return map[type] ?? 'div';
122
+ }
123
+ }
124
+ //# sourceMappingURL=partykit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"partykit.js","sourceRoot":"","sources":["../../../src/lib/sinks/partykit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { DomOp, DomOpSink } from '../dom-ops.js';
2
+ export declare class StdoutSink implements DomOpSink {
3
+ emit(ops: DomOp[]): Promise<void>;
4
+ close(): Promise<void>;
5
+ }
6
+ //# sourceMappingURL=stdout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stdout.d.ts","sourceRoot":"","sources":["../../../src/lib/sinks/stdout.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAEtD,qBAAa,UAAW,YAAW,SAAS;IACpC,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAMjC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAC7B"}
@@ -0,0 +1,9 @@
1
+ export class StdoutSink {
2
+ async emit(ops) {
3
+ for (const op of ops) {
4
+ console.log(JSON.stringify(op));
5
+ }
6
+ }
7
+ async close() { }
8
+ }
9
+ //# sourceMappingURL=stdout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stdout.js","sourceRoot":"","sources":["../../../src/lib/sinks/stdout.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,UAAU;IACrB,KAAK,CAAC,IAAI,CAAC,GAAY;QACrB,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;YACrB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK,KAAmB,CAAC;CAChC"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Dependency validator with gh-style error messages
3
+ *
4
+ * Validates job existence and status before running commands
5
+ * Pattern: Similar to gh CLI (checks git repo), npm run (checks package.json)
6
+ */
7
+ import { CacheManager } from './cache.js';
8
+ import type { Job, JobStatus } from '../types.js';
9
+ /**
10
+ * Validation error with helpful suggestions
11
+ */
12
+ export declare class ValidationError extends Error {
13
+ readonly suggestions: string[];
14
+ constructor(message: string, suggestions: string[]);
15
+ toString(): string;
16
+ }
17
+ /**
18
+ * Job validation result
19
+ */
20
+ export interface JobValidation {
21
+ exists: boolean;
22
+ status?: JobStatus;
23
+ job?: Job;
24
+ error?: ValidationError;
25
+ }
26
+ /**
27
+ * Validate job ID format
28
+ */
29
+ export declare function isValidJobId(jobId: string): boolean;
30
+ /**
31
+ * Check if job exists (cache OR API)
32
+ */
33
+ export declare function validateJobExists(jobId: string, cache?: CacheManager): Promise<JobValidation>;
34
+ /**
35
+ * Validate job is complete (not pending/running)
36
+ */
37
+ export declare function validateJobComplete(validation: JobValidation): ValidationError | null;
38
+ /**
39
+ * Validate job is ready for query (exists AND complete)
40
+ *
41
+ * This is the main validation function used by query commands
42
+ */
43
+ export declare function validateJobReady(jobId: string, cache?: CacheManager): Promise<{
44
+ valid: true;
45
+ job: Job;
46
+ } | {
47
+ valid: false;
48
+ error: ValidationError;
49
+ }>;
50
+ /**
51
+ * Format validation error for display
52
+ */
53
+ export declare function formatValidationError(error: ValidationError): string;
54
+ /**
55
+ * Throw validation error with formatted message
56
+ */
57
+ export declare function throwValidationError(error: ValidationError): never;
58
+ //# sourceMappingURL=validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../../src/lib/validator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAGlD;;GAEG;AACH,qBAAa,eAAgB,SAAQ,KAAK;aAGtB,WAAW,EAAE,MAAM,EAAE;gBADrC,OAAO,EAAE,MAAM,EACC,WAAW,EAAE,MAAM,EAAE;IAMvC,QAAQ,IAAI,MAAM;CAQnB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,GAAG,CAAC,EAAE,GAAG,CAAC;IACV,KAAK,CAAC,EAAE,eAAe,CAAC;CACzB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAGnD;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,MAAM,EACb,KAAK,CAAC,EAAE,YAAY,GACnB,OAAO,CAAC,aAAa,CAAC,CA4DxB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,aAAa,GAAG,eAAe,GAAG,IAAI,CAgErF;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,MAAM,EACb,KAAK,CAAC,EAAE,YAAY,GACnB,OAAO,CAAC;IAAE,KAAK,EAAE,IAAI,CAAC;IAAC,GAAG,EAAE,GAAG,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,eAAe,CAAA;CAAE,CAAC,CAgB/E;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,CAEpE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,eAAe,GAAG,KAAK,CAGlE"}
@@ -0,0 +1,181 @@
1
+ /**
2
+ * Dependency validator with gh-style error messages
3
+ *
4
+ * Validates job existence and status before running commands
5
+ * Pattern: Similar to gh CLI (checks git repo), npm run (checks package.json)
6
+ */
7
+ import { get, OkraApiError } from './client.js';
8
+ import { CacheManager } from './cache.js';
9
+ import chalk from 'chalk';
10
+ /**
11
+ * Validation error with helpful suggestions
12
+ */
13
+ export class ValidationError extends Error {
14
+ suggestions;
15
+ constructor(message, suggestions) {
16
+ super(message);
17
+ this.suggestions = suggestions;
18
+ this.name = 'ValidationError';
19
+ }
20
+ toString() {
21
+ const lines = [
22
+ chalk.red(`❌ Error: ${this.message}`),
23
+ '',
24
+ ...this.suggestions.map(s => ` ${s}`),
25
+ ];
26
+ return lines.join('\n');
27
+ }
28
+ }
29
+ /**
30
+ * Validate job ID format
31
+ */
32
+ export function isValidJobId(jobId) {
33
+ // Job IDs are typically UUIDs or similar alphanumeric strings
34
+ return /^[a-zA-Z0-9_-]+$/.test(jobId) && jobId.length > 0;
35
+ }
36
+ /**
37
+ * Check if job exists (cache OR API)
38
+ */
39
+ export async function validateJobExists(jobId, cache) {
40
+ // 1. Validate format
41
+ if (!isValidJobId(jobId)) {
42
+ return {
43
+ exists: false,
44
+ error: new ValidationError(`Invalid job ID format: '${jobId}'`, [
45
+ 'Job IDs should be alphanumeric strings (UUIDs or similar)',
46
+ '',
47
+ 'Examples:',
48
+ ' okra query abc123def456 ".table"',
49
+ ' okra query job_2024_01_15_xyz ".currency"',
50
+ ]),
51
+ };
52
+ }
53
+ // 2. Check cache first (fast path)
54
+ const cacheManager = cache || new CacheManager();
55
+ if (cacheManager.hasJob(jobId)) {
56
+ // Job exists in cache
57
+ const cachedJob = cacheManager.getJob(jobId);
58
+ if (cachedJob) {
59
+ return {
60
+ exists: true,
61
+ status: 'completed', // Cached jobs are always completed
62
+ job: cachedJob,
63
+ };
64
+ }
65
+ }
66
+ // 3. Check API (slow path)
67
+ try {
68
+ const job = await get(`api/v1/jobs/${jobId}`);
69
+ return {
70
+ exists: true,
71
+ status: job.status,
72
+ job,
73
+ };
74
+ }
75
+ catch (error) {
76
+ if (error instanceof OkraApiError && error.statusCode === 404) {
77
+ return {
78
+ exists: false,
79
+ error: new ValidationError(`Job '${jobId}' not found`, [
80
+ 'Run one of:',
81
+ ' okra extract myfile.pdf # Create new job',
82
+ ' okra jobs list # List available jobs',
83
+ ]),
84
+ };
85
+ }
86
+ // Re-throw other errors
87
+ throw error;
88
+ }
89
+ }
90
+ /**
91
+ * Validate job is complete (not pending/running)
92
+ */
93
+ export function validateJobComplete(validation) {
94
+ if (!validation.exists || !validation.job) {
95
+ return new ValidationError('Job validation failed', ['Please run validateJobExists first']);
96
+ }
97
+ const status = validation.status || validation.job.status;
98
+ if (status === 'completed') {
99
+ return null; // All good
100
+ }
101
+ // Job exists but not complete
102
+ const statusMessages = {
103
+ queued: {
104
+ message: `Job '${validation.job.job_id || validation.job.id}' is queued (status: queued)`,
105
+ suggestions: [
106
+ 'Try:',
107
+ ` okra jobs get ${validation.job.job_id || validation.job.id} # Check status`,
108
+ ` okra jobs wait ${validation.job.job_id || validation.job.id} # Wait for completion`,
109
+ ],
110
+ },
111
+ pending: {
112
+ message: `Job '${validation.job.job_id || validation.job.id}' is pending (status: pending)`,
113
+ suggestions: [
114
+ 'Try:',
115
+ ` okra jobs get ${validation.job.job_id || validation.job.id} # Check status`,
116
+ ` okra jobs wait ${validation.job.job_id || validation.job.id} # Wait for completion`,
117
+ ],
118
+ },
119
+ running: {
120
+ message: `Job '${validation.job.job_id || validation.job.id}' is still processing (status: running)`,
121
+ suggestions: [
122
+ 'Try:',
123
+ ` okra jobs get ${validation.job.job_id || validation.job.id} # Check status`,
124
+ ` okra jobs wait ${validation.job.job_id || validation.job.id} # Wait for completion`,
125
+ ],
126
+ },
127
+ failed: {
128
+ message: `Job '${validation.job.job_id || validation.job.id}' failed`,
129
+ suggestions: [
130
+ `Error: ${validation.job.error || 'Unknown error'}`,
131
+ '',
132
+ 'Try:',
133
+ ' okra extract myfile.pdf # Create new job',
134
+ ],
135
+ },
136
+ cancelled: {
137
+ message: `Job '${validation.job.job_id || validation.job.id}' was cancelled`,
138
+ suggestions: [
139
+ 'Try:',
140
+ ' okra extract myfile.pdf # Create new job',
141
+ ],
142
+ },
143
+ };
144
+ const { message, suggestions } = statusMessages[status] || {
145
+ message: `Job has unexpected status: ${status}`,
146
+ suggestions: ['Please contact support'],
147
+ };
148
+ return new ValidationError(message, suggestions);
149
+ }
150
+ /**
151
+ * Validate job is ready for query (exists AND complete)
152
+ *
153
+ * This is the main validation function used by query commands
154
+ */
155
+ export async function validateJobReady(jobId, cache) {
156
+ // Check if job exists
157
+ const validation = await validateJobExists(jobId, cache);
158
+ if (!validation.exists || validation.error) {
159
+ return { valid: false, error: validation.error };
160
+ }
161
+ // Check if job is complete
162
+ const completeError = validateJobComplete(validation);
163
+ if (completeError) {
164
+ return { valid: false, error: completeError };
165
+ }
166
+ return { valid: true, job: validation.job };
167
+ }
168
+ /**
169
+ * Format validation error for display
170
+ */
171
+ export function formatValidationError(error) {
172
+ return error.toString();
173
+ }
174
+ /**
175
+ * Throw validation error with formatted message
176
+ */
177
+ export function throwValidationError(error) {
178
+ console.error('\n' + formatValidationError(error) + '\n');
179
+ process.exit(1);
180
+ }
181
+ //# sourceMappingURL=validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validator.js","sourceRoot":"","sources":["../../src/lib/validator.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@okrapdf/cli",
3
- "version": "0.2.10",
3
+ "version": "0.2.12",
4
4
  "description": "OkraPDF command-line interface for PDF extraction and document chat",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -55,6 +55,7 @@
55
55
  "form-data": "^4.0.0",
56
56
  "got": "^14.4.2",
57
57
  "ora": "^8.0.1",
58
+ "pdfquery": "workspace:*",
58
59
  "ws": "^8.18.0"
59
60
  },
60
61
  "optionalDependencies": {