+
+
+

+
+
+
+ GENARRATIVE
+
+
{APP_NAME}
+
面向游戏创作者的智能创作客户端
+
+
+
+
+
- 客户端版本
+ -
+ v{APP_VERSION}
+
+
+
+
- 运行环境
+ - 桌面客户端
+
+
+
+ ) : null}
diff --git a/apps/ai-game-creator-shell/src/styles.css b/apps/ai-game-creator-shell/src/styles.css
index 1721e16b8..2f8f6e3e2 100644
--- a/apps/ai-game-creator-shell/src/styles.css
+++ b/apps/ai-game-creator-shell/src/styles.css
@@ -3212,6 +3212,101 @@ h2 {
box-shadow: 0 0 0 3px var(--platform-input-focus-ring);
}
+.runtime-settings-about {
+ grid-column: 1 / -1;
+ display: grid;
+ gap: 14px;
+ max-width: 680px;
+}
+
+.runtime-settings-about-hero {
+ display: flex;
+ align-items: center;
+ gap: 18px;
+ min-height: 158px;
+ padding: 24px;
+ border: 1px solid var(--platform-subpanel-border);
+ border-radius: 16px;
+ background: var(--runtime-settings-subpanel-fill);
+}
+
+.runtime-settings-about-mark {
+ display: grid;
+ flex: 0 0 auto;
+ width: 72px;
+ height: 72px;
+ border: 1px solid var(--platform-nav-active-border);
+ border-radius: 20px;
+ background: var(--platform-nav-active-fill);
+ color: var(--platform-accent);
+ font-size: 32px;
+ font-weight: 900;
+ letter-spacing: -0.08em;
+ place-items: center;
+ box-shadow: var(--platform-nav-active-shadow);
+}
+
+.runtime-settings-about-mark img {
+ width: 100%;
+ height: 100%;
+ object-fit: contain;
+ transform: scale(1.35);
+}
+
+.runtime-settings-about-hero > div:last-child {
+ display: grid;
+ gap: 5px;
+ min-width: 0;
+}
+
+.runtime-settings-about-kicker {
+ color: var(--platform-accent);
+ font-size: 10px;
+ font-weight: 900;
+ letter-spacing: 0.16em;
+}
+
+.runtime-settings-about-hero h4 {
+ margin: 0;
+ color: var(--platform-text-strong);
+ font-size: 20px;
+ letter-spacing: -0.03em;
+}
+
+.runtime-settings-about-hero p {
+ margin: 0;
+ color: var(--platform-text-soft);
+ font-size: 12px;
+}
+
+.runtime-settings-about-meta {
+ display: grid;
+ grid-template-columns: repeat(2, minmax(0, 1fr));
+ gap: 10px;
+ margin: 0;
+}
+
+.runtime-settings-about-meta > div {
+ display: grid;
+ gap: 7px;
+ padding: 14px;
+ border: 1px solid var(--platform-subpanel-border);
+ border-radius: 12px;
+ background: var(--runtime-settings-subpanel-fill);
+}
+
+.runtime-settings-about-meta dt {
+ color: var(--platform-text-soft);
+ font-size: 10px;
+}
+
+.runtime-settings-about-meta dd {
+ margin: 0;
+ color: var(--platform-text-strong);
+ font-size: 14px;
+ font-weight: 800;
+}
+
.runtime-agent-list {
grid-column: 1 / -1;
display: grid;
@@ -4034,6 +4129,16 @@ iframe.preview-frame {
grid-template-columns: 1fr;
}
+ .runtime-settings-about-hero {
+ align-items: flex-start;
+ flex-direction: column;
+ min-height: 0;
+ }
+
+ .runtime-settings-about-meta {
+ grid-template-columns: 1fr;
+ }
+
.runtime-agent-card-summary > span:last-child {
max-width: 48%;
text-align: right;
diff --git a/apps/ai-game-creator-shell/tests/appSurface/runtime-settings.suite.ts b/apps/ai-game-creator-shell/tests/appSurface/runtime-settings.suite.ts
index e013037c3..9916904e2 100644
--- a/apps/ai-game-creator-shell/tests/appSurface/runtime-settings.suite.ts
+++ b/apps/ai-game-creator-shell/tests/appSurface/runtime-settings.suite.ts
@@ -1,3 +1,4 @@
+import { APP_VERSION } from '../../src/app/appMetadata';
import {
act,
createGameCreationAppManifest,
@@ -234,6 +235,58 @@ export function registerAgentStatusDerivationTests() {
}
export function registerRuntimeSettingsTests() {
+ it('shows the client version on the About settings page', async () => {
+ const invoke = vi.fn(async (command: string) => {
+ if (command === 'read_game_creator_app_config') {
+ return {
+ path: '/home/test/AppData/game-creator.config.json',
+ config: {
+ agentMode: 'codex_app_server',
+ llm: {
+ apiKey: '',
+ baseUrl: 'https://llm.example.test/v1',
+ model: 'gpt-about',
+ apiKind: 'openai_responses',
+ reasoningEffort: 'high',
+ stream: true,
+ webSearchEnabled: false,
+ contextWindowTokens: 128000,
+ autoCompactTokenLimit: 64000,
+ toolOutputTokenLimit: 12000,
+ requestTimeoutMs: 180000,
+ maxRetries: 2,
+ retryBackoffMs: 500,
+ },
+ agentLlm: {},
+ editorApi: {
+ baseUrl: 'http://127.0.0.1:8082',
+ apiKey: '',
+ },
+ },
+ };
+ }
+ throw new Error(`unexpected invoke ${command}`);
+ });
+ window.__TAURI__ = { core: { invoke } };
+ renderLauncherAt('/?launcher');
+
+ fireEvent.click(screen.getByRole('button', { name: '配置' }));
+ expect(
+ await screen.findByRole('dialog', { name: '运行时配置' }),
+ ).not.toBeNull();
+
+ fireEvent.click(screen.getByRole('button', { name: /关于/ }));
+
+ expect(screen.getByText('Genarrative AI Game Creator')).not.toBeNull();
+ expect(
+ screen.getByTestId('runtime-settings-app-logo').getAttribute('src'),
+ ).toContain('taonier-product-ip.png');
+ expect(screen.getByTestId('runtime-settings-app-version').textContent).toBe(
+ `v${APP_VERSION}`,
+ );
+ expect(screen.getByText('桌面客户端')).not.toBeNull();
+ });
+
it('keeps the Agent mode fixed to app-server and preserves its LLM config', async () => {
const invoke = vi.fn(
async (command: string, args?: Record