Skip to content

Commit c18f5e2

Browse files
committed
fix: reject fractional PDF page numbers
1 parent 33f7c17 commit c18f5e2

3 files changed

Lines changed: 25 additions & 1 deletion

File tree

src/agents/tools/pdf-tool.helpers.test.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,10 @@ describe("parsePageRange", () => {
8282
expect(() => parsePageRange("0", 20)).toThrow("Invalid page number");
8383
});
8484

85+
it("throws on fractional page number", () => {
86+
expect(() => parsePageRange("1.5", 20)).toThrow('Invalid page number: "1.5"');
87+
});
88+
8589
it("throws on negative page number", () => {
8690
expect(() => parsePageRange("-1", 20)).toThrow("Invalid page number");
8791
});

src/agents/tools/pdf-tool.helpers.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ export function parsePageRange(range: string, maxPages: number): number[] {
6666
}
6767
} else {
6868
const num = Number(part);
69-
if (!Number.isFinite(num) || num < 1) {
69+
if (!Number.isFinite(num) || !Number.isInteger(num) || num < 1) {
7070
throw new Error(`Invalid page number: "${part}"`);
7171
}
7272
if (num <= maxPages) {

src/agents/tools/pdf-tool.test.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -309,6 +309,26 @@ describe("createPdfTool", () => {
309309
});
310310
});
311311

312+
it("rejects fractional page numbers before native PDF analysis", async () => {
313+
await withTempPdfAgentDir(async (agentDir) => {
314+
await stubPdfToolInfra(agentDir, { provider: "anthropic", input: ["text", "document"] });
315+
const nativeSpy = vi
316+
.spyOn(pdfNativeProviders, "anthropicAnalyzePdf")
317+
.mockResolvedValue("native summary");
318+
const cfg = withPdfModel(ANTHROPIC_PDF_MODEL);
319+
const tool = requirePdfTool((await loadCreatePdfTool())({ config: cfg, agentDir }));
320+
321+
await expect(
322+
tool.execute("t1", {
323+
prompt: "summarize",
324+
pdf: "/tmp/doc.pdf",
325+
pages: "1.5",
326+
}),
327+
).rejects.toThrow('Invalid page number: "1.5"');
328+
expect(nativeSpy).not.toHaveBeenCalled();
329+
});
330+
});
331+
312332
it("passes validated maxBytesMb to PDF loading", async () => {
313333
await withTempPdfAgentDir(async (agentDir) => {
314334
const { loadSpy } = await stubPdfToolInfra(agentDir, {

0 commit comments

Comments
 (0)