@waterwx/dsh-novel-forge 1.0.0 → 1.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.
Files changed (125) hide show
  1. package/README.md +231 -206
  2. package/lib/client.js +55052 -4393
  3. package/lib/index.js +12013 -2524
  4. package/lib/types/ai-scan.d.ts +36 -0
  5. package/lib/types/assets.d.ts +19 -4
  6. package/lib/types/assistant.d.ts +6 -0
  7. package/lib/types/author-assets.d.ts +25 -0
  8. package/lib/types/bookshelf.d.ts +11 -1
  9. package/lib/types/client/api.d.ts +210 -4
  10. package/lib/types/client/docx.d.ts +2 -0
  11. package/lib/types/client/index.d.ts +1 -1
  12. package/lib/types/client/llmLive.d.ts +33 -0
  13. package/lib/types/client/locales.d.ts +102 -29
  14. package/lib/types/client/panel/AdaptModeView.d.ts +5 -0
  15. package/lib/types/client/panel/AiTag.d.ts +1 -0
  16. package/lib/types/client/panel/AuthorAssetsView.d.ts +4 -0
  17. package/lib/types/client/panel/AuthorHome.d.ts +34 -0
  18. package/lib/types/client/panel/BookAnalysisView.d.ts +4 -0
  19. package/lib/types/client/panel/CmdPalette.d.ts +12 -0
  20. package/lib/types/client/panel/CreateBookView.d.ts +13 -0
  21. package/lib/types/client/panel/DirectorView.d.ts +7 -0
  22. package/lib/types/client/panel/GlobalAssetLibraryView.d.ts +4 -0
  23. package/lib/types/client/panel/IdeaInspirationView.d.ts +6 -0
  24. package/lib/types/client/panel/ImportModal.d.ts +7 -0
  25. package/lib/types/client/panel/KnowledgeBaseView.d.ts +4 -0
  26. package/lib/types/client/panel/LiveFeedLog.d.ts +8 -0
  27. package/lib/types/client/panel/MarketRadarView.d.ts +5 -0
  28. package/lib/types/client/panel/ModelManager.d.ts +14 -0
  29. package/lib/types/client/panel/NovelPanel.d.ts +6 -1
  30. package/lib/types/client/panel/PageHeader.d.ts +18 -0
  31. package/lib/types/client/panel/ProgressConsole.d.ts +17 -0
  32. package/lib/types/client/panel/ProgressHomeView.d.ts +5 -0
  33. package/lib/types/client/panel/ReaderView.d.ts +8 -0
  34. package/lib/types/client/panel/ReasoningSection.d.ts +10 -0
  35. package/lib/types/client/panel/RunPanel.d.ts +5 -0
  36. package/lib/types/client/panel/SettingsView.d.ts +19 -0
  37. package/lib/types/client/panel/ShelfView.d.ts +24 -0
  38. package/lib/types/client/panel/SubPage.d.ts +27 -0
  39. package/lib/types/client/panel/WorldTab.d.ts +10 -0
  40. package/lib/types/client/panel/helpers.d.ts +10 -0
  41. package/lib/types/client/panel/toast.d.ts +2 -0
  42. package/lib/types/client/panel/views.d.ts +95 -0
  43. package/lib/types/client/run-status.d.ts +19 -0
  44. package/lib/types/client/text.d.ts +9 -0
  45. package/lib/types/docx-core.d.ts +16 -0
  46. package/lib/types/docx.d.ts +2 -3
  47. package/lib/types/engine.d.ts +228 -5
  48. package/lib/types/global-assets.d.ts +6 -0
  49. package/lib/types/index.d.ts +24 -2
  50. package/lib/types/llm-live.d.ts +44 -0
  51. package/lib/types/market-radar-scan.d.ts +19 -0
  52. package/lib/types/market-radar-sources.d.ts +31 -0
  53. package/lib/types/migrate-output.d.ts +25 -0
  54. package/lib/types/novel-context.d.ts +80 -0
  55. package/lib/types/prompt-utils.d.ts +35 -0
  56. package/lib/types/prompting.d.ts +10 -0
  57. package/lib/types/protocol.d.ts +1418 -7
  58. package/lib/types/review-policy.d.ts +97 -0
  59. package/lib/types/routes.d.ts +4 -0
  60. package/lib/types/run.d.ts +34 -0
  61. package/package.json +120 -93
  62. package/scripts/patch-schemastery.mjs +47 -0
  63. package/src/ai-scan.ts +179 -0
  64. package/src/assets.ts +1774 -518
  65. package/src/assistant.ts +915 -568
  66. package/src/author-assets.ts +149 -0
  67. package/src/bookshelf.ts +187 -148
  68. package/src/client/api.ts +675 -289
  69. package/src/client/docx.ts +37 -69
  70. package/src/client/index.ts +3 -1
  71. package/src/client/llmLive.ts +101 -0
  72. package/src/client/locales.ts +418 -271
  73. package/src/client/mount.tsx +1 -1
  74. package/src/client/panel/AdaptModeView.tsx +535 -0
  75. package/src/client/panel/AiTag.tsx +7 -0
  76. package/src/client/panel/AssetsTab.tsx +448 -456
  77. package/src/client/panel/AssistantTab.tsx +339 -188
  78. package/src/client/panel/AuthorAssetsView.tsx +206 -0
  79. package/src/client/panel/AuthorHome.tsx +309 -0
  80. package/src/client/panel/BookAnalysisView.tsx +63 -0
  81. package/src/client/panel/CmdPalette.tsx +102 -0
  82. package/src/client/panel/CreateBookView.tsx +366 -0
  83. package/src/client/panel/DirectorView.tsx +200 -0
  84. package/src/client/panel/GlobalAssetLibraryView.tsx +168 -0
  85. package/src/client/panel/IdeaInspirationView.tsx +76 -0
  86. package/src/client/panel/ImportModal.tsx +303 -0
  87. package/src/client/panel/KnowledgeBaseView.tsx +125 -0
  88. package/src/client/panel/LiveFeedLog.tsx +67 -0
  89. package/src/client/panel/MarketRadarView.tsx +377 -0
  90. package/src/client/panel/ModelManager.tsx +205 -0
  91. package/src/client/panel/NovelPanel.tsx +5374 -2159
  92. package/src/client/panel/PageHeader.tsx +37 -0
  93. package/src/client/panel/ProgressConsole.tsx +63 -0
  94. package/src/client/panel/ReaderView.tsx +306 -0
  95. package/src/client/panel/ReasoningSection.tsx +31 -0
  96. package/src/client/panel/RunPanel.tsx +223 -0
  97. package/src/client/panel/SettingsView.tsx +305 -0
  98. package/src/client/panel/ShelfView.tsx +266 -0
  99. package/src/client/panel/SubPage.tsx +42 -0
  100. package/src/client/panel/WorldTab.tsx +202 -0
  101. package/src/client/panel/helpers.ts +50 -0
  102. package/src/client/panel/panel.module.css +5764 -1698
  103. package/src/client/panel/toast.ts +51 -0
  104. package/src/client/panel/views.tsx +401 -0
  105. package/src/client/run-status.ts +143 -0
  106. package/src/client/sidebar-entry.ts +1 -1
  107. package/src/client/text.ts +28 -0
  108. package/src/docx-core.ts +53 -0
  109. package/src/docx.ts +44 -83
  110. package/src/engine.ts +4155 -1233
  111. package/src/global-assets.ts +59 -0
  112. package/src/index.ts +311 -184
  113. package/src/llm-live.ts +68 -0
  114. package/src/market-radar-scan.ts +41 -0
  115. package/src/market-radar-sources.ts +173 -0
  116. package/src/migrate-output.ts +76 -0
  117. package/src/novel-context.ts +286 -0
  118. package/src/prompting.ts +26 -0
  119. package/src/protocol.ts +2046 -623
  120. package/src/review-policy.ts +161 -0
  121. package/src/routes.ts +3391 -1172
  122. package/src/run.ts +341 -0
  123. package/lib/client.js.map +0 -1
  124. package/lib/index.js.map +0 -1
  125. package/src/client/panel/BookshelfBar.tsx +0 -170
@@ -4,7 +4,7 @@
4
4
  /** zh dictionary. */
5
5
  export declare const zh: {
6
6
  readonly 'entry.label': "小说工坊";
7
- readonly 'entry.tooltip': "AI 编译小说工作台:大纲 → 设定圣经 → 卷计划 → 章节计划 → 逐章生成+审稿";
7
+ readonly 'entry.tooltip': "AI 编译小说工作台:总纲 → 道藏 → 卷计划 → 章节计划 → 逐章生成+审稿";
8
8
  readonly 'panel.title': "小说工坊";
9
9
  readonly 'common.close': "关闭";
10
10
  readonly 'common.loading': "加载中…";
@@ -13,37 +13,37 @@ export declare const zh: {
13
13
  readonly 'common.success': "成功";
14
14
  readonly 'common.generating': "生成中…";
15
15
  readonly 'common.chars': "字";
16
- readonly 'tab.workflow': "工作流";
17
- readonly 'tab.overview': "大纲";
16
+ readonly 'tab.workflow': "工作台";
17
+ readonly 'tab.overview': "总纲";
18
18
  readonly 'tab.plan': "章节";
19
- readonly 'tab.bible': "设定库";
20
- readonly 'tab.foreshadow': "伏笔";
21
- readonly 'tab.assistant': "AI 助手";
19
+ readonly 'tab.bible': "道藏";
20
+ readonly 'tab.foreshadow': "暗线";
21
+ readonly 'tab.assistant': "AI 编辑 Agent";
22
22
  readonly 'tab.settings': "设置";
23
- readonly 'workflow.title': "创作工作流";
24
- readonly 'workflow.step1': "① 加载大纲";
25
- readonly 'workflow.step2': "② 提炼设定圣经";
23
+ readonly 'workflow.title': "创作工作台";
24
+ readonly 'workflow.step1': "① 加载总纲";
25
+ readonly 'workflow.step2': "② 提炼道藏";
26
26
  readonly 'workflow.step3': "③ 规划卷";
27
27
  readonly 'workflow.step4': "④ 生成章节计划";
28
28
  readonly 'workflow.step5': "⑤ 逐章写作 + AI 审稿";
29
29
  readonly 'workflow.step6': "⑥ 润色 / 导出";
30
- readonly 'workflow.loadOutline': "读取大纲";
31
- readonly 'workflow.genBible': "提炼设定圣经";
30
+ readonly 'workflow.loadOutline': "读取总纲";
31
+ readonly 'workflow.genBible': "提炼道藏";
32
32
  readonly 'workflow.genVolumes': "生成卷计划";
33
33
  readonly 'workflow.genPlan': "生成章节计划";
34
34
  readonly 'workflow.done': "已完成";
35
35
  readonly 'workflow.todo': "待办";
36
- readonly 'workflow.bibleDone': "设定圣经已生成({n} 条规则 / {c} 个角色 / {r} 条红线)";
36
+ readonly 'workflow.bibleDone': "道藏已生成({n} 条规则 / {c} 个人物 / {r} 条红线)";
37
37
  readonly 'workflow.volumesDone': "卷计划已生成({n} 卷)";
38
38
  readonly 'workflow.planDone': "章节计划已生成({n} 章)";
39
- readonly 'workflow.progress': "进度:大纲 ✓ · 设定 {bible} · 卷 {volumes} · 计划 {plan} · 已完成 {done}/{total} 章";
40
- readonly 'overview.loadDocx': "从 docx 读取大纲";
41
- readonly 'overview.loadDocxDefault': "读取默认大纲";
39
+ readonly 'workflow.progress': "进度:总纲 ✓ · 道藏 {bible} · 卷 {volumes} · 计划 {plan} · 已完成 {done}/{total} 章";
40
+ readonly 'overview.loadDocx': "从 docx 读取总纲";
41
+ readonly 'overview.loadDocxDefault': "读取默认总纲";
42
42
  readonly 'overview.loadingOutline': "正在解析 docx…";
43
- readonly 'overview.outlineHint': "大纲文本(可编辑)";
44
- readonly 'overview.outlineChars': "大纲字数";
45
- readonly 'overview.saveOutline': "保存大纲";
46
- readonly 'overview.saved': "大纲已保存";
43
+ readonly 'overview.outlineHint': "总纲文本(可编辑)";
44
+ readonly 'overview.outlineChars': "总纲字数";
45
+ readonly 'overview.saveOutline': "保存总纲";
46
+ readonly 'overview.saved': "总纲已保存";
47
47
  readonly 'overview.bookName': "书名";
48
48
  readonly 'overview.loadCustom': "指定 docx 路径";
49
49
  readonly 'overview.loadCustomHint': "绝对路径,留空使用默认";
@@ -78,17 +78,17 @@ export declare const zh: {
78
78
  readonly 'plan.summary': "章节摘要";
79
79
  readonly 'plan.volumes': "卷";
80
80
  readonly 'plan.noVolume': "未分卷";
81
- readonly 'bible.title': "设定圣经";
82
- readonly 'bible.gen': "AI 提炼设定圣经";
81
+ readonly 'bible.title': "道藏";
82
+ readonly 'bible.gen': "提炼道藏";
83
83
  readonly 'bible.genre': "题材基调";
84
84
  readonly 'bible.worldRules': "世界规则";
85
- readonly 'bible.characters': "角色卡";
85
+ readonly 'bible.characters': "人物志";
86
86
  readonly 'bible.redLines': "写作红线";
87
87
  readonly 'bible.style': "风格要求";
88
- readonly 'bible.none': "尚未生成设定圣经。生成后写作会严格遵守人设与金手指规则,审稿也会按红线检查。";
89
- readonly 'foreshadow.title': "伏笔管理";
90
- readonly 'foreshadow.suggest': "AI 建议伏笔";
91
- readonly 'foreshadow.none': "暂无伏笔";
88
+ readonly 'bible.none': "尚未生成道藏。生成后写作会严格遵守人设与金手指规则,审稿也会按红线检查。";
89
+ readonly 'foreshadow.title': "暗线管理";
90
+ readonly 'foreshadow.suggest': "建议暗线";
91
+ readonly 'foreshadow.none': "暂无暗线";
92
92
  readonly 'foreshadow.status': "状态";
93
93
  readonly 'foreshadow.planned': "计划中";
94
94
  readonly 'foreshadow.planted': "已埋设";
@@ -99,15 +99,88 @@ export declare const zh: {
99
99
  readonly 'foreshadow.plantedAt': "埋设于";
100
100
  readonly 'foreshadow.setPlanted': "标记已埋设";
101
101
  readonly 'foreshadow.setResolved': "标记已回收";
102
+ readonly 'tab.facts': "编年录";
103
+ readonly 'tab.plotlines': "剧情线";
104
+ readonly 'plotlines.hint': "主线/支线/人物线/悬念线的推进管理:章节生成时会注入未完结的线,要求每章至少推进一条;关联章节记录推进节点。";
105
+ readonly 'plotlines.empty': "还没有剧情线——长篇小说建议先建主线与几条支线。";
106
+ readonly 'plotlines.new': "+ 新建剧情线";
107
+ readonly 'plotlines.name': "线名";
108
+ readonly 'plotlines.kind': "类型";
109
+ readonly 'plotlines.kindMain': "主线";
110
+ readonly 'plotlines.kindBranch': "支线";
111
+ readonly 'plotlines.kindCharacter': "人物线";
112
+ readonly 'plotlines.kindMystery': "悬念线";
113
+ readonly 'plotlines.goal': "目标/终点";
114
+ readonly 'plotlines.progress': "当前进度";
115
+ readonly 'plotlines.status': "状态";
116
+ readonly 'plotlines.statusActive': "推进中";
117
+ readonly 'plotlines.statusPaused': "暂停";
118
+ readonly 'plotlines.statusResolved': "已完结";
119
+ readonly 'plotlines.statusAbandoned': "已废弃";
120
+ readonly 'plotlines.save': "保存";
121
+ readonly 'plotlines.cancel': "取消";
122
+ readonly 'plotlines.edit': "编辑";
123
+ readonly 'plotlines.remove': "删除";
124
+ readonly 'plotlines.linkChapter': "关联本章";
125
+ readonly 'plotlines.chapters': "已关联";
126
+ readonly 'plotlines.workflowTitle': "剧情线进度";
127
+ readonly 'plotlines.workflowEmpty': "未建剧情线(去「剧情线」页创建)";
128
+ readonly 'sensitive.title': "敏感词检查";
129
+ readonly 'sensitive.scanAll': " 全书敏感词检查";
130
+ readonly 'sensitive.hint': "内置违禁词库硬匹配(政治/擦边/暴力/辱骂/广告/其他),发布前建议检查;只做提示,是否修改由你判断。";
131
+ readonly 'sensitive.clean': " 未命中任何违禁词(扫描 {n} 章)";
132
+ readonly 'sensitive.hits': "命中 {n} 处({chapters} 章受影响)";
133
+ readonly 'sensitive.goFix': "去修订";
134
+ readonly 'sensitive.fixPrefill': "请删除或替换正文中的违禁表达「{word}」(类别:{category}),用含蓄/间接的写法替代。";
135
+ readonly 'facts.title': "编年录 / 时间线({n} 条)";
136
+ readonly 'facts.hint': "每章生成后自动抽取「已确立事实」(人物状态/境界资源/关系变化/伏笔落地),最近 20 条注入后续章节生成,保证长期一致。";
137
+ readonly 'facts.backfill': "回填历史章节事实";
138
+ readonly 'facts.backfilled': "已从历史章节回填 {n} 条事实";
102
139
  readonly 'settings.title': "设置";
103
140
  readonly 'settings.outlinePath': "默认大纲路径";
104
141
  readonly 'settings.outputDir': "输出目录";
105
142
  readonly 'settings.provider': "模型提供商";
106
143
  readonly 'settings.model': "模型";
144
+ readonly 'settings.modelCustom': "自定义…";
145
+ readonly 'settings.customProvider': "自定义提供商…";
146
+ readonly 'settings.edit': "编辑";
147
+ readonly 'settings.delete': "删除";
148
+ readonly 'settings.modelCustomPlaceholder': "输入任意模型 id";
149
+ readonly 'settings.savedModels': "我的模型";
150
+ readonly 'settings.modelCards': "模型卡片(内置 + 已添加)";
151
+ readonly 'settings.savedModelName': "名称";
152
+ readonly 'settings.addModel': "添加模型";
153
+ readonly 'settings.catalogRefresh': "刷新厂商";
154
+ readonly 'settings.refreshModels': "刷新模型";
155
+ readonly 'settings.savedModelsHint': "手动添加常用模型(provider + 模型 id),点击即可切换当前模型;厂商模式会写入 DSH 凭据并注册路由。";
156
+ readonly 'settings.testConnection': "测试连通";
157
+ readonly 'settings.testRunning': "测试中";
158
+ readonly 'settings.testOk': "连通";
159
+ readonly 'settings.testFail': "失败";
160
+ readonly 'settings.testHint': "真实发送一次最小调用(约几十 token),验证 Key / 端点 / 模型可用。";
161
+ readonly 'settings.reasoningSection': "推理强度";
162
+ readonly 'settings.reasoningEffort': "写作类任务思考强度 (reasoningEffort)";
163
+ readonly 'settings.reasoningHint': "章节生成/润色/重写/审稿等写作任务使用;关掉更省更快。";
164
+ readonly 'settings.analysisReasoning': "分析类任务思考强度(提炼/拆书/反推大纲)";
165
+ readonly 'settings.analysisReasoningHint': "角色/场景/道藏提炼、拆书、反推大纲等一次性分析任务默认 low,保证质量,不受上面写作档位影响。";
166
+ readonly 'settings.reasoning.off': "off · 关闭思考(推荐日常写文)";
167
+ readonly 'settings.reasoning.low': "low · 低思考";
168
+ readonly 'settings.reasoning.high': "high · 高思考";
169
+ readonly 'settings.reasoning.max': "max · 最高思考(质检/推演)";
170
+ readonly 'settings.theme': "主题";
171
+ readonly 'settings.themeLiquid': "iOS 液态玻璃(绿)";
172
+ readonly 'settings.themeNeumorph': "新拟物(双阴影)";
173
+ readonly 'settings.themeHint': "存于浏览器本地,即时生效";
107
174
  readonly 'settings.chapterChars': "每章目标字数";
108
175
  readonly 'settings.maxTokens': "单章最大输出 tokens";
109
176
  readonly 'settings.reviewPassScore': "审稿通过分数(0-100)";
177
+ readonly 'settings.editorFontSize': "编辑器字号(仅编辑页显示)";
178
+ readonly 'settings.editorFontSizeHint': "存于浏览器本地,不影响其他设备";
110
179
  readonly 'settings.autoReview': "生成后自动审稿";
180
+ readonly 'settings.autoAuthorReview': "生成后自动作者复盘";
181
+ readonly 'settings.autoAuthorReviewHint': "复盘钩子兑现/结尾钩子/剧情线推进/连续性/节奏趋势,每章约 2000 token";
182
+ readonly 'settings.autoReviewAfterRevise': "修订后自动审查";
183
+ readonly 'settings.autoReviewAfterReviseHint': "按意见修订/润色产出草稿后自动附带一次 AI 审查,直接显示新稿评分与剩余问题(每章约 2-3k token,可关)";
111
184
  readonly 'settings.save': "保存设置";
112
185
  readonly 'settings.saved': "设置已保存";
113
186
  readonly 'settings.openFolder': "打开输出文件夹";
@@ -122,13 +195,13 @@ export declare const zh: {
122
195
  readonly 'progress.rewriting': "正在修订第 {no} 章…";
123
196
  readonly 'progress.polishing': "正在润色第 {no} 章…";
124
197
  readonly 'progress.empty': "生成/审稿进度将显示在这里";
125
- readonly 'assistant.hint': "和 AI 编辑讨论剧情、人设、伏笔;达成一致后可让它直接修改大纲、设定圣经、章节内容。";
198
+ readonly 'assistant.hint': "和 AI 编辑 Agent 讨论剧情、人设、暗线;达成一致后可让它直接修改总纲、道藏、章节内容。";
126
199
  readonly 'assistant.placeholder': "例如:我想让第 2 章结尾加一个悬念——墟境里传来爷爷的声音…";
127
200
  readonly 'assistant.send': "发送";
128
- readonly 'assistant.toolStart': "⚙ 执行操作:{name}…";
201
+ readonly 'assistant.toolStart': " 执行操作:{name}…";
129
202
  readonly 'assistant.toolDone': "✓ {name} 完成:{detail}";
130
203
  readonly 'assistant.toolError': "✗ {name} 失败:{detail}";
131
- readonly 'assistant.empty': "还没有对话。和 AI 编辑聊聊剧情吧。";
204
+ readonly 'assistant.empty': "还没有对话。和 AI 编辑 Agent 聊聊剧情吧。";
132
205
  readonly 'status.projectNone': "输出目录中还没有项目。请先加载大纲。";
133
206
  readonly 'status.files': "已生成文件";
134
207
  readonly 'api.error': "请求失败";
@@ -0,0 +1,5 @@
1
+ import type { NovelApi } from '../api.ts';
2
+ export declare function AdaptModeView({ api, onOpenBook }: {
3
+ api: NovelApi;
4
+ onOpenBook?: (id: string) => void;
5
+ }): import("react").JSX.Element;
@@ -0,0 +1 @@
1
+ export declare function AiTag(): JSX.Element;
@@ -0,0 +1,4 @@
1
+ import type { NovelApi } from '../api.ts';
2
+ export declare function AuthorAssetsView({ api }: {
3
+ api: NovelApi;
4
+ }): import("react").JSX.Element;
@@ -0,0 +1,34 @@
1
+ import type { NovelApi } from '../api.ts';
2
+ import type { BookshelfSnapshot } from '../../protocol.ts';
3
+ import { type ProgressLine } from './ProgressConsole.tsx';
4
+ export declare function AuthorHome({ api, shelf, onOpenBook, onReadBook, onAddBook, onImportBook, onBackground, progress, busy, busyLabel, liveBar, onClearProgress, onUseIdea, themeMode, themeDensity, onToggleMode, onChangeThemeMode, onChangeThemeDensity }: {
5
+ /** 当前显示模式(顶栏「墨纸 / 纸白」切换用)。 */
6
+ themeMode?: 'system' | 'light' | 'dark';
7
+ /** 当前界面密度。 */
8
+ themeDensity?: 'comfort' | 'compact' | 'spacious';
9
+ /** 切换墨纸 / 纸白(由 NovelPanel 落 localStorage)。 */
10
+ onToggleMode?: () => void;
11
+ /** 改变全局显示模式(联动整个面板)。 */
12
+ onChangeThemeMode: (m: 'system' | 'light' | 'dark') => void;
13
+ /** 改变全局界面密度(联动整个面板)。 */
14
+ onChangeThemeDensity: (d: 'comfort' | 'compact' | 'spacious') => void;
15
+ api: NovelApi;
16
+ shelf: BookshelfSnapshot;
17
+ onOpenBook: (id: string) => void;
18
+ onReadBook: (id: string) => void;
19
+ onAddBook: () => void;
20
+ onImportBook: () => void;
21
+ /** 创意灵感 → 采纳某个灵感带入开书向导。 */
22
+ onUseIdea?: (idea: import('../../protocol.ts').IdeaInspirationResult['ideas'][number]) => void;
23
+ /** 自定义背景变化回调。 */
24
+ onBackground?: (bg: string | undefined, blur: number) => void;
25
+ /** AI 进度实时状态(与书内共享同一份)。 */
26
+ progress?: ProgressLine[];
27
+ busy?: boolean;
28
+ busyLabel?: string;
29
+ liveBar?: {
30
+ text: string;
31
+ ratio?: number;
32
+ } | null;
33
+ onClearProgress?: () => void;
34
+ }): import("react").JSX.Element;
@@ -0,0 +1,4 @@
1
+ import type { NovelApi } from '../api.ts';
2
+ export default function BookAnalysisView({ api }: {
3
+ api: NovelApi;
4
+ }): JSX.Element;
@@ -0,0 +1,12 @@
1
+ import type { ReactElement } from 'react';
2
+ export interface CmdAction {
3
+ icon: string;
4
+ label: string;
5
+ hint?: string;
6
+ run: () => void;
7
+ }
8
+ export declare function CmdPalette({ open, onClose, actions }: {
9
+ open: boolean;
10
+ onClose: () => void;
11
+ actions: CmdAction[];
12
+ }): ReactElement | null;
@@ -0,0 +1,13 @@
1
+ import type { NovelApi } from '../api.ts';
2
+ /** 开书向导页。 */
3
+ export declare function CreateBookView({ api, onBack, onCreated, initialIdea, initialName, }: {
4
+ api: NovelApi;
5
+ /** 返回书架。 */
6
+ onBack: () => void;
7
+ /** 开书成功:进入新书工作台。 */
8
+ onCreated: (id: string) => void;
9
+ /** 从「创意灵感」带过来的起步想法(预填到「一句话想法」输入框)。 */
10
+ initialIdea?: string;
11
+ /** 从「创意灵感」带过来的初始书名。 */
12
+ initialName?: string;
13
+ }): import("react").JSX.Element;
@@ -0,0 +1,7 @@
1
+ import type { NovelApi } from '../api.ts';
2
+ import type { DirectorTodo } from '../../protocol.ts';
3
+ export default function DirectorView({ api, todos, onTodosChange }: {
4
+ api: NovelApi;
5
+ todos: DirectorTodo[];
6
+ onTodosChange?: (todos: DirectorTodo[]) => void;
7
+ }): JSX.Element;
@@ -0,0 +1,4 @@
1
+ import type { NovelApi } from '../api.ts';
2
+ export declare function GlobalAssetLibraryView({ api }: {
3
+ api: NovelApi;
4
+ }): import("react").JSX.Element;
@@ -0,0 +1,6 @@
1
+ import type { NovelApi } from '../api.ts';
2
+ import type { IdeaInspirationResult } from '../../protocol.ts';
3
+ export default function IdeaInspirationView({ api, onUseIdea }: {
4
+ api: NovelApi;
5
+ onUseIdea?: (idea: IdeaInspirationResult['ideas'][number]) => void;
6
+ }): JSX.Element;
@@ -0,0 +1,7 @@
1
+ import type { NovelApi } from '../api.ts';
2
+ export declare function ImportModal({ api, onClose, onImported, }: {
3
+ api: NovelApi;
4
+ onClose: () => void;
5
+ /** 导入成功并已激活该书后回调(刷新书架)。 */
6
+ onImported: () => void | Promise<void>;
7
+ }): import("react").JSX.Element;
@@ -0,0 +1,4 @@
1
+ import type { NovelApi } from '../api.ts';
2
+ export default function KnowledgeBaseView({ api }: {
3
+ api: NovelApi;
4
+ }): JSX.Element;
@@ -0,0 +1,8 @@
1
+ /**
2
+ * 「实时调用 / LIVE」—— 内嵌到 AI 进度窗的下半区(详情层),不再独立浮窗。
3
+ * 连接 /llm-live/stream,按 LLM 调用分组展示模型实时输出。
4
+ *
5
+ * 状态色全部走 panel.module.css 的 .lfPill / .lfDot(主题令牌 + --nf-streaming),
6
+ * 不再内联硬编码色;布局性 inline style 保留(均为令牌引用或动态值)。
7
+ */
8
+ export default function LiveFeedLog(): JSX.Element;
@@ -0,0 +1,5 @@
1
+ import type { NovelApi } from '../api.ts';
2
+ export default function MarketRadarView({ api, bookId }: {
3
+ api: NovelApi;
4
+ bookId?: string;
5
+ }): JSX.Element;
@@ -0,0 +1,14 @@
1
+ import type { NovelApi } from '../api.ts';
2
+ import type { SavedModel } from '../../protocol.ts';
3
+ /** 目录不可用时回退的内置预设(历史行为)。 */
4
+ export declare const FALLBACK_MODEL_PRESETS: readonly ["deepseek-v4-flash", "deepseek-v4-pro", "deepseek-chat", "deepseek-reasoner"];
5
+ export interface ModelManagerProps {
6
+ api: NovelApi;
7
+ provider: string;
8
+ model: string;
9
+ savedModels: SavedModel[];
10
+ onProvider: (provider: string) => void;
11
+ onModel: (model: string) => void;
12
+ onSavedModels: (models: SavedModel[]) => void;
13
+ }
14
+ export declare function ModelManager({ api, provider, model, onProvider, onModel }: ModelManagerProps): JSX.Element;
@@ -1,7 +1,12 @@
1
1
  import type { NovelApi } from '../api.ts';
2
2
  import type { PanelController } from './controller.ts';
3
+ /**
4
+ * 面板宽度低于此值时自动折叠左侧导航。
5
+ * 依据:.panelNav 占 216px,内容区留到 ~680px 才不至于把正文挤成竖排。
6
+ * 宿主中列宽度 ≠ 视口宽度(用户可拖拽侧边栏),所以必须用实测宽度而非媒体查询。
7
+ */
3
8
  /** The panel's tab identifiers. */
4
- export type NovelTab = 'workflow' | 'overview' | 'plan' | 'bible' | 'foreshadow' | 'assistant' | 'settings' | 'characters' | 'assetsGenre' | 'assetsProgression' | 'assetsTemplates' | 'assetsRules' | 'assetsStyle';
9
+ export type NovelTab = 'workflow' | 'overview' | 'blurb' | 'plan' | 'bible' | 'world' | 'foreshadow' | 'assistant' | 'settings' | 'characters' | 'roles' | 'facts' | 'plotlines' | 'reviews' | 'progress' | 'breakdown' | 'director' | 'knowledge' | 'assetsGenre' | 'assetsProgression' | 'assetsTemplates' | 'assetsRules' | 'assetsStyle' | 'run' | 'book' | 'assets';
5
10
  /** Panel shell props. */
6
11
  export interface NovelPanelProps {
7
12
  /** The panel state owner (open/close/toggle). */
@@ -0,0 +1,18 @@
1
+ /** 墨案统一页头:eyebrow(11 大写窄) + 衬线大标题 + 一句说明 + 主/次动作。
2
+ * 每个视图只用一个 PageHeader,消灭"各自为政"的页面标题。
3
+ * 图标用 lucide 16 (单色),标题旁禁止 emoji;标题用衬线 Display(书卷感)。 */
4
+ import type { ReactNode } from 'react';
5
+ export declare function PageHeader({ eyebrow, title, icon, sub, actions, right }: {
6
+ /** 页眉小标(大写窄,可选,如 "BOOKSHELF")。 */
7
+ eyebrow?: string;
8
+ /** 页面大标题(衬线 Display)。 */
9
+ title: string;
10
+ /** lucide 图标(单色,16px),可选。 */
11
+ icon?: ReactNode;
12
+ /** 一句话辅助说明(meta)。 */
13
+ sub?: string;
14
+ /** 右侧主/次按钮组。 */
15
+ actions?: ReactNode;
16
+ /** 标题右上(如 AI 微签)。 */
17
+ right?: ReactNode;
18
+ }): JSX.Element;
@@ -0,0 +1,17 @@
1
+ export interface ProgressLine {
2
+ id: number;
3
+ text: string;
4
+ kind: 'info' | 'done' | 'error';
5
+ live?: boolean;
6
+ ratio?: number;
7
+ }
8
+ export declare function ProgressConsole({ progress, busy, busyLabel, liveBar, onClear }: {
9
+ progress: ProgressLine[];
10
+ busy: boolean;
11
+ busyLabel: string;
12
+ liveBar: {
13
+ text: string;
14
+ ratio?: number;
15
+ } | null;
16
+ onClear: () => void;
17
+ }): import("react").JSX.Element;
@@ -0,0 +1,5 @@
1
+ import type { BookshelfSnapshot } from '../../protocol.ts';
2
+ export declare function ProgressHomeView({ shelf, onOpenBook }: {
3
+ shelf: BookshelfSnapshot;
4
+ onOpenBook: (id: string) => void;
5
+ }): import("react").JSX.Element;
@@ -0,0 +1,8 @@
1
+ import type { NovelApi } from '../api.ts';
2
+ import type { ProjectState } from '../../protocol.ts';
3
+ export declare function ReaderView({ api, project, onBack, onOpenWorkspace, }: {
4
+ api: NovelApi;
5
+ project: ProjectState;
6
+ onBack: () => void;
7
+ onOpenWorkspace: () => void;
8
+ }): import("react").JSX.Element;
@@ -0,0 +1,10 @@
1
+ import type { NovelConfig } from '../../protocol.ts';
2
+ export interface ReasoningSectionProps {
3
+ reasoningEffort: NovelConfig['reasoningEffort'];
4
+ analysisReasoning: NovelConfig['analysisReasoning'];
5
+ onChange: (patch: {
6
+ reasoningEffort?: NovelConfig['reasoningEffort'];
7
+ analysisReasoning?: NovelConfig['analysisReasoning'];
8
+ }) => void;
9
+ }
10
+ export declare function ReasoningSection({ reasoningEffort, analysisReasoning, onChange }: ReasoningSectionProps): JSX.Element;
@@ -0,0 +1,5 @@
1
+ import type { NovelApi } from '../api.ts';
2
+ export declare function RunPanel({ api, totalChapters }: {
3
+ api: NovelApi;
4
+ totalChapters: number;
5
+ }): import("react").JSX.Element;
@@ -0,0 +1,19 @@
1
+ import type { NovelApi } from '../api.ts';
2
+ type SettingsTab = 'model' | 'files' | 'appearance';
3
+ export declare function SettingsView({ api, variant, onSettingsTab, onEditorFontSize, onBackground, themeMode, themeDensity, onChangeThemeMode, onChangeThemeDensity }: {
4
+ api: NovelApi;
5
+ /** page = 全屏 SubPage(保留给旧入口);drawer = 右滑抽屉内容(无壳)。 */
6
+ variant?: 'page' | 'drawer';
7
+ onSettingsTab?: (tab: SettingsTab) => void;
8
+ onEditorFontSize?: (n: number) => void;
9
+ onBackground?: (bg: string | undefined, blur: number) => void;
10
+ /** 全局显示模式(联动整个面板,NovelPanel 落 localStorage)。 */
11
+ themeMode: 'system' | 'light' | 'dark';
12
+ /** 全局界面密度。 */
13
+ themeDensity: 'comfort' | 'compact' | 'spacious';
14
+ /** 改变全局显示模式。 */
15
+ onChangeThemeMode: (m: 'system' | 'light' | 'dark') => void;
16
+ /** 改变全局界面密度。 */
17
+ onChangeThemeDensity: (d: 'comfort' | 'compact' | 'spacious') => void;
18
+ }): import("react").JSX.Element;
19
+ export {};
@@ -0,0 +1,24 @@
1
+ /**
2
+ * 书架首页视图:书卡网格(封面/书名/简介/进度)+ 搜索筛选 + 开书入口。
3
+ * 进入小说工坊默认展示;点击书卡进入该书工作台,+ 进入开书向导页。
4
+ */
5
+ import { type ReactNode } from 'react';
6
+ import type { NovelApi } from '../api.ts';
7
+ import type { BookshelfSnapshot } from '../../protocol.ts';
8
+ /** 书架首页。 */
9
+ export declare function ShelfView({ api, shelf, onOpenBook, onReadBook, onAddBook, onImportBook, onOpenAdapt, toolbarExtra, }: {
10
+ api: NovelApi;
11
+ shelf: BookshelfSnapshot;
12
+ /** 书架工具行右端插槽:组入口按钮由 AuthorHome 下放(创作 / 灵感策划 / 资产)。 */
13
+ toolbarExtra?: ReactNode;
14
+ /** 点击书卡:激活该书并进入工作台。 */
15
+ onOpenBook: (id: string) => void;
16
+ /** 点击「阅读」:激活该书并进入沉浸式阅读页。 */
17
+ onReadBook: (id: string) => void;
18
+ /** 点击+:进入开书向导页。 */
19
+ onAddBook: () => void;
20
+ /** 点击「导入」:打开导入弹窗(已有项目目录 / txt/md 全本)。 */
21
+ onImportBook: () => void;
22
+ /** 点击「改编模式」:进入改编六步向导(入口收在书架页头,与导入并排)。 */
23
+ onOpenAdapt?: () => void;
24
+ }): import("react").JSX.Element;
@@ -0,0 +1,27 @@
1
+ /**
2
+ * 统一子页骨架(1:1 对齐 demo-subpages.html 的 .subpage / .subpage-head / .subpage-body)。
3
+ *
4
+ * 所有作者级与书内子页都应套这层壳:
5
+ * - head:返回钮(可选)+ 大标题 + meta + 右侧操作区
6
+ * - body:页面内容(内部按 demo 用 .card / .box / .grid / .row 等块)
7
+ * 业务逻辑继续留在各自的 View 组件里,这里只负责「壳」。
8
+ */
9
+ import type { ReactNode } from 'react';
10
+ export declare function SubPage(props: {
11
+ /** 页面大标题(衬线 display 档)。 */
12
+ title: string;
13
+ /** 标题右侧的说明行(如「4 本书 · 当前书《X》」)。 */
14
+ meta?: ReactNode;
15
+ /** 返回钮:作者级返回书架,书内返回总编台。 */
16
+ back?: {
17
+ label: string;
18
+ onClick: () => void;
19
+ };
20
+ /** 页头右侧操作区(主 CTA 放最右)。 */
21
+ actions?: ReactNode;
22
+ /** 主题系统局部模式(透传到根 div 的 data-nf-mode,供设置页等预览明暗)。 */
23
+ dataNfMode?: 'light' | 'dark';
24
+ /** 主题系统局部密度(透传到根 div 的 data-nf-density)。 */
25
+ dataNfDensity?: 'comfort' | 'compact' | 'spacious';
26
+ children: ReactNode;
27
+ }): JSX.Element;
@@ -0,0 +1,10 @@
1
+ import type { NovelApi } from '../api.ts';
2
+ import type { WorldState } from '../../protocol.ts';
3
+ /** 大世界页签。 */
4
+ export declare function WorldTab({ api, world, onChanged, }: {
5
+ api: NovelApi;
6
+ /** 当前项目的大世界数据(可能为空)。 */
7
+ world: WorldState | undefined;
8
+ /** 保存/提炼成功后由父组件刷新项目状态。 */
9
+ onChanged: (world: WorldState) => void;
10
+ }): import("react").JSX.Element;
@@ -6,3 +6,13 @@
6
6
  import { type NovelKey } from '../locales.ts';
7
7
  /** Translate one key with optional {placeholder} substitution. */
8
8
  export declare function tt(key: NovelKey, params?: Record<string, string | number>): string;
9
+ /** 角色定位中文名(角色库/提炼候选共用,收敛自多份复制)。 */
10
+ export declare const ROLE_LABELS: Record<string, string>;
11
+ /** 角色定位徽章颜色。 */
12
+ export declare function roleColor(label: string): string;
13
+ /** 剧情线类型中文名(与 locale 对齐)。 */
14
+ export declare function kindLabel(kind: string): string;
15
+ /** 剧情线状态中文名。 */
16
+ export declare function plotlineStatusLabel(status: string): string;
17
+ /** 剧情线状态颜色。 */
18
+ export declare function plotlineStatusColor(status: string): string;
@@ -0,0 +1,2 @@
1
+ /** 弹一条 toast。kind: 'done'(翡翠勾)/ 'error'(红叉)/ 'info'(中性)。 */
2
+ export declare function showToast(text: string, kind?: 'done' | 'error' | 'info'): void;