@waterwx/dsh-novel-forge 1.3.1 → 1.3.2-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 (161) hide show
  1. package/README.md +288 -279
  2. package/lib/client.js +56309 -12221
  3. package/lib/index.js +14239 -5595
  4. package/lib/types/action-guard.d.ts +61 -0
  5. package/lib/types/ai-scan.d.ts +36 -0
  6. package/lib/types/assets.d.ts +24 -9
  7. package/lib/types/assistant.d.ts +29 -0
  8. package/lib/types/author-assets.d.ts +25 -0
  9. package/lib/types/bookshelf.d.ts +11 -1
  10. package/lib/types/client/api.d.ts +186 -10
  11. package/lib/types/client/chip-prefs.d.ts +36 -0
  12. package/lib/types/client/docx.d.ts +2 -0
  13. package/lib/types/client/index.d.ts +1 -1
  14. package/lib/types/client/llmLive.d.ts +31 -0
  15. package/lib/types/client/locales.d.ts +28 -67
  16. package/lib/types/client/panel/AdaptModeView.d.ts +5 -0
  17. package/lib/types/client/panel/AiTag.d.ts +1 -0
  18. package/lib/types/client/panel/AssistantTab.d.ts +4 -1
  19. package/lib/types/client/panel/AuthorAssetsView.d.ts +4 -0
  20. package/lib/types/client/panel/AuthorHome.d.ts +34 -0
  21. package/lib/types/client/panel/BookAnalysisView.d.ts +4 -0
  22. package/lib/types/client/panel/CmdPalette.d.ts +12 -0
  23. package/lib/types/client/panel/CreateBookView.d.ts +5 -1
  24. package/lib/types/client/panel/DirectorView.d.ts +7 -0
  25. package/lib/types/client/panel/GlobalAssetLibraryView.d.ts +4 -0
  26. package/lib/types/client/panel/IdeaInspirationView.d.ts +6 -0
  27. package/lib/types/client/panel/ImportModal.d.ts +7 -0
  28. package/lib/types/client/panel/KnowledgeBaseView.d.ts +4 -0
  29. package/lib/types/client/panel/LiveFeedLog.d.ts +13 -0
  30. package/lib/types/client/panel/MarketRadarView.d.ts +5 -0
  31. package/lib/types/client/panel/ModelManager.d.ts +14 -0
  32. package/lib/types/client/panel/NovelPanel.d.ts +6 -1
  33. package/lib/types/client/panel/PageHeader.d.ts +18 -0
  34. package/lib/types/client/panel/ProgressConsole.d.ts +17 -0
  35. package/lib/types/client/panel/ProgressHomeView.d.ts +5 -0
  36. package/lib/types/client/panel/PromptSlotsView.d.ts +11 -0
  37. package/lib/types/client/panel/ReasoningSection.d.ts +10 -0
  38. package/lib/types/client/panel/SettingsView.d.ts +19 -0
  39. package/lib/types/client/panel/ShelfView.d.ts +12 -1
  40. package/lib/types/client/panel/SubPage.d.ts +27 -0
  41. package/lib/types/client/panel/TensionView.d.ts +18 -0
  42. package/lib/types/client/panel/TimelineView.d.ts +18 -0
  43. package/lib/types/client/panel/helpers.d.ts +5 -3
  44. package/lib/types/client/panel/toast.d.ts +2 -0
  45. package/lib/types/client/panel/views.d.ts +25 -7
  46. package/lib/types/client/run-status.d.ts +21 -0
  47. package/lib/types/client/text.d.ts +9 -0
  48. package/lib/types/docx-core.d.ts +16 -0
  49. package/lib/types/docx.d.ts +2 -3
  50. package/lib/types/engine.d.ts +186 -45
  51. package/lib/types/global-assets.d.ts +6 -0
  52. package/lib/types/index.d.ts +22 -8
  53. package/lib/types/llm-live.d.ts +75 -0
  54. package/lib/types/llm-retry.d.ts +38 -0
  55. package/lib/types/market-radar-scan.d.ts +19 -0
  56. package/lib/types/market-radar-sources.d.ts +31 -0
  57. package/lib/types/migrate-output.d.ts +25 -0
  58. package/lib/types/novel-context.d.ts +80 -0
  59. package/lib/types/prompt-slots.d.ts +57 -0
  60. package/lib/types/prompt-utils.d.ts +35 -0
  61. package/lib/types/prompting.d.ts +10 -0
  62. package/lib/types/protocol.d.ts +1362 -166
  63. package/lib/types/review-policy.d.ts +97 -0
  64. package/lib/types/revision.d.ts +76 -0
  65. package/lib/types/routes.d.ts +4 -0
  66. package/lib/types/run.d.ts +23 -1
  67. package/lib/types/snapshots.d.ts +46 -0
  68. package/lib/types/stage-contract.d.ts +60 -0
  69. package/lib/types/tension.d.ts +53 -0
  70. package/lib/types/timeline.d.ts +37 -0
  71. package/package.json +52 -28
  72. package/src/action-guard.ts +127 -0
  73. package/src/ai-scan.ts +179 -0
  74. package/src/assets.ts +1806 -520
  75. package/src/assistant.ts +1098 -770
  76. package/src/author-assets.ts +149 -0
  77. package/src/bookshelf.ts +187 -151
  78. package/src/client/api.ts +378 -21
  79. package/src/client/chip-prefs.ts +121 -0
  80. package/src/client/docx.ts +37 -69
  81. package/src/client/index.ts +3 -1
  82. package/src/client/llmLive.ts +111 -0
  83. package/src/client/locales.ts +28 -253
  84. package/src/client/mount.tsx +1 -1
  85. package/src/client/panel/AdaptModeView.tsx +535 -0
  86. package/src/client/panel/AiTag.tsx +7 -0
  87. package/src/client/panel/AssetsTab.tsx +448 -458
  88. package/src/client/panel/AssistantTab.tsx +355 -301
  89. package/src/client/panel/AuthorAssetsView.tsx +206 -0
  90. package/src/client/panel/AuthorHome.tsx +309 -0
  91. package/src/client/panel/BookAnalysisView.tsx +63 -0
  92. package/src/client/panel/CmdPalette.tsx +102 -0
  93. package/src/client/panel/CreateBookView.tsx +366 -348
  94. package/src/client/panel/DirectorView.tsx +200 -0
  95. package/src/client/panel/GlobalAssetLibraryView.tsx +168 -0
  96. package/src/client/panel/IdeaInspirationView.tsx +76 -0
  97. package/src/client/panel/ImportModal.tsx +303 -0
  98. package/src/client/panel/KnowledgeBaseView.tsx +125 -0
  99. package/src/client/panel/LiveFeedLog.tsx +204 -0
  100. package/src/client/panel/MarketRadarView.tsx +377 -0
  101. package/src/client/panel/ModelManager.tsx +205 -0
  102. package/src/client/panel/NovelPanel.tsx +3135 -2651
  103. package/src/client/panel/PageHeader.tsx +37 -0
  104. package/src/client/panel/ProgressConsole.tsx +63 -0
  105. package/src/client/panel/PromptSlotsView.tsx +97 -0
  106. package/src/client/panel/ReaderView.tsx +306 -306
  107. package/src/client/panel/ReasoningSection.tsx +31 -0
  108. package/src/client/panel/RunPanel.tsx +64 -32
  109. package/src/client/panel/SettingsView.tsx +354 -0
  110. package/src/client/panel/ShelfView.tsx +266 -236
  111. package/src/client/panel/SubPage.tsx +42 -0
  112. package/src/client/panel/TensionView.tsx +212 -0
  113. package/src/client/panel/TimelineView.tsx +208 -0
  114. package/src/client/panel/WorldTab.tsx +202 -202
  115. package/src/client/panel/helpers.ts +7 -5
  116. package/src/client/panel/panel.module.css +4481 -1655
  117. package/src/client/panel/toast.ts +51 -0
  118. package/src/client/panel/views.tsx +401 -314
  119. package/src/client/run-status.ts +171 -0
  120. package/src/client/sidebar-entry.ts +1 -1
  121. package/src/client/text.ts +28 -0
  122. package/src/docx-core.ts +53 -0
  123. package/src/docx.ts +44 -83
  124. package/src/engine.ts +4672 -2943
  125. package/src/global-assets.ts +59 -0
  126. package/src/index.ts +89 -33
  127. package/src/llm-live.ts +260 -0
  128. package/src/llm-retry.ts +77 -0
  129. package/src/market-radar-scan.ts +41 -0
  130. package/src/market-radar-sources.ts +173 -0
  131. package/src/migrate-output.ts +76 -0
  132. package/src/novel-context.ts +286 -0
  133. package/src/prompt-slots.ts +125 -0
  134. package/src/prompting.ts +26 -0
  135. package/src/protocol.ts +1388 -158
  136. package/src/review-policy.ts +161 -0
  137. package/src/revision.ts +283 -0
  138. package/src/routes.ts +1934 -434
  139. package/src/run.ts +118 -21
  140. package/src/snapshots.ts +174 -0
  141. package/src/stage-contract.ts +189 -0
  142. package/src/tension.ts +251 -0
  143. package/src/timeline.ts +159 -0
  144. package/lib/client.js.map +0 -1
  145. package/lib/index.js.map +0 -1
  146. package/lib/types/comic-presets.d.ts +0 -12
  147. package/scripts/assistant-frames.txt +0 -8
  148. package/scripts/diagnose-adapter.mts +0 -81
  149. package/scripts/diagnose-assistant.mjs +0 -58
  150. package/scripts/diagnose-bible.mjs +0 -72
  151. package/scripts/diagnose-harness.mts +0 -75
  152. package/scripts/novel-forge-restart.log +0 -10
  153. package/scripts/novel-forge-web.stderr.log +0 -2
  154. package/scripts/novel-forge-web.stdout.log +0 -1
  155. package/scripts/outline-sample.txt +0 -449
  156. package/scripts/probe.mjs +0 -6
  157. package/scripts/restart-web.ps1 +0 -88
  158. package/scripts/smoke.mts +0 -72
  159. package/scripts/upload-github.ps1 +0 -51
  160. package/src/client/panel/BookshelfBar.tsx +0 -170
  161. package/src/comic-presets.ts +0 -67
@@ -1,57 +1,36 @@
1
1
  /**
2
- * dsh-novel-forge — locale dictionaries (zh / en).
2
+ * dsh-novel-forge — 面板文案词典(简体中文单语)。
3
+ *
4
+ * 定位说明:小说工坊面板是**中文单语界面**——这里就是全部用户可见文案的唯一定义处,
5
+ * 键位即类型(`NovelKey`),新增文案请同时在此登记,不要散落到组件里硬编码。
6
+ * 文档层(README / docs / CHANGELOG)仍提供英文对照,那是给人读的,不是界面语言。
3
7
  */
4
- /** zh dictionary. */
8
+ /** 面板文案(简体中文)。 */
5
9
  export declare const zh: {
6
10
  readonly 'entry.label': "小说工坊";
7
11
  readonly 'entry.tooltip': "AI 编译小说工作台:总纲 → 道藏 → 卷计划 → 章节计划 → 逐章生成+审稿";
8
- readonly 'panel.title': "小说工坊";
9
12
  readonly 'common.close': "关闭";
10
13
  readonly 'common.loading': "加载中…";
11
- readonly 'common.save': "保存";
12
14
  readonly 'common.error': "错误";
13
- readonly 'common.success': "成功";
14
- readonly 'common.generating': "生成中…";
15
15
  readonly 'common.chars': "字";
16
16
  readonly 'tab.workflow': "工作台";
17
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.assistant': "AI 编辑 Agent";
22
20
  readonly 'tab.settings': "设置";
23
- readonly 'workflow.title': "创作工作台";
24
- readonly 'workflow.step1': "① 加载总纲";
25
- readonly 'workflow.step2': "② 提炼道藏";
26
- readonly 'workflow.step3': "③ 规划卷";
27
- readonly 'workflow.step4': "④ 生成章节计划";
28
- readonly 'workflow.step5': "⑤ 逐章写作 + AI 审稿";
29
- readonly 'workflow.step6': "⑥ 润色 / 导出";
30
- readonly 'workflow.loadOutline': "读取总纲";
31
- readonly 'workflow.genBible': "提炼道藏";
32
21
  readonly 'workflow.genVolumes': "生成卷计划";
33
- readonly 'workflow.genPlan': "生成章节计划";
34
- readonly 'workflow.done': "已完成";
35
- readonly 'workflow.todo': "待办";
36
22
  readonly 'workflow.bibleDone': "道藏已生成({n} 条规则 / {c} 个人物 / {r} 条红线)";
37
23
  readonly 'workflow.volumesDone': "卷计划已生成({n} 卷)";
38
24
  readonly 'workflow.planDone': "章节计划已生成({n} 章)";
39
- readonly 'workflow.progress': "进度:总纲 ✓ · 道藏 {bible} · 卷 {volumes} · 计划 {plan} · 已完成 {done}/{total} 章";
40
- readonly 'overview.loadDocx': "从 docx 读取总纲";
41
- readonly 'overview.loadDocxDefault': "读取默认总纲";
42
25
  readonly 'overview.loadingOutline': "正在解析 docx…";
43
26
  readonly 'overview.outlineHint': "总纲文本(可编辑)";
44
27
  readonly 'overview.outlineChars': "总纲字数";
45
28
  readonly 'overview.saveOutline': "保存总纲";
46
29
  readonly 'overview.saved': "总纲已保存";
47
30
  readonly 'overview.bookName': "书名";
48
- readonly 'overview.loadCustom': "指定 docx 路径";
49
- readonly 'overview.loadCustomHint': "绝对路径,留空使用默认";
50
31
  readonly 'plan.generate': "生成章节计划";
51
32
  readonly 'plan.generateHint': "章节数量";
52
33
  readonly 'plan.count': "章";
53
- readonly 'plan.empty': "暂无章节计划,请先生成";
54
- readonly 'plan.chapter': "章";
55
34
  readonly 'plan.pending': "待生成";
56
35
  readonly 'plan.generating': "生成中";
57
36
  readonly 'plan.written': "待审稿";
@@ -63,23 +42,17 @@ export declare const zh: {
63
42
  readonly 'plan.rewrite': "修订";
64
43
  readonly 'plan.review': "审稿";
65
44
  readonly 'plan.polish': "去AI味";
66
- readonly 'plan.writeAll': "批量生成全部";
67
45
  readonly 'plan.writeAllPending': "批量生成剩余";
68
- readonly 'plan.generated': "已生成";
69
- readonly 'plan.progress': "进度";
70
46
  readonly 'plan.beats': "剧情要点";
71
47
  readonly 'plan.reviewReport': "审稿报告";
72
48
  readonly 'plan.reviewScore': "评分";
73
49
  readonly 'plan.reviewVerdict': "总评";
74
- readonly 'plan.reviewIssues': "问题清单";
75
50
  readonly 'plan.reviewPass': "通过";
76
51
  readonly 'plan.reviewFail': "未通过";
77
- readonly 'plan.approve': "手动通过";
78
52
  readonly 'plan.summary': "章节摘要";
79
53
  readonly 'plan.volumes': "卷";
80
- readonly 'plan.noVolume': "未分卷";
81
54
  readonly 'bible.title': "道藏";
82
- readonly 'bible.gen': "AI 提炼道藏";
55
+ readonly 'bible.gen': "提炼道藏";
83
56
  readonly 'bible.genre': "题材基调";
84
57
  readonly 'bible.worldRules': "世界规则";
85
58
  readonly 'bible.characters': "人物志";
@@ -87,9 +60,8 @@ export declare const zh: {
87
60
  readonly 'bible.style': "风格要求";
88
61
  readonly 'bible.none': "尚未生成道藏。生成后写作会严格遵守人设与金手指规则,审稿也会按红线检查。";
89
62
  readonly 'foreshadow.title': "暗线管理";
90
- readonly 'foreshadow.suggest': "AI 建议暗线";
63
+ readonly 'foreshadow.suggest': "建议暗线";
91
64
  readonly 'foreshadow.none': "暂无暗线";
92
- readonly 'foreshadow.status': "状态";
93
65
  readonly 'foreshadow.planned': "计划中";
94
66
  readonly 'foreshadow.planted': "已埋设";
95
67
  readonly 'foreshadow.progressing': "推进中";
@@ -99,7 +71,6 @@ export declare const zh: {
99
71
  readonly 'foreshadow.plantedAt': "埋设于";
100
72
  readonly 'foreshadow.setPlanted': "标记已埋设";
101
73
  readonly 'foreshadow.setResolved': "标记已回收";
102
- readonly 'tab.facts': "编年录";
103
74
  readonly 'tab.plotlines': "剧情线";
104
75
  readonly 'plotlines.hint': "主线/支线/人物线/悬念线的推进管理:章节生成时会注入未完结的线,要求每章至少推进一条;关联章节记录推进节点。";
105
76
  readonly 'plotlines.empty': "还没有剧情线——长篇小说建议先建主线与几条支线。";
@@ -121,44 +92,42 @@ export declare const zh: {
121
92
  readonly 'plotlines.cancel': "取消";
122
93
  readonly 'plotlines.edit': "编辑";
123
94
  readonly 'plotlines.remove': "删除";
124
- readonly 'plotlines.linkChapter': "关联本章";
125
95
  readonly 'plotlines.chapters': "已关联";
126
- readonly 'plotlines.workflowTitle': "剧情线进度";
127
- readonly 'plotlines.workflowEmpty': "未建剧情线(去「剧情线」页创建)";
128
- readonly 'sensitive.title': "敏感词检查";
129
- readonly 'sensitive.scanAll': "🔞 全书敏感词检查";
96
+ readonly 'sensitive.scanAll': " 全书敏感词检查";
130
97
  readonly 'sensitive.hint': "内置违禁词库硬匹配(政治/擦边/暴力/辱骂/广告/其他),发布前建议检查;只做提示,是否修改由你判断。";
131
- readonly 'sensitive.clean': "✅ 未命中任何违禁词(扫描 {n} 章)";
98
+ readonly 'sensitive.clean': " 未命中任何违禁词(扫描 {n} 章)";
132
99
  readonly 'sensitive.hits': "命中 {n} 处({chapters} 章受影响)";
133
100
  readonly 'sensitive.goFix': "去修订";
134
101
  readonly 'sensitive.fixPrefill': "请删除或替换正文中的违禁表达「{word}」(类别:{category}),用含蓄/间接的写法替代。";
135
102
  readonly 'facts.title': "编年录 / 时间线({n} 条)";
136
103
  readonly 'facts.hint': "每章生成后自动抽取「已确立事实」(人物状态/境界资源/关系变化/伏笔落地),最近 20 条注入后续章节生成,保证长期一致。";
137
104
  readonly 'facts.backfill': "回填历史章节事实";
138
- readonly 'facts.backfilled': "已从历史章节回填 {n} 条事实";
139
- readonly 'settings.title': "设置";
140
- readonly 'settings.outlinePath': "默认大纲路径";
141
105
  readonly 'settings.outputDir': "输出目录";
142
106
  readonly 'settings.provider': "模型提供商";
143
107
  readonly 'settings.model': "模型";
144
108
  readonly 'settings.modelCustom': "自定义…";
109
+ readonly 'settings.customProvider': "自定义提供商…";
110
+ readonly 'settings.edit': "编辑";
111
+ readonly 'settings.delete': "删除";
145
112
  readonly 'settings.modelCustomPlaceholder': "输入任意模型 id";
146
- readonly 'settings.reasoningEffort': "思考强度 (reasoningEffort)";
113
+ readonly 'settings.refreshModels': "刷新模型";
114
+ readonly 'settings.testConnection': "测试连通";
115
+ readonly 'settings.testRunning': "测试中";
116
+ readonly 'settings.testOk': "连通";
117
+ readonly 'settings.testFail': "失败";
118
+ readonly 'settings.testHint': "真实发送一次最小调用(约几十 token),验证 Key / 端点 / 模型可用。";
119
+ readonly 'settings.reasoningSection': "推理强度";
120
+ readonly 'settings.reasoningEffort': "写作类任务思考强度 (reasoningEffort)";
121
+ readonly 'settings.reasoningHint': "章节生成/润色/重写/审稿等写作任务使用;关掉更省更快。";
122
+ readonly 'settings.analysisReasoning': "分析类任务思考强度(提炼/拆书/反推大纲)";
123
+ readonly 'settings.analysisReasoningHint': "角色/场景/道藏提炼、拆书、反推大纲等一次性分析任务默认 low,保证质量,不受上面写作档位影响。";
147
124
  readonly 'settings.reasoning.off': "off · 关闭思考(推荐日常写文)";
148
125
  readonly 'settings.reasoning.low': "low · 低思考";
149
126
  readonly 'settings.reasoning.high': "high · 高思考";
150
127
  readonly 'settings.reasoning.max': "max · 最高思考(质检/推演)";
151
- readonly 'settings.reasoningHint': "off 最快最省;high/max 更慢更贵但推理更强";
152
- readonly 'settings.theme': "主题";
153
- readonly 'settings.themeLiquid': "iOS 液态玻璃(绿)";
154
- readonly 'settings.themeClassic': "经典毛玻璃(蓝)";
155
- readonly 'settings.themeNeumorph': "新拟物(双阴影)";
156
- readonly 'settings.themeHint': "存于浏览器本地,即时生效";
157
128
  readonly 'settings.chapterChars': "每章目标字数";
158
129
  readonly 'settings.maxTokens': "单章最大输出 tokens";
159
130
  readonly 'settings.reviewPassScore': "审稿通过分数(0-100)";
160
- readonly 'settings.editorFontSize': "编辑器字号(仅编辑页显示)";
161
- readonly 'settings.editorFontSizeHint': "存于浏览器本地,不影响其他设备";
162
131
  readonly 'settings.autoReview': "生成后自动审稿";
163
132
  readonly 'settings.autoAuthorReview': "生成后自动作者复盘";
164
133
  readonly 'settings.autoAuthorReviewHint': "复盘钩子兑现/结尾钩子/剧情线推进/连续性/节奏趋势,每章约 2000 token";
@@ -167,7 +136,6 @@ export declare const zh: {
167
136
  readonly 'settings.save': "保存设置";
168
137
  readonly 'settings.saved': "设置已保存";
169
138
  readonly 'settings.openFolder': "打开输出文件夹";
170
- readonly 'settings.export': "导出";
171
139
  readonly 'settings.exportTxt': "导出 TXT";
172
140
  readonly 'settings.exportMd': "导出 Markdown";
173
141
  readonly 'settings.exported': "已导出:{file}({chars} 字,{chapters} 章)";
@@ -177,19 +145,12 @@ export declare const zh: {
177
145
  readonly 'progress.error': "第 {no} 章失败:{message}";
178
146
  readonly 'progress.rewriting': "正在修订第 {no} 章…";
179
147
  readonly 'progress.polishing': "正在润色第 {no} 章…";
180
- readonly 'progress.empty': "生成/审稿进度将显示在这里";
181
- readonly 'assistant.hint': "和 AI 编辑讨论剧情、人设、暗线;达成一致后可让它直接修改总纲、道藏、章节内容。";
148
+ readonly 'assistant.hint': "和 AI 编辑 Agent 讨论剧情、人设、暗线;达成一致后可让它直接修改总纲、道藏、章节内容。";
182
149
  readonly 'assistant.placeholder': "例如:我想让第 2 章结尾加一个悬念——墟境里传来爷爷的声音…";
183
150
  readonly 'assistant.send': "发送";
184
- readonly 'assistant.toolStart': "⚙ 执行操作:{name}…";
185
- readonly 'assistant.toolDone': "✓ {name} 完成:{detail}";
186
- readonly 'assistant.toolError': "✗ {name} 失败:{detail}";
187
- readonly 'assistant.empty': "还没有对话。和 AI 编辑聊聊剧情吧。";
151
+ readonly 'assistant.empty': "还没有对话。和 AI 编辑 Agent 聊聊剧情吧。";
188
152
  readonly 'status.projectNone': "输出目录中还没有项目。请先加载大纲。";
189
153
  readonly 'status.files': "已生成文件";
190
- readonly 'api.error': "请求失败";
191
154
  };
192
- /** en dictionary (fallback). */
193
- export declare const en: Record<string, string>;
194
- /** Keys type for the zh dictionary. */
155
+ /** 面板文案键位(= zh 词典的键)。 */
195
156
  export type NovelKey = keyof typeof zh;
@@ -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;
@@ -1,7 +1,10 @@
1
1
  import type { NovelApi } from '../api.ts';
2
+ import type { StageInfo } from '../../protocol.ts';
2
3
  /** Props. */
3
4
  export interface AssistantTabProps {
4
5
  api: NovelApi;
6
+ /** 宿主算出的创作阶段(/status.stage):让作者在同一屏看到「现在该做什么」。 */
7
+ stage?: StageInfo | null;
5
8
  }
6
9
  /** The assistant conversation tab. */
7
- export declare function AssistantTab({ api }: AssistantTabProps): import("react").JSX.Element;
10
+ export declare function AssistantTab({ api, stage }: AssistantTabProps): import("react").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;
@@ -1,9 +1,13 @@
1
1
  import type { NovelApi } from '../api.ts';
2
2
  /** 开书向导页。 */
3
- export declare function CreateBookView({ api, onBack, onCreated, }: {
3
+ export declare function CreateBookView({ api, onBack, onCreated, initialIdea, initialName, }: {
4
4
  api: NovelApi;
5
5
  /** 返回书架。 */
6
6
  onBack: () => void;
7
7
  /** 开书成功:进入新书工作台。 */
8
8
  onCreated: (id: string) => void;
9
+ /** 从「创意灵感」带过来的起步想法(预填到「一句话想法」输入框)。 */
10
+ initialIdea?: string;
11
+ /** 从「创意灵感」带过来的初始书名。 */
12
+ initialName?: string;
9
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,13 @@
1
+ /**
2
+ * 「实时调用 / LIVE」—— 内嵌到 AI 进度窗的下半区(详情层),不再独立浮窗。
3
+ * 连接 /llm-live/stream,按 LLM 调用分组展示模型实时输出。
4
+ *
5
+ * 除实时输出外,这里还承担两件与「花了多少」有关的事:
6
+ * 1) 每次调用显示 token 用量(输入↑ / 输出↓ / 思考)与耗时、首字耗时;
7
+ * 2) 「查看 Prompt」按 sessionId 拉取这次调用**实际发送**的 system / user。
8
+ * 顶部另有一条「本次运行」累计条(进程内,重启归零)。
9
+ *
10
+ * 状态色全部走 panel.module.css 的 .lfPill / .lfDot(主题令牌 + --nf-streaming),
11
+ * 不再内联硬编码色;布局性 inline style 保留(均为令牌引用或动态值)。
12
+ */
13
+ 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-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' | 'blurb' | 'plan' | 'bible' | 'world' | 'foreshadow' | 'assistant' | 'settings' | 'characters' | 'roles' | 'facts' | 'plotlines' | 'reviews' | 'progress' | 'breakdown' | 'roleImage' | 'scenes' | 'assetsGenre' | 'assetsProgression' | 'assetsTemplates' | 'assetsRules' | 'assetsStyle' | 'run' | 'book' | 'assets';
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,11 @@
1
+ /**
2
+ * 提示词槽位:给作者留几个**安全可改**的位置来微调本书表达偏好。
3
+ *
4
+ * 边界写在界面上:槽位只**追加偏好**,不能覆盖道藏、写作红线、九条内容合规红线、
5
+ * 反 AI 规则与阶段契约 —— 这些由宿主锁定。清空即恢复默认。
6
+ */
7
+ import type { NovelApi } from '../api.ts';
8
+ export interface PromptSlotsViewProps {
9
+ api: NovelApi;
10
+ }
11
+ export default function PromptSlotsView({ api }: PromptSlotsViewProps): 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,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 {};
@@ -1,13 +1,24 @@
1
+ /**
2
+ * 书架首页视图:书卡网格(封面/书名/简介/进度)+ 搜索筛选 + 开书入口。
3
+ * 进入小说工坊默认展示;点击书卡进入该书工作台,+ 进入开书向导页。
4
+ */
5
+ import { type ReactNode } from 'react';
1
6
  import type { NovelApi } from '../api.ts';
2
7
  import type { BookshelfSnapshot } from '../../protocol.ts';
3
8
  /** 书架首页。 */
4
- export declare function ShelfView({ api, shelf, onOpenBook, onReadBook, onAddBook, }: {
9
+ export declare function ShelfView({ api, shelf, onOpenBook, onReadBook, onAddBook, onImportBook, onOpenAdapt, toolbarExtra, }: {
5
10
  api: NovelApi;
6
11
  shelf: BookshelfSnapshot;
12
+ /** 书架工具行右端插槽:组入口按钮由 AuthorHome 下放(创作 / 灵感策划 / 资产)。 */
13
+ toolbarExtra?: ReactNode;
7
14
  /** 点击书卡:激活该书并进入工作台。 */
8
15
  onOpenBook: (id: string) => void;
9
16
  /** 点击「阅读」:激活该书并进入沉浸式阅读页。 */
10
17
  onReadBook: (id: string) => void;
11
18
  /** 点击+:进入开书向导页。 */
12
19
  onAddBook: () => void;
20
+ /** 点击「导入」:打开导入弹窗(已有项目目录 / txt/md 全本)。 */
21
+ onImportBook: () => void;
22
+ /** 点击「改编模式」:进入改编六步向导(入口收在书架页头,与导入并排)。 */
23
+ onOpenAdapt?: () => void;
13
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,18 @@
1
+ /**
2
+ * 张力曲线:把「每章该有多紧」画出来并可逐章调整。
3
+ *
4
+ * 图上是三条线:
5
+ * 参考(虚线,形状预设) / 目标(实线,作者或规划设定) / 实际(散点,审稿打分)。
6
+ * 下方列出规则核对发现的曲线级问题(连续同值、高位不回落、长期低位、实际偏离目标)。
7
+ *
8
+ * 张力只影响写作提示词里的"松紧"指引,不改变任何校验规则。
9
+ */
10
+ import type { NovelApi } from '../api.ts';
11
+ export interface TensionViewProps {
12
+ api: NovelApi;
13
+ /** 一键按建议修订(合并审稿/张力/时间线后改这一章;由父级统一发起)。 */
14
+ onRevise?: (chapterNo: number) => void;
15
+ /** 外部忙碌态(修订进行中时禁用按钮)。 */
16
+ busy?: boolean;
17
+ }
18
+ export default function TensionView({ api, onRevise, busy: outerBusy }: TensionViewProps): JSX.Element;
@@ -0,0 +1,18 @@
1
+ /**
2
+ * 故事时间线:把逐章抽取的「时间点 / 地点 / 在场角色 / 事件」按章节顺序排开,
3
+ * 带规则初筛 + AI 复核的矛盾清单,并支持就地修正(手改后标记为 manual)。
4
+ *
5
+ * 与「编年录」的分工:编年录记事实状态,这里记**顺序**——专门抓时间倒流、
6
+ * 地点瞬移、跨度不合理这类长篇最容易崩的地方。
7
+ */
8
+ import type { NovelApi } from '../api.ts';
9
+ export interface TimelineViewProps {
10
+ api: NovelApi;
11
+ /** 章节号列表(用于「抽取本章」下拉)。 */
12
+ chapters: number[];
13
+ /** 一键按建议修订(合并审稿/时间线/张力后改这一章;由父级统一发起)。 */
14
+ onRevise?: (chapterNo: number) => void;
15
+ /** 外部忙碌态(修订进行中时禁用按钮)。 */
16
+ busy?: boolean;
17
+ }
18
+ export default function TimelineView({ api, chapters, onRevise, busy: outerBusy }: TimelineViewProps): JSX.Element;
@@ -1,7 +1,9 @@
1
1
  /**
2
- * Tiny translation helper for the panel: reads the zh dict with the en dict
3
- * as fallback (the family plugins use a full locale registry; the panel keeps
4
- * a dependency-free helper so the client bundle stays self-contained).
2
+ * Tiny translation helper for the panel.
3
+ *
4
+ * 面板是中文单语界面:文案只在 `locales.ts` 定义一次,这里按类型化键位取值
5
+ * (键位不匹配会在编译期报错),保持客户端 bundle 自包含、不引入运行时语言服务。
6
+ * 需要多语言时再接入 DSH 的 locale 服务,届时只需替换本函数实现。
5
7
  */
6
8
  import { type NovelKey } from '../locales.ts';
7
9
  /** Translate one key with optional {placeholder} substitution. */
@@ -0,0 +1,2 @@
1
+ /** 弹一条 toast。kind: 'done'(翡翠勾)/ 'error'(红叉)/ 'info'(中性)。 */
2
+ export declare function showToast(text: string, kind?: 'done' | 'error' | 'info'): void;