@hiveforge/hivemind-mcp 0.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 (43) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +148 -0
  3. package/dist/cli.d.ts +3 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +175 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/graph/builder.d.ts +47 -0
  8. package/dist/graph/builder.d.ts.map +1 -0
  9. package/dist/graph/builder.js +182 -0
  10. package/dist/graph/builder.js.map +1 -0
  11. package/dist/graph/database.d.ts +71 -0
  12. package/dist/graph/database.d.ts.map +1 -0
  13. package/dist/graph/database.js +255 -0
  14. package/dist/graph/database.js.map +1 -0
  15. package/dist/index.d.ts +3 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +53 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/parser/markdown.d.ts +29 -0
  20. package/dist/parser/markdown.d.ts.map +1 -0
  21. package/dist/parser/markdown.js +122 -0
  22. package/dist/parser/markdown.js.map +1 -0
  23. package/dist/search/engine.d.ts +48 -0
  24. package/dist/search/engine.d.ts.map +1 -0
  25. package/dist/search/engine.js +88 -0
  26. package/dist/search/engine.js.map +1 -0
  27. package/dist/server.d.ts +23 -0
  28. package/dist/server.d.ts.map +1 -0
  29. package/dist/server.js +504 -0
  30. package/dist/server.js.map +1 -0
  31. package/dist/types/index.d.ts +646 -0
  32. package/dist/types/index.d.ts.map +1 -0
  33. package/dist/types/index.js +133 -0
  34. package/dist/types/index.js.map +1 -0
  35. package/dist/vault/reader.d.ts +56 -0
  36. package/dist/vault/reader.d.ts.map +1 -0
  37. package/dist/vault/reader.js +185 -0
  38. package/dist/vault/reader.js.map +1 -0
  39. package/dist/vault/watcher.d.ts +33 -0
  40. package/dist/vault/watcher.d.ts.map +1 -0
  41. package/dist/vault/watcher.js +92 -0
  42. package/dist/vault/watcher.js.map +1 -0
  43. package/package.json +77 -0
@@ -0,0 +1,133 @@
1
+ import { z } from 'zod';
2
+ // ============================================================================
3
+ // Vault Note Types
4
+ // ============================================================================
5
+ export const NoteStatusSchema = z.enum(['draft', 'pending', 'canon', 'non-canon', 'archived']);
6
+ export const NoteTypeSchema = z.enum(['character', 'location', 'event', 'faction', 'system', 'asset', 'lore']);
7
+ export const ImportanceSchema = z.enum(['major', 'minor', 'background']);
8
+ // Base frontmatter schema
9
+ export const BaseFrontmatterSchema = z.object({
10
+ id: z.string(),
11
+ type: NoteTypeSchema,
12
+ status: NoteStatusSchema.default('draft'),
13
+ title: z.string().optional(),
14
+ world: z.string().optional(),
15
+ importance: ImportanceSchema.optional(),
16
+ tags: z.array(z.string()).optional().default([]),
17
+ aliases: z.array(z.string()).optional().default([]),
18
+ created: z.string().optional(),
19
+ updated: z.string().optional(),
20
+ canon_authority: z.enum(['high', 'medium', 'low']).optional(),
21
+ });
22
+ // Character-specific frontmatter
23
+ export const CharacterFrontmatterSchema = BaseFrontmatterSchema.extend({
24
+ type: z.literal('character'),
25
+ name: z.string(),
26
+ age: z.number().optional(),
27
+ gender: z.string().optional(),
28
+ race: z.string().optional(),
29
+ appearance: z.record(z.any()).optional(),
30
+ personality: z.record(z.any()).optional(),
31
+ relationships: z.array(z.record(z.any())).optional(),
32
+ assets: z.array(z.string()).optional(),
33
+ });
34
+ // Location-specific frontmatter
35
+ export const LocationFrontmatterSchema = BaseFrontmatterSchema.extend({
36
+ type: z.literal('location'),
37
+ name: z.string(),
38
+ region: z.string().optional(),
39
+ category: z.string().optional(),
40
+ parent: z.string().optional(),
41
+ hierarchy_level: z.enum(['continent', 'region', 'settlement', 'building', 'room']).optional(),
42
+ children: z.array(z.string()).optional(),
43
+ climate: z.string().optional(),
44
+ terrain: z.array(z.string()).optional(),
45
+ inhabitants: z.array(z.string()).optional(),
46
+ connections: z.array(z.record(z.any())).optional(),
47
+ assets: z.array(z.string()).optional(),
48
+ });
49
+ // Event-specific frontmatter
50
+ export const EventFrontmatterSchema = BaseFrontmatterSchema.extend({
51
+ type: z.literal('event'),
52
+ name: z.string(),
53
+ date: z.string().optional(),
54
+ date_start: z.string().optional(),
55
+ date_end: z.string().optional(),
56
+ date_display: z.string().optional(),
57
+ event_type: z.string().optional(),
58
+ participants: z.array(z.string()).optional(),
59
+ locations: z.array(z.string()).optional(),
60
+ factions: z.array(z.string()).optional(),
61
+ outcome: z.string().optional(),
62
+ consequences: z.array(z.string()).optional(),
63
+ timeline: z.string().optional(),
64
+ previous_event: z.string().optional(),
65
+ next_event: z.string().optional(),
66
+ });
67
+ // Faction-specific frontmatter
68
+ export const FactionFrontmatterSchema = BaseFrontmatterSchema.extend({
69
+ type: z.literal('faction'),
70
+ name: z.string(),
71
+ faction_type: z.enum(['house', 'guild', 'organization', 'government', 'military', 'religion', 'other']).optional(),
72
+ leader: z.string().optional(),
73
+ members: z.array(z.string()).optional(),
74
+ headquarters: z.string().optional(),
75
+ founded: z.string().optional(),
76
+ goals: z.array(z.string()).optional(),
77
+ resources: z.array(z.string()).optional(),
78
+ allies: z.array(z.string()).optional(),
79
+ rivals: z.array(z.string()).optional(),
80
+ });
81
+ // Lore-specific frontmatter
82
+ export const LoreFrontmatterSchema = BaseFrontmatterSchema.extend({
83
+ type: z.literal('lore'),
84
+ name: z.string(),
85
+ category: z.enum(['mythology', 'history', 'magic', 'technology', 'culture', 'religion', 'other']).optional(),
86
+ related_entities: z.array(z.string()).optional(),
87
+ source: z.enum(['in-world', 'meta', 'player-knowledge']).optional(),
88
+ });
89
+ // Asset-specific frontmatter
90
+ export const AssetFrontmatterSchema = BaseFrontmatterSchema.extend({
91
+ type: z.literal('asset'),
92
+ asset_type: z.enum(['image', 'audio', 'video', 'document']).default('image'),
93
+ file_path: z.string(),
94
+ file_format: z.string().optional(),
95
+ depicts: z.array(z.string()).optional(),
96
+ generation_date: z.string().optional(),
97
+ generator: z.string().optional(),
98
+ workflow_id: z.string().optional(),
99
+ prompt: z.string().optional(),
100
+ negative_prompt: z.string().optional(),
101
+ model: z.string().optional(),
102
+ seed: z.number().optional(),
103
+ parameters: z.record(z.any()).optional(),
104
+ approved_by: z.string().optional(),
105
+ approval_date: z.string().optional(),
106
+ });
107
+ // ============================================================================
108
+ // MCP Tool Types
109
+ // ============================================================================
110
+ export const QueryCharacterArgsSchema = z.object({
111
+ id: z.string().describe('Character ID or name to query'),
112
+ includeContent: z.boolean().optional().default(true).describe('Include content body in response'),
113
+ contentLimit: z.number().min(100).max(5000).optional().default(500).describe('Maximum characters of content to return'),
114
+ });
115
+ export const QueryLocationArgsSchema = z.object({
116
+ id: z.string().describe('Location ID or name to query'),
117
+ includeContent: z.boolean().optional().default(true).describe('Include content body in response'),
118
+ contentLimit: z.number().min(100).max(5000).optional().default(500).describe('Maximum characters of content to return'),
119
+ });
120
+ export const SearchVaultArgsSchema = z.object({
121
+ query: z.string().describe('Search query text'),
122
+ filters: z.object({
123
+ type: z.array(NoteTypeSchema).optional(),
124
+ status: z.array(NoteStatusSchema).optional(),
125
+ importance: z.array(ImportanceSchema).optional(),
126
+ tags: z.array(z.string()).optional(),
127
+ world: z.string().optional(),
128
+ }).optional(),
129
+ limit: z.number().min(1).max(100).default(10),
130
+ includeContent: z.boolean().optional().default(false).describe('Include content snippets in results'),
131
+ contentLimit: z.number().min(100).max(2000).optional().default(300).describe('Maximum characters of content per result'),
132
+ });
133
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ import type { VaultConfig, VaultNote } from '../types/index.js';
2
+ export interface VaultIndex {
3
+ notes: Map<string, VaultNote>;
4
+ notesByType: Map<string, Set<string>>;
5
+ notesByStatus: Map<string, Set<string>>;
6
+ totalNotes: number;
7
+ lastUpdated: Date;
8
+ }
9
+ export declare class VaultReader {
10
+ private config;
11
+ private index;
12
+ private parser;
13
+ constructor(config: VaultConfig);
14
+ /**
15
+ * Scan the vault directory and build an index of all markdown files
16
+ */
17
+ scanVault(): Promise<VaultIndex>;
18
+ /**
19
+ * Recursively find all markdown files in a directory
20
+ */
21
+ private findMarkdownFiles;
22
+ /**
23
+ * Check if a file/directory should be excluded
24
+ */
25
+ private shouldExclude;
26
+ /**
27
+ * Index a single markdown file with full parsing
28
+ */
29
+ private indexFile;
30
+ /**
31
+ * Get a note by ID
32
+ */
33
+ getNote(id: string): VaultNote | undefined;
34
+ /**
35
+ * Get all notes
36
+ */
37
+ getAllNotes(): VaultNote[];
38
+ /**
39
+ * Get notes by type
40
+ */
41
+ getNotesByType(type: string): VaultNote[];
42
+ /**
43
+ * Get notes by status
44
+ */
45
+ getNotesByStatus(status: string): VaultNote[];
46
+ /**
47
+ * Get vault statistics
48
+ */
49
+ getStats(): {
50
+ totalNotes: number;
51
+ byType: Record<string, number>;
52
+ byStatus: Record<string, number>;
53
+ lastUpdated: Date;
54
+ };
55
+ }
56
+ //# sourceMappingURL=reader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reader.d.ts","sourceRoot":"","sources":["../../src/vault/reader.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAGhE,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAC9B,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;IACtC,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;IACxC,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,IAAI,CAAC;CACnB;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,KAAK,CAAa;IAC1B,OAAO,CAAC,MAAM,CAAiB;gBAEnB,MAAM,EAAE,WAAW;IAY/B;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,UAAU,CAAC;IA+BtC;;OAEG;YACW,iBAAiB;IA6B/B;;OAEG;IACH,OAAO,CAAC,aAAa;IAwBrB;;OAEG;YACW,SAAS;IAmCvB;;OAEG;IACH,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS;IAI1C;;OAEG;IACH,WAAW,IAAI,SAAS,EAAE;IAI1B;;OAEG;IACH,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE;IASzC;;OAEG;IACH,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,EAAE;IAS7C;;OAEG;IACH,QAAQ;;;;;;CAkBT"}
@@ -0,0 +1,185 @@
1
+ import { promises as fs } from 'fs';
2
+ import { join, relative } from 'path';
3
+ import { MarkdownParser } from '../parser/markdown.js';
4
+ export class VaultReader {
5
+ config;
6
+ index;
7
+ parser;
8
+ constructor(config) {
9
+ this.config = config;
10
+ this.parser = new MarkdownParser();
11
+ this.index = {
12
+ notes: new Map(),
13
+ notesByType: new Map(),
14
+ notesByStatus: new Map(),
15
+ totalNotes: 0,
16
+ lastUpdated: new Date(),
17
+ };
18
+ }
19
+ /**
20
+ * Scan the vault directory and build an index of all markdown files
21
+ */
22
+ async scanVault() {
23
+ console.error(`Scanning vault at: ${this.config.path}`);
24
+ const startTime = Date.now();
25
+ const files = await this.findMarkdownFiles(this.config.path);
26
+ console.error(`Found ${files.length} markdown files`);
27
+ // Clear existing index
28
+ this.index.notes.clear();
29
+ this.index.notesByType.clear();
30
+ this.index.notesByStatus.clear();
31
+ // Process each file
32
+ for (const filePath of files) {
33
+ try {
34
+ await this.indexFile(filePath);
35
+ }
36
+ catch (error) {
37
+ console.error(`Error indexing ${filePath}:`, error);
38
+ }
39
+ }
40
+ this.index.totalNotes = this.index.notes.size;
41
+ this.index.lastUpdated = new Date();
42
+ const elapsed = Date.now() - startTime;
43
+ console.error(`Vault scan complete: ${this.index.totalNotes} notes indexed in ${elapsed}ms`);
44
+ return this.index;
45
+ }
46
+ /**
47
+ * Recursively find all markdown files in a directory
48
+ */
49
+ async findMarkdownFiles(dir) {
50
+ const results = [];
51
+ try {
52
+ const entries = await fs.readdir(dir, { withFileTypes: true });
53
+ for (const entry of entries) {
54
+ const fullPath = join(dir, entry.name);
55
+ // Skip excluded patterns
56
+ if (this.shouldExclude(entry.name)) {
57
+ continue;
58
+ }
59
+ if (entry.isDirectory()) {
60
+ // Recursively search subdirectories
61
+ const subFiles = await this.findMarkdownFiles(fullPath);
62
+ results.push(...subFiles);
63
+ }
64
+ else if (entry.isFile() && entry.name.endsWith('.md')) {
65
+ results.push(fullPath);
66
+ }
67
+ }
68
+ }
69
+ catch (error) {
70
+ console.error(`Error reading directory ${dir}:`, error);
71
+ }
72
+ return results;
73
+ }
74
+ /**
75
+ * Check if a file/directory should be excluded
76
+ */
77
+ shouldExclude(name) {
78
+ const defaultExcludes = [
79
+ '.obsidian',
80
+ '.trash',
81
+ '.git',
82
+ 'node_modules',
83
+ '_template.md',
84
+ ];
85
+ const excludePatterns = [
86
+ ...defaultExcludes,
87
+ ...(this.config.excludePatterns || []),
88
+ ];
89
+ return excludePatterns.some(pattern => {
90
+ if (pattern.includes('*')) {
91
+ // Simple glob matching
92
+ const regex = new RegExp('^' + pattern.replace(/\*/g, '.*') + '$');
93
+ return regex.test(name);
94
+ }
95
+ return name === pattern || name.startsWith(pattern);
96
+ });
97
+ }
98
+ /**
99
+ * Index a single markdown file with full parsing
100
+ */
101
+ async indexFile(filePath) {
102
+ try {
103
+ // Parse the file with MarkdownParser
104
+ const note = await this.parser.parseFile(filePath);
105
+ // Update file stats
106
+ const stats = await fs.stat(filePath);
107
+ note.stats = {
108
+ size: stats.size,
109
+ created: stats.birthtime,
110
+ modified: stats.mtime,
111
+ };
112
+ // Update relative path
113
+ note.filePath = relative(this.config.path, filePath);
114
+ // Add to index
115
+ this.index.notes.set(note.id, note);
116
+ // Index by type
117
+ if (!this.index.notesByType.has(note.frontmatter.type)) {
118
+ this.index.notesByType.set(note.frontmatter.type, new Set());
119
+ }
120
+ this.index.notesByType.get(note.frontmatter.type).add(note.id);
121
+ // Index by status
122
+ if (!this.index.notesByStatus.has(note.frontmatter.status)) {
123
+ this.index.notesByStatus.set(note.frontmatter.status, new Set());
124
+ }
125
+ this.index.notesByStatus.get(note.frontmatter.status).add(note.id);
126
+ }
127
+ catch (error) {
128
+ console.error(`Failed to parse ${filePath}:`, error);
129
+ }
130
+ }
131
+ /**
132
+ * Get a note by ID
133
+ */
134
+ getNote(id) {
135
+ return this.index.notes.get(id);
136
+ }
137
+ /**
138
+ * Get all notes
139
+ */
140
+ getAllNotes() {
141
+ return Array.from(this.index.notes.values());
142
+ }
143
+ /**
144
+ * Get notes by type
145
+ */
146
+ getNotesByType(type) {
147
+ const ids = this.index.notesByType.get(type);
148
+ if (!ids)
149
+ return [];
150
+ return Array.from(ids)
151
+ .map(id => this.index.notes.get(id))
152
+ .filter((note) => note !== undefined);
153
+ }
154
+ /**
155
+ * Get notes by status
156
+ */
157
+ getNotesByStatus(status) {
158
+ const ids = this.index.notesByStatus.get(status);
159
+ if (!ids)
160
+ return [];
161
+ return Array.from(ids)
162
+ .map(id => this.index.notes.get(id))
163
+ .filter((note) => note !== undefined);
164
+ }
165
+ /**
166
+ * Get vault statistics
167
+ */
168
+ getStats() {
169
+ const typeStats = {};
170
+ for (const [type, ids] of this.index.notesByType.entries()) {
171
+ typeStats[type] = ids.size;
172
+ }
173
+ const statusStats = {};
174
+ for (const [status, ids] of this.index.notesByStatus.entries()) {
175
+ statusStats[status] = ids.size;
176
+ }
177
+ return {
178
+ totalNotes: this.index.totalNotes,
179
+ byType: typeStats,
180
+ byStatus: statusStats,
181
+ lastUpdated: this.index.lastUpdated,
182
+ };
183
+ }
184
+ }
185
+ //# sourceMappingURL=reader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reader.js","sourceRoot":"","sources":["../../src/vault/reader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import type { VaultConfig } from '../types/index.js';
2
+ export type FileChangeEvent = 'add' | 'change' | 'unlink';
3
+ export interface FileChangeHandler {
4
+ (event: FileChangeEvent, filePath: string): void | Promise<void>;
5
+ }
6
+ export declare class VaultWatcher {
7
+ private config;
8
+ private watcher;
9
+ private handlers;
10
+ private debounceTimers;
11
+ constructor(config: VaultConfig);
12
+ /**
13
+ * Start watching the vault for changes
14
+ */
15
+ start(): void;
16
+ /**
17
+ * Stop watching
18
+ */
19
+ stop(): Promise<void>;
20
+ /**
21
+ * Register a handler for file changes
22
+ */
23
+ onChange(handler: FileChangeHandler): void;
24
+ /**
25
+ * Handle file change with debouncing
26
+ */
27
+ private handleChange;
28
+ /**
29
+ * Notify all registered handlers
30
+ */
31
+ private notifyHandlers;
32
+ }
33
+ //# sourceMappingURL=watcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watcher.d.ts","sourceRoot":"","sources":["../../src/vault/watcher.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,MAAM,MAAM,eAAe,GAAG,KAAK,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE1D,MAAM,WAAW,iBAAiB;IAChC,CAAC,KAAK,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAClE;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,OAAO,CAA0B;IACzC,OAAO,CAAC,QAAQ,CAA2B;IAC3C,OAAO,CAAC,cAAc,CAA0C;gBAEpD,MAAM,EAAE,WAAW;IAI/B;;OAEG;IACH,KAAK,IAAI,IAAI;IAmCb;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ3B;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE,iBAAiB,GAAG,IAAI;IAI1C;;OAEG;IACH,OAAO,CAAC,YAAY;IAkBpB;;OAEG;YACW,cAAc;CAW7B"}
@@ -0,0 +1,92 @@
1
+ import chokidar from 'chokidar';
2
+ export class VaultWatcher {
3
+ config;
4
+ watcher = null;
5
+ handlers = [];
6
+ debounceTimers = new Map();
7
+ constructor(config) {
8
+ this.config = config;
9
+ }
10
+ /**
11
+ * Start watching the vault for changes
12
+ */
13
+ start() {
14
+ if (!this.config.watchForChanges) {
15
+ console.error('File watching disabled in config');
16
+ return;
17
+ }
18
+ console.error(`Starting file watcher on: ${this.config.path}`);
19
+ this.watcher = chokidar.watch('**/*.md', {
20
+ cwd: this.config.path,
21
+ ignored: [
22
+ '**/node_modules/**',
23
+ '**/.obsidian/**',
24
+ '**/.trash/**',
25
+ '**/.git/**',
26
+ '**/_template.md',
27
+ ...(this.config.excludePatterns || []),
28
+ ],
29
+ ignoreInitial: true, // Don't trigger on initial scan
30
+ persistent: true,
31
+ awaitWriteFinish: {
32
+ stabilityThreshold: 100,
33
+ pollInterval: 50,
34
+ },
35
+ });
36
+ // Set up event handlers with debouncing
37
+ this.watcher
38
+ .on('add', (path) => this.handleChange('add', path))
39
+ .on('change', (path) => this.handleChange('change', path))
40
+ .on('unlink', (path) => this.handleChange('unlink', path))
41
+ .on('error', (error) => console.error('Watcher error:', error))
42
+ .on('ready', () => console.error('File watcher ready'));
43
+ }
44
+ /**
45
+ * Stop watching
46
+ */
47
+ async stop() {
48
+ if (this.watcher) {
49
+ await this.watcher.close();
50
+ this.watcher = null;
51
+ console.error('File watcher stopped');
52
+ }
53
+ }
54
+ /**
55
+ * Register a handler for file changes
56
+ */
57
+ onChange(handler) {
58
+ this.handlers.push(handler);
59
+ }
60
+ /**
61
+ * Handle file change with debouncing
62
+ */
63
+ handleChange(event, filePath) {
64
+ const debounceMs = this.config.debounceMs || 100;
65
+ // Clear existing timer for this file
66
+ const existingTimer = this.debounceTimers.get(filePath);
67
+ if (existingTimer) {
68
+ clearTimeout(existingTimer);
69
+ }
70
+ // Set new timer
71
+ const timer = setTimeout(() => {
72
+ this.debounceTimers.delete(filePath);
73
+ this.notifyHandlers(event, filePath);
74
+ }, debounceMs);
75
+ this.debounceTimers.set(filePath, timer);
76
+ }
77
+ /**
78
+ * Notify all registered handlers
79
+ */
80
+ async notifyHandlers(event, filePath) {
81
+ console.error(`File ${event}: ${filePath}`);
82
+ for (const handler of this.handlers) {
83
+ try {
84
+ await handler(event, filePath);
85
+ }
86
+ catch (error) {
87
+ console.error(`Error in change handler for ${filePath}:`, error);
88
+ }
89
+ }
90
+ }
91
+ }
92
+ //# sourceMappingURL=watcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watcher.js","sourceRoot":"","sources":["../../src/vault/watcher.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,77 @@
1
+ {
2
+ "name": "@hiveforge/hivemind-mcp",
3
+ "version": "0.1.0",
4
+ "description": "MCP server for Obsidian worldbuilding vaults - provides AI tools with consistent canonical context",
5
+ "main": "dist/index.js",
6
+ "type": "module",
7
+ "bin": {
8
+ "hivemind": "dist/cli.js"
9
+ },
10
+ "files": [
11
+ "dist/**/*",
12
+ "README.md",
13
+ "LICENSE"
14
+ ],
15
+ "scripts": {
16
+ "build": "tsc",
17
+ "dev": "tsc --watch",
18
+ "start": "node dist/index.js",
19
+ "test": "node --experimental-vm-modules node_modules/jest/bin/jest.js",
20
+ "lint": "eslint src --ext .ts",
21
+ "clean": "rimraf dist",
22
+ "prepublishOnly": "npm run build"
23
+ },
24
+ "repository": {
25
+ "type": "git",
26
+ "url": "git+https://github.com/hiveforge-io/hivemind.git"
27
+ },
28
+ "bugs": {
29
+ "url": "https://github.com/hiveforge-io/hivemind/issues"
30
+ },
31
+ "homepage": "https://github.com/hiveforge-io/hivemind#readme",
32
+ "keywords": [
33
+ "mcp",
34
+ "model-context-protocol",
35
+ "obsidian",
36
+ "worldbuilding",
37
+ "ai",
38
+ "context",
39
+ "knowledge-graph",
40
+ "claude",
41
+ "rag",
42
+ "hybrid-search",
43
+ "creative-writing",
44
+ "fiction",
45
+ "storytelling"
46
+ ],
47
+ "author": "Preston",
48
+ "license": "MIT",
49
+ "publishConfig": {
50
+ "access": "public"
51
+ },
52
+ "engines": {
53
+ "node": ">=20.0.0"
54
+ },
55
+ "dependencies": {
56
+ "@modelcontextprotocol/sdk": "^1.0.4",
57
+ "chokidar": "^4.0.3",
58
+ "express": "^4.21.2",
59
+ "gray-matter": "^4.0.3",
60
+ "remark": "^15.0.1",
61
+ "remark-wiki-link": "^2.0.1",
62
+ "better-sqlite3": "^11.7.0",
63
+ "zod": "^3.24.1"
64
+ },
65
+ "devDependencies": {
66
+ "@types/node": "^22.10.5",
67
+ "@types/express": "^5.0.0",
68
+ "@types/better-sqlite3": "^7.6.12",
69
+ "@typescript-eslint/eslint-plugin": "^8.20.0",
70
+ "@typescript-eslint/parser": "^8.20.0",
71
+ "eslint": "^9.18.0",
72
+ "jest": "^29.7.0",
73
+ "@types/jest": "^29.5.14",
74
+ "typescript": "^5.7.2",
75
+ "rimraf": "^6.0.1"
76
+ }
77
+ }