docground 0.1.0

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 (111) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +217 -0
  3. package/dist/src/compiler/zod-compiler.d.ts +31 -0
  4. package/dist/src/compiler/zod-compiler.d.ts.map +1 -0
  5. package/dist/src/compiler/zod-compiler.js +150 -0
  6. package/dist/src/compiler/zod-compiler.js.map +1 -0
  7. package/dist/src/core/extractor.d.ts +17 -0
  8. package/dist/src/core/extractor.d.ts.map +1 -0
  9. package/dist/src/core/extractor.js +268 -0
  10. package/dist/src/core/extractor.js.map +1 -0
  11. package/dist/src/core/types.d.ts +102 -0
  12. package/dist/src/core/types.d.ts.map +1 -0
  13. package/dist/src/core/types.js +2 -0
  14. package/dist/src/core/types.js.map +1 -0
  15. package/dist/src/grounding/bbox.d.ts +40 -0
  16. package/dist/src/grounding/bbox.d.ts.map +1 -0
  17. package/dist/src/grounding/bbox.js +98 -0
  18. package/dist/src/grounding/bbox.js.map +1 -0
  19. package/dist/src/index.d.ts +16 -0
  20. package/dist/src/index.d.ts.map +1 -0
  21. package/dist/src/index.js +16 -0
  22. package/dist/src/index.js.map +1 -0
  23. package/dist/src/normalizers/currency.d.ts +14 -0
  24. package/dist/src/normalizers/currency.d.ts.map +1 -0
  25. package/dist/src/normalizers/currency.js +96 -0
  26. package/dist/src/normalizers/currency.js.map +1 -0
  27. package/dist/src/normalizers/tabular.d.ts +16 -0
  28. package/dist/src/normalizers/tabular.d.ts.map +1 -0
  29. package/dist/src/normalizers/tabular.js +81 -0
  30. package/dist/src/normalizers/tabular.js.map +1 -0
  31. package/dist/src/providers/anthropic-provider.d.ts +13 -0
  32. package/dist/src/providers/anthropic-provider.d.ts.map +1 -0
  33. package/dist/src/providers/anthropic-provider.js +62 -0
  34. package/dist/src/providers/anthropic-provider.js.map +1 -0
  35. package/dist/src/providers/factory.d.ts +11 -0
  36. package/dist/src/providers/factory.d.ts.map +1 -0
  37. package/dist/src/providers/factory.js +32 -0
  38. package/dist/src/providers/factory.js.map +1 -0
  39. package/dist/src/providers/gemini-provider.d.ts +13 -0
  40. package/dist/src/providers/gemini-provider.d.ts.map +1 -0
  41. package/dist/src/providers/gemini-provider.js +48 -0
  42. package/dist/src/providers/gemini-provider.js.map +1 -0
  43. package/dist/src/providers/openai-provider.d.ts +14 -0
  44. package/dist/src/providers/openai-provider.d.ts.map +1 -0
  45. package/dist/src/providers/openai-provider.js +48 -0
  46. package/dist/src/providers/openai-provider.js.map +1 -0
  47. package/dist/src/providers/types.d.ts +45 -0
  48. package/dist/src/providers/types.d.ts.map +1 -0
  49. package/dist/src/providers/types.js +2 -0
  50. package/dist/src/providers/types.js.map +1 -0
  51. package/dist/src/stitcher/table-stitcher.d.ts +19 -0
  52. package/dist/src/stitcher/table-stitcher.d.ts.map +1 -0
  53. package/dist/src/stitcher/table-stitcher.js +129 -0
  54. package/dist/src/stitcher/table-stitcher.js.map +1 -0
  55. package/dist/src/tiling/cutter.d.ts +14 -0
  56. package/dist/src/tiling/cutter.d.ts.map +1 -0
  57. package/dist/src/tiling/cutter.js +46 -0
  58. package/dist/src/tiling/cutter.js.map +1 -0
  59. package/dist/src/tiling/tiler.d.ts +41 -0
  60. package/dist/src/tiling/tiler.d.ts.map +1 -0
  61. package/dist/src/tiling/tiler.js +82 -0
  62. package/dist/src/tiling/tiler.js.map +1 -0
  63. package/dist/src/validators/invariants.d.ts +30 -0
  64. package/dist/src/validators/invariants.d.ts.map +1 -0
  65. package/dist/src/validators/invariants.js +164 -0
  66. package/dist/src/validators/invariants.js.map +1 -0
  67. package/dist/tests/compiler.test.d.ts +2 -0
  68. package/dist/tests/compiler.test.d.ts.map +1 -0
  69. package/dist/tests/compiler.test.js +110 -0
  70. package/dist/tests/compiler.test.js.map +1 -0
  71. package/dist/tests/extractor.test.d.ts +2 -0
  72. package/dist/tests/extractor.test.d.ts.map +1 -0
  73. package/dist/tests/extractor.test.js +195 -0
  74. package/dist/tests/extractor.test.js.map +1 -0
  75. package/dist/tests/fixtures.d.ts +9 -0
  76. package/dist/tests/fixtures.d.ts.map +1 -0
  77. package/dist/tests/fixtures.js +20 -0
  78. package/dist/tests/fixtures.js.map +1 -0
  79. package/dist/tests/grounding.test.d.ts +2 -0
  80. package/dist/tests/grounding.test.d.ts.map +1 -0
  81. package/dist/tests/grounding.test.js +82 -0
  82. package/dist/tests/grounding.test.js.map +1 -0
  83. package/dist/tests/multi-domain.test.d.ts +2 -0
  84. package/dist/tests/multi-domain.test.d.ts.map +1 -0
  85. package/dist/tests/multi-domain.test.js +135 -0
  86. package/dist/tests/multi-domain.test.js.map +1 -0
  87. package/dist/tests/normalizer.test.d.ts +2 -0
  88. package/dist/tests/normalizer.test.d.ts.map +1 -0
  89. package/dist/tests/normalizer.test.js +70 -0
  90. package/dist/tests/normalizer.test.js.map +1 -0
  91. package/dist/tests/providers.test.d.ts +2 -0
  92. package/dist/tests/providers.test.d.ts.map +1 -0
  93. package/dist/tests/providers.test.js +110 -0
  94. package/dist/tests/providers.test.js.map +1 -0
  95. package/dist/tests/stitcher.test.d.ts +2 -0
  96. package/dist/tests/stitcher.test.d.ts.map +1 -0
  97. package/dist/tests/stitcher.test.js +85 -0
  98. package/dist/tests/stitcher.test.js.map +1 -0
  99. package/dist/tests/tiling.test.d.ts +2 -0
  100. package/dist/tests/tiling.test.d.ts.map +1 -0
  101. package/dist/tests/tiling.test.js +85 -0
  102. package/dist/tests/tiling.test.js.map +1 -0
  103. package/dist/tests/validators.test.d.ts +2 -0
  104. package/dist/tests/validators.test.d.ts.map +1 -0
  105. package/dist/tests/validators.test.js +125 -0
  106. package/dist/tests/validators.test.js.map +1 -0
  107. package/dist/vitest.config.d.ts +3 -0
  108. package/dist/vitest.config.d.ts.map +1 -0
  109. package/dist/vitest.config.js +13 -0
  110. package/dist/vitest.config.js.map +1 -0
  111. package/package.json +44 -0
@@ -0,0 +1,129 @@
1
+ function normalizeHeader(h) {
2
+ return h.map((s) => s.trim().toLowerCase()).filter(Boolean);
3
+ }
4
+ function headerSimilarity(a, b) {
5
+ const na = normalizeHeader(a);
6
+ const nb = normalizeHeader(b);
7
+ if (na.length === 0 && nb.length === 0)
8
+ return 1;
9
+ const union = new Set([...na, ...nb]);
10
+ const intersection = na.filter((s) => nb.includes(s));
11
+ return union.size === 0 ? 0 : intersection.length / union.size;
12
+ }
13
+ function tableColCount(table) {
14
+ if (table.header && table.header.length > 0)
15
+ return table.header.length;
16
+ return table.rows.reduce((max, row) => Math.max(max, row.length), 0);
17
+ }
18
+ function horizontalOverlap(a, b) {
19
+ const aXmin = a[1];
20
+ const aXmax = a[3];
21
+ const bXmin = b[1];
22
+ const bXmax = b[3];
23
+ const interMin = Math.max(aXmin, bXmin);
24
+ const interMax = Math.min(aXmax, bXmax);
25
+ if (interMax <= interMin)
26
+ return 0;
27
+ const unionMin = Math.min(aXmin, bXmin);
28
+ const unionMax = Math.max(aXmax, bXmax);
29
+ const union = unionMax - unionMin;
30
+ return union === 0 ? 0 : (interMax - interMin) / union;
31
+ }
32
+ function mergeBboxes(a, b) {
33
+ return [
34
+ Math.min(a[0], b[0]),
35
+ Math.min(a[1], b[1]),
36
+ Math.max(a[2], b[2]),
37
+ Math.max(a[3], b[3]),
38
+ ];
39
+ }
40
+ function rowsEqual(a, b) {
41
+ if (a.length !== b.length)
42
+ return false;
43
+ return a.every((v, i) => v === b[i]);
44
+ }
45
+ function normalizeRow(row) {
46
+ return row.map((v) => String(v).trim().toLowerCase()).filter((s) => s !== "");
47
+ }
48
+ export class TableStitcher {
49
+ opts;
50
+ constructor(options = {}) {
51
+ this.opts = {
52
+ columnCountTolerance: options.columnCountTolerance ?? 0,
53
+ headerSimilarityThreshold: options.headerSimilarityThreshold ?? 0.6,
54
+ horizontalOverlapThreshold: options.horizontalOverlapThreshold ?? 0.6,
55
+ skipRepeatedHeaders: options.skipRepeatedHeaders ?? true,
56
+ };
57
+ }
58
+ canMerge(prev, next) {
59
+ const prevCols = tableColCount(prev);
60
+ const nextCols = tableColCount(next);
61
+ if (Math.abs(prevCols - nextCols) > this.opts.columnCountTolerance) {
62
+ return false;
63
+ }
64
+ const hSim = prev.header && next.header
65
+ ? headerSimilarity(prev.header, next.header)
66
+ : 1;
67
+ if (hSim < this.opts.headerSimilarityThreshold) {
68
+ return false;
69
+ }
70
+ if (horizontalOverlap(prev.bbox, next.bbox) < this.opts.horizontalOverlapThreshold) {
71
+ return false;
72
+ }
73
+ return true;
74
+ }
75
+ stitch(tables) {
76
+ if (tables.length === 0)
77
+ return [];
78
+ const sorted = [...tables].sort((a, b) => a.pageIndex - b.pageIndex);
79
+ const groups = [];
80
+ let current = [sorted[0]];
81
+ for (let i = 1; i < sorted.length; i++) {
82
+ const prev = current[current.length - 1];
83
+ const next = sorted[i];
84
+ if (this.canMerge(prev, next)) {
85
+ current.push(next);
86
+ }
87
+ else {
88
+ groups.push(current);
89
+ current = [next];
90
+ }
91
+ }
92
+ groups.push(current);
93
+ return groups.map((group) => this.mergeGroup(group));
94
+ }
95
+ mergeGroup(group) {
96
+ const first = group[0];
97
+ const merged = {
98
+ pageIndex: first.pageIndex,
99
+ header: first.header ? [...first.header] : undefined,
100
+ rows: [],
101
+ bbox: [...first.bbox],
102
+ html: first.html,
103
+ spans: undefined,
104
+ };
105
+ for (const table of group) {
106
+ let rows = table.rows;
107
+ if (this.opts.skipRepeatedHeaders &&
108
+ merged.header &&
109
+ table.header &&
110
+ rows.length > 0) {
111
+ const firstRow = rows[0];
112
+ if (rowsEqual(normalizeRow(firstRow), normalizeHeader(merged.header))) {
113
+ // First data row of this table is the repeated header; skip it.
114
+ rows = rows.slice(1);
115
+ }
116
+ }
117
+ // Merge spans if present.
118
+ if (table.spans) {
119
+ merged.spans = merged.spans ?? [];
120
+ merged.spans.push(...table.spans);
121
+ }
122
+ merged.rows.push(...rows);
123
+ merged.bbox = mergeBboxes(merged.bbox, table.bbox);
124
+ merged.html = merged.html && table.html ? `${merged.html}\n${table.html}` : merged.html ?? table.html;
125
+ }
126
+ return merged;
127
+ }
128
+ }
129
+ //# sourceMappingURL=table-stitcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table-stitcher.js","sourceRoot":"","sources":["../../../src/stitcher/table-stitcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { PageImage } from "../providers/types.js";
2
+ import type { Tile } from "./tiler.js";
3
+ export declare function getImageMetadata(image: Pick<PageImage, "base64" | "mimeType">): Promise<{
4
+ width: number;
5
+ height: number;
6
+ format: string;
7
+ }>;
8
+ /**
9
+ * Crop a `Tile` out of a full-page `PageImage`.
10
+ *
11
+ * The output keeps the same MIME type when possible, falling back to PNG.
12
+ */
13
+ export declare function cropTile(image: PageImage, tile: Tile): Promise<PageImage>;
14
+ //# sourceMappingURL=cutter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cutter.d.ts","sourceRoot":"","sources":["../../../src/tiling/cutter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAUvC,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,IAAI,CAAC,SAAS,EAAE,QAAQ,GAAG,UAAU,CAAC,GAC5C,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAU5D;AAED;;;;GAIG;AACH,wBAAsB,QAAQ,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,SAAS,CAAC,CA0B/E"}
@@ -0,0 +1,46 @@
1
+ import sharp from "sharp";
2
+ function base64ToBuffer(base64) {
3
+ return Buffer.from(base64, "base64");
4
+ }
5
+ function bufferToBase64(buf) {
6
+ return buf.toString("base64");
7
+ }
8
+ export async function getImageMetadata(image) {
9
+ const meta = await sharp(base64ToBuffer(image.base64)).metadata();
10
+ if (!meta.width || !meta.height) {
11
+ throw new Error("Could not read image metadata");
12
+ }
13
+ return {
14
+ width: meta.width,
15
+ height: meta.height,
16
+ format: meta.format ?? image.mimeType.replace("image/", ""),
17
+ };
18
+ }
19
+ /**
20
+ * Crop a `Tile` out of a full-page `PageImage`.
21
+ *
22
+ * The output keeps the same MIME type when possible, falling back to PNG.
23
+ */
24
+ export async function cropTile(image, tile) {
25
+ const pageW = image.width;
26
+ const pageH = image.height;
27
+ const left = Math.round(tile.bbox[1] * pageW);
28
+ const top = Math.round(tile.bbox[0] * pageH);
29
+ const width = Math.min(pageW - left, Math.round((tile.bbox[3] - tile.bbox[1]) * pageW));
30
+ const height = Math.min(pageH - top, Math.round((tile.bbox[2] - tile.bbox[0]) * pageH));
31
+ if (width <= 0 || height <= 0) {
32
+ throw new Error(`Invalid tile dimensions: ${width}x${height}`);
33
+ }
34
+ const format = image.mimeType === "image/jpeg" ? "jpeg" : "png";
35
+ const buf = await sharp(base64ToBuffer(image.base64))
36
+ .extract({ left, top, width, height })
37
+ .toFormat(format)
38
+ .toBuffer();
39
+ return {
40
+ mimeType: format === "jpeg" ? "image/jpeg" : "image/png",
41
+ base64: bufferToBase64(buf),
42
+ width,
43
+ height,
44
+ };
45
+ }
46
+ //# sourceMappingURL=cutter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cutter.js","sourceRoot":"","sources":["../../../src/tiling/cutter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,SAAS,cAAc,CAAC,MAAc;IACpC,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;AACvC,CAAC;AAED,SAAS,cAAc,CAAC,GAAW;IACjC,OAAO,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AAChC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,KAA6C;IAE7C,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IAClE,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;IACnD,CAAC;IACD,OAAO;QACL,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;KAC5D,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,KAAgB,EAAE,IAAU;IACzD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;IAC1B,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC;IAE3B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC;IAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC;IAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;IACxF,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;IAExF,IAAI,KAAK,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,4BAA4B,KAAK,IAAI,MAAM,EAAE,CAAC,CAAC;IACjE,CAAC;IAED,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,KAAK,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;IAEhE,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;SAClD,OAAO,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;SACrC,QAAQ,CAAC,MAAwB,CAAC;SAClC,QAAQ,EAAE,CAAC;IAEd,OAAO;QACL,QAAQ,EAAE,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,WAAW;QACxD,MAAM,EAAE,cAAc,CAAC,GAAG,CAAC;QAC3B,KAAK;QACL,MAAM;KACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,41 @@
1
+ import type { TileOptions } from "../core/types.js";
2
+ import type { NormalizedBBox } from "../grounding/bbox.js";
3
+ export interface Tile {
4
+ pageIndex: number;
5
+ /** Bounding box in normalized page coordinates [ymin, xmin, ymax, xmax]. */
6
+ bbox: NormalizedBBox;
7
+ /** Always [0, 0, 1, 1] representing the local tile space. */
8
+ localBox: NormalizedBBox;
9
+ row: number;
10
+ col: number;
11
+ rows: number;
12
+ cols: number;
13
+ }
14
+ export interface TilingPlan {
15
+ pageIndex: number;
16
+ pageWidth: number;
17
+ pageHeight: number;
18
+ tiles: Tile[];
19
+ }
20
+ /**
21
+ * Plan a tile grid for a single page.
22
+ *
23
+ * If the page fits within a single tile (respecting maxTileWidth/Height)
24
+ * the returned plan contains exactly one tile covering the whole page.
25
+ */
26
+ export declare function planTiling(pageIndex: number, pageSize: {
27
+ width: number;
28
+ height: number;
29
+ }, options?: TileOptions): TilingPlan;
30
+ /**
31
+ * Convert boxes from a tile's local [0,1] space back to page-normalized space.
32
+ */
33
+ export declare function remapTileBoxes(localBoxes: NormalizedBBox[], tile: Tile): NormalizedBBox[];
34
+ /**
35
+ * Estimate whether a page needs tiling based on its pixel dimensions.
36
+ */
37
+ export declare function needsTiling(pageSize: {
38
+ width: number;
39
+ height: number;
40
+ }, options?: TileOptions): boolean;
41
+ //# sourceMappingURL=tiler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tiler.d.ts","sourceRoot":"","sources":["../../../src/tiling/tiler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D,MAAM,WAAW,IAAI;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,4EAA4E;IAC5E,IAAI,EAAE,cAAc,CAAC;IACrB,6DAA6D;IAC7D,QAAQ,EAAE,cAAc,CAAC;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,IAAI,EAAE,CAAC;CACf;AAoBD;;;;;GAKG;AACH,wBAAgB,UAAU,CACxB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,EAC3C,OAAO,CAAC,EAAE,WAAW,GACpB,UAAU,CA+CZ;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,UAAU,EAAE,cAAc,EAAE,EAC5B,IAAI,EAAE,IAAI,GACT,cAAc,EAAE,CAWlB;AAED;;GAEG;AACH,wBAAgB,WAAW,CACzB,QAAQ,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,EAC3C,OAAO,CAAC,EAAE,WAAW,GACpB,OAAO,CAGT"}
@@ -0,0 +1,82 @@
1
+ const DEFAULT_TILE_WIDTH = 1536;
2
+ const DEFAULT_TILE_HEIGHT = 1536;
3
+ const DEFAULT_OVERLAP = 0.15;
4
+ function withDefaults(options) {
5
+ return {
6
+ maxTileWidth: options?.maxTileWidth ?? DEFAULT_TILE_WIDTH,
7
+ maxTileHeight: options?.maxTileHeight ?? DEFAULT_TILE_HEIGHT,
8
+ overlap: options?.overlap ?? DEFAULT_OVERLAP,
9
+ minPixels: options?.minPixels ?? 1,
10
+ maxPixels: options?.maxPixels ?? 2_000_000,
11
+ };
12
+ }
13
+ function clamp(n, min, max) {
14
+ return Math.max(min, Math.min(max, n));
15
+ }
16
+ /**
17
+ * Plan a tile grid for a single page.
18
+ *
19
+ * If the page fits within a single tile (respecting maxTileWidth/Height)
20
+ * the returned plan contains exactly one tile covering the whole page.
21
+ */
22
+ export function planTiling(pageIndex, pageSize, options) {
23
+ const opts = withDefaults(options);
24
+ const tileW = Math.min(pageSize.width, opts.maxTileWidth);
25
+ const tileH = Math.min(pageSize.height, opts.maxTileHeight);
26
+ const stepW = Math.max(1, Math.floor(tileW * (1 - opts.overlap)));
27
+ const stepH = Math.max(1, Math.floor(tileH * (1 - opts.overlap)));
28
+ const cols = pageSize.width > tileW ? Math.ceil((pageSize.width - tileW) / stepW) + 1 : 1;
29
+ const rows = pageSize.height > tileH ? Math.ceil((pageSize.height - tileH) / stepH) + 1 : 1;
30
+ const tiles = [];
31
+ for (let row = 0; row < rows; row++) {
32
+ for (let col = 0; col < cols; col++) {
33
+ const left = clamp(col * stepW, 0, pageSize.width - tileW);
34
+ const top = clamp(row * stepH, 0, pageSize.height - tileH);
35
+ const right = Math.min(pageSize.width, left + tileW);
36
+ const bottom = Math.min(pageSize.height, top + tileH);
37
+ const bbox = [
38
+ top / pageSize.height,
39
+ left / pageSize.width,
40
+ bottom / pageSize.height,
41
+ right / pageSize.width,
42
+ ];
43
+ tiles.push({
44
+ pageIndex,
45
+ bbox,
46
+ localBox: [0, 0, 1, 1],
47
+ row,
48
+ col,
49
+ rows,
50
+ cols,
51
+ });
52
+ }
53
+ }
54
+ return {
55
+ pageIndex,
56
+ pageWidth: pageSize.width,
57
+ pageHeight: pageSize.height,
58
+ tiles,
59
+ };
60
+ }
61
+ /**
62
+ * Convert boxes from a tile's local [0,1] space back to page-normalized space.
63
+ */
64
+ export function remapTileBoxes(localBoxes, tile) {
65
+ const [tYmin, tXmin, tYmax, tXmax] = tile.bbox;
66
+ const h = tYmax - tYmin;
67
+ const w = tXmax - tXmin;
68
+ return localBoxes.map((b) => [
69
+ tYmin + b[0] * h,
70
+ tXmin + b[1] * w,
71
+ tYmin + b[2] * h,
72
+ tXmin + b[3] * w,
73
+ ]);
74
+ }
75
+ /**
76
+ * Estimate whether a page needs tiling based on its pixel dimensions.
77
+ */
78
+ export function needsTiling(pageSize, options) {
79
+ const opts = withDefaults(options);
80
+ return pageSize.width > opts.maxTileWidth || pageSize.height > opts.maxTileHeight;
81
+ }
82
+ //# sourceMappingURL=tiler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tiler.js","sourceRoot":"","sources":["../../../src/tiling/tiler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ export interface InvariantCheck {
2
+ id: string;
3
+ expression: string;
4
+ tolerance?: number;
5
+ }
6
+ export interface InvariantCheckResult {
7
+ id: string;
8
+ passed: boolean;
9
+ actual?: number;
10
+ expected?: number;
11
+ diff?: number;
12
+ message?: string;
13
+ }
14
+ export interface InvariantReport {
15
+ ok: boolean;
16
+ checks: InvariantCheckResult[];
17
+ discrepancies: Array<{
18
+ id: string;
19
+ actual: number;
20
+ expected: number;
21
+ diff: number;
22
+ }>;
23
+ confidenceScore: number;
24
+ }
25
+ export declare class InvariantEngine {
26
+ private checks;
27
+ addCheck(check: InvariantCheck): this;
28
+ check(data: Record<string, unknown>): InvariantReport;
29
+ }
30
+ //# sourceMappingURL=invariants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invariants.d.ts","sourceRoot":"","sources":["../../../src/validators/invariants.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,oBAAoB,EAAE,CAAC;IAC/B,aAAa,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACrF,eAAe,EAAE,MAAM,CAAC;CACzB;AA8FD,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAwB;IAEtC,QAAQ,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI;IAKrC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,eAAe;CA2EtD"}
@@ -0,0 +1,164 @@
1
+ const DEFAULT_TOLERANCE = 1e-9;
2
+ function getPathValue(obj, path) {
3
+ if (typeof obj !== "object" || obj === null)
4
+ return undefined;
5
+ return obj[path];
6
+ }
7
+ function resolveAggregates(expr, ctx) {
8
+ // sum(items.price)
9
+ let result = expr.replace(/sum\(([^)]+)\)/g, (_, arg) => {
10
+ const [arrName, propName] = arg.split(".").map((s) => s.trim());
11
+ const arr = ctx[arrName];
12
+ if (!Array.isArray(arr))
13
+ return "0";
14
+ const total = arr.reduce((acc, item) => {
15
+ const v = propName ? getPathValue(item, propName) : item;
16
+ return acc + Number(v ?? 0);
17
+ }, 0);
18
+ return String(total);
19
+ });
20
+ // avg(items.price)
21
+ result = result.replace(/avg\(([^)]+)\)/g, (_, arg) => {
22
+ const [arrName, propName] = arg.split(".").map((s) => s.trim());
23
+ const arr = ctx[arrName];
24
+ if (!Array.isArray(arr) || arr.length === 0)
25
+ return "0";
26
+ const total = arr.reduce((acc, item) => {
27
+ const v = propName ? getPathValue(item, propName) : item;
28
+ return acc + Number(v ?? 0);
29
+ }, 0);
30
+ return String(total / arr.length);
31
+ });
32
+ // count(items)
33
+ result = result.replace(/count\(([^)]+)\)/g, (_, arg) => {
34
+ const arr = ctx[arg.trim()];
35
+ return String(Array.isArray(arr) ? arr.length : 0);
36
+ });
37
+ return result;
38
+ }
39
+ function bindVariables(expr, ctx) {
40
+ const keys = Object.keys(ctx).sort((a, b) => b.length - a.length);
41
+ let result = expr;
42
+ for (const key of keys) {
43
+ if (!/^[A-Za-z_$][A-Za-z0-9_$]*$/.test(key))
44
+ continue;
45
+ result = result.replace(new RegExp(`\\b${key}\\b`, "g"), `__ctx[${JSON.stringify(key)}]`);
46
+ }
47
+ return result;
48
+ }
49
+ function evaluate(expr, ctx) {
50
+ const source = `return (${expr});`;
51
+ const fn = new Function("__ctx", source);
52
+ return fn(ctx);
53
+ }
54
+ function splitComparison(expr) {
55
+ const patterns = [
56
+ /===/,
57
+ /==/,
58
+ />=/,
59
+ /<=/,
60
+ />/,
61
+ /</,
62
+ ];
63
+ for (const pattern of patterns) {
64
+ const match = expr.match(new RegExp(`^(.*?)(${pattern.source})(.*)$`));
65
+ if (match) {
66
+ return { left: match[1].trim(), op: match[2].trim(), right: match[3].trim() };
67
+ }
68
+ }
69
+ return null;
70
+ }
71
+ function within(actual, expected, op, tolerance) {
72
+ switch (op) {
73
+ case "===":
74
+ case "==":
75
+ return Math.abs(actual - expected) <= tolerance;
76
+ case ">=":
77
+ return actual >= expected - tolerance;
78
+ case "<=":
79
+ return actual <= expected + tolerance;
80
+ case ">":
81
+ return actual > expected + tolerance;
82
+ case "<":
83
+ return actual < expected - tolerance;
84
+ default:
85
+ return false;
86
+ }
87
+ }
88
+ export class InvariantEngine {
89
+ checks = [];
90
+ addCheck(check) {
91
+ this.checks.push(check);
92
+ return this;
93
+ }
94
+ check(data) {
95
+ const results = [];
96
+ const discrepancies = [];
97
+ for (const check of this.checks) {
98
+ const tolerance = check.tolerance ?? DEFAULT_TOLERANCE;
99
+ const withAggregates = resolveAggregates(check.expression, data);
100
+ const bound = bindVariables(withAggregates, data);
101
+ const comparison = splitComparison(bound);
102
+ let passed = false;
103
+ let actual;
104
+ let expected;
105
+ let diff;
106
+ let message;
107
+ if (comparison) {
108
+ try {
109
+ actual = Number(evaluate(comparison.left, data));
110
+ expected = Number(evaluate(comparison.right, data));
111
+ diff = actual - expected;
112
+ passed = within(actual, expected, comparison.op, tolerance);
113
+ message = passed
114
+ ? undefined
115
+ : `Expected ${comparison.left} ${comparison.op} ${comparison.right}; got ${actual} vs ${expected}`;
116
+ }
117
+ catch (err) {
118
+ passed = false;
119
+ message = `Evaluation error: ${err instanceof Error ? err.message : String(err)}`;
120
+ }
121
+ }
122
+ else {
123
+ try {
124
+ const raw = evaluate(bound, data);
125
+ passed = Boolean(raw);
126
+ actual = Number(raw);
127
+ expected = 1;
128
+ diff = actual - expected;
129
+ message = passed ? undefined : `Expression evaluated to ${raw}`;
130
+ }
131
+ catch (err) {
132
+ passed = false;
133
+ message = `Evaluation error: ${err instanceof Error ? err.message : String(err)}`;
134
+ }
135
+ }
136
+ results.push({
137
+ id: check.id,
138
+ passed,
139
+ actual,
140
+ expected,
141
+ diff,
142
+ message,
143
+ });
144
+ if (!passed && actual !== undefined && expected !== undefined && diff !== undefined) {
145
+ discrepancies.push({
146
+ id: check.id,
147
+ actual,
148
+ expected,
149
+ diff,
150
+ });
151
+ }
152
+ }
153
+ const ok = results.length === 0 || results.every((r) => r.passed);
154
+ const passedCount = results.filter((r) => r.passed).length;
155
+ const totalCount = results.length || 1;
156
+ const penalty = discrepancies.reduce((sum, d) => {
157
+ const expectedAbs = Math.abs(d.expected) || 1;
158
+ return sum + Math.min(Math.abs(d.diff) / expectedAbs, 1);
159
+ }, 0) / totalCount;
160
+ const confidenceScore = Math.max(0, Math.min(1, passedCount / totalCount - penalty));
161
+ return { ok, checks: results, discrepancies, confidenceScore };
162
+ }
163
+ }
164
+ //# sourceMappingURL=invariants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invariants.js","sourceRoot":"","sources":["../../../src/validators/invariants.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=compiler.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compiler.test.d.ts","sourceRoot":"","sources":["../../tests/compiler.test.ts"],"names":[],"mappings":""}