@waterwx/dsh-novel-forge 1.3.1 → 1.3.2-alpha

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (161) hide show
  1. package/README.md +288 -279
  2. package/lib/client.js +56309 -12221
  3. package/lib/index.js +14239 -5595
  4. package/lib/types/action-guard.d.ts +61 -0
  5. package/lib/types/ai-scan.d.ts +36 -0
  6. package/lib/types/assets.d.ts +24 -9
  7. package/lib/types/assistant.d.ts +29 -0
  8. package/lib/types/author-assets.d.ts +25 -0
  9. package/lib/types/bookshelf.d.ts +11 -1
  10. package/lib/types/client/api.d.ts +186 -10
  11. package/lib/types/client/chip-prefs.d.ts +36 -0
  12. package/lib/types/client/docx.d.ts +2 -0
  13. package/lib/types/client/index.d.ts +1 -1
  14. package/lib/types/client/llmLive.d.ts +31 -0
  15. package/lib/types/client/locales.d.ts +28 -67
  16. package/lib/types/client/panel/AdaptModeView.d.ts +5 -0
  17. package/lib/types/client/panel/AiTag.d.ts +1 -0
  18. package/lib/types/client/panel/AssistantTab.d.ts +4 -1
  19. package/lib/types/client/panel/AuthorAssetsView.d.ts +4 -0
  20. package/lib/types/client/panel/AuthorHome.d.ts +34 -0
  21. package/lib/types/client/panel/BookAnalysisView.d.ts +4 -0
  22. package/lib/types/client/panel/CmdPalette.d.ts +12 -0
  23. package/lib/types/client/panel/CreateBookView.d.ts +5 -1
  24. package/lib/types/client/panel/DirectorView.d.ts +7 -0
  25. package/lib/types/client/panel/GlobalAssetLibraryView.d.ts +4 -0
  26. package/lib/types/client/panel/IdeaInspirationView.d.ts +6 -0
  27. package/lib/types/client/panel/ImportModal.d.ts +7 -0
  28. package/lib/types/client/panel/KnowledgeBaseView.d.ts +4 -0
  29. package/lib/types/client/panel/LiveFeedLog.d.ts +13 -0
  30. package/lib/types/client/panel/MarketRadarView.d.ts +5 -0
  31. package/lib/types/client/panel/ModelManager.d.ts +14 -0
  32. package/lib/types/client/panel/NovelPanel.d.ts +6 -1
  33. package/lib/types/client/panel/PageHeader.d.ts +18 -0
  34. package/lib/types/client/panel/ProgressConsole.d.ts +17 -0
  35. package/lib/types/client/panel/ProgressHomeView.d.ts +5 -0
  36. package/lib/types/client/panel/PromptSlotsView.d.ts +11 -0
  37. package/lib/types/client/panel/ReasoningSection.d.ts +10 -0
  38. package/lib/types/client/panel/SettingsView.d.ts +19 -0
  39. package/lib/types/client/panel/ShelfView.d.ts +12 -1
  40. package/lib/types/client/panel/SubPage.d.ts +27 -0
  41. package/lib/types/client/panel/TensionView.d.ts +18 -0
  42. package/lib/types/client/panel/TimelineView.d.ts +18 -0
  43. package/lib/types/client/panel/helpers.d.ts +5 -3
  44. package/lib/types/client/panel/toast.d.ts +2 -0
  45. package/lib/types/client/panel/views.d.ts +25 -7
  46. package/lib/types/client/run-status.d.ts +21 -0
  47. package/lib/types/client/text.d.ts +9 -0
  48. package/lib/types/docx-core.d.ts +16 -0
  49. package/lib/types/docx.d.ts +2 -3
  50. package/lib/types/engine.d.ts +186 -45
  51. package/lib/types/global-assets.d.ts +6 -0
  52. package/lib/types/index.d.ts +22 -8
  53. package/lib/types/llm-live.d.ts +75 -0
  54. package/lib/types/llm-retry.d.ts +38 -0
  55. package/lib/types/market-radar-scan.d.ts +19 -0
  56. package/lib/types/market-radar-sources.d.ts +31 -0
  57. package/lib/types/migrate-output.d.ts +25 -0
  58. package/lib/types/novel-context.d.ts +80 -0
  59. package/lib/types/prompt-slots.d.ts +57 -0
  60. package/lib/types/prompt-utils.d.ts +35 -0
  61. package/lib/types/prompting.d.ts +10 -0
  62. package/lib/types/protocol.d.ts +1362 -166
  63. package/lib/types/review-policy.d.ts +97 -0
  64. package/lib/types/revision.d.ts +76 -0
  65. package/lib/types/routes.d.ts +4 -0
  66. package/lib/types/run.d.ts +23 -1
  67. package/lib/types/snapshots.d.ts +46 -0
  68. package/lib/types/stage-contract.d.ts +60 -0
  69. package/lib/types/tension.d.ts +53 -0
  70. package/lib/types/timeline.d.ts +37 -0
  71. package/package.json +52 -28
  72. package/src/action-guard.ts +127 -0
  73. package/src/ai-scan.ts +179 -0
  74. package/src/assets.ts +1806 -520
  75. package/src/assistant.ts +1098 -770
  76. package/src/author-assets.ts +149 -0
  77. package/src/bookshelf.ts +187 -151
  78. package/src/client/api.ts +378 -21
  79. package/src/client/chip-prefs.ts +121 -0
  80. package/src/client/docx.ts +37 -69
  81. package/src/client/index.ts +3 -1
  82. package/src/client/llmLive.ts +111 -0
  83. package/src/client/locales.ts +28 -253
  84. package/src/client/mount.tsx +1 -1
  85. package/src/client/panel/AdaptModeView.tsx +535 -0
  86. package/src/client/panel/AiTag.tsx +7 -0
  87. package/src/client/panel/AssetsTab.tsx +448 -458
  88. package/src/client/panel/AssistantTab.tsx +355 -301
  89. package/src/client/panel/AuthorAssetsView.tsx +206 -0
  90. package/src/client/panel/AuthorHome.tsx +309 -0
  91. package/src/client/panel/BookAnalysisView.tsx +63 -0
  92. package/src/client/panel/CmdPalette.tsx +102 -0
  93. package/src/client/panel/CreateBookView.tsx +366 -348
  94. package/src/client/panel/DirectorView.tsx +200 -0
  95. package/src/client/panel/GlobalAssetLibraryView.tsx +168 -0
  96. package/src/client/panel/IdeaInspirationView.tsx +76 -0
  97. package/src/client/panel/ImportModal.tsx +303 -0
  98. package/src/client/panel/KnowledgeBaseView.tsx +125 -0
  99. package/src/client/panel/LiveFeedLog.tsx +204 -0
  100. package/src/client/panel/MarketRadarView.tsx +377 -0
  101. package/src/client/panel/ModelManager.tsx +205 -0
  102. package/src/client/panel/NovelPanel.tsx +3135 -2651
  103. package/src/client/panel/PageHeader.tsx +37 -0
  104. package/src/client/panel/ProgressConsole.tsx +63 -0
  105. package/src/client/panel/PromptSlotsView.tsx +97 -0
  106. package/src/client/panel/ReaderView.tsx +306 -306
  107. package/src/client/panel/ReasoningSection.tsx +31 -0
  108. package/src/client/panel/RunPanel.tsx +64 -32
  109. package/src/client/panel/SettingsView.tsx +354 -0
  110. package/src/client/panel/ShelfView.tsx +266 -236
  111. package/src/client/panel/SubPage.tsx +42 -0
  112. package/src/client/panel/TensionView.tsx +212 -0
  113. package/src/client/panel/TimelineView.tsx +208 -0
  114. package/src/client/panel/WorldTab.tsx +202 -202
  115. package/src/client/panel/helpers.ts +7 -5
  116. package/src/client/panel/panel.module.css +4481 -1655
  117. package/src/client/panel/toast.ts +51 -0
  118. package/src/client/panel/views.tsx +401 -314
  119. package/src/client/run-status.ts +171 -0
  120. package/src/client/sidebar-entry.ts +1 -1
  121. package/src/client/text.ts +28 -0
  122. package/src/docx-core.ts +53 -0
  123. package/src/docx.ts +44 -83
  124. package/src/engine.ts +4672 -2943
  125. package/src/global-assets.ts +59 -0
  126. package/src/index.ts +89 -33
  127. package/src/llm-live.ts +260 -0
  128. package/src/llm-retry.ts +77 -0
  129. package/src/market-radar-scan.ts +41 -0
  130. package/src/market-radar-sources.ts +173 -0
  131. package/src/migrate-output.ts +76 -0
  132. package/src/novel-context.ts +286 -0
  133. package/src/prompt-slots.ts +125 -0
  134. package/src/prompting.ts +26 -0
  135. package/src/protocol.ts +1388 -158
  136. package/src/review-policy.ts +161 -0
  137. package/src/revision.ts +283 -0
  138. package/src/routes.ts +1934 -434
  139. package/src/run.ts +118 -21
  140. package/src/snapshots.ts +174 -0
  141. package/src/stage-contract.ts +189 -0
  142. package/src/tension.ts +251 -0
  143. package/src/timeline.ts +159 -0
  144. package/lib/client.js.map +0 -1
  145. package/lib/index.js.map +0 -1
  146. package/lib/types/comic-presets.d.ts +0 -12
  147. package/scripts/assistant-frames.txt +0 -8
  148. package/scripts/diagnose-adapter.mts +0 -81
  149. package/scripts/diagnose-assistant.mjs +0 -58
  150. package/scripts/diagnose-bible.mjs +0 -72
  151. package/scripts/diagnose-harness.mts +0 -75
  152. package/scripts/novel-forge-restart.log +0 -10
  153. package/scripts/novel-forge-web.stderr.log +0 -2
  154. package/scripts/novel-forge-web.stdout.log +0 -1
  155. package/scripts/outline-sample.txt +0 -449
  156. package/scripts/probe.mjs +0 -6
  157. package/scripts/restart-web.ps1 +0 -88
  158. package/scripts/smoke.mts +0 -72
  159. package/scripts/upload-github.ps1 +0 -51
  160. package/src/client/panel/BookshelfBar.tsx +0 -170
  161. package/src/comic-presets.ts +0 -67
@@ -0,0 +1,19 @@
1
+ /**
2
+ * 热门题材雷达:真实榜单扫榜(聚合各平台榜单源,容错)。
3
+ */
4
+ import { type CollectedRankingItem, type MarketRadarPlatform } from './market-radar-sources.ts';
5
+ export interface MarketRadarGroup {
6
+ platform: MarketRadarPlatform;
7
+ platformLabel: string;
8
+ listKey: string;
9
+ listLabel: string;
10
+ status: 'ok' | 'error';
11
+ error?: string;
12
+ items: CollectedRankingItem[];
13
+ }
14
+ export interface MarketScanResult {
15
+ scannedAt: string;
16
+ groups: MarketRadarGroup[];
17
+ }
18
+ export declare function getLastMarketScan(): MarketScanResult | null;
19
+ export declare function scanMarketRanking(platforms?: string[]): Promise<MarketScanResult>;
@@ -0,0 +1,31 @@
1
+ /**
2
+ * 「热门题材雷达」真实榜单抓取源(公开榜单页面的地址与选择器,属事实性配置)。
3
+ * 用全局 fetch 抓取公开榜单移动版页面,正则抽取元数据;无第三方依赖。
4
+ */
5
+ export type MarketRadarPlatform = 'fanqie' | 'qidian' | 'jinjiang';
6
+ export interface MarketRadarListSource {
7
+ platform: MarketRadarPlatform;
8
+ platformLabel: string;
9
+ listKey: string;
10
+ listLabel: string;
11
+ channel: string;
12
+ sourceUrl: string;
13
+ }
14
+ export interface CollectedRankingItem {
15
+ rank: number;
16
+ title: string;
17
+ author?: string;
18
+ category?: string;
19
+ tags: string[];
20
+ synopsis?: string;
21
+ heatLabel?: string;
22
+ serialStatus?: string;
23
+ sourceUrl: string;
24
+ }
25
+ export declare const MARKET_RADAR_SOURCES: MarketRadarListSource[];
26
+ export declare function hasPrivateUseCharacters(value: string | null | undefined): boolean;
27
+ export declare function parseFanqieRanking(html: string, source: MarketRadarListSource): CollectedRankingItem[];
28
+ export declare function parseFanqieDetail(html: string, item: CollectedRankingItem): CollectedRankingItem;
29
+ export declare function parseQidianRanking(html: string, source: MarketRadarListSource): CollectedRankingItem[];
30
+ export declare function parseJinjiangRanking(html: string, source: MarketRadarListSource): CollectedRankingItem[];
31
+ export declare function collectMarketSource(source: MarketRadarListSource): Promise<CollectedRankingItem[]>;
@@ -0,0 +1,25 @@
1
+ /**
2
+ * 输出目录迁移(Migrate Output Dir)— 把一本书/默认输出目录的内容搬到新位置。
3
+ *
4
+ * 安全纪律(数据零丢失排序):
5
+ * 1. copy 全部内容到新目录(源目录始终原样保留);
6
+ * 2. 调用方完成配置写入 / 书架重指向后,最后一步才删源目录;
7
+ * 3. 中途任何失败,最坏情况只是新目录多一份副本,源数据零丢失。
8
+ */
9
+ /** 目录内容清单(相对路径 + 总字节)。 */
10
+ export interface DirContents {
11
+ files: string[];
12
+ bytes: number;
13
+ }
14
+ /** 规范化路径用于比较(统一分隔符,Windows 忽略大小写)。 */
15
+ export declare function normalizeDir(dir: string): string;
16
+ /** 列出目录全部内容(递归;子目录以 `name/` 形式占位列出)。 */
17
+ export declare function listDirContents(dir: string): DirContents;
18
+ /**
19
+ * 把 from 全部内容复制到 to(源目录保留,删除由调用方在收尾执行)。
20
+ * 目标必须不存在或为空目录(防覆盖无关数据);禁止互相嵌套的目录对。
21
+ * @returns 复制的顶层条目数。
22
+ */
23
+ export declare function copyDirContents(from: string, to: string): number;
24
+ /** 删除源目录(仅复制 + 配置/书架重指向全部成功后调用)。 */
25
+ export declare function removeDir(dir: string): void;
@@ -0,0 +1,80 @@
1
+ /**
2
+ * 统一上下文组装与相关设定检索
3
+ *
4
+ * 取代各阶段各自拼装 prompt,消除「生成看得到、审稿看不到」的断层。
5
+ * 所有阶段通过 buildChapterContext 获取同一来源的事实与设定。
6
+ */
7
+ import type { ProjectState, ChapterPlan, StoryBible, RoleRecord, ChapterFact, Foreshadow, Plotline } from './protocol';
8
+ export interface ChapterContext {
9
+ /** 平台合规红线(永远全量) */
10
+ complianceRedLines: string[];
11
+ /** 本书写作红线(永远全量) */
12
+ bookRedLines: string[];
13
+ /** 当前章相关角色卡(全量信息) */
14
+ relevantRoles: Array<{
15
+ name: string;
16
+ role: string;
17
+ traits: string[];
18
+ goals?: string;
19
+ knowledge?: string[];
20
+ }>;
21
+ /** 当前章相关道藏规则 */
22
+ relevantWorldRules: string[];
23
+ /** 活跃剧情线 */
24
+ activePlotlines: Plotline[];
25
+ /** 未回收伏笔 */
26
+ activeForeshadows: Foreshadow[];
27
+ /** 上一章结尾原文 */
28
+ prevChapterTail: string;
29
+ /** 上一章摘要 */
30
+ prevChapterSummary?: string;
31
+ /** 最近事实(近因记忆,top20) */
32
+ recentFacts: string[];
33
+ /** 相关旧事实(按本章 beats 检索,top15) */
34
+ relatedFacts: string[];
35
+ /** 当前卷大纲 */
36
+ currentVolumeOutline: string;
37
+ /** 本章 beats */
38
+ beats: string;
39
+ /** 本章标题 */
40
+ chapterTitle: string;
41
+ }
42
+ export interface ContextBuildOptions {
43
+ /** 阶段:writing/review/revise/polish/plan */
44
+ stage?: 'writing' | 'review' | 'revise' | 'polish' | 'plan';
45
+ /** 是否注入完整角色卡(false 时只注入角色名+定位) */
46
+ fullRoleCards?: boolean;
47
+ /** 相关事实检索上限 */
48
+ relatedFactsLimit?: number;
49
+ /** 最近事实数量 */
50
+ recentFactsLimit?: number;
51
+ }
52
+ /**
53
+ * 相关事实检索:trigram 重合度 + 角色名命中加权 + 近因加权
54
+ * 从 generateChapterStream 抽取,扩展为通用函数。
55
+ */
56
+ export declare function retrieveRelatedFacts(facts: ChapterFact[], beatsText: string, roleNames: string[], limit?: number): string[];
57
+ /**
58
+ * 相关角色检索:beats 中出现的角色 + 主角/主要反派永远全量
59
+ */
60
+ export declare function retrieveRelevantRoles(bible: StoryBible | undefined, roles: RoleRecord[] | undefined, beatsText: string): ChapterContext['relevantRoles'];
61
+ /**
62
+ * 构建章节统一上下文
63
+ *
64
+ * 各阶段调用此函数获取同一来源的事实与设定,消除上下文断层。
65
+ * 检索结果不足时自动回退全量,保证不丢失关键信息。
66
+ */
67
+ export declare function buildChapterContext(project: ProjectState, chapter: ChapterPlan, outputDir: string, options?: ContextBuildOptions): ChapterContext;
68
+ /**
69
+ * 将上下文渲染为 prompt 文本块
70
+ * 各阶段可按需选择注入哪些块。
71
+ */
72
+ export declare function renderContextBlocks(ctx: ChapterContext): {
73
+ rolesBlock: string;
74
+ worldRulesBlock: string;
75
+ factsBlock: string;
76
+ plotlinesBlock: string;
77
+ foreshadowsBlock: string;
78
+ continuityBlock: string;
79
+ redLinesBlock: string;
80
+ };
@@ -0,0 +1,57 @@
1
+ /**
2
+ * 提示词槽位:给作者留几个**安全可改**的位置,用来微调本书的写作偏好。
3
+ *
4
+ * 设计边界(很重要):
5
+ * * 槽位只追加"作者偏好",**不允许覆盖**规则工程与合规红线——道藏、写作红线、
6
+ * 九条内容合规红线、反 AI 规则、阶段契约都由宿主锁定,槽位碰不到;
7
+ * * 槽位内容随项目保存(`novel-project.json`),换书即换槽位;
8
+ * * 每个槽位有长度上限,超长直接截断并标记(沿用「截断显式化」的规则)。
9
+ */
10
+ import type { ProjectState, PromptSlotId } from './protocol.ts';
11
+ /** 单个槽位的元信息。 */
12
+ export interface PromptSlotSpec {
13
+ id: PromptSlotId;
14
+ /** 面板显示名。 */
15
+ label: string;
16
+ /** 一句话说明它影响什么。 */
17
+ hint: string;
18
+ /** 示例(面板占位符)。 */
19
+ placeholder: string;
20
+ /** 字符上限。 */
21
+ maxChars: number;
22
+ }
23
+ /** 允许作者编辑的槽位(白名单;不在此列表的提示词一律不可改)。 */
24
+ export declare const PROMPT_SLOTS: readonly PromptSlotSpec[];
25
+ /** 单个槽位的渲染结果。 */
26
+ export interface RenderedSlot {
27
+ id: PromptSlotId;
28
+ label: string;
29
+ text: string;
30
+ /** 是否因超长被截断。 */
31
+ truncated: boolean;
32
+ /** 原文长度(截断前)。 */
33
+ chars: number;
34
+ }
35
+ /**
36
+ * 读取并规整项目里的槽位内容(去空白、按上限截断)。
37
+ *
38
+ * @param project 项目状态。
39
+ * @returns 非空槽位列表(保持 PROMPT_SLOTS 的声明顺序)。
40
+ */
41
+ export declare function readPromptSlots(project: ProjectState): RenderedSlot[];
42
+ /**
43
+ * 把槽位渲染成注入提示词的段落。
44
+ *
45
+ * @param project 项目状态。
46
+ * @returns 提示词片段;无槽位时返回空串。
47
+ */
48
+ export declare function renderPromptSlots(project: ProjectState): string;
49
+ /**
50
+ * 校验并规整一次槽位写入。
51
+ *
52
+ * @param id 槽位 id。
53
+ * @param value 内容(空串表示清空该槽位)。
54
+ * @returns 归一化后的内容。
55
+ * @throws 槽位 id 不在白名单时抛错。
56
+ */
57
+ export declare function normalizeSlotValue(id: string, value: string): string;
@@ -0,0 +1,35 @@
1
+ /**
2
+ * 提示词共享常量与工具
3
+ *
4
+ * 所有 JSON 输出规则、通用约束集中在此,避免各阶段重复定义、互相打架。
5
+ */
6
+ /** JSON 输出规则(所有要求模型输出 JSON 的地方共用) */
7
+ export declare const JSON_OUTPUT_RULES: string[];
8
+ /** JSON 输出规则的紧凑版(适合放在提示词末尾) */
9
+ export declare const JSON_OUTPUT_RULES_COMPACT: string;
10
+ /**
11
+ * 估算 prompt 的 token 数(粗略估算,用于上下文预算控制)
12
+ * 中文约 1.7 字/token,英文约 4 字符/token
13
+ */
14
+ export declare function estimateTokens(text: string): number;
15
+ /**
16
+ * 按 token 预算截断文本(保留开头,末尾加省略标记)
17
+ * 用于控制单块上下文不超预算。
18
+ */
19
+ export declare function truncateByTokens(text: string, maxTokens: number, marker?: string): string;
20
+ /** 通用「只改表达不改情节」约束(润色/局部修订共用) */
21
+ export declare const EXPRESSION_ONLY_RULE: string[];
22
+ /** 章节上下文各阶段的 token 预算(粗略,用于控制注入量) */
23
+ export declare const CONTEXT_BUDGET: {
24
+ /** 章节生成:道藏+角色+大纲+事实+伏笔 */
25
+ readonly writing: 12000;
26
+ /** AI 审稿:道藏+角色+事实+正文 */
27
+ readonly review: 10000;
28
+ /** 修订:原意见+相关事实+目标正文 */
29
+ readonly revise: 8000;
30
+ /** 润色:风格资产+原正文 */
31
+ readonly polish: 6000;
32
+ /** 分章规划:大纲+道藏+角色+近期事实 */
33
+ readonly plan: 15000;
34
+ };
35
+ export type ContextStage = keyof typeof CONTEXT_BUDGET;
@@ -0,0 +1,10 @@
1
+ /** 章节写作约束:把写作骨架渲染成可附加到系统提示词末尾的必达/禁止/自查块。 */
2
+ export declare 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;