| 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"}`, |
| }; |
| } |
| }, |
| }); |
|
|