feat(web): F1/F2/F3 前端——拆书入库为规则 / 续写式链选择 / 模板库
- gen:api 纳入 /templates、chain continue_volume、teardown rules ingest 端点 - F1:GeneratorRunner 识别拆书为单对象入库(整 preview 作一条 teardown), ingestTable(BookTeardownResult)=rules,buildIngestRequest 组装 teardown 体, 按 isSingleObjectIngest 隐藏勾选框、改文案「入库为规则」 - F2:ChainStarter 加链类型单选(draft_volume 从头写 / continue_volume 续写), chain_key 作 path 参传给 run(CHAIN_KINDS 对齐后端 SUPPORTED_CHAINS) - F3:模板库页 app/templates + 全局 nav 入口 + TemplatesManager(列/建/删,乐观更新回滚); GeneratorRunner 加 TemplateFiller「从模板填入」(body 填进 brief/text,纯前端) - vitest 覆盖 templates/ingest teardown/templateFillTarget/CHAIN_KINDS 纯逻辑
This commit is contained in:
203
apps/web/lib/api/schema.d.ts
vendored
203
apps/web/lib/api/schema.d.ts
vendored
@@ -377,6 +377,50 @@ export interface paths {
|
||||
patch?: never;
|
||||
trace?: never;
|
||||
};
|
||||
"/templates": {
|
||||
parameters: {
|
||||
query?: never;
|
||||
header?: never;
|
||||
path?: never;
|
||||
cookie?: never;
|
||||
};
|
||||
/**
|
||||
* List Templates
|
||||
* @description 列出当前用户(stub)的模板。
|
||||
*/
|
||||
get: operations["list_templates_templates_get"];
|
||||
put?: never;
|
||||
/**
|
||||
* Create Template
|
||||
* @description 新建模板(201)。title/body 空 → FastAPI 422(schema `min_length=1`)。
|
||||
*/
|
||||
post: operations["create_template_templates_post"];
|
||||
delete?: never;
|
||||
options?: never;
|
||||
head?: never;
|
||||
patch?: never;
|
||||
trace?: never;
|
||||
};
|
||||
"/templates/{template_id}": {
|
||||
parameters: {
|
||||
query?: never;
|
||||
header?: never;
|
||||
path?: never;
|
||||
cookie?: never;
|
||||
};
|
||||
get?: never;
|
||||
put?: never;
|
||||
post?: never;
|
||||
/**
|
||||
* Delete Template
|
||||
* @description 删除模板(204)。不存在 → 404 NOT_FOUND。
|
||||
*/
|
||||
delete: operations["delete_template_templates__template_id__delete"];
|
||||
options?: never;
|
||||
head?: never;
|
||||
patch?: never;
|
||||
trace?: never;
|
||||
};
|
||||
"/projects/{project_id}/world/generate": {
|
||||
parameters: {
|
||||
query?: never;
|
||||
@@ -1719,6 +1763,78 @@ export interface components {
|
||||
*/
|
||||
job_id: string;
|
||||
};
|
||||
/**
|
||||
* TeardownIngestView
|
||||
* @description 拆书入库产物(贴 ww_agents.BookTeardownResult;落 rules 表)。F1。
|
||||
*/
|
||||
TeardownIngestView: {
|
||||
/**
|
||||
* Themes
|
||||
* @description 核心主题/立意清单
|
||||
*/
|
||||
themes?: string[];
|
||||
/**
|
||||
* Archetypes
|
||||
* @description 人物原型/角色模板清单
|
||||
*/
|
||||
archetypes?: string[];
|
||||
/**
|
||||
* Structure
|
||||
* @description 叙事结构概述
|
||||
* @default
|
||||
*/
|
||||
structure: string;
|
||||
/**
|
||||
* Hooks
|
||||
* @description 抓人钩子/爽点套路清单
|
||||
*/
|
||||
hooks?: string[];
|
||||
};
|
||||
/**
|
||||
* TemplateCreateRequest
|
||||
* @description POST /templates:新建一条提示词模板。
|
||||
*/
|
||||
TemplateCreateRequest: {
|
||||
/**
|
||||
* Title
|
||||
* @description 模板标题
|
||||
*/
|
||||
title: string;
|
||||
/**
|
||||
* Body
|
||||
* @description 模板正文(一键填入生成器的 brief/text)
|
||||
*/
|
||||
body: string;
|
||||
/**
|
||||
* Category
|
||||
* @description 可选分类
|
||||
*/
|
||||
category?: string | null;
|
||||
/**
|
||||
* Tool Key
|
||||
* @description 可选关联生成器(NULL=通用)
|
||||
*/
|
||||
tool_key?: string | null;
|
||||
};
|
||||
/**
|
||||
* TemplateResponse
|
||||
* @description 模板视图(列出/创建后回显;snake_case)。
|
||||
*/
|
||||
TemplateResponse: {
|
||||
/**
|
||||
* Id
|
||||
* Format: uuid
|
||||
*/
|
||||
id: string;
|
||||
/** Title */
|
||||
title: string;
|
||||
/** Body */
|
||||
body: string;
|
||||
/** Category */
|
||||
category?: string | null;
|
||||
/** Tool Key */
|
||||
tool_key?: string | null;
|
||||
};
|
||||
/**
|
||||
* TestConnectionRequest
|
||||
* @description POST /test:最小探测请求。
|
||||
@@ -1861,7 +1977,8 @@ export interface components {
|
||||
*
|
||||
* 仅声明了 `ingest` 的工具可用。按入库表取用对应字段:
|
||||
* - world_entities(金手指/词条)→ `world_entities`(贴 WorldEntityCardView:type/name/rules);
|
||||
* - outline(细纲)→ `chapter_no` + `scenes`(贴 OutlineSceneIngestView)。
|
||||
* - outline(细纲)→ `chapter_no` + `scenes`(贴 OutlineSceneIngestView);
|
||||
* - rules(拆书)→ `teardown`(贴 TeardownIngestView:themes/archetypes/structure/hooks)。
|
||||
* `acknowledge_conflicts`:作者已查看并接受 continuity 预检冲突时置 true 放行(仿 accept gate)。
|
||||
*/
|
||||
ToolIngestRequest: {
|
||||
@@ -1880,6 +1997,8 @@ export interface components {
|
||||
* @description outline 入库的场景行(细纲)
|
||||
*/
|
||||
scenes?: components["schemas"]["OutlineSceneIngestView"][];
|
||||
/** @description rules 入库的拆书结论(F1;拍平为可读规则条目) */
|
||||
teardown?: components["schemas"]["TeardownIngestView"] | null;
|
||||
/**
|
||||
* Acknowledge Conflicts
|
||||
* @description 作者已知悉并接受 continuity 冲突 → 放行入库
|
||||
@@ -2866,6 +2985,88 @@ export interface operations {
|
||||
};
|
||||
};
|
||||
};
|
||||
list_templates_templates_get: {
|
||||
parameters: {
|
||||
query?: never;
|
||||
header?: never;
|
||||
path?: never;
|
||||
cookie?: never;
|
||||
};
|
||||
requestBody?: never;
|
||||
responses: {
|
||||
/** @description Successful Response */
|
||||
200: {
|
||||
headers: {
|
||||
[name: string]: unknown;
|
||||
};
|
||||
content: {
|
||||
"application/json": components["schemas"]["TemplateResponse"][];
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
create_template_templates_post: {
|
||||
parameters: {
|
||||
query?: never;
|
||||
header?: never;
|
||||
path?: never;
|
||||
cookie?: never;
|
||||
};
|
||||
requestBody: {
|
||||
content: {
|
||||
"application/json": components["schemas"]["TemplateCreateRequest"];
|
||||
};
|
||||
};
|
||||
responses: {
|
||||
/** @description Successful Response */
|
||||
201: {
|
||||
headers: {
|
||||
[name: string]: unknown;
|
||||
};
|
||||
content: {
|
||||
"application/json": components["schemas"]["TemplateResponse"];
|
||||
};
|
||||
};
|
||||
/** @description Validation Error */
|
||||
422: {
|
||||
headers: {
|
||||
[name: string]: unknown;
|
||||
};
|
||||
content: {
|
||||
"application/json": components["schemas"]["HTTPValidationError"];
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
delete_template_templates__template_id__delete: {
|
||||
parameters: {
|
||||
query?: never;
|
||||
header?: never;
|
||||
path: {
|
||||
template_id: string;
|
||||
};
|
||||
cookie?: never;
|
||||
};
|
||||
requestBody?: never;
|
||||
responses: {
|
||||
/** @description Successful Response */
|
||||
204: {
|
||||
headers: {
|
||||
[name: string]: unknown;
|
||||
};
|
||||
content?: never;
|
||||
};
|
||||
/** @description Validation Error */
|
||||
422: {
|
||||
headers: {
|
||||
[name: string]: unknown;
|
||||
};
|
||||
content: {
|
||||
"application/json": components["schemas"]["HTTPValidationError"];
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
generate_world_projects__project_id__world_generate_post: {
|
||||
parameters: {
|
||||
query?: never;
|
||||
|
||||
@@ -13,6 +13,7 @@ import type {
|
||||
RuleListResponse,
|
||||
SkillListResponse,
|
||||
StyleFingerprintResponse,
|
||||
TemplateResponse,
|
||||
ToolboxListResponse,
|
||||
WorldEntityListResponse,
|
||||
} from "./types";
|
||||
@@ -149,6 +150,16 @@ export async function fetchOutline(
|
||||
}
|
||||
}
|
||||
|
||||
// 提示词/模板库列表(GET /templates,全局只读;裸数组)。
|
||||
// 任何错误(含后端未上线)降级为空列表,模板页照常渲染(进页不阻塞)。
|
||||
export async function fetchTemplates(): Promise<TemplateResponse[]> {
|
||||
try {
|
||||
return await getJson<TemplateResponse[]>("/templates");
|
||||
} catch {
|
||||
return [];
|
||||
}
|
||||
}
|
||||
|
||||
// 已存草稿(GET .../draft,含正文,供工作台重访重载编辑器)。
|
||||
// 404(尚无草稿,新章)→ null,由调用方当空编辑器处理,不抛错。
|
||||
export async function fetchDraft(
|
||||
|
||||
@@ -85,6 +85,11 @@ export type CharacterListResponse =
|
||||
export type WorldEntityListResponse =
|
||||
components["schemas"]["WorldEntityListResponse"];
|
||||
|
||||
// F3 提示词/模板库(单用户本地版;GET/POST/DELETE /templates)。
|
||||
export type TemplateResponse = components["schemas"]["TemplateResponse"];
|
||||
export type TemplateCreateRequest =
|
||||
components["schemas"]["TemplateCreateRequest"];
|
||||
|
||||
// K1 Kimi Code OAuth device-flow(C3 扩 K1.3)。
|
||||
export type OAuthStartResponse = components["schemas"]["OAuthStartResponse"];
|
||||
export type OAuthDisconnectResponse =
|
||||
@@ -113,3 +118,6 @@ export type ToolIngestRequest = components["schemas"]["ToolIngestRequest"];
|
||||
export type ToolIngestResponse = components["schemas"]["ToolIngestResponse"];
|
||||
export type OutlineSceneIngestView =
|
||||
components["schemas"]["OutlineSceneIngestView"];
|
||||
// F1:拆书入库产物(themes/archetypes/structure/hooks → 项目 rules 条目)。
|
||||
export type TeardownIngestView =
|
||||
components["schemas"]["TeardownIngestView"];
|
||||
|
||||
Reference in New Issue
Block a user