midas-mcp 5.43.12 → 5.44.2

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,472 @@
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 { parseGameplanTasks } from './gameplan-tracker.js';
11
+ import { discoverDocsSync } from './docs-discovery.js';
12
+ import { sanitizePath } from './security.js';
13
+ import { basename } from 'path';
14
+ // Turso configuration - shared database for all Midas users
15
+ // Users can override with env vars for self-hosted setups
16
+ const DEFAULT_TURSO_URL = 'libsql://midas-christiancattaneo.aws-us-east-1.turso.io';
17
+ const DEFAULT_TURSO_TOKEN = 'eyJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE3NzAwNzY5OTAsImlkIjoiMzdiMTQ4NjEtNzFhZi00ZDgyLTg1ZDItYmY5OThhM2VmZjUxIiwicmlkIjoiNDQyMDJmMzItNWQ5YS00MTgyLTllM2ItNjE3MWUyNDk4ODY2In0.pm1VW_o8ARe25fwx8HrXyOAKAUnMxZrWrD_kIc0zk2wfC2qLjf6nxUSptSpV6jbDkIMQXK2TsV1o5HgAjpdBAw';
18
+ const TURSO_URL_RAW = process.env.TURSO_DATABASE_URL || DEFAULT_TURSO_URL;
19
+ const TURSO_AUTH_TOKEN = process.env.TURSO_AUTH_TOKEN || DEFAULT_TURSO_TOKEN;
20
+ // Convert libsql:// URL to https:// for HTTP API
21
+ function getTursoHttpUrl() {
22
+ if (!TURSO_URL_RAW)
23
+ return '';
24
+ // libsql://db-name.turso.io -> https://db-name.turso.io
25
+ return TURSO_URL_RAW.replace('libsql://', 'https://');
26
+ }
27
+ /**
28
+ * Execute SQL against Turso using HTTP API (v2/pipeline)
29
+ */
30
+ async function executeSQL(sql, args = []) {
31
+ const tursoUrl = getTursoHttpUrl();
32
+ if (!tursoUrl || !TURSO_AUTH_TOKEN) {
33
+ throw new Error('Turso not configured. Set TURSO_DATABASE_URL and TURSO_AUTH_TOKEN.');
34
+ }
35
+ // Convert args to Turso format
36
+ const tursoArgs = args.map(arg => {
37
+ if (arg === null)
38
+ return { type: 'null', value: null };
39
+ if (typeof arg === 'number')
40
+ return { type: 'integer', value: String(arg) };
41
+ if (typeof arg === 'boolean')
42
+ return { type: 'integer', value: arg ? '1' : '0' };
43
+ return { type: 'text', value: String(arg) };
44
+ });
45
+ const response = await fetch(`${tursoUrl}/v2/pipeline`, {
46
+ method: 'POST',
47
+ headers: {
48
+ 'Authorization': `Bearer ${TURSO_AUTH_TOKEN}`,
49
+ 'Content-Type': 'application/json',
50
+ },
51
+ body: JSON.stringify({
52
+ requests: [
53
+ { type: 'execute', stmt: { sql, args: tursoArgs } },
54
+ { type: 'close' }
55
+ ]
56
+ }),
57
+ });
58
+ if (!response.ok) {
59
+ const text = await response.text();
60
+ throw new Error(`Turso error: ${response.status} - ${text}`);
61
+ }
62
+ const data = await response.json();
63
+ // Extract columns and rows from the response
64
+ const result = data.results[0]?.response?.result;
65
+ if (!result) {
66
+ return { columns: [], rows: [] };
67
+ }
68
+ const columns = result.cols.map(c => c.name);
69
+ const rows = result.rows.map(row => row.map(cell => cell.value));
70
+ return { columns, rows };
71
+ }
72
+ /**
73
+ * Initialize database schema
74
+ */
75
+ export async function initSchema() {
76
+ // Projects table
77
+ await executeSQL(`
78
+ CREATE TABLE IF NOT EXISTS projects (
79
+ id TEXT PRIMARY KEY,
80
+ github_user_id INTEGER NOT NULL,
81
+ github_username TEXT NOT NULL,
82
+ name TEXT NOT NULL,
83
+ local_path TEXT NOT NULL,
84
+ current_phase TEXT DEFAULT 'IDLE',
85
+ current_step TEXT DEFAULT '',
86
+ progress INTEGER DEFAULT 0,
87
+ last_synced TEXT,
88
+ created_at TEXT DEFAULT CURRENT_TIMESTAMP,
89
+ UNIQUE(github_user_id, local_path)
90
+ )
91
+ `);
92
+ // Phase history table
93
+ await executeSQL(`
94
+ CREATE TABLE IF NOT EXISTS phase_history (
95
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
96
+ project_id TEXT NOT NULL,
97
+ phase TEXT NOT NULL,
98
+ step TEXT,
99
+ entered_at TEXT NOT NULL,
100
+ exited_at TEXT,
101
+ duration_minutes INTEGER,
102
+ FOREIGN KEY (project_id) REFERENCES projects(id)
103
+ )
104
+ `);
105
+ // Events table (for activity feed)
106
+ await executeSQL(`
107
+ CREATE TABLE IF NOT EXISTS events (
108
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
109
+ project_id TEXT NOT NULL,
110
+ event_type TEXT NOT NULL,
111
+ event_data TEXT,
112
+ created_at TEXT DEFAULT CURRENT_TIMESTAMP,
113
+ FOREIGN KEY (project_id) REFERENCES projects(id)
114
+ )
115
+ `);
116
+ // Gates status table
117
+ await executeSQL(`
118
+ CREATE TABLE IF NOT EXISTS gates (
119
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
120
+ project_id TEXT NOT NULL,
121
+ compiles INTEGER,
122
+ tests_pass INTEGER,
123
+ lints_pass INTEGER,
124
+ checked_at TEXT,
125
+ FOREIGN KEY (project_id) REFERENCES projects(id)
126
+ )
127
+ `);
128
+ // Suggestions table (for learning patterns)
129
+ await executeSQL(`
130
+ CREATE TABLE IF NOT EXISTS suggestions (
131
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
132
+ project_id TEXT NOT NULL,
133
+ suggestion TEXT NOT NULL,
134
+ accepted INTEGER DEFAULT 0,
135
+ user_prompt TEXT,
136
+ rejection_reason TEXT,
137
+ created_at TEXT DEFAULT CURRENT_TIMESTAMP,
138
+ FOREIGN KEY (project_id) REFERENCES projects(id)
139
+ )
140
+ `);
141
+ // Gameplan tasks table (for dashboard prompting)
142
+ await executeSQL(`
143
+ CREATE TABLE IF NOT EXISTS gameplan_tasks (
144
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
145
+ project_id TEXT NOT NULL,
146
+ task_id TEXT NOT NULL,
147
+ task_text TEXT NOT NULL,
148
+ phase TEXT,
149
+ completed INTEGER DEFAULT 0,
150
+ priority TEXT,
151
+ task_order INTEGER DEFAULT 0,
152
+ created_at TEXT DEFAULT CURRENT_TIMESTAMP,
153
+ FOREIGN KEY (project_id) REFERENCES projects(id),
154
+ UNIQUE(project_id, task_id)
155
+ )
156
+ `);
157
+ // Pending commands table (for Pilot automation)
158
+ await executeSQL(`
159
+ CREATE TABLE IF NOT EXISTS pending_commands (
160
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
161
+ project_id TEXT NOT NULL,
162
+ github_user_id INTEGER NOT NULL,
163
+ command_type TEXT NOT NULL,
164
+ prompt TEXT NOT NULL,
165
+ status TEXT DEFAULT 'pending',
166
+ priority INTEGER DEFAULT 0,
167
+ max_turns INTEGER DEFAULT 10,
168
+ created_at TEXT DEFAULT CURRENT_TIMESTAMP,
169
+ started_at TEXT,
170
+ completed_at TEXT,
171
+ output TEXT,
172
+ error TEXT,
173
+ exit_code INTEGER,
174
+ duration_ms INTEGER,
175
+ session_id TEXT,
176
+ FOREIGN KEY (project_id) REFERENCES projects(id)
177
+ )
178
+ `);
179
+ }
180
+ /**
181
+ * Generate a unique project ID
182
+ */
183
+ function generateProjectId(userId, projectPath) {
184
+ const pathHash = Buffer.from(projectPath).toString('base64url').slice(0, 12);
185
+ return `${userId}-${pathHash}`;
186
+ }
187
+ /**
188
+ * Calculate progress percentage from phase/step
189
+ */
190
+ function calculateProgress(phase) {
191
+ const phaseOrder = ['IDLE', 'PLAN', 'BUILD', 'SHIP', 'GROW'];
192
+ const stepCounts = {
193
+ IDLE: 1,
194
+ PLAN: 5, // IDEA, RESEARCH, BRAINLIFT, PRD, GAMEPLAN
195
+ BUILD: 7, // RULES, INDEX, READ, RESEARCH, IMPLEMENT, TEST, DEBUG
196
+ SHIP: 3, // REVIEW, DEPLOY, MONITOR
197
+ GROW: 3, // FEEDBACK, ANALYZE, ITERATE
198
+ };
199
+ const phaseSteps = {
200
+ PLAN: ['IDEA', 'RESEARCH', 'BRAINLIFT', 'PRD', 'GAMEPLAN'],
201
+ BUILD: ['RULES', 'INDEX', 'READ', 'RESEARCH', 'IMPLEMENT', 'TEST', 'DEBUG'],
202
+ SHIP: ['REVIEW', 'DEPLOY', 'MONITOR'],
203
+ GROW: ['FEEDBACK', 'ANALYZE', 'ITERATE'],
204
+ };
205
+ if (phase.phase === 'IDLE')
206
+ return 0;
207
+ const phaseIdx = phaseOrder.indexOf(phase.phase);
208
+ let completedSteps = 0;
209
+ // Count completed phases
210
+ for (let i = 1; i < phaseIdx; i++) {
211
+ completedSteps += stepCounts[phaseOrder[i]];
212
+ }
213
+ // Add current phase progress
214
+ if ('step' in phase && phaseSteps[phase.phase]) {
215
+ const stepIdx = phaseSteps[phase.phase].indexOf(phase.step);
216
+ completedSteps += stepIdx;
217
+ }
218
+ const totalSteps = 5 + 7 + 3 + 3; // PLAN + BUILD + SHIP + GROW
219
+ return Math.round((completedSteps / totalSteps) * 100);
220
+ }
221
+ /**
222
+ * Sync project state to cloud
223
+ */
224
+ export async function syncProject(projectPath) {
225
+ const safePath = sanitizePath(projectPath);
226
+ // Check authentication
227
+ if (!isAuthenticated()) {
228
+ return { success: false, error: 'Not authenticated. Run: midas login' };
229
+ }
230
+ const user = getAuthenticatedUser();
231
+ if (!user) {
232
+ return { success: false, error: 'User info not available' };
233
+ }
234
+ try {
235
+ // Load local state
236
+ const state = loadState(safePath);
237
+ const tracker = loadTracker(safePath);
238
+ const projectName = basename(safePath);
239
+ const projectId = generateProjectId(user.userId, safePath);
240
+ const progress = calculateProgress(state.current);
241
+ const now = new Date().toISOString();
242
+ // Upsert project
243
+ await executeSQL(`
244
+ INSERT INTO projects (id, github_user_id, github_username, name, local_path, current_phase, current_step, progress, last_synced)
245
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
246
+ ON CONFLICT(github_user_id, local_path) DO UPDATE SET
247
+ current_phase = excluded.current_phase,
248
+ current_step = excluded.current_step,
249
+ progress = excluded.progress,
250
+ last_synced = excluded.last_synced
251
+ `, [
252
+ projectId,
253
+ user.userId,
254
+ user.username,
255
+ projectName,
256
+ safePath,
257
+ state.current.phase,
258
+ 'step' in state.current ? state.current.step : '',
259
+ progress,
260
+ now,
261
+ ]);
262
+ // Sync recent events
263
+ if (tracker.recentToolCalls.length > 0) {
264
+ const recentCall = tracker.recentToolCalls[0];
265
+ await executeSQL(`
266
+ INSERT INTO events (project_id, event_type, event_data, created_at)
267
+ VALUES (?, 'tool_call', ?, ?)
268
+ `, [
269
+ projectId,
270
+ JSON.stringify({ tool: recentCall.tool, args: recentCall.args }),
271
+ new Date(recentCall.timestamp).toISOString(),
272
+ ]);
273
+ }
274
+ // Sync gates status
275
+ if (tracker.gates.compiledAt || tracker.gates.testedAt || tracker.gates.lintedAt) {
276
+ await executeSQL(`
277
+ INSERT INTO gates (project_id, compiles, tests_pass, lints_pass, checked_at)
278
+ VALUES (?, ?, ?, ?, ?)
279
+ `, [
280
+ projectId,
281
+ tracker.gates.compiles === null ? null : tracker.gates.compiles ? 1 : 0,
282
+ tracker.gates.testsPass === null ? null : tracker.gates.testsPass ? 1 : 0,
283
+ tracker.gates.lintsPass === null ? null : tracker.gates.lintsPass ? 1 : 0,
284
+ now,
285
+ ]);
286
+ }
287
+ // Sync recent suggestions
288
+ for (const suggestion of tracker.suggestionHistory.slice(0, 5)) {
289
+ await executeSQL(`
290
+ INSERT INTO suggestions (project_id, suggestion, accepted, user_prompt, rejection_reason, created_at)
291
+ VALUES (?, ?, ?, ?, ?, ?)
292
+ `, [
293
+ projectId,
294
+ suggestion.suggestion,
295
+ suggestion.accepted ? 1 : 0,
296
+ suggestion.userPrompt || null,
297
+ suggestion.rejectionReason || null,
298
+ new Date(suggestion.timestamp).toISOString(),
299
+ ]);
300
+ }
301
+ // Sync gameplan tasks
302
+ try {
303
+ const docs = discoverDocsSync(safePath);
304
+ if (docs.gameplan?.content) {
305
+ const tasks = parseGameplanTasks(docs.gameplan.content);
306
+ // Clear existing tasks for this project first
307
+ await executeSQL(`DELETE FROM gameplan_tasks WHERE project_id = ?`, [projectId]);
308
+ // Insert current tasks
309
+ for (let i = 0; i < tasks.length; i++) {
310
+ const task = tasks[i];
311
+ await executeSQL(`
312
+ INSERT INTO gameplan_tasks (project_id, task_id, task_text, phase, completed, priority, task_order)
313
+ VALUES (?, ?, ?, ?, ?, ?, ?)
314
+ `, [
315
+ projectId,
316
+ task.id,
317
+ task.text,
318
+ task.phase || null,
319
+ task.completed ? 1 : 0,
320
+ task.priority || 'medium',
321
+ i,
322
+ ]);
323
+ }
324
+ }
325
+ }
326
+ catch (err) {
327
+ // Non-fatal: gameplan sync failure shouldn't break overall sync
328
+ console.error(' Warning: Could not sync gameplan tasks');
329
+ }
330
+ return {
331
+ success: true,
332
+ projectId,
333
+ syncedAt: now,
334
+ };
335
+ }
336
+ catch (error) {
337
+ return {
338
+ success: false,
339
+ error: error instanceof Error ? error.message : String(error),
340
+ };
341
+ }
342
+ }
343
+ /**
344
+ * Get all projects for authenticated user
345
+ */
346
+ export async function getProjects() {
347
+ const user = getAuthenticatedUser();
348
+ if (!user)
349
+ return [];
350
+ const result = await executeSQL(`
351
+ SELECT * FROM projects WHERE github_user_id = ? ORDER BY last_synced DESC
352
+ `, [user.userId]);
353
+ return result.rows.map(row => ({
354
+ id: row[0],
355
+ github_user_id: row[1],
356
+ github_username: row[2],
357
+ name: row[3],
358
+ local_path: row[4],
359
+ current_phase: row[5],
360
+ current_step: row[6],
361
+ progress: row[7],
362
+ last_synced: row[8],
363
+ created_at: row[9],
364
+ }));
365
+ }
366
+ /**
367
+ * Check if cloud sync is configured
368
+ */
369
+ export function isCloudConfigured() {
370
+ return !!TURSO_URL_RAW && !!TURSO_AUTH_TOKEN;
371
+ }
372
+ /**
373
+ * Fetch pending commands for the authenticated user
374
+ */
375
+ export async function fetchPendingCommands() {
376
+ const user = getAuthenticatedUser();
377
+ if (!user)
378
+ return [];
379
+ const result = await executeSQL(`
380
+ SELECT * FROM pending_commands
381
+ WHERE github_user_id = ? AND status = 'pending'
382
+ ORDER BY priority DESC, created_at ASC
383
+ LIMIT 10
384
+ `, [user.userId]);
385
+ return result.rows.map(row => ({
386
+ id: row[0],
387
+ project_id: row[1],
388
+ github_user_id: row[2],
389
+ command_type: row[3],
390
+ prompt: row[4],
391
+ status: row[5],
392
+ priority: row[6],
393
+ max_turns: row[7],
394
+ created_at: row[8],
395
+ started_at: row[9],
396
+ completed_at: row[10],
397
+ output: row[11],
398
+ error: row[12],
399
+ exit_code: row[13],
400
+ duration_ms: row[14],
401
+ session_id: row[15],
402
+ }));
403
+ }
404
+ /**
405
+ * Mark a command as running
406
+ */
407
+ export async function markCommandRunning(commandId) {
408
+ await executeSQL(`
409
+ UPDATE pending_commands
410
+ SET status = 'running', started_at = ?
411
+ WHERE id = ?
412
+ `, [new Date().toISOString(), commandId]);
413
+ }
414
+ /**
415
+ * Mark a command as completed
416
+ */
417
+ export async function markCommandCompleted(commandId, result) {
418
+ await executeSQL(`
419
+ UPDATE pending_commands
420
+ SET status = ?, completed_at = ?, output = ?, error = ?, exit_code = ?, duration_ms = ?, session_id = ?
421
+ WHERE id = ?
422
+ `, [
423
+ result.success ? 'completed' : 'failed',
424
+ new Date().toISOString(),
425
+ result.success ? result.output : null,
426
+ result.success ? null : result.output,
427
+ result.exitCode,
428
+ result.durationMs,
429
+ result.sessionId || null,
430
+ commandId,
431
+ ]);
432
+ }
433
+ /**
434
+ * Get project details by ID (for Pilot to know the path)
435
+ */
436
+ export async function getProjectById(projectId) {
437
+ const result = await executeSQL(`
438
+ SELECT * FROM projects WHERE id = ?
439
+ `, [projectId]);
440
+ if (result.rows.length === 0)
441
+ return null;
442
+ const row = result.rows[0];
443
+ return {
444
+ id: row[0],
445
+ github_user_id: row[1],
446
+ github_username: row[2],
447
+ name: row[3],
448
+ local_path: row[4],
449
+ current_phase: row[5],
450
+ current_step: row[6],
451
+ progress: row[7],
452
+ last_synced: row[8],
453
+ created_at: row[9],
454
+ };
455
+ }
456
+ /**
457
+ * CLI command to sync
458
+ */
459
+ export async function runSync(projectPath) {
460
+ console.log('\n Syncing to cloud...\n');
461
+ const result = await syncProject(projectPath);
462
+ if (result.success) {
463
+ console.log(` ✓ Synced successfully`);
464
+ console.log(` Project ID: ${result.projectId}`);
465
+ console.log(` Synced at: ${result.syncedAt}\n`);
466
+ console.log(` View at: https://dashboard.midasmcp.com\n`);
467
+ }
468
+ else {
469
+ console.log(` ✗ Sync failed: ${result.error}\n`);
470
+ }
471
+ }
472
+ //# sourceMappingURL=cloud.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloud.js","sourceRoot":"","sources":["../src/cloud.ts"],"names":[],"mappings":"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"}