@pentoshi/clai 3.9.7 → 3.10.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.
- package/LICENSE +21 -0
- package/README.md +81 -9
- package/dist/agent/context-manager.d.ts +2 -1
- package/dist/agent/context-manager.js +16 -2
- package/dist/agent/context-manager.js.map +1 -1
- package/dist/agent/loop-guard.d.ts +18 -0
- package/dist/agent/loop-guard.js +50 -2
- package/dist/agent/loop-guard.js.map +1 -1
- package/dist/agent/must-continue.js +4 -8
- package/dist/agent/must-continue.js.map +1 -1
- package/dist/agent/prompt-composer.js +8 -8
- package/dist/agent/prompt-composer.js.map +1 -1
- package/dist/agent/runner.d.ts +1 -0
- package/dist/agent/runner.js +238 -74
- package/dist/agent/runner.js.map +1 -1
- package/dist/agent/session-policy.d.ts +1 -2
- package/dist/agent/session-policy.js +3 -2
- package/dist/agent/session-policy.js.map +1 -1
- package/dist/agent/tool-call-parser.js +6 -6
- package/dist/agent/tool-call-parser.js.map +1 -1
- package/dist/app/adapters/current-agent-adapter.js +1 -0
- package/dist/app/adapters/current-agent-adapter.js.map +1 -1
- package/dist/app/controllers/session-controller.js +2 -0
- package/dist/app/controllers/session-controller.js.map +1 -1
- package/dist/app/controllers/session-turn-request.d.ts +1 -0
- package/dist/app/controllers/session-turn-request.js +4 -1
- package/dist/app/controllers/session-turn-request.js.map +1 -1
- package/dist/app/ports/agent-port.d.ts +1 -0
- package/dist/attachments/clipboard-image.js +5 -4
- package/dist/attachments/clipboard-image.js.map +1 -1
- package/dist/attachments/image-content.d.ts +20 -2
- package/dist/attachments/image-content.js +201 -1
- package/dist/attachments/image-content.js.map +1 -1
- package/dist/attachments/image-prepare.d.ts +25 -0
- package/dist/attachments/image-prepare.js +390 -0
- package/dist/attachments/image-prepare.js.map +1 -0
- package/dist/attachments/service.d.ts +4 -2
- package/dist/attachments/service.js +51 -21
- package/dist/attachments/service.js.map +1 -1
- package/dist/commands/providers.d.ts +5 -2
- package/dist/commands/providers.js +121 -7
- package/dist/commands/providers.js.map +1 -1
- package/dist/index.js +12 -4
- package/dist/index.js.map +1 -1
- package/dist/llm/agentrouter.js +2 -2
- package/dist/llm/agentrouter.js.map +1 -1
- package/dist/llm/anthropic.d.ts +5 -4
- package/dist/llm/anthropic.js +28 -25
- package/dist/llm/anthropic.js.map +1 -1
- package/dist/llm/aws-mantle.js +19 -20
- package/dist/llm/aws-mantle.js.map +1 -1
- package/dist/llm/bynara.js +2 -2
- package/dist/llm/bynara.js.map +1 -1
- package/dist/llm/capabilities.d.ts +19 -0
- package/dist/llm/capabilities.js +273 -16
- package/dist/llm/capabilities.js.map +1 -1
- package/dist/llm/gemini.js +16 -8
- package/dist/llm/gemini.js.map +1 -1
- package/dist/llm/groq.js +2 -2
- package/dist/llm/groq.js.map +1 -1
- package/dist/llm/http.d.ts +7 -1
- package/dist/llm/http.js +210 -8
- package/dist/llm/http.js.map +1 -1
- package/dist/llm/kimchi.js +2 -2
- package/dist/llm/kimchi.js.map +1 -1
- package/dist/llm/lightning.d.ts +11 -0
- package/dist/llm/lightning.js +108 -0
- package/dist/llm/lightning.js.map +1 -0
- package/dist/llm/modal.d.ts +16 -0
- package/dist/llm/modal.js +182 -0
- package/dist/llm/modal.js.map +1 -0
- package/dist/llm/nvidia.js +2 -2
- package/dist/llm/nvidia.js.map +1 -1
- package/dist/llm/ollama.js +3 -3
- package/dist/llm/ollama.js.map +1 -1
- package/dist/llm/openai.js +2 -2
- package/dist/llm/openai.js.map +1 -1
- package/dist/llm/openrouter.js +2 -2
- package/dist/llm/openrouter.js.map +1 -1
- package/dist/llm/provider.d.ts +11 -0
- package/dist/llm/provider.js +316 -1
- package/dist/llm/provider.js.map +1 -1
- package/dist/llm/qwen-cloud.js +2 -5
- package/dist/llm/qwen-cloud.js.map +1 -1
- package/dist/llm/router.js +127 -7
- package/dist/llm/router.js.map +1 -1
- package/dist/llm/system-messages.d.ts +5 -0
- package/dist/llm/system-messages.js +14 -0
- package/dist/llm/system-messages.js.map +1 -1
- package/dist/llm/token-usage.d.ts +13 -0
- package/dist/llm/token-usage.js +31 -0
- package/dist/llm/token-usage.js.map +1 -1
- package/dist/llm/tokenrouter.d.ts +15 -0
- package/dist/llm/tokenrouter.js +106 -0
- package/dist/llm/tokenrouter.js.map +1 -0
- package/dist/modes/agent.d.ts +1 -0
- package/dist/modes/agent.js.map +1 -1
- package/dist/modes/ask.js +15 -4
- package/dist/modes/ask.js.map +1 -1
- package/dist/prompts/embedded.js +2 -2
- package/dist/prompts/embedded.js.map +1 -1
- package/dist/prompts/index.d.ts +6 -0
- package/dist/prompts/index.js +39 -21
- package/dist/prompts/index.js.map +1 -1
- package/dist/prompts/system.agent.md +15 -27
- package/dist/prompts/system.ask.md +1 -1
- package/dist/repl/slash-commands.js +53 -0
- package/dist/repl/slash-commands.js.map +1 -1
- package/dist/repl.js +16 -9
- package/dist/repl.js.map +1 -1
- package/dist/store/config.d.ts +55 -0
- package/dist/store/config.js +127 -0
- package/dist/store/config.js.map +1 -1
- package/dist/store/history.d.ts +2 -1
- package/dist/store/history.js +15 -16
- package/dist/store/history.js.map +1 -1
- package/dist/store/keys.js +41 -2
- package/dist/store/keys.js.map +1 -1
- package/dist/tools/definitions.js +31 -6
- package/dist/tools/definitions.js.map +1 -1
- package/dist/tools/image.d.ts +0 -7
- package/dist/tools/image.js +76 -22
- package/dist/tools/image.js.map +1 -1
- package/dist/tools/jobs.d.ts +11 -1
- package/dist/tools/jobs.js +67 -0
- package/dist/tools/jobs.js.map +1 -1
- package/dist/tools/ocr.d.ts +28 -0
- package/dist/tools/ocr.js +316 -0
- package/dist/tools/ocr.js.map +1 -0
- package/dist/tools/pdf.d.ts +0 -12
- package/dist/tools/pdf.js +436 -150
- package/dist/tools/pdf.js.map +1 -1
- package/dist/tools/registry.js +5 -0
- package/dist/tools/registry.js.map +1 -1
- package/dist/tui/format-keys.js +10 -0
- package/dist/tui/format-keys.js.map +1 -1
- package/dist/tui-v2/actions/action-id.d.ts +1 -1
- package/dist/tui-v2/actions/action-id.js +2 -0
- package/dist/tui-v2/actions/action-id.js.map +1 -1
- package/dist/tui-v2/actions/format-shortcuts.js +3 -1
- package/dist/tui-v2/actions/format-shortcuts.js.map +1 -1
- package/dist/tui-v2/actions/keymap.js +4 -1
- package/dist/tui-v2/actions/keymap.js.map +1 -1
- package/dist/tui-v2/app/commands/key-commands.js +117 -15
- package/dist/tui-v2/app/commands/key-commands.js.map +1 -1
- package/dist/tui-v2/app/commands/picker-commands.js +80 -11
- package/dist/tui-v2/app/commands/picker-commands.js.map +1 -1
- package/dist/tui-v2/components/jobs/jobs-panel.js +25 -1
- package/dist/tui-v2/components/jobs/jobs-panel.js.map +1 -1
- package/dist/tui-v2/components/modal/keys-modal.js +15 -8
- package/dist/tui-v2/components/modal/keys-modal.js.map +1 -1
- package/dist/tui-v2/components/modal/secret-modal.js +13 -4
- package/dist/tui-v2/components/modal/secret-modal.js.map +1 -1
- package/dist/tui-v2/components/pager/pager.js +103 -12
- package/dist/tui-v2/components/pager/pager.js.map +1 -1
- package/dist/tui-v2/components/transcript/thinking-block.d.ts +11 -3
- package/dist/tui-v2/components/transcript/thinking-block.js +5 -4
- package/dist/tui-v2/components/transcript/thinking-block.js.map +1 -1
- package/dist/tui-v2/components/transcript/transcript-row.d.ts +2 -0
- package/dist/tui-v2/components/transcript/transcript-row.js +2 -2
- package/dist/tui-v2/components/transcript/transcript-row.js.map +1 -1
- package/dist/tui-v2/components/transcript/transcript-view.js +8 -1
- package/dist/tui-v2/components/transcript/transcript-view.js.map +1 -1
- package/dist/tui-v2/controllers/overlay-controller.d.ts +13 -0
- package/dist/tui-v2/controllers/overlay-controller.js +5 -2
- package/dist/tui-v2/controllers/overlay-controller.js.map +1 -1
- package/dist/tui-v2/rendering/artifact-pager-source.d.ts +10 -0
- package/dist/tui-v2/rendering/artifact-pager-source.js +6 -0
- package/dist/tui-v2/rendering/artifact-pager-source.js.map +1 -1
- package/dist/tui-v2/rendering/job-tail-source.d.ts +21 -0
- package/dist/tui-v2/rendering/job-tail-source.js +87 -0
- package/dist/tui-v2/rendering/job-tail-source.js.map +1 -0
- package/dist/types.d.ts +7 -1
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -1
- package/dist/ui/mentions.d.ts +7 -2
- package/dist/ui/mentions.js +52 -117
- package/dist/ui/mentions.js.map +1 -1
- package/dist/version.generated.d.ts +2 -2
- package/dist/version.generated.js +2 -2
- package/dist/version.generated.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
import { mkdtemp, open, readFile, rm, stat } from "node:fs/promises";
|
|
2
|
+
import { platform, tmpdir } from "node:os";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { commandAvailable } from "../os/pkgmgr.js";
|
|
5
|
+
import { readImageDimensions } from "../attachments/image-content.js";
|
|
6
|
+
import { spawnArgv } from "./shell.js";
|
|
7
|
+
export const LANG_PATTERN = /^[A-Za-z0-9_+-]+$/;
|
|
8
|
+
const PREPROCESS_TARGET_EDGE = 2400;
|
|
9
|
+
const PREPROCESS_MIN_EDGE = 1600;
|
|
10
|
+
const PREPROCESS_MAX_SCALE = 4;
|
|
11
|
+
const GOOD_ENOUGH_SCORE = 40;
|
|
12
|
+
export const MIN_RELIABLE_CONFIDENCE = 55;
|
|
13
|
+
const MIN_RELIABLE_WORDS = 2;
|
|
14
|
+
export function stripCommandEcho(output) {
|
|
15
|
+
return output.replace(/^\$ [^\n]*\n?/, "");
|
|
16
|
+
}
|
|
17
|
+
export function meaningfulCharCount(text) {
|
|
18
|
+
return (text.match(/[A-Za-z0-9]/g) ?? []).length;
|
|
19
|
+
}
|
|
20
|
+
export function scoreOcrText(text) {
|
|
21
|
+
const alphanumeric = meaningfulCharCount(text);
|
|
22
|
+
const words = (text.match(/\b[A-Za-z]{2,}\b/g) ?? []).length;
|
|
23
|
+
const noise = (text.match(/[^\w\s.,:;!?'"()\[\]{}<>@#$%&*+/\\|=~^-]/g) ?? [])
|
|
24
|
+
.length;
|
|
25
|
+
return alphanumeric + words * 3 - noise * 2;
|
|
26
|
+
}
|
|
27
|
+
function parseTsvWords(tsv) {
|
|
28
|
+
const words = [];
|
|
29
|
+
for (const line of tsv.split(/\r?\n/)) {
|
|
30
|
+
const columns = line.split("\t");
|
|
31
|
+
if (columns.length < 12 || columns[0] !== "5")
|
|
32
|
+
continue;
|
|
33
|
+
const confidence = Number(columns[10]);
|
|
34
|
+
const text = (columns[11] ?? "").trim();
|
|
35
|
+
if (!Number.isFinite(confidence) || confidence < 0 || text.length === 0) {
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
words.push({ confidence, text });
|
|
39
|
+
}
|
|
40
|
+
return words;
|
|
41
|
+
}
|
|
42
|
+
function meanConfidence(words) {
|
|
43
|
+
let weight = 0;
|
|
44
|
+
let total = 0;
|
|
45
|
+
for (const word of words) {
|
|
46
|
+
const length = Math.max(1, word.text.replace(/\s+/g, "").length);
|
|
47
|
+
weight += length;
|
|
48
|
+
total += word.confidence * length;
|
|
49
|
+
}
|
|
50
|
+
return weight === 0 ? 0 : total / weight;
|
|
51
|
+
}
|
|
52
|
+
function looksLikeRealText(words) {
|
|
53
|
+
const wordLike = words.filter((word) => /^[A-Za-z][A-Za-z'’-]{1,}$/.test(word.text) && /[aeiouy]/i.test(word.text));
|
|
54
|
+
const numeric = words.filter((word) => /^[$€£]?\d[\d.,:/%-]*$/.test(word.text));
|
|
55
|
+
const trusted = wordLike.length + numeric.length;
|
|
56
|
+
if (trusted < MIN_RELIABLE_WORDS)
|
|
57
|
+
return false;
|
|
58
|
+
return trusted / words.length >= 0.4;
|
|
59
|
+
}
|
|
60
|
+
const MISSING_RECHECK_MS = 15_000;
|
|
61
|
+
let tesseractPresent = false;
|
|
62
|
+
let tesseractCheckedAt = 0;
|
|
63
|
+
export async function tesseractUnavailableReason() {
|
|
64
|
+
if (tesseractPresent)
|
|
65
|
+
return undefined;
|
|
66
|
+
if (Date.now() - tesseractCheckedAt < MISSING_RECHECK_MS) {
|
|
67
|
+
return missingTesseractHint();
|
|
68
|
+
}
|
|
69
|
+
tesseractCheckedAt = Date.now();
|
|
70
|
+
tesseractPresent = await commandAvailable("tesseract");
|
|
71
|
+
return tesseractPresent ? undefined : missingTesseractHint();
|
|
72
|
+
}
|
|
73
|
+
function missingTesseractHint() {
|
|
74
|
+
return platform() === "darwin"
|
|
75
|
+
? "tesseract is not installed. Install it with `brew install tesseract` (add `brew install tesseract-lang` for non-English), then retry."
|
|
76
|
+
: platform() === "win32"
|
|
77
|
+
? "tesseract is not installed. Install it with `scoop install tesseract` or `choco install tesseract`, then retry."
|
|
78
|
+
: "tesseract is not installed. Install it with `apt install tesseract-ocr` (or `dnf install tesseract`), then retry.";
|
|
79
|
+
}
|
|
80
|
+
let cachedLanguages;
|
|
81
|
+
async function installedLanguages() {
|
|
82
|
+
if (cachedLanguages)
|
|
83
|
+
return cachedLanguages;
|
|
84
|
+
const result = await spawnArgv({
|
|
85
|
+
command: "tesseract",
|
|
86
|
+
argv: ["--list-langs"],
|
|
87
|
+
timeoutMs: 10_000,
|
|
88
|
+
noArtifact: true,
|
|
89
|
+
maxModelBytes: 32_000,
|
|
90
|
+
});
|
|
91
|
+
if (!result.ok)
|
|
92
|
+
return undefined;
|
|
93
|
+
const lines = stripCommandEcho(result.output)
|
|
94
|
+
.split(/\r?\n/)
|
|
95
|
+
.map((line) => line.trim())
|
|
96
|
+
.filter((line) => line.length > 0 && !/[:\s]/.test(line));
|
|
97
|
+
if (lines.length === 0)
|
|
98
|
+
return undefined;
|
|
99
|
+
cachedLanguages = new Set(lines);
|
|
100
|
+
return cachedLanguages;
|
|
101
|
+
}
|
|
102
|
+
export async function languageUnavailableReason(lang) {
|
|
103
|
+
const installed = await installedLanguages();
|
|
104
|
+
if (!installed)
|
|
105
|
+
return undefined;
|
|
106
|
+
const missing = lang
|
|
107
|
+
.split("+")
|
|
108
|
+
.map((code) => code.trim())
|
|
109
|
+
.filter((code) => code.length > 0 && !installed.has(code));
|
|
110
|
+
if (missing.length === 0)
|
|
111
|
+
return undefined;
|
|
112
|
+
const hint = platform() === "darwin"
|
|
113
|
+
? "install the data with `brew install tesseract-lang`"
|
|
114
|
+
: platform() === "win32"
|
|
115
|
+
? "download the .traineddata files into the tessdata directory"
|
|
116
|
+
: `install the data with \`apt install tesseract-ocr-${missing[0]}\``;
|
|
117
|
+
return `tesseract has no training data for ${missing.join(", ")} (installed: ${[...installed].slice(0, 12).join(", ")}). Use one of the installed codes or ${hint}.`;
|
|
118
|
+
}
|
|
119
|
+
export function resetOcrEnvironmentCache() {
|
|
120
|
+
tesseractPresent = false;
|
|
121
|
+
tesseractCheckedAt = 0;
|
|
122
|
+
cachedLanguages = undefined;
|
|
123
|
+
}
|
|
124
|
+
async function readHeader(path, length) {
|
|
125
|
+
const handle = await open(path, "r");
|
|
126
|
+
try {
|
|
127
|
+
const buffer = Buffer.alloc(length);
|
|
128
|
+
const { bytesRead } = await handle.read(buffer, 0, length, 0);
|
|
129
|
+
return buffer.subarray(0, bytesRead);
|
|
130
|
+
}
|
|
131
|
+
finally {
|
|
132
|
+
await handle.close();
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
async function preprocessForOcr(source, workDir, timeoutMs, signal) {
|
|
136
|
+
let longestEdge = 0;
|
|
137
|
+
try {
|
|
138
|
+
const header = await readHeader(source, 65_536);
|
|
139
|
+
const dimensions = readImageDimensions(header);
|
|
140
|
+
if (dimensions) {
|
|
141
|
+
longestEdge = Math.max(dimensions.width, dimensions.height);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
catch {
|
|
145
|
+
return undefined;
|
|
146
|
+
}
|
|
147
|
+
if (longestEdge === 0 || longestEdge >= PREPROCESS_MIN_EDGE)
|
|
148
|
+
return undefined;
|
|
149
|
+
const target = Math.min(PREPROCESS_TARGET_EDGE, Math.round(longestEdge * PREPROCESS_MAX_SCALE));
|
|
150
|
+
const destination = join(workDir, "upscaled.png");
|
|
151
|
+
if (await commandAvailable("magick")) {
|
|
152
|
+
const result = await spawnArgv({
|
|
153
|
+
command: "magick",
|
|
154
|
+
argv: [
|
|
155
|
+
`${source}[0]`,
|
|
156
|
+
"-colorspace",
|
|
157
|
+
"Gray",
|
|
158
|
+
"-filter",
|
|
159
|
+
"Lanczos",
|
|
160
|
+
"-resize",
|
|
161
|
+
`${target}x${target}`,
|
|
162
|
+
"-normalize",
|
|
163
|
+
"-sharpen",
|
|
164
|
+
"0x1",
|
|
165
|
+
destination,
|
|
166
|
+
],
|
|
167
|
+
timeoutMs,
|
|
168
|
+
signal,
|
|
169
|
+
noArtifact: true,
|
|
170
|
+
maxModelBytes: 4_000,
|
|
171
|
+
});
|
|
172
|
+
if (result.ok && (await fileHasBytes(destination)))
|
|
173
|
+
return destination;
|
|
174
|
+
}
|
|
175
|
+
if (platform() === "darwin" && (await commandAvailable("sips"))) {
|
|
176
|
+
const result = await spawnArgv({
|
|
177
|
+
command: "sips",
|
|
178
|
+
argv: [
|
|
179
|
+
"-s",
|
|
180
|
+
"format",
|
|
181
|
+
"png",
|
|
182
|
+
"-Z",
|
|
183
|
+
String(target),
|
|
184
|
+
source,
|
|
185
|
+
"--out",
|
|
186
|
+
destination,
|
|
187
|
+
],
|
|
188
|
+
timeoutMs,
|
|
189
|
+
signal,
|
|
190
|
+
noArtifact: true,
|
|
191
|
+
maxModelBytes: 4_000,
|
|
192
|
+
});
|
|
193
|
+
if (result.ok && (await fileHasBytes(destination)))
|
|
194
|
+
return destination;
|
|
195
|
+
}
|
|
196
|
+
return undefined;
|
|
197
|
+
}
|
|
198
|
+
async function fileHasBytes(path) {
|
|
199
|
+
try {
|
|
200
|
+
const info = await stat(path);
|
|
201
|
+
return info.isFile() && info.size > 0;
|
|
202
|
+
}
|
|
203
|
+
catch {
|
|
204
|
+
return false;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
export async function runOcr(request) {
|
|
208
|
+
const fail = (error) => ({
|
|
209
|
+
ok: false,
|
|
210
|
+
text: "",
|
|
211
|
+
psm: -1,
|
|
212
|
+
preprocessed: false,
|
|
213
|
+
confidence: 0,
|
|
214
|
+
reliable: false,
|
|
215
|
+
error,
|
|
216
|
+
});
|
|
217
|
+
const unavailable = await tesseractUnavailableReason();
|
|
218
|
+
if (unavailable)
|
|
219
|
+
return fail(unavailable);
|
|
220
|
+
const languageIssue = await languageUnavailableReason(request.lang);
|
|
221
|
+
if (languageIssue)
|
|
222
|
+
return fail(languageIssue);
|
|
223
|
+
const candidates = request.psmCandidates.length > 0 ? [...request.psmCandidates] : [3];
|
|
224
|
+
let workDir;
|
|
225
|
+
let input = request.path;
|
|
226
|
+
let preprocessed = false;
|
|
227
|
+
try {
|
|
228
|
+
if (request.preprocess !== false) {
|
|
229
|
+
workDir = await mkdtemp(join(tmpdir(), "clai-ocrpre-"));
|
|
230
|
+
const upscaled = await preprocessForOcr(request.path, workDir, Math.min(request.timeoutMs, 30_000), request.signal);
|
|
231
|
+
if (upscaled) {
|
|
232
|
+
input = upscaled;
|
|
233
|
+
preprocessed = true;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
if (!workDir)
|
|
237
|
+
workDir = await mkdtemp(join(tmpdir(), "clai-ocr-"));
|
|
238
|
+
let best;
|
|
239
|
+
let lastError;
|
|
240
|
+
for (const [attempt, psm] of candidates.entries()) {
|
|
241
|
+
if (request.signal?.aborted)
|
|
242
|
+
break;
|
|
243
|
+
const base = join(workDir, `pass-${attempt}`);
|
|
244
|
+
const argv = [input, base, "-l", request.lang, "--psm", String(psm)];
|
|
245
|
+
if (request.dpi)
|
|
246
|
+
argv.push("--dpi", String(request.dpi));
|
|
247
|
+
argv.push("-c", "preserve_interword_spaces=1", "txt", "tsv");
|
|
248
|
+
const result = await spawnArgv({
|
|
249
|
+
command: "tesseract",
|
|
250
|
+
argv,
|
|
251
|
+
timeoutMs: request.timeoutMs,
|
|
252
|
+
signal: request.signal,
|
|
253
|
+
onOutput: request.onOutput,
|
|
254
|
+
noArtifact: true,
|
|
255
|
+
maxModelBytes: 8_000,
|
|
256
|
+
});
|
|
257
|
+
if (!result.ok) {
|
|
258
|
+
lastError =
|
|
259
|
+
stripCommandEcho(result.output).trim() ||
|
|
260
|
+
`tesseract exited with code ${result.exitCode ?? 1}`;
|
|
261
|
+
continue;
|
|
262
|
+
}
|
|
263
|
+
const text = (await readTextFile(`${base}.txt`))
|
|
264
|
+
.replace(/^Estimating resolution as \d+\s*$/gim, "")
|
|
265
|
+
.replace(/^Warning[^\n]*$/gim, "")
|
|
266
|
+
.replace(/\f/g, "")
|
|
267
|
+
.trimEnd();
|
|
268
|
+
const words = parseTsvWords(await readTextFile(`${base}.tsv`));
|
|
269
|
+
const confidence = meanConfidence(words);
|
|
270
|
+
const reliable = words.length > 0 &&
|
|
271
|
+
confidence >= MIN_RELIABLE_CONFIDENCE &&
|
|
272
|
+
looksLikeRealText(words);
|
|
273
|
+
const candidate = {
|
|
274
|
+
ok: true,
|
|
275
|
+
text: text.trim(),
|
|
276
|
+
psm,
|
|
277
|
+
preprocessed,
|
|
278
|
+
confidence: Math.round(confidence),
|
|
279
|
+
reliable,
|
|
280
|
+
};
|
|
281
|
+
if (!best || isBetterOcr(candidate, best))
|
|
282
|
+
best = candidate;
|
|
283
|
+
if (reliable && scoreOcrText(candidate.text) >= GOOD_ENOUGH_SCORE)
|
|
284
|
+
break;
|
|
285
|
+
}
|
|
286
|
+
if (best)
|
|
287
|
+
return best;
|
|
288
|
+
return {
|
|
289
|
+
ok: false,
|
|
290
|
+
text: "",
|
|
291
|
+
psm: candidates[0] ?? 3,
|
|
292
|
+
preprocessed,
|
|
293
|
+
confidence: 0,
|
|
294
|
+
reliable: false,
|
|
295
|
+
error: lastError ?? "tesseract produced no output",
|
|
296
|
+
};
|
|
297
|
+
}
|
|
298
|
+
finally {
|
|
299
|
+
if (workDir)
|
|
300
|
+
await rm(workDir, { recursive: true, force: true }).catch(() => undefined);
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
function isBetterOcr(candidate, current) {
|
|
304
|
+
if (candidate.reliable !== current.reliable)
|
|
305
|
+
return candidate.reliable;
|
|
306
|
+
return scoreOcrText(candidate.text) > scoreOcrText(current.text);
|
|
307
|
+
}
|
|
308
|
+
async function readTextFile(path) {
|
|
309
|
+
try {
|
|
310
|
+
return await readFile(path, "utf8");
|
|
311
|
+
}
|
|
312
|
+
catch {
|
|
313
|
+
return "";
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
//# sourceMappingURL=ocr.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ocr.js","sourceRoot":"","sources":["../../src/tools/ocr.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/pdf.d.ts
CHANGED
|
@@ -3,16 +3,4 @@ export interface PdfToolRunOptions {
|
|
|
3
3
|
signal?: AbortSignal | undefined;
|
|
4
4
|
onOutput?: ((chunk: string, stream: "stdout" | "stderr") => void) | undefined;
|
|
5
5
|
}
|
|
6
|
-
/**
|
|
7
|
-
* Read a PDF as text.
|
|
8
|
-
*
|
|
9
|
-
* Strategy (mirrors what a human would do):
|
|
10
|
-
* 1. Run `pdftotext -layout <pdf> -` — fast and exact for born-digital PDFs.
|
|
11
|
-
* 2. If that yields little/no real text the PDF is scanned (image-only), so
|
|
12
|
-
* render every page to a PNG with `pdftoppm` and OCR each one with
|
|
13
|
-
* `tesseract`, concatenating the results page by page.
|
|
14
|
-
*
|
|
15
|
-
* Auto-executes (read-only). Returns a helpful error naming the missing
|
|
16
|
-
* binary so the agent can pkg.install it and retry.
|
|
17
|
-
*/
|
|
18
6
|
export declare function pdfRead(args: Record<string, unknown>, options?: PdfToolRunOptions): Promise<ToolResult>;
|