@roj-ai/sdk 0.1.16 → 0.1.17
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/dist/bootstrap.d.ts.map +1 -1
- package/dist/bootstrap.js +12 -2
- package/dist/bootstrap.js.map +1 -1
- package/dist/core/image/types.d.ts +2 -0
- package/dist/core/image/types.d.ts.map +1 -1
- package/dist/core/image/vips-resizer.d.ts.map +1 -1
- package/dist/core/image/vips-resizer.js +12 -11
- package/dist/core/image/vips-resizer.js.map +1 -1
- package/dist/plugins/uploads/preprocessors/image-classifier.d.ts +20 -0
- package/dist/plugins/uploads/preprocessors/image-classifier.d.ts.map +1 -1
- package/dist/plugins/uploads/preprocessors/image-classifier.js +78 -26
- package/dist/plugins/uploads/preprocessors/image-classifier.js.map +1 -1
- package/dist/plugins/uploads/preprocessors/index.d.ts +1 -0
- package/dist/plugins/uploads/preprocessors/index.d.ts.map +1 -1
- package/dist/plugins/uploads/preprocessors/index.js +1 -0
- package/dist/plugins/uploads/preprocessors/index.js.map +1 -1
- package/dist/plugins/uploads/preprocessors/markitdown-preprocessor.d.ts +52 -5
- package/dist/plugins/uploads/preprocessors/markitdown-preprocessor.d.ts.map +1 -1
- package/dist/plugins/uploads/preprocessors/markitdown-preprocessor.js +152 -97
- package/dist/plugins/uploads/preprocessors/markitdown-preprocessor.js.map +1 -1
- package/dist/plugins/uploads/preprocessors/pdf-preprocessor.d.ts +71 -0
- package/dist/plugins/uploads/preprocessors/pdf-preprocessor.d.ts.map +1 -0
- package/dist/plugins/uploads/preprocessors/pdf-preprocessor.js +274 -0
- package/dist/plugins/uploads/preprocessors/pdf-preprocessor.js.map +1 -0
- package/package.json +2 -2
- package/src/bootstrap.ts +12 -2
- package/src/core/image/types.ts +2 -0
- package/src/core/image/vips-resizer.ts +12 -11
- package/src/plugins/uploads/preprocessors/image-classifier.ts +93 -27
- package/src/plugins/uploads/preprocessors/index.ts +1 -0
- package/src/plugins/uploads/preprocessors/markitdown-preprocessor.ts +173 -108
- package/src/plugins/uploads/preprocessors/pdf-preprocessor.ts +342 -0
package/dist/bootstrap.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAA;AAE9D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAA;AAI3D,OAAO,EAAE,SAAS,EAAuC,MAAM,qBAAqB,CAAA;AAEpF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AAGzD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAA;AACpD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAA;AAExE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEzC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAA;AACxE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAA;AACpE,OAAO,EAAE,KAAK,gBAAgB,EAAgB,KAAK,MAAM,EAAE,MAAM,kBAAkB,CAAA;AACnF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAG5D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAA;AAUpD,OAAO,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAA;AAO1D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAEjD;;;GAGG;AACH,QAAA,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6EAgBV,CAAA;AAEV,wDAAwD;AACxD,MAAM,MAAM,oBAAoB,GAAG,gBAAgB,CAAC,OAAO,cAAc,CAAC,CAAA;AAE1E;;GAEG;AACH,MAAM,WAAW,QAAQ;IACxB,UAAU,EAAE,UAAU,CAAA;IACtB,WAAW,EAAE,WAAW,CAAA;IACxB,sFAAsF;IACtF,YAAY,EAAE,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,CAAA;IAC9C,SAAS,CAAC,EAAE,SAAS,CAAA;IACrB,YAAY,EAAE,YAAY,CAAA;IAC1B,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC5B,6EAA6E;IAC7E,aAAa,EAAE,SAAS,CAAA;IACxB,8CAA8C;IAC9C,MAAM,EAAE,MAAM,CAAA;IACd,kDAAkD;IAClD,QAAQ,EAAE,QAAQ,CAAA;IAClB,0DAA0D;IAC1D,oBAAoB,EAAE,oBAAoB,CAAA;IAC1C,uDAAuD;IACvD,QAAQ,EAAE,QAAQ,CAAA;CAClB;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,GAAG,QAAQ,
|
|
1
|
+
{"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":"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"}
|
package/dist/bootstrap.js
CHANGED
|
@@ -11,7 +11,7 @@ import { LLMLogger, LoggingLLMProvider, MockLLMProvider } from './core/llm/index
|
|
|
11
11
|
import { OpenRouterProvider } from './core/llm/openrouter.js';
|
|
12
12
|
import { RoutingLLMProvider } from './core/llm/routing-provider.js';
|
|
13
13
|
import { PreprocessorRegistry } from './plugins/uploads/preprocessor.js';
|
|
14
|
-
import { ImageClassifierPreprocessor, MarkitdownPreprocessor, ZipPreprocessor } from './plugins/uploads/preprocessors/index.js';
|
|
14
|
+
import { ImageClassifierPreprocessor, MarkitdownPreprocessor, PdfPreprocessor, ZipPreprocessor } from './plugins/uploads/preprocessors/index.js';
|
|
15
15
|
import { SessionFileStore } from './core/file-store/file-store.js';
|
|
16
16
|
import { createSystem } from './core/system.js';
|
|
17
17
|
import { ToolExecutor as ToolExecutorImpl } from './core/tools/executor.js';
|
|
@@ -74,7 +74,17 @@ export function bootstrap(config, userConfig, platform) {
|
|
|
74
74
|
const portPool = new PortPool();
|
|
75
75
|
const preprocessorRegistry = new PreprocessorRegistry();
|
|
76
76
|
const imageClassifierGate = new Semaphore(config.imageClassifierConcurrency ?? 10);
|
|
77
|
-
|
|
77
|
+
// Dedicated resizer for the classification path: separate from the LLM
|
|
78
|
+
// provider's general-purpose ImageProcessor (which keeps a higher
|
|
79
|
+
// maxDimension for agent file-inspection tool calls). The classifier
|
|
80
|
+
// hands each image to the resizer with its own 1024px override.
|
|
81
|
+
const classifierImageResizer = new VipsImageResizer({ fs: platform.fs, process: platform.process, tmpDir: platform.tmpDir });
|
|
82
|
+
preprocessorRegistry.register(new ImageClassifierPreprocessor({ llmProvider, logger, fs: platform.fs, gate: imageClassifierGate, imageResizer: classifierImageResizer }));
|
|
83
|
+
// PdfPreprocessor must come before MarkitdownPreprocessor — both could
|
|
84
|
+
// match `application/pdf` in principle, but the registry uses first-hit
|
|
85
|
+
// and PdfPreprocessor's `pdftotext + pdfimages -all + streaming` pipeline
|
|
86
|
+
// is dramatically faster than markitdown's pdfminer.six backend.
|
|
87
|
+
preprocessorRegistry.register(new PdfPreprocessor({ registry: preprocessorRegistry, logger, fs: platform.fs, process: platform.process }));
|
|
78
88
|
preprocessorRegistry.register(new MarkitdownPreprocessor({ registry: preprocessorRegistry, logger, fs: platform.fs, process: platform.process }));
|
|
79
89
|
preprocessorRegistry.register(new ZipPreprocessor({ registry: preprocessorRegistry, logger, process: platform.process }));
|
|
80
90
|
logger.info('Bootstrap complete');
|
package/dist/bootstrap.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AAEzE,OAAO,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAA;AACvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAA;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAC3D,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AACpF,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAA;AAE7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAA;AAInE,OAAO,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAA;AACxE,OAAO,EAAE,2BAA2B,EAAE,sBAAsB,EAAE,eAAe,EAAE,MAAM,0CAA0C,CAAA;
|
|
1
|
+
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,8 @@ import type { FileStore } from '../../core/file-store/types.js';
|
|
|
2
2
|
import type { ToolResultContent } from '../../core/llm/llm-log-types.js';
|
|
3
3
|
export interface ImageResizeOptions {
|
|
4
4
|
maxFileSizeBytes?: number;
|
|
5
|
+
/** Override the resizer's default max dimension (long side, px). */
|
|
6
|
+
maxDimension?: number;
|
|
5
7
|
}
|
|
6
8
|
export interface ImageResizer {
|
|
7
9
|
resize(filePath: string, mimeType: string, options?: ImageResizeOptions): Promise<ImageResizeResult>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/core/image/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAA;AAC3D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAA;AAEpE,MAAM,WAAW,kBAAkB;IAClC,gBAAgB,CAAC,EAAE,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/core/image/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAA;AAC3D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAA;AAEpE,MAAM,WAAW,kBAAkB;IAClC,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,oEAAoE;IACpE,YAAY,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,YAAY;IAC5B,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAA;CACpG;AAED,MAAM,WAAW,iBAAiB;IACjC,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,oBAAoB;IACpC,gBAAgB,EAAE,MAAM,CAAA;CACxB;AAED,MAAM,WAAW,cAAc;IAC9B,cAAc,CAAC,OAAO,EAAE,iBAAiB,EAAE,SAAS,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAA;CAC7F"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vips-resizer.d.ts","sourceRoot":"","sources":["../../../src/core/image/vips-resizer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAClD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAC1D,OAAO,KAAK,EAAE,kBAAkB,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAErF,MAAM,WAAW,uBAAuB;IACvC,EAAE,EAAE,UAAU,CAAA;IACd,OAAO,EAAE,aAAa,CAAA;IACtB,MAAM,EAAE,MAAM,CAAA;IACd,YAAY,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,qBAAa,gBAAiB,YAAW,YAAY;IACpD,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAY;IAC/B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAe;IACvC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAQ;IAC/B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAQ;gBAEzB,OAAO,EAAE,uBAAuB;IAOtC,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"vips-resizer.d.ts","sourceRoot":"","sources":["../../../src/core/image/vips-resizer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAClD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAC1D,OAAO,KAAK,EAAE,kBAAkB,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAErF,MAAM,WAAW,uBAAuB;IACvC,EAAE,EAAE,UAAU,CAAA;IACd,OAAO,EAAE,aAAa,CAAA;IACtB,MAAM,EAAE,MAAM,CAAA;IACd,YAAY,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,qBAAa,gBAAiB,YAAW,YAAY;IACpD,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAY;IAC/B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAe;IACvC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAQ;IAC/B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAQ;gBAEzB,OAAO,EAAE,uBAAuB;IAOtC,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC;YAyB5F,kBAAkB;YAUlB,eAAe;YAuBf,aAAa;CAyC3B"}
|
|
@@ -11,9 +11,10 @@ export class VipsImageResizer {
|
|
|
11
11
|
this.maxDimension = options.maxDimension ?? 8000;
|
|
12
12
|
}
|
|
13
13
|
async resize(filePath, mimeType, options) {
|
|
14
|
+
const effectiveMaxDimension = options?.maxDimension ?? this.maxDimension;
|
|
14
15
|
try {
|
|
15
16
|
// Step 1: Dimension resize if needed
|
|
16
|
-
const result = await this.dimensionResize(filePath, mimeType);
|
|
17
|
+
const result = await this.dimensionResize(filePath, mimeType, effectiveMaxDimension);
|
|
17
18
|
// Step 2: If no size constraint, done
|
|
18
19
|
if (!options?.maxFileSizeBytes)
|
|
19
20
|
return result;
|
|
@@ -25,7 +26,7 @@ export class VipsImageResizer {
|
|
|
25
26
|
if (result.tempFile) {
|
|
26
27
|
await this.fs.unlink(result.tempFile).catch(() => { });
|
|
27
28
|
}
|
|
28
|
-
return await this.compressToFit(filePath, options.maxFileSizeBytes);
|
|
29
|
+
return await this.compressToFit(filePath, options.maxFileSizeBytes, effectiveMaxDimension);
|
|
29
30
|
}
|
|
30
31
|
catch (e) {
|
|
31
32
|
console.warn('[image-resize] failed, using original image:', e instanceof Error ? e.message : e);
|
|
@@ -43,9 +44,9 @@ export class VipsImageResizer {
|
|
|
43
44
|
return null;
|
|
44
45
|
return { width, height };
|
|
45
46
|
}
|
|
46
|
-
async dimensionResize(filePath, mimeType) {
|
|
47
|
+
async dimensionResize(filePath, mimeType, maxDimension) {
|
|
47
48
|
const dims = await this.getImageDimensions(filePath);
|
|
48
|
-
const needsResize = dims !== null && (dims.width >
|
|
49
|
+
const needsResize = dims !== null && (dims.width > maxDimension || dims.height > maxDimension);
|
|
49
50
|
// JPEGs within dimension limits pass through unchanged
|
|
50
51
|
if (mimeType === 'image/jpeg' && !needsResize) {
|
|
51
52
|
return { path: filePath, mimeType };
|
|
@@ -56,19 +57,19 @@ export class VipsImageResizer {
|
|
|
56
57
|
await this.process.execFile('vipsthumbnail', [
|
|
57
58
|
filePath,
|
|
58
59
|
'--size',
|
|
59
|
-
`${
|
|
60
|
+
`${maxDimension}x${maxDimension}`,
|
|
60
61
|
'-o',
|
|
61
62
|
outputPath,
|
|
62
63
|
], { timeout: 30_000 });
|
|
63
64
|
return { path: outputPath, mimeType: 'image/jpeg', tempFile: outputPath };
|
|
64
65
|
}
|
|
65
|
-
async compressToFit(filePath, maxFileSizeBytes) {
|
|
66
|
-
const halfDim = Math.floor(
|
|
66
|
+
async compressToFit(filePath, maxFileSizeBytes, maxDimension) {
|
|
67
|
+
const halfDim = Math.floor(maxDimension / 2);
|
|
67
68
|
const attempts = [
|
|
68
|
-
{ dimension:
|
|
69
|
-
{ dimension:
|
|
70
|
-
{ dimension:
|
|
71
|
-
{ dimension:
|
|
69
|
+
{ dimension: maxDimension, quality: 85 },
|
|
70
|
+
{ dimension: maxDimension, quality: 70 },
|
|
71
|
+
{ dimension: maxDimension, quality: 50 },
|
|
72
|
+
{ dimension: maxDimension, quality: 30 },
|
|
72
73
|
{ dimension: halfDim, quality: 70 },
|
|
73
74
|
{ dimension: halfDim, quality: 50 },
|
|
74
75
|
{ dimension: halfDim, quality: 30 },
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vips-resizer.js","sourceRoot":"","sources":["../../../src/core/image/vips-resizer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAYhC,MAAM,OAAO,gBAAgB;IACX,EAAE,CAAY;IACd,OAAO,CAAe;IACtB,MAAM,CAAQ;IACd,YAAY,CAAQ;IAErC,YAAY,OAAgC;QAC3C,IAAI,CAAC,EAAE,GAAG,OAAO,CAAC,EAAE,CAAA;QACpB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAA;QAC9B,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAA;QAC5B,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,IAAI,CAAA;IACjD,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,QAAgB,EAAE,QAAgB,EAAE,OAA4B;QAC5E,IAAI,CAAC;YACJ,qCAAqC;YACrC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"vips-resizer.js","sourceRoot":"","sources":["../../../src/core/image/vips-resizer.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
* Sends images to a vision-capable LLM for description.
|
|
5
5
|
* Falls back to basic metadata if vision is not available.
|
|
6
6
|
*/
|
|
7
|
+
import type { ImageResizer } from '../../../core/image/types.js';
|
|
7
8
|
import type { LLMProvider } from '../../../core/llm/provider.js';
|
|
8
9
|
import type { Semaphore } from '../../../lib/utils/concurrency.js';
|
|
9
10
|
import type { Result } from '../../../lib/utils/result.js';
|
|
@@ -19,6 +20,14 @@ export interface ImageClassifierConfig {
|
|
|
19
20
|
logger: Logger;
|
|
20
21
|
/** FileSystem adapter (for checking + reading image files) */
|
|
21
22
|
fs: FileSystem;
|
|
23
|
+
/**
|
|
24
|
+
* Optional resizer. When provided, classifier downscales images to
|
|
25
|
+
* ~1024px before sending to the vision LLM. Skipping this is fine for
|
|
26
|
+
* tests; in production it dramatically cuts payload size and token cost
|
|
27
|
+
* (brand PDFs embed 2000–3000px JPEGs the model would otherwise see at
|
|
28
|
+
* full resolution).
|
|
29
|
+
*/
|
|
30
|
+
imageResizer?: ImageResizer;
|
|
22
31
|
/** Whether to skip vision and just return metadata */
|
|
23
32
|
skipVision?: boolean;
|
|
24
33
|
/**
|
|
@@ -40,6 +49,7 @@ export declare class ImageClassifierPreprocessor implements Preprocessor {
|
|
|
40
49
|
private readonly visionModel;
|
|
41
50
|
private readonly logger;
|
|
42
51
|
private readonly fs;
|
|
52
|
+
private readonly imageResizer;
|
|
43
53
|
private readonly skipVision;
|
|
44
54
|
private readonly gate;
|
|
45
55
|
constructor(config: ImageClassifierConfig);
|
|
@@ -49,6 +59,16 @@ export declare class ImageClassifierPreprocessor implements Preprocessor {
|
|
|
49
59
|
* Returns null if vision is not available or fails.
|
|
50
60
|
*/
|
|
51
61
|
private describeImage;
|
|
62
|
+
/**
|
|
63
|
+
* Pre-resize the image for vision classification.
|
|
64
|
+
*
|
|
65
|
+
* Returns either a `data:` URL with the resized JPEG (when a resizer is
|
|
66
|
+
* available) or a `file://` URL fallback (LLM provider will resolve it via
|
|
67
|
+
* the global ImageProcessor, with its bigger maxDimension default).
|
|
68
|
+
*
|
|
69
|
+
* Cleanup removes any temp file produced by the resizer.
|
|
70
|
+
*/
|
|
71
|
+
private prepareImageUrl;
|
|
52
72
|
private formatSize;
|
|
53
73
|
}
|
|
54
74
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"image-classifier.d.ts","sourceRoot":"","sources":["../../../../src/plugins/uploads/preprocessors/image-classifier.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AAEzD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAA;AAC3D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAA;AAEnD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAClD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,+BAA+B,CAAA;AAC3D,OAAO,KAAK,EAAE,YAAY,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;
|
|
1
|
+
{"version":3,"file":"image-classifier.d.ts","sourceRoot":"","sources":["../../../../src/plugins/uploads/preprocessors/image-classifier.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AACzD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AAEzD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAA;AAC3D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAA;AAEnD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAClD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,+BAA+B,CAAA;AAC3D,OAAO,KAAK,EAAE,YAAY,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AAe/F,MAAM,WAAW,qBAAqB;IACrC,wCAAwC;IACxC,WAAW,EAAE,WAAW,CAAA;IACxB,yDAAyD;IACzD,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,8BAA8B;IAC9B,MAAM,EAAE,MAAM,CAAA;IACd,8DAA8D;IAC9D,EAAE,EAAE,UAAU,CAAA;IACd;;;;;;OAMG;IACH,YAAY,CAAC,EAAE,YAAY,CAAA;IAC3B,sDAAsD;IACtD,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB;;;;;OAKG;IACH,IAAI,CAAC,EAAE,SAAS,CAAA;CAChB;AAMD;;;GAGG;AACH,qBAAa,2BAA4B,YAAW,YAAY;IAC/D,QAAQ,CAAC,IAAI,sBAAqB;IAClC,QAAQ,CAAC,kBAAkB,WAAc;IAEzC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAa;IACzC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAQ;IAC/B,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAY;IAC/B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA0B;IACvD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAuB;gBAEhC,MAAM,EAAE,qBAAqB;IAUnC,OAAO,CACZ,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,mBAAmB,GACtB,OAAO,CAAC,MAAM,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;IAmE7C;;;OAGG;YACW,aAAa;IAgD3B;;;;;;;;OAQG;YACW,eAAe;IAgC7B,OAAO,CAAC,UAAU;CAKlB;AAED;;GAEG;AACH,wBAAgB,iCAAiC,CAChD,MAAM,EAAE,qBAAqB,GAC3B,2BAA2B,CAE7B"}
|
|
@@ -6,6 +6,14 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import { ModelId } from '../../../core/llm/schema.js';
|
|
8
8
|
import { Err, Ok } from '../../../lib/utils/result.js';
|
|
9
|
+
/**
|
|
10
|
+
* Anthropic vision API internally downsamples images to ~1568px long side.
|
|
11
|
+
* Anything larger just wastes bandwidth and LLM tokens. For 1–2 sentence
|
|
12
|
+
* descriptions, 1024px is more than enough detail.
|
|
13
|
+
*/
|
|
14
|
+
const CLASSIFY_MAX_DIMENSION = 1024;
|
|
15
|
+
/** Hard cap to keep base64 payloads small (LLM still accepts up to 5MB). */
|
|
16
|
+
const CLASSIFY_MAX_FILE_SIZE_BYTES = 1 * 1024 * 1024;
|
|
9
17
|
// ============================================================================
|
|
10
18
|
// Image Classifier
|
|
11
19
|
// ============================================================================
|
|
@@ -20,6 +28,7 @@ export class ImageClassifierPreprocessor {
|
|
|
20
28
|
visionModel;
|
|
21
29
|
logger;
|
|
22
30
|
fs;
|
|
31
|
+
imageResizer;
|
|
23
32
|
skipVision;
|
|
24
33
|
gate;
|
|
25
34
|
constructor(config) {
|
|
@@ -27,6 +36,7 @@ export class ImageClassifierPreprocessor {
|
|
|
27
36
|
this.visionModel = config.visionModel ? ModelId(config.visionModel) : ModelId('anthropic/claude-haiku-4.5');
|
|
28
37
|
this.logger = config.logger;
|
|
29
38
|
this.fs = config.fs;
|
|
39
|
+
this.imageResizer = config.imageResizer;
|
|
30
40
|
this.skipVision = config.skipVision ?? false;
|
|
31
41
|
this.gate = config.gate;
|
|
32
42
|
}
|
|
@@ -91,33 +101,38 @@ export class ImageClassifierPreprocessor {
|
|
|
91
101
|
*/
|
|
92
102
|
async describeImage(filePath, mimeType) {
|
|
93
103
|
try {
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
104
|
+
const { url: imageUrl, cleanup } = await this.prepareImageUrl(filePath, mimeType);
|
|
105
|
+
try {
|
|
106
|
+
const inferenceCall = () => this.llmProvider.inference({
|
|
107
|
+
model: this.visionModel,
|
|
108
|
+
systemPrompt: 'You are an image description assistant. Describe images concisely in 1-2 sentences.',
|
|
109
|
+
messages: [
|
|
110
|
+
{
|
|
111
|
+
role: 'user',
|
|
112
|
+
content: [
|
|
113
|
+
{
|
|
114
|
+
type: 'text',
|
|
115
|
+
text: 'Please describe this image concisely in 1-2 sentences. Focus on the main subject and any text visible.',
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
type: 'image_url',
|
|
119
|
+
imageUrl: { url: imageUrl },
|
|
120
|
+
},
|
|
121
|
+
],
|
|
122
|
+
},
|
|
123
|
+
],
|
|
124
|
+
maxTokens: 200,
|
|
125
|
+
temperature: 0.3,
|
|
126
|
+
});
|
|
127
|
+
const result = await (this.gate ? this.gate.run(inferenceCall) : inferenceCall());
|
|
128
|
+
if (result.ok && result.value.content) {
|
|
129
|
+
return result.value.content.trim();
|
|
130
|
+
}
|
|
131
|
+
return null;
|
|
132
|
+
}
|
|
133
|
+
finally {
|
|
134
|
+
await cleanup();
|
|
119
135
|
}
|
|
120
|
-
return null;
|
|
121
136
|
}
|
|
122
137
|
catch (error) {
|
|
123
138
|
this.logger.warn('Vision inference failed', {
|
|
@@ -126,6 +141,43 @@ export class ImageClassifierPreprocessor {
|
|
|
126
141
|
return null;
|
|
127
142
|
}
|
|
128
143
|
}
|
|
144
|
+
/**
|
|
145
|
+
* Pre-resize the image for vision classification.
|
|
146
|
+
*
|
|
147
|
+
* Returns either a `data:` URL with the resized JPEG (when a resizer is
|
|
148
|
+
* available) or a `file://` URL fallback (LLM provider will resolve it via
|
|
149
|
+
* the global ImageProcessor, with its bigger maxDimension default).
|
|
150
|
+
*
|
|
151
|
+
* Cleanup removes any temp file produced by the resizer.
|
|
152
|
+
*/
|
|
153
|
+
async prepareImageUrl(filePath, mimeType) {
|
|
154
|
+
if (!this.imageResizer) {
|
|
155
|
+
return { url: `file://${filePath}`, cleanup: async () => { } };
|
|
156
|
+
}
|
|
157
|
+
try {
|
|
158
|
+
const resized = await this.imageResizer.resize(filePath, mimeType, {
|
|
159
|
+
maxDimension: CLASSIFY_MAX_DIMENSION,
|
|
160
|
+
maxFileSizeBytes: CLASSIFY_MAX_FILE_SIZE_BYTES,
|
|
161
|
+
});
|
|
162
|
+
const buffer = await this.fs.readFile(resized.path);
|
|
163
|
+
const base64 = buffer.toString('base64');
|
|
164
|
+
return {
|
|
165
|
+
url: `data:${resized.mimeType};base64,${base64}`,
|
|
166
|
+
cleanup: async () => {
|
|
167
|
+
if (resized.tempFile) {
|
|
168
|
+
await this.fs.unlink(resized.tempFile).catch(() => { });
|
|
169
|
+
}
|
|
170
|
+
},
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
catch (error) {
|
|
174
|
+
this.logger.warn('Pre-resize for classification failed, falling back to file:// URL', {
|
|
175
|
+
filePath,
|
|
176
|
+
error: error instanceof Error ? error.message : String(error),
|
|
177
|
+
});
|
|
178
|
+
return { url: `file://${filePath}`, cleanup: async () => { } };
|
|
179
|
+
}
|
|
180
|
+
}
|
|
129
181
|
formatSize(bytes) {
|
|
130
182
|
if (bytes < 1024)
|
|
131
183
|
return `${bytes}B`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"image-classifier.js","sourceRoot":"","sources":["../../../../src/plugins/uploads/preprocessors/image-classifier.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"image-classifier.js","sourceRoot":"","sources":["../../../../src/plugins/uploads/preprocessors/image-classifier.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,5 +3,6 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export { createImageClassifierPreprocessor, type ImageClassifierConfig, ImageClassifierPreprocessor } from './image-classifier.js';
|
|
5
5
|
export { MarkitdownPreprocessor, type MarkitdownPreprocessorConfig } from './markitdown-preprocessor.js';
|
|
6
|
+
export { PdfPreprocessor, type PdfPreprocessorConfig } from './pdf-preprocessor.js';
|
|
6
7
|
export { ZipPreprocessor, type ZipPreprocessorConfig } from './zip-preprocessor.js';
|
|
7
8
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/plugins/uploads/preprocessors/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,iCAAiC,EAAE,KAAK,qBAAqB,EAAE,2BAA2B,EAAE,MAAM,uBAAuB,CAAA;AAClI,OAAO,EAAE,sBAAsB,EAAE,KAAK,4BAA4B,EAAE,MAAM,8BAA8B,CAAA;AACxG,OAAO,EAAE,eAAe,EAAE,KAAK,qBAAqB,EAAE,MAAM,uBAAuB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/plugins/uploads/preprocessors/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,iCAAiC,EAAE,KAAK,qBAAqB,EAAE,2BAA2B,EAAE,MAAM,uBAAuB,CAAA;AAClI,OAAO,EAAE,sBAAsB,EAAE,KAAK,4BAA4B,EAAE,MAAM,8BAA8B,CAAA;AACxG,OAAO,EAAE,eAAe,EAAE,KAAK,qBAAqB,EAAE,MAAM,uBAAuB,CAAA;AACnF,OAAO,EAAE,eAAe,EAAE,KAAK,qBAAqB,EAAE,MAAM,uBAAuB,CAAA"}
|
|
@@ -3,5 +3,6 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export { createImageClassifierPreprocessor, ImageClassifierPreprocessor } from './image-classifier.js';
|
|
5
5
|
export { MarkitdownPreprocessor } from './markitdown-preprocessor.js';
|
|
6
|
+
export { PdfPreprocessor } from './pdf-preprocessor.js';
|
|
6
7
|
export { ZipPreprocessor } from './zip-preprocessor.js';
|
|
7
8
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/plugins/uploads/preprocessors/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,iCAAiC,EAA8B,2BAA2B,EAAE,MAAM,uBAAuB,CAAA;AAClI,OAAO,EAAE,sBAAsB,EAAqC,MAAM,8BAA8B,CAAA;AACxG,OAAO,EAAE,eAAe,EAA8B,MAAM,uBAAuB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/plugins/uploads/preprocessors/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,iCAAiC,EAA8B,2BAA2B,EAAE,MAAM,uBAAuB,CAAA;AAClI,OAAO,EAAE,sBAAsB,EAAqC,MAAM,8BAA8B,CAAA;AACxG,OAAO,EAAE,eAAe,EAA8B,MAAM,uBAAuB,CAAA;AACnF,OAAO,EAAE,eAAe,EAA8B,MAAM,uBAAuB,CAAA"}
|
|
@@ -2,11 +2,14 @@
|
|
|
2
2
|
* Markitdown Preprocessor
|
|
3
3
|
*
|
|
4
4
|
* Converts documents to markdown using Microsoft's markitdown CLI.
|
|
5
|
-
* Supports
|
|
5
|
+
* Supports DOCX, XLSX, PPTX, HTML, CSV, JSON, XML, EPUB, RTF, ODT.
|
|
6
|
+
*
|
|
7
|
+
* PDFs are handled by `PdfPreprocessor` instead — markitdown's PDF backend
|
|
8
|
+
* (pdfminer.six) is ~20× slower than pdftotext for no real gain on the
|
|
9
|
+
* mostly-unstructured PDFs we see in practice.
|
|
6
10
|
*
|
|
7
11
|
* Image extraction:
|
|
8
|
-
* -
|
|
9
|
-
* - DOCX/ODT/EPUB: uses pandoc --extract-media
|
|
12
|
+
* - DOCX/ODT/EPUB: uses pandoc --extract-media (runs in parallel with markitdown)
|
|
10
13
|
*
|
|
11
14
|
* Extracted images are classified via the image classifier preprocessor.
|
|
12
15
|
* Full content is written to disk; extractedContent contains a structured manifest.
|
|
@@ -17,6 +20,18 @@ import type { ProcessRunner } from '../../../platform/process.js';
|
|
|
17
20
|
import type { FileStore } from '../../../core/file-store/types.js';
|
|
18
21
|
import type { Logger } from '../../../lib/logger/logger.js';
|
|
19
22
|
import type { Preprocessor, PreprocessorContext, PreprocessorRegistry, PreprocessorResult } from '../preprocessor.js';
|
|
23
|
+
/**
|
|
24
|
+
* Density filter for extracted images. Bytes-per-pixel ratio below this
|
|
25
|
+
* threshold typically means the image is an alpha mask, overlay layer, or
|
|
26
|
+
* essentially-empty region — not worth a vision call.
|
|
27
|
+
*
|
|
28
|
+
* Empirical reference points:
|
|
29
|
+
* - Dense photo JPEG: 0.3–1.0 B/px
|
|
30
|
+
* - Logo / icon PNG: 0.1–0.5 B/px
|
|
31
|
+
* - Brand PDF layer mask: <0.005 B/px
|
|
32
|
+
*/
|
|
33
|
+
export declare const MIN_IMAGE_DENSITY_BYTES_PER_PX = 0.05;
|
|
34
|
+
export declare const MIN_IMAGE_PIXELS: number;
|
|
20
35
|
export interface MarkitdownPreprocessorConfig {
|
|
21
36
|
registry: PreprocessorRegistry;
|
|
22
37
|
logger: Logger;
|
|
@@ -29,14 +44,46 @@ export declare class MarkitdownPreprocessor implements Preprocessor {
|
|
|
29
44
|
private readonly registry;
|
|
30
45
|
private readonly logger;
|
|
31
46
|
private readonly fs;
|
|
47
|
+
private readonly processRunner;
|
|
32
48
|
private readonly exec;
|
|
33
49
|
constructor(config: MarkitdownPreprocessorConfig);
|
|
34
50
|
process(filePath: string, mimeType: string, ctx: PreprocessorContext): Promise<Result<PreprocessorResult, Error>>;
|
|
51
|
+
private runMarkitdown;
|
|
35
52
|
private extractImagesWithPandoc;
|
|
36
|
-
private extractImagesWithPdfimages;
|
|
37
53
|
}
|
|
54
|
+
/**
|
|
55
|
+
* Recognized by Anthropic vision API. Other pdfimages outputs (pbm, ppm,
|
|
56
|
+
* jb2e, jp2) are ignored — they'd require local conversion before being
|
|
57
|
+
* useful for classification.
|
|
58
|
+
*/
|
|
59
|
+
export declare const IMAGE_EXT_RE: RegExp;
|
|
38
60
|
export declare function guessImageMime(filename: string): string;
|
|
39
|
-
|
|
61
|
+
/**
|
|
62
|
+
* Reject images that are unlikely to carry useful visual information.
|
|
63
|
+
*
|
|
64
|
+
* `bytesPerPixel` filters out alpha masks, sparse overlays, and essentially-
|
|
65
|
+
* empty pages — brand PDFs typically emit a real photo (~1 B/px) plus a
|
|
66
|
+
* matching transparency/overlay layer at the same dimensions but a fraction
|
|
67
|
+
* of a percent of the size (<0.005 B/px).
|
|
68
|
+
*
|
|
69
|
+
* The minimum pixel count protects against tiny icons whose density alone
|
|
70
|
+
* doesn't disqualify them.
|
|
71
|
+
*/
|
|
72
|
+
export declare function shouldClassifyImage(meta: {
|
|
73
|
+
width: number;
|
|
74
|
+
height: number;
|
|
75
|
+
sizeBytes: number;
|
|
76
|
+
}): boolean;
|
|
77
|
+
/**
|
|
78
|
+
* Read image dimensions via vipsheader. Returns null when the tool isn't
|
|
79
|
+
* available or output is unparseable — caller should treat that as
|
|
80
|
+
* "include without filtering".
|
|
81
|
+
*/
|
|
82
|
+
export declare function getImageDimensions(filePath: string, processRunner: ProcessRunner): Promise<{
|
|
83
|
+
width: number;
|
|
84
|
+
height: number;
|
|
85
|
+
} | null>;
|
|
86
|
+
export declare function classifyExtractedImages(imageStore: FileStore, relativePrefix: string, ctx: PreprocessorContext, registry: PreprocessorRegistry, logger: Logger, fs: FileSystem, processRunner: ProcessRunner): Promise<Array<{
|
|
40
87
|
relativePath: string;
|
|
41
88
|
description: string;
|
|
42
89
|
}>>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"markitdown-preprocessor.d.ts","sourceRoot":"","sources":["../../../../src/plugins/uploads/preprocessors/markitdown-preprocessor.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"markitdown-preprocessor.d.ts","sourceRoot":"","sources":["../../../../src/plugins/uploads/preprocessors/markitdown-preprocessor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAIH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAA;AAEnD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAClD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAC1D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mCAAmC,CAAA;AAClE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,+BAA+B,CAAA;AAC3D,OAAO,KAAK,EAAE,YAAY,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AAKrH;;;;;;;;;GASG;AACH,eAAO,MAAM,8BAA8B,OAAO,CAAA;AAClD,eAAO,MAAM,gBAAgB,QAAU,CAAA;AA2CvC,MAAM,WAAW,4BAA4B;IAC5C,QAAQ,EAAE,oBAAoB,CAAA;IAC9B,MAAM,EAAE,MAAM,CAAA;IACd,EAAE,EAAE,UAAU,CAAA;IACd,OAAO,EAAE,aAAa,CAAA;CACtB;AAED,qBAAa,sBAAuB,YAAW,YAAY;IAC1D,QAAQ,CAAC,IAAI,gBAAe;IAC5B,QAAQ,CAAC,kBAAkB,WAAuB;IAElD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAsB;IAC/C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAQ;IAC/B,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAY;IAC/B,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAe;IAC7C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAkG;gBAE3G,MAAM,EAAE,4BAA4B;IAQ1C,OAAO,CACZ,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,mBAAmB,GACtB,OAAO,CAAC,MAAM,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;YAmD/B,aAAa;YAsCb,uBAAuB;CA8CrC;AAMD;;;;GAIG;AACH,eAAO,MAAM,YAAY,QAA2C,CAAA;AAcpE,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAGvD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAKvG;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CACvC,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,aAAa,GAC1B,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CAgBnD;AAED,wBAAsB,uBAAuB,CAC5C,UAAU,EAAE,SAAS,EACrB,cAAc,EAAE,MAAM,EACtB,GAAG,EAAE,mBAAmB,EACxB,QAAQ,EAAE,oBAAoB,EAC9B,MAAM,EAAE,MAAM,EACd,EAAE,EAAE,UAAU,EACd,aAAa,EAAE,aAAa,GAC1B,OAAO,CAAC,KAAK,CAAC;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAiE/D"}
|