fix(KB-090): improve refinement route validation with trimmed feedback

- Trim whitespace from feedback before length validation
- Catch whitespace-only input at route level before store call
- Update test to verify route-level validation blocks empty feedback
- Use trimmed feedback for store operations and logging
This commit is contained in:
gsxdsm
2026-03-30 11:27:06 -07:00
parent 50cd478f2e
commit a06a2cff27
2 changed files with 9 additions and 7 deletions

View File

@@ -573,15 +573,15 @@ describe("POST /tasks/:id/refine", () => {
expect(res.body.error).toContain("not found");
});
it("returns 400 when feedback is whitespace only (rejected by store)", async () => {
(store.refineTask as ReturnType<typeof vi.fn>).mockRejectedValue(new Error("Feedback is required and cannot be empty"));
it("returns 400 when feedback is whitespace only (caught at validation)", async () => {
// Route-level validation now catches whitespace-only input before it reaches the store
const res = await REQUEST(buildApp(), "POST", "/api/tasks/KB-001/refine", JSON.stringify({ feedback: " " }), {
"Content-Type": "application/json",
});
expect(res.status).toBe(400);
expect(res.body.error).toContain("Feedback is required");
expect(res.body.error).toContain("feedback must be between 1 and 2000 characters");
expect(store.refineTask).not.toHaveBeenCalled();
});
it("returns 500 on unexpected errors", async () => {

View File

@@ -722,13 +722,15 @@ export function createApiRoutes(store: TaskStore, options?: ServerOptions): Rout
res.status(400).json({ error: "feedback is required and must be a string" });
return;
}
if (feedback.length === 0 || feedback.length > 2000) {
// Trim before checking length to catch whitespace-only input
const trimmedFeedback = feedback.trim();
if (trimmedFeedback.length === 0 || trimmedFeedback.length > 2000) {
res.status(400).json({ error: "feedback must be between 1 and 2000 characters" });
return;
}
const refinedTask = await store.refineTask(req.params.id, feedback);
await store.logEntry(req.params.id, "Refinement requested", feedback);
const refinedTask = await store.refineTask(req.params.id, trimmedFeedback);
await store.logEntry(req.params.id, "Refinement requested", trimmedFeedback);
res.status(201).json(refinedTask);
} catch (err: any) {
const status = err.code === "ENOENT" ? 404