@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,340 @@
1
+ /**
2
+ * Workflow Command - Run and manage workflows
3
+ *
4
+ * Usage:
5
+ * okra workflow list
6
+ * okra workflow describe <workflow-id>
7
+ * okra workflow run --id <workflow-id> --input '{"pdfUrl": "...", "jobId": "..."}'
8
+ * okra workflow status <execution-id>
9
+ *
10
+ * Designed for running complete OCR pipelines.
11
+ */
12
+ import { Command } from 'commander';
13
+ import chalk from 'chalk';
14
+ import { formatOutput, success, error, info } from '../lib/output.js';
15
+ import { post, get, EXIT_CODES } from '../lib/client.js';
16
+ import { withSpinner, pollWithProgress } from '../lib/progress.js';
17
+ /**
18
+ * Create the 'workflow' command group
19
+ */
20
+ export function createWorkflowCommand() {
21
+ const workflow = new Command('workflow')
22
+ .description('Run and manage OCR workflows');
23
+ // okra workflow list
24
+ workflow
25
+ .command('list')
26
+ .description('List available workflows')
27
+ .option('-o, --output <format>', 'Output format (table, json)', 'table')
28
+ .option('--tag <tag>', 'Filter by tag')
29
+ .action(async (options) => {
30
+ try {
31
+ const response = await withSpinner('Fetching workflows', () => get('api/v1/workflow/definitions'));
32
+ let workflows = response.workflows;
33
+ // Filter by tag if specified
34
+ if (options.tag) {
35
+ workflows = workflows.filter((w) => w.tags?.includes(options.tag));
36
+ }
37
+ if (options.output === 'json') {
38
+ console.log(formatOutput(workflows, 'json'));
39
+ }
40
+ else {
41
+ console.log(chalk.bold('\nAvailable Workflows:\n'));
42
+ for (const wf of workflows) {
43
+ console.log(` ${chalk.green(wf.name.padEnd(30))} v${wf.version}`);
44
+ console.log(` ${' '.repeat(30)} ${chalk.cyan(wf.displayName)}`);
45
+ if (wf.description) {
46
+ console.log(` ${' '.repeat(30)} ${chalk.dim(wf.description.slice(0, 60))}...`);
47
+ }
48
+ if (wf.tags && wf.tags.length > 0) {
49
+ console.log(` ${' '.repeat(30)} ${chalk.dim(`Tags: ${wf.tags.join(', ')}`)}`);
50
+ }
51
+ console.log();
52
+ }
53
+ console.log(chalk.dim(`Use 'okra workflow describe <name>' for details`));
54
+ }
55
+ }
56
+ catch (err) {
57
+ error(err.message || 'Failed to list workflows');
58
+ process.exit(EXIT_CODES.GENERAL_ERROR);
59
+ }
60
+ });
61
+ // okra workflow describe <workflow>
62
+ workflow
63
+ .command('describe <workflow>')
64
+ .description('Show detailed info about a workflow')
65
+ .option('-o, --output <format>', 'Output format (table, json)', 'table')
66
+ .action(async (workflowName, options) => {
67
+ try {
68
+ const response = await withSpinner('Fetching workflow', () => get(`api/v1/workflow/definitions/${workflowName}`));
69
+ if (options.output === 'json') {
70
+ console.log(formatOutput(response, 'json'));
71
+ }
72
+ else {
73
+ const wf = response;
74
+ console.log();
75
+ console.log(chalk.bold.cyan(wf.displayName));
76
+ console.log(chalk.dim(`Workflow: ${wf.name} v${wf.version}`));
77
+ console.log();
78
+ if (wf.description) {
79
+ console.log(wf.description);
80
+ console.log();
81
+ }
82
+ // Node flow visualization
83
+ console.log(chalk.bold('Pipeline:'));
84
+ const nodeMap = new Map(wf.nodes.map((n) => [n.id, n]));
85
+ // Simple linear display (for complex DAGs, would need proper topo sort)
86
+ console.log();
87
+ for (let i = 0; i < wf.nodes.length; i++) {
88
+ const node = wf.nodes[i];
89
+ const isLast = i === wf.nodes.length - 1;
90
+ const arrow = isLast ? '' : ' → ';
91
+ process.stdout.write(chalk.green(node.type) + arrow);
92
+ }
93
+ console.log('\n');
94
+ // Node details
95
+ console.log(chalk.bold('Nodes:'));
96
+ for (const node of wf.nodes) {
97
+ console.log(` ${chalk.cyan(node.id)} (${node.type})`);
98
+ if (node.parameters && Object.keys(node.parameters).length > 0) {
99
+ for (const [key, value] of Object.entries(node.parameters)) {
100
+ console.log(` ${chalk.dim(key)}: ${JSON.stringify(value)}`);
101
+ }
102
+ }
103
+ }
104
+ console.log();
105
+ if (wf.tags && wf.tags.length > 0) {
106
+ console.log(chalk.bold('Tags:'), wf.tags.join(', '));
107
+ console.log();
108
+ }
109
+ console.log(chalk.dim(`Run with: okra workflow run --id ${wf.name} --input '{...}'`));
110
+ }
111
+ }
112
+ catch (err) {
113
+ error(err.message || `Workflow '${workflowName}' not found`);
114
+ process.exit(EXIT_CODES.INVALID_ARGS);
115
+ }
116
+ });
117
+ // okra workflow run --id <workflow> --input <json>
118
+ workflow
119
+ .command('run')
120
+ .description('Execute a workflow with input data')
121
+ .requiredOption('--id <workflow>', 'Workflow ID to run')
122
+ .requiredOption('-i, --input <json>', 'Input data as JSON string')
123
+ .option('-j, --job-id <jobId>', 'Custom job ID')
124
+ .option('--no-wait', 'Start workflow without waiting for completion')
125
+ .option('--timeout <seconds>', 'Timeout in seconds (default: 3600)', '3600')
126
+ .option('-o, --output <format>', 'Output format (json, table)', 'json')
127
+ .option('-q, --quiet', 'Only output the result')
128
+ .action(async (options) => {
129
+ try {
130
+ // Parse input JSON
131
+ let input;
132
+ try {
133
+ input = JSON.parse(options.input);
134
+ }
135
+ catch {
136
+ error('Invalid JSON input. Use: --input \'{"key": "value"}\'');
137
+ process.exit(EXIT_CODES.INVALID_ARGS);
138
+ }
139
+ const jobId = options.jobId || `wf-${Date.now()}`;
140
+ // Build request
141
+ const request = {
142
+ workflowId: options.id,
143
+ input,
144
+ jobId,
145
+ };
146
+ if (!options.quiet) {
147
+ info(`Starting workflow: ${options.id}`);
148
+ info(`Job ID: ${jobId}`);
149
+ }
150
+ const response = await withSpinner(options.quiet ? '' : 'Starting workflow', () => post('api/v1/workflow/run', request));
151
+ if (!options.wait) {
152
+ // Return immediately
153
+ if (options.output === 'json') {
154
+ console.log(formatOutput(response, 'json'));
155
+ }
156
+ else {
157
+ success('Workflow started');
158
+ console.log(` Execution ID: ${response.executionId}`);
159
+ console.log(` Job ID: ${response.jobId}`);
160
+ console.log();
161
+ console.log(chalk.dim(`Check status: okra workflow status ${response.executionId}`));
162
+ }
163
+ return;
164
+ }
165
+ // Poll for completion
166
+ const timeoutMs = parseInt(options.timeout, 10) * 1000;
167
+ const startTime = Date.now();
168
+ const result = await pollWithProgress(async () => {
169
+ const status = await get(`api/v1/workflow/executions/${response.executionId}`);
170
+ const done = ['completed', 'failed', 'cancelled'].includes(status.status);
171
+ // Calculate progress from node statuses
172
+ let progress = 0;
173
+ let total = 0;
174
+ if (status.nodeStatuses) {
175
+ total = Object.keys(status.nodeStatuses).length;
176
+ progress = Object.values(status.nodeStatuses).filter((n) => n.status === 'success' || n.status === 'error').length;
177
+ }
178
+ return {
179
+ done,
180
+ progress,
181
+ total: total || undefined,
182
+ data: status,
183
+ };
184
+ }, {
185
+ label: options.quiet ? '' : 'Running workflow',
186
+ interval: 3000,
187
+ timeout: timeoutMs,
188
+ });
189
+ if (result.status === 'failed' && result.error) {
190
+ error(`Workflow failed: ${result.error.message}`);
191
+ if (options.output === 'json') {
192
+ console.log(formatOutput(result, 'json'));
193
+ }
194
+ process.exit(EXIT_CODES.JOB_FAILED);
195
+ }
196
+ if (result.status === 'cancelled') {
197
+ error('Workflow was cancelled');
198
+ process.exit(EXIT_CODES.JOB_FAILED);
199
+ }
200
+ // Success
201
+ if (options.output === 'json') {
202
+ console.log(formatOutput(result, 'json'));
203
+ }
204
+ else {
205
+ console.log();
206
+ success(`Workflow ${options.id} completed`);
207
+ console.log(chalk.dim(`Execution ID: ${response.executionId}`));
208
+ const duration = Date.now() - startTime;
209
+ console.log(chalk.dim(`Duration: ${(duration / 1000).toFixed(1)}s`));
210
+ if (result.nodeStatuses) {
211
+ console.log();
212
+ console.log(chalk.bold('Node Results:'));
213
+ for (const [nodeId, status] of Object.entries(result.nodeStatuses)) {
214
+ const icon = status.status === 'success' ? '✓' : status.status === 'error' ? '✗' : '○';
215
+ const color = status.status === 'success' ? chalk.green : status.status === 'error' ? chalk.red : chalk.dim;
216
+ console.log(` ${color(icon)} ${nodeId}: ${status.status}`);
217
+ }
218
+ }
219
+ if (result.output) {
220
+ console.log();
221
+ console.log(chalk.bold('Output:'));
222
+ console.log(JSON.stringify(result.output, null, 2));
223
+ }
224
+ }
225
+ }
226
+ catch (err) {
227
+ error(err.message || 'Failed to run workflow');
228
+ process.exit(EXIT_CODES.GENERAL_ERROR);
229
+ }
230
+ });
231
+ // okra workflow status <execution-id>
232
+ workflow
233
+ .command('status <executionId>')
234
+ .description('Check status of a workflow execution')
235
+ .option('-o, --output <format>', 'Output format (json, table)', 'table')
236
+ .option('--watch', 'Watch for updates')
237
+ .action(async (executionId, options) => {
238
+ try {
239
+ const fetchStatus = async () => {
240
+ return get(`api/v1/workflow/executions/${executionId}`);
241
+ };
242
+ if (options.watch) {
243
+ // Continuous watch mode
244
+ console.log(chalk.dim('Watching execution (Ctrl+C to stop)...\n'));
245
+ let lastStatus = '';
246
+ while (true) {
247
+ const status = await fetchStatus();
248
+ // Only print if status changed
249
+ const statusStr = JSON.stringify(status.nodeStatuses);
250
+ if (statusStr !== lastStatus) {
251
+ console.clear();
252
+ printStatus(status);
253
+ lastStatus = statusStr;
254
+ }
255
+ if (['completed', 'failed', 'cancelled'].includes(status.status)) {
256
+ break;
257
+ }
258
+ await new Promise((r) => setTimeout(r, 2000));
259
+ }
260
+ }
261
+ else {
262
+ const status = await withSpinner('Fetching status', fetchStatus);
263
+ if (options.output === 'json') {
264
+ console.log(formatOutput(status, 'json'));
265
+ }
266
+ else {
267
+ printStatus(status);
268
+ }
269
+ }
270
+ }
271
+ catch (err) {
272
+ error(err.message || 'Failed to get status');
273
+ process.exit(EXIT_CODES.GENERAL_ERROR);
274
+ }
275
+ });
276
+ return workflow;
277
+ }
278
+ function printStatus(status) {
279
+ console.log();
280
+ console.log(chalk.bold(`Workflow Execution: ${status.executionId}`));
281
+ console.log();
282
+ // Overall status
283
+ const statusColor = status.status === 'completed'
284
+ ? chalk.green
285
+ : status.status === 'failed'
286
+ ? chalk.red
287
+ : status.status === 'cancelled'
288
+ ? chalk.yellow
289
+ : chalk.cyan;
290
+ console.log(`Status: ${statusColor(status.status.toUpperCase())}`);
291
+ console.log(`Job ID: ${status.jobId}`);
292
+ console.log(`Workflow: ${status.workflowId}`);
293
+ if (status.startedAt) {
294
+ console.log(`Started: ${status.startedAt}`);
295
+ }
296
+ if (status.completedAt) {
297
+ console.log(`Completed: ${status.completedAt}`);
298
+ }
299
+ // Node statuses
300
+ if (status.nodeStatuses && Object.keys(status.nodeStatuses).length > 0) {
301
+ console.log();
302
+ console.log(chalk.bold('Nodes:'));
303
+ for (const [nodeId, nodeStatus] of Object.entries(status.nodeStatuses)) {
304
+ const icon = nodeStatus.status === 'success'
305
+ ? chalk.green('✓')
306
+ : nodeStatus.status === 'error'
307
+ ? chalk.red('✗')
308
+ : nodeStatus.status === 'running'
309
+ ? chalk.cyan('◌')
310
+ : chalk.dim('○');
311
+ let progressStr = '';
312
+ if (nodeStatus.progress) {
313
+ const pct = nodeStatus.progress.total
314
+ ? Math.round((nodeStatus.progress.current / nodeStatus.progress.total) * 100)
315
+ : 0;
316
+ progressStr = chalk.dim(` (${nodeStatus.progress.current}/${nodeStatus.progress.total || '?'} - ${pct}%)`);
317
+ }
318
+ console.log(` ${icon} ${nodeId}: ${nodeStatus.status}${progressStr}`);
319
+ }
320
+ }
321
+ // Error
322
+ if (status.error) {
323
+ console.log();
324
+ console.log(chalk.red(`Error: ${status.error.message}`));
325
+ }
326
+ // Output preview
327
+ if (status.output) {
328
+ console.log();
329
+ console.log(chalk.bold('Output:'));
330
+ const outputStr = JSON.stringify(status.output, null, 2);
331
+ if (outputStr.length > 500) {
332
+ console.log(outputStr.slice(0, 500) + '...');
333
+ }
334
+ else {
335
+ console.log(outputStr);
336
+ }
337
+ }
338
+ }
339
+ export default createWorkflowCommand;
340
+ //# sourceMappingURL=workflow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow.js","sourceRoot":"","sources":["../../src/commands/workflow.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,91 @@
1
+ /**
2
+ * Local cache for OCR job data
3
+ *
4
+ * Caches VirtualDoc data locally for fast jQuery-style queries
5
+ * Pattern: Similar to gemini sessions (JSONL) and opencode storage (hash-based dirs)
6
+ */
7
+ import type { JobResults } from '../types.js';
8
+ export interface TocResult {
9
+ toc: Array<{
10
+ level: number;
11
+ title: string;
12
+ page: number;
13
+ entity_id?: string;
14
+ confidence?: number;
15
+ }>;
16
+ total_entries: number;
17
+ }
18
+ /**
19
+ * Cache manager for local job data storage
20
+ */
21
+ export declare class CacheManager {
22
+ private cacheRoot;
23
+ private currentSessionFile;
24
+ constructor(cacheRoot?: string);
25
+ /**
26
+ * Ensure cache directory structure exists
27
+ */
28
+ private ensureCacheDirectories;
29
+ /**
30
+ * Get cached job data (VirtualDoc)
31
+ */
32
+ getJob(jobId: string): JobResults | null;
33
+ /**
34
+ * Cache job data (VirtualDoc)
35
+ */
36
+ setJob(jobId: string, jobData: JobResults, ttl?: number): void;
37
+ /**
38
+ * Check if job exists in cache
39
+ */
40
+ hasJob(jobId: string): boolean;
41
+ /**
42
+ * Check if cached job is stale (expired)
43
+ */
44
+ isJobStale(jobId: string, ttl?: number): boolean;
45
+ /**
46
+ * Get cached TOC data
47
+ */
48
+ getToc(jobId: string): TocResult | null;
49
+ /**
50
+ * Cache TOC data
51
+ */
52
+ setToc(jobId: string, toc: TocResult): void;
53
+ /**
54
+ * Get or create current session file path
55
+ */
56
+ getCurrentSession(): string;
57
+ /**
58
+ * Log command to session history (gemini-style JSONL)
59
+ */
60
+ logCommand(command: string, jobId: string, args?: any): void;
61
+ /**
62
+ * Log result to session history
63
+ */
64
+ logResult(success: boolean, data?: any, error?: string): void;
65
+ /**
66
+ * Append entry to session JSONL file
67
+ */
68
+ private appendToSession;
69
+ /**
70
+ * Clear cache for specific job or all jobs
71
+ */
72
+ clear(jobId?: string): void;
73
+ /**
74
+ * Clear stale cache entries older than TTL
75
+ */
76
+ clearStale(ttl?: number): void;
77
+ /**
78
+ * Get cache statistics
79
+ */
80
+ getStats(): {
81
+ totalJobs: number;
82
+ totalSize: number;
83
+ oldestEntry: number | null;
84
+ newestEntry: number | null;
85
+ };
86
+ }
87
+ /**
88
+ * Get default cache manager instance
89
+ */
90
+ export declare function getCacheManager(): CacheManager;
91
+ //# sourceMappingURL=cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/lib/cache.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AA+B9C,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,KAAK,CAAC;QACT,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC,CAAC;IACH,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,kBAAkB,CAAuB;gBAErC,SAAS,CAAC,EAAE,MAAM;IAK9B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAgB9B;;OAEG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IAgBxC;;OAEG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI;IAoB9D;;OAEG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAK9B;;OAEG;IACH,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO;IAoBhD;;OAEG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;IAgBvC;;OAEG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,GAAG,IAAI;IAW3C;;OAEG;IACH,iBAAiB,IAAI,MAAM;IAQ3B;;OAEG;IACH,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,GAAE,GAAQ,GAAG,IAAI;IAYhE;;OAEG;IACH,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,GAAE,GAAQ,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI;IAYjE;;OAEG;IACH,OAAO,CAAC,eAAe;IAiBvB;;OAEG;IACH,KAAK,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI;IAmC3B;;OAEG;IACH,UAAU,CAAC,GAAG,GAAE,MAAuB,GAAG,IAAI;IAwB9C;;OAEG;IACH,QAAQ,IAAI;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE;CAwC7G;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,YAAY,CAE9C"}