Merge pull request #19 from zonghaoyuan/staging

chore: promote staging to main (favicon + home revamp)
This commit is contained in:
Zonghao Yuan
2026-06-03 11:27:16 +08:00
committed by GitHub
138 changed files with 1624 additions and 312 deletions
+13
View File
@@ -66,3 +66,16 @@
opacity: 0; opacity: 0;
} }
} }
/* Hide Next.js dev compiler indicators and static overlays completely */
next-route-announcer,
nextjs-portal,
#nextjs-dev-indicator,
.nextjs-static-indicator,
div[data-nextjs-toast-wrapper],
div[data-nextjs-toast] {
display: none !important;
visibility: hidden !important;
opacity: 0 !important;
pointer-events: none !important;
}
+11
View File
@@ -0,0 +1,11 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" width="64" height="64" role="img" aria-label="InfiPlot">
<defs>
<linearGradient id="bg" x1="0" y1="0" x2="0" y2="1">
<stop offset="0" stop-color="#FBF7F0"/>
<stop offset="1" stop-color="#F5EFE3"/>
</linearGradient>
</defs>
<rect width="64" height="64" rx="14" fill="url(#bg)"/>
<g transform="translate(4.90,51.00) scale(0.06080,-0.06080)"><path fill="#2D1810" d="M217.3741455078125 81Q217.3741455078125 52 222.649169921875 37.0Q227.9241943359375 22 244.16180419921875 17.0Q260.3994140625 12 293.3245849609375 12Q296.049560546875 12 296.049560546875 6.0Q296.049560546875 0 293.3245849609375 0Q267.6887426131811 0 236.71209977630878 1.0Q205.73545693943643 2 168.349853515625 2Q132.8749368601832 2 101.16251136516703 1.0Q69.45008587015086 0 43.650146484375 0Q41.3751220703125 0 41.3751220703125 6.0Q41.3751220703125 12 43.94013671875 12Q76.430322265625 12 93.10291748046875 17.0Q109.7755126953125 22 115.550537109375 37.0Q121.3255615234375 52 121.3255615234375 81V544Q121.3255615234375 573 115.715670437283 587.5Q110.10577935112848 602 93.27610609266493 607.5Q76.44643283420139 613 43.650146484375 613Q41.3751220703125 613 41.3751220703125 619.0Q41.3751220703125 625 43.650146484375 625Q69.45008587015086 625 101.16251136516703 623.5Q132.8749368601832 622 168.349853515625 622Q205.73545693943643 622 237.24617982522034 623.5Q268.7569027110043 625 293.3245849609375 625Q296.049560546875 625 296.049560546875 619.0Q296.049560546875 613 293.3245849609375 613Q260.8963074416257 613 244.6821686819698 607.0Q228.46802992231392 601 222.9210877150632 586.0Q217.3741455078125 571 217.3741455078125 542Z"/></g>
<g transform="translate(25.51,51.00) scale(0.06080,-0.06080)"><path fill="#D97A2E" d="M12.60003662109375 0Q9.800048828125 0 9.800048828125 6.0Q9.800048828125 12 12.60003662109375 12Q43.5999755859375 12 60.49993896484375 17.0Q77.39990234375 22 85.59988403320312 37.0Q93.79986572265625 52 98.79986572265625 81L179.9998779296875 544Q187.9998779296875 587.2000122070312 177.29989624023438 600.1000061035156Q166.59991455078125 613 119.800048828125 613Q117.60003662109375 613 117.60003662109375 619.0Q117.60003662109375 625 119.800048828125 625Q140.2000732421875 625 165.30010986328125 623.5Q190.400146484375 622 219.2001953125 622Q241.60015869140625 622 274.2001953125 625.0Q306.80023193359375 628 342.400146484375 628Q394.80029296875 628 435.9003601074219 609.3999938964844Q477.00042724609375 590.7999877929688 497.8004455566406 552.1999816894531Q518.6004638671875 513.5999755859375 506.80047607421875 453Q497.80047607421875 402.79998779296875 471.2004699707031 366.3999938964844Q444.6004638671875 330 408.6004638671875 307.0Q372.6004638671875 284 333.6004638671875 273.0Q294.6004638671875 262 260.6004638671875 262Q248.80047607421875 262 239.20046997070312 263.0Q229.6004638671875 264 219.6004638671875 267Q216.80047607421875 268 218.80047607421875 275.2000427246094Q220.80047607421875 282.40008544921875 224.00048828125 281.40008544921875Q231.80047607421875 279.40008544921875 239.30047607421875 278.40008544921875Q246.80047607421875 277.40008544921875 253.80047607421875 277.40008544921875Q292.20037841796875 277.40008544921875 330.500244140625 294.1000671386719Q368.80010986328125 310.800048828125 398.3999938964844 345.0000305175781Q427.9998779296875 379.20001220703125 437.599853515625 433Q448.1998291015625 490.5999755859375 433.79986572265625 530.699951171875Q419.39990234375 570.7999267578125 388.8999938964844 592.0999145507812Q358.40008544921875 613.39990234375 321.00018310546875 613.39990234375Q291.2003173828125 613.39990234375 275.20037841796875 609.5998840332031Q259.200439453125 605.7998657226562 251.1004638671875 590.9998779296875Q243.00048828125 576.1998901367188 236.20050048828125 542L155.20050048828125 81Q148.20050048828125 38 158.90048217773438 25.0Q169.6004638671875 12 216.2003173828125 12Q218.40032958984375 12 218.40032958984375 6.0Q218.40032958984375 0 216.2003173828125 0Q195.80029296875 0 169.20025634765625 1.0Q142.6002197265625 2 112.00018310546875 2Q84.20013427734375 2 58.200103759765625 1.0Q32.2000732421875 0 12.60003662109375 0Z"/></g>
</svg>

After

Width:  |  Height:  |  Size: 4.1 KiB

+771 -145
View File
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -962,7 +962,7 @@ function PlayInner() {
title="全屏 (F)" title="全屏 (F)"
> >
<i className="fa-solid fa-expand text-[10px]" /> <i className="fa-solid fa-expand text-[10px]" />
F · · F · · ·
</button> </button>
} }
aboveCanvasLeft={ aboveCanvasLeft={
+43
View File
@@ -71,6 +71,49 @@ export async function generateImage(
): Promise<GenerateImageResult> { ): Promise<GenerateImageResult> {
const url = config.baseUrl.replace(/\/$/, ""); const url = config.baseUrl.replace(/\/$/, "");
// 1. OpenAI-compatible route (GPTGod, DALL-E, etc.)
const isOpenAi = !url.includes("runware.ai") || config.model === "image-2-vip";
if (isOpenAi) {
const endpoint = url.endsWith("/images/generations") ? url : `${url}/images/generations`;
console.log(`[ai-client] Calling OpenAI-compatible image generations at: ${endpoint} with model: ${config.model}`);
const res = await fetchWithRetry(endpoint, {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${config.apiKey}`,
},
body: JSON.stringify({
model: config.model,
prompt: prompt,
n: 1,
size: "1792x1024", // Use horizontal size (16:9)
}),
});
const text = await res.text();
let json: any;
try {
json = JSON.parse(text);
} catch {
throw new Error(`OpenAI Image API error ${res.status}: ${text.slice(0, 500)}`);
}
if (json.error) {
throw new Error(`OpenAI Image API error: ${json.error.message || JSON.stringify(json.error)}`);
}
const data = json.data?.[0];
const imageUrl = data?.url;
if (!imageUrl) {
throw new Error(`No image URL in OpenAI response: ${text.slice(0, 300)}`);
}
// Generate a mock UUID since OpenAI compatible endpoint doesn't have UUIDs
const imageUuid = crypto.randomUUID();
return { imageUrl, imageUuid };
}
// 2. Runware task-array route
const task: Record<string, unknown> = { const task: Record<string, unknown> = {
taskType: "imageInference", taskType: "imageInference",
taskUUID: crypto.randomUUID(), taskUUID: crypto.randomUUID(),
+6
View File
@@ -53,9 +53,15 @@ export async function startSession(
// bible BEFORE the first scene. Serial by necessity (the opening Writer // bible BEFORE the first scene. Serial by necessity (the opening Writer
// reads session.storyState), but it gives the whole story a spine from beat // reads session.storyState), but it gives the whole story a spine from beat
// one — the latency is offset by the director's portrait/voice overlap win. // one — the latency is offset by the director's portrait/voice overlap win.
console.log(
`[start] worldSetting (${session.worldSetting.length} chars):\n${session.worldSetting}`,
);
const tArchitect = Date.now(); const tArchitect = Date.now();
session.storyState = await runArchitect(config.text, session); session.storyState = await runArchitect(config.text, session);
tlog("[start] Architect", tArchitect); tlog("[start] Architect", tArchitect);
console.log(
`[start] storyBible: logline="${session.storyState.logline}" | genreTags="${session.storyState.genreTags}" | synopsis="${session.storyState.synopsis}"`,
);
const { scene, sceneImageUrl, characters, storyState } = await directScene( const { scene, sceneImageUrl, characters, storyState } = await directScene(
config, config,
Binary file not shown.

Before

Width:  |  Height:  |  Size: 159 KiB

After

Width:  |  Height:  |  Size: 142 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 87 KiB

After

Width:  |  Height:  |  Size: 129 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 46 KiB

After

Width:  |  Height:  |  Size: 142 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 105 KiB

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 45 KiB

After

Width:  |  Height:  |  Size: 76 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 78 KiB

After

Width:  |  Height:  |  Size: 166 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 78 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 85 KiB

After

Width:  |  Height:  |  Size: 76 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 63 KiB

After

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 50 KiB

After

Width:  |  Height:  |  Size: 200 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 88 KiB

After

Width:  |  Height:  |  Size: 170 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 54 KiB

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 60 KiB

After

Width:  |  Height:  |  Size: 251 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 102 KiB

After

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 90 KiB

After

Width:  |  Height:  |  Size: 145 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 117 KiB

After

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 88 KiB

After

Width:  |  Height:  |  Size: 116 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 67 KiB

After

Width:  |  Height:  |  Size: 125 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 65 KiB

After

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 82 KiB

After

Width:  |  Height:  |  Size: 99 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 149 KiB

After

Width:  |  Height:  |  Size: 148 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

After

Width:  |  Height:  |  Size: 124 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 45 KiB

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 174 KiB

After

Width:  |  Height:  |  Size: 226 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 109 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 130 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 119 KiB

After

Width:  |  Height:  |  Size: 296 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 84 KiB

After

Width:  |  Height:  |  Size: 312 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 122 KiB

After

Width:  |  Height:  |  Size: 178 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB

After

Width:  |  Height:  |  Size: 168 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 84 KiB

After

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 54 KiB

After

Width:  |  Height:  |  Size: 172 KiB

File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long

Some files were not shown because too many files have changed in this diff Show More