feat(generator): add personalized Random Idea button powered by background profile + Whack Pack card + Codex

This commit is contained in:
airent106 committed 2026-10-29 11:59:05 -06:00
1 parent 4c5560a5a1
commit 2b756ab127
5 files changed
+427 -4

No files matched your search

+40 -1
View File
@@ -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
});
}
}