@waterwx/dsh-novel-forge 1.3.1 → 1.3.2-alpha
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +288 -279
- package/lib/client.js +56309 -12221
- package/lib/index.js +14239 -5595
- package/lib/types/action-guard.d.ts +61 -0
- package/lib/types/ai-scan.d.ts +36 -0
- package/lib/types/assets.d.ts +24 -9
- package/lib/types/assistant.d.ts +29 -0
- package/lib/types/author-assets.d.ts +25 -0
- package/lib/types/bookshelf.d.ts +11 -1
- package/lib/types/client/api.d.ts +186 -10
- package/lib/types/client/chip-prefs.d.ts +36 -0
- package/lib/types/client/docx.d.ts +2 -0
- 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 +28 -67
- package/lib/types/client/panel/AdaptModeView.d.ts +5 -0
- 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/AuthorAssetsView.d.ts +4 -0
- package/lib/types/client/panel/AuthorHome.d.ts +34 -0
- 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/GlobalAssetLibraryView.d.ts +4 -0
- package/lib/types/client/panel/IdeaInspirationView.d.ts +6 -0
- package/lib/types/client/panel/ImportModal.d.ts +7 -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 +14 -0
- 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/ProgressConsole.d.ts +17 -0
- package/lib/types/client/panel/ProgressHomeView.d.ts +5 -0
- package/lib/types/client/panel/PromptSlotsView.d.ts +11 -0
- package/lib/types/client/panel/ReasoningSection.d.ts +10 -0
- package/lib/types/client/panel/SettingsView.d.ts +19 -0
- package/lib/types/client/panel/ShelfView.d.ts +12 -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/toast.d.ts +2 -0
- package/lib/types/client/panel/views.d.ts +25 -7
- package/lib/types/client/run-status.d.ts +21 -0
- package/lib/types/client/text.d.ts +9 -0
- package/lib/types/docx-core.d.ts +16 -0
- package/lib/types/docx.d.ts +2 -3
- package/lib/types/engine.d.ts +186 -45
- package/lib/types/global-assets.d.ts +6 -0
- package/lib/types/index.d.ts +22 -8
- package/lib/types/llm-live.d.ts +75 -0
- package/lib/types/llm-retry.d.ts +38 -0
- package/lib/types/market-radar-scan.d.ts +19 -0
- package/lib/types/market-radar-sources.d.ts +31 -0
- package/lib/types/migrate-output.d.ts +25 -0
- package/lib/types/novel-context.d.ts +80 -0
- package/lib/types/prompt-slots.d.ts +57 -0
- package/lib/types/prompt-utils.d.ts +35 -0
- package/lib/types/prompting.d.ts +10 -0
- package/lib/types/protocol.d.ts +1362 -166
- package/lib/types/review-policy.d.ts +97 -0
- package/lib/types/revision.d.ts +76 -0
- package/lib/types/routes.d.ts +4 -0
- package/lib/types/run.d.ts +23 -1
- package/lib/types/snapshots.d.ts +46 -0
- package/lib/types/stage-contract.d.ts +60 -0
- package/lib/types/tension.d.ts +53 -0
- package/lib/types/timeline.d.ts +37 -0
- package/package.json +52 -28
- package/src/action-guard.ts +127 -0
- package/src/ai-scan.ts +179 -0
- package/src/assets.ts +1806 -520
- package/src/assistant.ts +1098 -770
- package/src/author-assets.ts +149 -0
- package/src/bookshelf.ts +187 -151
- package/src/client/api.ts +378 -21
- package/src/client/chip-prefs.ts +121 -0
- package/src/client/docx.ts +37 -69
- package/src/client/index.ts +3 -1
- package/src/client/llmLive.ts +111 -0
- package/src/client/locales.ts +28 -253
- package/src/client/mount.tsx +1 -1
- package/src/client/panel/AdaptModeView.tsx +535 -0
- 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 +206 -0
- package/src/client/panel/AuthorHome.tsx +309 -0
- package/src/client/panel/BookAnalysisView.tsx +63 -0
- package/src/client/panel/CmdPalette.tsx +102 -0
- package/src/client/panel/CreateBookView.tsx +366 -348
- package/src/client/panel/DirectorView.tsx +200 -0
- package/src/client/panel/GlobalAssetLibraryView.tsx +168 -0
- package/src/client/panel/IdeaInspirationView.tsx +76 -0
- package/src/client/panel/ImportModal.tsx +303 -0
- package/src/client/panel/KnowledgeBaseView.tsx +125 -0
- package/src/client/panel/LiveFeedLog.tsx +204 -0
- package/src/client/panel/MarketRadarView.tsx +377 -0
- package/src/client/panel/ModelManager.tsx +205 -0
- package/src/client/panel/NovelPanel.tsx +3135 -2651
- package/src/client/panel/PageHeader.tsx +37 -0
- package/src/client/panel/ProgressConsole.tsx +63 -0
- package/src/client/panel/PromptSlotsView.tsx +97 -0
- package/src/client/panel/ReaderView.tsx +306 -306
- package/src/client/panel/ReasoningSection.tsx +31 -0
- package/src/client/panel/RunPanel.tsx +64 -32
- package/src/client/panel/SettingsView.tsx +354 -0
- package/src/client/panel/ShelfView.tsx +266 -236
- 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/panel.module.css +4481 -1655
- package/src/client/panel/toast.ts +51 -0
- package/src/client/panel/views.tsx +401 -314
- package/src/client/run-status.ts +171 -0
- package/src/client/sidebar-entry.ts +1 -1
- package/src/client/text.ts +28 -0
- package/src/docx-core.ts +53 -0
- package/src/docx.ts +44 -83
- package/src/engine.ts +4672 -2943
- package/src/global-assets.ts +59 -0
- package/src/index.ts +89 -33
- package/src/llm-live.ts +260 -0
- package/src/llm-retry.ts +77 -0
- package/src/market-radar-scan.ts +41 -0
- package/src/market-radar-sources.ts +173 -0
- package/src/migrate-output.ts +76 -0
- package/src/novel-context.ts +286 -0
- package/src/prompt-slots.ts +125 -0
- package/src/prompting.ts +26 -0
- package/src/protocol.ts +1388 -158
- package/src/review-policy.ts +161 -0
- package/src/revision.ts +283 -0
- package/src/routes.ts +1934 -434
- package/src/run.ts +118 -21
- package/src/snapshots.ts +174 -0
- package/src/stage-contract.ts +189 -0
- package/src/tension.ts +251 -0
- package/src/timeline.ts +159 -0
- package/lib/client.js.map +0 -1
- package/lib/index.js.map +0 -1
- package/lib/types/comic-presets.d.ts +0 -12
- package/scripts/assistant-frames.txt +0 -8
- package/scripts/diagnose-adapter.mts +0 -81
- package/scripts/diagnose-assistant.mjs +0 -58
- package/scripts/diagnose-bible.mjs +0 -72
- package/scripts/diagnose-harness.mts +0 -75
- package/scripts/novel-forge-restart.log +0 -10
- package/scripts/novel-forge-web.stderr.log +0 -2
- package/scripts/novel-forge-web.stdout.log +0 -1
- package/scripts/outline-sample.txt +0 -449
- package/scripts/probe.mjs +0 -6
- package/scripts/restart-web.ps1 +0 -88
- package/scripts/smoke.mts +0 -72
- package/scripts/upload-github.ps1 +0 -51
- package/src/client/panel/BookshelfBar.tsx +0 -170
- package/src/comic-presets.ts +0 -67
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 提示词槽位:给作者留几个**安全可改**的位置,用来微调本书的写作偏好。
|
|
3
|
+
*
|
|
4
|
+
* 设计边界(很重要):
|
|
5
|
+
* * 槽位只追加"作者偏好",**不允许覆盖**规则工程与合规红线——道藏、写作红线、
|
|
6
|
+
* 九条内容合规红线、反 AI 规则、阶段契约都由宿主锁定,槽位碰不到;
|
|
7
|
+
* * 槽位内容随项目保存(`novel-project.json`),换书即换槽位;
|
|
8
|
+
* * 每个槽位有长度上限,超长直接截断并标记(沿用「截断显式化」的规则)。
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import type { ProjectState, PromptSlotId } from './protocol.ts'
|
|
12
|
+
|
|
13
|
+
/** 单个槽位的元信息。 */
|
|
14
|
+
export interface PromptSlotSpec {
|
|
15
|
+
id: PromptSlotId
|
|
16
|
+
/** 面板显示名。 */
|
|
17
|
+
label: string
|
|
18
|
+
/** 一句话说明它影响什么。 */
|
|
19
|
+
hint: string
|
|
20
|
+
/** 示例(面板占位符)。 */
|
|
21
|
+
placeholder: string
|
|
22
|
+
/** 字符上限。 */
|
|
23
|
+
maxChars: number
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/** 允许作者编辑的槽位(白名单;不在此列表的提示词一律不可改)。 */
|
|
27
|
+
export const PROMPT_SLOTS: readonly PromptSlotSpec[] = [
|
|
28
|
+
{
|
|
29
|
+
id: 'styleExtra',
|
|
30
|
+
label: '文风补充',
|
|
31
|
+
hint: '追加到写作提示词末尾的风格偏好(句式、叙述习惯、用词倾向)。',
|
|
32
|
+
placeholder: '例如:多用短句和对话推进,少用成语;环境描写只写能影响动作的部分。',
|
|
33
|
+
maxChars: 1200,
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
id: 'antiAiExtra',
|
|
37
|
+
label: '反 AI 补充',
|
|
38
|
+
hint: '本书额外的"别这么写"清单,与内置反 AI 规则叠加(不能覆盖内置规则)。',
|
|
39
|
+
placeholder: '例如:不要每段都用比喻;不要用"空气中弥漫着"这类句式。',
|
|
40
|
+
maxChars: 1200,
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
id: 'dialogueExtra',
|
|
44
|
+
label: '对话补充',
|
|
45
|
+
hint: '角色说话方式的额外约束,写入时会与角色卡一起注入。',
|
|
46
|
+
placeholder: '例如:长辈说话带方言词;主角对熟人用绰号称呼。',
|
|
47
|
+
maxChars: 800,
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
id: 'endingHookExtra',
|
|
51
|
+
label: '章末钩子偏好',
|
|
52
|
+
hint: '对结尾钩子的额外要求(与章节计划里的 endingHook 叠加)。',
|
|
53
|
+
placeholder: '例如:结尾尽量落在一个未闭合的选择上,而不是新出现的敌人。',
|
|
54
|
+
maxChars: 600,
|
|
55
|
+
},
|
|
56
|
+
]
|
|
57
|
+
|
|
58
|
+
/** 槽位 id → 规格。 */
|
|
59
|
+
const SLOT_BY_ID = new Map(PROMPT_SLOTS.map(s => [s.id, s] as const))
|
|
60
|
+
|
|
61
|
+
/** 单个槽位的渲染结果。 */
|
|
62
|
+
export interface RenderedSlot {
|
|
63
|
+
id: PromptSlotId
|
|
64
|
+
label: string
|
|
65
|
+
text: string
|
|
66
|
+
/** 是否因超长被截断。 */
|
|
67
|
+
truncated: boolean
|
|
68
|
+
/** 原文长度(截断前)。 */
|
|
69
|
+
chars: number
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* 读取并规整项目里的槽位内容(去空白、按上限截断)。
|
|
74
|
+
*
|
|
75
|
+
* @param project 项目状态。
|
|
76
|
+
* @returns 非空槽位列表(保持 PROMPT_SLOTS 的声明顺序)。
|
|
77
|
+
*/
|
|
78
|
+
export function readPromptSlots(project: ProjectState): RenderedSlot[] {
|
|
79
|
+
const stored = project.promptSlots ?? {}
|
|
80
|
+
const out: RenderedSlot[] = []
|
|
81
|
+
for (const spec of PROMPT_SLOTS) {
|
|
82
|
+
const raw = (stored[spec.id] ?? '').trim()
|
|
83
|
+
if (raw === '') continue
|
|
84
|
+
const truncated = raw.length > spec.maxChars
|
|
85
|
+
out.push({
|
|
86
|
+
id: spec.id,
|
|
87
|
+
label: spec.label,
|
|
88
|
+
text: truncated ? raw.slice(0, spec.maxChars) : raw,
|
|
89
|
+
truncated,
|
|
90
|
+
chars: raw.length,
|
|
91
|
+
})
|
|
92
|
+
}
|
|
93
|
+
return out
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* 把槽位渲染成注入提示词的段落。
|
|
98
|
+
*
|
|
99
|
+
* @param project 项目状态。
|
|
100
|
+
* @returns 提示词片段;无槽位时返回空串。
|
|
101
|
+
*/
|
|
102
|
+
export function renderPromptSlots(project: ProjectState): string {
|
|
103
|
+
const slots = readPromptSlots(project)
|
|
104
|
+
if (slots.length === 0) return ''
|
|
105
|
+
const lines = ['==================== 作者偏好(本书自定义,优先级低于道藏/红线/合规) ====================']
|
|
106
|
+
for (const slot of slots) {
|
|
107
|
+
lines.push(`【${slot.label}】${slot.text}${slot.truncated ? `(已按 ${SLOT_BY_ID.get(slot.id)?.maxChars ?? 0} 字上限截断,原 ${slot.chars} 字)` : ''}`)
|
|
108
|
+
}
|
|
109
|
+
lines.push('以上偏好只影响表达方式;与道藏、写作红线、内容合规红线冲突时,一律以后者为准。')
|
|
110
|
+
return lines.join('\n')
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* 校验并规整一次槽位写入。
|
|
115
|
+
*
|
|
116
|
+
* @param id 槽位 id。
|
|
117
|
+
* @param value 内容(空串表示清空该槽位)。
|
|
118
|
+
* @returns 归一化后的内容。
|
|
119
|
+
* @throws 槽位 id 不在白名单时抛错。
|
|
120
|
+
*/
|
|
121
|
+
export function normalizeSlotValue(id: string, value: string): string {
|
|
122
|
+
const spec = SLOT_BY_ID.get(id as PromptSlotId)
|
|
123
|
+
if (spec === undefined) throw new Error(`未知提示词槽位:${id}`)
|
|
124
|
+
return value.replace(/\r\n/g, '\n').trim()
|
|
125
|
+
}
|
package/src/prompting.ts
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/** 章节写作约束:把写作骨架渲染成可附加到系统提示词末尾的必达/禁止/自查块。 */
|
|
2
|
+
export function renderChapterWriterSkeleton(meta: {
|
|
3
|
+
targetChars: number
|
|
4
|
+
minChars: number
|
|
5
|
+
maxChars: number
|
|
6
|
+
pov?: string
|
|
7
|
+
tonePreference?: string
|
|
8
|
+
endingHookPreference?: string
|
|
9
|
+
antiAiRules?: string
|
|
10
|
+
}): string {
|
|
11
|
+
const pov = meta.pov ?? '第三人称有限视角,严格跟随主角所见所知。'
|
|
12
|
+
const tone = meta.tonePreference ?? '文风贴合本书设定,用具体细节与动作推进。'
|
|
13
|
+
const hook = meta.endingHookPreference ?? '章末留一个明确的钩子(新信息、新风险或未闭合的选择)。'
|
|
14
|
+
const antiAi = meta.antiAiRules ?? ''
|
|
15
|
+
return [
|
|
16
|
+
'==================== 章节生成骨架(必达 / 禁止 / 输出前自查) ====================',
|
|
17
|
+
'【叙事视角】' + pov,
|
|
18
|
+
'【本章必达】本章必须发生实质变化——局面、关系、信息、风险、决策至少动一项;开篇直接进入情境,不复述上一章。',
|
|
19
|
+
'【禁止事项】不写以总结、复盘、解释为主的段落;不新增核心角色,不写入与上下文冲突的设定;不为凑字数注水。',
|
|
20
|
+
'【篇幅】目标 ' + meta.targetChars + ' 字,区间 ' + meta.minChars + '-' + meta.maxChars + ' 字;不够就继续推进有效情节,不许草草收尾。',
|
|
21
|
+
'【结尾】' + hook,
|
|
22
|
+
'【表达】用具体动作、对话与可感知细节往前推;' + tone,
|
|
23
|
+
'【反 AI】' + antiAi,
|
|
24
|
+
'【输出前自查】逐项确认:读者的回报、关键转折、章末净变化是否看得见?上一章留下的钩子有没有交代?人物的硬事实有没有被写反?确认无误再输出,正文里不要出现核查过程。',
|
|
25
|
+
].join('\n')
|
|
26
|
+
}
|