novelws 5.2.0 → 5.3.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 (82) hide show
  1. package/CHANGELOG.md +34 -0
  2. package/README.md +51 -0
  3. package/dist/cli.js +3 -0
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/dashboard.d.ts +3 -0
  6. package/dist/commands/dashboard.d.ts.map +1 -0
  7. package/dist/commands/dashboard.js +42 -0
  8. package/dist/commands/dashboard.js.map +1 -0
  9. package/dist/commands/init.d.ts.map +1 -1
  10. package/dist/commands/init.js +19 -0
  11. package/dist/commands/init.js.map +1 -1
  12. package/dist/commands/upgrade.d.ts.map +1 -1
  13. package/dist/commands/upgrade.js +23 -0
  14. package/dist/commands/upgrade.js.map +1 -1
  15. package/dist/core/config.d.ts +3 -0
  16. package/dist/core/config.d.ts.map +1 -1
  17. package/dist/core/config.js +4 -0
  18. package/dist/core/config.js.map +1 -1
  19. package/dist/server/datasource/db.d.ts +38 -0
  20. package/dist/server/datasource/db.d.ts.map +1 -0
  21. package/dist/server/datasource/db.js +323 -0
  22. package/dist/server/datasource/db.js.map +1 -0
  23. package/dist/server/datasource/fs.d.ts +30 -0
  24. package/dist/server/datasource/fs.d.ts.map +1 -0
  25. package/dist/server/datasource/fs.js +308 -0
  26. package/dist/server/datasource/fs.js.map +1 -0
  27. package/dist/server/datasource/index.d.ts +11 -0
  28. package/dist/server/datasource/index.d.ts.map +1 -0
  29. package/dist/server/datasource/index.js +33 -0
  30. package/dist/server/datasource/index.js.map +1 -0
  31. package/dist/server/index.d.ts +12 -0
  32. package/dist/server/index.d.ts.map +1 -0
  33. package/dist/server/index.js +69 -0
  34. package/dist/server/index.js.map +1 -0
  35. package/dist/server/routes/characters.d.ts +4 -0
  36. package/dist/server/routes/characters.d.ts.map +1 -0
  37. package/dist/server/routes/characters.js +27 -0
  38. package/dist/server/routes/characters.js.map +1 -0
  39. package/dist/server/routes/plots.d.ts +4 -0
  40. package/dist/server/routes/plots.d.ts.map +1 -0
  41. package/dist/server/routes/plots.js +36 -0
  42. package/dist/server/routes/plots.js.map +1 -0
  43. package/dist/server/routes/protagonist.d.ts +4 -0
  44. package/dist/server/routes/protagonist.d.ts.map +1 -0
  45. package/dist/server/routes/protagonist.js +46 -0
  46. package/dist/server/routes/protagonist.js.map +1 -0
  47. package/dist/server/routes/relationships.d.ts +4 -0
  48. package/dist/server/routes/relationships.d.ts.map +1 -0
  49. package/dist/server/routes/relationships.js +27 -0
  50. package/dist/server/routes/relationships.js.map +1 -0
  51. package/dist/server/routes/stats.d.ts +4 -0
  52. package/dist/server/routes/stats.d.ts.map +1 -0
  53. package/dist/server/routes/stats.js +21 -0
  54. package/dist/server/routes/stats.js.map +1 -0
  55. package/dist/server/routes/stories.d.ts +4 -0
  56. package/dist/server/routes/stories.d.ts.map +1 -0
  57. package/dist/server/routes/stories.js +80 -0
  58. package/dist/server/routes/stories.js.map +1 -0
  59. package/dist/server/routes/timeline.d.ts +4 -0
  60. package/dist/server/routes/timeline.d.ts.map +1 -0
  61. package/dist/server/routes/timeline.js +17 -0
  62. package/dist/server/routes/timeline.js.map +1 -0
  63. package/dist/server/types.d.ts +199 -0
  64. package/dist/server/types.d.ts.map +1 -0
  65. package/dist/server/types.js +2 -0
  66. package/dist/server/types.js.map +1 -0
  67. package/package.json +13 -3
  68. package/templates/commands/analyze.md +9 -1
  69. package/templates/commands/expand.md +19 -3
  70. package/templates/commands/write.md +23 -7
  71. package/templates/dot-claude/CLAUDE.md +27 -0
  72. package/templates/scripts/db_context.py +609 -0
  73. package/templates/scripts/db_init_protagonist.py +343 -0
  74. package/templates/scripts/db_sync.py +611 -0
  75. package/templates/scripts/db_volume_switch.py +278 -0
  76. package/templates/scripts/phase_a_init_db.py +428 -0
  77. package/templates/scripts/requirements.txt +1 -0
  78. package/templates/tracking/character-state.json +1 -3
  79. package/templates/tracking/plot-tracker.json +1 -5
  80. package/templates/tracking/relationships.json +1 -3
  81. package/templates/tracking/timeline.json +1 -3
  82. package/templates/volume-outline.md +31 -0
@@ -0,0 +1,323 @@
1
+ import { Client } from 'pg';
2
+ import path from 'path';
3
+ export class DbDataSource {
4
+ config;
5
+ projectRoot;
6
+ client;
7
+ schema;
8
+ constructor(config, projectRoot) {
9
+ this.config = config;
10
+ this.projectRoot = projectRoot;
11
+ this.schema = config.schema || 'novelws';
12
+ this.client = new Client({
13
+ host: config.host,
14
+ port: config.port,
15
+ database: config.dbname,
16
+ user: config.user,
17
+ password: config.password,
18
+ });
19
+ }
20
+ async connect() {
21
+ await this.client.connect();
22
+ await this.client.query(`SET search_path TO ${this.schema}, public`);
23
+ }
24
+ async disconnect() {
25
+ await this.client.end();
26
+ }
27
+ async query(sql, params) {
28
+ const result = await this.client.query(sql, params);
29
+ return result.rows;
30
+ }
31
+ async getStories() {
32
+ return [{ name: path.basename(this.projectRoot), path: this.projectRoot }];
33
+ }
34
+ async getOverview(_story) {
35
+ const [volCount] = await this.query('SELECT COUNT(*) as count FROM volumes');
36
+ const [chapStats] = await this.query('SELECT COUNT(*) as count, COALESCE(SUM(word_count), 0) as total_words FROM chapters');
37
+ const [current] = await this.query('SELECT vol_number FROM volumes ORDER BY vol_number DESC LIMIT 1');
38
+ return {
39
+ name: path.basename(this.projectRoot),
40
+ totalVolumes: parseInt(volCount?.count || '0', 10),
41
+ totalChapters: parseInt(chapStats?.count || '0', 10),
42
+ totalWords: parseInt(chapStats?.total_words || '0', 10),
43
+ currentVolume: current?.vol_number || 0,
44
+ };
45
+ }
46
+ async getVolumes(_story) {
47
+ const rows = await this.query(`
48
+ SELECT v.vol_number, v.vol_title,
49
+ COUNT(c.global_chapter_number) as chapters,
50
+ COALESCE(SUM(c.word_count), 0) as words
51
+ FROM volumes v
52
+ LEFT JOIN chapters c ON c.vol_number = v.vol_number
53
+ GROUP BY v.vol_number, v.vol_title
54
+ ORDER BY v.vol_number
55
+ `);
56
+ return rows.map(r => ({
57
+ number: r.vol_number,
58
+ title: r.vol_title || `第 ${r.vol_number} 卷`,
59
+ chapters: parseInt(r.chapters, 10),
60
+ words: parseInt(r.words, 10),
61
+ progress: 0,
62
+ }));
63
+ }
64
+ async getChapters(_story, vol) {
65
+ const where = vol ? 'WHERE c.vol_number = $1' : '';
66
+ const params = vol ? [vol] : [];
67
+ const rows = await this.query(`
68
+ SELECT c.global_chapter_number, c.vol_number, c.chapter_in_vol,
69
+ c.word_count, c.pov_character,
70
+ ARRAY_AGG(cp.character_name) FILTER (WHERE cp.character_name IS NOT NULL) as participants
71
+ FROM chapters c
72
+ LEFT JOIN chapter_participants cp ON cp.chapter_number = c.global_chapter_number
73
+ ${where}
74
+ GROUP BY c.global_chapter_number, c.vol_number, c.chapter_in_vol, c.word_count, c.pov_character
75
+ ORDER BY c.global_chapter_number
76
+ `, params);
77
+ return rows.map(r => ({
78
+ globalNumber: r.global_chapter_number,
79
+ volumeNumber: r.vol_number,
80
+ chapterInVolume: r.chapter_in_vol,
81
+ title: `第 ${r.global_chapter_number} 章`,
82
+ words: r.word_count || 0,
83
+ pov: r.pov_character || '',
84
+ participants: r.participants || [],
85
+ hasSynopsis: true,
86
+ hasContent: (r.word_count || 0) > 0,
87
+ }));
88
+ }
89
+ async getCharacters(_story, vol) {
90
+ let sql;
91
+ let params;
92
+ if (vol) {
93
+ sql = `
94
+ SELECT DISTINCT ch.name, ch.aliases, ch.identity_type,
95
+ ch.first_vol, ch.first_chap, ch.cultivation_level, ch.faction, ch.status
96
+ FROM characters ch
97
+ JOIN character_states cs ON cs.character_name = ch.name
98
+ WHERE cs.vol_number = $1
99
+ ORDER BY ch.name
100
+ `;
101
+ params = [vol];
102
+ }
103
+ else {
104
+ sql = 'SELECT name, aliases, identity_type, first_vol, first_chap, cultivation_level, faction, status FROM characters ORDER BY name';
105
+ params = [];
106
+ }
107
+ const rows = await this.query(sql, params);
108
+ return rows.map(r => ({
109
+ name: r.name,
110
+ aliases: r.aliases ? r.aliases.split(',').map((a) => a.trim()) : [],
111
+ role: r.identity_type || '',
112
+ firstVolume: r.first_vol || 0,
113
+ firstChapter: r.first_chap || 0,
114
+ cultivation: r.cultivation_level || '',
115
+ faction: r.faction || '',
116
+ status: r.status || '活跃',
117
+ }));
118
+ }
119
+ async getCharacterArc(_story, name) {
120
+ const rows = await this.query(`
121
+ SELECT vol_number, cultivation_level, location, state_summary, last_appearance_chap
122
+ FROM character_states
123
+ WHERE character_name = $1
124
+ ORDER BY vol_number
125
+ `, [name]);
126
+ return rows.map(r => ({
127
+ volume: r.vol_number,
128
+ cultivation: r.cultivation_level || '',
129
+ location: r.location || '',
130
+ summary: r.state_summary || '',
131
+ lastChapter: r.last_appearance_chap || 0,
132
+ }));
133
+ }
134
+ async getRelationships(_story, _vol) {
135
+ const charRows = await this.query(`
136
+ SELECT ch.name, ch.faction, ch.identity_type,
137
+ COUNT(cp.chapter_number) as appearances
138
+ FROM characters ch
139
+ LEFT JOIN chapter_participants cp ON cp.character_name = ch.name
140
+ WHERE ch.status != '已故'
141
+ GROUP BY ch.name, ch.faction, ch.identity_type
142
+ `);
143
+ const relRows = await this.query(`
144
+ SELECT char_a, char_b, rel_type, current_status, last_updated_chap
145
+ FROM relationships
146
+ `);
147
+ return {
148
+ nodes: charRows.map(r => ({
149
+ id: r.name,
150
+ name: r.name,
151
+ faction: r.faction || '',
152
+ role: r.identity_type || '',
153
+ appearances: parseInt(r.appearances, 10) || 0,
154
+ })),
155
+ edges: relRows.map(r => ({
156
+ source: r.char_a,
157
+ target: r.char_b,
158
+ type: r.rel_type || '',
159
+ status: r.current_status || '',
160
+ lastChapter: r.last_updated_chap || 0,
161
+ })),
162
+ };
163
+ }
164
+ async getRelationshipHistory(_story) {
165
+ const rows = await this.query(`
166
+ SELECT chapter_number, char_a, char_b, rel_type, old_status, new_status
167
+ FROM relationship_history
168
+ ORDER BY chapter_number
169
+ `);
170
+ return rows.map(r => ({
171
+ chapter: r.chapter_number,
172
+ source: r.char_a,
173
+ target: r.char_b,
174
+ type: r.rel_type || '',
175
+ oldStatus: r.old_status || '',
176
+ newStatus: r.new_status || '',
177
+ }));
178
+ }
179
+ async getTimeline(_story, vol) {
180
+ const where = vol ? 'WHERE c.vol_number = $1' : '';
181
+ const params = vol ? [vol] : [];
182
+ const rows = await this.query(`
183
+ SELECT te.id, te.chapter_number, te.story_time, te.location, te.description, te.tags
184
+ FROM timeline_events te
185
+ JOIN chapters c ON c.global_chapter_number = te.chapter_number
186
+ ${where}
187
+ ORDER BY te.chapter_number
188
+ `, params);
189
+ return rows.map(r => ({
190
+ id: r.id,
191
+ chapter: r.chapter_number,
192
+ storyTime: r.story_time || '',
193
+ location: r.location || '',
194
+ description: r.description || '',
195
+ tags: r.tags || [],
196
+ }));
197
+ }
198
+ async getPlotThreads(_story) {
199
+ const rows = await this.query(`
200
+ SELECT thread_name, thread_type, status, description
201
+ FROM plot_threads
202
+ ORDER BY thread_name
203
+ `);
204
+ return rows.map(r => ({
205
+ name: r.thread_name,
206
+ type: r.thread_type || '',
207
+ status: r.status || 'active',
208
+ description: r.description || '',
209
+ keyEvents: [],
210
+ }));
211
+ }
212
+ async getForeshadowing(_story) {
213
+ const rows = await this.query(`
214
+ SELECT fs.fs_code, fs.description, fs.planted_chapter,
215
+ fs.hinted_chapters, fs.resolved_chapter, fs.status, fs.importance
216
+ FROM foreshadowing fs
217
+ ORDER BY fs.planted_chapter
218
+ `);
219
+ return rows.map(r => ({
220
+ code: r.fs_code,
221
+ description: r.description || '',
222
+ plantedChapter: r.planted_chapter || 0,
223
+ hintedChapters: r.hinted_chapters || [],
224
+ resolvedChapter: r.resolved_chapter || null,
225
+ status: r.status || 'planted',
226
+ importance: r.importance || 'normal',
227
+ }));
228
+ }
229
+ async getForeshadowingMatrix(_story) {
230
+ const fsRows = await this.query(`
231
+ SELECT fs_code, description, status, importance
232
+ FROM foreshadowing ORDER BY planted_chapter
233
+ `);
234
+ const cfRows = await this.query(`
235
+ SELECT fs_code, chapter_number, action_type
236
+ FROM chapter_foreshadowing ORDER BY chapter_number
237
+ `);
238
+ const [maxChap] = await this.query('SELECT MAX(global_chapter_number) as max_chap FROM chapters');
239
+ const totalChapters = maxChap?.max_chap || 0;
240
+ const chapters = Array.from({ length: totalChapters }, (_, i) => i + 1);
241
+ const cfMap = new Map();
242
+ for (const cf of cfRows) {
243
+ if (!cfMap.has(cf.fs_code))
244
+ cfMap.set(cf.fs_code, new Map());
245
+ cfMap.get(cf.fs_code).set(cf.chapter_number, cf.action_type);
246
+ }
247
+ const rows = fsRows.map(fs => ({
248
+ code: fs.fs_code,
249
+ description: fs.description,
250
+ cells: chapters.map(ch => ({
251
+ chapter: ch,
252
+ action: cfMap.get(fs.fs_code)?.get(ch) || null,
253
+ })),
254
+ }));
255
+ return { chapters, rows };
256
+ }
257
+ async getDashboardStats(_story) {
258
+ const overview = await this.getOverview(_story);
259
+ const [charCount] = await this.query('SELECT COUNT(*) as count FROM characters');
260
+ const [plotCount] = await this.query("SELECT COUNT(*) as count FROM plot_threads WHERE status = 'active'");
261
+ const [fsCount] = await this.query("SELECT COUNT(*) as count FROM foreshadowing WHERE status != 'resolved'");
262
+ const volumes = await this.getVolumes(_story);
263
+ return {
264
+ totalWords: overview.totalWords,
265
+ totalChapters: overview.totalChapters,
266
+ totalVolumes: overview.totalVolumes,
267
+ totalCharacters: parseInt(charCount?.count || '0', 10),
268
+ activePlotThreads: parseInt(plotCount?.count || '0', 10),
269
+ unresolvedForeshadowing: parseInt(fsCount?.count || '0', 10),
270
+ volumeStats: volumes.map(v => ({
271
+ volume: v.number, title: v.title, words: v.words, chapters: v.chapters, progress: v.progress,
272
+ })),
273
+ };
274
+ }
275
+ async getProtagonistOverview(_story) {
276
+ const [cult] = await this.query('SELECT level, progress_pct FROM cultivation_curve ORDER BY chapter_number DESC LIMIT 1');
277
+ const [skillCounts] = await this.query("SELECT COUNT(*) as total, COUNT(*) FILTER (WHERE status = 'active') as active FROM protagonist_skills");
278
+ const [itemCounts] = await this.query("SELECT COUNT(*) as total, COUNT(*) FILTER (WHERE status = 'held') as held FROM protagonist_inventory");
279
+ return {
280
+ currentLevel: cult?.level || '',
281
+ currentProgress: cult?.progress_pct || 0,
282
+ totalSkills: parseInt(skillCounts?.total || '0', 10),
283
+ activeSkills: parseInt(skillCounts?.active || '0', 10),
284
+ totalItems: parseInt(itemCounts?.total || '0', 10),
285
+ heldItems: parseInt(itemCounts?.held || '0', 10),
286
+ };
287
+ }
288
+ async getProtagonistSkills(_story) {
289
+ const rows = await this.query('SELECT skill_name, skill_category, skill_level, status, description, acquired_chapter, use_count FROM skill_overview ORDER BY acquired_chapter');
290
+ return rows.map(r => ({
291
+ name: r.skill_name,
292
+ category: r.skill_category,
293
+ level: r.skill_level || '',
294
+ description: r.description || '',
295
+ acquiredChapter: r.acquired_chapter || 0,
296
+ useCount: r.use_count || 0,
297
+ status: r.status || 'active',
298
+ }));
299
+ }
300
+ async getProtagonistInventory(_story) {
301
+ const rows = await this.query('SELECT item_name, item_type, quantity, quality, description, acquired_chapter, status FROM protagonist_inventory ORDER BY item_type, item_name');
302
+ return rows.map(r => ({
303
+ name: r.item_name,
304
+ type: r.item_type,
305
+ quantity: r.quantity || 0,
306
+ quality: r.quality || '',
307
+ description: r.description || '',
308
+ acquiredChapter: r.acquired_chapter || 0,
309
+ status: r.status || 'held',
310
+ }));
311
+ }
312
+ async getCultivationCurve(_story) {
313
+ const rows = await this.query('SELECT chapter_number, level, progress_pct, breakthrough_type, trigger FROM cultivation_curve ORDER BY chapter_number');
314
+ return rows.map(r => ({
315
+ chapter: r.chapter_number,
316
+ level: r.level,
317
+ progressPct: parseFloat(r.progress_pct) || 0,
318
+ breakthroughType: r.breakthrough_type || null,
319
+ detail: r.trigger || '',
320
+ }));
321
+ }
322
+ }
323
+ //# sourceMappingURL=db.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db.js","sourceRoot":"","sources":["../../../src/server/datasource/db.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC;AAC5B,OAAO,IAAI,MAAM,MAAM,CAAC;AAiBxB,MAAM,OAAO,YAAY;IAIH;IAA0B;IAHtC,MAAM,CAAS;IACf,MAAM,CAAS;IAEvB,YAAoB,MAAgB,EAAU,WAAmB;QAA7C,WAAM,GAAN,MAAM,CAAU;QAAU,gBAAW,GAAX,WAAW,CAAQ;QAC/D,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,SAAS,CAAC;QACzC,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,CAAC;YACvB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,QAAQ,EAAE,MAAM,CAAC,MAAM;YACvB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,QAAQ,EAAE,MAAM,CAAC,QAAQ;SAC1B,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,OAAO;QACX,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QAC5B,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,sBAAsB,IAAI,CAAC,MAAM,UAAU,CAAC,CAAC;IACvE,CAAC;IAED,KAAK,CAAC,UAAU;QACd,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;IAC1B,CAAC;IAEO,KAAK,CAAC,KAAK,CAAU,GAAW,EAAE,MAAc;QACtD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACpD,OAAO,MAAM,CAAC,IAAI,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,UAAU;QACd,OAAO,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;IAC7E,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,MAAc;QAC9B,MAAM,CAAC,QAAQ,CAAC,GAAG,MAAM,IAAI,CAAC,KAAK,CAAoB,uCAAuC,CAAC,CAAC;QAChG,MAAM,CAAC,SAAS,CAAC,GAAG,MAAM,IAAI,CAAC,KAAK,CAClC,qFAAqF,CACtF,CAAC;QACF,MAAM,CAAC,OAAO,CAAC,GAAG,MAAM,IAAI,CAAC,KAAK,CAChC,iEAAiE,CAClE,CAAC;QACF,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC;YACrC,YAAY,EAAE,QAAQ,CAAC,QAAQ,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,CAAC;YAClD,aAAa,EAAE,QAAQ,CAAC,SAAS,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,CAAC;YACpD,UAAU,EAAE,QAAQ,CAAC,SAAS,EAAE,WAAW,IAAI,GAAG,EAAE,EAAE,CAAC;YACvD,aAAa,EAAE,OAAO,EAAE,UAAU,IAAI,CAAC;SACxC,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,MAAc;QAC7B,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC;;;;;;;;KAQ7B,CAAC,CAAC;QACH,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACpB,MAAM,EAAE,CAAC,CAAC,UAAU;YACpB,KAAK,EAAE,CAAC,CAAC,SAAS,IAAI,KAAK,CAAC,CAAC,UAAU,IAAI;YAC3C,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC;YAClC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC;YAC5B,QAAQ,EAAE,CAAC;SACZ,CAAC,CAAC,CAAC;IACN,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,MAAc,EAAE,GAAY;QAC5C,MAAM,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,EAAE,CAAC;QACnD,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC;;;;;;QAM1B,KAAK;;;KAGR,EAAE,MAAM,CAAC,CAAC;QACX,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACpB,YAAY,EAAE,CAAC,CAAC,qBAAqB;YACrC,YAAY,EAAE,CAAC,CAAC,UAAU;YAC1B,eAAe,EAAE,CAAC,CAAC,cAAc;YACjC,KAAK,EAAE,KAAK,CAAC,CAAC,qBAAqB,IAAI;YACvC,KAAK,EAAE,CAAC,CAAC,UAAU,IAAI,CAAC;YACxB,GAAG,EAAE,CAAC,CAAC,aAAa,IAAI,EAAE;YAC1B,YAAY,EAAE,CAAC,CAAC,YAAY,IAAI,EAAE;YAClC,WAAW,EAAE,IAAI;YACjB,UAAU,EAAE,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,GAAG,CAAC;SACpC,CAAC,CAAC,CAAC;IACN,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,MAAc,EAAE,GAAY;QAC9C,IAAI,GAAW,CAAC;QAChB,IAAI,MAAa,CAAC;QAClB,IAAI,GAAG,EAAE,CAAC;YACR,GAAG,GAAG;;;;;;;OAOL,CAAC;YACF,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC;QACjB,CAAC;aAAM,CAAC;YACN,GAAG,GAAG,8HAA8H,CAAC;YACrI,MAAM,GAAG,EAAE,CAAC;QACd,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAC3C,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACpB,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE;YAC3E,IAAI,EAAE,CAAC,CAAC,aAAa,IAAI,EAAE;YAC3B,WAAW,EAAE,CAAC,CAAC,SAAS,IAAI,CAAC;YAC7B,YAAY,EAAE,CAAC,CAAC,UAAU,IAAI,CAAC;YAC/B,WAAW,EAAE,CAAC,CAAC,iBAAiB,IAAI,EAAE;YACtC,OAAO,EAAE,CAAC,CAAC,OAAO,IAAI,EAAE;YACxB,MAAM,EAAE,CAAC,CAAC,MAAM,IAAI,IAAI;SACzB,CAAC,CAAC,CAAC;IACN,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,MAAc,EAAE,IAAY;QAChD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC;;;;;KAK7B,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;QACX,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACpB,MAAM,EAAE,CAAC,CAAC,UAAU;YACpB,WAAW,EAAE,CAAC,CAAC,iBAAiB,IAAI,EAAE;YACtC,QAAQ,EAAE,CAAC,CAAC,QAAQ,IAAI,EAAE;YAC1B,OAAO,EAAE,CAAC,CAAC,aAAa,IAAI,EAAE;YAC9B,WAAW,EAAE,CAAC,CAAC,oBAAoB,IAAI,CAAC;SACzC,CAAC,CAAC,CAAC;IACN,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,MAAc,EAAE,IAAa;QAClD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC;;;;;;;KAOjC,CAAC,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC;;;KAGhC,CAAC,CAAC;QACH,OAAO;YACL,KAAK,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBACxB,EAAE,EAAE,CAAC,CAAC,IAAI;gBACV,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,OAAO,EAAE,CAAC,CAAC,OAAO,IAAI,EAAE;gBACxB,IAAI,EAAE,CAAC,CAAC,aAAa,IAAI,EAAE;gBAC3B,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,IAAI,CAAC;aAC9C,CAAC,CAAC;YACH,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBACvB,MAAM,EAAE,CAAC,CAAC,MAAM;gBAChB,MAAM,EAAE,CAAC,CAAC,MAAM;gBAChB,IAAI,EAAE,CAAC,CAAC,QAAQ,IAAI,EAAE;gBACtB,MAAM,EAAE,CAAC,CAAC,cAAc,IAAI,EAAE;gBAC9B,WAAW,EAAE,CAAC,CAAC,iBAAiB,IAAI,CAAC;aACtC,CAAC,CAAC;SACJ,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,sBAAsB,CAAC,MAAc;QACzC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC;;;;KAI7B,CAAC,CAAC;QACH,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACpB,OAAO,EAAE,CAAC,CAAC,cAAc;YACzB,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,IAAI,EAAE,CAAC,CAAC,QAAQ,IAAI,EAAE;YACtB,SAAS,EAAE,CAAC,CAAC,UAAU,IAAI,EAAE;YAC7B,SAAS,EAAE,CAAC,CAAC,UAAU,IAAI,EAAE;SAC9B,CAAC,CAAC,CAAC;IACN,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,MAAc,EAAE,GAAY;QAC5C,MAAM,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,EAAE,CAAC;QACnD,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC;;;;QAI1B,KAAK;;KAER,EAAE,MAAM,CAAC,CAAC;QACX,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACpB,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,OAAO,EAAE,CAAC,CAAC,cAAc;YACzB,SAAS,EAAE,CAAC,CAAC,UAAU,IAAI,EAAE;YAC7B,QAAQ,EAAE,CAAC,CAAC,QAAQ,IAAI,EAAE;YAC1B,WAAW,EAAE,CAAC,CAAC,WAAW,IAAI,EAAE;YAChC,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,EAAE;SACnB,CAAC,CAAC,CAAC;IACN,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,MAAc;QACjC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC;;;;KAI7B,CAAC,CAAC;QACH,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACpB,IAAI,EAAE,CAAC,CAAC,WAAW;YACnB,IAAI,EAAE,CAAC,CAAC,WAAW,IAAI,EAAE;YACzB,MAAM,EAAE,CAAC,CAAC,MAAM,IAAI,QAAQ;YAC5B,WAAW,EAAE,CAAC,CAAC,WAAW,IAAI,EAAE;YAChC,SAAS,EAAE,EAAE;SACd,CAAC,CAAC,CAAC;IACN,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,MAAc;QACnC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC;;;;;KAK7B,CAAC,CAAC;QACH,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACpB,IAAI,EAAE,CAAC,CAAC,OAAO;YACf,WAAW,EAAE,CAAC,CAAC,WAAW,IAAI,EAAE;YAChC,cAAc,EAAE,CAAC,CAAC,eAAe,IAAI,CAAC;YACtC,cAAc,EAAE,CAAC,CAAC,eAAe,IAAI,EAAE;YACvC,eAAe,EAAE,CAAC,CAAC,gBAAgB,IAAI,IAAI;YAC3C,MAAM,EAAE,CAAC,CAAC,MAAM,IAAI,SAAS;YAC7B,UAAU,EAAE,CAAC,CAAC,UAAU,IAAI,QAAQ;SACrC,CAAC,CAAC,CAAC;IACN,CAAC;IAED,KAAK,CAAC,sBAAsB,CAAC,MAAc;QACzC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC;;;KAG/B,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC;;;KAG/B,CAAC,CAAC;QACH,MAAM,CAAC,OAAO,CAAC,GAAG,MAAM,IAAI,CAAC,KAAK,CAChC,6DAA6D,CAC9D,CAAC;QACF,MAAM,aAAa,GAAG,OAAO,EAAE,QAAQ,IAAI,CAAC,CAAC;QAC7C,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAExE,MAAM,KAAK,GAAG,IAAI,GAAG,EAA+B,CAAC;QACrD,KAAK,MAAM,EAAE,IAAI,MAAM,EAAE,CAAC;YACxB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC;gBAAE,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;YAC7D,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,CAAE,CAAC,GAAG,CAAC,EAAE,CAAC,cAAc,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC;QAChE,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YAC7B,IAAI,EAAE,EAAE,CAAC,OAAO;YAChB,WAAW,EAAE,EAAE,CAAC,WAAW;YAC3B,KAAK,EAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;gBACzB,OAAO,EAAE,EAAE;gBACX,MAAM,EAAG,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,GAAG,CAAC,EAAE,CAAS,IAAI,IAAI;aACxD,CAAC,CAAC;SACJ,CAAC,CAAC,CAAC;QAEJ,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,MAAc;QACpC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAChD,MAAM,CAAC,SAAS,CAAC,GAAG,MAAM,IAAI,CAAC,KAAK,CAAoB,0CAA0C,CAAC,CAAC;QACpG,MAAM,CAAC,SAAS,CAAC,GAAG,MAAM,IAAI,CAAC,KAAK,CAAoB,oEAAoE,CAAC,CAAC;QAC9H,MAAM,CAAC,OAAO,CAAC,GAAG,MAAM,IAAI,CAAC,KAAK,CAAoB,wEAAwE,CAAC,CAAC;QAChI,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAE9C,OAAO;YACL,UAAU,EAAE,QAAQ,CAAC,UAAU;YAC/B,aAAa,EAAE,QAAQ,CAAC,aAAa;YACrC,YAAY,EAAE,QAAQ,CAAC,YAAY;YACnC,eAAe,EAAE,QAAQ,CAAC,SAAS,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,CAAC;YACtD,iBAAiB,EAAE,QAAQ,CAAC,SAAS,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,CAAC;YACxD,uBAAuB,EAAE,QAAQ,CAAC,OAAO,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,CAAC;YAC5D,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBAC7B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ;aAC7F,CAAC,CAAC;SACJ,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,sBAAsB,CAAC,MAAc;QACzC,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,IAAI,CAAC,KAAK,CAC7B,wFAAwF,CACzF,CAAC;QACF,MAAM,CAAC,WAAW,CAAC,GAAG,MAAM,IAAI,CAAC,KAAK,CACpC,uGAAuG,CACxG,CAAC;QACF,MAAM,CAAC,UAAU,CAAC,GAAG,MAAM,IAAI,CAAC,KAAK,CACnC,sGAAsG,CACvG,CAAC;QACF,OAAO;YACL,YAAY,EAAE,IAAI,EAAE,KAAK,IAAI,EAAE;YAC/B,eAAe,EAAE,IAAI,EAAE,YAAY,IAAI,CAAC;YACxC,WAAW,EAAE,QAAQ,CAAC,WAAW,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,CAAC;YACpD,YAAY,EAAE,QAAQ,CAAC,WAAW,EAAE,MAAM,IAAI,GAAG,EAAE,EAAE,CAAC;YACtD,UAAU,EAAE,QAAQ,CAAC,UAAU,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,CAAC;YAClD,SAAS,EAAE,QAAQ,CAAC,UAAU,EAAE,IAAI,IAAI,GAAG,EAAE,EAAE,CAAC;SACjD,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,oBAAoB,CAAC,MAAc;QACvC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,CAC3B,gJAAgJ,CACjJ,CAAC;QACF,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACpB,IAAI,EAAE,CAAC,CAAC,UAAU;YAClB,QAAQ,EAAE,CAAC,CAAC,cAAc;YAC1B,KAAK,EAAE,CAAC,CAAC,WAAW,IAAI,EAAE;YAC1B,WAAW,EAAE,CAAC,CAAC,WAAW,IAAI,EAAE;YAChC,eAAe,EAAE,CAAC,CAAC,gBAAgB,IAAI,CAAC;YACxC,QAAQ,EAAE,CAAC,CAAC,SAAS,IAAI,CAAC;YAC1B,MAAM,EAAE,CAAC,CAAC,MAAM,IAAI,QAAQ;SAC7B,CAAC,CAAC,CAAC;IACN,CAAC;IAED,KAAK,CAAC,uBAAuB,CAAC,MAAc;QAC1C,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,CAC3B,gJAAgJ,CACjJ,CAAC;QACF,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACpB,IAAI,EAAE,CAAC,CAAC,SAAS;YACjB,IAAI,EAAE,CAAC,CAAC,SAAS;YACjB,QAAQ,EAAE,CAAC,CAAC,QAAQ,IAAI,CAAC;YACzB,OAAO,EAAE,CAAC,CAAC,OAAO,IAAI,EAAE;YACxB,WAAW,EAAE,CAAC,CAAC,WAAW,IAAI,EAAE;YAChC,eAAe,EAAE,CAAC,CAAC,gBAAgB,IAAI,CAAC;YACxC,MAAM,EAAE,CAAC,CAAC,MAAM,IAAI,MAAM;SAC3B,CAAC,CAAC,CAAC;IACN,CAAC;IAED,KAAK,CAAC,mBAAmB,CAAC,MAAc;QACtC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,CAC3B,uHAAuH,CACxH,CAAC;QACF,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACpB,OAAO,EAAE,CAAC,CAAC,cAAc;YACzB,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC;YAC5C,gBAAgB,EAAE,CAAC,CAAC,iBAAiB,IAAI,IAAI;YAC7C,MAAM,EAAE,CAAC,CAAC,OAAO,IAAI,EAAE;SACxB,CAAC,CAAC,CAAC;IACN,CAAC;CACF"}
@@ -0,0 +1,30 @@
1
+ import type { DataSource, Story, StoryOverview, Volume, Chapter, Character, CharacterState, RelationshipGraph, RelationshipEvent, TimelineEvent, PlotThread, Foreshadow, ForeshadowMatrix, DashboardStats, ProtagonistOverview, ProtagonistSkill, ProtagonistItem, CultivationNode } from '../types.js';
2
+ export declare class FsDataSource implements DataSource {
3
+ projectRoot: string;
4
+ constructor(projectRoot: string);
5
+ private storiesDir;
6
+ private storyDir;
7
+ private volumeDir;
8
+ getStories(): Promise<Story[]>;
9
+ getOverview(story: string): Promise<StoryOverview>;
10
+ getVolumes(story: string): Promise<Volume[]>;
11
+ getChapters(story: string, vol?: number): Promise<Chapter[]>;
12
+ private findLatestVolume;
13
+ private trackingDir;
14
+ private readTrackingJson;
15
+ private collectFromAllVolumes;
16
+ getCharacters(story: string, vol?: number): Promise<Character[]>;
17
+ getCharacterArc(story: string, name: string): Promise<CharacterState[]>;
18
+ getRelationships(story: string, vol?: number): Promise<RelationshipGraph>;
19
+ getRelationshipHistory(_story: string): Promise<RelationshipEvent[]>;
20
+ getTimeline(story: string, vol?: number): Promise<TimelineEvent[]>;
21
+ getPlotThreads(story: string): Promise<PlotThread[]>;
22
+ getForeshadowing(story: string): Promise<Foreshadow[]>;
23
+ getForeshadowingMatrix(_story: string): Promise<ForeshadowMatrix>;
24
+ getDashboardStats(story: string): Promise<DashboardStats>;
25
+ getProtagonistOverview(_story: string): Promise<ProtagonistOverview>;
26
+ getProtagonistSkills(_story: string): Promise<ProtagonistSkill[]>;
27
+ getProtagonistInventory(_story: string): Promise<ProtagonistItem[]>;
28
+ getCultivationCurve(_story: string): Promise<CultivationNode[]>;
29
+ }
30
+ //# sourceMappingURL=fs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs.d.ts","sourceRoot":"","sources":["../../../src/server/datasource/fs.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,UAAU,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,OAAO,EACjD,SAAS,EAAE,cAAc,EAAE,iBAAiB,EAAE,iBAAiB,EAC/D,aAAa,EAAE,UAAU,EAAE,UAAU,EAAE,gBAAgB,EAAE,cAAc,EACvE,mBAAmB,EAAE,gBAAgB,EAAE,eAAe,EAAE,eAAe,EACxE,MAAM,aAAa,CAAC;AAErB,qBAAa,YAAa,YAAW,UAAU;IAC1B,WAAW,EAAE,MAAM;gBAAnB,WAAW,EAAE,MAAM;IAEtC,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,QAAQ;IAIhB,OAAO,CAAC,SAAS;IAIX,UAAU,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;IAe9B,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAclD,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IA4C5C,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;YA4CpD,gBAAgB;IAK9B,OAAO,CAAC,WAAW;YAIL,gBAAgB;YAUhB,qBAAqB;IAqB7B,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAwBhE,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAmBvE,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IA0BzE,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAIpE,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAoBlE,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAmBpD,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAqBtD,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAIjE,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAgBzD,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAIpE,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAIjE,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IAInE,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;CAGtE"}