@directus/api
Version:
Directus is a real-time API and App dashboard for managing SQL database content
113 lines (111 loc) • 3.9 kB
JavaScript
import { FoldersService } from "../../../services/folders.js";
import { requireText } from "../../../utils/require-text.js";
import { defineTool } from "../define-tool.js";
import { FolderItemInputSchema, FolderItemOutputSchema, FolderItemValidateSchema, PrimaryKeyInputSchema, PrimaryKeyOutputSchema, PrimaryKeyValidateSchema, QueryInputSchema, QueryValidateSchema } from "../schema.js";
import { buildSanitizedQueryFromArgs } from "../utils.js";
import { toArray } from "@directus/utils";
import { fileURLToPath } from "node:url";
import { z as z$1 } from "zod";
import { dirname, resolve } from "node:path";
//#region src/ai/tools/folders/index.ts
const __dirname = dirname(fileURLToPath(import.meta.url));
const FoldersValidateSchema = z$1.discriminatedUnion("action", [
z$1.strictObject({
action: z$1.literal("create"),
data: z$1.union([z$1.array(FolderItemValidateSchema), FolderItemValidateSchema]),
query: QueryValidateSchema.optional()
}),
z$1.strictObject({
action: z$1.literal("read"),
keys: z$1.array(PrimaryKeyValidateSchema).optional(),
query: QueryValidateSchema.optional()
}),
z$1.strictObject({
action: z$1.literal("update"),
data: FolderItemValidateSchema,
keys: z$1.array(PrimaryKeyValidateSchema).optional(),
query: QueryValidateSchema.optional()
}),
z$1.strictObject({
action: z$1.literal("delete"),
keys: z$1.array(PrimaryKeyValidateSchema)
})
]);
const FoldersInputSchema = z$1.object({
action: z$1.enum([
"create",
"read",
"update",
"delete"
]).describe("The operation to perform"),
query: QueryInputSchema.optional(),
keys: z$1.array(PrimaryKeyInputSchema).optional(),
data: z$1.array(FolderItemInputSchema).optional()
});
const FoldersOutputSchema = z$1.object({ data: z$1.union([
z$1.array(FolderItemOutputSchema),
z$1.array(PrimaryKeyOutputSchema),
z$1.null()
]) });
const folders = defineTool({
name: "folders",
description: "Reads and changes Directus file folders. Use to organize files into folder hierarchies or inspect existing folder records.",
instructions: requireText(resolve(__dirname, "./prompt.md")),
keywords: [
"directories",
"media folders",
"file organization",
"parent folder"
],
annotations: {
title: "Directus - Folders",
destructiveHint: true
},
inputSchema: FoldersInputSchema,
validateSchema: FoldersValidateSchema,
output: FoldersOutputSchema,
readOnly: (input) => input.action === "read",
async handler({ args, schema, accountability }) {
const service = new FoldersService({
schema,
accountability
});
if (args.action === "create") {
const sanitizedQuery = await buildSanitizedQueryFromArgs(args, schema, accountability);
const data = toArray(args.data);
const savedKeys = await service.createMany(data);
return {
type: "text",
data: await service.readMany(savedKeys, sanitizedQuery) || null
};
}
if (args.action === "read") {
const sanitizedQuery = await buildSanitizedQueryFromArgs(args, schema, accountability);
let result = null;
if (args.keys) result = await service.readMany(args.keys, sanitizedQuery);
else result = await service.readByQuery(sanitizedQuery);
return {
type: "text",
data: result || null
};
}
if (args.action === "update") {
const sanitizedQuery = await buildSanitizedQueryFromArgs(args, schema, accountability);
let updatedKeys = [];
if (Array.isArray(args.data)) updatedKeys = await service.updateBatch(args.data);
else if (args.keys) updatedKeys = await service.updateMany(args.keys, args.data);
else updatedKeys = await service.updateByQuery(sanitizedQuery, args.data);
return {
type: "text",
data: await service.readMany(updatedKeys, sanitizedQuery)
};
}
if (args.action === "delete") return {
type: "text",
data: await service.deleteMany(args.keys)
};
throw new Error("Invalid action.");
}
});
//#endregion
export { folders };