@directus/api
Version:
Directus is a real-time API and App dashboard for managing SQL database content
170 lines (168 loc) • 5.57 kB
JavaScript
import { clearSystemCache } from "../../../cache.js";
import database_default from "../../../database/index.js";
import { transaction } from "../../../utils/transaction.js";
import { shouldClearCache } from "../../../utils/should-clear-cache.js";
import { requireText } from "../../../utils/require-text.js";
import { defineTool } from "../define-tool.js";
import { getSchema } from "../../../utils/get-schema.js";
import { FieldsService } from "../../../services/fields.js";
import { FieldItemInputSchema, FieldItemOutputSchema, FieldItemValidateSchema, RawFieldItemInputSchema, RawFieldItemValidateSchema } from "../schema.js";
import { InvalidPayloadError } from "@directus/errors";
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/fields/index.ts
const __dirname = dirname(fileURLToPath(import.meta.url));
const FieldsBaseValidateSchema = z$1.strictObject({ collection: z$1.string() });
const FieldsValidateSchema = z$1.discriminatedUnion("action", [
FieldsBaseValidateSchema.extend({
action: z$1.literal("create"),
data: z$1.union([z$1.array(FieldItemValidateSchema), FieldItemValidateSchema])
}),
z$1.object({
action: z$1.literal("read"),
collection: z$1.string().optional(),
field: z$1.string().optional()
}),
FieldsBaseValidateSchema.extend({
action: z$1.literal("update"),
data: z$1.array(RawFieldItemValidateSchema.partial({ type: true }))
}),
FieldsBaseValidateSchema.extend({
action: z$1.literal("delete"),
field: z$1.string()
})
]);
const FieldsInputSchema = z$1.object({
action: z$1.enum([
"read",
"create",
"update",
"delete"
]).describe("The operation to perform"),
collection: z$1.string().describe("The name of the collection").optional(),
field: z$1.string().describe("The name of the field. Required for delete. Optional for read (omit to read all fields). Do not use for create or update.").optional(),
data: z$1.array(FieldItemInputSchema.extend({ children: RawFieldItemInputSchema.shape.children }).partial().required({ field: true })).describe("Array of field objects for create/update actions. Each object must include \"field\" (the field name).").optional()
});
const FieldsOutputSchema = z$1.object({ data: z$1.union([
z$1.array(FieldItemOutputSchema),
FieldItemOutputSchema,
z$1.object({
collection: z$1.string(),
field: z$1.string()
}),
z$1.null()
]) });
const fields = defineTool({
name: "fields",
admin: true,
description: "Reads and changes Directus fields. Use to inspect, add, update, or delete fields on collections, including relational and alias fields.",
instructions: requireText(resolve(__dirname, "./prompt.md")),
keywords: [
"columns",
"properties",
"field types",
"interfaces",
"aliases",
"database fields"
],
annotations: {
title: "Directus - Fields",
destructiveHint: true
},
inputSchema: FieldsInputSchema,
validateSchema: FieldsValidateSchema,
output: FieldsOutputSchema,
readOnly: (input) => input.action === "read",
async handler({ args, schema, accountability }) {
let service = new FieldsService({
schema,
accountability
});
if (args.action === "create") {
const fields$1 = toArray(args.data);
const knex = database_default();
const result = [];
await transaction(knex, async (trx) => {
service = new FieldsService({
schema,
accountability,
knex: trx
});
for (const field of fields$1) await service.createField(args.collection, field, void 0, {
autoPurgeCache: false,
autoPurgeSystemCache: false
});
});
if (shouldClearCache(service.cache)) await service.cache.clear();
await clearSystemCache();
service = new FieldsService({
schema: await getSchema(),
accountability
});
for (const field of fields$1) {
const createdField = await service.readOne(args.collection, field.field);
result.push(createdField);
}
return {
type: "text",
data: result || null
};
}
if (args.action === "read") {
let result = null;
if (args.collection) if (args.field) result = await service.readOne(args.collection, args.field);
else result = await service.readAll(args.collection);
else result = await service.readAll();
return {
type: "text",
data: result || null
};
}
if (args.action === "update") {
const fields$1 = toArray(args.data);
const knex = database_default();
const result = [];
await transaction(knex, async (trx) => {
service = new FieldsService({
schema,
accountability,
knex: trx
});
for (const field of fields$1) await service.updateField(args.collection, field, {
autoPurgeCache: false,
autoPurgeSystemCache: false
});
});
if (shouldClearCache(service.cache)) await service.cache.clear();
await clearSystemCache();
service = new FieldsService({
schema: await getSchema(),
accountability
});
for (const field of fields$1) {
const updatedField = await service.readOne(args.collection, field.field);
result.push(updatedField);
}
return {
type: "text",
data: result || null
};
}
if (args.action === "delete") {
const { collection, field } = args;
await service.deleteField(collection, field);
return {
type: "text",
data: {
collection,
field
}
};
}
throw new InvalidPayloadError({ reason: "Invalid action" });
}
});
//#endregion
export { FieldsBaseValidateSchema, FieldsInputSchema, FieldsValidateSchema, fields };