feat(generator): add personalized Random Idea button powered by background profile + Whack Pack card + Codex
This commit is contained in:
1 parent
4c5560a5a1
commit
2b756ab127
5 files changed
+427
-4
No files matched your search
+40
-1
@@ -17,6 +17,10 @@ import {
|
||||
generateWithNanoBanana,
|
||||
isCodexConfigured
|
||||
} from "./nano_banana.js";
|
||||
import {
|
||||
DEFAULT_USER_BACKGROUND,
|
||||
generatePersonalizedRandomIdea
|
||||
} from "./idea_generator.js";
|
||||
|
||||
const __filename = fileURLToPath(import.meta.url);
|
||||
const __dirname = path.dirname(__filename);
|
||||
@@ -180,6 +184,36 @@ export function createAppServer({
|
||||
return;
|
||||
}
|
||||
|
||||
// 2b. POST /api/ideas/generate-random (Personalized Random Idea Generator)
|
||||
if (method === "POST" && pathname === "/api/ideas/generate-random") {
|
||||
const body = await readJsonBody(req);
|
||||
const userBackground =
|
||||
body.userBackground ||
|
||||
store.getSetting("user_background", DEFAULT_USER_BACKGROUND) ||
|
||||
DEFAULT_USER_BACKGROUND;
|
||||
const categoryFocus = body.category || "any";
|
||||
const existingTitles = store.listIdeas({}).map((i) => i.title);
|
||||
const savedKey = store.getSetting("gemini_api_key", "") || process.env.GEMINI_API_KEY || "";
|
||||
|
||||
const result = await generatePersonalizedRandomIdea({
|
||||
userBackground,
|
||||
categoryFocus,
|
||||
existingTitles,
|
||||
geminiApiKey: savedKey
|
||||
});
|
||||
|
||||
const created = store.createIdea({
|
||||
...result.ideaPayload,
|
||||
preserveRawTitle: true
|
||||
});
|
||||
|
||||
return sendJson(res, 201, {
|
||||
idea: created,
|
||||
card: result.card,
|
||||
generatorUsed: result.generatorUsed
|
||||
});
|
||||
}
|
||||
|
||||
// 3. GET / PATCH / DELETE /api/ideas/:id
|
||||
const ideaIdMatch = pathname.match(/^\/api\/ideas\/(\d+)$/);
|
||||
if (ideaIdMatch) {
|
||||
@@ -663,6 +697,7 @@ export function createAppServer({
|
||||
? "Authenticated via ~/.codex/auth.json"
|
||||
: "",
|
||||
nanoBananaModel: model,
|
||||
userBackground: store.getSetting("user_background", DEFAULT_USER_BACKGROUND) || DEFAULT_USER_BACKGROUND,
|
||||
availableModels: NANO_BANANA_MODELS,
|
||||
surfacePresets: Object.entries(SURFACE_PRESETS).map(([id, val]) => ({
|
||||
id,
|
||||
@@ -678,6 +713,9 @@ export function createAppServer({
|
||||
if (body.nanoBananaModel !== undefined) {
|
||||
store.setSetting("nano_banana_model", String(body.nanoBananaModel).trim());
|
||||
}
|
||||
if (body.userBackground !== undefined) {
|
||||
store.setSetting("user_background", String(body.userBackground).trim());
|
||||
}
|
||||
const savedKey = store.getSetting("gemini_api_key", "");
|
||||
const envKey = process.env.GEMINI_API_KEY || process.env.GOOGLE_API_KEY || "";
|
||||
const activeKey = savedKey || envKey;
|
||||
@@ -686,7 +724,8 @@ export function createAppServer({
|
||||
saved: true,
|
||||
hasApiKey: Boolean(activeKey) || codexReady,
|
||||
codexReady,
|
||||
nanoBananaModel: store.getSetting("nano_banana_model", "codex-image-gen")
|
||||
nanoBananaModel: store.getSetting("nano_banana_model", "codex-image-gen"),
|
||||
userBackground: store.getSetting("user_background", DEFAULT_USER_BACKGROUND) || DEFAULT_USER_BACKGROUND
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user