@cesarandreslopez/occ 0.5.0 → 0.6.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 (84) hide show
  1. package/README.md +16 -0
  2. package/dist/src/cli.d.ts +21 -0
  3. package/dist/src/cli.js +76 -2
  4. package/dist/src/cli.js.map +1 -1
  5. package/dist/src/code/build.d.ts +2 -1
  6. package/dist/src/code/build.js +6 -2
  7. package/dist/src/code/build.js.map +1 -1
  8. package/dist/src/code/cache.d.ts +13 -0
  9. package/dist/src/code/cache.js +57 -0
  10. package/dist/src/code/cache.js.map +1 -0
  11. package/dist/src/code/chunk.d.ts +25 -0
  12. package/dist/src/code/chunk.js +123 -0
  13. package/dist/src/code/chunk.js.map +1 -0
  14. package/dist/src/code/command.js +25 -2
  15. package/dist/src/code/command.js.map +1 -1
  16. package/dist/src/code/output.d.ts +2 -0
  17. package/dist/src/code/output.js +20 -0
  18. package/dist/src/code/output.js.map +1 -1
  19. package/dist/src/code/parsers.js +76 -6
  20. package/dist/src/code/parsers.js.map +1 -1
  21. package/dist/src/code/query.d.ts +48 -1
  22. package/dist/src/code/query.js +206 -0
  23. package/dist/src/code/query.js.map +1 -1
  24. package/dist/src/code/types.d.ts +30 -0
  25. package/dist/src/code/types.js +6 -0
  26. package/dist/src/code/types.js.map +1 -1
  27. package/dist/src/doc/batch.d.ts +17 -0
  28. package/dist/src/doc/batch.js +97 -0
  29. package/dist/src/doc/batch.js.map +1 -0
  30. package/dist/src/doc/command.js +57 -0
  31. package/dist/src/doc/command.js.map +1 -1
  32. package/dist/src/doc/discover.d.ts +10 -0
  33. package/dist/src/doc/discover.js +65 -0
  34. package/dist/src/doc/discover.js.map +1 -0
  35. package/dist/src/doc/entities.d.ts +27 -0
  36. package/dist/src/doc/entities.js +102 -0
  37. package/dist/src/doc/entities.js.map +1 -0
  38. package/dist/src/doc/references.d.ts +20 -0
  39. package/dist/src/doc/references.js +112 -0
  40. package/dist/src/doc/references.js.map +1 -0
  41. package/dist/src/inspect/shared.js +2 -2
  42. package/dist/src/inspect/shared.js.map +1 -1
  43. package/dist/src/markdown/convert.d.ts +1 -1
  44. package/dist/src/markdown/convert.js +54 -2
  45. package/dist/src/markdown/convert.js.map +1 -1
  46. package/dist/src/output/json.js +9 -0
  47. package/dist/src/output/json.js.map +1 -1
  48. package/dist/src/output/tabular.js +18 -10
  49. package/dist/src/output/tabular.js.map +1 -1
  50. package/dist/src/parsers/docx.js +5 -0
  51. package/dist/src/parsers/docx.js.map +1 -1
  52. package/dist/src/parsers/index.d.ts +1 -0
  53. package/dist/src/parsers/index.js +28 -3
  54. package/dist/src/parsers/index.js.map +1 -1
  55. package/dist/src/parsers/odf.js +15 -1
  56. package/dist/src/parsers/odf.js.map +1 -1
  57. package/dist/src/parsers/pdf.js +4 -0
  58. package/dist/src/parsers/pdf.js.map +1 -1
  59. package/dist/src/parsers/pptx.js +4 -0
  60. package/dist/src/parsers/pptx.js.map +1 -1
  61. package/dist/src/parsers/xlsx.js +5 -0
  62. package/dist/src/parsers/xlsx.js.map +1 -1
  63. package/dist/src/progress-event.d.ts +7 -0
  64. package/dist/src/progress-event.js +2 -0
  65. package/dist/src/progress-event.js.map +1 -0
  66. package/dist/src/stats.d.ts +4 -1
  67. package/dist/src/stats.js +18 -8
  68. package/dist/src/stats.js.map +1 -1
  69. package/dist/src/structure/extract.d.ts +2 -0
  70. package/dist/src/structure/extract.js +16 -0
  71. package/dist/src/structure/extract.js.map +1 -1
  72. package/dist/src/structure/index.d.ts +1 -1
  73. package/dist/src/structure/index.js +1 -1
  74. package/dist/src/structure/index.js.map +1 -1
  75. package/dist/src/structure/types.d.ts +2 -0
  76. package/dist/src/structure/types.js +4 -0
  77. package/dist/src/structure/types.js.map +1 -1
  78. package/dist/src/tokens.d.ts +16 -0
  79. package/dist/src/tokens.js +107 -0
  80. package/dist/src/tokens.js.map +1 -0
  81. package/dist/src/types.d.ts +10 -0
  82. package/dist/src/types.js +3 -0
  83. package/dist/src/types.js.map +1 -1
  84. package/package.json +100 -8
@@ -0,0 +1,65 @@
1
+ import fg from 'fast-glob';
2
+ import { readFile, stat } from 'node:fs/promises';
3
+ import path from 'node:path';
4
+ const DOCUMENT_EXTENSIONS = ['docx', 'pdf', 'pptx', 'xlsx', 'odt', 'ods', 'odp'];
5
+ function isDocumentFormat(ext) {
6
+ return DOCUMENT_EXTENSIONS.includes(ext);
7
+ }
8
+ async function loadGitignorePatterns(rootDir) {
9
+ try {
10
+ const content = await readFile(path.join(rootDir, '.gitignore'), 'utf8');
11
+ return content
12
+ .split(/\r?\n/)
13
+ .map(line => line.trim())
14
+ .filter(line => line.length > 0 && !line.startsWith('#') && !line.startsWith('!'))
15
+ .map(line => {
16
+ const normalized = line.replace(/^\//, '').split(path.sep).join('/');
17
+ if (normalized.endsWith('/'))
18
+ return `${normalized}**`;
19
+ return normalized;
20
+ });
21
+ }
22
+ catch {
23
+ return [];
24
+ }
25
+ }
26
+ export async function discoverDocuments(rootDir, options) {
27
+ const resolvedRoot = path.resolve(rootDir);
28
+ const excludeDir = options?.excludeDir ?? ['node_modules', '.git', 'dist', 'vendor', 'build', 'coverage', 'target'];
29
+ const maxSizeBytes = options?.maxSizeBytes ?? 50 * 1024 * 1024; // 50MB
30
+ const ignore = [
31
+ ...excludeDir.flatMap(dir => [`**/${dir}/**`]),
32
+ ...await loadGitignorePatterns(resolvedRoot),
33
+ ];
34
+ const pattern = `**/*.{${DOCUMENT_EXTENSIONS.join(',')}}`;
35
+ const discovered = await fg(pattern, {
36
+ cwd: resolvedRoot,
37
+ absolute: true,
38
+ onlyFiles: true,
39
+ dot: false,
40
+ followSymbolicLinks: false,
41
+ ignore,
42
+ });
43
+ const documents = [];
44
+ for (const filePath of discovered.sort()) {
45
+ try {
46
+ const fileStat = await stat(filePath);
47
+ if (!fileStat.isFile() || fileStat.size > maxSizeBytes)
48
+ continue;
49
+ const ext = path.extname(filePath).toLowerCase().replace('.', '');
50
+ if (!isDocumentFormat(ext))
51
+ continue;
52
+ documents.push({
53
+ filePath,
54
+ relativePath: path.relative(resolvedRoot, filePath).split(path.sep).join('/'),
55
+ format: ext,
56
+ sizeBytes: fileStat.size,
57
+ });
58
+ }
59
+ catch {
60
+ // Skip files that disappear during discovery
61
+ }
62
+ }
63
+ return documents;
64
+ }
65
+ //# sourceMappingURL=discover.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discover.js","sourceRoot":"","sources":["../../../src/doc/discover.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Light entity extraction — regex-based pattern matching + TF-IDF keyword extraction.
3
+ */
4
+ export interface ExtractedEntity {
5
+ type: 'email' | 'url' | 'date' | 'phone' | 'mention';
6
+ value: string;
7
+ position: number;
8
+ context: string;
9
+ }
10
+ export interface KeywordScore {
11
+ term: string;
12
+ tfidf: number;
13
+ tf: number;
14
+ idf: number;
15
+ }
16
+ export interface EntityExtractionResult {
17
+ entities: ExtractedEntity[];
18
+ keywords: KeywordScore[];
19
+ }
20
+ /** Extract entities (emails, URLs, dates, phone numbers, @mentions) from text */
21
+ export declare function extractEntities(text: string): ExtractedEntity[];
22
+ /** Extract keywords using TF-IDF across a batch of documents */
23
+ export declare function extractKeywords(texts: string[], topK?: number): KeywordScore[][];
24
+ /** Single-document keyword extraction (IDF is 1 for all terms, falls back to TF) */
25
+ export declare function extractKeywordsSingle(text: string, topK?: number): KeywordScore[];
26
+ /** Full entity extraction: entities + keywords for a single document */
27
+ export declare function extractDocumentEntities(text: string, topK?: number): EntityExtractionResult;
@@ -0,0 +1,102 @@
1
+ /**
2
+ * Light entity extraction — regex-based pattern matching + TF-IDF keyword extraction.
3
+ */
4
+ const ENTITY_PATTERNS = [
5
+ { type: 'email', pattern: /[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/g },
6
+ { type: 'url', pattern: /https?:\/\/[^\s)<>]+/g },
7
+ { type: 'date', pattern: /\b\d{4}-\d{2}-\d{2}\b/g },
8
+ { type: 'date', pattern: /\b\d{1,2}\/\d{1,2}\/\d{2,4}\b/g },
9
+ { type: 'phone', pattern: /(?:\+\d{1,3}[\s-]?)?\(?\d{3}\)?[\s.-]?\d{3}[\s.-]?\d{4}\b/g },
10
+ { type: 'mention', pattern: /@[a-zA-Z0-9_-]+/g },
11
+ ];
12
+ const CONTEXT_WINDOW = 40;
13
+ function extractContext(text, position, length) {
14
+ const start = Math.max(0, position - CONTEXT_WINDOW);
15
+ const end = Math.min(text.length, position + length + CONTEXT_WINDOW);
16
+ let context = text.slice(start, end).replace(/\n/g, ' ');
17
+ if (start > 0)
18
+ context = '...' + context;
19
+ if (end < text.length)
20
+ context = context + '...';
21
+ return context;
22
+ }
23
+ /** Extract entities (emails, URLs, dates, phone numbers, @mentions) from text */
24
+ export function extractEntities(text) {
25
+ const entities = [];
26
+ const seen = new Set();
27
+ for (const { type, pattern } of ENTITY_PATTERNS) {
28
+ const regex = new RegExp(pattern.source, pattern.flags);
29
+ let match;
30
+ while ((match = regex.exec(text)) !== null) {
31
+ const key = `${type}:${match[0]}:${match.index}`;
32
+ if (seen.has(key))
33
+ continue;
34
+ seen.add(key);
35
+ entities.push({
36
+ type,
37
+ value: match[0],
38
+ position: match.index,
39
+ context: extractContext(text, match.index, match[0].length),
40
+ });
41
+ }
42
+ }
43
+ return entities.sort((a, b) => a.position - b.position);
44
+ }
45
+ const STOP_WORDS = new Set([
46
+ 'the', 'be', 'to', 'of', 'and', 'a', 'in', 'that', 'have', 'i',
47
+ 'it', 'for', 'not', 'on', 'with', 'he', 'as', 'you', 'do', 'at',
48
+ 'this', 'but', 'his', 'by', 'from', 'they', 'we', 'say', 'her', 'she',
49
+ 'or', 'an', 'will', 'my', 'one', 'all', 'would', 'there', 'their', 'what',
50
+ 'so', 'up', 'out', 'if', 'about', 'who', 'get', 'which', 'go', 'me',
51
+ 'when', 'make', 'can', 'like', 'time', 'no', 'just', 'him', 'know', 'take',
52
+ 'is', 'are', 'was', 'were', 'been', 'being', 'has', 'had', 'having',
53
+ 'does', 'did', 'doing', 'am', 'its', 'than', 'also', 'into', 'could',
54
+ 'may', 'should', 'each', 'other', 'then', 'them', 'these', 'some',
55
+ ]);
56
+ function tokenize(text) {
57
+ return text.toLowerCase().split(/[^a-zA-Z0-9]+/).filter(w => w.length > 2 && !STOP_WORDS.has(w));
58
+ }
59
+ /** Extract keywords using TF-IDF across a batch of documents */
60
+ export function extractKeywords(texts, topK = 20) {
61
+ const docCount = texts.length;
62
+ const allTokenized = texts.map(tokenize);
63
+ // Document frequency
64
+ const df = new Map();
65
+ for (const tokens of allTokenized) {
66
+ const unique = new Set(tokens);
67
+ for (const term of unique) {
68
+ df.set(term, (df.get(term) ?? 0) + 1);
69
+ }
70
+ }
71
+ return allTokenized.map(tokens => {
72
+ // Term frequency for this document
73
+ const tf = new Map();
74
+ for (const term of tokens) {
75
+ tf.set(term, (tf.get(term) ?? 0) + 1);
76
+ }
77
+ const scores = [];
78
+ for (const [term, count] of tf) {
79
+ const termFreq = count / tokens.length;
80
+ const inverseDocFreq = Math.log(docCount / (df.get(term) ?? 1));
81
+ scores.push({
82
+ term,
83
+ tfidf: termFreq * inverseDocFreq,
84
+ tf: termFreq,
85
+ idf: inverseDocFreq,
86
+ });
87
+ }
88
+ return scores.sort((a, b) => b.tfidf - a.tfidf).slice(0, topK);
89
+ });
90
+ }
91
+ /** Single-document keyword extraction (IDF is 1 for all terms, falls back to TF) */
92
+ export function extractKeywordsSingle(text, topK = 20) {
93
+ return extractKeywords([text], topK)[0];
94
+ }
95
+ /** Full entity extraction: entities + keywords for a single document */
96
+ export function extractDocumentEntities(text, topK = 20) {
97
+ return {
98
+ entities: extractEntities(text),
99
+ keywords: extractKeywordsSingle(text, topK),
100
+ };
101
+ }
102
+ //# sourceMappingURL=entities.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entities.js","sourceRoot":"","sources":["../../../src/doc/entities.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ export interface CrossReference {
2
+ sourceFile: string;
3
+ targetFile: string;
4
+ referenceType: 'filename-mention' | 'hyperlink' | 'citation';
5
+ context: string;
6
+ line?: number;
7
+ }
8
+ export interface ReferenceAnalysis {
9
+ references: CrossReference[];
10
+ unresolvedMentions: Array<{
11
+ sourceFile: string;
12
+ mention: string;
13
+ context: string;
14
+ }>;
15
+ }
16
+ /** Detect cross-references between documents */
17
+ export declare function detectCrossReferences(documents: Array<{
18
+ filePath: string;
19
+ content: string;
20
+ }>): ReferenceAnalysis;
@@ -0,0 +1,112 @@
1
+ /**
2
+ * Cross-document reference detection.
3
+ * Detects filename mentions, hyperlinks, and citation patterns across documents.
4
+ */
5
+ import path from 'node:path';
6
+ const CONTEXT_WINDOW = 60;
7
+ function getContext(text, position, length) {
8
+ const start = Math.max(0, position - CONTEXT_WINDOW);
9
+ const end = Math.min(text.length, position + length + CONTEXT_WINDOW);
10
+ let context = text.slice(start, end).replace(/\n/g, ' ').trim();
11
+ if (start > 0)
12
+ context = '...' + context;
13
+ if (end < text.length)
14
+ context = context + '...';
15
+ return context;
16
+ }
17
+ function getLineNumber(text, position) {
18
+ let line = 1;
19
+ for (let i = 0; i < position && i < text.length; i++) {
20
+ if (text[i] === '\n')
21
+ line++;
22
+ }
23
+ return line;
24
+ }
25
+ /** Detect cross-references between documents */
26
+ export function detectCrossReferences(documents) {
27
+ const references = [];
28
+ const unresolvedMentions = [];
29
+ // Build a set of known filenames for matching
30
+ const fileNames = new Map(); // basename (lower) -> full path
31
+ const fileNamesNoExt = new Map(); // basename without ext (lower) -> full path
32
+ for (const doc of documents) {
33
+ const base = path.basename(doc.filePath).toLowerCase();
34
+ const noExt = path.basename(doc.filePath, path.extname(doc.filePath)).toLowerCase();
35
+ fileNames.set(base, doc.filePath);
36
+ fileNamesNoExt.set(noExt, doc.filePath);
37
+ }
38
+ for (const doc of documents) {
39
+ const { filePath, content } = doc;
40
+ // 1. Filename mentions — look for other filenames in this document's text
41
+ for (const [name, targetPath] of fileNames) {
42
+ if (targetPath === filePath)
43
+ continue;
44
+ const regex = new RegExp(escapeRegex(name), 'gi');
45
+ let match;
46
+ while ((match = regex.exec(content)) !== null) {
47
+ references.push({
48
+ sourceFile: filePath,
49
+ targetFile: targetPath,
50
+ referenceType: 'filename-mention',
51
+ context: getContext(content, match.index, match[0].length),
52
+ line: getLineNumber(content, match.index),
53
+ });
54
+ }
55
+ }
56
+ // 2. Hyperlink extraction — markdown links [text](url) and bare URLs with local file references
57
+ const linkRegex = /\[([^\]]*)\]\(([^)]+)\)/g;
58
+ let linkMatch;
59
+ while ((linkMatch = linkRegex.exec(content)) !== null) {
60
+ const linkTarget = linkMatch[2];
61
+ // Check if link target references a known file
62
+ const linkBasename = path.basename(linkTarget).toLowerCase();
63
+ const resolved = fileNames.get(linkBasename) ?? fileNamesNoExt.get(linkBasename.replace(/\.[^.]+$/, ''));
64
+ if (resolved && resolved !== filePath) {
65
+ references.push({
66
+ sourceFile: filePath,
67
+ targetFile: resolved,
68
+ referenceType: 'hyperlink',
69
+ context: getContext(content, linkMatch.index, linkMatch[0].length),
70
+ line: getLineNumber(content, linkMatch.index),
71
+ });
72
+ }
73
+ }
74
+ // 3. Citation patterns — "see X", "refer to X", "as described in X"
75
+ const citationPatterns = [
76
+ /\b(?:see|refer\s+to|as\s+described\s+in|as\s+noted\s+in|per|according\s+to)\s+["']?([^"'\n,;.]+?)["']?(?=[,;.\s]|$)/gi,
77
+ ];
78
+ for (const citationRegex of citationPatterns) {
79
+ let citMatch;
80
+ while ((citMatch = citationRegex.exec(content)) !== null) {
81
+ const mention = citMatch[1].trim();
82
+ const mentionLower = mention.toLowerCase();
83
+ // Try to resolve against known files
84
+ const resolved = fileNames.get(mentionLower)
85
+ ?? fileNamesNoExt.get(mentionLower)
86
+ ?? fileNamesNoExt.get(mentionLower.replace(/\s+/g, '-'))
87
+ ?? fileNamesNoExt.get(mentionLower.replace(/\s+/g, '_'));
88
+ if (resolved && resolved !== filePath) {
89
+ references.push({
90
+ sourceFile: filePath,
91
+ targetFile: resolved,
92
+ referenceType: 'citation',
93
+ context: getContext(content, citMatch.index, citMatch[0].length),
94
+ line: getLineNumber(content, citMatch.index),
95
+ });
96
+ }
97
+ else if (mention.length > 3 && mention.length < 100) {
98
+ unresolvedMentions.push({
99
+ sourceFile: filePath,
100
+ mention,
101
+ context: getContext(content, citMatch.index, citMatch[0].length),
102
+ });
103
+ }
104
+ }
105
+ }
106
+ }
107
+ return { references, unresolvedMentions };
108
+ }
109
+ function escapeRegex(str) {
110
+ return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
111
+ }
112
+ //# sourceMappingURL=references.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"references.js","sourceRoot":"","sources":["../../../src/doc/references.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import { z } from 'zod';
2
+ import { estimateTokenCount } from '../tokens.js';
2
3
  export const DocumentPropertiesSchema = z.object({
3
4
  title: z.string().optional(),
4
5
  subject: z.string().optional(),
@@ -10,8 +11,7 @@ export const DocumentPropertiesSchema = z.object({
10
11
  keywords: z.string().optional(),
11
12
  });
12
13
  export function estimateTokens(input) {
13
- const chars = typeof input === 'number' ? input : input.length;
14
- return Math.max(0, Math.ceil(chars / 4));
14
+ return estimateTokenCount(input);
15
15
  }
16
16
  export function asOptionalString(value) {
17
17
  return typeof value === 'string' && value.trim() ? value : undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../src/inspect/shared.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/C,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC5B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC7B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAClC,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACnC,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACrC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAChC,CAAC,CAAC;AAGH,MAAM,UAAU,cAAc,CAAC,KAAsB;IACnD,MAAM,KAAK,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC;IAC/D,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAc;IAC7C,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAc;IAC3C,IAAI,KAAK,YAAY,IAAI;QAAE,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC;IACtD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE;QAAE,OAAO,KAAK,CAAC;IAC5D,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAI,IAAY,EAAE,KAA8B,EAAE,OAAU;IAC9F,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;AAClC,CAAC"}
1
+ {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../src/inspect/shared.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAElD,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/C,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC5B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC7B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAClC,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACnC,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACrC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAChC,CAAC,CAAC;AAGH,MAAM,UAAU,cAAc,CAAC,KAAsB;IACnD,OAAO,kBAAkB,CAAC,KAAK,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAc;IAC7C,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAc;IAC3C,IAAI,KAAK,YAAY,IAAI;QAAE,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC;IACtD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE;QAAE,OAAO,KAAK,CAAC;IAC5D,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAI,IAAY,EAAE,KAA8B,EAAE,OAAU;IAC9F,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;AAClC,CAAC"}
@@ -1,2 +1,2 @@
1
- /** Convert a document to markdown. Returns null for unsupported formats (xlsx, ods). */
1
+ /** Convert a document to markdown. Returns null for unsupported formats (ods). */
2
2
  export declare function documentToMarkdown(filePath: string): Promise<string | null>;
@@ -2,6 +2,7 @@ import { readFile } from 'node:fs/promises';
2
2
  import mammoth from 'mammoth';
3
3
  import pdf from 'pdf-parse';
4
4
  import JSZip from 'jszip';
5
+ import XLSX from 'xlsx';
5
6
  import officeparser from 'officeparser';
6
7
  import TurndownService from 'turndown';
7
8
  import { z } from 'zod';
@@ -100,7 +101,58 @@ async function odpToMarkdown(filePath) {
100
101
  }
101
102
  return parts.join('\n\n');
102
103
  }
103
- /** Convert a document to markdown. Returns null for unsupported formats (xlsx, ods). */
104
+ /** Convert an XLSX file to markdown with table formatting per sheet */
105
+ async function xlsxToMarkdown(filePath, maxRows = 20) {
106
+ const buffer = await readFile(filePath);
107
+ const workbook = XLSX.read(buffer, {
108
+ type: 'buffer',
109
+ cellDates: true,
110
+ cellText: true,
111
+ });
112
+ const parts = [];
113
+ for (const sheetName of workbook.SheetNames) {
114
+ const sheet = workbook.Sheets[sheetName];
115
+ if (!sheet?.['!ref'])
116
+ continue;
117
+ const range = XLSX.utils.decode_range(sheet['!ref']);
118
+ const totalRows = range.e.r - range.s.r + 1;
119
+ const totalCols = range.e.c - range.s.c + 1;
120
+ parts.push(`## ${sheetName}`);
121
+ parts.push('');
122
+ if (totalCols === 0 || totalRows === 0) {
123
+ parts.push('*Empty sheet*');
124
+ parts.push('');
125
+ continue;
126
+ }
127
+ // Read header row
128
+ const headers = [];
129
+ for (let col = range.s.c; col <= range.e.c; col++) {
130
+ const cell = sheet[XLSX.utils.encode_cell({ r: range.s.r, c: col })];
131
+ const raw = cell?.v != null ? String(cell.w ?? cell.v) : XLSX.utils.encode_col(col);
132
+ headers.push(raw.replace(/\|/g, '\\|').replace(/\n/g, ' '));
133
+ }
134
+ // Build markdown table
135
+ parts.push(`| ${headers.join(' | ')} |`);
136
+ parts.push(`| ${headers.map(() => '---').join(' | ')} |`);
137
+ const dataRows = Math.min(maxRows, totalRows - 1);
138
+ for (let row = range.s.r + 1; row <= range.s.r + dataRows; row++) {
139
+ const values = [];
140
+ for (let col = range.s.c; col <= range.e.c; col++) {
141
+ const cell = sheet[XLSX.utils.encode_cell({ r: row, c: col })];
142
+ const val = cell?.v != null ? String(cell.w ?? cell.v) : '';
143
+ values.push(val.replace(/\|/g, '\\|').replace(/\n/g, ' '));
144
+ }
145
+ parts.push(`| ${values.join(' | ')} |`);
146
+ }
147
+ if (totalRows - 1 > maxRows) {
148
+ parts.push('');
149
+ parts.push(`*...${totalRows - 1 - maxRows} more rows*`);
150
+ }
151
+ parts.push('');
152
+ }
153
+ return parts.join('\n');
154
+ }
155
+ /** Convert a document to markdown. Returns null for unsupported formats (ods). */
104
156
  export async function documentToMarkdown(filePath) {
105
157
  const ext = getExtension(filePath);
106
158
  switch (ext) {
@@ -109,7 +161,7 @@ export async function documentToMarkdown(filePath) {
109
161
  case 'pptx': return pptxToMarkdown(filePath);
110
162
  case 'odt': return odtToMarkdown(filePath);
111
163
  case 'odp': return odpToMarkdown(filePath);
112
- case 'xlsx':
164
+ case 'xlsx': return xlsxToMarkdown(filePath);
113
165
  case 'ods':
114
166
  return null;
115
167
  default:
@@ -1 +1 @@
1
- {"version":3,"file":"convert.js","sourceRoot":"","sources":["../../../src/markdown/convert.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"convert.js","sourceRoot":"","sources":["../../../src/markdown/convert.ts"],"names":[],"mappings":"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"}
@@ -14,6 +14,15 @@ export function formatJson(stats, sccData = null, structureResults) {
14
14
  entry[f] = r[f] || 0;
15
15
  }
16
16
  entry.size = r.size;
17
+ if (stats.showConfidence && r.confidence) {
18
+ const conf = {};
19
+ for (const f of METRIC_FIELDS) {
20
+ if (r[hasKey(f)] && r.confidence[f])
21
+ conf[f] = r.confidence[f];
22
+ }
23
+ if (Object.keys(conf).length > 0)
24
+ entry.confidence = conf;
25
+ }
17
26
  return entry;
18
27
  };
19
28
  const mapTotals = (t) => {
@@ -1 +1 @@
1
- {"version":3,"file":"json.js","sourceRoot":"","sources":["../../../src/output/json.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAKhD,MAAM,UAAU,UAAU,CACxB,KAAsB,EACtB,UAAgC,IAAI,EACpC,gBAAoC;IAEpC,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;IAE1B,MAAM,MAAM,GAAG,CAAC,CAAW,EAAE,EAAE;QAC7B,MAAM,KAAK,GAA4B;YACrC,IAAI,EAAE,CAAC,CAAC,QAAQ;YAChB,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3C,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3C,KAAK,EAAE,CAAC,CAAC,KAAK;SACf,CAAC;QACF,KAAK,MAAM,CAAC,IAAI,aAAa,EAAE,CAAC;YAC9B,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;gBAAE,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACzC,CAAC;QACD,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC;QACpB,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;IAEF,MAAM,SAAS,GAAG,CAAC,CAAW,EAAE,EAAE;QAChC,MAAM,KAAK,GAA4B,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;QAC1D,KAAK,MAAM,CAAC,IAAI,aAAa,EAAE,CAAC;YAC9B,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;gBAAE,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1C,CAAC;QACD,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC;QACpB,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;IAEF,MAAM,MAAM,GAA4B;QACtC,SAAS,EAAE;YACT,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC;YAC7B,MAAM,EAAE,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC;SAChC;KACF,CAAC;IAEF,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClC,MAAM,CAAC,IAAI,GAAG,OAAO,CAAC;IACxB,CAAC;IAED,IAAI,gBAAgB,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpD,MAAM,CAAC,UAAU,GAAG,mBAAmB,CAAC,gBAAgB,CAAC,CAAC;IAC5D,CAAC;IAED,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACzC,CAAC"}
1
+ {"version":3,"file":"json.js","sourceRoot":"","sources":["../../../src/output/json.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAKhD,MAAM,UAAU,UAAU,CACxB,KAAsB,EACtB,UAAgC,IAAI,EACpC,gBAAoC;IAEpC,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;IAE1B,MAAM,MAAM,GAAG,CAAC,CAAW,EAAE,EAAE;QAC7B,MAAM,KAAK,GAA4B;YACrC,IAAI,EAAE,CAAC,CAAC,QAAQ;YAChB,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3C,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3C,KAAK,EAAE,CAAC,CAAC,KAAK;SACf,CAAC;QACF,KAAK,MAAM,CAAC,IAAI,aAAa,EAAE,CAAC;YAC9B,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;gBAAE,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACzC,CAAC;QACD,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC;QACpB,IAAI,KAAK,CAAC,cAAc,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC;YACzC,MAAM,IAAI,GAA2B,EAAE,CAAC;YACxC,KAAK,MAAM,CAAC,IAAI,aAAa,EAAE,CAAC;gBAC9B,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;oBAAE,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YACjE,CAAC;YACD,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC;gBAAE,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC;QAC5D,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;IAEF,MAAM,SAAS,GAAG,CAAC,CAAW,EAAE,EAAE;QAChC,MAAM,KAAK,GAA4B,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;QAC1D,KAAK,MAAM,CAAC,IAAI,aAAa,EAAE,CAAC;YAC9B,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;gBAAE,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1C,CAAC;QACD,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC;QACpB,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;IAEF,MAAM,MAAM,GAA4B;QACtC,SAAS,EAAE;YACT,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC;YAC7B,MAAM,EAAE,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC;SAChC;KACF,CAAC;IAEF,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClC,MAAM,CAAC,IAAI,GAAG,OAAO,CAAC;IACxB,CAAC;IAED,IAAI,gBAAgB,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpD,MAAM,CAAC,UAAU,GAAG,mBAAmB,CAAC,gBAAgB,CAAC,CAAC;IAC5D,CAAC;IAED,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACzC,CAAC"}
@@ -19,9 +19,9 @@ export function formatDocumentTable(stats, options = {}) {
19
19
  colAligns,
20
20
  });
21
21
  for (const row of stats.rows) {
22
- table.push(buildRow(row, stats.columns, isByFile, c));
22
+ table.push(buildRow(row, stats.columns, isByFile, c, false, stats.showConfidence));
23
23
  }
24
- table.push(buildRow(stats.totals, stats.columns, isByFile, c, true));
24
+ table.push(buildRow(stats.totals, stats.columns, isByFile, c, true, false));
25
25
  const tableStr = addSeparators(table.toString(), ci ? '-' : '─');
26
26
  const tableWidth = stripAnsi(tableStr.split('\n')[0]).length;
27
27
  const lines = [];
@@ -33,6 +33,9 @@ export function formatDocumentTable(stats, options = {}) {
33
33
  if (hasEstimatedPages) {
34
34
  lines.push(c.dim('* Word/ODT pages estimated at 250 words/page'));
35
35
  }
36
+ if (stats.showConfidence) {
37
+ lines.push(c.dim('~ estimated metric'));
38
+ }
36
39
  return lines.join('\n');
37
40
  }
38
41
  export function formatSccTable(sccData, options = {}) {
@@ -181,7 +184,12 @@ function buildColAligns(columns, byFile) {
181
184
  aligns.push('right');
182
185
  return aligns;
183
186
  }
184
- function buildRow(row, columns, byFile, c, isTotal = false) {
187
+ function annotateConfidence(value, metric, row, showConfidence) {
188
+ if (!showConfidence || !row.confidence || row.confidence[metric] !== 'estimated')
189
+ return value;
190
+ return value + '~';
191
+ }
192
+ function buildRow(row, columns, byFile, c, isTotal = false, showConfidence = false) {
185
193
  const fmt = isTotal ? c.total : (v) => v;
186
194
  const fmtType = isTotal ? c.total : c.type;
187
195
  const fmtNum = isTotal ? c.total : c.number;
@@ -200,21 +208,21 @@ function buildRow(row, columns, byFile, c, isTotal = false) {
200
208
  if (!byFile)
201
209
  cells.push(fmt(formatNumber(row.files)));
202
210
  if (columns.hasWords)
203
- cells.push(fmtNum(row.words ? formatNumber(row.words) : ''));
211
+ cells.push(fmtNum(row.words ? annotateConfidence(formatNumber(row.words), 'words', row, showConfidence) : ''));
204
212
  if (columns.hasPages)
205
- cells.push(fmtNum(row.pages ? formatNumber(row.pages) : ''));
213
+ cells.push(fmtNum(row.pages ? annotateConfidence(formatNumber(row.pages), 'pages', row, showConfidence) : ''));
206
214
  if (hasExtraColumns(columns)) {
207
215
  const parts = [];
208
216
  if (row.paragraphs)
209
- parts.push(`${formatNumber(row.paragraphs)} paras`);
217
+ parts.push(`${annotateConfidence(formatNumber(row.paragraphs), 'paragraphs', row, showConfidence)} paras`);
210
218
  if (row.sheets)
211
- parts.push(`${formatNumber(row.sheets)} sheets`);
219
+ parts.push(`${annotateConfidence(formatNumber(row.sheets), 'sheets', row, showConfidence)} sheets`);
212
220
  if (row.rows)
213
- parts.push(`${formatNumber(row.rows)} rows`);
221
+ parts.push(`${annotateConfidence(formatNumber(row.rows), 'rows', row, showConfidence)} rows`);
214
222
  if (row.cells)
215
- parts.push(`${formatNumber(row.cells)} cells`);
223
+ parts.push(`${annotateConfidence(formatNumber(row.cells), 'cells', row, showConfidence)} cells`);
216
224
  if (row.slides)
217
- parts.push(`${formatNumber(row.slides)} slides`);
225
+ parts.push(`${annotateConfidence(formatNumber(row.slides), 'slides', row, showConfidence)} slides`);
218
226
  cells.push(fmt(parts.join(', ')));
219
227
  }
220
228
  cells.push(fmt(formatBytes(row.size)));