@noesis-brain/mcp-server 2.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 (47) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +218 -0
  3. package/dist/api/NoesisClient.d.ts +501 -0
  4. package/dist/api/NoesisClient.d.ts.map +1 -0
  5. package/dist/api/NoesisClient.js +654 -0
  6. package/dist/api/NoesisClient.js.map +1 -0
  7. package/dist/cli/setup.d.ts +8 -0
  8. package/dist/cli/setup.d.ts.map +1 -0
  9. package/dist/cli/setup.js +148 -0
  10. package/dist/cli/setup.js.map +1 -0
  11. package/dist/database/PostgresAdapter.d.ts +385 -0
  12. package/dist/database/PostgresAdapter.d.ts.map +1 -0
  13. package/dist/database/PostgresAdapter.js +1043 -0
  14. package/dist/database/PostgresAdapter.js.map +1 -0
  15. package/dist/index.d.ts +31 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +126 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/services/embedding.d.ts +38 -0
  20. package/dist/services/embedding.d.ts.map +1 -0
  21. package/dist/services/embedding.js +126 -0
  22. package/dist/services/embedding.js.map +1 -0
  23. package/dist/tools/SyncStateManager.d.ts +65 -0
  24. package/dist/tools/SyncStateManager.d.ts.map +1 -0
  25. package/dist/tools/SyncStateManager.js +217 -0
  26. package/dist/tools/SyncStateManager.js.map +1 -0
  27. package/dist/tools/index.d.ts +14 -0
  28. package/dist/tools/index.d.ts.map +1 -0
  29. package/dist/tools/index.js +3345 -0
  30. package/dist/tools/index.js.map +1 -0
  31. package/dist/tools/navis.d.ts +11 -0
  32. package/dist/tools/navis.d.ts.map +1 -0
  33. package/dist/tools/navis.js +231 -0
  34. package/dist/tools/navis.js.map +1 -0
  35. package/dist/types/index.d.ts +104 -0
  36. package/dist/types/index.d.ts.map +1 -0
  37. package/dist/types/index.js +5 -0
  38. package/dist/types/index.js.map +1 -0
  39. package/dist/utils/suggestPath.d.ts +15 -0
  40. package/dist/utils/suggestPath.d.ts.map +1 -0
  41. package/dist/utils/suggestPath.js +52 -0
  42. package/dist/utils/suggestPath.js.map +1 -0
  43. package/package.json +71 -0
  44. package/scripts/noesis-sync.mjs +469 -0
  45. package/skill-templates/noesis-refine-note.md +92 -0
  46. package/skill-templates/noesis-sync.md +110 -0
  47. package/templates/claude-md-block.md +22 -0
@@ -0,0 +1,217 @@
1
+ /**
2
+ * SyncStateManager - Hash-based three-way sync comparison + baseline content store
3
+ *
4
+ * State JSON at {rootPath}/.noesis/.sync-state.json:
5
+ * v1 (legacy): { version: 1, hashes: { relPath: hash } }
6
+ * v2 (current): { version: 2, entries: { relPath: { hash, lastSyncedAt } } }
7
+ * Both are accepted on load; v1 is rewritten as v2 on next save.
8
+ *
9
+ * Baseline content: {rootPath}/.noesis/baseline/{relPath} mirrors the exact markdown
10
+ * last successfully synced. Required by the MCP three-tier conflict cascade
11
+ * (anchor reapply → node-diff3 → structured BASE/LOCAL/CLOUD report).
12
+ */
13
+ import * as fs from 'fs';
14
+ import * as path from 'path';
15
+ /**
16
+ * Determine sync direction using three-way hash comparison.
17
+ *
18
+ * Extra defense: when `cloudEditedOnlineAt` is newer than `baselineLastSyncedAt`,
19
+ * cloud counts as changed-since-baseline even if the cloud hash happens to match
20
+ * baseline (defense against hash collisions and metadata-only re-hash drift).
21
+ */
22
+ export function determineSyncDirection(localHash, cloudHash, baselineHash, localMtime, cloudMtime, cloudEditedOnlineAt, baselineLastSyncedAt) {
23
+ // Same content on both sides — nothing to do
24
+ if (localHash === cloudHash)
25
+ return 'skip';
26
+ // Baseline exists — three-way comparison
27
+ if (baselineHash !== undefined) {
28
+ const localChanged = localHash !== baselineHash;
29
+ let cloudChanged = cloudHash !== baselineHash;
30
+ // Defense: trust the explicit edited_online_at signal when it postdates baseline.
31
+ if (!cloudChanged &&
32
+ cloudEditedOnlineAt &&
33
+ (!baselineLastSyncedAt || new Date(cloudEditedOnlineAt) > new Date(baselineLastSyncedAt))) {
34
+ cloudChanged = true;
35
+ }
36
+ if (localChanged && !cloudChanged)
37
+ return 'push';
38
+ if (!localChanged && cloudChanged)
39
+ return 'pull';
40
+ if (localChanged && cloudChanged)
41
+ return 'conflict';
42
+ return 'skip';
43
+ }
44
+ // No baseline — fall back to timestamp comparison (existing behavior)
45
+ const TOLERANCE_MS = 1000;
46
+ const timeDiff = localMtime - cloudMtime;
47
+ if (Math.abs(timeDiff) < TOLERANCE_MS)
48
+ return 'conflict';
49
+ return timeDiff > 0 ? 'push' : 'pull';
50
+ }
51
+ export class SyncStateManager {
52
+ statePath;
53
+ baselineDir;
54
+ state = null;
55
+ dirty = false;
56
+ normalizeKey(relativePath) {
57
+ let normalized = relativePath.replace(/\\/g, '/');
58
+ if (normalized.length >= 2 && normalized[1] === ':') {
59
+ normalized = normalized[0].toLowerCase() + normalized.slice(1);
60
+ }
61
+ return normalized;
62
+ }
63
+ constructor(rootPath) {
64
+ this.statePath = path.join(rootPath, '.noesis', '.sync-state.json');
65
+ this.baselineDir = path.join(rootPath, '.noesis', 'baseline');
66
+ }
67
+ /**
68
+ * Load state from disk. Accepts both v1 and v2; upgrades v1 to v2 in memory
69
+ * (re-written to disk on next save).
70
+ */
71
+ load() {
72
+ try {
73
+ if (fs.existsSync(this.statePath)) {
74
+ const raw = fs.readFileSync(this.statePath, 'utf-8');
75
+ const parsed = JSON.parse(raw);
76
+ if (parsed && parsed.version === 2 && typeof parsed.entries === 'object') {
77
+ this.state = parsed;
78
+ this.dirty = false;
79
+ }
80
+ else if (parsed && parsed.version === 1 && typeof parsed.hashes === 'object') {
81
+ // v1 → v2 upgrade: lastSyncedAt unknown; baseline files absent until next successful sync.
82
+ const v1 = parsed;
83
+ const entries = {};
84
+ for (const [k, hash] of Object.entries(v1.hashes)) {
85
+ entries[k] = { hash, lastSyncedAt: undefined };
86
+ }
87
+ this.state = { version: 2, entries };
88
+ this.dirty = true; // re-save as v2 next chance
89
+ }
90
+ else {
91
+ this.state = null;
92
+ this.dirty = false;
93
+ }
94
+ }
95
+ else {
96
+ this.state = null;
97
+ this.dirty = false;
98
+ }
99
+ }
100
+ catch {
101
+ // Corrupted file — start fresh
102
+ this.state = null;
103
+ this.dirty = false;
104
+ }
105
+ }
106
+ /** Get the baseline hash for a file from the last successful sync. */
107
+ getBaseline(relativePath) {
108
+ return this.state?.entries[this.normalizeKey(relativePath)]?.hash;
109
+ }
110
+ /** Get the full baseline metadata (hash + lastSyncedAt). */
111
+ getBaselineMeta(relativePath) {
112
+ return this.state?.entries[this.normalizeKey(relativePath)];
113
+ }
114
+ /**
115
+ * Set the baseline hash + lastSyncedAt after a successful sync operation.
116
+ * Optionally provide content to mirror under .noesis/baseline/<relPath>.
117
+ *
118
+ * Backward-compat: callers may pass just `(relativePath, hash)` (string) — old shape.
119
+ */
120
+ setBaseline(relativePath, hashOrMeta, content) {
121
+ const meta = typeof hashOrMeta === 'string'
122
+ ? { hash: hashOrMeta, lastSyncedAt: undefined }
123
+ : hashOrMeta;
124
+ if (!this.state) {
125
+ this.state = { version: 2, entries: {} };
126
+ }
127
+ const key = this.normalizeKey(relativePath);
128
+ const existing = this.state.entries[key];
129
+ if (!existing || existing.hash !== meta.hash || existing.lastSyncedAt !== meta.lastSyncedAt) {
130
+ this.state.entries[key] = { hash: meta.hash, lastSyncedAt: meta.lastSyncedAt };
131
+ this.dirty = true;
132
+ }
133
+ if (content !== undefined) {
134
+ this.writeBaselineContent(relativePath, content);
135
+ }
136
+ }
137
+ /** Remove baseline (state entry + on-disk content file) for a deleted/renamed file. */
138
+ removeBaseline(relativePath) {
139
+ const key = this.normalizeKey(relativePath);
140
+ if (this.state && key in this.state.entries) {
141
+ delete this.state.entries[key];
142
+ this.dirty = true;
143
+ }
144
+ this.removeBaselineContent(relativePath);
145
+ }
146
+ /**
147
+ * Remove baselines for paths not in the active set (cleanup deleted/renamed files).
148
+ * Also deletes corresponding baseline content files.
149
+ */
150
+ pruneStale(activePaths) {
151
+ if (!this.state)
152
+ return;
153
+ const normalizedActive = new Set();
154
+ for (const p of activePaths)
155
+ normalizedActive.add(this.normalizeKey(p));
156
+ for (const key of Object.keys(this.state.entries)) {
157
+ if (!normalizedActive.has(key)) {
158
+ delete this.state.entries[key];
159
+ this.dirty = true;
160
+ this.removeBaselineContent(key);
161
+ }
162
+ }
163
+ }
164
+ /** Read baseline content from disk. Returns undefined for v1-upgraded entries (no file). */
165
+ getBaselineContent(relativePath) {
166
+ const key = this.normalizeKey(relativePath);
167
+ const filePath = path.join(this.baselineDir, key);
168
+ try {
169
+ if (fs.existsSync(filePath))
170
+ return fs.readFileSync(filePath, 'utf-8');
171
+ }
172
+ catch {
173
+ // Baseline content is best-effort; tier C will fall back to two-way merge.
174
+ }
175
+ return undefined;
176
+ }
177
+ /** Write baseline content to disk under .noesis/baseline/<relPath>. */
178
+ setBaselineContent(relativePath, content) {
179
+ this.writeBaselineContent(relativePath, content);
180
+ }
181
+ writeBaselineContent(relativePath, content) {
182
+ const key = this.normalizeKey(relativePath);
183
+ const filePath = path.join(this.baselineDir, key);
184
+ try {
185
+ const dir = path.dirname(filePath);
186
+ if (!fs.existsSync(dir))
187
+ fs.mkdirSync(dir, { recursive: true });
188
+ fs.writeFileSync(filePath, content, 'utf-8');
189
+ }
190
+ catch (err) {
191
+ // Don't fail the sync if baseline write fails; tier A/B simply won't have a baseline next time.
192
+ console.warn(`Failed to write baseline content for ${relativePath}:`, err);
193
+ }
194
+ }
195
+ removeBaselineContent(relativePath) {
196
+ const key = this.normalizeKey(relativePath);
197
+ const filePath = path.join(this.baselineDir, key);
198
+ try {
199
+ if (fs.existsSync(filePath))
200
+ fs.unlinkSync(filePath);
201
+ }
202
+ catch {
203
+ // Best-effort cleanup
204
+ }
205
+ }
206
+ /** Write state to disk only if dirty. Creates .noesis dir if needed. */
207
+ save() {
208
+ if (!this.dirty || !this.state)
209
+ return;
210
+ const dir = path.dirname(this.statePath);
211
+ if (!fs.existsSync(dir))
212
+ fs.mkdirSync(dir, { recursive: true });
213
+ fs.writeFileSync(this.statePath, JSON.stringify(this.state, null, 2), 'utf-8');
214
+ this.dirty = false;
215
+ }
216
+ }
217
+ //# sourceMappingURL=SyncStateManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SyncStateManager.js","sourceRoot":"","sources":["../../src/tools/SyncStateManager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Tool registry for md-manager MCP server
3
+ */
4
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
5
+ import { NoesisClient } from '../api/NoesisClient.js';
6
+ export interface ToolServices {
7
+ client: NoesisClient;
8
+ geminiApiKey?: string;
9
+ }
10
+ /**
11
+ * Register all MCP tools with the server
12
+ */
13
+ export declare function registerTools(server: McpServer, services: ToolServices): void;
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAE,YAAY,EAAkG,MAAM,wBAAwB,CAAC;AAqJtJ,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,YAAY,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,GAAG,IAAI,CAwpF7E"}