@waterwx/dsh-novel-forge 1.5.0 → 1.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/client.js +41460 -6241
- package/lib/client.js.map +1 -1
- package/lib/index.js +294 -51
- package/lib/index.js.map +1 -1
- package/lib/types/client/api.d.ts +1 -0
- package/lib/types/client/panel/MangaWorkspace.d.ts +9 -3
- package/lib/types/client/panel/NovelPanel.d.ts +1 -1
- package/lib/types/client/panel/RoleVisualPanel.d.ts +15 -0
- package/lib/types/client/panel/SceneLibrary.d.ts +14 -0
- package/lib/types/client/panel/StoryboardTab.d.ts +3 -1
- package/lib/types/client/panel/StyleCard.d.ts +8 -0
- package/lib/types/engine.d.ts +9 -2
- package/lib/types/index.d.ts +6 -4
- package/lib/types/protocol.d.ts +57 -3
- package/package.json +99 -98
- package/src/client/api.ts +4 -0
- package/src/client/panel/MangaWorkspace.tsx +296 -184
- package/src/client/panel/NovelPanel.tsx +390 -877
- package/src/client/panel/RoleVisualPanel.tsx +485 -0
- package/src/client/panel/RunPanel.tsx +1 -1
- package/src/client/panel/SceneLibrary.tsx +395 -0
- package/src/client/panel/ShelfView.tsx +28 -35
- package/src/client/panel/StoryboardTab.tsx +369 -286
- package/src/client/panel/StyleCard.tsx +90 -0
- package/src/client/panel/StyleGallery.tsx +57 -108
- package/src/client/panel/panel.module.css +418 -34
- package/src/engine.ts +187 -42
- package/src/index.ts +37 -6
- package/src/protocol.ts +60 -3
- package/src/routes.ts +27 -2
|
@@ -98,6 +98,7 @@ export declare class NovelApi {
|
|
|
98
98
|
no: number;
|
|
99
99
|
}>;
|
|
100
100
|
/** 角色库:AI 提炼 / 采纳 / 更新 / 删除。 */
|
|
101
|
+
imageTest(req: import('../protocol.ts').ImageTestRequest): Promise<import('../protocol.ts').ImageTestResponse>;
|
|
101
102
|
roles(req: import('../protocol.ts').RolesRequest): Promise<import('../protocol.ts').RolesResponse>;
|
|
102
103
|
/** 场景库:AI 提炼 / 采纳 / 更新 / 删除 / 图集。 */
|
|
103
104
|
scenes(req: import('../protocol.ts').ScenesRequest): Promise<import('../protocol.ts').ScenesResponse>;
|
|
@@ -1,9 +1,15 @@
|
|
|
1
1
|
import type { NovelApi } from '../api.ts';
|
|
2
|
-
import type { ChapterPlan, ProjectState } from '../../protocol.ts';
|
|
3
|
-
export declare function MangaWorkspace({ api, project, chapters, onProjectChanged, }: {
|
|
2
|
+
import type { ChapterPlan, ImageModelConfig, ProjectState } from '../../protocol.ts';
|
|
3
|
+
export declare function MangaWorkspace({ api, project, chapters, onProjectChanged, imageApiEnabled, imageModels, onProgress, }: {
|
|
4
4
|
api: NovelApi;
|
|
5
5
|
project: ProjectState | null;
|
|
6
6
|
chapters: ChapterPlan[];
|
|
7
|
-
/**
|
|
7
|
+
/** 方案/资产变更已持久化后触发(刷新项目)。 */
|
|
8
8
|
onProjectChanged?: () => void | Promise<void>;
|
|
9
|
+
/** 是否启用生图。 */
|
|
10
|
+
imageApiEnabled?: boolean;
|
|
11
|
+
/** 生图模型库(AI 生图可选模型)。 */
|
|
12
|
+
imageModels?: ImageModelConfig[];
|
|
13
|
+
/** 上报到「AI进度」控制台(漫剧工作台内所有 LLM/方案操作)。 */
|
|
14
|
+
onProgress?: (text: string, kind?: 'info' | 'done' | 'error') => void;
|
|
9
15
|
}): import("react").JSX.Element;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { NovelApi } from '../api.ts';
|
|
2
2
|
import type { PanelController } from './controller.ts';
|
|
3
3
|
/** The panel's tab identifiers. */
|
|
4
|
-
export type NovelTab = 'workflow' | 'overview' | 'blurb' | 'plan' | 'bible' | 'world' | 'foreshadow' | 'assistant' | 'settings' | 'characters' | 'roles' | 'facts' | 'plotlines' | 'reviews' | 'progress' | 'breakdown' | '
|
|
4
|
+
export type NovelTab = 'workflow' | 'overview' | 'blurb' | 'plan' | 'bible' | 'world' | 'foreshadow' | 'assistant' | 'settings' | 'characters' | 'roles' | 'facts' | 'plotlines' | 'reviews' | 'progress' | 'breakdown' | 'assetsGenre' | 'assetsProgression' | 'assetsTemplates' | 'assetsRules' | 'assetsStyle' | 'run' | 'manhua' | 'book' | 'assets';
|
|
5
5
|
/** Panel shell props. */
|
|
6
6
|
export interface NovelPanelProps {
|
|
7
7
|
/** The panel state owner (open/close/toggle). */
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { NovelApi } from '../api.ts';
|
|
2
|
+
import type { ImageModelConfig, ProjectState } from '../../protocol.ts';
|
|
3
|
+
export declare function RoleVisualPanel({ api, project, refresh, styleId, filterId, imageApiEnabled, imageModels, onGotoRoles, onProgress, }: {
|
|
4
|
+
api: NovelApi;
|
|
5
|
+
project: ProjectState | null;
|
|
6
|
+
refresh: () => void | Promise<void>;
|
|
7
|
+
styleId?: string;
|
|
8
|
+
filterId?: string;
|
|
9
|
+
imageApiEnabled?: boolean;
|
|
10
|
+
/** 生图模型库(AI 生图时可选择用哪条)。 */
|
|
11
|
+
imageModels?: ImageModelConfig[];
|
|
12
|
+
onGotoRoles?: () => void;
|
|
13
|
+
/** 上报到「AI进度」控制台(角色形象页 / 漫剧工作台共用)。 */
|
|
14
|
+
onProgress?: (text: string, kind?: 'info' | 'done' | 'error') => void;
|
|
15
|
+
}): import("react").JSX.Element;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { NovelApi } from '../api.ts';
|
|
2
|
+
import type { ProjectState } from '../../protocol.ts';
|
|
3
|
+
export declare function SceneLibrary({ api, project, refresh, styleId, filterId, onProgress, }: {
|
|
4
|
+
api: NovelApi;
|
|
5
|
+
project: ProjectState | null;
|
|
6
|
+
/** 场景库变更已持久化后触发(刷新项目)。 */
|
|
7
|
+
refresh: () => void | Promise<void>;
|
|
8
|
+
/** 提炼场景时的漫剧基底风格 id(提示词按方案风格措辞)。 */
|
|
9
|
+
styleId?: string;
|
|
10
|
+
/** 可选滤镜风格 id。 */
|
|
11
|
+
filterId?: string;
|
|
12
|
+
/** 上报到「AI进度」控制台。 */
|
|
13
|
+
onProgress?: (text: string, kind?: 'info' | 'done' | 'error') => void;
|
|
14
|
+
}): import("react").JSX.Element;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { NovelApi } from '../api.ts';
|
|
2
2
|
import type { ChapterPlan, ProjectState } from '../../protocol.ts';
|
|
3
|
-
export declare function StoryboardTab({ api, project, chapters, onProjectChanged, styleId, filterId, }: {
|
|
3
|
+
export declare function StoryboardTab({ api, project, chapters, onProjectChanged, styleId, filterId, onProgress, }: {
|
|
4
4
|
api: NovelApi;
|
|
5
5
|
project: ProjectState | null;
|
|
6
6
|
chapters: ChapterPlan[];
|
|
@@ -10,4 +10,6 @@ export declare function StoryboardTab({ api, project, chapters, onProjectChanged
|
|
|
10
10
|
styleId?: string;
|
|
11
11
|
/** 可选滤镜风格 id。 */
|
|
12
12
|
filterId?: string;
|
|
13
|
+
/** 上报到「AI进度」控制台(分镜三步生成)。 */
|
|
14
|
+
onProgress?: (text: string, kind?: 'info' | 'done' | 'error') => void;
|
|
13
15
|
}): import("react").JSX.Element;
|
package/lib/types/engine.d.ts
CHANGED
|
@@ -70,7 +70,7 @@ export declare function refreshPlotlineProgress(ctx: Context, config: NovelConfi
|
|
|
70
70
|
/** ✨ AI 从全书提炼角色库:大纲 + 道藏 + 编年录 + 章节摘要 → 结构化角色清单。 */
|
|
71
71
|
export declare function extractRoles(ctx: Context, config: NovelConfig, project: ProjectState): Promise<RoleRecord[]>;
|
|
72
72
|
/** ✨ AI 从全书提炼场景库:正文/编年录 → 高频重要场景的结构化视觉锚点。 */
|
|
73
|
-
export declare function extractScenes(ctx: Context, config: NovelConfig, project: ProjectState): Promise<SceneCard[]>;
|
|
73
|
+
export declare function extractScenes(ctx: Context, config: NovelConfig, project: ProjectState, styleId?: string, filterId?: string): Promise<SceneCard[]>;
|
|
74
74
|
/** 从 txt/md 全本文本拆章(纯逻辑,不落盘):识别章节头、剥离重复标题、去重、排序并统一重新编号。 */
|
|
75
75
|
export declare function splitBookText(raw: string): Array<{
|
|
76
76
|
no: number;
|
|
@@ -136,7 +136,14 @@ export declare function suggestOutlines(ctx: Context, config: NovelConfig, idea:
|
|
|
136
136
|
* @param budgetTokens token 预算上限(超过即截断章节取样)。
|
|
137
137
|
*/
|
|
138
138
|
export declare function breakdownBook(ctx: Context, config: NovelConfig, project: ProjectState, outputDir: string, scope?: string, preset?: 'quick' | 'standard', budgetTokens?: number): Promise<BreakdownResponse>;
|
|
139
|
-
|
|
139
|
+
/** 生图接口连通性测试(设置页模型条目用):GET {baseURL}/models,计时返回延迟。 */
|
|
140
|
+
export declare function testImageEndpoint(baseURL: string, apiKey: string, model?: string): Promise<{
|
|
141
|
+
ok: boolean;
|
|
142
|
+
ms: number;
|
|
143
|
+
message?: string;
|
|
144
|
+
modelFound?: boolean;
|
|
145
|
+
}>;
|
|
146
|
+
export declare function generateRoleReferenceImage(ctx: Context, config: NovelConfig, project: ProjectState, outputDir: string, name: string, style?: string, modelId?: string): Promise<string>;
|
|
140
147
|
/** 🩺 剧情健康检查:基于已写章节数/各线状态/编年录,判断是否需要新线及添加时机。 */
|
|
141
148
|
export declare function analyzePlotlineHealth(ctx: Context, config: NovelConfig, project: ProjectState): Promise<PlotlineHealthReport>;
|
|
142
149
|
/** ✨ AI 剧情方案:基于健康检查结果设计下一阶段方向与建议新线。 */
|
package/lib/types/index.d.ts
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
*/
|
|
9
9
|
import type { Context } from '@deepseek-ai/cordis';
|
|
10
10
|
import z from 'schemastery';
|
|
11
|
-
import type { NovelConfig } from './protocol.ts';
|
|
11
|
+
import type { ImageModelConfig, NovelConfig } from './protocol.ts';
|
|
12
12
|
/** Stable cordis plugin name. */
|
|
13
13
|
export declare const name = "novel-forge";
|
|
14
14
|
/** Services required before the novel-forge surfaces can mount. */
|
|
@@ -49,11 +49,13 @@ export interface Config {
|
|
|
49
49
|
autoAuthorReview?: boolean;
|
|
50
50
|
/** 修订/润色产出草稿后自动附带一次 AI 审查(默认开,可在设置页关闭省 token)。 */
|
|
51
51
|
autoReviewAfterRevise?: boolean;
|
|
52
|
-
/**
|
|
52
|
+
/** 生图模型库(多套并存,启用一条生效)。 */
|
|
53
|
+
imageModels?: ImageModelConfig[];
|
|
54
|
+
/** 豆包/Seedream 生图 API Key(旧字段,兼容迁移用)。 */
|
|
53
55
|
imageApiKey?: string;
|
|
54
|
-
/** 豆包/Seedream 生图模型 ID
|
|
56
|
+
/** 豆包/Seedream 生图模型 ID(旧字段,兼容迁移用)。 */
|
|
55
57
|
imageApiModel?: string;
|
|
56
|
-
/**
|
|
58
|
+
/** 是否启用豆包生图(旧字段,兼容迁移用)。 */
|
|
57
59
|
imageApiEnabled?: boolean;
|
|
58
60
|
}
|
|
59
61
|
export declare const Config: z<Config>;
|
package/lib/types/protocol.d.ts
CHANGED
|
@@ -49,6 +49,8 @@ export declare const NOVEL_API: {
|
|
|
49
49
|
readonly storyboardTable: "/api/dsh-novel-forge/storyboard/table";
|
|
50
50
|
/** 分镜·提示词级:分镜表 → 即梦可粘贴视频提示词。 */
|
|
51
51
|
readonly storyboardPrompts: "/api/dsh-novel-forge/storyboard/prompts";
|
|
52
|
+
/** 生图接口连通性测试(设置页每个模型条目用)。 */
|
|
53
|
+
readonly imageTest: "/api/dsh-novel-forge/image-test";
|
|
52
54
|
/** 重置项目(可选携带新大纲):清空设定/卷/章节/伏笔/资产/事实库。 */
|
|
53
55
|
readonly reset: "/api/dsh-novel-forge/reset";
|
|
54
56
|
/** 全书一致性质检:LLM 扫描已生成章节,输出矛盾问题清单。 */
|
|
@@ -256,6 +258,8 @@ export interface StoryboardShot {
|
|
|
256
258
|
export interface StoryboardTable {
|
|
257
259
|
chapterNo: number;
|
|
258
260
|
shots: StoryboardShot[];
|
|
261
|
+
/** 生成时注入的场景卡名称(前端标注消费关系)。 */
|
|
262
|
+
usedScenes?: string[];
|
|
259
263
|
}
|
|
260
264
|
/** POST /storyboard/table 请求:骨架 → 分镜表。 */
|
|
261
265
|
export interface StoryboardTableRequest {
|
|
@@ -734,6 +738,8 @@ export interface RoleRecord {
|
|
|
734
738
|
en: string;
|
|
735
739
|
};
|
|
736
740
|
};
|
|
741
|
+
/** 生成形象锚点/精修提示词时的漫剧方案基底风格 id(= 方案 styleId;用于检测旧风格并提示重生成)。 */
|
|
742
|
+
promptStyleId?: string;
|
|
737
743
|
/** 漫画/漫剧重要性:main=必须建卡保证一致;support=有锚点即可;extra=路人随机生成不约束。 */
|
|
738
744
|
importance?: 'main' | 'support' | 'extra';
|
|
739
745
|
}
|
|
@@ -774,10 +780,16 @@ export interface SceneCard {
|
|
|
774
780
|
source?: string;
|
|
775
781
|
/** 场景图集(图像锚点):全景/局部/氛围 等。 */
|
|
776
782
|
gallery?: RoleImage[];
|
|
783
|
+
/** 生成时的漫剧方案基底风格 id(场景卡随方案风格措辞)。 */
|
|
784
|
+
styleId?: string;
|
|
777
785
|
}
|
|
778
786
|
/** POST /scenes 请求:场景库提炼 / 采纳 / 更新 / 删除 / 图集。 */
|
|
779
787
|
export interface ScenesRequest {
|
|
780
788
|
op: 'extract' | 'adopt' | 'update' | 'remove' | 'image' | 'removeImage';
|
|
789
|
+
/** op='extract' 时的漫剧基底风格 id(场景卡按方案风格措辞)。 */
|
|
790
|
+
styleId?: string;
|
|
791
|
+
/** op='extract' 时的可选滤镜风格 id。 */
|
|
792
|
+
filterId?: string;
|
|
781
793
|
/** adopt / update 时传入的场景卡(adopt 可修改后采纳)。 */
|
|
782
794
|
scene?: SceneCard;
|
|
783
795
|
/** remove / image 时的场景名。 */
|
|
@@ -815,11 +827,32 @@ export interface RolesRequest {
|
|
|
815
827
|
label?: string;
|
|
816
828
|
/** op='imageGenerate' 时的漫画风格预设 id(用于统一角色图与漫画页风格)。 */
|
|
817
829
|
style?: string;
|
|
830
|
+
/** op='imageGenerate' 时指定生图模型库条目 id(缺省用启用条目)。 */
|
|
831
|
+
modelId?: string;
|
|
818
832
|
/** op='visual' / op='promptKit' 时的漫剧基底风格 id(角色图按方案风格重出)。 */
|
|
819
833
|
styleId?: string;
|
|
820
834
|
/** op='visual' / op='promptKit' 时的可选滤镜风格 id。 */
|
|
821
835
|
filterId?: string;
|
|
822
836
|
}
|
|
837
|
+
/** POST /image-test 请求:测一个生图接口的连通性与延迟(不落盘)。 */
|
|
838
|
+
export interface ImageTestRequest {
|
|
839
|
+
/** OpenAI 兼容生图接口地址。 */
|
|
840
|
+
baseURL: string;
|
|
841
|
+
/** API Key。 */
|
|
842
|
+
apiKey: string;
|
|
843
|
+
/** 模型 id(顺带校验是否在接口模型列表里,可选)。 */
|
|
844
|
+
model?: string;
|
|
845
|
+
}
|
|
846
|
+
/** POST /image-test 响应。 */
|
|
847
|
+
export interface ImageTestResponse {
|
|
848
|
+
ok: boolean;
|
|
849
|
+
/** 连通延迟(毫秒)。 */
|
|
850
|
+
ms?: number;
|
|
851
|
+
/** 失败原因。 */
|
|
852
|
+
message?: string;
|
|
853
|
+
/** 模型 id 是否出现在接口的模型列表(探测成功时才有)。 */
|
|
854
|
+
modelFound?: boolean;
|
|
855
|
+
}
|
|
823
856
|
/** POST /roles 响应。 */
|
|
824
857
|
export interface RolesResponse {
|
|
825
858
|
roles: RoleRecord[];
|
|
@@ -963,6 +996,21 @@ export interface ProjectState {
|
|
|
963
996
|
createdAt: string;
|
|
964
997
|
updatedAt: string;
|
|
965
998
|
}
|
|
999
|
+
/** 生图模型配置(模型库条目,可多套并存,启用一条生效)。 */
|
|
1000
|
+
export interface ImageModelConfig {
|
|
1001
|
+
/** 条目 id(本地唯一)。 */
|
|
1002
|
+
id: string;
|
|
1003
|
+
/** 展示名(如「豆包 Seedream」「即梦」)。 */
|
|
1004
|
+
name: string;
|
|
1005
|
+
/** OpenAI 兼容生图接口地址(如 https://ark.cn-beijing.volces.com/api/v3)。 */
|
|
1006
|
+
baseURL: string;
|
|
1007
|
+
/** API Key。 */
|
|
1008
|
+
apiKey: string;
|
|
1009
|
+
/** 生图模型 id(如 doubao-seedream-5-0-pro-260628)。 */
|
|
1010
|
+
model: string;
|
|
1011
|
+
/** 是否启用(同时只启用一条)。 */
|
|
1012
|
+
enabled: boolean;
|
|
1013
|
+
}
|
|
966
1014
|
/** Runtime config surface exposed to the panel (subset of plugin Config). */
|
|
967
1015
|
export interface NovelConfig {
|
|
968
1016
|
/** Absolute path of the default docx outline to load. */
|
|
@@ -989,11 +1037,15 @@ export interface NovelConfig {
|
|
|
989
1037
|
autoAuthorReview: boolean;
|
|
990
1038
|
/** 修订/润色产出草稿后是否自动附带一次 AI 审查(工作区显示新稿评分与剩余问题)。 */
|
|
991
1039
|
autoReviewAfterRevise: boolean;
|
|
992
|
-
/**
|
|
1040
|
+
/** 生图模型库(多套并存,启用一条生效;旧 imageApiKey/imageApiModel 自动迁移为一条)。 */
|
|
1041
|
+
imageModels?: ImageModelConfig[];
|
|
1042
|
+
/** 运行时生效的生图接口地址(= 启用条目,兼容旧代码读取)。 */
|
|
1043
|
+
imageBaseUrl?: string;
|
|
1044
|
+
/** 运行时生效的生图 API Key(= 启用条目,兼容旧代码读取)。 */
|
|
993
1045
|
imageApiKey?: string;
|
|
994
|
-
/**
|
|
1046
|
+
/** 运行时生效的生图模型 id(= 启用条目,兼容旧代码读取)。 */
|
|
995
1047
|
imageApiModel?: string;
|
|
996
|
-
/**
|
|
1048
|
+
/** 是否启用生图(= 存在启用条目)。 */
|
|
997
1049
|
imageApiEnabled?: boolean;
|
|
998
1050
|
}
|
|
999
1051
|
/** GET /status response. */
|
|
@@ -1232,6 +1284,8 @@ export interface ConfigPatch {
|
|
|
1232
1284
|
imageApiKey?: string;
|
|
1233
1285
|
imageApiModel?: string;
|
|
1234
1286
|
imageApiEnabled?: boolean;
|
|
1287
|
+
/** 生图模型库(完整替换保存)。 */
|
|
1288
|
+
imageModels?: ImageModelConfig[];
|
|
1235
1289
|
}
|
|
1236
1290
|
/** One assistant conversation message (persisted per project). */
|
|
1237
1291
|
export interface AssistantMessage {
|
package/package.json
CHANGED
|
@@ -1,98 +1,99 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@waterwx/dsh-novel-forge",
|
|
3
|
-
"description": "AI 编译小说工作台 for the dsh web GUI: import a novel outline (docx/text), plan chapters with LLM, generate chapter by chapter (3000-4000 chars each), and save every chapter as Markdown into your chosen output folder.",
|
|
4
|
-
"version": "1.
|
|
5
|
-
"type": "module",
|
|
6
|
-
"engines": {
|
|
7
|
-
"node": "^22.19.0 || >=24.0.0"
|
|
8
|
-
},
|
|
9
|
-
"main": "lib/index.js",
|
|
10
|
-
"types": "lib/types/index.d.ts",
|
|
11
|
-
"exports": {
|
|
12
|
-
".": {
|
|
13
|
-
"types": "./lib/types/index.d.ts",
|
|
14
|
-
"default": "./lib/index.js"
|
|
15
|
-
},
|
|
16
|
-
"./client": {
|
|
17
|
-
"types": "./lib/types/client/index.d.ts",
|
|
18
|
-
"default": "./lib/client.js"
|
|
19
|
-
},
|
|
20
|
-
"./src/*": "./src/*",
|
|
21
|
-
"./package.json": "./package.json"
|
|
22
|
-
},
|
|
23
|
-
"dsh": {
|
|
24
|
-
"bundle": {
|
|
25
|
-
"patch": "./cordis.patch.yml"
|
|
26
|
-
},
|
|
27
|
-
"client": {
|
|
28
|
-
"inject": [
|
|
29
|
-
"@deepseek-ai/dsh-client-runtime",
|
|
30
|
-
"@deepseek-ai/dsh-client-connection",
|
|
31
|
-
"@deepseek-ai/dsh-client-ui-settings"
|
|
32
|
-
],
|
|
33
|
-
"platform": "web"
|
|
34
|
-
}
|
|
35
|
-
},
|
|
36
|
-
"dependencies": {
|
|
37
|
-
"fflate": "^0.8.2",
|
|
38
|
-
"
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
"@deepseek-ai/dsh-client-
|
|
43
|
-
"@deepseek-ai/dsh-client-
|
|
44
|
-
"@deepseek-ai/dsh-client-
|
|
45
|
-
"@deepseek-ai/dsh-client-ui-
|
|
46
|
-
"@deepseek-ai/dsh-
|
|
47
|
-
"@deepseek-ai/dsh-
|
|
48
|
-
"@deepseek-ai/dsh-
|
|
49
|
-
"@deepseek-ai/dsh-
|
|
50
|
-
"@deepseek-ai/dsh-
|
|
51
|
-
"@deepseek-ai/dsh-
|
|
52
|
-
"
|
|
53
|
-
"react
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
"@deepseek-ai/
|
|
58
|
-
"@deepseek-ai/dsh-client-
|
|
59
|
-
"@deepseek-ai/dsh-client-
|
|
60
|
-
"@deepseek-ai/dsh-client-
|
|
61
|
-
"@deepseek-ai/dsh-client-ui-
|
|
62
|
-
"@deepseek-ai/dsh-
|
|
63
|
-
"@deepseek-ai/dsh-
|
|
64
|
-
"@deepseek-ai/dsh-
|
|
65
|
-
"@deepseek-ai/dsh-
|
|
66
|
-
"@deepseek-ai/dsh-
|
|
67
|
-
"@deepseek-ai/dsh-
|
|
68
|
-
"@
|
|
69
|
-
"@types/
|
|
70
|
-
"@types/react
|
|
71
|
-
"
|
|
72
|
-
"
|
|
73
|
-
"react
|
|
74
|
-
"
|
|
75
|
-
"
|
|
76
|
-
"
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
"lib/**/*.js
|
|
81
|
-
"lib/**/*.
|
|
82
|
-
"lib/**/*.d.ts
|
|
83
|
-
"
|
|
84
|
-
"
|
|
85
|
-
"
|
|
86
|
-
"
|
|
87
|
-
"
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
"
|
|
91
|
-
|
|
92
|
-
"
|
|
93
|
-
"
|
|
94
|
-
"
|
|
95
|
-
"
|
|
96
|
-
"
|
|
97
|
-
|
|
98
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "@waterwx/dsh-novel-forge",
|
|
3
|
+
"description": "AI 编译小说工作台 for the dsh web GUI: import a novel outline (docx/text), plan chapters with LLM, generate chapter by chapter (3000-4000 chars each), and save every chapter as Markdown into your chosen output folder.",
|
|
4
|
+
"version": "1.7.0",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"engines": {
|
|
7
|
+
"node": "^22.19.0 || >=24.0.0"
|
|
8
|
+
},
|
|
9
|
+
"main": "lib/index.js",
|
|
10
|
+
"types": "lib/types/index.d.ts",
|
|
11
|
+
"exports": {
|
|
12
|
+
".": {
|
|
13
|
+
"types": "./lib/types/index.d.ts",
|
|
14
|
+
"default": "./lib/index.js"
|
|
15
|
+
},
|
|
16
|
+
"./client": {
|
|
17
|
+
"types": "./lib/types/client/index.d.ts",
|
|
18
|
+
"default": "./lib/client.js"
|
|
19
|
+
},
|
|
20
|
+
"./src/*": "./src/*",
|
|
21
|
+
"./package.json": "./package.json"
|
|
22
|
+
},
|
|
23
|
+
"dsh": {
|
|
24
|
+
"bundle": {
|
|
25
|
+
"patch": "./cordis.patch.yml"
|
|
26
|
+
},
|
|
27
|
+
"client": {
|
|
28
|
+
"inject": [
|
|
29
|
+
"@deepseek-ai/dsh-client-runtime",
|
|
30
|
+
"@deepseek-ai/dsh-client-connection",
|
|
31
|
+
"@deepseek-ai/dsh-client-ui-settings"
|
|
32
|
+
],
|
|
33
|
+
"platform": "web"
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
"dependencies": {
|
|
37
|
+
"fflate": "^0.8.2",
|
|
38
|
+
"lucide-react": "^1.33.0",
|
|
39
|
+
"schemastery": "^3.18.0"
|
|
40
|
+
},
|
|
41
|
+
"peerDependencies": {
|
|
42
|
+
"@deepseek-ai/dsh-client-connection": "^0.1.0-rc.5",
|
|
43
|
+
"@deepseek-ai/dsh-client-locale": "^0.1.0-rc.5",
|
|
44
|
+
"@deepseek-ai/dsh-client-runtime": "^0.1.0-rc.5",
|
|
45
|
+
"@deepseek-ai/dsh-client-ui-settings": "^0.1.0-rc.5",
|
|
46
|
+
"@deepseek-ai/dsh-client-ui-slots": "^0.1.0-rc.5",
|
|
47
|
+
"@deepseek-ai/dsh-host-webserver": "^0.1.0-rc.5",
|
|
48
|
+
"@deepseek-ai/dsh-llm": "^0.1.0-rc.5",
|
|
49
|
+
"@deepseek-ai/dsh-settings": "^0.1.0-rc.5",
|
|
50
|
+
"@deepseek-ai/dsh-skill": "^0.1.0-rc.5",
|
|
51
|
+
"@deepseek-ai/dsh-system-prompt": "^0.1.0-rc.5",
|
|
52
|
+
"@deepseek-ai/dsh-tools": "^0.1.0-rc.5",
|
|
53
|
+
"react": "^18.2.0",
|
|
54
|
+
"react-dom": "^18.2.0"
|
|
55
|
+
},
|
|
56
|
+
"devDependencies": {
|
|
57
|
+
"@deepseek-ai/cordis": "^4.0.1",
|
|
58
|
+
"@deepseek-ai/dsh-client-connection": "^0.1.0-rc.5",
|
|
59
|
+
"@deepseek-ai/dsh-client-locale": "^0.1.0-rc.5",
|
|
60
|
+
"@deepseek-ai/dsh-client-runtime": "^0.1.0-rc.5",
|
|
61
|
+
"@deepseek-ai/dsh-client-ui-settings": "^0.1.0-rc.5",
|
|
62
|
+
"@deepseek-ai/dsh-client-ui-slots": "^0.1.0-rc.5",
|
|
63
|
+
"@deepseek-ai/dsh-host-webserver": "^0.1.0-rc.5",
|
|
64
|
+
"@deepseek-ai/dsh-llm": "^0.1.0-rc.5",
|
|
65
|
+
"@deepseek-ai/dsh-settings": "^0.1.0-rc.5",
|
|
66
|
+
"@deepseek-ai/dsh-skill": "^0.1.0-rc.5",
|
|
67
|
+
"@deepseek-ai/dsh-system-prompt": "^0.1.0-rc.5",
|
|
68
|
+
"@deepseek-ai/dsh-tools": "^0.1.0-rc.5",
|
|
69
|
+
"@types/node": "^22.20.0",
|
|
70
|
+
"@types/react": "~18.3.1",
|
|
71
|
+
"@types/react-dom": "^18.3.5",
|
|
72
|
+
"lightningcss": "1.32.0",
|
|
73
|
+
"react": "^18.3.1",
|
|
74
|
+
"react-dom": "^18.3.1",
|
|
75
|
+
"tsdown": "0.22.2",
|
|
76
|
+
"typescript": "~5.7.2",
|
|
77
|
+
"vitest": "^3.0.0"
|
|
78
|
+
},
|
|
79
|
+
"files": [
|
|
80
|
+
"lib/**/*.js",
|
|
81
|
+
"lib/**/*.js.map",
|
|
82
|
+
"lib/**/*.d.ts",
|
|
83
|
+
"lib/**/*.d.ts.map",
|
|
84
|
+
"src",
|
|
85
|
+
"assets/styles",
|
|
86
|
+
"scripts/patch-schemastery.mjs",
|
|
87
|
+
"cordis.patch.yml",
|
|
88
|
+
"README.md"
|
|
89
|
+
],
|
|
90
|
+
"license": "Apache-2.0",
|
|
91
|
+
"scripts": {
|
|
92
|
+
"postinstall": "node scripts/patch-schemastery.mjs",
|
|
93
|
+
"build": "tsc -p tsconfig.build.json && tsdown",
|
|
94
|
+
"bundle": "tsdown",
|
|
95
|
+
"watch": "tsdown --watch",
|
|
96
|
+
"typecheck": "tsc --noEmit",
|
|
97
|
+
"test": "vitest run"
|
|
98
|
+
}
|
|
99
|
+
}
|
package/src/client/api.ts
CHANGED
|
@@ -228,6 +228,10 @@ export class NovelApi {
|
|
|
228
228
|
}
|
|
229
229
|
|
|
230
230
|
/** 角色库:AI 提炼 / 采纳 / 更新 / 删除。 */
|
|
231
|
+
async imageTest(req: import('../protocol.ts').ImageTestRequest): Promise<import('../protocol.ts').ImageTestResponse> {
|
|
232
|
+
return postJson<import('../protocol.ts').ImageTestResponse>(NOVEL_API.imageTest, req)
|
|
233
|
+
}
|
|
234
|
+
|
|
231
235
|
async roles(req: import('../protocol.ts').RolesRequest): Promise<import('../protocol.ts').RolesResponse> {
|
|
232
236
|
return postJson<import('../protocol.ts').RolesResponse>(NOVEL_API.roles, req)
|
|
233
237
|
}
|