538 lines
27 KiB
JavaScript
538 lines
27 KiB
JavaScript
module.exports = [
|
|
"[externals]/next/dist/compiled/next-server/app-route-turbo.runtime.dev.js [external] (next/dist/compiled/next-server/app-route-turbo.runtime.dev.js, cjs)", ((__turbopack_context__, module, exports) => {
|
|
|
|
const mod = __turbopack_context__.x("next/dist/compiled/next-server/app-route-turbo.runtime.dev.js", () => require("next/dist/compiled/next-server/app-route-turbo.runtime.dev.js"));
|
|
|
|
module.exports = mod;
|
|
}),
|
|
"[externals]/next/dist/compiled/@opentelemetry/api [external] (next/dist/compiled/@opentelemetry/api, cjs)", ((__turbopack_context__, module, exports) => {
|
|
|
|
const mod = __turbopack_context__.x("next/dist/compiled/@opentelemetry/api", () => require("next/dist/compiled/@opentelemetry/api"));
|
|
|
|
module.exports = mod;
|
|
}),
|
|
"[externals]/next/dist/compiled/next-server/app-page-turbo.runtime.dev.js [external] (next/dist/compiled/next-server/app-page-turbo.runtime.dev.js, cjs)", ((__turbopack_context__, module, exports) => {
|
|
|
|
const mod = __turbopack_context__.x("next/dist/compiled/next-server/app-page-turbo.runtime.dev.js", () => require("next/dist/compiled/next-server/app-page-turbo.runtime.dev.js"));
|
|
|
|
module.exports = mod;
|
|
}),
|
|
"[externals]/next/dist/server/app-render/work-unit-async-storage.external.js [external] (next/dist/server/app-render/work-unit-async-storage.external.js, cjs)", ((__turbopack_context__, module, exports) => {
|
|
|
|
const mod = __turbopack_context__.x("next/dist/server/app-render/work-unit-async-storage.external.js", () => require("next/dist/server/app-render/work-unit-async-storage.external.js"));
|
|
|
|
module.exports = mod;
|
|
}),
|
|
"[externals]/next/dist/server/app-render/work-async-storage.external.js [external] (next/dist/server/app-render/work-async-storage.external.js, cjs)", ((__turbopack_context__, module, exports) => {
|
|
|
|
const mod = __turbopack_context__.x("next/dist/server/app-render/work-async-storage.external.js", () => require("next/dist/server/app-render/work-async-storage.external.js"));
|
|
|
|
module.exports = mod;
|
|
}),
|
|
"[externals]/next/dist/shared/lib/no-fallback-error.external.js [external] (next/dist/shared/lib/no-fallback-error.external.js, cjs)", ((__turbopack_context__, module, exports) => {
|
|
|
|
const mod = __turbopack_context__.x("next/dist/shared/lib/no-fallback-error.external.js", () => require("next/dist/shared/lib/no-fallback-error.external.js"));
|
|
|
|
module.exports = mod;
|
|
}),
|
|
"[externals]/next/dist/server/app-render/after-task-async-storage.external.js [external] (next/dist/server/app-render/after-task-async-storage.external.js, cjs)", ((__turbopack_context__, module, exports) => {
|
|
|
|
const mod = __turbopack_context__.x("next/dist/server/app-render/after-task-async-storage.external.js", () => require("next/dist/server/app-render/after-task-async-storage.external.js"));
|
|
|
|
module.exports = mod;
|
|
}),
|
|
"[externals]/crypto [external] (crypto, cjs)", ((__turbopack_context__, module, exports) => {
|
|
|
|
const mod = __turbopack_context__.x("crypto", () => require("crypto"));
|
|
|
|
module.exports = mod;
|
|
}),
|
|
"[externals]/next/dist/server/app-render/action-async-storage.external.js [external] (next/dist/server/app-render/action-async-storage.external.js, cjs)", ((__turbopack_context__, module, exports) => {
|
|
|
|
const mod = __turbopack_context__.x("next/dist/server/app-render/action-async-storage.external.js", () => require("next/dist/server/app-render/action-async-storage.external.js"));
|
|
|
|
module.exports = mod;
|
|
}),
|
|
"[project]/Documents/00 - projet/plumeia/src/lib/auth.ts [app-route] (ecmascript)", ((__turbopack_context__) => {
|
|
"use strict";
|
|
|
|
__turbopack_context__.s([
|
|
"auth",
|
|
()=>auth,
|
|
"handlers",
|
|
()=>handlers,
|
|
"signIn",
|
|
()=>signIn,
|
|
"signOut",
|
|
()=>signOut
|
|
]);
|
|
var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$node_modules$2f$next$2d$auth$2f$index$2e$js__$5b$app$2d$route$5d$__$28$ecmascript$29$__$3c$locals$3e$__ = __turbopack_context__.i("[project]/Documents/00 - projet/plumeia/node_modules/next-auth/index.js [app-route] (ecmascript) <locals>");
|
|
var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$node_modules$2f$next$2d$auth$2f$providers$2f$credentials$2e$js__$5b$app$2d$route$5d$__$28$ecmascript$29$__$3c$locals$3e$__ = __turbopack_context__.i("[project]/Documents/00 - projet/plumeia/node_modules/next-auth/providers/credentials.js [app-route] (ecmascript) <locals>");
|
|
var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$node_modules$2f40$auth$2f$core$2f$providers$2f$credentials$2e$js__$5b$app$2d$route$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/00 - projet/plumeia/node_modules/@auth/core/providers/credentials.js [app-route] (ecmascript)");
|
|
var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$node_modules$2f$bcryptjs$2f$index$2e$js__$5b$app$2d$route$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/00 - projet/plumeia/node_modules/bcryptjs/index.js [app-route] (ecmascript)");
|
|
;
|
|
;
|
|
;
|
|
const { handlers, signIn, signOut, auth } = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$node_modules$2f$next$2d$auth$2f$index$2e$js__$5b$app$2d$route$5d$__$28$ecmascript$29$__$3c$locals$3e$__["default"])({
|
|
providers: [
|
|
(0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$node_modules$2f40$auth$2f$core$2f$providers$2f$credentials$2e$js__$5b$app$2d$route$5d$__$28$ecmascript$29$__["default"])({
|
|
name: 'credentials',
|
|
credentials: {
|
|
email: {
|
|
label: 'Email',
|
|
type: 'email'
|
|
},
|
|
password: {
|
|
label: 'Password',
|
|
type: 'password'
|
|
}
|
|
},
|
|
async authorize (credentials) {
|
|
if (!credentials?.email || !credentials?.password) return null;
|
|
// Lazy import to avoid PrismaClient initialization during build
|
|
const { default: getDB } = await __turbopack_context__.A("[project]/Documents/00 - projet/plumeia/src/lib/prisma.ts [app-route] (ecmascript, async loader)");
|
|
const prisma = getDB();
|
|
const user = await prisma.user.findUnique({
|
|
where: {
|
|
email: credentials.email
|
|
}
|
|
});
|
|
if (!user) return null;
|
|
const isValid = await __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$node_modules$2f$bcryptjs$2f$index$2e$js__$5b$app$2d$route$5d$__$28$ecmascript$29$__["default"].compare(credentials.password, user.hashedPassword);
|
|
if (!isValid) return null;
|
|
return {
|
|
id: user.id,
|
|
email: user.email,
|
|
name: user.name
|
|
};
|
|
}
|
|
})
|
|
],
|
|
session: {
|
|
strategy: 'jwt'
|
|
},
|
|
callbacks: {
|
|
async jwt ({ token, user }) {
|
|
if (user) {
|
|
token.id = user.id;
|
|
}
|
|
return token;
|
|
},
|
|
async session ({ session, token }) {
|
|
if (session.user && token.id) {
|
|
session.user.id = token.id;
|
|
}
|
|
return session;
|
|
}
|
|
},
|
|
pages: {
|
|
signIn: '/'
|
|
}
|
|
});
|
|
}),
|
|
"[project]/Documents/00 - projet/plumeia/src/lib/prisma.ts [app-route] (ecmascript)", ((__turbopack_context__) => {
|
|
"use strict";
|
|
|
|
return __turbopack_context__.a(async (__turbopack_handle_async_dependencies__, __turbopack_async_result__) => { try {
|
|
|
|
__turbopack_context__.s([
|
|
"default",
|
|
()=>__TURBOPACK__default__export__,
|
|
"getDB",
|
|
()=>getDB
|
|
]);
|
|
var __TURBOPACK__imported__module__$5b$externals$5d2f40$prisma$2f$client__$5b$external$5d$__$2840$prisma$2f$client$2c$__cjs$2c$__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$node_modules$2f40$prisma$2f$client$29$__ = __turbopack_context__.i("[externals]/@prisma/client [external] (@prisma/client, cjs, [project]/Documents/00 - projet/plumeia/node_modules/@prisma/client)");
|
|
var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$node_modules$2f40$prisma$2f$adapter$2d$pg$2f$dist$2f$index$2e$mjs__$5b$app$2d$route$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/00 - projet/plumeia/node_modules/@prisma/adapter-pg/dist/index.mjs [app-route] (ecmascript)");
|
|
var __TURBOPACK__imported__module__$5b$externals$5d2f$pg__$5b$external$5d$__$28$pg$2c$__esm_import$2c$__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$node_modules$2f$pg$29$__ = __turbopack_context__.i("[externals]/pg [external] (pg, esm_import, [project]/Documents/00 - projet/plumeia/node_modules/pg)");
|
|
var __turbopack_async_dependencies__ = __turbopack_handle_async_dependencies__([
|
|
__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$node_modules$2f40$prisma$2f$adapter$2d$pg$2f$dist$2f$index$2e$mjs__$5b$app$2d$route$5d$__$28$ecmascript$29$__,
|
|
__TURBOPACK__imported__module__$5b$externals$5d2f$pg__$5b$external$5d$__$28$pg$2c$__esm_import$2c$__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$node_modules$2f$pg$29$__
|
|
]);
|
|
[__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$node_modules$2f40$prisma$2f$adapter$2d$pg$2f$dist$2f$index$2e$mjs__$5b$app$2d$route$5d$__$28$ecmascript$29$__, __TURBOPACK__imported__module__$5b$externals$5d2f$pg__$5b$external$5d$__$28$pg$2c$__esm_import$2c$__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$node_modules$2f$pg$29$__] = __turbopack_async_dependencies__.then ? (await __turbopack_async_dependencies__)() : __turbopack_async_dependencies__;
|
|
;
|
|
;
|
|
;
|
|
const globalForPrisma = globalThis;
|
|
function getDB() {
|
|
if (!globalForPrisma.prisma) {
|
|
const connectionString = process.env.DATABASE_URL;
|
|
const pool = new __TURBOPACK__imported__module__$5b$externals$5d2f$pg__$5b$external$5d$__$28$pg$2c$__esm_import$2c$__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$node_modules$2f$pg$29$__["Pool"]({
|
|
connectionString
|
|
});
|
|
const adapter = new __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$node_modules$2f40$prisma$2f$adapter$2d$pg$2f$dist$2f$index$2e$mjs__$5b$app$2d$route$5d$__$28$ecmascript$29$__["PrismaPg"](pool);
|
|
globalForPrisma.prisma = new __TURBOPACK__imported__module__$5b$externals$5d2f40$prisma$2f$client__$5b$external$5d$__$2840$prisma$2f$client$2c$__cjs$2c$__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$node_modules$2f40$prisma$2f$client$29$__["PrismaClient"]({
|
|
adapter
|
|
});
|
|
}
|
|
return globalForPrisma.prisma;
|
|
}
|
|
const __TURBOPACK__default__export__ = getDB;
|
|
__turbopack_async_result__();
|
|
} catch(e) { __turbopack_async_result__(e); } }, false);}),
|
|
"[externals]/child_process [external] (child_process, cjs)", ((__turbopack_context__, module, exports) => {
|
|
|
|
const mod = __turbopack_context__.x("child_process", () => require("child_process"));
|
|
|
|
module.exports = mod;
|
|
}),
|
|
"[externals]/fs [external] (fs, cjs)", ((__turbopack_context__, module, exports) => {
|
|
|
|
const mod = __turbopack_context__.x("fs", () => require("fs"));
|
|
|
|
module.exports = mod;
|
|
}),
|
|
"[externals]/https [external] (https, cjs)", ((__turbopack_context__, module, exports) => {
|
|
|
|
const mod = __turbopack_context__.x("https", () => require("https"));
|
|
|
|
module.exports = mod;
|
|
}),
|
|
"[externals]/stream [external] (stream, cjs)", ((__turbopack_context__, module, exports) => {
|
|
|
|
const mod = __turbopack_context__.x("stream", () => require("stream"));
|
|
|
|
module.exports = mod;
|
|
}),
|
|
"[externals]/os [external] (os, cjs)", ((__turbopack_context__, module, exports) => {
|
|
|
|
const mod = __turbopack_context__.x("os", () => require("os"));
|
|
|
|
module.exports = mod;
|
|
}),
|
|
"[externals]/events [external] (events, cjs)", ((__turbopack_context__, module, exports) => {
|
|
|
|
const mod = __turbopack_context__.x("events", () => require("events"));
|
|
|
|
module.exports = mod;
|
|
}),
|
|
"[externals]/process [external] (process, cjs)", ((__turbopack_context__, module, exports) => {
|
|
|
|
const mod = __turbopack_context__.x("process", () => require("process"));
|
|
|
|
module.exports = mod;
|
|
}),
|
|
"[externals]/util [external] (util, cjs)", ((__turbopack_context__, module, exports) => {
|
|
|
|
const mod = __turbopack_context__.x("util", () => require("util"));
|
|
|
|
module.exports = mod;
|
|
}),
|
|
"[externals]/path [external] (path, cjs)", ((__turbopack_context__, module, exports) => {
|
|
|
|
const mod = __turbopack_context__.x("path", () => require("path"));
|
|
|
|
module.exports = mod;
|
|
}),
|
|
"[externals]/querystring [external] (querystring, cjs)", ((__turbopack_context__, module, exports) => {
|
|
|
|
const mod = __turbopack_context__.x("querystring", () => require("querystring"));
|
|
|
|
module.exports = mod;
|
|
}),
|
|
"[externals]/buffer [external] (buffer, cjs)", ((__turbopack_context__, module, exports) => {
|
|
|
|
const mod = __turbopack_context__.x("buffer", () => require("buffer"));
|
|
|
|
module.exports = mod;
|
|
}),
|
|
"[externals]/fs/promises [external] (fs/promises, cjs)", ((__turbopack_context__, module, exports) => {
|
|
|
|
const mod = __turbopack_context__.x("fs/promises", () => require("fs/promises"));
|
|
|
|
module.exports = mod;
|
|
}),
|
|
"[externals]/node:stream [external] (node:stream, cjs)", ((__turbopack_context__, module, exports) => {
|
|
|
|
const mod = __turbopack_context__.x("node:stream", () => require("node:stream"));
|
|
|
|
module.exports = mod;
|
|
}),
|
|
"[externals]/node:stream/promises [external] (node:stream/promises, cjs)", ((__turbopack_context__, module, exports) => {
|
|
|
|
const mod = __turbopack_context__.x("node:stream/promises", () => require("node:stream/promises"));
|
|
|
|
module.exports = mod;
|
|
}),
|
|
"[externals]/http [external] (http, cjs)", ((__turbopack_context__, module, exports) => {
|
|
|
|
const mod = __turbopack_context__.x("http", () => require("http"));
|
|
|
|
module.exports = mod;
|
|
}),
|
|
"[externals]/net [external] (net, cjs)", ((__turbopack_context__, module, exports) => {
|
|
|
|
const mod = __turbopack_context__.x("net", () => require("net"));
|
|
|
|
module.exports = mod;
|
|
}),
|
|
"[externals]/tls [external] (tls, cjs)", ((__turbopack_context__, module, exports) => {
|
|
|
|
const mod = __turbopack_context__.x("tls", () => require("tls"));
|
|
|
|
module.exports = mod;
|
|
}),
|
|
"[externals]/url [external] (url, cjs)", ((__turbopack_context__, module, exports) => {
|
|
|
|
const mod = __turbopack_context__.x("url", () => require("url"));
|
|
|
|
module.exports = mod;
|
|
}),
|
|
"[externals]/zlib [external] (zlib, cjs)", ((__turbopack_context__, module, exports) => {
|
|
|
|
const mod = __turbopack_context__.x("zlib", () => require("zlib"));
|
|
|
|
module.exports = mod;
|
|
}),
|
|
"[project]/Documents/00 - projet/plumeia/src/lib/gemini.ts [app-route] (ecmascript)", ((__turbopack_context__) => {
|
|
"use strict";
|
|
|
|
__turbopack_context__.s([
|
|
"analyzeStyle",
|
|
()=>analyzeStyle,
|
|
"generateStoryContent",
|
|
()=>generateStoryContent,
|
|
"summarizeText",
|
|
()=>summarizeText,
|
|
"transformTextServer",
|
|
()=>transformTextServer
|
|
]);
|
|
// Server-only: Gemini AI service
|
|
// This file is only imported by API routes, never by client code
|
|
var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$node_modules$2f40$google$2f$genai$2f$dist$2f$node$2f$index$2e$mjs__$5b$app$2d$route$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/00 - projet/plumeia/node_modules/@google/genai/dist/node/index.mjs [app-route] (ecmascript)");
|
|
;
|
|
const truncate = (str, length)=>{
|
|
if (!str) return "";
|
|
return str.length > length ? str.substring(0, length) + "..." : str;
|
|
};
|
|
const checkUsage = (user)=>{
|
|
if (user.subscription.plan === 'master') return true;
|
|
return user.usage.aiActionsCurrent < user.usage.aiActionsLimit;
|
|
};
|
|
const buildContextPrompt = (project, currentChapterId, instruction)=>{
|
|
const currentChapterIndex = project.chapters.findIndex((c)=>c.id === currentChapterId);
|
|
const previousSummaries = project.chapters.slice(0, currentChapterIndex).map((c, i)=>`Chapitre ${i + 1} (${c.title}): ${c.summary || truncate(c.content.replace(/<[^>]*>?/gm, ''), 200)}`).join('\n');
|
|
const entitiesContext = project.entities.map((e)=>{
|
|
const base = `[${e.type}] ${e.name}: ${truncate(e.description, 150)}`;
|
|
const context = e.storyContext ? `\n - VÉCU/ÉVOLUTION DANS L'HISTOIRE: ${truncate(e.storyContext, 500)}` : '';
|
|
return base + context;
|
|
}).join('\n');
|
|
const ideasContext = (project.ideas || []).map((i)=>{
|
|
const statusMap = {
|
|
todo: 'À FAIRE',
|
|
progress: 'EN COURS',
|
|
done: 'TERMINÉ'
|
|
};
|
|
return `[IDÉE - ${statusMap[i.status]}] ${i.title}: ${truncate(i.description, 100)}`;
|
|
}).join('\n');
|
|
const currentContent = project.chapters[currentChapterIndex]?.content.replace(/<[^>]*>?/gm, '') || "";
|
|
const s = project.settings;
|
|
const settingsPrompt = s ? `
|
|
PARAMÈTRES DU ROMAN:
|
|
- Genre: ${s.genre} ${s.subGenre ? `(${s.subGenre})` : ''}
|
|
- Public: ${s.targetAudience}
|
|
- Ton: ${s.tone}
|
|
- Narration: ${s.pov}
|
|
- Temps: ${s.tense}
|
|
- Thèmes: ${s.themes}
|
|
- Synopsis Global: ${truncate(s.synopsis || '', 500)}
|
|
` : "";
|
|
return `
|
|
Tu es un assistant éditorial expert et un co-auteur créatif.
|
|
L'utilisateur écrit un livre intitulé "${project.title}".
|
|
|
|
${settingsPrompt}
|
|
|
|
CONTEXTE DE L'HISTOIRE (Résumé des chapitres précédents):
|
|
${previousSummaries || "Aucun chapitre précédent."}
|
|
|
|
BIBLE DU MONDE (Personnages et Lieux):
|
|
${entitiesContext || "Aucune fiche créée."}
|
|
|
|
BOÎTE À IDÉES & NOTES (Pistes de l'auteur):
|
|
${ideasContext || "Aucune note."}
|
|
|
|
CHAPITRE ACTUEL (Texte brut):
|
|
${truncate(currentContent, 3000)}
|
|
|
|
STYLE D'ÉCRITURE SPÉCIFIQUE (Instruction de l'auteur):
|
|
${project.styleGuide || "Standard, neutre."}
|
|
|
|
TA MISSION:
|
|
${instruction}
|
|
`;
|
|
};
|
|
const generateStoryContent = async (project, currentChapterId, userPrompt, user)=>{
|
|
if (!checkUsage(user)) {
|
|
return {
|
|
text: "Limite d'actions IA atteinte pour ce mois. Passez au plan Pro !",
|
|
type: 'reflection'
|
|
};
|
|
}
|
|
try {
|
|
const ai = new __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$node_modules$2f40$google$2f$genai$2f$dist$2f$node$2f$index$2e$mjs__$5b$app$2d$route$5d$__$28$ecmascript$29$__["GoogleGenAI"]({
|
|
apiKey: process.env.GEMINI_API_KEY
|
|
});
|
|
const finalPrompt = buildContextPrompt(project, currentChapterId, userPrompt);
|
|
const modelName = user.subscription.plan === 'master' ? 'gemini-3-pro-preview' : 'gemini-3-flash-preview';
|
|
const response = await ai.models.generateContent({
|
|
model: modelName,
|
|
contents: finalPrompt,
|
|
config: {
|
|
temperature: 0.7,
|
|
responseMimeType: "application/json",
|
|
responseSchema: {
|
|
type: __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$node_modules$2f40$google$2f$genai$2f$dist$2f$node$2f$index$2e$mjs__$5b$app$2d$route$5d$__$28$ecmascript$29$__["Type"].OBJECT,
|
|
properties: {
|
|
responseType: {
|
|
type: __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$node_modules$2f40$google$2f$genai$2f$dist$2f$node$2f$index$2e$mjs__$5b$app$2d$route$5d$__$28$ecmascript$29$__["Type"].STRING,
|
|
enum: [
|
|
"draft",
|
|
"reflection"
|
|
]
|
|
},
|
|
content: {
|
|
type: __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$node_modules$2f40$google$2f$genai$2f$dist$2f$node$2f$index$2e$mjs__$5b$app$2d$route$5d$__$28$ecmascript$29$__["Type"].STRING
|
|
}
|
|
}
|
|
}
|
|
}
|
|
});
|
|
const result = JSON.parse(response.text || "{}");
|
|
return {
|
|
text: result.content || "Erreur de génération.",
|
|
type: result.responseType || "reflection"
|
|
};
|
|
} catch (error) {
|
|
console.error("AI Generation Error:", error);
|
|
return {
|
|
text: "Erreur lors de la communication avec l'IA.",
|
|
type: 'reflection'
|
|
};
|
|
}
|
|
};
|
|
const transformTextServer = async (text, mode, context, user)=>{
|
|
if (!checkUsage(user)) return "Limite d'actions IA atteinte.";
|
|
try {
|
|
const ai = new __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$node_modules$2f40$google$2f$genai$2f$dist$2f$node$2f$index$2e$mjs__$5b$app$2d$route$5d$__$28$ecmascript$29$__["GoogleGenAI"]({
|
|
apiKey: process.env.GEMINI_API_KEY
|
|
});
|
|
const prompt = `Action: ${mode}. Texte: ${text}. Contexte: ${truncate(context, 1000)}. Renvoie juste le texte transformé.`;
|
|
const response = await ai.models.generateContent({
|
|
model: 'gemini-3-flash-preview',
|
|
contents: prompt
|
|
});
|
|
return response.text?.trim() || text;
|
|
} catch {
|
|
return text;
|
|
}
|
|
};
|
|
const analyzeStyle = async (_text)=>"Style analysé";
|
|
const summarizeText = async (_text)=>"Résumé généré";
|
|
}),
|
|
"[project]/Documents/00 - projet/plumeia/src/app/api/ai/generate/route.ts [app-route] (ecmascript)", ((__turbopack_context__) => {
|
|
"use strict";
|
|
|
|
return __turbopack_context__.a(async (__turbopack_handle_async_dependencies__, __turbopack_async_result__) => { try {
|
|
|
|
__turbopack_context__.s([
|
|
"POST",
|
|
()=>POST,
|
|
"dynamic",
|
|
()=>dynamic
|
|
]);
|
|
var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$node_modules$2f$next$2f$server$2e$js__$5b$app$2d$route$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/00 - projet/plumeia/node_modules/next/server.js [app-route] (ecmascript)");
|
|
var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$src$2f$lib$2f$auth$2e$ts__$5b$app$2d$route$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/00 - projet/plumeia/src/lib/auth.ts [app-route] (ecmascript)");
|
|
var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$src$2f$lib$2f$prisma$2e$ts__$5b$app$2d$route$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/00 - projet/plumeia/src/lib/prisma.ts [app-route] (ecmascript)");
|
|
var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$src$2f$lib$2f$gemini$2e$ts__$5b$app$2d$route$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/00 - projet/plumeia/src/lib/gemini.ts [app-route] (ecmascript)");
|
|
var __turbopack_async_dependencies__ = __turbopack_handle_async_dependencies__([
|
|
__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$src$2f$lib$2f$prisma$2e$ts__$5b$app$2d$route$5d$__$28$ecmascript$29$__
|
|
]);
|
|
[__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$src$2f$lib$2f$prisma$2e$ts__$5b$app$2d$route$5d$__$28$ecmascript$29$__] = __turbopack_async_dependencies__.then ? (await __turbopack_async_dependencies__)() : __turbopack_async_dependencies__;
|
|
const dynamic = 'force-dynamic';
|
|
;
|
|
;
|
|
;
|
|
;
|
|
async function POST(request) {
|
|
try {
|
|
const session = await (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$src$2f$lib$2f$auth$2e$ts__$5b$app$2d$route$5d$__$28$ecmascript$29$__["auth"])();
|
|
if (!session?.user?.id) {
|
|
return __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$node_modules$2f$next$2f$server$2e$js__$5b$app$2d$route$5d$__$28$ecmascript$29$__["NextResponse"].json({
|
|
error: 'Non autorisé'
|
|
}, {
|
|
status: 401
|
|
});
|
|
}
|
|
const prisma = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$src$2f$lib$2f$prisma$2e$ts__$5b$app$2d$route$5d$__$28$ecmascript$29$__["default"])();
|
|
// Check AI usage limit from DB
|
|
const dbUser = await prisma.user.findUnique({
|
|
where: {
|
|
id: session.user.id
|
|
},
|
|
include: {
|
|
subscriptionPlan: true
|
|
}
|
|
}); // Bypass Prisma client types for this relation
|
|
if (!dbUser) {
|
|
return __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$node_modules$2f$next$2f$server$2e$js__$5b$app$2d$route$5d$__$28$ecmascript$29$__["NextResponse"].json({
|
|
error: 'Utilisateur non trouvé'
|
|
}, {
|
|
status: 404
|
|
});
|
|
}
|
|
const limit = dbUser.subscriptionPlan?.maxAiActions ?? 100;
|
|
const planName = dbUser.subscriptionPlan?.displayName || 'Gratuit';
|
|
if (limit !== -1 && dbUser.aiActionsUsed >= limit) {
|
|
return __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$node_modules$2f$next$2f$server$2e$js__$5b$app$2d$route$5d$__$28$ecmascript$29$__["NextResponse"].json({
|
|
error: `Limite de ${limit} actions IA atteinte pour le plan ${planName}. Passez au plan supérieur !`
|
|
}, {
|
|
status: 403
|
|
});
|
|
}
|
|
const body = await request.json();
|
|
const { project, chapterId, prompt, user } = body;
|
|
if (!project || !prompt || !user) {
|
|
return __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$node_modules$2f$next$2f$server$2e$js__$5b$app$2d$route$5d$__$28$ecmascript$29$__["NextResponse"].json({
|
|
error: 'Missing required fields: project, prompt, user'
|
|
}, {
|
|
status: 400
|
|
});
|
|
}
|
|
// Pass real plan from DB to gemini for model selection
|
|
const userWithPlan = {
|
|
...user,
|
|
subscription: {
|
|
...user.subscription,
|
|
plan: dbUser.plan
|
|
}
|
|
};
|
|
const result = await (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$src$2f$lib$2f$gemini$2e$ts__$5b$app$2d$route$5d$__$28$ecmascript$29$__["generateStoryContent"])(project, chapterId || '', prompt, userWithPlan);
|
|
// Increment usage in DB
|
|
await prisma.user.update({
|
|
where: {
|
|
id: session.user.id
|
|
},
|
|
data: {
|
|
aiActionsUsed: {
|
|
increment: 1
|
|
}
|
|
}
|
|
});
|
|
return __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$node_modules$2f$next$2f$server$2e$js__$5b$app$2d$route$5d$__$28$ecmascript$29$__["NextResponse"].json({
|
|
...result,
|
|
aiActionsUsed: dbUser.aiActionsUsed + 1
|
|
});
|
|
} catch (error) {
|
|
console.error('AI generate error:', error);
|
|
return __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$00__$2d$__projet$2f$plumeia$2f$node_modules$2f$next$2f$server$2e$js__$5b$app$2d$route$5d$__$28$ecmascript$29$__["NextResponse"].json({
|
|
error: 'AI generation failed'
|
|
}, {
|
|
status: 500
|
|
});
|
|
}
|
|
}
|
|
__turbopack_async_result__();
|
|
} catch(e) { __turbopack_async_result__(e); } }, false);}),
|
|
];
|
|
|
|
//# sourceMappingURL=%5Broot-of-the-server%5D__630db118._.js.map
|