@waterwx/dsh-novel-forge 2.0.1-alpha → 2.1.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 +97 -2
- package/lib/client.js +3291 -752
- package/lib/index.js +3557 -237
- package/lib/types/assets.d.ts +16 -3
- package/lib/types/assistant.d.ts +4 -0
- package/lib/types/client/api.d.ts +89 -0
- package/lib/types/client/llmLive.d.ts +33 -0
- package/lib/types/client/locales.d.ts +3 -3
- package/lib/types/client/panel/AdaptModeView.d.ts +1 -1
- package/lib/types/client/panel/AssetsTab.d.ts +1 -1
- package/lib/types/client/panel/AssistantTab.d.ts +1 -1
- package/lib/types/client/panel/AuthorAssetsView.d.ts +1 -1
- package/lib/types/client/panel/AuthorHome.d.ts +4 -2
- package/lib/types/client/panel/BookAnalysisView.d.ts +4 -0
- package/lib/types/client/panel/BookshelfBar.d.ts +1 -1
- package/lib/types/client/panel/CreateBookView.d.ts +6 -2
- package/lib/types/client/panel/DirectorView.d.ts +7 -0
- package/lib/types/client/panel/FlowGuide.d.ts +1 -1
- package/lib/types/client/panel/GlobalAssetLibraryView.d.ts +1 -1
- package/lib/types/client/panel/IdeaInspirationView.d.ts +6 -0
- package/lib/types/client/panel/ImportModal.d.ts +1 -1
- package/lib/types/client/panel/KnowledgeBaseView.d.ts +4 -0
- package/lib/types/client/panel/LiveFeedLog.d.ts +5 -0
- package/lib/types/client/panel/MangaRoleLibrary.d.ts +1 -1
- package/lib/types/client/panel/MangaWorkspace.d.ts +1 -1
- package/lib/types/client/panel/MarketRadarView.d.ts +5 -0
- package/lib/types/client/panel/NovelPanel.d.ts +2 -2
- package/lib/types/client/panel/ProgressConsole.d.ts +1 -1
- package/lib/types/client/panel/ProgressHomeView.d.ts +1 -1
- package/lib/types/client/panel/PropLibrary.d.ts +1 -1
- package/lib/types/client/panel/ReaderView.d.ts +1 -1
- package/lib/types/client/panel/RunPanel.d.ts +1 -1
- package/lib/types/client/panel/SceneLibrary.d.ts +1 -1
- package/lib/types/client/panel/SettingsView.d.ts +1 -1
- package/lib/types/client/panel/ShelfView.d.ts +1 -1
- package/lib/types/client/panel/StoryboardTab.d.ts +1 -1
- package/lib/types/client/panel/StyleCard.d.ts +1 -1
- package/lib/types/client/panel/StyleGallery.d.ts +1 -1
- package/lib/types/client/panel/WorldTab.d.ts +1 -1
- package/lib/types/engine.d.ts +29 -1
- package/lib/types/global-assets.d.ts +6 -0
- package/lib/types/index.d.ts +6 -0
- package/lib/types/llm-live.d.ts +44 -0
- package/lib/types/market-radar-scan.d.ts +19 -0
- package/lib/types/market-radar-sources.d.ts +31 -0
- package/lib/types/prompting.d.ts +35 -0
- package/lib/types/protocol.d.ts +364 -8
- package/lib/types/run.d.ts +1 -1
- package/lib/types/src/ai-scan.d.ts +36 -0
- package/lib/types/src/assets.d.ts +37 -0
- package/lib/types/src/assistant.d.ts +45 -0
- package/lib/types/src/author-assets.d.ts +25 -0
- package/lib/types/src/bookshelf.d.ts +42 -0
- package/lib/types/src/client/api.d.ts +234 -0
- package/lib/types/src/client/docx.d.ts +15 -0
- package/lib/types/src/client/index.d.ts +14 -0
- package/lib/types/src/client/locales.d.ts +212 -0
- package/lib/types/src/client/mount.d.ts +9 -0
- package/lib/types/src/client/panel/AdaptModeView.d.ts +5 -0
- package/lib/types/src/client/panel/AssetsTab.d.ts +12 -0
- package/lib/types/src/client/panel/AssistantTab.d.ts +7 -0
- package/lib/types/src/client/panel/AuthorAssetsView.d.ts +4 -0
- package/lib/types/src/client/panel/AuthorHome.d.ts +32 -0
- package/lib/types/src/client/panel/BookshelfBar.d.ts +11 -0
- package/lib/types/src/client/panel/CreateBookView.d.ts +9 -0
- package/lib/types/src/client/panel/FlowGuide.d.ts +22 -0
- package/lib/types/src/client/panel/GlobalAssetLibraryView.d.ts +4 -0
- package/lib/types/src/client/panel/ImportModal.d.ts +7 -0
- package/lib/types/src/client/panel/MangaRoleLibrary.d.ts +20 -0
- package/lib/types/src/client/panel/MangaWorkspace.d.ts +12 -0
- package/lib/types/src/client/panel/ModelManager.d.ts +14 -0
- package/lib/types/src/client/panel/NovelPanel.d.ts +13 -0
- package/lib/types/src/client/panel/ProgressConsole.d.ts +17 -0
- package/lib/types/src/client/panel/ProgressHomeView.d.ts +5 -0
- package/lib/types/src/client/panel/PropLibrary.d.ts +8 -0
- package/lib/types/src/client/panel/ReaderView.d.ts +8 -0
- package/lib/types/src/client/panel/ReasoningSection.d.ts +10 -0
- package/lib/types/src/client/panel/RunPanel.d.ts +5 -0
- package/lib/types/src/client/panel/SceneLibrary.d.ts +16 -0
- package/lib/types/src/client/panel/SettingsView.d.ts +16 -0
- package/lib/types/src/client/panel/ShelfView.d.ts +15 -0
- package/lib/types/src/client/panel/StoryboardTab.d.ts +19 -0
- package/lib/types/src/client/panel/StyleCard.d.ts +8 -0
- package/lib/types/src/client/panel/StyleGallery.d.ts +1 -0
- package/lib/types/src/client/panel/WorldTab.d.ts +10 -0
- package/lib/types/src/client/panel/controller.d.ts +19 -0
- package/lib/types/src/client/panel/helpers.d.ts +18 -0
- package/lib/types/src/client/panel/views.d.ts +77 -0
- package/lib/types/src/client/sidebar-entry.d.ts +13 -0
- package/lib/types/src/client/text.d.ts +9 -0
- package/lib/types/src/comic-presets.d.ts +12 -0
- package/lib/types/src/docx.d.ts +19 -0
- package/lib/types/src/engine.d.ts +402 -0
- package/lib/types/src/index.d.ts +79 -0
- package/lib/types/src/manga-genre-rules.d.ts +22 -0
- package/lib/types/src/novel-context.d.ts +80 -0
- package/lib/types/src/prompt-utils.d.ts +35 -0
- package/lib/types/src/protocol.d.ts +2176 -0
- package/lib/types/src/review-policy.d.ts +97 -0
- package/lib/types/src/routes.d.ts +29 -0
- package/lib/types/src/run.d.ts +32 -0
- package/lib/types/src/shot-language.d.ts +46 -0
- package/lib/types/src/story-beat-language.d.ts +35 -0
- package/lib/types/src/style-library.d.ts +33 -0
- package/package.json +1 -1
- package/src/assets.ts +1774 -879
- package/src/assistant.ts +154 -9
- package/src/client/api.ts +105 -6
- package/src/client/llmLive.ts +101 -0
- package/src/client/locales.ts +4 -4
- package/src/client/panel/AdaptModeView.tsx +18 -3
- package/src/client/panel/AssistantTab.tsx +41 -3
- package/src/client/panel/AuthorHome.tsx +51 -20
- package/src/client/panel/BookAnalysisView.tsx +60 -0
- package/src/client/panel/CreateBookView.tsx +22 -3
- package/src/client/panel/DirectorView.tsx +200 -0
- package/src/client/panel/IdeaInspirationView.tsx +71 -0
- package/src/client/panel/KnowledgeBaseView.tsx +73 -0
- package/src/client/panel/LiveFeedLog.tsx +76 -0
- package/src/client/panel/MarketRadarView.tsx +374 -0
- package/src/client/panel/NovelPanel.tsx +117 -16
- package/src/client/panel/ProgressConsole.tsx +5 -6
- package/src/client/panel/SettingsView.tsx +3 -0
- package/src/client/panel/panel.module.css +2 -3
- package/src/engine.ts +459 -23
- package/src/global-assets.ts +59 -0
- package/src/index.ts +17 -1
- package/src/llm-live.ts +68 -0
- package/src/market-radar-scan.ts +41 -0
- package/src/market-radar-sources.ts +173 -0
- package/src/prompting.ts +159 -0
- package/src/protocol.ts +340 -8
- package/src/routes.ts +579 -59
- package/src/run.ts +15 -8
- package/skills/chapter-batch/SKILL.md +0 -81
|
@@ -0,0 +1,2176 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* dsh-novel-forge — shared protocol between the host half (Node) and the
|
|
3
|
+
* browser half (web GUI). Route paths, request/response shapes, the project
|
|
4
|
+
* state file format, and the NDJSON generation stream frames all live here so
|
|
5
|
+
* both halves spell exactly one vocabulary.
|
|
6
|
+
*/
|
|
7
|
+
import type { ShotSizeId, CameraMoveId, CompositionId, LightingId } from './shot-language.ts';
|
|
8
|
+
import type { StoryFunctionId, EmotionId } from './story-beat-language.ts';
|
|
9
|
+
/** The /api/dsh-novel-forge route family (same-origin, loopback-fenced). */
|
|
10
|
+
export declare const NOVEL_API: {
|
|
11
|
+
readonly status: "/api/dsh-novel-forge/status";
|
|
12
|
+
readonly loadOutline: "/api/dsh-novel-forge/load-outline";
|
|
13
|
+
readonly saveOutline: "/api/dsh-novel-forge/save-outline";
|
|
14
|
+
readonly plan: "/api/dsh-novel-forge/plan";
|
|
15
|
+
readonly volumes: "/api/dsh-novel-forge/volumes";
|
|
16
|
+
readonly bible: "/api/dsh-novel-forge/bible";
|
|
17
|
+
readonly assets: "/api/dsh-novel-forge/assets";
|
|
18
|
+
readonly styleEngine: "/api/dsh-novel-forge/style-engine";
|
|
19
|
+
readonly generate: "/api/dsh-novel-forge/generate";
|
|
20
|
+
readonly review: "/api/dsh-novel-forge/review";
|
|
21
|
+
readonly rewrite: "/api/dsh-novel-forge/rewrite";
|
|
22
|
+
readonly polish: "/api/dsh-novel-forge/polish";
|
|
23
|
+
/** 采纳待确认草稿(润色/重写产物)覆盖正文文件。 */
|
|
24
|
+
readonly draftApply: "/api/dsh-novel-forge/draft/apply";
|
|
25
|
+
/** 放弃待确认草稿,保留原稿。 */
|
|
26
|
+
readonly draftDiscard: "/api/dsh-novel-forge/draft/discard";
|
|
27
|
+
readonly summary: "/api/dsh-novel-forge/summary";
|
|
28
|
+
readonly foreshadow: "/api/dsh-novel-forge/foreshadow";
|
|
29
|
+
readonly exportBook: "/api/dsh-novel-forge/export";
|
|
30
|
+
readonly chapter: "/api/dsh-novel-forge/chapter";
|
|
31
|
+
/** 审查任意正文文本(作者手动编辑后,不落盘)。 */
|
|
32
|
+
readonly chapterCheck: "/api/dsh-novel-forge/chapter/check";
|
|
33
|
+
/** 保存手动编辑的正文(自动备份 .bak)。 */
|
|
34
|
+
readonly chapterSave: "/api/dsh-novel-forge/chapter/save";
|
|
35
|
+
readonly assistant: "/api/dsh-novel-forge/assistant";
|
|
36
|
+
readonly assistantHistory: "/api/dsh-novel-forge/assistant-history";
|
|
37
|
+
/** 清空助手对话记录。 */
|
|
38
|
+
readonly assistantClear: "/api/dsh-novel-forge/assistant/clear";
|
|
39
|
+
readonly bookshelf: "/api/dsh-novel-forge/bookshelf";
|
|
40
|
+
/** 导入已有项目目录(含 novel-project.json)到书架。 */
|
|
41
|
+
readonly bookshelfImportDir: "/api/dsh-novel-forge/bookshelf/import-dir";
|
|
42
|
+
/** 导入 txt/md 全本:拆章建项目并登记书架。 */
|
|
43
|
+
readonly bookshelfImportText: "/api/dsh-novel-forge/bookshelf/import-text";
|
|
44
|
+
/** 导入 txt/md 全本:拆章预览(不落盘)。 */
|
|
45
|
+
readonly bookshelfImportTextPreview: "/api/dsh-novel-forge/bookshelf/import-text/preview";
|
|
46
|
+
/** 漫剧方案管理:create/remove/activate。 */
|
|
47
|
+
readonly manhuaPlans: "/api/dsh-novel-forge/manhua/plans";
|
|
48
|
+
/** 漫剧角色库:从分镜提名(规则+LLM两段式)/ 建卡 / 更新 / 删除 / 形象锚点 / 精修提示词。 */
|
|
49
|
+
readonly mangaRoles: "/api/dsh-novel-forge/manga/roles";
|
|
50
|
+
/** 漫剧道具库:从已写章节提炼常驻道具(跨镜头需一致)/ 保存清单。 */
|
|
51
|
+
readonly mangaProps: "/api/dsh-novel-forge/manga/props";
|
|
52
|
+
/** 导出「即梦素材包」落盘到资产库 manga-assets/素材包/。 */
|
|
53
|
+
readonly exportPackage: "/api/dsh-novel-forge/manga/export-package";
|
|
54
|
+
/** 分镜·编剧级:单章 → 剧情骨架(节拍链)。 */
|
|
55
|
+
readonly storyboardSkeleton: "/api/dsh-novel-forge/storyboard/skeleton";
|
|
56
|
+
/** 分镜·导演级:骨架 → 分镜表(镜头级)。 */
|
|
57
|
+
readonly storyboardTable: "/api/dsh-novel-forge/storyboard/table";
|
|
58
|
+
/** 分镜·提示词级:分镜表 → 即梦可粘贴视频提示词。 */
|
|
59
|
+
readonly storyboardPrompts: "/api/dsh-novel-forge/storyboard/prompts";
|
|
60
|
+
/** 生图接口连通性测试(设置页每个模型条目用)。 */
|
|
61
|
+
readonly imageTest: "/api/dsh-novel-forge/image-test";
|
|
62
|
+
/** LLM 模型连通性测试:真实最小调用,验证 Key / 端点 / 模型可用。 */
|
|
63
|
+
readonly llmTest: "/api/dsh-novel-forge/llm-test";
|
|
64
|
+
/** 添加模型:厂商直填 key 或自定义路由,写进 DSH 凭据与 llm-pi-ai 路由。 */
|
|
65
|
+
readonly addModel: "/api/dsh-novel-forge/llm-add";
|
|
66
|
+
/** 运行时厂商目录(DSH pi-ai 可配置提供方 + 内置适配器)。 */
|
|
67
|
+
readonly llmVendors: "/api/dsh-novel-forge/llm-vendors";
|
|
68
|
+
/** 查询某个 provider 当前可用的模型(添加成功后可即时刷新)。 */
|
|
69
|
+
readonly llmModels: "/api/dsh-novel-forge/llm-models";
|
|
70
|
+
/** 已注册的提供方路由列表(提供方管理)。 */
|
|
71
|
+
readonly llmProviders: "/api/dsh-novel-forge/llm-providers";
|
|
72
|
+
/** 移除一个提供方。 */
|
|
73
|
+
readonly llmRemove: "/api/dsh-novel-forge/llm-remove";
|
|
74
|
+
/** 重置项目(可选携带新大纲):清空设定/卷/章节/伏笔/资产/事实库。 */
|
|
75
|
+
readonly reset: "/api/dsh-novel-forge/reset";
|
|
76
|
+
/** 全书一致性质检:LLM 扫描已生成章节,输出矛盾问题清单。 */
|
|
77
|
+
readonly audit: "/api/dsh-novel-forge/audit";
|
|
78
|
+
/** 角色卡刷新:基于事实库与各章摘要聚合角色当前状态。 */
|
|
79
|
+
readonly charactersRefresh: "/api/dsh-novel-forge/characters/refresh";
|
|
80
|
+
/** 事实库回填:对历史已生成章节批量抽取事实(旧章节无事实记录时用)。 */
|
|
81
|
+
readonly factsBackfill: "/api/dsh-novel-forge/facts/backfill";
|
|
82
|
+
/** 道藏局部修补(如世界观规则编辑)。 */
|
|
83
|
+
readonly biblePatch: "/api/dsh-novel-forge/bible/patch";
|
|
84
|
+
/** 小说简介:生成(AI)/补全(AI)/保存。 */
|
|
85
|
+
readonly blurb: "/api/dsh-novel-forge/blurb";
|
|
86
|
+
/** 重命名当前书(同步项目与书架条目)。 */
|
|
87
|
+
readonly rename: "/api/dsh-novel-forge/rename";
|
|
88
|
+
/** 大世界:AI 提炼 / 保存结构化数据(境界/区域/势力)。 */
|
|
89
|
+
readonly world: "/api/dsh-novel-forge/world";
|
|
90
|
+
/** 封面:GET 读取(dataUrl)/ POST 上传或移除。 */
|
|
91
|
+
readonly cover: "/api/dsh-novel-forge/blurb/cover";
|
|
92
|
+
/** 剧情线管理:增删改 + 关联章节。 */
|
|
93
|
+
readonly plotlines: "/api/dsh-novel-forge/plotlines";
|
|
94
|
+
/** 角色库:AI 提炼 / 采纳 / 更新 / 删除。 */
|
|
95
|
+
readonly roles: "/api/dsh-novel-forge/roles";
|
|
96
|
+
readonly scenes: "/api/dsh-novel-forge/scenes";
|
|
97
|
+
readonly visualRules: "/api/dsh-novel-forge/visual-rules";
|
|
98
|
+
/** 作者复盘补跑:对已写章节补齐 authorReview(全书流式 / 单章 JSON)。 */
|
|
99
|
+
readonly reviewBackfill: "/api/dsh-novel-forge/review/backfill";
|
|
100
|
+
/** 章节复位:generating 卡死 → pending(可重新生成)。 */
|
|
101
|
+
readonly chapterReset: "/api/dsh-novel-forge/chapter/reset";
|
|
102
|
+
/** 章节直接通过:作者对 rejected/written 章节行使最终决定权。 */
|
|
103
|
+
readonly chapterApprove: "/api/dsh-novel-forge/chapter/approve";
|
|
104
|
+
/** 敏感词检查:全书已写章节或指定文本。 */
|
|
105
|
+
readonly sensitiveCheck: "/api/dsh-novel-forge/sensitive-check";
|
|
106
|
+
/** 开书想法 → AI 补全大纲:输入一句话想法,生成 2-3 个可选大纲方案。 */
|
|
107
|
+
readonly outlineSuggest: "/api/dsh-novel-forge/outline/suggest";
|
|
108
|
+
/** 反推大纲:从已写章节正文反向生成全书总纲(NDJSON 流)。 */
|
|
109
|
+
readonly outlineReverse: "/api/dsh-novel-forge/outline/reverse";
|
|
110
|
+
/** 拆书分析:对已写章节做结构/人物/文风/卖点四维体检(两阶段:源笔记→分节分析)。 */
|
|
111
|
+
readonly breakdown: "/api/dsh-novel-forge/breakdown";
|
|
112
|
+
/** 漫剧分镜生成:章节 → 角色锚点 + 分镜表(可适配豆包/Seedance/SD)。 */
|
|
113
|
+
/** 漫剧分集计划:读一卷 → 按故事弧线分集(高潮拆集/过渡并章)。 */
|
|
114
|
+
/** 漫画脚本:章节 → 分页分格漫画脚本(含角色视觉锚点)。 */
|
|
115
|
+
/** 生产单:启动批量生产(计划补足 + 逐章生成 + 被拒分级处理)。 */
|
|
116
|
+
readonly runStart: "/api/dsh-novel-forge/run/start";
|
|
117
|
+
/** 生产单控制:pause / resume / stop。 */
|
|
118
|
+
readonly runControl: "/api/dsh-novel-forge/run/control";
|
|
119
|
+
/** 生产单状态(含进度统计与日志)。 */
|
|
120
|
+
readonly runStatus: "/api/dsh-novel-forge/run/status";
|
|
121
|
+
readonly config: "/api/dsh-novel-forge/config";
|
|
122
|
+
readonly openFolder: "/api/dsh-novel-forge/open-folder";
|
|
123
|
+
/** 插件自更新:在 DSH profile 目录拉取最新 npm 版(下载后需重启 DSH 生效)。 */
|
|
124
|
+
readonly pluginUpdate: "/api/dsh-novel-forge/plugin/update";
|
|
125
|
+
/** 作者资产库/总数据:读取个人跨书资产(笔法/红线/套路/角色模板/世界观模板)。 */
|
|
126
|
+
readonly authorAssets: "/api/dsh-novel-forge/author-assets";
|
|
127
|
+
/** 作者资产库:新增/更新一条资产(upsert by id)。 */
|
|
128
|
+
readonly authorAssetsUpsert: "/api/dsh-novel-forge/author-assets/upsert";
|
|
129
|
+
/** 作者资产库:删除一条资产。 */
|
|
130
|
+
readonly authorAssetsRemove: "/api/dsh-novel-forge/author-assets/remove";
|
|
131
|
+
/** 作者资产库:导入默认(书架书的写作资产/角色 + 内置全局库)批量沉淀。 */
|
|
132
|
+
readonly authorAssetsImportDefault: "/api/dsh-novel-forge/author-assets/import-default";
|
|
133
|
+
/** 改编模式:上传全文 → 分析 → 原文设定卡片/可改范围矩阵。 */
|
|
134
|
+
readonly adaptAnalyze: "/api/dsh-novel-forge/adapt/analyze";
|
|
135
|
+
/** 改编模式:确认要改的维度 → 生成映射表/改编规则/联动影响清单。 */
|
|
136
|
+
readonly adaptPropose: "/api/dsh-novel-forge/adapt/propose";
|
|
137
|
+
/** 改编模式:执行术语替换(全局替换 + 命中统计 + 改编文本预览)。 */
|
|
138
|
+
readonly adaptExecute: "/api/dsh-novel-forge/adapt/execute";
|
|
139
|
+
/** 改编模式:保存改编全文为新书(原书保留,登记书架)。 */
|
|
140
|
+
readonly adaptSave: "/api/dsh-novel-forge/adapt/save";
|
|
141
|
+
/** 改编模式:从源全文 + 编辑后方案提炼新书资料并保存为「待写新书」。 */
|
|
142
|
+
readonly adaptMaterialize: "/api/dsh-novel-forge/adapt/materialize";
|
|
143
|
+
/** 改编模式:rewrite 逐章重写(NDJSON 流式进度)。 */
|
|
144
|
+
readonly adaptRewriteStream: "/api/dsh-novel-forge/adapt/rewrite-stream";
|
|
145
|
+
/** 改编模式:把预览/微调后的新书资料写入并登记书架。 */
|
|
146
|
+
readonly adaptMaterializeSave: "/api/dsh-novel-forge/adapt/materialize-save";
|
|
147
|
+
/** 主题自定义背景:上传图片(POST,存盘并返回服务端 URL)。 */
|
|
148
|
+
readonly themeBackgroundUpload: "/api/dsh-novel-forge/theme/background";
|
|
149
|
+
/** 主题自定义背景:读取已上传文件(GET prefix,/theme/background/<name>)。 */
|
|
150
|
+
readonly themeBackgroundGet: "/api/dsh-novel-forge/theme/background";
|
|
151
|
+
};
|
|
152
|
+
/** 书架:一本书的条目。 */
|
|
153
|
+
export interface BookEntry {
|
|
154
|
+
/** 稳定 id。 */
|
|
155
|
+
id: string;
|
|
156
|
+
/** 书名。 */
|
|
157
|
+
bookName: string;
|
|
158
|
+
/** 该书输出目录(独立项目目录)。 */
|
|
159
|
+
outputDir: string;
|
|
160
|
+
/** 创建时间。 */
|
|
161
|
+
createdAt: string;
|
|
162
|
+
/** 最后活动时间。 */
|
|
163
|
+
updatedAt: string;
|
|
164
|
+
}
|
|
165
|
+
/** 书架快照(含每本书的进度摘要)。 */
|
|
166
|
+
export interface BookshelfSnapshot {
|
|
167
|
+
books: Array<BookEntry & {
|
|
168
|
+
done: number;
|
|
169
|
+
total: number;
|
|
170
|
+
hasProject: boolean;
|
|
171
|
+
hasCover: boolean;
|
|
172
|
+
blurb?: string;
|
|
173
|
+
}>;
|
|
174
|
+
/** 当前激活的书 id(无则 null)。 */
|
|
175
|
+
activeBookId: string | null;
|
|
176
|
+
}
|
|
177
|
+
/** POST /bookshelf 请求:创建新书。 */
|
|
178
|
+
export interface BookCreateRequest {
|
|
179
|
+
bookName: string;
|
|
180
|
+
outputDir?: string;
|
|
181
|
+
/** 开书向导:创建时直接导入的大纲文本(提供则立即建立项目)。 */
|
|
182
|
+
outline?: string;
|
|
183
|
+
}
|
|
184
|
+
/** POST /reset 请求:重置项目(可选更新大纲)。 */
|
|
185
|
+
export interface ResetRequest {
|
|
186
|
+
/** 新大纲文本;提供则替换 outline,否则保留原大纲。 */
|
|
187
|
+
outline?: string;
|
|
188
|
+
}
|
|
189
|
+
/** POST /bookshelf/activate 请求:切换当前书。 */
|
|
190
|
+
export interface BookActivateRequest {
|
|
191
|
+
id: string;
|
|
192
|
+
}
|
|
193
|
+
/** POST /bookshelf/remove 请求:移除书架条目。 */
|
|
194
|
+
export interface BookRemoveRequest {
|
|
195
|
+
id: string;
|
|
196
|
+
}
|
|
197
|
+
/** POST /bookshelf/import-dir 请求:导入已有项目目录。 */
|
|
198
|
+
export interface BookImportDirRequest {
|
|
199
|
+
/** 项目目录(须含 novel-project.json)。 */
|
|
200
|
+
outputDir: string;
|
|
201
|
+
}
|
|
202
|
+
/** POST /bookshelf/import-dir 响应。 */
|
|
203
|
+
export interface BookImportDirResponse {
|
|
204
|
+
book: BookEntry;
|
|
205
|
+
/** true = 目录已在书架中(本次为重新激活)。 */
|
|
206
|
+
existed: boolean;
|
|
207
|
+
}
|
|
208
|
+
/** POST /bookshelf/import-text 请求:导入 txt/md 全本。两种模式二选一:
|
|
209
|
+
* - filePath:服务器本地文件路径;
|
|
210
|
+
* - text + fileName:浏览器上传的全文内容(fileName 用于推断书名)。
|
|
211
|
+
*/
|
|
212
|
+
export interface BookImportTextRequest {
|
|
213
|
+
/** 模式一:源文件绝对路径(txt 或 md)。 */
|
|
214
|
+
filePath?: string;
|
|
215
|
+
/** 模式二:浏览器上传的全文内容。 */
|
|
216
|
+
text?: string;
|
|
217
|
+
/** 模式二:原文件名(txt/md),用于推断书名与显示。 */
|
|
218
|
+
fileName?: string;
|
|
219
|
+
/** 输出目录;缺省为 ~/.dsh/novels/书名。 */
|
|
220
|
+
outputDir?: string;
|
|
221
|
+
}
|
|
222
|
+
/** POST /bookshelf/import-text 响应。 */
|
|
223
|
+
export interface BookImportTextResponse {
|
|
224
|
+
bookName: string;
|
|
225
|
+
/** 成功拆出的章节数。 */
|
|
226
|
+
chapters: number;
|
|
227
|
+
/** 因内容过短被跳过的章节标题列表。 */
|
|
228
|
+
skipped: string[];
|
|
229
|
+
/** 登记后的书架条目。 */
|
|
230
|
+
book: BookEntry;
|
|
231
|
+
}
|
|
232
|
+
/** POST /bookshelf/import-text/preview 请求:上传全文做拆章预览(不落盘)。 */
|
|
233
|
+
export interface BookImportTextPreviewRequest {
|
|
234
|
+
text: string;
|
|
235
|
+
/** 原文件名(txt/md),用于推断书名。 */
|
|
236
|
+
fileName?: string;
|
|
237
|
+
}
|
|
238
|
+
/** POST /bookshelf/import-text/preview 响应。 */
|
|
239
|
+
export interface BookImportTextPreviewResponse {
|
|
240
|
+
/** 预计书名(fileName 去扩展名)。 */
|
|
241
|
+
bookName: string;
|
|
242
|
+
/** 识别出的章节(已按正文长度过滤过短章节)。 */
|
|
243
|
+
chapters: Array<{
|
|
244
|
+
no: number;
|
|
245
|
+
title: string;
|
|
246
|
+
chars: number;
|
|
247
|
+
}>;
|
|
248
|
+
/** 因内容过短被跳过的章节标题列表。 */
|
|
249
|
+
skipped: string[];
|
|
250
|
+
}
|
|
251
|
+
/** 分镜·编剧级:剧情骨架中的一节拍。 */
|
|
252
|
+
export interface StoryboardBeat {
|
|
253
|
+
/** 节拍 id(如 b1、b2)。 */
|
|
254
|
+
id: string;
|
|
255
|
+
/** 事件一句话(发生了什么)。 */
|
|
256
|
+
event: string;
|
|
257
|
+
/** 情绪走向(情绪词 id 数组,来自 story-beat-language 词库,链式)。 */
|
|
258
|
+
emotion: EmotionId[];
|
|
259
|
+
/** 叙事功能(枚举 id,来自 story-beat-language 词库)。 */
|
|
260
|
+
function: StoryFunctionId;
|
|
261
|
+
/** 因果:承接上一节拍的原因(可选)。 */
|
|
262
|
+
cause?: string;
|
|
263
|
+
}
|
|
264
|
+
/** 分镜·编剧级:单章剧情骨架。 */
|
|
265
|
+
export interface StoryboardSkeleton {
|
|
266
|
+
chapterNo: number;
|
|
267
|
+
/** 本章弧线一句话(起承转合)。 */
|
|
268
|
+
arc: string;
|
|
269
|
+
/** 剧情节拍链(时间顺序,因果连贯)。 */
|
|
270
|
+
beats: StoryboardBeat[];
|
|
271
|
+
/** 本章全部出镜角色(正文中的确切称谓,去重;漫剧角色库提名地基)。 */
|
|
272
|
+
characters?: string[];
|
|
273
|
+
}
|
|
274
|
+
/** POST /storyboard/skeleton 请求:生成单章剧情骨架。 */
|
|
275
|
+
export interface StoryboardSkeletonRequest {
|
|
276
|
+
chapterNo: number;
|
|
277
|
+
}
|
|
278
|
+
/** POST /storyboard/skeleton 响应。 */
|
|
279
|
+
export interface StoryboardSkeletonResponse {
|
|
280
|
+
skeleton: StoryboardSkeleton;
|
|
281
|
+
}
|
|
282
|
+
/** 分镜·导演级:一个镜头。 */
|
|
283
|
+
export interface StoryboardShot {
|
|
284
|
+
/** 镜头 id(如 s1、s2)。 */
|
|
285
|
+
id: string;
|
|
286
|
+
/** 挂载的节拍 id(骨架中的 b1…)。 */
|
|
287
|
+
beatId: string;
|
|
288
|
+
/** 景别(枚举 id,来自 shot-language 词库)。 */
|
|
289
|
+
shot: ShotSizeId;
|
|
290
|
+
/** 机位与运镜(枚举 id 数组,来自 shot-language 词库)。 */
|
|
291
|
+
camera: CameraMoveId[];
|
|
292
|
+
/** 构图(可选,枚举 id)。 */
|
|
293
|
+
composition?: CompositionId;
|
|
294
|
+
/** 时长(秒,即梦白名单:5/6/7/8/10)。 */
|
|
295
|
+
duration: number;
|
|
296
|
+
/** 画面内容:角色动作 + 表情 + 服装/标志物 + 主体位置。 */
|
|
297
|
+
visual: string;
|
|
298
|
+
/** 台词/旁白(无则空字符串)。 */
|
|
299
|
+
line: string;
|
|
300
|
+
/** 音效(无则空字符串)。 */
|
|
301
|
+
sound: string;
|
|
302
|
+
/** 光效(枚举 id 数组,来自 shot-language 词库)。 */
|
|
303
|
+
light: LightingId[];
|
|
304
|
+
/** 承接上一镜头结尾状态(位置/动作/情绪/服装)。 */
|
|
305
|
+
prevState: string;
|
|
306
|
+
/** 本镜头结束状态。 */
|
|
307
|
+
nextState: string;
|
|
308
|
+
/** 本镜头出镜角色(引用小说库规范名/漫剧卡名,1-4 个;漫剧角色库提名地基)。 */
|
|
309
|
+
characters?: string[];
|
|
310
|
+
/** 本镜头已绑定漫剧卡的 id(定妆图引用,供出图/生视频时按卡取参考图)。 */
|
|
311
|
+
mangaRoleIds?: string[];
|
|
312
|
+
/** 即梦自然语言运镜描述(如「镜头从中景缓慢推进到近景」),提示词层直接使用,无需再转换。 */
|
|
313
|
+
jimengCamera?: string;
|
|
314
|
+
/** 本镜参考图 id 列表(角色定妆图+场景图),即梦图生视频时逐条投喂。 */
|
|
315
|
+
referenceImageIds?: string[];
|
|
316
|
+
}
|
|
317
|
+
/** 分镜·导演级:单章分镜表。 */
|
|
318
|
+
export interface StoryboardTable {
|
|
319
|
+
chapterNo: number;
|
|
320
|
+
shots: StoryboardShot[];
|
|
321
|
+
/** 生成时注入的场景卡名称(前端标注消费关系)。 */
|
|
322
|
+
usedScenes?: string[];
|
|
323
|
+
/** 本章全部出镜角色(各镜头 characters 去重汇总;骨架有则兜底)。 */
|
|
324
|
+
characters?: string[];
|
|
325
|
+
/** 本章已绑定漫剧卡的 id(去重汇总,定妆图引用)。 */
|
|
326
|
+
mangaRoleIds?: string[];
|
|
327
|
+
}
|
|
328
|
+
/** POST /storyboard/table 请求:骨架 → 分镜表。 */
|
|
329
|
+
export interface StoryboardTableRequest {
|
|
330
|
+
chapterNo: number;
|
|
331
|
+
/** 编剧级骨架(前端已生成/编辑后的版本)。 */
|
|
332
|
+
skeleton: StoryboardSkeleton;
|
|
333
|
+
/** 漫剧方案基底风格 id(style-library);提供时按风格措辞画面描述。 */
|
|
334
|
+
styleId?: string;
|
|
335
|
+
/** 可选滤镜风格 id(stackable)。 */
|
|
336
|
+
filterId?: string;
|
|
337
|
+
}
|
|
338
|
+
/** POST /storyboard/table 响应。 */
|
|
339
|
+
export interface StoryboardTableResponse {
|
|
340
|
+
table: StoryboardTable;
|
|
341
|
+
}
|
|
342
|
+
/** 分镜·提示词级:一个镜头的即梦视频提示词。 */
|
|
343
|
+
export interface StoryboardPrompt {
|
|
344
|
+
/** 对应镜头 id(s1…)。 */
|
|
345
|
+
shotId: string;
|
|
346
|
+
/** 即梦/视频模型可粘贴的中文提示词(画面+运镜+光效+风格词块)。 */
|
|
347
|
+
text: string;
|
|
348
|
+
/** 本镜头绑定的漫剧卡 id(定妆图引用:出图/生视频时按卡取 imageUrl/立绘)。 */
|
|
349
|
+
mangaRoleIds?: string[];
|
|
350
|
+
/** Seedance 专用:运镜方式(推/拉/摇/移/跟/升降/固定,含具体起止)。 */
|
|
351
|
+
camera?: string;
|
|
352
|
+
/** Seedance 专用:运动幅度(轻微/中等/强烈)。 */
|
|
353
|
+
motion?: 'low' | 'medium' | 'high';
|
|
354
|
+
/** 负面提示词(即梦末尾追加:不要文字/水印/变形/多手/多指等)。 */
|
|
355
|
+
negativePrompt?: string;
|
|
356
|
+
/** 本镜头场景名(绑定场景底图参考)。 */
|
|
357
|
+
sceneName?: string;
|
|
358
|
+
}
|
|
359
|
+
/** 分镜持久化:单章的分镜产出(骨架 + 分镜表 + 视频提示词,可分别存在)。 */
|
|
360
|
+
export interface ChapterStoryboard {
|
|
361
|
+
chapterNo: number;
|
|
362
|
+
skeleton?: StoryboardSkeleton;
|
|
363
|
+
table?: StoryboardTable;
|
|
364
|
+
prompts?: StoryboardPrompt[];
|
|
365
|
+
updatedAt: string;
|
|
366
|
+
}
|
|
367
|
+
/** POST /storyboard/prompts 请求:分镜表 → 视频提示词。 */
|
|
368
|
+
export interface StoryboardPromptsRequest {
|
|
369
|
+
chapterNo: number;
|
|
370
|
+
/** 分镜表(前端已生成的镜头列表)。 */
|
|
371
|
+
table: StoryboardTable;
|
|
372
|
+
/** 基底风格 id。 */
|
|
373
|
+
styleId?: string;
|
|
374
|
+
/** 可选滤镜风格 id。 */
|
|
375
|
+
filterId?: string;
|
|
376
|
+
}
|
|
377
|
+
/** POST /storyboard/prompts 响应。 */
|
|
378
|
+
export interface StoryboardPromptsResponse {
|
|
379
|
+
prompts: StoryboardPrompt[];
|
|
380
|
+
}
|
|
381
|
+
/** 漫剧方案:同一本书的多套视觉演绎(基底风格 + 可选滤镜)。 */
|
|
382
|
+
export interface MangaPlan {
|
|
383
|
+
/** 方案 id。 */
|
|
384
|
+
id: string;
|
|
385
|
+
/** 方案名(如《保质期》3D 皮克斯版)。 */
|
|
386
|
+
name: string;
|
|
387
|
+
/** 基底风格 id(style-library 中非 stackable 风格)。 */
|
|
388
|
+
styleId: string;
|
|
389
|
+
/** 可选滤镜风格 id(style-library 中 stackable 风格)。 */
|
|
390
|
+
filterId?: string;
|
|
391
|
+
/** 可选题材(玄幻/武侠/二次元/都市/科幻...),注入对应题材生成规则。 */
|
|
392
|
+
genre?: string;
|
|
393
|
+
/** 是否激活(分镜/角色图生成时使用)。 */
|
|
394
|
+
active: boolean;
|
|
395
|
+
createdAt: string;
|
|
396
|
+
updatedAt: string;
|
|
397
|
+
}
|
|
398
|
+
/** POST /manhua/plans 请求:漫剧方案管理。 */
|
|
399
|
+
export interface MangaPlansRequest {
|
|
400
|
+
op: 'create' | 'remove' | 'activate';
|
|
401
|
+
/** create:方案名。 */
|
|
402
|
+
name?: string;
|
|
403
|
+
/** create:基底风格 id。 */
|
|
404
|
+
styleId?: string;
|
|
405
|
+
/** create:可选滤镜风格 id。 */
|
|
406
|
+
filterId?: string;
|
|
407
|
+
/** create:题材(注入对应题材规则)。 */
|
|
408
|
+
genre?: string;
|
|
409
|
+
/** remove/activate:方案 id。 */
|
|
410
|
+
id?: string;
|
|
411
|
+
}
|
|
412
|
+
/** POST /manhua/plans 响应。 */
|
|
413
|
+
export interface MangaPlansResponse {
|
|
414
|
+
plans: MangaPlan[];
|
|
415
|
+
}
|
|
416
|
+
/** 漫剧角色卡:制作角色(要建模/出图/锁一致性的「上镜角色」),与小说角色库弱关联。 */
|
|
417
|
+
export interface MangaRoleCard {
|
|
418
|
+
/** 稳定 id。 */
|
|
419
|
+
id: string;
|
|
420
|
+
/** 来源小说角色名(只读追溯,非强外键;禁止反向写回小说库)。 */
|
|
421
|
+
sourceRoleName?: string;
|
|
422
|
+
/** 漫剧用名(可短剧化改名)。 */
|
|
423
|
+
name: string;
|
|
424
|
+
/** 身份一句话。 */
|
|
425
|
+
identity: string;
|
|
426
|
+
/** 核心功能:主角/导师/感情线/反派/搭档/线人/功能性。 */
|
|
427
|
+
coreFunction: 'protagonist' | 'mentor' | 'love_interest' | 'antagonist' | 'sidekick' | 'informant' | 'functional';
|
|
428
|
+
/** 与主角的关系。 */
|
|
429
|
+
protagonistRelation: 'enemy' | 'friend' | 'mentor' | 'lover' | 'exploit' | 'neutral';
|
|
430
|
+
/** 口头禅/说话方式(配音一致性)。 */
|
|
431
|
+
speechStyle: string;
|
|
432
|
+
/** ≤3 个极致性格标签。 */
|
|
433
|
+
traits: string[];
|
|
434
|
+
/** 1-2 个辨识度外貌点。 */
|
|
435
|
+
appearance: string;
|
|
436
|
+
/** 角色定妆级别:protagonist主角(完整四件套) / supporting配角(仅立绘) / extra路人(不做定妆)。默认 protagonist。 */
|
|
437
|
+
tier?: 'protagonist' | 'supporting' | 'extra';
|
|
438
|
+
/** 3-5 个关键剧情节点。 */
|
|
439
|
+
keyScenes: string[];
|
|
440
|
+
/** 上场集数(分镜提名导入时记录)。 */
|
|
441
|
+
appearsInEpisodes: number[];
|
|
442
|
+
/** 待匹配 → 待确认 → 已导入 → 已定妆 → 已归档。 */
|
|
443
|
+
status: 'pending_match' | 'pending_confirm' | 'imported' | 'anchored' | 'archived';
|
|
444
|
+
/** 形象资产(沿用小说角色库同款结构)。 */
|
|
445
|
+
imagePrompt?: RoleRecord['imagePrompt'];
|
|
446
|
+
/** 情绪表情清单(锚点提炼时产出)。 */
|
|
447
|
+
expressions?: string[];
|
|
448
|
+
/** 四类精修生图提示词(立绘/四视图/表情/细节)。 */
|
|
449
|
+
promptKit?: RoleRecord['promptKit'];
|
|
450
|
+
/** 角色参考图。 */
|
|
451
|
+
imageUrl?: string;
|
|
452
|
+
/** 图集(图像锚点)。 */
|
|
453
|
+
gallery?: RoleImage[];
|
|
454
|
+
/** 生成锚点/精修时的方案风格 id(旧风格检测用)。 */
|
|
455
|
+
promptStyleId?: string;
|
|
456
|
+
createdAt: string;
|
|
457
|
+
updatedAt: string;
|
|
458
|
+
}
|
|
459
|
+
/** 分镜提名 → 小说角色库匹配的一条候选。 */
|
|
460
|
+
export interface MangaRoleCandidate {
|
|
461
|
+
/** 分镜里的原始称谓(正文确切用法)。 */
|
|
462
|
+
rawName: string;
|
|
463
|
+
/** matched=命中小说角色;ambiguous=多个候选待定;not_in_library=小说库没有;already_imported=已建漫剧卡(跳过)。 */
|
|
464
|
+
verdict: 'matched' | 'ambiguous' | 'not_in_library' | 'already_imported';
|
|
465
|
+
/** 规则阶段候选短名单(≤5,精确名优先 + 身份/简称匹配)。 */
|
|
466
|
+
matches: Array<{
|
|
467
|
+
roleName: string;
|
|
468
|
+
reason: string;
|
|
469
|
+
}>;
|
|
470
|
+
/** LLM/规则确认的命中角色名(ambiguous 时可能为空)。 */
|
|
471
|
+
matchedRoleName?: string;
|
|
472
|
+
/** not_in_library 时给出建议:backfill=正文有该称谓但小说库漏提炼(回小说库补);manga_new=漫剧新增角色(直接建卡)。 */
|
|
473
|
+
novelHint?: 'backfill' | 'manga_new';
|
|
474
|
+
/** 智能分级:protagonist=主角(必做定妆)、supporting=配角(建议做定妆)、extra=路人/功能性(默认不导入,折叠显示)。 */
|
|
475
|
+
tier?: 'protagonist' | 'supporting' | 'extra';
|
|
476
|
+
/** 采纳时预填的漫剧卡建议。 */
|
|
477
|
+
suggested: {
|
|
478
|
+
name: string;
|
|
479
|
+
identity: string;
|
|
480
|
+
coreFunction: MangaRoleCard['coreFunction'];
|
|
481
|
+
protagonistRelation: MangaRoleCard['protagonistRelation'];
|
|
482
|
+
speechStyle: string;
|
|
483
|
+
traits: string[];
|
|
484
|
+
appearance: string;
|
|
485
|
+
keyScenes: string[];
|
|
486
|
+
};
|
|
487
|
+
}
|
|
488
|
+
/** POST /manga/roles 请求:漫剧角色库操作。 */
|
|
489
|
+
export interface MangaRolesRequest {
|
|
490
|
+
op: 'nominate' | 'adopt' | 'update' | 'remove' | 'visual' | 'promptKit' | 'image' | 'removeImage' | 'imageGenerate' | 'mode' | 'autoGenerate' | 'openAssets';
|
|
491
|
+
/** op='mode':短剧精简模式开关。 */
|
|
492
|
+
shortDramaMode?: boolean;
|
|
493
|
+
/** op='nominate':从哪章分镜提名角色。 */
|
|
494
|
+
chapterNo?: number;
|
|
495
|
+
/** op='adopt' / op='update':漫剧角色卡。 */
|
|
496
|
+
card?: MangaRoleCard;
|
|
497
|
+
/** op='remove' / 'visual' / 'promptKit' / 'image' / 'removeImage' / 'imageGenerate':漫剧卡 id。 */
|
|
498
|
+
id?: string;
|
|
499
|
+
/** op='visual' / 'promptKit':漫剧方案基底风格 id。 */
|
|
500
|
+
styleId?: string;
|
|
501
|
+
/** 可选滤镜风格 id。 */
|
|
502
|
+
filterId?: string;
|
|
503
|
+
/** op='image':定妆图 dataURL。 */
|
|
504
|
+
dataUrl?: string;
|
|
505
|
+
/** op='image':图集用途标签(立绘/四视图/表情-x/场景/细节);缺省视为角色参考图(imageUrl)。 */
|
|
506
|
+
label?: string;
|
|
507
|
+
/** op='imageGenerate':漫画风格预设 id(可选)。 */
|
|
508
|
+
style?: string;
|
|
509
|
+
/** op='imageGenerate':生图模型库条目 id(缺省用启用条目)。 */
|
|
510
|
+
modelId?: string;
|
|
511
|
+
/** op='autoGenerate' 时返回一键生成结果。 */
|
|
512
|
+
autoGenerate?: {
|
|
513
|
+
chapterNo: number;
|
|
514
|
+
skeletonBeats: number;
|
|
515
|
+
shotCount: number;
|
|
516
|
+
promptCount: number;
|
|
517
|
+
importedRoles: number;
|
|
518
|
+
needMakeupRoles: number;
|
|
519
|
+
extraRoles: number;
|
|
520
|
+
pendingCandidates: number;
|
|
521
|
+
pendingRoleNames: string[];
|
|
522
|
+
};
|
|
523
|
+
}
|
|
524
|
+
/** POST /manga/roles 响应。 */
|
|
525
|
+
export interface MangaRolesResponse {
|
|
526
|
+
cards: MangaRoleCard[];
|
|
527
|
+
/** op='nominate' 时的 AI 提名候选。 */
|
|
528
|
+
candidates?: MangaRoleCandidate[];
|
|
529
|
+
/** op='visual' 时的形象锚点(已写入漫剧卡)。 */
|
|
530
|
+
visual?: RoleRecord['imagePrompt'];
|
|
531
|
+
/** op='promptKit' 时的四类精修提示词包(已写入漫剧卡)。 */
|
|
532
|
+
promptKit?: RoleRecord['promptKit'];
|
|
533
|
+
/** op='image' / 'imageGenerate' 时的定妆图 dataURL(已写入漫剧卡)。 */
|
|
534
|
+
imageUrl?: string;
|
|
535
|
+
/** op='mode' 时的短剧精简模式状态。 */
|
|
536
|
+
shortDramaMode?: boolean;
|
|
537
|
+
/** op='autoGenerate' 时返回一键生成结果。 */
|
|
538
|
+
autoGenerate?: {
|
|
539
|
+
chapterNo: number;
|
|
540
|
+
skeletonBeats: number;
|
|
541
|
+
shotCount: number;
|
|
542
|
+
promptCount: number;
|
|
543
|
+
importedRoles: number;
|
|
544
|
+
needMakeupRoles: number;
|
|
545
|
+
extraRoles: number;
|
|
546
|
+
pendingCandidates: number;
|
|
547
|
+
pendingRoleNames: string[];
|
|
548
|
+
};
|
|
549
|
+
}
|
|
550
|
+
/** Chapter lifecycle states (the writing pipeline's state machine). */
|
|
551
|
+
export type ChapterStatus = 'pending' | 'generating' | 'written' | 'reviewing' | 'approved' | 'rejected' | 'error';
|
|
552
|
+
/** One chapter in the plan. */
|
|
553
|
+
export interface ChapterPlan {
|
|
554
|
+
/** 1-based chapter number (stable identity; files are named from it). */
|
|
555
|
+
no: number;
|
|
556
|
+
/** Volume this chapter belongs to (1-based; 0 = unassigned). */
|
|
557
|
+
volume: number;
|
|
558
|
+
/** Chapter title, decided by the LLM plan step. */
|
|
559
|
+
title: string;
|
|
560
|
+
/** Story beats / plot points for this chapter (model-facing guidance). */
|
|
561
|
+
beats: string;
|
|
562
|
+
/** Target character count (defaults to the configured chapter size). */
|
|
563
|
+
targetChars: number;
|
|
564
|
+
/** Generation/review state. */
|
|
565
|
+
status: ChapterStatus;
|
|
566
|
+
/** 进入 generating 的时间(用于超时自动复位;未在生成时无此字段)。 */
|
|
567
|
+
generatingAt?: string;
|
|
568
|
+
/** Actual character count once generated. */
|
|
569
|
+
chars?: number;
|
|
570
|
+
/** Failure message when status is 'error'. */
|
|
571
|
+
error?: string;
|
|
572
|
+
/** Output file name once generated (relative to the output dir). */
|
|
573
|
+
file?: string;
|
|
574
|
+
/** LLM summary of the chapter (narrative memory for later chapters). */
|
|
575
|
+
summary?: string;
|
|
576
|
+
/** Latest review report (present once reviewed). */
|
|
577
|
+
review?: ReviewReport;
|
|
578
|
+
/** 作者复盘:钩子兑现/结尾钩子/剧情线推进/连续性/节奏趋势(生成后自动)。 */
|
|
579
|
+
authorReview?: AuthorReview;
|
|
580
|
+
/**
|
|
581
|
+
* 待确认草稿:润色(去AI味)或整章重写的产物正文。生成时先存这里,
|
|
582
|
+
* 用户看过对比后点「采纳」才覆盖正文文件;点「放弃」则丢弃。刷新页面不丢失。
|
|
583
|
+
*/
|
|
584
|
+
pendingDraft?: string;
|
|
585
|
+
}
|
|
586
|
+
/** 作者复盘:叙事结构层面的逐章检查(钩子/推进/连续性/趋势)。 */
|
|
587
|
+
export interface AuthorReview {
|
|
588
|
+
/** 上一章结尾钩子是否在本章兑现。 */
|
|
589
|
+
hookHonored: boolean;
|
|
590
|
+
/** 钩子兑现说明(未兑现时给出建议)。 */
|
|
591
|
+
hookNote: string;
|
|
592
|
+
/** 本章结尾钩子强度 0-10。 */
|
|
593
|
+
endingHook: number;
|
|
594
|
+
/** 剧情线推进情况(推进了哪条线/或未推进)。 */
|
|
595
|
+
plotlineProgress: string;
|
|
596
|
+
/** 结构化:本章推进的剧情线名称列表(与项目剧情线 name 精确匹配,复盘后自动关联章节)。 */
|
|
597
|
+
advancedLines?: string[];
|
|
598
|
+
/** 连续性检查(人物位置/时间/伤势/资源是否与上章衔接)。 */
|
|
599
|
+
continuity: string;
|
|
600
|
+
/** 近期节奏趋势提示(拖沓/爽点密度等)。 */
|
|
601
|
+
trend: string;
|
|
602
|
+
/** 复盘时间。 */
|
|
603
|
+
reviewedAt: string;
|
|
604
|
+
}
|
|
605
|
+
/** 审稿维度(结构化定位问题类别;与 review-policy.ts 的 REVIEW_DIMENSIONS 对齐)。 */
|
|
606
|
+
export type ReviewDimension = 'character' | 'setting' | 'redline' | 'writing' | 'pacing' | 'logic' | 'anti-ai' | 'presentation' | 'compliance';
|
|
607
|
+
/** One review finding. */
|
|
608
|
+
export interface ReviewIssue {
|
|
609
|
+
/** Severity: high = must fix, medium = should fix, low = suggestion. */
|
|
610
|
+
severity: 'high' | 'medium' | 'low';
|
|
611
|
+
/** 问题维度(可选;缺省由前端按 item 推断)。 */
|
|
612
|
+
dimension?: ReviewDimension;
|
|
613
|
+
/** What the problem is. */
|
|
614
|
+
item: string;
|
|
615
|
+
/** Concrete suggestion for fixing it. */
|
|
616
|
+
suggestion: string;
|
|
617
|
+
}
|
|
618
|
+
/** AI review report for one chapter. */
|
|
619
|
+
export interface ReviewReport {
|
|
620
|
+
/** Overall score 0-100. */
|
|
621
|
+
score: number;
|
|
622
|
+
/** Pass threshold (config; 70 default). */
|
|
623
|
+
passed: boolean;
|
|
624
|
+
/** One-line verdict. */
|
|
625
|
+
verdict: string;
|
|
626
|
+
/** Individual findings. */
|
|
627
|
+
issues: ReviewIssue[];
|
|
628
|
+
/** When the review ran. */
|
|
629
|
+
reviewedAt: string;
|
|
630
|
+
}
|
|
631
|
+
/** A volume of the book. */
|
|
632
|
+
export interface Volume {
|
|
633
|
+
/** 1-based volume number. */
|
|
634
|
+
no: number;
|
|
635
|
+
/** Volume title. */
|
|
636
|
+
title: string;
|
|
637
|
+
/** Volume positioning / summary. */
|
|
638
|
+
summary: string;
|
|
639
|
+
/** First chapter number of this volume. */
|
|
640
|
+
chapterStart: number;
|
|
641
|
+
/** Last chapter number (inclusive). */
|
|
642
|
+
chapterEnd: number;
|
|
643
|
+
}
|
|
644
|
+
/** A character card from the story bible. */
|
|
645
|
+
export interface CharacterCard {
|
|
646
|
+
name: string;
|
|
647
|
+
role: 'protagonist' | 'supporting' | 'antagonist' | 'other';
|
|
648
|
+
/** Personality / traits (short lines). */
|
|
649
|
+
traits: string[];
|
|
650
|
+
/** Goals and motivations. */
|
|
651
|
+
goals: string;
|
|
652
|
+
/** Key relations to other characters. */
|
|
653
|
+
relations: string;
|
|
654
|
+
/** 知情度:该角色已经知道的事实/秘密(未列出的信息该角色不知道)。 */
|
|
655
|
+
knowledge?: string[];
|
|
656
|
+
}
|
|
657
|
+
/** The structured story bible (worldbuilding extracted from the outline). */
|
|
658
|
+
export interface StoryBible {
|
|
659
|
+
/** Genre + tone tags. */
|
|
660
|
+
genre: string;
|
|
661
|
+
/** Worldbuilding rules (power system, geography, factions...). */
|
|
662
|
+
worldRules: string[];
|
|
663
|
+
/** Character cards. */
|
|
664
|
+
characters: CharacterCard[];
|
|
665
|
+
/** Writing red lines (forbidden content / must-avoid tropes). */
|
|
666
|
+
redLines: string[];
|
|
667
|
+
/** Style guidance (pacing, pov, tone). */
|
|
668
|
+
style: string[];
|
|
669
|
+
/** When the bible was generated. */
|
|
670
|
+
generatedAt?: string;
|
|
671
|
+
}
|
|
672
|
+
/** A planted/active/resolved foreshadowing thread. */
|
|
673
|
+
export interface Foreshadow {
|
|
674
|
+
/** Stable id. */
|
|
675
|
+
id: string;
|
|
676
|
+
/** What the foreshadow is. */
|
|
677
|
+
description: string;
|
|
678
|
+
/** Chapter where it was planted (undefined = planned). */
|
|
679
|
+
plantedChapter?: number;
|
|
680
|
+
/** Chapter where it should be paid off. */
|
|
681
|
+
targetChapter?: number;
|
|
682
|
+
/** Lifecycle state. */
|
|
683
|
+
status: 'planned' | 'planted' | 'progressing' | 'resolved' | 'abandoned';
|
|
684
|
+
/** Resolution note when resolved. */
|
|
685
|
+
resolvedNote?: string;
|
|
686
|
+
}
|
|
687
|
+
/** 一条已确立的叙事事实(事实库/时间线,注入后续章节生成)。 */
|
|
688
|
+
export interface ChapterFact {
|
|
689
|
+
/** 来源章节号。 */
|
|
690
|
+
chapterNo: number;
|
|
691
|
+
/** 事实文本(人物状态/境界资源/关系变化/伏笔落地等)。 */
|
|
692
|
+
text: string;
|
|
693
|
+
}
|
|
694
|
+
/** 一条全书质检发现的问题(一致性矛盾,定位到章)。 */
|
|
695
|
+
export interface AuditIssue {
|
|
696
|
+
/** 问题所在章节号(无法定位时 0)。 */
|
|
697
|
+
chapterNo: number;
|
|
698
|
+
severity: 'high' | 'medium' | 'low';
|
|
699
|
+
/** 矛盾描述。 */
|
|
700
|
+
item: string;
|
|
701
|
+
/** 修改建议。 */
|
|
702
|
+
suggestion: string;
|
|
703
|
+
}
|
|
704
|
+
/** POST /audit 响应。 */
|
|
705
|
+
export interface AuditResponse {
|
|
706
|
+
issues: AuditIssue[];
|
|
707
|
+
/** 参与质检的章节数。 */
|
|
708
|
+
auditedChapters: number;
|
|
709
|
+
/** 质检时间。 */
|
|
710
|
+
auditedAt: string;
|
|
711
|
+
}
|
|
712
|
+
/** 全书质检的实时状态(通过 /status 暴露给面板/外部读取)。 */
|
|
713
|
+
export interface AuditStatus {
|
|
714
|
+
status: 'idle' | 'running' | 'done' | 'error';
|
|
715
|
+
/** 开始时间(ISO)。 */
|
|
716
|
+
startedAt?: string;
|
|
717
|
+
/** 结束时间(ISO)。 */
|
|
718
|
+
finishedAt?: string;
|
|
719
|
+
/** 总批次数(0 = 尚未开始/无章节)。 */
|
|
720
|
+
totalBatches: number;
|
|
721
|
+
/** 已完成批次数。 */
|
|
722
|
+
completedBatches: number;
|
|
723
|
+
/** 参与质检的章节数。 */
|
|
724
|
+
auditedChapters?: number;
|
|
725
|
+
/** 发现的问题数(done 后有效)。 */
|
|
726
|
+
issuesCount?: number;
|
|
727
|
+
/** 最近一次质检的问题清单(done 后有效;error 时为空)。 */
|
|
728
|
+
issues?: AuditIssue[];
|
|
729
|
+
/** 失败信息(error 时有效)。 */
|
|
730
|
+
error?: string;
|
|
731
|
+
}
|
|
732
|
+
/** 一条剧情线(主线/支线/人物线/悬念线)。 */
|
|
733
|
+
export interface Plotline {
|
|
734
|
+
/** 稳定 id。 */
|
|
735
|
+
id: string;
|
|
736
|
+
/** 线名。 */
|
|
737
|
+
name: string;
|
|
738
|
+
/** 类型:主线 / 支线 / 人物线 / 悬念线。 */
|
|
739
|
+
kind: 'main' | 'branch' | 'character' | 'mystery';
|
|
740
|
+
/** 目标/终点(这条线最终要完成什么)。 */
|
|
741
|
+
goal: string;
|
|
742
|
+
/** 当前进度说明(最近推进到哪)。 */
|
|
743
|
+
progress: string;
|
|
744
|
+
/** 生命周期状态。 */
|
|
745
|
+
status: 'active' | 'paused' | 'resolved' | 'abandoned';
|
|
746
|
+
/** 关联章节号(推进/落地的章节)。 */
|
|
747
|
+
chapters: number[];
|
|
748
|
+
/** 创建时间。 */
|
|
749
|
+
createdAt: string;
|
|
750
|
+
}
|
|
751
|
+
/** POST /plotlines 请求:剧情线增删改 + 关联章节 + AI 辅助。 */
|
|
752
|
+
export interface PlotlinesRequest {
|
|
753
|
+
op: 'add' | 'update' | 'remove' | 'link' | 'suggest' | 'refresh' | 'health' | 'plan';
|
|
754
|
+
/** add / update 时传入的完整剧情线。 */
|
|
755
|
+
line?: Plotline;
|
|
756
|
+
/** remove / link / refresh 时的目标线 id。 */
|
|
757
|
+
id?: string;
|
|
758
|
+
/** link 时关联的章节号。 */
|
|
759
|
+
chapterNo?: number;
|
|
760
|
+
}
|
|
761
|
+
/** 剧情线健康检查报告。 */
|
|
762
|
+
export interface PlotlineHealthReport {
|
|
763
|
+
/** 是否需要新线(需要 / 暂不需要 / 再写 X 章后需要)。 */
|
|
764
|
+
verdict: string;
|
|
765
|
+
/** 建议添加新线的时机说明。 */
|
|
766
|
+
timing: string;
|
|
767
|
+
/** 依据(基于数据的理由,每条一句)。 */
|
|
768
|
+
reasons: string[];
|
|
769
|
+
/** 各线健康度。 */
|
|
770
|
+
lines: Array<{
|
|
771
|
+
name: string;
|
|
772
|
+
/** ok=健康 / warning=预警 / stale=搁置过久。 */
|
|
773
|
+
health: 'ok' | 'warning' | 'stale';
|
|
774
|
+
note: string;
|
|
775
|
+
}>;
|
|
776
|
+
}
|
|
777
|
+
/** AI 剧情方案:下一阶段目标 + 建议新线。 */
|
|
778
|
+
export interface PlotlinePlan {
|
|
779
|
+
/** 下一阶段(未来 5-10 章)剧情方向。 */
|
|
780
|
+
direction: string;
|
|
781
|
+
/** 建议的新线(可逐条采纳)。 */
|
|
782
|
+
suggestions: Plotline[];
|
|
783
|
+
}
|
|
784
|
+
/** POST /plotlines 响应。 */
|
|
785
|
+
export interface PlotlinesResponse {
|
|
786
|
+
plotlines: Plotline[];
|
|
787
|
+
/** op=suggest 时的 AI 建议候选线。 */
|
|
788
|
+
suggestions?: Plotline[];
|
|
789
|
+
/** op=health 时的健康检查报告。 */
|
|
790
|
+
health?: PlotlineHealthReport;
|
|
791
|
+
/** op=plan 时的剧情方案。 */
|
|
792
|
+
plan?: PlotlinePlan;
|
|
793
|
+
}
|
|
794
|
+
/** 一条敏感词命中。 */
|
|
795
|
+
export interface SensitiveHit {
|
|
796
|
+
/** 命中章节号(文本检测时为 0)。 */
|
|
797
|
+
chapterNo: number;
|
|
798
|
+
/** 命中的违禁词。 */
|
|
799
|
+
word: string;
|
|
800
|
+
/** 类别:政治 / 擦边 / 暴力 / 辱骂 / 广告 / 其他。 */
|
|
801
|
+
category: string;
|
|
802
|
+
/** 出现次数。 */
|
|
803
|
+
count: number;
|
|
804
|
+
}
|
|
805
|
+
/** POST /sensitive-check 请求:检测指定章节/任意文本/全书。 */
|
|
806
|
+
export interface SensitiveCheckRequest {
|
|
807
|
+
/** 检测该章正文。 */
|
|
808
|
+
chapterNo?: number;
|
|
809
|
+
/** 检测任意文本(优先于 chapterNo)。 */
|
|
810
|
+
text?: string;
|
|
811
|
+
/** 扫描全部已写章节。 */
|
|
812
|
+
all?: boolean;
|
|
813
|
+
}
|
|
814
|
+
/** POST /sensitive-check 响应。 */
|
|
815
|
+
export interface SensitiveCheckResponse {
|
|
816
|
+
hits: SensitiveHit[];
|
|
817
|
+
/** 参与扫描的章节数。 */
|
|
818
|
+
scannedChapters: number;
|
|
819
|
+
}
|
|
820
|
+
/** 开书想法 → AI 大纲方案(一个候选)。 */
|
|
821
|
+
export interface OutlineCandidate {
|
|
822
|
+
/** 唯一 id(前端暂留/换批用)。 */
|
|
823
|
+
id: string;
|
|
824
|
+
/** 推荐书名。 */
|
|
825
|
+
bookName: string;
|
|
826
|
+
/** 题材(如 仙侠修真 / 都市)。 */
|
|
827
|
+
genre: string;
|
|
828
|
+
/** 核心卖点一句话。 */
|
|
829
|
+
sellingPoint: string;
|
|
830
|
+
/** 完整大纲文本(可直接用作项目大纲,≥800 字)。 */
|
|
831
|
+
outline: string;
|
|
832
|
+
}
|
|
833
|
+
/** POST /outline/suggest 请求:想法 → 2-3 个可选大纲。 */
|
|
834
|
+
export interface OutlineSuggestRequest {
|
|
835
|
+
/** 作者想法(一两句话,≥50 字)。 */
|
|
836
|
+
idea: string;
|
|
837
|
+
/** 本次要生成的候选数(默认 3,最多 3)。 */
|
|
838
|
+
count?: number;
|
|
839
|
+
/** 已暂留方案的剧情方向摘要(换批时让 LLM 避开,防止与已留方案重复)。 */
|
|
840
|
+
exclude?: string[];
|
|
841
|
+
}
|
|
842
|
+
/** POST /outline/suggest 响应。 */
|
|
843
|
+
export interface OutlineSuggestResponse {
|
|
844
|
+
candidates: OutlineCandidate[];
|
|
845
|
+
}
|
|
846
|
+
/** 拆书分析:一个分析小节。 */
|
|
847
|
+
export interface BreakdownSection {
|
|
848
|
+
/** 小节键:overview / plot / character / style / market。 */
|
|
849
|
+
key: string;
|
|
850
|
+
/** 小节标题(如「拆书总览」)。 */
|
|
851
|
+
title: string;
|
|
852
|
+
/** 可读分析稿(markdown)。 */
|
|
853
|
+
markdown: string;
|
|
854
|
+
/** 结构化数据(程序可消费)。 */
|
|
855
|
+
structured: Record<string, unknown>;
|
|
856
|
+
}
|
|
857
|
+
/** 拆书分析:一条证据(结论→原文回溯)。 */
|
|
858
|
+
export interface BreakdownEvidence {
|
|
859
|
+
label: string;
|
|
860
|
+
excerpt: string;
|
|
861
|
+
/** 来源章节号(0 = 未定位)。 */
|
|
862
|
+
chapterNo: number;
|
|
863
|
+
/** 指向的结构化字段。 */
|
|
864
|
+
fieldKey?: string;
|
|
865
|
+
}
|
|
866
|
+
/** POST /breakdown 请求:对已写章节做拆书分析。 */
|
|
867
|
+
export interface BreakdownRequest {
|
|
868
|
+
/** 分析范围:'recent'=最近 20 章 / 'volume:N'=第 N 卷 / 'all'=全书(默认 recent)。 */
|
|
869
|
+
scope?: string;
|
|
870
|
+
/** 分析档位:'quick'=4 维(总览/剧情/人物/文风)/ 'standard'=5 维(+卖点)。 */
|
|
871
|
+
preset?: 'quick' | 'standard';
|
|
872
|
+
/** token 预算上限(默认 50000)。 */
|
|
873
|
+
budgetTokens?: number;
|
|
874
|
+
}
|
|
875
|
+
/** POST /breakdown 响应。 */
|
|
876
|
+
export interface BreakdownResponse {
|
|
877
|
+
sections: BreakdownSection[];
|
|
878
|
+
evidence: BreakdownEvidence[];
|
|
879
|
+
/** 参与分析的章节数。 */
|
|
880
|
+
chaptersScanned: number;
|
|
881
|
+
/** 估算消耗 token。 */
|
|
882
|
+
usedTokens: number;
|
|
883
|
+
}
|
|
884
|
+
/** 角色卡:角色当前状态(从事实库聚合)。 */
|
|
885
|
+
export interface RoleStatusCard {
|
|
886
|
+
name: string;
|
|
887
|
+
/** protagonist / supporting / antagonist / other。 */
|
|
888
|
+
role: string;
|
|
889
|
+
/** 当前状态一句话(境界/资源/伤势/心境)。 */
|
|
890
|
+
status: string;
|
|
891
|
+
/** 最近出场章节。 */
|
|
892
|
+
lastChapter: number;
|
|
893
|
+
/** 出场次数。 */
|
|
894
|
+
appearances: number;
|
|
895
|
+
}
|
|
896
|
+
/** 角色库条目(主表:作者维护 + AI 提炼 + 编年录自动聚合)。 */
|
|
897
|
+
export interface RoleRecord {
|
|
898
|
+
/** 角色名(唯一键)。 */
|
|
899
|
+
name: string;
|
|
900
|
+
/** 定位:主角 / 女主 / 女配 / 配角 / 反派 / 路人。 */
|
|
901
|
+
roleLabel: 'protagonist' | 'female_lead' | 'female_support' | 'support' | 'antagonist' | 'extra';
|
|
902
|
+
/** 身份一句话(如:祭族后裔、青云宗杂役)。 */
|
|
903
|
+
identity: string;
|
|
904
|
+
/** 性格标签。 */
|
|
905
|
+
traits: string[];
|
|
906
|
+
/** 目标与动机。 */
|
|
907
|
+
goals: string;
|
|
908
|
+
/** 关系网:[角色名](关系)。 */
|
|
909
|
+
relations: string[];
|
|
910
|
+
/** 成长线:阶段 → 说明(可含章节)。 */
|
|
911
|
+
arc: string[];
|
|
912
|
+
/** 知情度:该角色已经知道的信息。 */
|
|
913
|
+
knowledge: string[];
|
|
914
|
+
/** 首次出场章节(编年录聚合,可手动修正)。 */
|
|
915
|
+
firstChapter?: number;
|
|
916
|
+
/** 动漫形象描述词(AI 绘图用:中文描述 + 英文标签 + 关键外貌标签)。 */
|
|
917
|
+
imagePrompt?: {
|
|
918
|
+
/** 中文外貌描述:连贯一段(发色/瞳色/服装/气质/标志物)。 */
|
|
919
|
+
zh: string;
|
|
920
|
+
/** 英文绘图标签:booru 风格逗号分隔。 */
|
|
921
|
+
en: string;
|
|
922
|
+
/** 中文关键标签(发色/瞳色/服装/气质/标志物)。 */
|
|
923
|
+
tags: string[];
|
|
924
|
+
/** 依据来源说明(哪几章哪些描写)。 */
|
|
925
|
+
source?: string;
|
|
926
|
+
/** 即梦/生图通用负面提示词(低质量/变形/多手/文字水印等)。 */
|
|
927
|
+
negativePrompt?: string;
|
|
928
|
+
};
|
|
929
|
+
/** 角色参考图(dataURL 或 URL)。用于漫画/漫剧出图时锁定角色一致性。 */
|
|
930
|
+
imageUrl?: string;
|
|
931
|
+
/** 角色图集(图像锚点):立绘/四视图/表情/场景/细节等,label 标注用途。 */
|
|
932
|
+
gallery?: RoleImage[];
|
|
933
|
+
/** 该角色所需的情绪表情清单(提炼时 LLM 补全 6-12 个,如"疲惫/麻木/压抑悲伤")。 */
|
|
934
|
+
expressions?: string[];
|
|
935
|
+
/** LLM 精修的四类生图提示词包(前端拼装版之外的高质量版,promptKit 接口生成)。 */
|
|
936
|
+
promptKit?: {
|
|
937
|
+
/** 立绘:全身/半身正视图。 */
|
|
938
|
+
portrait?: {
|
|
939
|
+
zh: string;
|
|
940
|
+
en: string;
|
|
941
|
+
};
|
|
942
|
+
/** 四视图:正面/侧面/背面设定表。 */
|
|
943
|
+
sheet?: {
|
|
944
|
+
zh: string;
|
|
945
|
+
en: string;
|
|
946
|
+
};
|
|
947
|
+
/** 表情:同一脸部锚换情绪,每表情一段。 */
|
|
948
|
+
expressions?: {
|
|
949
|
+
name: string;
|
|
950
|
+
zh: string;
|
|
951
|
+
en: string;
|
|
952
|
+
}[];
|
|
953
|
+
/** 细节:标志物局部特写。 */
|
|
954
|
+
details?: {
|
|
955
|
+
zh: string;
|
|
956
|
+
en: string;
|
|
957
|
+
};
|
|
958
|
+
};
|
|
959
|
+
/** 生成形象锚点/精修提示词时的漫剧方案基底风格 id(= 方案 styleId;用于检测旧风格并提示重生成)。 */
|
|
960
|
+
promptStyleId?: string;
|
|
961
|
+
/** 漫画/漫剧重要性:main=必须建卡保证一致;support=有锚点即可;extra=路人随机生成不约束。 */
|
|
962
|
+
importance?: 'main' | 'support' | 'extra';
|
|
963
|
+
}
|
|
964
|
+
/** 角色图集条目:一张已定型的角色图(图像锚点)。 */
|
|
965
|
+
export interface RoleImage {
|
|
966
|
+
/** 用途标签:立绘 / 四视图 / 表情-疲惫 / 场景 / 细节 等。 */
|
|
967
|
+
label: string;
|
|
968
|
+
/** dataURL 或 URL。 */
|
|
969
|
+
dataUrl: string;
|
|
970
|
+
}
|
|
971
|
+
/** 道具卡:常驻道具(跨镜头需保持一致),含一行统一描述。 */
|
|
972
|
+
export interface Prop {
|
|
973
|
+
/** 道具名(如「外卖电动车」)。 */
|
|
974
|
+
name: string;
|
|
975
|
+
/** 外观/统一描述(注入提示词保持一致)。 */
|
|
976
|
+
desc: string;
|
|
977
|
+
}
|
|
978
|
+
/** POST /manga/props 请求。 */
|
|
979
|
+
export interface MangaPropsRequest {
|
|
980
|
+
op: 'extract' | 'save';
|
|
981
|
+
/** op=save 时的道具清单(整体替换)。 */
|
|
982
|
+
props?: Prop[];
|
|
983
|
+
}
|
|
984
|
+
/** POST /manga/props 响应。 */
|
|
985
|
+
export interface MangaPropsResponse {
|
|
986
|
+
props: Prop[];
|
|
987
|
+
}
|
|
988
|
+
/** 场景库条目:从正文提炼的「镜头场景」视觉锚点(漫剧分镜/生图用)。 */
|
|
989
|
+
export interface SceneCard {
|
|
990
|
+
/** 场景名(唯一键),如「旧茶渡·地下石殿」。 */
|
|
991
|
+
name: string;
|
|
992
|
+
/** 一句话定位:空间/氛围/功能。 */
|
|
993
|
+
summary: string;
|
|
994
|
+
/** 幕归属:第一幕·后场 / 第二幕·卖场 / …(便于按剧情段落组织)。 */
|
|
995
|
+
act?: string;
|
|
996
|
+
/** 时间光态:夜间闭店后 / 雨夜 / 凌晨 / 频闪灯… */
|
|
997
|
+
moment?: string;
|
|
998
|
+
/** 关键情节镜头 1-3 条:该场景拍什么(人物动作+情绪+镜头推进)。 */
|
|
999
|
+
beats?: string[];
|
|
1000
|
+
/** 人物在场状态:主角/关键角色在该场景的状态一句话。 */
|
|
1001
|
+
characterState?: string;
|
|
1002
|
+
/** 环境构成:空间结构/陈设/标志物。 */
|
|
1003
|
+
elements: string[];
|
|
1004
|
+
/** 色调与光影(含 HEX 色板,可空)。 */
|
|
1005
|
+
palette: string[];
|
|
1006
|
+
/** 氛围关键词:压抑/神秘/空旷… */
|
|
1007
|
+
moods: string[];
|
|
1008
|
+
/** 中文生图提示词(连贯一段,写实电影感)。 */
|
|
1009
|
+
zh: string;
|
|
1010
|
+
/** 英文生图提示词(逗号分隔标签)。 */
|
|
1011
|
+
en: string;
|
|
1012
|
+
/** 关键标签。 */
|
|
1013
|
+
tags: string[];
|
|
1014
|
+
/** 依据来源(哪几章哪些描写)。 */
|
|
1015
|
+
source?: string;
|
|
1016
|
+
/** 场景图集(图像锚点):全景/局部/氛围 等。 */
|
|
1017
|
+
gallery?: RoleImage[];
|
|
1018
|
+
/** 生成时的漫剧方案基底风格 id(场景卡随方案风格措辞)。 */
|
|
1019
|
+
styleId?: string;
|
|
1020
|
+
/** 场景分级:core核心场景(反复出现,精修多图)/ secondary次要场景(1-2次,一张图)/ passing路过场景(不做图)。 */
|
|
1021
|
+
tier?: 'core' | 'secondary' | 'passing';
|
|
1022
|
+
/** 负面提示词(场景生图/生视频用,默认无人物无文字无水印)。 */
|
|
1023
|
+
negativePrompt?: string;
|
|
1024
|
+
/** 出场章节列表(用于自动分级统计)。 */
|
|
1025
|
+
appearsInChapters?: number[];
|
|
1026
|
+
}
|
|
1027
|
+
/** POST /scenes 请求:场景库提炼 / 采纳 / 更新 / 删除 / 图集。 */
|
|
1028
|
+
export interface ScenesRequest {
|
|
1029
|
+
op: 'extract' | 'adopt' | 'update' | 'remove' | 'image' | 'removeImage' | 'imageGenerate';
|
|
1030
|
+
/** op='extract' 时的漫剧基底风格 id(场景卡按方案风格措辞)。 */
|
|
1031
|
+
styleId?: string;
|
|
1032
|
+
/** op='extract' 时的可选滤镜风格 id。 */
|
|
1033
|
+
filterId?: string;
|
|
1034
|
+
/** op='extract' 时按章提取;不传则全书提取(前4章)。 */
|
|
1035
|
+
chapterNo?: number;
|
|
1036
|
+
/** adopt / update 时传入的场景卡(adopt 可修改后采纳)。 */
|
|
1037
|
+
scene?: SceneCard;
|
|
1038
|
+
/** remove / image 时的场景名。 */
|
|
1039
|
+
name?: string;
|
|
1040
|
+
/** op='image' 时的图片 dataURL 与用途标签(全景/局部/氛围)。 */
|
|
1041
|
+
dataUrl?: string;
|
|
1042
|
+
label?: string;
|
|
1043
|
+
/** op='imageGenerate' 时的生图模型 id(缺省用启用模型)。 */
|
|
1044
|
+
modelId?: string;
|
|
1045
|
+
}
|
|
1046
|
+
/** POST /visual-rules 请求:视觉世界观规则提炼 / 保存。 */
|
|
1047
|
+
export interface VisualRulesRequest {
|
|
1048
|
+
op: 'extract' | 'save';
|
|
1049
|
+
/** op=save 时的规则数组。 */
|
|
1050
|
+
rules?: string[];
|
|
1051
|
+
}
|
|
1052
|
+
/** POST /visual-rules 响应。 */
|
|
1053
|
+
export interface VisualRulesResponse {
|
|
1054
|
+
rules: string[];
|
|
1055
|
+
}
|
|
1056
|
+
/** POST /scenes 响应。 */
|
|
1057
|
+
export interface ScenesResponse {
|
|
1058
|
+
scenes: SceneCard[];
|
|
1059
|
+
/** op=extract 时的 AI 候选场景。 */
|
|
1060
|
+
candidates?: SceneCard[];
|
|
1061
|
+
/** op=imageGenerate 时返回的生成图 dataURL。 */
|
|
1062
|
+
dataUrl?: string;
|
|
1063
|
+
}
|
|
1064
|
+
/** POST /roles 请求:角色库增删改 + AI 提炼 + 参考图上传。 */
|
|
1065
|
+
export interface RolesRequest {
|
|
1066
|
+
op: 'extract' | 'adopt' | 'update' | 'remove' | 'visual' | 'image' | 'removeImage' | 'imageGenerate' | 'promptKit';
|
|
1067
|
+
/** adopt / update 时传入的角色(adopt 可修改后采纳)。 */
|
|
1068
|
+
role?: RoleRecord;
|
|
1069
|
+
/** remove 时的角色名。 */
|
|
1070
|
+
name?: string;
|
|
1071
|
+
/** op='image' 时的参考图 dataURL。 */
|
|
1072
|
+
dataUrl?: string;
|
|
1073
|
+
/** op='image' 时的图集用途标签(立绘/四视图/表情-x/场景/细节);缺省视为角色参考图(imageUrl)。 */
|
|
1074
|
+
label?: string;
|
|
1075
|
+
/** op='imageGenerate' 时的漫画风格预设 id(用于统一角色图与漫画页风格)。 */
|
|
1076
|
+
style?: string;
|
|
1077
|
+
/** op='imageGenerate' 时指定生图模型库条目 id(缺省用启用条目)。 */
|
|
1078
|
+
modelId?: string;
|
|
1079
|
+
/** op='visual' / op='promptKit' 时的漫剧基底风格 id(角色图按方案风格重出)。 */
|
|
1080
|
+
styleId?: string;
|
|
1081
|
+
/** op='visual' / op='promptKit' 时的可选滤镜风格 id。 */
|
|
1082
|
+
filterId?: string;
|
|
1083
|
+
}
|
|
1084
|
+
/** POST /image-test 请求:测一个生图接口的连通性与延迟(不落盘)。 */
|
|
1085
|
+
export interface ImageTestRequest {
|
|
1086
|
+
/** OpenAI 兼容生图接口地址。 */
|
|
1087
|
+
baseURL: string;
|
|
1088
|
+
/** API Key。 */
|
|
1089
|
+
apiKey: string;
|
|
1090
|
+
/** 模型 id(顺带校验是否在接口模型列表里,可选)。 */
|
|
1091
|
+
model?: string;
|
|
1092
|
+
}
|
|
1093
|
+
/** POST /image-test 响应。 */
|
|
1094
|
+
export interface ImageTestResponse {
|
|
1095
|
+
ok: boolean;
|
|
1096
|
+
/** 连通延迟(毫秒)。 */
|
|
1097
|
+
ms?: number;
|
|
1098
|
+
/** 失败原因。 */
|
|
1099
|
+
message?: string;
|
|
1100
|
+
/** 模型 id 是否出现在接口的模型列表(探测成功时才有)。 */
|
|
1101
|
+
modelFound?: boolean;
|
|
1102
|
+
}
|
|
1103
|
+
/** POST /llm-test 请求:对选中的提供商/模型发一次最小真实调用。 */
|
|
1104
|
+
export interface LlmTestRequest {
|
|
1105
|
+
provider: string;
|
|
1106
|
+
model: string;
|
|
1107
|
+
}
|
|
1108
|
+
/** POST /llm-test 响应。 */
|
|
1109
|
+
export interface LlmTestResponse {
|
|
1110
|
+
ok: boolean;
|
|
1111
|
+
/** 连通延迟(毫秒)。 */
|
|
1112
|
+
ms?: number;
|
|
1113
|
+
/** 失败原因(已映射为人话)。 */
|
|
1114
|
+
message?: string;
|
|
1115
|
+
/** 稳定错误码(LlmError code),便于排查。 */
|
|
1116
|
+
code?: string;
|
|
1117
|
+
}
|
|
1118
|
+
/** POST /roles 响应。 */
|
|
1119
|
+
export interface RolesResponse {
|
|
1120
|
+
roles: RoleRecord[];
|
|
1121
|
+
/** op=extract 时的 AI 候选角色。 */
|
|
1122
|
+
candidates?: RoleRecord[];
|
|
1123
|
+
/** op=visual 时的动漫形象描述词(已写入角色卡)。 */
|
|
1124
|
+
visual?: RoleRecord['imagePrompt'];
|
|
1125
|
+
/** op=promptKit 时的四类提示词精修包(已写入角色卡)。 */
|
|
1126
|
+
promptKit?: RoleRecord['promptKit'];
|
|
1127
|
+
/** op=image 时的角色参考图 dataURL。 */
|
|
1128
|
+
imageUrl?: string;
|
|
1129
|
+
}
|
|
1130
|
+
/** POST /bible/patch 请求:局部修补道藏。 */
|
|
1131
|
+
export interface BiblePatchRequest {
|
|
1132
|
+
worldRules?: string[];
|
|
1133
|
+
redLines?: string[];
|
|
1134
|
+
style?: string[];
|
|
1135
|
+
/** 角色卡整体替换(人物志编辑知情度等)。 */
|
|
1136
|
+
characters?: CharacterCard[];
|
|
1137
|
+
}
|
|
1138
|
+
/** POST /blurb 请求:AI 生成/补全或手动保存小说简介。 */
|
|
1139
|
+
export interface BlurbRequest {
|
|
1140
|
+
action: 'generate' | 'save';
|
|
1141
|
+
/** 已写好的开头(AI 补全时使用;留空 = 全量生成)。 */
|
|
1142
|
+
partial?: string;
|
|
1143
|
+
/** 手动保存的完整简介(action=save 时)。 */
|
|
1144
|
+
text?: string;
|
|
1145
|
+
}
|
|
1146
|
+
/** POST /chapter/check|save 请求:审查/保存手动编辑的正文。 */
|
|
1147
|
+
export interface ChapterTextRequest {
|
|
1148
|
+
chapterNo: number;
|
|
1149
|
+
/** 当前编辑中的正文全文。 */
|
|
1150
|
+
text: string;
|
|
1151
|
+
/** 保存时携带:已在工作区审查过的报告(沿用落盘,不重复审);缺省则保存后自动正式审稿一次。 */
|
|
1152
|
+
report?: ReviewReport;
|
|
1153
|
+
/** 审查/验证时携带:上一轮审稿报告。传入后进入「验证模式」——逐条核对原意见是否解决、
|
|
1154
|
+
* 只挑新增 high,不再全新找茬(防止"越修 high 越多")。 */
|
|
1155
|
+
previousReport?: ReviewReport;
|
|
1156
|
+
}
|
|
1157
|
+
/** POST /chapter/save 响应。 */
|
|
1158
|
+
export interface ChapterSaveResponse {
|
|
1159
|
+
ok: boolean;
|
|
1160
|
+
chars: number;
|
|
1161
|
+
file: string;
|
|
1162
|
+
/** 落盘的审稿报告(沿用工作区报告或保存后自动审稿)。 */
|
|
1163
|
+
report?: ReviewReport;
|
|
1164
|
+
}
|
|
1165
|
+
/** POST /cover 请求:上传或移除封面。 */
|
|
1166
|
+
export interface CoverRequest {
|
|
1167
|
+
action: 'upload' | 'remove';
|
|
1168
|
+
/** 上传时:data:image/...;base64,... 格式的图片数据。 */
|
|
1169
|
+
dataUrl?: string;
|
|
1170
|
+
}
|
|
1171
|
+
/** POST /rename 请求:重命名当前书。 */
|
|
1172
|
+
export interface RenameRequest {
|
|
1173
|
+
bookName: string;
|
|
1174
|
+
}
|
|
1175
|
+
/** 大世界:一个境界等级。 */
|
|
1176
|
+
export interface WorldRealm {
|
|
1177
|
+
/** 境界名(练气/筑基/金丹…)。 */
|
|
1178
|
+
name: string;
|
|
1179
|
+
/** 描述:突破条件/寿命/标志等。 */
|
|
1180
|
+
description: string;
|
|
1181
|
+
}
|
|
1182
|
+
/** 大世界:一个地理区域。 */
|
|
1183
|
+
export interface WorldRegion {
|
|
1184
|
+
name: string;
|
|
1185
|
+
description: string;
|
|
1186
|
+
/** 关联势力名(可空)。 */
|
|
1187
|
+
faction?: string;
|
|
1188
|
+
}
|
|
1189
|
+
/** 大世界:一方势力。 */
|
|
1190
|
+
export interface WorldFaction {
|
|
1191
|
+
name: string;
|
|
1192
|
+
/** 类型:宗门/家族/王朝/组织… */
|
|
1193
|
+
kind: string;
|
|
1194
|
+
description: string;
|
|
1195
|
+
/** 驻地区域(可空)。 */
|
|
1196
|
+
region?: string;
|
|
1197
|
+
}
|
|
1198
|
+
/** 大世界结构化数据。 */
|
|
1199
|
+
export interface WorldState {
|
|
1200
|
+
realms: WorldRealm[];
|
|
1201
|
+
regions: WorldRegion[];
|
|
1202
|
+
factions: WorldFaction[];
|
|
1203
|
+
}
|
|
1204
|
+
/** POST /world 请求:AI 提炼或手动保存。 */
|
|
1205
|
+
export interface WorldRequest {
|
|
1206
|
+
action: 'generate' | 'save';
|
|
1207
|
+
/** action=save 时的完整世界数据。 */
|
|
1208
|
+
world?: WorldState;
|
|
1209
|
+
}
|
|
1210
|
+
/** GET /cover 响应:封面的 dataUrl(无封面为 null)。 */
|
|
1211
|
+
export interface CoverResponse {
|
|
1212
|
+
dataUrl: string | null;
|
|
1213
|
+
}
|
|
1214
|
+
/** The persisted project: outline + bible + plan + progress. */
|
|
1215
|
+
export interface ProjectState {
|
|
1216
|
+
/** Book title (first non-empty line of the outline, usually). */
|
|
1217
|
+
bookName: string;
|
|
1218
|
+
/** Full outline text (docx-extracted or pasted). */
|
|
1219
|
+
outline: string;
|
|
1220
|
+
/** Source outline path when loaded from a docx. */
|
|
1221
|
+
outlinePath?: string;
|
|
1222
|
+
/** Structured story bible (worldbuilding), if generated. */
|
|
1223
|
+
bible?: StoryBible;
|
|
1224
|
+
/** Volumes, if planned. */
|
|
1225
|
+
volumes?: Volume[];
|
|
1226
|
+
/** Chapter plan. */
|
|
1227
|
+
chapters: ChapterPlan[];
|
|
1228
|
+
/** Foreshadowing threads. */
|
|
1229
|
+
foreshadows: Foreshadow[];
|
|
1230
|
+
/** 写作资产(题材基底/推进模式/反AI规则/写法资产)。 */
|
|
1231
|
+
assets?: ProjectAssets;
|
|
1232
|
+
/** 事实库/时间线:每章生成后抽取,注入后续章节保持一致性。 */
|
|
1233
|
+
facts?: ChapterFact[];
|
|
1234
|
+
/** 小说简介(面向读者的作品门面,AI 生成或手动保存)。 */
|
|
1235
|
+
blurb?: string;
|
|
1236
|
+
/** 封面文件名(相对输出目录,如 cover.png)。 */
|
|
1237
|
+
coverPath?: string;
|
|
1238
|
+
/** 大世界结构化数据(境界体系/区域/势力)。 */
|
|
1239
|
+
world?: WorldState;
|
|
1240
|
+
/** 剧情线(主线/支线/人物线/悬念线)。 */
|
|
1241
|
+
plotlines?: Plotline[];
|
|
1242
|
+
/** 角色库(作者维护 + AI 提炼的主表)。 */
|
|
1243
|
+
roles?: RoleRecord[];
|
|
1244
|
+
/** 漫剧角色库(制作角色投影:从分镜提名导入,独立于小说角色库)。 */
|
|
1245
|
+
mangaRoles?: MangaRoleCard[];
|
|
1246
|
+
/** 短剧精简模式:漫剧角色库按 5-8 上镜角色 / 功能标签 / 关系闭环 / 人设极致化约束。 */
|
|
1247
|
+
shortDramaMode?: boolean;
|
|
1248
|
+
/** 场景库(作者维护 + AI 提炼的主表)。 */
|
|
1249
|
+
scenes?: SceneCard[];
|
|
1250
|
+
/** 道具库:常驻道具(如外卖电动车/外卖箱),统一描述,注入提示词保持跨镜头一致。 */
|
|
1251
|
+
props?: Prop[];
|
|
1252
|
+
/** 视觉世界观规则(生图/生视频必须遵守,从道藏提炼,注入所有提示词)。 */
|
|
1253
|
+
visualRules?: string[];
|
|
1254
|
+
/** 分镜工作台产出(骨架/分镜表,按章持久化,刷新/切换不丢)。 */
|
|
1255
|
+
storyboards?: ChapterStoryboard[];
|
|
1256
|
+
/** 漫剧方案列表(同一本书的多套视觉演绎:基底风格 + 可选滤镜)。 */
|
|
1257
|
+
mangaPlans?: MangaPlan[];
|
|
1258
|
+
/** 人物志:角色当前状态聚合结果(从编年录刷新后存档,打开页面直接显示)。 */
|
|
1259
|
+
roleStatus?: RoleStatusCard[];
|
|
1260
|
+
/** 漫剧分镜结果缓存:章号 → 分镜(持久化,刷新不丢)。 */
|
|
1261
|
+
/** 漫剧分集计划缓存:卷号/0=全书 → 分集计划(持久化,刷新不丢)。 */
|
|
1262
|
+
/** 漫画脚本缓存:章号 → 漫画脚本(持久化,刷新不丢)。 */
|
|
1263
|
+
/** ISO timestamps. */
|
|
1264
|
+
createdAt: string;
|
|
1265
|
+
updatedAt: string;
|
|
1266
|
+
}
|
|
1267
|
+
/** 生图模型配置(模型库条目,可多套并存,启用一条生效)。 */
|
|
1268
|
+
export interface ImageModelConfig {
|
|
1269
|
+
/** 条目 id(本地唯一)。 */
|
|
1270
|
+
id: string;
|
|
1271
|
+
/** 展示名(如「豆包 Seedream」「即梦」)。 */
|
|
1272
|
+
name: string;
|
|
1273
|
+
/** OpenAI 兼容生图接口地址(如 https://ark.cn-beijing.volces.com/api/v3)。 */
|
|
1274
|
+
baseURL: string;
|
|
1275
|
+
/** API Key。 */
|
|
1276
|
+
apiKey: string;
|
|
1277
|
+
/** 生图模型 id(如 doubao-seedream-5-0-pro-260628)。 */
|
|
1278
|
+
model: string;
|
|
1279
|
+
/** 是否启用(同时只启用一条)。 */
|
|
1280
|
+
enabled: boolean;
|
|
1281
|
+
}
|
|
1282
|
+
/** Runtime config surface exposed to the panel (subset of plugin Config). */
|
|
1283
|
+
/** 手动添加的模型库条目(只存插件内,不改 DSH 全局)。 */
|
|
1284
|
+
export interface SavedModel {
|
|
1285
|
+
/** 唯一 id(前端生成的短 id)。 */
|
|
1286
|
+
id: string;
|
|
1287
|
+
/** 展示名(可为空,回退到 model)。 */
|
|
1288
|
+
name: string;
|
|
1289
|
+
/** DSH 提供商路由(如 zai-coding-cn)。 */
|
|
1290
|
+
provider: string;
|
|
1291
|
+
/** 模型 id(如 glm-5.3-flash)。 */
|
|
1292
|
+
model: string;
|
|
1293
|
+
}
|
|
1294
|
+
/** DSH 模型添加:厂商预设(选择厂商,直接填 API Key)。 */
|
|
1295
|
+
export interface LlmVendor {
|
|
1296
|
+
id: string;
|
|
1297
|
+
name: string;
|
|
1298
|
+
/** 该厂商对应的 provider 路由。 */
|
|
1299
|
+
route: string;
|
|
1300
|
+
/** DSH 凭据引用名(写入 .credentials.yaml 的 refs)。 */
|
|
1301
|
+
apiKeyEnv: string;
|
|
1302
|
+
/** 默认模型 id。 */
|
|
1303
|
+
defaultModel: string;
|
|
1304
|
+
/** 建议可选模型 id 列表(下拉 data-list 用)。 */
|
|
1305
|
+
models: string[];
|
|
1306
|
+
/** 内置适配器(如 deepseek-official),无需注册 pi-ai 路由。 */
|
|
1307
|
+
builtin?: boolean;
|
|
1308
|
+
}
|
|
1309
|
+
/** 预置的常见厂商(id=provider 路由;添加模型下拉兜底用,其余厂商由运行时目录动态补充)。 */
|
|
1310
|
+
export declare const LLM_VENDORS: LlmVendor[];
|
|
1311
|
+
/** 运行时厂商目录的一项(添加到模型下拉;由 DSH 的 pi-ai 可配置提供方动态生成)。 */
|
|
1312
|
+
export interface LlmVendorOption {
|
|
1313
|
+
/** provider 路由 id(也是厂商下拉的值)。 */
|
|
1314
|
+
id: string;
|
|
1315
|
+
/** 展示名。 */
|
|
1316
|
+
name: string;
|
|
1317
|
+
/** 建议模型 id(可为空,用户手填)。 */
|
|
1318
|
+
models: string[];
|
|
1319
|
+
/** 已知 DSH 凭据引用名;为空时 host 生成 `PI_AI_<ID>_API_KEY`。 */
|
|
1320
|
+
apiKeyEnv?: string;
|
|
1321
|
+
/** 内置适配器(只写凭据,不注册 pi-ai 路由)。 */
|
|
1322
|
+
builtin?: boolean;
|
|
1323
|
+
}
|
|
1324
|
+
/** GET /llm-vendors 响应。 */
|
|
1325
|
+
export interface LlmVendorsResponse {
|
|
1326
|
+
vendors: LlmVendorOption[];
|
|
1327
|
+
}
|
|
1328
|
+
/** /llm-models 里的一条模型。 */
|
|
1329
|
+
export interface LlmModelOption {
|
|
1330
|
+
id: string;
|
|
1331
|
+
name: string;
|
|
1332
|
+
}
|
|
1333
|
+
/** GET /llm-models?provider=x 响应。 */
|
|
1334
|
+
export interface LlmModelsResponse {
|
|
1335
|
+
models: LlmModelOption[];
|
|
1336
|
+
}
|
|
1337
|
+
/** GET /llm-providers 响应:当前已注册的提供方路由。 */
|
|
1338
|
+
export interface LlmProvidersResponse {
|
|
1339
|
+
providers: {
|
|
1340
|
+
id: string;
|
|
1341
|
+
name: string;
|
|
1342
|
+
}[];
|
|
1343
|
+
}
|
|
1344
|
+
/** POST /llm-remove 请求:移除一个提供方(unset key + 移除 llm-pi-ai 路由)。 */
|
|
1345
|
+
export interface RemoveProviderRequest {
|
|
1346
|
+
provider: string;
|
|
1347
|
+
/** 该提供方对应的 DSH 凭据引用名(用于 unset)。 */
|
|
1348
|
+
apiKeyEnv?: string;
|
|
1349
|
+
}
|
|
1350
|
+
/** POST /llm-remove 响应。 */
|
|
1351
|
+
export interface RemoveProviderResponse {
|
|
1352
|
+
ok: boolean;
|
|
1353
|
+
message?: string;
|
|
1354
|
+
}
|
|
1355
|
+
/** GET /llm-providers 响应:当前已注册的提供方路由。 */
|
|
1356
|
+
export interface LlmProvidersResponse {
|
|
1357
|
+
providers: {
|
|
1358
|
+
id: string;
|
|
1359
|
+
name: string;
|
|
1360
|
+
}[];
|
|
1361
|
+
}
|
|
1362
|
+
/** POST /llm-remove 请求:移除一个提供方(unset key + 移除 llm-pi-ai 路由)。 */
|
|
1363
|
+
export interface RemoveProviderRequest {
|
|
1364
|
+
provider: string;
|
|
1365
|
+
/** 该提供方对应的 DSH 凭据引用名(用于 unset)。 */
|
|
1366
|
+
apiKeyEnv?: string;
|
|
1367
|
+
}
|
|
1368
|
+
/** POST /llm-remove 响应。 */
|
|
1369
|
+
export interface RemoveProviderResponse {
|
|
1370
|
+
ok: boolean;
|
|
1371
|
+
message?: string;
|
|
1372
|
+
}
|
|
1373
|
+
/** POST /llm-add 请求:添加一个模型(厂商直填 key,或自定义路由)。 */
|
|
1374
|
+
export interface AddModelRequest {
|
|
1375
|
+
mode: 'vendor' | 'custom';
|
|
1376
|
+
/** 厂商模式用:provider 路由 id(来自 /llm-vendors)。 */
|
|
1377
|
+
vendor?: string;
|
|
1378
|
+
/** 厂商已知的 DSH 凭据引用名(可选;为空时 host 生成)。 */
|
|
1379
|
+
apiKeyEnv?: string;
|
|
1380
|
+
/** 自定义模式用:provider 路由 id。 */
|
|
1381
|
+
provider?: string;
|
|
1382
|
+
/** 模型 id。 */
|
|
1383
|
+
model: string;
|
|
1384
|
+
/** API Key。 */
|
|
1385
|
+
apiKey: string;
|
|
1386
|
+
/** 展示名(可选)。 */
|
|
1387
|
+
name?: string;
|
|
1388
|
+
/** 自定义模式用:OpenAI 兼容 base URL。 */
|
|
1389
|
+
baseURL?: string;
|
|
1390
|
+
}
|
|
1391
|
+
/** POST /llm-add 响应。 */
|
|
1392
|
+
export interface AddModelResponse {
|
|
1393
|
+
ok: boolean;
|
|
1394
|
+
saved: SavedModel;
|
|
1395
|
+
provider: string;
|
|
1396
|
+
message?: string;
|
|
1397
|
+
}
|
|
1398
|
+
/** 手动添加的模型库条目(只存插件内,不改 DSH 全局)。 */
|
|
1399
|
+
export interface NovelConfig {
|
|
1400
|
+
/** Absolute path of the default docx outline to load. */
|
|
1401
|
+
outlinePath: string;
|
|
1402
|
+
/** Absolute output directory for chapters + project state. */
|
|
1403
|
+
outputDir: string;
|
|
1404
|
+
/** LLM provider route (e.g. deepseek-official). */
|
|
1405
|
+
provider: string;
|
|
1406
|
+
/** LLM model id (e.g. deepseek-v4-flash). */
|
|
1407
|
+
model: string;
|
|
1408
|
+
/** 生成正文用模型(缺省用 model)。 */
|
|
1409
|
+
generateModel?: string;
|
|
1410
|
+
/** 审稿用模型(缺省用 model;建议用更强的 reasoner/pro)。 */
|
|
1411
|
+
reviewModel?: string;
|
|
1412
|
+
/** 全书质检(审计)用模型(缺省用 model)。 */
|
|
1413
|
+
auditModel?: string;
|
|
1414
|
+
/** LLM reasoning effort: off = no thinking; low/high/max = thinking intensity. */
|
|
1415
|
+
reasoningEffort: 'off' | 'low' | 'high' | 'max';
|
|
1416
|
+
/** 分析类任务(提炼/拆书/反推大纲等)的推理档位;默认 low,不受上面写作档位影响。 */
|
|
1417
|
+
analysisReasoning: 'off' | 'low' | 'high' | 'max';
|
|
1418
|
+
/** Target characters per chapter. */
|
|
1419
|
+
chapterChars: number;
|
|
1420
|
+
/** Max output tokens per chapter call. */
|
|
1421
|
+
maxTokens: number;
|
|
1422
|
+
/** Review pass threshold (0-100). */
|
|
1423
|
+
reviewPassScore: number;
|
|
1424
|
+
/** Whether generation auto-runs review after writing. */
|
|
1425
|
+
autoReview: boolean;
|
|
1426
|
+
/** Whether generation auto-runs the author review (hook/continuity/trend) after writing. */
|
|
1427
|
+
autoAuthorReview: boolean;
|
|
1428
|
+
/** 修订/润色产出草稿后是否自动附带一次 AI 审查(工作区显示新稿评分与剩余问题)。 */
|
|
1429
|
+
autoReviewAfterRevise: boolean;
|
|
1430
|
+
/** 生图模型库(多套并存,启用一条生效;旧 imageApiKey/imageApiModel 自动迁移为一条)。 */
|
|
1431
|
+
imageModels?: ImageModelConfig[];
|
|
1432
|
+
/** 运行时生效的生图接口地址(= 启用条目,兼容旧代码读取)。 */
|
|
1433
|
+
imageBaseUrl?: string;
|
|
1434
|
+
/** 运行时生效的生图 API Key(= 启用条目,兼容旧代码读取)。 */
|
|
1435
|
+
imageApiKey?: string;
|
|
1436
|
+
/** 运行时生效的生图模型 id(= 启用条目,兼容旧代码读取)。 */
|
|
1437
|
+
imageApiModel?: string;
|
|
1438
|
+
/** 是否启用生图(= 存在启用条目)。 */
|
|
1439
|
+
imageApiEnabled?: boolean;
|
|
1440
|
+
/** 自定义背景图(URL 或 dataURL 或服务端路径引用;空 = 使用主题默认背景)。 */
|
|
1441
|
+
themeBackground?: string;
|
|
1442
|
+
/** 自定义背景遮罩/模糊强度 0-80(0 = 不遮罩)。 */
|
|
1443
|
+
themeBackgroundBlur?: number;
|
|
1444
|
+
/** 玻璃透明度 0-100(100=当前原样,越小越透,新拟态/黏土可见背景图)。 */
|
|
1445
|
+
themeOpacity?: number;
|
|
1446
|
+
/** 是否启用改编模式(默认关闭;发布后开启)。 */
|
|
1447
|
+
enableAdaptMode?: boolean;
|
|
1448
|
+
/** 手动添加的模型库(「我的模型」条目;只存插件内)。 */
|
|
1449
|
+
savedModels?: SavedModel[];
|
|
1450
|
+
}
|
|
1451
|
+
/** GET /status response. */
|
|
1452
|
+
export interface StatusResponse {
|
|
1453
|
+
config: NovelConfig;
|
|
1454
|
+
/** The persisted project, when one exists in the output dir. */
|
|
1455
|
+
project?: ProjectState;
|
|
1456
|
+
/** Chapter files already on disk (basenames, sorted). */
|
|
1457
|
+
generatedFiles: string[];
|
|
1458
|
+
/** 全书质检实时状态(用于面板/外部读取进度)。 */
|
|
1459
|
+
audit?: AuditStatus;
|
|
1460
|
+
}
|
|
1461
|
+
/** 生产单状态(生产单 = 区间批量生产执行器:计划补足 + 逐章生成 + 被拒分级处理)。 */
|
|
1462
|
+
export interface RunState {
|
|
1463
|
+
runId: string;
|
|
1464
|
+
/** 区间起点(含)。 */
|
|
1465
|
+
startNo: number;
|
|
1466
|
+
/** 区间终点(含)。 */
|
|
1467
|
+
endNo: number;
|
|
1468
|
+
status: 'running' | 'paused' | 'done' | 'stopped' | 'error';
|
|
1469
|
+
/** 当前处理到的章号(已 approved 的章会快进)。 */
|
|
1470
|
+
currentNo: number;
|
|
1471
|
+
stats: {
|
|
1472
|
+
/** 新生成(含审稿)的章数。 */
|
|
1473
|
+
generated: number;
|
|
1474
|
+
/** 被拒后按意见修订并通过的章数。 */
|
|
1475
|
+
revised: number;
|
|
1476
|
+
/** 被拒后豁免通过(无 high)的章数。 */
|
|
1477
|
+
exempted: number;
|
|
1478
|
+
/** error 后重新生成的章数。 */
|
|
1479
|
+
regenerated: number;
|
|
1480
|
+
/** 生成失败的章数。 */
|
|
1481
|
+
error: number;
|
|
1482
|
+
};
|
|
1483
|
+
/** 两轮修订仍不过、保留草稿待人工的章号。 */
|
|
1484
|
+
pendingManual: number[];
|
|
1485
|
+
/** 运行日志(保留最近 300 条)。 */
|
|
1486
|
+
log: Array<{
|
|
1487
|
+
at: string;
|
|
1488
|
+
text: string;
|
|
1489
|
+
}>;
|
|
1490
|
+
startedAt: string;
|
|
1491
|
+
updatedAt: string;
|
|
1492
|
+
error?: string;
|
|
1493
|
+
}
|
|
1494
|
+
/** POST /run/start request. */
|
|
1495
|
+
export interface RunStartRequest {
|
|
1496
|
+
/** 起始章号(默认 1)。 */
|
|
1497
|
+
startNo?: number;
|
|
1498
|
+
/** 结束章号(含;超出计划时自动补计划)。 */
|
|
1499
|
+
endNo?: number;
|
|
1500
|
+
/** 或指定新增章数(从当前最后一章 +1 起)。 */
|
|
1501
|
+
count?: number;
|
|
1502
|
+
}
|
|
1503
|
+
/** POST /run/control request. */
|
|
1504
|
+
export interface RunControlRequest {
|
|
1505
|
+
action: 'pause' | 'resume' | 'stop';
|
|
1506
|
+
}
|
|
1507
|
+
/** POST /load-outline request: either a docx path or raw text. */
|
|
1508
|
+
export interface LoadOutlineRequest {
|
|
1509
|
+
/** Absolute docx path; defaults to the configured outline path. */
|
|
1510
|
+
path?: string;
|
|
1511
|
+
/** Raw outline text (takes precedence over path when present). */
|
|
1512
|
+
text?: string;
|
|
1513
|
+
}
|
|
1514
|
+
/** POST /load-outline response. */
|
|
1515
|
+
export interface LoadOutlineResponse {
|
|
1516
|
+
outline: string;
|
|
1517
|
+
bookName: string;
|
|
1518
|
+
chars: number;
|
|
1519
|
+
path?: string;
|
|
1520
|
+
}
|
|
1521
|
+
/** POST /plan request. */
|
|
1522
|
+
export interface PlanRequest {
|
|
1523
|
+
/** Outline to plan from; defaults to the persisted project's outline. */
|
|
1524
|
+
outline?: string;
|
|
1525
|
+
/** Number of chapters to plan (default: 30). */
|
|
1526
|
+
chapterCount?: number;
|
|
1527
|
+
/** Volume to plan (1-based); when given, plans only that volume's chapters. */
|
|
1528
|
+
volume?: number;
|
|
1529
|
+
}
|
|
1530
|
+
/** POST /plan response. */
|
|
1531
|
+
export interface PlanResponse {
|
|
1532
|
+
chapters: ChapterPlan[];
|
|
1533
|
+
volumes?: Volume[];
|
|
1534
|
+
}
|
|
1535
|
+
/** POST /volumes request/response. */
|
|
1536
|
+
export interface VolumesRequest {
|
|
1537
|
+
/** Outline to split into volumes; defaults to the project outline. */
|
|
1538
|
+
outline?: string;
|
|
1539
|
+
}
|
|
1540
|
+
export interface VolumesResponse {
|
|
1541
|
+
volumes: Volume[];
|
|
1542
|
+
}
|
|
1543
|
+
/** POST /bible request/response. */
|
|
1544
|
+
export interface BibleRequest {
|
|
1545
|
+
/** Outline to extract from; defaults to the project outline. */
|
|
1546
|
+
outline?: string;
|
|
1547
|
+
}
|
|
1548
|
+
export interface BibleResponse {
|
|
1549
|
+
bible: StoryBible;
|
|
1550
|
+
}
|
|
1551
|
+
/** POST /generate request: one chapter of the current project. */
|
|
1552
|
+
export interface GenerateRequest {
|
|
1553
|
+
chapterNo: number;
|
|
1554
|
+
/** When true, skips the auto-review step. */
|
|
1555
|
+
skipReview?: boolean;
|
|
1556
|
+
}
|
|
1557
|
+
/** One NDJSON frame of a generation/review/rewrite stream. */
|
|
1558
|
+
export type JobFrame = {
|
|
1559
|
+
type: 'start';
|
|
1560
|
+
no: number;
|
|
1561
|
+
title: string;
|
|
1562
|
+
} | {
|
|
1563
|
+
type: 'delta';
|
|
1564
|
+
text: string;
|
|
1565
|
+
} | {
|
|
1566
|
+
type: 'progress';
|
|
1567
|
+
chars: number;
|
|
1568
|
+
} | {
|
|
1569
|
+
type: 'done';
|
|
1570
|
+
no: number;
|
|
1571
|
+
file: string;
|
|
1572
|
+
chars: number;
|
|
1573
|
+
title: string;
|
|
1574
|
+
warn?: string;
|
|
1575
|
+
} | {
|
|
1576
|
+
type: 'review';
|
|
1577
|
+
no: number;
|
|
1578
|
+
report: ReviewReport;
|
|
1579
|
+
} | {
|
|
1580
|
+
type: 'author-review';
|
|
1581
|
+
no: number;
|
|
1582
|
+
review: AuthorReview;
|
|
1583
|
+
} | {
|
|
1584
|
+
type: 'author-backfill-done';
|
|
1585
|
+
count: number;
|
|
1586
|
+
} | {
|
|
1587
|
+
type: 'rewritten';
|
|
1588
|
+
no: number;
|
|
1589
|
+
file: string;
|
|
1590
|
+
chars: number;
|
|
1591
|
+
}
|
|
1592
|
+
/** 润色/重写完成,产物作为待确认草稿(尚未覆盖正文)。 */
|
|
1593
|
+
| {
|
|
1594
|
+
type: 'drafted';
|
|
1595
|
+
no: number;
|
|
1596
|
+
chars: number;
|
|
1597
|
+
draft: string;
|
|
1598
|
+
} | {
|
|
1599
|
+
type: 'outline-progress';
|
|
1600
|
+
done: number;
|
|
1601
|
+
total: number;
|
|
1602
|
+
phase: string;
|
|
1603
|
+
} | {
|
|
1604
|
+
type: 'outline-done';
|
|
1605
|
+
outline: string;
|
|
1606
|
+
chars: number;
|
|
1607
|
+
} | {
|
|
1608
|
+
type: 'error';
|
|
1609
|
+
no: number;
|
|
1610
|
+
message: string;
|
|
1611
|
+
};
|
|
1612
|
+
/** POST /review request: review one written chapter. */
|
|
1613
|
+
export interface ReviewRequest {
|
|
1614
|
+
chapterNo: number;
|
|
1615
|
+
}
|
|
1616
|
+
/** POST /rewrite request: rewrite one chapter (optionally per review issues). */
|
|
1617
|
+
export interface RewriteRequest {
|
|
1618
|
+
chapterNo: number;
|
|
1619
|
+
/** Free-form instructions; defaults to fixing the review's high issues. */
|
|
1620
|
+
instructions?: string;
|
|
1621
|
+
/**
|
|
1622
|
+
* 局部修订:正文中的一段原文(无需完全精确,取一个自然段内的片段即可)。
|
|
1623
|
+
* 提供时只重写该段,其余正文保持不变;不提供时整章重写。
|
|
1624
|
+
*/
|
|
1625
|
+
target?: string;
|
|
1626
|
+
}
|
|
1627
|
+
/** POST /polish request: de-AI-ify one chapter. */
|
|
1628
|
+
export interface PolishRequest {
|
|
1629
|
+
chapterNo: number;
|
|
1630
|
+
}
|
|
1631
|
+
/** POST /draft/apply | /draft/discard request: 采纳或放弃待确认草稿。 */
|
|
1632
|
+
export interface DraftDecisionRequest {
|
|
1633
|
+
chapterNo: number;
|
|
1634
|
+
/** apply 时可携带审查报告(沿用结论定状态;不携带则置 written)。 */
|
|
1635
|
+
report?: ReviewReport;
|
|
1636
|
+
}
|
|
1637
|
+
/** POST /summary request: (re)generate a chapter summary. */
|
|
1638
|
+
export interface SummaryRequest {
|
|
1639
|
+
chapterNo: number;
|
|
1640
|
+
}
|
|
1641
|
+
/** POST /foreshadow request: create, update, or AI-suggest foreshadows. */
|
|
1642
|
+
export interface ForeshadowRequest {
|
|
1643
|
+
/** When true, runs the LLM suggestion pass (ignores other fields). */
|
|
1644
|
+
suggest?: boolean;
|
|
1645
|
+
/** When given, updates that foreshadow instead of creating one. */
|
|
1646
|
+
id?: string;
|
|
1647
|
+
description?: string;
|
|
1648
|
+
plantedChapter?: number;
|
|
1649
|
+
targetChapter?: number;
|
|
1650
|
+
status?: Foreshadow['status'];
|
|
1651
|
+
resolvedNote?: string;
|
|
1652
|
+
}
|
|
1653
|
+
export interface ForeshadowResponse {
|
|
1654
|
+
foreshadows: Foreshadow[];
|
|
1655
|
+
}
|
|
1656
|
+
/** GET /chapter response. */
|
|
1657
|
+
export interface ChapterResponse {
|
|
1658
|
+
no: number;
|
|
1659
|
+
title: string;
|
|
1660
|
+
markdown: string;
|
|
1661
|
+
}
|
|
1662
|
+
/** POST /export request/response. */
|
|
1663
|
+
export interface ExportRequest {
|
|
1664
|
+
format: 'txt' | 'md';
|
|
1665
|
+
}
|
|
1666
|
+
export interface ExportResponse {
|
|
1667
|
+
file: string;
|
|
1668
|
+
chars: number;
|
|
1669
|
+
chapters: number;
|
|
1670
|
+
}
|
|
1671
|
+
/** POST /config request: patch any subset of the runtime config. */
|
|
1672
|
+
export interface ConfigPatch {
|
|
1673
|
+
outlinePath?: string;
|
|
1674
|
+
outputDir?: string;
|
|
1675
|
+
provider?: string;
|
|
1676
|
+
model?: string;
|
|
1677
|
+
generateModel?: string;
|
|
1678
|
+
reviewModel?: string;
|
|
1679
|
+
auditModel?: string;
|
|
1680
|
+
reasoningEffort?: 'off' | 'low' | 'high' | 'max';
|
|
1681
|
+
analysisReasoning?: 'off' | 'low' | 'high' | 'max';
|
|
1682
|
+
chapterChars?: number;
|
|
1683
|
+
maxTokens?: number;
|
|
1684
|
+
reviewPassScore?: number;
|
|
1685
|
+
autoReview?: boolean;
|
|
1686
|
+
autoAuthorReview?: boolean;
|
|
1687
|
+
autoReviewAfterRevise?: boolean;
|
|
1688
|
+
imageApiKey?: string;
|
|
1689
|
+
imageApiModel?: string;
|
|
1690
|
+
imageApiEnabled?: boolean;
|
|
1691
|
+
/** 自定义背景图(URL / dataURL / 服务端路径引用)。 */
|
|
1692
|
+
themeBackground?: string;
|
|
1693
|
+
/** 自定义背景遮罩/模糊强度 0-80。 */
|
|
1694
|
+
themeBackgroundBlur?: number;
|
|
1695
|
+
/** 玻璃透明度 0-100(100=当前原样)。 */
|
|
1696
|
+
themeOpacity?: number;
|
|
1697
|
+
enableAdaptMode?: boolean;
|
|
1698
|
+
/** 生图模型库(完整替换保存)。 */
|
|
1699
|
+
imageModels?: ImageModelConfig[];
|
|
1700
|
+
/** 手动添加的模型库(完整替换保存)。 */
|
|
1701
|
+
savedModels?: SavedModel[];
|
|
1702
|
+
}
|
|
1703
|
+
/** One assistant conversation message (persisted per project). */
|
|
1704
|
+
export interface AssistantMessage {
|
|
1705
|
+
role: 'user' | 'assistant' | 'tool';
|
|
1706
|
+
/** Message text (tool messages carry the tool result). */
|
|
1707
|
+
content: string;
|
|
1708
|
+
/** ISO timestamp. */
|
|
1709
|
+
ts: string;
|
|
1710
|
+
/** For tool messages: which tool ran. */
|
|
1711
|
+
tool?: string;
|
|
1712
|
+
}
|
|
1713
|
+
/** POST /assistant request: one user turn. */
|
|
1714
|
+
export interface AssistantRequest {
|
|
1715
|
+
message: string;
|
|
1716
|
+
}
|
|
1717
|
+
/** One NDJSON frame of the assistant stream. */
|
|
1718
|
+
export type AssistantFrame = {
|
|
1719
|
+
type: 'delta';
|
|
1720
|
+
text: string;
|
|
1721
|
+
} | {
|
|
1722
|
+
type: 'tool';
|
|
1723
|
+
name: string;
|
|
1724
|
+
status: 'start' | 'done' | 'error';
|
|
1725
|
+
detail?: string;
|
|
1726
|
+
}
|
|
1727
|
+
/** Live output while a tool runs (e.g. chapter text being generated). */
|
|
1728
|
+
| {
|
|
1729
|
+
type: 'toolDelta';
|
|
1730
|
+
name: string;
|
|
1731
|
+
text: string;
|
|
1732
|
+
} | {
|
|
1733
|
+
type: 'done';
|
|
1734
|
+
} | {
|
|
1735
|
+
type: 'error';
|
|
1736
|
+
message: string;
|
|
1737
|
+
};
|
|
1738
|
+
/** GET /assistant-history response. */
|
|
1739
|
+
export interface AssistantHistoryResponse {
|
|
1740
|
+
messages: AssistantMessage[];
|
|
1741
|
+
}
|
|
1742
|
+
/** 题材基底库:一本书属于哪个阅读市场。树形(题材→子题材→下级)。 */
|
|
1743
|
+
export interface GenreNode {
|
|
1744
|
+
/** 题材名称(标签,如「仙侠修真」「都市异能」)。 */
|
|
1745
|
+
name: string;
|
|
1746
|
+
/** 题材特征、常见爽点、叙事重心或读者期待。 */
|
|
1747
|
+
description: string;
|
|
1748
|
+
/** 子题材。 */
|
|
1749
|
+
children: GenreNode[];
|
|
1750
|
+
}
|
|
1751
|
+
/** 推进模式库:读者为什么继续看下一章。 */
|
|
1752
|
+
export interface ProgressionMode {
|
|
1753
|
+
/** 模式名称(如「升级变强」「经营扩张」「解谜揭露」)。 */
|
|
1754
|
+
name: string;
|
|
1755
|
+
/** 核心驱动力:靠什么制造追读动力。 */
|
|
1756
|
+
driver: string;
|
|
1757
|
+
/** 读者期待:每隔几章获得什么变化或回报。 */
|
|
1758
|
+
readerExpectation: string;
|
|
1759
|
+
/** 常见兑现方式(爽点如何落地)。 */
|
|
1760
|
+
payoffs: string[];
|
|
1761
|
+
/** 节奏风险:最怕什么(重复升级、冲突变弱、谜题拖太久…)。 */
|
|
1762
|
+
risks: string[];
|
|
1763
|
+
/** 主模式或辅助模式。 */
|
|
1764
|
+
primary: boolean;
|
|
1765
|
+
}
|
|
1766
|
+
/** 反 AI 规则:一条「要避免的问题 + 修正方向」。 */
|
|
1767
|
+
export interface AntiAiRule {
|
|
1768
|
+
/** 规则名(如「禁止解释型心理描写」「AI 高频套话」)。 */
|
|
1769
|
+
name: string;
|
|
1770
|
+
/** 要避免的表达问题,具体可检查。 */
|
|
1771
|
+
avoid: string;
|
|
1772
|
+
/** 推荐修正方向。 */
|
|
1773
|
+
fix: string;
|
|
1774
|
+
/** 命中即告警的具体表达模式(用于审稿逐条核对与去 AI 味检测)。 */
|
|
1775
|
+
detectPatterns?: string[];
|
|
1776
|
+
/** 是否内置全局规则(内置规则随插件发布,项目规则为用户自定义)。 */
|
|
1777
|
+
builtin?: boolean;
|
|
1778
|
+
/** 规则类型:forbidden=禁止类(命中即问题)/ encourage=鼓励类(不命中不算错,只作建议)。缺省按名称「鼓励」前缀推断。 */
|
|
1779
|
+
severity?: 'forbidden' | 'encourage';
|
|
1780
|
+
/** 是否启用(缺省 true)。 */
|
|
1781
|
+
enabled?: boolean;
|
|
1782
|
+
/** 作用域(缺省 all)。 */
|
|
1783
|
+
scope?: Array<'writing' | 'review' | 'polish' | 'all'>;
|
|
1784
|
+
}
|
|
1785
|
+
/** 预置写法模板(来自 AI-Novel-Writing-Assistant 内置数据,一键绑定无需样本文本)。 */
|
|
1786
|
+
export interface StyleTemplate {
|
|
1787
|
+
/** 模板 key(如 power-up-escalation)。 */
|
|
1788
|
+
key: string;
|
|
1789
|
+
/** 模板名(如「爽文递进推进流」)。 */
|
|
1790
|
+
name: string;
|
|
1791
|
+
/** 模板说明。 */
|
|
1792
|
+
description: string;
|
|
1793
|
+
/** 分类(如「爽文流」「悬疑流」)。 */
|
|
1794
|
+
category: string;
|
|
1795
|
+
/** 适用题材。 */
|
|
1796
|
+
applicableGenres: string[];
|
|
1797
|
+
/** 叙述规则。 */
|
|
1798
|
+
proseRules: string[];
|
|
1799
|
+
/** 角色/台词规则。 */
|
|
1800
|
+
dialogueRules: string[];
|
|
1801
|
+
/** 语言规则。 */
|
|
1802
|
+
languageRules: string[];
|
|
1803
|
+
/** 节奏规则。 */
|
|
1804
|
+
rhythmRules: string[];
|
|
1805
|
+
/** 该模板默认绑定的反 AI 规则 key(内置规则名)。 */
|
|
1806
|
+
defaultAntiAiRuleKeys: string[];
|
|
1807
|
+
}
|
|
1808
|
+
/** 剧情桥段库:可复用的情节套路/桥段(作者阅读经验沉淀,与书内 Plotline 不同层)。 */
|
|
1809
|
+
export interface PlotBeatTemplate {
|
|
1810
|
+
/** 模板 key(如 face-slap / exit-wedding)。 */
|
|
1811
|
+
key: string;
|
|
1812
|
+
/** 桥段名(如「打脸」「退婚」)。 */
|
|
1813
|
+
name: string;
|
|
1814
|
+
/** 分类(如「装逼打脸」「身份逆袭」)。 */
|
|
1815
|
+
category: string;
|
|
1816
|
+
/** 一句话说明。 */
|
|
1817
|
+
summary: string;
|
|
1818
|
+
/** 适用位置(开局/前期/中期/后期/高潮/结尾)。 */
|
|
1819
|
+
position: string;
|
|
1820
|
+
/** 前置条件。 */
|
|
1821
|
+
preconditions: string[];
|
|
1822
|
+
/** 爽点来源。 */
|
|
1823
|
+
payoffSource: string[];
|
|
1824
|
+
/** 常用组合(可搭配的桥段)。 */
|
|
1825
|
+
combos: string[];
|
|
1826
|
+
/** 禁忌(别用烂/别用死)。 */
|
|
1827
|
+
taboos: string[];
|
|
1828
|
+
/** 适用题材。 */
|
|
1829
|
+
applicableGenres: string[];
|
|
1830
|
+
}
|
|
1831
|
+
/** 写法引擎:从样本文本提取的叙事风格资产。 */
|
|
1832
|
+
export interface StyleAsset {
|
|
1833
|
+
/** 资产名(如「林越式痞坏」「冷峻猎手风」)。 */
|
|
1834
|
+
name: string;
|
|
1835
|
+
/** 叙述视角与句式节奏。 */
|
|
1836
|
+
proseRules: string[];
|
|
1837
|
+
/** 角色台词风格。 */
|
|
1838
|
+
dialogueRules: string[];
|
|
1839
|
+
/** 描写密度与情绪表达。 */
|
|
1840
|
+
descriptionRules: string[];
|
|
1841
|
+
/** 表达边界(不要做什么)。 */
|
|
1842
|
+
boundaries: string[];
|
|
1843
|
+
/** 来源样本文本(可空)。 */
|
|
1844
|
+
sourceText?: string;
|
|
1845
|
+
/** 创建时间。 */
|
|
1846
|
+
createdAt: string;
|
|
1847
|
+
}
|
|
1848
|
+
/** 项目写作资产(题材基底 + 推进模式 + 反 AI 规则 + 写法资产)。 */
|
|
1849
|
+
export interface ProjectAssets {
|
|
1850
|
+
/** 本书选用的题材(可以是题材基底库中某节点名)。 */
|
|
1851
|
+
genre?: GenreNode;
|
|
1852
|
+
/** 主推进模式。 */
|
|
1853
|
+
primaryProgression?: ProgressionMode;
|
|
1854
|
+
/** 辅助推进模式。 */
|
|
1855
|
+
auxiliaryProgressions: ProgressionMode[];
|
|
1856
|
+
/** 生效的反 AI 规则(内置 + 自定义)。 */
|
|
1857
|
+
antiAiRules: AntiAiRule[];
|
|
1858
|
+
/** 绑定的写法资产。 */
|
|
1859
|
+
styleAssets: StyleAsset[];
|
|
1860
|
+
/** 资产更新时间。 */
|
|
1861
|
+
updatedAt?: string;
|
|
1862
|
+
}
|
|
1863
|
+
/** GET /assets response(含全局题材库与反 AI 规则库)。 */
|
|
1864
|
+
export interface AssetsResponse {
|
|
1865
|
+
projectAssets: ProjectAssets;
|
|
1866
|
+
/** 全局题材基底库(可复用资产,跨书)。 */
|
|
1867
|
+
genreLibrary: GenreNode[];
|
|
1868
|
+
/** 全局反 AI 规则库(内置默认规则)。 */
|
|
1869
|
+
antiAiLibrary: AntiAiRule[];
|
|
1870
|
+
/** 预置写法模板(一键绑定,无需样本文本)。 */
|
|
1871
|
+
styleTemplates: StyleTemplate[];
|
|
1872
|
+
/** 内置推进模式候选。 */
|
|
1873
|
+
progressionLibrary: ProgressionMode[];
|
|
1874
|
+
/** 内置剧情桥段库(可复用套路)。 */
|
|
1875
|
+
plotBeatLibrary: PlotBeatTemplate[];
|
|
1876
|
+
}
|
|
1877
|
+
/** POST /assets request:更新项目写作资产(部分字段可选)。 */
|
|
1878
|
+
export interface AssetsPatch {
|
|
1879
|
+
genre?: GenreNode;
|
|
1880
|
+
primaryProgression?: ProgressionMode;
|
|
1881
|
+
auxiliaryProgressions?: ProgressionMode[];
|
|
1882
|
+
antiAiRules?: AntiAiRule[];
|
|
1883
|
+
styleAssets?: StyleAsset[];
|
|
1884
|
+
}
|
|
1885
|
+
/** POST /style-engine request:从样本文本提取写法资产。 */
|
|
1886
|
+
export interface StyleEngineRequest {
|
|
1887
|
+
/** 样本文本(风格来源)。 */
|
|
1888
|
+
sampleText: string;
|
|
1889
|
+
/** 资产名(可选,默认「风格资产 N」)。 */
|
|
1890
|
+
name?: string;
|
|
1891
|
+
}
|
|
1892
|
+
/** 作者资产库中一条可跨书复用的资产(笔法/红线/套路/角色模板/世界观模板等)。 */
|
|
1893
|
+
export interface AuthorStyleAsset {
|
|
1894
|
+
/** 稳定 id(本地唯一)。 */
|
|
1895
|
+
id: string;
|
|
1896
|
+
/** 资产名(如「短句快节奏爽文风」「林越式痞坏角色」)。 */
|
|
1897
|
+
name: string;
|
|
1898
|
+
/** 资产类型。 */
|
|
1899
|
+
kind: 'style' | 'antiAi' | 'progression' | 'genre' | 'roleTemplate' | 'worldTemplate' | 'plotBeat' | 'custom';
|
|
1900
|
+
/** 一句话摘要。 */
|
|
1901
|
+
summary: string;
|
|
1902
|
+
/** 资产正文内容(按 kind 约定解读的文本/JSON 描述)。 */
|
|
1903
|
+
content: string;
|
|
1904
|
+
/** 结构化载荷(角色模板/世界观模板等可结构化字段;缺省为 null)。 */
|
|
1905
|
+
structured?: Record<string, unknown>;
|
|
1906
|
+
/** 来源书名(哪本书提炼/收藏而来)。 */
|
|
1907
|
+
sourceBooks: string[];
|
|
1908
|
+
/** 标签。 */
|
|
1909
|
+
tags: string[];
|
|
1910
|
+
/** 来源样本文本(可选)。 */
|
|
1911
|
+
sourceText?: string;
|
|
1912
|
+
/** 创建时间。 */
|
|
1913
|
+
createdAt: string;
|
|
1914
|
+
/** 更新时间。 */
|
|
1915
|
+
updatedAt: string;
|
|
1916
|
+
}
|
|
1917
|
+
/** 作者资产库(跨书总数据):按作者维度聚合的可复用资产。 */
|
|
1918
|
+
export interface AuthorAssetLibrary {
|
|
1919
|
+
/** 货架版本,便于未来迁移。 */
|
|
1920
|
+
version: 1;
|
|
1921
|
+
items: AuthorStyleAsset[];
|
|
1922
|
+
}
|
|
1923
|
+
/** GET /author-assets 响应。 */
|
|
1924
|
+
export interface AuthorAssetsResponse {
|
|
1925
|
+
assets: AuthorAssetLibrary;
|
|
1926
|
+
}
|
|
1927
|
+
/** POST /author-assets/upsert 请求:新增或按 id 更新一条资产。 */
|
|
1928
|
+
export interface AuthorAssetUpsertRequest {
|
|
1929
|
+
asset: AuthorStyleAsset;
|
|
1930
|
+
}
|
|
1931
|
+
/** POST /author-assets/remove 请求:删除一条资产。 */
|
|
1932
|
+
export interface AuthorAssetRemoveRequest {
|
|
1933
|
+
id: string;
|
|
1934
|
+
}
|
|
1935
|
+
/** 改编可改范围的单个维度(矩阵的一行)。 */
|
|
1936
|
+
export interface AdaptationDimension {
|
|
1937
|
+
/** 维度 key(如 realm/name/goldenFinger…)。 */
|
|
1938
|
+
key: string;
|
|
1939
|
+
/** 维度名(如「大世界」「修为体系」「主角名」「金手指」)。 */
|
|
1940
|
+
title: string;
|
|
1941
|
+
/** 可改度:保留 / 可改影响大 / 可改影响小 / 可自由改 / 仅视觉包装。 */
|
|
1942
|
+
mutability: 'locked' | 'big' | 'small' | 'free' | 'visual';
|
|
1943
|
+
/** 原文当前值(从正文提炼,附证据)。 */
|
|
1944
|
+
current: string;
|
|
1945
|
+
/** 该值在正文中的出现证据(章节/频次,可空)。 */
|
|
1946
|
+
evidence?: string;
|
|
1947
|
+
/** AI 建议的候选新值(可空)。 */
|
|
1948
|
+
candidates?: string[];
|
|
1949
|
+
/** 联动影响说明(改了会影响哪些章节/角色/伏笔/术语)。 */
|
|
1950
|
+
impact: string;
|
|
1951
|
+
/** 风险评级。 */
|
|
1952
|
+
risk: 'high' | 'medium' | 'low';
|
|
1953
|
+
}
|
|
1954
|
+
/** POST /adapt/analyze 请求:上传全文做改编分析。 */
|
|
1955
|
+
export interface AdaptAnalyzeRequest {
|
|
1956
|
+
/** 全文文本(优先)。 */
|
|
1957
|
+
text: string;
|
|
1958
|
+
/** 或服务器端全文文件路径。 */
|
|
1959
|
+
filePath?: string;
|
|
1960
|
+
}
|
|
1961
|
+
/** POST /adapt/analyze 响应。 */
|
|
1962
|
+
export interface AdaptAnalyzeResponse {
|
|
1963
|
+
/** 识别书名(文件名推断或正文首行)。 */
|
|
1964
|
+
bookName: string;
|
|
1965
|
+
/** 拆出的章节数。 */
|
|
1966
|
+
chapters: number;
|
|
1967
|
+
/** 反推的初始大纲(可空)。 */
|
|
1968
|
+
outline?: string;
|
|
1969
|
+
/** 可改范围矩阵。 */
|
|
1970
|
+
dimensions: AdaptationDimension[];
|
|
1971
|
+
/** 分析消耗说明。 */
|
|
1972
|
+
note?: string;
|
|
1973
|
+
}
|
|
1974
|
+
/** 一条改编映射(原值 → 新值)。 */
|
|
1975
|
+
export interface AdaptationMapping {
|
|
1976
|
+
/** 原值(如「林尘」「练气」「青云宗」)。 */
|
|
1977
|
+
source: string;
|
|
1978
|
+
/** 新值(如「楚风」「凝元」「天渊阁」)。 */
|
|
1979
|
+
target: string;
|
|
1980
|
+
/** 适用范围。 */
|
|
1981
|
+
scope: 'name' | 'realm' | 'faction' | 'term' | 'other';
|
|
1982
|
+
/** 说明(可空)。 */
|
|
1983
|
+
note?: string;
|
|
1984
|
+
}
|
|
1985
|
+
/** 改编规则:哪些必须保留、哪些允许改、一致性约束。 */
|
|
1986
|
+
export interface AdaptationRules {
|
|
1987
|
+
/** 必须保留的要素(骨架/人物动机/伏笔逻辑/爽点结构…)。 */
|
|
1988
|
+
preserve: string[];
|
|
1989
|
+
/** 允许改变的要素。 */
|
|
1990
|
+
change: string[];
|
|
1991
|
+
/** 改编红线/一致性要求。 */
|
|
1992
|
+
constraints: string[];
|
|
1993
|
+
}
|
|
1994
|
+
/** 一组改编方案(映射表 + 规则 + 联动影响清单)。 */
|
|
1995
|
+
export interface AdaptationProposal {
|
|
1996
|
+
/** 映射表(原→新)。 */
|
|
1997
|
+
mappings: AdaptationMapping[];
|
|
1998
|
+
/** 改编规则。 */
|
|
1999
|
+
rules: AdaptationRules;
|
|
2000
|
+
/** 联动影响清单。 */
|
|
2001
|
+
impacts: Array<{
|
|
2002
|
+
item: string;
|
|
2003
|
+
detail: string;
|
|
2004
|
+
risk: 'high' | 'medium' | 'low';
|
|
2005
|
+
chapters?: number[];
|
|
2006
|
+
}>;
|
|
2007
|
+
}
|
|
2008
|
+
/** POST /adapt/propose 请求:由用户勾选的维度 + 新值生成改编方案。 */
|
|
2009
|
+
export interface AdaptProposeRequest {
|
|
2010
|
+
/** 原文全文(复用,便于 LLM 核对联动影响)。 */
|
|
2011
|
+
text: string;
|
|
2012
|
+
/** 用户确认要改的维度(含原值与新值)。 */
|
|
2013
|
+
selections: Array<{
|
|
2014
|
+
key: string;
|
|
2015
|
+
title: string;
|
|
2016
|
+
current: string;
|
|
2017
|
+
target: string;
|
|
2018
|
+
mutability: string;
|
|
2019
|
+
}>;
|
|
2020
|
+
/** 若已分析过,可携带完整矩阵作为上下文。 */
|
|
2021
|
+
dimensions?: AdaptationDimension[];
|
|
2022
|
+
}
|
|
2023
|
+
/** POST /adapt/propose 响应。 */
|
|
2024
|
+
export interface AdaptProposeResponse {
|
|
2025
|
+
proposal: AdaptationProposal;
|
|
2026
|
+
}
|
|
2027
|
+
/** POST /adapt/execute 请求:执行改编(replace=术语替换;rewrite=逐章 LLM 重写)。 */
|
|
2028
|
+
export interface AdaptExecuteRequest {
|
|
2029
|
+
/** 原文全文。 */
|
|
2030
|
+
text: string;
|
|
2031
|
+
/** 改编映射表。 */
|
|
2032
|
+
mappings: AdaptationMapping[];
|
|
2033
|
+
/** 改编规则(rewrite 模式生效:保留/允许变/红线)。 */
|
|
2034
|
+
rules?: AdaptationRules;
|
|
2035
|
+
/** 执行模式:replace(术语替换)或 rewrite(逐章重写)。 */
|
|
2036
|
+
mode?: 'replace' | 'rewrite';
|
|
2037
|
+
/** rewrite 模式:只重写前 N 章(0/缺省 = 全部,且在 startNo/endNo 窗口内)。 */
|
|
2038
|
+
maxChapters?: number;
|
|
2039
|
+
/** rewrite 模式:起始章号(含,默认 1)。 */
|
|
2040
|
+
startNo?: number;
|
|
2041
|
+
/** rewrite 模式:结束章号(含;0/缺省 = 到全书末尾)。 */
|
|
2042
|
+
endNo?: number;
|
|
2043
|
+
}
|
|
2044
|
+
/** POST /adapt/execute 响应。 */
|
|
2045
|
+
export interface AdaptExecuteResponse {
|
|
2046
|
+
/** 改编后的全文。 */
|
|
2047
|
+
adaptedText: string;
|
|
2048
|
+
/** 执行的映射数。 */
|
|
2049
|
+
mappings: number;
|
|
2050
|
+
/** 命中统计:每条映射的替换次数。 */
|
|
2051
|
+
hits: Array<{
|
|
2052
|
+
source: string;
|
|
2053
|
+
target: string;
|
|
2054
|
+
count: number;
|
|
2055
|
+
}>;
|
|
2056
|
+
/** 执行模式(replace / rewrite)。 */
|
|
2057
|
+
mode?: 'replace' | 'rewrite';
|
|
2058
|
+
/** rewrite 模式的逐章结果(no/title/chars)。 */
|
|
2059
|
+
rewritten?: Array<{
|
|
2060
|
+
no: number;
|
|
2061
|
+
title: string;
|
|
2062
|
+
chars: number;
|
|
2063
|
+
}>;
|
|
2064
|
+
/** rewrite 模式下重写失败、保留原章的章节号。 */
|
|
2065
|
+
skipped?: number[];
|
|
2066
|
+
}
|
|
2067
|
+
/** POST /adapt/rewrite-stream 的 NDJSON 帧(逐章进度 + 结束结果)。 */
|
|
2068
|
+
export type AdaptRewriteFrame = {
|
|
2069
|
+
type: 'progress';
|
|
2070
|
+
completed: number;
|
|
2071
|
+
total: number;
|
|
2072
|
+
no: number;
|
|
2073
|
+
title: string;
|
|
2074
|
+
} | {
|
|
2075
|
+
type: 'done';
|
|
2076
|
+
result: AdaptExecuteResponse;
|
|
2077
|
+
} | {
|
|
2078
|
+
type: 'error';
|
|
2079
|
+
message: string;
|
|
2080
|
+
};
|
|
2081
|
+
/** POST /adapt/save 请求:保存改编全文为新书(原书保留,登记书架)。 */
|
|
2082
|
+
export interface AdaptSaveRequest {
|
|
2083
|
+
/** 改编后的全文。 */
|
|
2084
|
+
text: string;
|
|
2085
|
+
/** 新书名(缺省为「改编新书」;建议用「<原著>·改编版」)。 */
|
|
2086
|
+
bookName?: string;
|
|
2087
|
+
/** 新书输出目录(缺省 ~/.dsh/novels/书名)。 */
|
|
2088
|
+
outputDir?: string;
|
|
2089
|
+
/** 可附带反推大纲(写进新项目,便于后续续写/编辑)。 */
|
|
2090
|
+
outline?: string;
|
|
2091
|
+
}
|
|
2092
|
+
/** POST /adapt/save 响应。 */
|
|
2093
|
+
export interface AdaptSaveResponse {
|
|
2094
|
+
/** 登记后的书架条目。 */
|
|
2095
|
+
book: BookEntry;
|
|
2096
|
+
/** 新书名。 */
|
|
2097
|
+
bookName: string;
|
|
2098
|
+
/** 成功拆出的章节数。 */
|
|
2099
|
+
chapters: number;
|
|
2100
|
+
/** 因内容过短被跳过的章节标题列表。 */
|
|
2101
|
+
skipped: string[];
|
|
2102
|
+
/** 新书输出目录。 */
|
|
2103
|
+
outputDir: string;
|
|
2104
|
+
}
|
|
2105
|
+
/** POST /adapt/materialize 请求:从源全文 + 用户编辑后的改编方案,提炼新书资料并保存为「待写新书」。 */
|
|
2106
|
+
export interface AdaptMaterializeRequest {
|
|
2107
|
+
/** 源书全文。 */
|
|
2108
|
+
text: string;
|
|
2109
|
+
/** 新书名(缺省为「<源书名>·改编版」)。 */
|
|
2110
|
+
bookName?: string;
|
|
2111
|
+
/** 新书输出目录(缺省 ~/.dsh/novels/书名)。 */
|
|
2112
|
+
outputDir?: string;
|
|
2113
|
+
/** 反推大纲(来自分析;缺少时用源文章题兜底)。 */
|
|
2114
|
+
outline?: string;
|
|
2115
|
+
/** 用户编辑后的改编方案(映射表 + 规则)。 */
|
|
2116
|
+
proposal: AdaptationProposal;
|
|
2117
|
+
/** 拟规划章节数(缺省 30,可在前端调整)。 */
|
|
2118
|
+
chapterCount?: number;
|
|
2119
|
+
}
|
|
2120
|
+
/** POST /adapt/materialize 响应:提炼后的新书资料(预览,尚未落盘;保存走 /adapt/materialize-save)。 */
|
|
2121
|
+
export interface AdaptMaterializeResponse {
|
|
2122
|
+
/** 书架条目(仅在已保存时存在;预览阶段为 undefined)。 */
|
|
2123
|
+
book?: BookEntry;
|
|
2124
|
+
/** 新书名。 */
|
|
2125
|
+
bookName: string;
|
|
2126
|
+
/** 改编后总纲。 */
|
|
2127
|
+
outline: string;
|
|
2128
|
+
/** 改编后道藏。 */
|
|
2129
|
+
bible: StoryBible;
|
|
2130
|
+
/** 改编后角色库。 */
|
|
2131
|
+
roles: RoleRecord[];
|
|
2132
|
+
/** 改编后大世界。 */
|
|
2133
|
+
world: WorldState;
|
|
2134
|
+
/** 改编后卷计划。 */
|
|
2135
|
+
volumes: Volume[];
|
|
2136
|
+
/** 改编后章节计划(status=pending)。 */
|
|
2137
|
+
chapters: ChapterPlan[];
|
|
2138
|
+
/** 新书输出目录。 */
|
|
2139
|
+
outputDir: string;
|
|
2140
|
+
}
|
|
2141
|
+
/** POST /adapt/materialize-save 请求:把预览/微调后的新书资料写入并登记书架。 */
|
|
2142
|
+
export interface AdaptMaterializeSaveRequest {
|
|
2143
|
+
/** 新书名(缺省为「改编版」)。 */
|
|
2144
|
+
bookName?: string;
|
|
2145
|
+
/** 新书输出目录(缺省 ~/.dsh/novels/书名)。 */
|
|
2146
|
+
outputDir?: string;
|
|
2147
|
+
/** 改编后总纲。 */
|
|
2148
|
+
outline: string;
|
|
2149
|
+
/** 改编后道藏。 */
|
|
2150
|
+
bible: StoryBible;
|
|
2151
|
+
/** 改编后角色库。 */
|
|
2152
|
+
roles: RoleRecord[];
|
|
2153
|
+
/** 改编后大世界。 */
|
|
2154
|
+
world: WorldState;
|
|
2155
|
+
/** 改编后卷计划。 */
|
|
2156
|
+
volumes: Volume[];
|
|
2157
|
+
/** 改编后章节计划(status=pending)。 */
|
|
2158
|
+
chapters: ChapterPlan[];
|
|
2159
|
+
}
|
|
2160
|
+
/** POST /adapt/materialize-save 响应。 */
|
|
2161
|
+
export interface AdaptMaterializeSaveResponse {
|
|
2162
|
+
/** 登记后的书架条目。 */
|
|
2163
|
+
book: BookEntry;
|
|
2164
|
+
/** 新书名。 */
|
|
2165
|
+
bookName: string;
|
|
2166
|
+
/** 成功写入的章节数。 */
|
|
2167
|
+
chapters: number;
|
|
2168
|
+
/** 新书输出目录。 */
|
|
2169
|
+
outputDir: string;
|
|
2170
|
+
}
|
|
2171
|
+
/** POST /plugin/update 响应:插件自更新结果。 */
|
|
2172
|
+
export interface PluginUpdateResponse {
|
|
2173
|
+
ok: boolean;
|
|
2174
|
+
/** 更新结果说明(成功/失败/环境提示)。 */
|
|
2175
|
+
message: string;
|
|
2176
|
+
}
|