@mmnto/mcp 1.12.0 → 1.14.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.
@@ -0,0 +1,196 @@
1
+ /* eslint-disable no-console -- standalone CLI utility, not an MCP stdio file.
2
+ * The no-console rule exists to prevent breaking the MCP stdio protocol
3
+ * where stdout writes corrupt the wire format. This file is invoked
4
+ * directly via `node packages/mcp/dist/smoke-test.js` and console output
5
+ * is the entire point — it IS the result capture mechanism for the
6
+ * Phase 3 empirical proof. Scoped file-level exception.
7
+ */
8
+ /**
9
+ * Cross-Repo Context Mesh smoke test (mmnto/totem#1294 Phase 3).
10
+ *
11
+ * Manual integration test that spins up a real ServerContext against the
12
+ * current cwd's totem.config.ts, validates every linked index initialized
13
+ * correctly, runs a real federated search_knowledge query across primary
14
+ * + linked stores, and prints formatted output showing:
15
+ *
16
+ * - Which linked stores loaded vs which failed (with init errors)
17
+ * - How many chunks each store holds
18
+ * - The top-N merged results with `[sourceRepo]` tags and absolute paths
19
+ * - A per-store score breakdown so reviewers can verify federation
20
+ * actually interleaves results from multiple repos
21
+ *
22
+ * This is NOT part of the automated test suite — it requires:
23
+ * 1. A real `.lancedb/` in the primary repo (rebuilt via `totem sync`)
24
+ * 2. `linkedIndexes` configured in `totem.config.ts` pointing at real paths
25
+ * 3. Each linked path to be a fully-synced Totem-managed directory
26
+ * 4. `GEMINI_API_KEY` (or equivalent) in the environment for live query
27
+ * embedding
28
+ *
29
+ * Invoke after building the mcp package:
30
+ * pnpm --filter @mmnto/mcp build
31
+ * node packages/mcp/dist/smoke-test.js
32
+ *
33
+ * Captures its own output to stdout so a caller can redirect to a file or
34
+ * pipe the result into a PR body. Exits non-zero on any failure (broken
35
+ * init, zero results, or the context throwing) so CI / reviewers can use
36
+ * it as a binary pass/fail signal.
37
+ */
38
+ import { getContext } from './context.js';
39
+ const QUERY = 'cross-repo context mesh federation linked totems';
40
+ const CONSOLE_DIVIDER_WIDTH = 78;
41
+ const CONTENT_PREVIEW_MAX_CHARS = 120;
42
+ function formatResults(results) {
43
+ return results.map((r, i) => ({
44
+ rank: i + 1,
45
+ source: r.sourceRepo ?? 'primary',
46
+ label: r.label,
47
+ score: r.score.toFixed(3),
48
+ path: r.sourceRepo ? r.absoluteFilePath : r.filePath,
49
+ contentPreview: r.content.slice(0, CONTENT_PREVIEW_MAX_CHARS).replace(/\s+/g, ' ').trim() + '...',
50
+ }));
51
+ }
52
+ async function main() {
53
+ console.log('='.repeat(CONSOLE_DIVIDER_WIDTH));
54
+ console.log('Cross-Repo Context Mesh — smoke test (mmnto/totem#1294 Phase 3)');
55
+ console.log('='.repeat(CONSOLE_DIVIDER_WIDTH));
56
+ console.log();
57
+ // Capture init timing — helps prove the eager-init path doesn't block
58
+ // forever on broken links
59
+ const initStart = Date.now();
60
+ const ctx = await getContext();
61
+ const initMs = Date.now() - initStart;
62
+ console.log(`Primary repo: ${ctx.projectRoot}`);
63
+ console.log(`Init wall time: ${initMs}ms`);
64
+ console.log(`Linked stores loaded: ${ctx.linkedStores.size}`);
65
+ console.log(`Linked init errors: ${ctx.linkedStoreInitErrors.size}`);
66
+ console.log();
67
+ // Report primary chunk count — sanity check that the primary store loaded
68
+ const primaryCount = await ctx.store.count();
69
+ console.log(`Primary chunks: ${primaryCount.toLocaleString()}`);
70
+ if (ctx.linkedStores.size > 0) {
71
+ console.log();
72
+ console.log('Linked stores:');
73
+ for (const [name, store] of ctx.linkedStores.entries()) {
74
+ const count = await store.count();
75
+ console.log(` [${name}]: ${count.toLocaleString()} chunks`);
76
+ }
77
+ }
78
+ if (ctx.linkedStoreInitErrors.size > 0) {
79
+ console.log();
80
+ console.log('Linked init errors:');
81
+ for (const [name, err] of ctx.linkedStoreInitErrors.entries()) {
82
+ console.log(` [${name}]: ${err}`);
83
+ }
84
+ }
85
+ if (ctx.linkedStores.size === 0) {
86
+ console.log();
87
+ console.log('WARNING: No linked stores initialized. This smoke test cannot');
88
+ console.log('demonstrate cross-repo federation without at least one linked');
89
+ console.log('store. Check totem.config.ts for linkedIndexes entries.');
90
+ // Use exitCode + early return instead of process.exit() so buffered
91
+ // stdout (the tail logs above) flushes before the process terminates.
92
+ // This matters because the smoke test is piped into the PR body.
93
+ // (mmnto/totem#1295 CR minor)
94
+ process.exitCode = 1;
95
+ return;
96
+ }
97
+ // ─── Run the federated query ──────────────────────────────
98
+ //
99
+ // Fire primary + all linked stores in parallel — mirroring the exact
100
+ // pattern federatedSearch uses in search-knowledge.ts. Each store gets
101
+ // an equal per-store fetch budget.
102
+ console.log();
103
+ console.log('='.repeat(CONSOLE_DIVIDER_WIDTH));
104
+ console.log(`Query: "${QUERY}"`);
105
+ console.log('='.repeat(CONSOLE_DIVIDER_WIDTH));
106
+ console.log();
107
+ const queryStart = Date.now();
108
+ const perStoreLimit = 5;
109
+ const finalLimit = 10;
110
+ const primaryPromise = ctx.store.search({
111
+ query: QUERY,
112
+ maxResults: perStoreLimit,
113
+ });
114
+ const linkedPromises = Array.from(ctx.linkedStores.entries()).map(([name, ls]) => ls.search({ query: QUERY, maxResults: perStoreLimit }).catch((err) => {
115
+ const msg = err instanceof Error ? err.message : String(err);
116
+ console.log(` [${name}] search failed: ${msg}`);
117
+ return [];
118
+ }));
119
+ const [primaryResults, ...linkedResults] = await Promise.all([primaryPromise, ...linkedPromises]);
120
+ const queryMs = Date.now() - queryStart;
121
+ // Merge by semantic score (descending) and truncate — same pattern as
122
+ // federatedSearch in search-knowledge.ts
123
+ const merged = [...primaryResults, ...linkedResults.flat()];
124
+ merged.sort((a, b) => (b.score ?? 0) - (a.score ?? 0));
125
+ const topResults = merged.slice(0, finalLimit);
126
+ // Per-store breakdown for the PR body
127
+ const primaryHits = primaryResults.length;
128
+ const linkedHitsByName = new Map();
129
+ for (const name of ctx.linkedStores.keys()) {
130
+ linkedHitsByName.set(name, 0);
131
+ }
132
+ for (const r of merged) {
133
+ if (r.sourceRepo) {
134
+ linkedHitsByName.set(r.sourceRepo, (linkedHitsByName.get(r.sourceRepo) ?? 0) + 1);
135
+ }
136
+ }
137
+ console.log(`Query wall time: ${queryMs}ms`);
138
+ console.log(`Primary hits: ${primaryHits}`);
139
+ for (const [name, count] of linkedHitsByName.entries()) {
140
+ console.log(`Linked hits [${name}]: ${count}`);
141
+ }
142
+ console.log(`Merged pool size: ${merged.length}`);
143
+ console.log(`Top returned: ${topResults.length}`);
144
+ console.log();
145
+ // ─── Formatted results ────────────────────────────────────
146
+ if (topResults.length === 0) {
147
+ console.log('NO RESULTS. The query returned zero matches from primary or linked.');
148
+ console.log('This likely means the indexes are not synced or the query is too narrow.');
149
+ process.exitCode = 1;
150
+ return;
151
+ }
152
+ const formatted = formatResults(topResults);
153
+ console.log('Top-ranked results (interleaved by semantic score):');
154
+ console.log();
155
+ for (const r of formatted) {
156
+ console.log(`${r.rank}. [${r.source}] ${r.label}`);
157
+ console.log(` Score: ${r.score}`);
158
+ console.log(` Path: ${r.path}`);
159
+ console.log(` Preview: ${r.contentPreview}`);
160
+ console.log();
161
+ }
162
+ // ─── Pass/fail signal ─────────────────────────────────────
163
+ // Success conditions:
164
+ // 1. Init had zero errors (all linked stores loaded cleanly)
165
+ // 2. At least one linked store returned hits
166
+ // 3. Merge produced an interleaved result set (not just primary or just linked)
167
+ //
168
+ // Note: `linkedStoreInitErrors` (populated by `initContext()` in context.ts)
169
+ // includes empty linked stores as non-fatal warnings — they'd be served as
170
+ // an empty federation in production but here they fail the smoke test,
171
+ // because an empty store can't prove cross-repo federation actually works.
172
+ // (mmnto/totem#1295 CR clarification)
173
+ const hasLinkedHits = Array.from(linkedHitsByName.values()).some((n) => n > 0);
174
+ const hasPrimaryHits = primaryHits > 0;
175
+ const zeroInitErrors = ctx.linkedStoreInitErrors.size === 0;
176
+ console.log('='.repeat(CONSOLE_DIVIDER_WIDTH));
177
+ console.log('Smoke test verdict:');
178
+ console.log(` Zero init errors: ${zeroInitErrors ? 'PASS' : 'FAIL'}`);
179
+ console.log(` Primary returned hits: ${hasPrimaryHits ? 'PASS' : 'FAIL'}`);
180
+ console.log(` Linked returned hits: ${hasLinkedHits ? 'PASS' : 'FAIL'}`);
181
+ console.log('='.repeat(CONSOLE_DIVIDER_WIDTH));
182
+ const verdict = zeroInitErrors && hasPrimaryHits && hasLinkedHits;
183
+ console.log();
184
+ console.log(verdict ? 'SMOKE TEST: PASS' : 'SMOKE TEST: FAIL');
185
+ if (!verdict)
186
+ process.exitCode = 1;
187
+ }
188
+ main().catch((err) => {
189
+ const msg = err instanceof Error ? err.message : String(err);
190
+ const stack = err instanceof Error ? err.stack : undefined;
191
+ console.error('Smoke test threw:', msg);
192
+ if (stack)
193
+ console.error(stack);
194
+ process.exitCode = 1;
195
+ });
196
+ //# sourceMappingURL=smoke-test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"smoke-test.js","sourceRoot":"","sources":["../src/smoke-test.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,9 @@
1
1
  import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ /**
3
+ * Reset both session flags. Test-only export — production code should never
4
+ * call this. Allows test suites to exercise the first-query behaviors
5
+ * repeatedly across individual test cases.
6
+ */
7
+ export declare function _resetSessionFlags(): void;
2
8
  export declare function registerSearchKnowledge(server: McpServer): void;
3
9
  //# sourceMappingURL=search-knowledge.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"search-knowledge.d.ts","sourceRoot":"","sources":["../../src/tools/search-knowledge.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAuHzE,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAwI/D"}
1
+ {"version":3,"file":"search-knowledge.d.ts","sourceRoot":"","sources":["../../src/tools/search-knowledge.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAwCzE;;;;GAIG;AACH,wBAAgB,kBAAkB,IAAI,IAAI,CAGzC;AAsgBD,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA6K/D"}