@waterwx/dsh-novel-forge 1.10.1 → 2.0.0
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 +287 -281
- package/lib/client.js +19572 -18127
- package/lib/index.js +12171 -6932
- package/lib/types/action-guard.d.ts +61 -0
- package/lib/types/ai-scan.d.ts +30 -0
- package/lib/types/assets.d.ts +20 -9
- package/lib/types/assistant.d.ts +29 -0
- package/lib/types/author-assets.d.ts +1 -3
- package/lib/types/bookshelf.d.ts +13 -3
- package/lib/types/client/api.d.ts +137 -21
- package/lib/types/client/chip-prefs.d.ts +36 -0
- package/lib/types/client/docx.d.ts +2 -2
- package/lib/types/client/index.d.ts +1 -1
- package/lib/types/client/llmLive.d.ts +31 -0
- package/lib/types/client/locales.d.ts +15 -70
- package/lib/types/client/mount.d.ts +0 -2
- package/lib/types/client/panel/AiTag.d.ts +1 -0
- package/lib/types/client/panel/AssistantTab.d.ts +4 -1
- package/lib/types/client/panel/AuthorHome.d.ts +13 -9
- package/lib/types/client/panel/BookAnalysisView.d.ts +4 -0
- package/lib/types/client/panel/CmdPalette.d.ts +12 -0
- package/lib/types/client/panel/CreateBookView.d.ts +5 -1
- package/lib/types/client/panel/DirectorView.d.ts +7 -0
- package/lib/types/client/panel/IdeaInspirationView.d.ts +6 -0
- package/lib/types/client/panel/KnowledgeBaseView.d.ts +4 -0
- package/lib/types/client/panel/LiveFeedLog.d.ts +13 -0
- package/lib/types/client/panel/MarketRadarView.d.ts +5 -0
- package/lib/types/client/panel/ModelManager.d.ts +2 -2
- package/lib/types/client/panel/NovelPanel.d.ts +6 -1
- package/lib/types/client/panel/PageHeader.d.ts +18 -0
- package/lib/types/client/panel/PromptSlotsView.d.ts +11 -0
- package/lib/types/client/panel/SettingsView.d.ts +12 -7
- package/lib/types/client/panel/ShelfView.d.ts +10 -1
- package/lib/types/client/panel/SubPage.d.ts +27 -0
- package/lib/types/client/panel/TensionView.d.ts +18 -0
- package/lib/types/client/panel/TimelineView.d.ts +18 -0
- package/lib/types/client/panel/helpers.d.ts +5 -3
- package/lib/types/client/panel/market-radar-state.d.ts +56 -0
- package/lib/types/client/panel/toast.d.ts +2 -0
- package/lib/types/client/panel/views.d.ts +21 -35
- package/lib/types/client/run-status.d.ts +21 -0
- package/lib/types/client/sidebar-entry.d.ts +0 -2
- package/lib/types/docx-core.d.ts +16 -0
- package/lib/types/docx.d.ts +2 -3
- package/lib/types/engine.d.ts +83 -79
- package/lib/types/global-assets.d.ts +6 -0
- package/lib/types/home.d.ts +11 -0
- package/lib/types/index.d.ts +27 -13
- package/lib/types/llm-live.d.ts +70 -0
- package/lib/types/llm-retry.d.ts +38 -0
- package/lib/types/market-radar-scan.d.ts +18 -0
- package/lib/types/market-radar-sources.d.ts +31 -0
- package/lib/types/migrate-output.d.ts +25 -0
- package/lib/types/model-capability.d.ts +93 -0
- package/lib/types/novel-context.d.ts +80 -0
- package/lib/types/output-budget.d.ts +86 -0
- package/lib/types/prompt-slots.d.ts +57 -0
- package/lib/types/prompting.d.ts +10 -0
- package/lib/types/protocol.d.ts +829 -522
- package/lib/types/revision.d.ts +76 -0
- package/lib/types/routes.d.ts +9 -3
- package/lib/types/run.d.ts +23 -1
- package/lib/types/settings-persist.d.ts +59 -0
- package/lib/types/snapshots.d.ts +46 -0
- package/lib/types/stage-contract.d.ts +58 -0
- package/lib/types/tension.d.ts +53 -0
- package/lib/types/timeline.d.ts +37 -0
- package/package.json +50 -28
- package/src/action-guard.ts +127 -0
- package/src/ai-scan.ts +155 -0
- package/src/assets.ts +1801 -535
- package/src/assistant.ts +1098 -770
- package/src/author-assets.ts +131 -147
- package/src/bookshelf.ts +193 -167
- package/src/client/api.ts +767 -607
- package/src/client/chip-prefs.ts +121 -0
- package/src/client/docx.ts +32 -69
- package/src/client/index.ts +3 -1
- package/src/client/llmLive.ts +111 -0
- package/src/client/locales.ts +15 -274
- package/src/client/mount.tsx +4 -3
- package/src/client/panel/AdaptModeView.tsx +535 -520
- package/src/client/panel/AiTag.tsx +7 -0
- package/src/client/panel/AssetsTab.tsx +448 -458
- package/src/client/panel/AssistantTab.tsx +355 -301
- package/src/client/panel/AuthorAssetsView.tsx +205 -207
- package/src/client/panel/AuthorHome.tsx +309 -202
- package/src/client/panel/BookAnalysisView.tsx +63 -0
- package/src/client/panel/CmdPalette.tsx +102 -0
- package/src/client/panel/CreateBookView.tsx +366 -352
- package/src/client/panel/DirectorView.tsx +200 -0
- package/src/client/panel/GlobalAssetLibraryView.tsx +168 -172
- package/src/client/panel/IdeaInspirationView.tsx +76 -0
- package/src/client/panel/ImportModal.tsx +302 -302
- package/src/client/panel/KnowledgeBaseView.tsx +125 -0
- package/src/client/panel/LiveFeedLog.tsx +204 -0
- package/src/client/panel/MarketRadarView.tsx +415 -0
- package/src/client/panel/ModelManager.tsx +205 -205
- package/src/client/panel/NovelPanel.tsx +5559 -4655
- package/src/client/panel/PageHeader.tsx +37 -0
- package/src/client/panel/ProgressConsole.tsx +63 -64
- package/src/client/panel/PromptSlotsView.tsx +97 -0
- package/src/client/panel/ReaderView.tsx +306 -306
- package/src/client/panel/RunPanel.tsx +56 -24
- package/src/client/panel/SettingsView.tsx +175 -112
- package/src/client/panel/ShelfView.tsx +63 -39
- package/src/client/panel/SubPage.tsx +42 -0
- package/src/client/panel/TensionView.tsx +212 -0
- package/src/client/panel/TimelineView.tsx +208 -0
- package/src/client/panel/WorldTab.tsx +202 -202
- package/src/client/panel/helpers.ts +7 -5
- package/src/client/panel/market-radar-state.ts +79 -0
- package/src/client/panel/panel.module.css +5767 -4199
- package/src/client/panel/toast.ts +51 -0
- package/src/client/panel/views.tsx +316 -314
- package/src/client/run-status.ts +171 -0
- package/src/client/sidebar-entry.ts +3 -3
- package/src/docx-core.ts +53 -0
- package/src/docx.ts +44 -83
- package/src/engine.ts +1610 -1541
- package/src/global-assets.ts +58 -0
- package/src/home.ts +33 -0
- package/src/index.ts +184 -103
- package/src/llm-live.ts +245 -0
- package/src/llm-retry.ts +77 -0
- package/src/market-radar-scan.ts +35 -0
- package/src/market-radar-sources.ts +173 -0
- package/src/migrate-output.ts +76 -0
- package/src/model-capability.ts +215 -0
- package/src/novel-context.ts +286 -0
- package/src/output-budget.ts +147 -0
- package/src/prompt-slots.ts +125 -0
- package/src/prompting.ts +26 -0
- package/src/protocol.ts +2454 -2148
- package/src/revision.ts +283 -0
- package/src/routes.ts +3795 -3359
- package/src/run.ts +113 -17
- package/src/settings-persist.ts +114 -0
- package/src/snapshots.ts +174 -0
- package/src/stage-contract.ts +186 -0
- package/src/tension.ts +251 -0
- package/src/timeline.ts +159 -0
- package/assets/styles/arcane-thick-3d.webp +0 -0
- package/assets/styles/chinese-ink.webp +0 -0
- package/assets/styles/clay-stopmotion-3d.webp +0 -0
- package/assets/styles/dark-ghibli.webp +0 -0
- package/assets/styles/dark-gothic-3d.webp +0 -0
- package/assets/styles/film-photo.webp +0 -0
- package/assets/styles/guofeng-heavy.webp +0 -0
- package/assets/styles/horror-game-3d.webp +0 -0
- package/assets/styles/japan-cel-dark.webp +0 -0
- package/assets/styles/korean-webtoon.webp +0 -0
- package/assets/styles/low-cyberpunk-3d.webp +0 -0
- package/assets/styles/nextgen-cg.webp +0 -0
- package/assets/styles/noir-film.webp +0 -0
- package/assets/styles/openworld-survival.webp +0 -0
- package/assets/styles/paper-cut-3d.webp +0 -0
- package/assets/styles/pixar-adult-3d.webp +0 -0
- package/assets/styles/pop-marvel-2d.webp +0 -0
- package/assets/styles/shinkai-anime.webp +0 -0
- package/assets/styles/tactical-stealth.webp +0 -0
- package/assets/styles/vaporwave-3d.webp +0 -0
- package/assets/styles/vhs90.webp +0 -0
- package/lib/types/client/panel/BookshelfBar.d.ts +0 -11
- package/lib/types/client/panel/FlowGuide.d.ts +0 -21
- package/lib/types/client/panel/MangaRoleLibrary.d.ts +0 -18
- package/lib/types/client/panel/MangaWorkspace.d.ts +0 -15
- package/lib/types/client/panel/ModelPicker.d.ts +0 -11
- package/lib/types/client/panel/ProgressHomeView.d.ts +0 -5
- package/lib/types/client/panel/SceneLibrary.d.ts +0 -14
- package/lib/types/client/panel/StoryboardTab.d.ts +0 -19
- package/lib/types/client/panel/StyleCard.d.ts +0 -8
- package/lib/types/client/panel/StyleGallery.d.ts +0 -1
- package/lib/types/comic-presets.d.ts +0 -12
- package/lib/types/shot-language.d.ts +0 -46
- package/lib/types/story-beat-language.d.ts +0 -35
- package/lib/types/style-library.d.ts +0 -33
- package/skills/chapter-batch/SKILL.md +0 -81
- package/src/client/mount.tsx._new +0 -97
- package/src/client/mount.tsx._nf +0 -97
- package/src/client/mount.tsx._tmp +0 -97
- package/src/client/panel/BookshelfBar.tsx +0 -170
- package/src/client/panel/FlowGuide.tsx +0 -83
- package/src/client/panel/MangaRoleLibrary.tsx +0 -810
- package/src/client/panel/MangaWorkspace.tsx +0 -359
- package/src/client/panel/ProgressHomeView.tsx +0 -87
- package/src/client/panel/SceneLibrary.tsx +0 -396
- package/src/client/panel/StoryboardTab.tsx +0 -466
- package/src/client/panel/StyleCard.tsx +0 -90
- package/src/client/panel/StyleGallery.tsx +0 -58
- package/src/comic-presets.ts +0 -67
- package/src/shot-language.ts +0 -181
- package/src/story-beat-language.ts +0 -130
- package/src/style-library.ts +0 -78
package/src/client/locales.ts
CHANGED
|
@@ -1,58 +1,37 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* dsh-novel-forge —
|
|
2
|
+
* dsh-novel-forge — 面板文案词典(简体中文单语)。
|
|
3
|
+
*
|
|
4
|
+
* 定位说明:小说工坊面板是**中文单语界面**——这里就是全部用户可见文案的唯一定义处,
|
|
5
|
+
* 键位即类型(`NovelKey`),新增文案请同时在此登记,不要散落到组件里硬编码。
|
|
6
|
+
* 文档层(README / docs / CHANGELOG)仍提供英文对照,那是给人读的,不是界面语言。
|
|
3
7
|
*/
|
|
4
8
|
|
|
5
|
-
/**
|
|
9
|
+
/** 面板文案(简体中文)。 */
|
|
6
10
|
export const zh = {
|
|
7
11
|
'entry.label': '小说工坊',
|
|
8
12
|
'entry.tooltip': 'AI 编译小说工作台:总纲 → 道藏 → 卷计划 → 章节计划 → 逐章生成+审稿',
|
|
9
|
-
'panel.title': '小说工坊',
|
|
10
13
|
'common.close': '关闭',
|
|
11
14
|
'common.loading': '加载中…',
|
|
12
|
-
'common.save': '保存',
|
|
13
15
|
'common.error': '错误',
|
|
14
|
-
'common.success': '成功',
|
|
15
|
-
'common.generating': '生成中…',
|
|
16
16
|
'common.chars': '字',
|
|
17
17
|
'tab.workflow': '工作台',
|
|
18
18
|
'tab.overview': '总纲',
|
|
19
19
|
'tab.plan': '章节',
|
|
20
|
-
'tab.
|
|
21
|
-
'tab.foreshadow': '暗线',
|
|
22
|
-
'tab.assistant': 'AI 助手',
|
|
20
|
+
'tab.assistant': 'AI 编辑 Agent',
|
|
23
21
|
'tab.settings': '设置',
|
|
24
|
-
'workflow.title': '创作工作台',
|
|
25
|
-
'workflow.step1': '① 加载总纲',
|
|
26
|
-
'workflow.step2': '② 提炼道藏',
|
|
27
|
-
'workflow.step3': '③ 规划卷',
|
|
28
|
-
'workflow.step4': '④ 生成章节计划',
|
|
29
|
-
'workflow.step5': '⑤ 逐章写作 + AI 审稿',
|
|
30
|
-
'workflow.step6': '⑥ 润色 / 导出',
|
|
31
|
-
'workflow.loadOutline': '读取总纲',
|
|
32
|
-
'workflow.genBible': '提炼道藏',
|
|
33
22
|
'workflow.genVolumes': '生成卷计划',
|
|
34
|
-
'workflow.genPlan': '生成章节计划',
|
|
35
|
-
'workflow.done': '已完成',
|
|
36
|
-
'workflow.todo': '待办',
|
|
37
23
|
'workflow.bibleDone': '道藏已生成({n} 条规则 / {c} 个人物 / {r} 条红线)',
|
|
38
24
|
'workflow.volumesDone': '卷计划已生成({n} 卷)',
|
|
39
25
|
'workflow.planDone': '章节计划已生成({n} 章)',
|
|
40
|
-
'workflow.progress': '进度:总纲 ✓ · 道藏 {bible} · 卷 {volumes} · 计划 {plan} · 已完成 {done}/{total} 章',
|
|
41
|
-
'overview.loadDocx': '从 docx 读取总纲',
|
|
42
|
-
'overview.loadDocxDefault': '读取默认总纲',
|
|
43
26
|
'overview.loadingOutline': '正在解析 docx…',
|
|
44
27
|
'overview.outlineHint': '总纲文本(可编辑)',
|
|
45
28
|
'overview.outlineChars': '总纲字数',
|
|
46
29
|
'overview.saveOutline': '保存总纲',
|
|
47
30
|
'overview.saved': '总纲已保存',
|
|
48
31
|
'overview.bookName': '书名',
|
|
49
|
-
'overview.loadCustom': '指定 docx 路径',
|
|
50
|
-
'overview.loadCustomHint': '绝对路径,留空使用默认',
|
|
51
32
|
'plan.generate': '生成章节计划',
|
|
52
33
|
'plan.generateHint': '章节数量',
|
|
53
34
|
'plan.count': '章',
|
|
54
|
-
'plan.empty': '暂无章节计划,请先生成',
|
|
55
|
-
'plan.chapter': '章',
|
|
56
35
|
'plan.pending': '待生成',
|
|
57
36
|
'plan.generating': '生成中',
|
|
58
37
|
'plan.written': '待审稿',
|
|
@@ -64,23 +43,17 @@ export const zh = {
|
|
|
64
43
|
'plan.rewrite': '修订',
|
|
65
44
|
'plan.review': '审稿',
|
|
66
45
|
'plan.polish': '去AI味',
|
|
67
|
-
'plan.writeAll': '批量生成全部',
|
|
68
46
|
'plan.writeAllPending': '批量生成剩余',
|
|
69
|
-
'plan.generated': '已生成',
|
|
70
|
-
'plan.progress': '进度',
|
|
71
47
|
'plan.beats': '剧情要点',
|
|
72
48
|
'plan.reviewReport': '审稿报告',
|
|
73
49
|
'plan.reviewScore': '评分',
|
|
74
50
|
'plan.reviewVerdict': '总评',
|
|
75
|
-
'plan.reviewIssues': '问题清单',
|
|
76
51
|
'plan.reviewPass': '通过',
|
|
77
52
|
'plan.reviewFail': '未通过',
|
|
78
|
-
'plan.approve': '手动通过',
|
|
79
53
|
'plan.summary': '章节摘要',
|
|
80
54
|
'plan.volumes': '卷',
|
|
81
|
-
'plan.noVolume': '未分卷',
|
|
82
55
|
'bible.title': '道藏',
|
|
83
|
-
'bible.gen': '
|
|
56
|
+
'bible.gen': '提炼道藏',
|
|
84
57
|
'bible.genre': '题材基调',
|
|
85
58
|
'bible.worldRules': '世界规则',
|
|
86
59
|
'bible.characters': '人物志',
|
|
@@ -88,9 +61,8 @@ export const zh = {
|
|
|
88
61
|
'bible.style': '风格要求',
|
|
89
62
|
'bible.none': '尚未生成道藏。生成后写作会严格遵守人设与金手指规则,审稿也会按红线检查。',
|
|
90
63
|
'foreshadow.title': '暗线管理',
|
|
91
|
-
'foreshadow.suggest': '
|
|
64
|
+
'foreshadow.suggest': '建议暗线',
|
|
92
65
|
'foreshadow.none': '暂无暗线',
|
|
93
|
-
'foreshadow.status': '状态',
|
|
94
66
|
'foreshadow.planned': '计划中',
|
|
95
67
|
'foreshadow.planted': '已埋设',
|
|
96
68
|
'foreshadow.progressing': '推进中',
|
|
@@ -100,7 +72,6 @@ export const zh = {
|
|
|
100
72
|
'foreshadow.plantedAt': '埋设于',
|
|
101
73
|
'foreshadow.setPlanted': '标记已埋设',
|
|
102
74
|
'foreshadow.setResolved': '标记已回收',
|
|
103
|
-
'tab.facts': '编年录',
|
|
104
75
|
'tab.plotlines': '剧情线',
|
|
105
76
|
'plotlines.hint': '主线/支线/人物线/悬念线的推进管理:章节生成时会注入未完结的线,要求每章至少推进一条;关联章节记录推进节点。',
|
|
106
77
|
'plotlines.empty': '还没有剧情线——长篇小说建议先建主线与几条支线。',
|
|
@@ -122,23 +93,16 @@ export const zh = {
|
|
|
122
93
|
'plotlines.cancel': '取消',
|
|
123
94
|
'plotlines.edit': '编辑',
|
|
124
95
|
'plotlines.remove': '删除',
|
|
125
|
-
'plotlines.linkChapter': '关联本章',
|
|
126
96
|
'plotlines.chapters': '已关联',
|
|
127
|
-
'
|
|
128
|
-
'plotlines.workflowEmpty': '未建剧情线(去「剧情线」页创建)',
|
|
129
|
-
'sensitive.title': '敏感词检查',
|
|
130
|
-
'sensitive.scanAll': '🔞 全书敏感词检查',
|
|
97
|
+
'sensitive.scanAll': ' 全书敏感词检查',
|
|
131
98
|
'sensitive.hint': '内置违禁词库硬匹配(政治/擦边/暴力/辱骂/广告/其他),发布前建议检查;只做提示,是否修改由你判断。',
|
|
132
|
-
'sensitive.clean': '
|
|
99
|
+
'sensitive.clean': ' 未命中任何违禁词(扫描 {n} 章)',
|
|
133
100
|
'sensitive.hits': '命中 {n} 处({chapters} 章受影响)',
|
|
134
101
|
'sensitive.goFix': '去修订',
|
|
135
102
|
'sensitive.fixPrefill': '请删除或替换正文中的违禁表达「{word}」(类别:{category}),用含蓄/间接的写法替代。',
|
|
136
103
|
'facts.title': '编年录 / 时间线({n} 条)',
|
|
137
104
|
'facts.hint': '每章生成后自动抽取「已确立事实」(人物状态/境界资源/关系变化/伏笔落地),最近 20 条注入后续章节生成,保证长期一致。',
|
|
138
105
|
'facts.backfill': '回填历史章节事实',
|
|
139
|
-
'facts.backfilled': '已从历史章节回填 {n} 条事实',
|
|
140
|
-
'settings.title': '设置',
|
|
141
|
-
'settings.outlinePath': '默认大纲路径',
|
|
142
106
|
'settings.outputDir': '输出目录',
|
|
143
107
|
'settings.provider': '模型提供商',
|
|
144
108
|
'settings.model': '模型',
|
|
@@ -147,13 +111,7 @@ export const zh = {
|
|
|
147
111
|
'settings.edit': '编辑',
|
|
148
112
|
'settings.delete': '删除',
|
|
149
113
|
'settings.modelCustomPlaceholder': '输入任意模型 id',
|
|
150
|
-
'settings.savedModels': '我的模型',
|
|
151
|
-
'settings.modelCards': '模型卡片(内置 + 已添加)',
|
|
152
|
-
'settings.savedModelName': '名称',
|
|
153
|
-
'settings.addModel': '添加模型',
|
|
154
|
-
'settings.catalogRefresh': '刷新厂商',
|
|
155
114
|
'settings.refreshModels': '刷新模型',
|
|
156
|
-
'settings.savedModelsHint': '手动添加常用模型(provider + 模型 id),点击即可切换当前模型;厂商模式会写入 DSH 凭据并注册路由。',
|
|
157
115
|
'settings.testConnection': '测试连通',
|
|
158
116
|
'settings.testRunning': '测试中',
|
|
159
117
|
'settings.testOk': '连通',
|
|
@@ -168,15 +126,9 @@ export const zh = {
|
|
|
168
126
|
'settings.reasoning.low': 'low · 低思考',
|
|
169
127
|
'settings.reasoning.high': 'high · 高思考',
|
|
170
128
|
'settings.reasoning.max': 'max · 最高思考(质检/推演)',
|
|
171
|
-
'settings.theme': '主题',
|
|
172
|
-
'settings.themeLiquid': 'iOS 液态玻璃(绿)',
|
|
173
|
-
'settings.themeNeumorph': '新拟物(双阴影)',
|
|
174
|
-
'settings.themeHint': '存于浏览器本地,即时生效',
|
|
175
129
|
'settings.chapterChars': '每章目标字数',
|
|
176
130
|
'settings.maxTokens': '单章最大输出 tokens',
|
|
177
131
|
'settings.reviewPassScore': '审稿通过分数(0-100)',
|
|
178
|
-
'settings.editorFontSize': '编辑器字号(仅编辑页显示)',
|
|
179
|
-
'settings.editorFontSizeHint': '存于浏览器本地,不影响其他设备',
|
|
180
132
|
'settings.autoReview': '生成后自动审稿',
|
|
181
133
|
'settings.autoAuthorReview': '生成后自动作者复盘',
|
|
182
134
|
'settings.autoAuthorReviewHint': '复盘钩子兑现/结尾钩子/剧情线推进/连续性/节奏趋势,每章约 2000 token',
|
|
@@ -184,8 +136,8 @@ export const zh = {
|
|
|
184
136
|
'settings.autoReviewAfterReviseHint': '按意见修订/润色产出草稿后自动附带一次 AI 审查,直接显示新稿评分与剩余问题(每章约 2-3k token,可关)',
|
|
185
137
|
'settings.save': '保存设置',
|
|
186
138
|
'settings.saved': '设置已保存',
|
|
139
|
+
'settings.savedUnpersisted': '设置已生效,但未能持久化(宿主未登记本插件的配置段),重启后会回到原值。',
|
|
187
140
|
'settings.openFolder': '打开输出文件夹',
|
|
188
|
-
'settings.export': '导出',
|
|
189
141
|
'settings.exportTxt': '导出 TXT',
|
|
190
142
|
'settings.exportMd': '导出 Markdown',
|
|
191
143
|
'settings.exported': '已导出:{file}({chars} 字,{chapters} 章)',
|
|
@@ -195,224 +147,13 @@ export const zh = {
|
|
|
195
147
|
'progress.error': '第 {no} 章失败:{message}',
|
|
196
148
|
'progress.rewriting': '正在修订第 {no} 章…',
|
|
197
149
|
'progress.polishing': '正在润色第 {no} 章…',
|
|
198
|
-
'
|
|
199
|
-
'assistant.hint': '和 AI 编辑讨论剧情、人设、暗线;达成一致后可让它直接修改总纲、道藏、章节内容。',
|
|
150
|
+
'assistant.hint': '和 AI 编辑 Agent 讨论剧情、人设、暗线;达成一致后可让它直接修改总纲、道藏、章节内容。',
|
|
200
151
|
'assistant.placeholder': '例如:我想让第 2 章结尾加一个悬念——墟境里传来爷爷的声音…',
|
|
201
152
|
'assistant.send': '发送',
|
|
202
|
-
'assistant.
|
|
203
|
-
'assistant.toolDone': '✓ {name} 完成:{detail}',
|
|
204
|
-
'assistant.toolError': '✗ {name} 失败:{detail}',
|
|
205
|
-
'assistant.empty': '还没有对话。和 AI 编辑聊聊剧情吧。',
|
|
153
|
+
'assistant.empty': '还没有对话。和 AI 编辑 Agent 聊聊剧情吧。',
|
|
206
154
|
'status.projectNone': '输出目录中还没有项目。请先加载大纲。',
|
|
207
155
|
'status.files': '已生成文件',
|
|
208
|
-
'api.error': '请求失败',
|
|
209
156
|
} as const
|
|
210
157
|
|
|
211
|
-
/**
|
|
212
|
-
export const en: Record<string, string> = {
|
|
213
|
-
'entry.label': 'Novel Forge',
|
|
214
|
-
'entry.tooltip': 'AI novel workbench: outline → bible → volumes → plan → write + review',
|
|
215
|
-
'panel.title': 'Novel Forge',
|
|
216
|
-
'common.close': 'Close',
|
|
217
|
-
'common.loading': 'Loading…',
|
|
218
|
-
'common.save': 'Save',
|
|
219
|
-
'common.error': 'Error',
|
|
220
|
-
'common.success': 'Success',
|
|
221
|
-
'common.generating': 'Generating…',
|
|
222
|
-
'common.chars': ' chars',
|
|
223
|
-
'tab.workflow': 'Workbench',
|
|
224
|
-
'tab.overview': 'Outline',
|
|
225
|
-
'tab.plan': 'Chapters',
|
|
226
|
-
'tab.bible': 'Bible',
|
|
227
|
-
'tab.foreshadow': 'Foreshadow',
|
|
228
|
-
'tab.settings': 'Settings',
|
|
229
|
-
'workflow.title': 'Writing workbench',
|
|
230
|
-
'workflow.step1': '① Load outline',
|
|
231
|
-
'workflow.step2': '② Extract story bible',
|
|
232
|
-
'workflow.step3': '③ Plan volumes',
|
|
233
|
-
'workflow.step4': '④ Plan chapters',
|
|
234
|
-
'workflow.step5': '⑤ Write + AI review',
|
|
235
|
-
'workflow.step6': '⑥ Polish / export',
|
|
236
|
-
'workflow.loadOutline': 'Load outline',
|
|
237
|
-
'workflow.genBible': 'Extract bible',
|
|
238
|
-
'workflow.genVolumes': 'Plan volumes',
|
|
239
|
-
'workflow.genPlan': 'Plan chapters',
|
|
240
|
-
'workflow.done': 'done',
|
|
241
|
-
'workflow.todo': 'todo',
|
|
242
|
-
'workflow.bibleDone': 'Bible ready ({n} rules / {c} characters / {r} red lines)',
|
|
243
|
-
'workflow.volumesDone': 'Volumes ready ({n})',
|
|
244
|
-
'workflow.planDone': 'Plan ready ({n} chapters)',
|
|
245
|
-
'workflow.progress': 'Outline ✓ · bible {bible} · volumes {volumes} · plan {plan} · {done}/{total} chapters',
|
|
246
|
-
'overview.loadDocx': 'Load outline from docx',
|
|
247
|
-
'overview.loadDocxDefault': 'Load default outline',
|
|
248
|
-
'overview.loadingOutline': 'Parsing docx…',
|
|
249
|
-
'overview.outlineHint': 'Outline text (editable)',
|
|
250
|
-
'overview.outlineChars': 'Outline length',
|
|
251
|
-
'overview.saveOutline': 'Save outline',
|
|
252
|
-
'overview.saved': 'Outline saved',
|
|
253
|
-
'overview.bookName': 'Book',
|
|
254
|
-
'overview.loadCustom': 'Custom docx path',
|
|
255
|
-
'overview.loadCustomHint': 'Absolute path; empty = default',
|
|
256
|
-
'plan.generate': 'Plan chapters',
|
|
257
|
-
'plan.generateHint': 'Chapter count',
|
|
258
|
-
'plan.count': ' chapters',
|
|
259
|
-
'plan.empty': 'No plan yet — generate one first',
|
|
260
|
-
'plan.chapter': 'Ch.',
|
|
261
|
-
'plan.pending': 'pending',
|
|
262
|
-
'plan.generating': 'writing',
|
|
263
|
-
'plan.written': 'to review',
|
|
264
|
-
'plan.reviewing': 'reviewing',
|
|
265
|
-
'plan.approved': 'approved',
|
|
266
|
-
'plan.rejected': 'to revise',
|
|
267
|
-
'plan.error': 'failed',
|
|
268
|
-
'plan.write': 'Write',
|
|
269
|
-
'plan.rewrite': 'Revise',
|
|
270
|
-
'plan.review': 'Review',
|
|
271
|
-
'plan.polish': 'De-AI',
|
|
272
|
-
'plan.writeAll': 'Write all',
|
|
273
|
-
'plan.writeAllPending': 'Write remaining',
|
|
274
|
-
'plan.generated': 'generated',
|
|
275
|
-
'plan.progress': 'progress',
|
|
276
|
-
'plan.beats': 'Beats',
|
|
277
|
-
'plan.reviewReport': 'Review report',
|
|
278
|
-
'plan.reviewScore': 'Score',
|
|
279
|
-
'plan.reviewVerdict': 'Verdict',
|
|
280
|
-
'plan.reviewIssues': 'Issues',
|
|
281
|
-
'plan.reviewPass': 'Passed',
|
|
282
|
-
'plan.reviewFail': 'Failed',
|
|
283
|
-
'plan.approve': 'Approve',
|
|
284
|
-
'plan.summary': 'Summary',
|
|
285
|
-
'plan.volumes': 'Volumes',
|
|
286
|
-
'plan.noVolume': 'No volume',
|
|
287
|
-
'bible.title': 'Story bible',
|
|
288
|
-
'bible.gen': 'Extract bible with AI',
|
|
289
|
-
'bible.genre': 'Genre',
|
|
290
|
-
'bible.worldRules': 'World rules',
|
|
291
|
-
'bible.characters': 'Characters',
|
|
292
|
-
'bible.redLines': 'Red lines',
|
|
293
|
-
'bible.style': 'Style',
|
|
294
|
-
'bible.none': 'No bible yet. Generation and review follow it strictly once extracted.',
|
|
295
|
-
'foreshadow.title': 'Foreshadowing',
|
|
296
|
-
'foreshadow.suggest': 'Suggest with AI',
|
|
297
|
-
'foreshadow.none': 'No foreshadows',
|
|
298
|
-
'foreshadow.status': 'Status',
|
|
299
|
-
'foreshadow.planned': 'planned',
|
|
300
|
-
'foreshadow.planted': 'planted',
|
|
301
|
-
'foreshadow.progressing': 'progressing',
|
|
302
|
-
'foreshadow.resolved': 'resolved',
|
|
303
|
-
'foreshadow.abandoned': 'abandoned',
|
|
304
|
-
'foreshadow.target': 'target',
|
|
305
|
-
'foreshadow.plantedAt': 'planted at',
|
|
306
|
-
'foreshadow.setPlanted': 'Mark planted',
|
|
307
|
-
'foreshadow.setResolved': 'Mark resolved',
|
|
308
|
-
'settings.title': 'Settings',
|
|
309
|
-
'settings.outlinePath': 'Default outline path',
|
|
310
|
-
'settings.outputDir': 'Output directory',
|
|
311
|
-
'settings.provider': 'Provider',
|
|
312
|
-
'settings.model': 'Model',
|
|
313
|
-
'settings.modelCustom': 'Custom…',
|
|
314
|
-
'settings.customProvider': 'Custom provider…',
|
|
315
|
-
'settings.edit': 'Edit',
|
|
316
|
-
'settings.delete': 'Delete',
|
|
317
|
-
'settings.modelCustomPlaceholder': 'Type any model id',
|
|
318
|
-
'settings.savedModels': 'My Models',
|
|
319
|
-
'settings.modelCards': 'Model cards (built-in + added)',
|
|
320
|
-
'settings.savedModelName': 'Name',
|
|
321
|
-
'settings.addModel': 'Add model',
|
|
322
|
-
'settings.catalogRefresh': 'Refresh vendors',
|
|
323
|
-
'settings.refreshModels': 'Refresh models',
|
|
324
|
-
'settings.savedModelsHint': 'Manually add a model (provider + model id); click to switch. Vendor mode writes the key into DSH credentials and registers the route.',
|
|
325
|
-
'settings.testConnection': 'Test',
|
|
326
|
-
'settings.testRunning': 'Testing',
|
|
327
|
-
'settings.testOk': 'OK',
|
|
328
|
-
'settings.testFail': 'Failed',
|
|
329
|
-
'settings.testHint': 'Sends one minimal real call (~dozens of tokens) to verify key / endpoint / model.',
|
|
330
|
-
'settings.reasoningSection': 'Reasoning',
|
|
331
|
-
'settings.reasoningEffort': 'Writing-task reasoning effort',
|
|
332
|
-
'settings.analysisReasoning': 'Analysis-task reasoning (extract / breakdown / reverse outline)',
|
|
333
|
-
'settings.analysisReasoningHint': 'One-off analysis tasks (roles/scenes/bible extract, breakdown, reverse outline) default to low; not affected by the writing-level switch.',
|
|
334
|
-
'settings.reasoning.off': 'off · no thinking (recommended)',
|
|
335
|
-
'settings.reasoning.low': 'low',
|
|
336
|
-
'settings.reasoning.high': 'high',
|
|
337
|
-
'settings.reasoning.max': 'max (audit/reasoning)',
|
|
338
|
-
'settings.reasoningHint': 'off is fastest/cheapest; high/max are slower and stronger',
|
|
339
|
-
'settings.theme': 'Theme',
|
|
340
|
-
'settings.themeLiquid': 'iOS Liquid Glass (green)',
|
|
341
|
-
'settings.themeClassic': 'Classic frosted (blue)',
|
|
342
|
-
'settings.themeNeumorph': 'Neumorphism (dual-shadow)',
|
|
343
|
-
'settings.themeHint': 'Stored in browser localStorage; applies instantly',
|
|
344
|
-
'settings.chapterChars': 'Chars per chapter',
|
|
345
|
-
'settings.maxTokens': 'Max output tokens',
|
|
346
|
-
'settings.reviewPassScore': 'Review pass score (0-100)',
|
|
347
|
-
'settings.editorFontSize': 'Editor font size (workspace only)',
|
|
348
|
-
'settings.editorFontSizeHint': 'Stored in browser localStorage; display-only',
|
|
349
|
-
'settings.autoReview': 'Auto-review after writing',
|
|
350
|
-
'settings.autoAuthorReview': 'Auto author review after writing',
|
|
351
|
-
'settings.autoAuthorReviewHint': 'Reviews hook payoff / ending hook / plotline progress / continuity / pacing trend (~2000 tokens per chapter)',
|
|
352
|
-
'settings.autoReviewAfterRevise': 'Auto review after revise',
|
|
353
|
-
'settings.autoReviewAfterReviseHint': 'Automatically runs one AI review on the produced draft after revise/polish, showing the new score and remaining issues (~2-3k tokens, can be disabled)',
|
|
354
|
-
'settings.save': 'Save settings',
|
|
355
|
-
'settings.saved': 'Settings saved',
|
|
356
|
-
'settings.openFolder': 'Open output folder',
|
|
357
|
-
'settings.export': 'Export',
|
|
358
|
-
'settings.exportTxt': 'Export TXT',
|
|
359
|
-
'settings.exportMd': 'Export Markdown',
|
|
360
|
-
'settings.exported': 'Exported: {file} ({chars} chars, {chapters} chapters)',
|
|
361
|
-
'tab.facts': 'Chronicle',
|
|
362
|
-
'tab.plotlines': 'Plotlines',
|
|
363
|
-
'plotlines.hint': 'Track main/branch/character/mystery arcs: unfinished arcs are injected into chapter writing so each chapter advances at least one; linked chapters record progress nodes.',
|
|
364
|
-
'plotlines.empty': 'No plotlines yet — consider creating the main arc and a few branches.',
|
|
365
|
-
'plotlines.new': '+ New plotline',
|
|
366
|
-
'plotlines.name': 'Name',
|
|
367
|
-
'plotlines.kind': 'Type',
|
|
368
|
-
'plotlines.kindMain': 'Main',
|
|
369
|
-
'plotlines.kindBranch': 'Branch',
|
|
370
|
-
'plotlines.kindCharacter': 'Character',
|
|
371
|
-
'plotlines.kindMystery': 'Mystery',
|
|
372
|
-
'plotlines.goal': 'Goal',
|
|
373
|
-
'plotlines.progress': 'Current progress',
|
|
374
|
-
'plotlines.status': 'Status',
|
|
375
|
-
'plotlines.statusActive': 'Active',
|
|
376
|
-
'plotlines.statusPaused': 'Paused',
|
|
377
|
-
'plotlines.statusResolved': 'Resolved',
|
|
378
|
-
'plotlines.statusAbandoned': 'Abandoned',
|
|
379
|
-
'plotlines.save': 'Save',
|
|
380
|
-
'plotlines.cancel': 'Cancel',
|
|
381
|
-
'plotlines.edit': 'Edit',
|
|
382
|
-
'plotlines.remove': 'Remove',
|
|
383
|
-
'plotlines.linkChapter': 'Link chapter',
|
|
384
|
-
'plotlines.chapters': 'Linked',
|
|
385
|
-
'plotlines.workflowTitle': 'Plotline progress',
|
|
386
|
-
'plotlines.workflowEmpty': 'No plotlines yet (create them in the Plotlines tab)',
|
|
387
|
-
'sensitive.title': 'Sensitive-word check',
|
|
388
|
-
'sensitive.scanAll': '🔞 Scan all chapters',
|
|
389
|
-
'sensitive.hint': 'Built-in banned-word library (politics/erotica/violence/abuse/ads/other). Run before publishing; suggestions only.',
|
|
390
|
-
'sensitive.clean': '✅ No banned words found ({n} chapters scanned)',
|
|
391
|
-
'sensitive.hits': '{n} hits across {chapters} chapters',
|
|
392
|
-
'sensitive.goFix': 'Fix',
|
|
393
|
-
'sensitive.fixPrefill': 'Remove or rephrase the banned expression "{word}" (category: {category}) with an indirect alternative.',
|
|
394
|
-
'facts.title': 'Chronicle / timeline ({n} facts)',
|
|
395
|
-
'facts.hint': 'Auto-extracted established facts per chapter (state/resources/relations/foreshadow landings); the latest 20 are injected into later chapters for consistency.',
|
|
396
|
-
'facts.backfill': 'Backfill facts from historical chapters',
|
|
397
|
-
'facts.backfilled': 'Backfilled {n} facts from historical chapters',
|
|
398
|
-
'progress.generating': 'Writing chapter {no} “{title}”…',
|
|
399
|
-
'progress.done': 'Chapter {no} done ({chars} chars) → {file}',
|
|
400
|
-
'progress.reviewed': 'Chapter {no} review: {score} — {verdict}',
|
|
401
|
-
'progress.error': 'Chapter {no} failed: {message}',
|
|
402
|
-
'progress.rewriting': 'Revising chapter {no}…',
|
|
403
|
-
'progress.polishing': 'Polishing chapter {no}…',
|
|
404
|
-
'progress.empty': 'Generation/review progress appears here',
|
|
405
|
-
'assistant.hint': 'Discuss plot, characters, foreshadowing with the AI editor; once agreed, let it edit the outline, bible, or chapters directly.',
|
|
406
|
-
'assistant.placeholder': 'e.g. Add a hook at the end of chapter 2…',
|
|
407
|
-
'assistant.send': 'Send',
|
|
408
|
-
'assistant.toolStart': '⚙ Running {name}…',
|
|
409
|
-
'assistant.toolDone': '✓ {name} done: {detail}',
|
|
410
|
-
'assistant.toolError': '✗ {name} failed: {detail}',
|
|
411
|
-
'assistant.empty': 'No conversation yet. Chat with the AI editor.',
|
|
412
|
-
'status.projectNone': 'No project in the output directory yet. Load an outline first.',
|
|
413
|
-
'status.files': 'Generated files',
|
|
414
|
-
'api.error': 'Request failed',
|
|
415
|
-
}
|
|
416
|
-
|
|
417
|
-
/** Keys type for the zh dictionary. */
|
|
158
|
+
/** 面板文案键位(= zh 词典的键)。 */
|
|
418
159
|
export type NovelKey = keyof typeof zh
|
package/src/client/mount.tsx
CHANGED
|
@@ -10,9 +10,9 @@ import { NovelPanel } from './panel/NovelPanel.tsx'
|
|
|
10
10
|
import css from './panel/panel.module.css'
|
|
11
11
|
|
|
12
12
|
/** The injected panel container. */
|
|
13
|
-
|
|
13
|
+
const PANEL_VIEW_SELECTOR = '[data-dsh-novelforge-view]'
|
|
14
14
|
|
|
15
|
-
const CONVERSATION_COLUMN_SELECTOR = '[data-pane="conversation"]'
|
|
15
|
+
const CONVERSATION_COLUMN_SELECTOR = '[data-pane="conversation"], [class*="centerCol"]'
|
|
16
16
|
const ACTIVE_ATTR = 'data-dsh-novelforge-active'
|
|
17
17
|
/** Sibling panels' activation attributes (evicted when this panel opens). */
|
|
18
18
|
const OTHER_ACTIVE_ATTRS = ['data-dsh-taskboard-active', 'data-dsh-ssh-active']
|
|
@@ -44,7 +44,8 @@ export function mountPanel(controller: PanelController, api: NovelApi): () => vo
|
|
|
44
44
|
const column = conversationColumn()
|
|
45
45
|
if (column === undefined) return
|
|
46
46
|
container = document.createElement('div')
|
|
47
|
-
|
|
47
|
+
// 归属标记只在这里落地;取值与 PANEL_VIEW_SELECTOR 同源,字符串不写第二遍。
|
|
48
|
+
container.setAttribute(PANEL_VIEW_SELECTOR.slice(1, -1), 'true')
|
|
48
49
|
container.className = css.view
|
|
49
50
|
column.appendChild(container)
|
|
50
51
|
root = createRoot(container)
|