@zb2947244682/supernovel 1.0.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.
Files changed (131) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +122 -0
  3. package/dist/adapters/aiAdapter.d.ts +21 -0
  4. package/dist/adapters/aiAdapter.d.ts.map +1 -0
  5. package/dist/adapters/aiAdapter.js +196 -0
  6. package/dist/adapters/aiAdapter.js.map +1 -0
  7. package/dist/adapters/index.d.ts +11 -0
  8. package/dist/adapters/index.d.ts.map +1 -0
  9. package/dist/adapters/index.js +20 -0
  10. package/dist/adapters/index.js.map +1 -0
  11. package/dist/adapters/logger.d.ts +9 -0
  12. package/dist/adapters/logger.d.ts.map +1 -0
  13. package/dist/adapters/logger.js +22 -0
  14. package/dist/adapters/logger.js.map +1 -0
  15. package/dist/adapters/storageAdapter.d.ts +20 -0
  16. package/dist/adapters/storageAdapter.d.ts.map +1 -0
  17. package/dist/adapters/storageAdapter.js +190 -0
  18. package/dist/adapters/storageAdapter.js.map +1 -0
  19. package/dist/adapters/validationAdapter.d.ts +16 -0
  20. package/dist/adapters/validationAdapter.d.ts.map +1 -0
  21. package/dist/adapters/validationAdapter.js +33 -0
  22. package/dist/adapters/validationAdapter.js.map +1 -0
  23. package/dist/bus/commands.d.ts +70 -0
  24. package/dist/bus/commands.d.ts.map +1 -0
  25. package/dist/bus/commands.js +34 -0
  26. package/dist/bus/commands.js.map +1 -0
  27. package/dist/bus/dispatcher.d.ts +4 -0
  28. package/dist/bus/dispatcher.d.ts.map +1 -0
  29. package/dist/bus/dispatcher.js +313 -0
  30. package/dist/bus/dispatcher.js.map +1 -0
  31. package/dist/bus/effectRunner.d.ts +11 -0
  32. package/dist/bus/effectRunner.d.ts.map +1 -0
  33. package/dist/bus/effectRunner.js +117 -0
  34. package/dist/bus/effectRunner.js.map +1 -0
  35. package/dist/bus/index.d.ts +4 -0
  36. package/dist/bus/index.d.ts.map +1 -0
  37. package/dist/bus/index.js +6 -0
  38. package/dist/bus/index.js.map +1 -0
  39. package/dist/config/paths.d.ts +13 -0
  40. package/dist/config/paths.d.ts.map +1 -0
  41. package/dist/config/paths.js +53 -0
  42. package/dist/config/paths.js.map +1 -0
  43. package/dist/core/effects.d.ts +109 -0
  44. package/dist/core/effects.d.ts.map +1 -0
  45. package/dist/core/effects.js +42 -0
  46. package/dist/core/effects.js.map +1 -0
  47. package/dist/core/errors.d.ts +28 -0
  48. package/dist/core/errors.d.ts.map +1 -0
  49. package/dist/core/errors.js +56 -0
  50. package/dist/core/errors.js.map +1 -0
  51. package/dist/core/index.d.ts +12 -0
  52. package/dist/core/index.d.ts.map +1 -0
  53. package/dist/core/index.js +18 -0
  54. package/dist/core/index.js.map +1 -0
  55. package/dist/core/jsonUtils.d.ts +13 -0
  56. package/dist/core/jsonUtils.d.ts.map +1 -0
  57. package/dist/core/jsonUtils.js +130 -0
  58. package/dist/core/jsonUtils.js.map +1 -0
  59. package/dist/core/logger.d.ts +16 -0
  60. package/dist/core/logger.d.ts.map +1 -0
  61. package/dist/core/logger.js +59 -0
  62. package/dist/core/logger.js.map +1 -0
  63. package/dist/core/ports.d.ts +57 -0
  64. package/dist/core/ports.d.ts.map +1 -0
  65. package/dist/core/ports.js +3 -0
  66. package/dist/core/ports.js.map +1 -0
  67. package/dist/core/rag/consistency.d.ts +51 -0
  68. package/dist/core/rag/consistency.d.ts.map +1 -0
  69. package/dist/core/rag/consistency.js +239 -0
  70. package/dist/core/rag/consistency.js.map +1 -0
  71. package/dist/core/rag/contextAssembler.d.ts +44 -0
  72. package/dist/core/rag/contextAssembler.d.ts.map +1 -0
  73. package/dist/core/rag/contextAssembler.js +278 -0
  74. package/dist/core/rag/contextAssembler.js.map +1 -0
  75. package/dist/core/rag/index.d.ts +12 -0
  76. package/dist/core/rag/index.d.ts.map +1 -0
  77. package/dist/core/rag/index.js +15 -0
  78. package/dist/core/rag/index.js.map +1 -0
  79. package/dist/core/rag/knowledgeGraph.d.ts +72 -0
  80. package/dist/core/rag/knowledgeGraph.d.ts.map +1 -0
  81. package/dist/core/rag/knowledgeGraph.js +227 -0
  82. package/dist/core/rag/knowledgeGraph.js.map +1 -0
  83. package/dist/core/rag/summaries.d.ts +57 -0
  84. package/dist/core/rag/summaries.d.ts.map +1 -0
  85. package/dist/core/rag/summaries.js +251 -0
  86. package/dist/core/rag/summaries.js.map +1 -0
  87. package/dist/core/rag/types.d.ts +201 -0
  88. package/dist/core/rag/types.d.ts.map +1 -0
  89. package/dist/core/rag/types.js +4 -0
  90. package/dist/core/rag/types.js.map +1 -0
  91. package/dist/core/rag/vectorStore.d.ts +68 -0
  92. package/dist/core/rag/vectorStore.d.ts.map +1 -0
  93. package/dist/core/rag/vectorStore.js +211 -0
  94. package/dist/core/rag/vectorStore.js.map +1 -0
  95. package/dist/core/types.d.ts +246 -0
  96. package/dist/core/types.d.ts.map +1 -0
  97. package/dist/core/types.js +3 -0
  98. package/dist/core/types.js.map +1 -0
  99. package/dist/core/usecases/generateChapter.d.ts +26 -0
  100. package/dist/core/usecases/generateChapter.d.ts.map +1 -0
  101. package/dist/core/usecases/generateChapter.js +132 -0
  102. package/dist/core/usecases/generateChapter.js.map +1 -0
  103. package/dist/core/usecases/generateChapterRAG.d.ts +40 -0
  104. package/dist/core/usecases/generateChapterRAG.d.ts.map +1 -0
  105. package/dist/core/usecases/generateChapterRAG.js +221 -0
  106. package/dist/core/usecases/generateChapterRAG.js.map +1 -0
  107. package/dist/core/usecases/generateOutline.d.ts +19 -0
  108. package/dist/core/usecases/generateOutline.d.ts.map +1 -0
  109. package/dist/core/usecases/generateOutline.js +129 -0
  110. package/dist/core/usecases/generateOutline.js.map +1 -0
  111. package/dist/core/usecases/generateWorld.d.ts +18 -0
  112. package/dist/core/usecases/generateWorld.d.ts.map +1 -0
  113. package/dist/core/usecases/generateWorld.js +189 -0
  114. package/dist/core/usecases/generateWorld.js.map +1 -0
  115. package/dist/core/usecases/parseRequirements.d.ts +20 -0
  116. package/dist/core/usecases/parseRequirements.d.ts.map +1 -0
  117. package/dist/core/usecases/parseRequirements.js +95 -0
  118. package/dist/core/usecases/parseRequirements.js.map +1 -0
  119. package/dist/core/usecases/validateNovel.d.ts +29 -0
  120. package/dist/core/usecases/validateNovel.d.ts.map +1 -0
  121. package/dist/core/usecases/validateNovel.js +156 -0
  122. package/dist/core/usecases/validateNovel.js.map +1 -0
  123. package/dist/shell/cli.d.ts +3 -0
  124. package/dist/shell/cli.d.ts.map +1 -0
  125. package/dist/shell/cli.js +158 -0
  126. package/dist/shell/cli.js.map +1 -0
  127. package/dist/shell/index.d.ts +3 -0
  128. package/dist/shell/index.d.ts.map +1 -0
  129. package/dist/shell/index.js +279 -0
  130. package/dist/shell/index.js.map +1 -0
  131. package/package.json +69 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/rag/index.ts"],"names":[],"mappings":"AAGA,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,uBAAuB,CAAC;AAGtC,OAAO,EACL,iBAAiB,EAClB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,oBAAoB,EACrB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,oBAAoB,EACrB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,wBAAwB,EACzB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,sBAAsB,EACvB,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,15 @@
1
+ // RAG 系统入口
2
+ // 导出所有RAG组件
3
+ export * from './types.js';
4
+ export * from './vectorStore.js';
5
+ export * from './knowledgeGraph.js';
6
+ export * from './summaries.js';
7
+ export * from './consistency.js';
8
+ export * from './contextAssembler.js';
9
+ // 重新导出全局实例
10
+ export { globalVectorStore } from './vectorStore.js';
11
+ export { globalKnowledgeGraph } from './knowledgeGraph.js';
12
+ export { globalSummaryManager } from './summaries.js';
13
+ export { globalConsistencyChecker } from './consistency.js';
14
+ export { globalContextAssembler } from './contextAssembler.js';
15
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/rag/index.ts"],"names":[],"mappings":"AAAA,WAAW;AACX,YAAY;AAEZ,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,uBAAuB,CAAC;AAEtC,WAAW;AACX,OAAO,EACL,iBAAiB,EAClB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,oBAAoB,EACrB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,oBAAoB,EACrB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,wBAAwB,EACzB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,sBAAsB,EACvB,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,72 @@
1
+ import type { Entity, Relationship, Event } from './types.js';
2
+ /**
3
+ * 知识图谱
4
+ */
5
+ export declare class KnowledgeGraph {
6
+ private entities;
7
+ private relationships;
8
+ private events;
9
+ addEntity(entity: Entity): void;
10
+ getEntity(id: string): Entity | undefined;
11
+ getEntityByName(name: string, type?: string): Entity | undefined;
12
+ getEntitiesByType(type: Entity['type']): Entity[];
13
+ updateEntity(id: string, updates: Partial<Entity>): void;
14
+ updateEntityAttribute(id: string, key: string, value: any): void;
15
+ addRelationship(rel: Relationship): void;
16
+ getRelationship(id: string): Relationship | undefined;
17
+ getRelationshipsBetween(fromId: string, toId: string): Relationship[];
18
+ getRelationshipsOfEntity(entityId: string): Relationship[];
19
+ getActiveRelationshipsOfEntity(entityId: string): Relationship[];
20
+ updateRelationship(id: string, chapterId: string, change: string, newType?: string): void;
21
+ addEvent(event: Event): void;
22
+ getEvent(id: string): Event | undefined;
23
+ getEventsByParticipant(entityId: string): Event[];
24
+ getEventsByLocation(locationId: string): Event[];
25
+ getEventsByChapter(chapterId: string): Event[];
26
+ /**
27
+ * 获取实体的相关实体(一度关系)
28
+ */
29
+ getRelatedEntities(entityId: string): {
30
+ entity: Entity;
31
+ relationship: Relationship;
32
+ }[];
33
+ /**
34
+ * 获取实体的关系网络(多度关系)
35
+ */
36
+ getEntityNetwork(entityId: string, depth?: number): {
37
+ entities: Entity[];
38
+ relationships: Relationship[];
39
+ };
40
+ /**
41
+ * 查找两个实体之间的路径
42
+ */
43
+ findPathBetween(fromId: string, toId: string, maxDepth?: number): Relationship[] | null;
44
+ /**
45
+ * 获取实体的完整历史(按时间线)
46
+ */
47
+ getEntityHistory(entityId: string): {
48
+ events: Event[];
49
+ relationshipChanges: {
50
+ chapterId: string;
51
+ changes: string[];
52
+ }[];
53
+ };
54
+ exportData(): {
55
+ entities: Entity[];
56
+ relationships: Relationship[];
57
+ events: Event[];
58
+ };
59
+ importData(data: {
60
+ entities: Entity[];
61
+ relationships: Relationship[];
62
+ events: Event[];
63
+ }): void;
64
+ clear(): void;
65
+ getStats(): {
66
+ entities: number;
67
+ relationships: number;
68
+ events: number;
69
+ };
70
+ }
71
+ export declare const globalKnowledgeGraph: KnowledgeGraph;
72
+ //# sourceMappingURL=knowledgeGraph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"knowledgeGraph.d.ts","sourceRoot":"","sources":["../../../src/core/rag/knowledgeGraph.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,227 @@
1
+ // 知识图谱管理器 - GraphRAG核心
2
+ // 管理实体、关系和事件图谱
3
+ /**
4
+ * 知识图谱
5
+ */
6
+ export class KnowledgeGraph {
7
+ entities = new Map();
8
+ relationships = new Map();
9
+ events = new Map();
10
+ // ============ 实体管理 ============
11
+ addEntity(entity) {
12
+ this.entities.set(entity.id, entity);
13
+ }
14
+ getEntity(id) {
15
+ return this.entities.get(id);
16
+ }
17
+ getEntityByName(name, type) {
18
+ for (const entity of this.entities.values()) {
19
+ if (entity.name === name || entity.aliases.includes(name)) {
20
+ if (!type || entity.type === type) {
21
+ return entity;
22
+ }
23
+ }
24
+ }
25
+ return undefined;
26
+ }
27
+ getEntitiesByType(type) {
28
+ return Array.from(this.entities.values())
29
+ .filter(e => e.type === type);
30
+ }
31
+ updateEntity(id, updates) {
32
+ const entity = this.entities.get(id);
33
+ if (entity) {
34
+ Object.assign(entity, updates);
35
+ }
36
+ }
37
+ updateEntityAttribute(id, key, value) {
38
+ const entity = this.entities.get(id);
39
+ if (entity) {
40
+ entity.attributes[key] = value;
41
+ }
42
+ }
43
+ // ============ 关系管理 ============
44
+ addRelationship(rel) {
45
+ this.relationships.set(rel.id, rel);
46
+ }
47
+ getRelationship(id) {
48
+ return this.relationships.get(id);
49
+ }
50
+ getRelationshipsBetween(fromId, toId) {
51
+ return Array.from(this.relationships.values())
52
+ .filter(r => r.fromId === fromId && r.toId === toId);
53
+ }
54
+ getRelationshipsOfEntity(entityId) {
55
+ return Array.from(this.relationships.values())
56
+ .filter(r => r.fromId === entityId || r.toId === entityId);
57
+ }
58
+ getActiveRelationshipsOfEntity(entityId) {
59
+ return this.getRelationshipsOfEntity(entityId)
60
+ .filter(r => r.isActive);
61
+ }
62
+ updateRelationship(id, chapterId, change, newType) {
63
+ const rel = this.relationships.get(id);
64
+ if (rel) {
65
+ const evolution = {
66
+ chapterId,
67
+ change,
68
+ newType,
69
+ timestamp: new Date().toISOString()
70
+ };
71
+ rel.evolution.push(evolution);
72
+ if (newType) {
73
+ rel.type = newType;
74
+ }
75
+ rel.lastChapterId = chapterId;
76
+ }
77
+ }
78
+ // ============ 事件管理 ============
79
+ addEvent(event) {
80
+ this.events.set(event.id, event);
81
+ }
82
+ getEvent(id) {
83
+ return this.events.get(id);
84
+ }
85
+ getEventsByParticipant(entityId) {
86
+ return Array.from(this.events.values())
87
+ .filter(e => e.participants.includes(entityId));
88
+ }
89
+ getEventsByLocation(locationId) {
90
+ return Array.from(this.events.values())
91
+ .filter(e => e.locationId === locationId);
92
+ }
93
+ getEventsByChapter(chapterId) {
94
+ return Array.from(this.events.values())
95
+ .filter(e => e.chapterId === chapterId);
96
+ }
97
+ // ============ 图谱查询 ============
98
+ /**
99
+ * 获取实体的相关实体(一度关系)
100
+ */
101
+ getRelatedEntities(entityId) {
102
+ const rels = this.getRelationshipsOfEntity(entityId);
103
+ const results = [];
104
+ for (const rel of rels) {
105
+ const otherId = rel.fromId === entityId ? rel.toId : rel.fromId;
106
+ const otherEntity = this.entities.get(otherId);
107
+ if (otherEntity) {
108
+ results.push({ entity: otherEntity, relationship: rel });
109
+ }
110
+ }
111
+ return results;
112
+ }
113
+ /**
114
+ * 获取实体的关系网络(多度关系)
115
+ */
116
+ getEntityNetwork(entityId, depth = 2) {
117
+ const visitedEntities = new Set([entityId]);
118
+ const visitedRels = new Set();
119
+ let currentLevel = [entityId];
120
+ for (let i = 0; i < depth; i++) {
121
+ const nextLevel = [];
122
+ for (const id of currentLevel) {
123
+ const related = this.getRelatedEntities(id);
124
+ for (const { entity, relationship } of related) {
125
+ if (!visitedRels.has(relationship.id)) {
126
+ visitedRels.add(relationship.id);
127
+ }
128
+ if (!visitedEntities.has(entity.id)) {
129
+ visitedEntities.add(entity.id);
130
+ nextLevel.push(entity.id);
131
+ }
132
+ }
133
+ }
134
+ currentLevel = nextLevel;
135
+ }
136
+ return {
137
+ entities: Array.from(visitedEntities).map(id => this.entities.get(id)),
138
+ relationships: Array.from(visitedRels).map(id => this.relationships.get(id))
139
+ };
140
+ }
141
+ /**
142
+ * 查找两个实体之间的路径
143
+ */
144
+ findPathBetween(fromId, toId, maxDepth = 5) {
145
+ const visited = new Set();
146
+ const queue = [{ entityId: fromId, path: [] }];
147
+ while (queue.length > 0) {
148
+ const { entityId, path } = queue.shift();
149
+ if (entityId === toId) {
150
+ return path;
151
+ }
152
+ if (visited.has(entityId) || path.length >= maxDepth) {
153
+ continue;
154
+ }
155
+ visited.add(entityId);
156
+ const rels = this.getRelationshipsOfEntity(entityId);
157
+ for (const rel of rels) {
158
+ const nextId = rel.fromId === entityId ? rel.toId : rel.fromId;
159
+ if (!visited.has(nextId)) {
160
+ queue.push({
161
+ entityId: nextId,
162
+ path: [...path, rel]
163
+ });
164
+ }
165
+ }
166
+ }
167
+ return null;
168
+ }
169
+ /**
170
+ * 获取实体的完整历史(按时间线)
171
+ */
172
+ getEntityHistory(entityId) {
173
+ const events = this.getEventsByParticipant(entityId);
174
+ const rels = this.getRelationshipsOfEntity(entityId);
175
+ // 按章节组织关系变化
176
+ const changesByChapter = new Map();
177
+ for (const rel of rels) {
178
+ for (const evo of rel.evolution) {
179
+ if (!changesByChapter.has(evo.chapterId)) {
180
+ changesByChapter.set(evo.chapterId, []);
181
+ }
182
+ changesByChapter.get(evo.chapterId).push(`${rel.type} with ${rel.fromId === entityId ? rel.toId : rel.fromId}: ${evo.change}`);
183
+ }
184
+ }
185
+ const relationshipChanges = Array.from(changesByChapter.entries())
186
+ .map(([chapterId, changes]) => ({ chapterId, changes }))
187
+ .sort((a, b) => a.chapterId.localeCompare(b.chapterId));
188
+ return {
189
+ events: events.sort((a, b) => a.timeline.localeCompare(b.timeline)),
190
+ relationshipChanges
191
+ };
192
+ }
193
+ // ============ 导出导入 ============
194
+ exportData() {
195
+ return {
196
+ entities: Array.from(this.entities.values()),
197
+ relationships: Array.from(this.relationships.values()),
198
+ events: Array.from(this.events.values())
199
+ };
200
+ }
201
+ importData(data) {
202
+ this.entities.clear();
203
+ this.relationships.clear();
204
+ this.events.clear();
205
+ for (const e of data.entities)
206
+ this.entities.set(e.id, e);
207
+ for (const r of data.relationships)
208
+ this.relationships.set(r.id, r);
209
+ for (const e of data.events)
210
+ this.events.set(e.id, e);
211
+ }
212
+ clear() {
213
+ this.entities.clear();
214
+ this.relationships.clear();
215
+ this.events.clear();
216
+ }
217
+ getStats() {
218
+ return {
219
+ entities: this.entities.size,
220
+ relationships: this.relationships.size,
221
+ events: this.events.size
222
+ };
223
+ }
224
+ }
225
+ // 全局知识图谱实例
226
+ export const globalKnowledgeGraph = new KnowledgeGraph();
227
+ //# sourceMappingURL=knowledgeGraph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"knowledgeGraph.js","sourceRoot":"","sources":["../../../src/core/rag/knowledgeGraph.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ import type { HierarchicalSummary, BookSummary, VolumeSummary, ChapterSummary, CharacterArcSummary } from './types.js';
2
+ import type { NovelProject, GeneratedChapter } from '../types.js';
3
+ /**
4
+ * 分层摘要管理器
5
+ */
6
+ export declare class SummaryManager {
7
+ private summaries;
8
+ initializeFromProject(project: NovelProject): void;
9
+ private extractCharacterArcs;
10
+ addChapterSummary(chapter: GeneratedChapter, extractedSummary?: string): ChapterSummary;
11
+ updateChapterSummary(chapterId: string, updates: Partial<ChapterSummary>): void;
12
+ private refreshVolumeSummary;
13
+ updateVolumeSummary(volumeNumber: number, updates: Partial<VolumeSummary>): void;
14
+ private refreshBookSummary;
15
+ updateBookSummary(updates: Partial<BookSummary>): void;
16
+ /**
17
+ * 获取章节摘要(用于构建上下文)
18
+ * @param currentVolume 当前卷
19
+ * @param currentChapter 当前章
20
+ * @param lookback 回溯章节数
21
+ */
22
+ getContextSummaries(currentVolume: number, currentChapter: number, lookback?: number): {
23
+ bookSummary: string;
24
+ volumeSummary: string;
25
+ recentChapters: ChapterSummary[];
26
+ previousChapter?: ChapterSummary;
27
+ };
28
+ /**
29
+ * 获取角色的发展轨迹
30
+ */
31
+ getCharacterTrajectory(characterId: string): {
32
+ appearances: ChapterSummary[];
33
+ arc: CharacterArcSummary | undefined;
34
+ };
35
+ /**
36
+ * 获取情节线进展
37
+ */
38
+ getPlotThreadProgress(threadName: string): ChapterSummary[];
39
+ /**
40
+ * 获取待回收的伏笔
41
+ */
42
+ getPendingHooks(): {
43
+ hookId: string;
44
+ plantedIn: string;
45
+ description?: string;
46
+ }[];
47
+ private buildBookSummaryText;
48
+ exportData(): HierarchicalSummary;
49
+ importData(data: HierarchicalSummary): void;
50
+ getStats(): {
51
+ totalChapters: number;
52
+ totalVolumes: number;
53
+ characterArcs: number;
54
+ };
55
+ }
56
+ export declare const globalSummaryManager: SummaryManager;
57
+ //# sourceMappingURL=summaries.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"summaries.d.ts","sourceRoot":"","sources":["../../../src/core/rag/summaries.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,mBAAmB,EACnB,WAAW,EACX,aAAa,EACb,cAAc,EACd,mBAAmB,EAEpB,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAA4B,MAAM,aAAa,CAAC;AAE5F;;GAEG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,SAAS,CAYf;IAIF,qBAAqB,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI;IA0BlD,OAAO,CAAC,oBAAoB;IAc5B,iBAAiB,CAAC,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,CAAC,EAAE,MAAM,GAAG,cAAc;IA2BvF,oBAAoB,CAClB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,OAAO,CAAC,cAAc,CAAC,GAC/B,IAAI;IAgBP,OAAO,CAAC,oBAAoB;IAiC5B,mBAAmB,CACjB,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,GAC9B,IAAI;IAgBP,OAAO,CAAC,kBAAkB;IAe1B,iBAAiB,CAAC,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,IAAI;IAUtD;;;;;OAKG;IACH,mBAAmB,CACjB,aAAa,EAAE,MAAM,EACrB,cAAc,EAAE,MAAM,EACtB,QAAQ,GAAE,MAAU,GACnB;QACD,WAAW,EAAE,MAAM,CAAC;QACpB,aAAa,EAAE,MAAM,CAAC;QACtB,cAAc,EAAE,cAAc,EAAE,CAAC;QACjC,eAAe,CAAC,EAAE,cAAc,CAAC;KAClC;IAgCD;;OAEG;IACH,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG;QAC3C,WAAW,EAAE,cAAc,EAAE,CAAC;QAC9B,GAAG,EAAE,mBAAmB,GAAG,SAAS,CAAC;KACtC;IAiBD;;OAEG;IACH,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,cAAc,EAAE;IAW3D;;OAEG;IACH,eAAe,IAAI;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE;IA2BhF,OAAO,CAAC,oBAAoB;IAO5B,UAAU,IAAI,mBAAmB;IAIjC,UAAU,CAAC,IAAI,EAAE,mBAAmB,GAAG,IAAI;IAI3C,QAAQ,IAAI;QACV,aAAa,EAAE,MAAM,CAAC;QACtB,YAAY,EAAE,MAAM,CAAC;QACrB,aAAa,EAAE,MAAM,CAAC;KACvB;CAOF;AAGD,eAAO,MAAM,oBAAoB,gBAAuB,CAAC"}
@@ -0,0 +1,251 @@
1
+ // 分层摘要管理器
2
+ // 管理全书 -> 卷 -> 章 的三级摘要体系
3
+ /**
4
+ * 分层摘要管理器
5
+ */
6
+ export class SummaryManager {
7
+ summaries = {
8
+ bookLevel: {
9
+ title: '',
10
+ overview: '',
11
+ mainTheme: '',
12
+ characterArcs: [],
13
+ majorPlotPoints: [],
14
+ totalWordCount: 0,
15
+ updatedAt: new Date().toISOString()
16
+ },
17
+ volumeSummaries: [],
18
+ chapterSummaries: []
19
+ };
20
+ // ============ 初始化 ============
21
+ initializeFromProject(project) {
22
+ const outline = project.outline;
23
+ // 初始化全书摘要
24
+ this.summaries.bookLevel = {
25
+ title: outline.title,
26
+ overview: outline.subtitle || '',
27
+ mainTheme: outline.theme || '',
28
+ characterArcs: this.extractCharacterArcs(project.worldState),
29
+ majorPlotPoints: [],
30
+ totalWordCount: 0,
31
+ updatedAt: new Date().toISOString()
32
+ };
33
+ // 初始化卷摘要
34
+ this.summaries.volumeSummaries = outline.volumes.map(vol => ({
35
+ volumeNumber: vol.number,
36
+ title: vol.title,
37
+ summary: vol.summary || vol.title || '',
38
+ keyEvents: [],
39
+ characterDevelopments: [],
40
+ cliffhanger: '',
41
+ updatedAt: new Date().toISOString()
42
+ }));
43
+ }
44
+ extractCharacterArcs(worldState) {
45
+ return worldState.characters.map(char => ({
46
+ characterId: char.id,
47
+ characterName: char.name,
48
+ startingState: char.currentState.status || '',
49
+ currentState: char.currentState.status || '',
50
+ goal: char.motivation,
51
+ obstacles: [],
52
+ growthTrajectory: char.arc?.type || 'flat'
53
+ }));
54
+ }
55
+ // ============ 章节摘要管理 ============
56
+ addChapterSummary(chapter, extractedSummary) {
57
+ const summary = {
58
+ chapterId: chapter.id,
59
+ volumeNumber: chapter.volume,
60
+ chapterNumber: chapter.number,
61
+ summary: extractedSummary || `第${chapter.volume}卷第${chapter.number}章:${chapter.title}`,
62
+ keyEvents: [],
63
+ charactersAppeared: [],
64
+ locationsAppeared: [],
65
+ plotThreadsAdvanced: [],
66
+ hooksPlanted: [],
67
+ hooksResolved: [],
68
+ emotionalTone: '',
69
+ updatedAt: new Date().toISOString()
70
+ };
71
+ this.summaries.chapterSummaries.push(summary);
72
+ // 更新卷摘要
73
+ this.refreshVolumeSummary(chapter.volume);
74
+ // 更新全书摘要
75
+ this.refreshBookSummary();
76
+ return summary;
77
+ }
78
+ updateChapterSummary(chapterId, updates) {
79
+ const idx = this.summaries.chapterSummaries.findIndex(s => s.chapterId === chapterId);
80
+ if (idx >= 0) {
81
+ this.summaries.chapterSummaries[idx] = {
82
+ ...this.summaries.chapterSummaries[idx],
83
+ ...updates,
84
+ updatedAt: new Date().toISOString()
85
+ };
86
+ }
87
+ }
88
+ // ============ 卷摘要管理 ============
89
+ refreshVolumeSummary(volumeNumber) {
90
+ const volSummary = this.summaries.volumeSummaries.find(v => v.volumeNumber === volumeNumber);
91
+ if (!volSummary)
92
+ return;
93
+ const volChapters = this.summaries.chapterSummaries.filter(s => s.volumeNumber === volumeNumber);
94
+ // 聚合本章的关键事件
95
+ volSummary.keyEvents = volChapters
96
+ .flatMap(c => c.keyEvents)
97
+ .filter((e, i, arr) => arr.indexOf(e) === i); // 去重
98
+ // 计算角色发展
99
+ const charDevs = new Map();
100
+ for (const ch of volChapters) {
101
+ for (const charId of ch.charactersAppeared) {
102
+ if (!charDevs.has(charId)) {
103
+ charDevs.set(charId, {
104
+ characterId: charId,
105
+ change: ''
106
+ });
107
+ }
108
+ }
109
+ }
110
+ volSummary.characterDevelopments = Array.from(charDevs.values());
111
+ volSummary.updatedAt = new Date().toISOString();
112
+ }
113
+ updateVolumeSummary(volumeNumber, updates) {
114
+ const idx = this.summaries.volumeSummaries.findIndex(v => v.volumeNumber === volumeNumber);
115
+ if (idx >= 0) {
116
+ this.summaries.volumeSummaries[idx] = {
117
+ ...this.summaries.volumeSummaries[idx],
118
+ ...updates,
119
+ updatedAt: new Date().toISOString()
120
+ };
121
+ }
122
+ }
123
+ // ============ 全书摘要管理 ============
124
+ refreshBookSummary() {
125
+ const book = this.summaries.bookLevel;
126
+ const allChapters = this.summaries.chapterSummaries;
127
+ // 更新总字数
128
+ book.totalWordCount = allChapters.length * 2000; // 估算
129
+ // 收集主要情节点(每章取第一个关键事件)
130
+ book.majorPlotPoints = allChapters
131
+ .filter(c => c.keyEvents.length > 0)
132
+ .map(c => `${c.volumeNumber}-${c.chapterNumber}: ${c.keyEvents[0]}`);
133
+ book.updatedAt = new Date().toISOString();
134
+ }
135
+ updateBookSummary(updates) {
136
+ this.summaries.bookLevel = {
137
+ ...this.summaries.bookLevel,
138
+ ...updates,
139
+ updatedAt: new Date().toISOString()
140
+ };
141
+ }
142
+ // ============ 查询接口 ============
143
+ /**
144
+ * 获取章节摘要(用于构建上下文)
145
+ * @param currentVolume 当前卷
146
+ * @param currentChapter 当前章
147
+ * @param lookback 回溯章节数
148
+ */
149
+ getContextSummaries(currentVolume, currentChapter, lookback = 5) {
150
+ const bookSummary = this.buildBookSummaryText();
151
+ const volumeSummary = this.summaries.volumeSummaries.find(v => v.volumeNumber === currentVolume);
152
+ // 获取最近N章
153
+ const recentChapters = this.summaries.chapterSummaries
154
+ .filter(s => {
155
+ if (s.volumeNumber > currentVolume)
156
+ return false;
157
+ if (s.volumeNumber === currentVolume && s.chapterNumber >= currentChapter)
158
+ return false;
159
+ return true;
160
+ })
161
+ .sort((a, b) => {
162
+ if (a.volumeNumber !== b.volumeNumber) {
163
+ return b.volumeNumber - a.volumeNumber;
164
+ }
165
+ return b.chapterNumber - a.chapterNumber;
166
+ })
167
+ .slice(0, lookback)
168
+ .reverse();
169
+ const previousChapter = recentChapters[recentChapters.length - 1];
170
+ return {
171
+ bookSummary,
172
+ volumeSummary: volumeSummary?.summary || '',
173
+ recentChapters,
174
+ previousChapter
175
+ };
176
+ }
177
+ /**
178
+ * 获取角色的发展轨迹
179
+ */
180
+ getCharacterTrajectory(characterId) {
181
+ const appearances = this.summaries.chapterSummaries
182
+ .filter(s => s.charactersAppeared.includes(characterId))
183
+ .sort((a, b) => {
184
+ if (a.volumeNumber !== b.volumeNumber) {
185
+ return a.volumeNumber - b.volumeNumber;
186
+ }
187
+ return a.chapterNumber - b.chapterNumber;
188
+ });
189
+ const arc = this.summaries.bookLevel.characterArcs.find(a => a.characterId === characterId);
190
+ return { appearances, arc };
191
+ }
192
+ /**
193
+ * 获取情节线进展
194
+ */
195
+ getPlotThreadProgress(threadName) {
196
+ return this.summaries.chapterSummaries
197
+ .filter(s => s.plotThreadsAdvanced.includes(threadName))
198
+ .sort((a, b) => {
199
+ if (a.volumeNumber !== b.volumeNumber) {
200
+ return a.volumeNumber - b.volumeNumber;
201
+ }
202
+ return a.chapterNumber - b.chapterNumber;
203
+ });
204
+ }
205
+ /**
206
+ * 获取待回收的伏笔
207
+ */
208
+ getPendingHooks() {
209
+ const planted = new Map();
210
+ const resolved = new Set();
211
+ for (const summary of this.summaries.chapterSummaries) {
212
+ for (const hook of summary.hooksPlanted) {
213
+ if (!planted.has(hook)) {
214
+ planted.set(hook, `${summary.volumeNumber}-${summary.chapterNumber}`);
215
+ }
216
+ }
217
+ for (const hook of summary.hooksResolved) {
218
+ resolved.add(hook);
219
+ }
220
+ }
221
+ const pending = [];
222
+ for (const [hookId, plantedIn] of planted) {
223
+ if (!resolved.has(hookId)) {
224
+ pending.push({ hookId, plantedIn });
225
+ }
226
+ }
227
+ return pending;
228
+ }
229
+ // ============ 辅助方法 ============
230
+ buildBookSummaryText() {
231
+ const book = this.summaries.bookLevel;
232
+ return `${book.title} - ${book.mainTheme}\n${book.overview}`;
233
+ }
234
+ // ============ 导入导出 ============
235
+ exportData() {
236
+ return JSON.parse(JSON.stringify(this.summaries));
237
+ }
238
+ importData(data) {
239
+ this.summaries = data;
240
+ }
241
+ getStats() {
242
+ return {
243
+ totalChapters: this.summaries.chapterSummaries.length,
244
+ totalVolumes: this.summaries.volumeSummaries.length,
245
+ characterArcs: this.summaries.bookLevel.characterArcs.length
246
+ };
247
+ }
248
+ }
249
+ // 全局摘要管理器实例
250
+ export const globalSummaryManager = new SummaryManager();
251
+ //# sourceMappingURL=summaries.js.map