ci: fix unhandled typescript exceptions and strict eslint errors caught by the pipeline
Some checks failed
Monorepo Pipeline / ⚡ Prioritize Release (push) Successful in 2s
Monorepo Pipeline / 🧹 Lint (push) Failing after 9s
Monorepo Pipeline / 🏗️ Build (push) Failing after 9s
Monorepo Pipeline / 🧪 Test (push) Failing after 9s
Monorepo Pipeline / 🚀 Release (push) Has been skipped
Monorepo Pipeline / 🐳 Build Gatekeeper (Product) (push) Has been skipped
Monorepo Pipeline / 🐳 Build Build-Base (push) Has been skipped
Monorepo Pipeline / 🐳 Build Production Runtime (push) Has been skipped

This commit is contained in:
2026-03-06 15:49:45 +01:00
parent 2dc61e4937
commit 61f2f83e0c
10 changed files with 1914 additions and 1223 deletions

View File

@@ -1,90 +1,98 @@
import type { Config, Plugin } from 'payload'
import { AIChatPermissionsCollection } from './collections/AIChatPermissions.js'
import type { PayloadChatPluginConfig } from './types.js'
import { optimizePostEndpoint } from './endpoints/optimizeEndpoint.js'
import { generateSlugEndpoint, generateThumbnailEndpoint, generateSingleFieldEndpoint } from './endpoints/generateEndpoints.js'
import type { Plugin } from "payload";
import { AIChatPermissionsCollection } from "./collections/AIChatPermissions.js";
import type { PayloadChatPluginConfig } from "./types.js";
import { optimizePostEndpoint } from "./endpoints/optimizeEndpoint.js";
import {
generateSlugEndpoint,
generateThumbnailEndpoint,
generateSingleFieldEndpoint,
} from "./endpoints/generateEndpoints.js";
export const payloadChatPlugin =
(pluginOptions: PayloadChatPluginConfig): Plugin =>
(incomingConfig) => {
let config = { ...incomingConfig }
(pluginOptions: PayloadChatPluginConfig): Plugin =>
(incomingConfig) => {
const config = { ...incomingConfig };
// If disabled, return config untouched
if (pluginOptions.enabled === false) {
return config
}
// If disabled, return config untouched
if (pluginOptions.enabled === false) {
return config;
}
// 1. Inject the Permissions Collection into the Schema
const existingCollections = config.collections || []
// 1. Inject the Permissions Collection into the Schema
const existingCollections = config.collections || [];
const mcpServers = pluginOptions.mcpServers || []
const mcpServers = pluginOptions.mcpServers || [];
// Dynamically populate the select options for Collections and MCP Servers
const permissionCollection = { ...AIChatPermissionsCollection }
const collectionField = permissionCollection.fields.find(f => 'name' in f && f.name === 'allowedCollections') as any
if (collectionField) {
collectionField.options = existingCollections.map(c => ({
label: c.labels?.singular || c.slug,
value: c.slug
}))
}
// Dynamically populate the select options for Collections and MCP Servers
const permissionCollection = { ...AIChatPermissionsCollection };
const collectionField = permissionCollection.fields.find(
(f) => "name" in f && f.name === "allowedCollections",
) as any;
if (collectionField) {
collectionField.options = existingCollections.map((c) => ({
label: c.labels?.singular || c.slug,
value: c.slug,
}));
}
const mcpField = permissionCollection.fields.find(f => 'name' in f && f.name === 'allowedMcpServers') as any
if (mcpField) {
mcpField.options = mcpServers.map(s => ({
label: s.name,
value: s.name
}))
}
const mcpField = permissionCollection.fields.find(
(f) => "name" in f && f.name === "allowedMcpServers",
) as any;
if (mcpField) {
mcpField.options = mcpServers.map((s) => ({
label: s.name,
value: s.name,
}));
}
config.collections = [...existingCollections, permissionCollection]
config.collections = [...existingCollections, permissionCollection];
// 2. Register Custom API Endpoint for the AI Chat
config.endpoints = [
...(config.endpoints || []),
{
path: '/api/mcp-chat',
method: 'post',
handler: async (req) => {
// Fallback simple handler while developing endpoint logic
return Response.json({ message: "Chat endpoint active" })
},
},
{
path: '/api/mintel-ai/optimize',
method: 'post',
handler: optimizePostEndpoint,
},
{
path: '/api/mintel-ai/generate-slug',
method: 'post',
handler: generateSlugEndpoint,
},
{
path: '/api/mintel-ai/generate-thumbnail',
method: 'post',
handler: generateThumbnailEndpoint,
},
{
path: '/api/mintel-ai/generate-single-field',
method: 'post',
handler: generateSingleFieldEndpoint,
},
]
// 2. Register Custom API Endpoint for the AI Chat
config.endpoints = [
...(config.endpoints || []),
{
path: "/api/mcp-chat",
method: "post",
handler: async (_req) => {
// Fallback simple handler while developing endpoint logic
return Response.json({ message: "Chat endpoint active" });
},
},
{
path: "/api/mintel-ai/optimize",
method: "post",
handler: optimizePostEndpoint,
},
{
path: "/api/mintel-ai/generate-slug",
method: "post",
handler: generateSlugEndpoint,
},
{
path: "/api/mintel-ai/generate-thumbnail",
method: "post",
handler: generateThumbnailEndpoint,
},
{
path: "/api/mintel-ai/generate-single-field",
method: "post",
handler: generateSingleFieldEndpoint,
},
];
// 3. Inject Chat React Component into Admin UI
if (pluginOptions.renderChatBubble !== false) {
config.admin = {
...(config.admin || {}),
components: {
...(config.admin?.components || {}),
providers: [
...(config.admin?.components?.providers || []),
'@mintel/payload-ai/components/ChatWindow#ChatWindowProvider',
],
},
}
}
// 3. Inject Chat React Component into Admin UI
if (pluginOptions.renderChatBubble !== false) {
config.admin = {
...(config.admin || {}),
components: {
...(config.admin?.components || {}),
providers: [
...(config.admin?.components?.providers || []),
"@mintel/payload-ai/components/ChatWindow#ChatWindowProvider",
],
},
};
}
return config
}
return config;
};