mnemon-mcp 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 (104) hide show
  1. package/CHANGELOG.md +34 -0
  2. package/CONTRIBUTING.md +59 -0
  3. package/LICENSE +21 -0
  4. package/README.md +434 -0
  5. package/SECURITY.md +29 -0
  6. package/config.example.json +52 -0
  7. package/dist/.tsbuildinfo +1 -0
  8. package/dist/db.d.ts +16 -0
  9. package/dist/db.d.ts.map +1 -0
  10. package/dist/db.js +360 -0
  11. package/dist/db.js.map +1 -0
  12. package/dist/embedder.d.ts +22 -0
  13. package/dist/embedder.d.ts.map +1 -0
  14. package/dist/embedder.js +109 -0
  15. package/dist/embedder.js.map +1 -0
  16. package/dist/import/cli.d.ts +12 -0
  17. package/dist/import/cli.d.ts.map +1 -0
  18. package/dist/import/cli.js +105 -0
  19. package/dist/import/cli.js.map +1 -0
  20. package/dist/import/config-loader.d.ts +29 -0
  21. package/dist/import/config-loader.d.ts.map +1 -0
  22. package/dist/import/config-loader.js +140 -0
  23. package/dist/import/config-loader.js.map +1 -0
  24. package/dist/import/kb-config.d.ts +27 -0
  25. package/dist/import/kb-config.d.ts.map +1 -0
  26. package/dist/import/kb-config.js +10 -0
  27. package/dist/import/kb-config.js.map +1 -0
  28. package/dist/import/kb-import.d.ts +45 -0
  29. package/dist/import/kb-import.d.ts.map +1 -0
  30. package/dist/import/kb-import.js +285 -0
  31. package/dist/import/kb-import.js.map +1 -0
  32. package/dist/import/md-parser.d.ts +35 -0
  33. package/dist/import/md-parser.d.ts.map +1 -0
  34. package/dist/import/md-parser.js +104 -0
  35. package/dist/import/md-parser.js.map +1 -0
  36. package/dist/index-http.d.ts +12 -0
  37. package/dist/index-http.d.ts.map +1 -0
  38. package/dist/index-http.js +202 -0
  39. package/dist/index-http.js.map +1 -0
  40. package/dist/index.d.ts +9 -0
  41. package/dist/index.d.ts.map +1 -0
  42. package/dist/index.js +56 -0
  43. package/dist/index.js.map +1 -0
  44. package/dist/server.d.ts +16 -0
  45. package/dist/server.d.ts.map +1 -0
  46. package/dist/server.js +341 -0
  47. package/dist/server.js.map +1 -0
  48. package/dist/stemmer.d.ts +29 -0
  49. package/dist/stemmer.d.ts.map +1 -0
  50. package/dist/stemmer.js +68 -0
  51. package/dist/stemmer.js.map +1 -0
  52. package/dist/stop-words.d.ts +12 -0
  53. package/dist/stop-words.d.ts.map +1 -0
  54. package/dist/stop-words.js +112 -0
  55. package/dist/stop-words.js.map +1 -0
  56. package/dist/tools/memory-add.d.ts +15 -0
  57. package/dist/tools/memory-add.d.ts.map +1 -0
  58. package/dist/tools/memory-add.js +120 -0
  59. package/dist/tools/memory-add.js.map +1 -0
  60. package/dist/tools/memory-delete.d.ts +10 -0
  61. package/dist/tools/memory-delete.d.ts.map +1 -0
  62. package/dist/tools/memory-delete.js +39 -0
  63. package/dist/tools/memory-delete.js.map +1 -0
  64. package/dist/tools/memory-export.d.ts +10 -0
  65. package/dist/tools/memory-export.d.ts.map +1 -0
  66. package/dist/tools/memory-export.js +102 -0
  67. package/dist/tools/memory-export.js.map +1 -0
  68. package/dist/tools/memory-health.d.ts +11 -0
  69. package/dist/tools/memory-health.d.ts.map +1 -0
  70. package/dist/tools/memory-health.js +79 -0
  71. package/dist/tools/memory-health.js.map +1 -0
  72. package/dist/tools/memory-inspect.d.ts +10 -0
  73. package/dist/tools/memory-inspect.d.ts.map +1 -0
  74. package/dist/tools/memory-inspect.js +139 -0
  75. package/dist/tools/memory-inspect.js.map +1 -0
  76. package/dist/tools/memory-search.d.ts +16 -0
  77. package/dist/tools/memory-search.d.ts.map +1 -0
  78. package/dist/tools/memory-search.js +459 -0
  79. package/dist/tools/memory-search.js.map +1 -0
  80. package/dist/tools/memory-update.d.ts +11 -0
  81. package/dist/tools/memory-update.d.ts.map +1 -0
  82. package/dist/tools/memory-update.js +142 -0
  83. package/dist/tools/memory-update.js.map +1 -0
  84. package/dist/tools/style-extract.d.ts +40 -0
  85. package/dist/tools/style-extract.d.ts.map +1 -0
  86. package/dist/tools/style-extract.js +43 -0
  87. package/dist/tools/style-extract.js.map +1 -0
  88. package/dist/tools/utils.d.ts +28 -0
  89. package/dist/tools/utils.d.ts.map +1 -0
  90. package/dist/tools/utils.js +33 -0
  91. package/dist/tools/utils.js.map +1 -0
  92. package/dist/types.d.ts +216 -0
  93. package/dist/types.d.ts.map +1 -0
  94. package/dist/types.js +6 -0
  95. package/dist/types.js.map +1 -0
  96. package/dist/validation.d.ts +122 -0
  97. package/dist/validation.d.ts.map +1 -0
  98. package/dist/validation.js +96 -0
  99. package/dist/validation.js.map +1 -0
  100. package/dist/vector.d.ts +30 -0
  101. package/dist/vector.d.ts.map +1 -0
  102. package/dist/vector.js +90 -0
  103. package/dist/vector.js.map +1 -0
  104. package/package.json +75 -0
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Embedding provider abstraction for optional vector search.
3
+ *
4
+ * BYOK (Bring Your Own Key) — user configures provider via env vars:
5
+ * MNEMON_EMBEDDING_PROVIDER — "openai" | "ollama" (default: unset = disabled)
6
+ * MNEMON_EMBEDDING_API_KEY — API key (required for OpenAI)
7
+ * MNEMON_EMBEDDING_MODEL — model name (defaults per provider)
8
+ * MNEMON_EMBEDDING_DIMENSIONS — vector dimensions (default: 1024)
9
+ * MNEMON_OLLAMA_URL — Ollama API URL (default: http://localhost:11434)
10
+ */
11
+ export interface Embedder {
12
+ embed(text: string): Promise<Float32Array>;
13
+ embedBatch(texts: string[]): Promise<Float32Array[]>;
14
+ readonly dimensions: number;
15
+ readonly provider: string;
16
+ }
17
+ /**
18
+ * Create an embedder based on env vars. Returns null if no provider configured.
19
+ * Non-fatal — logs warning and returns null on configuration errors.
20
+ */
21
+ export declare function createEmbedder(): Embedder | null;
22
+ //# sourceMappingURL=embedder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embedder.d.ts","sourceRoot":"","sources":["../src/embedder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,WAAW,QAAQ;IACvB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAC3C,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IACrD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAsGD;;;GAGG;AACH,wBAAgB,cAAc,IAAI,QAAQ,GAAG,IAAI,CAchD"}
@@ -0,0 +1,109 @@
1
+ /**
2
+ * Embedding provider abstraction for optional vector search.
3
+ *
4
+ * BYOK (Bring Your Own Key) — user configures provider via env vars:
5
+ * MNEMON_EMBEDDING_PROVIDER — "openai" | "ollama" (default: unset = disabled)
6
+ * MNEMON_EMBEDDING_API_KEY — API key (required for OpenAI)
7
+ * MNEMON_EMBEDDING_MODEL — model name (defaults per provider)
8
+ * MNEMON_EMBEDDING_DIMENSIONS — vector dimensions (default: 1024)
9
+ * MNEMON_OLLAMA_URL — Ollama API URL (default: http://localhost:11434)
10
+ */
11
+ class OpenAIEmbedder {
12
+ provider = "openai";
13
+ dimensions;
14
+ apiKey;
15
+ model;
16
+ baseUrl;
17
+ constructor() {
18
+ const key = process.env["MNEMON_EMBEDDING_API_KEY"] ?? process.env["OPENAI_API_KEY"];
19
+ if (!key) {
20
+ throw new Error("MNEMON_EMBEDDING_API_KEY or OPENAI_API_KEY required for OpenAI embeddings");
21
+ }
22
+ this.apiKey = key;
23
+ this.model = process.env["MNEMON_EMBEDDING_MODEL"] ?? "text-embedding-3-small";
24
+ this.dimensions = parseInt(process.env["MNEMON_EMBEDDING_DIMENSIONS"] ?? "1024", 10);
25
+ this.baseUrl = process.env["OPENAI_BASE_URL"] ?? "https://api.openai.com/v1";
26
+ }
27
+ async embed(text) {
28
+ const [result] = await this.embedBatch([text]);
29
+ return result;
30
+ }
31
+ async embedBatch(texts) {
32
+ const response = await fetch(`${this.baseUrl}/embeddings`, {
33
+ method: "POST",
34
+ headers: {
35
+ "Content-Type": "application/json",
36
+ Authorization: `Bearer ${this.apiKey}`,
37
+ },
38
+ body: JSON.stringify({
39
+ model: this.model,
40
+ input: texts,
41
+ dimensions: this.dimensions,
42
+ encoding_format: "float",
43
+ }),
44
+ });
45
+ if (!response.ok) {
46
+ const body = await response.text();
47
+ throw new Error(`OpenAI embeddings API error ${response.status}: ${body}`);
48
+ }
49
+ const json = (await response.json());
50
+ // Sort by index to maintain input order
51
+ const sorted = json.data.sort((a, b) => a.index - b.index);
52
+ return sorted.map((d) => new Float32Array(d.embedding));
53
+ }
54
+ }
55
+ class OllamaEmbedder {
56
+ provider = "ollama";
57
+ dimensions;
58
+ model;
59
+ baseUrl;
60
+ constructor() {
61
+ this.model = process.env["MNEMON_EMBEDDING_MODEL"] ?? "nomic-embed-text";
62
+ this.dimensions = parseInt(process.env["MNEMON_EMBEDDING_DIMENSIONS"] ?? "768", 10);
63
+ this.baseUrl = process.env["MNEMON_OLLAMA_URL"] ?? "http://localhost:11434";
64
+ }
65
+ async embed(text) {
66
+ const response = await fetch(`${this.baseUrl}/api/embed`, {
67
+ method: "POST",
68
+ headers: { "Content-Type": "application/json" },
69
+ body: JSON.stringify({ model: this.model, input: text }),
70
+ });
71
+ if (!response.ok) {
72
+ const body = await response.text();
73
+ throw new Error(`Ollama embeddings error ${response.status}: ${body}`);
74
+ }
75
+ const json = (await response.json());
76
+ return new Float32Array(json.embeddings[0]);
77
+ }
78
+ async embedBatch(texts) {
79
+ const response = await fetch(`${this.baseUrl}/api/embed`, {
80
+ method: "POST",
81
+ headers: { "Content-Type": "application/json" },
82
+ body: JSON.stringify({ model: this.model, input: texts }),
83
+ });
84
+ if (!response.ok) {
85
+ const body = await response.text();
86
+ throw new Error(`Ollama embeddings error ${response.status}: ${body}`);
87
+ }
88
+ const json = (await response.json());
89
+ return json.embeddings.map((e) => new Float32Array(e));
90
+ }
91
+ }
92
+ /**
93
+ * Create an embedder based on env vars. Returns null if no provider configured.
94
+ * Non-fatal — logs warning and returns null on configuration errors.
95
+ */
96
+ export function createEmbedder() {
97
+ const provider = process.env["MNEMON_EMBEDDING_PROVIDER"];
98
+ if (!provider || provider === "none")
99
+ return null;
100
+ switch (provider) {
101
+ case "openai":
102
+ return new OpenAIEmbedder();
103
+ case "ollama":
104
+ return new OllamaEmbedder();
105
+ default:
106
+ throw new Error(`Unknown MNEMON_EMBEDDING_PROVIDER: "${provider}". Supported: openai, ollama`);
107
+ }
108
+ }
109
+ //# sourceMappingURL=embedder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embedder.js","sourceRoot":"","sources":["../src/embedder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AASH,MAAM,cAAc;IACT,QAAQ,GAAG,QAAQ,CAAC;IACpB,UAAU,CAAS;IACX,MAAM,CAAS;IACf,KAAK,CAAS;IACd,OAAO,CAAS;IAEjC;QACE,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QACrF,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,IAAI,KAAK,CACb,2EAA2E,CAC5E,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC;QAClB,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,IAAI,wBAAwB,CAAC;QAC/E,IAAI,CAAC,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,IAAI,MAAM,EAAE,EAAE,CAAC,CAAC;QACrF,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,2BAA2B,CAAC;IAC/E,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,IAAY;QACtB,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAC/C,OAAO,MAAO,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,KAAe;QAC9B,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,aAAa,EAAE;YACzD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,aAAa,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE;aACvC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,KAAK,EAAE,KAAK;gBACZ,UAAU,EAAE,IAAI,CAAC,UAAU;gBAC3B,eAAe,EAAE,OAAO;aACzB,CAAC;SACH,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,+BAA+B,QAAQ,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC,CAAC;QAC7E,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAElC,CAAC;QAEF,wCAAwC;QACxC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;QAC3D,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;IAC1D,CAAC;CACF;AAED,MAAM,cAAc;IACT,QAAQ,GAAG,QAAQ,CAAC;IACpB,UAAU,CAAS;IACX,KAAK,CAAS;IACd,OAAO,CAAS;IAEjC;QACE,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,IAAI,kBAAkB,CAAC;QACzE,IAAI,CAAC,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,IAAI,KAAK,EAAE,EAAE,CAAC,CAAC;QACpF,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,IAAI,wBAAwB,CAAC;IAC9E,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,IAAY;QACtB,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,YAAY,EAAE;YACxD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;SACzD,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,2BAA2B,QAAQ,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC,CAAC;QACzE,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAA+B,CAAC;QACnE,OAAO,IAAI,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAE,CAAC,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,KAAe;QAC9B,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,YAAY,EAAE;YACxD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;SAC1D,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,2BAA2B,QAAQ,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC,CAAC;QACzE,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAA+B,CAAC;QACnE,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;IACzD,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc;IAC5B,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;IAC1D,IAAI,CAAC,QAAQ,IAAI,QAAQ,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC;IAElD,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,QAAQ;YACX,OAAO,IAAI,cAAc,EAAE,CAAC;QAC9B,KAAK,QAAQ;YACX,OAAO,IAAI,cAAc,EAAE,CAAC;QAC9B;YACE,MAAM,IAAI,KAAK,CACb,uCAAuC,QAAQ,8BAA8B,CAC9E,CAAC;IACN,CAAC;AACH,CAAC"}
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * CLI entry point for KB import pipeline.
4
+ *
5
+ * Usage:
6
+ * tsx src/import/cli.ts --kb-path ~/dev/mnemon-kb
7
+ * tsx src/import/cli.ts --file ~/dev/mnemon-kb/beliefs/worldview.md --layer semantic
8
+ * tsx src/import/cli.ts --kb-path ~/dev/mnemon-kb --dry-run
9
+ * tsx src/import/cli.ts --kb-path ~/dev/mnemon-kb --verbose
10
+ */
11
+ export {};
12
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/import/cli.ts"],"names":[],"mappings":";AACA;;;;;;;;GAQG"}
@@ -0,0 +1,105 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * CLI entry point for KB import pipeline.
4
+ *
5
+ * Usage:
6
+ * tsx src/import/cli.ts --kb-path ~/dev/mnemon-kb
7
+ * tsx src/import/cli.ts --file ~/dev/mnemon-kb/beliefs/worldview.md --layer semantic
8
+ * tsx src/import/cli.ts --kb-path ~/dev/mnemon-kb --dry-run
9
+ * tsx src/import/cli.ts --kb-path ~/dev/mnemon-kb --verbose
10
+ */
11
+ import { runImport } from "./kb-import.js";
12
+ function parseArgs(args) {
13
+ const result = { dryRun: false, verbose: false, force: false };
14
+ for (let i = 0; i < args.length; i++) {
15
+ const arg = args[i];
16
+ const next = args[i + 1];
17
+ switch (arg) {
18
+ case "--kb-path":
19
+ result.kbPath = next;
20
+ i++;
21
+ break;
22
+ case "--config":
23
+ result.configPath = next;
24
+ i++;
25
+ break;
26
+ case "--file":
27
+ result.file = next;
28
+ i++;
29
+ break;
30
+ case "--layer":
31
+ result.layer = next;
32
+ i++;
33
+ break;
34
+ case "--dry-run":
35
+ result.dryRun = true;
36
+ break;
37
+ case "--force":
38
+ result.force = true;
39
+ break;
40
+ case "--verbose":
41
+ case "-v":
42
+ result.verbose = true;
43
+ break;
44
+ }
45
+ }
46
+ return result;
47
+ }
48
+ function printSummary(result, dryRun) {
49
+ const prefix = dryRun ? "[DRY RUN] " : "";
50
+ console.log(`\n${prefix}═══ Import Summary ═══`);
51
+ console.log(`Files processed: ${result.filesProcessed}`);
52
+ console.log(`Files skipped: ${result.filesSkipped} (unchanged)`);
53
+ console.log(`Memories created: ${result.memoriesCreated}`);
54
+ console.log(`Memories superseded: ${result.memoriesSuperseded}`);
55
+ if (result.errors.length > 0) {
56
+ console.log(`\nErrors (${result.errors.length}):`);
57
+ for (const err of result.errors) {
58
+ console.log(` ✗ ${err.file}: ${err.error}`);
59
+ }
60
+ }
61
+ // Detail table
62
+ const imported = result.details.filter((d) => d.status === "imported");
63
+ const updated = result.details.filter((d) => d.status === "updated");
64
+ const skipped = result.details.filter((d) => d.status === "skipped");
65
+ if (imported.length > 0) {
66
+ console.log(`\nImported (${imported.length}):`);
67
+ for (const d of imported) {
68
+ console.log(` + ${d.file} (${d.sections} sections)`);
69
+ }
70
+ }
71
+ if (updated.length > 0) {
72
+ console.log(`\nUpdated (${updated.length}):`);
73
+ for (const d of updated) {
74
+ console.log(` ~ ${d.file} (${d.sections} sections)`);
75
+ }
76
+ }
77
+ if (skipped.length > 0) {
78
+ console.log(`\nSkipped (${skipped.length}): ${skipped.map((d) => d.file).join(", ")}`);
79
+ }
80
+ }
81
+ // ── Main ──
82
+ const args = parseArgs(process.argv.slice(2));
83
+ if (!args.kbPath && !args.file) {
84
+ console.error("Usage: tsx src/import/cli.ts --kb-path <path> [--config <path>] [--dry-run] [--verbose]");
85
+ console.error(" tsx src/import/cli.ts --file <path> --layer <layer> [--config <path>]");
86
+ process.exit(1);
87
+ }
88
+ try {
89
+ const result = runImport({
90
+ kbPath: args.kbPath ?? ".",
91
+ configPath: args.configPath,
92
+ singleFile: args.file,
93
+ singleLayer: args.layer,
94
+ dryRun: args.dryRun,
95
+ verbose: args.verbose,
96
+ force: args.force,
97
+ });
98
+ printSummary(result, args.dryRun);
99
+ process.exit(result.errors.length > 0 ? 1 : 0);
100
+ }
101
+ catch (err) {
102
+ console.error(`Fatal: ${err instanceof Error ? err.message : err}`);
103
+ process.exit(1);
104
+ }
105
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/import/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Config loader for KB import pipeline.
3
+ * Reads directory mappings from a JSON config file instead of hardcoded TypeScript.
4
+ *
5
+ * Resolution order:
6
+ * 1. --config CLI flag
7
+ * 2. MNEMON_CONFIG_PATH env var
8
+ * 3. ~/.mnemon-mcp/config.json
9
+ *
10
+ * If no config found, returns empty mappings with a helpful message to stderr.
11
+ */
12
+ import type { DirectoryMapping, FileMapping } from "./kb-config.js";
13
+ declare const DEFAULT_CONFIG_PATH: string;
14
+ export interface LoadedConfig {
15
+ mappings: DirectoryMapping[];
16
+ externalFiles: Array<{
17
+ path: string;
18
+ mapping: FileMapping;
19
+ }>;
20
+ ownerName?: string | undefined;
21
+ extraStopWords: string[];
22
+ }
23
+ /**
24
+ * Load config from JSON file. Returns empty config if file not found.
25
+ * @param configPath - explicit path to config file (overrides default)
26
+ */
27
+ export declare function loadConfig(configPath?: string): LoadedConfig;
28
+ export { DEFAULT_CONFIG_PATH };
29
+ //# sourceMappingURL=config-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-loader.d.ts","sourceRoot":"","sources":["../../src/import/config-loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAMH,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AA4CpE,QAAA,MAAM,mBAAmB,QAAgD,CAAC;AAI1E,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,gBAAgB,EAAE,CAAC;IAC7B,aAAa,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,WAAW,CAAA;KAAE,CAAC,CAAC;IAC7D,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,YAAY,CAqC5D;AA4DD,OAAO,EAAE,mBAAmB,EAAE,CAAC"}
@@ -0,0 +1,140 @@
1
+ /**
2
+ * Config loader for KB import pipeline.
3
+ * Reads directory mappings from a JSON config file instead of hardcoded TypeScript.
4
+ *
5
+ * Resolution order:
6
+ * 1. --config CLI flag
7
+ * 2. MNEMON_CONFIG_PATH env var
8
+ * 3. ~/.mnemon-mcp/config.json
9
+ *
10
+ * If no config found, returns empty mappings with a helpful message to stderr.
11
+ */
12
+ import { readFileSync, existsSync } from "node:fs";
13
+ import { homedir } from "node:os";
14
+ import { join } from "node:path";
15
+ import { z } from "zod";
16
+ // ── JSON config schema (Zod-validated) ──
17
+ const LayerEnum = z.enum(["episodic", "semantic", "procedural", "resource"]);
18
+ const EntityTypeEnum = z.enum(["user", "project", "person", "concept", "file", "rule", "tool"]);
19
+ const SplitEnum = z.enum(["whole", "h2", "h3"]);
20
+ const ConfigMappingSchema = z.object({
21
+ glob: z.string().min(1),
22
+ layer: LayerEnum,
23
+ entity_type: EntityTypeEnum,
24
+ entity_name: z.string().optional(),
25
+ importance: z.number().min(0).max(1),
26
+ confidence: z.number().min(0).max(1),
27
+ split: SplitEnum,
28
+ file_pattern: z.string().optional(),
29
+ scope: z.string().optional(),
30
+ });
31
+ const ConfigExternalFileSchema = z.object({
32
+ path: z.string().min(1),
33
+ mapping: z.object({
34
+ layer: LayerEnum,
35
+ entity_type: EntityTypeEnum,
36
+ entity_name: z.string().optional(),
37
+ importance: z.number().min(0).max(1),
38
+ confidence: z.number().min(0).max(1),
39
+ split: SplitEnum,
40
+ scope: z.string().optional(),
41
+ }),
42
+ });
43
+ const ConfigJsonSchema = z.object({
44
+ owner_name: z.string().optional(),
45
+ extra_stop_words: z.array(z.string()).optional(),
46
+ mappings: z.array(ConfigMappingSchema),
47
+ external_files: z.array(ConfigExternalFileSchema).optional(),
48
+ });
49
+ // ── Default config path ──
50
+ const DEFAULT_CONFIG_PATH = join(homedir(), ".mnemon-mcp", "config.json");
51
+ /**
52
+ * Load config from JSON file. Returns empty config if file not found.
53
+ * @param configPath - explicit path to config file (overrides default)
54
+ */
55
+ export function loadConfig(configPath) {
56
+ const resolvedPath = configPath ??
57
+ process.env["MNEMON_CONFIG_PATH"] ??
58
+ DEFAULT_CONFIG_PATH;
59
+ if (!existsSync(resolvedPath)) {
60
+ if (!configPath && !process.env["MNEMON_CONFIG_PATH"]) {
61
+ // Default path not found — first run, guide the user
62
+ console.error(`[mnemon] No config found at ${resolvedPath}\n` +
63
+ ` Create one from the example: cp config.example.json ~/.mnemon-mcp/config.json\n` +
64
+ ` Or specify: --config <path> or MNEMON_CONFIG_PATH env var\n` +
65
+ ` Running with empty mappings (no files will be imported).`);
66
+ }
67
+ else {
68
+ console.error(`[mnemon] Config file not found: ${resolvedPath}`);
69
+ }
70
+ return { mappings: [], externalFiles: [], extraStopWords: [] };
71
+ }
72
+ let raw;
73
+ try {
74
+ raw = readFileSync(resolvedPath, "utf8");
75
+ }
76
+ catch (err) {
77
+ throw new Error(`Failed to read config: ${resolvedPath}: ${err}`);
78
+ }
79
+ let json;
80
+ try {
81
+ const parsed = JSON.parse(raw);
82
+ json = ConfigJsonSchema.parse(parsed);
83
+ }
84
+ catch (err) {
85
+ throw new Error(`Invalid config at ${resolvedPath}: ${err}`);
86
+ }
87
+ return parseConfig(json);
88
+ }
89
+ /** Convert JSON config into runtime DirectoryMapping[] */
90
+ function parseConfig(json) {
91
+ const ownerName = json.owner_name;
92
+ const mappings = json.mappings.map((m) => {
93
+ let entityName = m.entity_name;
94
+ if (entityName === "$owner") {
95
+ entityName = ownerName;
96
+ }
97
+ const mapping = {
98
+ glob: m.glob,
99
+ layer: m.layer,
100
+ entity_type: m.entity_type,
101
+ importance: m.importance,
102
+ confidence: m.confidence,
103
+ split: m.split,
104
+ ...(entityName ? { entity_name: entityName } : {}),
105
+ ...(m.scope ? { scope: m.scope } : {}),
106
+ };
107
+ // Convert regex string to filter function
108
+ if (m.file_pattern) {
109
+ const regex = new RegExp(m.file_pattern);
110
+ mapping.fileFilter = (filename) => regex.test(filename);
111
+ }
112
+ return mapping;
113
+ });
114
+ const externalFiles = (json.external_files ?? []).map((ext) => {
115
+ let entityName = ext.mapping.entity_name;
116
+ if (entityName === "$owner") {
117
+ entityName = ownerName;
118
+ }
119
+ return {
120
+ path: ext.path,
121
+ mapping: {
122
+ layer: ext.mapping.layer,
123
+ entity_type: ext.mapping.entity_type,
124
+ importance: ext.mapping.importance,
125
+ confidence: ext.mapping.confidence,
126
+ split: ext.mapping.split,
127
+ ...(entityName ? { entity_name: entityName } : {}),
128
+ ...(ext.mapping.scope ? { scope: ext.mapping.scope } : {}),
129
+ },
130
+ };
131
+ });
132
+ return {
133
+ mappings,
134
+ externalFiles,
135
+ ownerName,
136
+ extraStopWords: json.extra_stop_words ?? [],
137
+ };
138
+ }
139
+ export { DEFAULT_CONFIG_PATH };
140
+ //# sourceMappingURL=config-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-loader.js","sourceRoot":"","sources":["../../src/import/config-loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,2CAA2C;AAE3C,MAAM,SAAS,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,CAAC,CAAC,CAAC;AAC7E,MAAM,cAAc,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AAChG,MAAM,SAAS,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;AAEhD,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,KAAK,EAAE,SAAS;IAChB,WAAW,EAAE,cAAc;IAC3B,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAClC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACpC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACpC,KAAK,EAAE,SAAS;IAChB,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACnC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC7B,CAAC,CAAC;AAEH,MAAM,wBAAwB,GAAG,CAAC,CAAC,MAAM,CAAC;IACxC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC;QAChB,KAAK,EAAE,SAAS;QAChB,WAAW,EAAE,cAAc;QAC3B,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAClC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACpC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACpC,KAAK,EAAE,SAAS;QAChB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;KAC7B,CAAC;CACH,CAAC,CAAC;AAEH,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IAChC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACjC,gBAAgB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IAChD,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,mBAAmB,CAAC;IACtC,cAAc,EAAE,CAAC,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC,QAAQ,EAAE;CAC7D,CAAC,CAAC;AAIH,4BAA4B;AAE5B,MAAM,mBAAmB,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,aAAa,CAAC,CAAC;AAW1E;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,UAAmB;IAC5C,MAAM,YAAY,GAChB,UAAU;QACV,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC;QACjC,mBAAmB,CAAC;IAEtB,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC9B,IAAI,CAAC,UAAU,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,EAAE,CAAC;YACtD,qDAAqD;YACrD,OAAO,CAAC,KAAK,CACX,+BAA+B,YAAY,IAAI;gBAC7C,mFAAmF;gBACnF,+DAA+D;gBAC/D,4DAA4D,CAC/D,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,mCAAmC,YAAY,EAAE,CAAC,CAAC;QACnE,CAAC;QACD,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE,cAAc,EAAE,EAAE,EAAE,CAAC;IACjE,CAAC;IAED,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IAC3C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,0BAA0B,YAAY,KAAK,GAAG,EAAE,CAAC,CAAC;IACpE,CAAC;IAED,IAAI,IAAgB,CAAC;IACrB,IAAI,CAAC;QACH,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACxC,IAAI,GAAG,gBAAgB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACxC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,qBAAqB,YAAY,KAAK,GAAG,EAAE,CAAC,CAAC;IAC/D,CAAC;IAED,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC;AAC3B,CAAC;AAED,0DAA0D;AAC1D,SAAS,WAAW,CAAC,IAAgB;IACnC,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC;IAElC,MAAM,QAAQ,GAAuB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QAC3D,IAAI,UAAU,GAAG,CAAC,CAAC,WAAW,CAAC;QAC/B,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;YAC5B,UAAU,GAAG,SAAS,CAAC;QACzB,CAAC;QAED,MAAM,OAAO,GAAqB;YAChC,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,UAAU,EAAE,CAAC,CAAC,UAAU;YACxB,UAAU,EAAE,CAAC,CAAC,UAAU;YACxB,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAClD,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACvC,CAAC;QAEF,0CAA0C;QAC1C,IAAI,CAAC,CAAC,YAAY,EAAE,CAAC;YACnB,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;YACzC,OAAO,CAAC,UAAU,GAAG,CAAC,QAAgB,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAClE,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC,CAAC;IAEH,MAAM,aAAa,GAAG,CAAC,IAAI,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QAC5D,IAAI,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC;QACzC,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;YAC5B,UAAU,GAAG,SAAS,CAAC;QACzB,CAAC;QAED,OAAO;YACL,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,OAAO,EAAE;gBACP,KAAK,EAAE,GAAG,CAAC,OAAO,CAAC,KAAK;gBACxB,WAAW,EAAE,GAAG,CAAC,OAAO,CAAC,WAAW;gBACpC,UAAU,EAAE,GAAG,CAAC,OAAO,CAAC,UAAU;gBAClC,UAAU,EAAE,GAAG,CAAC,OAAO,CAAC,UAAU;gBAClC,KAAK,EAAE,GAAG,CAAC,OAAO,CAAC,KAAK;gBACxB,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAClD,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC5C;SACjB,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,QAAQ;QACR,aAAa;QACb,SAAS;QACT,cAAc,EAAE,IAAI,CAAC,gBAAgB,IAAI,EAAE;KAC5C,CAAC;AACJ,CAAC;AAED,OAAO,EAAE,mBAAmB,EAAE,CAAC"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * KB import configuration types.
3
+ *
4
+ * Actual mappings are loaded at runtime from ~/.mnemon-mcp/config.json
5
+ * (or MNEMON_CONFIG_PATH env var). See config-loader.ts.
6
+ *
7
+ * For the config file format, see config.example.json in the repo root.
8
+ */
9
+ import type { EntityType, Layer } from "../types.js";
10
+ export interface FileMapping {
11
+ layer: Layer;
12
+ entity_type: EntityType;
13
+ importance: number;
14
+ confidence: number;
15
+ split: "whole" | "h2" | "h3";
16
+ /** entity_name to use; "from-heading" extracts from H2/H3 heading text */
17
+ entity_name?: string | "from-heading";
18
+ scope?: string;
19
+ }
20
+ export interface DirectoryMapping extends Omit<FileMapping, "split"> {
21
+ /** glob pattern relative to KB root */
22
+ glob: string;
23
+ split: "whole" | "h2" | "h3";
24
+ /** filter function for filenames (e.g. only 2026-*.md) */
25
+ fileFilter?: (filename: string) => boolean;
26
+ }
27
+ //# sourceMappingURL=kb-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kb-config.d.ts","sourceRoot":"","sources":["../../src/import/kb-config.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAErD,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,KAAK,CAAC;IACb,WAAW,EAAE,UAAU,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,OAAO,GAAG,IAAI,GAAG,IAAI,CAAC;IAC7B,0EAA0E;IAC1E,WAAW,CAAC,EAAE,MAAM,GAAG,cAAc,CAAC;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,gBAAiB,SAAQ,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC;IAClE,uCAAuC;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,OAAO,GAAG,IAAI,GAAG,IAAI,CAAC;IAC7B,0DAA0D;IAC1D,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC;CAC5C"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * KB import configuration types.
3
+ *
4
+ * Actual mappings are loaded at runtime from ~/.mnemon-mcp/config.json
5
+ * (or MNEMON_CONFIG_PATH env var). See config-loader.ts.
6
+ *
7
+ * For the config file format, see config.example.json in the repo root.
8
+ */
9
+ export {};
10
+ //# sourceMappingURL=kb-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kb-config.js","sourceRoot":"","sources":["../../src/import/kb-config.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * KB import pipeline — reads markdown files from mnemon-kb, splits into memories,
3
+ * and inserts into mnemon-mcp SQLite database.
4
+ *
5
+ * Idempotent: uses import_log + file_hash for dedup.
6
+ * Superseding: re-import of changed files supersedes old memories via source_file.
7
+ */
8
+ import type Database from "better-sqlite3";
9
+ import type { Layer } from "../types.js";
10
+ import { type FileMapping } from "./kb-config.js";
11
+ export interface ImportOptions {
12
+ kbPath: string;
13
+ configPath?: string | undefined;
14
+ dryRun?: boolean | undefined;
15
+ singleFile?: string | undefined;
16
+ singleLayer?: Layer | undefined;
17
+ verbose?: boolean | undefined;
18
+ force?: boolean | undefined;
19
+ }
20
+ export interface ImportResult {
21
+ filesProcessed: number;
22
+ filesSkipped: number;
23
+ memoriesCreated: number;
24
+ memoriesSuperseded: number;
25
+ errors: Array<{
26
+ file: string;
27
+ error: string;
28
+ }>;
29
+ details: Array<{
30
+ file: string;
31
+ sections: number;
32
+ status: "imported" | "skipped" | "updated" | "error";
33
+ }>;
34
+ }
35
+ /** Process a single file with its mapping */
36
+ export declare function processFile(db: Database.Database, filePath: string, mapping: FileMapping, kbPath: string, dryRun: boolean, verbose: boolean, force?: boolean): {
37
+ sections: number;
38
+ created: number;
39
+ superseded: number;
40
+ status: "imported" | "skipped" | "updated" | "error";
41
+ error?: string;
42
+ };
43
+ /** Main import function */
44
+ export declare function runImport(options: ImportOptions): ImportResult;
45
+ //# sourceMappingURL=kb-import.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kb-import.d.ts","sourceRoot":"","sources":["../../src/import/kb-import.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAG3C,OAAO,KAAK,EAAE,KAAK,EAA8B,MAAM,aAAa,CAAC;AACrE,OAAO,EAEL,KAAK,WAAW,EACjB,MAAM,gBAAgB,CAAC;AASxB,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC7B,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,WAAW,CAAC,EAAE,KAAK,GAAG,SAAS,CAAC;IAChC,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC9B,KAAK,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAC7B;AAED,MAAM,WAAW,YAAY;IAC3B,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,OAAO,EAAE,KAAK,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,UAAU,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;KACtD,CAAC,CAAC;CACJ;AA4FD,6CAA6C;AAC7C,wBAAgB,WAAW,CACzB,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,WAAW,EACpB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,OAAO,EACf,OAAO,EAAE,OAAO,EAChB,KAAK,GAAE,OAAe,GACrB;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,UAAU,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAiGjI;AAED,2BAA2B;AAC3B,wBAAgB,SAAS,CAAC,OAAO,EAAE,aAAa,GAAG,YAAY,CA0H9D"}