@waterwx/dsh-novel-forge 1.0.0 → 1.1.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 (125) hide show
  1. package/README.md +231 -206
  2. package/lib/client.js +55052 -4393
  3. package/lib/index.js +12013 -2524
  4. package/lib/types/ai-scan.d.ts +36 -0
  5. package/lib/types/assets.d.ts +19 -4
  6. package/lib/types/assistant.d.ts +6 -0
  7. package/lib/types/author-assets.d.ts +25 -0
  8. package/lib/types/bookshelf.d.ts +11 -1
  9. package/lib/types/client/api.d.ts +210 -4
  10. package/lib/types/client/docx.d.ts +2 -0
  11. package/lib/types/client/index.d.ts +1 -1
  12. package/lib/types/client/llmLive.d.ts +33 -0
  13. package/lib/types/client/locales.d.ts +102 -29
  14. package/lib/types/client/panel/AdaptModeView.d.ts +5 -0
  15. package/lib/types/client/panel/AiTag.d.ts +1 -0
  16. package/lib/types/client/panel/AuthorAssetsView.d.ts +4 -0
  17. package/lib/types/client/panel/AuthorHome.d.ts +34 -0
  18. package/lib/types/client/panel/BookAnalysisView.d.ts +4 -0
  19. package/lib/types/client/panel/CmdPalette.d.ts +12 -0
  20. package/lib/types/client/panel/CreateBookView.d.ts +13 -0
  21. package/lib/types/client/panel/DirectorView.d.ts +7 -0
  22. package/lib/types/client/panel/GlobalAssetLibraryView.d.ts +4 -0
  23. package/lib/types/client/panel/IdeaInspirationView.d.ts +6 -0
  24. package/lib/types/client/panel/ImportModal.d.ts +7 -0
  25. package/lib/types/client/panel/KnowledgeBaseView.d.ts +4 -0
  26. package/lib/types/client/panel/LiveFeedLog.d.ts +8 -0
  27. package/lib/types/client/panel/MarketRadarView.d.ts +5 -0
  28. package/lib/types/client/panel/ModelManager.d.ts +14 -0
  29. package/lib/types/client/panel/NovelPanel.d.ts +6 -1
  30. package/lib/types/client/panel/PageHeader.d.ts +18 -0
  31. package/lib/types/client/panel/ProgressConsole.d.ts +17 -0
  32. package/lib/types/client/panel/ProgressHomeView.d.ts +5 -0
  33. package/lib/types/client/panel/ReaderView.d.ts +8 -0
  34. package/lib/types/client/panel/ReasoningSection.d.ts +10 -0
  35. package/lib/types/client/panel/RunPanel.d.ts +5 -0
  36. package/lib/types/client/panel/SettingsView.d.ts +19 -0
  37. package/lib/types/client/panel/ShelfView.d.ts +24 -0
  38. package/lib/types/client/panel/SubPage.d.ts +27 -0
  39. package/lib/types/client/panel/WorldTab.d.ts +10 -0
  40. package/lib/types/client/panel/helpers.d.ts +10 -0
  41. package/lib/types/client/panel/toast.d.ts +2 -0
  42. package/lib/types/client/panel/views.d.ts +95 -0
  43. package/lib/types/client/run-status.d.ts +19 -0
  44. package/lib/types/client/text.d.ts +9 -0
  45. package/lib/types/docx-core.d.ts +16 -0
  46. package/lib/types/docx.d.ts +2 -3
  47. package/lib/types/engine.d.ts +228 -5
  48. package/lib/types/global-assets.d.ts +6 -0
  49. package/lib/types/index.d.ts +24 -2
  50. package/lib/types/llm-live.d.ts +44 -0
  51. package/lib/types/market-radar-scan.d.ts +19 -0
  52. package/lib/types/market-radar-sources.d.ts +31 -0
  53. package/lib/types/migrate-output.d.ts +25 -0
  54. package/lib/types/novel-context.d.ts +80 -0
  55. package/lib/types/prompt-utils.d.ts +35 -0
  56. package/lib/types/prompting.d.ts +10 -0
  57. package/lib/types/protocol.d.ts +1418 -7
  58. package/lib/types/review-policy.d.ts +97 -0
  59. package/lib/types/routes.d.ts +4 -0
  60. package/lib/types/run.d.ts +34 -0
  61. package/package.json +120 -93
  62. package/scripts/patch-schemastery.mjs +47 -0
  63. package/src/ai-scan.ts +179 -0
  64. package/src/assets.ts +1774 -518
  65. package/src/assistant.ts +915 -568
  66. package/src/author-assets.ts +149 -0
  67. package/src/bookshelf.ts +187 -148
  68. package/src/client/api.ts +675 -289
  69. package/src/client/docx.ts +37 -69
  70. package/src/client/index.ts +3 -1
  71. package/src/client/llmLive.ts +101 -0
  72. package/src/client/locales.ts +418 -271
  73. package/src/client/mount.tsx +1 -1
  74. package/src/client/panel/AdaptModeView.tsx +535 -0
  75. package/src/client/panel/AiTag.tsx +7 -0
  76. package/src/client/panel/AssetsTab.tsx +448 -456
  77. package/src/client/panel/AssistantTab.tsx +339 -188
  78. package/src/client/panel/AuthorAssetsView.tsx +206 -0
  79. package/src/client/panel/AuthorHome.tsx +309 -0
  80. package/src/client/panel/BookAnalysisView.tsx +63 -0
  81. package/src/client/panel/CmdPalette.tsx +102 -0
  82. package/src/client/panel/CreateBookView.tsx +366 -0
  83. package/src/client/panel/DirectorView.tsx +200 -0
  84. package/src/client/panel/GlobalAssetLibraryView.tsx +168 -0
  85. package/src/client/panel/IdeaInspirationView.tsx +76 -0
  86. package/src/client/panel/ImportModal.tsx +303 -0
  87. package/src/client/panel/KnowledgeBaseView.tsx +125 -0
  88. package/src/client/panel/LiveFeedLog.tsx +67 -0
  89. package/src/client/panel/MarketRadarView.tsx +377 -0
  90. package/src/client/panel/ModelManager.tsx +205 -0
  91. package/src/client/panel/NovelPanel.tsx +5374 -2159
  92. package/src/client/panel/PageHeader.tsx +37 -0
  93. package/src/client/panel/ProgressConsole.tsx +63 -0
  94. package/src/client/panel/ReaderView.tsx +306 -0
  95. package/src/client/panel/ReasoningSection.tsx +31 -0
  96. package/src/client/panel/RunPanel.tsx +223 -0
  97. package/src/client/panel/SettingsView.tsx +305 -0
  98. package/src/client/panel/ShelfView.tsx +266 -0
  99. package/src/client/panel/SubPage.tsx +42 -0
  100. package/src/client/panel/WorldTab.tsx +202 -0
  101. package/src/client/panel/helpers.ts +50 -0
  102. package/src/client/panel/panel.module.css +5764 -1698
  103. package/src/client/panel/toast.ts +51 -0
  104. package/src/client/panel/views.tsx +401 -0
  105. package/src/client/run-status.ts +143 -0
  106. package/src/client/sidebar-entry.ts +1 -1
  107. package/src/client/text.ts +28 -0
  108. package/src/docx-core.ts +53 -0
  109. package/src/docx.ts +44 -83
  110. package/src/engine.ts +4155 -1233
  111. package/src/global-assets.ts +59 -0
  112. package/src/index.ts +311 -184
  113. package/src/llm-live.ts +68 -0
  114. package/src/market-radar-scan.ts +41 -0
  115. package/src/market-radar-sources.ts +173 -0
  116. package/src/migrate-output.ts +76 -0
  117. package/src/novel-context.ts +286 -0
  118. package/src/prompting.ts +26 -0
  119. package/src/protocol.ts +2046 -623
  120. package/src/review-policy.ts +161 -0
  121. package/src/routes.ts +3391 -1172
  122. package/src/run.ts +341 -0
  123. package/lib/client.js.map +0 -1
  124. package/lib/index.js.map +0 -1
  125. package/src/client/panel/BookshelfBar.tsx +0 -170
@@ -0,0 +1,36 @@
1
+ /**
2
+ * 本地 AI 味扫描器(不调 LLM,确定性检测)
3
+ *
4
+ * 用途:生成/润色后自动扫描,结果作为「事实锚点」注入审稿提示词,
5
+ * 让 LLM 做判断而非机械统计。也可用于 UI 展示 AI 味指标。
6
+ */
7
+ export interface AiScanResult {
8
+ /** 总评分 0-100,越高越像 AI 写的 */
9
+ aiScore: number;
10
+ /** 命中的套话及次数 */
11
+ clicheHits: Array<{
12
+ word: string;
13
+ count: number;
14
+ }>;
15
+ /** 段落长度方差(过高=段落过于整齐) */
16
+ paragraphLengthVariance: number;
17
+ /** 连续解释性叙事段数(≥3 视为问题) */
18
+ consecutiveExpositoryParagraphs: number;
19
+ /** 句式重复率(相同开头句式占比) */
20
+ sentenceRepetitionRate: number;
21
+ /** 过长段落数(>300字) */
22
+ longParagraphCount: number;
23
+ /** 过短段落数(<20字) */
24
+ shortParagraphCount: number;
25
+ /** 对话占比(0-1) */
26
+ dialogueRatio: number;
27
+ /** 问题摘要,可直接注入审稿提示词 */
28
+ summary: string;
29
+ }
30
+ export declare function scanAiFlavor(text: string): AiScanResult;
31
+ /** 扫描前后对比(润色时用) */
32
+ export declare function compareAiScan(before: AiScanResult, after: AiScanResult): {
33
+ improved: boolean;
34
+ deltaScore: number;
35
+ details: string[];
36
+ };
@@ -8,7 +8,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
  */
11
- import type { AntiAiRule, GenreNode, ProgressionMode, ProjectAssets, StyleAsset, StyleTemplate } from './protocol.ts';
11
+ import type { AntiAiRule, GenreNode, PlotBeatTemplate, ProgressionMode, ProjectAssets, StarterStyleProfile, StyleAsset, StyleTemplate } from './protocol.ts';
12
12
  /** 预置写法模板(来自 AI-Novel-Writing-Assistant 内置 DEFAULT_STYLE_TEMPLATES)。 */
13
13
  export declare const BUILTIN_STYLE_TEMPLATES: StyleTemplate[];
14
14
  /** 内置全局反 AI 规则(来自 AI-Novel-Writing-Assistant 内置 DEFAULT_ANTI_AI_RULES)。 */
@@ -17,19 +17,34 @@ export declare const BUILTIN_ANTI_AI_RULES: AntiAiRule[];
17
17
  export declare const BUILTIN_GENRE_LIBRARY: GenreNode[];
18
18
  /** 内置常用推进模式。 */
19
19
  export declare const BUILTIN_PROGRESSION_MODES: ProgressionMode[];
20
+ /** 剧情桥段库:可复用情节套路(作者阅读经验沉淀,非某本书的剧情线)。 */
21
+ export declare const BUILTIN_PLOT_BEATS: PlotBeatTemplate[];
20
22
  /** 默认(空)项目写作资产。 */
21
23
  export declare function emptyProjectAssets(): ProjectAssets;
22
24
  /** 合并项目资产与内置库:返回「生效的反 AI 规则」(内置全局 + 项目自定义)。 */
23
25
  export declare function effectiveAntiAiRules(assets: ProjectAssets | undefined): AntiAiRule[];
24
- /** 把生效规则渲染成提示词块。 */
26
+ /** 安定 key:内置规则全局基线(globalBaselineEnabled)在新书/旧书一律生效。 */
27
+ export declare function ensureGlobalBaseline(assets: ProjectAssets | undefined): ProjectAssets;
28
+ /** 内置库种子化 upsert(对齐上游 SystemResourceBootstrapService 精神)。
29
+ * missing_only 仅补齐缺失的全局基线规则;sync_existing 还会按 key 刷新已内置规则的结构化字段。 */
30
+ export declare function ensureBuiltinAssets(assets: ProjectAssets | undefined, mode?: 'missing_only' | 'sync_existing'): ProjectAssets;
31
+ /** 把生效规则渲染成提示词块(禁止/风险/鼓励三档分列,压缩省 token)。 */
25
32
  export declare function renderAntiAiRules(assets: ProjectAssets | undefined): string;
26
33
  /** 渲染题材与推进模式提示词块。 */
27
34
  export declare function renderGenreAndProgression(assets: ProjectAssets | undefined): string;
28
- /** 渲染写法资产提示词块。 */
35
+ /** 渲染写法资产提示词块(规则去重,省 token)。 */
29
36
  export declare function renderStyleAssets(assets: ProjectAssets | undefined): string;
30
37
  /** 渲染全部写作资产提示词(供生成/规划/审稿注入)。 */
31
38
  export declare function renderAllAssets(assets: ProjectAssets | undefined): string;
32
39
  /** 预置写法模板 → 可直接绑定的 StyleAsset。 */
33
40
  export declare function styleTemplateToAsset(template: StyleTemplate): StyleAsset;
34
- /** 写法引擎:从样本文本提取风格资产的系统提示词。 */
41
+ /** 起始风格画像库:无样本文本也能快速绑定一套写法(对齐上游 DEFAULT_STARTER_STYLE_PROFILES)。 */
42
+ export declare const BUILTIN_STARTER_STYLE_PROFILES: StarterStyleProfile[];
43
+ /** 起始风格画像 → 可直接绑定的 StyleAsset(绑定对应模板,名称用画像名)。 */
44
+ export declare function starterProfileToAsset(profile: StarterStyleProfile): StyleAsset | null;
45
+ /** 根据指纹风险推荐仿写预设:low→imitate / medium→balanced / high→transfer。 */
46
+ export declare function recommendStylePreset(fingerprintRisk?: 'low' | 'medium' | 'high'): 'imitate' | 'balanced' | 'transfer';
47
+ /** 写法引擎:从样本文本提取风格资产的系统提示词(含 preset / 指纹 / 净化管线)。 */
35
48
  export declare function styleEngineSystemPrompt(): string;
49
+ /** 写作公式提取系统提示词(分层:basic 骨架 / standard 完整 / deep 逐句细化)。 */
50
+ export declare function styleFormulaSystemPrompt(depth: 'basic' | 'standard' | 'deep'): string;
@@ -19,6 +19,8 @@ import { chapterFileName } from './engine.ts';
19
19
  export declare const ASSISTANT_HISTORY_FILE = "novel-assistant.jsonl";
20
20
  /** Load the persisted conversation (empty when none). */
21
21
  export declare function loadAssistantHistory(outputDir: string): AssistantMessage[];
22
+ /** 清空助手对话记录(删除历史文件)。 */
23
+ export declare function clearAssistantHistory(outputDir: string): void;
22
24
  /** Execute one action directive. Returns a text result (or throws). */
23
25
  /**
24
26
  * Execute one action directive as an async generator: yields live progress
@@ -39,5 +41,9 @@ export declare function runAssistantTurn(ctx: Context, config: NovelConfig, proj
39
41
  frame: 'toolDelta';
40
42
  name: string;
41
43
  text: string;
44
+ } | {
45
+ frame: 'toolResult';
46
+ name: string;
47
+ text: string;
42
48
  }, void, unknown>;
43
49
  export { chapterFileName };
@@ -0,0 +1,25 @@
1
+ /**
2
+ * 作者资产库/总数据(跨书)— 按作者维度聚合的可复用资产。
3
+ * 与书架同惯例持久化到 ~/.dsh/dsh-novel-forge-author-assets.json。
4
+ * 提供读取/持久化/新增或更新/删除,以及「导入默认」:把书架书的写作资产/角色 +
5
+ * 内置全局库(题材/反AI规则/风格模板/推进模式)批量沉淀成资产条目(默认库)。
6
+ */
7
+ import type { AuthorAssetLibrary, AuthorStyleAsset } from './protocol.ts';
8
+ /** 作者资产库配置文件路径。 */
9
+ export declare function authorAssetsFile(): string;
10
+ /** 读取作者资产库(不存在/损坏则返回空库,不抛错)。 */
11
+ export declare function loadAuthorAssets(): AuthorAssetLibrary;
12
+ /** 持久化作者资产库。 */
13
+ export declare function saveAuthorAssets(library: AuthorAssetLibrary): void;
14
+ /** 新建一条资产(自动生成 id 与时间戳)。 */
15
+ export declare function createAuthorAsset(input: Omit<AuthorStyleAsset, 'id' | 'createdAt' | 'updatedAt'>): AuthorStyleAsset;
16
+ /** 按 id 更新一条资产;不存在则追加。 */
17
+ export declare function upsertAuthorAsset(input: AuthorStyleAsset): AuthorAssetLibrary;
18
+ /** 删除一条资产;返回更新后的资产库。 */
19
+ export declare function removeAuthorAsset(id: string): AuthorAssetLibrary;
20
+ /**
21
+ * 导入默认:把书架所有书的写作资产/角色 + 内置全局库批量沉淀到作者资产库。
22
+ * 按 `kind:name` 去重(已存在则跳过),不覆盖用户已有条目。
23
+ * @returns 更新后的资产库。
24
+ */
25
+ export declare function importDefaultAuthorAssets(): AuthorAssetLibrary;
@@ -26,12 +26,22 @@ export declare function renameBook(id: string, bookName: string): boolean;
26
26
  * @returns 是否发生了播种。
27
27
  */
28
28
  export declare function seedBookshelfFromOutputDir(outputDir: string): boolean;
29
+ /** 导入已有项目目录到书架:校验 novel-project.json,已存在则直接激活。 */
30
+ export declare function importDir(outputDir: string): {
31
+ book: BookEntry;
32
+ existed: boolean;
33
+ };
29
34
  /** 激活一本书。 */
30
35
  export declare function activateBook(id: string): BookEntry | undefined;
31
36
  /** 移除一本书。 */
32
37
  export declare function removeBook(id: string): boolean;
33
38
  /** 当前书输出目录(无书架则 undefined,回退 settings)。 */
34
39
  export declare function activeBookOutputDir(): string | undefined;
35
- /** 默认输出目录推断:桌面/书名。 */
40
+ /**
41
+ * 书目录重指向:把 outputDir 等于 from 的书条目全部改为 to(目录迁移联动)。
42
+ * @returns 重指向的条目数。
43
+ */
44
+ export declare function repointBookDirs(from: string, to: string): number;
45
+ /** 默认输出目录推断:~/.dsh/novels/书名。 */
36
46
  export declare function defaultOutputDirFor(bookName: string): string;
37
47
  export {};
@@ -3,11 +3,12 @@
3
3
  * fetch, same origin; generation/rewrite/polish ride NDJSON streams read
4
4
  * incrementally.
5
5
  */
6
- import { type AssetsPatch, type AssetsResponse, type BibleResponse, type ChapterResponse, type ConfigPatch, type ExportResponse, type ForeshadowRequest, type ForeshadowResponse, type JobFrame, type LoadOutlineResponse, type NovelConfig, type PlanResponse, type ReviewReport, type StatusResponse, type StyleEngineRequest, type StyleAsset, type VolumesResponse } from '../protocol.ts';
6
+ import { type AssetsPatch, type AssetsResponse, type AddModelRequest, type AddModelResponse, type LlmModelsResponse, type LlmProvidersResponse, type LlmVendorsResponse, type RemoveProviderRequest, type RemoveProviderResponse, type BibleResponse, type ChapterResponse, type ConfigPatch, type ExportResponse, type ForeshadowRequest, type ForeshadowResponse, type JobFrame, type LoadOutlineResponse, type AdaptExecuteRequest, type AdaptRewriteFrame, type AdaptMaterializeSaveRequest, type AdaptMaterializeSaveResponse, type PluginUpdateResponse, type LlmTestResponse, type NovelConfig, type PlanResponse, type ReviewReport, type StatusResponse, type StyleEngineRequest, type StyleAsset, type VolumesResponse } from '../protocol.ts';
7
7
  /** Error carrying the route's JSON error message. */
8
8
  export declare class NovelApiError extends Error {
9
9
  constructor(message: string);
10
10
  }
11
+ export declare function setCurrentBook(id: string | null): void;
11
12
  /** The browser half's only data entry point. */
12
13
  export declare class NovelApi {
13
14
  status(): Promise<StatusResponse>;
@@ -16,6 +17,12 @@ export declare class NovelApi {
16
17
  ok: boolean;
17
18
  bookName: string;
18
19
  }>;
20
+ /** 反推大纲:从已写章节正文反向生成全书总纲(NDJSON 流)。 */
21
+ outlineReverse(onFrame: (frame: JobFrame) => void): Promise<void>;
22
+ /** 开书想法 → AI 大纲:生成 count 个方案(换批时传 exclude 避开已暂留方向)。 */
23
+ outlineSuggest(idea: string, count?: number, exclude?: string[]): Promise<import('../protocol.ts').OutlineSuggestResponse>;
24
+ /** 拆书分析:对已写章节做结构/人物/文风/卖点体检。 */
25
+ breakdown(scope?: string, preset?: 'quick' | 'standard', budgetTokens?: number): Promise<import('../protocol.ts').BreakdownResponse>;
19
26
  plan(outline?: string, chapterCount?: number, volume?: number): Promise<PlanResponse>;
20
27
  volumes(outline?: string): Promise<VolumesResponse>;
21
28
  bible(outline?: string): Promise<BibleResponse>;
@@ -28,10 +35,22 @@ export declare class NovelApi {
28
35
  foreshadow(req: ForeshadowRequest): Promise<ForeshadowResponse>;
29
36
  exportBook(format: 'txt' | 'md'): Promise<ExportResponse>;
30
37
  chapter(no: number): Promise<ChapterResponse>;
38
+ /** 审查手动编辑的正文(不落盘)。previousReport 传入时走「验证模式」(核对原意见解决 + 只挑新增 high)。 */
39
+ chapterCheck(no: number, text: string, previousReport?: ReviewReport): Promise<{
40
+ report: ReviewReport;
41
+ }>;
42
+ /** 保存手动编辑的正文(自动备份 .bak;带报告则沿用落盘,否则保存后自动审稿)。 */
43
+ chapterSave(no: number, text: string, report?: ReviewReport): Promise<import('../protocol.ts').ChapterSaveResponse>;
31
44
  patchConfig(patch: ConfigPatch): Promise<{
32
45
  config: NovelConfig;
33
46
  }>;
47
+ /** 输出目录迁移:dryRun=true 仅预览目录内容;确认时传 to 搬迁。 */
48
+ moveOutputDir(to?: string, dryRun?: boolean): Promise<import('../protocol.ts').MoveOutputDirResponse>;
49
+ /** 本书参数:不带 patch 读取;带 patch 合并保存(字段传 null = 回退全局)。 */
50
+ bookSettings(patch?: Record<string, unknown>): Promise<import('../protocol.ts').BookSettingsResponse>;
34
51
  openFolder(): Promise<void>;
52
+ /** 插件自更新:在 DSH profile 目录拉取最新 npm 版(需重启 DSH 生效)。 */
53
+ pluginUpdate(): Promise<PluginUpdateResponse>;
35
54
  /** 书架快照。 */
36
55
  bookshelf(): Promise<import('../protocol.ts').BookshelfSnapshot>;
37
56
  /** 新建书并激活(开书向导:可携带大纲文本,创建即建项目)。 */
@@ -43,6 +62,94 @@ export declare class NovelApi {
43
62
  }>;
44
63
  /** 全书一致性质检。 */
45
64
  audit(): Promise<import('../protocol.ts').AuditResponse>;
65
+ /** 热门题材雷达:信号 + 生产底座。 */
66
+ marketRadar(req: import('../protocol.ts').MarketRadarRequest): Promise<{
67
+ result: import('../protocol.ts').MarketRadarResult;
68
+ }>;
69
+ /** 真实榜单扫榜:抓取公开榜单,返回分组候选。 */
70
+ marketRadarScan(req: {
71
+ platforms?: string[];
72
+ }): Promise<{
73
+ result: {
74
+ scannedAt: string;
75
+ groups: any[];
76
+ };
77
+ }>;
78
+ /** 把雷达生产底座里的新资产同步进全局资源库(跨书复用;已有名字跳过)。 */
79
+ marketRadarSync(req: {
80
+ foundation: import('../protocol.ts').ProductionFoundation;
81
+ }): Promise<{
82
+ ok: boolean;
83
+ synced: {
84
+ genre: boolean;
85
+ primaryMode: boolean;
86
+ secondaryMode: boolean;
87
+ };
88
+ }>;
89
+ /** 书内知识库:读取。 */
90
+ knowledgeList(): Promise<{
91
+ docs: import('../protocol.ts').KnowledgeDoc[];
92
+ }>;
93
+ /** 书内知识库:新增。 */
94
+ knowledgeAdd(doc: {
95
+ title: string;
96
+ content: string;
97
+ }): Promise<{
98
+ docs: import('../protocol.ts').KnowledgeDoc[];
99
+ }>;
100
+ /** 书内知识库:删除。 */
101
+ knowledgeRemove(id: string): Promise<{
102
+ docs: import('../protocol.ts').KnowledgeDoc[];
103
+ }>;
104
+ /** 书分析/拆书。 */
105
+ bookAnalysis(text: string): Promise<{
106
+ result: import('../protocol.ts').BookAnalysisResult;
107
+ }>;
108
+ /** 创意灵感。 */
109
+ ideaInspiration(idea: string, count?: number): Promise<{
110
+ result: import('../protocol.ts').IdeaInspirationResult;
111
+ }>;
112
+ /** 雷达→灵感:基于市场信号/生产底座/创意简报生成开书灵感。 */
113
+ marketIdeaInspiration(req: {
114
+ signals?: import('../protocol.ts').MarketRadarSignal[];
115
+ foundation?: import('../protocol.ts').ProductionFoundation;
116
+ brief?: import('../protocol.ts').MarketCreativeBrief;
117
+ count?: number;
118
+ }): Promise<{
119
+ result: import('../protocol.ts').IdeaInspirationResult;
120
+ }>;
121
+ /** 自动编辑编排建议:基于全书上下文。 */
122
+ director(focus?: string): Promise<{
123
+ result: import('../protocol.ts').DirectorAdvice;
124
+ }>;
125
+ /** 自动编辑「采纳」出的书内待办:读取。 */
126
+ directorTodosList(): Promise<{
127
+ todos: import('../protocol.ts').DirectorTodo[];
128
+ }>;
129
+ /** 待办:新增(来源 risk/fix)。 */
130
+ directorTodosAdd(text: string, source: 'risk' | 'fix'): Promise<{
131
+ todos: import('../protocol.ts').DirectorTodo[];
132
+ }>;
133
+ /** 待办:勾选/取消。 */
134
+ directorTodosToggle(id: string): Promise<{
135
+ todos: import('../protocol.ts').DirectorTodo[];
136
+ }>;
137
+ /** 待办:删除。 */
138
+ directorTodosRemove(id: string): Promise<{
139
+ todos: import('../protocol.ts').DirectorTodo[];
140
+ }>;
141
+ /** 用选中的市场信号 + 影响模式生成开书创意简报。 */
142
+ marketRadarBrief(req: import('../protocol.ts').MarketRadarBriefRequest): Promise<{
143
+ creativeBrief: import('../protocol.ts').MarketCreativeBrief;
144
+ }>;
145
+ /** 把雷达生产底座一键应用到某本书(写入项目资产/开书定盘)。 */
146
+ marketRadarApply(req: {
147
+ bookId?: string;
148
+ foundation: import('../protocol.ts').ProductionFoundation;
149
+ }): Promise<{
150
+ ok: boolean;
151
+ bookName: string;
152
+ }>;
46
153
  /** 角色卡刷新(基于事实库聚合)。 */
47
154
  charactersRefresh(): Promise<{
48
155
  cards: import('../protocol.ts').RoleStatusCard[];
@@ -52,14 +159,81 @@ export declare class NovelApi {
52
159
  ok: boolean;
53
160
  filled: number;
54
161
  }>;
55
- /** 设定圣经局部修补。 */
162
+ /** 道藏局部修补。 */
56
163
  biblePatch(patch: import('../protocol.ts').BiblePatchRequest): Promise<{
57
164
  bible: import('../protocol.ts').StoryBible;
58
165
  }>;
166
+ /** 剧情线管理:增删改 + 关联章节。 */
167
+ plotlines(req: import('../protocol.ts').PlotlinesRequest): Promise<import('../protocol.ts').PlotlinesResponse>;
168
+ /** 敏感词检查:指定章节 / 任意文本 / 全书。 */
169
+ sensitiveCheck(req: import('../protocol.ts').SensitiveCheckRequest): Promise<import('../protocol.ts').SensitiveCheckResponse>;
170
+ /** 作者复盘补跑:单章(JSON)。 */
171
+ reviewBackfillChapter(no: number): Promise<{
172
+ no: number;
173
+ review: import('../protocol.ts').AuthorReview;
174
+ }>;
175
+ /** 作者复盘补跑:全书缺失章节(NDJSON 流)。 */
176
+ reviewBackfillAll(onFrame: (frame: JobFrame) => void): Promise<void>;
177
+ /** 章节复位:generating 卡死 → pending。 */
178
+ chapterReset(no: number): Promise<{
179
+ ok: boolean;
180
+ no: number;
181
+ }>;
182
+ /** 章节直接通过(作者行使最终决定权)。 */
183
+ chapterApprove(no: number): Promise<{
184
+ ok: boolean;
185
+ no: number;
186
+ }>;
187
+ /** 对选中的提供商/模型发一次最小真实调用,验证连通性。 */
188
+ llmTest(provider: string, model: string): Promise<LlmTestResponse>;
189
+ /** 添加模型:厂商直填 key,或自定义 OpenAI 兼容路由(写 DSH 凭据 + 注册路由)。 */
190
+ addModel(req: AddModelRequest): Promise<AddModelResponse>;
191
+ /** 运行时厂商目录(DSH pi-ai 可配置提供方 + 内置适配器)。 */
192
+ llmVendors(): Promise<LlmVendorsResponse>;
193
+ /** 查询某个 provider 当前可用的模型(添加成功后可即时刷新)。 */
194
+ llmModels(provider: string): Promise<LlmModelsResponse>;
195
+ /** 已注册的提供方路由列表(提供方管理卡片)。 */
196
+ llmProviders(): Promise<LlmProvidersResponse>;
197
+ /** 移除一个提供方(unset key + 移除 llm-pi-ai 路由)。 */
198
+ removeProvider(req: RemoveProviderRequest): Promise<RemoveProviderResponse>;
199
+ roles(req: import('../protocol.ts').RolesRequest): Promise<import('../protocol.ts').RolesResponse>;
200
+ /** 小说简介:生成/补全(partial 留空 = 全量),或手动保存。 */
201
+ blurb(action: 'generate' | 'save', text?: string, partial?: string): Promise<{
202
+ blurb: string;
203
+ }>;
204
+ /** 封面:读取(dataUrl;dir 指定某本书的输出目录,省略为当前书)。 */
205
+ coverGet(dir?: string): Promise<import('../protocol.ts').CoverResponse>;
206
+ /** 封面:上传(base64 data URL)或移除。 */
207
+ coverPost(action: 'upload' | 'remove', dataUrl?: string): Promise<{
208
+ ok: boolean;
209
+ coverPath?: string | null;
210
+ }>;
211
+ /** 重命名当前书(同步项目与书架条目)。 */
212
+ rename(bookName: string): Promise<{
213
+ bookName: string;
214
+ }>;
215
+ /** 大世界:提炼(generate)或手动保存(save)。 */
216
+ world(action: 'generate' | 'save', world?: import('../protocol.ts').WorldState): Promise<{
217
+ world: import('../protocol.ts').WorldState;
218
+ }>;
59
219
  /** 切换当前书。 */
60
220
  bookActivate(id: string): Promise<import('../protocol.ts').BookshelfSnapshot>;
61
221
  /** 移除书架条目。 */
62
222
  bookRemove(id: string): Promise<import('../protocol.ts').BookshelfSnapshot>;
223
+ /** 导入已有项目目录(Mode A):校验 novel-project.json,登记/激活书架。 */
224
+ bookImportDir(outputDir: string): Promise<import('../protocol.ts').BookImportDirResponse>;
225
+ /** 导入 txt/md 全本(Mode B):服务器本地文件路径模式。 */
226
+ bookImportText(filePath: string, outputDir?: string): Promise<import('../protocol.ts').BookImportTextResponse>;
227
+ /** 拆章预览(浏览器上传全文,不落盘):返回识别到的章节与跳过清单。 */
228
+ bookImportTextPreview(text: string, fileName?: string): Promise<import('../protocol.ts').BookImportTextPreviewResponse>;
229
+ /** 导入 txt/md 全本(Mode B):浏览器上传全文内容模式。 */
230
+ bookImportTextContent(text: string, fileName: string, outputDir?: string): Promise<import('../protocol.ts').BookImportTextResponse>;
231
+ /** 生产单:启动批量生产(区间或新增 N 章;计划不足自动补)。 */
232
+ runStart(req: import('../protocol.ts').RunStartRequest): Promise<import('../protocol.ts').RunState>;
233
+ /** 生产单控制:pause / resume / stop。 */
234
+ runControl(action: 'pause' | 'resume' | 'stop'): Promise<import('../protocol.ts').RunState | null>;
235
+ /** 生产单状态(无生产单返回 null)。 */
236
+ runStatus(): Promise<import('../protocol.ts').RunState | null>;
63
237
  /** Get project writing assets + built-in libraries. */
64
238
  assets(): Promise<AssetsResponse>;
65
239
  /** Patch project writing assets. */
@@ -81,11 +255,13 @@ export declare class NovelApi {
81
255
  rewrite(chapterNo: number, instructions: string, target: string, onFrame: (frame: JobFrame) => void): Promise<void>;
82
256
  /** Polish (de-AI-ify) one chapter. */
83
257
  polish(chapterNo: number, onFrame: (frame: JobFrame) => void): Promise<void>;
84
- /** 采纳待确认草稿(润色/重写产物),覆盖正文文件。 */
85
- draftApply(chapterNo: number): Promise<{
258
+ /** 采纳待确认草稿(润色/重写产物),覆盖正文文件。返回采纳后的新正文(markdown)。
259
+ * 可携带审查报告(沿用结论定状态:通过 → approved)。 */
260
+ draftApply(chapterNo: number, report?: import('../protocol.ts').ReviewReport): Promise<{
86
261
  ok: boolean;
87
262
  chars: number;
88
263
  file: string;
264
+ markdown: string;
89
265
  }>;
90
266
  /** 放弃待确认草稿,保留原稿。 */
91
267
  draftDiscard(chapterNo: number): Promise<{
@@ -95,4 +271,34 @@ export declare class NovelApi {
95
271
  assistant(message: string, onFrame: (frame: import('../protocol.ts').AssistantFrame) => void): Promise<void>;
96
272
  /** Load the persisted assistant conversation. */
97
273
  assistantHistory(): Promise<import('../protocol.ts').AssistantMessage[]>;
274
+ /** 清空助手对话记录。 */
275
+ assistantClear(): Promise<{
276
+ ok: boolean;
277
+ }>;
278
+ /** 作者资产库/总数据:读取跨书可复用资产。 */
279
+ authorAssets(): Promise<import('../protocol.ts').AuthorAssetsResponse>;
280
+ /** 作者资产库:新增/更新一条资产(upsert by id)。 */
281
+ authorAssetsUpsert(asset: import('../protocol.ts').AuthorStyleAsset): Promise<import('../protocol.ts').AuthorAssetsResponse>;
282
+ /** 作者资产库:删除一条资产。 */
283
+ authorAssetsRemove(id: string): Promise<import('../protocol.ts').AuthorAssetsResponse>;
284
+ /** 作者资产库:导入默认(书架书的写作资产/角色 + 内置全局库)批量沉淀。 */
285
+ authorAssetsImportDefault(): Promise<import('../protocol.ts').AuthorAssetsResponse>;
286
+ /** 改编模式 P0:上传全文 → 原文设定卡片 / 可改范围矩阵。 */
287
+ adaptAnalyze(text: string, filePath?: string): Promise<import('../protocol.ts').AdaptAnalyzeResponse>;
288
+ /** 改编模式 P1:确认要改的维度 → 生成映射表/改编规则/联动影响清单。 */
289
+ adaptPropose(req: import('../protocol.ts').AdaptProposeRequest): Promise<import('../protocol.ts').AdaptProposeResponse>;
290
+ /** 改编模式 P2:执行术语替换(全局替换 + 命中统计 + 改编文本预览)。 */
291
+ adaptExecute(req: import('../protocol.ts').AdaptExecuteRequest): Promise<import('../protocol.ts').AdaptExecuteResponse>;
292
+ /** 改编模式 P3:保存改编全文为新书(原书保留,登记书架)。 */
293
+ adaptSave(req: import('../protocol.ts').AdaptSaveRequest): Promise<import('../protocol.ts').AdaptSaveResponse>;
294
+ /** 改编模式 P4:从源全文 + 编辑后方案提炼新书资料并保存为「待写新书」。 */
295
+ adaptMaterialize(req: import('../protocol.ts').AdaptMaterializeRequest): Promise<import('../protocol.ts').AdaptMaterializeResponse>;
296
+ /** 改编模式:保存预览/微调后的新书资料为新书(原书保留,登记书架)。 */
297
+ adaptMaterializeSave(req: AdaptMaterializeSaveRequest): Promise<AdaptMaterializeSaveResponse>;
298
+ /** 改编模式:rewrite 逐章重写(NDJSON 流式进度,支持分段 startNo/endNo)。 */
299
+ adaptRewriteStream(req: AdaptExecuteRequest, onFrame: (frame: AdaptRewriteFrame) => void): Promise<void>;
300
+ /** 主题自定义背景:上传图片,服务端存盘并返回可访问 URL。 */
301
+ themeBackgroundUpload(dataUrl: string): Promise<{
302
+ url: string;
303
+ }>;
98
304
  }
@@ -8,6 +8,8 @@
8
8
  * the Node build (esm/index.mjs), which calls module.createRequire() for the
9
9
  * optional worker_threads path — inlining that into the browser bundle leaves
10
10
  * a bare require("module") the client-modules table cannot answer.
11
+ *
12
+ * XML 解析共享核心在 ../docx-core.ts(与服务端同源)。
11
13
  */
12
14
  /** Extract plain text from a docx buffer: one line per <w:p> paragraph. */
13
15
  export declare function extractDocxTextFromBuffer(buffer: ArrayBuffer | Uint8Array): string;
@@ -4,7 +4,7 @@
4
4
  * problems are logged, never thrown — the web shell fails the whole boot when
5
5
  * a plugin apply throws.
6
6
  */
7
- import type { ClientContext } from '@deepseek-ai/dsh-client-runtime/client';
7
+ import type { Context as ClientContext } from '@deepseek-ai/cordis';
8
8
  /** Required services (fiber inject waiting). */
9
9
  export declare const inject: string[];
10
10
  /**
@@ -0,0 +1,33 @@
1
+ /**
2
+ * 浏览器端「AI 创作实况」钩子:连接 /llm-live/stream (SSE),按 LLM 调用分组会话。
3
+ * 轻量实现,不持久化缓存(对齐上游 useLlmLiveFeed 的核心行为)。
4
+ */
5
+ export interface LlmLiveFrame {
6
+ type: 'session_started' | 'output_delta' | 'reasoning_delta' | 'phase_changed' | 'session_completed';
7
+ sessionId: string;
8
+ label?: string;
9
+ model?: string;
10
+ at: string;
11
+ content?: string;
12
+ totalChars?: number;
13
+ totalReasoningChars?: number;
14
+ phase?: 'requesting' | 'streaming' | 'completed' | 'failed';
15
+ phaseMessage?: string;
16
+ preview?: string;
17
+ error?: string;
18
+ }
19
+ export interface LlmLiveSession {
20
+ sessionId: string;
21
+ label: string;
22
+ model?: string;
23
+ phase: 'requesting' | 'streaming' | 'completed' | 'failed';
24
+ phaseMessage: string;
25
+ preview: string;
26
+ totalChars: number;
27
+ startedAt: string;
28
+ updatedAt: string;
29
+ }
30
+ export declare function useLlmLiveFeed(enabled?: boolean): {
31
+ connected: boolean;
32
+ sessions: LlmLiveSession[];
33
+ };