Update creation flow refactor docs and auth test fixtures

This commit is contained in:
2026-04-21 11:19:25 +08:00
parent 13bc79306f
commit 04bff9617d
37 changed files with 488 additions and 7 deletions

View File

@@ -122,6 +122,11 @@ function createTestConfig(
mockAvatarUrl: '',
},
authSession: {
accessCookieName: 'genarrative_access_session',
accessCookieTtlSeconds: 7200,
accessCookieSecure: false,
accessCookieSameSite: 'Lax',
accessCookiePath: '/',
refreshCookieName: 'genarrative_refresh_session',
refreshSessionTtlDays: 30,
refreshCookieSecure: false,
@@ -467,7 +472,18 @@ async function startWechatMockFlow(baseUrl: string, redirectPath = '/') {
const location = callbackResponse.headers.get('location') || '';
assert.ok(location);
const hash = parseRedirectHash(location);
const token = hash.get('auth_token') || '';
const setCookieHeader = callbackResponse.headers.get('set-cookie') || '';
const accessCookie = setCookieHeader
.split(',')
.map((entry) => entry.trim())
.find((entry) => entry.startsWith('genarrative_access_session='));
const token =
accessCookie
?.split(';')[0]
?.split('=')
.slice(1)
.join('=')
.trim() || '';
assert.ok(token);

View File

@@ -81,6 +81,11 @@ function createTestConfig(databaseUrl: string): AppConfig {
mockAvatarUrl: '',
},
authSession: {
accessCookieName: 'genarrative_access_session',
accessCookieTtlSeconds: 7200,
accessCookieSecure: false,
accessCookieSameSite: 'Lax',
accessCookiePath: '/',
refreshCookieName: 'genarrative_refresh_session',
refreshSessionTtlDays: 30,
refreshCookieSecure: false,

View File

@@ -91,6 +91,11 @@ function createTestConfig(testName: string): AppConfig {
mockAvatarUrl: '',
},
authSession: {
accessCookieName: 'genarrative_access_session',
accessCookieTtlSeconds: 7200,
accessCookieSecure: false,
accessCookieSameSite: 'Lax',
accessCookiePath: '/',
refreshCookieName: 'genarrative_refresh_session',
refreshSessionTtlDays: 30,
refreshCookieSecure: false,

View File

@@ -93,6 +93,11 @@ function createTestConfig(testName: string): AppConfig {
mockAvatarUrl: '',
},
authSession: {
accessCookieName: 'genarrative_access_session',
accessCookieTtlSeconds: 7200,
accessCookieSecure: false,
accessCookieSameSite: 'Lax',
accessCookiePath: '/',
refreshCookieName: 'genarrative_refresh_session',
refreshSessionTtlDays: 30,
refreshCookieSecure: false,

View File

@@ -0,0 +1 @@
export { createCustomWorldAgentRoutes as createRpgCreationAgentRoutes } from './customWorldAgent.js';

View File

@@ -0,0 +1,14 @@
import { Router } from 'express';
import type { AppContext } from '../context.js';
/**
* 工作包 A 先建立 RPG 世界广场路由的命名骨架。
* 当前广场查询仍由旧 runtime 路由承载,后续工作包会再迁移实现。
*/
export const RPG_WORLD_GALLERY_ROUTE_BASE_PATH =
'/runtime/custom-world-gallery';
export function createRpgWorldGalleryRoutes(_context: AppContext) {
return Router();
}

View File

@@ -0,0 +1,13 @@
import { Router } from 'express';
import type { AppContext } from '../context.js';
/**
* 工作包 A 先建立 RPG 世界作品库路由的命名骨架。
* 当前仅提供稳定落点,真正的库读写逻辑仍保留在 `runtimeRoutes.ts` 中。
*/
export const RPG_WORLD_LIBRARY_ROUTE_BASE_PATH = '/runtime/custom-world-library';
export function createRpgWorldLibraryRoutes(_context: AppContext) {
return Router();
}

View File

@@ -0,0 +1,13 @@
import { Router } from 'express';
import type { AppContext } from '../context.js';
/**
* 工作包 A 先建立 RPG 世界作品流路由的命名骨架。
* 真实实现仍暂挂在 `runtimeRoutes.ts`,后续工作包再把作品列表接口迁入这里。
*/
export const RPG_WORLD_WORKS_ROUTE_BASE_PATH = '/runtime/custom-world/works';
export function createRpgWorldWorksRoutes(_context: AppContext) {
return Router();
}

View File

@@ -0,0 +1 @@
export { CustomWorldAgentOrchestrator as RpgAgentOrchestrator } from './customWorldAgentOrchestrator.js';

View File

@@ -0,0 +1,5 @@
export type { CustomWorldAgentSessionRecord as RpgAgentSessionRecord } from './customWorldAgentSessionStore.js';
export {
CUSTOM_WORLD_AGENT_SESSION_ID_PREFIX as RPG_AGENT_SESSION_ID_PREFIX,
CustomWorldAgentSessionStore as RpgAgentSessionStore,
} from './customWorldAgentSessionStore.js';

View File

@@ -0,0 +1,14 @@
import {
buildCompiledCustomWorldProfile,
normalizeCustomWorldProfile,
} from '../modules/custom-world/runtimeProfile.js';
import type { CustomWorldProfile } from '../modules/custom-world/runtimeTypes.js';
/**
* 工作包 A 先建立 RPG 世界预览编译器的新命名 façade。
* 当前仍桥接旧 runtime profile 编译能力,后续工作包 G 会把正式 preview compiler 收口到这个入口。
*/
export type RpgWorldPreviewProfile = CustomWorldProfile;
export const buildRpgWorldPreviewProfile = buildCompiledCustomWorldProfile;
export const normalizeRpgWorldPreviewProfile = normalizeCustomWorldProfile;

View File

@@ -0,0 +1 @@
export { listCustomWorldWorkSummaries as listRpgWorldWorkSummaries } from './customWorldWorkSummaryService.js';

View File

@@ -87,6 +87,11 @@ function createTestConfig(testName: string): AppConfig {
mockAvatarUrl: '',
},
authSession: {
accessCookieName: 'genarrative_access_session',
accessCookieTtlSeconds: 7200,
accessCookieSecure: false,
accessCookieSameSite: 'Lax',
accessCookiePath: '/',
refreshCookieName: 'refresh_token',
refreshSessionTtlDays: 30,
refreshCookieSecure: false,

View File

@@ -172,6 +172,11 @@ function createAutoAssetTestConfig(testName: string): AppConfig {
mockAvatarUrl: '',
},
authSession: {
accessCookieName: 'genarrative_access_session',
accessCookieTtlSeconds: 7200,
accessCookieSecure: false,
accessCookieSameSite: 'Lax',
accessCookiePath: '/',
refreshCookieName: 'refresh_token',
refreshSessionTtlDays: 30,
refreshCookieSecure: false,

View File

@@ -171,6 +171,11 @@ function createAutoAssetTestConfig(testName: string): AppConfig {
mockAvatarUrl: '',
},
authSession: {
accessCookieName: 'genarrative_access_session',
accessCookieTtlSeconds: 7200,
accessCookieSecure: false,
accessCookieSameSite: 'Lax',
accessCookiePath: '/',
refreshCookieName: 'refresh_token',
refreshSessionTtlDays: 30,
refreshCookieSecure: false,