@waterwx/dsh-novel-forge 1.2.0 → 1.3.0-alpha
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +236 -349
- package/lib/client.js +56064 -10565
- package/lib/index.js +13922 -5218
- package/lib/types/action-guard.d.ts +61 -0
- package/lib/types/ai-scan.d.ts +36 -0
- package/lib/types/assets.d.ts +24 -9
- package/lib/types/assistant.d.ts +29 -0
- package/lib/types/author-assets.d.ts +25 -0
- package/lib/types/bookshelf.d.ts +11 -1
- package/lib/types/client/api.d.ts +178 -10
- package/lib/types/client/docx.d.ts +2 -0
- package/lib/types/client/index.d.ts +1 -1
- package/lib/types/client/llmLive.d.ts +31 -0
- package/lib/types/client/locales.d.ts +28 -11
- package/lib/types/client/panel/AdaptModeView.d.ts +5 -0
- package/lib/types/client/panel/AiTag.d.ts +1 -0
- package/lib/types/client/panel/AssistantTab.d.ts +4 -1
- package/lib/types/client/panel/AuthorAssetsView.d.ts +4 -0
- package/lib/types/client/panel/AuthorHome.d.ts +34 -0
- package/lib/types/client/panel/BookAnalysisView.d.ts +4 -0
- package/lib/types/client/panel/CmdPalette.d.ts +12 -0
- package/lib/types/client/panel/CreateBookView.d.ts +5 -1
- package/lib/types/client/panel/DirectorView.d.ts +7 -0
- package/lib/types/client/panel/GlobalAssetLibraryView.d.ts +4 -0
- package/lib/types/client/panel/IdeaInspirationView.d.ts +6 -0
- package/lib/types/client/panel/ImportModal.d.ts +7 -0
- package/lib/types/client/panel/KnowledgeBaseView.d.ts +4 -0
- package/lib/types/client/panel/LiveFeedLog.d.ts +13 -0
- package/lib/types/client/panel/MarketRadarView.d.ts +5 -0
- package/lib/types/client/panel/ModelManager.d.ts +14 -0
- package/lib/types/client/panel/NovelPanel.d.ts +6 -1
- package/lib/types/client/panel/PageHeader.d.ts +18 -0
- package/lib/types/client/panel/ProgressConsole.d.ts +17 -0
- package/lib/types/client/panel/ProgressHomeView.d.ts +5 -0
- package/lib/types/client/panel/PromptSlotsView.d.ts +11 -0
- package/lib/types/client/panel/ReasoningSection.d.ts +10 -0
- package/lib/types/client/panel/SettingsView.d.ts +19 -0
- package/lib/types/client/panel/ShelfView.d.ts +12 -1
- package/lib/types/client/panel/SubPage.d.ts +27 -0
- package/lib/types/client/panel/TensionView.d.ts +14 -0
- package/lib/types/client/panel/TimelineView.d.ts +14 -0
- package/lib/types/client/panel/toast.d.ts +2 -0
- package/lib/types/client/panel/views.d.ts +25 -7
- package/lib/types/client/run-status.d.ts +19 -0
- package/lib/types/client/text.d.ts +9 -0
- package/lib/types/docx-core.d.ts +16 -0
- package/lib/types/docx.d.ts +2 -3
- package/lib/types/engine.d.ts +185 -41
- package/lib/types/global-assets.d.ts +6 -0
- package/lib/types/index.d.ts +22 -2
- package/lib/types/llm-live.d.ts +75 -0
- package/lib/types/llm-retry.d.ts +38 -0
- package/lib/types/market-radar-scan.d.ts +19 -0
- package/lib/types/market-radar-sources.d.ts +31 -0
- package/lib/types/migrate-output.d.ts +25 -0
- package/lib/types/novel-context.d.ts +80 -0
- package/lib/types/prompt-slots.d.ts +57 -0
- package/lib/types/prompt-utils.d.ts +35 -0
- package/lib/types/prompting.d.ts +10 -0
- package/lib/types/protocol.d.ts +1311 -125
- package/lib/types/review-policy.d.ts +97 -0
- package/lib/types/routes.d.ts +4 -0
- package/lib/types/run.d.ts +3 -1
- package/lib/types/snapshots.d.ts +46 -0
- package/lib/types/stage-contract.d.ts +60 -0
- package/lib/types/tension.d.ts +65 -0
- package/lib/types/timeline.d.ts +37 -0
- package/package.json +52 -27
- package/scripts/patch-schemastery.mjs +47 -0
- package/src/action-guard.ts +127 -0
- package/src/ai-scan.ts +179 -0
- package/src/assets.ts +1806 -520
- package/src/assistant.ts +1098 -770
- package/src/author-assets.ts +149 -0
- package/src/bookshelf.ts +187 -151
- package/src/client/api.ts +758 -410
- package/src/client/docx.ts +37 -69
- package/src/client/index.ts +3 -1
- package/src/client/llmLive.ts +111 -0
- package/src/client/locales.ts +418 -383
- package/src/client/mount.tsx +1 -1
- package/src/client/panel/AdaptModeView.tsx +535 -0
- package/src/client/panel/AiTag.tsx +7 -0
- package/src/client/panel/AssetsTab.tsx +448 -458
- package/src/client/panel/AssistantTab.tsx +355 -301
- package/src/client/panel/AuthorAssetsView.tsx +206 -0
- package/src/client/panel/AuthorHome.tsx +309 -0
- package/src/client/panel/BookAnalysisView.tsx +63 -0
- package/src/client/panel/CmdPalette.tsx +102 -0
- package/src/client/panel/CreateBookView.tsx +366 -348
- package/src/client/panel/DirectorView.tsx +200 -0
- package/src/client/panel/GlobalAssetLibraryView.tsx +168 -0
- package/src/client/panel/IdeaInspirationView.tsx +76 -0
- package/src/client/panel/ImportModal.tsx +303 -0
- package/src/client/panel/KnowledgeBaseView.tsx +125 -0
- package/src/client/panel/LiveFeedLog.tsx +204 -0
- package/src/client/panel/MarketRadarView.tsx +377 -0
- package/src/client/panel/ModelManager.tsx +205 -0
- package/src/client/panel/NovelPanel.tsx +5517 -4597
- package/src/client/panel/PageHeader.tsx +37 -0
- package/src/client/panel/ProgressConsole.tsx +63 -0
- package/src/client/panel/PromptSlotsView.tsx +97 -0
- package/src/client/panel/ReaderView.tsx +306 -306
- package/src/client/panel/ReasoningSection.tsx +31 -0
- package/src/client/panel/RunPanel.tsx +223 -204
- package/src/client/panel/SettingsView.tsx +340 -0
- package/src/client/panel/ShelfView.tsx +266 -236
- package/src/client/panel/SubPage.tsx +42 -0
- package/src/client/panel/TensionView.tsx +196 -0
- package/src/client/panel/TimelineView.tsx +192 -0
- package/src/client/panel/WorldTab.tsx +202 -202
- package/src/client/panel/panel.module.css +5764 -2941
- package/src/client/panel/toast.ts +51 -0
- package/src/client/panel/views.tsx +401 -314
- package/src/client/run-status.ts +143 -0
- package/src/client/sidebar-entry.ts +1 -1
- package/src/client/text.ts +28 -0
- package/src/docx-core.ts +53 -0
- package/src/docx.ts +44 -83
- package/src/engine.ts +4672 -2787
- package/src/global-assets.ts +59 -0
- package/src/index.ts +323 -252
- package/src/llm-live.ts +260 -0
- package/src/llm-retry.ts +77 -0
- package/src/market-radar-scan.ts +41 -0
- package/src/market-radar-sources.ts +173 -0
- package/src/migrate-output.ts +76 -0
- package/src/novel-context.ts +286 -0
- package/src/prompt-slots.ts +125 -0
- package/src/prompting.ts +26 -0
- package/src/protocol.ts +2383 -1182
- package/src/review-policy.ts +161 -0
- package/src/routes.ts +3724 -2151
- package/src/run.ts +346 -330
- package/src/snapshots.ts +174 -0
- package/src/stage-contract.ts +189 -0
- package/src/tension.ts +240 -0
- package/src/timeline.ts +159 -0
- package/lib/client.js.map +0 -1
- package/lib/index.js.map +0 -1
- package/src/client/panel/BookshelfBar.tsx +0 -170
package/lib/types/protocol.d.ts
CHANGED
|
@@ -14,6 +14,32 @@ export declare const NOVEL_API: {
|
|
|
14
14
|
readonly bible: "/api/dsh-novel-forge/bible";
|
|
15
15
|
readonly assets: "/api/dsh-novel-forge/assets";
|
|
16
16
|
readonly styleEngine: "/api/dsh-novel-forge/style-engine";
|
|
17
|
+
readonly styleFormula: "/api/dsh-novel-forge/style-formula";
|
|
18
|
+
readonly styleDetect: "/api/dsh-novel-forge/style-detect";
|
|
19
|
+
readonly knowledge: "/api/dsh-novel-forge/knowledge";
|
|
20
|
+
readonly bookAnalysis: "/api/dsh-novel-forge/book-analysis";
|
|
21
|
+
readonly ideaInspiration: "/api/dsh-novel-forge/idea-inspiration";
|
|
22
|
+
readonly ideaInspirationMarket: "/api/dsh-novel-forge/idea-inspiration/market";
|
|
23
|
+
readonly director: "/api/dsh-novel-forge/director";
|
|
24
|
+
readonly directorTodos: "/api/dsh-novel-forge/director/todos";
|
|
25
|
+
readonly llmLive: "/api/dsh-novel-forge/llm-live/stream";
|
|
26
|
+
/** 查看某次调用实际发送的 Prompt(按 sessionId)。 */
|
|
27
|
+
readonly llmPrompt: "/api/dsh-novel-forge/llm-live/prompt";
|
|
28
|
+
/** 清零本次运行的用量账本。 */
|
|
29
|
+
readonly usageReset: "/api/dsh-novel-forge/usage/reset";
|
|
30
|
+
/** 章节历史版本(快照)。 */
|
|
31
|
+
readonly snapshot: "/api/dsh-novel-forge/snapshot";
|
|
32
|
+
/** 张力曲线(GET 数据 / POST 设置)。 */
|
|
33
|
+
readonly tension: "/api/dsh-novel-forge/tension";
|
|
34
|
+
/** 提示词槽位(GET 列表 / POST 写入)。 */
|
|
35
|
+
readonly promptSlots: "/api/dsh-novel-forge/prompt-slots";
|
|
36
|
+
/** 故事时间线(GET 列表 / POST 操作)。 */
|
|
37
|
+
readonly timeline: "/api/dsh-novel-forge/timeline";
|
|
38
|
+
readonly marketRadar: "/api/dsh-novel-forge/market-radar";
|
|
39
|
+
readonly marketRadarScan: "/api/dsh-novel-forge/market-radar/scan";
|
|
40
|
+
readonly marketRadarApply: "/api/dsh-novel-forge/market-radar/apply";
|
|
41
|
+
readonly marketRadarSync: "/api/dsh-novel-forge/market-radar/foundation-sync";
|
|
42
|
+
readonly marketRadarBrief: "/api/dsh-novel-forge/market-radar/brief";
|
|
17
43
|
readonly generate: "/api/dsh-novel-forge/generate";
|
|
18
44
|
readonly review: "/api/dsh-novel-forge/review";
|
|
19
45
|
readonly rewrite: "/api/dsh-novel-forge/rewrite";
|
|
@@ -35,6 +61,24 @@ export declare const NOVEL_API: {
|
|
|
35
61
|
/** 清空助手对话记录。 */
|
|
36
62
|
readonly assistantClear: "/api/dsh-novel-forge/assistant/clear";
|
|
37
63
|
readonly bookshelf: "/api/dsh-novel-forge/bookshelf";
|
|
64
|
+
/** 导入已有项目目录(含 novel-project.json)到书架。 */
|
|
65
|
+
readonly bookshelfImportDir: "/api/dsh-novel-forge/bookshelf/import-dir";
|
|
66
|
+
/** 导入 txt/md 全本:拆章建项目并登记书架。 */
|
|
67
|
+
readonly bookshelfImportText: "/api/dsh-novel-forge/bookshelf/import-text";
|
|
68
|
+
/** 导入 txt/md 全本:拆章预览(不落盘)。 */
|
|
69
|
+
readonly bookshelfImportTextPreview: "/api/dsh-novel-forge/bookshelf/import-text/preview";
|
|
70
|
+
/** LLM 模型连通性测试:真实最小调用,验证 Key / 端点 / 模型可用。 */
|
|
71
|
+
readonly llmTest: "/api/dsh-novel-forge/llm-test";
|
|
72
|
+
/** 添加模型:厂商直填 key 或自定义路由,写进 DSH 凭据与 llm-pi-ai 路由。 */
|
|
73
|
+
readonly addModel: "/api/dsh-novel-forge/llm-add";
|
|
74
|
+
/** 运行时厂商目录(DSH pi-ai 可配置提供方 + 内置适配器)。 */
|
|
75
|
+
readonly llmVendors: "/api/dsh-novel-forge/llm-vendors";
|
|
76
|
+
/** 查询某个 provider 当前可用的模型(添加成功后可即时刷新)。 */
|
|
77
|
+
readonly llmModels: "/api/dsh-novel-forge/llm-models";
|
|
78
|
+
/** 已注册的提供方路由列表(提供方管理)。 */
|
|
79
|
+
readonly llmProviders: "/api/dsh-novel-forge/llm-providers";
|
|
80
|
+
/** 移除一个提供方。 */
|
|
81
|
+
readonly llmRemove: "/api/dsh-novel-forge/llm-remove";
|
|
38
82
|
/** 重置项目(可选携带新大纲):清空设定/卷/章节/伏笔/资产/事实库。 */
|
|
39
83
|
readonly reset: "/api/dsh-novel-forge/reset";
|
|
40
84
|
/** 全书一致性质检:LLM 扫描已生成章节,输出矛盾问题清单。 */
|
|
@@ -43,19 +87,19 @@ export declare const NOVEL_API: {
|
|
|
43
87
|
readonly charactersRefresh: "/api/dsh-novel-forge/characters/refresh";
|
|
44
88
|
/** 事实库回填:对历史已生成章节批量抽取事实(旧章节无事实记录时用)。 */
|
|
45
89
|
readonly factsBackfill: "/api/dsh-novel-forge/facts/backfill";
|
|
46
|
-
/**
|
|
90
|
+
/** 道藏局部修补(如世界观规则编辑)。 */
|
|
47
91
|
readonly biblePatch: "/api/dsh-novel-forge/bible/patch";
|
|
48
92
|
/** 小说简介:生成(AI)/补全(AI)/保存。 */
|
|
49
93
|
readonly blurb: "/api/dsh-novel-forge/blurb";
|
|
50
94
|
/** 重命名当前书(同步项目与书架条目)。 */
|
|
51
95
|
readonly rename: "/api/dsh-novel-forge/rename";
|
|
52
|
-
/**
|
|
96
|
+
/** 大世界:提炼 / 保存结构化数据(境界/区域/势力)。 */
|
|
53
97
|
readonly world: "/api/dsh-novel-forge/world";
|
|
54
98
|
/** 封面:GET 读取(dataUrl)/ POST 上传或移除。 */
|
|
55
99
|
readonly cover: "/api/dsh-novel-forge/blurb/cover";
|
|
56
100
|
/** 剧情线管理:增删改 + 关联章节。 */
|
|
57
101
|
readonly plotlines: "/api/dsh-novel-forge/plotlines";
|
|
58
|
-
/**
|
|
102
|
+
/** 角色库:提炼 / 采纳 / 更新 / 删除。 */
|
|
59
103
|
readonly roles: "/api/dsh-novel-forge/roles";
|
|
60
104
|
/** 作者复盘补跑:对已写章节补齐 authorReview(全书流式 / 单章 JSON)。 */
|
|
61
105
|
readonly reviewBackfill: "/api/dsh-novel-forge/review/backfill";
|
|
@@ -65,14 +109,12 @@ export declare const NOVEL_API: {
|
|
|
65
109
|
readonly chapterApprove: "/api/dsh-novel-forge/chapter/approve";
|
|
66
110
|
/** 敏感词检查:全书已写章节或指定文本。 */
|
|
67
111
|
readonly sensitiveCheck: "/api/dsh-novel-forge/sensitive-check";
|
|
68
|
-
/** 开书想法 →
|
|
112
|
+
/** 开书想法 → 补全大纲:输入一句话想法,生成 2-3 个可选大纲方案。 */
|
|
69
113
|
readonly outlineSuggest: "/api/dsh-novel-forge/outline/suggest";
|
|
114
|
+
/** 反推大纲:从已写章节正文反向生成全书总纲(NDJSON 流)。 */
|
|
115
|
+
readonly outlineReverse: "/api/dsh-novel-forge/outline/reverse";
|
|
70
116
|
/** 拆书分析:对已写章节做结构/人物/文风/卖点四维体检(两阶段:源笔记→分节分析)。 */
|
|
71
117
|
readonly breakdown: "/api/dsh-novel-forge/breakdown";
|
|
72
|
-
/** 漫剧分镜生成:章节 → 角色锚点 + 分镜表(可适配豆包/Seedance/SD)。 */
|
|
73
|
-
readonly storyboard: "/api/dsh-novel-forge/storyboard";
|
|
74
|
-
/** 漫剧分集计划:读一卷 → 按故事弧线分集(高潮拆集/过渡并章)。 */
|
|
75
|
-
readonly storyboardPlan: "/api/dsh-novel-forge/storyboard/plan";
|
|
76
118
|
/** 生产单:启动批量生产(计划补足 + 逐章生成 + 被拒分级处理)。 */
|
|
77
119
|
readonly runStart: "/api/dsh-novel-forge/run/start";
|
|
78
120
|
/** 生产单控制:pause / resume / stop。 */
|
|
@@ -80,7 +122,39 @@ export declare const NOVEL_API: {
|
|
|
80
122
|
/** 生产单状态(含进度统计与日志)。 */
|
|
81
123
|
readonly runStatus: "/api/dsh-novel-forge/run/status";
|
|
82
124
|
readonly config: "/api/dsh-novel-forge/config";
|
|
125
|
+
/** 输出目录迁移:dryRun 预览 / 确认后搬文件并联动配置与书架。 */
|
|
126
|
+
readonly moveOutputDir: "/api/dsh-novel-forge/move-output-dir";
|
|
127
|
+
/** 本书参数:POST {} 读取;POST {patch} 合并保存(存 novel-project.json)。 */
|
|
128
|
+
readonly bookSettings: "/api/dsh-novel-forge/book-settings";
|
|
83
129
|
readonly openFolder: "/api/dsh-novel-forge/open-folder";
|
|
130
|
+
/** 插件自更新:在 DSH profile 目录拉取最新 npm 版(下载后需重启 DSH 生效)。 */
|
|
131
|
+
readonly pluginUpdate: "/api/dsh-novel-forge/plugin/update";
|
|
132
|
+
/** 作者资产库/总数据:读取个人跨书资产(笔法/红线/套路/角色模板/世界观模板)。 */
|
|
133
|
+
readonly authorAssets: "/api/dsh-novel-forge/author-assets";
|
|
134
|
+
/** 作者资产库:新增/更新一条资产(upsert by id)。 */
|
|
135
|
+
readonly authorAssetsUpsert: "/api/dsh-novel-forge/author-assets/upsert";
|
|
136
|
+
/** 作者资产库:删除一条资产。 */
|
|
137
|
+
readonly authorAssetsRemove: "/api/dsh-novel-forge/author-assets/remove";
|
|
138
|
+
/** 作者资产库:导入默认(书架书的写作资产/角色 + 内置全局库)批量沉淀。 */
|
|
139
|
+
readonly authorAssetsImportDefault: "/api/dsh-novel-forge/author-assets/import-default";
|
|
140
|
+
/** 改编模式:上传全文 → 分析 → 原文设定卡片/可改范围矩阵。 */
|
|
141
|
+
readonly adaptAnalyze: "/api/dsh-novel-forge/adapt/analyze";
|
|
142
|
+
/** 改编模式:确认要改的维度 → 生成映射表/改编规则/联动影响清单。 */
|
|
143
|
+
readonly adaptPropose: "/api/dsh-novel-forge/adapt/propose";
|
|
144
|
+
/** 改编模式:执行术语替换(全局替换 + 命中统计 + 改编文本预览)。 */
|
|
145
|
+
readonly adaptExecute: "/api/dsh-novel-forge/adapt/execute";
|
|
146
|
+
/** 改编模式:保存改编全文为新书(原书保留,登记书架)。 */
|
|
147
|
+
readonly adaptSave: "/api/dsh-novel-forge/adapt/save";
|
|
148
|
+
/** 改编模式:从源全文 + 编辑后方案提炼新书资料并保存为「待写新书」。 */
|
|
149
|
+
readonly adaptMaterialize: "/api/dsh-novel-forge/adapt/materialize";
|
|
150
|
+
/** 改编模式:rewrite 逐章重写(NDJSON 流式进度)。 */
|
|
151
|
+
readonly adaptRewriteStream: "/api/dsh-novel-forge/adapt/rewrite-stream";
|
|
152
|
+
/** 改编模式:把预览/微调后的新书资料写入并登记书架。 */
|
|
153
|
+
readonly adaptMaterializeSave: "/api/dsh-novel-forge/adapt/materialize-save";
|
|
154
|
+
/** 主题自定义背景:上传图片(POST,存盘并返回服务端 URL)。 */
|
|
155
|
+
readonly themeBackgroundUpload: "/api/dsh-novel-forge/theme/background";
|
|
156
|
+
/** 主题自定义背景:读取已上传文件(GET prefix,/theme/background/<name>)。 */
|
|
157
|
+
readonly themeBackgroundGet: "/api/dsh-novel-forge/theme/background";
|
|
84
158
|
};
|
|
85
159
|
/** 书架:一本书的条目。 */
|
|
86
160
|
export interface BookEntry {
|
|
@@ -127,6 +201,60 @@ export interface BookActivateRequest {
|
|
|
127
201
|
export interface BookRemoveRequest {
|
|
128
202
|
id: string;
|
|
129
203
|
}
|
|
204
|
+
/** POST /bookshelf/import-dir 请求:导入已有项目目录。 */
|
|
205
|
+
export interface BookImportDirRequest {
|
|
206
|
+
/** 项目目录(须含 novel-project.json)。 */
|
|
207
|
+
outputDir: string;
|
|
208
|
+
}
|
|
209
|
+
/** POST /bookshelf/import-dir 响应。 */
|
|
210
|
+
export interface BookImportDirResponse {
|
|
211
|
+
book: BookEntry;
|
|
212
|
+
/** true = 目录已在书架中(本次为重新激活)。 */
|
|
213
|
+
existed: boolean;
|
|
214
|
+
}
|
|
215
|
+
/** POST /bookshelf/import-text 请求:导入 txt/md 全本。两种模式二选一:
|
|
216
|
+
* - filePath:服务器本地文件路径;
|
|
217
|
+
* - text + fileName:浏览器上传的全文内容(fileName 用于推断书名)。
|
|
218
|
+
*/
|
|
219
|
+
export interface BookImportTextRequest {
|
|
220
|
+
/** 模式一:源文件绝对路径(txt 或 md)。 */
|
|
221
|
+
filePath?: string;
|
|
222
|
+
/** 模式二:浏览器上传的全文内容。 */
|
|
223
|
+
text?: string;
|
|
224
|
+
/** 模式二:原文件名(txt/md),用于推断书名与显示。 */
|
|
225
|
+
fileName?: string;
|
|
226
|
+
/** 输出目录;缺省为 ~/.dsh/novels/书名。 */
|
|
227
|
+
outputDir?: string;
|
|
228
|
+
}
|
|
229
|
+
/** POST /bookshelf/import-text 响应。 */
|
|
230
|
+
export interface BookImportTextResponse {
|
|
231
|
+
bookName: string;
|
|
232
|
+
/** 成功拆出的章节数。 */
|
|
233
|
+
chapters: number;
|
|
234
|
+
/** 因内容过短被跳过的章节标题列表。 */
|
|
235
|
+
skipped: string[];
|
|
236
|
+
/** 登记后的书架条目。 */
|
|
237
|
+
book: BookEntry;
|
|
238
|
+
}
|
|
239
|
+
/** POST /bookshelf/import-text/preview 请求:上传全文做拆章预览(不落盘)。 */
|
|
240
|
+
export interface BookImportTextPreviewRequest {
|
|
241
|
+
text: string;
|
|
242
|
+
/** 原文件名(txt/md),用于推断书名。 */
|
|
243
|
+
fileName?: string;
|
|
244
|
+
}
|
|
245
|
+
/** POST /bookshelf/import-text/preview 响应。 */
|
|
246
|
+
export interface BookImportTextPreviewResponse {
|
|
247
|
+
/** 预计书名(fileName 去扩展名)。 */
|
|
248
|
+
bookName: string;
|
|
249
|
+
/** 识别出的章节(已按正文长度过滤过短章节)。 */
|
|
250
|
+
chapters: Array<{
|
|
251
|
+
no: number;
|
|
252
|
+
title: string;
|
|
253
|
+
chars: number;
|
|
254
|
+
}>;
|
|
255
|
+
/** 因内容过短被跳过的章节标题列表。 */
|
|
256
|
+
skipped: string[];
|
|
257
|
+
}
|
|
130
258
|
/** Chapter lifecycle states (the writing pipeline's state machine). */
|
|
131
259
|
export type ChapterStatus = 'pending' | 'generating' | 'written' | 'reviewing' | 'approved' | 'rejected' | 'error';
|
|
132
260
|
/** One chapter in the plan. */
|
|
@@ -141,6 +269,22 @@ export interface ChapterPlan {
|
|
|
141
269
|
beats: string;
|
|
142
270
|
/** Target character count (defaults to the configured chapter size). */
|
|
143
271
|
targetChars: number;
|
|
272
|
+
/** 本章必达项(必须推进的局面/关系/信息/风险/决策变化)。 */
|
|
273
|
+
mustAdvance?: string[];
|
|
274
|
+
/** 本章必须保持/不得破坏的项(如人物状态、已有伏笔不提前揭)。 */
|
|
275
|
+
mustPreserve?: string[];
|
|
276
|
+
/** 本章不可违背的人物硬事实(身份/阵营/境界/当前位置/知情度)。 */
|
|
277
|
+
characterHardFacts?: string[];
|
|
278
|
+
/** 伏笔操作指令(seed/touch/pressure/partial_reveal/payoff/forbid)。 */
|
|
279
|
+
payoffDirectives?: Array<{
|
|
280
|
+
no?: number;
|
|
281
|
+
operation?: 'seed' | 'touch' | 'pressure' | 'partial_reveal' | 'payoff' | 'forbid';
|
|
282
|
+
text?: string;
|
|
283
|
+
}>;
|
|
284
|
+
/** 章末钩子要求(悬念/反转/新线索/未闭合选择)。 */
|
|
285
|
+
endingHook?: string;
|
|
286
|
+
/** 本章义务合约(人类可读摘要,供生成与审稿共同锚定)。 */
|
|
287
|
+
obligation?: string;
|
|
144
288
|
/** Generation/review state. */
|
|
145
289
|
status: ChapterStatus;
|
|
146
290
|
/** 进入 generating 的时间(用于超时自动复位;未在生成时无此字段)。 */
|
|
@@ -157,6 +301,10 @@ export interface ChapterPlan {
|
|
|
157
301
|
review?: ReviewReport;
|
|
158
302
|
/** 作者复盘:钩子兑现/结尾钩子/剧情线推进/连续性/节奏趋势(生成后自动)。 */
|
|
159
303
|
authorReview?: AuthorReview;
|
|
304
|
+
/** 本章目标张力 0-100(规划或作者设定;用于张力曲线)。 */
|
|
305
|
+
tension?: number;
|
|
306
|
+
/** 本章实际张力 0-100(审稿时模型打分;缺省时回落到 review.tension)。 */
|
|
307
|
+
tensionActual?: number;
|
|
160
308
|
/**
|
|
161
309
|
* 待确认草稿:润色(去AI味)或整章重写的产物正文。生成时先存这里,
|
|
162
310
|
* 用户看过对比后点「采纳」才覆盖正文文件;点「放弃」则丢弃。刷新页面不丢失。
|
|
@@ -179,17 +327,41 @@ export interface AuthorReview {
|
|
|
179
327
|
continuity: string;
|
|
180
328
|
/** 近期节奏趋势提示(拖沓/爽点密度等)。 */
|
|
181
329
|
trend: string;
|
|
330
|
+
/** 本章发生的关键状态变化(人物状态/世界局面/关系/资源),用于回灌整本与事实库。 */
|
|
331
|
+
stateChanges?: string[];
|
|
332
|
+
/** 本章新引入或升级的冲突(供整本控制层与后续卷节奏参考)。 */
|
|
333
|
+
newConflicts?: string[];
|
|
334
|
+
/** 本章埋下/推进的新线索(供知识与伏笔系统回灌)。 */
|
|
335
|
+
clues?: string[];
|
|
336
|
+
/** 本章缺席但值得注意的角色及风险(卷级职责/缺席风险)。 */
|
|
337
|
+
absentRisks?: string[];
|
|
182
338
|
/** 复盘时间。 */
|
|
183
339
|
reviewedAt: string;
|
|
184
340
|
}
|
|
341
|
+
/** 审稿维度(结构化定位问题类别;与 review-policy.ts 的 REVIEW_DIMENSIONS 对齐)。 */
|
|
342
|
+
export type ReviewDimension = 'character' | 'setting' | 'redline' | 'writing' | 'pacing' | 'logic' | 'anti-ai' | 'presentation' | 'compliance';
|
|
185
343
|
/** One review finding. */
|
|
186
344
|
export interface ReviewIssue {
|
|
187
345
|
/** Severity: high = must fix, medium = should fix, low = suggestion. */
|
|
188
346
|
severity: 'high' | 'medium' | 'low';
|
|
347
|
+
/** 问题维度(可选;缺省由前端按 item 推断)。 */
|
|
348
|
+
dimension?: ReviewDimension;
|
|
189
349
|
/** What the problem is. */
|
|
190
350
|
item: string;
|
|
191
351
|
/** Concrete suggestion for fixing it. */
|
|
192
352
|
suggestion: string;
|
|
353
|
+
/** 命中的反 AI 规则名(结构化,便于统计)。 */
|
|
354
|
+
ruleName?: string;
|
|
355
|
+
/** 规则类别:forbidden / risk / encourage。 */
|
|
356
|
+
ruleType?: 'forbidden' | 'risk' | 'encourage';
|
|
357
|
+
/** 问题细分类(如 套话 句式 段落 心理 设定)。 */
|
|
358
|
+
category?: string;
|
|
359
|
+
/** 命中的原文摘录。 */
|
|
360
|
+
excerpt?: string;
|
|
361
|
+
/** 判定理由。 */
|
|
362
|
+
reason?: string;
|
|
363
|
+
/** 是否可自动改写。 */
|
|
364
|
+
canAutoRewrite?: boolean;
|
|
193
365
|
}
|
|
194
366
|
/** AI review report for one chapter. */
|
|
195
367
|
export interface ReviewReport {
|
|
@@ -201,6 +373,17 @@ export interface ReviewReport {
|
|
|
201
373
|
verdict: string;
|
|
202
374
|
/** Individual findings. */
|
|
203
375
|
issues: ReviewIssue[];
|
|
376
|
+
/** 风险分 0-100(越高越需人工处理;源自 LLM 复核与本地扫描)。 */
|
|
377
|
+
riskScore?: number;
|
|
378
|
+
/** 本地 AI 味指数 0-100(越高越像 AI;LLM 复核锚点,供 UI 展示)。 */
|
|
379
|
+
aiFlavor?: number;
|
|
380
|
+
/** 本地扫描命中的高频套话(按次数降序,取前若干)。 */
|
|
381
|
+
aiPhrases?: Array<{
|
|
382
|
+
word: string;
|
|
383
|
+
count: number;
|
|
384
|
+
}>;
|
|
385
|
+
/** 本章张力 0-100(审稿模型评分;用于张力曲线的"实际"值)。 */
|
|
386
|
+
tension?: number;
|
|
204
387
|
/** When the review ran. */
|
|
205
388
|
reviewedAt: string;
|
|
206
389
|
}
|
|
@@ -216,6 +399,155 @@ export interface Volume {
|
|
|
216
399
|
chapterStart: number;
|
|
217
400
|
/** Last chapter number (inclusive). */
|
|
218
401
|
chapterEnd: number;
|
|
402
|
+
/** 卷级战略(这一卷的定位/承转,如「立威卷」「冲突升级卷」)。 */
|
|
403
|
+
strategy?: string;
|
|
404
|
+
/** 卷节奏板(这一卷的节奏安排:起-承-转-合/爽点密度/关键节点)。 */
|
|
405
|
+
pacing?: string;
|
|
406
|
+
}
|
|
407
|
+
/** 开书定盘:面向读者的承诺与流派定位(生成/规划均可引用)。 */
|
|
408
|
+
export interface BookContract {
|
|
409
|
+
/** 一句话卖点/题材承诺。 */
|
|
410
|
+
promise?: string;
|
|
411
|
+
/** 主推进模式名(从推进模式库选)。 */
|
|
412
|
+
primaryModeName?: string;
|
|
413
|
+
/** 辅助推进模式名。 */
|
|
414
|
+
secondaryModeNames?: string[];
|
|
415
|
+
/** 整体文风基调(一句话)。 */
|
|
416
|
+
tone?: string;
|
|
417
|
+
/** 目标平台(如「番茄」)。 */
|
|
418
|
+
targetPlatform?: string;
|
|
419
|
+
}
|
|
420
|
+
/** 书内知识库文档(供生成/规划时检索注入的参考资料)。 */
|
|
421
|
+
export interface KnowledgeDoc {
|
|
422
|
+
id: string;
|
|
423
|
+
title: string;
|
|
424
|
+
content: string;
|
|
425
|
+
updatedAt: string;
|
|
426
|
+
}
|
|
427
|
+
/** POST /knowledge request:增删改知识库文档。 */
|
|
428
|
+
export interface KnowledgeRequest {
|
|
429
|
+
action: 'add' | 'remove' | 'replace';
|
|
430
|
+
doc?: {
|
|
431
|
+
id?: string;
|
|
432
|
+
title: string;
|
|
433
|
+
content: string;
|
|
434
|
+
};
|
|
435
|
+
id?: string;
|
|
436
|
+
}
|
|
437
|
+
/** POST /book-analysis request。 */
|
|
438
|
+
export interface BookAnalysisRequest {
|
|
439
|
+
text: string;
|
|
440
|
+
}
|
|
441
|
+
/** 书分析/拆书结果。 */
|
|
442
|
+
export interface BookAnalysisResult {
|
|
443
|
+
sellingPoints: string[];
|
|
444
|
+
structure: string[];
|
|
445
|
+
lessons: string[];
|
|
446
|
+
risks: string[];
|
|
447
|
+
}
|
|
448
|
+
/** POST /idea-inspiration request。 */
|
|
449
|
+
export interface IdeaInspirationRequest {
|
|
450
|
+
idea: string;
|
|
451
|
+
count?: number;
|
|
452
|
+
}
|
|
453
|
+
/** 创意灵感结果:多方向开书灵感。 */
|
|
454
|
+
export interface IdeaInspirationResult {
|
|
455
|
+
ideas: Array<{
|
|
456
|
+
title: string;
|
|
457
|
+
hook: string;
|
|
458
|
+
genre: string;
|
|
459
|
+
pov: string;
|
|
460
|
+
payoff: string;
|
|
461
|
+
}>;
|
|
462
|
+
}
|
|
463
|
+
/** POST /director request。 */
|
|
464
|
+
export interface DirectorRequest {
|
|
465
|
+
focus?: string;
|
|
466
|
+
}
|
|
467
|
+
/** 自动导演编排建议(下一卷/阶段编排 + 修复再平衡)。 */
|
|
468
|
+
export interface DirectorAdvice {
|
|
469
|
+
summary: string;
|
|
470
|
+
nextArc: string[];
|
|
471
|
+
pacing: string;
|
|
472
|
+
risks: string[];
|
|
473
|
+
fixes: string[];
|
|
474
|
+
}
|
|
475
|
+
/** 自动导演「采纳」后生成的书内待办项。 */
|
|
476
|
+
export interface DirectorTodo {
|
|
477
|
+
id: string;
|
|
478
|
+
text: string;
|
|
479
|
+
/** 来源:风险 或 修复。 */
|
|
480
|
+
source: 'risk' | 'fix';
|
|
481
|
+
done: boolean;
|
|
482
|
+
createdAt: string;
|
|
483
|
+
}
|
|
484
|
+
/** 题材雷达:单条市场信号。 */
|
|
485
|
+
export interface MarketRadarSignal {
|
|
486
|
+
id: string;
|
|
487
|
+
kind: 'genre' | 'protagonist' | 'advantage' | 'opening' | 'relationship' | 'title_pattern' | 'opportunity' | 'crowding';
|
|
488
|
+
title: string;
|
|
489
|
+
detail: string;
|
|
490
|
+
/** 趋势:current / rising / stable / falling。 */
|
|
491
|
+
direction?: 'current' | 'rising' | 'stable' | 'falling';
|
|
492
|
+
/** 是否建议优先考虑。 */
|
|
493
|
+
recommended?: boolean;
|
|
494
|
+
}
|
|
495
|
+
/** 题材雷达:生产底座(引用内置题材/推进模式库,或给出新资产)。 */
|
|
496
|
+
export interface ProductionFoundation {
|
|
497
|
+
genre: {
|
|
498
|
+
existingId?: string;
|
|
499
|
+
name: string;
|
|
500
|
+
description: string;
|
|
501
|
+
template?: string;
|
|
502
|
+
};
|
|
503
|
+
primaryStoryMode: {
|
|
504
|
+
existingId?: string;
|
|
505
|
+
name: string;
|
|
506
|
+
driver: string;
|
|
507
|
+
readerExpectation: string;
|
|
508
|
+
};
|
|
509
|
+
secondaryStoryMode?: {
|
|
510
|
+
existingId?: string;
|
|
511
|
+
name: string;
|
|
512
|
+
driver: string;
|
|
513
|
+
readerExpectation: string;
|
|
514
|
+
};
|
|
515
|
+
}
|
|
516
|
+
/** 题材雷达:开书创意简报(可执行,严禁照搬具体作品/命名)。 */
|
|
517
|
+
export interface MarketCreativeBrief {
|
|
518
|
+
promptBlock: string;
|
|
519
|
+
openingIdea: string;
|
|
520
|
+
coreAdvantage: string;
|
|
521
|
+
bookSellingPoint: string;
|
|
522
|
+
first30ChapterPromise: string;
|
|
523
|
+
}
|
|
524
|
+
/** 题材雷达结果。 */
|
|
525
|
+
export interface MarketRadarResult {
|
|
526
|
+
signals: MarketRadarSignal[];
|
|
527
|
+
productionFoundation: ProductionFoundation;
|
|
528
|
+
/** 开书创意简报(可选;用「用信号创作」接口单独生成)。 */
|
|
529
|
+
creativeBrief?: MarketCreativeBrief;
|
|
530
|
+
}
|
|
531
|
+
/** POST /market-radar request。 */
|
|
532
|
+
export interface MarketRadarRequest {
|
|
533
|
+
platform?: string;
|
|
534
|
+
genre?: string;
|
|
535
|
+
keywords?: string;
|
|
536
|
+
feedText?: string;
|
|
537
|
+
/** 已扫描的上榜记录(来自真实榜单抓取),用于让分析基于真实榜单证据。 */
|
|
538
|
+
candidates?: Array<{
|
|
539
|
+
title: string;
|
|
540
|
+
author?: string;
|
|
541
|
+
tags?: string[];
|
|
542
|
+
synopsis?: string;
|
|
543
|
+
category?: string;
|
|
544
|
+
heatLabel?: string;
|
|
545
|
+
}>;
|
|
546
|
+
}
|
|
547
|
+
/** POST /market-radar/brief request:用选中的信号 + 影响模式生成开书创意。 */
|
|
548
|
+
export interface MarketRadarBriefRequest {
|
|
549
|
+
influenceMode: 'follow_hot' | 'differentiate' | 'light';
|
|
550
|
+
signals: MarketRadarSignal[];
|
|
219
551
|
}
|
|
220
552
|
/** A character card from the story bible. */
|
|
221
553
|
export interface CharacterCard {
|
|
@@ -246,6 +578,118 @@ export interface StoryBible {
|
|
|
246
578
|
generatedAt?: string;
|
|
247
579
|
}
|
|
248
580
|
/** A planted/active/resolved foreshadowing thread. */
|
|
581
|
+
/**
|
|
582
|
+
* 张力曲线形状预设:
|
|
583
|
+
* `escalation` 递进爬升 / `suspense` 悬疑加压 / `wave` 波浪呼吸 /
|
|
584
|
+
* `frontLoad` 前紧后稳 / `flat` 平稳推进 / `custom` 自定义。
|
|
585
|
+
*/
|
|
586
|
+
export type TensionCurvePreset = 'escalation' | 'suspense' | 'wave' | 'frontLoad' | 'flat' | 'custom';
|
|
587
|
+
/** 张力曲线配置(随项目保存)。 */
|
|
588
|
+
export interface TensionCurveConfig {
|
|
589
|
+
preset: TensionCurvePreset;
|
|
590
|
+
/** preset=custom 时的逐章采样(0-100;缺省按章节数取默认值)。 */
|
|
591
|
+
custom?: number[];
|
|
592
|
+
}
|
|
593
|
+
/** 张力曲线的一条问题(实际 vs 目标 / 曲线形状)。 */
|
|
594
|
+
export interface TensionIssue {
|
|
595
|
+
severity: 'high' | 'medium' | 'low';
|
|
596
|
+
chapters: number[];
|
|
597
|
+
item: string;
|
|
598
|
+
suggestion: string;
|
|
599
|
+
}
|
|
600
|
+
/** 张力曲线数据点(面板绘图用)。 */
|
|
601
|
+
export interface TensionCurvePoint {
|
|
602
|
+
no: number;
|
|
603
|
+
title: string;
|
|
604
|
+
/** 目标张力。 */
|
|
605
|
+
target?: number;
|
|
606
|
+
/** 实际张力(审稿打分)。 */
|
|
607
|
+
actual?: number;
|
|
608
|
+
/** 参考曲线在此处的取值。 */
|
|
609
|
+
reference?: number;
|
|
610
|
+
}
|
|
611
|
+
/** GET /tension 响应。 */
|
|
612
|
+
export interface TensionResponse {
|
|
613
|
+
preset: TensionCurvePreset;
|
|
614
|
+
points: TensionCurvePoint[];
|
|
615
|
+
/** 规则核对发现的问题。 */
|
|
616
|
+
issues: TensionIssue[];
|
|
617
|
+
}
|
|
618
|
+
/** POST /tension 请求。 */
|
|
619
|
+
export interface TensionRequest {
|
|
620
|
+
op: 'preset' | 'set' | 'clear';
|
|
621
|
+
preset?: TensionCurvePreset;
|
|
622
|
+
chapterNo?: number;
|
|
623
|
+
/** op=set 时的目标张力(0-100)。 */
|
|
624
|
+
tension?: number;
|
|
625
|
+
}
|
|
626
|
+
/** 允许作者编辑的提示词槽位 id(白名单)。 */
|
|
627
|
+
export type PromptSlotId = 'styleExtra' | 'antiAiExtra' | 'dialogueExtra' | 'endingHookExtra';
|
|
628
|
+
/** 一个提示词槽位的当前内容。 */
|
|
629
|
+
export interface PromptSlotState {
|
|
630
|
+
id: PromptSlotId;
|
|
631
|
+
label: string;
|
|
632
|
+
hint: string;
|
|
633
|
+
placeholder: string;
|
|
634
|
+
maxChars: number;
|
|
635
|
+
value: string;
|
|
636
|
+
}
|
|
637
|
+
/** GET /prompt-slots 响应。 */
|
|
638
|
+
export interface PromptSlotsResponse {
|
|
639
|
+
slots: PromptSlotState[];
|
|
640
|
+
}
|
|
641
|
+
/** POST /prompt-slots 请求:设置或清空一个槽位。 */
|
|
642
|
+
export interface PromptSlotsRequest {
|
|
643
|
+
id: PromptSlotId;
|
|
644
|
+
/** 空串 = 清空该槽位(恢复默认)。 */
|
|
645
|
+
value: string;
|
|
646
|
+
}
|
|
647
|
+
/**
|
|
648
|
+
* 故事时间线事件:从章节正文抽取的「故事内时间点 + 地点 + 参与角色 + 事件」。
|
|
649
|
+
* 用途:后续章节的时间连续性与地点衔接(比编年录更强调"顺序")。
|
|
650
|
+
*/
|
|
651
|
+
export interface TimelineEvent {
|
|
652
|
+
/** 稳定 id(时间线内唯一)。 */
|
|
653
|
+
id: string;
|
|
654
|
+
/** 所属章节号。 */
|
|
655
|
+
chapterNo: number;
|
|
656
|
+
/** 故事内时间点(如「第三日黄昏」「入宗三个月后」「同日夜」)。 */
|
|
657
|
+
time: string;
|
|
658
|
+
/** 相对顺序(同书内递增;无法判断时缺省)。用于检测时间倒流。 */
|
|
659
|
+
order?: number;
|
|
660
|
+
/** 地点。 */
|
|
661
|
+
place: string;
|
|
662
|
+
/** 参与角色(角色名)。 */
|
|
663
|
+
characters: string[];
|
|
664
|
+
/** 事件一句话。 */
|
|
665
|
+
event: string;
|
|
666
|
+
/** 来源:模型抽取 / 作者手改。 */
|
|
667
|
+
source: 'extracted' | 'manual';
|
|
668
|
+
createdAt: string;
|
|
669
|
+
}
|
|
670
|
+
/** 时间线矛盾(规则初筛 + AI 复核)。 */
|
|
671
|
+
export interface TimelineIssue {
|
|
672
|
+
severity: 'high' | 'medium' | 'low';
|
|
673
|
+
/** 定位到的章节(可多个)。 */
|
|
674
|
+
chapters: number[];
|
|
675
|
+
/** 问题描述。 */
|
|
676
|
+
item: string;
|
|
677
|
+
/** 建议修法。 */
|
|
678
|
+
suggestion: string;
|
|
679
|
+
}
|
|
680
|
+
/** GET /timeline 响应。 */
|
|
681
|
+
export interface TimelineResponse {
|
|
682
|
+
events: TimelineEvent[];
|
|
683
|
+
/** 规则初筛发现的问题(瞬时计算,不落盘)。 */
|
|
684
|
+
issues?: TimelineIssue[];
|
|
685
|
+
}
|
|
686
|
+
/** POST /timeline 请求:op=extract 抽单章 / check 全量检查 / update 手改 / remove 删除 / clear 清空。 */
|
|
687
|
+
export interface TimelineRequest {
|
|
688
|
+
op: 'extract' | 'check' | 'update' | 'remove' | 'clear';
|
|
689
|
+
chapterNo?: number;
|
|
690
|
+
event?: TimelineEvent;
|
|
691
|
+
id?: string;
|
|
692
|
+
}
|
|
249
693
|
export interface Foreshadow {
|
|
250
694
|
/** Stable id. */
|
|
251
695
|
id: string;
|
|
@@ -284,6 +728,8 @@ export interface AuditResponse {
|
|
|
284
728
|
auditedChapters: number;
|
|
285
729
|
/** 质检时间。 */
|
|
286
730
|
auditedAt: string;
|
|
731
|
+
/** 本次质检使用的模型(auditModel 或全局 model)。 */
|
|
732
|
+
model?: string;
|
|
287
733
|
}
|
|
288
734
|
/** 全书质检的实时状态(通过 /status 暴露给面板/外部读取)。 */
|
|
289
735
|
export interface AuditStatus {
|
|
@@ -350,7 +796,7 @@ export interface PlotlineHealthReport {
|
|
|
350
796
|
note: string;
|
|
351
797
|
}>;
|
|
352
798
|
}
|
|
353
|
-
/**
|
|
799
|
+
/** 剧情方案:下一阶段目标 + 建议新线。 */
|
|
354
800
|
export interface PlotlinePlan {
|
|
355
801
|
/** 下一阶段(未来 5-10 章)剧情方向。 */
|
|
356
802
|
direction: string;
|
|
@@ -360,7 +806,7 @@ export interface PlotlinePlan {
|
|
|
360
806
|
/** POST /plotlines 响应。 */
|
|
361
807
|
export interface PlotlinesResponse {
|
|
362
808
|
plotlines: Plotline[];
|
|
363
|
-
/** op=suggest 时的
|
|
809
|
+
/** op=suggest 时的 建议候选线。 */
|
|
364
810
|
suggestions?: Plotline[];
|
|
365
811
|
/** op=health 时的健康检查报告。 */
|
|
366
812
|
health?: PlotlineHealthReport;
|
|
@@ -457,91 +903,6 @@ export interface BreakdownResponse {
|
|
|
457
903
|
/** 估算消耗 token。 */
|
|
458
904
|
usedTokens: number;
|
|
459
905
|
}
|
|
460
|
-
/** 漫剧分镜:一个角色锚点卡。 */
|
|
461
|
-
export interface StoryboardCharacterCard {
|
|
462
|
-
name: string;
|
|
463
|
-
/** 视觉锚点:发型/五官/体型/标志物(中文描述)。 */
|
|
464
|
-
visualAnchor: string;
|
|
465
|
-
/** AI 标签组(英文,全分镜强制复用)。 */
|
|
466
|
-
tags: string;
|
|
467
|
-
/** 情绪表情库(英文,按需调用)。 */
|
|
468
|
-
expressions: string[];
|
|
469
|
-
}
|
|
470
|
-
/** 漫剧分镜:一个分镜格。 */
|
|
471
|
-
export interface StoryboardPanel {
|
|
472
|
-
/** 序号。 */
|
|
473
|
-
index: number;
|
|
474
|
-
/** 时间码(如 0:00-0:03)。 */
|
|
475
|
-
timecode: string;
|
|
476
|
-
/** 景别(特写/中景/全景…)。 */
|
|
477
|
-
shot: string;
|
|
478
|
-
/** 画面描述(具象动作,非抽象情感)。 */
|
|
479
|
-
visual: string;
|
|
480
|
-
/** 台词(情绪标签 + 内容)。 */
|
|
481
|
-
dialogue: string;
|
|
482
|
-
/** 转场/动效。 */
|
|
483
|
-
transition: string;
|
|
484
|
-
/** AI 提示词(英文标签,豆包/SD 通用)。 */
|
|
485
|
-
prompt: string;
|
|
486
|
-
}
|
|
487
|
-
/** POST /storyboard 请求:章节 → 漫剧分镜。 */
|
|
488
|
-
export interface StoryboardRequest {
|
|
489
|
-
chapterNo: number;
|
|
490
|
-
/** 赛道类型:爽文/甜宠/悬疑/搞笑(留空由 AI 推断)。 */
|
|
491
|
-
genre?: string;
|
|
492
|
-
/** 目标平台(抖音/快手/B站…,默认抖音)。 */
|
|
493
|
-
platform?: string;
|
|
494
|
-
/** AI 工具偏好:doubao / seedance / sd / mj(影响提示词格式,默认 doubao)。 */
|
|
495
|
-
tool?: string;
|
|
496
|
-
}
|
|
497
|
-
/** POST /storyboard 响应。 */
|
|
498
|
-
export interface StoryboardResponse {
|
|
499
|
-
/** 本集标题。 */
|
|
500
|
-
title: string;
|
|
501
|
-
/** 赛道与节奏说明。 */
|
|
502
|
-
pacingNote: string;
|
|
503
|
-
/** 本集钩子(结尾悬念)。 */
|
|
504
|
-
hook: string;
|
|
505
|
-
/** 角色锚点卡。 */
|
|
506
|
-
characters: StoryboardCharacterCard[];
|
|
507
|
-
/** 分镜表。 */
|
|
508
|
-
panels: StoryboardPanel[];
|
|
509
|
-
/** 结尾钩子台词。 */
|
|
510
|
-
endingHook: string;
|
|
511
|
-
}
|
|
512
|
-
/** 漫剧分集计划:一集(含 1-N 章)。 */
|
|
513
|
-
export interface StoryboardEpisode {
|
|
514
|
-
/** 集号。 */
|
|
515
|
-
index: number;
|
|
516
|
-
/** 集标题(冲突+悬念句式)。 */
|
|
517
|
-
title: string;
|
|
518
|
-
/** 涵盖章节号。 */
|
|
519
|
-
chapters: number[];
|
|
520
|
-
/** 叙事任务:这集讲什么、为什么这么分。 */
|
|
521
|
-
narrativeJob: string;
|
|
522
|
-
/** 开头钩子。 */
|
|
523
|
-
openingHook: string;
|
|
524
|
-
/** 结尾钩子(逼看下集)。 */
|
|
525
|
-
endingHook: string;
|
|
526
|
-
}
|
|
527
|
-
/** POST /storyboard/plan 请求:读一卷 → 输出漫剧分集计划。 */
|
|
528
|
-
export interface StoryboardPlanRequest {
|
|
529
|
-
/** 卷号(1-5)。 */
|
|
530
|
-
volumeNo: number;
|
|
531
|
-
/** 目标平台(默认抖音)。 */
|
|
532
|
-
platform?: string;
|
|
533
|
-
/** 每集约 1-2 分钟,最多多少集(默认 25)。 */
|
|
534
|
-
maxEpisodes?: number;
|
|
535
|
-
}
|
|
536
|
-
/** POST /storyboard/plan 响应。 */
|
|
537
|
-
export interface StoryboardPlanResponse {
|
|
538
|
-
/** 本卷漫剧化的叙事策略说明。 */
|
|
539
|
-
strategy: string;
|
|
540
|
-
/** 分集计划。 */
|
|
541
|
-
episodes: StoryboardEpisode[];
|
|
542
|
-
/** 参与规划的章节数。 */
|
|
543
|
-
chaptersScanned: number;
|
|
544
|
-
}
|
|
545
906
|
/** 角色卡:角色当前状态(从事实库聚合)。 */
|
|
546
907
|
export interface RoleStatusCard {
|
|
547
908
|
name: string;
|
|
@@ -554,7 +915,7 @@ export interface RoleStatusCard {
|
|
|
554
915
|
/** 出场次数。 */
|
|
555
916
|
appearances: number;
|
|
556
917
|
}
|
|
557
|
-
/** 角色库条目(主表:作者维护 +
|
|
918
|
+
/** 角色库条目(主表:作者维护 + 提炼 + 编年录自动聚合)。 */
|
|
558
919
|
export interface RoleRecord {
|
|
559
920
|
/** 角色名(唯一键)。 */
|
|
560
921
|
name: string;
|
|
@@ -574,35 +935,37 @@ export interface RoleRecord {
|
|
|
574
935
|
knowledge: string[];
|
|
575
936
|
/** 首次出场章节(编年录聚合,可手动修正)。 */
|
|
576
937
|
firstChapter?: number;
|
|
577
|
-
/** 动漫形象描述词(AI 绘图用:中文描述 + 英文标签 + 关键外貌标签)。 */
|
|
578
|
-
imagePrompt?: {
|
|
579
|
-
/** 中文外貌描述:连贯一段(发色/瞳色/服装/气质/标志物)。 */
|
|
580
|
-
zh: string;
|
|
581
|
-
/** 英文绘图标签:booru 风格逗号分隔。 */
|
|
582
|
-
en: string;
|
|
583
|
-
/** 中文关键标签(发色/瞳色/服装/气质/标志物)。 */
|
|
584
|
-
tags: string[];
|
|
585
|
-
/** 依据来源说明(哪几章哪些描写)。 */
|
|
586
|
-
source?: string;
|
|
587
|
-
};
|
|
588
938
|
}
|
|
589
|
-
/** POST /roles 请求:角色库增删改 +
|
|
939
|
+
/** POST /roles 请求:角色库增删改 + 提炼 + 参考图上传。 */
|
|
590
940
|
export interface RolesRequest {
|
|
591
|
-
op: 'extract' | 'adopt' | 'update' | 'remove'
|
|
941
|
+
op: 'extract' | 'adopt' | 'update' | 'remove';
|
|
592
942
|
/** adopt / update 时传入的角色(adopt 可修改后采纳)。 */
|
|
593
943
|
role?: RoleRecord;
|
|
594
944
|
/** remove 时的角色名。 */
|
|
595
945
|
name?: string;
|
|
596
946
|
}
|
|
947
|
+
/** POST /llm-test 请求:对选中的提供商/模型发一次最小真实调用。 */
|
|
948
|
+
export interface LlmTestRequest {
|
|
949
|
+
provider: string;
|
|
950
|
+
model: string;
|
|
951
|
+
}
|
|
952
|
+
/** POST /llm-test 响应。 */
|
|
953
|
+
export interface LlmTestResponse {
|
|
954
|
+
ok: boolean;
|
|
955
|
+
/** 连通延迟(毫秒)。 */
|
|
956
|
+
ms?: number;
|
|
957
|
+
/** 失败原因(已映射为人话)。 */
|
|
958
|
+
message?: string;
|
|
959
|
+
/** 稳定错误码(LlmError code),便于排查。 */
|
|
960
|
+
code?: string;
|
|
961
|
+
}
|
|
597
962
|
/** POST /roles 响应。 */
|
|
598
963
|
export interface RolesResponse {
|
|
599
964
|
roles: RoleRecord[];
|
|
600
965
|
/** op=extract 时的 AI 候选角色。 */
|
|
601
966
|
candidates?: RoleRecord[];
|
|
602
|
-
/** op=visual 时的动漫形象描述词(已写入角色卡)。 */
|
|
603
|
-
visual?: RoleRecord['imagePrompt'];
|
|
604
967
|
}
|
|
605
|
-
/** POST /bible/patch
|
|
968
|
+
/** POST /bible/patch 请求:局部修补道藏。 */
|
|
606
969
|
export interface BiblePatchRequest {
|
|
607
970
|
worldRules?: string[];
|
|
608
971
|
redLines?: string[];
|
|
@@ -610,10 +973,10 @@ export interface BiblePatchRequest {
|
|
|
610
973
|
/** 角色卡整体替换(人物志编辑知情度等)。 */
|
|
611
974
|
characters?: CharacterCard[];
|
|
612
975
|
}
|
|
613
|
-
/** POST /blurb
|
|
976
|
+
/** POST /blurb 请求:生成/补全或手动保存小说简介。 */
|
|
614
977
|
export interface BlurbRequest {
|
|
615
978
|
action: 'generate' | 'save';
|
|
616
|
-
/**
|
|
979
|
+
/** 已写好的开头(补全时使用;留空 = 全量生成)。 */
|
|
617
980
|
partial?: string;
|
|
618
981
|
/** 手动保存的完整简介(action=save 时)。 */
|
|
619
982
|
text?: string;
|
|
@@ -676,7 +1039,7 @@ export interface WorldState {
|
|
|
676
1039
|
regions: WorldRegion[];
|
|
677
1040
|
factions: WorldFaction[];
|
|
678
1041
|
}
|
|
679
|
-
/** POST /world
|
|
1042
|
+
/** POST /world 请求:提炼或手动保存。 */
|
|
680
1043
|
export interface WorldRequest {
|
|
681
1044
|
action: 'generate' | 'save';
|
|
682
1045
|
/** action=save 时的完整世界数据。 */
|
|
@@ -706,23 +1069,157 @@ export interface ProjectState {
|
|
|
706
1069
|
assets?: ProjectAssets;
|
|
707
1070
|
/** 事实库/时间线:每章生成后抽取,注入后续章节保持一致性。 */
|
|
708
1071
|
facts?: ChapterFact[];
|
|
709
|
-
/**
|
|
1072
|
+
/** 书内知识库文档(可检索资料/设定/参考)。 */
|
|
1073
|
+
knowledgeDocs?: KnowledgeDoc[];
|
|
1074
|
+
/** 自动导演待办:风险/修复「采纳」后生成的随手清单。 */
|
|
1075
|
+
todos?: DirectorTodo[];
|
|
1076
|
+
/** 小说简介(面向读者的作品门面,生成或手动保存)。 */
|
|
710
1077
|
blurb?: string;
|
|
1078
|
+
/** 开书定盘:书籍级承诺与流派定位(前30章承诺/主副模式/文风/平台)。 */
|
|
1079
|
+
bookContract?: BookContract;
|
|
711
1080
|
/** 封面文件名(相对输出目录,如 cover.png)。 */
|
|
712
1081
|
coverPath?: string;
|
|
713
1082
|
/** 大世界结构化数据(境界体系/区域/势力)。 */
|
|
714
1083
|
world?: WorldState;
|
|
715
1084
|
/** 剧情线(主线/支线/人物线/悬念线)。 */
|
|
716
1085
|
plotlines?: Plotline[];
|
|
717
|
-
/** 角色库(作者维护 +
|
|
1086
|
+
/** 角色库(作者维护 + 提炼的主表)。 */
|
|
718
1087
|
roles?: RoleRecord[];
|
|
719
1088
|
/** 人物志:角色当前状态聚合结果(从编年录刷新后存档,打开页面直接显示)。 */
|
|
720
1089
|
roleStatus?: RoleStatusCard[];
|
|
1090
|
+
/** 故事时间线(逐章抽取:时间点 / 地点 / 参与角色 / 事件)。 */
|
|
1091
|
+
timeline?: TimelineEvent[];
|
|
1092
|
+
/** 张力曲线配置(形状预设 + 自定义采样)。 */
|
|
1093
|
+
tensionCurve?: TensionCurveConfig;
|
|
1094
|
+
/** 作者自定义的提示词槽位(白名单见 prompt-slots.ts)。 */
|
|
1095
|
+
promptSlots?: Partial<Record<PromptSlotId, string>>;
|
|
1096
|
+
/** 本书参数(写作/审稿/推理/模型快切;未设字段回退全局 config)。 */
|
|
1097
|
+
bookSettings?: BookSettings;
|
|
721
1098
|
/** ISO timestamps. */
|
|
722
1099
|
createdAt: string;
|
|
723
1100
|
updatedAt: string;
|
|
724
1101
|
}
|
|
725
|
-
/**
|
|
1102
|
+
/** 本书参数(存 novel-project.json.bookSettings;未设字段回退全局 config)。 */
|
|
1103
|
+
export interface BookSettings {
|
|
1104
|
+
/** 本书使用的提供方路由(快切器写入)。 */
|
|
1105
|
+
provider?: string;
|
|
1106
|
+
/** 本书使用的主模型 id。 */
|
|
1107
|
+
model?: string;
|
|
1108
|
+
/** 本书写作推理档位。 */
|
|
1109
|
+
reasoningEffort?: 'off' | 'low' | 'high' | 'max';
|
|
1110
|
+
/** 本书分析类任务推理档位。 */
|
|
1111
|
+
analysisReasoning?: 'off' | 'low' | 'high' | 'max';
|
|
1112
|
+
/** 本书每章目标字数。 */
|
|
1113
|
+
chapterChars?: number;
|
|
1114
|
+
/** 本书单章最大输出 tokens。 */
|
|
1115
|
+
maxTokens?: number;
|
|
1116
|
+
/** 本书审稿通过分。 */
|
|
1117
|
+
reviewPassScore?: number;
|
|
1118
|
+
/** 本书是否写完自动审稿。 */
|
|
1119
|
+
autoReview?: boolean;
|
|
1120
|
+
/** 本书是否自动作者复盘。 */
|
|
1121
|
+
autoAuthorReview?: boolean;
|
|
1122
|
+
/** 本书是否修稿后自动复审。 */
|
|
1123
|
+
autoReviewAfterRevise?: boolean;
|
|
1124
|
+
}
|
|
1125
|
+
/** 手动添加的模型库条目(只存插件内,不改 DSH 全局)。 */
|
|
1126
|
+
export interface SavedModel {
|
|
1127
|
+
/** 唯一 id(前端生成的短 id)。 */
|
|
1128
|
+
id: string;
|
|
1129
|
+
/** 展示名(可为空,回退到 model)。 */
|
|
1130
|
+
name: string;
|
|
1131
|
+
/** DSH 提供商路由(如 zai-coding-cn)。 */
|
|
1132
|
+
provider: string;
|
|
1133
|
+
/** 模型 id(如 glm-5.3-flash)。 */
|
|
1134
|
+
model: string;
|
|
1135
|
+
}
|
|
1136
|
+
/** DSH 模型添加:厂商预设(选择厂商,直接填 API Key)。 */
|
|
1137
|
+
export interface LlmVendor {
|
|
1138
|
+
id: string;
|
|
1139
|
+
name: string;
|
|
1140
|
+
/** 该厂商对应的 provider 路由。 */
|
|
1141
|
+
route: string;
|
|
1142
|
+
/** DSH 凭据引用名(写入 .credentials.yaml 的 refs)。 */
|
|
1143
|
+
apiKeyEnv: string;
|
|
1144
|
+
/** 默认模型 id。 */
|
|
1145
|
+
defaultModel: string;
|
|
1146
|
+
/** 建议可选模型 id 列表(下拉 data-list 用)。 */
|
|
1147
|
+
models: string[];
|
|
1148
|
+
/** 内置适配器(如 deepseek-official),无需注册 pi-ai 路由。 */
|
|
1149
|
+
builtin?: boolean;
|
|
1150
|
+
}
|
|
1151
|
+
/** 预置的常见厂商(id=provider 路由;添加模型下拉兜底用,其余厂商由运行时目录动态补充)。 */
|
|
1152
|
+
export declare const LLM_VENDORS: LlmVendor[];
|
|
1153
|
+
/** 运行时厂商目录的一项(添加到模型下拉;由 DSH 的 pi-ai 可配置提供方动态生成)。 */
|
|
1154
|
+
export interface LlmVendorOption {
|
|
1155
|
+
/** provider 路由 id(也是厂商下拉的值)。 */
|
|
1156
|
+
id: string;
|
|
1157
|
+
/** 展示名。 */
|
|
1158
|
+
name: string;
|
|
1159
|
+
/** 建议模型 id(可为空,用户手填)。 */
|
|
1160
|
+
models: string[];
|
|
1161
|
+
/** 已知 DSH 凭据引用名;为空时 host 生成 `PI_AI_<ID>_API_KEY`。 */
|
|
1162
|
+
apiKeyEnv?: string;
|
|
1163
|
+
/** 内置适配器(只写凭据,不注册 pi-ai 路由)。 */
|
|
1164
|
+
builtin?: boolean;
|
|
1165
|
+
}
|
|
1166
|
+
/** GET /llm-vendors 响应。 */
|
|
1167
|
+
export interface LlmVendorsResponse {
|
|
1168
|
+
vendors: LlmVendorOption[];
|
|
1169
|
+
}
|
|
1170
|
+
/** /llm-models 里的一条模型。 */
|
|
1171
|
+
export interface LlmModelOption {
|
|
1172
|
+
id: string;
|
|
1173
|
+
name: string;
|
|
1174
|
+
}
|
|
1175
|
+
/** GET /llm-models?provider=x 响应。 */
|
|
1176
|
+
export interface LlmModelsResponse {
|
|
1177
|
+
models: LlmModelOption[];
|
|
1178
|
+
}
|
|
1179
|
+
/** GET /llm-providers 响应:当前已注册的提供方路由。 */
|
|
1180
|
+
export interface LlmProvidersResponse {
|
|
1181
|
+
providers: {
|
|
1182
|
+
id: string;
|
|
1183
|
+
name: string;
|
|
1184
|
+
}[];
|
|
1185
|
+
}
|
|
1186
|
+
/** POST /llm-remove 请求:移除一个提供方(unset key + 移除 llm-pi-ai 路由)。 */
|
|
1187
|
+
export interface RemoveProviderRequest {
|
|
1188
|
+
provider: string;
|
|
1189
|
+
/** 该提供方对应的 DSH 凭据引用名(用于 unset)。 */
|
|
1190
|
+
apiKeyEnv?: string;
|
|
1191
|
+
}
|
|
1192
|
+
/** POST /llm-remove 响应。 */
|
|
1193
|
+
export interface RemoveProviderResponse {
|
|
1194
|
+
ok: boolean;
|
|
1195
|
+
message?: string;
|
|
1196
|
+
}
|
|
1197
|
+
/** POST /llm-add 请求:添加一个模型(厂商直填 key,或自定义路由)。 */
|
|
1198
|
+
export interface AddModelRequest {
|
|
1199
|
+
mode: 'vendor' | 'custom';
|
|
1200
|
+
/** 厂商模式用:provider 路由 id(来自 /llm-vendors)。 */
|
|
1201
|
+
vendor?: string;
|
|
1202
|
+
/** 厂商已知的 DSH 凭据引用名(可选;为空时 host 生成)。 */
|
|
1203
|
+
apiKeyEnv?: string;
|
|
1204
|
+
/** 自定义模式用:provider 路由 id。 */
|
|
1205
|
+
provider?: string;
|
|
1206
|
+
/** 模型 id。 */
|
|
1207
|
+
model: string;
|
|
1208
|
+
/** API Key。 */
|
|
1209
|
+
apiKey: string;
|
|
1210
|
+
/** 展示名(可选)。 */
|
|
1211
|
+
name?: string;
|
|
1212
|
+
/** 自定义模式用:OpenAI 兼容 base URL。 */
|
|
1213
|
+
baseURL?: string;
|
|
1214
|
+
}
|
|
1215
|
+
/** POST /llm-add 响应。 */
|
|
1216
|
+
export interface AddModelResponse {
|
|
1217
|
+
ok: boolean;
|
|
1218
|
+
saved: SavedModel;
|
|
1219
|
+
provider: string;
|
|
1220
|
+
message?: string;
|
|
1221
|
+
}
|
|
1222
|
+
/** 手动添加的模型库条目(只存插件内,不改 DSH 全局)。 */
|
|
726
1223
|
export interface NovelConfig {
|
|
727
1224
|
/** Absolute path of the default docx outline to load. */
|
|
728
1225
|
outlinePath: string;
|
|
@@ -730,10 +1227,25 @@ export interface NovelConfig {
|
|
|
730
1227
|
outputDir: string;
|
|
731
1228
|
/** LLM provider route (e.g. deepseek-official). */
|
|
732
1229
|
provider: string;
|
|
733
|
-
/** LLM model id (e.g. deepseek-
|
|
1230
|
+
/** LLM model id (e.g. deepseek-flash). */
|
|
734
1231
|
model: string;
|
|
1232
|
+
/** 生成正文用模型(缺省用 model)。 */
|
|
1233
|
+
generateModel?: string;
|
|
1234
|
+
/** 审稿用模型(缺省用 model;建议用更强的 reasoner/pro)。 */
|
|
1235
|
+
reviewModel?: string;
|
|
1236
|
+
/** 全书质检(审计)用模型(缺省用 model)。 */
|
|
1237
|
+
auditModel?: string;
|
|
1238
|
+
/**
|
|
1239
|
+
* 备用模型:主模型调用失败(网络/限流/额度/服务不可用)时自动切换重试一次。
|
|
1240
|
+
* 留空表示不切换。批量连写时能显著减少"整批中断"。
|
|
1241
|
+
*/
|
|
1242
|
+
fallbackModel?: string;
|
|
1243
|
+
/** 是否在出章后自动抽取故事时间线(失败不阻断出章)。默认开。 */
|
|
1244
|
+
autoTimeline?: boolean;
|
|
735
1245
|
/** LLM reasoning effort: off = no thinking; low/high/max = thinking intensity. */
|
|
736
1246
|
reasoningEffort: 'off' | 'low' | 'high' | 'max';
|
|
1247
|
+
/** 分析类任务(提炼/拆书/反推大纲等)的推理档位;默认 low,不受上面写作档位影响。 */
|
|
1248
|
+
analysisReasoning: 'off' | 'low' | 'high' | 'max';
|
|
737
1249
|
/** Target characters per chapter. */
|
|
738
1250
|
chapterChars: number;
|
|
739
1251
|
/** Max output tokens per chapter call. */
|
|
@@ -746,8 +1258,181 @@ export interface NovelConfig {
|
|
|
746
1258
|
autoAuthorReview: boolean;
|
|
747
1259
|
/** 修订/润色产出草稿后是否自动附带一次 AI 审查(工作区显示新稿评分与剩余问题)。 */
|
|
748
1260
|
autoReviewAfterRevise: boolean;
|
|
1261
|
+
/** 自定义背景图(URL 或 dataURL 或服务端路径引用;空 = 使用主题默认背景)。 */
|
|
1262
|
+
themeBackground?: string;
|
|
1263
|
+
/** 自定义背景遮罩/模糊强度 0-80(0 = 不遮罩)。 */
|
|
1264
|
+
themeBackgroundBlur?: number;
|
|
1265
|
+
/** 玻璃透明度 0-100(100=当前原样,越小越透,新拟态/黏土可见背景图)。 */
|
|
1266
|
+
themeOpacity?: number;
|
|
1267
|
+
/** 是否启用改编模式(默认关闭;发布后开启)。 */
|
|
1268
|
+
enableAdaptMode?: boolean;
|
|
1269
|
+
/** 手动添加的模型库(「我的模型」条目;只存插件内)。 */
|
|
1270
|
+
savedModels?: SavedModel[];
|
|
1271
|
+
}
|
|
1272
|
+
/** POST /move-output-dir request:dryRun=true 仅预览;确认时须带 to。 */
|
|
1273
|
+
export interface MoveOutputDirRequest {
|
|
1274
|
+
/** 新输出目录(绝对路径)。 */
|
|
1275
|
+
to?: string;
|
|
1276
|
+
/** 只列出当前目录内容,不搬移。 */
|
|
1277
|
+
dryRun?: boolean;
|
|
1278
|
+
}
|
|
1279
|
+
/** POST /move-output-dir response。 */
|
|
1280
|
+
export interface MoveOutputDirResponse {
|
|
1281
|
+
from: string;
|
|
1282
|
+
to?: string;
|
|
1283
|
+
/** 当前(或迁移后)目录内容清单。 */
|
|
1284
|
+
files: string[];
|
|
1285
|
+
bytes: number;
|
|
1286
|
+
/** 联动重指向的书架条目数。 */
|
|
1287
|
+
movedBooks: number;
|
|
1288
|
+
/** settings 默认输出目录是否同步更新。 */
|
|
1289
|
+
defaultUpdated: boolean;
|
|
1290
|
+
}
|
|
1291
|
+
/** POST /book-settings request:patch 省略 = 读取;字段传 null = 删除本书覆盖(回退全局)。 */
|
|
1292
|
+
export interface BookSettingsRequest {
|
|
1293
|
+
patch?: {
|
|
1294
|
+
[K in keyof BookSettings]?: BookSettings[K] | null;
|
|
1295
|
+
};
|
|
1296
|
+
}
|
|
1297
|
+
/** POST /book-settings response。 */
|
|
1298
|
+
export interface BookSettingsResponse {
|
|
1299
|
+
/** 本书已设置的参数(未设字段缺省 = 回退全局)。 */
|
|
1300
|
+
settings: BookSettings;
|
|
1301
|
+
/** 应用回退链后的生效配置(全局 + 本书覆盖)。 */
|
|
1302
|
+
effective: NovelConfig;
|
|
1303
|
+
/** 当前是否有打开的书。 */
|
|
1304
|
+
hasBook: boolean;
|
|
749
1305
|
}
|
|
750
1306
|
/** GET /status response. */
|
|
1307
|
+
/**
|
|
1308
|
+
* 创作阶段契约(宿主计算的「当前阶段 → 本轮允许的动作」)。
|
|
1309
|
+
* 计算逻辑在 stage-contract.ts;这里是宿主与面板/助手共享的线上形状。
|
|
1310
|
+
*/
|
|
1311
|
+
export interface StageInfo {
|
|
1312
|
+
/** 阶段标识。 */
|
|
1313
|
+
id: 'outline' | 'bible' | 'plan' | 'write' | 'wait' | 'review' | 'revise' | 'export';
|
|
1314
|
+
/** 中文阶段名。 */
|
|
1315
|
+
label: string;
|
|
1316
|
+
/** 建议的下一步动作(助手工具名;无对应工具时为空数组)。 */
|
|
1317
|
+
recommend: string[];
|
|
1318
|
+
/** 本阶段允许的写操作(作者只说了「继续」时的唯一命令集)。 */
|
|
1319
|
+
allow: string[];
|
|
1320
|
+
/** 为什么处于该阶段。 */
|
|
1321
|
+
reason: string;
|
|
1322
|
+
}
|
|
1323
|
+
/** 单次 LLM 调用的 token 用量(来自 dsh-llm 的 usage chunk)。 */
|
|
1324
|
+
export interface LlmTokenUsage {
|
|
1325
|
+
inputTokens: number;
|
|
1326
|
+
outputTokens: number;
|
|
1327
|
+
/** 供应商给出的总用量(缺失时由输入+输出推导)。 */
|
|
1328
|
+
totalTokens?: number;
|
|
1329
|
+
/** 思考(reasoning)通道用量。 */
|
|
1330
|
+
reasoningTokens?: number;
|
|
1331
|
+
/** 命中缓存的输入用量。 */
|
|
1332
|
+
cacheReadTokens?: number;
|
|
1333
|
+
}
|
|
1334
|
+
/** LLM 实况帧:宿主 → 浏览器的 SSE 事件(每次调用一组 session_* 事件)。 */
|
|
1335
|
+
export interface LlmLiveFrame {
|
|
1336
|
+
type: 'session_started' | 'output_delta' | 'reasoning_delta' | 'phase_changed' | 'session_completed';
|
|
1337
|
+
/** 宿主生成,形如 ll-<base36>-<n>。 */
|
|
1338
|
+
sessionId: string;
|
|
1339
|
+
/** 本次调用用途(如 正文生成/审稿/章节规划)。 */
|
|
1340
|
+
label?: string;
|
|
1341
|
+
/** 使用模型。 */
|
|
1342
|
+
model?: string;
|
|
1343
|
+
/** 事件时间(ISO)。 */
|
|
1344
|
+
at: string;
|
|
1345
|
+
/** session_started:交互上下文。 */
|
|
1346
|
+
context?: {
|
|
1347
|
+
taskId?: string;
|
|
1348
|
+
interactionId: string;
|
|
1349
|
+
};
|
|
1350
|
+
/** output_delta / reasoning_delta:本次增量文本。 */
|
|
1351
|
+
content?: string;
|
|
1352
|
+
/** session 累计字符数。 */
|
|
1353
|
+
totalChars?: number;
|
|
1354
|
+
/** reasoning 累计字符数。 */
|
|
1355
|
+
totalReasoningChars?: number;
|
|
1356
|
+
/** phase_changed:新阶段。 */
|
|
1357
|
+
phase?: 'requesting' | 'streaming' | 'completed' | 'failed';
|
|
1358
|
+
/** phase_changed:阶段描述。 */
|
|
1359
|
+
phaseMessage?: string;
|
|
1360
|
+
/** session_completed:最终预览(截断)。 */
|
|
1361
|
+
preview?: string;
|
|
1362
|
+
/** session_completed:失败信息。 */
|
|
1363
|
+
error?: string;
|
|
1364
|
+
/** session_completed:本次用量(供应商未上报时缺省)。 */
|
|
1365
|
+
usage?: LlmTokenUsage;
|
|
1366
|
+
/** session_completed:本次调用耗时(毫秒)。 */
|
|
1367
|
+
elapsedMs?: number;
|
|
1368
|
+
/** session_completed:首字耗时(毫秒;未拿到文本时缺省)。 */
|
|
1369
|
+
firstTokenMs?: number;
|
|
1370
|
+
/** session_started:是否已记录可查看的 Prompt(面板据此显示「查看 Prompt」)。 */
|
|
1371
|
+
hasPrompt?: boolean;
|
|
1372
|
+
/** session_started:Prompt 字符数(system + user)。 */
|
|
1373
|
+
promptChars?: number;
|
|
1374
|
+
}
|
|
1375
|
+
/** 按用途分组的用量。 */
|
|
1376
|
+
export interface LlmUsageBucket {
|
|
1377
|
+
label: string;
|
|
1378
|
+
calls: number;
|
|
1379
|
+
failed: number;
|
|
1380
|
+
inputTokens: number;
|
|
1381
|
+
outputTokens: number;
|
|
1382
|
+
reasoningTokens: number;
|
|
1383
|
+
elapsedMs: number;
|
|
1384
|
+
}
|
|
1385
|
+
/** 本次运行(进程内,重启归零)的 LLM 用量汇总。 */
|
|
1386
|
+
export interface LlmUsageSummary {
|
|
1387
|
+
calls: number;
|
|
1388
|
+
failed: number;
|
|
1389
|
+
inputTokens: number;
|
|
1390
|
+
outputTokens: number;
|
|
1391
|
+
reasoningTokens: number;
|
|
1392
|
+
totalTokens: number;
|
|
1393
|
+
elapsedMs: number;
|
|
1394
|
+
/** 供应商未上报 usage 的调用次数(用于说明数据为何不完整)。 */
|
|
1395
|
+
callsWithoutUsage: number;
|
|
1396
|
+
byLabel: LlmUsageBucket[];
|
|
1397
|
+
}
|
|
1398
|
+
/** 一次调用的 Prompt 记录(供面板查看「实际发送了什么」)。 */
|
|
1399
|
+
export interface LlmPromptRecord {
|
|
1400
|
+
sessionId: string;
|
|
1401
|
+
label?: string;
|
|
1402
|
+
model?: string;
|
|
1403
|
+
at: string;
|
|
1404
|
+
system?: string;
|
|
1405
|
+
user?: string;
|
|
1406
|
+
/** system + user 的字符数(记录被截断时仍给出原始长度)。 */
|
|
1407
|
+
chars: number;
|
|
1408
|
+
/** 记录本身是否被截断。 */
|
|
1409
|
+
truncated?: boolean;
|
|
1410
|
+
}
|
|
1411
|
+
/** 章节历史版本(快照):覆盖写入前自动留存,可回滚。 */
|
|
1412
|
+
export interface ChapterSnapshot {
|
|
1413
|
+
id: string;
|
|
1414
|
+
chapterNo: number;
|
|
1415
|
+
/** 快照文件(相对书目录)。 */
|
|
1416
|
+
file: string;
|
|
1417
|
+
/** 留存原因(生成覆盖 / 采纳草稿 / 修订 / 手工)。 */
|
|
1418
|
+
reason: string;
|
|
1419
|
+
chars: number;
|
|
1420
|
+
at: string;
|
|
1421
|
+
}
|
|
1422
|
+
/** GET /snapshot 响应。 */
|
|
1423
|
+
export interface SnapshotResponse {
|
|
1424
|
+
snapshots: ChapterSnapshot[];
|
|
1425
|
+
/** 快照占用字节数。 */
|
|
1426
|
+
bytes: number;
|
|
1427
|
+
}
|
|
1428
|
+
/** POST /snapshot 请求:op=create 手工存档 / restore 回滚 / remove 删除 / prune 只留最近 N 个。 */
|
|
1429
|
+
export interface SnapshotRequest {
|
|
1430
|
+
op: 'create' | 'restore' | 'remove' | 'prune';
|
|
1431
|
+
chapterNo?: number;
|
|
1432
|
+
id?: string;
|
|
1433
|
+
/** prune:每章保留数量。 */
|
|
1434
|
+
keep?: number;
|
|
1435
|
+
}
|
|
751
1436
|
export interface StatusResponse {
|
|
752
1437
|
config: NovelConfig;
|
|
753
1438
|
/** The persisted project, when one exists in the output dir. */
|
|
@@ -756,6 +1441,15 @@ export interface StatusResponse {
|
|
|
756
1441
|
generatedFiles: string[];
|
|
757
1442
|
/** 全书质检实时状态(用于面板/外部读取进度)。 */
|
|
758
1443
|
audit?: AuditStatus;
|
|
1444
|
+
/** 宿主按项目真实状态算出的创作阶段(面板角标 / 外部自动化共用)。 */
|
|
1445
|
+
stage?: StageInfo;
|
|
1446
|
+
/** 本次运行(进程内)的 LLM 用量汇总:调用次数 / 输入·输出·思考 token / 耗时。 */
|
|
1447
|
+
usage?: LlmUsageSummary;
|
|
1448
|
+
/**
|
|
1449
|
+
* 截断声明:本次响应中被裁掉的字段说明(如「编年录:共 320 条,仅返回最近 80 条」)。
|
|
1450
|
+
* 消费方不得把缺失字段当作"不存在",需要完整数据时走专用接口。
|
|
1451
|
+
*/
|
|
1452
|
+
truncations?: string[];
|
|
759
1453
|
}
|
|
760
1454
|
/** 生产单状态(生产单 = 区间批量生产执行器:计划补足 + 逐章生成 + 被拒分级处理)。 */
|
|
761
1455
|
export interface RunState {
|
|
@@ -870,6 +1564,7 @@ export type JobFrame = {
|
|
|
870
1564
|
file: string;
|
|
871
1565
|
chars: number;
|
|
872
1566
|
title: string;
|
|
1567
|
+
warn?: string;
|
|
873
1568
|
} | {
|
|
874
1569
|
type: 'review';
|
|
875
1570
|
no: number;
|
|
@@ -893,6 +1588,15 @@ export type JobFrame = {
|
|
|
893
1588
|
no: number;
|
|
894
1589
|
chars: number;
|
|
895
1590
|
draft: string;
|
|
1591
|
+
} | {
|
|
1592
|
+
type: 'outline-progress';
|
|
1593
|
+
done: number;
|
|
1594
|
+
total: number;
|
|
1595
|
+
phase: string;
|
|
1596
|
+
} | {
|
|
1597
|
+
type: 'outline-done';
|
|
1598
|
+
outline: string;
|
|
1599
|
+
chars: number;
|
|
896
1600
|
} | {
|
|
897
1601
|
type: 'error';
|
|
898
1602
|
no: number;
|
|
@@ -949,13 +1653,31 @@ export interface ChapterResponse {
|
|
|
949
1653
|
markdown: string;
|
|
950
1654
|
}
|
|
951
1655
|
/** POST /export request/response. */
|
|
1656
|
+
/**
|
|
1657
|
+
* 导出范围:
|
|
1658
|
+
* - `book` 整本正文(txt / md)
|
|
1659
|
+
* - `settings` 项目设定(总纲 / 道藏 / 大世界 / 写作资产 / 卷首语)
|
|
1660
|
+
* - `plan` 规划(卷计划 + 章节计划,含每章目标/要点/钩子/硬事实)
|
|
1661
|
+
* - `characters` 角色(角色库 + 人物志当前状态)
|
|
1662
|
+
* - `review` 质检记录(逐章审稿 + 作者复盘 + 伏笔/剧情线状态)
|
|
1663
|
+
* - `project` 项目 JSON(完整状态,用于备份/迁移;仅 json 格式)
|
|
1664
|
+
*/
|
|
1665
|
+
export type ExportScope = 'book' | 'settings' | 'plan' | 'characters' | 'review' | 'project';
|
|
1666
|
+
/** 导出范围全集(宿主校验用;顺序即 UI 展示顺序)。 */
|
|
1667
|
+
export declare const EXPORT_SCOPE_VALUES: readonly ExportScope[];
|
|
1668
|
+
/** 导出范围的中文标签。 */
|
|
1669
|
+
export declare const EXPORT_SCOPE_LABELS: Record<ExportScope, string>;
|
|
952
1670
|
export interface ExportRequest {
|
|
953
|
-
format: 'txt' | 'md';
|
|
1671
|
+
format: 'txt' | 'md' | 'json';
|
|
1672
|
+
/** 缺省 `book`(兼容旧调用)。 */
|
|
1673
|
+
scope?: ExportScope;
|
|
954
1674
|
}
|
|
955
1675
|
export interface ExportResponse {
|
|
956
1676
|
file: string;
|
|
957
1677
|
chars: number;
|
|
958
1678
|
chapters: number;
|
|
1679
|
+
scope: ExportScope;
|
|
1680
|
+
format: 'txt' | 'md' | 'json';
|
|
959
1681
|
}
|
|
960
1682
|
/** POST /config request: patch any subset of the runtime config. */
|
|
961
1683
|
export interface ConfigPatch {
|
|
@@ -963,13 +1685,30 @@ export interface ConfigPatch {
|
|
|
963
1685
|
outputDir?: string;
|
|
964
1686
|
provider?: string;
|
|
965
1687
|
model?: string;
|
|
1688
|
+
generateModel?: string;
|
|
1689
|
+
reviewModel?: string;
|
|
1690
|
+
auditModel?: string;
|
|
1691
|
+
/** 备用模型(主模型失败时自动切换重试一次;空串 = 关闭)。 */
|
|
1692
|
+
fallbackModel?: string;
|
|
1693
|
+
/** 出章后自动抽取故事时间线(默认开)。 */
|
|
1694
|
+
autoTimeline?: boolean;
|
|
966
1695
|
reasoningEffort?: 'off' | 'low' | 'high' | 'max';
|
|
1696
|
+
analysisReasoning?: 'off' | 'low' | 'high' | 'max';
|
|
967
1697
|
chapterChars?: number;
|
|
968
1698
|
maxTokens?: number;
|
|
969
1699
|
reviewPassScore?: number;
|
|
970
1700
|
autoReview?: boolean;
|
|
971
1701
|
autoAuthorReview?: boolean;
|
|
972
1702
|
autoReviewAfterRevise?: boolean;
|
|
1703
|
+
/** 自定义背景图(URL / dataURL / 服务端路径引用)。 */
|
|
1704
|
+
themeBackground?: string;
|
|
1705
|
+
/** 自定义背景遮罩/模糊强度 0-80。 */
|
|
1706
|
+
themeBackgroundBlur?: number;
|
|
1707
|
+
/** 玻璃透明度 0-100(100=当前原样)。 */
|
|
1708
|
+
themeOpacity?: number;
|
|
1709
|
+
enableAdaptMode?: boolean;
|
|
1710
|
+
/** 手动添加的模型库(完整替换保存)。 */
|
|
1711
|
+
savedModels?: SavedModel[];
|
|
973
1712
|
}
|
|
974
1713
|
/** One assistant conversation message (persisted per project). */
|
|
975
1714
|
export interface AssistantMessage {
|
|
@@ -1000,6 +1739,12 @@ export type AssistantFrame = {
|
|
|
1000
1739
|
type: 'toolDelta';
|
|
1001
1740
|
name: string;
|
|
1002
1741
|
text: string;
|
|
1742
|
+
}
|
|
1743
|
+
/** 工具完整结果(供前端渲染成结构化卡片,如拆书/导演)。 */
|
|
1744
|
+
| {
|
|
1745
|
+
type: 'toolResult';
|
|
1746
|
+
name: string;
|
|
1747
|
+
text: string;
|
|
1003
1748
|
} | {
|
|
1004
1749
|
type: 'done';
|
|
1005
1750
|
} | {
|
|
@@ -1012,15 +1757,21 @@ export interface AssistantHistoryResponse {
|
|
|
1012
1757
|
}
|
|
1013
1758
|
/** 题材基底库:一本书属于哪个阅读市场。树形(题材→子题材→下级)。 */
|
|
1014
1759
|
export interface GenreNode {
|
|
1760
|
+
/** 稳定标识(内置库交叉引用)。 */
|
|
1761
|
+
id?: string;
|
|
1015
1762
|
/** 题材名称(标签,如「仙侠修真」「都市异能」)。 */
|
|
1016
1763
|
name: string;
|
|
1017
1764
|
/** 题材特征、常见爽点、叙事重心或读者期待。 */
|
|
1018
1765
|
description: string;
|
|
1766
|
+
/** 该题材的写法指引(开书定盘/卷计划用,区别于「读者期待」)。 */
|
|
1767
|
+
template?: string;
|
|
1019
1768
|
/** 子题材。 */
|
|
1020
1769
|
children: GenreNode[];
|
|
1021
1770
|
}
|
|
1022
1771
|
/** 推进模式库:读者为什么继续看下一章。 */
|
|
1023
1772
|
export interface ProgressionMode {
|
|
1773
|
+
/** 稳定标识(与内置库交叉引用)。 */
|
|
1774
|
+
key?: string;
|
|
1024
1775
|
/** 模式名称(如「升级变强」「经营扩张」「解谜揭露」)。 */
|
|
1025
1776
|
name: string;
|
|
1026
1777
|
/** 核心驱动力:靠什么制造追读动力。 */
|
|
@@ -1033,11 +1784,33 @@ export interface ProgressionMode {
|
|
|
1033
1784
|
risks: string[];
|
|
1034
1785
|
/** 主模式或辅助模式。 */
|
|
1035
1786
|
primary: boolean;
|
|
1787
|
+
/** 该模式的写法指引(开书定盘/卷计划用)。 */
|
|
1788
|
+
template?: string;
|
|
1789
|
+
/** 推进单位序列(每章如何推进,如「立威→打破质疑→扩大影响→碾压」)。 */
|
|
1790
|
+
progressionUnits?: string[];
|
|
1791
|
+
/** 允许出现的冲突形态。 */
|
|
1792
|
+
allowedConflictForms?: string[];
|
|
1793
|
+
/** 应避免的冲突形态(跑偏信号)。 */
|
|
1794
|
+
forbiddenConflictForms?: string[];
|
|
1795
|
+
/** 冲突烈度上限(low/medium/high),用于卷/章计划和审稿对齐。 */
|
|
1796
|
+
conflictCeiling?: 'low' | 'medium' | 'high';
|
|
1797
|
+
/** 单章推进单位说明。 */
|
|
1798
|
+
chapterUnit?: string;
|
|
1799
|
+
/** 卷末应兑现的回报。 */
|
|
1800
|
+
volumeReward?: string;
|
|
1801
|
+
/** 主驱动必须持续出现的信号(读者期待确认)。 */
|
|
1802
|
+
mandatorySignals?: string[];
|
|
1803
|
+
/** 反信号:出现即跑偏。 */
|
|
1804
|
+
antiSignals?: string[];
|
|
1805
|
+
/** 优先用的问题解决方式。 */
|
|
1806
|
+
resolutionStyle?: string;
|
|
1036
1807
|
}
|
|
1037
1808
|
/** 反 AI 规则:一条「要避免的问题 + 修正方向」。 */
|
|
1038
1809
|
export interface AntiAiRule {
|
|
1039
1810
|
/** 规则名(如「禁止解释型心理描写」「AI 高频套话」)。 */
|
|
1040
1811
|
name: string;
|
|
1812
|
+
/** 稳定标识(与 defaultAntiAiRuleKeys 交叉引用;缺省用 name)。 */
|
|
1813
|
+
key?: string;
|
|
1041
1814
|
/** 要避免的表达问题,具体可检查。 */
|
|
1042
1815
|
avoid: string;
|
|
1043
1816
|
/** 推荐修正方向。 */
|
|
@@ -1046,8 +1819,55 @@ export interface AntiAiRule {
|
|
|
1046
1819
|
detectPatterns?: string[];
|
|
1047
1820
|
/** 是否内置全局规则(内置规则随插件发布,项目规则为用户自定义)。 */
|
|
1048
1821
|
builtin?: boolean;
|
|
1822
|
+
/** 规则类别:forbidden=禁止类(命中即问题)/ risk=风险类(需注意但不硬伤)/ encourage=鼓励类(不命中不算错,只作建议)。 */
|
|
1823
|
+
severity?: 'forbidden' | 'risk' | 'encourage';
|
|
1824
|
+
/** 问题严重度(用于审稿优先级;缺省按类别推断)。 */
|
|
1825
|
+
riskLevel?: 'low' | 'medium' | 'high';
|
|
1826
|
+
/** 生成时直接注入的约束指令(缺失时回退到 avoid)。 */
|
|
1827
|
+
promptInstruction?: string;
|
|
1828
|
+
/** 是否允许自动改写(risk 类通常 false)。 */
|
|
1829
|
+
autoRewrite?: boolean;
|
|
1830
|
+
/** 是否为全局基线规则(新书默认启用,防止规则丢失后降级)。 */
|
|
1831
|
+
globalBaselineEnabled?: boolean;
|
|
1832
|
+
/** 是否启用(缺省 true)。 */
|
|
1833
|
+
enabled?: boolean;
|
|
1834
|
+
/** 作用域(缺省 all)。 */
|
|
1835
|
+
scope?: Array<'writing' | 'review' | 'polish' | 'all'>;
|
|
1836
|
+
}
|
|
1837
|
+
/** 预置叙事风格模板(一键绑定无需样本文本)。 */
|
|
1838
|
+
export interface StyleTemplateNarrativeRules {
|
|
1839
|
+
progressionMode?: string;
|
|
1840
|
+
sceneUnitPattern?: string[];
|
|
1841
|
+
multiPov?: boolean;
|
|
1842
|
+
looping?: boolean;
|
|
1843
|
+
endingStyle?: string;
|
|
1844
|
+
povSwitchStyle?: string;
|
|
1845
|
+
summary?: string;
|
|
1846
|
+
}
|
|
1847
|
+
export interface StyleTemplateCharacterRules {
|
|
1848
|
+
allowSelfReflection?: boolean;
|
|
1849
|
+
emotionExpression?: string;
|
|
1850
|
+
defenseMechanisms?: string[];
|
|
1851
|
+
facePriority?: boolean;
|
|
1852
|
+
dialogueStyle?: string;
|
|
1853
|
+
summary?: string;
|
|
1854
|
+
}
|
|
1855
|
+
export interface StyleTemplateLanguageRules {
|
|
1856
|
+
register?: string;
|
|
1857
|
+
roughness?: number;
|
|
1858
|
+
allowIncompleteSentences?: boolean;
|
|
1859
|
+
allowSwearing?: boolean;
|
|
1860
|
+
sentenceVariation?: string;
|
|
1861
|
+
allowUselessDetails?: boolean;
|
|
1862
|
+
summary?: string;
|
|
1863
|
+
}
|
|
1864
|
+
export interface StyleTemplateRhythmRules {
|
|
1865
|
+
pace?: string;
|
|
1866
|
+
paragraphDensity?: string;
|
|
1867
|
+
allowFragmentedFlow?: boolean;
|
|
1868
|
+
actionOverExplanation?: boolean;
|
|
1869
|
+
summary?: string;
|
|
1049
1870
|
}
|
|
1050
|
-
/** 预置写法模板(来自 AI-Novel-Writing-Assistant 内置数据,一键绑定无需样本文本)。 */
|
|
1051
1871
|
export interface StyleTemplate {
|
|
1052
1872
|
/** 模板 key(如 power-up-escalation)。 */
|
|
1053
1873
|
key: string;
|
|
@@ -1059,17 +1879,63 @@ export interface StyleTemplate {
|
|
|
1059
1879
|
category: string;
|
|
1060
1880
|
/** 适用题材。 */
|
|
1061
1881
|
applicableGenres: string[];
|
|
1062
|
-
/**
|
|
1882
|
+
/** 标签(便于筛选)。 */
|
|
1883
|
+
tags?: string[];
|
|
1884
|
+
/** 一句话分析(模板定位说明)。 */
|
|
1885
|
+
analysisMarkdown?: string;
|
|
1886
|
+
/** 叙述规则(结构化)。 */
|
|
1887
|
+
narrative?: StyleTemplateNarrativeRules;
|
|
1888
|
+
/** 角色规则(结构化)。 */
|
|
1889
|
+
character?: StyleTemplateCharacterRules;
|
|
1890
|
+
/** 语言规则(结构化)。 */
|
|
1891
|
+
language?: StyleTemplateLanguageRules;
|
|
1892
|
+
/** 节奏规则(结构化)。 */
|
|
1893
|
+
rhythm?: StyleTemplateRhythmRules;
|
|
1894
|
+
/** 叙述规则(扁平,兼容旧数据)。 */
|
|
1063
1895
|
proseRules: string[];
|
|
1064
|
-
/**
|
|
1896
|
+
/** 角色/台词规则(扁平,兼容旧数据)。 */
|
|
1065
1897
|
dialogueRules: string[];
|
|
1066
|
-
/**
|
|
1898
|
+
/** 语言规则(扁平,兼容旧数据)。 */
|
|
1067
1899
|
languageRules: string[];
|
|
1068
|
-
/**
|
|
1900
|
+
/** 节奏规则(扁平,兼容旧数据)。 */
|
|
1069
1901
|
rhythmRules: string[];
|
|
1070
1902
|
/** 该模板默认绑定的反 AI 规则 key(内置规则名)。 */
|
|
1071
1903
|
defaultAntiAiRuleKeys: string[];
|
|
1072
1904
|
}
|
|
1905
|
+
/** 起始风格画像:无样本文本也能快速绑定一套写法。 */
|
|
1906
|
+
export interface StarterStyleProfile {
|
|
1907
|
+
/** stable key(如 starter-power-up)。 */
|
|
1908
|
+
key: string;
|
|
1909
|
+
/** 绑定到的写法模板 key。 */
|
|
1910
|
+
templateKey: string;
|
|
1911
|
+
/** 画像名。 */
|
|
1912
|
+
name: string;
|
|
1913
|
+
/** 画像说明。 */
|
|
1914
|
+
description: string;
|
|
1915
|
+
}
|
|
1916
|
+
/** 剧情桥段库:可复用的情节套路/桥段(作者阅读经验沉淀,与书内 Plotline 不同层)。 */
|
|
1917
|
+
export interface PlotBeatTemplate {
|
|
1918
|
+
/** 模板 key(如 face-slap / exit-wedding)。 */
|
|
1919
|
+
key: string;
|
|
1920
|
+
/** 桥段名(如「打脸」「退婚」)。 */
|
|
1921
|
+
name: string;
|
|
1922
|
+
/** 分类(如「装逼打脸」「身份逆袭」)。 */
|
|
1923
|
+
category: string;
|
|
1924
|
+
/** 一句话说明。 */
|
|
1925
|
+
summary: string;
|
|
1926
|
+
/** 适用位置(开局/前期/中期/后期/高潮/结尾)。 */
|
|
1927
|
+
position: string;
|
|
1928
|
+
/** 前置条件。 */
|
|
1929
|
+
preconditions: string[];
|
|
1930
|
+
/** 爽点来源。 */
|
|
1931
|
+
payoffSource: string[];
|
|
1932
|
+
/** 常用组合(可搭配的桥段)。 */
|
|
1933
|
+
combos: string[];
|
|
1934
|
+
/** 禁忌(别用烂/别用死)。 */
|
|
1935
|
+
taboos: string[];
|
|
1936
|
+
/** 适用题材。 */
|
|
1937
|
+
applicableGenres: string[];
|
|
1938
|
+
}
|
|
1073
1939
|
/** 写法引擎:从样本文本提取的叙事风格资产。 */
|
|
1074
1940
|
export interface StyleAsset {
|
|
1075
1941
|
/** 资产名(如「林越式痞坏」「冷峻猎手风」)。 */
|
|
@@ -1084,6 +1950,31 @@ export interface StyleAsset {
|
|
|
1084
1950
|
boundaries: string[];
|
|
1085
1951
|
/** 来源样本文本(可空)。 */
|
|
1086
1952
|
sourceText?: string;
|
|
1953
|
+
/** 仿写预设:imitate=高保真仿写 / balanced=平衡 / transfer=迁移(去指纹)。 */
|
|
1954
|
+
preset?: 'imitate' | 'balanced' | 'transfer';
|
|
1955
|
+
/** 指纹风险:仿写时照搬原作独特表达的风险。 */
|
|
1956
|
+
fingerprintRisk?: 'low' | 'medium' | 'high';
|
|
1957
|
+
/** 净化后的写作指引(可安全用于生成,去掉了会暴露来源的具体细节)。 */
|
|
1958
|
+
writingGuidance?: string[];
|
|
1959
|
+
/** 禁止照搬的原作特有实体(人名/地名/核心设定句式),生成时需避开。 */
|
|
1960
|
+
forbiddenEntities?: string[];
|
|
1961
|
+
/** 创建时间。 */
|
|
1962
|
+
createdAt: string;
|
|
1963
|
+
}
|
|
1964
|
+
/** 写作公式(从样本文本分层提取的"这套文怎么写"浓缩,供生成/改写复用)。 */
|
|
1965
|
+
export interface StyleFormula {
|
|
1966
|
+
/** 稳定 key。 */
|
|
1967
|
+
key: string;
|
|
1968
|
+
/** 公式名。 */
|
|
1969
|
+
name: string;
|
|
1970
|
+
/** 提取深度:basic=骨架 / standard=完整 / deep=逐句细化。 */
|
|
1971
|
+
depth: 'basic' | 'standard' | 'deep';
|
|
1972
|
+
/** 重点聚焦域(如 开场/对话/节奏/爽点密度)。 */
|
|
1973
|
+
focusAreas: string[];
|
|
1974
|
+
/** 公式正文(Markdown)。 */
|
|
1975
|
+
formula: string;
|
|
1976
|
+
/** 应用指引(生成/改写时如何套用)。 */
|
|
1977
|
+
applyGuidance: string;
|
|
1087
1978
|
/** 创建时间。 */
|
|
1088
1979
|
createdAt: string;
|
|
1089
1980
|
}
|
|
@@ -1099,6 +1990,8 @@ export interface ProjectAssets {
|
|
|
1099
1990
|
antiAiRules: AntiAiRule[];
|
|
1100
1991
|
/** 绑定的写法资产。 */
|
|
1101
1992
|
styleAssets: StyleAsset[];
|
|
1993
|
+
/** 写作公式(分层提取:basic/standard/deep)。 */
|
|
1994
|
+
styleFormulas?: StyleFormula[];
|
|
1102
1995
|
/** 资产更新时间。 */
|
|
1103
1996
|
updatedAt?: string;
|
|
1104
1997
|
}
|
|
@@ -1113,6 +2006,10 @@ export interface AssetsResponse {
|
|
|
1113
2006
|
styleTemplates: StyleTemplate[];
|
|
1114
2007
|
/** 内置推进模式候选。 */
|
|
1115
2008
|
progressionLibrary: ProgressionMode[];
|
|
2009
|
+
/** 起始风格画像(无样本文本快速绑定写法)。 */
|
|
2010
|
+
starterStyleProfiles: StarterStyleProfile[];
|
|
2011
|
+
/** 内置剧情桥段库(可复用套路)。 */
|
|
2012
|
+
plotBeatLibrary: PlotBeatTemplate[];
|
|
1116
2013
|
}
|
|
1117
2014
|
/** POST /assets request:更新项目写作资产(部分字段可选)。 */
|
|
1118
2015
|
export interface AssetsPatch {
|
|
@@ -1121,6 +2018,7 @@ export interface AssetsPatch {
|
|
|
1121
2018
|
auxiliaryProgressions?: ProgressionMode[];
|
|
1122
2019
|
antiAiRules?: AntiAiRule[];
|
|
1123
2020
|
styleAssets?: StyleAsset[];
|
|
2021
|
+
styleFormulas?: StyleFormula[];
|
|
1124
2022
|
}
|
|
1125
2023
|
/** POST /style-engine request:从样本文本提取写法资产。 */
|
|
1126
2024
|
export interface StyleEngineRequest {
|
|
@@ -1129,3 +2027,291 @@ export interface StyleEngineRequest {
|
|
|
1129
2027
|
/** 资产名(可选,默认「风格资产 N」)。 */
|
|
1130
2028
|
name?: string;
|
|
1131
2029
|
}
|
|
2030
|
+
/** 作者资产库中一条可跨书复用的资产(笔法/红线/套路/角色模板/世界观模板等)。 */
|
|
2031
|
+
export interface AuthorStyleAsset {
|
|
2032
|
+
/** 稳定 id(本地唯一)。 */
|
|
2033
|
+
id: string;
|
|
2034
|
+
/** 资产名(如「短句快节奏爽文风」「林越式痞坏角色」)。 */
|
|
2035
|
+
name: string;
|
|
2036
|
+
/** 资产类型。 */
|
|
2037
|
+
kind: 'style' | 'antiAi' | 'progression' | 'genre' | 'roleTemplate' | 'worldTemplate' | 'plotBeat' | 'custom';
|
|
2038
|
+
/** 一句话摘要。 */
|
|
2039
|
+
summary: string;
|
|
2040
|
+
/** 资产正文内容(按 kind 约定解读的文本/JSON 描述)。 */
|
|
2041
|
+
content: string;
|
|
2042
|
+
/** 结构化载荷(角色模板/世界观模板等可结构化字段;缺省为 null)。 */
|
|
2043
|
+
structured?: Record<string, unknown>;
|
|
2044
|
+
/** 来源书名(哪本书提炼/收藏而来)。 */
|
|
2045
|
+
sourceBooks: string[];
|
|
2046
|
+
/** 标签。 */
|
|
2047
|
+
tags: string[];
|
|
2048
|
+
/** 来源样本文本(可选)。 */
|
|
2049
|
+
sourceText?: string;
|
|
2050
|
+
/** 创建时间。 */
|
|
2051
|
+
createdAt: string;
|
|
2052
|
+
/** 更新时间。 */
|
|
2053
|
+
updatedAt: string;
|
|
2054
|
+
}
|
|
2055
|
+
/** 作者资产库(跨书总数据):按作者维度聚合的可复用资产。 */
|
|
2056
|
+
export interface AuthorAssetLibrary {
|
|
2057
|
+
/** 货架版本,便于未来迁移。 */
|
|
2058
|
+
version: 1;
|
|
2059
|
+
items: AuthorStyleAsset[];
|
|
2060
|
+
}
|
|
2061
|
+
/** GET /author-assets 响应。 */
|
|
2062
|
+
export interface AuthorAssetsResponse {
|
|
2063
|
+
assets: AuthorAssetLibrary;
|
|
2064
|
+
}
|
|
2065
|
+
/** POST /author-assets/upsert 请求:新增或按 id 更新一条资产。 */
|
|
2066
|
+
export interface AuthorAssetUpsertRequest {
|
|
2067
|
+
asset: AuthorStyleAsset;
|
|
2068
|
+
}
|
|
2069
|
+
/** POST /author-assets/remove 请求:删除一条资产。 */
|
|
2070
|
+
export interface AuthorAssetRemoveRequest {
|
|
2071
|
+
id: string;
|
|
2072
|
+
}
|
|
2073
|
+
/** 改编可改范围的单个维度(矩阵的一行)。 */
|
|
2074
|
+
export interface AdaptationDimension {
|
|
2075
|
+
/** 维度 key(如 realm/name/goldenFinger…)。 */
|
|
2076
|
+
key: string;
|
|
2077
|
+
/** 维度名(如「大世界」「修为体系」「主角名」「金手指」)。 */
|
|
2078
|
+
title: string;
|
|
2079
|
+
/** 可改度:保留 / 可改影响大 / 可改影响小 / 可自由改 / 仅视觉包装。 */
|
|
2080
|
+
mutability: 'locked' | 'big' | 'small' | 'free' | 'visual';
|
|
2081
|
+
/** 原文当前值(从正文提炼,附证据)。 */
|
|
2082
|
+
current: string;
|
|
2083
|
+
/** 该值在正文中的出现证据(章节/频次,可空)。 */
|
|
2084
|
+
evidence?: string;
|
|
2085
|
+
/** 建议的候选新值(可空,每套含名称与一句话说明)。 */
|
|
2086
|
+
candidates?: Array<{
|
|
2087
|
+
name: string;
|
|
2088
|
+
desc?: string;
|
|
2089
|
+
}>;
|
|
2090
|
+
/** 联动影响说明(改了会影响哪些章节/角色/伏笔/术语)。 */
|
|
2091
|
+
impact: string;
|
|
2092
|
+
/** 风险评级。 */
|
|
2093
|
+
risk: 'high' | 'medium' | 'low';
|
|
2094
|
+
}
|
|
2095
|
+
/** POST /adapt/analyze 请求:上传全文做改编分析。 */
|
|
2096
|
+
export interface AdaptAnalyzeRequest {
|
|
2097
|
+
/** 全文文本(优先)。 */
|
|
2098
|
+
text: string;
|
|
2099
|
+
/** 或服务器端全文文件路径。 */
|
|
2100
|
+
filePath?: string;
|
|
2101
|
+
}
|
|
2102
|
+
/** POST /adapt/analyze 响应。 */
|
|
2103
|
+
export interface AdaptAnalyzeResponse {
|
|
2104
|
+
/** 识别书名(文件名推断或正文首行)。 */
|
|
2105
|
+
bookName: string;
|
|
2106
|
+
/** 拆出的章节数。 */
|
|
2107
|
+
chapters: number;
|
|
2108
|
+
/** 反推的初始大纲(可空)。 */
|
|
2109
|
+
outline?: string;
|
|
2110
|
+
/** 可改范围矩阵。 */
|
|
2111
|
+
dimensions: AdaptationDimension[];
|
|
2112
|
+
/** 分析消耗说明。 */
|
|
2113
|
+
note?: string;
|
|
2114
|
+
}
|
|
2115
|
+
/** 一条改编映射(原值 → 新值)。 */
|
|
2116
|
+
export interface AdaptationMapping {
|
|
2117
|
+
/** 原值(如「林尘」「练气」「青云宗」)。 */
|
|
2118
|
+
source: string;
|
|
2119
|
+
/** 新值(如「楚风」「凝元」「天渊阁」)。 */
|
|
2120
|
+
target: string;
|
|
2121
|
+
/** 适用范围。 */
|
|
2122
|
+
scope: 'name' | 'realm' | 'faction' | 'term' | 'other';
|
|
2123
|
+
/** 说明(可空)。 */
|
|
2124
|
+
note?: string;
|
|
2125
|
+
}
|
|
2126
|
+
/** 改编规则:哪些必须保留、哪些允许改、一致性约束。 */
|
|
2127
|
+
export interface AdaptationRules {
|
|
2128
|
+
/** 必须保留的要素(骨架/人物动机/伏笔逻辑/爽点结构…)。 */
|
|
2129
|
+
preserve: string[];
|
|
2130
|
+
/** 允许改变的要素。 */
|
|
2131
|
+
change: string[];
|
|
2132
|
+
/** 改编红线/一致性要求。 */
|
|
2133
|
+
constraints: string[];
|
|
2134
|
+
}
|
|
2135
|
+
/** 一组改编方案(映射表 + 规则 + 联动影响清单)。 */
|
|
2136
|
+
export interface AdaptationProposal {
|
|
2137
|
+
/** 映射表(原→新)。 */
|
|
2138
|
+
mappings: AdaptationMapping[];
|
|
2139
|
+
/** 改编规则。 */
|
|
2140
|
+
rules: AdaptationRules;
|
|
2141
|
+
/** 联动影响清单。 */
|
|
2142
|
+
impacts: Array<{
|
|
2143
|
+
item: string;
|
|
2144
|
+
detail: string;
|
|
2145
|
+
risk: 'high' | 'medium' | 'low';
|
|
2146
|
+
chapters?: number[];
|
|
2147
|
+
}>;
|
|
2148
|
+
}
|
|
2149
|
+
/** POST /adapt/propose 请求:由用户勾选的维度 + 新值生成改编方案。 */
|
|
2150
|
+
export interface AdaptProposeRequest {
|
|
2151
|
+
/** 原文全文(复用,便于 LLM 核对联动影响)。 */
|
|
2152
|
+
text: string;
|
|
2153
|
+
/** 用户确认要改的维度(含原值与新值)。 */
|
|
2154
|
+
selections: Array<{
|
|
2155
|
+
key: string;
|
|
2156
|
+
title: string;
|
|
2157
|
+
current: string;
|
|
2158
|
+
target: string;
|
|
2159
|
+
mutability: string;
|
|
2160
|
+
}>;
|
|
2161
|
+
/** 若已分析过,可携带完整矩阵作为上下文。 */
|
|
2162
|
+
dimensions?: AdaptationDimension[];
|
|
2163
|
+
}
|
|
2164
|
+
/** POST /adapt/propose 响应。 */
|
|
2165
|
+
export interface AdaptProposeResponse {
|
|
2166
|
+
proposal: AdaptationProposal;
|
|
2167
|
+
}
|
|
2168
|
+
/** POST /adapt/execute 请求:执行改编(replace=术语替换;rewrite=逐章 LLM 重写)。 */
|
|
2169
|
+
export interface AdaptExecuteRequest {
|
|
2170
|
+
/** 原文全文。 */
|
|
2171
|
+
text: string;
|
|
2172
|
+
/** 改编映射表。 */
|
|
2173
|
+
mappings: AdaptationMapping[];
|
|
2174
|
+
/** 改编规则(rewrite 模式生效:保留/允许变/红线)。 */
|
|
2175
|
+
rules?: AdaptationRules;
|
|
2176
|
+
/** 执行模式:replace(术语替换)或 rewrite(逐章重写)。 */
|
|
2177
|
+
mode?: 'replace' | 'rewrite';
|
|
2178
|
+
/** rewrite 模式:只重写前 N 章(0/缺省 = 全部,且在 startNo/endNo 窗口内)。 */
|
|
2179
|
+
maxChapters?: number;
|
|
2180
|
+
/** rewrite 模式:起始章号(含,默认 1)。 */
|
|
2181
|
+
startNo?: number;
|
|
2182
|
+
/** rewrite 模式:结束章号(含;0/缺省 = 到全书末尾)。 */
|
|
2183
|
+
endNo?: number;
|
|
2184
|
+
}
|
|
2185
|
+
/** POST /adapt/execute 响应。 */
|
|
2186
|
+
export interface AdaptExecuteResponse {
|
|
2187
|
+
/** 改编后的全文。 */
|
|
2188
|
+
adaptedText: string;
|
|
2189
|
+
/** 执行的映射数。 */
|
|
2190
|
+
mappings: number;
|
|
2191
|
+
/** 命中统计:每条映射的替换次数。 */
|
|
2192
|
+
hits: Array<{
|
|
2193
|
+
source: string;
|
|
2194
|
+
target: string;
|
|
2195
|
+
count: number;
|
|
2196
|
+
}>;
|
|
2197
|
+
/** 执行模式(replace / rewrite)。 */
|
|
2198
|
+
mode?: 'replace' | 'rewrite';
|
|
2199
|
+
/** rewrite 模式的逐章结果(no/title/chars)。 */
|
|
2200
|
+
rewritten?: Array<{
|
|
2201
|
+
no: number;
|
|
2202
|
+
title: string;
|
|
2203
|
+
chars: number;
|
|
2204
|
+
}>;
|
|
2205
|
+
/** rewrite 模式下重写失败、保留原章的章节号。 */
|
|
2206
|
+
skipped?: number[];
|
|
2207
|
+
}
|
|
2208
|
+
/** POST /adapt/rewrite-stream 的 NDJSON 帧(逐章进度 + 结束结果)。 */
|
|
2209
|
+
export type AdaptRewriteFrame = {
|
|
2210
|
+
type: 'progress';
|
|
2211
|
+
completed: number;
|
|
2212
|
+
total: number;
|
|
2213
|
+
no: number;
|
|
2214
|
+
title: string;
|
|
2215
|
+
} | {
|
|
2216
|
+
type: 'done';
|
|
2217
|
+
result: AdaptExecuteResponse;
|
|
2218
|
+
} | {
|
|
2219
|
+
type: 'error';
|
|
2220
|
+
message: string;
|
|
2221
|
+
};
|
|
2222
|
+
/** POST /adapt/save 请求:保存改编全文为新书(原书保留,登记书架)。 */
|
|
2223
|
+
export interface AdaptSaveRequest {
|
|
2224
|
+
/** 改编后的全文。 */
|
|
2225
|
+
text: string;
|
|
2226
|
+
/** 新书名(缺省为「改编新书」;建议用「<原著>·改编版」)。 */
|
|
2227
|
+
bookName?: string;
|
|
2228
|
+
/** 新书输出目录(缺省 ~/.dsh/novels/书名)。 */
|
|
2229
|
+
outputDir?: string;
|
|
2230
|
+
/** 可附带反推大纲(写进新项目,便于后续续写/编辑)。 */
|
|
2231
|
+
outline?: string;
|
|
2232
|
+
}
|
|
2233
|
+
/** POST /adapt/save 响应。 */
|
|
2234
|
+
export interface AdaptSaveResponse {
|
|
2235
|
+
/** 登记后的书架条目。 */
|
|
2236
|
+
book: BookEntry;
|
|
2237
|
+
/** 新书名。 */
|
|
2238
|
+
bookName: string;
|
|
2239
|
+
/** 成功拆出的章节数。 */
|
|
2240
|
+
chapters: number;
|
|
2241
|
+
/** 因内容过短被跳过的章节标题列表。 */
|
|
2242
|
+
skipped: string[];
|
|
2243
|
+
/** 新书输出目录。 */
|
|
2244
|
+
outputDir: string;
|
|
2245
|
+
}
|
|
2246
|
+
/** POST /adapt/materialize 请求:从源全文 + 用户编辑后的改编方案,提炼新书资料并保存为「待写新书」。 */
|
|
2247
|
+
export interface AdaptMaterializeRequest {
|
|
2248
|
+
/** 源书全文。 */
|
|
2249
|
+
text: string;
|
|
2250
|
+
/** 新书名(缺省为「<源书名>·改编版」)。 */
|
|
2251
|
+
bookName?: string;
|
|
2252
|
+
/** 新书输出目录(缺省 ~/.dsh/novels/书名)。 */
|
|
2253
|
+
outputDir?: string;
|
|
2254
|
+
/** 反推大纲(来自分析;缺少时用源文章题兜底)。 */
|
|
2255
|
+
outline?: string;
|
|
2256
|
+
/** 用户编辑后的改编方案(映射表 + 规则)。 */
|
|
2257
|
+
proposal: AdaptationProposal;
|
|
2258
|
+
/** 拟规划章节数(缺省 30,可在前端调整)。 */
|
|
2259
|
+
chapterCount?: number;
|
|
2260
|
+
}
|
|
2261
|
+
/** POST /adapt/materialize 响应:提炼后的新书资料(预览,尚未落盘;保存走 /adapt/materialize-save)。 */
|
|
2262
|
+
export interface AdaptMaterializeResponse {
|
|
2263
|
+
/** 书架条目(仅在已保存时存在;预览阶段为 undefined)。 */
|
|
2264
|
+
book?: BookEntry;
|
|
2265
|
+
/** 新书名。 */
|
|
2266
|
+
bookName: string;
|
|
2267
|
+
/** 改编后总纲。 */
|
|
2268
|
+
outline: string;
|
|
2269
|
+
/** 改编后道藏。 */
|
|
2270
|
+
bible: StoryBible;
|
|
2271
|
+
/** 改编后角色库。 */
|
|
2272
|
+
roles: RoleRecord[];
|
|
2273
|
+
/** 改编后大世界。 */
|
|
2274
|
+
world: WorldState;
|
|
2275
|
+
/** 改编后卷计划。 */
|
|
2276
|
+
volumes: Volume[];
|
|
2277
|
+
/** 改编后章节计划(status=pending)。 */
|
|
2278
|
+
chapters: ChapterPlan[];
|
|
2279
|
+
/** 新书输出目录。 */
|
|
2280
|
+
outputDir: string;
|
|
2281
|
+
}
|
|
2282
|
+
/** POST /adapt/materialize-save 请求:把预览/微调后的新书资料写入并登记书架。 */
|
|
2283
|
+
export interface AdaptMaterializeSaveRequest {
|
|
2284
|
+
/** 新书名(缺省为「改编版」)。 */
|
|
2285
|
+
bookName?: string;
|
|
2286
|
+
/** 新书输出目录(缺省 ~/.dsh/novels/书名)。 */
|
|
2287
|
+
outputDir?: string;
|
|
2288
|
+
/** 改编后总纲。 */
|
|
2289
|
+
outline: string;
|
|
2290
|
+
/** 改编后道藏。 */
|
|
2291
|
+
bible: StoryBible;
|
|
2292
|
+
/** 改编后角色库。 */
|
|
2293
|
+
roles: RoleRecord[];
|
|
2294
|
+
/** 改编后大世界。 */
|
|
2295
|
+
world: WorldState;
|
|
2296
|
+
/** 改编后卷计划。 */
|
|
2297
|
+
volumes: Volume[];
|
|
2298
|
+
/** 改编后章节计划(status=pending)。 */
|
|
2299
|
+
chapters: ChapterPlan[];
|
|
2300
|
+
}
|
|
2301
|
+
/** POST /adapt/materialize-save 响应。 */
|
|
2302
|
+
export interface AdaptMaterializeSaveResponse {
|
|
2303
|
+
/** 登记后的书架条目。 */
|
|
2304
|
+
book: BookEntry;
|
|
2305
|
+
/** 新书名。 */
|
|
2306
|
+
bookName: string;
|
|
2307
|
+
/** 成功写入的章节数。 */
|
|
2308
|
+
chapters: number;
|
|
2309
|
+
/** 新书输出目录。 */
|
|
2310
|
+
outputDir: string;
|
|
2311
|
+
}
|
|
2312
|
+
/** POST /plugin/update 响应:插件自更新结果。 */
|
|
2313
|
+
export interface PluginUpdateResponse {
|
|
2314
|
+
ok: boolean;
|
|
2315
|
+
/** 更新结果说明(成功/失败/环境提示)。 */
|
|
2316
|
+
message: string;
|
|
2317
|
+
}
|