@blacksmithers/vaultforge 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 (107) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +464 -0
  3. package/dist/index.d.ts +3 -0
  4. package/dist/index.d.ts.map +1 -0
  5. package/dist/index.js +705 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/tool-handlers.d.ts +79 -0
  8. package/dist/tool-handlers.d.ts.map +1 -0
  9. package/dist/tool-handlers.js +326 -0
  10. package/dist/tool-handlers.js.map +1 -0
  11. package/dist/tools/canvas/canvas-create.d.ts +4 -0
  12. package/dist/tools/canvas/canvas-create.d.ts.map +1 -0
  13. package/dist/tools/canvas/canvas-create.js +243 -0
  14. package/dist/tools/canvas/canvas-create.js.map +1 -0
  15. package/dist/tools/canvas/canvas-patch.d.ts +4 -0
  16. package/dist/tools/canvas/canvas-patch.d.ts.map +1 -0
  17. package/dist/tools/canvas/canvas-patch.js +225 -0
  18. package/dist/tools/canvas/canvas-patch.js.map +1 -0
  19. package/dist/tools/canvas/canvas-read.d.ts +4 -0
  20. package/dist/tools/canvas/canvas-read.d.ts.map +1 -0
  21. package/dist/tools/canvas/canvas-read.js +97 -0
  22. package/dist/tools/canvas/canvas-read.js.map +1 -0
  23. package/dist/tools/canvas/canvas-relayout.d.ts +4 -0
  24. package/dist/tools/canvas/canvas-relayout.d.ts.map +1 -0
  25. package/dist/tools/canvas/canvas-relayout.js +152 -0
  26. package/dist/tools/canvas/canvas-relayout.js.map +1 -0
  27. package/dist/tools/canvas/canvas-utils.d.ts +40 -0
  28. package/dist/tools/canvas/canvas-utils.d.ts.map +1 -0
  29. package/dist/tools/canvas/canvas-utils.js +141 -0
  30. package/dist/tools/canvas/canvas-utils.js.map +1 -0
  31. package/dist/tools/canvas/layout-engine.d.ts +34 -0
  32. package/dist/tools/canvas/layout-engine.d.ts.map +1 -0
  33. package/dist/tools/canvas/layout-engine.js +75 -0
  34. package/dist/tools/canvas/layout-engine.js.map +1 -0
  35. package/dist/tools/canvas/types.d.ts +71 -0
  36. package/dist/tools/canvas/types.d.ts.map +1 -0
  37. package/dist/tools/canvas/types.js +2 -0
  38. package/dist/tools/canvas/types.js.map +1 -0
  39. package/dist/tools/files/batch-rename.d.ts +4 -0
  40. package/dist/tools/files/batch-rename.d.ts.map +1 -0
  41. package/dist/tools/files/batch-rename.js +140 -0
  42. package/dist/tools/files/batch-rename.js.map +1 -0
  43. package/dist/tools/files/delete-folder.d.ts +17 -0
  44. package/dist/tools/files/delete-folder.d.ts.map +1 -0
  45. package/dist/tools/files/delete-folder.js +100 -0
  46. package/dist/tools/files/delete-folder.js.map +1 -0
  47. package/dist/tools/files/prune-empty-dirs.d.ts +17 -0
  48. package/dist/tools/files/prune-empty-dirs.d.ts.map +1 -0
  49. package/dist/tools/files/prune-empty-dirs.js +106 -0
  50. package/dist/tools/files/prune-empty-dirs.js.map +1 -0
  51. package/dist/tools/intelligence/clustering.d.ts +15 -0
  52. package/dist/tools/intelligence/clustering.d.ts.map +1 -0
  53. package/dist/tools/intelligence/clustering.js +93 -0
  54. package/dist/tools/intelligence/clustering.js.map +1 -0
  55. package/dist/tools/intelligence/tfidf.d.ts +19 -0
  56. package/dist/tools/intelligence/tfidf.d.ts.map +1 -0
  57. package/dist/tools/intelligence/tfidf.js +68 -0
  58. package/dist/tools/intelligence/tfidf.js.map +1 -0
  59. package/dist/tools/intelligence/vault-suggest.d.ts +7 -0
  60. package/dist/tools/intelligence/vault-suggest.d.ts.map +1 -0
  61. package/dist/tools/intelligence/vault-suggest.js +307 -0
  62. package/dist/tools/intelligence/vault-suggest.js.map +1 -0
  63. package/dist/tools/intelligence/vault-themes.d.ts +30 -0
  64. package/dist/tools/intelligence/vault-themes.d.ts.map +1 -0
  65. package/dist/tools/intelligence/vault-themes.js +88 -0
  66. package/dist/tools/intelligence/vault-themes.js.map +1 -0
  67. package/dist/tools/links/backlinks.d.ts +4 -0
  68. package/dist/tools/links/backlinks.d.ts.map +1 -0
  69. package/dist/tools/links/backlinks.js +50 -0
  70. package/dist/tools/links/backlinks.js.map +1 -0
  71. package/dist/tools/links/link-utils.d.ts +23 -0
  72. package/dist/tools/links/link-utils.d.ts.map +1 -0
  73. package/dist/tools/links/link-utils.js +63 -0
  74. package/dist/tools/links/link-utils.js.map +1 -0
  75. package/dist/tools/links/update-links.d.ts +16 -0
  76. package/dist/tools/links/update-links.d.ts.map +1 -0
  77. package/dist/tools/links/update-links.js +88 -0
  78. package/dist/tools/links/update-links.js.map +1 -0
  79. package/dist/tools/metadata/frontmatter.d.ts +12 -0
  80. package/dist/tools/metadata/frontmatter.d.ts.map +1 -0
  81. package/dist/tools/metadata/frontmatter.js +190 -0
  82. package/dist/tools/metadata/frontmatter.js.map +1 -0
  83. package/dist/tools/notes/edit-regex.d.ts +4 -0
  84. package/dist/tools/notes/edit-regex.d.ts.map +1 -0
  85. package/dist/tools/notes/edit-regex.js +142 -0
  86. package/dist/tools/notes/edit-regex.js.map +1 -0
  87. package/dist/tools/search/markdown-parser.d.ts +12 -0
  88. package/dist/tools/search/markdown-parser.d.ts.map +1 -0
  89. package/dist/tools/search/markdown-parser.js +64 -0
  90. package/dist/tools/search/markdown-parser.js.map +1 -0
  91. package/dist/tools/search/orama-engine.d.ts +76 -0
  92. package/dist/tools/search/orama-engine.d.ts.map +1 -0
  93. package/dist/tools/search/orama-engine.js +152 -0
  94. package/dist/tools/search/orama-engine.js.map +1 -0
  95. package/dist/tools/search/search-reindex.d.ts +7 -0
  96. package/dist/tools/search/search-reindex.d.ts.map +1 -0
  97. package/dist/tools/search/search-reindex.js +34 -0
  98. package/dist/tools/search/search-reindex.js.map +1 -0
  99. package/dist/tools/search/smart-search.d.ts +7 -0
  100. package/dist/tools/search/smart-search.d.ts.map +1 -0
  101. package/dist/tools/search/smart-search.js +102 -0
  102. package/dist/tools/search/smart-search.js.map +1 -0
  103. package/dist/vault-index.d.ts +95 -0
  104. package/dist/vault-index.d.ts.map +1 -0
  105. package/dist/vault-index.js +432 -0
  106. package/dist/vault-index.js.map +1 -0
  107. package/package.json +60 -0
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Orama search engine singleton.
3
+ * Manages BM25 index lifecycle: create, persist, reload, search.
4
+ */
5
+ import { create } from "@orama/orama";
6
+ import type { VaultIndex } from "../../vault-index.js";
7
+ declare const SCHEMA: {
8
+ path: "string";
9
+ title: "string";
10
+ content: "string";
11
+ tags: "string";
12
+ headings: "string";
13
+ };
14
+ type OramaDB = ReturnType<typeof create<typeof SCHEMA>>;
15
+ export declare function getIndexedCount(): number;
16
+ export declare function getOrCreateIndex(vaultPath: string, vaultIndex: VaultIndex): OramaDB;
17
+ export declare function ensureIndex(vaultPath: string, vaultIndex: VaultIndex): Promise<OramaDB>;
18
+ export declare function fullReindex(vaultPath: string, vaultIndex: VaultIndex): Promise<{
19
+ indexed: number;
20
+ skipped: number;
21
+ elapsed: string;
22
+ }>;
23
+ export declare function persistIndex(vaultPath: string): Promise<{
24
+ cachePath: string;
25
+ cacheSize: string;
26
+ }>;
27
+ export interface SearchOptions {
28
+ term: string;
29
+ limit?: number;
30
+ tolerance?: number;
31
+ boost?: {
32
+ title?: number;
33
+ headings?: number;
34
+ tags?: number;
35
+ content?: number;
36
+ };
37
+ threshold?: number;
38
+ properties?: string[];
39
+ preflight?: boolean;
40
+ }
41
+ export interface SearchHit {
42
+ path: string;
43
+ title: string;
44
+ score: number;
45
+ snippet: string;
46
+ tags: string[];
47
+ }
48
+ export interface SearchResult {
49
+ query: string;
50
+ count: number;
51
+ elapsed: string;
52
+ indexed_files: number;
53
+ hits: SearchHit[];
54
+ }
55
+ export declare function executeSearch(db: OramaDB, options: SearchOptions): {
56
+ count: number;
57
+ elapsed: string;
58
+ hits: Array<{
59
+ id: string;
60
+ score: number;
61
+ document: any;
62
+ }>;
63
+ };
64
+ /**
65
+ * Get all indexed documents for TF-IDF analysis.
66
+ * Returns raw document data from the index.
67
+ */
68
+ export declare function getAllIndexedDocs(vaultPath: string, vaultIndex: VaultIndex): Array<{
69
+ path: string;
70
+ title: string;
71
+ content: string;
72
+ tags: string;
73
+ headings: string;
74
+ }>;
75
+ export {};
76
+ //# sourceMappingURL=orama-engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orama-engine.d.ts","sourceRoot":"","sources":["../../../src/tools/search/orama-engine.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAA2E,MAAM,cAAc,CAAC;AAS/G,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAOvD,QAAA,MAAM,MAAM;;;;;;CAMX,CAAC;AAEF,KAAK,OAAO,GAAG,UAAU,CAAC,OAAO,MAAM,CAAC,OAAO,MAAM,CAAC,CAAC,CAAC;AAKxD,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,GAAG,OAAO,CAUnF;AAED,wBAAsB,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,CAyB7F;AAED,wBAAsB,WAAW,CAC/B,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,UAAU,GACrB,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAuDhE;AAED,wBAAsB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CAYvG;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE;QACN,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,SAAS,EAAE,CAAC;CACnB;AAED,wBAAgB,aAAa,CAC3B,EAAE,EAAE,OAAO,EACX,OAAO,EAAE,aAAa,GACrB;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,GAAG,CAAA;KAAE,CAAC,CAAA;CAAE,CAsB/F;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,GAAG,KAAK,CAAC;IAClF,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC,CAgBD"}
@@ -0,0 +1,152 @@
1
+ /**
2
+ * Orama search engine singleton.
3
+ * Manages BM25 index lifecycle: create, persist, reload, search.
4
+ */
5
+ import { create, insertMultiple, search as oramaSearch, save, load } from "@orama/orama";
6
+ // Orama's search returns sync Results for sync DBs but types it as Results | Promise<Results>.
7
+ // We only use sync create(), so search is always sync. This wrapper narrows the type.
8
+ function search(db, params) {
9
+ return oramaSearch(db, params);
10
+ }
11
+ import { readFile, writeFile, mkdir } from "node:fs/promises";
12
+ import { join } from "node:path";
13
+ import { stripMarkdown, extractFrontmatter, extractHeadings } from "./markdown-parser.js";
14
+ const CACHE_DIR = ".vaultforge";
15
+ const CACHE_FILE = "search-index.json";
16
+ const MAX_CONTENT_SIZE = 50 * 1024; // 50KB — truncate for indexing
17
+ const SCHEMA = {
18
+ path: "string",
19
+ title: "string",
20
+ content: "string",
21
+ tags: "string",
22
+ headings: "string",
23
+ };
24
+ let db = null;
25
+ let indexedCount = 0;
26
+ export function getIndexedCount() {
27
+ return indexedCount;
28
+ }
29
+ export function getOrCreateIndex(vaultPath, vaultIndex) {
30
+ if (db)
31
+ return db;
32
+ db = create({ schema: SCHEMA });
33
+ const cachePath = join(vaultPath, CACHE_DIR, CACHE_FILE);
34
+ // Try loading cache synchronously isn't possible — we'll do full index on first use
35
+ // Cache loading happens via ensureIndex()
36
+ return db;
37
+ }
38
+ export async function ensureIndex(vaultPath, vaultIndex) {
39
+ if (db && indexedCount > 0)
40
+ return db;
41
+ if (!db) {
42
+ db = create({ schema: SCHEMA });
43
+ }
44
+ const cachePath = join(vaultPath, CACHE_DIR, CACHE_FILE);
45
+ try {
46
+ const cached = JSON.parse(await readFile(cachePath, "utf-8"));
47
+ load(db, cached);
48
+ // Count indexed docs from loaded cache
49
+ const countResult = search(db, { term: "", limit: 0 });
50
+ indexedCount = countResult.count;
51
+ if (indexedCount > 0) {
52
+ return db;
53
+ }
54
+ }
55
+ catch {
56
+ // No cache or corrupt — full re-index
57
+ }
58
+ await fullReindex(vaultPath, vaultIndex);
59
+ return db;
60
+ }
61
+ export async function fullReindex(vaultPath, vaultIndex) {
62
+ const start = performance.now();
63
+ // Fresh instance
64
+ db = create({ schema: SCHEMA });
65
+ await vaultIndex.waitReady();
66
+ const allFiles = vaultIndex.allFiles().filter((f) => f.ext === ".md");
67
+ const docs = [];
68
+ let skipped = 0;
69
+ for (const file of allFiles) {
70
+ try {
71
+ let raw = await readFile(file.abs, "utf-8");
72
+ // Truncate very large files
73
+ if (raw.length > MAX_CONTENT_SIZE) {
74
+ raw = raw.slice(0, MAX_CONTENT_SIZE);
75
+ }
76
+ const { tags } = extractFrontmatter(raw);
77
+ const headings = extractHeadings(raw);
78
+ const content = stripMarkdown(raw);
79
+ docs.push({
80
+ path: file.rel,
81
+ title: file.stem,
82
+ content,
83
+ tags,
84
+ headings,
85
+ });
86
+ }
87
+ catch {
88
+ skipped++;
89
+ }
90
+ }
91
+ if (docs.length > 0) {
92
+ insertMultiple(db, docs);
93
+ }
94
+ indexedCount = docs.length;
95
+ // Persist cache
96
+ await persistIndex(vaultPath);
97
+ const elapsed = `${Math.round(performance.now() - start)}ms`;
98
+ return { indexed: docs.length, skipped, elapsed };
99
+ }
100
+ export async function persistIndex(vaultPath) {
101
+ if (!db)
102
+ throw new Error("No index to persist");
103
+ const cacheDir = join(vaultPath, CACHE_DIR);
104
+ await mkdir(cacheDir, { recursive: true });
105
+ const serialized = JSON.stringify(save(db));
106
+ const cachePath = join(cacheDir, CACHE_FILE);
107
+ await writeFile(cachePath, serialized);
108
+ const sizeKB = Math.round(serialized.length / 1024);
109
+ return { cachePath: join(CACHE_DIR, CACHE_FILE), cacheSize: `${sizeKB}KB` };
110
+ }
111
+ export function executeSearch(db, options) {
112
+ const boost = options.boost ?? {};
113
+ const result = search(db, {
114
+ term: options.term,
115
+ properties: options.properties ?? ["title", "content", "tags", "headings"],
116
+ boost: {
117
+ title: boost.title ?? 3,
118
+ headings: boost.headings ?? 2,
119
+ tags: boost.tags ?? 2.5,
120
+ content: boost.content ?? 1,
121
+ },
122
+ tolerance: options.tolerance ?? 1,
123
+ limit: options.preflight ? 0 : (options.limit ?? 10),
124
+ threshold: options.threshold ?? 0,
125
+ });
126
+ return {
127
+ count: result.count,
128
+ elapsed: result.elapsed.formatted,
129
+ hits: result.hits,
130
+ };
131
+ }
132
+ /**
133
+ * Get all indexed documents for TF-IDF analysis.
134
+ * Returns raw document data from the index.
135
+ */
136
+ export function getAllIndexedDocs(vaultPath, vaultIndex) {
137
+ if (!db)
138
+ return [];
139
+ // Search with empty term to get all docs
140
+ const result = search(db, {
141
+ term: "",
142
+ limit: 100000,
143
+ });
144
+ return result.hits.map((hit) => ({
145
+ path: hit.document.path,
146
+ title: hit.document.title,
147
+ content: hit.document.content,
148
+ tags: hit.document.tags,
149
+ headings: hit.document.headings,
150
+ }));
151
+ }
152
+ //# sourceMappingURL=orama-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orama-engine.js","sourceRoot":"","sources":["../../../src/tools/search/orama-engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * search_reindex — Force re-index of the vault search index.
3
+ */
4
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
5
+ import type { VaultIndex } from "../../vault-index.js";
6
+ export declare function registerSearchReindex(server: McpServer, vaultPath: string, vault: VaultIndex): void;
7
+ //# sourceMappingURL=search-reindex.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-reindex.d.ts","sourceRoot":"","sources":["../../../src/tools/search/search-reindex.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAKvD,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,SAAS,EACjB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,UAAU,GAChB,IAAI,CAsCN"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * search_reindex — Force re-index of the vault search index.
3
+ */
4
+ import { z } from "zod";
5
+ import { fullReindex, persistIndex } from "./orama-engine.js";
6
+ export function registerSearchReindex(server, vaultPath, vault) {
7
+ server.tool("search_reindex", "Force re-index of the vault search index. " +
8
+ "Call after bulk file operations or if search results seem stale. " +
9
+ "Index is cached at .vaultforge/search-index.json.", {
10
+ force: z
11
+ .boolean()
12
+ .default(true)
13
+ .describe("Full re-index (default: true). If false, only index files newer than cache."),
14
+ }, async ({ force }) => {
15
+ await vault.waitReady();
16
+ const result = await fullReindex(vaultPath, vault);
17
+ const { cachePath, cacheSize } = await persistIndex(vaultPath);
18
+ return {
19
+ content: [
20
+ {
21
+ type: "text",
22
+ text: JSON.stringify({
23
+ indexed: result.indexed,
24
+ skipped: result.skipped,
25
+ elapsed: result.elapsed,
26
+ cache_path: cachePath,
27
+ cache_size: cacheSize,
28
+ }, null, 2),
29
+ },
30
+ ],
31
+ };
32
+ });
33
+ }
34
+ //# sourceMappingURL=search-reindex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-reindex.js","sourceRoot":"","sources":["../../../src/tools/search/search-reindex.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAI9D,MAAM,UAAU,qBAAqB,CACnC,MAAiB,EACjB,SAAiB,EACjB,KAAiB;IAEjB,MAAM,CAAC,IAAI,CACT,gBAAgB,EAChB,4CAA4C;QAC1C,mEAAmE;QACnE,mDAAmD,EACrD;QACE,KAAK,EAAE,CAAC;aACL,OAAO,EAAE;aACT,OAAO,CAAC,IAAI,CAAC;aACb,QAAQ,CAAC,6EAA6E,CAAC;KAC3F,EACD,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;QAClB,MAAM,KAAK,CAAC,SAAS,EAAE,CAAC;QAExB,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QACnD,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,MAAM,YAAY,CAAC,SAAS,CAAC,CAAC;QAE/D,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB;wBACE,OAAO,EAAE,MAAM,CAAC,OAAO;wBACvB,OAAO,EAAE,MAAM,CAAC,OAAO;wBACvB,OAAO,EAAE,MAAM,CAAC,OAAO;wBACvB,UAAU,EAAE,SAAS;wBACrB,UAAU,EAAE,SAAS;qBACtB,EACD,IAAI,EACJ,CAAC,CACF;iBACF;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * smart_search — BM25-ranked full-text search tool.
3
+ */
4
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
5
+ import type { VaultIndex } from "../../vault-index.js";
6
+ export declare function registerSmartSearch(server: McpServer, vaultPath: string, vault: VaultIndex): void;
7
+ //# sourceMappingURL=smart-search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"smart-search.d.ts","sourceRoot":"","sources":["../../../src/tools/search/smart-search.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAMvD,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,SAAS,EACjB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,UAAU,GAChB,IAAI,CA4GN"}
@@ -0,0 +1,102 @@
1
+ /**
2
+ * smart_search — BM25-ranked full-text search tool.
3
+ */
4
+ import { z } from "zod";
5
+ import { ensureIndex, executeSearch, getIndexedCount } from "./orama-engine.js";
6
+ import { extractSnippet } from "./markdown-parser.js";
7
+ import { readFile } from "node:fs/promises";
8
+ import { join } from "node:path";
9
+ export function registerSmartSearch(server, vaultPath, vault) {
10
+ server.tool("smart_search", "BM25-ranked full-text search across vault notes. " +
11
+ "Returns results scored by relevance with snippets. " +
12
+ "Supports typo tolerance, field boosting (title > headings > tags > content), " +
13
+ "and term matching modes (auto/all/any). Default 'auto' uses OR matching with " +
14
+ "BM25 ranking for best recall — documents matching more terms score higher naturally.", {
15
+ query: z.string().describe("Search query"),
16
+ limit: z.number().default(10).describe("Max results (default: 10)"),
17
+ tolerance: z.number().default(1).describe("Typo tolerance / edit distance (0 = exact, default: 1)"),
18
+ boost: z
19
+ .object({
20
+ title: z.number().optional(),
21
+ headings: z.number().optional(),
22
+ tags: z.number().optional(),
23
+ content: z.number().optional(),
24
+ })
25
+ .optional()
26
+ .describe("Field boosting overrides (defaults: title=3, headings=2, tags=2.5, content=1)"),
27
+ threshold: z.number().default(0).describe("Min score 0-1 to include (default: 0)"),
28
+ mode: z
29
+ .enum(["auto", "all", "any"])
30
+ .default("auto")
31
+ .describe("Term matching: 'auto' (OR + BM25 ranking, best recall), 'all' (AND, all terms required), 'any' (OR, any term matches). Default: auto"),
32
+ properties: z
33
+ .array(z.string())
34
+ .optional()
35
+ .describe("Fields to search (default: all)"),
36
+ preflight: z
37
+ .boolean()
38
+ .default(false)
39
+ .describe("Count only, no hits returned (default: false)"),
40
+ }, async ({ query, limit, tolerance, boost, threshold, mode, properties, preflight }) => {
41
+ await vault.waitReady();
42
+ const db = await ensureIndex(vaultPath, vault);
43
+ // Map mode to Orama threshold parameter
44
+ // threshold=0 means all terms required (AND), threshold=1 means any term matches (OR)
45
+ let effectiveThreshold = threshold;
46
+ if (mode === "auto" || mode === "any") {
47
+ effectiveThreshold = 1;
48
+ }
49
+ else if (mode === "all") {
50
+ effectiveThreshold = 0;
51
+ }
52
+ const result = executeSearch(db, {
53
+ term: query,
54
+ limit,
55
+ tolerance,
56
+ boost,
57
+ threshold: effectiveThreshold,
58
+ properties,
59
+ preflight,
60
+ });
61
+ // Build hits with snippets
62
+ const hits = await Promise.all(result.hits.map(async (hit) => {
63
+ const doc = hit.document;
64
+ let snippet = "";
65
+ try {
66
+ const raw = await readFile(join(vaultPath, doc.path), "utf-8");
67
+ snippet = extractSnippet(raw, query);
68
+ }
69
+ catch {
70
+ snippet = extractSnippet(doc.content, query);
71
+ }
72
+ const tags = doc.tags
73
+ .split(/\s+/)
74
+ .filter((t) => t.length > 0);
75
+ // Normalize score: max score from first hit
76
+ const maxScore = result.hits[0]?.score ?? 1;
77
+ const normalizedScore = Math.round((hit.score / maxScore) * 100) / 100;
78
+ return {
79
+ path: doc.path,
80
+ title: doc.title,
81
+ score: normalizedScore,
82
+ snippet,
83
+ tags,
84
+ };
85
+ }));
86
+ return {
87
+ content: [
88
+ {
89
+ type: "text",
90
+ text: JSON.stringify({
91
+ query,
92
+ count: result.count,
93
+ elapsed: result.elapsed,
94
+ indexed_files: getIndexedCount(),
95
+ hits,
96
+ }, null, 2),
97
+ },
98
+ ],
99
+ };
100
+ });
101
+ }
102
+ //# sourceMappingURL=smart-search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"smart-search.js","sourceRoot":"","sources":["../../../src/tools/search/smart-search.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAChF,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,UAAU,mBAAmB,CACjC,MAAiB,EACjB,SAAiB,EACjB,KAAiB;IAEjB,MAAM,CAAC,IAAI,CACT,cAAc,EACd,mDAAmD;QACjD,qDAAqD;QACrD,+EAA+E;QAC/E,+EAA+E;QAC/E,sFAAsF,EACxF;QACE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC;QAC1C,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,2BAA2B,CAAC;QACnE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,wDAAwD,CAAC;QACnG,KAAK,EAAE,CAAC;aACL,MAAM,CAAC;YACN,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;YAC5B,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;YAC/B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;YAC3B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;SAC/B,CAAC;aACD,QAAQ,EAAE;aACV,QAAQ,CAAC,+EAA+E,CAAC;QAC5F,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,uCAAuC,CAAC;QAClF,IAAI,EAAE,CAAC;aACJ,IAAI,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aAC5B,OAAO,CAAC,MAAM,CAAC;aACf,QAAQ,CAAC,sIAAsI,CAAC;QACnJ,UAAU,EAAE,CAAC;aACV,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;aACjB,QAAQ,EAAE;aACV,QAAQ,CAAC,iCAAiC,CAAC;QAC9C,SAAS,EAAE,CAAC;aACT,OAAO,EAAE;aACT,OAAO,CAAC,KAAK,CAAC;aACd,QAAQ,CAAC,+CAA+C,CAAC;KAC7D,EACD,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,EAAE;QACnF,MAAM,KAAK,CAAC,SAAS,EAAE,CAAC;QACxB,MAAM,EAAE,GAAG,MAAM,WAAW,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAE/C,wCAAwC;QACxC,sFAAsF;QACtF,IAAI,kBAAkB,GAAG,SAAS,CAAC;QACnC,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;YACtC,kBAAkB,GAAG,CAAC,CAAC;QACzB,CAAC;aAAM,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;YAC1B,kBAAkB,GAAG,CAAC,CAAC;QACzB,CAAC;QAED,MAAM,MAAM,GAAG,aAAa,CAAC,EAAE,EAAE;YAC/B,IAAI,EAAE,KAAK;YACX,KAAK;YACL,SAAS;YACT,KAAK;YACL,SAAS,EAAE,kBAAkB;YAC7B,UAAU;YACV,SAAS;SACV,CAAC,CAAC;QAEH,2BAA2B;QAC3B,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,GAAG,CAC5B,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;YAC5B,MAAM,GAAG,GAAG,GAAG,CAAC,QAAQ,CAAC;YACzB,IAAI,OAAO,GAAG,EAAE,CAAC;YACjB,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;gBAC/D,OAAO,GAAG,cAAc,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YACvC,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,GAAG,cAAc,CAAC,GAAG,CAAC,OAAiB,EAAE,KAAK,CAAC,CAAC;YACzD,CAAC;YAED,MAAM,IAAI,GAAI,GAAG,CAAC,IAAe;iBAC9B,KAAK,CAAC,KAAK,CAAC;iBACZ,MAAM,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAEvC,4CAA4C;YAC5C,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC;YAC5C,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,KAAK,GAAG,QAAQ,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;YAEvE,OAAO;gBACL,IAAI,EAAE,GAAG,CAAC,IAAc;gBACxB,KAAK,EAAE,GAAG,CAAC,KAAe;gBAC1B,KAAK,EAAE,eAAe;gBACtB,OAAO;gBACP,IAAI;aACL,CAAC;QACJ,CAAC,CAAC,CACH,CAAC;QAEF,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB;wBACE,KAAK;wBACL,KAAK,EAAE,MAAM,CAAC,KAAK;wBACnB,OAAO,EAAE,MAAM,CAAC,OAAO;wBACvB,aAAa,EAAE,eAAe,EAAE;wBAChC,IAAI;qBACL,EACD,IAAI,EACJ,CAAC,CACF;iBACF;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,95 @@
1
+ export interface FileEntry {
2
+ /** Absolute path */
3
+ abs: string;
4
+ /** Path relative to vault root */
5
+ rel: string;
6
+ /** Filename without extension */
7
+ stem: string;
8
+ /** File extension (with dot) */
9
+ ext: string;
10
+ /** Parent directory relative to vault */
11
+ dir: string;
12
+ /** Created timestamp (ms) */
13
+ ctime: number;
14
+ /** Last modified timestamp (ms) */
15
+ mtime: number;
16
+ /** File size in bytes */
17
+ size: number;
18
+ }
19
+ export interface DirEntry {
20
+ /** Path relative to vault root */
21
+ rel: string;
22
+ /** Absolute path */
23
+ abs: string;
24
+ /** Number of direct children (files + subdirectories) */
25
+ children_count: number;
26
+ /** Created timestamp (ms) */
27
+ ctime: number;
28
+ /** Last modified timestamp (ms) */
29
+ mtime: number;
30
+ }
31
+ export declare class VaultIndex {
32
+ readonly vaultPath: string;
33
+ private readonly ignoreDirs;
34
+ /** rel path → FileEntry */
35
+ private files;
36
+ /** stem (lowercase) → rel paths (for fast name lookup) */
37
+ private byName;
38
+ /** directory rel path → child rel paths */
39
+ private byDir;
40
+ /** fs watchers */
41
+ private watchers;
42
+ private ready;
43
+ private readyPromise;
44
+ private resolveReady;
45
+ constructor(vaultPath: string, ignoreDirs?: Set<string>);
46
+ init(): Promise<void>;
47
+ waitReady(): Promise<void>;
48
+ destroy(): void;
49
+ get(relPath: string): FileEntry | undefined;
50
+ has(relPath: string): boolean;
51
+ /** Find files by stem (filename without ext), case-insensitive */
52
+ findByName(name: string): FileEntry[];
53
+ /** List files in a directory (non-recursive) */
54
+ listDir(relDir: string): FileEntry[];
55
+ /** List subdirectories of a directory (non-recursive) */
56
+ listDirEntries(relDir: string): Promise<DirEntry[]>;
57
+ /** Glob-like search: supports * and ** in patterns */
58
+ glob(pattern: string): FileEntry[];
59
+ /** Full-text search in paths (fast, no content scan) */
60
+ searchPaths(query: string): FileEntry[];
61
+ /** Get all files sorted by mtime (most recent first) */
62
+ recentFiles(limit?: number): FileEntry[];
63
+ /** Get all indexed file entries */
64
+ allFiles(): FileEntry[];
65
+ /** Check if a directory exists in the index */
66
+ hasDir(relDir: string): boolean;
67
+ /** Check if a directory is empty (no files and no subdirectories) */
68
+ isDirEmpty(relDir: string): boolean;
69
+ /** Count children (files + direct subdirectories) of a directory */
70
+ countChildren(relDir: string): number;
71
+ /** Remove a directory and all its children from the index */
72
+ removeDir(relDir: string): {
73
+ filesRemoved: number;
74
+ dirsRemoved: number;
75
+ };
76
+ /** Get vault stats */
77
+ stats(): {
78
+ totalFiles: number;
79
+ totalDirs: number;
80
+ extensions: Record<string, number>;
81
+ };
82
+ /**
83
+ * Resolve a possibly partial path to a full relative path.
84
+ * Tries: exact match → with .md extension → stem search → path search
85
+ */
86
+ resolve(input: string): FileEntry | undefined;
87
+ private scanDir;
88
+ private addFile;
89
+ private removeFile;
90
+ private startWatching;
91
+ private handleChange;
92
+ private normalizePath;
93
+ private globToRegex;
94
+ }
95
+ //# sourceMappingURL=vault-index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vault-index.d.ts","sourceRoot":"","sources":["../src/vault-index.ts"],"names":[],"mappings":"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"}