@retrodeck/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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC"}
package/dist/node.d.ts ADDED
@@ -0,0 +1,76 @@
1
+ export interface NodeConfig {
2
+ nodeId: string;
3
+ apiKey: string;
4
+ centralApiUrl: string;
5
+ plan: string;
6
+ vaultAdapter: string;
7
+ vaultPath: string;
8
+ domain: string;
9
+ walletAddress?: string;
10
+ walletChain: string;
11
+ mcpPort: number;
12
+ autoSync?: boolean;
13
+ syncIntervalMinutes?: number;
14
+ publicFolders?: string[];
15
+ vaultKeyHex?: string;
16
+ sharedVaultKeys?: Record<string, string>;
17
+ }
18
+ interface McpToolResult {
19
+ [key: string]: unknown;
20
+ content: Array<{
21
+ type: 'text';
22
+ text: string;
23
+ }>;
24
+ isError?: boolean;
25
+ }
26
+ export declare class RDKNode {
27
+ private config;
28
+ private store;
29
+ private router;
30
+ private indexer;
31
+ private embeddingModel;
32
+ private syncService;
33
+ private vaultLastIndexed?;
34
+ private vaultWatchUnsubscribe?;
35
+ private jwtToken?;
36
+ private jwtExpiry;
37
+ private getJwt;
38
+ init(): Promise<void>;
39
+ private resolveHome;
40
+ private startVaultWatch;
41
+ private reindexFiles;
42
+ handleQuery(query: string, opts: {
43
+ domain?: string;
44
+ includePrivate?: boolean;
45
+ includeNetwork?: boolean;
46
+ topK?: number;
47
+ }): Promise<McpToolResult>;
48
+ handleIndex(opts: {
49
+ content: string;
50
+ title: string;
51
+ isPublic?: boolean;
52
+ domain?: string;
53
+ categories?: string[];
54
+ }): Promise<McpToolResult>;
55
+ handleIndexUrl(opts: {
56
+ url: string;
57
+ isPublic?: boolean;
58
+ domain?: string;
59
+ }): Promise<McpToolResult>;
60
+ handleIndexVault(opts: {
61
+ forceReindex?: boolean;
62
+ publicOnly?: boolean;
63
+ }): Promise<McpToolResult>;
64
+ handleStatus(): Promise<McpToolResult>;
65
+ handleEarnings(): Promise<McpToolResult>;
66
+ private loadConfig;
67
+ private decryptValue;
68
+ private parseFrontmatter;
69
+ private listMarkdownFiles;
70
+ private isPublicFile;
71
+ private checkNetworkConnectivity;
72
+ private textResult;
73
+ private errorResult;
74
+ }
75
+ export {};
76
+ //# sourceMappingURL=node.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC1C;AAED,UAAU,aAAa;IACrB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IACvB,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,qBAAa,OAAO;IAClB,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,KAAK,CAAc;IAC3B,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,OAAO,CAAc;IAC7B,OAAO,CAAC,cAAc,CAAuB;IAC7C,OAAO,CAAC,WAAW,CAAe;IAClC,OAAO,CAAC,gBAAgB,CAAC,CAAO;IAChC,OAAO,CAAC,qBAAqB,CAAC,CAAa;IAC3C,OAAO,CAAC,QAAQ,CAAC,CAAS;IAC1B,OAAO,CAAC,SAAS,CAAK;YAER,MAAM;IAad,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAuD3B,OAAO,CAAC,WAAW;YAKL,eAAe;YAyDf,YAAY;IAsCpB,WAAW,CACf,KAAK,EAAE,MAAM,EACb,IAAI,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,cAAc,CAAC,EAAE,OAAO,CAAC;QAAC,cAAc,CAAC,EAAE,OAAO,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAC3F,OAAO,CAAC,aAAa,CAAC;IAmCnB,WAAW,CAAC,IAAI,EAAE;QACtB,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;KACvB,GAAG,OAAO,CAAC,aAAa,CAAC;IA8BpB,cAAc,CAAC,IAAI,EAAE;QACzB,GAAG,EAAE,MAAM,CAAC;QACZ,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,GAAG,OAAO,CAAC,aAAa,CAAC;IAyCpB,gBAAgB,CAAC,IAAI,EAAE;QAAE,YAAY,CAAC,EAAE,OAAO,CAAC;QAAC,UAAU,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,aAAa,CAAC;IA2DhG,YAAY,IAAI,OAAO,CAAC,aAAa,CAAC;IAmCtC,cAAc,IAAI,OAAO,CAAC,aAAa,CAAC;IA8C9C,OAAO,CAAC,UAAU;IA2BlB,OAAO,CAAC,YAAY;IAWpB,OAAO,CAAC,gBAAgB;IAUxB,OAAO,CAAC,iBAAiB;IAmBzB,OAAO,CAAC,YAAY;YAMN,wBAAwB;IAYtC,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,WAAW;CAGpB"}
package/dist/node.js ADDED
@@ -0,0 +1,470 @@
1
+ // packages/rdk-mcp/src/node.ts
2
+ // Central stateful object for the MCP server session.
3
+ // Loads config from ~/.rdk/config.json, initializes store + router + indexer.
4
+ import fs from 'fs';
5
+ import path from 'path';
6
+ import os from 'os';
7
+ import crypto from 'crypto';
8
+ import { LocalStore, RDKRouter, RDKIndexer, LocalEmbeddingModel, keyFromHex } from '@rdk/core';
9
+ import { SyncService } from './sync-service.js';
10
+ export class RDKNode {
11
+ config;
12
+ store;
13
+ router;
14
+ indexer;
15
+ embeddingModel;
16
+ syncService;
17
+ vaultLastIndexed;
18
+ vaultWatchUnsubscribe;
19
+ jwtToken;
20
+ jwtExpiry = 0;
21
+ async getJwt() {
22
+ if (this.jwtToken && Date.now() < this.jwtExpiry)
23
+ return this.jwtToken;
24
+ const res = await fetch(`${this.config.centralApiUrl}/api/v1/nodes/auth`, {
25
+ method: 'POST',
26
+ headers: { Authorization: `Bearer ${this.config.apiKey}` },
27
+ });
28
+ if (!res.ok)
29
+ throw new Error(`Auth failed: HTTP ${res.status}`);
30
+ const { jwtToken } = await res.json();
31
+ this.jwtToken = jwtToken;
32
+ this.jwtExpiry = Date.now() + 55 * 60 * 1000;
33
+ return jwtToken;
34
+ }
35
+ async init() {
36
+ this.config = this.loadConfig();
37
+ this.store = new LocalStore();
38
+ this.embeddingModel = new LocalEmbeddingModel();
39
+ // Load encryption keys
40
+ const vaultKey = this.config.vaultKeyHex
41
+ ? keyFromHex(this.config.vaultKeyHex)
42
+ : undefined;
43
+ const sharedVaultKeys = {};
44
+ for (const [nodeId, hexKey] of Object.entries(this.config.sharedVaultKeys ?? {})) {
45
+ sharedVaultKeys[nodeId] = keyFromHex(hexKey);
46
+ }
47
+ this.router = new RDKRouter({
48
+ localStore: this.store,
49
+ embeddingModel: this.embeddingModel,
50
+ centralApiUrl: this.config.centralApiUrl,
51
+ centralApiKey: this.config.apiKey,
52
+ domain: this.config.domain,
53
+ topK: 5,
54
+ minSimilarity: 0.50,
55
+ fallbackToLLM: true,
56
+ vaultKey,
57
+ sharedVaultKeys,
58
+ });
59
+ this.indexer = new RDKIndexer({
60
+ embeddingModel: this.embeddingModel,
61
+ localStore: this.store,
62
+ domain: this.config.domain,
63
+ syncToNetwork: true,
64
+ centralApiUrl: this.config.centralApiUrl,
65
+ centralApiKey: this.config.apiKey,
66
+ vaultKey,
67
+ });
68
+ this.syncService = new SyncService({
69
+ enabled: this.config.autoSync !== false,
70
+ intervalMinutes: this.config.syncIntervalMinutes ?? 5,
71
+ centralApiUrl: this.config.centralApiUrl,
72
+ centralApiKey: this.config.apiKey,
73
+ }, this.store);
74
+ this.syncService.start();
75
+ // Start vault file watcher — fires after MCP server is already accepting connections
76
+ this.startVaultWatch().catch(e => console.error('[watch] init error:', e.message));
77
+ }
78
+ // ── Vault file watcher ───────────────────────────────────────────────────
79
+ resolveHome(p) {
80
+ if (p?.startsWith('~/'))
81
+ return path.join(os.homedir(), p.slice(2));
82
+ return p ?? '';
83
+ }
84
+ async startVaultWatch() {
85
+ if (!this.config.vaultPath)
86
+ return;
87
+ const vaultPath = this.resolveHome(this.config.vaultPath);
88
+ if (!fs.existsSync(vaultPath)) {
89
+ console.error(`[watch] vault path not found: ${vaultPath}`);
90
+ return;
91
+ }
92
+ // Start lookback 24h ago — catches files created/modified before this server restart
93
+ let lastScan = Date.now() - 24 * 60 * 60 * 1000;
94
+ const scan = async () => {
95
+ const since = new Date(lastScan - 5_000); // 5s overlap catches edge cases
96
+ lastScan = Date.now();
97
+ const allFiles = this.listMarkdownFiles(vaultPath);
98
+ console.error(`[watch] scanning ${allFiles.length} file(s) since ${since.toLocaleTimeString()}`);
99
+ const changed = [];
100
+ for (const fullPath of allFiles) {
101
+ try {
102
+ const stat = fs.statSync(fullPath);
103
+ if (stat.mtime > since)
104
+ changed.push(path.relative(vaultPath, fullPath));
105
+ }
106
+ catch { /* skip unreadable */ }
107
+ }
108
+ if (changed.length > 0) {
109
+ console.error(`[watch] ${changed.length} file(s) changed: ${changed.map(f => path.basename(f)).join(', ')}`);
110
+ await this.reindexFiles(vaultPath, changed);
111
+ }
112
+ };
113
+ // Poll every 20 seconds — reliable on all filesystems (Obsidian atomic writes can miss fs.watch)
114
+ const pollInterval = setInterval(() => {
115
+ scan().catch(e => console.error('[watch] scan error:', e.message));
116
+ }, 20_000);
117
+ // Also wire up fs.watch for faster detection when it does fire
118
+ let debounceTimer = null;
119
+ let fsWatcher = null;
120
+ try {
121
+ fsWatcher = fs.watch(vaultPath, { recursive: true }, (_, filename) => {
122
+ if (!filename?.match(/\.(md|txt|mdx)$/))
123
+ return;
124
+ if (debounceTimer)
125
+ clearTimeout(debounceTimer);
126
+ debounceTimer = setTimeout(() => {
127
+ scan().catch(e => console.error('[watch] scan error:', e.message));
128
+ }, 500);
129
+ });
130
+ }
131
+ catch {
132
+ // fs.watch unsupported on this filesystem — polling-only mode is fine
133
+ }
134
+ this.vaultWatchUnsubscribe = () => {
135
+ clearInterval(pollInterval);
136
+ fsWatcher?.close();
137
+ };
138
+ console.error(`[watch] watching vault at ${vaultPath}`);
139
+ }
140
+ async reindexFiles(vaultPath, relPaths) {
141
+ let chunksIndexed = 0;
142
+ const errors = [];
143
+ for (const relPath of relPaths) {
144
+ const fullPath = path.join(vaultPath, relPath);
145
+ try {
146
+ if (!fs.existsSync(fullPath))
147
+ continue;
148
+ const raw = fs.readFileSync(fullPath, 'utf-8');
149
+ const { title: fmTitle, content } = this.parseFrontmatter(raw);
150
+ const title = fmTitle || path.basename(fullPath, path.extname(fullPath));
151
+ const isPublic = this.isPublicFile(relPath);
152
+ const result = await this.indexer.indexDocument({
153
+ content: content || raw,
154
+ title,
155
+ domain: this.config.domain,
156
+ isPublic,
157
+ sourceAdapter: this.config.vaultAdapter,
158
+ });
159
+ chunksIndexed += result.chunksIndexed;
160
+ if (result.errors.length > 0)
161
+ errors.push(...result.errors);
162
+ }
163
+ catch (e) {
164
+ errors.push(`${path.basename(relPath)}: ${e.message}`);
165
+ }
166
+ }
167
+ console.error(`[watch] indexed ${relPaths.length} file(s) → ${chunksIndexed} chunk(s)`);
168
+ if (errors.length > 0) {
169
+ console.error(`[watch] errors: ${errors.slice(0, 3).join('; ')}`);
170
+ }
171
+ if (chunksIndexed > 0) {
172
+ this.syncService.syncOnce().catch(e => console.error('[watch] sync error:', e.message));
173
+ }
174
+ }
175
+ // ── Tool Handlers ────────────────────────────────────────────────────────
176
+ async handleQuery(query, opts) {
177
+ if (!query?.trim()) {
178
+ return this.errorResult('query is required');
179
+ }
180
+ const result = await this.router.query(query, {
181
+ domain: opts.domain ?? this.config.domain,
182
+ topK: opts.topK ?? 5,
183
+ });
184
+ if (result.source === 'llm_fallback' || result.chunks.length === 0) {
185
+ return this.textResult(`No relevant knowledge found in ${opts.includeNetwork !== false ? 'private vault or network' : 'private vault'}.\n` +
186
+ `Source: llm_fallback — proceed with your training data or request more context.\n` +
187
+ `Latency: ${result.latencyMs}ms`);
188
+ }
189
+ const sourceLabel = result.source === 'private' ? 'Private Vault' : 'Knowledge Network';
190
+ const tipsNote = result.tipsPaid.length > 0
191
+ ? `\n\n💡 ${result.tipsPaid.length} tip(s) queued ($${result.tipsPaid.reduce((s, t) => s + t.amountUsdc, 0).toFixed(4)} USDC total)`
192
+ : '';
193
+ const contextText = result.context ||
194
+ result.chunks.map((c, i) => {
195
+ const chunk = c;
196
+ return `[${i + 1}] ${chunk.title ?? 'Untitled'}\n${chunk.content ?? chunk.summary ?? ''}`;
197
+ }).join('\n\n---\n\n');
198
+ return this.textResult(`Source: ${sourceLabel} | Chunks: ${result.chunks.length} | Tokens: ~${result.tokenEstimate} | Latency: ${result.latencyMs}ms${tipsNote}\n\n` +
199
+ `---\n\n${contextText}`);
200
+ }
201
+ async handleIndex(opts) {
202
+ if (!opts.content || !opts.title) {
203
+ return this.errorResult('content and title are required');
204
+ }
205
+ const result = await this.indexer.indexDocument({
206
+ content: opts.content,
207
+ title: opts.title,
208
+ domain: opts.domain ?? this.config.domain,
209
+ categories: opts.categories,
210
+ isPublic: opts.isPublic ?? true,
211
+ sourceAdapter: 'manual',
212
+ });
213
+ const syncNote = (opts.isPublic ?? true)
214
+ ? ' Marked public — will sync to network.'
215
+ : ' Stored privately (not shared with network).';
216
+ if (result.errors.length > 0) {
217
+ return this.textResult(`Indexed ${result.chunksIndexed} chunks with ${result.errors.length} error(s).\n` +
218
+ `Errors: ${result.errors.join('; ')}${syncNote}`);
219
+ }
220
+ return this.textResult(`Indexed "${opts.title}" → ${result.chunksIndexed} chunk(s).${syncNote}`);
221
+ }
222
+ async handleIndexUrl(opts) {
223
+ if (!opts.url)
224
+ return this.errorResult('url is required');
225
+ let content;
226
+ let title;
227
+ try {
228
+ const response = await fetch(opts.url, {
229
+ headers: { 'User-Agent': 'RDK-Node/1.0 (+https://rdk.network)' },
230
+ signal: AbortSignal.timeout(15_000),
231
+ });
232
+ if (!response.ok) {
233
+ return this.errorResult(`HTTP ${response.status} fetching ${opts.url}`);
234
+ }
235
+ const contentType = response.headers.get('content-type') ?? '';
236
+ const raw = await response.text();
237
+ if (contentType.includes('text/html')) {
238
+ // Extract title from <title> tag
239
+ const titleMatch = /<title[^>]*>([^<]+)<\/title>/i.exec(raw);
240
+ title = titleMatch ? titleMatch[1].trim() : opts.url;
241
+ // Strip HTML for content
242
+ content = raw;
243
+ }
244
+ else {
245
+ title = opts.url;
246
+ content = raw;
247
+ }
248
+ }
249
+ catch (e) {
250
+ return this.errorResult(`Failed to fetch URL: ${e.message}`);
251
+ }
252
+ return this.handleIndex({
253
+ content,
254
+ title,
255
+ isPublic: opts.isPublic ?? true,
256
+ domain: opts.domain,
257
+ });
258
+ }
259
+ async handleIndexVault(opts) {
260
+ if (!this.config.vaultPath) {
261
+ return this.errorResult('No vault configured. Run rdk init to set up a vault.');
262
+ }
263
+ const vaultPath = this.resolveHome(this.config.vaultPath);
264
+ if (!fs.existsSync(vaultPath)) {
265
+ return this.errorResult(`Vault path not found: ${vaultPath}`);
266
+ }
267
+ try {
268
+ const since = (!opts.forceReindex && this.vaultLastIndexed) ? this.vaultLastIndexed : undefined;
269
+ const allFiles = this.listMarkdownFiles(vaultPath);
270
+ let filesProcessed = 0;
271
+ let chunksIndexed = 0;
272
+ const errors = [];
273
+ for (const fullPath of allFiles) {
274
+ try {
275
+ const relPath = path.relative(vaultPath, fullPath);
276
+ const isPublic = this.isPublicFile(relPath);
277
+ if (opts.publicOnly && !isPublic)
278
+ continue;
279
+ if (since) {
280
+ const stat = fs.statSync(fullPath);
281
+ if (stat.mtime <= since)
282
+ continue;
283
+ }
284
+ const raw = fs.readFileSync(fullPath, 'utf-8');
285
+ const { title: fmTitle, content } = this.parseFrontmatter(raw);
286
+ const title = fmTitle || path.basename(fullPath, path.extname(fullPath));
287
+ const result = await this.indexer.indexDocument({
288
+ content: content || raw,
289
+ title,
290
+ domain: this.config.domain,
291
+ isPublic,
292
+ sourceAdapter: this.config.vaultAdapter,
293
+ });
294
+ filesProcessed++;
295
+ chunksIndexed += result.chunksIndexed;
296
+ if (result.errors.length > 0)
297
+ errors.push(...result.errors);
298
+ }
299
+ catch (e) {
300
+ errors.push(`${path.basename(fullPath)}: ${e.message}`);
301
+ }
302
+ }
303
+ this.vaultLastIndexed = new Date();
304
+ const errNote = errors.length > 0 ? `\n${errors.length} error(s): ${errors.slice(0, 3).join('; ')}` : '';
305
+ return this.textResult(`Vault indexed: ${filesProcessed} files → ${chunksIndexed} chunks.${errNote}`);
306
+ }
307
+ catch (e) {
308
+ return this.errorResult(`Vault index failed: ${e.message}`);
309
+ }
310
+ }
311
+ async handleStatus() {
312
+ const stats = this.store.getStats();
313
+ const pendingTips = this.store.getPendingTipTotal();
314
+ const configPath = path.join(os.homedir(), '.rdk', 'config.json');
315
+ const configExists = fs.existsSync(configPath);
316
+ const networkStatus = await this.checkNetworkConnectivity();
317
+ const sync = this.syncService.getStatus();
318
+ return this.textResult([
319
+ `RDK Node Status`,
320
+ `───────────────────────────────`,
321
+ `Node ID: ${this.config.nodeId}`,
322
+ `Plan: ${this.config.plan}`,
323
+ `Domain: ${this.config.domain}`,
324
+ ``,
325
+ `Vault: ${this.config.vaultAdapter} @ ${this.config.vaultPath}`,
326
+ `Last indexed: ${this.vaultLastIndexed?.toLocaleString() ?? 'never'}`,
327
+ ``,
328
+ `Chunks (local): ${stats.totalChunks.toLocaleString()} total`,
329
+ ` Private: ${stats.privateChunks.toLocaleString()}`,
330
+ ` Public: ${stats.publicChunks.toLocaleString()}`,
331
+ ` Unsynced: ${stats.unsyncedChunks.toLocaleString()}`,
332
+ ``,
333
+ `Auto-sync: ${sync.enabled ? 'enabled' : 'disabled'}`,
334
+ `Sync interval: ${sync.intervalMinutes} minutes`,
335
+ `Sync loop: ${sync.running ? 'running' : 'stopped'}`,
336
+ ``,
337
+ `Tips pending: $${pendingTips.toFixed(4)} USDC`,
338
+ `Network: ${networkStatus}`,
339
+ `Config: ${configExists ? configPath : 'not found — run rdk init'}`,
340
+ ].join('\n'));
341
+ }
342
+ async handleEarnings() {
343
+ if (!this.config.centralApiUrl || !this.config.apiKey) {
344
+ return this.errorResult('Not connected to network. Run rdk network:connect');
345
+ }
346
+ try {
347
+ const jwt = await this.getJwt();
348
+ const response = await fetch(`${this.config.centralApiUrl}/api/v1/tips/earnings`, {
349
+ headers: { Authorization: `Bearer ${jwt}` },
350
+ });
351
+ if (!response.ok) {
352
+ return this.errorResult(`Failed to fetch earnings: HTTP ${response.status}`);
353
+ }
354
+ const data = await response.json();
355
+ const recent = data.tipHistory.slice(0, 5).map(t => ` ${new Date(t.created_at).toLocaleDateString()} $${Number(t.amount_usdc).toFixed(4)} ${t.status}`).join('\n');
356
+ return this.textResult([
357
+ `RDK Tip Earnings`,
358
+ `───────────────────────────────`,
359
+ `Total earned: $${data.totalUsdc.toFixed(4)} USDC`,
360
+ `Settled: $${data.settledUsdc.toFixed(4)} USDC`,
361
+ `Pending: $${data.pendingUsdc.toFixed(4)} USDC`,
362
+ ``,
363
+ `Recent tips:`,
364
+ recent || ' (none yet)',
365
+ ``,
366
+ `Wallet: ${this.config.walletAddress ?? 'not configured'}`,
367
+ `Chain: ${this.config.walletChain}`,
368
+ ].join('\n'));
369
+ }
370
+ catch (e) {
371
+ return this.errorResult(`Earnings fetch failed: ${e.message}`);
372
+ }
373
+ }
374
+ // ── Helpers ──────────────────────────────────────────────────────────────
375
+ loadConfig() {
376
+ const rdkHome = process.env.RDK_HOME ?? path.join(os.homedir(), '.rdk');
377
+ const configPath = path.join(rdkHome, 'config.json');
378
+ if (!fs.existsSync(configPath)) {
379
+ return {
380
+ nodeId: 'uninitialized',
381
+ apiKey: '',
382
+ centralApiUrl: 'https://rdk.retrodeck.ai',
383
+ plan: 'free',
384
+ vaultAdapter: 'filesystem',
385
+ vaultPath: path.join(os.homedir(), 'Documents'),
386
+ domain: 'general',
387
+ walletChain: 'base',
388
+ mcpPort: 4242,
389
+ };
390
+ }
391
+ const raw = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
392
+ raw.apiKey = this.decryptValue(raw.apiKey);
393
+ if (raw.vaultKeyHex)
394
+ raw.vaultKeyHex = this.decryptValue(raw.vaultKeyHex);
395
+ if (raw.sharedVaultKeys) {
396
+ for (const [nodeId, key] of Object.entries(raw.sharedVaultKeys)) {
397
+ raw.sharedVaultKeys[nodeId] = this.decryptValue(key);
398
+ }
399
+ }
400
+ return raw;
401
+ }
402
+ decryptValue(stored) {
403
+ if (!stored?.startsWith('enc:'))
404
+ return stored;
405
+ const machineKey = crypto.createHash('sha256')
406
+ .update(`${os.hostname()}${os.userInfo().username}`)
407
+ .digest();
408
+ const buf = Buffer.from(stored.slice(4), 'base64');
409
+ const decipher = crypto.createDecipheriv('aes-256-gcm', machineKey, buf.subarray(0, 12));
410
+ decipher.setAuthTag(buf.subarray(12, 28));
411
+ return decipher.update(buf.subarray(28)).toString('utf-8') + decipher.final('utf-8');
412
+ }
413
+ parseFrontmatter(raw) {
414
+ const match = /^---\n([\s\S]*?)\n---\n?([\s\S]*)/.exec(raw);
415
+ if (!match)
416
+ return { title: '', content: raw };
417
+ const fm = match[1];
418
+ const content = match[2];
419
+ const titleMatch = /^title:\s*(.+)$/m.exec(fm);
420
+ const title = titleMatch ? titleMatch[1].trim().replace(/^['"]|['"]$/g, '') : '';
421
+ return { title, content };
422
+ }
423
+ listMarkdownFiles(dir) {
424
+ const results = [];
425
+ try {
426
+ const entries = fs.readdirSync(dir, { withFileTypes: true });
427
+ for (const entry of entries) {
428
+ if (entry.name.startsWith('.'))
429
+ continue;
430
+ const fullPath = path.join(dir, entry.name);
431
+ if (entry.isDirectory()) {
432
+ results.push(...this.listMarkdownFiles(fullPath));
433
+ }
434
+ else if (/\.(md|txt|mdx)$/.test(entry.name)) {
435
+ results.push(fullPath);
436
+ }
437
+ }
438
+ }
439
+ catch {
440
+ // skip unreadable dirs
441
+ }
442
+ return results;
443
+ }
444
+ isPublicFile(relPath) {
445
+ const publicFolders = this.config.publicFolders ?? [];
446
+ if (publicFolders.length === 0)
447
+ return false;
448
+ return publicFolders.some(f => relPath.startsWith(f + '/') || relPath.startsWith(f + path.sep));
449
+ }
450
+ async checkNetworkConnectivity() {
451
+ if (!this.config.centralApiUrl)
452
+ return 'not configured';
453
+ try {
454
+ const res = await fetch(`${this.config.centralApiUrl}/health`, {
455
+ signal: AbortSignal.timeout(3000),
456
+ });
457
+ return res.ok ? 'connected' : `error (HTTP ${res.status})`;
458
+ }
459
+ catch {
460
+ return 'unreachable';
461
+ }
462
+ }
463
+ textResult(text) {
464
+ return { content: [{ type: 'text', text }] };
465
+ }
466
+ errorResult(message) {
467
+ return { content: [{ type: 'text', text: `Error: ${message}` }], isError: true };
468
+ }
469
+ }
470
+ //# sourceMappingURL=node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node.js","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function startMcpServer(): Promise<void>;
2
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AA+EA,wBAAsB,cAAc,kBAiEnC"}