midas-mcp 5.43.12 → 5.44.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.
package/dist/cloud.js ADDED
@@ -0,0 +1,319 @@
1
+ /**
2
+ * Cloud Sync - Turso Database Integration
3
+ *
4
+ * Syncs local Midas state to Turso for web dashboard access.
5
+ * Uses libsql HTTP API for serverless-friendly connections.
6
+ */
7
+ import { isAuthenticated, getAuthenticatedUser } from './auth.js';
8
+ import { loadState } from './state/phase.js';
9
+ import { loadTracker } from './tracker.js';
10
+ import { sanitizePath } from './security.js';
11
+ import { basename } from 'path';
12
+ // Turso configuration - shared database for all Midas users
13
+ // Users can override with env vars for self-hosted setups
14
+ const DEFAULT_TURSO_URL = 'libsql://midas-christiancattaneo.aws-us-east-1.turso.io';
15
+ const DEFAULT_TURSO_TOKEN = 'eyJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE3NzAwNzY5OTAsImlkIjoiMzdiMTQ4NjEtNzFhZi00ZDgyLTg1ZDItYmY5OThhM2VmZjUxIiwicmlkIjoiNDQyMDJmMzItNWQ5YS00MTgyLTllM2ItNjE3MWUyNDk4ODY2In0.pm1VW_o8ARe25fwx8HrXyOAKAUnMxZrWrD_kIc0zk2wfC2qLjf6nxUSptSpV6jbDkIMQXK2TsV1o5HgAjpdBAw';
16
+ const TURSO_URL_RAW = process.env.TURSO_DATABASE_URL || DEFAULT_TURSO_URL;
17
+ const TURSO_AUTH_TOKEN = process.env.TURSO_AUTH_TOKEN || DEFAULT_TURSO_TOKEN;
18
+ // Convert libsql:// URL to https:// for HTTP API
19
+ function getTursoHttpUrl() {
20
+ if (!TURSO_URL_RAW)
21
+ return '';
22
+ // libsql://db-name.turso.io -> https://db-name.turso.io
23
+ return TURSO_URL_RAW.replace('libsql://', 'https://');
24
+ }
25
+ /**
26
+ * Execute SQL against Turso using HTTP API (v2/pipeline)
27
+ */
28
+ async function executeSQL(sql, args = []) {
29
+ const tursoUrl = getTursoHttpUrl();
30
+ if (!tursoUrl || !TURSO_AUTH_TOKEN) {
31
+ throw new Error('Turso not configured. Set TURSO_DATABASE_URL and TURSO_AUTH_TOKEN.');
32
+ }
33
+ // Convert args to Turso format
34
+ const tursoArgs = args.map(arg => {
35
+ if (arg === null)
36
+ return { type: 'null', value: null };
37
+ if (typeof arg === 'number')
38
+ return { type: 'integer', value: String(arg) };
39
+ if (typeof arg === 'boolean')
40
+ return { type: 'integer', value: arg ? '1' : '0' };
41
+ return { type: 'text', value: String(arg) };
42
+ });
43
+ const response = await fetch(`${tursoUrl}/v2/pipeline`, {
44
+ method: 'POST',
45
+ headers: {
46
+ 'Authorization': `Bearer ${TURSO_AUTH_TOKEN}`,
47
+ 'Content-Type': 'application/json',
48
+ },
49
+ body: JSON.stringify({
50
+ requests: [
51
+ { type: 'execute', stmt: { sql, args: tursoArgs } },
52
+ { type: 'close' }
53
+ ]
54
+ }),
55
+ });
56
+ if (!response.ok) {
57
+ const text = await response.text();
58
+ throw new Error(`Turso error: ${response.status} - ${text}`);
59
+ }
60
+ const data = await response.json();
61
+ // Extract columns and rows from the response
62
+ const result = data.results[0]?.response?.result;
63
+ if (!result) {
64
+ return { columns: [], rows: [] };
65
+ }
66
+ const columns = result.cols.map(c => c.name);
67
+ const rows = result.rows.map(row => row.map(cell => cell.value));
68
+ return { columns, rows };
69
+ }
70
+ /**
71
+ * Initialize database schema
72
+ */
73
+ export async function initSchema() {
74
+ // Projects table
75
+ await executeSQL(`
76
+ CREATE TABLE IF NOT EXISTS projects (
77
+ id TEXT PRIMARY KEY,
78
+ github_user_id INTEGER NOT NULL,
79
+ github_username TEXT NOT NULL,
80
+ name TEXT NOT NULL,
81
+ local_path TEXT NOT NULL,
82
+ current_phase TEXT DEFAULT 'IDLE',
83
+ current_step TEXT DEFAULT '',
84
+ progress INTEGER DEFAULT 0,
85
+ last_synced TEXT,
86
+ created_at TEXT DEFAULT CURRENT_TIMESTAMP,
87
+ UNIQUE(github_user_id, local_path)
88
+ )
89
+ `);
90
+ // Phase history table
91
+ await executeSQL(`
92
+ CREATE TABLE IF NOT EXISTS phase_history (
93
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
94
+ project_id TEXT NOT NULL,
95
+ phase TEXT NOT NULL,
96
+ step TEXT,
97
+ entered_at TEXT NOT NULL,
98
+ exited_at TEXT,
99
+ duration_minutes INTEGER,
100
+ FOREIGN KEY (project_id) REFERENCES projects(id)
101
+ )
102
+ `);
103
+ // Events table (for activity feed)
104
+ await executeSQL(`
105
+ CREATE TABLE IF NOT EXISTS events (
106
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
107
+ project_id TEXT NOT NULL,
108
+ event_type TEXT NOT NULL,
109
+ event_data TEXT,
110
+ created_at TEXT DEFAULT CURRENT_TIMESTAMP,
111
+ FOREIGN KEY (project_id) REFERENCES projects(id)
112
+ )
113
+ `);
114
+ // Gates status table
115
+ await executeSQL(`
116
+ CREATE TABLE IF NOT EXISTS gates (
117
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
118
+ project_id TEXT NOT NULL,
119
+ compiles INTEGER,
120
+ tests_pass INTEGER,
121
+ lints_pass INTEGER,
122
+ checked_at TEXT,
123
+ FOREIGN KEY (project_id) REFERENCES projects(id)
124
+ )
125
+ `);
126
+ // Suggestions table (for learning patterns)
127
+ await executeSQL(`
128
+ CREATE TABLE IF NOT EXISTS suggestions (
129
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
130
+ project_id TEXT NOT NULL,
131
+ suggestion TEXT NOT NULL,
132
+ accepted INTEGER DEFAULT 0,
133
+ user_prompt TEXT,
134
+ rejection_reason TEXT,
135
+ created_at TEXT DEFAULT CURRENT_TIMESTAMP,
136
+ FOREIGN KEY (project_id) REFERENCES projects(id)
137
+ )
138
+ `);
139
+ }
140
+ /**
141
+ * Generate a unique project ID
142
+ */
143
+ function generateProjectId(userId, projectPath) {
144
+ const pathHash = Buffer.from(projectPath).toString('base64url').slice(0, 12);
145
+ return `${userId}-${pathHash}`;
146
+ }
147
+ /**
148
+ * Calculate progress percentage from phase/step
149
+ */
150
+ function calculateProgress(phase) {
151
+ const phaseOrder = ['IDLE', 'PLAN', 'BUILD', 'SHIP', 'GROW'];
152
+ const stepCounts = {
153
+ IDLE: 1,
154
+ PLAN: 5, // IDEA, RESEARCH, BRAINLIFT, PRD, GAMEPLAN
155
+ BUILD: 7, // RULES, INDEX, READ, RESEARCH, IMPLEMENT, TEST, DEBUG
156
+ SHIP: 3, // REVIEW, DEPLOY, MONITOR
157
+ GROW: 3, // FEEDBACK, ANALYZE, ITERATE
158
+ };
159
+ const phaseSteps = {
160
+ PLAN: ['IDEA', 'RESEARCH', 'BRAINLIFT', 'PRD', 'GAMEPLAN'],
161
+ BUILD: ['RULES', 'INDEX', 'READ', 'RESEARCH', 'IMPLEMENT', 'TEST', 'DEBUG'],
162
+ SHIP: ['REVIEW', 'DEPLOY', 'MONITOR'],
163
+ GROW: ['FEEDBACK', 'ANALYZE', 'ITERATE'],
164
+ };
165
+ if (phase.phase === 'IDLE')
166
+ return 0;
167
+ const phaseIdx = phaseOrder.indexOf(phase.phase);
168
+ let completedSteps = 0;
169
+ // Count completed phases
170
+ for (let i = 1; i < phaseIdx; i++) {
171
+ completedSteps += stepCounts[phaseOrder[i]];
172
+ }
173
+ // Add current phase progress
174
+ if ('step' in phase && phaseSteps[phase.phase]) {
175
+ const stepIdx = phaseSteps[phase.phase].indexOf(phase.step);
176
+ completedSteps += stepIdx;
177
+ }
178
+ const totalSteps = 5 + 7 + 3 + 3; // PLAN + BUILD + SHIP + GROW
179
+ return Math.round((completedSteps / totalSteps) * 100);
180
+ }
181
+ /**
182
+ * Sync project state to cloud
183
+ */
184
+ export async function syncProject(projectPath) {
185
+ const safePath = sanitizePath(projectPath);
186
+ // Check authentication
187
+ if (!isAuthenticated()) {
188
+ return { success: false, error: 'Not authenticated. Run: midas login' };
189
+ }
190
+ const user = getAuthenticatedUser();
191
+ if (!user) {
192
+ return { success: false, error: 'User info not available' };
193
+ }
194
+ try {
195
+ // Load local state
196
+ const state = loadState(safePath);
197
+ const tracker = loadTracker(safePath);
198
+ const projectName = basename(safePath);
199
+ const projectId = generateProjectId(user.userId, safePath);
200
+ const progress = calculateProgress(state.current);
201
+ const now = new Date().toISOString();
202
+ // Upsert project
203
+ await executeSQL(`
204
+ INSERT INTO projects (id, github_user_id, github_username, name, local_path, current_phase, current_step, progress, last_synced)
205
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
206
+ ON CONFLICT(github_user_id, local_path) DO UPDATE SET
207
+ current_phase = excluded.current_phase,
208
+ current_step = excluded.current_step,
209
+ progress = excluded.progress,
210
+ last_synced = excluded.last_synced
211
+ `, [
212
+ projectId,
213
+ user.userId,
214
+ user.username,
215
+ projectName,
216
+ safePath,
217
+ state.current.phase,
218
+ 'step' in state.current ? state.current.step : '',
219
+ progress,
220
+ now,
221
+ ]);
222
+ // Sync recent events
223
+ if (tracker.recentToolCalls.length > 0) {
224
+ const recentCall = tracker.recentToolCalls[0];
225
+ await executeSQL(`
226
+ INSERT INTO events (project_id, event_type, event_data, created_at)
227
+ VALUES (?, 'tool_call', ?, ?)
228
+ `, [
229
+ projectId,
230
+ JSON.stringify({ tool: recentCall.tool, args: recentCall.args }),
231
+ new Date(recentCall.timestamp).toISOString(),
232
+ ]);
233
+ }
234
+ // Sync gates status
235
+ if (tracker.gates.compiledAt || tracker.gates.testedAt || tracker.gates.lintedAt) {
236
+ await executeSQL(`
237
+ INSERT INTO gates (project_id, compiles, tests_pass, lints_pass, checked_at)
238
+ VALUES (?, ?, ?, ?, ?)
239
+ `, [
240
+ projectId,
241
+ tracker.gates.compiles === null ? null : tracker.gates.compiles ? 1 : 0,
242
+ tracker.gates.testsPass === null ? null : tracker.gates.testsPass ? 1 : 0,
243
+ tracker.gates.lintsPass === null ? null : tracker.gates.lintsPass ? 1 : 0,
244
+ now,
245
+ ]);
246
+ }
247
+ // Sync recent suggestions
248
+ for (const suggestion of tracker.suggestionHistory.slice(0, 5)) {
249
+ await executeSQL(`
250
+ INSERT INTO suggestions (project_id, suggestion, accepted, user_prompt, rejection_reason, created_at)
251
+ VALUES (?, ?, ?, ?, ?, ?)
252
+ `, [
253
+ projectId,
254
+ suggestion.suggestion,
255
+ suggestion.accepted ? 1 : 0,
256
+ suggestion.userPrompt || null,
257
+ suggestion.rejectionReason || null,
258
+ new Date(suggestion.timestamp).toISOString(),
259
+ ]);
260
+ }
261
+ return {
262
+ success: true,
263
+ projectId,
264
+ syncedAt: now,
265
+ };
266
+ }
267
+ catch (error) {
268
+ return {
269
+ success: false,
270
+ error: error instanceof Error ? error.message : String(error),
271
+ };
272
+ }
273
+ }
274
+ /**
275
+ * Get all projects for authenticated user
276
+ */
277
+ export async function getProjects() {
278
+ const user = getAuthenticatedUser();
279
+ if (!user)
280
+ return [];
281
+ const result = await executeSQL(`
282
+ SELECT * FROM projects WHERE github_user_id = ? ORDER BY last_synced DESC
283
+ `, [user.userId]);
284
+ return result.rows.map(row => ({
285
+ id: row[0],
286
+ github_user_id: row[1],
287
+ github_username: row[2],
288
+ name: row[3],
289
+ local_path: row[4],
290
+ current_phase: row[5],
291
+ current_step: row[6],
292
+ progress: row[7],
293
+ last_synced: row[8],
294
+ created_at: row[9],
295
+ }));
296
+ }
297
+ /**
298
+ * Check if cloud sync is configured
299
+ */
300
+ export function isCloudConfigured() {
301
+ return !!TURSO_URL_RAW && !!TURSO_AUTH_TOKEN;
302
+ }
303
+ /**
304
+ * CLI command to sync
305
+ */
306
+ export async function runSync(projectPath) {
307
+ console.log('\n Syncing to cloud...\n');
308
+ const result = await syncProject(projectPath);
309
+ if (result.success) {
310
+ console.log(` ✓ Synced successfully`);
311
+ console.log(` Project ID: ${result.projectId}`);
312
+ console.log(` Synced at: ${result.syncedAt}\n`);
313
+ console.log(` View at: https://dashboard.midasmcp.com\n`);
314
+ }
315
+ else {
316
+ console.log(` ✗ Sync failed: ${result.error}\n`);
317
+ }
318
+ }
319
+ //# sourceMappingURL=cloud.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloud.js","sourceRoot":"","sources":["../src/cloud.ts"],"names":[],"mappings":"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"}