@waterwx/dsh-novel-forge 1.1.9 → 1.2.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 -349
  2. package/lib/client.js +54772 -10278
  3. package/lib/index.js +12057 -5069
  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 +18 -3
  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 +147 -9
  11. package/lib/types/client/docx.d.ts +2 -0
  12. package/lib/types/client/index.d.ts +1 -1
  13. package/lib/types/client/llmLive.d.ts +33 -0
  14. package/lib/types/client/locales.d.ts +34 -9
  15. package/lib/types/client/panel/AdaptModeView.d.ts +5 -0
  16. package/lib/types/client/panel/AiTag.d.ts +1 -0
  17. package/lib/types/client/panel/AssistantTab.d.ts +4 -1
  18. package/lib/types/client/panel/AuthorAssetsView.d.ts +4 -0
  19. package/lib/types/client/panel/AuthorHome.d.ts +34 -0
  20. package/lib/types/client/panel/BookAnalysisView.d.ts +4 -0
  21. package/lib/types/client/panel/CmdPalette.d.ts +12 -0
  22. package/lib/types/client/panel/CreateBookView.d.ts +5 -1
  23. package/lib/types/client/panel/DirectorView.d.ts +7 -0
  24. package/lib/types/client/panel/GlobalAssetLibraryView.d.ts +4 -0
  25. package/lib/types/client/panel/IdeaInspirationView.d.ts +6 -0
  26. package/lib/types/client/panel/ImportModal.d.ts +7 -0
  27. package/lib/types/client/panel/KnowledgeBaseView.d.ts +4 -0
  28. package/lib/types/client/panel/LiveFeedLog.d.ts +8 -0
  29. package/lib/types/client/panel/MarketRadarView.d.ts +5 -0
  30. package/lib/types/client/panel/ModelManager.d.ts +14 -0
  31. package/lib/types/client/panel/NovelPanel.d.ts +6 -1
  32. package/lib/types/client/panel/PageHeader.d.ts +18 -0
  33. package/lib/types/client/panel/ProgressConsole.d.ts +17 -0
  34. package/lib/types/client/panel/ProgressHomeView.d.ts +5 -0
  35. package/lib/types/client/panel/ReasoningSection.d.ts +10 -0
  36. package/lib/types/client/panel/SettingsView.d.ts +19 -0
  37. package/lib/types/client/panel/ShelfView.d.ts +12 -1
  38. package/lib/types/client/panel/SubPage.d.ts +27 -0
  39. package/lib/types/client/panel/toast.d.ts +2 -0
  40. package/lib/types/client/panel/views.d.ts +25 -7
  41. package/lib/types/client/run-status.d.ts +19 -0
  42. package/lib/types/client/text.d.ts +9 -0
  43. package/lib/types/docx-core.d.ts +16 -0
  44. package/lib/types/docx.d.ts +2 -3
  45. package/lib/types/engine.d.ts +147 -41
  46. package/lib/types/global-assets.d.ts +6 -0
  47. package/lib/types/index.d.ts +20 -2
  48. package/lib/types/llm-live.d.ts +44 -0
  49. package/lib/types/market-radar-scan.d.ts +19 -0
  50. package/lib/types/market-radar-sources.d.ts +31 -0
  51. package/lib/types/migrate-output.d.ts +25 -0
  52. package/lib/types/novel-context.d.ts +80 -0
  53. package/lib/types/prompt-utils.d.ts +35 -0
  54. package/lib/types/prompting.d.ts +10 -0
  55. package/lib/types/protocol.d.ts +1054 -123
  56. package/lib/types/review-policy.d.ts +97 -0
  57. package/lib/types/routes.d.ts +4 -0
  58. package/lib/types/run.d.ts +3 -1
  59. package/lib/types/stage-contract.d.ts +60 -0
  60. package/package.json +51 -27
  61. package/scripts/patch-schemastery.mjs +47 -0
  62. package/src/action-guard.ts +127 -0
  63. package/src/ai-scan.ts +179 -0
  64. package/src/assets.ts +1774 -520
  65. package/src/assistant.ts +1082 -770
  66. package/src/author-assets.ts +149 -0
  67. package/src/bookshelf.ts +187 -151
  68. package/src/client/api.ts +684 -410
  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 -367
  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 -439
  77. package/src/client/panel/AssistantTab.tsx +355 -301
  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 -348
  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 +5403 -4300
  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 -306
  95. package/src/client/panel/ReasoningSection.tsx +31 -0
  96. package/src/client/panel/RunPanel.tsx +223 -204
  97. package/src/client/panel/SettingsView.tsx +305 -0
  98. package/src/client/panel/ShelfView.tsx +266 -235
  99. package/src/client/panel/SubPage.tsx +42 -0
  100. package/src/client/panel/WorldTab.tsx +202 -202
  101. package/src/client/panel/panel.module.css +5764 -2817
  102. package/src/client/panel/toast.ts +51 -0
  103. package/src/client/panel/views.tsx +401 -314
  104. package/src/client/run-status.ts +143 -0
  105. package/src/client/sidebar-entry.ts +1 -1
  106. package/src/client/text.ts +28 -0
  107. package/src/docx-core.ts +53 -0
  108. package/src/docx.ts +44 -83
  109. package/src/engine.ts +4231 -2779
  110. package/src/global-assets.ts +59 -0
  111. package/src/index.ts +311 -246
  112. package/src/llm-live.ts +68 -0
  113. package/src/market-radar-scan.ts +41 -0
  114. package/src/market-radar-sources.ts +173 -0
  115. package/src/migrate-output.ts +76 -0
  116. package/src/novel-context.ts +286 -0
  117. package/src/prompting.ts +26 -0
  118. package/src/protocol.ts +2072 -1156
  119. package/src/review-policy.ts +161 -0
  120. package/src/routes.ts +3405 -2124
  121. package/src/run.ts +342 -330
  122. package/src/stage-contract.ts +189 -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
@@ -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
- }