@waterwx/dsh-novel-forge 1.2.1-alpha → 1.3.0-alpha

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/README.md +4 -5
  2. package/lib/client.js +2470 -858
  3. package/lib/index.js +2155 -388
  4. package/lib/types/action-guard.d.ts +1 -1
  5. package/lib/types/assets.d.ts +7 -7
  6. package/lib/types/client/api.d.ts +31 -1
  7. package/lib/types/client/llmLive.d.ts +12 -14
  8. package/lib/types/client/panel/LiveFeedLog.d.ts +5 -0
  9. package/lib/types/client/panel/ModelManager.d.ts +2 -2
  10. package/lib/types/client/panel/PromptSlotsView.d.ts +11 -0
  11. package/lib/types/client/panel/TensionView.d.ts +14 -0
  12. package/lib/types/client/panel/TimelineView.d.ts +14 -0
  13. package/lib/types/engine.d.ts +40 -2
  14. package/lib/types/index.d.ts +4 -0
  15. package/lib/types/llm-live.d.ts +65 -34
  16. package/lib/types/llm-retry.d.ts +38 -0
  17. package/lib/types/market-radar-sources.d.ts +1 -1
  18. package/lib/types/prompt-slots.d.ts +57 -0
  19. package/lib/types/prompting.d.ts +2 -2
  20. package/lib/types/protocol.d.ts +283 -3
  21. package/lib/types/snapshots.d.ts +46 -0
  22. package/lib/types/stage-contract.d.ts +1 -1
  23. package/lib/types/tension.d.ts +65 -0
  24. package/lib/types/timeline.d.ts +37 -0
  25. package/package.json +3 -2
  26. package/src/action-guard.ts +1 -1
  27. package/src/assets.ts +300 -268
  28. package/src/assistant.ts +45 -29
  29. package/src/client/api.ts +76 -2
  30. package/src/client/llmLive.ts +26 -16
  31. package/src/client/panel/AssetsTab.tsx +2 -2
  32. package/src/client/panel/LiveFeedLog.tsx +204 -67
  33. package/src/client/panel/ModelManager.tsx +2 -2
  34. package/src/client/panel/NovelPanel.tsx +127 -13
  35. package/src/client/panel/PromptSlotsView.tsx +97 -0
  36. package/src/client/panel/SettingsView.tsx +35 -0
  37. package/src/client/panel/TensionView.tsx +196 -0
  38. package/src/client/panel/TimelineView.tsx +192 -0
  39. package/src/engine.ts +549 -108
  40. package/src/index.ts +12 -0
  41. package/src/llm-live.ts +260 -68
  42. package/src/llm-retry.ts +77 -0
  43. package/src/market-radar-sources.ts +173 -173
  44. package/src/prompt-slots.ts +125 -0
  45. package/src/prompting.ts +8 -8
  46. package/src/protocol.ts +314 -3
  47. package/src/routes.ts +325 -6
  48. package/src/run.ts +4 -0
  49. package/src/snapshots.ts +174 -0
  50. package/src/stage-contract.ts +189 -189
  51. package/src/tension.ts +240 -0
  52. package/src/timeline.ts +159 -0
package/src/assets.ts CHANGED
@@ -1,10 +1,10 @@
1
1
  /**
2
2
  * Writing assets — 题材基底库 / 推进模式库 / 反 AI 规则 / 写法引擎.
3
3
  *
4
- * Ported from AI-Novel-Writing-Assistant (Apache-2.0) built-in seed data:
5
- * - 8 preset style templates (DEFAULT_STYLE_TEMPLATES)
6
- * - 12 anti-AI rules with concrete detect patterns (DEFAULT_ANTI_AI_RULES)
7
- * - genre tree + progression mode seeds
4
+ * 内置种子数据(本项目自研表述;结构参考了同类工具的功能划分):
5
+ * - 8 套预置叙事风格模板
6
+ * - 12 条带命中模式的反 AI 规则
7
+ * - 题材树 + 推进模式种子
8
8
  * Assets persist with the project (novel-project.json) and are injected into
9
9
  * generation / planning / review prompts, and available to the AI assistant.
10
10
  */
@@ -13,154 +13,174 @@ import type { AntiAiRule, GenreNode, PlotBeatTemplate, ProgressionMode, ProjectA
13
13
 
14
14
  // ------------------------------------------------------ built-in style templates
15
15
 
16
- /** 预置写法模板(来自 AI-Novel-Writing-Assistant 内置 DEFAULT_STYLE_TEMPLATES)。 */
16
+ /** 预置叙事风格模板(8 套,一键绑定无需样本文本)。 */
17
17
  export const BUILTIN_STYLE_TEMPLATES: StyleTemplate[] = [
18
18
  {
19
19
  key: 'power-up-escalation',
20
- name: '爽文递进推进流',
21
- description: '持续升级冲突和收益点,强化目标推进与爽点兑现。',
20
+ name: '目标推进爽文流',
21
+ description: '冲突与收益逐级抬升,每章都要有可指认的目标推进与爽点兑现。',
22
22
  category: '爽文流',
23
- applicableGenres: ['都市', '玄幻', '热血'],
23
+ applicableGenres: [
24
+ '都市',
25
+ '玄幻',
26
+ '热血',
27
+ ],
24
28
  tags: ["推进感", "收益点", "冲突升级"],
25
- analysisMarkdown: "每段都要有目标推进或爽点兑现,保持明确因果和节奏抬升。",
26
- narrative: { progressionMode: "goal_driven", sceneUnitPattern: ["目标", "阻碍", "压制", "反转收益"], multiPov: false, looping: false, endingStyle: "hook", summary: "围绕目标推进,尽快兑现局部收益。" },
27
- character: { allowSelfReflection: true, emotionExpression: "dialogue_and_action", defenseMechanisms: [], facePriority: false, dialogueStyle: "direct", summary: "角色表达直接,情绪跟随胜负切换。" },
28
- language: { register: "direct", roughness: 0.55, allowIncompleteSentences: false, allowSwearing: false, sentenceVariation: "medium", allowUselessDetails: false, summary: "句式清晰,减少无效分散信息。" },
29
- rhythm: { pace: "fast", paragraphDensity: "medium", allowFragmentedFlow: false, actionOverExplanation: true, summary: "优先冲突和结果,少停留。" },
29
+ analysisMarkdown: "每一段都要落在「推进」或「兑现」上:因果清楚,节奏逐段抬升。",
30
+ narrative: { progressionMode: "goal_driven", sceneUnitPattern: ["目标", "阻碍", "压制", "反转收益"], multiPov: false, looping: false, endingStyle: "hook", summary: "围绕本章目标滚进,尽快给出局部收益。" },
31
+ character: { allowSelfReflection: true, emotionExpression: "dialogue_and_action", defenseMechanisms: [], facePriority: false, dialogueStyle: "direct", summary: "表达直接,情绪跟着胜负走。" },
32
+ language: { register: "direct", roughness: 0.55, allowIncompleteSentences: false, allowSwearing: false, sentenceVariation: "medium", allowUselessDetails: false, summary: "句子利落,删掉不承担信息的枝节。" },
33
+ rhythm: { pace: "fast", paragraphDensity: "medium", allowFragmentedFlow: false, actionOverExplanation: true, summary: "先冲突后解释,不做停顿式铺垫。" },
30
34
  proseRules: [
31
- '围绕目标推进,尽快兑现局部收益;每段都要有目标推进或爽点兑现。',
32
- '保持明确因果和节奏抬升,场景单元按「目标→阻碍→压制→反转收益」推进。',
33
- '优先冲突和结果,少停留;段尾用钩子收束。',
35
+ '每段都要有可指认的推进或兑现,不允许只做情绪铺垫。',
36
+ '场景按「立目标 → 遇阻 → 被压 → 反转收利」组织,节奏逐段抬升。',
37
+ '结尾用钩子收束,不写总结式段落。',
34
38
  ],
35
39
  dialogueRules: [
36
- '角色表达直接,情绪跟随胜负切换。',
37
- '对话承担推进与信息功能,但保留角色自己的语气差异。',
40
+ '台词直来直去,情绪随胜负切换。',
41
+ '对话承担推进与信息交换,同时保留各角色的语气差别。',
38
42
  ],
39
43
  languageRules: [
40
- '句式清晰,减少无效分散信息。',
41
- '直接、明确,不做无谓铺垫。',
44
+ '句子清晰,删掉不承载信息的修饰。',
45
+ '表达明确,不做无谓铺垫。',
42
46
  ],
43
47
  rhythmRules: [
44
- '快节奏,段落密度中等,动作先于解释。',
48
+ '快节奏、段落密度中等,动作先于解释。',
45
49
  '尽快兑现局部收益,避免拖沓。',
46
50
  ],
47
51
  defaultAntiAiRuleKeys: ['forbid-theme-summary', 'risk-dialogue-too-functional', 'risk-three-paragraphs-exposition'],
48
52
  },
49
53
  {
50
54
  key: 'bottom-loop-reality',
51
- name: '底层循环现实流',
52
- description: '通过碎片化生活与反复落空表现人物困境。',
55
+ name: '底层循环写实流',
56
+ description: '用碎片化的日常和反复落空写人物困境,不给廉价出路。',
53
57
  category: '现实流',
54
- applicableGenres: ['都市', '现实', '成长'],
58
+ applicableGenres: [
59
+ '都市',
60
+ '现实',
61
+ '成长',
62
+ ],
55
63
  tags: ["第一人称", "口语化", "碎片叙事"],
56
- analysisMarkdown: "以时间推进和现实落差构成叙事张力,结尾不解决核心困境。",
57
- narrative: { progressionMode: "time_sequence", sceneUnitPattern: ["行为", "落差", "自我合理化"], multiPov: false, looping: true, endingStyle: "unresolved", summary: "以碎片化生活推进,不做总括式回顾。" },
58
- character: { allowSelfReflection: false, emotionExpression: "behavior_only", defenseMechanisms: ["嘴硬", "转移", "自我合理化"], facePriority: true, dialogueStyle: "short_colloquial", summary: "人物情绪通过动作和嘴硬表达。" },
59
- language: { register: "colloquial", roughness: 0.8, allowIncompleteSentences: true, allowSwearing: true, sentenceVariation: "high", allowUselessDetails: true, summary: "语言粗粝、口语化,允许生活杂音。" },
60
- rhythm: { pace: "medium_fast", paragraphDensity: "high", allowFragmentedFlow: true, actionOverExplanation: true, summary: "段落密实,动作先于解释。" },
64
+ analysisMarkdown: "靠时间推移与现实落差形成张力,结尾不解决核心困境。",
65
+ narrative: { progressionMode: "time_sequence", sceneUnitPattern: ["行为", "落差", "自我合理化"], multiPov: false, looping: true, endingStyle: "unresolved", summary: "碎片化推进,不做总括式回顾。" },
66
+ character: { allowSelfReflection: false, emotionExpression: "behavior_only", defenseMechanisms: ["嘴硬", "转移", "自我合理化"], facePriority: true, dialogueStyle: "short_colloquial", summary: "情绪靠动作和嘴硬,不做内心解说。" },
67
+ language: { register: "colloquial", roughness: 0.8, allowIncompleteSentences: true, allowSwearing: true, sentenceVariation: "high", allowUselessDetails: true, summary: "口语、粗粝,允许生活杂音。" },
68
+ rhythm: { pace: "medium_fast", paragraphDensity: "high", allowFragmentedFlow: true, actionOverExplanation: true, summary: "段落写实,先给动作再给解释。" },
61
69
  proseRules: [
62
- '以时间推进和现实落差构成叙事张力,结尾不解决核心困境。',
63
- '场景单元按「行为→落差→自我合理化」推进。',
64
- '以碎片化生活推进,不做总括式回顾。',
70
+ '用时间推移与现实落差构成张力,结尾不解决核心困境。',
71
+ '场景按「行为 → 落差 → 自我合理化」组织。',
72
+ '碎片化推进,不做总括式回顾。',
65
73
  ],
66
74
  dialogueRules: [
67
- '人物情绪通过动作和嘴硬表达,允许短促口语化台词。',
75
+ '情绪通过动作与嘴硬体现,台词短促口语化。',
68
76
  '对话保留生活杂音与无效信息。',
69
77
  ],
70
78
  languageRules: [
71
- '语言粗粝、口语化,允许生活杂音与不完整句。',
72
- '句子变化度高,允许无意义细节。',
79
+ '语言粗粝口语化,允许不完整句。',
80
+ '句长变化大,允许无意义细节。',
73
81
  ],
74
82
  rhythmRules: [
75
- '段落密实,动作先于解释。',
83
+ '段落写实,先给动作再给解释。',
76
84
  '中快节奏,允许碎片化流动。',
77
85
  ],
78
86
  defaultAntiAiRuleKeys: ['forbid-explicit-psychology', 'forbid-ending-elevation', 'encourage-useless-action', 'encourage-reality-gap', 'encourage-hard-mouth-compensation'],
79
87
  },
80
88
  {
81
89
  key: 'suspense-pressure',
82
- name: '悬疑压迫递增流',
83
- description: '通过信息遮蔽、细节异常和压力叠加制造不安感。',
90
+ name: '信息遮蔽压迫流',
91
+ description: '用信息遮蔽、细节异常与压力叠加制造不安。',
84
92
  category: '悬疑流',
85
- applicableGenres: ['悬疑', '惊悚', '现实'],
93
+ applicableGenres: [
94
+ '悬疑',
95
+ '惊悚',
96
+ '现实',
97
+ ],
86
98
  tags: ["压迫感", "信息差", "异常细节"],
87
- analysisMarkdown: "以异常细节、信息差和节奏收束推动悬念层层加压。",
88
- narrative: { progressionMode: "mystery_escalation", sceneUnitPattern: ["现场细节", "异常", "误判", "新风险"], multiPov: false, looping: false, endingStyle: "suspense", summary: "优先制造信息缺口和压迫氛围。" },
89
- character: { allowSelfReflection: true, emotionExpression: "reaction_only", defenseMechanisms: ["压抑"], facePriority: false, dialogueStyle: "restrained", summary: "角色反应克制,恐惧通过反应显现。" },
90
- language: { register: "restrained", roughness: 0.45, allowIncompleteSentences: true, allowSwearing: false, sentenceVariation: "medium_high", allowUselessDetails: true, summary: "细节精确,保留少量噪音增强现场感。" },
91
- rhythm: { pace: "medium", paragraphDensity: "medium_high", allowFragmentedFlow: true, actionOverExplanation: true, summary: "通过节奏收束和信息延迟制造压力。" },
99
+ analysisMarkdown: "异常细节、信息差与节奏收束一起给悬念加压。",
100
+ narrative: { progressionMode: "mystery_escalation", sceneUnitPattern: ["现场细节", "异常", "误判", "新风险"], multiPov: false, looping: false, endingStyle: "suspense", summary: "优先制造信息缺口与压迫氛围。" },
101
+ character: { allowSelfReflection: true, emotionExpression: "reaction_only", defenseMechanisms: ["压抑"], facePriority: false, dialogueStyle: "restrained", summary: "反应克制,恐惧从反应里透出来。" },
102
+ language: { register: "restrained", roughness: 0.45, allowIncompleteSentences: true, allowSwearing: false, sentenceVariation: "medium_high", allowUselessDetails: true, summary: "细节精确,留少量噪音增强现场感。" },
103
+ rhythm: { pace: "medium", paragraphDensity: "medium_high", allowFragmentedFlow: true, actionOverExplanation: true, summary: "用节奏收束与信息延迟制造压力。" },
92
104
  proseRules: [
93
- '以异常细节、信息差和节奏收束推动悬念层层加压。',
94
- '场景单元按「现场细节→异常→误判→新风险」推进。',
95
- '优先制造信息缺口和压迫氛围。',
105
+ '以异常细节、信息差与节奏收束给悬念加压。',
106
+ '场景按「现场细节 → 异常 → 误判 → 新风险」组织。',
107
+ '优先制造信息缺口与压迫氛围。',
96
108
  ],
97
109
  dialogueRules: [
98
- '角色反应克制,恐惧通过反应显现。',
99
- '对话保留克制感,不解释恐惧来源。',
110
+ '反应克制,恐惧从反应里透出来。',
111
+ '台词保持克制,不解释恐惧来源。',
100
112
  ],
101
113
  languageRules: [
102
- '细节精确,保留少量噪音增强现场感。',
103
- '克制、中等偏高句变化。',
114
+ '细节写准,留一点杂音换现场感。',
115
+ '克制,句长变化中等偏高。',
104
116
  ],
105
117
  rhythmRules: [
106
- '通过节奏收束和信息延迟制造压力。',
118
+ '用节奏收束与信息延迟制造压力。',
107
119
  '中速,段落密度中等偏高。',
108
120
  ],
109
121
  defaultAntiAiRuleKeys: ['forbid-explicit-psychology', 'forbid-theme-summary', 'risk-even-paragraph-length', 'encourage-reality-gap'],
110
122
  },
111
123
  {
112
124
  key: 'emotional-tension',
113
- name: '情绪拉扯流',
114
- description: '通过错位表达、停顿和误读制造关系张力。',
125
+ name: '关系错位拉扯流',
126
+ description: '用错位表达、停顿与误读制造关系张力。',
115
127
  category: '情感流',
116
- applicableGenres: ['言情', '都市', '群像'],
128
+ applicableGenres: [
129
+ '言情',
130
+ '都市',
131
+ '群像',
132
+ ],
117
133
  tags: ["误读", "拉扯", "停顿感"],
118
- analysisMarkdown: "人物不直说核心情绪,靠误读、停顿和反应推动关系变化。",
119
- narrative: { progressionMode: "relationship_push_pull", sceneUnitPattern: ["动作", "言外之意", "误读", "回避"], multiPov: false, looping: false, endingStyle: "emotional_hook", summary: "以关系错位推进,而非直接说明。" },
120
- character: { allowSelfReflection: true, emotionExpression: "subtext", defenseMechanisms: ["回避", "试探", "嘴硬"], facePriority: true, dialogueStyle: "subtext_heavy", summary: "情绪通过停顿、动作和言外之意体现。" },
121
- language: { register: "natural", roughness: 0.35, allowIncompleteSentences: true, allowSwearing: false, sentenceVariation: "high", allowUselessDetails: true, summary: "语言自然,允许留白与停顿。" },
122
- rhythm: { pace: "medium_slow", paragraphDensity: "medium", allowFragmentedFlow: true, actionOverExplanation: false, summary: "给关系反应留空间,但避免空洞抒情。" },
134
+ analysisMarkdown: "核心情绪不直说,靠误读、停顿与反应推动关系变化。",
135
+ narrative: { progressionMode: "relationship_push_pull", sceneUnitPattern: ["动作", "言外之意", "误读", "回避"], multiPov: false, looping: false, endingStyle: "emotional_hook", summary: "靠关系错位推进,不直接说明。" },
136
+ character: { allowSelfReflection: true, emotionExpression: "subtext", defenseMechanisms: ["回避", "试探", "嘴硬"], facePriority: true, dialogueStyle: "subtext_heavy", summary: "情绪落在停顿、动作与言外之意上。" },
137
+ language: { register: "natural", roughness: 0.35, allowIncompleteSentences: true, allowSwearing: false, sentenceVariation: "high", allowUselessDetails: true, summary: "语言自然,允许停顿和留白。" },
138
+ rhythm: { pace: "medium_slow", paragraphDensity: "medium", allowFragmentedFlow: true, actionOverExplanation: false, summary: "给关系反应留空间,但不写空洞抒情。" },
123
139
  proseRules: [
124
- '人物不直说核心情绪,靠误读、停顿和反应推动关系变化。',
125
- '场景单元按「动作→言外之意→误读→回避」推进。',
126
- '以关系错位推进,而非直接说明。',
140
+ '核心情绪不直说,靠误读、停顿与反应推动关系。',
141
+ '场景按「动作 → 言外之意 → 误读 → 回避」组织。',
142
+ '靠关系错位推进,不靠旁白说明。',
127
143
  ],
128
144
  dialogueRules: [
129
- '情绪通过停顿、动作和言外之意体现。',
130
- '对话充满潜台词与试探。',
145
+ '情绪通过停顿、动作与言外之意体现。',
146
+ '台词充满潜台词与试探。',
131
147
  ],
132
148
  languageRules: [
133
- '语言自然,允许留白与停顿。',
134
- '句子变化度高,允许无意义细节。',
149
+ '语言自然,允许停顿和留白。',
150
+ '句长变化大,允许无意义细节。',
135
151
  ],
136
152
  rhythmRules: [
137
- '给关系反应留空间,但避免空洞抒情。',
153
+ '给关系反应留白,但不写空泛抒情。',
138
154
  '中慢节奏,段落密度中等。',
139
155
  ],
140
156
  defaultAntiAiRuleKeys: ['forbid-direct-preaching', 'forbid-ending-elevation', 'risk-dialogue-too-functional', 'encourage-useless-action'],
141
157
  },
142
158
  {
143
159
  key: 'ensemble-weave',
144
- name: '群像交织流',
145
- description: '以多人行动线和视角差异交织推进事件。',
160
+ name: '群像交叉推进流',
161
+ description: '多条人物行动线交叉推进,视角差异清晰可控。',
146
162
  category: '群像流',
147
- applicableGenres: ['群像', '都市', '悬疑'],
163
+ applicableGenres: [
164
+ '群像',
165
+ '都市',
166
+ '悬疑',
167
+ ],
148
168
  tags: ["多角色", "交织", "信息流动"],
149
- analysisMarkdown: "多角色并行推进,但每个角色的表达和认知范围必须区分清楚。",
150
- narrative: { progressionMode: "multi_thread", sceneUnitPattern: ["角色动作", "局部信息", "交叉影响"], multiPov: true, looping: false, endingStyle: "cross_hook", summary: "多线并进,但视角切换要受控。" },
151
- character: { allowSelfReflection: true, emotionExpression: "mixed", defenseMechanisms: [], facePriority: false, dialogueStyle: "distinct_by_role", summary: "不同角色口吻必须拉开差异。" },
152
- language: { register: "flexible", roughness: 0.45, allowIncompleteSentences: true, allowSwearing: false, sentenceVariation: "high", allowUselessDetails: false, summary: "保持角色差异,避免所有人说话一样。" },
153
- rhythm: { pace: "balanced", paragraphDensity: "medium", allowFragmentedFlow: false, actionOverExplanation: true, summary: "多线交织但节奏不乱。" },
169
+ analysisMarkdown: "多角色并行推进,但每人的表达与认知边界必须分清。",
170
+ narrative: { progressionMode: "multi_thread", sceneUnitPattern: ["角色动作", "局部信息", "交叉影响"], multiPov: true, looping: false, endingStyle: "cross_hook", summary: "多线并进,视角切换要有控制。" },
171
+ character: { allowSelfReflection: true, emotionExpression: "mixed", defenseMechanisms: [], facePriority: false, dialogueStyle: "distinct_by_role", summary: "不同角色的口吻必须拉开差距。" },
172
+ language: { register: "flexible", roughness: 0.45, allowIncompleteSentences: true, allowSwearing: false, sentenceVariation: "high", allowUselessDetails: false, summary: "保持角色差异,避免千人一腔。" },
173
+ rhythm: { pace: "balanced", paragraphDensity: "medium", allowFragmentedFlow: false, actionOverExplanation: true, summary: "几条线同时走,节奏别散。" },
154
174
  proseRules: [
155
- '多角色并行推进,但每个角色的表达和认知范围必须区分清楚。',
156
- '多线并进,但视角切换要受控。',
175
+ '多角色并行推进,各人的表达与认知边界必须分清。',
176
+ '多线并进,切视角要有节制。',
157
177
  ],
158
178
  dialogueRules: [
159
- '不同角色口吻必须拉开差异,避免所有人说话一样。',
179
+ '不同角色的口吻要拉开差距,避免所有人说话一样。',
160
180
  ],
161
181
  languageRules: [
162
- '保持角色差异,句式变化度高。',
163
- '减少无效分散信息。',
182
+ '保持角色差异,句长变化大。',
183
+ '砍掉不推进剧情的枝节信息。',
164
184
  ],
165
185
  rhythmRules: [
166
186
  '多线交织但节奏不乱,平衡推进。',
@@ -171,92 +191,104 @@ export const BUILTIN_STYLE_TEMPLATES: StyleTemplate[] = [
171
191
  {
172
192
  key: 'immersive-daily',
173
193
  name: '日常浸没流',
174
- description: '通过生活细节和细微情绪变化建立持续沉浸感。',
194
+ description: '用生活细节与细微情绪变化建立持续沉浸。',
175
195
  category: '日常流',
176
- applicableGenres: ['日常', '治愈', '都市'],
196
+ applicableGenres: [
197
+ '日常',
198
+ '治愈',
199
+ '都市',
200
+ ],
177
201
  tags: ["生活感", "沉浸", "细碎细节"],
178
- analysisMarkdown: "允许保留生活性动作和无效信息,但核心情绪仍要通过场景自然流出。",
179
- narrative: { progressionMode: "scene_immersion", sceneUnitPattern: ["动作", "环境", "关系反应"], multiPov: false, looping: false, endingStyle: "soft_open", summary: "重场景体验和关系温度。" },
180
- character: { allowSelfReflection: true, emotionExpression: "light_behavior", defenseMechanisms: [], facePriority: false, dialogueStyle: "daily_natural", summary: "人物表达自然,不用高强度戏剧句。" },
181
- language: { register: "colloquial", roughness: 0.25, allowIncompleteSentences: true, allowSwearing: false, sentenceVariation: "medium_high", allowUselessDetails: true, summary: "保留生活细节和杂音,不追求工整。" },
182
- rhythm: { pace: "slow", paragraphDensity: "medium", allowFragmentedFlow: true, actionOverExplanation: false, summary: "慢节奏沉浸,但避免空转。" },
202
+ analysisMarkdown: "允许生活性动作与无效信息,但核心情绪仍要从场景里自然流出。",
203
+ narrative: { progressionMode: "scene_immersion", sceneUnitPattern: ["动作", "环境", "关系反应"], multiPov: false, looping: false, endingStyle: "soft_open", summary: "重场景体验与关系温度。" },
204
+ character: { allowSelfReflection: true, emotionExpression: "light_behavior", defenseMechanisms: [], facePriority: false, dialogueStyle: "daily_natural", summary: "说话像日常,不端戏剧腔。" },
205
+ language: { register: "colloquial", roughness: 0.25, allowIncompleteSentences: true, allowSwearing: false, sentenceVariation: "medium_high", allowUselessDetails: true, summary: "保留生活细节与杂音,不追求工整。" },
206
+ rhythm: { pace: "slow", paragraphDensity: "medium", allowFragmentedFlow: true, actionOverExplanation: false, summary: "慢节奏沉浸,但不空转。" },
183
207
  proseRules: [
184
- '重场景体验和关系温度,核心情绪通过场景自然流出。',
185
- '允许保留生活性动作和无效信息。',
208
+ '重场景体验与关系温度,核心情绪从场景自然流出。',
209
+ '允许保留生活性动作与无效信息。',
186
210
  ],
187
211
  dialogueRules: [
188
- '人物表达自然,不用高强度戏剧句。',
212
+ '台词贴近日常说话,不端戏剧腔。',
189
213
  '对话保留生活气息。',
190
214
  ],
191
215
  languageRules: [
192
- '保留生活细节和杂音,不追求工整。',
193
- '口语化,句子变化中等偏高。',
216
+ '保留生活细节与杂音,不追求工整。',
217
+ '口语化,句长变化中等偏高。',
194
218
  ],
195
219
  rhythmRules: [
196
- '慢节奏沉浸,但避免空转。',
220
+ '节奏放慢,但不许原地打转。',
197
221
  '允许碎片化流动。',
198
222
  ],
199
223
  defaultAntiAiRuleKeys: ['forbid-ending-elevation', 'risk-even-paragraph-length', 'encourage-useless-action'],
200
224
  },
201
225
  {
202
226
  key: 'cold-professional',
203
- name: '冷峻专业流',
204
- description: '以专业事实和行业细节压住情绪,形成克制压力感。',
227
+ name: '专业事实压情绪流',
228
+ description: '用行业事实与程序细节压住情绪,形成克制的压力感。',
205
229
  category: '专业流',
206
- applicableGenres: ['职场', '现实', '悬疑'],
230
+ applicableGenres: [
231
+ '职场',
232
+ '现实',
233
+ '悬疑',
234
+ ],
207
235
  tags: ["专业细节", "克制", "事实压情绪"],
208
- analysisMarkdown: "行业事实和程序细节优先,情绪不直说,信息密度高于抒情密度。",
209
- narrative: { progressionMode: "fact_driven", sceneUnitPattern: ["事实", "动作", "专业判断", "后果"], multiPov: false, looping: false, endingStyle: "pressure_continue", summary: "让专业事实承担叙事重量。" },
210
- character: { allowSelfReflection: false, emotionExpression: "suppressed", defenseMechanisms: ["克制"], facePriority: false, dialogueStyle: "informational", summary: "情绪藏在专业动作和事实选择里。" },
211
- language: { register: "professional", roughness: 0.2, allowIncompleteSentences: false, allowSwearing: false, sentenceVariation: "medium", allowUselessDetails: false, summary: "术语和事实优先,避免廉价金句。" },
212
- rhythm: { pace: "balanced", paragraphDensity: "medium_high", allowFragmentedFlow: false, actionOverExplanation: true, summary: "信息密度高,但不铺张解释。" },
236
+ analysisMarkdown: "行业事实与程序细节优先;情绪不直说,信息密度高于抒情密度。",
237
+ narrative: { progressionMode: "fact_driven", sceneUnitPattern: ["事实", "动作", "专业判断", "后果"], multiPov: false, looping: false, endingStyle: "pressure_continue", summary: "让事实与程序细节扛住叙事重量。" },
238
+ character: { allowSelfReflection: false, emotionExpression: "suppressed", defenseMechanisms: ["克制"], facePriority: false, dialogueStyle: "informational", summary: "情绪藏在专业动作与事实选择里。" },
239
+ language: { register: "professional", roughness: 0.2, allowIncompleteSentences: false, allowSwearing: false, sentenceVariation: "medium", allowUselessDetails: false, summary: "术语与事实优先,避免廉价金句。" },
240
+ rhythm: { pace: "balanced", paragraphDensity: "medium_high", allowFragmentedFlow: false, actionOverExplanation: true, summary: "信息给得密,却不铺开解释。" },
213
241
  proseRules: [
214
- '行业事实和程序细节优先,情绪不直说,信息密度高于抒情密度。',
215
- '场景单元按「事实→动作→专业判断→后果」推进。',
216
- '让专业事实承担叙事重量。',
242
+ '行业事实与程序细节优先,情绪不直说,信息密度高于抒情密度。',
243
+ '场景按「事实 → 动作 → 专业判断 → 后果」组织。',
244
+ '让事实与程序细节扛住叙事重量。',
217
245
  ],
218
246
  dialogueRules: [
219
- '情绪藏在专业动作和事实选择里。',
247
+ '情绪藏在专业动作与事实选择里。',
220
248
  '对话以信息性表达为主,克制。',
221
249
  ],
222
250
  languageRules: [
223
- '术语和事实优先,避免廉价金句。',
224
- '正式、克制的语言。',
251
+ '术语与事实优先,避免廉价金句。',
252
+ '语言正式、克制。',
225
253
  ],
226
254
  rhythmRules: [
227
- '信息密度高,但不铺张解释。',
228
- '平衡节奏,段落密度中等偏高。',
255
+ '信息给得密,却不铺开解释。',
256
+ '节奏平衡,段落密度中等偏高。',
229
257
  ],
230
258
  defaultAntiAiRuleKeys: ['forbid-direct-preaching', 'forbid-theme-summary', 'risk-repeated-sentence-structure'],
231
259
  },
232
260
  {
233
261
  key: 'absurd-dark-humor',
234
- name: '荒诞黑色幽默流',
235
- description: '通过反差、冷感观察和荒诞细节制造黑色幽默。',
262
+ name: '反差黑色幽默流',
263
+ description: '用反差、冷感观察与荒诞细节制造黑色幽默。',
236
264
  category: '黑色幽默',
237
- applicableGenres: ['都市', '黑色幽默', '现实'],
265
+ applicableGenres: [
266
+ '都市',
267
+ '黑色幽默',
268
+ '现实',
269
+ ],
238
270
  tags: ["荒诞", "反差", "冷感"],
239
- analysisMarkdown: "用反差和荒诞细节放大现实困境,笑点和压迫感同时存在。",
240
- narrative: { progressionMode: "contrast_driven", sceneUnitPattern: ["现实细节", "荒诞偏差", "冷反应"], multiPov: false, looping: false, endingStyle: "bitter_aftertaste", summary: "依赖反差和冷感观察,而非热闹吐槽。" },
241
- character: { allowSelfReflection: false, emotionExpression: "deadpan", defenseMechanisms: ["自嘲", "转移"], facePriority: true, dialogueStyle: "deadpan_colloquial", summary: "情绪藏在冷反应和嘴硬里。" },
242
- language: { register: "colloquial", roughness: 0.5, allowIncompleteSentences: true, allowSwearing: true, sentenceVariation: "high", allowUselessDetails: true, summary: "允许夹带荒诞杂质和冷幽默节奏。" },
243
- rhythm: { pace: "balanced", paragraphDensity: "medium_high", allowFragmentedFlow: true, actionOverExplanation: true, summary: "反差点要快落地,不要解释笑点。" },
271
+ analysisMarkdown: "用反差与荒诞细节放大现实困境,笑点与压迫感并存。",
272
+ narrative: { progressionMode: "contrast_driven", sceneUnitPattern: ["现实细节", "荒诞偏差", "冷反应"], multiPov: false, looping: false, endingStyle: "bitter_aftertaste", summary: "靠反差与冷感观察,不靠热闹吐槽。" },
273
+ character: { allowSelfReflection: false, emotionExpression: "deadpan", defenseMechanisms: ["自嘲", "转移"], facePriority: true, dialogueStyle: "deadpan_colloquial", summary: "情绪藏在冷反应与嘴硬里。" },
274
+ language: { register: "colloquial", roughness: 0.5, allowIncompleteSentences: true, allowSwearing: true, sentenceVariation: "high", allowUselessDetails: true, summary: "允许夹带荒诞杂质与冷幽默节奏。" },
275
+ rhythm: { pace: "balanced", paragraphDensity: "medium_high", allowFragmentedFlow: true, actionOverExplanation: true, summary: "反差点要快落地,不解释笑点。" },
244
276
  proseRules: [
245
- '用反差和荒诞细节放大现实困境,笑点和压迫感同时存在。',
246
- '场景单元按「现实细节→荒诞偏差→冷反应」推进。',
247
- '依赖反差和冷感观察,而非热闹吐槽。',
277
+ '用反差与荒诞细节放大现实困境,笑点与压迫感并存。',
278
+ '场景按「现实细节 → 荒诞偏差 → 冷反应」组织。',
279
+ '靠反差与冷感观察,不靠热闹吐槽。',
248
280
  ],
249
281
  dialogueRules: [
250
- '情绪藏在冷反应和嘴硬里。',
251
- '台词冷面、口语化,允许自嘲与转移。',
282
+ '情绪藏在冷反应与嘴硬里。',
283
+ '台词冷面口语化,允许自嘲与转移。',
252
284
  ],
253
285
  languageRules: [
254
- '允许夹带荒诞杂质和冷幽默节奏。',
255
- '口语化,句子变化度高。',
286
+ '允许夹带荒诞杂质与冷幽默节奏。',
287
+ '口语化,句长变化大。',
256
288
  ],
257
289
  rhythmRules: [
258
- '反差点要快落地,不要解释笑点。',
259
- '平衡节奏,段落密度中等偏高。',
290
+ '反差立刻见效,笑点不解释。',
291
+ '节奏平衡,段落密度中等偏高。',
260
292
  ],
261
293
  defaultAntiAiRuleKeys: ['forbid-explicit-psychology', 'forbid-ending-elevation', 'encourage-reality-gap', 'encourage-hard-mouth-compensation'],
262
294
  },
@@ -471,12 +503,12 @@ export const BUILTIN_STYLE_TEMPLATES: StyleTemplate[] = [
471
503
 
472
504
  // ---------------------------------------------------------- built-in rules
473
505
 
474
- /** 内置全局反 AI 规则(来自 AI-Novel-Writing-Assistant 内置 DEFAULT_ANTI_AI_RULES)。 */
506
+ /** 内置全局反 AI 规则(12 条,随插件发布;项目可叠加自定义规则)。 */
475
507
  export const BUILTIN_ANTI_AI_RULES: AntiAiRule[] = [
476
508
  {
477
- name: '禁止解释型心理描写',
478
- avoid: '直接使用"他感到""他意识到""他明白了"等句式解释人物心理。',
479
- fix: '把心理解释改成动作、语气、停顿、环境反应或结果。',
509
+ name: '不许直接解说心理',
510
+ avoid: '用「他感到」「他意识到」这类句式替读者总结人物内心。',
511
+ fix: '改成动作、语气、停顿、环境反馈或结果来呈现。',
480
512
  detectPatterns: ['他感到', '她感到', '他意识到', '她意识到', '他明白了', '她明白了'],
481
513
  builtin: true,
482
514
  key: 'forbid-explicit-psychology',
@@ -486,9 +518,9 @@ export const BUILTIN_ANTI_AI_RULES: AntiAiRule[] = [
486
518
  globalBaselineEnabled: true,
487
519
  },
488
520
  {
489
- name: '禁止段尾升华',
490
- avoid: '在段尾或收尾处用总结句升华主题(如"生活就是""命运总会""说到底")。',
491
- fix: '删除升华句,回到具体动作、现场或悬而未决的处境。',
521
+ name: '不许段尾拔高',
522
+ avoid: '在段落或章节收尾处放一句总结式升华(「生活就是…」「说到底…」)。',
523
+ fix: '删掉升华句,把收尾落回具体动作、现场或悬而未决的处境。',
492
524
  detectPatterns: ['生活就是', '命运总会', '归根结底', '说到底', '这就是'],
493
525
  builtin: true,
494
526
  key: 'forbid-ending-elevation',
@@ -498,9 +530,9 @@ export const BUILTIN_ANTI_AI_RULES: AntiAiRule[] = [
498
530
  globalBaselineEnabled: true,
499
531
  },
500
532
  {
501
- name: '禁止总结主题',
502
- avoid: '把段落写成总结中心思想或提炼人生道理(如"这说明""这意味着")。',
503
- fix: '删掉主题总结,让信息通过事件和结果自然显现。',
533
+ name: '不许概括主题',
534
+ avoid: '把段落写成中心思想总结或人生道理(「这说明…」「这意味着…」)。',
535
+ fix: '删掉概括,让信息从事态与结果里自然显出来。',
504
536
  detectPatterns: ['这说明', '这意味着', '归根结底', '其实就是'],
505
537
  builtin: true,
506
538
  key: 'forbid-theme-summary',
@@ -510,9 +542,9 @@ export const BUILTIN_ANTI_AI_RULES: AntiAiRule[] = [
510
542
  globalBaselineEnabled: true,
511
543
  },
512
544
  {
513
- name: '禁止直接说教',
514
- avoid: '作者替角色或读者做直接价值判断和说教(如"我们都应该""人总要学会")。',
515
- fix: '改成角色具体处境或对话,不做抽象说教。',
545
+ name: '不许作者说教',
546
+ avoid: '作者替角色或读者下价值判断(「我们都应该…」「人总要学会…」)。',
547
+ fix: '换成角色的具体处境或台词,不做抽象说教。',
516
548
  detectPatterns: ['我们都应该', '人总要学会', '真正重要的是'],
517
549
  builtin: true,
518
550
  key: 'forbid-direct-preaching',
@@ -522,9 +554,9 @@ export const BUILTIN_ANTI_AI_RULES: AntiAiRule[] = [
522
554
  globalBaselineEnabled: true,
523
555
  },
524
556
  {
525
- name: '段落长度过于整齐',
526
- avoid: '段落长度和节奏过于平均,产生 AI 作文感。',
527
- fix: '打破段落长度均衡,让句子和段落有自然起伏。',
557
+ name: '段落长短过于均匀',
558
+ avoid: '段落长度与节奏过于平均,读起来像范文。',
559
+ fix: '打散段落长短,让句子与段落有自然起伏。',
528
560
  detectPatterns: [],
529
561
  builtin: true,
530
562
  key: 'risk-even-paragraph-length',
@@ -534,9 +566,9 @@ export const BUILTIN_ANTI_AI_RULES: AntiAiRule[] = [
534
566
  globalBaselineEnabled: true,
535
567
  },
536
568
  {
537
- name: '连续三段解释性叙事',
538
- avoid: '连续几段只有解释没有动作,削弱现场感。',
539
- fix: '插入动作、对话、环境反馈,减少连段说明。',
569
+ name: '连段交代没有动作',
570
+ avoid: '连续几段只在交代背景,没有动作与现场感。',
571
+ fix: '插入动作、对话、环境反馈,把连段说明拆开。',
540
572
  detectPatterns: [],
541
573
  builtin: true,
542
574
  key: 'risk-three-paragraphs-exposition',
@@ -546,9 +578,9 @@ export const BUILTIN_ANTI_AI_RULES: AntiAiRule[] = [
546
578
  globalBaselineEnabled: true,
547
579
  },
548
580
  {
549
- name: '对话纯功能推进',
550
- avoid: '对话只有信息推进,没有人物语气和生活噪音(如"告诉你""我们现在要")。',
551
- fix: '补入停顿、绕弯、语气差异和无效信息。',
581
+ name: '对话只剩功能',
582
+ avoid: '对话只推进信息,没有语气差异与生活噪音(「告诉你…」「我们现在要…」)。',
583
+ fix: '补入停顿、绕弯、语气差异与无效信息。',
552
584
  detectPatterns: ['告诉你', '我们现在要', '接下来就'],
553
585
  builtin: true,
554
586
  key: 'risk-dialogue-too-functional',
@@ -558,9 +590,9 @@ export const BUILTIN_ANTI_AI_RULES: AntiAiRule[] = [
558
590
  globalBaselineEnabled: true,
559
591
  },
560
592
  {
561
- name: '句式重复率过高',
562
- avoid: '连续句式过于整齐(如"首先""然后""接着""最后"),显得机械。',
563
- fix: '拉开句式长度和起句方式,打散结构。',
593
+ name: '句式重复率偏高',
594
+ avoid: '连续使用同构句式(「首先…然后…接着…最后…」),读起来机械。',
595
+ fix: '拉开句长与起句方式,打散结构。',
564
596
  detectPatterns: ['首先', '然后', '接着', '最后'],
565
597
  builtin: true,
566
598
  key: 'risk-repeated-sentence-structure',
@@ -582,9 +614,9 @@ export const BUILTIN_ANTI_AI_RULES: AntiAiRule[] = [
582
614
  globalBaselineEnabled: true,
583
615
  },
584
616
  {
585
- name: '鼓励无意义小动作',
586
- avoid: '(鼓励类)全篇缺少真实但不推动主线的小动作,人物显得空洞。',
587
- fix: '补入挠头、点烟、抠包装、挪椅子等小动作,增加人味与生活感。',
617
+ name: '多点无用小动作',
618
+ avoid: '(鼓励类)通篇没有真实但不推动剧情的小动作,人物显得空。',
619
+ fix: '补入挠头、点烟、抠包装、挪椅子之类的小动作,添人味与生活感。',
588
620
  detectPatterns: [],
589
621
  builtin: true,
590
622
  key: 'encourage-useless-action',
@@ -594,9 +626,9 @@ export const BUILTIN_ANTI_AI_RULES: AntiAiRule[] = [
594
626
  globalBaselineEnabled: false,
595
627
  },
596
628
  {
597
- name: '鼓励现实落差',
598
- avoid: '(鼓励类)人物预期和现实结果完全一致,缺少落差。',
599
- fix: '补出人物预期与实际结果之间的差距,制造张力。',
629
+ name: '多点预期落差',
630
+ avoid: '(鼓励类)人物预期与现实结果完全一致,没有落差。',
631
+ fix: '把预期与实际结果之间的差距写出来,制造张力。',
600
632
  detectPatterns: [],
601
633
  builtin: true,
602
634
  key: 'encourage-reality-gap',
@@ -606,9 +638,9 @@ export const BUILTIN_ANTI_AI_RULES: AntiAiRule[] = [
606
638
  globalBaselineEnabled: false,
607
639
  },
608
640
  {
609
- name: '鼓励嘴硬补偿',
610
- avoid: '(鼓励类)人物吃瘪后没有维持体面的反应。',
611
- fix: '给角色补一句嘴硬找补或自我合理化,保持人设温度。',
641
+ name: '多点嘴硬找补',
642
+ avoid: '(鼓励类)人物吃瘪后没有任何维持体面的反应。',
643
+ fix: '补一句嘴硬找补或自我合理化,保住人设温度。',
612
644
  detectPatterns: [],
613
645
  builtin: true,
614
646
  key: 'encourage-hard-mouth-compensation',
@@ -696,7 +728,7 @@ export const BUILTIN_GENRE_LIBRARY: GenreNode[] = [
696
728
  name: '仙侠修真',
697
729
  description: '以修仙境界、宗门斗争、法宝丹药为核心,读者期待从凡人到强者的成长与长生问道。',
698
730
  id: 'genre_xianxia',
699
- template: '强调修行路径、因果代价与宗门/仙途抉择。',
731
+ template: '落笔在修行路径、因果代价与宗门抉择上。',
700
732
  children: [
701
733
  { name: '凡人流', description: '资质平凡、步步为营,靠资源积累与心机博弈逆袭,强调真实感与代入感。', children: [] },
702
734
  { name: '苟道流', description: '主角苟且发育、藏锋敛芒,坐收渔利,强调生存智慧与反差爽点。', children: [] },
@@ -942,7 +974,7 @@ export const BUILTIN_PROGRESSION_MODES: ProgressionMode[] = [
942
974
  driver: "通过陪伴、修复、生活细节和关系回暖持续吸引读者。",
943
975
  readerExpectation: "读者反复获得安稳、温柔、回暖和情绪落地的满足感。",
944
976
  payoffs: ["生活日常", "陪伴修复", "小问题解决", "关系回温"],
945
- risks: ["高压主线喧宾夺主", "治愈感被连续打断"],
977
+ risks: ["高压主线喧宾夺主", "治愈感被反复打断"],
946
978
  primary: true,
947
979
  progressionUnits: ["生活日常", "陪伴修复", "小问题解决", "关系回温"],
948
980
  allowedConflictForms: ["低到中烈度困境", "关系误差", "生活压力"],
@@ -951,8 +983,8 @@ export const BUILTIN_PROGRESSION_MODES: ProgressionMode[] = [
951
983
  chapterUnit: "每章围绕一个生活片段或情绪修复点展开。",
952
984
  volumeReward: "卷末让读者感到人物状态更稳、更暖、更愿意继续生活。",
953
985
  mandatorySignals: ["生活感", "安抚点", "关系回暖"],
954
- antiSignals: ["高压主线喧宾夺主", "治愈感被连续打断"],
955
- resolutionStyle: "优先通过陪伴、理解、日常行动和小范围修复化解问题。",
986
+ antiSignals: ["高压主线喧宾夺主", "治愈感被反复打断"],
987
+ resolutionStyle: "用陪伴、理解与日常小修补把问题化掉。",
956
988
  },
957
989
  {
958
990
  key: "story_mode_comedy_root",
@@ -961,7 +993,7 @@ export const BUILTIN_PROGRESSION_MODES: ProgressionMode[] = [
961
993
  driver: "通过反差、包袱、误会和整活节奏持续制造轻松爽快感。",
962
994
  readerExpectation: "读者频繁获得笑点、反套路和情绪减压体验。",
963
995
  payoffs: ["设包袱", "误会升级", "反差回收", "局面失控"],
964
- risks: ["长时间严肃无包袱", "笑点只靠口癖和段子堆砌"],
996
+ risks: ["长时间严肃无包袱", "笑点全靠口癖与段子堆"],
965
997
  primary: true,
966
998
  progressionUnits: ["设包袱", "误会升级", "反差回收", "局面失控"],
967
999
  allowedConflictForms: ["误会", "反差", "社死", "整活翻车"],
@@ -970,8 +1002,8 @@ export const BUILTIN_PROGRESSION_MODES: ProgressionMode[] = [
970
1002
  chapterUnit: "每章至少要推进一个有效笑点结构。",
971
1003
  volumeReward: "卷末形成更大的整活名场面或误会共同体。",
972
1004
  mandatorySignals: ["反差", "回收", "轻松释放"],
973
- antiSignals: ["长时间严肃无包袱", "笑点只靠口癖和段子堆砌"],
974
- resolutionStyle: "通过包袱回收和失控场面完成释放。",
1005
+ antiSignals: ["长时间严肃无包袱", "笑点全靠口癖与段子堆"],
1006
+ resolutionStyle: "用包袱回收与失控场面完成释放。",
975
1007
  },
976
1008
  {
977
1009
  key: "story_mode_mystery_root",
@@ -984,7 +1016,7 @@ export const BUILTIN_PROGRESSION_MODES: ProgressionMode[] = [
984
1016
  primary: true,
985
1017
  progressionUnits: ["抛出疑点", "收集线索", "推演验证", "局势反转"],
986
1018
  allowedConflictForms: ["信息差", "隐藏动机", "智性对抗"],
987
- forbiddenConflictForms: ["为了保密故意不讲理", "纯体力对抗吃掉推演感"],
1019
+ forbiddenConflictForms: ["为了保密故意不讲理", "纯拼体力,推演感被吃掉"],
988
1020
  conflictCeiling: "high",
989
1021
  chapterUnit: "每章推进一个新疑点或一个旧疑点的验证。",
990
1022
  volumeReward: "卷末揭开一层更大的真相或完成一次关键博弈。",
@@ -999,17 +1031,17 @@ export const BUILTIN_PROGRESSION_MODES: ProgressionMode[] = [
999
1031
  driver: "通过人物关系的靠近、拉扯、错位与回收,持续制造追读动力。",
1000
1032
  readerExpectation: "读者不断获得关系变化、情感张力和关键情绪兑现。",
1001
1033
  payoffs: ["关系建立", "情绪拉扯", "信任变化", "节点兑现"],
1002
- risks: ["关系原地踏步", "只有设定没有互动"],
1034
+ risks: ["关系原地踏步", "设定堆在那儿,互动没有"],
1003
1035
  primary: true,
1004
1036
  progressionUnits: ["关系建立", "情绪拉扯", "信任变化", "节点兑现"],
1005
1037
  allowedConflictForms: ["关系误差", "情感错位", "现实阻力", "价值观摩擦"],
1006
- forbiddenConflictForms: ["关系线长期停滞", "无意义狗血反复打转", "情感推进被其他线长期吞没"],
1038
+ forbiddenConflictForms: ["关系线长期停滞", "无意义狗血来回打转", "情感推进长期被别的线吃掉"],
1007
1039
  conflictCeiling: "medium",
1008
1040
  chapterUnit: "每章推进一个关系节点、情绪变化或彼此认知变化。",
1009
1041
  volumeReward: "卷末让关键关系发生明确变化或完成一次高价值情感兑现。",
1010
1042
  mandatorySignals: ["关系张力", "情绪节点", "兑现感"],
1011
- antiSignals: ["关系原地踏步", "只有设定没有互动"],
1012
- resolutionStyle: "通过情绪交流、关系行动和关键选择完成推进或修复。",
1043
+ antiSignals: ["关系原地踏步", "设定堆在那儿,互动没有"],
1044
+ resolutionStyle: "靠情绪交流、关系行动与关键选择推进或修复。",
1013
1045
  },
1014
1046
  {
1015
1047
  key: "story_mode_growth_root",
@@ -1022,7 +1054,7 @@ export const BUILTIN_PROGRESSION_MODES: ProgressionMode[] = [
1022
1054
  primary: true,
1023
1055
  progressionUnits: ["获得目标", "挑战升级", "突破瓶颈", "进入新区域"],
1024
1056
  allowedConflictForms: ["试炼", "探索风险", "阶段门槛", "成长阵痛"],
1025
- forbiddenConflictForms: ["长期停滞不成长", "只有升级数值没有体验变化", "探索线长期缺席"],
1057
+ forbiddenConflictForms: ["长期停滞不成长", "只见数值上涨,体验没有变化", "探索线长期缺席"],
1026
1058
  conflictCeiling: "high",
1027
1059
  chapterUnit: "每章推进一个成长动作、一次探索发现或一段闯关反馈。",
1028
1060
  volumeReward: "卷末让人物到达更高阶段,或打开一片更大的冒险空间。",
@@ -1037,17 +1069,17 @@ export const BUILTIN_PROGRESSION_MODES: ProgressionMode[] = [
1037
1069
  driver: "让主角以明显优势碾压阻力,并不断刷新他人认知。",
1038
1070
  readerExpectation: "读者每隔几章都能看到一次明确的压制和地位确立。",
1039
1071
  payoffs: ["展示底牌", "压制对手", "扩大威慑", "重写规则"],
1040
- risks: ["主角像普通升级文一样长期弱势", "核心优势被故意封死"],
1072
+ risks: ["主角像普通升级文一样长期弱势", "核心优势被硬生生封住"],
1041
1073
  primary: false,
1042
1074
  progressionUnits: ["展示底牌", "压制对手", "扩大威慑", "重写规则"],
1043
1075
  allowedConflictForms: ["身份误判", "势力挑衅", "高手试探"],
1044
- forbiddenConflictForms: ["长期躲藏发育", "长时间无法反击的受虐剧情"],
1076
+ forbiddenConflictForms: ["长期躲藏发育", "长时间挨打却无法反击"],
1045
1077
  conflictCeiling: "high",
1046
1078
  chapterUnit: "单章围绕一次压制、试探或立威展开。",
1047
1079
  volumeReward: "卷末形成新的权力格局或更大范围的承认。",
1048
1080
  mandatorySignals: ["强者气场", "围观震撼", "越级压制"],
1049
- antiSignals: ["主角像普通升级文一样长期弱势", "核心优势被故意封死"],
1050
- resolutionStyle: "冲突以快速反制和高位碾压收束。",
1081
+ antiSignals: ["主角像普通升级文一样长期弱势", "核心优势被硬生生封住"],
1082
+ resolutionStyle: "用迅速反制与高位碾压把冲突收掉。",
1051
1083
  },
1052
1084
  {
1053
1085
  key: "story_mode_face_slap",
@@ -1056,17 +1088,17 @@ export const BUILTIN_PROGRESSION_MODES: ProgressionMode[] = [
1056
1088
  driver: "通过他人误判和后续反转持续兑现高频打脸快感。",
1057
1089
  readerExpectation: "读者不断看到轻视者被现场回收和反噬。",
1058
1090
  payoffs: ["误判铺垫", "身份反转", "公开回收", "舆论发酵"],
1059
- risks: ["只挨打不回收", "回收太轻没有爽点"],
1091
+ risks: ["只挨打不回收", "回收力度太轻,爽不起来"],
1060
1092
  primary: false,
1061
1093
  progressionUnits: ["误判铺垫", "身份反转", "公开回收", "舆论发酵"],
1062
1094
  allowedConflictForms: ["轻视", "公开羞辱", "资源争夺"],
1063
- forbiddenConflictForms: ["铺垫过长却没有回收", "打脸后没有实际影响"],
1095
+ forbiddenConflictForms: ["铺垫过长却没有回收", "打脸之后没有任何实际影响"],
1064
1096
  conflictCeiling: "medium",
1065
1097
  chapterUnit: "单章重点制造一次误判与回收闭环。",
1066
1098
  volumeReward: "卷末主角从被看轻者转为不可忽视的中心人物。",
1067
1099
  mandatorySignals: ["误判", "反转", "当场回收"],
1068
- antiSignals: ["只挨打不回收", "回收太轻没有爽点"],
1069
- resolutionStyle: "在最需要证明自己的场合完成反转和回收。",
1100
+ antiSignals: ["只挨打不回收", "回收力度太轻,爽不起来"],
1101
+ resolutionStyle: "在最需要证明的场合完成反转与回收。",
1070
1102
  },
1071
1103
  {
1072
1104
  key: "story_mode_misread",
@@ -1075,17 +1107,17 @@ export const BUILTIN_PROGRESSION_MODES: ProgressionMode[] = [
1075
1107
  driver: "利用他人对主角的过度解读制造持续失控的优势局面。",
1076
1108
  readerExpectation: "读者反复获得‘别人自己脑补过头’的反差快感。",
1077
1109
  payoffs: ["误读", "脑补升级", "群体扩散", "误会兑现"],
1078
- risks: ["误会强行", "所有人都很快看穿"],
1110
+ risks: ["误会强行", "所有人一眼就看穿"],
1079
1111
  primary: false,
1080
1112
  progressionUnits: ["误读", "脑补升级", "群体扩散", "误会兑现"],
1081
1113
  allowedConflictForms: ["信息不对称", "误会连锁", "群体解读偏差"],
1082
- forbiddenConflictForms: ["直接解释清楚", "误会只持续一次就结束"],
1114
+ forbiddenConflictForms: ["直接解释清楚", "误会只演一次就收"],
1083
1115
  conflictCeiling: "medium",
1084
1116
  chapterUnit: "单章围绕一次误解升级和意外收益展开。",
1085
1117
  volumeReward: "卷末误读体系形成稳定共识或传奇形象。",
1086
1118
  mandatorySignals: ["脑补", "失控传播", "主角被动受益"],
1087
- antiSignals: ["误会强行", "所有人都很快看穿"],
1088
- resolutionStyle: "让误会自然滚大,并转化为主角资源或声望。",
1119
+ antiSignals: ["误会强行", "所有人一眼就看穿"],
1120
+ resolutionStyle: "让误会自然滚大,最后变成主角的资源或声望。",
1089
1121
  },
1090
1122
  {
1091
1123
  key: "story_mode_secret_identity",
@@ -1094,7 +1126,7 @@ export const BUILTIN_PROGRESSION_MODES: ProgressionMode[] = [
1094
1126
  driver: "通过多重身份切换、隐藏与掉马风险制造连续张力。",
1095
1127
  readerExpectation: "读者不断看到身份差、信息差和掉马边缘的刺激感。",
1096
1128
  payoffs: ["建立马甲", "切换身份", "险些掉马", "掉马兑现"],
1097
- risks: ["身份线长期静止", "马甲只是名字不同没有用途"],
1129
+ risks: ["身份线长期静止", "马甲只是换个名字,没有实际用途"],
1098
1130
  primary: false,
1099
1131
  progressionUnits: ["建立马甲", "切换身份", "险些掉马", "掉马兑现"],
1100
1132
  allowedConflictForms: ["身份隐藏", "关系错位", "能力来源误判"],
@@ -1103,8 +1135,8 @@ export const BUILTIN_PROGRESSION_MODES: ProgressionMode[] = [
1103
1135
  chapterUnit: "单章至少推进一次身份利用或风险逼近。",
1104
1136
  volumeReward: "卷末形成关键掉马或更复杂的身份网。",
1105
1137
  mandatorySignals: ["信息差", "身份切换", "掉马钩子"],
1106
- antiSignals: ["身份线长期静止", "马甲只是名字不同没有用途"],
1107
- resolutionStyle: "围绕身份切换解决问题,再把压力转移到下一层掉马风险。",
1138
+ antiSignals: ["身份线长期静止", "马甲只是换个名字,没有实际用途"],
1139
+ resolutionStyle: "用身份切换解局,再把压力推到下一层露馅风险上。",
1108
1140
  },
1109
1141
  {
1110
1142
  key: "story_mode_farming",
@@ -1117,7 +1149,7 @@ export const BUILTIN_PROGRESSION_MODES: ProgressionMode[] = [
1117
1149
  primary: false,
1118
1150
  progressionUnits: ["播种准备", "生产积累", "邻里互动", "收成兑现"],
1119
1151
  allowedConflictForms: ["资源短缺", "天气与环境压力", "小范围利益摩擦"],
1120
- forbiddenConflictForms: ["长期高压生死线", "无止境的大反派主线"],
1152
+ forbiddenConflictForms: ["长期高压生死线", "大反派主线永远收不掉"],
1121
1153
  conflictCeiling: "low",
1122
1154
  chapterUnit: "单章围绕一项劳作、一项建设或一段生活改善展开。",
1123
1155
  volumeReward: "卷末形成一个明显更稳定、更温暖的生活阶段。",
@@ -1132,17 +1164,17 @@ export const BUILTIN_PROGRESSION_MODES: ProgressionMode[] = [
1132
1164
  driver: "通过经营决策和组织扩张持续制造上升感。",
1133
1165
  readerExpectation: "读者反复看到业务跑起来、组织成型和口碑增长。",
1134
1166
  payoffs: ["找到突破口", "搭建流程", "扩大规模", "赢得市场"],
1135
- risks: ["只讲结果不讲过程", "经营主线被反派线吃掉"],
1167
+ risks: ["只讲结果不讲过程", "经营主线被反派线吞掉"],
1136
1168
  primary: false,
1137
1169
  progressionUnits: ["找到突破口", "搭建流程", "扩大规模", "赢得市场"],
1138
1170
  allowedConflictForms: ["经营竞争", "资源调配", "团队磨合"],
1139
- forbiddenConflictForms: ["无关的恋爱狗血长期抢戏", "经营过程被一笔带过"],
1171
+ forbiddenConflictForms: ["无关的恋爱狗血长期抢戏", "经营过程一笔带过"],
1140
1172
  conflictCeiling: "medium",
1141
1173
  chapterUnit: "单章推进一个经营动作或组织问题。",
1142
1174
  volumeReward: "卷末形成业务升级、品牌确立或组织跃迁。",
1143
1175
  mandatorySignals: ["策略感", "经营动作", "结果反馈"],
1144
- antiSignals: ["只讲结果不讲过程", "经营主线被反派线吃掉"],
1145
- resolutionStyle: "靠策略、运营、分工和节奏管理解决问题。",
1176
+ antiSignals: ["只讲结果不讲过程", "经营主线被反派线吞掉"],
1177
+ resolutionStyle: "用策略、运营、分工与节奏管理解决问题。",
1146
1178
  },
1147
1179
  {
1148
1180
  key: "story_mode_territory_building",
@@ -1151,17 +1183,17 @@ export const BUILTIN_PROGRESSION_MODES: ProgressionMode[] = [
1151
1183
  driver: "通过把一块地、一座城或一个据点逐步经营成型,持续制造扩张与稳固的成就感。",
1152
1184
  readerExpectation: "读者不断看到领地变强、秩序成型和安全感提升。",
1153
1185
  payoffs: ["招募与安置", "设施建设", "规则落地", "外部试探回击"],
1154
- risks: ["只有战争没有建设", "领地存在感越来越弱"],
1186
+ risks: ["只有战争没有建设", "领地越来越没存在感"],
1155
1187
  primary: false,
1156
1188
  progressionUnits: ["招募与安置", "设施建设", "规则落地", "外部试探回击"],
1157
1189
  allowedConflictForms: ["资源紧张", "边界摩擦", "管理压力", "治安危机"],
1158
- forbiddenConflictForms: ["领地长期形同虚设", "主线被纯个人恩怨彻底带走"],
1190
+ forbiddenConflictForms: ["领地长期形同虚设", "主线被私人恩怨整个带偏"],
1159
1191
  conflictCeiling: "medium",
1160
1192
  chapterUnit: "单章推进一个领地建设动作、治理问题或外部试探应对。",
1161
1193
  volumeReward: "卷末让领地规模、秩序或影响力出现清晰跃升。",
1162
1194
  mandatorySignals: ["据点成长", "治理动作", "秩序成型"],
1163
- antiSignals: ["只有战争没有建设", "领地存在感越来越弱"],
1164
- resolutionStyle: "优先通过建设、治理、组织和局部反制稳定局面。",
1195
+ antiSignals: ["只有战争没有建设", "领地越来越没存在感"],
1196
+ resolutionStyle: "用建设、治理、组织与局部反制先把局面稳住。",
1165
1197
  },
1166
1198
  {
1167
1199
  key: "story_mode_family_management",
@@ -1170,17 +1202,17 @@ export const BUILTIN_PROGRESSION_MODES: ProgressionMode[] = [
1170
1202
  driver: "通过家业扩张、家族关系重组和责任传承维持故事推进。",
1171
1203
  readerExpectation: "读者既能看到家底变厚,也能看到家族成员关系越来越成体系。",
1172
1204
  payoffs: ["家业调整", "成员磨合", "资源积累", "家族地位提升"],
1173
- risks: ["只剩吵架不见经营", "家族线没有传承感"],
1205
+ risks: ["只剩吵架不见经营", "家族线缺少传承味道"],
1174
1206
  primary: false,
1175
1207
  progressionUnits: ["家业调整", "成员磨合", "资源积累", "家族地位提升"],
1176
1208
  allowedConflictForms: ["家务分歧", "利益分配", "外部竞争", "代际观念冲突"],
1177
- forbiddenConflictForms: ["狗血撕裂长期压倒经营线", "家族成员只有工具功能没有关系变化"],
1209
+ forbiddenConflictForms: ["狗血撕裂长期压倒经营线", "家族人只剩功能位,关系毫无变化"],
1178
1210
  conflictCeiling: "medium",
1179
1211
  chapterUnit: "单章推进一次家业动作、一场家族互动或一项责任兑现。",
1180
1212
  volumeReward: "卷末让家族更稳固、更有凝聚力,或完成一次地位跃升。",
1181
1213
  mandatorySignals: ["家族协作", "家业动作", "关系重组"],
1182
- antiSignals: ["只剩吵架不见经营", "家族线没有传承感"],
1183
- resolutionStyle: "通过协商、分工、经营结果和共同应对危机完成修复。",
1214
+ antiSignals: ["只剩吵架不见经营", "家族线缺少传承味道"],
1215
+ resolutionStyle: "用协商、分工、经营成果与共同扛危机完成修复。",
1184
1216
  },
1185
1217
  {
1186
1218
  key: "story_mode_healing_daily",
@@ -1189,17 +1221,17 @@ export const BUILTIN_PROGRESSION_MODES: ProgressionMode[] = [
1189
1221
  driver: "靠日常陪伴和细小修复慢慢把人物带回稳定状态。",
1190
1222
  readerExpectation: "读者每几章都获得一次情绪被抚平的体验。",
1191
1223
  payoffs: ["日常互动", "情绪安抚", "关系熟化", "生活改善"],
1192
- risks: ["冲突升级成高压大戏", "读完一章只剩焦虑"],
1224
+ risks: ["冲突升级成高压大戏", "一章读完只剩焦虑"],
1193
1225
  primary: false,
1194
1226
  progressionUnits: ["日常互动", "情绪安抚", "关系熟化", "生活改善"],
1195
1227
  allowedConflictForms: ["生活小挫折", "关系别扭", "旧伤回响"],
1196
- forbiddenConflictForms: ["大反派压顶", "长期极端痛苦不回收"],
1228
+ forbiddenConflictForms: ["大反派压顶", "极端痛苦长期不回收"],
1197
1229
  conflictCeiling: "low",
1198
1230
  chapterUnit: "每章围绕一个情绪节点和一个安抚点展开。",
1199
1231
  volumeReward: "卷末让角色和读者都感到状态明显回暖。",
1200
1232
  mandatorySignals: ["安抚感", "生活细节", "温柔互动"],
1201
- antiSignals: ["冲突升级成高压大戏", "读完一章只剩焦虑"],
1202
- resolutionStyle: "让人物通过陪伴、倾听和具体行动被一点点治好。",
1233
+ antiSignals: ["冲突升级成高压大戏", "一章读完只剩焦虑"],
1234
+ resolutionStyle: "让人物在陪伴、倾听与具体行动里一点点被治好。",
1203
1235
  },
1204
1236
  {
1205
1237
  key: "story_mode_shop_daily",
@@ -1208,17 +1240,17 @@ export const BUILTIN_PROGRESSION_MODES: ProgressionMode[] = [
1208
1240
  driver: "通过店铺经营、来客故事和社区互动形成持续新鲜感。",
1209
1241
  readerExpectation: "读者既能看到经营变化,也能得到温暖的陌生人故事。",
1210
1242
  payoffs: ["来客事件", "经营调整", "社区互动", "日常收束"],
1211
- risks: ["只剩经营数据没有人情味", "店铺存在感越来越弱"],
1243
+ risks: ["只剩经营数据没有人情味", "店铺越来越没存在感"],
1212
1244
  primary: false,
1213
1245
  progressionUnits: ["来客事件", "经营调整", "社区互动", "日常收束"],
1214
1246
  allowedConflictForms: ["小店经营压力", "人情摩擦", "生活琐事"],
1215
- forbiddenConflictForms: ["连续恶性打压", "重悬疑或高压阴谋主导"],
1247
+ forbiddenConflictForms: ["连续恶性打压", "悬疑过重或阴谋高压主导"],
1216
1248
  conflictCeiling: "medium",
1217
1249
  chapterUnit: "每章推进一次来客互动或经营小事件。",
1218
1250
  volumeReward: "卷末让小店更有人气、更有归属感。",
1219
1251
  mandatorySignals: ["小店空间感", "来客故事", "社区温度"],
1220
- antiSignals: ["只剩经营数据没有人情味", "店铺存在感越来越弱"],
1221
- resolutionStyle: "通过待人接物、经营调整和社区互助自然化解。",
1252
+ antiSignals: ["只剩经营数据没有人情味", "店铺越来越没存在感"],
1253
+ resolutionStyle: "靠待人接物、经营调整与社区互助自然化解。",
1222
1254
  },
1223
1255
  {
1224
1256
  key: "story_mode_slow_life",
@@ -1227,17 +1259,17 @@ export const BUILTIN_PROGRESSION_MODES: ProgressionMode[] = [
1227
1259
  driver: "通过缓慢但持续的生活改善与身心安定感推动读者停留。",
1228
1260
  readerExpectation: "读者反复获得放松、沉浸和‘终于缓下来’的满足感。",
1229
1261
  payoffs: ["日常作息", "环境熟悉", "生活改善", "情绪回稳"],
1230
- risks: ["为了刺激频繁硬拗大冲突", "节奏越来越躁没有呼吸感"],
1262
+ risks: ["为了刺激频繁硬拗大冲突", "越写越躁,没有呼吸"],
1231
1263
  primary: false,
1232
1264
  progressionUnits: ["日常作息", "环境熟悉", "生活改善", "情绪回稳"],
1233
- allowedConflictForms: ["轻微不适应", "生活小困扰", "关系疏离后的磨合"],
1234
- forbiddenConflictForms: ["持续高压倒计时", "强反派长期追杀或压顶阴谋"],
1265
+ allowedConflictForms: ["轻微不适应", "生活小困扰", "疏远之后的重新磨合"],
1266
+ forbiddenConflictForms: ["持续高压倒计时", "强反派长期追杀,或阴谋压顶"],
1235
1267
  conflictCeiling: "low",
1236
1268
  chapterUnit: "单章围绕一个生活片段、一项微小改善或一次情绪缓冲展开。",
1237
1269
  volumeReward: "卷末让人物真正拥有一个更稳、更舒服的生活状态。",
1238
1270
  mandatorySignals: ["生活秩序", "松弛感", "细节沉浸"],
1239
- antiSignals: ["为了刺激频繁硬拗大冲突", "节奏越来越躁没有呼吸感"],
1240
- resolutionStyle: "通过时间、陪伴、规律生活和小步修复慢慢化解问题。",
1271
+ antiSignals: ["为了刺激频繁硬拗大冲突", "越写越躁,没有呼吸"],
1272
+ resolutionStyle: "用时间、陪伴、规律生活与小步修补慢慢化解。",
1241
1273
  },
1242
1274
  {
1243
1275
  key: "story_mode_companion_healing",
@@ -1246,17 +1278,17 @@ export const BUILTIN_PROGRESSION_MODES: ProgressionMode[] = [
1246
1278
  driver: "通过陪伴关系逐步建立、安全感逐步累积来带动情绪兑现。",
1247
1279
  readerExpectation: "读者不断获得被理解、被陪着走过低谷的温柔满足。",
1248
1280
  payoffs: ["接近与试探", "日常照料", "情绪松动", "关系确认"],
1249
- risks: ["治愈线突然变虐恋拉扯", "陪伴关系没有实质推进"],
1281
+ risks: ["治愈线突然变虐恋拉扯", "陪伴关系没有实质进展"],
1250
1282
  primary: false,
1251
1283
  progressionUnits: ["接近与试探", "日常照料", "情绪松动", "关系确认"],
1252
1284
  allowedConflictForms: ["旧伤回避", "沟通迟滞", "生活压力", "短暂误解"],
1253
- forbiddenConflictForms: ["反复背刺", "虐点长时间不回收", "关系恶性拉扯失控"],
1285
+ forbiddenConflictForms: ["反复背刺", "虐点长期不回收", "拉扯过火到失去控制"],
1254
1286
  conflictCeiling: "low",
1255
1287
  chapterUnit: "单章推进一次陪伴动作、一次关系松动或一次情绪落地。",
1256
1288
  volumeReward: "卷末让关键关系显著升温,人物更愿意相信他人和生活。",
1257
1289
  mandatorySignals: ["陪伴感", "信任增长", "修复落地"],
1258
- antiSignals: ["治愈线突然变虐恋拉扯", "陪伴关系没有实质推进"],
1259
- resolutionStyle: "以耐心、陪伴、行动支持和情绪回应完成修复。",
1290
+ antiSignals: ["治愈线突然变虐恋拉扯", "陪伴关系没有实质进展"],
1291
+ resolutionStyle: "靠耐心、陪伴与实际行动把关系一点点修回来。",
1260
1292
  },
1261
1293
  {
1262
1294
  key: "story_mode_comedy",
@@ -1265,17 +1297,17 @@ export const BUILTIN_PROGRESSION_MODES: ProgressionMode[] = [
1265
1297
  driver: "靠高频包袱、反差和失控场面维持阅读快乐。",
1266
1298
  readerExpectation: "读者每章都能收获明确的轻松和好笑点。",
1267
1299
  payoffs: ["包袱铺设", "反差升级", "笑点回收", "场面翻车"],
1268
- risks: ["整段都很严肃", "只有吐槽没有结构"],
1300
+ risks: ["整段都很严肃", "光有吐槽,没有结构"],
1269
1301
  primary: false,
1270
1302
  progressionUnits: ["包袱铺设", "反差升级", "笑点回收", "场面翻车"],
1271
1303
  allowedConflictForms: ["误会", "社死", "身份反差", "认知错位"],
1272
- forbiddenConflictForms: ["长时间沉重苦情线", "笑点稀薄又不推进剧情"],
1304
+ forbiddenConflictForms: ["长时间沉重苦情线", "笑点稀少,剧情也不动"],
1273
1305
  conflictCeiling: "medium",
1274
1306
  chapterUnit: "每章围绕至少一个有效包袱闭环展开。",
1275
1307
  volumeReward: "卷末形成标志性名场面或持续流传的笑料。",
1276
1308
  mandatorySignals: ["包袱", "回收", "场面感"],
1277
- antiSignals: ["整段都很严肃", "只有吐槽没有结构"],
1278
- resolutionStyle: "用回收和升级继续抬高笑点而不是转沉重。",
1309
+ antiSignals: ["整段都很严肃", "光有吐槽,没有结构"],
1310
+ resolutionStyle: "靠回收与升级继续加码笑点,而不是转向沉重。",
1279
1311
  },
1280
1312
  {
1281
1313
  key: "story_mode_misunderstanding_comedy",
@@ -1284,17 +1316,17 @@ export const BUILTIN_PROGRESSION_MODES: ProgressionMode[] = [
1284
1316
  driver: "通过多方信息差导致的误会扩散维持喜剧节奏。",
1285
1317
  readerExpectation: "读者不断看到误会越滚越大却越有趣的效果。",
1286
1318
  payoffs: ["误会建立", "多方误读", "失控扩散", "喜剧回收"],
1287
- risks: ["误会无后劲", "澄清过快导致节奏熄火"],
1319
+ risks: ["误会无后劲", "澄清太快,节奏直接熄火"],
1288
1320
  primary: false,
1289
1321
  progressionUnits: ["误会建立", "多方误读", "失控扩散", "喜剧回收"],
1290
1322
  allowedConflictForms: ["误会", "错位沟通", "集体误读"],
1291
- forbiddenConflictForms: ["误会太快澄清", "误会只是重复同一个梗"],
1323
+ forbiddenConflictForms: ["误会太快澄清", "误会反复用同一个梗"],
1292
1324
  conflictCeiling: "medium",
1293
1325
  chapterUnit: "每章推进一层新的误解或回收节点。",
1294
1326
  volumeReward: "卷末形成一场大型误会名场面。",
1295
1327
  mandatorySignals: ["信息差", "误读", "扩散"],
1296
- antiSignals: ["误会无后劲", "澄清过快导致节奏熄火"],
1297
- resolutionStyle: "让误会在最搞笑的位置回收,或者升级成更大笑点。",
1328
+ antiSignals: ["误会无后劲", "澄清太快,节奏直接熄火"],
1329
+ resolutionStyle: "把误会放在最好笑的位置回收,或升级成更大的笑点。",
1298
1330
  },
1299
1331
  {
1300
1332
  key: "story_mode_absurd_subversion",
@@ -1303,17 +1335,17 @@ export const BUILTIN_PROGRESSION_MODES: ProgressionMode[] = [
1303
1335
  driver: "通过不断拆解常规预期,再给出更离谱但更成立的结果维持新鲜感。",
1304
1336
  readerExpectation: "读者持续获得‘居然还能这么来’的惊喜和轻松感。",
1305
1337
  payoffs: ["建立预期", "突然拧转", "离谱升级", "反套路回收"],
1306
- risks: ["为了搞怪牺牲可读性", "段子化堆叠没有故事推进"],
1338
+ risks: ["为了搞怪牺牲可读性", "段子堆叠,故事不往前"],
1307
1339
  primary: false,
1308
1340
  progressionUnits: ["建立预期", "突然拧转", "离谱升级", "反套路回收"],
1309
1341
  allowedConflictForms: ["反差", "错位", "整活失控", "设定玩梗"],
1310
- forbiddenConflictForms: ["只剩无意义发疯", "离谱但没有逻辑支点", "连续沉重正剧化"],
1342
+ forbiddenConflictForms: ["只剩无意义发疯", "够离谱,却找不到逻辑支点", "连续沉重正剧化"],
1311
1343
  conflictCeiling: "medium",
1312
1344
  chapterUnit: "每章至少推进一个预期建立与反套路回收闭环。",
1313
1345
  volumeReward: "卷末形成高传播度的离谱名场面或反套路高潮。",
1314
1346
  mandatorySignals: ["意外感", "反套路", "回收闭环"],
1315
- antiSignals: ["为了搞怪牺牲可读性", "段子化堆叠没有故事推进"],
1316
- resolutionStyle: "通过更高一层的反套路回收局面,而不是落回沉重正统冲突。",
1347
+ antiSignals: ["为了搞怪牺牲可读性", "段子堆叠,故事不往前"],
1348
+ resolutionStyle: "用更高一层的反套路把局面收回来,而不是跌回沉重正统冲突。",
1317
1349
  },
1318
1350
  {
1319
1351
  key: "story_mode_mystery_inference",
@@ -1326,7 +1358,7 @@ export const BUILTIN_PROGRESSION_MODES: ProgressionMode[] = [
1326
1358
  primary: false,
1327
1359
  progressionUnits: ["提出疑点", "补充线索", "推演收束", "揭开真相"],
1328
1360
  allowedConflictForms: ["线索冲突", "证词矛盾", "隐藏动机"],
1329
- forbiddenConflictForms: ["关键证据凭空出现", "为了拖延故意含糊"],
1361
+ forbiddenConflictForms: ["关键证据凭空出现", "该说明的地方故意含糊拖节奏"],
1330
1362
  conflictCeiling: "medium",
1331
1363
  chapterUnit: "每章推进一个关键疑点的认知变化。",
1332
1364
  volumeReward: "卷末揭穿核心谜面或打开更大的悬念入口。",
@@ -1345,7 +1377,7 @@ export const BUILTIN_PROGRESSION_MODES: ProgressionMode[] = [
1345
1377
  primary: false,
1346
1378
  progressionUnits: ["布局", "试探", "反制", "收网"],
1347
1379
  allowedConflictForms: ["策略对抗", "心理博弈", "资源算计"],
1348
- forbiddenConflictForms: ["对手太蠢", "所有胜利都靠主角开挂信息"],
1380
+ forbiddenConflictForms: ["对手太蠢", "每次赢都靠主角的信息外挂"],
1349
1381
  conflictCeiling: "medium",
1350
1382
  chapterUnit: "每章推进一轮试探、布子或拆招。",
1351
1383
  volumeReward: "卷末完成一次大局收网或更高阶对手登场。",
@@ -1360,17 +1392,17 @@ export const BUILTIN_PROGRESSION_MODES: ProgressionMode[] = [
1360
1392
  driver: "通过资源稀缺、环境压力和规则对抗持续制造必须做出选择的张力。",
1361
1393
  readerExpectation: "读者反复获得局势求解、代价权衡和绝境翻盘的紧绷满足。",
1362
1394
  payoffs: ["压力逼近", "规则试探", "资源争夺", "短线反制"],
1363
- risks: ["危机廉价化", "总是同一类困境循环"],
1395
+ risks: ["危机廉价化", "困境反复在同一类里打转"],
1364
1396
  primary: false,
1365
1397
  progressionUnits: ["压力逼近", "规则试探", "资源争夺", "短线反制"],
1366
1398
  allowedConflictForms: ["资源稀缺", "规则压迫", "环境威胁", "群体博弈"],
1367
- forbiddenConflictForms: ["纯靠运气通关", "只有肉搏没有策略", "长期重复同一种危机"],
1399
+ forbiddenConflictForms: ["纯靠运气通关", "全是硬碰硬,没有策略", "同一种危机反复来"],
1368
1400
  conflictCeiling: "high",
1369
1401
  chapterUnit: "单章推进一轮生存压力、规则发现或关键抉择。",
1370
1402
  volumeReward: "卷末完成一次阶段求生成功、规则突破或阵营格局改写。",
1371
1403
  mandatorySignals: ["资源压力", "选择代价", "规则利用"],
1372
- antiSignals: ["危机廉价化", "总是同一类困境循环"],
1373
- resolutionStyle: "依靠规则理解、局势判断和有限资源配置完成破局。",
1404
+ antiSignals: ["危机廉价化", "困境反复在同一类里打转"],
1405
+ resolutionStyle: "靠吃透规则、判断局势与有限资源调度破局。",
1374
1406
  },
1375
1407
  {
1376
1408
  key: "story_mode_romantic_tension",
@@ -1379,17 +1411,17 @@ export const BUILTIN_PROGRESSION_MODES: ProgressionMode[] = [
1379
1411
  driver: "通过双向吸引与现实阻力之间的反复拉扯维持情感张力。",
1380
1412
  readerExpectation: "读者不断看到关系升温、试探失控和情绪回收。",
1381
1413
  payoffs: ["试探靠近", "边界碰撞", "情绪失衡", "关系推进"],
1382
- risks: ["只有误会拖延", "没有实质关系变化"],
1414
+ risks: ["只有误会拖延", "关系没有实质变化"],
1383
1415
  primary: false,
1384
1416
  progressionUnits: ["试探靠近", "边界碰撞", "情绪失衡", "关系推进"],
1385
1417
  allowedConflictForms: ["暧昧错位", "表达失败", "现实阻力", "价值观差异"],
1386
- forbiddenConflictForms: ["故意降智不说人话", "拖太久不推进", "关系线完全被外部主线压没"],
1418
+ forbiddenConflictForms: ["故意降智不说人话", "拖太久不推进", "关系线被主线彻底盖住"],
1387
1419
  conflictCeiling: "medium",
1388
1420
  chapterUnit: "单章推进一个情感试探、认知变化或关系边界松动。",
1389
1421
  volumeReward: "卷末让关系进入新阶段,或完成一次高浓度情绪确认。",
1390
1422
  mandatorySignals: ["暧昧感", "双向张力", "靠近兑现"],
1391
- antiSignals: ["只有误会拖延", "没有实质关系变化"],
1392
- resolutionStyle: "通过互动升级、情绪承认和行动选择完成关系推进。",
1423
+ antiSignals: ["只有误会拖延", "关系没有实质变化"],
1424
+ resolutionStyle: "靠互动升级、情绪承认与行动选择推进关系。",
1393
1425
  },
1394
1426
  {
1395
1427
  key: "story_mode_chasing_wife",
@@ -1398,17 +1430,17 @@ export const BUILTIN_PROGRESSION_MODES: ProgressionMode[] = [
1398
1430
  driver: "通过失去后的追偿、悔改和关系重建制造强烈情绪牵引。",
1399
1431
  readerExpectation: "读者持续获得‘该追的在追、该还的在还、该痛的有回应’的满足。",
1400
1432
  payoffs: ["后悔显现", "追偿行动", "关系试炼", "重建兑现"],
1401
- risks: ["只会口头道歉", "关系重建没有成本"],
1433
+ risks: ["只会口头道歉", "修复关系毫无代价"],
1402
1434
  primary: false,
1403
1435
  progressionUnits: ["后悔显现", "追偿行动", "关系试炼", "重建兑现"],
1404
1436
  allowedConflictForms: ["信任断裂", "旧伤反扑", "补偿落差", "现实阻碍"],
1405
- forbiddenConflictForms: ["追偿只停留在嘴上", "二次伤害无限循环", "被追一方完全失去主体性"],
1437
+ forbiddenConflictForms: ["追偿只停留在嘴上", "反复受伤却始终没有出口", "被追的一方彻底失去主动权"],
1406
1438
  conflictCeiling: "medium",
1407
1439
  chapterUnit: "单章推进一次追偿动作、一次旧伤碰撞或一次关系松动。",
1408
1440
  volumeReward: "卷末形成清晰的关系修复阶段或强力情绪回收。",
1409
1441
  mandatorySignals: ["悔意落地", "行动补偿", "边界重建"],
1410
- antiSignals: ["只会口头道歉", "关系重建没有成本"],
1411
- resolutionStyle: "用持续行动、代价承担和边界尊重推进关系重建。",
1442
+ antiSignals: ["只会口头道歉", "修复关系毫无代价"],
1443
+ resolutionStyle: "用持续行动、承担代价与尊重边界推进关系重建。",
1412
1444
  },
1413
1445
  {
1414
1446
  key: "story_mode_ensemble_bond",
@@ -1417,17 +1449,17 @@ export const BUILTIN_PROGRESSION_MODES: ProgressionMode[] = [
1417
1449
  driver: "通过多人互动和羁绊变化让故事始终有新的关系火花。",
1418
1450
  readerExpectation: "读者不断获得角色之间的新连接、站队变化和情感共振。",
1419
1451
  payoffs: ["关系串联", "群体事件", "立场变化", "羁绊加深"],
1420
- risks: ["角色只报名字不干活", "群像线断裂成单人独角戏"],
1452
+ risks: ["角色只报名字不干活", "群像散架,成了独角戏"],
1421
1453
  primary: false,
1422
1454
  progressionUnits: ["关系串联", "群体事件", "立场变化", "羁绊加深"],
1423
1455
  allowedConflictForms: ["立场差异", "责任分歧", "情感错位", "团队压力"],
1424
- forbiddenConflictForms: ["群像角色长期工具化", "只剩主角独走", "关系网不发生变化"],
1456
+ forbiddenConflictForms: ["群像角色长期工具化", "只剩主角独走", "人物关系始终原样不动"],
1425
1457
  conflictCeiling: "medium",
1426
1458
  chapterUnit: "单章推进一个群体互动节点或关键角色对之间的关系变化。",
1427
1459
  volumeReward: "卷末让群像结构更稳,或让队伍/关系网进入新阶段。",
1428
1460
  mandatorySignals: ["群体互动", "关系联动", "角色互相成就"],
1429
- antiSignals: ["角色只报名字不干活", "群像线断裂成单人独角戏"],
1430
- resolutionStyle: "通过团队互动、共同经历和角色间的选择完成关系演化。",
1461
+ antiSignals: ["角色只报名字不干活", "群像散架,成了独角戏"],
1462
+ resolutionStyle: "靠团队互动、共同经历与角色选择推动关系演化。",
1431
1463
  },
1432
1464
  {
1433
1465
  key: "story_mode_growth_leveling",
@@ -1436,17 +1468,17 @@ export const BUILTIN_PROGRESSION_MODES: ProgressionMode[] = [
1436
1468
  driver: "通过清晰可感的成长曲线和阶段突破持续拉动阅读。",
1437
1469
  readerExpectation: "读者不断看到能力、地位或认知层级获得实质提升。",
1438
1470
  payoffs: ["积累条件", "卡点受阻", "完成突破", "展示提升"],
1439
- risks: ["升级像流水账", "能力提升没有剧情后果"],
1471
+ risks: ["升级像流水账", "能力提升不带来剧情后果"],
1440
1472
  primary: false,
1441
1473
  progressionUnits: ["积累条件", "卡点受阻", "完成突破", "展示提升"],
1442
1474
  allowedConflictForms: ["瓶颈", "试炼", "资源不足", "同层竞争"],
1443
- forbiddenConflictForms: ["成长全靠旁白略过", "突破没有代价和铺垫", "升级后没有任何兑现"],
1475
+ forbiddenConflictForms: ["成长全靠旁白略过", "突破既无代价也无铺垫", "升级之后拿不到任何兑现"],
1444
1476
  conflictCeiling: "high",
1445
1477
  chapterUnit: "单章推进一次积累、一次卡点试探或一次成长兑现。",
1446
1478
  volumeReward: "卷末完成一个清晰等级、境界或阶段跃迁。",
1447
1479
  mandatorySignals: ["成长门槛", "突破反馈", "阶段变化"],
1448
- antiSignals: ["升级像流水账", "能力提升没有剧情后果"],
1449
- resolutionStyle: "通过积累、训练、实战和关键顿悟完成成长突破。",
1480
+ antiSignals: ["升级像流水账", "能力提升不带来剧情后果"],
1481
+ resolutionStyle: "靠积累、训练、实战与关键顿悟完成成长突破。",
1450
1482
  },
1451
1483
  {
1452
1484
  key: "story_mode_adventure_exploration",
@@ -1455,17 +1487,17 @@ export const BUILTIN_PROGRESSION_MODES: ProgressionMode[] = [
1455
1487
  driver: "通过不断进入未知区域、接触新规则和发现新秘密保持阅读新鲜感。",
1456
1488
  readerExpectation: "读者持续获得开图、发现与未知感兑现。",
1457
1489
  payoffs: ["进入新区域", "发现新规则", "遭遇风险", "带出新认知"],
1458
- risks: ["探索空转", "新区域没有存在意义"],
1490
+ risks: ["探索空转", "新区域没有存在的必要"],
1459
1491
  primary: false,
1460
1492
  progressionUnits: ["进入新区域", "发现新规则", "遭遇风险", "带出新认知"],
1461
1493
  allowedConflictForms: ["环境威胁", "未知规则", "探索竞争", "文明差异"],
1462
- forbiddenConflictForms: ["场景只是换皮", "探索没有新信息产出", "连续宅在原地不推进世界边界"],
1494
+ forbiddenConflictForms: ["场景只是换皮", "探索不产出新信息", "一直原地打转,世界边界不动"],
1463
1495
  conflictCeiling: "high",
1464
1496
  chapterUnit: "单章推进一次新发现、一次环境应对或一次地图探索。",
1465
1497
  volumeReward: "卷末打开新的区域层级、秘密入口或冒险目标。",
1466
1498
  mandatorySignals: ["未知感", "发现感", "地图扩展"],
1467
- antiSignals: ["探索空转", "新区域没有存在意义"],
1468
- resolutionStyle: "通过观察、应对、适应和局部突破打开更深层探索。",
1499
+ antiSignals: ["探索空转", "新区域没有存在的必要"],
1500
+ resolutionStyle: "靠观察、应对、适应与局部突破打开更深探索。",
1469
1501
  },
1470
1502
  {
1471
1503
  key: "story_mode_dungeon_challenge",
@@ -1474,17 +1506,17 @@ export const BUILTIN_PROGRESSION_MODES: ProgressionMode[] = [
1474
1506
  driver: "通过阶段性关卡挑战和规则破解形成连续的推进快感。",
1475
1507
  readerExpectation: "读者不断获得过关、破局和奖励兑现的满足。",
1476
1508
  payoffs: ["进入副本", "识别机制", "破解难点", "通关结算"],
1477
- risks: ["关卡同质化", "只剩数值堆砌没有机制"],
1509
+ risks: ["关卡同质化", "只有数值叠加,没有机制可言"],
1478
1510
  primary: false,
1479
1511
  progressionUnits: ["进入副本", "识别机制", "破解难点", "通关结算"],
1480
1512
  allowedConflictForms: ["关卡机制", "时间压力", "队伍配合", "资源限制"],
1481
- forbiddenConflictForms: ["副本机制全靠硬抗", "通关后没有奖励反馈", "副本重复到没有新意"],
1513
+ forbiddenConflictForms: ["副本机制全靠硬抗", "通关后拿不到奖励反馈", "关卡反复刷到失去新意"],
1482
1514
  conflictCeiling: "high",
1483
1515
  chapterUnit: "单章推进一个关卡节点、一个机制破解或一次通关反馈。",
1484
1516
  volumeReward: "卷末完成一段完整副本征程,获得显著奖励或更高阶入口。",
1485
1517
  mandatorySignals: ["机制感", "闯关反馈", "奖励兑现"],
1486
- antiSignals: ["关卡同质化", "只剩数值堆砌没有机制"],
1487
- resolutionStyle: "通过规则识别、团队配合和关键执行完成通关。",
1518
+ antiSignals: ["关卡同质化", "只有数值叠加,没有机制可言"],
1519
+ resolutionStyle: "靠识别规则、团队配合与关键执行完成通关。",
1488
1520
  },
1489
1521
  ]
1490
1522
 
@@ -1712,12 +1744,12 @@ export function styleTemplateToAsset(template: StyleTemplate): StyleAsset {
1712
1744
 
1713
1745
  // ---------------------------------------------------------- starter profiles
1714
1746
 
1715
- /** 起始风格画像库:无样本文本也能快速绑定一套写法(对齐上游 DEFAULT_STARTER_STYLE_PROFILES)。 */
1747
+ /** 起始风格画像库:无样本文本也能快速绑定一套写法(4 档起步写法)。 */
1716
1748
  export const BUILTIN_STARTER_STYLE_PROFILES: StarterStyleProfile[] = [
1717
- { key: 'starter-power-up', templateKey: 'power-up-escalation', name: '我的默认爽文推进写法', description: '适合第一次开书先跑顺目标推进、爽点兑现和章节收益点,后续可直接在此基础上微调。' },
1718
- { key: 'starter-suspense', templateKey: 'suspense-pressure', name: '我的默认悬疑压迫写法', description: '适合异常、规则、调查和危险逼近类故事,先帮你把压迫感和信息差稳住。' },
1719
- { key: 'starter-emotional', templateKey: 'emotional-tension', name: '我的默认情绪拉扯写法', description: '适合关系推进、误读拉扯和情绪兑现类故事,先有一套能直接开写的关系型表达底座。' },
1720
- { key: 'starter-daily', templateKey: 'immersive-daily', name: '我的默认日常浸没写法', description: '适合治愈、陪伴、生活经营和轻缓成长类故事,优先保证生活感和沉浸感。' },
1749
+ { key: 'starter-power-up', templateKey: 'power-up-escalation', name: '开书快跑·目标推进型', description: '第一次开书想先把推进感与爽点兑现跑顺,可以直接拿它起手,之后在这个底子上改。' },
1750
+ { key: 'starter-suspense', templateKey: 'suspense-pressure', name: '开书快跑·信息遮蔽型', description: '写给异常、规则、调查、危险逼近这类故事:先把压迫感与信息差立起来。' },
1751
+ { key: 'starter-emotional', templateKey: 'emotional-tension', name: '开书快跑·关系拉扯型', description: '写给关系推进、误读拉扯类故事:先拿一套能直接开写的关系表达底子。' },
1752
+ { key: 'starter-daily', templateKey: 'immersive-daily', name: '开书快跑·日常浸没型', description: '写给治愈、陪伴、生活经营、轻缓成长类故事:优先保证生活感与沉浸感。' },
1721
1753
  ]
1722
1754
 
1723
1755
  /** 起始风格画像 → 可直接绑定的 StyleAsset(绑定对应模板,名称用画像名)。 */
@@ -1749,7 +1781,7 @@ export function styleEngineSystemPrompt(): string {
1749
1781
  '6. 判断预设 preset:imitate=高保真仿写(保留全部特征),balanced=平衡(保留可迁移特征、降指纹),transfer=迁移(只取骨架、彻底去指纹)。',
1750
1782
  '7. 判断 fingerprintRisk:low/medium/high,表示照搬本样本会被识别为抄原作的风险。',
1751
1783
  '8. 输出必须是合法 JSON 对象,不要输出任何其他文字。',
1752
- 'JSON 结构:',
1784
+ '输出结构:',
1753
1785
  '{"proseRules": ["叙述视角与句式节奏规则"], "dialogueRules": ["台词风格规则"], "descriptionRules": ["描写密度与情绪表达规则"], "boundaries": ["表达边界"], "preset": "imitate|balanced|transfer", "fingerprintRisk": "low|medium|high", "writingGuidance": ["净化后的写作指引"], "forbiddenEntities": ["不可照搬的原作特有实体"]}',
1754
1786
  ].join('\n')
1755
1787
  }
@@ -1768,7 +1800,7 @@ export function styleFormulaSystemPrompt(depth: 'basic' | 'standard' | 'deep'):
1768
1800
  '1. 聚焦 focusAreas 指定的重点(如 开场/对话/节奏/爽点密度/段落结构)。',
1769
1801
  '2. formula 用 Markdown 分小节;applyGuidance 说明生成/改写时如何套用(1-3 句)。',
1770
1802
  '3. 只输出合法 JSON 对象,不要任何其他文字。',
1771
- 'JSON 结构:',
1803
+ '输出结构:',
1772
1804
  '{"name": "公式名", "focusAreas": ["重点域"], "formula": "Markdown 公式正文", "applyGuidance": "套用指引"}',
1773
1805
  ].join('\n')
1774
1806
  }