Midday / apps /api /src /ai /tools /get-documents.ts
Jules
Final deployment with all fixes and verified content
c09f67c
import type { AppContext } from "@api/ai/agents/config/shared";
import { db } from "@midday/db/client";
import { getDocuments } from "@midday/db/queries";
import { getAppUrl } from "@midday/utils/envs";
import { formatDate } from "@midday/utils/format";
import { tool } from "ai";
import { z } from "zod";
const getDocumentsSchema = z.object({
cursor: z.string().nullable().optional().describe("Pagination cursor"),
pageSize: z.number().min(1).max(100).default(10).describe("Page size"),
q: z.string().nullable().optional().describe("Search query"),
tags: z.array(z.string()).nullable().optional().describe("Tag IDs"),
start: z.string().nullable().optional().describe("Start date (ISO 8601)"),
end: z.string().nullable().optional().describe("End date (ISO 8601)"),
});
export const getDocumentsTool = tool({
description:
"Retrieve and filter documents with pagination, sorting, and search.",
inputSchema: getDocumentsSchema,
execute: async function* (
{ cursor, pageSize = 10, q, tags, start, end },
executionOptions,
) {
const appContext = executionOptions.experimental_context as AppContext;
const teamId = appContext.teamId as string;
if (!teamId) {
yield {
text: "Unable to retrieve documents: Team ID not found in context.",
};
return;
}
try {
const params = {
teamId,
cursor: cursor ?? null,
pageSize,
q: q ?? null,
tags: tags ?? null,
start: start ?? null,
end: end ?? null,
};
const result = await getDocuments(db, params);
if (result.data.length === 0) {
yield { text: "No documents found matching your criteria." };
return;
}
const formattedDocuments = result.data.map((document) => {
const tagNames =
document.documentTagAssignments
?.map((dta) => dta.documentTag?.name)
.filter((name): name is string => Boolean(name))
.join(", ") || "None";
return {
id: document.id,
name: document.name?.split("/").pop() || "Untitled",
title:
document.title || document.name?.split("/").pop() || "Untitled",
date: document.date ? formatDate(document.date) : "N/A",
tags: tagNames,
status: document.processingStatus || "unknown",
};
});
const response = `| Name | Title | Date | Tags | Status |\n|------|-------|------|------|--------|\n${formattedDocuments.map((doc) => `| ${doc.name} | ${doc.title} | ${doc.date} | ${doc.tags} | ${doc.status} |`).join("\n")}\n\n**${result.data.length} documents**`;
yield {
text: response,
link: {
text: "View all documents",
url: `${getAppUrl()}/vault`,
},
};
} catch (error) {
yield {
text: `Failed to retrieve documents: ${error instanceof Error ? error.message : "Unknown error"}`,
};
}
},
});