@waterwx/dsh-novel-forge 1.3.0 → 1.3.1-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 +287 -279
- package/lib/client.js +56031 -12138
- package/lib/index.js +14206 -5585
- 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/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 +19 -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 +1356 -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 +11 -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 -27
- package/scripts/patch-schemastery.mjs +47 -0
- 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/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 +223 -204
- package/src/client/panel/SettingsView.tsx +340 -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 +5764 -2941
- package/src/client/panel/toast.ts +51 -0
- package/src/client/panel/views.tsx +401 -314
- package/src/client/run-status.ts +143 -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 +1382 -158
- package/src/review-policy.ts +161 -0
- package/src/revision.ts +283 -0
- package/src/routes.ts +1934 -434
- package/src/run.ts +81 -20
- 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/src/client/panel/BookshelfBar.tsx +0 -170
- package/src/comic-presets.ts +0 -67
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
/** 漫画风格预设:每个预设对应一组出图提示词与排版偏好。 */
|
|
2
|
-
export interface ComicStylePreset {
|
|
3
|
-
id: string;
|
|
4
|
-
label: string;
|
|
5
|
-
/** 注入 imagePrompt 的风格描述词。 */
|
|
6
|
-
prompt: string;
|
|
7
|
-
/** 可选:排版偏好说明。 */
|
|
8
|
-
layoutHint?: string;
|
|
9
|
-
}
|
|
10
|
-
export declare const COMIC_STYLE_PRESETS: ComicStylePreset[];
|
|
11
|
-
export declare function getComicStylePrompt(styleId?: string): string;
|
|
12
|
-
export declare function getComicStyleLabel(styleId?: string): string;
|
|
@@ -1,170 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 书架条:显示所有书,点击切换当前书(继续编译),+ 新建。
|
|
3
|
-
* 新建 = 开书向导:书名 + 大纲(拖拽/选择 docx 或粘贴文本),创建即建项目。
|
|
4
|
-
*/
|
|
5
|
-
import { useRef, useState } from 'react'
|
|
6
|
-
import type { NovelApi } from '../api.ts'
|
|
7
|
-
import { extractDocxTextFromBuffer } from '../docx.ts'
|
|
8
|
-
import type { BookshelfSnapshot } from '../../protocol.ts'
|
|
9
|
-
import css from './panel.module.css'
|
|
10
|
-
|
|
11
|
-
/** Props. */
|
|
12
|
-
export interface BookshelfBarProps {
|
|
13
|
-
api: NovelApi
|
|
14
|
-
shelf: BookshelfSnapshot
|
|
15
|
-
/** 刷新整个面板(切换书后重新拉状态)。 */
|
|
16
|
-
onSwitch: () => void
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
/** 书架条。 */
|
|
20
|
-
export function BookshelfBar({ api, shelf, onSwitch }: BookshelfBarProps) {
|
|
21
|
-
const [creating, setCreating] = useState(false)
|
|
22
|
-
const [name, setName] = useState('')
|
|
23
|
-
const [outlineText, setOutlineText] = useState('')
|
|
24
|
-
const [outlineName, setOutlineName] = useState('')
|
|
25
|
-
const [busy, setBusy] = useState(false)
|
|
26
|
-
const [error, setError] = useState('')
|
|
27
|
-
const outlineFileRef = useRef<HTMLInputElement | null>(null)
|
|
28
|
-
|
|
29
|
-
const handlePickOutlineFile = async (file: File | undefined): Promise<void> => {
|
|
30
|
-
if (file === undefined) return
|
|
31
|
-
try {
|
|
32
|
-
const buffer = await file.arrayBuffer()
|
|
33
|
-
const text = extractDocxTextFromBuffer(buffer)
|
|
34
|
-
if (text.length < 50) {
|
|
35
|
-
setError('大纲内容过短(<50 字符),请检查文件')
|
|
36
|
-
return
|
|
37
|
-
}
|
|
38
|
-
setOutlineText(text)
|
|
39
|
-
setOutlineName(file.name)
|
|
40
|
-
setError('')
|
|
41
|
-
} catch (err) {
|
|
42
|
-
setError(`读取大纲失败:${(err as Error).message}`)
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
const handleCreate = async (): Promise<void> => {
|
|
47
|
-
const bookName = name.trim()
|
|
48
|
-
if (bookName === '') return
|
|
49
|
-
setBusy(true)
|
|
50
|
-
setError('')
|
|
51
|
-
try {
|
|
52
|
-
await api.bookCreate(bookName, undefined, outlineText.trim() !== '' ? outlineText.trim() : undefined)
|
|
53
|
-
setCreating(false)
|
|
54
|
-
setName('')
|
|
55
|
-
setOutlineText('')
|
|
56
|
-
setOutlineName('')
|
|
57
|
-
onSwitch()
|
|
58
|
-
} catch (err) {
|
|
59
|
-
setError((err as Error).message)
|
|
60
|
-
} finally {
|
|
61
|
-
setBusy(false)
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
const handleActivate = async (id: string): Promise<void> => {
|
|
66
|
-
if (id === shelf.activeBookId) return
|
|
67
|
-
setBusy(true)
|
|
68
|
-
try {
|
|
69
|
-
await api.bookActivate(id)
|
|
70
|
-
onSwitch()
|
|
71
|
-
} catch (err) {
|
|
72
|
-
setError((err as Error).message)
|
|
73
|
-
} finally {
|
|
74
|
-
setBusy(false)
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
const handleRemove = async (id: string): Promise<void> => {
|
|
79
|
-
setBusy(true)
|
|
80
|
-
try {
|
|
81
|
-
await api.bookRemove(id)
|
|
82
|
-
onSwitch()
|
|
83
|
-
} catch (err) {
|
|
84
|
-
setError((err as Error).message)
|
|
85
|
-
} finally {
|
|
86
|
-
setBusy(false)
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
return (
|
|
91
|
-
<div className={css.bookshelf}>
|
|
92
|
-
<span className={css.bookshelfLabel}>书架</span>
|
|
93
|
-
<div className={css.bookshelfList}>
|
|
94
|
-
{shelf.books.map(book => (
|
|
95
|
-
<div
|
|
96
|
-
key={book.id}
|
|
97
|
-
className={`${css.bookChip} ${book.id === shelf.activeBookId ? css.bookChipActive : ''}`}
|
|
98
|
-
onClick={() => { void handleActivate(book.id) }}
|
|
99
|
-
title={book.outputDir}
|
|
100
|
-
>
|
|
101
|
-
<span className={css.bookChipName}>{book.bookName}</span>
|
|
102
|
-
<span className={css.bookChipMeta}>{book.hasProject ? `${book.done}/${book.total} 章` : '未开书'}</span>
|
|
103
|
-
<button
|
|
104
|
-
type="button"
|
|
105
|
-
className={css.bookChipRemove}
|
|
106
|
-
title="从书架移除"
|
|
107
|
-
onClick={(e) => { e.stopPropagation(); void handleRemove(book.id) }}
|
|
108
|
-
>
|
|
109
|
-
×
|
|
110
|
-
</button>
|
|
111
|
-
</div>
|
|
112
|
-
))}
|
|
113
|
-
{!creating ? (
|
|
114
|
-
<button type="button" className={css.bookAdd} onClick={() => { setCreating(true) }}>
|
|
115
|
-
+ 新书
|
|
116
|
-
</button>
|
|
117
|
-
) : (
|
|
118
|
-
<div className={css.bookCreateForm}>
|
|
119
|
-
<input
|
|
120
|
-
className={css.input}
|
|
121
|
-
style={{ width: 140 }}
|
|
122
|
-
placeholder="书名"
|
|
123
|
-
value={name}
|
|
124
|
-
onChange={e => { setName(e.target.value) }}
|
|
125
|
-
onKeyDown={e => { if (e.key === 'Enter') void handleCreate() }}
|
|
126
|
-
autoFocus
|
|
127
|
-
/>
|
|
128
|
-
{/* 开书向导:大纲(可选,推荐) */}
|
|
129
|
-
<div className={css.bookCreateOutline}>
|
|
130
|
-
<button
|
|
131
|
-
type="button"
|
|
132
|
-
className={`${css.button} ${css.buttonSmall}`}
|
|
133
|
-
onClick={() => { outlineFileRef.current?.click() }}
|
|
134
|
-
>
|
|
135
|
-
{outlineName !== '' ? `✓ ${outlineName}` : '📄 选择大纲 docx'}
|
|
136
|
-
</button>
|
|
137
|
-
<input
|
|
138
|
-
ref={outlineFileRef}
|
|
139
|
-
type="file"
|
|
140
|
-
accept=".docx,application/vnd.openxmlformats-officedocument.wordprocessingml.document"
|
|
141
|
-
style={{ display: 'none' }}
|
|
142
|
-
onChange={e => {
|
|
143
|
-
void handlePickOutlineFile(e.target.files?.[0])
|
|
144
|
-
e.target.value = ''
|
|
145
|
-
}}
|
|
146
|
-
/>
|
|
147
|
-
<textarea
|
|
148
|
-
className={css.input}
|
|
149
|
-
style={{ width: 280, minHeight: 64, resize: 'vertical' }}
|
|
150
|
-
placeholder="或直接粘贴大纲文本(提供大纲后开书即建立项目,书名自动从大纲首行识别)"
|
|
151
|
-
value={outlineText}
|
|
152
|
-
onChange={e => { setOutlineText(e.target.value) }}
|
|
153
|
-
/>
|
|
154
|
-
</div>
|
|
155
|
-
<div className={css.row}>
|
|
156
|
-
<button type="button" className={`${css.button} ${css.buttonSmall} ${css.buttonPrimary}`} disabled={busy || name.trim() === ''} onClick={() => { void handleCreate() }}>
|
|
157
|
-
开书
|
|
158
|
-
</button>
|
|
159
|
-
<button type="button" className={`${css.button} ${css.buttonSmall}`} onClick={() => { setCreating(false) }}>
|
|
160
|
-
取消
|
|
161
|
-
</button>
|
|
162
|
-
<span className={css.meta}>{outlineText.length > 0 ? `大纲 ${outlineText.length} 字` : '未提供大纲(稍后在大纲页导入)'}</span>
|
|
163
|
-
</div>
|
|
164
|
-
</div>
|
|
165
|
-
)}
|
|
166
|
-
</div>
|
|
167
|
-
{error !== '' && <span style={{ color: 'var(--nf-error)', fontSize: 12 }}>{error}</span>}
|
|
168
|
-
</div>
|
|
169
|
-
)
|
|
170
|
-
}
|
package/src/comic-presets.ts
DELETED
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
/** 漫画风格预设:每个预设对应一组出图提示词与排版偏好。 */
|
|
2
|
-
|
|
3
|
-
export interface ComicStylePreset {
|
|
4
|
-
id: string
|
|
5
|
-
label: string
|
|
6
|
-
/** 注入 imagePrompt 的风格描述词。 */
|
|
7
|
-
prompt: string
|
|
8
|
-
/** 可选:排版偏好说明。 */
|
|
9
|
-
layoutHint?: string
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
export const COMIC_STYLE_PRESETS: ComicStylePreset[] = [
|
|
13
|
-
{
|
|
14
|
-
id: 'japan',
|
|
15
|
-
label: '日漫 / 黑白',
|
|
16
|
-
prompt: 'manga style, screentone, bold ink lines, high contrast, black and white, cel shading',
|
|
17
|
-
layoutHint: '页漫优先',
|
|
18
|
-
},
|
|
19
|
-
{
|
|
20
|
-
id: 'korea',
|
|
21
|
-
label: '韩漫 / 条漫',
|
|
22
|
-
prompt: 'manhwa style, soft cel shading, vibrant colors, clean lineart, webtoon vertical composition, glossy highlights',
|
|
23
|
-
layoutHint: '条漫优先',
|
|
24
|
-
},
|
|
25
|
-
{
|
|
26
|
-
id: 'china',
|
|
27
|
-
label: '国漫 / 古风',
|
|
28
|
-
prompt: 'chinese ink painting style, flowing brush strokes, traditional palette, ethereal atmosphere, xianxia aesthetic',
|
|
29
|
-
layoutHint: '页漫/条漫均可',
|
|
30
|
-
},
|
|
31
|
-
{
|
|
32
|
-
id: 'america',
|
|
33
|
-
label: '美漫 / 超级英雄',
|
|
34
|
-
prompt: 'american comic style, bold outlines, dramatic lighting, dynamic poses, vibrant colors, halftone shading',
|
|
35
|
-
layoutHint: '页漫优先',
|
|
36
|
-
},
|
|
37
|
-
{
|
|
38
|
-
id: 'chibi',
|
|
39
|
-
label: 'Q版 / 搞笑',
|
|
40
|
-
prompt: 'chibi style, cute proportions, big head, exaggerated expressions, simple background, bright colors',
|
|
41
|
-
layoutHint: '条漫/四格优先',
|
|
42
|
-
},
|
|
43
|
-
{
|
|
44
|
-
id: 'realistic',
|
|
45
|
-
label: '写实 / 电影感',
|
|
46
|
-
prompt: 'realistic cinematic style, detailed textures, natural lighting, film grain, high detail',
|
|
47
|
-
layoutHint: '页漫/全彩',
|
|
48
|
-
},
|
|
49
|
-
{
|
|
50
|
-
id: 'cyber',
|
|
51
|
-
label: '赛博 / 暗黑',
|
|
52
|
-
prompt: 'cyberpunk style, neon lights, dark atmosphere, high contrast, futuristic city, cool tones',
|
|
53
|
-
layoutHint: '页漫/全彩',
|
|
54
|
-
},
|
|
55
|
-
]
|
|
56
|
-
|
|
57
|
-
export function getComicStylePrompt(styleId?: string): string {
|
|
58
|
-
if (!styleId) return ''
|
|
59
|
-
const preset = COMIC_STYLE_PRESETS.find(s => s.id === styleId)
|
|
60
|
-
return preset?.prompt ?? ''
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
export function getComicStyleLabel(styleId?: string): string {
|
|
64
|
-
if (!styleId) return ''
|
|
65
|
-
const preset = COMIC_STYLE_PRESETS.find(s => s.id === styleId)
|
|
66
|
-
return preset?.label ?? styleId
|
|
67
|
-
}
|