@echoes-io/mcp-server 6.2.0 → 7.1.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 (70) hide show
  1. package/README.md +32 -2
  2. package/cli/program.d.ts.map +1 -1
  3. package/cli/program.js +247 -0
  4. package/cli/program.js.map +1 -1
  5. package/lib/database/index.d.ts.map +1 -1
  6. package/lib/database/index.js +16 -2
  7. package/lib/database/index.js.map +1 -1
  8. package/lib/database/schemas.d.ts.map +1 -1
  9. package/lib/database/schemas.js +8 -0
  10. package/lib/database/schemas.js.map +1 -1
  11. package/lib/server.d.ts.map +1 -1
  12. package/lib/server.js +72 -0
  13. package/lib/server.js.map +1 -1
  14. package/lib/tools/arc-resume.d.ts +26 -0
  15. package/lib/tools/arc-resume.d.ts.map +1 -0
  16. package/lib/tools/arc-resume.js +129 -0
  17. package/lib/tools/arc-resume.js.map +1 -0
  18. package/lib/tools/consistency/index.d.ts +25 -0
  19. package/lib/tools/consistency/index.d.ts.map +1 -0
  20. package/lib/tools/consistency/index.js +88 -0
  21. package/lib/tools/consistency/index.js.map +1 -0
  22. package/lib/tools/consistency/patterns.d.ts +6 -0
  23. package/lib/tools/consistency/patterns.d.ts.map +1 -0
  24. package/lib/tools/consistency/patterns.js +39 -0
  25. package/lib/tools/consistency/patterns.js.map +1 -0
  26. package/lib/tools/consistency/rules/entity-duplicate.d.ts +3 -0
  27. package/lib/tools/consistency/rules/entity-duplicate.d.ts.map +1 -0
  28. package/lib/tools/consistency/rules/entity-duplicate.js +84 -0
  29. package/lib/tools/consistency/rules/entity-duplicate.js.map +1 -0
  30. package/lib/tools/consistency/rules/first-time-content.d.ts +3 -0
  31. package/lib/tools/consistency/rules/first-time-content.d.ts.map +1 -0
  32. package/lib/tools/consistency/rules/first-time-content.js +114 -0
  33. package/lib/tools/consistency/rules/first-time-content.js.map +1 -0
  34. package/lib/tools/consistency/rules/kink-firsts.d.ts +3 -0
  35. package/lib/tools/consistency/rules/kink-firsts.d.ts.map +1 -0
  36. package/lib/tools/consistency/rules/kink-firsts.js +81 -0
  37. package/lib/tools/consistency/rules/kink-firsts.js.map +1 -0
  38. package/lib/tools/consistency/rules/outfit-claims.d.ts +3 -0
  39. package/lib/tools/consistency/rules/outfit-claims.d.ts.map +1 -0
  40. package/lib/tools/consistency/rules/outfit-claims.js +175 -0
  41. package/lib/tools/consistency/rules/outfit-claims.js.map +1 -0
  42. package/lib/tools/consistency/rules/relation-jump.d.ts +3 -0
  43. package/lib/tools/consistency/rules/relation-jump.d.ts.map +1 -0
  44. package/lib/tools/consistency/rules/relation-jump.js +105 -0
  45. package/lib/tools/consistency/rules/relation-jump.js.map +1 -0
  46. package/lib/tools/consistency/types.d.ts +27 -0
  47. package/lib/tools/consistency/types.d.ts.map +1 -0
  48. package/lib/tools/consistency/types.js +2 -0
  49. package/lib/tools/consistency/types.js.map +1 -0
  50. package/lib/tools/graph-export.d.ts +47 -0
  51. package/lib/tools/graph-export.d.ts.map +1 -0
  52. package/lib/tools/graph-export.js +152 -0
  53. package/lib/tools/graph-export.js.map +1 -0
  54. package/lib/tools/history.d.ts +47 -0
  55. package/lib/tools/history.d.ts.map +1 -0
  56. package/lib/tools/history.js +134 -0
  57. package/lib/tools/history.js.map +1 -0
  58. package/lib/tools/review-apply.d.ts +30 -0
  59. package/lib/tools/review-apply.d.ts.map +1 -0
  60. package/lib/tools/review-apply.js +305 -0
  61. package/lib/tools/review-apply.js.map +1 -0
  62. package/lib/tools/review-generate.d.ts +22 -0
  63. package/lib/tools/review-generate.d.ts.map +1 -0
  64. package/lib/tools/review-generate.js +123 -0
  65. package/lib/tools/review-generate.js.map +1 -0
  66. package/lib/tools/review-status.d.ts +28 -0
  67. package/lib/tools/review-status.d.ts.map +1 -0
  68. package/lib/tools/review-status.js +60 -0
  69. package/lib/tools/review-status.js.map +1 -0
  70. package/package.json +1 -1
package/lib/server.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import z from 'zod';
2
+ import type { ToolConfig } from '../types.js';
3
+ export declare const arcResumeConfig: ToolConfig;
4
+ export declare const arcResumeSchema: z.ZodObject<{
5
+ arc: z.ZodString;
6
+ episode: z.ZodOptional<z.ZodNumber>;
7
+ lastChapters: z.ZodOptional<z.ZodNumber>;
8
+ contentPath: z.ZodOptional<z.ZodString>;
9
+ docsPath: z.ZodOptional<z.ZodString>;
10
+ }, z.z.core.$strip>;
11
+ export type ArcResumeInput = z.infer<typeof arcResumeSchema>;
12
+ export interface ArcResumeOutput {
13
+ arc: string;
14
+ episode: number;
15
+ episodeOutline: string;
16
+ characters: Record<string, string>;
17
+ recentChapters: Array<{
18
+ file: string;
19
+ pov: string;
20
+ title: string;
21
+ wordCount: number;
22
+ excerpt: string;
23
+ }>;
24
+ }
25
+ export declare function arcResume(input: ArcResumeInput): ArcResumeOutput;
26
+ //# sourceMappingURL=arc-resume.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arc-resume.d.ts","sourceRoot":"","sources":["arc-resume.ts"],"names":[],"mappings":"AAGA,OAAO,CAAC,MAAM,KAAK,CAAC;AAEpB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAG9C,eAAO,MAAM,eAAe,EAAE,UAW7B,CAAC;AAEF,eAAO,MAAM,eAAe;;;;;;mBAM1B,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAE7D,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,cAAc,EAAE,KAAK,CAAC;QACpB,IAAI,EAAE,MAAM,CAAC;QACb,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,EAAE,MAAM,CAAC;QACd,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC,CAAC;CACJ;AAaD,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,GAAG,eAAe,CA6HhE"}
@@ -0,0 +1,129 @@
1
+ import { readdirSync, readFileSync, statSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import z from 'zod';
4
+ import { parseChapter } from '../utils.js';
5
+ export const arcResumeConfig = {
6
+ name: 'arc-resume',
7
+ description: 'Load complete context for resuming work on an arc: episode outline, character sheets, and recent chapters.',
8
+ arguments: {
9
+ arc: 'Arc name (e.g., "cri", "ale", "gio").',
10
+ episode: 'Episode number (optional - defaults to latest episode).',
11
+ lastChapters: 'Number of recent chapters to include (default: 3).',
12
+ contentPath: 'Path to content directory (default: ./content).',
13
+ docsPath: 'Path to docs directory (default: ./docs).',
14
+ },
15
+ };
16
+ export const arcResumeSchema = z.object({
17
+ arc: z.string().describe(arcResumeConfig.arguments.arc),
18
+ episode: z.number().optional().describe(arcResumeConfig.arguments.episode),
19
+ lastChapters: z.number().optional().describe(arcResumeConfig.arguments.lastChapters),
20
+ contentPath: z.string().optional().describe(arcResumeConfig.arguments.contentPath),
21
+ docsPath: z.string().optional().describe(arcResumeConfig.arguments.docsPath),
22
+ });
23
+ export function arcResume(input) {
24
+ const parsed = arcResumeSchema.parse(input);
25
+ const { arc, episode, contentPath = './content', docsPath = './docs' } = parsed;
26
+ const lastChapters = parsed.lastChapters ?? 3;
27
+ // Scan content directory for chapters
28
+ const arcDir = join(contentPath, arc);
29
+ if (!readdirSync(contentPath).includes(arc)) {
30
+ throw new Error(`No chapters found for arc "${arc}"`);
31
+ }
32
+ const chapters = [];
33
+ const entries = readdirSync(arcDir, { withFileTypes: true });
34
+ // Check if chapters are directly in arc dir or in episode subdirs
35
+ const hasEpisodeDirs = entries.some((e) => e.isDirectory());
36
+ if (hasEpisodeDirs) {
37
+ // Chapters in episode subdirectories
38
+ for (const entry of entries.filter((e) => e.isDirectory())) {
39
+ const files = readdirSync(join(arcDir, entry.name)).filter((f) => f.endsWith('.md'));
40
+ for (const file of files) {
41
+ const filePath = join(arcDir, entry.name, file);
42
+ const content = readFileSync(filePath, 'utf-8');
43
+ const { metadata, stats } = parseChapter(content);
44
+ const mtime = statSync(filePath).mtimeMs;
45
+ chapters.push({
46
+ file: filePath,
47
+ episode: metadata.episode,
48
+ chapter: metadata.chapter,
49
+ pov: metadata.pov,
50
+ title: metadata.title,
51
+ excerpt: metadata.summary || '',
52
+ wordCount: stats.wordCount,
53
+ mtime,
54
+ });
55
+ }
56
+ }
57
+ }
58
+ else {
59
+ // Chapters directly in arc directory
60
+ const files = entries.filter((e) => e.isFile() && e.name.endsWith('.md')).map((e) => e.name);
61
+ for (const file of files) {
62
+ const filePath = join(arcDir, file);
63
+ const content = readFileSync(filePath, 'utf-8');
64
+ const { metadata, stats } = parseChapter(content);
65
+ const mtime = statSync(filePath).mtimeMs;
66
+ chapters.push({
67
+ file: filePath,
68
+ episode: metadata.episode,
69
+ chapter: metadata.chapter,
70
+ pov: metadata.pov,
71
+ title: metadata.title,
72
+ excerpt: metadata.summary || '',
73
+ wordCount: stats.wordCount,
74
+ mtime,
75
+ });
76
+ }
77
+ }
78
+ if (chapters.length === 0) {
79
+ throw new Error(`No chapters found for arc "${arc}"`);
80
+ }
81
+ // Determine target episode
82
+ const targetEpisode = episode ?? Math.max(...chapters.map((c) => c.episode));
83
+ // Filter and sort chapters for target episode
84
+ const episodeChapters = chapters
85
+ .filter((c) => c.episode === targetEpisode)
86
+ .sort((a, b) => b.chapter - a.chapter);
87
+ if (episodeChapters.length === 0) {
88
+ throw new Error(`No chapters found for arc "${arc}" episode ${targetEpisode}`);
89
+ }
90
+ // Get recent chapters
91
+ const recentChapters = episodeChapters.slice(0, lastChapters).map((c) => ({
92
+ file: c.file,
93
+ pov: c.pov,
94
+ title: c.title,
95
+ wordCount: c.wordCount,
96
+ excerpt: c.excerpt,
97
+ }));
98
+ // Read episode outline
99
+ const episodesDir = join(docsPath, 'episodes');
100
+ const episodeFiles = readdirSync(episodesDir);
101
+ const episodeFile = episodeFiles.find((f) => f.startsWith(`${arc}-ep${String(targetEpisode).padStart(2, '0')}`));
102
+ if (!episodeFile) {
103
+ throw new Error(`Episode outline not found for arc "${arc}" episode ${targetEpisode}`);
104
+ }
105
+ const episodeOutline = readFileSync(join(episodesDir, episodeFile), 'utf-8');
106
+ // Read character sheets
107
+ const charactersDir = join(docsPath, 'characters', arc);
108
+ const characters = {};
109
+ try {
110
+ const characterFiles = readdirSync(charactersDir);
111
+ for (const file of characterFiles) {
112
+ if (file.endsWith('.md')) {
113
+ const name = file.replace('.md', '');
114
+ characters[name] = readFileSync(join(charactersDir, file), 'utf-8');
115
+ }
116
+ }
117
+ }
118
+ catch {
119
+ // Characters directory might not exist
120
+ }
121
+ return {
122
+ arc,
123
+ episode: targetEpisode,
124
+ episodeOutline,
125
+ characters,
126
+ recentChapters,
127
+ };
128
+ }
129
+ //# sourceMappingURL=arc-resume.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arc-resume.js","sourceRoot":"","sources":["arc-resume.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import z from 'zod';
2
+ import type { ToolConfig } from '../../types.js';
3
+ import type { CheckResult } from './types.js';
4
+ export declare const checkConsistencyConfig: ToolConfig;
5
+ export declare const checkConsistencySchema: z.ZodObject<{
6
+ contentPath: z.ZodString;
7
+ arc: z.ZodString;
8
+ rules: z.ZodOptional<z.ZodArray<z.ZodEnum<{
9
+ "kink-firsts": "kink-firsts";
10
+ "outfit-claims": "outfit-claims";
11
+ "first-time-content": "first-time-content";
12
+ "relation-jump": "relation-jump";
13
+ "entity-duplicate": "entity-duplicate";
14
+ }>>>;
15
+ severity: z.ZodOptional<z.ZodEnum<{
16
+ warning: "warning";
17
+ error: "error";
18
+ info: "info";
19
+ }>>;
20
+ dbPath: z.ZodDefault<z.ZodString>;
21
+ }, z.z.core.$strip>;
22
+ export type CheckConsistencyInput = z.infer<typeof checkConsistencySchema>;
23
+ export declare function checkConsistency(input: CheckConsistencyInput): Promise<CheckResult>;
24
+ export * from './types.js';
25
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,KAAK,CAAC;AAGpB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAMjD,OAAO,KAAK,EAAE,WAAW,EAAmB,MAAM,YAAY,CAAC;AAE/D,eAAO,MAAM,sBAAsB,EAAE,UAWpC,CAAC;AAEF,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;mBAoBjC,CAAC;AAEH,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAY3E,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,GAAG,OAAO,CAAC,WAAW,CAAC,CAmDzF;AAED,cAAc,YAAY,CAAC"}
@@ -0,0 +1,88 @@
1
+ import z from 'zod';
2
+ import { DEFAULT_DB_PATH } from '../../constants.js';
3
+ import { checkEntityDuplicate } from './rules/entity-duplicate.js';
4
+ import { checkFirstTimeContent } from './rules/first-time-content.js';
5
+ import { checkKinkFirsts } from './rules/kink-firsts.js';
6
+ import { checkOutfitClaims } from './rules/outfit-claims.js';
7
+ import { checkRelationJump } from './rules/relation-jump.js';
8
+ export const checkConsistencyConfig = {
9
+ name: 'check-consistency',
10
+ description: 'Analyze arc for narrative inconsistencies.',
11
+ arguments: {
12
+ contentPath: 'Path to the content directory.',
13
+ arc: 'Arc name to check.',
14
+ rules: 'Specific rules to run (comma-separated). Available: kink-firsts, entity-duplicate, relation-jump, first-time-content, outfit-claims.',
15
+ severity: 'Minimum severity to report: error, warning, info.',
16
+ dbPath: `Database path (default: ${DEFAULT_DB_PATH}).`,
17
+ },
18
+ };
19
+ export const checkConsistencySchema = z.object({
20
+ contentPath: z.string().describe(checkConsistencyConfig.arguments.contentPath),
21
+ arc: z.string().describe(checkConsistencyConfig.arguments.arc),
22
+ rules: z
23
+ .array(z.enum([
24
+ 'kink-firsts',
25
+ 'outfit-claims',
26
+ 'first-time-content',
27
+ 'relation-jump',
28
+ 'entity-duplicate',
29
+ ]))
30
+ .optional()
31
+ .describe(checkConsistencyConfig.arguments.rules),
32
+ severity: z
33
+ .enum(['error', 'warning', 'info'])
34
+ .optional()
35
+ .describe(checkConsistencyConfig.arguments.severity),
36
+ dbPath: z.string().default(DEFAULT_DB_PATH).describe(checkConsistencyConfig.arguments.dbPath),
37
+ });
38
+ const AVAILABLE_RULES = [
39
+ 'kink-firsts',
40
+ 'entity-duplicate',
41
+ 'relation-jump',
42
+ 'first-time-content',
43
+ 'outfit-claims',
44
+ ];
45
+ const SEVERITY_ORDER = { error: 0, warning: 1, info: 2 };
46
+ export async function checkConsistency(input) {
47
+ const { contentPath, arc, rules, severity, dbPath } = checkConsistencySchema.parse(input);
48
+ const rulesToRun = rules ?? AVAILABLE_RULES;
49
+ const minSeverity = severity ?? 'info';
50
+ let allIssues = [];
51
+ for (const rule of rulesToRun) {
52
+ if (!AVAILABLE_RULES.includes(rule))
53
+ continue;
54
+ if (rule === 'kink-firsts') {
55
+ const issues = await checkKinkFirsts(contentPath, arc);
56
+ allIssues.push(...issues);
57
+ }
58
+ if (rule === 'entity-duplicate') {
59
+ const issues = await checkEntityDuplicate(dbPath, arc);
60
+ allIssues.push(...issues);
61
+ }
62
+ if (rule === 'relation-jump') {
63
+ const issues = await checkRelationJump(dbPath, arc);
64
+ allIssues.push(...issues);
65
+ }
66
+ if (rule === 'first-time-content') {
67
+ const issues = await checkFirstTimeContent(contentPath, arc);
68
+ allIssues.push(...issues);
69
+ }
70
+ if (rule === 'outfit-claims') {
71
+ const issues = await checkOutfitClaims(contentPath, arc);
72
+ allIssues.push(...issues);
73
+ }
74
+ }
75
+ // Filter by severity
76
+ allIssues = allIssues.filter((issue) => SEVERITY_ORDER[issue.severity] <= SEVERITY_ORDER[minSeverity]);
77
+ return {
78
+ arc,
79
+ issues: allIssues,
80
+ summary: {
81
+ errors: allIssues.filter((i) => i.severity === 'error').length,
82
+ warnings: allIssues.filter((i) => i.severity === 'warning').length,
83
+ info: allIssues.filter((i) => i.severity === 'info').length,
84
+ },
85
+ };
86
+ }
87
+ export * from './types.js';
88
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export declare const KINK_FIRST_PATTERNS: RegExp[];
2
+ export declare function normalizeKinkToken(token: string): string;
3
+ export declare function extractFirstSubject(token: string): string | null;
4
+ export declare function isFirstTimeKink(token: string): boolean;
5
+ export declare function tokenizeKink(kink: string): string[];
6
+ //# sourceMappingURL=patterns.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patterns.d.ts","sourceRoot":"","sources":["patterns.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,mBAAmB,UAK/B,CAAC;AAGF,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAQxD;AAID,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAQhE;AAGD,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEtD;AAGD,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAKnD"}
@@ -0,0 +1,39 @@
1
+ // Patterns for detecting "first time" in kink field
2
+ export const KINK_FIRST_PATTERNS = [
3
+ /\bprim[oa]-/i, // primo-plug, prima-volta
4
+ /\bprim[oa]\s/i, // primo bacio, prima volta
5
+ /\bfirst-/i, // first-time, first-kiss
6
+ /\bfirst\s/i, // first time, first kiss
7
+ ];
8
+ // Normalize kink token for comparison
9
+ export function normalizeKinkToken(token) {
10
+ return token
11
+ .toLowerCase()
12
+ .normalize('NFD')
13
+ .replace(/[\u0300-\u036f]/g, '') // remove accents
14
+ .replace(/[^a-z0-9]/g, '-') // non-alphanumeric to dash
15
+ .replace(/-+/g, '-') // collapse multiple dashes
16
+ .replace(/^-|-$/g, ''); // trim dashes
17
+ }
18
+ // Extract the "first" subject from a kink token
19
+ // "primo-plug" -> "plug", "prima volta anal" -> "volta-anal", "first-kiss" -> "kiss"
20
+ export function extractFirstSubject(token) {
21
+ const normalized = normalizeKinkToken(token);
22
+ // Match patterns like "primo-X", "prima-X", "first-X"
23
+ const match = normalized.match(/^(?:prim[oa]|first)-(.+)$/);
24
+ if (match)
25
+ return match[1];
26
+ return null;
27
+ }
28
+ // Check if a kink token represents a "first time" event
29
+ export function isFirstTimeKink(token) {
30
+ return KINK_FIRST_PATTERNS.some((pattern) => pattern.test(token));
31
+ }
32
+ // Tokenize kink field (comma or pipe separated)
33
+ export function tokenizeKink(kink) {
34
+ return kink
35
+ .split(/[,|]/)
36
+ .map((t) => t.trim())
37
+ .filter((t) => t.length > 0);
38
+ }
39
+ //# sourceMappingURL=patterns.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patterns.js","sourceRoot":"","sources":["patterns.ts"],"names":[],"mappings":"AAAA,oDAAoD;AACpD,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,cAAc,EAAE,0BAA0B;IAC1C,eAAe,EAAE,2BAA2B;IAC5C,WAAW,EAAE,yBAAyB;IACtC,YAAY,EAAE,yBAAyB;CACxC,CAAC;AAEF,sCAAsC;AACtC,MAAM,UAAU,kBAAkB,CAAC,KAAa;IAC9C,OAAO,KAAK;SACT,WAAW,EAAE;SACb,SAAS,CAAC,KAAK,CAAC;SAChB,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC,iBAAiB;SACjD,OAAO,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC,2BAA2B;SACtD,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,2BAA2B;SAC/C,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc;AAC1C,CAAC;AAED,gDAAgD;AAChD,qFAAqF;AACrF,MAAM,UAAU,mBAAmB,CAAC,KAAa;IAC/C,MAAM,UAAU,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAE7C,sDAAsD;IACtD,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;IAC5D,IAAI,KAAK;QAAE,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;IAE3B,OAAO,IAAI,CAAC;AACd,CAAC;AAED,wDAAwD;AACxD,MAAM,UAAU,eAAe,CAAC,KAAa;IAC3C,OAAO,mBAAmB,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;AACpE,CAAC;AAED,gDAAgD;AAChD,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,OAAO,IAAI;SACR,KAAK,CAAC,MAAM,CAAC;SACb,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACjC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Issue } from '../types.js';
2
+ export declare function checkEntityDuplicate(dbPath: string, arc: string): Promise<Issue[]>;
3
+ //# sourceMappingURL=entity-duplicate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entity-duplicate.d.ts","sourceRoot":"","sources":["entity-duplicate.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AA4EzC,wBAAsB,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,CAsBxF"}
@@ -0,0 +1,84 @@
1
+ import { Database } from '../../../database/index.js';
2
+ // Simple Levenshtein distance
3
+ function levenshtein(a, b) {
4
+ const matrix = [];
5
+ for (let i = 0; i <= b.length; i++) {
6
+ matrix[i] = [i];
7
+ }
8
+ for (let j = 0; j <= a.length; j++) {
9
+ matrix[0][j] = j;
10
+ }
11
+ for (let i = 1; i <= b.length; i++) {
12
+ for (let j = 1; j <= a.length; j++) {
13
+ if (b.charAt(i - 1) === a.charAt(j - 1)) {
14
+ matrix[i][j] = matrix[i - 1][j - 1];
15
+ }
16
+ else {
17
+ matrix[i][j] = Math.min(matrix[i - 1][j - 1] + 1, matrix[i][j - 1] + 1, matrix[i - 1][j] + 1);
18
+ }
19
+ }
20
+ }
21
+ return matrix[b.length][a.length];
22
+ }
23
+ // Check if two names might be duplicates
24
+ function areSimilar(name1, name2, threshold = 2) {
25
+ const n1 = name1.toLowerCase();
26
+ const n2 = name2.toLowerCase();
27
+ // Exact match (case insensitive)
28
+ if (n1 === n2)
29
+ return false; // Same name, not a duplicate issue
30
+ // One is prefix of other (Ali vs Alice) - only if prefix is at least 3 chars
31
+ if (n1.length >= 3 && n2.startsWith(n1))
32
+ return true;
33
+ if (n2.length >= 3 && n1.startsWith(n2))
34
+ return true;
35
+ // Levenshtein distance - only for similar length names
36
+ const lenDiff = Math.abs(n1.length - n2.length);
37
+ if (lenDiff <= 2 && levenshtein(n1, n2) <= threshold)
38
+ return true;
39
+ return false;
40
+ }
41
+ // Group similar entities
42
+ function groupSimilarEntities(names) {
43
+ const groups = [];
44
+ const used = new Set();
45
+ for (const name of names) {
46
+ if (used.has(name))
47
+ continue;
48
+ const group = [name];
49
+ used.add(name);
50
+ for (const other of names) {
51
+ if (used.has(other))
52
+ continue;
53
+ if (areSimilar(name, other)) {
54
+ group.push(other);
55
+ used.add(other);
56
+ }
57
+ }
58
+ if (group.length > 1) {
59
+ groups.push(group);
60
+ }
61
+ }
62
+ return groups;
63
+ }
64
+ export async function checkEntityDuplicate(dbPath, arc) {
65
+ const db = new Database(dbPath);
66
+ await db.connect();
67
+ const entities = await db.getEntities(arc);
68
+ db.close();
69
+ if (entities.length === 0)
70
+ return [];
71
+ const names = entities.map((e) => e.name);
72
+ const groups = groupSimilarEntities(names);
73
+ return groups.map((group) => ({
74
+ type: 'ENTITY_DUPLICATE',
75
+ severity: 'info',
76
+ message: `Possible duplicate entities: ${group.join(', ')}`,
77
+ current: { arc, episode: 0, chapter: 0 },
78
+ details: {
79
+ entities: group,
80
+ suggestion: 'Consider merging or adding aliases',
81
+ },
82
+ }));
83
+ }
84
+ //# sourceMappingURL=entity-duplicate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entity-duplicate.js","sourceRoot":"","sources":["entity-duplicate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Issue } from '../types.js';
2
+ export declare function checkFirstTimeContent(contentPath: string, arc: string, similarityThreshold?: number): Promise<Issue[]>;
3
+ //# sourceMappingURL=first-time-content.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"first-time-content.d.ts","sourceRoot":"","sources":["first-time-content.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAc,KAAK,EAAE,MAAM,aAAa,CAAC;AA0FrD,wBAAsB,qBAAqB,CACzC,WAAW,EAAE,MAAM,EACnB,GAAG,EAAE,MAAM,EACX,mBAAmB,SAAO,GACzB,OAAO,CAAC,KAAK,EAAE,CAAC,CA0ClB"}
@@ -0,0 +1,114 @@
1
+ import { readdirSync, readFileSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { generateEmbeddings } from '../../../indexer/embeddings.js';
4
+ import { parseMarkdown } from '../../../utils.js';
5
+ // Patterns to find "first time" claims in content
6
+ const FIRST_TIME_PATTERNS = [
7
+ /per la prima volta[^.!?]*/gi,
8
+ /era la prima volta[^.!?]*/gi,
9
+ /la prima volta che[^.!?]*/gi,
10
+ /prima volta nella (mia|sua|loro) vita[^.!?]*/gi,
11
+ /for the first time[^.!?]*/gi,
12
+ /it was the first time[^.!?]*/gi,
13
+ ];
14
+ function extractFirstTimeClaims(content, ref) {
15
+ const claims = [];
16
+ for (const pattern of FIRST_TIME_PATTERNS) {
17
+ const matches = content.matchAll(pattern);
18
+ for (const match of matches) {
19
+ const text = match[0].trim();
20
+ // Get surrounding context (50 chars before and after)
21
+ const start = Math.max(0, (match.index ?? 0) - 50);
22
+ const end = Math.min(content.length, (match.index ?? 0) + match[0].length + 50);
23
+ const context = content.slice(start, end).replace(/\s+/g, ' ').trim();
24
+ claims.push({ ref, text, context });
25
+ }
26
+ }
27
+ return claims;
28
+ }
29
+ function scanChaptersForFirstTime(contentPath, arc) {
30
+ const claims = [];
31
+ function scanDir(dir) {
32
+ for (const entry of readdirSync(dir, { withFileTypes: true })) {
33
+ const fullPath = join(dir, entry.name);
34
+ if (entry.isDirectory()) {
35
+ scanDir(fullPath);
36
+ }
37
+ else if (entry.isFile() && entry.name.endsWith('.md')) {
38
+ try {
39
+ const raw = readFileSync(fullPath, 'utf-8');
40
+ const { metadata, content } = parseMarkdown(raw);
41
+ if (metadata.arc !== arc)
42
+ continue;
43
+ const ref = {
44
+ arc: metadata.arc,
45
+ episode: metadata.episode ?? 0,
46
+ chapter: metadata.chapter ?? 0,
47
+ };
48
+ claims.push(...extractFirstTimeClaims(content, ref));
49
+ }
50
+ catch {
51
+ // Skip unparseable files
52
+ }
53
+ }
54
+ }
55
+ }
56
+ scanDir(contentPath);
57
+ // Sort by episode, then chapter
58
+ claims.sort((a, b) => {
59
+ if (a.ref.episode !== b.ref.episode)
60
+ return a.ref.episode - b.ref.episode;
61
+ return a.ref.chapter - b.ref.chapter;
62
+ });
63
+ return claims;
64
+ }
65
+ // Cosine similarity between two vectors
66
+ function cosineSimilarity(a, b) {
67
+ let dot = 0;
68
+ let normA = 0;
69
+ let normB = 0;
70
+ for (let i = 0; i < a.length; i++) {
71
+ dot += a[i] * b[i];
72
+ normA += a[i] * a[i];
73
+ normB += b[i] * b[i];
74
+ }
75
+ return dot / (Math.sqrt(normA) * Math.sqrt(normB));
76
+ }
77
+ export async function checkFirstTimeContent(contentPath, arc, similarityThreshold = 0.85) {
78
+ const claims = scanChaptersForFirstTime(contentPath, arc);
79
+ if (claims.length < 2)
80
+ return [];
81
+ // Generate embeddings for all claims
82
+ const texts = claims.map((c) => c.text);
83
+ const embeddings = await generateEmbeddings(texts);
84
+ const issues = [];
85
+ const reported = new Set();
86
+ // Find similar claims
87
+ for (let i = 0; i < claims.length; i++) {
88
+ for (let j = i + 1; j < claims.length; j++) {
89
+ const similarity = cosineSimilarity(embeddings[i], embeddings[j]);
90
+ if (similarity >= similarityThreshold) {
91
+ const key = `${i}:${j}`;
92
+ if (reported.has(key))
93
+ continue;
94
+ reported.add(key);
95
+ const current = claims[j];
96
+ const previous = claims[i];
97
+ issues.push({
98
+ type: 'FIRST_TIME_DUPLICATE',
99
+ severity: 'info',
100
+ message: `Similar "first time" claims found`,
101
+ current: current.ref,
102
+ previous: previous.ref,
103
+ details: {
104
+ currentText: current.text,
105
+ previousText: previous.text,
106
+ similarity: Math.round(similarity * 100) / 100,
107
+ },
108
+ });
109
+ }
110
+ }
111
+ }
112
+ return issues;
113
+ }
114
+ //# sourceMappingURL=first-time-content.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"first-time-content.js","sourceRoot":"","sources":["first-time-content.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Issue } from '../types.js';
2
+ export declare function checkKinkFirsts(contentPath: string, arc: string): Promise<Issue[]>;
3
+ //# sourceMappingURL=kink-firsts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kink-firsts.d.ts","sourceRoot":"","sources":["kink-firsts.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAc,KAAK,EAAE,MAAM,aAAa,CAAC;AAmDrD,wBAAsB,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,CAqCxF"}