@rigstate/mcp 0.5.1 → 0.5.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/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/lib/supabase.ts","../src/server/factory.ts","../src/server/types.ts","../src/lib/tool-registry.ts","../src/lib/curator/schemas.ts","../src/lib/curator/actions/query.ts","../src/lib/curator/actions/submit.ts","../src/lib/curator/actions/stats.ts","../src/lib/curator/actions/fortress.ts","../src/tools/curator-tools.ts","../src/tools/teacher-mode.ts","../src/lib/context-engine.ts","../src/lib/schemas.ts","../src/tools/get-project-context.ts","../src/tools/query-brain.ts","../src/tools/get-latest-decisions.ts","../src/tools/save-decision.ts","../src/tools/submit-idea.ts","../src/tools/update-roadmap.ts","../src/tools/run-architecture-audit.ts","../src/tools/sync-ide-rules.ts","../src/tools/list-features.ts","../src/tools/list-roadmap-tasks.ts","../src/tools/get-next-roadmap-step.ts","../src/tools/check-rules-sync.ts","../src/tools/analyze-database-performance.ts","../src/tools/security-checks.ts","../src/tools/security-tools.ts","../src/tools/audit-integrity-gate.ts","../src/tools/complete-roadmap-task.ts","../src/tools/planning-tools.ts","../src/tools/arch-tools.ts","../src/server/core.ts","../src/agents/the-scribe.ts","../src/tools/generate-professional-pdf.ts","../src/server/telemetry.ts"],"sourcesContent":["import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { authenticateApiKey } from './lib/supabase.js';\nimport { createMcpServer } from './server/factory.js';\nimport { setupToolHandlers } from './server/core.js';\nimport { startFrankWatcher } from './server/telemetry.js';\n\nasync function main() {\n const apiKey = process.env.RIGSTATE_API_KEY;\n\n if (!apiKey) {\n console.error('❌ RIGSTATE_API_KEY environment variable is required');\n process.exit(1);\n }\n\n // 1. Authenticate\n const authResult = await authenticateApiKey(apiKey);\n if (!authResult.success || !authResult.context) {\n console.error(`❌ Authentication failed: ${authResult.error}`);\n process.exit(1);\n }\n\n const { supabase, userId } = authResult.context;\n\n // 2. Start Telemetry (Frank Watcher)\n startFrankWatcher(supabase, userId);\n\n // 3. Create Server (Factory)\n const server = createMcpServer();\n\n // 4. Setup Handlers (Core)\n setupToolHandlers(server, { supabase, userId });\n\n // 5. Connect Transport\n const transport = new StdioServerTransport();\n await server.connect(transport);\n\n console.error('🛰️ Rigstate MCP Server (Evolutionary) running on stdio');\n}\n\nmain().catch((error) => {\n console.error('FATAL ERROR:', error);\n process.exit(1);\n});\n","/**\n * Rigstate MCP Server - Supabase Client\n * \n * Creates a Supabase client for MCP server operations.\n * Uses the RIGSTATE_API_KEY to authenticate and determine the user context.\n * \n * Required Environment Variables:\n * - RIGSTATE_API_KEY: Your API key from https://rigstate.dev/settings/api-keys\n * \n * Optional Environment Variables (defaults to production Rigstate):\n * - RIGSTATE_SUPABASE_URL: Override Supabase URL\n * - RIGSTATE_SUPABASE_ANON_KEY: Override Supabase anon key\n */\n\nimport { createClient as createSupabaseClient, SupabaseClient } from '@supabase/supabase-js';\nimport { createHash } from 'crypto';\n\n// Production Rigstate configuration\nconst PRODUCTION_SUPABASE_URL = 'https://gseblsxnfppsxbmtzcfj.supabase.co';\nconst PRODUCTION_SUPABASE_ANON_KEY = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImdzZWJsc3huZnBwc3hibXR6Y2ZqIiwicm9sZSI6ImFub24iLCJpYXQiOjE3MzYxODIxNjgsImV4cCI6MjA1MTc1ODE2OH0.bltFf6_gNH-p3jH8lRY8dCRK6fmgxO8Hjp7UGx8xSxY';\nconst PRODUCTION_SUPABASE_SERVICE_KEY = process.env.SUPABASE_SERVICE_ROLE_KEY || '';\n\n// Environment configuration\n// Priority: Explicit MCP env > Next.js env > Production defaults\nconst SUPABASE_URL =\n process.env.RIGSTATE_SUPABASE_URL ||\n process.env.NEXT_PUBLIC_SUPABASE_URL ||\n PRODUCTION_SUPABASE_URL;\n\nconst SUPABASE_ANON_KEY =\n process.env.RIGSTATE_SUPABASE_ANON_KEY ||\n process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY ||\n PRODUCTION_SUPABASE_ANON_KEY;\n\nconst SUPABASE_SERVICE_KEY =\n process.env.RIGSTATE_SUPABASE_SERVICE_KEY ||\n process.env.SUPABASE_SERVICE_ROLE_KEY ||\n PRODUCTION_SUPABASE_SERVICE_KEY;\n\n\nexport interface AuthContext {\n userId: string;\n apiKeyId: string;\n supabase: SupabaseClient;\n}\n\n/**\n * Validates the RIGSTATE_API_KEY and returns the authenticated user context.\n * \n * CRITICAL: API keys are stored as SHA-256 hashes in the database.\n * We must hash the incoming key before lookup.\n */\nexport async function authenticateApiKey(apiKey: string): Promise<{\n success: boolean;\n error?: string;\n context?: AuthContext;\n}> {\n if (!apiKey) {\n return { success: false, error: 'RIGSTATE_API_KEY is required' };\n }\n\n if (!apiKey.startsWith('sk_rigstate_')) {\n return { success: false, error: 'Invalid API key format. Expected sk_rigstate_...' };\n }\n\n if (!SUPABASE_URL || !SUPABASE_ANON_KEY) {\n return {\n success: false,\n error: 'Supabase configuration missing. Set RIGSTATE_SUPABASE_URL and RIGSTATE_SUPABASE_ANON_KEY.'\n };\n }\n\n // Hash the API key with SHA-256 (same as web app)\n const hashedKey = createHash('sha256').update(apiKey).digest('hex');\n\n // Use service key if available to bypass RLS, otherwise anon key\n const clientKey = SUPABASE_SERVICE_KEY || SUPABASE_ANON_KEY;\n const supabase = createSupabaseClient(SUPABASE_URL, clientKey);\n\n // Look up the API key by HASH (not plain text!)\n const { data: keyData, error: keyError } = await supabase\n .from('api_keys')\n .select('id, user_id, project_id, organization_id, scope')\n .eq('key_hash', hashedKey)\n .single();\n\n if (keyError || !keyData) {\n return { success: false, error: 'Invalid or revoked API key' };\n }\n\n // Update last_used_at timestamp (fire and forget)\n supabase\n .from('api_keys')\n .update({ last_used_at: new Date().toISOString() })\n .eq('id', keyData.id)\n .then();\n\n // Create a user-scoped client for subsequent operations\n // Use the most privileged key available (SERVICE_KEY or ANON_KEY)\n const userSupabase = createSupabaseClient(SUPABASE_URL, clientKey);\n\n return {\n success: true,\n context: {\n userId: keyData.user_id,\n apiKeyId: keyData.id,\n supabase: userSupabase\n }\n };\n}\n\n/**\n * Creates a Supabase client using environment variables.\n * For use after authentication has been established.\n */\nexport function createClient(): SupabaseClient {\n if (!SUPABASE_URL || !SUPABASE_ANON_KEY) {\n throw new Error('Supabase configuration missing. Set RIGSTATE_SUPABASE_URL and RIGSTATE_SUPABASE_ANON_KEY.');\n }\n return createSupabaseClient(SUPABASE_URL, SUPABASE_ANON_KEY);\n}\n","import { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport { ListToolsRequestSchema, ListResourcesRequestSchema } from '@modelcontextprotocol/sdk/types.js';\nimport { SERVER_NAME, SERVER_VERSION } from './types.js';\nimport { registry } from '../lib/tool-registry.js';\nimport { getProjectMorals } from '../resources/project-morals.js';\n\n// Import tool modules to trigger registration\nimport '../tools/curator-tools.js';\nimport '../tools/teacher-mode.js';\nimport '../tools/get-project-context.js';\nimport '../tools/query-brain.js';\nimport '../tools/get-latest-decisions.js';\nimport '../tools/save-decision.js';\nimport '../tools/submit-idea.js';\nimport '../tools/update-roadmap.js';\nimport '../tools/run-architecture-audit.js';\nimport '../tools/sync-ide-rules.ts';\nimport '../tools/list-features.js';\nimport '../tools/list-roadmap-tasks.js';\nimport '../tools/get-next-roadmap-step.js';\nimport '../tools/check-rules-sync.js';\nimport '../tools/audit-integrity-gate.js';\nimport '../tools/complete-roadmap-task.js';\nimport '../tools/planning-tools.js';\nimport '../tools/security-tools.js';\nimport '../tools/arch-tools.js';\n\nexport const TOOLS = [\n {\n name: 'write_to_file',\n description: 'Guardian Lock: Blocks file writes if RIGSTATE_MODE is SUPERVISOR.',\n inputSchema: { type: 'object', properties: {}, additionalProperties: true }\n },\n {\n name: 'replace_file_content',\n description: 'Guardian Lock: Blocks file edits if RIGSTATE_MODE is SUPERVISOR.',\n inputSchema: { type: 'object', properties: {}, additionalProperties: true }\n },\n {\n name: 'run_command',\n description: 'Guardian Lock: Blocks commands if RIGSTATE_MODE is SUPERVISOR.',\n inputSchema: { type: 'object', properties: {}, additionalProperties: true }\n },\n {\n name: 'get_agent_status',\n description: `Checks the status of the internal Frank Watcher agent.`,\n inputSchema: { type: 'object', properties: {} }\n }\n];\n\n\nexport const RESOURCES = [\n {\n uri: 'rigstate://project_morals',\n name: 'Project Morals & Sovereignty',\n mimeType: 'text/markdown',\n description: 'The core ethical and architectural DNA of the project.'\n }\n];\n\nexport function createMcpServer() {\n const server = new Server(\n { name: SERVER_NAME, version: SERVER_VERSION },\n { capabilities: { tools: {}, resources: {} } }\n );\n\n // List Tools\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: [...TOOLS, ...registry.getTools()]\n }));\n\n // List Resources\n server.setRequestHandler(ListResourcesRequestSchema, async () => ({\n resources: RESOURCES\n }));\n\n return server;\n}\n","import { SupabaseClient } from '@supabase/supabase-js';\n\nexport interface WatcherState {\n isRunning: boolean;\n lastCheck: string | null;\n tasksFound: number;\n projectId: string | null;\n}\n\nexport interface McpServerConfig {\n name: string;\n version: string;\n}\n\nexport const SERVER_NAME = 'rigstate-mcp';\nexport const SERVER_VERSION = '0.5.0'; // Evolutionary Update\n\nexport interface AuthContext {\n supabase: SupabaseClient;\n userId: string;\n}\n","import { z } from 'zod';\nimport { SupabaseClient } from '@supabase/supabase-js';\nimport { Tool } from '@modelcontextprotocol/sdk/types.js';\n\n/**\n * Context provided to every tool execution.\n * Contains authentication and database access.\n */\nexport interface ToolContext {\n supabase: SupabaseClient;\n userId: string;\n}\n\n/**\n * A generic definition of a Tool.\n * T corresponds to the Zod schema for input validation.\n */\nexport interface ToolDefinition<T extends z.ZodType> {\n /** The unique name of the tool (e.g., 'list_features') */\n name: string;\n /** A helpful description for the AI */\n description: string;\n /** The Zod schema for input validation */\n schema: T;\n /** The function that executes the tool logic */\n handler: (args: z.infer<T>, context: ToolContext) => Promise<{ content: Array<{ type: string; text: string }> }>;\n}\n\n/**\n * The central registry for all MCP tools.\n * Handles registration, listing, and execution.\n */\nclass ToolRegistry {\n private tools: Map<string, ToolDefinition<any>> = new Map();\n\n /**\n * Registers a tool logic with the system.\n */\n register<T extends z.ZodType>(tool: ToolDefinition<T>) {\n if (this.tools.has(tool.name)) {\n console.warn(`Tool '${tool.name}' is already registered. Overwriting.`);\n }\n this.tools.set(tool.name, tool);\n }\n\n /**\n * Returns the list of tools formatted for the MCP 'ListTools' request.\n * Converts Zod schemas to JSON Schemas implicitly via manual type mapping or libraries.\n * For now, we manually map 'inputSchema' as 'object' in the index.ts, \n * but here we prepare the definitions.\n */\n getTools(): Tool[] {\n return Array.from(this.tools.values()).map(tool => {\n // Very basic Zod -> JSON Schema mapping. \n // In a real robust system, use 'zod-to-json-schema'.\n // Here we rely on the tool definer to keep it simple or we expand later.\n // For now, we assume standard object schema.\n\n // To avoid complex zod-to-json-schema dependency issues for now,\n // we will construct a basic JSON schema representation \n // from the Zod shape if possible, or expect the tool to provide it?\n // Let's rely on zod-to-json-schema if installed, or do a simple conversion.\n // Actually, let's keep it simple: We just return the Tool interface required by MCP SDK.\n\n // Hack for MVP: We assume the top level is always an object with properties.\n // We can improve this reflection later.\n\n return {\n name: tool.name,\n description: tool.description,\n inputSchema: this.zodToJsonSchema(tool.schema)\n };\n });\n }\n\n /**\n * Executes a tool by name.\n * Validates input against schema before execution.\n */\n async callTool(name: string, args: any, context: ToolContext) {\n const tool = this.tools.get(name);\n if (!tool) {\n throw new Error(`Tool '${name}' not found.`);\n }\n\n const parseResult = tool.schema.safeParse(args);\n if (!parseResult.success) {\n throw new Error(`Invalid arguments for tool '${name}': ${parseResult.error.message}`);\n }\n\n return await tool.handler(parseResult.data, context);\n }\n\n /**\n * Basic helper to convert Zod Object to JSON Schema.\n * Note: This is a simplified version. For complex types, use 'zod-to-json-schema'.\n */\n private zodToJsonSchema(schema: z.ZodType): any {\n if (schema instanceof z.ZodObject) {\n const shape = schema.shape;\n const properties: Record<string, any> = {};\n const required: string[] = [];\n\n for (const key in shape) {\n const field = shape[key];\n // Accessing description if available in Zod (requires extended Zod or casting)\n // Basic type mapping:\n let type = 'string';\n let description = field.description; // Leverages Zod's .describe()\n\n if (field instanceof z.ZodNumber) type = 'number';\n if (field instanceof z.ZodBoolean) type = 'boolean';\n if (field instanceof z.ZodArray) type = 'array';\n\n // Determine if optional\n if (!field.isOptional()) {\n required.push(key);\n }\n\n properties[key] = { type, description };\n }\n\n return {\n type: 'object',\n properties,\n required\n };\n }\n // Fallback or other types\n return { type: 'object', properties: {} };\n }\n}\n\nexport const registry = new ToolRegistry();\n","import { z } from 'zod';\n\n// ============================================\n// Input Schemas\n// ============================================\n\nexport const QueryGlobalAntidotesSchema = z.object({\n categories: z.array(z.string()).optional().describe('Filter by categories (SECURITY, ARCHITECTURE, UX, PERFORMANCE, ACCESSIBILITY, MAINTAINABILITY)'),\n severities: z.array(z.string()).optional().describe('Filter by severity (CRITICAL, HIGH, MEDIUM, LOW)'),\n framework_tags: z.array(z.string()).optional().describe('Filter by framework tags (e.g., [\"nextjs\", \"react\", \"supabase\"])'),\n min_trust_score: z.number().optional().describe('Minimum trust score (0-100)'),\n search_text: z.string().optional().describe('Search in title and instruction'),\n limit: z.number().optional().describe('Max results (default: 20)')\n});\n\nexport const SubmitSignalSchema = z.object({\n projectId: z.string().describe('The UUID of the Rigstate project'),\n title: z.string().min(10).max(100).describe('Short, descriptive title (10-100 chars)'),\n instruction: z.string().min(50).max(2000).describe('The canonical instruction (50-2000 chars)'),\n category: z.enum(['SECURITY', 'ARCHITECTURE', 'UX', 'PERFORMANCE', 'ACCESSIBILITY', 'MAINTAINABILITY']).describe('The category of this antidote'),\n severity: z.enum(['CRITICAL', 'HIGH', 'MEDIUM', 'LOW']).describe('Severity level'),\n example: z.string().optional().describe('Good example demonstrating the instruction'),\n anti_example: z.string().optional().describe('Bad example showing what NOT to do'),\n framework_tags: z.array(z.string()).optional().describe('Relevant framework tags'),\n reasoning: z.string().optional().describe('Why this signal should be added'),\n source_type: z.string().optional().describe('Internal source type override (e.g. TEACHER_MODE)')\n});\n\nexport const GetCuratorStatsSchema = z.object({\n projectId: z.string().optional().describe('Optional project ID for context')\n});\n\nexport const CheckFortressSchema = z.object({\n projectId: z.string().describe('The UUID of the Rigstate project'),\n instruction: z.string().describe('The instruction to check against fortress rules'),\n category: z.enum(['SECURITY', 'ARCHITECTURE', 'UX', 'PERFORMANCE', 'ACCESSIBILITY', 'MAINTAINABILITY']).describe('Category of instruction')\n});\n","import { SupabaseClient } from '@supabase/supabase-js';\nimport { z } from 'zod';\nimport { QueryGlobalAntidotesSchema } from '../schemas.js';\n\n/**\n * Sigrid's Tool: Query Global Antidotes\n * Search and retrieve antidotes from the global registry.\n */\nexport async function queryGlobalAntidotes(\n supabase: SupabaseClient,\n userId: string,\n input: z.infer<typeof QueryGlobalAntidotesSchema>\n) {\n let query = supabase\n .from('global_antidotes')\n .select('id, slug, title, instruction, example, anti_example, category, severity, framework_tags, trust_score, occurrence_count, is_immutable')\n .eq('is_active', true);\n\n if (input.categories && input.categories.length > 0) {\n query = query.in('category', input.categories);\n }\n\n if (input.severities && input.severities.length > 0) {\n query = query.in('severity', input.severities);\n }\n\n if (input.framework_tags && input.framework_tags.length > 0) {\n query = query.overlaps('framework_tags', input.framework_tags);\n }\n\n if (input.min_trust_score !== undefined) {\n query = query.gte('trust_score', input.min_trust_score);\n }\n\n if (input.search_text) {\n query = query.or(`title.ilike.%${input.search_text}%,instruction.ilike.%${input.search_text}%`);\n }\n\n const { data, error } = await query\n .order('severity', { ascending: true }) // CRITICAL first\n .order('trust_score', { ascending: false })\n .limit(input.limit || 20);\n\n if (error) throw new Error(`Query failed: ${error.message}`);\n\n if (!data || data.length === 0) {\n return {\n antidotes: [],\n formatted: `=== GLOBAL ANTIDOTES REGISTRY ===\nNo antidotes found matching your criteria.\n================================`\n };\n }\n\n const formatted = data.map((a, i) => {\n const immutableBadge = a.is_immutable ? ' 🏰 FORTRESS' : '';\n const tags = a.framework_tags ? ` [${a.framework_tags.join(', ')}]` : '';\n return `${i + 1}. [${a.severity}] ${a.title}${immutableBadge}\n Category: ${a.category}${tags}\n Trust: ${a.trust_score}/100 | Occurrences: ${a.occurrence_count}\n ${a.instruction.substring(0, 200)}${a.instruction.length > 200 ? '...' : ''}`;\n }).join('\\n\\n');\n\n return {\n antidotes: data,\n formatted: `=== GLOBAL ANTIDOTES REGISTRY ===\nFound ${data.length} antidotes:\n\n${formatted}\n\n================================`\n };\n}\n","import { SupabaseClient } from '@supabase/supabase-js';\nimport { z } from 'zod';\nimport { SubmitSignalSchema } from '../schemas.js';\n\n/**\n * Sigrid's Tool: Submit Signal for Curation\n * Submit a new intelligence signal for processing through the curation pipeline.\n */\nexport async function submitSignal(\n supabase: SupabaseClient,\n userId: string,\n input: z.infer<typeof SubmitSignalSchema>\n) {\n // 1. Verify project ownership\n const { data: project, error: projectError } = await supabase\n .from('projects')\n .select('id')\n .eq('id', input.projectId)\n .eq('owner_id', userId)\n .single();\n\n if (projectError || !project) {\n throw new Error('Project not found or access denied');\n }\n\n // 2. Simple fingerprint for deduplication check (basic version for MCP)\n const fingerprintBase = `${input.instruction}::${input.category}`.toLowerCase();\n const simpleHash = fingerprintBase.split('').reduce((a, b) => {\n a = ((a << 5) - a) + b.charCodeAt(0);\n return a & a;\n }, 0).toString(16);\n\n // 3. Check for existing similar antidotes\n const { data: existing } = await supabase\n .from('global_antidotes')\n .select('id, slug, title')\n .ilike('instruction', `%${input.instruction.substring(0, 100)}%`)\n .eq('is_active', true)\n .limit(1);\n\n if (existing && existing.length > 0) {\n return handleReinforcement(supabase, existing[0]);\n }\n\n // 4. Check against fortress rules\n const fortressResult = await checkFortressConflicts(supabase, userId, input, simpleHash);\n if (!fortressResult.success) {\n return fortressResult;\n }\n\n // 5. Submit to Quarantine\n return submitToQuarantine(supabase, userId, input, simpleHash);\n}\n\n// Helpers\nasync function handleReinforcement(supabase: SupabaseClient, existing: any) {\n // Signal reinforces existing antidote - update last reinforced timestamp\n await supabase\n .from('global_antidotes')\n .update({ last_reinforced_at: new Date().toISOString() })\n .eq('id', existing.id);\n\n return {\n success: true,\n action: 'reinforced',\n message: `✅ Signal reinforces existing antidote: \"${existing.title}\" (${existing.slug}).\nThe occurrence count has been increased, boosting the antidote's authority.`,\n antidote_id: existing.id\n };\n}\n\nasync function checkFortressConflicts(\n supabase: SupabaseClient,\n userId: string,\n input: z.infer<typeof SubmitSignalSchema>,\n hash: string\n) {\n const fortressKeywords = {\n rls_required: ['disable rls', 'skip rls', 'bypass rls', 'rls off'],\n no_client_secrets: ['api key in client', 'hardcode secret', 'embed api key'],\n input_validation: ['skip validation', 'trust input', 'no validation'],\n auth_required: ['skip auth', 'bypass auth', 'disable auth']\n };\n\n const instructionLower = input.instruction.toLowerCase();\n for (const [rule, keywords] of Object.entries(fortressKeywords)) {\n for (const keyword of keywords) {\n if (instructionLower.includes(keyword)) {\n // Log violation\n await supabase.from('fortress_violations').insert({\n fortress_rule_slug: rule,\n violated_by_signal_hash: hash,\n conflict_type: 'DIRECT_CONTRADICTION',\n severity: 'CRITICAL',\n conflicting_instruction: input.instruction,\n source_user_id: userId,\n source_project_id: input.projectId\n });\n\n return {\n success: false,\n action: 'blocked',\n message: `❌ FORTRESS VIOLATION: Signal conflicts with immutable rule \"${rule}\".\nThis instruction attempts to weaken a core security principle and has been rejected.\nThe violation has been logged for security audit.`\n };\n }\n }\n }\n return { success: true };\n}\n\nasync function submitToQuarantine(\n supabase: SupabaseClient,\n userId: string,\n input: z.infer<typeof SubmitSignalSchema>,\n hash: string\n) {\n // Calculate basic trust score (simplified)\n let trustScore = 50; // Base score\n if (input.example) trustScore += 10;\n if (input.anti_example) trustScore += 10;\n if (input.instruction.length > 100) trustScore += 5;\n if (input.reasoning) trustScore += 5;\n if (input.category === 'SECURITY' && input.severity === 'CRITICAL') trustScore += 10;\n\n // Add to quarantine for human review (signals from MCP always go to quarantine)\n const { data: quarantine, error: quarantineError } = await supabase\n .from('curation_quarantine')\n .insert({\n signal_hash: hash,\n signal_content: {\n title: input.title,\n instruction: input.instruction,\n category: input.category,\n severity: input.severity,\n example: input.example,\n anti_example: input.anti_example,\n framework_tags: input.framework_tags,\n source_type: input.source_type || 'mcp_submission',\n source_context: {\n user_id: userId,\n project_id: input.projectId,\n reasoning: input.reasoning\n }\n },\n trust_score: trustScore,\n trust_breakdown: {\n final_score: trustScore,\n components: {\n completeness: input.example && input.anti_example ? 25 : 15,\n source_trust: 20,\n semantic_quality: 15,\n reinforcement_bonus: 0\n }\n },\n reason: 'MCP_SUBMISSION',\n suggested_action: trustScore >= 70 ? 'APPROVE' : trustScore >= 50 ? 'MERGE' : 'REJECT',\n source_user_id: userId,\n source_project_id: input.projectId\n })\n .select('id')\n .single();\n\n if (quarantineError) throw new Error(`Failed to submit signal: ${quarantineError.message}`);\n\n // Log audit entry\n await supabase.from('curation_audit_log').insert({\n action: 'SIGNAL_SUBMITTED',\n reason: `MCP signal submitted: \"${input.title}\" (trust: ${trustScore})`,\n actor_type: 'SYSTEM',\n actor_id: userId,\n signal_hash: hash,\n quarantine_id: quarantine?.id,\n metadata: { projectId: input.projectId, category: input.category }\n });\n\n return {\n success: true,\n action: 'quarantined',\n trust_score: trustScore,\n quarantine_id: quarantine?.id,\n message: `✅ Signal submitted for curation.\nTrust Score: ${trustScore}/100\nStatus: QUARANTINED (pending human review)\nSuggested Action: ${trustScore >= 70 ? 'APPROVE' : trustScore >= 50 ? 'MERGE' : 'NEEDS_REVIEW'}\n\nSigrid will process this signal and notify you of the result.`\n };\n}\n","import { SupabaseClient } from '@supabase/supabase-js';\nimport { z } from 'zod';\nimport { GetCuratorStatsSchema } from '../schemas.js';\n\n/**\n * Get Curator Statistics\n */\nexport async function getCuratorStats(\n supabase: SupabaseClient,\n userId: string,\n input: z.infer<typeof GetCuratorStatsSchema>\n) {\n // Get antidote counts\n const { data: antidotes, count: totalCount } = await supabase\n .from('global_antidotes')\n .select('id, category, severity, is_immutable', { count: 'exact' })\n .eq('is_active', true);\n\n const fortressCount = antidotes?.filter(a => a.is_immutable).length || 0;\n\n // Get quarantine count\n const { count: quarantineCount } = await supabase\n .from('curation_quarantine')\n .select('id', { count: 'exact', head: true })\n .is('decision', null);\n\n // Get today's activity\n const today = new Date();\n today.setHours(0, 0, 0, 0);\n const { data: todayActivity } = await supabase\n .from('curation_audit_log')\n .select('action')\n .gte('created_at', today.toISOString());\n\n const activityCounts = todayActivity?.reduce((acc: Record<string, number>, log: any) => {\n acc[log.action] = (acc[log.action] || 0) + 1;\n return acc;\n }, {}) || {};\n\n // Category distribution\n const categoryDistribution = antidotes?.reduce((acc: Record<string, number>, a) => {\n acc[a.category] = (acc[a.category] || 0) + 1;\n return acc;\n }, {}) || {};\n\n return {\n stats: {\n total_antidotes: totalCount || 0,\n fortress_rules: fortressCount,\n pending_quarantine: quarantineCount || 0,\n today_approved: activityCounts['AUTO_APPROVED'] || 0,\n today_rejected: activityCounts['AUTO_REJECTED'] || 0,\n today_quarantined: activityCounts['QUARANTINE_ADDED'] || 0,\n categories: categoryDistribution\n },\n formatted: `=== CURATOR REGISTRY STATS ===\n📊 Global Antidotes: ${totalCount || 0}\n🏰 Fortress Rules: ${fortressCount}\n⏳ Pending Review: ${quarantineCount || 0}\n\n📅 Today's Activity:\n ✅ Approved: ${activityCounts['AUTO_APPROVED'] || 0}\n ❌ Rejected: ${activityCounts['AUTO_REJECTED'] || 0}\n ⏸️ Quarantined: ${activityCounts['QUARANTINE_ADDED'] || 0}\n\n📁 By Category:\n${Object.entries(categoryDistribution).map(([cat, count]) => ` • ${cat}: ${count}`).join('\\n')}\n==============================`\n };\n}\n","import { SupabaseClient } from '@supabase/supabase-js';\nimport { z } from 'zod';\nimport { CheckFortressSchema } from '../schemas.js';\n\n/**\n * Check instruction against fortress rules\n */\nexport async function checkFortress(\n supabase: SupabaseClient,\n userId: string,\n input: z.infer<typeof CheckFortressSchema>\n) {\n // Load fortress rules\n const { data: fortressRules } = await supabase\n .from('global_antidotes')\n .select('slug, title, instruction')\n .eq('is_immutable', true)\n .eq('is_active', true);\n\n if (!fortressRules || fortressRules.length === 0) {\n return {\n passed: true,\n conflicts: [],\n message: '✅ No fortress rules configured. Instruction passes by default.'\n };\n }\n\n const conflicts: Array<{ rule: string; title: string; explanation: string }> = [];\n const instructionLower = input.instruction.toLowerCase();\n\n // Conflict patterns (simplified)\n const conflictPatterns: Record<string, RegExp[]> = {\n rls_required: [/disable\\s+r(ow\\s+level\\s+)?s(ecurity)?/i, /skip\\s+rls/i, /bypass\\s+rls/i],\n no_client_secrets: [/api\\s+keys?\\s+in\\s+(frontend|client)/i, /hardcode\\s+secret/i],\n input_validation: [/skip\\s+validation/i, /trust\\s+all\\s+input/i],\n auth_required: [/skip\\s+auth/i, /bypass\\s+auth/i, /disable\\s+auth/i]\n };\n\n for (const rule of fortressRules) {\n const patterns = conflictPatterns[rule.slug];\n if (patterns) {\n for (const pattern of patterns) {\n if (pattern.test(instructionLower)) {\n conflicts.push({\n rule: rule.slug,\n title: rule.title,\n explanation: `Instruction conflicts with fortress rule: ${rule.instruction.substring(0, 100)}...`\n });\n break;\n }\n }\n }\n }\n\n if (conflicts.length > 0) {\n return {\n passed: false,\n conflicts,\n message: `❌ FORTRESS CONFLICT DETECTED\n\n${conflicts.length} conflict(s) found:\n${conflicts.map((c, i) => `${i + 1}. [${c.rule}] ${c.title}\n ${c.explanation}`).join('\\n\\n')}\n\n⚠️ This instruction cannot be added to the registry as it violates immutable security rules.`\n };\n }\n\n return {\n passed: true,\n conflicts: [],\n message: `✅ FORTRESS CHECK PASSED\n\nInstruction does not conflict with any fortress rules.\nChecked against ${fortressRules.length} immutable rules.`\n };\n}\n","/**\n * Phase 8.5: The Curator Protocol\n * MCP Tools for Curator Operations\n * \n * Sigrid's Tools for Global Knowledge Curation.\n * These tools enable AI agents to contribute to and query the global antidote registry.\n */\n\nimport { registry } from '../lib/tool-registry.js';\nimport {\n queryGlobalAntidotes,\n submitSignal,\n getCuratorStats,\n checkFortress,\n QueryGlobalAntidotesSchema,\n SubmitSignalSchema,\n GetCuratorStatsSchema,\n CheckFortressSchema\n} from '../lib/curator/index.js';\n\n// ============================================\n// Tool Registration\n// ============================================\n\nregistry.register({\n name: 'query_global_antidotes',\n description: `Sigrid's Tool: Query the Global Antidotes Registry.\nSearch for cross-platform intelligence signals (antidotes) that encode best practices.\nUse this to find relevant security, architecture, UX, and performance guidelines.`,\n schema: QueryGlobalAntidotesSchema,\n handler: async (args, context) => {\n const result = await queryGlobalAntidotes(context.supabase, context.userId, args);\n return { content: [{ type: 'text', text: result.formatted }] };\n }\n});\n\nregistry.register({\n name: 'submit_curator_signal',\n description: `Sigrid's Tool: Submit a new signal to the Curator Protocol.\nWhen you discover a best practice or anti-pattern during development, submit it as a signal.\nSignals are processed through a trust-scoring pipeline and may be promoted to global antidotes.\nNote: All submissions go through quarantine for human review.`,\n schema: SubmitSignalSchema,\n handler: async (args, context) => {\n const result = await submitSignal(context.supabase, context.userId, args);\n return { content: [{ type: 'text', text: result.message }] };\n }\n});\n\nregistry.register({\n name: 'get_curator_stats',\n description: `Get statistics about the Curator Registry.\nShows total antidotes, fortress rules, pending quarantine, and today's curation activity.`,\n schema: GetCuratorStatsSchema,\n handler: async (args, context) => {\n const result = await getCuratorStats(context.supabase, context.userId, args);\n return { content: [{ type: 'text', text: result.formatted }] };\n }\n});\n\nregistry.register({\n name: 'check_fortress_rules',\n description: `Sigrid's Tool: Check an instruction against Fortress Rules.\nBefore submitting a signal, use this to verify it doesn't conflict with immutable security rules.\nFortress rules can NEVER be overridden by any signal.`,\n schema: CheckFortressSchema,\n handler: async (args, context) => {\n const result = await checkFortress(context.supabase, context.userId, args);\n return { content: [{ type: 'text', text: result.message }] };\n }\n});\n\n// Export functions for historical compatibility if any tests use them directly\nexport { queryGlobalAntidotes, submitSignal, getCuratorStats, checkFortress };\n","/**\n * Rigstate MCP Server - Teacher Mode Tools\n * \n * Allows Frank to send logic corrections and fetch learned behaviors.\n */\n\nimport { z } from 'zod';\nimport { SupabaseClient } from '@supabase/supabase-js';\nimport { v4 as uuidv4 } from 'uuid';\nimport { registry } from '../lib/tool-registry.js';\nimport { submitSignal } from '../lib/curator/index.js';\n\n// ============================================\n// Schemas\n// ============================================\n\nconst RefineLogicSchema = z.object({\n projectId: z.string().describe('The UUID of the Rigstate project'),\n originalReasoning: z.string().describe('What Frank originally said or did wrong'),\n userCorrection: z.string().describe('How Frank should handle this in the future'),\n scope: z.enum(['project', 'global']).default('project').describe('Whether this correction applies to this project only or all projects (default: project)')\n});\n\nconst GetLearnedInstructionsSchema = z.object({\n projectId: z.string().optional().describe('Optional project ID to include project-specific instructions')\n});\n\n// ============================================\n// Types\n// ============================================\n\nexport interface RefineLogicResponse {\n success: boolean;\n instructionId: string;\n traceId: string;\n message: string;\n}\n\nexport interface LearnedInstructionsResponse {\n instructions: Array<{\n instruction: string;\n priority: number;\n isGlobal: boolean;\n createdAt: string;\n }>;\n globalInstructions: string[];\n formatted: string;\n}\n\n// ============================================\n// Implementation\n// ============================================\n\n/**\n * Send a logic correction to the Rigstate cloud database\n */\nexport async function refineLogic(\n supabase: SupabaseClient,\n userId: string,\n args: z.infer<typeof RefineLogicSchema>\n): Promise<RefineLogicResponse> {\n const { projectId, originalReasoning, userCorrection, scope } = args;\n\n // Generate a trace ID for this action\n const traceId = uuidv4();\n\n // Verify project access\n const { data: project, error: projectError } = await supabase\n .from('projects')\n .select('id, name')\n .eq('id', projectId)\n .eq('owner_id', userId)\n .single();\n\n if (projectError || !project) {\n throw new Error(`Project access denied or not found: ${projectId}`);\n }\n\n // Save the instruction to Raw Memory (ai_instructions)\n const { data: instruction, error: insertError } = await supabase\n .from('ai_instructions')\n .insert({\n user_id: userId,\n project_id: scope === 'global' ? null : projectId,\n instruction: userCorrection,\n context: originalReasoning,\n is_global: scope === 'global',\n priority: scope === 'global' ? 8 : 6,\n source_log_id: null\n })\n .select('id')\n .single();\n\n if (insertError) {\n throw new Error(`Failed to save instruction: ${insertError.message}`);\n }\n\n let message = `✅ Correction saved! Frank will apply this ${scope === 'global' ? 'globally' : 'to this project'}.`;\n\n // Phase 8.5.5 Integration: Global corrections trigger Curator Signal\n if (scope === 'global') {\n try {\n await submitSignal(supabase, userId, {\n projectId,\n title: `Teacher Correction: ${userCorrection.substring(0, 30)}...`,\n instruction: userCorrection,\n category: 'MAINTAINABILITY', // Default\n severity: 'MEDIUM',\n reasoning: `Teacher Mode correction (Trace: ${traceId}). Original reasoning: ${originalReasoning.substring(0, 100)}...`,\n source_type: 'TEACHER_MODE' // Using a tag via reasoning or title since source_type in schema is rigid?\n // actually check schema: framework_tags? No source_type is not in schema input, it's fixed in logic.\n // Wait, submitSignal implementation in curator/index.ts sets source_type: 'mcp_submission'.\n // I will update the reasoning to indicate Teacher Mode.\n });\n message += `\\n\\n🛡️ CURATOR PROTOCOL: Signal submitted to Sigrid for global verification.`;\n } catch (e: any) {\n console.error('Failed to auto-submit to curator:', e);\n message += `\\n(Note: Failed to submit to curator: ${e.message})`;\n }\n }\n\n // Log this MCP action with trace\n await supabase\n .from('ai_activity_log')\n .insert({\n user_id: userId,\n project_id: projectId,\n activity_type: 'mcp_correction',\n summary: `MCP: ${userCorrection.slice(0, 100)}...`,\n intelligence_trace: {\n source: 'mcp',\n traceId,\n scope,\n originalReasoning: originalReasoning.slice(0, 500)\n },\n metadata: { mcp_trace_id: traceId }\n });\n\n return {\n success: true,\n instructionId: instruction.id,\n traceId,\n message\n };\n}\n\n/**\n * Fetch learned behaviors from the database\n */\nexport async function getLearnedInstructions(\n supabase: SupabaseClient,\n userId: string,\n args: z.infer<typeof GetLearnedInstructionsSchema>\n): Promise<LearnedInstructionsResponse> {\n const { projectId } = args;\n\n // Fetch user-specific instructions\n let query = supabase\n .from('ai_instructions')\n .select('instruction, priority, is_global, created_at')\n .eq('user_id', userId)\n .eq('is_active', true)\n .order('priority', { ascending: false })\n .limit(20);\n\n // Filter by project or global only\n if (projectId) {\n query = query.or(`is_global.eq.true,project_id.eq.${projectId}`);\n } else {\n query = query.eq('is_global', true);\n }\n\n const { data: userInstructions, error: userError } = await query;\n\n if (userError) {\n throw new Error(`Failed to fetch instructions: ${userError.message}`);\n }\n\n // Fetch global base instructions (system-wide)\n const { data: globalBase, error: globalError } = await supabase\n .from('global_base_instructions')\n .select('instruction')\n .eq('is_active', true)\n .order('priority', { ascending: false })\n .limit(10);\n\n const globalInstructions = (globalBase || []).map((g: any) => g.instruction);\n\n // Format for context injection\n const instructions = (userInstructions || []).map((i: any) => ({\n instruction: i.instruction as string,\n priority: i.priority as number,\n isGlobal: i.is_global as boolean,\n createdAt: i.created_at as string\n }));\n\n let formatted = '';\n\n if (globalInstructions.length > 0) {\n formatted += `## GLOBAL RIGSTATE STANDARDS\\n`;\n formatted += globalInstructions.map((g: string) => `- ${g}`).join('\\n');\n formatted += '\\n\\n';\n }\n\n if (instructions.length > 0) {\n formatted += `## USER CORRECTIONS & TUNING\\n`;\n formatted += instructions.map((i: any) => {\n const scope = i.isGlobal ? '[GLOBAL]' : '[PROJECT]';\n return `- ${scope} ${i.instruction}`;\n }).join('\\n');\n }\n\n if (!formatted) {\n formatted = 'No learned behaviors yet. Frank will start learning as you provide corrections.';\n }\n\n return {\n instructions,\n globalInstructions,\n formatted\n };\n}\n\n// ============================================\n// Tool Registration\n// ============================================\n\nregistry.register({\n name: 'refine_logic',\n description: `Send a logic correction to teach Frank how to handle similar situations.\nUse this when Frank made a reasoning error and you want to correct it.\nThe correction will be saved and applied to future interactions.`,\n schema: RefineLogicSchema,\n handler: async (args, context) => {\n const result = await refineLogic(context.supabase, context.userId, args);\n return { content: [{ type: 'text', text: result.message }] };\n }\n});\n\nregistry.register({\n name: 'get_learned_instructions',\n description: `Fetch all learned behaviors and corrections from the database.\nUse this to inject prior corrections into your context window.\nReturns both user-specific and global Rigstate standards.`,\n schema: GetLearnedInstructionsSchema,\n handler: async (args, context) => {\n const result = await getLearnedInstructions(context.supabase, context.userId, args);\n return { content: [{ type: 'text', text: result.formatted }] };\n }\n});\n","/**\n * Phase 8.5.5: Context Engine\n * \n * Bridges the gap between the Curator Database and the Agent's working memory.\n * Performs semantic/keyword lookup to inject relevant rules into the context.\n */\n\nimport { SupabaseClient } from '@supabase/supabase-js';\nimport { queryGlobalAntidotes } from './curator/index.js';\n\nexport interface ContextInjectionInput {\n frameworks: string[];\n libraries: string[];\n taskDescription?: string; // Optional: for future task-specific lookup\n}\n\nexport async function injectGlobalContext(\n supabase: SupabaseClient,\n userId: string,\n input: ContextInjectionInput\n): Promise<string> {\n // 1. Identify relevant tags from stack\n const searchTags = [\n ...input.frameworks.map(f => f.split(' ')[0].toLowerCase()),\n ...input.libraries.map(l => l.split(' ')[0].toLowerCase())\n ].filter(Boolean);\n\n // 2. Query Curator for Critical/High severity antidotes matching tags\n // We want HIGH trust items (trust_score >= 80) or IMMUTABLE items.\n // Since queryGlobalAntidotes is a bit generic, we might want a more specialized query here\n // for \"Active Constraints\", but reusing it is a good MVP.\n\n // We fetch ALL Fortress Rules (Immutable) regardless of score/tags? \n // Usually Fortress Rules are universal or highly critical.\n\n const { data: fortressRules } = await supabase\n .from('global_antidotes')\n .select('title, instruction, slug')\n .eq('is_immutable', true)\n .eq('is_active', true);\n\n // Fetch High Trust Contextual Rules\n let contextQuery = supabase\n .from('global_antidotes')\n .select('title, instruction, framework_tags, severity')\n .eq('is_active', true)\n .gte('trust_score', 80) // High trust only\n .eq('is_immutable', false); // Exclude fortress (already fetched)\n\n if (searchTags.length > 0) {\n // PG operator for array overlap: framework_tags && searchTags\n contextQuery = contextQuery.overlaps('framework_tags', searchTags);\n } else {\n // If no tags, maybe just generic ones? Or skip?\n // Let's limit to generic if no tags\n contextQuery = contextQuery.is('framework_tags', null);\n }\n\n const { data: contextualRules } = await contextQuery.limit(5);\n\n // 3. Format Output\n let output = '';\n\n if (fortressRules && fortressRules.length > 0) {\n output += `\\n\\n## 🏰 FORTRESS RULES (NON-NEGOTIABLE)\\n`;\n output += `These rules are immutable and must be followed without exception:\\n`;\n fortressRules.forEach(rule => {\n output += `- **${rule.title}**: ${rule.instruction}\\n`;\n });\n }\n\n if (contextualRules && contextualRules.length > 0) {\n output += `\\n## 🛡️ INTELLIGENT CONTEXT (High Trust Antidotes)\\n`;\n output += `Learned best practices for your stack (${searchTags.join(', ')}):\\n`;\n contextualRules.forEach(rule => {\n output += `- [${rule.severity}] **${rule.title}**: ${rule.instruction}\\n`;\n });\n }\n\n if (!output) {\n output = `\\n(No specific curator context found for stack: ${searchTags.join(', ')})`;\n }\n\n return output;\n}\n","import { z } from 'zod';\n\n// =============================================================================\n// ZOD SCHEMAS FOR TOOL INPUTS\n// =============================================================================\n\nexport const QueryBrainInputSchema = z.object({\n projectId: z.string().uuid('Invalid project ID'),\n query: z.string().min(1, 'Query is required'),\n limit: z.number().min(1).max(20).optional().default(8),\n threshold: z.number().min(0).max(1).optional().default(0.1)\n});\n\nexport const GetProjectContextInputSchema = z.object({\n projectId: z.string().uuid('Invalid project ID')\n});\n\nexport const GetLatestDecisionsInputSchema = z.object({\n projectId: z.string().uuid('Invalid project ID'),\n limit: z.number().min(1).max(10).optional().default(5)\n});\n\nexport const SaveDecisionInputSchema = z.object({\n projectId: z.string().uuid('Invalid project ID'),\n title: z.string().min(1, 'Title is required').max(200, 'Title too long'),\n decision: z.string().min(1, 'Decision content is required'),\n rationale: z.string().optional(),\n category: z.enum(['decision', 'architecture', 'constraint', 'tech_stack', 'design_rule']).optional().default('decision'),\n tags: z.array(z.string()).optional().default([])\n});\n\nexport const SubmitIdeaInputSchema = z.object({\n projectId: z.string().uuid('Invalid project ID'),\n title: z.string().min(1, 'Title is required').max(200, 'Title too long'),\n description: z.string().min(1, 'Description is required'),\n category: z.enum(['feature', 'improvement', 'experiment', 'pivot']).optional().default('feature'),\n tags: z.array(z.string()).optional().default([])\n});\n\nexport const UpdateRoadmapInputSchema = z.object({\n projectId: z.string().uuid('Invalid project ID'),\n chunkId: z.string().uuid('Invalid chunk ID').optional(),\n title: z.string().optional(),\n status: z.enum(['LOCKED', 'ACTIVE', 'COMPLETED'])\n});\n\nexport const RunArchitectureAuditInputSchema = z.object({\n projectId: z.string().uuid('Invalid project ID'),\n filePath: z.string().min(1, 'File path is required'),\n content: z.string().min(1, 'Content is required')\n});\n\nexport const ListRoadmapTasksInputSchema = z.object({\n projectId: z.string().uuid('Invalid project ID')\n});\n\nexport const RefineLogicInputSchema = z.object({\n projectId: z.string().uuid('Invalid project ID'),\n originalReasoning: z.string().min(1, 'Original reasoning is required'),\n userCorrection: z.string().min(1, 'User correction is required'),\n scope: z.enum(['project', 'global']).optional().default('project')\n});\n\nexport const GetLearnedInstructionsInputSchema = z.object({\n projectId: z.string().uuid('Invalid project ID').optional()\n});\n\nexport const CheckAgentBridgeInputSchema = z.object({\n projectId: z.string().uuid('Invalid project ID'),\n action: z.enum(['check', 'update', 'submit_for_review']).optional().default('check'),\n bridgeId: z.string().uuid('Invalid bridge ID').optional(),\n status: z.enum(['PENDING', 'NEEDS_REVIEW', 'AWAITING_APPROVAL', 'APPROVED', 'REJECTED', 'EXECUTING', 'COMPLETED', 'FAILED']).optional(),\n summary: z.string().optional(),\n execution_summary: z.string().optional(),\n proposal: z.string().optional()\n});\n\nexport const CheckRulesSyncInputSchema = z.object({\n projectId: z.string().uuid('Invalid project ID'),\n currentRulesContent: z.string().optional()\n});\n\nexport const GetPendingTasksInputSchema = z.object({\n projectId: z.string().uuid('Invalid project ID')\n});\n\nexport const UpdateTaskStatusInputSchema = z.object({\n projectId: z.string().uuid('Invalid project ID'),\n taskId: z.string().uuid('Invalid task ID'),\n status: z.enum(['EXECUTING', 'COMPLETED', 'FAILED']),\n executionSummary: z.string().optional()\n});\n\nexport const GetNextRoadmapStepInputSchema = z.object({\n projectId: z.string().uuid('Invalid project ID'),\n currentStepId: z.string().uuid('Invalid step ID').optional()\n});\n\nexport const GenerateProfessionalPDFInputSchema = z.object({\n projectId: z.string().uuid('Invalid project ID'),\n reportType: z.enum(['SYSTEM_MANIFEST', 'INVESTOR_REPORT'])\n});\n\nexport const ArchaeologicalScanInputSchema = z.object({\n projectId: z.string().uuid('Invalid project ID'),\n gitLog: z.string().describe('Git log output'),\n fileTree: z.array(z.string()).describe('File paths')\n});\n\nexport const ImportGhostFeaturesInputSchema = z.object({\n projectId: z.string().uuid('Invalid project ID'),\n features: z.array(z.any())\n});\n\nexport const AnalyzeDependencyGraphInputSchema = z.object({\n path: z.string().min(1).default('src')\n});\n\nexport const AuditRlsStatusInputSchema = z.object({\n projectId: z.string().uuid().optional()\n});\n\nexport const AuditSecurityIntegrityInputSchema = z.object({\n projectId: z.string().uuid(),\n filePath: z.string().min(1),\n content: z.string().min(1),\n rules: z.array(z.string()).optional()\n});\n\nexport const QueryProjectBrainInputSchema = QueryBrainInputSchema;\n\nexport const FetchPackageHealthInputSchema = z.object({\n packageName: z.string().min(1)\n});\n\nexport const SaveToProjectBrainInputSchema = z.object({\n projectId: z.string().uuid(),\n title: z.string().min(1),\n content: z.string().min(1),\n category: z.enum(['DECISION', 'ARCHITECTURE', 'NOTE', 'LESSON_LEARNED']).default('NOTE'),\n tags: z.array(z.string()).optional().default([])\n});\n\nexport const UpdateRoadmapStatusInputSchema = z.object({\n projectId: z.string().uuid(),\n chunkId: z.string().uuid(),\n status: z.enum(['TODO', 'IN_PROGRESS', 'COMPLETED'])\n});\n\nexport const AddRoadmapChunkInputSchema = z.object({\n projectId: z.string().uuid(),\n title: z.string().min(1),\n description: z.string().optional(),\n featureId: z.string().optional(),\n priority: z.enum(['LOW', 'MEDIUM', 'HIGH']).default('MEDIUM')\n});\n\nexport const AnalyzeUiComponentInputSchema = z.object({\n filePath: z.string()\n});\n\nexport const ApplyDesignSystemInputSchema = z.object({\n filePath: z.string()\n});\n\nexport const FetchUiLibraryDocsInputSchema = z.object({\n componentName: z.string(),\n library: z.enum(['shadcn', 'lucide']).default('shadcn')\n});\n\nexport const GenerateCursorRulesInputSchema = z.object({\n projectId: z.string().uuid()\n});\n\nexport const AnalyzeDatabasePerformanceInputSchema = z.object({\n projectId: z.string().uuid(),\n filePaths: z.array(z.string())\n});\n\nexport const AuditIntegrityGateInputSchema = z.object({\n projectId: z.string().uuid(),\n filePaths: z.array(z.string()).optional().default([])\n});\n\nexport const CompleteRoadmapTaskInputSchema = z.object({\n projectId: z.string().uuid(),\n summary: z.string().min(1),\n taskId: z.string().uuid().optional(),\n gitDiff: z.string().optional(),\n integrityGate: z.any().optional()\n});\n","/**\n * Tool: get_project_context\n * \n * Returns the project type, tech stack, and high-level description.\n * This gives AI editors context about what they're working with.\n */\n\nimport { SupabaseClient } from '@supabase/supabase-js';\nimport type { ProjectContextResponse, TechStackInfo } from '../lib/types.js';\nimport { injectGlobalContext } from '../lib/context-engine.js';\nimport { registry } from '../lib/tool-registry.js';\nimport { GetProjectContextInputSchema } from '../lib/schemas.js';\n\n// ============================================\n// Tool Registration\n// ============================================\n\nregistry.register({\n name: 'get_project_context',\n description: `Returns the project type, tech stack, and high-level description for a Rigstate project.`,\n schema: GetProjectContextInputSchema,\n handler: async (args, context) => {\n const result = await getProjectContext(context.supabase, context.userId, args.projectId);\n return { content: [{ type: 'text', text: result.summary }] };\n }\n});\n\n// Key libraries we care about for display\nconst KEY_LIBS: Record<string, string> = {\n 'next': 'Next.js',\n 'react': 'React',\n 'vue': 'Vue',\n 'svelte': 'Svelte',\n 'angular': 'Angular',\n 'tailwindcss': 'Tailwind',\n 'prisma': 'Prisma',\n 'drizzle-orm': 'Drizzle',\n '@supabase/supabase-js': 'Supabase',\n 'stripe': 'Stripe',\n 'openai': 'OpenAI',\n 'typescript': 'TypeScript',\n 'framer-motion': 'Framer Motion',\n 'zod': 'Zod',\n 'ai': 'Vercel AI',\n};\n\nexport async function getProjectContext(\n supabase: SupabaseClient,\n userId: string,\n projectId: string\n): Promise<ProjectContextResponse> {\n // Fetch project with ownership check\n const { data: project, error: projectError } = await supabase\n .from('projects')\n .select('id, name, description, project_type, created_at, last_indexed_at, detected_stack, repository_tree')\n .eq('id', projectId)\n .eq('owner_id', userId)\n .single();\n\n if (projectError || !project) {\n throw new Error('Project not found or access denied');\n }\n\n // Fetch Digest Data\n const { data: agentTasks } = await supabase\n .from('agent_bridge')\n .select('id, roadmap_chunks(title), execution_summary, completed_at')\n .eq('project_id', projectId)\n .eq('status', 'COMPLETED')\n .order('completed_at', { ascending: false })\n .limit(3);\n\n const { data: roadmapItems } = await supabase\n .from('roadmap_chunks')\n .select('title, status, updated_at')\n .eq('project_id', projectId)\n .order('updated_at', { ascending: false })\n .limit(3);\n\n // Parse tech stack from detected_stack\n const techStack: TechStackInfo = {\n framework: null,\n orm: null,\n database: null,\n keyLibraries: [],\n topFolders: []\n };\n\n if (project.detected_stack) {\n const stack = project.detected_stack as {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n };\n const allDeps = { ...stack.dependencies, ...stack.devDependencies };\n\n for (const [name, version] of Object.entries(allDeps)) {\n const cleanVersion = (version as string).replace(/[\\^~]/g, '');\n\n // Categorize\n if (name === 'next' || name === 'react' || name === 'vue' || name === 'angular' || name === 'svelte') {\n if (!techStack.framework) {\n techStack.framework = `${KEY_LIBS[name] || name} ${cleanVersion}`;\n }\n } else if (name.includes('prisma') || name.includes('drizzle') || name.includes('typeorm')) {\n if (!techStack.orm) {\n techStack.orm = `${KEY_LIBS[name] || name} ${cleanVersion}`;\n }\n } else if (KEY_LIBS[name]) {\n techStack.keyLibraries.push(`${KEY_LIBS[name]} ${cleanVersion}`);\n }\n }\n }\n\n // Extract top folders from repository tree\n if (project.repository_tree && Array.isArray(project.repository_tree)) {\n techStack.topFolders = [...new Set(\n project.repository_tree\n .filter((t: any) => t.type === 'tree' && !t.path.includes('/'))\n .map((t: any) => t.path)\n )].slice(0, 10) as string[];\n }\n\n // Build summary\n const summaryParts: string[] = [];\n\n if (project.project_type) {\n summaryParts.push(`Project Type: ${project.project_type.toUpperCase()}`);\n }\n\n if (techStack.framework) {\n summaryParts.push(`Framework: ${techStack.framework}`);\n }\n\n if (techStack.orm) {\n summaryParts.push(`ORM: ${techStack.orm}`);\n }\n\n if (techStack.keyLibraries.length > 0) {\n summaryParts.push(`Key Libraries: ${techStack.keyLibraries.join(', ')}`);\n }\n\n if (techStack.topFolders.length > 0) {\n summaryParts.push(`Top Folders: ${techStack.topFolders.join(', ')}`);\n }\n\n if (project.description) {\n summaryParts.push(`\\nDescription: ${project.description}`);\n }\n\n // Add Digest to Summary\n summaryParts.push('\\n=== RECENT ACTIVITY DIGEST ===');\n\n if (agentTasks && agentTasks.length > 0) {\n summaryParts.push('\\nLatest AI Executions:');\n agentTasks.forEach((t: any) => {\n const time = t.completed_at ? new Date(t.completed_at).toLocaleString() : 'Recently';\n summaryParts.push(`- [${time}] ${t.roadmap_chunks?.title || 'Task'}: ${t.execution_summary || 'Completed'}`);\n });\n }\n\n if (roadmapItems && roadmapItems.length > 0) {\n summaryParts.push('\\nRoadmap Updates:');\n roadmapItems.forEach((i: any) => {\n summaryParts.push(`- ${i.title} is now ${i.status}`);\n });\n }\n\n const response: ProjectContextResponse = {\n project: {\n id: project.id,\n name: project.name,\n description: project.description,\n projectType: project.project_type,\n createdAt: project.created_at,\n lastIndexedAt: project.last_indexed_at\n },\n techStack,\n summary: summaryParts.join('\\n') || 'No project context available.'\n };\n\n // Phase 8.5.5: Inject Global Context (Curator)\n try {\n const curatorContext = await injectGlobalContext(supabase, userId, {\n frameworks: techStack.framework ? [techStack.framework] : [],\n libraries: techStack.keyLibraries\n });\n\n if (curatorContext) {\n response.summary += `\\n\\n=== CURATOR INTELLIGENCE ===${curatorContext}`;\n }\n } catch (e: any) {\n console.error('Failed to inject global context:', e);\n response.summary += `\\n\\n(Curator Context Unavailable: ${e.message})`;\n }\n\n return response;\n}\n","/**\n * Tool: query_brain\n * \n * Takes a natural language query and performs semantic search\n * against the project's memories (RAG), returning relevant\n * architecture rules, decisions, and constraints.\n */\n\nimport { SupabaseClient } from '@supabase/supabase-js';\nimport type { BrainQueryResponse, MemoryRecord } from '../lib/types.js';\nimport { registry } from '../lib/tool-registry.js';\nimport { QueryBrainInputSchema } from '../lib/schemas.js';\n\n// ============================================\n// Tool Registration\n// ============================================\n\nregistry.register({\n name: 'query_brain',\n description: `Takes a natural language query and performs semantic search\nagainst the project's memories (RAG), returning relevant\narchitecture rules, decisions, and constraints.`,\n schema: QueryBrainInputSchema,\n handler: async (args, context) => {\n const result = await queryBrain(\n context.supabase,\n context.userId,\n args.projectId,\n args.query,\n args.limit,\n args.threshold\n );\n return { content: [{ type: 'text', text: result.formatted }] };\n }\n});\n\n// Simple embedding generation using Google Gemini\nasync function generateQueryEmbedding(query: string): Promise<number[] | null> {\n const apiKey = process.env.GOOGLE_GENERATIVE_AI_API_KEY;\n if (!apiKey) {\n console.warn('GOOGLE_GENERATIVE_AI_API_KEY not found, skipping vector search.');\n return null;\n }\n\n try {\n const { google } = await import('@ai-sdk/google');\n const { embed } = await import('ai');\n\n const { embedding } = await embed({\n model: google.embedding('text-embedding-004'),\n value: query.replace(/\\n/g, ' '),\n });\n return embedding;\n } catch (error) {\n console.error('Failed to generate embedding for search:', error);\n return null;\n }\n}\n\nexport async function queryBrain(\n supabase: SupabaseClient,\n userId: string,\n projectId: string,\n query: string,\n limit: number = 8,\n threshold: number = 0.5\n): Promise<BrainQueryResponse> {\n // First, verify project ownership\n const { data: project, error: projectError } = await supabase\n .from('projects')\n .select('id')\n .eq('id', projectId)\n .eq('owner_id', userId)\n .single();\n\n if (projectError || !project) {\n throw new Error('Project not found or access denied');\n }\n\n // Try semantic search first using the match_memories RPC\n // This requires the embedding to be generated, so we'll try\n // Generate embedding if possible for semantic search\n const embedding = await generateQueryEmbedding(query);\n let memories: MemoryRecord[] = [];\n\n // Use the hybrid search RPC\n const { data: searchResults, error: searchError } = await supabase\n .rpc('hybrid_search_memories', {\n p_project_id: projectId,\n p_query: query,\n p_embedding: embedding,\n p_limit: limit,\n p_similarity_threshold: threshold || 0.2\n });\n\n if (searchError) {\n console.error('Hybrid search error:', searchError);\n // Fallback to basic recent fetch if RPC fails\n const { data: recentMemories } = await supabase\n .from('project_memories')\n .select('id, content, category, tags, importance, created_at')\n .eq('project_id', projectId)\n .eq('is_active', true)\n .order('created_at', { ascending: false })\n .limit(limit);\n\n if (recentMemories) {\n memories = recentMemories.map(m => ({\n id: m.id,\n content: m.content,\n category: m.category || 'general',\n tags: m.tags || [],\n netVotes: m.importance || 0,\n createdAt: m.created_at\n }));\n }\n } else if (searchResults) {\n memories = searchResults.map((m: any) => ({\n id: m.id,\n content: m.content,\n category: m.category,\n tags: m.tags,\n netVotes: m.importance,\n createdAt: m.created_at\n }));\n }\n\n // Format memories into a readable context block\n const contextLines = memories.map((m) => {\n const voteIndicator = m.netVotes && m.netVotes < 0 ? ` [⚠️ POORLY RATED: ${m.netVotes}]` : '';\n const tagStr = m.tags && m.tags.length > 0 ? ` [${m.tags.join(', ')}]` : '';\n const category = m.category ? m.category.toUpperCase() : 'GENERAL';\n return `- [${category}]${tagStr}${voteIndicator}: ${m.content}`;\n });\n\n const searchType = embedding ? 'TRIPLE-HYBRID (Vector + FTS + Fuzzy)' : 'HYBRID (FTS + Fuzzy)';\n\n const formatted = memories.length > 0\n ? `=== PROJECT BRAIN: RELEVANT MEMORIES ===\nSearch Mode: ${searchType}\nQuery: \"${query}\"\nFound ${memories.length} relevant memories:\n\n${contextLines.join('\\n')}\n\n==========================================`\n : `=== PROJECT BRAIN ===\nQuery: \"${query}\"\nNo relevant memories found for this query.\n=======================`;\n\n return {\n query,\n memories,\n formatted\n };\n}\n","/**\n * Tool: get_latest_decisions\n * \n * Fetches the most recent ADRs and decisions from The Council,\n * including active roadmap steps and council session feedback.\n */\n\nimport { SupabaseClient } from '@supabase/supabase-js';\nimport type { DecisionsResponse, CouncilSession, RoadmapStep } from '../lib/types.js';\nimport { registry } from '../lib/tool-registry.js';\nimport { GetLatestDecisionsInputSchema } from '../lib/schemas.js';\n\n// ============================================\n// Tool Registration\n// ============================================\n\nregistry.register({\n name: 'get_latest_decisions',\n description: `Fetches the most recent ADRs and decisions from The Council,\nincluding active roadmap steps and council session feedback.`,\n schema: GetLatestDecisionsInputSchema,\n handler: async (args, context) => {\n const result = await getLatestDecisions(\n context.supabase,\n context.userId,\n args.projectId,\n args.limit\n );\n return { content: [{ type: 'text', text: result.summary }] };\n }\n});\n\nexport async function getLatestDecisions(\n supabase: SupabaseClient,\n userId: string,\n projectId: string,\n limit: number = 5\n): Promise<DecisionsResponse> {\n // First, verify project ownership\n const { data: project, error: projectError } = await supabase\n .from('projects')\n .select('id')\n .eq('id', projectId)\n .eq('owner_id', userId)\n .single();\n\n if (projectError || !project) {\n throw new Error('Project not found or access denied');\n }\n\n // Fetch council sessions\n const { data: sessionData, error: sessionError } = await supabase\n .from('council_sessions')\n .select('id, project_id, recruited_agents, feedback_summary, duration_ms, sprints_count, tasks_count, created_at')\n .eq('project_id', projectId)\n .order('created_at', { ascending: false })\n .limit(limit);\n\n const sessions: CouncilSession[] = (sessionData || []).map(s => ({\n id: s.id,\n projectId: s.project_id,\n recruitedAgents: s.recruited_agents || [],\n feedbackSummary: (Array.isArray(s.feedback_summary) ? s.feedback_summary : []).map((f: any) => ({\n agentName: f.agentName || f.agent?.name || 'Unknown',\n emoji: f.emoji || f.agent?.emoji || '🤖',\n critiques: f.critiques || [],\n approved: f.approved ?? true\n })),\n durationMs: s.duration_ms,\n sprintsCount: s.sprints_count,\n tasksCount: s.tasks_count,\n createdAt: s.created_at\n }));\n\n // Fetch active roadmap step\n const { data: activeStep, error: stepError } = await supabase\n .from('roadmap_chunks')\n .select('id, step_number, title, status, sprint_focus')\n .eq('project_id', projectId)\n .eq('status', 'ACTIVE')\n .maybeSingle();\n\n const activeRoadmapStep: RoadmapStep | null = activeStep\n ? {\n id: activeStep.id,\n stepNumber: activeStep.step_number,\n title: activeStep.title,\n status: activeStep.status,\n sprintFocus: activeStep.sprint_focus\n }\n : null;\n\n // Build summary\n const summaryParts: string[] = [];\n\n // Add active step info\n if (activeRoadmapStep) {\n summaryParts.push(`=== CURRENT FOCUS ===`);\n summaryParts.push(`Step ${activeRoadmapStep.stepNumber}: ${activeRoadmapStep.title}`);\n if (activeRoadmapStep.sprintFocus) {\n summaryParts.push(`Focus: ${activeRoadmapStep.sprintFocus}`);\n }\n summaryParts.push('');\n }\n\n // Add recent council decisions\n if (sessions.length > 0) {\n summaryParts.push(`=== RECENT COUNCIL SESSIONS (${sessions.length}) ===`);\n\n for (const session of sessions) {\n const date = new Date(session.createdAt).toLocaleDateString();\n summaryParts.push(`\\n📅 Session on ${date}`);\n summaryParts.push(` Agents: ${session.recruitedAgents.join(', ')}`);\n\n if (session.feedbackSummary.length > 0) {\n summaryParts.push(` Key Feedback:`);\n for (const feedback of session.feedbackSummary.slice(0, 3)) {\n const status = feedback.approved ? '✅' : '⚠️';\n summaryParts.push(` ${feedback.emoji} ${feedback.agentName}: ${status}`);\n if (feedback.critiques.length > 0) {\n summaryParts.push(` - ${feedback.critiques[0]}`);\n }\n }\n }\n }\n } else {\n summaryParts.push(`No council sessions recorded yet.`);\n }\n\n // Fetch decision-type memories for additional context\n const { data: decisionMemories } = await supabase\n .from('project_memories')\n .select('content, category, created_at')\n .eq('project_id', projectId)\n .eq('is_active', true)\n .in('category', ['decision', 'architecture', 'constraint'])\n .order('created_at', { ascending: false })\n .limit(5);\n\n if (decisionMemories && decisionMemories.length > 0) {\n summaryParts.push(`\\n=== KEY DECISIONS FROM BRAIN ===`);\n for (const memory of decisionMemories) {\n summaryParts.push(`- [${memory.category.toUpperCase()}] ${memory.content}`);\n }\n }\n\n return {\n sessions,\n activeRoadmapStep,\n summary: summaryParts.join('\\n')\n };\n}\n","/**\n * Tool: save_decision\n * \n * Saves a new decision/ADR to the project's brain (project_memories).\n * High-importance memory for architectural decisions.\n */\n\nimport { SupabaseClient } from '@supabase/supabase-js';\nimport type { SaveDecisionResponse } from '../lib/types.js';\nimport { registry } from '../lib/tool-registry.js';\nimport { SaveDecisionInputSchema } from '../lib/schemas.js';\n\n// ============================================\n// Tool Registration\n// ============================================\n\nregistry.register({\n name: 'save_decision',\n description: `Saves a new decision/ADR to the project's brain (project_memories).\nHigh-importance memory for architectural decisions.`,\n schema: SaveDecisionInputSchema,\n handler: async (args, context) => {\n const result = await saveDecision(\n context.supabase,\n context.userId,\n args.projectId,\n args.title,\n args.decision,\n args.rationale,\n args.category,\n args.tags\n );\n return { content: [{ type: 'text', text: result.message }] };\n }\n});\n\nexport async function saveDecision(\n supabase: SupabaseClient,\n userId: string,\n projectId: string,\n title: string,\n decision: string,\n rationale?: string,\n category: string = 'decision',\n tags: string[] = []\n): Promise<SaveDecisionResponse> {\n // First, verify project ownership\n const { data: project, error: projectError } = await supabase\n .from('projects')\n .select('id, name')\n .eq('id', projectId)\n .eq('owner_id', userId)\n .single();\n\n if (projectError || !project) {\n throw new Error('Project not found or access denied');\n }\n\n // Build the full content with title, decision, and rationale\n const contentParts = [`# ${title}`, '', decision];\n if (rationale) {\n contentParts.push('', '## Rationale', rationale);\n }\n const fullContent = contentParts.join('\\n');\n\n // Build summary (truncated version for quick context)\n const summary = decision.length > 150\n ? decision.substring(0, 147) + '...'\n : decision;\n\n // Insert the memory with high importance (ADR = 9/10)\n const { data: memory, error: insertError } = await supabase\n .from('project_memories')\n .insert({\n project_id: projectId,\n content: fullContent,\n summary: summary,\n category: category,\n tags: ['ADR', ...tags],\n importance: 9, // High importance for decisions\n source_type: 'mcp', // Track source as MCP\n is_active: true\n })\n .select('id')\n .single();\n\n if (insertError) {\n // Handle specific database errors\n if (insertError.code === '23503') {\n throw new Error('Project no longer exists');\n }\n if (insertError.code === '42501') {\n throw new Error('Permission denied: Cannot write to this project');\n }\n throw new Error(`Failed to save decision: ${insertError.message}`);\n }\n\n return {\n success: true,\n memoryId: memory.id,\n message: `✅ Decision \"${title}\" saved to project \"${project.name}\" with importance 9/10`\n };\n}\n","/**\n * Tool: submit_idea\n * \n * Submits a new idea to the Idea Lab (saved_ideas table).\n * Ideas can later be reviewed, analyzed, and promoted to features.\n */\n\nimport { SupabaseClient } from '@supabase/supabase-js';\nimport type { SubmitIdeaResponse } from '../lib/types.js';\nimport { registry } from '../lib/tool-registry.js';\nimport { SubmitIdeaInputSchema } from '../lib/schemas.js';\n\n// ============================================\n// Tool Registration\n// ============================================\n\nregistry.register({\n name: 'submit_idea',\n description: `Submits a new idea to the Idea Lab (saved_ideas table).\nIdeas can later be reviewed, analyzed, and promoted to features.`,\n schema: SubmitIdeaInputSchema,\n handler: async (args, context) => {\n const result = await submitIdea(\n context.supabase,\n context.userId,\n args.projectId,\n args.title,\n args.description,\n args.category,\n args.tags\n );\n return { content: [{ type: 'text', text: result.message }] };\n }\n});\n\nexport async function submitIdea(\n supabase: SupabaseClient,\n userId: string,\n projectId: string,\n title: string,\n description: string,\n category: string = 'feature',\n tags: string[] = []\n): Promise<SubmitIdeaResponse> {\n // First, verify project ownership\n const { data: project, error: projectError } = await supabase\n .from('projects')\n .select('id, name')\n .eq('id', projectId)\n .eq('owner_id', userId)\n .single();\n\n if (projectError || !project) {\n throw new Error('Project not found or access denied');\n }\n\n // Insert the idea into saved_ideas\n const { data: idea, error: insertError } = await supabase\n .from('saved_ideas')\n .insert({\n project_id: projectId,\n title: title,\n description: description,\n category: category,\n tags: ['mcp', ...tags],\n status: 'draft', // Start as draft for review\n // No session_id since this comes from MCP, not a lab session\n })\n .select('id')\n .single();\n\n if (insertError) {\n // Handle specific database errors\n if (insertError.code === '23503') {\n throw new Error('Project no longer exists');\n }\n if (insertError.code === '42501') {\n throw new Error('Permission denied: Cannot write to this project');\n }\n if (insertError.code === '23505') {\n throw new Error('An idea with this title already exists');\n }\n throw new Error(`Failed to submit idea: ${insertError.message}`);\n }\n\n return {\n success: true,\n ideaId: idea.id,\n message: `💡 Idea \"${title}\" submitted to Idea Lab for project \"${project.name}\". Status: Draft (awaiting review)`\n };\n}\n","/**\n * Tool: update_roadmap\n * \n * Updates the status of a roadmap chunk (step).\n * Can search by chunk ID or by title.\n */\n\nimport { SupabaseClient } from '@supabase/supabase-js';\nimport type { UpdateRoadmapResponse } from '../lib/types.js';\nimport { registry } from '../lib/tool-registry.js';\nimport { UpdateRoadmapInputSchema } from '../lib/schemas.js';\n\n// ============================================\n// Tool Registration\n// ============================================\n\nregistry.register({\n name: 'update_roadmap',\n description: `Updates the status of a roadmap chunk (step).\nCan search by chunk ID or by title.`,\n schema: UpdateRoadmapInputSchema,\n handler: async (args, context) => {\n const result = await updateRoadmap(\n context.supabase,\n context.userId,\n args.projectId,\n args.status,\n args.chunkId,\n args.title\n );\n return { content: [{ type: 'text', text: result.message }] };\n }\n});\n\nexport async function updateRoadmap(\n supabase: SupabaseClient,\n userId: string,\n projectId: string,\n status: 'LOCKED' | 'ACTIVE' | 'COMPLETED',\n chunkId?: string,\n title?: string\n): Promise<UpdateRoadmapResponse> {\n // First, verify project ownership\n const { data: project, error: projectError } = await supabase\n .from('projects')\n .select('id, name')\n .eq('id', projectId)\n .eq('owner_id', userId)\n .single();\n\n if (projectError || !project) {\n throw new Error('Project not found or access denied');\n }\n\n // Find the roadmap chunk\n let targetChunk: { id: string; title: string; status: string } | null = null;\n\n if (chunkId) {\n // Search by ID\n const { data, error } = await supabase\n .from('roadmap_chunks')\n .select('id, title, status')\n .eq('id', chunkId)\n .eq('project_id', projectId)\n .single();\n\n if (error || !data) {\n throw new Error(`Roadmap step with ID \"${chunkId}\" not found`);\n }\n targetChunk = data;\n } else if (title) {\n // Search by title (fuzzy match using ilike)\n const { data, error } = await supabase\n .from('roadmap_chunks')\n .select('id, title, status')\n .eq('project_id', projectId)\n .ilike('title', `%${title}%`)\n .limit(1)\n .single();\n\n if (error || !data) {\n throw new Error(`Roadmap step matching \"${title}\" not found`);\n }\n targetChunk = data;\n } else {\n throw new Error('Either chunkId or title must be provided');\n }\n\n const previousStatus = targetChunk.status;\n\n // Don't update if status is the same\n if (previousStatus === status) {\n return {\n success: true,\n chunkId: targetChunk.id,\n previousStatus,\n newStatus: status,\n message: `ℹ️ Roadmap step \"${targetChunk.title}\" is already ${status}`\n };\n }\n\n // Update the status\n const { error: updateError } = await supabase\n .from('roadmap_chunks')\n .update({ status })\n .eq('id', targetChunk.id);\n\n if (updateError) {\n if (updateError.code === '42501') {\n throw new Error('Permission denied: Cannot update this roadmap');\n }\n throw new Error(`Failed to update roadmap: ${updateError.message}`);\n }\n\n // Build status transition message\n const statusEmoji: Record<string, string> = {\n 'LOCKED': '🔒',\n 'ACTIVE': '🚧',\n 'COMPLETED': '✅'\n };\n\n return {\n success: true,\n chunkId: targetChunk.id,\n previousStatus,\n newStatus: status,\n message: `${statusEmoji[status]} Roadmap step \"${targetChunk.title}\" updated: ${previousStatus} → ${status}`\n };\n}\n","/**\n * Tool: run_architecture_audit\n * \n * Audits code against project memories and architecture rules.\n * Returns violations or \"Pass\" status.\n */\n\nimport { SupabaseClient } from '@supabase/supabase-js';\nimport type { ArchitectureAuditResponse, AuditViolation } from '../lib/types.js';\nimport { registry } from '../lib/tool-registry.js';\nimport { RunArchitectureAuditInputSchema } from '../lib/schemas.js';\n\n// Vulnerability patterns for static analysis\nconst VULNERABILITY_PATTERNS: {\n type: string;\n severity: 'LOW' | 'MEDIUM' | 'HIGH';\n patterns: RegExp[];\n title: string;\n description: string;\n recommendation: string;\n}[] = [\n {\n type: 'SQL_INJECTION',\n severity: 'HIGH',\n patterns: [\n /\\$queryRaw\\s*`[^`]*\\$\\{/gi,\n /execute\\s*\\(\\s*[`'\"][^`'\"]*\\$\\{/gi,\n /query\\s*\\(\\s*[`'\"][^`'\"]*\\+/gi,\n ],\n title: 'Potential SQL Injection',\n description: 'String interpolation in raw SQL queries can lead to SQL injection.',\n recommendation: 'Use parameterized queries or prepared statements instead of string interpolation.'\n },\n {\n type: 'XSS',\n severity: 'HIGH',\n patterns: [\n /dangerouslySetInnerHTML\\s*=\\s*\\{\\s*\\{\\s*__html\\s*:/gi,\n /innerHTML\\s*=/gi,\n ],\n title: 'Potential XSS Vulnerability',\n description: 'Using dangerouslySetInnerHTML or innerHTML can expose your app to XSS attacks.',\n recommendation: 'Sanitize HTML content using a library like DOMPurify before rendering.'\n },\n {\n type: 'SECRETS_LEAK',\n severity: 'HIGH',\n patterns: [\n /['\"]sk_live_[a-zA-Z0-9]{20,}['\"]/gi,\n /['\"]sk_test_[a-zA-Z0-9]{20,}['\"]/gi,\n /api[_-]?key\\s*[:=]\\s*['\"][^'\"]{20,}['\"]/gi,\n /password\\s*[:=]\\s*['\"][^'\"]+['\"]/gi,\n ],\n title: 'Potential Secret Leak',\n description: 'Hardcoded secrets or API keys detected in source code.',\n recommendation: 'Use environment variables for secrets. Never commit credentials to version control.'\n },\n {\n type: 'UNVALIDATED_INPUT',\n severity: 'MEDIUM',\n patterns: [\n /['\"]use server['\"]\\s*[\\s\\S]*?export\\s+async\\s+function\\s+\\w+\\s*\\([^)]*:\\s*any\\)/gi,\n ],\n title: 'Unvalidated Server Action Input',\n description: 'Server action accepts untyped input, which may lead to injection attacks.',\n recommendation: 'Add Zod schema validation at the start of your server action.'\n },\n {\n type: 'MISSING_AUTH',\n severity: 'MEDIUM',\n patterns: [\n /export\\s+async\\s+function\\s+(GET|POST|PUT|DELETE|PATCH)\\s*\\([^)]*\\)\\s*\\{[^}]*(?!auth|session|getUser)/gi,\n ],\n title: 'Potentially Missing Authentication',\n description: 'API route handler may not be checking authentication.',\n recommendation: 'Add authentication check at the start of your API handler.'\n }\n ];\n\nfunction extractLineNumber(content: string, match: RegExpMatchArray): number {\n const upToMatch = content.substring(0, match.index || 0);\n return (upToMatch.match(/\\n/g) || []).length + 1;\n}\n\n// ============================================\n// Tool Registration\n// ============================================\n\nregistry.register({\n name: 'run_architecture_audit',\n description: `Audits code against project memories and architecture rules.\nReturns violations or \"Pass\" status.`,\n schema: RunArchitectureAuditInputSchema,\n handler: async (args, context) => {\n const result = await runArchitectureAudit(\n context.supabase,\n context.userId,\n args.projectId,\n args.filePath,\n args.content\n );\n return { content: [{ type: 'text', text: result.summary }] };\n }\n});\n\nexport async function runArchitectureAudit(\n supabase: SupabaseClient,\n userId: string,\n projectId: string,\n filePath: string,\n content: string\n): Promise<ArchitectureAuditResponse> {\n // First, verify project ownership\n const { data: project, error: projectError } = await supabase\n .from('projects')\n .select('id, name')\n .eq('id', projectId)\n .eq('owner_id', userId)\n .single();\n\n if (projectError || !project) {\n throw new Error('Project not found or access denied');\n }\n\n const violations: AuditViolation[] = [];\n\n // Run static pattern analysis\n for (const pattern of VULNERABILITY_PATTERNS) {\n for (const regex of pattern.patterns) {\n const matches = content.matchAll(new RegExp(regex.source, regex.flags));\n for (const match of matches) {\n const lineNumber = extractLineNumber(content, match);\n violations.push({\n type: pattern.type,\n severity: pattern.severity,\n title: pattern.title,\n description: pattern.description,\n lineNumber,\n recommendation: pattern.recommendation\n });\n }\n }\n }\n\n // Fetch project memories for context-aware checks\n const { data: memories } = await supabase\n .from('project_memories')\n .select('content, category, tags')\n .eq('project_id', projectId)\n .eq('is_active', true)\n .in('category', ['constraint', 'architecture', 'tech_stack', 'decision'])\n .order('importance', { ascending: false })\n .limit(10);\n\n // Check against project constraints\n if (memories && memories.length > 0) {\n for (const memory of memories) {\n // Check for common constraint patterns\n const lowerContent = content.toLowerCase();\n const lowerMemory = memory.content.toLowerCase();\n\n // Check \"never use X\" patterns\n const neverMatch = lowerMemory.match(/never\\s+use\\s+(\\w+)/i);\n if (neverMatch && lowerContent.includes(neverMatch[1])) {\n violations.push({\n type: 'CONSTRAINT_VIOLATION',\n severity: 'MEDIUM',\n title: 'Project Constraint Violation',\n description: `Code may violate project constraint: \"${memory.content.substring(0, 100)}...\"`,\n recommendation: 'Review the project brain for architectural constraints.'\n });\n }\n\n // Check \"always use X\" patterns\n const alwaysMatch = lowerMemory.match(/always\\s+use\\s+(\\w+)/i);\n if (alwaysMatch && !lowerContent.includes(alwaysMatch[1])) {\n violations.push({\n type: 'CONSTRAINT_VIOLATION',\n severity: 'LOW',\n title: 'Missing Required Pattern',\n description: `Code may be missing required pattern: \"${memory.content.substring(0, 100)}...\"`,\n recommendation: 'Check if this file should follow the project standard.'\n });\n }\n }\n }\n\n // Calculate score (100 - penalties)\n let score = 100;\n for (const v of violations) {\n if (v.severity === 'HIGH') score -= 25;\n else if (v.severity === 'MEDIUM') score -= 10;\n else score -= 5;\n }\n score = Math.max(0, score);\n\n // Build summary\n const passed = violations.length === 0;\n let summary: string;\n\n if (passed) {\n summary = `✅ PASSED - No violations found in ${filePath}\\nScore: ${score}/100`;\n } else {\n const highCount = violations.filter(v => v.severity === 'HIGH').length;\n const medCount = violations.filter(v => v.severity === 'MEDIUM').length;\n const lowCount = violations.filter(v => v.severity === 'LOW').length;\n\n summary = `⚠️ AUDIT FAILED - ${violations.length} violation(s) found in ${filePath}\nScore: ${score}/100\n• HIGH: ${highCount}\n• MEDIUM: ${medCount}\n• LOW: ${lowCount}\n\nViolations:\n${violations.map((v, i) => `${i + 1}. [${v.severity}] ${v.title}${v.lineNumber ? ` (line ${v.lineNumber})` : ''}\n ${v.description}\n → ${v.recommendation}`).join('\\n\\n')}`;\n }\n\n return {\n passed,\n score,\n violations,\n summary\n };\n}\n","import { SupabaseClient } from '@supabase/supabase-js';\nimport {\n generateRuleContent,\n generateRuleFiles,\n fetchLegacyStats,\n fetchActiveAgents,\n fetchProjectTechStack,\n getFileNameForIDE,\n IDEProvider,\n RuleFile\n} from '@rigstate/rules-engine';\nimport { registry } from '../lib/tool-registry.js';\nimport { GenerateCursorRulesInputSchema } from '../lib/schemas.js';\n\n// ============================================\n// Tool Registration\n// ============================================\n\nregistry.register({\n name: 'sync_ide_rules',\n description: `Generates the appropriate rules file content (e.g. .cursorrules, .windsurfrules) \nbased on project context and user settings.`,\n schema: GenerateCursorRulesInputSchema,\n handler: async (args, context) => {\n const result = await syncIdeRules(context.supabase, args.projectId);\n\n // Format response: Main file content + information about modular files\n let responseText = `FileName: ${result.fileName}\\n\\nContent:\\n${result.content}`;\n\n if (result.files && result.files.length > 0) {\n responseText += `\\n\\n--- MODULAR FILES GENERATED (${result.files.length}) ---\\n`;\n responseText += result.files.map(f => `- ${f.path}`).join('\\n');\n responseText += `\\n\\nNote: Please ensure these modular files are also updated if your IDE is following the V3 Rules standard.`;\n }\n\n return { content: [{ type: 'text', text: responseText }] };\n }\n});\n\n\n/**\n * Sync IDE rules for a project.\n * Uses the centralized rules-engine for consistent generation across all consumers.\n * \n * @param supabase - Supabase client instance\n * @param projectId - The project ID to generate rules for\n * @returns Object with fileName, content, and the new modular files[] array\n */\nexport async function syncIdeRules(\n supabase: SupabaseClient,\n projectId: string\n): Promise<{ fileName: string; content: string; files: RuleFile[] }> {\n // 1. Fetch Project & Preferred IDE\n const { data: project, error: projectError } = await supabase\n .from('projects')\n .select('*')\n .eq('id', projectId)\n .single();\n\n if (projectError || !project) {\n throw new Error(`Project ${projectId} not found.`);\n }\n\n // 2. Determine IDE (Preference -> Fallback)\n const ide: IDEProvider = (project.preferred_ide as IDEProvider) || 'cursor';\n\n // 3. Fetch Context Data (Parallel for speed)\n const [stack, roadmapRes, legacyStats, activeAgents, dbMetadataRes] = await Promise.all([\n fetchProjectTechStack(supabase, projectId),\n supabase\n .from('roadmap_chunks')\n .select('step_number, title, status, sprint_focus, prompt_content, is_legacy')\n .eq('project_id', projectId),\n fetchLegacyStats(supabase, projectId),\n fetchActiveAgents(supabase),\n supabase.rpc('get_table_metadata')\n ]);\n\n const databaseMetadata = dbMetadataRes.data || [];\n\n // 4. Generate Content (Mono-file)\n const content = generateRuleContent(\n { ...project, id: projectId },\n stack,\n roadmapRes.data || [],\n ide,\n legacyStats,\n activeAgents\n );\n\n // 5. Generate Modular Files (v3.0)\n const fileResult = generateRuleFiles(\n { ...project, id: projectId },\n stack,\n roadmapRes.data || [],\n ide,\n legacyStats,\n activeAgents,\n databaseMetadata\n );\n\n return {\n fileName: getFileNameForIDE(ide),\n content,\n files: fileResult.files\n };\n}\n\n","import { z } from 'zod';\nimport { ToolDefinition, registry } from '../lib/tool-registry.js';\n\n/**\n * Input Schema for List Features\n */\nconst InputSchema = z.object({\n projectId: z.string().uuid().describe('The UUID of the Rigstate project')\n});\n\n/**\n * Tool Definition: list_features\n */\nexport const listFeaturesTool: ToolDefinition<typeof InputSchema> = {\n name: 'list_features',\n description: `Lists all high-level features (epics) for a project.\nUseful for understanding the strategic context and major milestones.`,\n schema: InputSchema,\n handler: async ({ projectId }, { supabase, userId }) => {\n // 1. Verify project ownership\n const { data: project, error: projectError } = await supabase\n .from('projects')\n .select('id')\n .eq('id', projectId)\n .eq('owner_id', userId)\n .single();\n\n if (projectError || !project) {\n throw new Error('Project not found or access denied');\n }\n\n // 2. Fetch features\n const { data: features, error } = await supabase\n .from('features')\n .select('id, name, description, priority, status')\n .eq('project_id', projectId)\n .neq('status', 'ARCHIVED')\n .order('created_at', { ascending: false }); // Sort by newest (or priority if column existed properly typed)\n\n // Note: 'horizon' was not in my simple schema mental model, removed to be safe or use 'status' as proxy.\n // Assuming strict schema adherence.\n // If priority column is text, sorting by it strictly might be weird if not enum. \n // Let's trust 'created_at' for stability for now.\n\n if (error) {\n throw new Error(`Failed to fetch features: ${error.message}`);\n }\n\n // 3. Format response\n const formatted = (features || []).length > 0\n ? (features || []).map(f => {\n const priorityStr = f.priority === 'MVP' ? '[MVP] ' : '';\n return `- ${priorityStr}${f.name} (${f.status})`;\n }).join('\\n')\n : 'No active features found.';\n\n return {\n content: [\n {\n type: 'text',\n text: formatted\n }\n ]\n };\n }\n};\n\nregistry.register(listFeaturesTool);\n\n\n","/**\n * Tool: list_roadmap_tasks\n * \n * Lists all roadmap tasks for a project that are not completed.\n */\n\nimport { SupabaseClient } from '@supabase/supabase-js';\nimport type { ListRoadmapTasksResponse } from '../lib/types.js';\nimport { registry } from '../lib/tool-registry.js';\nimport { ListRoadmapTasksInputSchema } from '../lib/schemas.js';\n\n// ============================================\n// Tool Registration\n// ============================================\n\nregistry.register({\n name: 'list_roadmap_tasks',\n description: `Lists all actionable tasks for a project that are not yet COMPLETED.\nShows active and locked steps with their step numbers.`,\n schema: ListRoadmapTasksInputSchema,\n handler: async (args, context) => {\n const result = await listRoadmapTasks(\n context.supabase,\n context.userId,\n args.projectId\n );\n return { content: [{ type: 'text', text: result.formatted }] };\n }\n});\n\nexport async function listRoadmapTasks(\n supabase: SupabaseClient,\n userId: string,\n projectId: string\n): Promise<ListRoadmapTasksResponse> {\n // 1. Verify project ownership\n const { data: project, error: projectError } = await supabase\n .from('projects')\n .select('id')\n .eq('id', projectId)\n .eq('owner_id', userId)\n .single();\n\n if (projectError || !project) {\n throw new Error('Project not found or access denied');\n }\n\n // 2. Fetch non-completed tasks\n const { data: tasks, error } = await supabase\n .from('roadmap_chunks')\n .select('id, title, priority, status, step_number, prompt_content')\n .eq('project_id', projectId)\n .neq('status', 'COMPLETED')\n .order('priority', { ascending: false })\n .order('step_number', { ascending: true });\n\n if (error) {\n console.error('Failed to fetch roadmap tasks:', error);\n throw new Error('Failed to fetch roadmap tasks');\n }\n\n // 3. Format response\n const formatted = (tasks || []).length > 0\n ? (tasks || []).map(t => {\n const statusEmoji = t.status === 'ACTIVE' ? '🔵' : '🔒';\n const priorityStr = t.priority ? `[${t.priority}]` : '';\n return `${statusEmoji} Step ${t.step_number}: ${t.title} (ID: ${t.id})`;\n }).join('\\n')\n : 'No active or locked tasks found in the roadmap.';\n\n return {\n tasks: (tasks || []).map(t => ({\n id: t.id,\n title: t.title,\n priority: t.priority,\n status: t.status,\n step_number: t.step_number,\n prompt_content: t.prompt_content\n })),\n formatted\n };\n}\n","\nimport { SupabaseClient } from '@supabase/supabase-js';\nimport type { RoadmapChunk } from '../lib/types.js';\nimport { registry } from '../lib/tool-registry.js';\nimport { GetNextRoadmapStepInputSchema } from '../lib/schemas.js';\n\n// ============================================\n// Tool Registration\n// ============================================\n\nregistry.register({\n name: 'get_next_roadmap_step',\n description: `Fetches the next logical step from the roadmap for a project. \nUseful for transitioning between tasks.`,\n schema: GetNextRoadmapStepInputSchema,\n handler: async (args, context) => {\n const result = await getNextRoadmapStep(\n context.supabase,\n args.projectId,\n args.currentStepId\n );\n return { content: [{ type: 'text', text: result.message }] };\n }\n});\n\nexport interface GetNextRoadmapStepResponse {\n nextStep: RoadmapChunk | null;\n message: string;\n}\n\nexport async function getNextRoadmapStep(\n supabase: SupabaseClient,\n projectId: string,\n currentStepId?: string\n): Promise<GetNextRoadmapStepResponse> {\n\n // Strategy:\n // 1. If currentStepId is provided, look for the step with the next higher step_number.\n // 2. If not, look for the first 'ACTIVE' step.\n // 3. If no ACTIVE, look for the first 'LOCKED' step.\n\n let currentStepNumber = 0;\n\n if (currentStepId) {\n const { data: current } = await supabase\n .from('roadmap_chunks')\n .select('step_number')\n .eq('id', currentStepId)\n .single();\n\n if (current) {\n currentStepNumber = current.step_number;\n }\n } else {\n // Try to find currently active step to establish baseline\n const { data: active } = await supabase\n .from('roadmap_chunks')\n .select('step_number')\n .eq('project_id', projectId)\n .eq('status', 'ACTIVE')\n .order('step_number', { ascending: true })\n .limit(1)\n .single();\n\n if (active) {\n currentStepNumber = active.step_number;\n }\n }\n\n // Find the next step > currentStepNumber\n // We prioritize LOCKED or PENDING steps that come *after* the current one.\n const { data: nextStep, error } = await supabase\n .from('roadmap_chunks')\n .select('*')\n .eq('project_id', projectId)\n .gt('step_number', currentStepNumber)\n .neq('status', 'COMPLETED') // We want the next *workable* step\n .order('step_number', { ascending: true })\n .limit(1)\n .single();\n\n if (error && error.code !== 'PGRST116') { // PGRST116 is \"Row not found\" which is fine\n throw new Error(`Failed to fetch next roadmap step: ${error.message}`);\n }\n\n if (!nextStep) {\n return {\n nextStep: null,\n message: \"No further steps found in the roadmap. You might be done! 🎉\"\n };\n }\n\n return {\n nextStep: nextStep as RoadmapChunk,\n message: `Next step found: [Step ${nextStep.step_number}] ${nextStep.title}`\n };\n}\n","\nimport { SupabaseClient } from '@supabase/supabase-js';\nimport { CheckRulesSyncResponse } from '../lib/types.js';\nimport { registry } from '../lib/tool-registry.js';\nimport { CheckRulesSyncInputSchema } from '../lib/schemas.js';\n\n// ============================================\n// Tool Registration\n// ============================================\n\nregistry.register({\n name: 'check_rules_sync',\n description: `Verifies if the IDE rules are present and belong to the correct project.`,\n schema: CheckRulesSyncInputSchema,\n handler: async (args, context) => {\n const result = await checkRulesSync(\n context.supabase,\n args.projectId,\n args.currentRulesContent\n );\n return { content: [{ type: 'text', text: result.message }] };\n }\n});\n\nconst RIGSTATE_START = \"RIGSTATE_START\";\nconst RIGSTATE_END = \"RIGSTATE_END\";\n\n// Minimal Safety Cache (Guardian Rules)\nconst SAFETY_CACHE_RULES = `\n### 🛡️ RIGSTATE SAFETY CACHE (OFFLINE MODE)\n1. **Strict Types**: No 'any'. Define interfaces for all data structures.\n2. **Row Level Security**: All database queries MUST be scoped to 'user_id' or 'org_id'.\n3. **Validation**: Use Zod for all input validation.\n4. **Error Handling**: Use try/catch blocks for all external API calls.\n5. **No Blind Deletes**: Never delete data without explicit confirmation or soft-deletes.\n`;\n\nexport async function checkRulesSync(\n supabase: SupabaseClient,\n projectId: string,\n currentRulesContent?: string\n): Promise<CheckRulesSyncResponse> {\n\n // If no content provided, we can't really verify local files from MCP directly \n // without reading the file system, but MCP is often sandboxed or remote.\n // Ideally, the Agent provides the content of .cursorrules it sees.\n\n if (!currentRulesContent) {\n return {\n synced: false,\n message: \"No rules content provided for verification.\",\n shouldTriggerSync: true,\n missingBlock: true\n };\n }\n\n const hasStart = currentRulesContent.includes(RIGSTATE_START);\n const hasEnd = currentRulesContent.includes(RIGSTATE_END);\n\n if (!hasStart || !hasEnd) {\n return {\n synced: false,\n message: \"Rigstate rules block is missing or corrupted.\",\n shouldTriggerSync: true,\n missingBlock: true\n };\n }\n\n // Resilience: Wrap DB check in try/catch to handle network failures\n try {\n const { data: project, error } = await supabase\n .from('projects')\n .select('name')\n .eq('id', projectId)\n .single();\n\n if (error) throw error;\n\n if (project) {\n if (!currentRulesContent.includes(`Project Rules: ${project.name}`)) {\n return {\n synced: false,\n message: `Rules file appears to belong to a different project (Expected: ${project.name}).`,\n shouldTriggerSync: true\n };\n }\n }\n } catch (e) {\n // Network or DB Error -> Fallback to Offline Mode\n console.error(\"Rigstate Sync Verification Failed:\", e);\n\n return {\n synced: true, // Assume synced to allow work to continue\n shouldTriggerSync: false,\n offlineMode: true,\n message: `⚠️ Rigstate Sync utilgjengelig – bruker lokale sikkerhetsregler.\\n${SAFETY_CACHE_RULES}`\n };\n }\n\n return {\n synced: true,\n message: \"Rules are valid and present.\",\n shouldTriggerSync: false\n };\n}\n","\nimport { SupabaseClient } from '@supabase/supabase-js';\nimport fs from 'fs/promises';\nimport path from 'path';\n\nexport interface AnalyzeDatabasePerformanceInput {\n projectId: string;\n filePaths: string[];\n}\n\ninterface PerformanceIssue {\n type: 'MISSING_INDEX' | 'N_PLUS_ONE' | 'UNOPTIMIZED_FILTER' | 'DEAD_TABLE';\n severity: 'HIGH' | 'MEDIUM' | 'LOW';\n file: string;\n line?: number;\n description: string;\n suggestion: string;\n codeSnippet?: string;\n}\n\ninterface TableMetadata {\n table_name: string;\n indexed_columns: string[];\n foreign_keys: { column: string, target_table: string }[];\n}\n\nexport async function analyzeDatabasePerformance(\n supabase: SupabaseClient,\n input: AnalyzeDatabasePerformanceInput\n): Promise<{ issues: PerformanceIssue[], summary: string }> {\n const issues: PerformanceIssue[] = [];\n\n // 1. Fetch Database Metadata\n const { data: rawMetadata, error } = await supabase.rpc('get_table_metadata', {\n p_project_id: input.projectId\n });\n\n if (error) {\n throw new Error(`Failed to fetch database metadata: ${error.message}`);\n }\n\n const metadata: TableMetadata[] = rawMetadata.map((t: any) => ({\n table_name: t.t_name || t.table_name,\n indexed_columns: t.indexed_columns || [],\n foreign_keys: t.foreign_keys || []\n }));\n\n // Map for quick lookup\n const tableMap = new Map<string, TableMetadata>();\n metadata.forEach(t => tableMap.set(t.table_name, t));\n\n // 2. Analyze Code Files\n for (const filePath of input.filePaths) {\n try {\n const content = await fs.readFile(filePath, 'utf-8');\n const lines = content.split('\\n');\n\n // --- ANALYSIS PATTERNS ---\n\n // A. Detect N+1 Danger Zones (Loops with Await)\n // Regex: .map(async ... await ... from('...'))\n // This is complex for regex, using simple line heuristics\n // If line contains 'await supabase' AND is inside a .map() block? Hard to detect scope.\n // Simplified: If we see `await supabase` inside a loop structure in the same snippet?\n // Let's stick to \"Single Line Heuristics\" for MVP robustness.\n\n // B. Detect Unindexed Filters\n // Pattern: .eq('column', val) or .filter('column', ...)\n // We need to know WHICH table is being queried.\n // Look for `from('tableName')` then track subsequent `.eq('col')`?\n // AST would be better, but regex state machine is feasible for simple chains.\n\n let currentTable: string | null = null;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n\n // 1. Identify Table Context\n const fromMatch = line.match(/\\.from\\(['\"]([a-zA-Z0-9_]+)['\"]\\)/);\n if (fromMatch) {\n currentTable = fromMatch[1];\n }\n\n // Reset table context on semicolon (end of chain) mostly\n if (line.includes(';')) {\n currentTable = null; // Conservative reset\n }\n\n // 2. Check for Missing Indexes\n if (currentTable) {\n const eqMatch = line.match(/\\.(eq|match|not|gt|gte|lt|lte|like|ilike)\\(['\"]([a-zA-Z0-9_]+)['\"]/);\n if (eqMatch) {\n const colName = eqMatch[2];\n const tableMeta = tableMap.get(currentTable);\n\n if (tableMeta) {\n // Check if column is indexed\n // Note: Primary keys are usually indexed automatically, but get_table_metadata might typically return explicit indexes.\n // We should check if it's 'id' (usually PK) or in indexed_columns.\n const isIndexed = tableMeta.indexed_columns.includes(colName) || colName === 'id';\n const isForeignKey = tableMeta.foreign_keys.some(fk => fk.column === colName);\n\n if (!isIndexed) {\n issues.push({\n type: 'MISSING_INDEX',\n severity: isForeignKey ? 'HIGH' : 'MEDIUM', // Unindexed Foreign Keys are deadly\n file: filePath,\n line: i + 1,\n description: `Query filters on unindexed column '${colName}' in table '${currentTable}'.`,\n suggestion: `Create an index for '${currentTable}(${colName})'.`,\n codeSnippet: line.trim()\n });\n }\n }\n }\n }\n\n // 3. Check for N+1 (Crudely)\n if (line.includes('await supabase') && (line.includes('.map(') || lines[i - 1]?.includes('.map('))) {\n issues.push({\n type: 'N_PLUS_ONE',\n severity: 'HIGH',\n file: filePath,\n line: i + 1,\n description: `Potential N+1 Query detected. Await inside loop/map.`,\n suggestion: `Use Promise.all() or .in() operator instead of looping queries.`,\n codeSnippet: line.trim()\n });\n }\n }\n\n } catch (e) {\n console.warn(`Skipping file ${filePath}: ${e}`);\n }\n }\n\n // 3. Summary Report\n const highSev = issues.filter(i => i.severity === 'HIGH').length;\n const medSev = issues.filter(i => i.severity === 'MEDIUM').length;\n\n let summary = `## 🔍 Performance Audit Report\\n`;\n summary += `**Scanned Files:** ${input.filePaths.length}\\n`;\n summary += `**Issues Found:** ${issues.length} (🔴 ${highSev} High, 🟡 ${medSev} Medium)\\n\\n`;\n\n if (issues.length === 0) {\n summary += `✅ **Clean Scan:** No obvious performance bottlenecks detected based on current schema constraints.`;\n } else {\n summary += `### 🚨 Critical Findings\\n`;\n issues.filter(i => i.severity === 'HIGH').forEach(issue => {\n summary += `- **${issue.type}** in \\`${path.basename(issue.file)}:${issue.line}\\`\\n`;\n summary += ` - ${issue.description}\\n`;\n summary += ` - 💡 *Fix:* ${issue.suggestion}\\n`;\n });\n }\n\n return { issues, summary };\n}\n","\nexport interface SecurityViolation {\n id: string;\n type: string;\n severity: 'LOW' | 'MEDIUM' | 'HIGH' | 'FATAL';\n title: string;\n description: string;\n recommendation: string;\n}\n\n/**\n * Checks for SQL Injection Vulnerabilities (SEC-SQL-01)\n */\nexport function checkSqlInjection(content: string): SecurityViolation | null {\n const sqlKeywords = ['from', 'select', 'insert', 'update', 'delete', 'rpc', 'execute', 'query'];\n const hasSqlKeywords = sqlKeywords.some(kw => content.toLowerCase().includes(kw));\n\n if (hasSqlKeywords) {\n const interpolationRegex = /`[^`]*\\${[^`]*`|['\"][^'\"]*\\$\\{[^'\"]*['\"]/;\n if (interpolationRegex.test(content)) {\n return {\n id: 'SEC-SQL-01',\n type: 'SQL_INJECTION',\n severity: 'HIGH',\n title: 'Potential SQL Injection (Dynamic String)',\n description: 'Detected dynamic string building in a context containing SQL keywords.',\n recommendation: 'Use prepared statements or the project-standard query builder. Never interpolate user input directly.'\n };\n }\n }\n return null;\n}\n\n/**\n * Checks for RLS in Migrations (SEC-RLS-01)\n */\nexport function checkRlsInMigration(filePath: string, content: string): SecurityViolation | null {\n if (filePath.includes('supabase/migrations/') && filePath.endsWith('.sql')) {\n const hasCreateTable = /CREATE\\s+TABLE/i.test(content);\n const hasEnableRls = /ENABLE\\s+ROW\\s+LEVEL\\s+SECURITY/i.test(content);\n\n if (hasCreateTable && !hasEnableRls) {\n return {\n id: 'SEC-RLS-01',\n type: 'DB_INTEGRITY',\n severity: 'HIGH',\n title: 'Missing Row Level Security (RLS)',\n description: 'Migration creates a table but does not enable RLS.',\n recommendation: 'Add ALTER TABLE \"public\".\"your_table\" ENABLE ROW LEVEL SECURITY; for every new table.'\n };\n }\n }\n return null;\n}\n\n/**\n * Checks for Hardcoded Secrets (SEC-KEY-01)\n */\nexport function checkHardcodedSecrets(filePath: string, content: string): SecurityViolation[] {\n const violations: SecurityViolation[] = [];\n const keyPatterns = [\n { pattern: /sk_live_[a-zA-Z0-9]{20,}/, name: 'Stripe Secret Key' },\n { pattern: /sb_publishable_[a-zA-Z0-9]{20,}/, name: 'Supabase Publishable Key' },\n { pattern: /AIza[0-9A-Za-z\\\\-_]{35}/, name: 'Google API Key' },\n { pattern: /\"([^\"]*(?:password|secret|key|token)[^\"]*)\"\\s*:\\s*\"[^\"]{10,}\"/i, name: 'Generic Secret' }\n ];\n\n for (const p of keyPatterns) {\n if (p.pattern.test(content) && !filePath.includes('.env')) {\n violations.push({\n id: 'SEC-KEY-01',\n type: 'SECRET_LEAKAGE',\n severity: 'FATAL',\n title: `Hardcoded Secret Detected (${p.name})`,\n description: `Found a potential secret or API key hardcoded in the source file.`,\n recommendation: 'Move all secrets to environment variables (.env.local) and use process.env.'\n });\n }\n }\n return violations;\n}\n\n/**\n * Checks for XSS Vulnerabilities (SEC-UI-01)\n */\nexport function checkXss(content: string): SecurityViolation | null {\n if (content.includes('dangerouslySetInnerHTML')) {\n return {\n id: 'SEC-UI-01',\n type: 'XSS_VULNERABILITY',\n severity: 'MEDIUM',\n title: 'Dangerous HTML Rendering',\n description: 'Detected use of dangerouslySetInnerHTML which can lead to XSS.',\n recommendation: 'Sanitize content with DOMPurify or use safer rendering methods.'\n };\n }\n return null;\n}\n\n/**\n * Checks for strict identity isolation (SEC-AUTH-04)\n */\nexport function checkIdentityIsolation(filePath: string, content: string): SecurityViolation | null {\n if ((filePath.includes('app/api/') || filePath.includes('actions/')) && (content.includes('supabase.from') || content.includes('db.select'))) {\n const hasOwnerFilter = /\\.eq\\(['\"](owner_id|user_id)['\"],/.test(content);\n if (!hasOwnerFilter) {\n return {\n id: 'SEC-AUTH-04',\n type: 'ISOLATION_FAILURE',\n severity: 'HIGH',\n title: 'Missing Identity Filter',\n description: 'Data query lacks a user_id or owner_id filter. Required for multi-tenancy isolation.',\n recommendation: 'Always filter tenant-specific data using .eq(\"owner_id\", userId).'\n };\n }\n }\n return null;\n}\n\n// ... Additional checks for Phase 7.4 rules ...\n\nexport function checkSensitiveLogging(content: string): SecurityViolation | null {\n if (content.includes('console.log') && (content.includes('env') || content.includes('process.env') || content.includes('password') || content.includes('user'))) {\n return {\n id: 'SEC-LOG-01',\n type: 'PII_LEAKAGE',\n severity: 'MEDIUM',\n title: 'Potential Log Leakage',\n description: 'Detected console.log of potentially sensitive objects (user, env, password).',\n recommendation: 'Use a structured logger and ensure sensitive fields are redacted before logging.'\n };\n }\n return null;\n}\n\nexport function checkRbac(filePath: string, content: string): SecurityViolation | null {\n if ((filePath.includes('app/api/') || filePath.includes('actions/')) && !content.includes('role') && !content.includes('permission') && !content.includes('isAdmin')) {\n return {\n id: 'SEC-RBAC-01',\n type: 'AUTHORIZATION_GATHERING',\n severity: 'MEDIUM',\n title: 'Missing RBAC Check',\n description: 'Route/Action seems to lack explicit role or permission-based access control.',\n recommendation: 'Verify user roles (e.g., admin, editor) before granting access to sensitive endpoints.'\n };\n }\n return null;\n}\n\nexport function checkInputValidation(filePath: string, content: string): SecurityViolation | null {\n if ((filePath.includes('app/api/') || filePath.includes('actions/')) && !content.includes('z.object') && !content.includes('parse')) {\n if (content.includes('.update(') || content.includes('.insert(')) {\n return {\n id: 'SEC-VAL-01',\n type: 'INPUT_VALIDATION',\n severity: 'HIGH',\n title: 'Missing Input Validation',\n description: 'Database mutation detected without Zod schema validation.',\n recommendation: 'Use Zod to validate all incoming data before passing it to the database.'\n };\n }\n }\n return null;\n}\n\nexport function checkCleanFailures(content: string): SecurityViolation | null {\n const errorLeakageRegex = /(?:res\\..*(?:error|message|status).*\\.message)|(?:throw new Error\\(.*\\.message\\))/;\n if (errorLeakageRegex.test(content) && content.includes('catch')) {\n return {\n id: 'SEC-ERR-01',\n type: 'ERROR_EXPOSURE',\n severity: 'MEDIUM',\n title: 'Raw Database Error Leakage',\n description: 'Detected raw error messages being sent/thrown to the client.',\n recommendation: 'Catch errors and return standardized, non-technical messages to the frontend.'\n };\n }\n return null;\n}\n\nexport function checkDependencies(filePath: string, content: string): SecurityViolation | null {\n if (filePath.endsWith('package.json')) {\n if (content.includes('\"*') || content.includes('\"latest\"')) {\n return {\n id: 'SEC-DEPS-01',\n type: 'DEPENDENCY_BLOAT',\n severity: 'HIGH',\n title: 'Unpinned Dependencies',\n description: 'package.json contains unpinned or \"latest\" versions.',\n recommendation: 'Always pin dependencies to specific versions for reproducibility and security.'\n };\n }\n }\n return null;\n}\n\n// ... Anti-Lazy checks ...\n\nexport function checkAntiLazy(filePath: string, content: string): SecurityViolation[] {\n const violations: SecurityViolation[] = [];\n\n // SEC-LAZY-01: No 'any'\n const anyRegex = /: any([,\\s)\\]\\}]|$)/g;\n if (anyRegex.test(content) && !filePath.includes('node_modules')) {\n violations.push({\n id: 'SEC-LAZY-01',\n type: 'TYPE_LAZINESS',\n severity: 'HIGH',\n title: 'Use of \"any\" Type detected',\n description: 'Detected use of the \"any\" type, which bypasses the TypeSytem safety checks.',\n recommendation: 'Replace \"any\" with a specific interface, type, or \"unknown\" with proper narrowing.'\n });\n }\n\n // SEC-LAZY-02: No empty catch\n const emptyCatchRegex = /catch\\s*\\([^)]*\\)\\s*{\\s*}/g;\n if (emptyCatchRegex.test(content)) {\n violations.push({\n id: 'SEC-LAZY-02',\n type: 'ERROR_SWALLOWING',\n severity: 'HIGH',\n title: 'Empty Catch Block detected',\n description: 'Detected a catch block that swallows errors without logging or handling them.',\n recommendation: 'Always log the error or handle it. Never leave a catch block empty.'\n });\n }\n\n // SEC-LAZY-03: No TODOs\n if (content.includes('TODO') || content.includes('FIXME')) {\n violations.push({\n id: 'SEC-LAZY-03',\n type: 'INCOMPLETE_WORK',\n severity: 'MEDIUM',\n title: 'Technical Debt remnant (TODO/FIXME)',\n description: 'Detected TODO or FIXME comments in a file being evaluated for completion.',\n recommendation: 'Resolve the task fully or move the TODO to the project roadmap before committing.'\n });\n }\n\n return violations;\n}\n","import { SupabaseClient } from '@supabase/supabase-js';\nimport { AuditRlsStatusInput } from '../lib/types.js';\nimport * as Checks from './security-checks.js';\nimport { registry } from '../lib/tool-registry.js';\nimport { AuditRlsStatusInputSchema, AuditSecurityIntegrityInputSchema } from '../lib/schemas.js';\n\n// ============================================\n// Tool Registration\n// ============================================\n\nregistry.register({\n name: 'audit_rls_status',\n description: `Sven's Tool: Security Shield. Audits the database to ensure Row Level Security (RLS) is enforced.`,\n schema: AuditRlsStatusInputSchema,\n handler: async (args, context) => {\n const result = await auditRlsStatus(context.supabase, args);\n return { content: [{ type: 'text', text: result.summary || 'No summary available' }] };\n }\n});\n\nregistry.register({\n name: 'audit_security_integrity',\n description: `Frank's Tool: Security Oracle. Performs a diagnostic security audit against the Fortress Matrix.`,\n schema: AuditSecurityIntegrityInputSchema,\n handler: async (args, context) => {\n const result = await auditSecurityIntegrity(context.supabase, args);\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };\n }\n});\n\n/**\n * Sven's Tool: Security Shield\n * Audits the database to ensure Row Level Security (RLS) is enforced.\n */\nexport async function auditRlsStatus(\n supabase: SupabaseClient,\n input: AuditRlsStatusInput\n) {\n try {\n const { data, error } = await supabase.rpc('execute_sql', {\n query: `\n SELECT tablename, rowsecurity \n FROM pg_tables \n WHERE schemaname = 'public' \n ORDER BY tablename;\n `\n });\n\n if (error) {\n throw new Error(`Database query failed: ${error.message}`);\n }\n\n const tables = data as Array<{ tablename: string, rowsecurity: boolean }>;\n\n if (!tables) {\n return {\n status: 'ERROR',\n message: 'Could not fetch table list. Ensure execute_sql RPC is available or pg_tables is accessible.'\n };\n }\n\n const unsecuredTables = tables.filter(t => !t.rowsecurity);\n const securedTables = tables.filter(t => t.rowsecurity);\n\n const score = tables.length > 0\n ? Math.round((securedTables.length / tables.length) * 100)\n : 100;\n\n return {\n timestamp: new Date().toISOString(),\n projectId: input.projectId,\n securityScore: score,\n metrics: {\n totalTables: tables.length,\n securedTables: securedTables.length,\n unsecuredTables: unsecuredTables.length\n },\n unsecuredTables: unsecuredTables.map(t => t.tablename),\n status: unsecuredTables.length === 0 ? 'SECURE' : 'VULNERABLE',\n summary: unsecuredTables.length === 0\n ? `PASSED. All ${tables.length} tables have RLS enabled. Sven approves.`\n : `CRITICAL. ${unsecuredTables.length} tables are missing RLS: ${unsecuredTables.map(t => t.tablename).join(', ')}. Immediate action required.`\n };\n\n } catch (err: any) {\n return {\n status: 'ERROR',\n message: `Sven could not reach the database structure. Error: ${err.message || err}. check connection strings.`\n };\n }\n}\n\n/**\n * Frank's Tool: Security Oracle\n * Performs a diagnostic security audit against the Fortress Matrix.\n */\nexport async function auditSecurityIntegrity(\n supabase: SupabaseClient,\n input: { projectId: string, filePath: string, content: string }\n) {\n const violations: any[] = [];\n const { content, filePath } = input;\n\n // Use Modular Checks\n const sqlViolation = Checks.checkSqlInjection(content);\n if (sqlViolation) violations.push(sqlViolation);\n\n const rlsViolation = Checks.checkRlsInMigration(filePath, content);\n if (rlsViolation) violations.push(rlsViolation);\n\n const keyViolations = Checks.checkHardcodedSecrets(filePath, content);\n violations.push(...keyViolations);\n\n const xssViolation = Checks.checkXss(content);\n if (xssViolation) violations.push(xssViolation);\n\n const authViolation = Checks.checkIdentityIsolation(filePath, content);\n if (authViolation) violations.push(authViolation);\n\n const logViolation = Checks.checkSensitiveLogging(content);\n if (logViolation) violations.push(logViolation);\n\n const rbacViolation = Checks.checkRbac(filePath, content);\n if (rbacViolation) violations.push(rbacViolation);\n\n const valViolation = Checks.checkInputValidation(filePath, content);\n if (valViolation) violations.push(valViolation);\n\n const errViolation = Checks.checkCleanFailures(content);\n if (errViolation) violations.push(errViolation);\n\n const depViolation = Checks.checkDependencies(filePath, content);\n if (depViolation) violations.push(depViolation);\n\n const lazyViolations = Checks.checkAntiLazy(filePath, content);\n violations.push(...lazyViolations);\n\n const score = Math.max(0, 100 - (violations.length * 10));\n const passed = !violations.some((v: any) => v.severity === 'HIGH' || v.severity === 'FATAL');\n\n return {\n timestamp: new Date().toISOString(),\n projectId: input.projectId,\n filePath: input.filePath,\n passed,\n score,\n violations,\n summary: passed\n ? 'FRANK: Security audit PASSED. No critical Fortress violations detected.'\n : `FRANK: Security audit FAILED. Detected ${violations.length} violations against the Fortress Matrix.`\n };\n}\n","\nimport { SupabaseClient } from '@supabase/supabase-js';\nimport { analyzeDatabasePerformance } from './analyze-database-performance.js';\nimport { auditRlsStatus, auditSecurityIntegrity } from './security-tools.js';\nimport { IntegrityGateResponse, IntegrityCheckResult, AuditIntegrityGateInput } from '../lib/types.js';\nimport { registry } from '../lib/tool-registry.js';\nimport { AuditIntegrityGateInputSchema } from '../lib/schemas.js';\n\n// ============================================\n// Tool Registration\n// ============================================\n\nregistry.register({\n name: 'audit_integrity_gate',\n description: `Runs the full Integrity Gate (Security + Performance checks). \nCan trigger a SOFT LOCK if critical issues are found.`,\n schema: AuditIntegrityGateInputSchema,\n handler: async (args, context) => {\n const result = await runAuditIntegrityGate(context.supabase, args);\n return { content: [{ type: 'text', text: result.summary }] };\n }\n});\n\nexport async function runAuditIntegrityGate(\n supabase: SupabaseClient,\n input: AuditIntegrityGateInput\n): Promise<IntegrityGateResponse> {\n const checks: IntegrityCheckResult[] = [];\n let isSoftLocked = false;\n\n // 1. Run Guardian Security Audit (RLS)\n try {\n const rlsResult = await auditRlsStatus(supabase, { projectId: input.projectId });\n const unsecuredTables = rlsResult.unsecuredTables || [];\n\n if (unsecuredTables.length > 0) {\n isSoftLocked = true;\n checks.push({\n check: 'SECURITY',\n status: 'FAIL',\n message: `Found ${unsecuredTables.length} tables without RLS enabled.`,\n details: unsecuredTables\n });\n } else {\n checks.push({\n check: 'SECURITY',\n status: 'PASS',\n message: 'All tables have Row Level Security enabled.'\n });\n }\n } catch (e: any) {\n checks.push({\n check: 'SECURITY',\n status: 'WARN',\n message: `Failed to execute RLS audit: ${e.message}`\n });\n }\n\n // 2. Run Fortress Security Matrix (Phase 7)\n if (input.filePaths && input.filePaths.length > 0) {\n for (const path of input.filePaths) {\n try {\n // We need to read the file content here or pass it? \n // auditSecurityIntegrity requires 'content'. \n // But auditIntegrityGate only gets filePaths.\n // WE NEED TO READ THE FILE. \n // Since this runs on the server, we can use fs. \n // BUT we need to be careful about imports in this environment.\n // Ideally, auditSecurityIntegrity should accept a path and read it, \n // but currently it accepts { filePath, content }.\n\n // Let's assume we can read via fs if we are in Node environment (which MCP is).\n const fs = await import('fs/promises');\n const content = await fs.readFile(path, 'utf-8');\n\n const securityResult = await auditSecurityIntegrity(supabase, {\n projectId: input.projectId,\n filePath: path,\n content: content\n });\n\n if (!securityResult.passed) {\n isSoftLocked = true;\n checks.push({\n check: 'FORTRESS_MATRIX',\n status: 'FAIL',\n message: `Fortress Violations in ${path.split('/').pop()}`,\n details: securityResult.violations\n });\n } else {\n checks.push({\n check: 'FORTRESS_MATRIX',\n status: 'PASS',\n message: `Fortress Secured: ${path.split('/').pop()}`\n });\n }\n\n } catch (e: any) {\n checks.push({\n check: 'FORTRESS_MATRIX',\n status: 'WARN',\n message: `Failed to audit ${path}: ${e.message}`\n });\n }\n }\n }\n\n // 3. Run Sindre Performance Audit (Indexes & N+1)\n if (input.filePaths && input.filePaths.length > 0) {\n try {\n const perfResult = await analyzeDatabasePerformance(supabase, {\n projectId: input.projectId,\n filePaths: input.filePaths\n });\n\n const highSeverityIssues = perfResult.issues.filter(i => i.severity === 'HIGH');\n\n if (highSeverityIssues.length > 0) {\n isSoftLocked = true;\n checks.push({\n check: 'PERFORMANCE',\n status: 'FAIL',\n message: `Found ${highSeverityIssues.length} Critical Performance Issues (N+1 or Missing Indexes).`,\n details: highSeverityIssues\n });\n } else if (perfResult.issues.length > 0) {\n checks.push({\n check: 'PERFORMANCE',\n status: 'WARN',\n message: `Found ${perfResult.issues.length} non-critical performance hints.`,\n details: perfResult.issues\n });\n } else {\n checks.push({\n check: 'PERFORMANCE',\n status: 'PASS',\n message: 'No performance bottlenecks detected in scanned files.'\n });\n }\n } catch (e: any) {\n checks.push({\n check: 'PERFORMANCE',\n status: 'WARN',\n message: `Failed to execute Performance audit: ${e.message}`\n });\n }\n } else {\n checks.push({\n check: 'PERFORMANCE',\n status: 'WARN',\n message: 'Skipped performance scan (no file paths provided).'\n });\n }\n\n // 3. Construct Final Decision\n const summary = isSoftLocked\n ? `⛔ INTEGRITY GATE: SOFT LOCK ENGAGED. Critical issues found. Override required.`\n : `✅ INTEGRITY GATE: PASSED. System is secure and optimized.`;\n\n return {\n passed: !isSoftLocked,\n mode: isSoftLocked ? 'SOFT_LOCK' : 'OPEN',\n checks,\n summary\n };\n}\n","\nimport { SupabaseClient } from '@supabase/supabase-js';\nimport { IntegrityGateResponse, ReleaseManifest } from '../lib/types.js';\nimport { registry } from '../lib/tool-registry.js';\nimport { CompleteRoadmapTaskInputSchema } from '../lib/schemas.js';\n\n// ============================================\n// Tool Registration\n// ============================================\n\nregistry.register({\n name: 'complete_roadmap_task',\n description: `Finalizes a roadmap task. Generates a Release Manifest and triggers the Sovereign Harvesting protocol.`,\n schema: CompleteRoadmapTaskInputSchema,\n handler: async (args, context) => {\n const result = await completeRoadmapTask(\n context.supabase,\n args.projectId,\n args.summary,\n args.taskId,\n args.gitDiff,\n args.integrityGate\n );\n return { content: [{ type: 'text', text: result.message }] };\n }\n});\n\nexport interface CompleteRoadmapTaskResponse {\n success: boolean;\n taskId: string;\n message: string;\n}\n\nexport async function completeRoadmapTask(\n supabase: SupabaseClient,\n projectId: string,\n summary: string,\n taskId?: string,\n gitDiff?: string,\n integrityGate?: IntegrityGateResponse\n): Promise<CompleteRoadmapTaskResponse> {\n\n // 1. Identify the task\n let targetTaskId = taskId;\n\n if (!targetTaskId) {\n // Infer: Find the first IN_PROGRESS or ACTIVE task\n const { data: activeTask } = await supabase\n .from('roadmap_chunks')\n .select('id, title')\n .eq('project_id', projectId)\n .in('status', ['IN_PROGRESS', 'ACTIVE'])\n .order('step_number', { ascending: true })\n .limit(1)\n .single();\n\n if (activeTask) {\n targetTaskId = activeTask.id;\n } else {\n throw new Error('No active task found to complete. Please provide a specific taskId.');\n }\n }\n\n // 2. Generate Release Manifest if Integrity Gate info is present\n let metadata: any = {};\n if (integrityGate) {\n const securityCheck = integrityGate.checks.find(c => (c as any).check === 'SECURITY');\n const performanceCheck = integrityGate.checks.find(c => (c as any).check === 'PERFORMANCE');\n\n const manifest: ReleaseManifest = {\n executive_summary: summary,\n security_certificate: {\n status: securityCheck?.status === 'PASS' ? 'PASSED' : (securityCheck?.status === 'FAIL' ? 'FAILED' : 'WARNING'),\n message: securityCheck?.message || 'No security audit performed.',\n unsecured_tables: securityCheck?.details || []\n },\n performance_report: {\n status: performanceCheck?.status === 'PASS' ? 'PASSED' : (performanceCheck?.status === 'FAIL' ? 'FAILED' : 'WARNING'),\n message: performanceCheck?.message || 'No performance audit performed.',\n issues_found: performanceCheck?.details ? (Array.isArray(performanceCheck.details) ? performanceCheck.details.length : 0) : 0\n },\n timestamp: new Date().toISOString()\n };\n\n metadata.release_manifest = manifest;\n }\n\n // 3. Update the Task Status\n const { error: updateError } = await supabase\n .from('roadmap_chunks')\n .update({\n status: 'COMPLETED',\n completed_at: new Date().toISOString()\n })\n .eq('id', targetTaskId);\n\n if (updateError) {\n throw new Error(`Failed to update task status: ${updateError.message}`);\n }\n\n // 4. Create a Mission Report entry with the Manifest\n const { error: reportError } = await supabase\n .from('mission_reports')\n .insert({\n project_id: projectId,\n task_id: targetTaskId,\n human_summary: summary,\n technical_summary: gitDiff || 'Completed via IDE Direct Connection.',\n metadata: metadata\n });\n\n if (reportError) {\n console.warn('Failed to save mission report:', reportError.message);\n }\n\n // 5. SOVEREIGN HARVESTING: Trigger Reflection & Skill Extraction (Brynjar)\n // Fire and forget - don't block completion on harvesting\n try {\n const apiKey = process.env.RIGSTATE_API_KEY;\n // Default to localhost for development if not set\n const apiUrl = process.env.RIGSTATE_API_URL || 'http://localhost:3000';\n\n // In local dev, we might not have an API key set, so we allow it if it's localhost\n const isLocal = apiUrl.includes('localhost') || apiUrl.includes('127.0.0.1');\n\n if (apiKey || isLocal) {\n fetch(`${apiUrl}/api/v1/skills/harvest`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(apiKey ? { 'Authorization': `Bearer ${apiKey}` } : {})\n },\n body: JSON.stringify({\n projectId,\n taskId: targetTaskId,\n summary,\n technicalSummary: gitDiff || 'Completed via IDE Direct Connection.',\n metadata: metadata\n })\n }).catch(e => console.error('Harvesting failed (silent):', e));\n }\n } catch (e) {\n // Harvesting is non-critical, fail silently\n }\n\n return {\n success: true,\n taskId: targetTaskId!,\n message: integrityGate\n ? `Task completed! 🎖️ Release Manifest generated and attached.`\n : `Task completed successfully! Summary saved.`\n };\n}\n","import { SupabaseClient } from '@supabase/supabase-js';\nimport { SaveToProjectBrainInput, UpdateRoadmapStatusInput, AddRoadmapChunkInput } from '../lib/types.js';\nimport { registry } from '../lib/tool-registry.js';\nimport {\n SaveToProjectBrainInputSchema,\n UpdateRoadmapStatusInputSchema,\n AddRoadmapChunkInputSchema\n} from '../lib/schemas.js';\n\n// ============================================\n// Tool Registration\n// ============================================\n\nregistry.register({\n name: 'save_to_project_brain',\n description: `Maja's Tool: Persists knowledge, decisions, and lessons learned to the Project Brain.`,\n schema: SaveToProjectBrainInputSchema,\n handler: async (args, context) => {\n const result = await saveToProjectBrain(context.supabase, context.userId, args);\n return { content: [{ type: 'text', text: result.message }] };\n }\n});\n\nregistry.register({\n name: 'update_roadmap_status',\n description: `Kine's Tool: Updates the status of a roadmap task and notifies Scribe system.`,\n schema: UpdateRoadmapStatusInputSchema,\n handler: async (args, context) => {\n const result = await updateRoadmapStatus(context.supabase, context.userId, args);\n return { content: [{ type: 'text', text: result.message }] };\n }\n});\n\nregistry.register({\n name: 'add_roadmap_chunk',\n description: `Kine's Tool: Adds a new task/chunk to the roadmap for feature decomposition.`,\n schema: AddRoadmapChunkInputSchema,\n handler: async (args, context) => {\n const result = await addRoadmapChunk(context.supabase, context.userId, args);\n return { content: [{ type: 'text', text: result.message }] };\n }\n});\n\n/**\n * Maja's Tool: Save to Project Brain\n * Persists knowledge, decisions, and notes.\n */\nexport async function saveToProjectBrain(\n supabase: SupabaseClient,\n userId: string,\n input: SaveToProjectBrainInput\n) {\n const { projectId, title, content, category, tags } = input;\n\n // Confirm project access\n const { data: p, error: pErr } = await supabase.from('projects').select('id').eq('id', projectId).eq('owner_id', userId).single();\n if (pErr || !p) throw new Error('Access denied');\n\n const fullContent = `# ${title}\\n\\n${content}`;\n\n const { data, error } = await supabase\n .from('project_memories')\n .insert({\n project_id: projectId,\n content: fullContent,\n category: category.toLowerCase(),\n tags: tags,\n importance: (category === 'DECISION' || category === 'ARCHITECTURE') ? 9 : 5,\n is_active: true,\n source_type: 'chat_manual'\n })\n .select('id')\n .single();\n\n if (error) throw new Error(`Failed to save memory: ${error.message}`);\n\n return {\n success: true,\n memoryId: data.id,\n message: `✅ Saved [${category}] \"${title}\" to Project Brain.`\n };\n}\n\n/**\n * Kine's Tool: Update Roadmap Status\n * Updates task status and notifies Scribe system.\n */\nexport async function updateRoadmapStatus(\n supabase: SupabaseClient,\n userId: string,\n input: UpdateRoadmapStatusInput\n) {\n const { projectId, chunkId, status } = input;\n\n // Map status to DB enum: 'TODO' -> 'LOCKED' (Standard convention in Rigstate seems to be LOCKED/ACTIVE/COMPLETED)\n // If 'TODO' is meant to be 'PENDING', we check schema. Assuming 'LOCKED' is the backlog state.\n const dbStatus = status === 'TODO' ? 'LOCKED' : status === 'IN_PROGRESS' ? 'ACTIVE' : 'COMPLETED';\n\n const { error } = await supabase\n .from('roadmap_chunks')\n .update({ status: dbStatus })\n .eq('id', chunkId)\n .eq('project_id', projectId);\n\n if (error) throw new Error(`Update failed: ${error.message}`);\n\n let message = `Roadmap status updated to ${status} (${dbStatus}).`;\n\n if (status === 'COMPLETED') {\n // \"Notification\" to Gunhild\n message += \" 📢 Gunhild (Scribe) has been signaled. This completion will be reflected in the next report.\";\n } else if (status === 'IN_PROGRESS') {\n message += \" 🚀 Work started.\";\n }\n\n return { success: true, status: dbStatus, message };\n}\n\n/**\n * Kine's Tool: Add Roadmap Chunk\n * Decomposes features into actionable chunks.\n */\nexport async function addRoadmapChunk(\n supabase: SupabaseClient,\n userId: string,\n input: AddRoadmapChunkInput\n) {\n const { projectId, title, description, priority } = input;\n\n // Get max step number\n const { data: maxStep } = await supabase\n .from('roadmap_chunks')\n .select('step_number')\n .eq('project_id', projectId)\n .order('step_number', { ascending: false })\n .limit(1)\n .single();\n\n const nextStepNum = (maxStep?.step_number || 0) + 1;\n\n const { data, error } = await supabase\n .from('roadmap_chunks')\n .insert({\n project_id: projectId,\n title: title,\n description: description || '',\n status: 'LOCKED', // Default state\n priority: priority,\n step_number: nextStepNum,\n sprint_focus: input.featureId ? `Feature: ${input.featureId}` : null\n })\n .select('id')\n .single();\n\n if (error) throw new Error(`Failed to add chunk: ${error.message}`);\n\n return {\n success: true,\n chunkId: data.id,\n stepNumber: nextStepNum,\n message: `✅ Added new roadmap chunk: \"${title}\" (Step ${nextStepNum}).`\n };\n}\n","import { promises as fs } from 'fs';\nimport * as path from 'path';\nimport { AnalyzeDependencyGraphInput } from '../lib/types.js';\nimport { registry } from '../lib/tool-registry.js';\nimport { AnalyzeDependencyGraphInputSchema } from '../lib/schemas.js';\n\n// ============================================\n// Tool Registration\n// ============================================\n\nregistry.register({\n name: 'analyze_dependency_graph',\n description: `Einar's Tool: Architecture Integrity Scanner. Scans the codebase for circular dependencies and structural violations.`,\n schema: AnalyzeDependencyGraphInputSchema,\n handler: async (args, context) => {\n const result = await analyzeDependencyGraph(args);\n return { content: [{ type: 'text', text: (result as any).summary || 'Scan complete' }] };\n }\n});\n\n/**\n * Einar's Tool: Architecture Integrity Scanner\n * Scans the codebase for circular dependencies and structural violations.\n */\nexport async function analyzeDependencyGraph(input: AnalyzeDependencyGraphInput) {\n // Determine root. Input path is relative to CWD usually.\n // If input.path is absolute, use it. Otherwise resolve from CWD.\n const searchPath = path.isAbsolute(input.path)\n ? input.path\n : path.resolve(process.cwd(), input.path);\n\n try {\n await fs.access(searchPath);\n } catch {\n return {\n error: `Directory not found: ${searchPath}. Ensure you are running the MCP server in the project root or provide an absolute path.`\n };\n }\n\n // 1. Scan files\n const allFiles = await getAllFiles(searchPath);\n const tsFiles = allFiles.filter(f => /\\.(ts|tsx|js|jsx)$/.test(f) && !f.includes('node_modules') && !f.includes('.next') && !f.includes('dist'));\n\n // 2. Build Graph\n const graph: Record<string, string[]> = {};\n const fileSet = new Set(tsFiles);\n\n for (const file of tsFiles) {\n const content = await fs.readFile(file, 'utf-8');\n const imports = extractImports(content);\n\n const validDeps: string[] = [];\n\n for (const imp of imports) {\n const resolved = resolveImport(file, imp, searchPath);\n if (resolved && fileSet.has(resolved)) {\n validDeps.push(resolved);\n }\n }\n\n // Use relative paths for the graph to make it readable\n const relFile = path.relative(searchPath, file);\n graph[relFile] = validDeps.map(d => path.relative(searchPath, d));\n }\n\n // 3. Detect Cycles\n const cycles = detectCycles(graph);\n\n return {\n timestamp: new Date().toISOString(),\n analyzedPath: searchPath,\n metrics: {\n totalFiles: tsFiles.length,\n circularDependencies: cycles.length\n },\n cycles: cycles,\n status: cycles.length > 0 ? 'VIOLATION' : 'PASS',\n summary: cycles.length > 0\n ? `FAILED. Detected ${cycles.length} circular dependencies. These must be resolved to maintain architectural integrity.`\n : `PASSED. No circular dependencies detected in ${tsFiles.length} files.`\n };\n}\n\n// --- Helpers ---\n\nasync function getAllFiles(dir: string): Promise<string[]> {\n const entries = await fs.readdir(dir, { withFileTypes: true });\n const files = await Promise.all(entries.map(async (entry) => {\n const res = path.resolve(dir, entry.name);\n return entry.isDirectory() ? getAllFiles(res) : res;\n }));\n return files.flat();\n}\n\n/**\n * Simple regex extraction of import statements.\n * Matches: import ... from '...'\n * Matches: import '...'\n * Matches: export ... from '...'\n */\nfunction extractImports(content: string): string[] {\n const regex = /from\\s+['\"]([^'\"]+)['\"]|import\\s+['\"]([^'\"]+)['\"]/g;\n const imports: string[] = [];\n let match;\n while ((match = regex.exec(content)) !== null) {\n // match[1] is 'from \"...\"; match[2] is import \"...\";\n imports.push(match[1] || match[2]);\n }\n return imports;\n}\n\n/**\n * Naive resolver.\n * Handles:\n * - Relative: ./foo, ../bar\n * - Alias: @/ -> searchPath/ (Assumes Next.js style)\n * - Extensions: tries .ts, .tsx, .js, index.ts, etc.\n */\nfunction resolveImport(importer: string, importPath: string, root: string): string | null {\n if (!importPath.startsWith('.') && !importPath.startsWith('@/')) {\n return null; // Ignore node_modules\n }\n\n let searchDir = path.dirname(importer);\n let target = importPath;\n\n if (importPath.startsWith('@/')) {\n target = importPath.replace('@/', '');\n searchDir = root; // Assume root is where @/ points to (src or project root)\n // Adjust for src if root includes src, ensuring we don't double dip? \n // Actually, usually @/ maps to src/ or root. We'll try relative to 'root'.\n }\n\n const startPath = path.resolve(searchDir, target);\n\n // Try extensions\n const extensions = ['.ts', '.tsx', '.js', '.jsx', '/index.ts', '/index.tsx', '/index.js', ''];\n for (const ext of extensions) {\n const candidate = startPath + ext;\n if (require('fs').existsSync(candidate) && !require('fs').statSync(candidate).isDirectory()) {\n return candidate;\n }\n }\n\n return null;\n}\n\nfunction detectCycles(graph: Record<string, string[]>): string[][] {\n const visited = new Set<string>();\n const recursionStack = new Set<string>();\n const cycles: string[][] = [];\n\n function dfs(node: string, path: string[]) {\n visited.add(node);\n recursionStack.add(node);\n path.push(node);\n\n const deps = graph[node] || [];\n for (const dep of deps) {\n if (!visited.has(dep)) {\n dfs(dep, path);\n } else if (recursionStack.has(dep)) {\n // Cycle detected\n const cycleStart = path.indexOf(dep);\n if (cycleStart !== -1) {\n cycles.push([...path.slice(cycleStart), dep]);\n }\n }\n }\n\n recursionStack.delete(node);\n path.pop();\n }\n\n for (const node of Object.keys(graph)) {\n if (!visited.has(node)) {\n dfs(node, []);\n }\n }\n\n return cycles;\n}\n","import { CallToolRequestSchema, McpError, ErrorCode } from '@modelcontextprotocol/sdk/types.js';\nimport { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport { AuthContext } from './types.js';\nimport { registry } from '../lib/tool-registry.js';\nimport {\n GetProjectContextInputSchema,\n AuditSecurityIntegrityInputSchema\n} from '../lib/types.js';\nimport { getProjectContext } from '../tools/get-project-context.js';\nimport { auditSecurityIntegrity } from '../tools/security-tools.js';\nimport { watcherState } from './telemetry.js';\n\nexport function setupToolHandlers(server: Server, authContext: AuthContext) {\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n const { name } = request.params;\n const args = request.params.arguments as any;\n\n // 1. Check Registry (Modern Tools)\n try {\n return await registry.callTool(name, args, {\n supabase: authContext.supabase,\n userId: authContext.userId\n });\n } catch (e: any) {\n if (!e.message?.includes(`Tool '${name}' not found`)) {\n throw new McpError(ErrorCode.InvalidParams, e.message);\n }\n }\n\n // 2. Legacy Switch (Modularized)\n switch (name) {\n case 'get_agent_status': {\n return { content: [{ type: 'text', text: JSON.stringify(watcherState, null, 2) }] };\n }\n\n default:\n throw new McpError(ErrorCode.MethodNotFound, `Unknown tool: ${name}`);\n }\n });\n}\n","\nimport { SupabaseClient } from '@supabase/supabase-js';\n\n/**\n * The Scribe's core adapter for fetching its own persona from Prompt CMS.\n */\nexport async function getScribePersona(supabase: SupabaseClient) {\n const { data: persona, error } = await supabase\n .from('agent_personas')\n .select('*')\n .eq('slug', 'the-scribe')\n .single();\n\n if (error || !persona) {\n return {\n display_name: 'The Scribe',\n job_title: 'Technical Documentation Lead',\n content: 'You are The Scribe, an expert in technical manifest generation and investor-ready reporting.'\n };\n }\n\n return persona;\n}\n\n/**\n * Calculates real-world metrics for the Scribe to report on.\n * Focuses on Velocity, Quality, and Risk.\n * IMPORTANT: Excludes is_legacy=true items from velocity calculations\n * to prevent historical imports from skewing development metrics.\n */\nexport async function calculateScribeMetrics(supabase: SupabaseClient, projectId: string) {\n // A: Velocity - Average time for agent_bridge tasks in the last 7 days\n const { data: recentTasks } = await supabase\n .from('agent_bridge')\n .select('created_at, updated_at')\n .eq('project_id', projectId)\n .eq('status', 'COMPLETED')\n .gte('created_at', new Date(Date.now() - 7 * 24 * 60 * 60 * 1000).toISOString());\n\n let avgTimeMs = 0;\n if (recentTasks && recentTasks.length > 0) {\n const deltas = recentTasks.map(t =>\n new Date(t.updated_at).getTime() - new Date(t.created_at).getTime()\n );\n avgTimeMs = deltas.reduce((a, b) => a + b, 0) / deltas.length;\n }\n\n const velocityStr = avgTimeMs > 0\n ? `${(avgTimeMs / 1000).toFixed(1)}s avg execution time`\n : \"No execution history\";\n\n // B: Active Tasks Completed (EXCLUDES legacy items)\n const { count: activeTasksCompleted } = await supabase\n .from('roadmap_chunks')\n .select('*', { count: 'exact', head: true })\n .eq('project_id', projectId)\n .eq('status', 'COMPLETED')\n .or('is_legacy.is.null,is_legacy.eq.false');\n\n // C: Legacy Foundations Count (for separate reporting)\n const { count: legacyCount } = await supabase\n .from('roadmap_chunks')\n .select('*', { count: 'exact', head: true })\n .eq('project_id', projectId)\n .eq('is_legacy', true);\n\n // D: Quality - Fetch from intelligence_trends\n const { data: trends } = await supabase\n .from('intelligence_trends')\n .select('correction_count')\n .order('week_start', { ascending: false })\n .limit(2);\n\n let trendDir = 'stable';\n if (trends && trends.length === 2) {\n const latest = trends[0].correction_count;\n const prev = trends[1].correction_count;\n if (latest < prev) trendDir = 'improving';\n else if (latest > prev) trendDir = 'declining';\n }\n const qualityStr = `Quality trend is ${trendDir}` +\n (legacyCount && legacyCount > 0 ? `. Built on ${legacyCount} established foundations.` : '');\n\n // E: Risk - Count PING/CHECK rows\n const { count: riskCount } = await supabase\n .from('agent_bridge')\n .select('*', { count: 'exact', head: true })\n .eq('project_id', projectId)\n .or('proposal.ilike.%PING%,proposal.ilike.%CHECK%,summary.ilike.%PING%,summary.ilike.%CHECK%');\n\n // F: Enhanced Risk - Check for RLS\n const { count: rlsCount } = await supabase.from('pg_policies').select('*', { count: 'exact', head: true }).eq('schemaname', 'public');\n\n const riskMitigation = (riskCount || 0) > 0 || (rlsCount || 0) > 0\n ? `Security posture reinforced by ${rlsCount || 0} RLS policies and ${riskCount || 0} active guardian pings. All access is audited.`\n : \"Security controls inactive. Immediate RLS audit recommended.\";\n\n return {\n velocity: velocityStr,\n qualityTrend: qualityStr,\n riskScore: riskCount || 0,\n riskMitigation,\n activeTasksCompleted: activeTasksCompleted || 0,\n legacyFoundations: legacyCount || 0\n };\n}\n\n\n/**\n * Interpolates common variables into the Scribe's prompt.\n */\nexport function interpolateScribePrompt(\n basePrompt: string,\n vars: { projectName: string; velocity?: string; quality?: string; riskMitigation?: string }\n): string {\n let result = basePrompt;\n result = result.replace(/{{project_name}}/g, vars.projectName);\n if (vars.velocity) result = result.replace(/{{velocity}}/g, vars.velocity);\n if (vars.quality) result = result.replace(/{{quality}}/g, vars.quality);\n if (vars.riskMitigation) result = result.replace(/{{risk_mitigation}}/g, vars.riskMitigation);\n return result;\n}\n","\nimport { SupabaseClient } from '@supabase/supabase-js';\nimport { getScribePersona, interpolateScribePrompt, calculateScribeMetrics } from '../agents/the-scribe.js';\n\nexport async function generateProfessionalPdf(\n supabase: SupabaseClient,\n userId: string,\n projectId: string,\n reportType: 'SYSTEM_MANIFEST' | 'INVESTOR_REPORT'\n) {\n console.error(`🖋️ The Scribe is preparing a ${reportType} briefing for project ${projectId}...`);\n\n // 1. Fetch persona from Prompt CMS (via Scribe Adapter)\n const persona = await getScribePersona(supabase);\n\n // 2. Fetch Project Metadata (expanded)\n const { data: project } = await supabase\n .from('projects')\n .select('name, description, project_type, detected_stack')\n .eq('id', projectId)\n .single();\n\n const projectName = project?.name || 'Rigstate Project';\n const projectDescription = project?.description || 'A cutting-edge software project built with modern architecture.';\n const projectType = project?.project_type || 'Web Application';\n const detectedStack = project?.detected_stack || {};\n\n // 3. Fetch COMPREHENSIVE Real Context & Metrics\n const [\n metrics,\n dnaStatsResponse,\n recentDecisions,\n roadmapData,\n councilSessions,\n tableList\n ] = await Promise.all([\n calculateScribeMetrics(supabase, projectId),\n supabase.rpc('get_project_dna_stats', { p_project_id: projectId }),\n supabase.from('project_memories')\n .select('summary, category, created_at')\n .eq('project_id', projectId)\n .eq('category', 'decision')\n .order('created_at', { ascending: false })\n .limit(5),\n supabase.from('roadmap_chunks')\n .select('title, status, priority')\n .eq('project_id', projectId)\n .order('priority', { ascending: true }),\n supabase.from('council_sessions')\n .select('executive_summary, created_at')\n .eq('project_id', projectId)\n .order('created_at', { ascending: false })\n .limit(2),\n supabase.rpc('get_public_tables_list')\n ]);\n\n const dnaStats = dnaStatsResponse.data || { total_tables: 0, rls_tables: 0, rls_policies: 0 };\n const tables = tableList.data || [];\n\n // 4. Process Roadmap Data - Separate legacy from active\n const roadmapSteps = roadmapData.data || [];\n const allCompletedSteps = roadmapSteps.filter(s => s.status === 'COMPLETED');\n const legacySteps = roadmapSteps.filter((s: any) => s.is_legacy === true);\n const activeCompletedSteps = allCompletedSteps.filter((s: any) => s.is_legacy !== true);\n const activeStep = roadmapSteps.find(s => s.status === 'ACTIVE');\n const lockedSteps = roadmapSteps.filter(s => s.status === 'LOCKED');\n\n // Progress based on ALL steps (legacy count towards completion but are clearly marked)\n const totalNonLegacy = roadmapSteps.filter((s: any) => s.is_legacy !== true).length;\n const progress = totalNonLegacy > 0 ? Math.round((activeCompletedSteps.length / totalNonLegacy) * 100) : 0;\n\n // 5. Build Tech Stack Summary\n const deps = detectedStack.dependencies || {};\n const devDeps = detectedStack.devDependencies || {};\n const allDeps = { ...deps, ...devDeps };\n const techStackItems: string[] = [];\n\n if (allDeps['next']) techStackItems.push(`Next.js ${allDeps['next']}`);\n if (allDeps['react']) techStackItems.push(`React ${allDeps['react']}`);\n if (allDeps['@supabase/supabase-js']) techStackItems.push('Supabase');\n if (allDeps['tailwindcss']) techStackItems.push('Tailwind CSS');\n if (allDeps['typescript']) techStackItems.push('TypeScript');\n if (allDeps['zod']) techStackItems.push('Zod Validation');\n if (allDeps['@react-pdf/renderer']) techStackItems.push('React-PDF');\n if (allDeps['sonner']) techStackItems.push('Sonner Toasts');\n\n const techStackSummary = techStackItems.length > 0\n ? techStackItems.join(' • ')\n : 'Stack detection pending. Run repository indexing to populate.';\n\n // 6. Build ADRs Summary\n const adrList = recentDecisions.data?.map(d => `• ${d.summary}`) || [];\n const adrContent = adrList.length > 0\n ? adrList.join('\\n')\n : '• No architectural decisions recorded yet. Use the Council or save decisions via chat.';\n\n // 7. Build Roadmap Details - Separate legacy from active\n const legacyTitles = legacySteps.length > 0\n ? `Established Foundations (${legacySteps.length}):\\n${legacySteps.map((s: any) => `📚 ${s.title}`).join('\\n')}`\n : '';\n const activeTitles = activeCompletedSteps.map((s: any) => `✓ ${s.title}`).join('\\n');\n const activeTitle = activeStep ? `→ IN PROGRESS: ${activeStep.title}` : '';\n const nextUpTitles = lockedSteps.slice(0, 3).map((s: any) => `○ ${s.title}`).join('\\n');\n\n const roadmapDetails = [\n legacyTitles,\n activeTitles ? `\\nRecent Completions:\\n${activeTitles}` : '',\n activeTitle,\n nextUpTitles ? `\\nNext Up:\\n${nextUpTitles}` : ''\n ].filter(Boolean).join('\\n');\n\n\n // 8. Build Council Insights\n const councilInsights = councilSessions.data?.map(s => s.executive_summary).filter(Boolean).slice(0, 2) || [];\n const councilSummary = councilInsights.length > 0\n ? councilInsights.map(i => `• ${i}`).join('\\n')\n : 'No council sessions recorded yet.';\n\n // 9. Build Security Analysis (Comprehensive)\n const securedTables = dnaStats.rls_tables || 0;\n const totalTables = dnaStats.total_tables || tables.length || 0;\n const rlsPolicies = dnaStats.rls_policies || 0;\n const securityScore = totalTables > 0 ? Math.round((securedTables / totalTables) * 100) : 0;\n\n const securityAnalysis = `\nSecurity Score: ${securityScore}% of public tables secured with RLS.\n• Total Public Tables: ${totalTables}\n• Tables with RLS Enabled: ${securedTables}\n• Active RLS Policies: ${rlsPolicies}\n• Guardian Pings (Monitoring): ${metrics.riskScore} detected\n\n${securityScore >= 90 ? '✓ EXCELLENT: All critical tables are protected.' :\n securityScore >= 70 ? '⚠ STABLE: Most tables protected. Review remaining exposures.' :\n '⛔ AT RISK: Immediate RLS audit recommended.'}\n`.trim();\n\n // 10. Interpolate variables\n const interpolatedPrompt = interpolateScribePrompt(persona.content, {\n projectName,\n velocity: metrics.velocity,\n quality: metrics.qualityTrend,\n riskMitigation: metrics.riskMitigation\n });\n\n // 11. Structure MANIFEST report data\n const manifestData = {\n type: 'MANIFEST',\n projectName: projectName,\n sections: [\n {\n title: 'Project Overview',\n content: `${projectDescription}\\n\\nProject Type: ${projectType}\\nTech Stack: ${techStackSummary}`\n },\n {\n title: 'Codebase DNA (Real-time Scan)',\n content: `System consists of ${totalTables} tables with ${rlsPolicies} active RLS security policies.\\n\\nDatabase integrity is rated as ${securityScore >= 90 ? 'EXCELLENT' : securityScore >= 70 ? 'STABLE' : 'NEEDS ATTENTION'}.\\n\\nKey Tables Detected:\\n${tables.slice(0, 10).map((t: any) => `• ${t.table_name}`).join('\\n') || '• Run database scan to populate'}`\n },\n {\n title: 'Architectural Decisions (ADRs)',\n content: adrContent\n },\n {\n title: 'Roadmap Execution',\n content: `Development Progress: ${progress}% (${activeCompletedSteps.length} active / ${legacySteps.length} legacy foundations)\\n\\nVelocity: ${metrics.velocity}\\n\\n${roadmapDetails || 'No roadmap steps configured yet.'}`\n },\n {\n title: 'Council Insights',\n content: councilSummary\n },\n {\n title: 'Security & Risk Assessment',\n content: securityAnalysis\n },\n {\n title: 'Quality & Compliance',\n content: `Quality Trend: ${metrics.qualityTrend}\\n\\nGuard Clauses:\\n• Strict Type Checks (No Any)\\n• Mandatory Supabase RLS Enforcement\\n• Line Limit Enforcement: TS (400) / TSX (250)\\n• All API routes require authentication\\n• CORS policies enforced on public endpoints`\n }\n ],\n agent: persona.display_name,\n job_title: persona.job_title,\n metrics: {\n velocity: metrics.velocity,\n qualityTrend: metrics.qualityTrend,\n progress: `${progress}%`,\n securityScore: `${securityScore}%`,\n totalTables: totalTables,\n rlsPolicies: rlsPolicies\n }\n };\n\n // 12. Structure INVESTOR report data\n const investorData = {\n type: 'INVESTOR',\n projectName: projectName,\n data: {\n velocity: metrics.velocity,\n healthScore: Math.min(100, 70 + (activeCompletedSteps.length * 3) + (legacySteps.length * 2) + (progress / 5) + (securityScore / 10)),\n qualityTrend: metrics.qualityTrend,\n roadmapProgress: `${progress}% (${activeCompletedSteps.length} completed, ${legacySteps.length} established foundations)`,\n projectType: projectType,\n techStack: techStackSummary,\n keyAchievements: [\n ...activeCompletedSteps.slice(0, 3).map((s: any) => `Completed: ${s.title}`),\n ...(legacySteps.length > 0 ? [`Built on ${legacySteps.length} established foundations`] : []),\n ...(recentDecisions.data?.slice(0, 2).map((d: any) => d.summary) || [])\n ].slice(0, 5),\n currentFocus: activeStep?.title || 'Planning next phase',\n upcomingMilestones: lockedSteps.slice(0, 3).map(s => s.title),\n riskMitigation: metrics.riskMitigation,\n securityPosture: {\n score: `${securityScore}%`,\n status: securityScore >= 90 ? 'Excellent' : securityScore >= 70 ? 'Stable' : 'Needs Attention',\n rlsPolicies: rlsPolicies,\n protectedTables: securedTables,\n totalTables: totalTables\n },\n councilInsights: councilInsights.slice(0, 2)\n },\n agent: persona.display_name,\n job_title: persona.job_title\n };\n\n const reportData = reportType === 'SYSTEM_MANIFEST' ? manifestData : investorData;\n\n // 13. Return data to caller\n return {\n success: true,\n message: `${reportType} briefing is ready.`,\n data: reportData,\n debug_prompt_snippet: interpolatedPrompt.substring(0, 500)\n };\n}\n","import { SupabaseClient } from '@supabase/supabase-js';\nimport { WatcherState } from './types.js';\nimport { generateProfessionalPdf } from '../tools/generate-professional-pdf.js';\n\nexport let watcherState: WatcherState = {\n isRunning: false,\n lastCheck: null,\n tasksFound: 0,\n projectId: null\n};\n\nexport async function startFrankWatcher(supabase: SupabaseClient, userId: string) {\n if (watcherState.isRunning) return;\n watcherState.isRunning = true;\n console.error(`🤖 Frank Watcher started for user ${userId}`);\n\n const checkTasks = async () => {\n try {\n watcherState.lastCheck = new Date().toISOString();\n\n const { data: tasks, error } = await supabase\n .from('agent_bridge')\n .select('*')\n .in('status', ['PENDING', 'APPROVED'])\n .order('created_at', { ascending: true })\n .limit(1);\n\n if (error) return;\n\n if (tasks && tasks.length > 0) {\n const task = tasks[0];\n watcherState.tasksFound++;\n\n // Heartbeat Logic\n if (task.proposal?.startsWith('ping') || (task.task_id === null && !task.proposal?.startsWith('report'))) {\n console.error(`\\n⚡ HEARTBEAT: Frank received REAL-TIME PING for project ${task.project_id}. Response: PONG`);\n await supabase.from('agent_bridge').update({\n status: 'COMPLETED',\n summary: 'Pong! Frank is active and listening.',\n updated_at: new Date().toISOString()\n }).eq('id', task.id);\n return;\n }\n\n // Report Generation Logic\n if (task.proposal?.startsWith('report')) {\n const parts = task.proposal.split(':');\n const signalType = parts[1];\n const reportType = signalType === 'MANIFEST' ? 'SYSTEM_MANIFEST' : 'INVESTOR_REPORT';\n console.error(`\\n📄 Frank is generating ${reportType} report...`);\n\n try {\n const result = await generateProfessionalPdf(supabase, userId, task.project_id, reportType);\n await supabase.from('agent_bridge').update({\n status: 'COMPLETED',\n summary: `Report generated: ${reportType}.`,\n proposal: JSON.stringify(result.data),\n updated_at: new Date().toISOString()\n }).eq('id', task.id);\n } catch (genError: any) {\n await supabase.from('agent_bridge').update({\n status: 'FAILED',\n summary: `Generation failed: ${genError.message}`,\n updated_at: new Date().toISOString()\n }).eq('id', task.id);\n }\n return;\n }\n\n // Execution Logic\n if (task.status === 'APPROVED') {\n console.error(`\\n🏗️ Worker: EXECUTING approved task: [${task.id}]`);\n await supabase.from('agent_bridge').update({ status: 'EXECUTING', updated_at: new Date().toISOString() }).eq('id', task.id);\n\n await new Promise(resolve => setTimeout(resolve, 2000));\n\n const taskTitle = (task.roadmap_chunks as any)?.title || 'manual objective';\n const technicalSummary = `Processed ${task.task_id || 'manual task'}. Applied architectural alignment.`;\n const humanSummary = `Mission Accomplished for \"${taskTitle}\". 🚀`;\n\n await supabase.from('mission_reports').insert({\n bridge_id: task.id,\n project_id: task.project_id,\n task_id: task.task_id,\n human_summary: humanSummary,\n technical_summary: technicalSummary\n });\n\n await supabase.from('agent_bridge').update({\n status: 'COMPLETED',\n summary: humanSummary,\n execution_summary: technicalSummary,\n updated_at: new Date().toISOString(),\n completed_at: new Date().toISOString()\n }).eq('id', task.id);\n\n if (task.task_id) {\n await supabase.from('roadmap_chunks').update({ status: 'COMPLETED', completed_at: new Date().toISOString() }).eq('id', task.task_id);\n }\n return;\n }\n\n // Proposal Analysis Logic\n const taskTitle = (task.roadmap_chunks as any)?.title || '';\n let proposal = `Frank (Auto-Mode) has analyzed \"${taskTitle}\". Ready to proceed.`;\n\n await supabase.from('agent_bridge').update({\n status: 'AWAITING_APPROVAL',\n proposal,\n updated_at: new Date().toISOString()\n }).eq('id', task.id);\n }\n } catch (e) { }\n };\n\n const channel = supabase.channel('frank-watcher').on('postgres_changes', { event: '*', schema: 'public', table: 'agent_bridge' }, (payload: any) => {\n if (payload.new.status === 'PENDING' || payload.new.status === 'APPROVED') checkTasks();\n }).subscribe();\n\n setInterval(checkTasks, 5000);\n checkTasks();\n}\n"],"mappings":"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","names":["z","z","z","z","z","z","z","path","fs","fs","path","fs","path","resolve","taskTitle"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/lib/supabase.ts","../src/server/factory.ts","../src/server/types.ts","../src/lib/tool-registry.ts","../src/lib/curator/schemas.ts","../src/lib/curator/actions/query.ts","../src/lib/curator/actions/submit.ts","../src/lib/curator/actions/stats.ts","../src/lib/curator/actions/fortress.ts","../src/tools/curator-tools.ts","../src/tools/teacher-mode.ts","../src/lib/context-engine.ts","../src/lib/schemas.ts","../src/tools/get-project-context.ts","../src/tools/query-brain.ts","../src/tools/get-latest-decisions.ts","../src/tools/save-decision.ts","../src/tools/submit-idea.ts","../src/tools/update-roadmap.ts","../src/tools/run-architecture-audit.ts","../src/tools/sync-ide-rules.ts","../src/tools/list-features.ts","../src/tools/list-roadmap-tasks.ts","../src/tools/get-next-roadmap-step.ts","../src/tools/check-rules-sync.ts","../src/tools/analyze-database-performance.ts","../src/tools/security-checks.ts","../src/tools/security-tools.ts","../src/tools/audit-integrity-gate.ts","../src/tools/complete-roadmap-task.ts","../src/tools/planning-tools.ts","../src/tools/arch-tools.ts","../src/server/core.ts","../src/agents/the-scribe.ts","../src/tools/generate-professional-pdf.ts","../src/server/telemetry.ts"],"sourcesContent":["import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { authenticateApiKey } from './lib/supabase.js';\nimport { createMcpServer } from './server/factory.js';\nimport { setupToolHandlers } from './server/core.js';\nimport { startFrankWatcher } from './server/telemetry.js';\n\nasync function main() {\n const apiKey = process.env.RIGSTATE_API_KEY;\n\n if (!apiKey) {\n console.error('❌ RIGSTATE_API_KEY environment variable is required');\n process.exit(1);\n }\n\n // 1. Authenticate\n const authResult = await authenticateApiKey(apiKey);\n if (!authResult.success || !authResult.context) {\n console.error(`❌ Authentication failed: ${authResult.error}`);\n process.exit(1);\n }\n\n const { supabase, userId } = authResult.context;\n\n // 2. Start Telemetry (Frank Watcher)\n startFrankWatcher(supabase, userId);\n\n // 3. Create Server (Factory)\n const server = createMcpServer();\n\n // 4. Setup Handlers (Core)\n setupToolHandlers(server, { supabase, userId });\n\n // 5. Connect Transport\n const transport = new StdioServerTransport();\n await server.connect(transport);\n\n console.error('🛰️ Rigstate MCP Server (Evolutionary) running on stdio');\n}\n\nmain().catch((error) => {\n console.error('FATAL ERROR:', error);\n process.exit(1);\n});\n","/**\n * Rigstate MCP Server - Supabase Client\n * \n * Creates a Supabase client for MCP server operations.\n * Uses the RIGSTATE_API_KEY to authenticate and determine the user context.\n * \n * Required Environment Variables:\n * - RIGSTATE_API_KEY: Your API key from https://rigstate.dev/settings/api-keys\n * \n * Optional Environment Variables (defaults to production Rigstate):\n * - RIGSTATE_SUPABASE_URL: Override Supabase URL\n * - RIGSTATE_SUPABASE_ANON_KEY: Override Supabase anon key\n */\n\nimport { createClient as createSupabaseClient, SupabaseClient } from '@supabase/supabase-js';\nimport { createHash } from 'crypto';\n\n// Production Rigstate configuration\nconst PRODUCTION_SUPABASE_URL = 'https://gseblsxnfppsxbmtzcfj.supabase.co';\nconst PRODUCTION_SUPABASE_ANON_KEY = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImdzZWJsc3huZnBwc3hibXR6Y2ZqIiwicm9sZSI6ImFub24iLCJpYXQiOjE3MzYxODIxNjgsImV4cCI6MjA1MTc1ODE2OH0.bltFf6_gNH-p3jH8lRY8dCRK6fmgxO8Hjp7UGx8xSxY';\nconst PRODUCTION_SUPABASE_SERVICE_KEY = process.env.SUPABASE_SERVICE_ROLE_KEY || '';\n\n// Environment configuration\n// Priority: Explicit MCP env > Next.js env > Production defaults\nconst SUPABASE_URL =\n process.env.RIGSTATE_SUPABASE_URL ||\n process.env.NEXT_PUBLIC_SUPABASE_URL ||\n PRODUCTION_SUPABASE_URL;\n\nconst SUPABASE_ANON_KEY =\n process.env.RIGSTATE_SUPABASE_ANON_KEY ||\n process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY ||\n PRODUCTION_SUPABASE_ANON_KEY;\n\nconst SUPABASE_SERVICE_KEY =\n process.env.RIGSTATE_SUPABASE_SERVICE_KEY ||\n process.env.SUPABASE_SERVICE_ROLE_KEY ||\n PRODUCTION_SUPABASE_SERVICE_KEY;\n\n\nexport interface AuthContext {\n userId: string;\n apiKeyId: string;\n supabase: SupabaseClient;\n}\n\n/**\n * Validates the RIGSTATE_API_KEY and returns the authenticated user context.\n * \n * CRITICAL: API keys are stored as SHA-256 hashes in the database.\n * We must hash the incoming key before lookup.\n */\nexport async function authenticateApiKey(apiKey: string): Promise<{\n success: boolean;\n error?: string;\n context?: AuthContext;\n}> {\n if (!apiKey) {\n return { success: false, error: 'RIGSTATE_API_KEY is required' };\n }\n\n if (!apiKey.startsWith('sk_rigstate_')) {\n return { success: false, error: 'Invalid API key format. Expected sk_rigstate_...' };\n }\n\n if (!SUPABASE_URL || !SUPABASE_ANON_KEY) {\n return {\n success: false,\n error: 'Supabase configuration missing. Set RIGSTATE_SUPABASE_URL and RIGSTATE_SUPABASE_ANON_KEY.'\n };\n }\n\n // Hash the API key with SHA-256 (same as web app)\n const hashedKey = createHash('sha256').update(apiKey).digest('hex');\n\n // Use service key if available to bypass RLS, otherwise anon key\n const clientKey = SUPABASE_SERVICE_KEY || SUPABASE_ANON_KEY;\n const supabase = createSupabaseClient(SUPABASE_URL, clientKey);\n\n // Look up the API key by HASH (not plain text!)\n const { data: keyData, error: keyError } = await supabase\n .from('api_keys')\n .select('id, user_id, project_id, organization_id, scope')\n .eq('key_hash', hashedKey)\n .single();\n\n if (keyError || !keyData) {\n return { success: false, error: 'Invalid or revoked API key' };\n }\n\n // Update last_used_at timestamp (fire and forget)\n supabase\n .from('api_keys')\n .update({ last_used_at: new Date().toISOString() })\n .eq('id', keyData.id)\n .then();\n\n // Create a user-scoped client for subsequent operations\n // Use the most privileged key available (SERVICE_KEY or ANON_KEY)\n const userSupabase = createSupabaseClient(SUPABASE_URL, clientKey);\n\n return {\n success: true,\n context: {\n userId: keyData.user_id,\n apiKeyId: keyData.id,\n supabase: userSupabase\n }\n };\n}\n\n/**\n * Creates a Supabase client using environment variables.\n * For use after authentication has been established.\n */\nexport function createClient(): SupabaseClient {\n if (!SUPABASE_URL || !SUPABASE_ANON_KEY) {\n throw new Error('Supabase configuration missing. Set RIGSTATE_SUPABASE_URL and RIGSTATE_SUPABASE_ANON_KEY.');\n }\n return createSupabaseClient(SUPABASE_URL, SUPABASE_ANON_KEY);\n}\n","import { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport { ListToolsRequestSchema, ListResourcesRequestSchema } from '@modelcontextprotocol/sdk/types.js';\nimport { SERVER_NAME, SERVER_VERSION } from './types.js';\nimport { registry } from '../lib/tool-registry.js';\nimport { getProjectMorals } from '../resources/project-morals.js';\n\n// Import tool modules to trigger registration\nimport '../tools/curator-tools.js';\nimport '../tools/teacher-mode.js';\nimport '../tools/get-project-context.js';\nimport '../tools/query-brain.js';\nimport '../tools/get-latest-decisions.js';\nimport '../tools/save-decision.js';\nimport '../tools/submit-idea.js';\nimport '../tools/update-roadmap.js';\nimport '../tools/run-architecture-audit.js';\nimport '../tools/sync-ide-rules.ts';\nimport '../tools/list-features.js';\nimport '../tools/list-roadmap-tasks.js';\nimport '../tools/get-next-roadmap-step.js';\nimport '../tools/check-rules-sync.js';\nimport '../tools/audit-integrity-gate.js';\nimport '../tools/complete-roadmap-task.js';\nimport '../tools/planning-tools.js';\nimport '../tools/security-tools.js';\nimport '../tools/arch-tools.js';\n\nexport const TOOLS = [\n {\n name: 'write_to_file',\n description: 'Guardian Lock: Blocks file writes if RIGSTATE_MODE is SUPERVISOR.',\n inputSchema: { type: 'object', properties: {}, additionalProperties: true }\n },\n {\n name: 'replace_file_content',\n description: 'Guardian Lock: Blocks file edits if RIGSTATE_MODE is SUPERVISOR.',\n inputSchema: { type: 'object', properties: {}, additionalProperties: true }\n },\n {\n name: 'run_command',\n description: 'Guardian Lock: Blocks commands if RIGSTATE_MODE is SUPERVISOR.',\n inputSchema: { type: 'object', properties: {}, additionalProperties: true }\n },\n {\n name: 'get_agent_status',\n description: `Checks the status of the internal Frank Watcher agent.`,\n inputSchema: { type: 'object', properties: {} }\n }\n];\n\n\nexport const RESOURCES = [\n {\n uri: 'rigstate://project_morals',\n name: 'Project Morals & Sovereignty',\n mimeType: 'text/markdown',\n description: 'The core ethical and architectural DNA of the project.'\n }\n];\n\nexport function createMcpServer() {\n const server = new Server(\n { name: SERVER_NAME, version: SERVER_VERSION },\n { capabilities: { tools: {}, resources: {} } }\n );\n\n // List Tools\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: [...TOOLS, ...registry.getTools()]\n }));\n\n // List Resources\n server.setRequestHandler(ListResourcesRequestSchema, async () => ({\n resources: RESOURCES\n }));\n\n return server;\n}\n","import { SupabaseClient } from '@supabase/supabase-js';\n\nexport interface WatcherState {\n isRunning: boolean;\n lastCheck: string | null;\n tasksFound: number;\n projectId: string | null;\n}\n\nexport interface McpServerConfig {\n name: string;\n version: string;\n}\n\nexport const SERVER_NAME = 'rigstate-mcp';\nexport const SERVER_VERSION = '0.5.0'; // Evolutionary Update\n\nexport interface AuthContext {\n supabase: SupabaseClient;\n userId: string;\n}\n","import { z } from 'zod';\nimport { SupabaseClient } from '@supabase/supabase-js';\nimport { Tool } from '@modelcontextprotocol/sdk/types.js';\n\n/**\n * Context provided to every tool execution.\n * Contains authentication and database access.\n */\nexport interface ToolContext {\n supabase: SupabaseClient;\n userId: string;\n}\n\n/**\n * A generic definition of a Tool.\n * T corresponds to the Zod schema for input validation.\n */\nexport interface ToolDefinition<T extends z.ZodType> {\n /** The unique name of the tool (e.g., 'list_features') */\n name: string;\n /** A helpful description for the AI */\n description: string;\n /** The Zod schema for input validation */\n schema: T;\n /** The function that executes the tool logic */\n handler: (args: z.infer<T>, context: ToolContext) => Promise<{ content: Array<{ type: string; text: string }> }>;\n}\n\n/**\n * The central registry for all MCP tools.\n * Handles registration, listing, and execution.\n */\nclass ToolRegistry {\n private tools: Map<string, ToolDefinition<any>> = new Map();\n\n /**\n * Registers a tool logic with the system.\n */\n register<T extends z.ZodType>(tool: ToolDefinition<T>) {\n if (this.tools.has(tool.name)) {\n console.warn(`Tool '${tool.name}' is already registered. Overwriting.`);\n }\n this.tools.set(tool.name, tool);\n }\n\n /**\n * Returns the list of tools formatted for the MCP 'ListTools' request.\n * Converts Zod schemas to JSON Schemas implicitly via manual type mapping or libraries.\n * For now, we manually map 'inputSchema' as 'object' in the index.ts, \n * but here we prepare the definitions.\n */\n getTools(): Tool[] {\n return Array.from(this.tools.values()).map(tool => {\n // Very basic Zod -> JSON Schema mapping. \n // In a real robust system, use 'zod-to-json-schema'.\n // Here we rely on the tool definer to keep it simple or we expand later.\n // For now, we assume standard object schema.\n\n // To avoid complex zod-to-json-schema dependency issues for now,\n // we will construct a basic JSON schema representation \n // from the Zod shape if possible, or expect the tool to provide it?\n // Let's rely on zod-to-json-schema if installed, or do a simple conversion.\n // Actually, let's keep it simple: We just return the Tool interface required by MCP SDK.\n\n // Hack for MVP: We assume the top level is always an object with properties.\n // We can improve this reflection later.\n\n return {\n name: tool.name,\n description: tool.description,\n inputSchema: this.zodToJsonSchema(tool.schema)\n };\n });\n }\n\n /**\n * Executes a tool by name.\n * Validates input against schema before execution.\n */\n async callTool(name: string, args: any, context: ToolContext) {\n const tool = this.tools.get(name);\n if (!tool) {\n throw new Error(`Tool '${name}' not found.`);\n }\n\n const parseResult = tool.schema.safeParse(args);\n if (!parseResult.success) {\n throw new Error(`Invalid arguments for tool '${name}': ${parseResult.error.message}`);\n }\n\n return await tool.handler(parseResult.data, context);\n }\n\n /**\n * Basic helper to convert Zod Object to JSON Schema.\n * Note: This is a simplified version. For complex types, use 'zod-to-json-schema'.\n */\n private zodToJsonSchema(schema: z.ZodType): any {\n if (schema instanceof z.ZodObject) {\n const shape = schema.shape;\n const properties: Record<string, any> = {};\n const required: string[] = [];\n\n for (const key in shape) {\n const field = shape[key];\n // Accessing description if available in Zod (requires extended Zod or casting)\n // Basic type mapping:\n let type = 'string';\n let description = field.description; // Leverages Zod's .describe()\n\n if (field instanceof z.ZodNumber) type = 'number';\n if (field instanceof z.ZodBoolean) type = 'boolean';\n if (field instanceof z.ZodArray) type = 'array';\n\n // Determine if optional\n if (!field.isOptional()) {\n required.push(key);\n }\n\n properties[key] = { type, description };\n }\n\n return {\n type: 'object',\n properties,\n required\n };\n }\n // Fallback or other types\n return { type: 'object', properties: {} };\n }\n}\n\nexport const registry = new ToolRegistry();\n","import { z } from 'zod';\n\n// ============================================\n// Input Schemas\n// ============================================\n\nexport const QueryGlobalAntidotesSchema = z.object({\n categories: z.array(z.string()).optional().describe('Filter by categories (SECURITY, ARCHITECTURE, UX, PERFORMANCE, ACCESSIBILITY, MAINTAINABILITY)'),\n severities: z.array(z.string()).optional().describe('Filter by severity (CRITICAL, HIGH, MEDIUM, LOW)'),\n framework_tags: z.array(z.string()).optional().describe('Filter by framework tags (e.g., [\"nextjs\", \"react\", \"supabase\"])'),\n min_trust_score: z.number().optional().describe('Minimum trust score (0-100)'),\n search_text: z.string().optional().describe('Search in title and instruction'),\n limit: z.number().optional().describe('Max results (default: 20)')\n});\n\nexport const SubmitSignalSchema = z.object({\n projectId: z.string().describe('The UUID of the Rigstate project'),\n title: z.string().min(10).max(100).describe('Short, descriptive title (10-100 chars)'),\n instruction: z.string().min(50).max(2000).describe('The canonical instruction (50-2000 chars)'),\n category: z.enum(['SECURITY', 'ARCHITECTURE', 'UX', 'PERFORMANCE', 'ACCESSIBILITY', 'MAINTAINABILITY']).describe('The category of this antidote'),\n severity: z.enum(['CRITICAL', 'HIGH', 'MEDIUM', 'LOW']).describe('Severity level'),\n example: z.string().optional().describe('Good example demonstrating the instruction'),\n anti_example: z.string().optional().describe('Bad example showing what NOT to do'),\n framework_tags: z.array(z.string()).optional().describe('Relevant framework tags'),\n reasoning: z.string().optional().describe('Why this signal should be added'),\n source_type: z.string().optional().describe('Internal source type override (e.g. TEACHER_MODE)')\n});\n\nexport const GetCuratorStatsSchema = z.object({\n projectId: z.string().optional().describe('Optional project ID for context')\n});\n\nexport const CheckFortressSchema = z.object({\n projectId: z.string().describe('The UUID of the Rigstate project'),\n instruction: z.string().describe('The instruction to check against fortress rules'),\n category: z.enum(['SECURITY', 'ARCHITECTURE', 'UX', 'PERFORMANCE', 'ACCESSIBILITY', 'MAINTAINABILITY']).describe('Category of instruction')\n});\n","import { SupabaseClient } from '@supabase/supabase-js';\nimport { z } from 'zod';\nimport { QueryGlobalAntidotesSchema } from '../schemas.js';\n\n/**\n * Sigrid's Tool: Query Global Antidotes\n * Search and retrieve antidotes from the global registry.\n */\nexport async function queryGlobalAntidotes(\n supabase: SupabaseClient,\n userId: string,\n input: z.infer<typeof QueryGlobalAntidotesSchema>\n) {\n let query = supabase\n .from('global_antidotes')\n .select('id, slug, title, instruction, example, anti_example, category, severity, framework_tags, trust_score, occurrence_count, is_immutable')\n .eq('is_active', true);\n\n if (input.categories && input.categories.length > 0) {\n query = query.in('category', input.categories);\n }\n\n if (input.severities && input.severities.length > 0) {\n query = query.in('severity', input.severities);\n }\n\n if (input.framework_tags && input.framework_tags.length > 0) {\n query = query.overlaps('framework_tags', input.framework_tags);\n }\n\n if (input.min_trust_score !== undefined) {\n query = query.gte('trust_score', input.min_trust_score);\n }\n\n if (input.search_text) {\n query = query.or(`title.ilike.%${input.search_text}%,instruction.ilike.%${input.search_text}%`);\n }\n\n const { data, error } = await query\n .order('severity', { ascending: true }) // CRITICAL first\n .order('trust_score', { ascending: false })\n .limit(input.limit || 20);\n\n if (error) throw new Error(`Query failed: ${error.message}`);\n\n if (!data || data.length === 0) {\n return {\n antidotes: [],\n formatted: `=== GLOBAL ANTIDOTES REGISTRY ===\nNo antidotes found matching your criteria.\n================================`\n };\n }\n\n const formatted = data.map((a, i) => {\n const immutableBadge = a.is_immutable ? ' 🏰 FORTRESS' : '';\n const tags = a.framework_tags ? ` [${a.framework_tags.join(', ')}]` : '';\n return `${i + 1}. [${a.severity}] ${a.title}${immutableBadge}\n Category: ${a.category}${tags}\n Trust: ${a.trust_score}/100 | Occurrences: ${a.occurrence_count}\n ${a.instruction.substring(0, 200)}${a.instruction.length > 200 ? '...' : ''}`;\n }).join('\\n\\n');\n\n return {\n antidotes: data,\n formatted: `=== GLOBAL ANTIDOTES REGISTRY ===\nFound ${data.length} antidotes:\n\n${formatted}\n\n================================`\n };\n}\n","import { SupabaseClient } from '@supabase/supabase-js';\nimport { z } from 'zod';\nimport { SubmitSignalSchema } from '../schemas.js';\n\n/**\n * Sigrid's Tool: Submit Signal for Curation\n * Submit a new intelligence signal for processing through the curation pipeline.\n */\nexport async function submitSignal(\n supabase: SupabaseClient,\n userId: string,\n input: z.infer<typeof SubmitSignalSchema>\n) {\n // 1. Verify project ownership\n const { data: project, error: projectError } = await supabase\n .from('projects')\n .select('id')\n .eq('id', input.projectId)\n .eq('owner_id', userId)\n .single();\n\n if (projectError || !project) {\n throw new Error('Project not found or access denied');\n }\n\n // 2. Simple fingerprint for deduplication check (basic version for MCP)\n const fingerprintBase = `${input.instruction}::${input.category}`.toLowerCase();\n const simpleHash = fingerprintBase.split('').reduce((a, b) => {\n a = ((a << 5) - a) + b.charCodeAt(0);\n return a & a;\n }, 0).toString(16);\n\n // 3. Check for existing similar antidotes\n const { data: existing } = await supabase\n .from('global_antidotes')\n .select('id, slug, title')\n .ilike('instruction', `%${input.instruction.substring(0, 100)}%`)\n .eq('is_active', true)\n .limit(1);\n\n if (existing && existing.length > 0) {\n return handleReinforcement(supabase, existing[0]);\n }\n\n // 4. Check against fortress rules\n const fortressResult = await checkFortressConflicts(supabase, userId, input, simpleHash);\n if (!fortressResult.success) {\n return fortressResult;\n }\n\n // 5. Submit to Quarantine\n return submitToQuarantine(supabase, userId, input, simpleHash);\n}\n\n// Helpers\nasync function handleReinforcement(supabase: SupabaseClient, existing: any) {\n // Signal reinforces existing antidote - update last reinforced timestamp\n await supabase\n .from('global_antidotes')\n .update({ last_reinforced_at: new Date().toISOString() })\n .eq('id', existing.id);\n\n return {\n success: true,\n action: 'reinforced',\n message: `✅ Signal reinforces existing antidote: \"${existing.title}\" (${existing.slug}).\nThe occurrence count has been increased, boosting the antidote's authority.`,\n antidote_id: existing.id\n };\n}\n\nasync function checkFortressConflicts(\n supabase: SupabaseClient,\n userId: string,\n input: z.infer<typeof SubmitSignalSchema>,\n hash: string\n) {\n const fortressKeywords = {\n rls_required: ['disable rls', 'skip rls', 'bypass rls', 'rls off'],\n no_client_secrets: ['api key in client', 'hardcode secret', 'embed api key'],\n input_validation: ['skip validation', 'trust input', 'no validation'],\n auth_required: ['skip auth', 'bypass auth', 'disable auth']\n };\n\n const instructionLower = input.instruction.toLowerCase();\n for (const [rule, keywords] of Object.entries(fortressKeywords)) {\n for (const keyword of keywords) {\n if (instructionLower.includes(keyword)) {\n // Log violation\n await supabase.from('fortress_violations').insert({\n fortress_rule_slug: rule,\n violated_by_signal_hash: hash,\n conflict_type: 'DIRECT_CONTRADICTION',\n severity: 'CRITICAL',\n conflicting_instruction: input.instruction,\n source_user_id: userId,\n source_project_id: input.projectId\n });\n\n return {\n success: false,\n action: 'blocked',\n message: `❌ FORTRESS VIOLATION: Signal conflicts with immutable rule \"${rule}\".\nThis instruction attempts to weaken a core security principle and has been rejected.\nThe violation has been logged for security audit.`\n };\n }\n }\n }\n return { success: true };\n}\n\nasync function submitToQuarantine(\n supabase: SupabaseClient,\n userId: string,\n input: z.infer<typeof SubmitSignalSchema>,\n hash: string\n) {\n // Calculate basic trust score (simplified)\n let trustScore = 50; // Base score\n if (input.example) trustScore += 10;\n if (input.anti_example) trustScore += 10;\n if (input.instruction.length > 100) trustScore += 5;\n if (input.reasoning) trustScore += 5;\n if (input.category === 'SECURITY' && input.severity === 'CRITICAL') trustScore += 10;\n\n // Add to quarantine for human review (signals from MCP always go to quarantine)\n const { data: quarantine, error: quarantineError } = await supabase\n .from('curation_quarantine')\n .insert({\n signal_hash: hash,\n signal_content: {\n title: input.title,\n instruction: input.instruction,\n category: input.category,\n severity: input.severity,\n example: input.example,\n anti_example: input.anti_example,\n framework_tags: input.framework_tags,\n source_type: input.source_type || 'mcp_submission',\n source_context: {\n user_id: userId,\n project_id: input.projectId,\n reasoning: input.reasoning\n }\n },\n trust_score: trustScore,\n trust_breakdown: {\n final_score: trustScore,\n components: {\n completeness: input.example && input.anti_example ? 25 : 15,\n source_trust: 20,\n semantic_quality: 15,\n reinforcement_bonus: 0\n }\n },\n reason: 'MCP_SUBMISSION',\n suggested_action: trustScore >= 70 ? 'APPROVE' : trustScore >= 50 ? 'MERGE' : 'REJECT',\n source_user_id: userId,\n source_project_id: input.projectId\n })\n .select('id')\n .single();\n\n if (quarantineError) throw new Error(`Failed to submit signal: ${quarantineError.message}`);\n\n // Log audit entry\n await supabase.from('curation_audit_log').insert({\n action: 'SIGNAL_SUBMITTED',\n reason: `MCP signal submitted: \"${input.title}\" (trust: ${trustScore})`,\n actor_type: 'SYSTEM',\n actor_id: userId,\n signal_hash: hash,\n quarantine_id: quarantine?.id,\n metadata: { projectId: input.projectId, category: input.category }\n });\n\n return {\n success: true,\n action: 'quarantined',\n trust_score: trustScore,\n quarantine_id: quarantine?.id,\n message: `✅ Signal submitted for curation.\nTrust Score: ${trustScore}/100\nStatus: QUARANTINED (pending human review)\nSuggested Action: ${trustScore >= 70 ? 'APPROVE' : trustScore >= 50 ? 'MERGE' : 'NEEDS_REVIEW'}\n\nSigrid will process this signal and notify you of the result.`\n };\n}\n","import { SupabaseClient } from '@supabase/supabase-js';\nimport { z } from 'zod';\nimport { GetCuratorStatsSchema } from '../schemas.js';\n\n/**\n * Get Curator Statistics\n */\nexport async function getCuratorStats(\n supabase: SupabaseClient,\n userId: string,\n input: z.infer<typeof GetCuratorStatsSchema>\n) {\n // Get antidote counts\n const { data: antidotes, count: totalCount } = await supabase\n .from('global_antidotes')\n .select('id, category, severity, is_immutable', { count: 'exact' })\n .eq('is_active', true);\n\n const fortressCount = antidotes?.filter(a => a.is_immutable).length || 0;\n\n // Get quarantine count\n const { count: quarantineCount } = await supabase\n .from('curation_quarantine')\n .select('id', { count: 'exact', head: true })\n .is('decision', null);\n\n // Get today's activity\n const today = new Date();\n today.setHours(0, 0, 0, 0);\n const { data: todayActivity } = await supabase\n .from('curation_audit_log')\n .select('action')\n .gte('created_at', today.toISOString());\n\n const activityCounts = todayActivity?.reduce((acc: Record<string, number>, log: any) => {\n acc[log.action] = (acc[log.action] || 0) + 1;\n return acc;\n }, {}) || {};\n\n // Category distribution\n const categoryDistribution = antidotes?.reduce((acc: Record<string, number>, a) => {\n acc[a.category] = (acc[a.category] || 0) + 1;\n return acc;\n }, {}) || {};\n\n return {\n stats: {\n total_antidotes: totalCount || 0,\n fortress_rules: fortressCount,\n pending_quarantine: quarantineCount || 0,\n today_approved: activityCounts['AUTO_APPROVED'] || 0,\n today_rejected: activityCounts['AUTO_REJECTED'] || 0,\n today_quarantined: activityCounts['QUARANTINE_ADDED'] || 0,\n categories: categoryDistribution\n },\n formatted: `=== CURATOR REGISTRY STATS ===\n📊 Global Antidotes: ${totalCount || 0}\n🏰 Fortress Rules: ${fortressCount}\n⏳ Pending Review: ${quarantineCount || 0}\n\n📅 Today's Activity:\n ✅ Approved: ${activityCounts['AUTO_APPROVED'] || 0}\n ❌ Rejected: ${activityCounts['AUTO_REJECTED'] || 0}\n ⏸️ Quarantined: ${activityCounts['QUARANTINE_ADDED'] || 0}\n\n📁 By Category:\n${Object.entries(categoryDistribution).map(([cat, count]) => ` • ${cat}: ${count}`).join('\\n')}\n==============================`\n };\n}\n","import { SupabaseClient } from '@supabase/supabase-js';\nimport { z } from 'zod';\nimport { CheckFortressSchema } from '../schemas.js';\n\n/**\n * Check instruction against fortress rules\n */\nexport async function checkFortress(\n supabase: SupabaseClient,\n userId: string,\n input: z.infer<typeof CheckFortressSchema>\n) {\n // Load fortress rules\n const { data: fortressRules } = await supabase\n .from('global_antidotes')\n .select('slug, title, instruction')\n .eq('is_immutable', true)\n .eq('is_active', true);\n\n if (!fortressRules || fortressRules.length === 0) {\n return {\n passed: true,\n conflicts: [],\n message: '✅ No fortress rules configured. Instruction passes by default.'\n };\n }\n\n const conflicts: Array<{ rule: string; title: string; explanation: string }> = [];\n const instructionLower = input.instruction.toLowerCase();\n\n // Conflict patterns (simplified)\n const conflictPatterns: Record<string, RegExp[]> = {\n rls_required: [/disable\\s+r(ow\\s+level\\s+)?s(ecurity)?/i, /skip\\s+rls/i, /bypass\\s+rls/i],\n no_client_secrets: [/api\\s+keys?\\s+in\\s+(frontend|client)/i, /hardcode\\s+secret/i],\n input_validation: [/skip\\s+validation/i, /trust\\s+all\\s+input/i],\n auth_required: [/skip\\s+auth/i, /bypass\\s+auth/i, /disable\\s+auth/i]\n };\n\n for (const rule of fortressRules) {\n const patterns = conflictPatterns[rule.slug];\n if (patterns) {\n for (const pattern of patterns) {\n if (pattern.test(instructionLower)) {\n conflicts.push({\n rule: rule.slug,\n title: rule.title,\n explanation: `Instruction conflicts with fortress rule: ${rule.instruction.substring(0, 100)}...`\n });\n break;\n }\n }\n }\n }\n\n if (conflicts.length > 0) {\n return {\n passed: false,\n conflicts,\n message: `❌ FORTRESS CONFLICT DETECTED\n\n${conflicts.length} conflict(s) found:\n${conflicts.map((c, i) => `${i + 1}. [${c.rule}] ${c.title}\n ${c.explanation}`).join('\\n\\n')}\n\n⚠️ This instruction cannot be added to the registry as it violates immutable security rules.`\n };\n }\n\n return {\n passed: true,\n conflicts: [],\n message: `✅ FORTRESS CHECK PASSED\n\nInstruction does not conflict with any fortress rules.\nChecked against ${fortressRules.length} immutable rules.`\n };\n}\n","/**\n * Phase 8.5: The Curator Protocol\n * MCP Tools for Curator Operations\n * \n * Sigrid's Tools for Global Knowledge Curation.\n * These tools enable AI agents to contribute to and query the global antidote registry.\n */\n\nimport { registry } from '../lib/tool-registry.js';\nimport {\n queryGlobalAntidotes,\n submitSignal,\n getCuratorStats,\n checkFortress,\n QueryGlobalAntidotesSchema,\n SubmitSignalSchema,\n GetCuratorStatsSchema,\n CheckFortressSchema\n} from '../lib/curator/index.js';\n\n// ============================================\n// Tool Registration\n// ============================================\n\nregistry.register({\n name: 'query_global_antidotes',\n description: `Sigrid's Tool: Query the Global Antidotes Registry.\nSearch for cross-platform intelligence signals (antidotes) that encode best practices.\nUse this to find relevant security, architecture, UX, and performance guidelines.`,\n schema: QueryGlobalAntidotesSchema,\n handler: async (args, context) => {\n const result = await queryGlobalAntidotes(context.supabase, context.userId, args);\n return { content: [{ type: 'text', text: result.formatted }] };\n }\n});\n\nregistry.register({\n name: 'submit_curator_signal',\n description: `Sigrid's Tool: Submit a new signal to the Curator Protocol.\nWhen you discover a best practice or anti-pattern during development, submit it as a signal.\nSignals are processed through a trust-scoring pipeline and may be promoted to global antidotes.\nNote: All submissions go through quarantine for human review.`,\n schema: SubmitSignalSchema,\n handler: async (args, context) => {\n const result = await submitSignal(context.supabase, context.userId, args);\n return { content: [{ type: 'text', text: result.message }] };\n }\n});\n\nregistry.register({\n name: 'get_curator_stats',\n description: `Get statistics about the Curator Registry.\nShows total antidotes, fortress rules, pending quarantine, and today's curation activity.`,\n schema: GetCuratorStatsSchema,\n handler: async (args, context) => {\n const result = await getCuratorStats(context.supabase, context.userId, args);\n return { content: [{ type: 'text', text: result.formatted }] };\n }\n});\n\nregistry.register({\n name: 'check_fortress_rules',\n description: `Sigrid's Tool: Check an instruction against Fortress Rules.\nBefore submitting a signal, use this to verify it doesn't conflict with immutable security rules.\nFortress rules can NEVER be overridden by any signal.`,\n schema: CheckFortressSchema,\n handler: async (args, context) => {\n const result = await checkFortress(context.supabase, context.userId, args);\n return { content: [{ type: 'text', text: result.message }] };\n }\n});\n\n// Export functions for historical compatibility if any tests use them directly\nexport { queryGlobalAntidotes, submitSignal, getCuratorStats, checkFortress };\n","/**\n * Rigstate MCP Server - Teacher Mode Tools\n * \n * Allows Frank to send logic corrections and fetch learned behaviors.\n */\n\nimport { z } from 'zod';\nimport { SupabaseClient } from '@supabase/supabase-js';\nimport { v4 as uuidv4 } from 'uuid';\nimport { registry } from '../lib/tool-registry.js';\nimport { submitSignal } from '../lib/curator/index.js';\n\n// ============================================\n// Schemas\n// ============================================\n\nconst RefineLogicSchema = z.object({\n projectId: z.string().describe('The UUID of the Rigstate project'),\n originalReasoning: z.string().describe('What Frank originally said or did wrong'),\n userCorrection: z.string().describe('How Frank should handle this in the future'),\n scope: z.enum(['project', 'global']).default('project').describe('Whether this correction applies to this project only or all projects (default: project)')\n});\n\nconst GetLearnedInstructionsSchema = z.object({\n projectId: z.string().optional().describe('Optional project ID to include project-specific instructions')\n});\n\n// ============================================\n// Types\n// ============================================\n\nexport interface RefineLogicResponse {\n success: boolean;\n instructionId: string;\n traceId: string;\n message: string;\n}\n\nexport interface LearnedInstructionsResponse {\n instructions: Array<{\n instruction: string;\n priority: number;\n isGlobal: boolean;\n createdAt: string;\n }>;\n globalInstructions: string[];\n formatted: string;\n}\n\n// ============================================\n// Implementation\n// ============================================\n\n/**\n * Send a logic correction to the Rigstate cloud database\n */\nexport async function refineLogic(\n supabase: SupabaseClient,\n userId: string,\n args: z.infer<typeof RefineLogicSchema>\n): Promise<RefineLogicResponse> {\n const { projectId, originalReasoning, userCorrection, scope } = args;\n\n // Generate a trace ID for this action\n const traceId = uuidv4();\n\n // Verify project access\n const { data: project, error: projectError } = await supabase\n .from('projects')\n .select('id, name')\n .eq('id', projectId)\n .eq('owner_id', userId)\n .single();\n\n if (projectError || !project) {\n throw new Error(`Project access denied or not found: ${projectId}`);\n }\n\n // Save the instruction to Raw Memory (ai_instructions)\n const { data: instruction, error: insertError } = await supabase\n .from('ai_instructions')\n .insert({\n user_id: userId,\n project_id: scope === 'global' ? null : projectId,\n instruction: userCorrection,\n context: originalReasoning,\n is_global: scope === 'global',\n priority: scope === 'global' ? 8 : 6,\n source_log_id: null\n })\n .select('id')\n .single();\n\n if (insertError) {\n throw new Error(`Failed to save instruction: ${insertError.message}`);\n }\n\n let message = `✅ Correction saved! Frank will apply this ${scope === 'global' ? 'globally' : 'to this project'}.`;\n\n // Phase 8.5.5 Integration: Global corrections trigger Curator Signal\n if (scope === 'global') {\n try {\n await submitSignal(supabase, userId, {\n projectId,\n title: `Teacher Correction: ${userCorrection.substring(0, 30)}...`,\n instruction: userCorrection,\n category: 'MAINTAINABILITY', // Default\n severity: 'MEDIUM',\n reasoning: `Teacher Mode correction (Trace: ${traceId}). Original reasoning: ${originalReasoning.substring(0, 100)}...`,\n source_type: 'TEACHER_MODE' // Using a tag via reasoning or title since source_type in schema is rigid?\n // actually check schema: framework_tags? No source_type is not in schema input, it's fixed in logic.\n // Wait, submitSignal implementation in curator/index.ts sets source_type: 'mcp_submission'.\n // I will update the reasoning to indicate Teacher Mode.\n });\n message += `\\n\\n🛡️ CURATOR PROTOCOL: Signal submitted to Sigrid for global verification.`;\n } catch (e: any) {\n console.error('Failed to auto-submit to curator:', e);\n message += `\\n(Note: Failed to submit to curator: ${e.message})`;\n }\n }\n\n // Log this MCP action with trace\n await supabase\n .from('ai_activity_log')\n .insert({\n user_id: userId,\n project_id: projectId,\n activity_type: 'mcp_correction',\n summary: `MCP: ${userCorrection.slice(0, 100)}...`,\n intelligence_trace: {\n source: 'mcp',\n traceId,\n scope,\n originalReasoning: originalReasoning.slice(0, 500)\n },\n metadata: { mcp_trace_id: traceId }\n });\n\n return {\n success: true,\n instructionId: instruction.id,\n traceId,\n message\n };\n}\n\n/**\n * Fetch learned behaviors from the database\n */\nexport async function getLearnedInstructions(\n supabase: SupabaseClient,\n userId: string,\n args: z.infer<typeof GetLearnedInstructionsSchema>\n): Promise<LearnedInstructionsResponse> {\n const { projectId } = args;\n\n // Fetch user-specific instructions\n let query = supabase\n .from('ai_instructions')\n .select('instruction, priority, is_global, created_at')\n .eq('user_id', userId)\n .eq('is_active', true)\n .order('priority', { ascending: false })\n .limit(20);\n\n // Filter by project or global only\n if (projectId) {\n query = query.or(`is_global.eq.true,project_id.eq.${projectId}`);\n } else {\n query = query.eq('is_global', true);\n }\n\n const { data: userInstructions, error: userError } = await query;\n\n if (userError) {\n throw new Error(`Failed to fetch instructions: ${userError.message}`);\n }\n\n // Fetch global base instructions (system-wide)\n const { data: globalBase, error: globalError } = await supabase\n .from('global_base_instructions')\n .select('instruction')\n .eq('is_active', true)\n .order('priority', { ascending: false })\n .limit(10);\n\n const globalInstructions = (globalBase || []).map((g: any) => g.instruction);\n\n // Format for context injection\n const instructions = (userInstructions || []).map((i: any) => ({\n instruction: i.instruction as string,\n priority: i.priority as number,\n isGlobal: i.is_global as boolean,\n createdAt: i.created_at as string\n }));\n\n let formatted = '';\n\n if (globalInstructions.length > 0) {\n formatted += `## GLOBAL RIGSTATE STANDARDS\\n`;\n formatted += globalInstructions.map((g: string) => `- ${g}`).join('\\n');\n formatted += '\\n\\n';\n }\n\n if (instructions.length > 0) {\n formatted += `## USER CORRECTIONS & TUNING\\n`;\n formatted += instructions.map((i: any) => {\n const scope = i.isGlobal ? '[GLOBAL]' : '[PROJECT]';\n return `- ${scope} ${i.instruction}`;\n }).join('\\n');\n }\n\n if (!formatted) {\n formatted = 'No learned behaviors yet. Frank will start learning as you provide corrections.';\n }\n\n return {\n instructions,\n globalInstructions,\n formatted\n };\n}\n\n// ============================================\n// Tool Registration\n// ============================================\n\nregistry.register({\n name: 'refine_logic',\n description: `Send a logic correction to teach Frank how to handle similar situations.\nUse this when Frank made a reasoning error and you want to correct it.\nThe correction will be saved and applied to future interactions.`,\n schema: RefineLogicSchema,\n handler: async (args, context) => {\n const result = await refineLogic(context.supabase, context.userId, args);\n return { content: [{ type: 'text', text: result.message }] };\n }\n});\n\nregistry.register({\n name: 'get_learned_instructions',\n description: `Fetch all learned behaviors and corrections from the database.\nUse this to inject prior corrections into your context window.\nReturns both user-specific and global Rigstate standards.`,\n schema: GetLearnedInstructionsSchema,\n handler: async (args, context) => {\n const result = await getLearnedInstructions(context.supabase, context.userId, args);\n return { content: [{ type: 'text', text: result.formatted }] };\n }\n});\n","/**\n * Phase 8.5.5: Context Engine\n * \n * Bridges the gap between the Curator Database and the Agent's working memory.\n * Performs semantic/keyword lookup to inject relevant rules into the context.\n */\n\nimport { SupabaseClient } from '@supabase/supabase-js';\nimport { queryGlobalAntidotes } from './curator/index.js';\n\nexport interface ContextInjectionInput {\n frameworks: string[];\n libraries: string[];\n taskDescription?: string; // Optional: for future task-specific lookup\n}\n\nexport async function injectGlobalContext(\n supabase: SupabaseClient,\n userId: string,\n input: ContextInjectionInput\n): Promise<string> {\n // 1. Identify relevant tags from stack\n const searchTags = [\n ...input.frameworks.map(f => f.split(' ')[0].toLowerCase()),\n ...input.libraries.map(l => l.split(' ')[0].toLowerCase())\n ].filter(Boolean);\n\n // 2. Query Curator for Critical/High severity antidotes matching tags\n // We want HIGH trust items (trust_score >= 80) or IMMUTABLE items.\n // Since queryGlobalAntidotes is a bit generic, we might want a more specialized query here\n // for \"Active Constraints\", but reusing it is a good MVP.\n\n // We fetch ALL Fortress Rules (Immutable) regardless of score/tags? \n // Usually Fortress Rules are universal or highly critical.\n\n const { data: fortressRules } = await supabase\n .from('global_antidotes')\n .select('title, instruction, slug')\n .eq('is_immutable', true)\n .eq('is_active', true);\n\n // Fetch High Trust Contextual Rules\n let contextQuery = supabase\n .from('global_antidotes')\n .select('title, instruction, framework_tags, severity')\n .eq('is_active', true)\n .gte('trust_score', 80) // High trust only\n .eq('is_immutable', false); // Exclude fortress (already fetched)\n\n if (searchTags.length > 0) {\n // PG operator for array overlap: framework_tags && searchTags\n contextQuery = contextQuery.overlaps('framework_tags', searchTags);\n } else {\n // If no tags, maybe just generic ones? Or skip?\n // Let's limit to generic if no tags\n contextQuery = contextQuery.is('framework_tags', null);\n }\n\n const { data: contextualRules } = await contextQuery.limit(5);\n\n // 3. Format Output\n let output = '';\n\n if (fortressRules && fortressRules.length > 0) {\n output += `\\n\\n## 🏰 FORTRESS RULES (NON-NEGOTIABLE)\\n`;\n output += `These rules are immutable and must be followed without exception:\\n`;\n fortressRules.forEach(rule => {\n output += `- **${rule.title}**: ${rule.instruction}\\n`;\n });\n }\n\n if (contextualRules && contextualRules.length > 0) {\n output += `\\n## 🛡️ INTELLIGENT CONTEXT (High Trust Antidotes)\\n`;\n output += `Learned best practices for your stack (${searchTags.join(', ')}):\\n`;\n contextualRules.forEach(rule => {\n output += `- [${rule.severity}] **${rule.title}**: ${rule.instruction}\\n`;\n });\n }\n\n if (!output) {\n output = `\\n(No specific curator context found for stack: ${searchTags.join(', ')})`;\n }\n\n return output;\n}\n","import { z } from 'zod';\n\n// =============================================================================\n// ZOD SCHEMAS FOR TOOL INPUTS\n// =============================================================================\n\nexport const QueryBrainInputSchema = z.object({\n projectId: z.string().uuid('Invalid project ID'),\n query: z.string().min(1, 'Query is required'),\n limit: z.number().min(1).max(20).optional().default(8),\n threshold: z.number().min(0).max(1).optional().default(0.1)\n});\n\nexport const GetProjectContextInputSchema = z.object({\n projectId: z.string().uuid('Invalid project ID')\n});\n\nexport const GetLatestDecisionsInputSchema = z.object({\n projectId: z.string().uuid('Invalid project ID'),\n limit: z.number().min(1).max(10).optional().default(5)\n});\n\nexport const SaveDecisionInputSchema = z.object({\n projectId: z.string().uuid('Invalid project ID'),\n title: z.string().min(1, 'Title is required').max(200, 'Title too long'),\n decision: z.string().min(1, 'Decision content is required'),\n rationale: z.string().optional(),\n category: z.enum(['decision', 'architecture', 'constraint', 'tech_stack', 'design_rule']).optional().default('decision'),\n tags: z.array(z.string()).optional().default([])\n});\n\nexport const SubmitIdeaInputSchema = z.object({\n projectId: z.string().uuid('Invalid project ID'),\n title: z.string().min(1, 'Title is required').max(200, 'Title too long'),\n description: z.string().min(1, 'Description is required'),\n category: z.enum(['feature', 'improvement', 'experiment', 'pivot']).optional().default('feature'),\n tags: z.array(z.string()).optional().default([])\n});\n\nexport const UpdateRoadmapInputSchema = z.object({\n projectId: z.string().uuid('Invalid project ID'),\n chunkId: z.string().uuid('Invalid chunk ID').optional(),\n title: z.string().optional(),\n status: z.enum(['LOCKED', 'ACTIVE', 'COMPLETED'])\n});\n\nexport const RunArchitectureAuditInputSchema = z.object({\n projectId: z.string().uuid('Invalid project ID'),\n filePath: z.string().min(1, 'File path is required'),\n content: z.string().min(1, 'Content is required')\n});\n\nexport const ListRoadmapTasksInputSchema = z.object({\n projectId: z.string().uuid('Invalid project ID')\n});\n\nexport const RefineLogicInputSchema = z.object({\n projectId: z.string().uuid('Invalid project ID'),\n originalReasoning: z.string().min(1, 'Original reasoning is required'),\n userCorrection: z.string().min(1, 'User correction is required'),\n scope: z.enum(['project', 'global']).optional().default('project')\n});\n\nexport const GetLearnedInstructionsInputSchema = z.object({\n projectId: z.string().uuid('Invalid project ID').optional()\n});\n\nexport const CheckAgentBridgeInputSchema = z.object({\n projectId: z.string().uuid('Invalid project ID'),\n action: z.enum(['check', 'update', 'submit_for_review']).optional().default('check'),\n bridgeId: z.string().uuid('Invalid bridge ID').optional(),\n status: z.enum(['PENDING', 'NEEDS_REVIEW', 'AWAITING_APPROVAL', 'APPROVED', 'REJECTED', 'EXECUTING', 'COMPLETED', 'FAILED']).optional(),\n summary: z.string().optional(),\n execution_summary: z.string().optional(),\n proposal: z.string().optional()\n});\n\nexport const CheckRulesSyncInputSchema = z.object({\n projectId: z.string().uuid('Invalid project ID'),\n currentRulesContent: z.string().optional()\n});\n\nexport const GetPendingTasksInputSchema = z.object({\n projectId: z.string().uuid('Invalid project ID')\n});\n\nexport const UpdateTaskStatusInputSchema = z.object({\n projectId: z.string().uuid('Invalid project ID'),\n taskId: z.string().uuid('Invalid task ID'),\n status: z.enum(['EXECUTING', 'COMPLETED', 'FAILED']),\n executionSummary: z.string().optional()\n});\n\nexport const GetNextRoadmapStepInputSchema = z.object({\n projectId: z.string().uuid('Invalid project ID'),\n currentStepId: z.string().uuid('Invalid step ID').optional()\n});\n\nexport const GenerateProfessionalPDFInputSchema = z.object({\n projectId: z.string().uuid('Invalid project ID'),\n reportType: z.enum(['SYSTEM_MANIFEST', 'INVESTOR_REPORT'])\n});\n\nexport const ArchaeologicalScanInputSchema = z.object({\n projectId: z.string().uuid('Invalid project ID'),\n gitLog: z.string().describe('Git log output'),\n fileTree: z.array(z.string()).describe('File paths')\n});\n\nexport const ImportGhostFeaturesInputSchema = z.object({\n projectId: z.string().uuid('Invalid project ID'),\n features: z.array(z.any())\n});\n\nexport const AnalyzeDependencyGraphInputSchema = z.object({\n path: z.string().min(1).default('src')\n});\n\nexport const AuditRlsStatusInputSchema = z.object({\n projectId: z.string().uuid().optional()\n});\n\nexport const AuditSecurityIntegrityInputSchema = z.object({\n projectId: z.string().uuid(),\n filePath: z.string().min(1),\n content: z.string().min(1),\n rules: z.array(z.string()).optional()\n});\n\nexport const QueryProjectBrainInputSchema = QueryBrainInputSchema;\n\nexport const FetchPackageHealthInputSchema = z.object({\n packageName: z.string().min(1)\n});\n\nexport const SaveToProjectBrainInputSchema = z.object({\n projectId: z.string().uuid(),\n title: z.string().min(1),\n content: z.string().min(1),\n category: z.enum(['DECISION', 'ARCHITECTURE', 'NOTE', 'LESSON_LEARNED']).default('NOTE'),\n tags: z.array(z.string()).optional().default([])\n});\n\nexport const UpdateRoadmapStatusInputSchema = z.object({\n projectId: z.string().uuid(),\n chunkId: z.string().uuid(),\n status: z.enum(['TODO', 'IN_PROGRESS', 'COMPLETED'])\n});\n\nexport const AddRoadmapChunkInputSchema = z.object({\n projectId: z.string().uuid(),\n title: z.string().min(1),\n description: z.string().optional(),\n featureId: z.string().optional(),\n priority: z.enum(['LOW', 'MEDIUM', 'HIGH']).default('MEDIUM')\n});\n\nexport const AnalyzeUiComponentInputSchema = z.object({\n filePath: z.string()\n});\n\nexport const ApplyDesignSystemInputSchema = z.object({\n filePath: z.string()\n});\n\nexport const FetchUiLibraryDocsInputSchema = z.object({\n componentName: z.string(),\n library: z.enum(['shadcn', 'lucide']).default('shadcn')\n});\n\nexport const GenerateCursorRulesInputSchema = z.object({\n projectId: z.string().uuid()\n});\n\nexport const AnalyzeDatabasePerformanceInputSchema = z.object({\n projectId: z.string().uuid(),\n filePaths: z.array(z.string())\n});\n\nexport const AuditIntegrityGateInputSchema = z.object({\n projectId: z.string().uuid(),\n filePaths: z.array(z.string()).optional().default([])\n});\n\nexport const CompleteRoadmapTaskInputSchema = z.object({\n projectId: z.string().uuid(),\n summary: z.string().min(1),\n taskId: z.string().uuid().optional(),\n gitDiff: z.string().optional(),\n integrityGate: z.any().optional()\n});\n","/**\n * Tool: get_project_context\n * \n * Returns the project type, tech stack, and high-level description.\n * This gives AI editors context about what they're working with.\n */\n\nimport { SupabaseClient } from '@supabase/supabase-js';\nimport type { ProjectContextResponse, TechStackInfo } from '../lib/types.js';\nimport { injectGlobalContext } from '../lib/context-engine.js';\nimport { registry } from '../lib/tool-registry.js';\nimport { GetProjectContextInputSchema } from '../lib/schemas.js';\n\n// ============================================\n// Tool Registration\n// ============================================\n\nregistry.register({\n name: 'get_project_context',\n description: `Returns the project type, tech stack, and high-level description for a Rigstate project.`,\n schema: GetProjectContextInputSchema,\n handler: async (args, context) => {\n const result = await getProjectContext(context.supabase, context.userId, args.projectId);\n return { content: [{ type: 'text', text: result.summary }] };\n }\n});\n\n// Key libraries we care about for display\nconst KEY_LIBS: Record<string, string> = {\n 'next': 'Next.js',\n 'react': 'React',\n 'vue': 'Vue',\n 'svelte': 'Svelte',\n 'angular': 'Angular',\n 'tailwindcss': 'Tailwind',\n 'prisma': 'Prisma',\n 'drizzle-orm': 'Drizzle',\n '@supabase/supabase-js': 'Supabase',\n 'stripe': 'Stripe',\n 'openai': 'OpenAI',\n 'typescript': 'TypeScript',\n 'framer-motion': 'Framer Motion',\n 'zod': 'Zod',\n 'ai': 'Vercel AI',\n};\n\nexport async function getProjectContext(\n supabase: SupabaseClient,\n userId: string,\n projectId: string\n): Promise<ProjectContextResponse> {\n // Fetch project with ownership check\n const { data: project, error: projectError } = await supabase\n .from('projects')\n .select('id, name, description, project_type, created_at, last_indexed_at, detected_stack, repository_tree')\n .eq('id', projectId)\n .eq('owner_id', userId)\n .single();\n\n if (projectError || !project) {\n throw new Error('Project not found or access denied');\n }\n\n // Fetch Digest Data\n const { data: agentTasks } = await supabase\n .from('agent_bridge')\n .select('id, roadmap_chunks(title), execution_summary, completed_at')\n .eq('project_id', projectId)\n .eq('status', 'COMPLETED')\n .order('completed_at', { ascending: false })\n .limit(3);\n\n const { data: roadmapItems } = await supabase\n .from('roadmap_chunks')\n .select('title, status, updated_at')\n .eq('project_id', projectId)\n .order('updated_at', { ascending: false })\n .limit(3);\n\n // Parse tech stack from detected_stack\n const techStack: TechStackInfo = {\n framework: null,\n orm: null,\n database: null,\n keyLibraries: [],\n topFolders: []\n };\n\n if (project.detected_stack) {\n const stack = project.detected_stack as {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n };\n const allDeps = { ...stack.dependencies, ...stack.devDependencies };\n\n for (const [name, version] of Object.entries(allDeps)) {\n const cleanVersion = (version as string).replace(/[\\^~]/g, '');\n\n // Categorize\n if (name === 'next' || name === 'react' || name === 'vue' || name === 'angular' || name === 'svelte') {\n if (!techStack.framework) {\n techStack.framework = `${KEY_LIBS[name] || name} ${cleanVersion}`;\n }\n } else if (name.includes('prisma') || name.includes('drizzle') || name.includes('typeorm')) {\n if (!techStack.orm) {\n techStack.orm = `${KEY_LIBS[name] || name} ${cleanVersion}`;\n }\n } else if (KEY_LIBS[name]) {\n techStack.keyLibraries.push(`${KEY_LIBS[name]} ${cleanVersion}`);\n }\n }\n }\n\n // Extract top folders from repository tree\n if (project.repository_tree && Array.isArray(project.repository_tree)) {\n techStack.topFolders = [...new Set(\n project.repository_tree\n .filter((t: any) => t.type === 'tree' && !t.path.includes('/'))\n .map((t: any) => t.path)\n )].slice(0, 10) as string[];\n }\n\n // Build summary\n const summaryParts: string[] = [];\n\n if (project.project_type) {\n summaryParts.push(`Project Type: ${project.project_type.toUpperCase()}`);\n }\n\n if (techStack.framework) {\n summaryParts.push(`Framework: ${techStack.framework}`);\n }\n\n if (techStack.orm) {\n summaryParts.push(`ORM: ${techStack.orm}`);\n }\n\n if (techStack.keyLibraries.length > 0) {\n summaryParts.push(`Key Libraries: ${techStack.keyLibraries.join(', ')}`);\n }\n\n if (techStack.topFolders.length > 0) {\n summaryParts.push(`Top Folders: ${techStack.topFolders.join(', ')}`);\n }\n\n if (project.description) {\n summaryParts.push(`\\nDescription: ${project.description}`);\n }\n\n // Add Digest to Summary\n summaryParts.push('\\n=== RECENT ACTIVITY DIGEST ===');\n\n if (agentTasks && agentTasks.length > 0) {\n summaryParts.push('\\nLatest AI Executions:');\n agentTasks.forEach((t: any) => {\n const time = t.completed_at ? new Date(t.completed_at).toLocaleString() : 'Recently';\n summaryParts.push(`- [${time}] ${t.roadmap_chunks?.title || 'Task'}: ${t.execution_summary || 'Completed'}`);\n });\n }\n\n if (roadmapItems && roadmapItems.length > 0) {\n summaryParts.push('\\nRoadmap Updates:');\n roadmapItems.forEach((i: any) => {\n summaryParts.push(`- ${i.title} is now ${i.status}`);\n });\n }\n\n const response: ProjectContextResponse = {\n project: {\n id: project.id,\n name: project.name,\n description: project.description,\n projectType: project.project_type,\n createdAt: project.created_at,\n lastIndexedAt: project.last_indexed_at\n },\n techStack,\n summary: summaryParts.join('\\n') || 'No project context available.'\n };\n\n // Phase 8.5.5: Inject Global Context (Curator)\n try {\n const curatorContext = await injectGlobalContext(supabase, userId, {\n frameworks: techStack.framework ? [techStack.framework] : [],\n libraries: techStack.keyLibraries\n });\n\n if (curatorContext) {\n response.summary += `\\n\\n=== CURATOR INTELLIGENCE ===${curatorContext}`;\n }\n } catch (e: any) {\n console.error('Failed to inject global context:', e);\n response.summary += `\\n\\n(Curator Context Unavailable: ${e.message})`;\n }\n\n return response;\n}\n","/**\n * Tool: query_brain\n * \n * Takes a natural language query and performs semantic search\n * against the project's memories (RAG), returning relevant\n * architecture rules, decisions, and constraints.\n */\n\nimport { SupabaseClient } from '@supabase/supabase-js';\nimport type { BrainQueryResponse, MemoryRecord } from '../lib/types.js';\nimport { registry } from '../lib/tool-registry.js';\nimport { QueryBrainInputSchema } from '../lib/schemas.js';\n\n// ============================================\n// Tool Registration\n// ============================================\n\nregistry.register({\n name: 'query_brain',\n description: `Takes a natural language query and performs semantic search\nagainst the project's memories (RAG), returning relevant\narchitecture rules, decisions, and constraints.`,\n schema: QueryBrainInputSchema,\n handler: async (args, context) => {\n const result = await queryBrain(\n context.supabase,\n context.userId,\n args.projectId,\n args.query,\n args.limit,\n args.threshold\n );\n return { content: [{ type: 'text', text: result.formatted }] };\n }\n});\n\n// Simple embedding generation using Google Gemini\nasync function generateQueryEmbedding(query: string): Promise<number[] | null> {\n const apiKey = process.env.GOOGLE_GENERATIVE_AI_API_KEY;\n if (!apiKey) {\n console.warn('GOOGLE_GENERATIVE_AI_API_KEY not found, skipping vector search.');\n return null;\n }\n\n try {\n const { google } = await import('@ai-sdk/google');\n const { embed } = await import('ai');\n\n const { embedding } = await embed({\n model: google.embedding('text-embedding-004'),\n value: query.replace(/\\n/g, ' '),\n });\n return embedding;\n } catch (error) {\n console.error('Failed to generate embedding for search:', error);\n return null;\n }\n}\n\nexport async function queryBrain(\n supabase: SupabaseClient,\n userId: string,\n projectId: string,\n query: string,\n limit: number = 8,\n threshold: number = 0.5\n): Promise<BrainQueryResponse> {\n // First, verify project ownership\n const { data: project, error: projectError } = await supabase\n .from('projects')\n .select('id')\n .eq('id', projectId)\n .eq('owner_id', userId)\n .single();\n\n if (projectError || !project) {\n throw new Error('Project not found or access denied');\n }\n\n // Try semantic search first using the match_memories RPC\n // This requires the embedding to be generated, so we'll try\n // Generate embedding if possible for semantic search\n const embedding = await generateQueryEmbedding(query);\n let memories: MemoryRecord[] = [];\n\n // Use the hybrid search RPC\n console.log(`Searching brain for \"${query}\" (limit: ${limit}, threshold: ${threshold})`);\n console.log(`Embedding present: ${!!embedding}`);\n\n const { data: searchResults, error: searchError } = await supabase\n .rpc('hybrid_search_memories', {\n p_project_id: projectId,\n p_query: query,\n p_embedding: embedding || null,\n p_limit: limit,\n p_similarity_threshold: threshold || 0.1\n });\n\n if (searchError) {\n console.error('Hybrid search error:', searchError);\n // Fallback to basic recent fetch if RPC fails\n const { data: recentMemories } = await supabase\n .from('project_memories')\n .select('id, content, category, tags, importance, created_at')\n .eq('project_id', projectId)\n .eq('is_active', true)\n .order('created_at', { ascending: false })\n .limit(limit);\n\n if (recentMemories) {\n memories = recentMemories.map(m => ({\n id: m.id,\n content: m.content,\n category: m.category || 'general',\n tags: m.tags || [],\n netVotes: m.importance || 0,\n createdAt: m.created_at\n }));\n }\n } else if (searchResults) {\n console.log(`Found ${searchResults.length} results from RPC`);\n memories = searchResults.map((m: any) => ({\n id: m.id,\n content: m.content,\n category: m.category,\n tags: m.tags,\n netVotes: m.importance,\n createdAt: m.created_at\n }));\n }\n\n // Format memories into a readable context block\n const contextLines = memories.map((m) => {\n const voteIndicator = m.netVotes && m.netVotes < 0 ? ` [⚠️ POORLY RATED: ${m.netVotes}]` : '';\n const tagStr = m.tags && m.tags.length > 0 ? ` [${m.tags.join(', ')}]` : '';\n const category = m.category ? m.category.toUpperCase() : 'GENERAL';\n return `- [${category}]${tagStr}${voteIndicator}: ${m.content}`;\n });\n\n const searchType = embedding ? 'TRIPLE-HYBRID (Vector + FTS + Fuzzy)' : 'HYBRID (FTS + Fuzzy)';\n\n const formatted = memories.length > 0\n ? `=== PROJECT BRAIN: RELEVANT MEMORIES ===\nSearch Mode: ${searchType}\nQuery: \"${query}\"\nFound ${memories.length} relevant memories:\n\n${contextLines.join('\\n')}\n\n==========================================`\n : `=== PROJECT BRAIN ===\nQuery: \"${query}\"\nNo relevant memories found for this query.\n=======================`;\n\n return {\n query,\n memories,\n formatted\n };\n}\n","/**\n * Tool: get_latest_decisions\n * \n * Fetches the most recent ADRs and decisions from The Council,\n * including active roadmap steps and council session feedback.\n */\n\nimport { SupabaseClient } from '@supabase/supabase-js';\nimport type { DecisionsResponse, CouncilSession, RoadmapStep } from '../lib/types.js';\nimport { registry } from '../lib/tool-registry.js';\nimport { GetLatestDecisionsInputSchema } from '../lib/schemas.js';\n\n// ============================================\n// Tool Registration\n// ============================================\n\nregistry.register({\n name: 'get_latest_decisions',\n description: `Fetches the most recent ADRs and decisions from The Council,\nincluding active roadmap steps and council session feedback.`,\n schema: GetLatestDecisionsInputSchema,\n handler: async (args, context) => {\n const result = await getLatestDecisions(\n context.supabase,\n context.userId,\n args.projectId,\n args.limit\n );\n return { content: [{ type: 'text', text: result.summary }] };\n }\n});\n\nexport async function getLatestDecisions(\n supabase: SupabaseClient,\n userId: string,\n projectId: string,\n limit: number = 5\n): Promise<DecisionsResponse> {\n // First, verify project ownership\n const { data: project, error: projectError } = await supabase\n .from('projects')\n .select('id')\n .eq('id', projectId)\n .eq('owner_id', userId)\n .single();\n\n if (projectError || !project) {\n throw new Error('Project not found or access denied');\n }\n\n // Fetch council sessions\n const { data: sessionData, error: sessionError } = await supabase\n .from('council_sessions')\n .select('id, project_id, recruited_agents, feedback_summary, duration_ms, sprints_count, tasks_count, created_at')\n .eq('project_id', projectId)\n .order('created_at', { ascending: false })\n .limit(limit);\n\n const sessions: CouncilSession[] = (sessionData || []).map(s => ({\n id: s.id,\n projectId: s.project_id,\n recruitedAgents: s.recruited_agents || [],\n feedbackSummary: (Array.isArray(s.feedback_summary) ? s.feedback_summary : []).map((f: any) => ({\n agentName: f.agentName || f.agent?.name || 'Unknown',\n emoji: f.emoji || f.agent?.emoji || '🤖',\n critiques: f.critiques || [],\n approved: f.approved ?? true\n })),\n durationMs: s.duration_ms,\n sprintsCount: s.sprints_count,\n tasksCount: s.tasks_count,\n createdAt: s.created_at\n }));\n\n // Fetch active roadmap step\n const { data: activeStep, error: stepError } = await supabase\n .from('roadmap_chunks')\n .select('id, step_number, title, status, sprint_focus')\n .eq('project_id', projectId)\n .eq('status', 'ACTIVE')\n .maybeSingle();\n\n const activeRoadmapStep: RoadmapStep | null = activeStep\n ? {\n id: activeStep.id,\n stepNumber: activeStep.step_number,\n title: activeStep.title,\n status: activeStep.status,\n sprintFocus: activeStep.sprint_focus\n }\n : null;\n\n // Build summary\n const summaryParts: string[] = [];\n\n // Add active step info\n if (activeRoadmapStep) {\n summaryParts.push(`=== CURRENT FOCUS ===`);\n summaryParts.push(`Step ${activeRoadmapStep.stepNumber}: ${activeRoadmapStep.title}`);\n if (activeRoadmapStep.sprintFocus) {\n summaryParts.push(`Focus: ${activeRoadmapStep.sprintFocus}`);\n }\n summaryParts.push('');\n }\n\n // Add recent council decisions\n if (sessions.length > 0) {\n summaryParts.push(`=== RECENT COUNCIL SESSIONS (${sessions.length}) ===`);\n\n for (const session of sessions) {\n const date = new Date(session.createdAt).toLocaleDateString();\n summaryParts.push(`\\n📅 Session on ${date}`);\n summaryParts.push(` Agents: ${session.recruitedAgents.join(', ')}`);\n\n if (session.feedbackSummary.length > 0) {\n summaryParts.push(` Key Feedback:`);\n for (const feedback of session.feedbackSummary.slice(0, 3)) {\n const status = feedback.approved ? '✅' : '⚠️';\n summaryParts.push(` ${feedback.emoji} ${feedback.agentName}: ${status}`);\n if (feedback.critiques.length > 0) {\n summaryParts.push(` - ${feedback.critiques[0]}`);\n }\n }\n }\n }\n } else {\n summaryParts.push(`No council sessions recorded yet.`);\n }\n\n // Fetch decision-type memories for additional context\n const { data: decisionMemories } = await supabase\n .from('project_memories')\n .select('content, category, created_at')\n .eq('project_id', projectId)\n .eq('is_active', true)\n .in('category', ['decision', 'architecture', 'constraint'])\n .order('created_at', { ascending: false })\n .limit(5);\n\n if (decisionMemories && decisionMemories.length > 0) {\n summaryParts.push(`\\n=== KEY DECISIONS FROM BRAIN ===`);\n for (const memory of decisionMemories) {\n summaryParts.push(`- [${memory.category.toUpperCase()}] ${memory.content}`);\n }\n }\n\n return {\n sessions,\n activeRoadmapStep,\n summary: summaryParts.join('\\n')\n };\n}\n","/**\n * Tool: save_decision\n * \n * Saves a new decision/ADR to the project's brain (project_memories).\n * High-importance memory for architectural decisions.\n */\n\nimport { SupabaseClient } from '@supabase/supabase-js';\nimport type { SaveDecisionResponse } from '../lib/types.js';\nimport { registry } from '../lib/tool-registry.js';\nimport { SaveDecisionInputSchema } from '../lib/schemas.js';\n\n// ============================================\n// Tool Registration\n// ============================================\n\nregistry.register({\n name: 'save_decision',\n description: `Saves a new decision/ADR to the project's brain (project_memories).\nHigh-importance memory for architectural decisions.`,\n schema: SaveDecisionInputSchema,\n handler: async (args, context) => {\n const result = await saveDecision(\n context.supabase,\n context.userId,\n args.projectId,\n args.title,\n args.decision,\n args.rationale,\n args.category,\n args.tags\n );\n return { content: [{ type: 'text', text: result.message }] };\n }\n});\n\nexport async function saveDecision(\n supabase: SupabaseClient,\n userId: string,\n projectId: string,\n title: string,\n decision: string,\n rationale?: string,\n category: string = 'decision',\n tags: string[] = []\n): Promise<SaveDecisionResponse> {\n // First, verify project ownership\n const { data: project, error: projectError } = await supabase\n .from('projects')\n .select('id, name')\n .eq('id', projectId)\n .eq('owner_id', userId)\n .single();\n\n if (projectError || !project) {\n throw new Error('Project not found or access denied');\n }\n\n // Build the full content with title, decision, and rationale\n const contentParts = [`# ${title}`, '', decision];\n if (rationale) {\n contentParts.push('', '## Rationale', rationale);\n }\n const fullContent = contentParts.join('\\n');\n\n // Build summary (truncated version for quick context)\n const summary = decision.length > 150\n ? decision.substring(0, 147) + '...'\n : decision;\n\n // Insert the memory with high importance (ADR = 9/10)\n const { data: memory, error: insertError } = await supabase\n .from('project_memories')\n .insert({\n project_id: projectId,\n content: fullContent,\n summary: summary,\n category: category,\n tags: ['ADR', ...tags],\n importance: 9, // High importance for decisions\n source_type: 'mcp', // Track source as MCP\n is_active: true\n })\n .select('id')\n .single();\n\n if (insertError) {\n // Handle specific database errors\n if (insertError.code === '23503') {\n throw new Error('Project no longer exists');\n }\n if (insertError.code === '42501') {\n throw new Error('Permission denied: Cannot write to this project');\n }\n throw new Error(`Failed to save decision: ${insertError.message}`);\n }\n\n return {\n success: true,\n memoryId: memory.id,\n message: `✅ Decision \"${title}\" saved to project \"${project.name}\" with importance 9/10`\n };\n}\n","/**\n * Tool: submit_idea\n * \n * Submits a new idea to the Idea Lab (saved_ideas table).\n * Ideas can later be reviewed, analyzed, and promoted to features.\n */\n\nimport { SupabaseClient } from '@supabase/supabase-js';\nimport type { SubmitIdeaResponse } from '../lib/types.js';\nimport { registry } from '../lib/tool-registry.js';\nimport { SubmitIdeaInputSchema } from '../lib/schemas.js';\n\n// ============================================\n// Tool Registration\n// ============================================\n\nregistry.register({\n name: 'submit_idea',\n description: `Submits a new idea to the Idea Lab (saved_ideas table).\nIdeas can later be reviewed, analyzed, and promoted to features.`,\n schema: SubmitIdeaInputSchema,\n handler: async (args, context) => {\n const result = await submitIdea(\n context.supabase,\n context.userId,\n args.projectId,\n args.title,\n args.description,\n args.category,\n args.tags\n );\n return { content: [{ type: 'text', text: result.message }] };\n }\n});\n\nexport async function submitIdea(\n supabase: SupabaseClient,\n userId: string,\n projectId: string,\n title: string,\n description: string,\n category: string = 'feature',\n tags: string[] = []\n): Promise<SubmitIdeaResponse> {\n // First, verify project ownership\n const { data: project, error: projectError } = await supabase\n .from('projects')\n .select('id, name')\n .eq('id', projectId)\n .eq('owner_id', userId)\n .single();\n\n if (projectError || !project) {\n throw new Error('Project not found or access denied');\n }\n\n // Insert the idea into saved_ideas\n const { data: idea, error: insertError } = await supabase\n .from('saved_ideas')\n .insert({\n project_id: projectId,\n title: title,\n description: description,\n category: category,\n tags: ['mcp', ...tags],\n status: 'draft', // Start as draft for review\n // No session_id since this comes from MCP, not a lab session\n })\n .select('id')\n .single();\n\n if (insertError) {\n // Handle specific database errors\n if (insertError.code === '23503') {\n throw new Error('Project no longer exists');\n }\n if (insertError.code === '42501') {\n throw new Error('Permission denied: Cannot write to this project');\n }\n if (insertError.code === '23505') {\n throw new Error('An idea with this title already exists');\n }\n throw new Error(`Failed to submit idea: ${insertError.message}`);\n }\n\n return {\n success: true,\n ideaId: idea.id,\n message: `💡 Idea \"${title}\" submitted to Idea Lab for project \"${project.name}\". Status: Draft (awaiting review)`\n };\n}\n","/**\n * Tool: update_roadmap\n * \n * Updates the status of a roadmap chunk (step).\n * Can search by chunk ID or by title.\n */\n\nimport { SupabaseClient } from '@supabase/supabase-js';\nimport type { UpdateRoadmapResponse } from '../lib/types.js';\nimport { registry } from '../lib/tool-registry.js';\nimport { UpdateRoadmapInputSchema } from '../lib/schemas.js';\n\n// ============================================\n// Tool Registration\n// ============================================\n\nregistry.register({\n name: 'update_roadmap',\n description: `Updates the status of a roadmap chunk (step).\nCan search by chunk ID or by title.`,\n schema: UpdateRoadmapInputSchema,\n handler: async (args, context) => {\n const result = await updateRoadmap(\n context.supabase,\n context.userId,\n args.projectId,\n args.status,\n args.chunkId,\n args.title\n );\n return { content: [{ type: 'text', text: result.message }] };\n }\n});\n\nexport async function updateRoadmap(\n supabase: SupabaseClient,\n userId: string,\n projectId: string,\n status: 'LOCKED' | 'ACTIVE' | 'COMPLETED',\n chunkId?: string,\n title?: string\n): Promise<UpdateRoadmapResponse> {\n // First, verify project ownership\n const { data: project, error: projectError } = await supabase\n .from('projects')\n .select('id, name')\n .eq('id', projectId)\n .eq('owner_id', userId)\n .single();\n\n if (projectError || !project) {\n throw new Error('Project not found or access denied');\n }\n\n // Find the roadmap chunk\n let targetChunk: { id: string; title: string; status: string } | null = null;\n\n if (chunkId) {\n // Search by ID\n const { data, error } = await supabase\n .from('roadmap_chunks')\n .select('id, title, status')\n .eq('id', chunkId)\n .eq('project_id', projectId)\n .single();\n\n if (error || !data) {\n throw new Error(`Roadmap step with ID \"${chunkId}\" not found`);\n }\n targetChunk = data;\n } else if (title) {\n // Search by title (fuzzy match using ilike)\n const { data, error } = await supabase\n .from('roadmap_chunks')\n .select('id, title, status')\n .eq('project_id', projectId)\n .ilike('title', `%${title}%`)\n .limit(1)\n .single();\n\n if (error || !data) {\n throw new Error(`Roadmap step matching \"${title}\" not found`);\n }\n targetChunk = data;\n } else {\n throw new Error('Either chunkId or title must be provided');\n }\n\n const previousStatus = targetChunk.status;\n\n // Don't update if status is the same\n if (previousStatus === status) {\n return {\n success: true,\n chunkId: targetChunk.id,\n previousStatus,\n newStatus: status,\n message: `ℹ️ Roadmap step \"${targetChunk.title}\" is already ${status}`\n };\n }\n\n // Update the status\n const { error: updateError } = await supabase\n .from('roadmap_chunks')\n .update({ status })\n .eq('id', targetChunk.id);\n\n if (updateError) {\n if (updateError.code === '42501') {\n throw new Error('Permission denied: Cannot update this roadmap');\n }\n throw new Error(`Failed to update roadmap: ${updateError.message}`);\n }\n\n // Build status transition message\n const statusEmoji: Record<string, string> = {\n 'LOCKED': '🔒',\n 'ACTIVE': '🚧',\n 'COMPLETED': '✅'\n };\n\n return {\n success: true,\n chunkId: targetChunk.id,\n previousStatus,\n newStatus: status,\n message: `${statusEmoji[status]} Roadmap step \"${targetChunk.title}\" updated: ${previousStatus} → ${status}`\n };\n}\n","/**\n * Tool: run_architecture_audit\n * \n * Audits code against project memories and architecture rules.\n * Returns violations or \"Pass\" status.\n */\n\nimport { SupabaseClient } from '@supabase/supabase-js';\nimport type { ArchitectureAuditResponse, AuditViolation } from '../lib/types.js';\nimport { registry } from '../lib/tool-registry.js';\nimport { RunArchitectureAuditInputSchema } from '../lib/schemas.js';\n\n// Vulnerability patterns for static analysis\nconst VULNERABILITY_PATTERNS: {\n type: string;\n severity: 'LOW' | 'MEDIUM' | 'HIGH';\n patterns: RegExp[];\n title: string;\n description: string;\n recommendation: string;\n}[] = [\n {\n type: 'SQL_INJECTION',\n severity: 'HIGH',\n patterns: [\n /\\$queryRaw\\s*`[^`]*\\$\\{/gi,\n /execute\\s*\\(\\s*[`'\"][^`'\"]*\\$\\{/gi,\n /query\\s*\\(\\s*[`'\"][^`'\"]*\\+/gi,\n ],\n title: 'Potential SQL Injection',\n description: 'String interpolation in raw SQL queries can lead to SQL injection.',\n recommendation: 'Use parameterized queries or prepared statements instead of string interpolation.'\n },\n {\n type: 'XSS',\n severity: 'HIGH',\n patterns: [\n /dangerouslySetInnerHTML\\s*=\\s*\\{\\s*\\{\\s*__html\\s*:/gi,\n /innerHTML\\s*=/gi,\n ],\n title: 'Potential XSS Vulnerability',\n description: 'Using dangerouslySetInnerHTML or innerHTML can expose your app to XSS attacks.',\n recommendation: 'Sanitize HTML content using a library like DOMPurify before rendering.'\n },\n {\n type: 'SECRETS_LEAK',\n severity: 'HIGH',\n patterns: [\n /['\"]sk_live_[a-zA-Z0-9]{20,}['\"]/gi,\n /['\"]sk_test_[a-zA-Z0-9]{20,}['\"]/gi,\n /api[_-]?key\\s*[:=]\\s*['\"][^'\"]{20,}['\"]/gi,\n /password\\s*[:=]\\s*['\"][^'\"]+['\"]/gi,\n ],\n title: 'Potential Secret Leak',\n description: 'Hardcoded secrets or API keys detected in source code.',\n recommendation: 'Use environment variables for secrets. Never commit credentials to version control.'\n },\n {\n type: 'UNVALIDATED_INPUT',\n severity: 'MEDIUM',\n patterns: [\n /['\"]use server['\"]\\s*[\\s\\S]*?export\\s+async\\s+function\\s+\\w+\\s*\\([^)]*:\\s*any\\)/gi,\n ],\n title: 'Unvalidated Server Action Input',\n description: 'Server action accepts untyped input, which may lead to injection attacks.',\n recommendation: 'Add Zod schema validation at the start of your server action.'\n },\n {\n type: 'MISSING_AUTH',\n severity: 'MEDIUM',\n patterns: [\n /export\\s+async\\s+function\\s+(GET|POST|PUT|DELETE|PATCH)\\s*\\([^)]*\\)\\s*\\{[^}]*(?!auth|session|getUser)/gi,\n ],\n title: 'Potentially Missing Authentication',\n description: 'API route handler may not be checking authentication.',\n recommendation: 'Add authentication check at the start of your API handler.'\n }\n ];\n\nfunction extractLineNumber(content: string, match: RegExpMatchArray): number {\n const upToMatch = content.substring(0, match.index || 0);\n return (upToMatch.match(/\\n/g) || []).length + 1;\n}\n\n// ============================================\n// Tool Registration\n// ============================================\n\nregistry.register({\n name: 'run_architecture_audit',\n description: `Audits code against project memories and architecture rules.\nReturns violations or \"Pass\" status.`,\n schema: RunArchitectureAuditInputSchema,\n handler: async (args, context) => {\n const result = await runArchitectureAudit(\n context.supabase,\n context.userId,\n args.projectId,\n args.filePath,\n args.content\n );\n return { content: [{ type: 'text', text: result.summary }] };\n }\n});\n\nexport async function runArchitectureAudit(\n supabase: SupabaseClient,\n userId: string,\n projectId: string,\n filePath: string,\n content: string\n): Promise<ArchitectureAuditResponse> {\n // First, verify project ownership\n const { data: project, error: projectError } = await supabase\n .from('projects')\n .select('id, name')\n .eq('id', projectId)\n .eq('owner_id', userId)\n .single();\n\n if (projectError || !project) {\n throw new Error('Project not found or access denied');\n }\n\n const violations: AuditViolation[] = [];\n\n // Run static pattern analysis\n for (const pattern of VULNERABILITY_PATTERNS) {\n for (const regex of pattern.patterns) {\n const matches = content.matchAll(new RegExp(regex.source, regex.flags));\n for (const match of matches) {\n const lineNumber = extractLineNumber(content, match);\n violations.push({\n type: pattern.type,\n severity: pattern.severity,\n title: pattern.title,\n description: pattern.description,\n lineNumber,\n recommendation: pattern.recommendation\n });\n }\n }\n }\n\n // Fetch project memories for context-aware checks\n const { data: memories } = await supabase\n .from('project_memories')\n .select('content, category, tags')\n .eq('project_id', projectId)\n .eq('is_active', true)\n .in('category', ['constraint', 'architecture', 'tech_stack', 'decision'])\n .order('importance', { ascending: false })\n .limit(10);\n\n // Check against project constraints\n if (memories && memories.length > 0) {\n for (const memory of memories) {\n // Check for common constraint patterns\n const lowerContent = content.toLowerCase();\n const lowerMemory = memory.content.toLowerCase();\n\n // Check \"never use X\" patterns\n const neverMatch = lowerMemory.match(/never\\s+use\\s+(\\w+)/i);\n if (neverMatch && lowerContent.includes(neverMatch[1])) {\n violations.push({\n type: 'CONSTRAINT_VIOLATION',\n severity: 'MEDIUM',\n title: 'Project Constraint Violation',\n description: `Code may violate project constraint: \"${memory.content.substring(0, 100)}...\"`,\n recommendation: 'Review the project brain for architectural constraints.'\n });\n }\n\n // Check \"always use X\" patterns\n const alwaysMatch = lowerMemory.match(/always\\s+use\\s+(\\w+)/i);\n if (alwaysMatch && !lowerContent.includes(alwaysMatch[1])) {\n violations.push({\n type: 'CONSTRAINT_VIOLATION',\n severity: 'LOW',\n title: 'Missing Required Pattern',\n description: `Code may be missing required pattern: \"${memory.content.substring(0, 100)}...\"`,\n recommendation: 'Check if this file should follow the project standard.'\n });\n }\n }\n }\n\n // Calculate score (100 - penalties)\n let score = 100;\n for (const v of violations) {\n if (v.severity === 'HIGH') score -= 25;\n else if (v.severity === 'MEDIUM') score -= 10;\n else score -= 5;\n }\n score = Math.max(0, score);\n\n // Build summary\n const passed = violations.length === 0;\n let summary: string;\n\n if (passed) {\n summary = `✅ PASSED - No violations found in ${filePath}\\nScore: ${score}/100`;\n } else {\n const highCount = violations.filter(v => v.severity === 'HIGH').length;\n const medCount = violations.filter(v => v.severity === 'MEDIUM').length;\n const lowCount = violations.filter(v => v.severity === 'LOW').length;\n\n summary = `⚠️ AUDIT FAILED - ${violations.length} violation(s) found in ${filePath}\nScore: ${score}/100\n• HIGH: ${highCount}\n• MEDIUM: ${medCount}\n• LOW: ${lowCount}\n\nViolations:\n${violations.map((v, i) => `${i + 1}. [${v.severity}] ${v.title}${v.lineNumber ? ` (line ${v.lineNumber})` : ''}\n ${v.description}\n → ${v.recommendation}`).join('\\n\\n')}`;\n }\n\n return {\n passed,\n score,\n violations,\n summary\n };\n}\n","import { SupabaseClient } from '@supabase/supabase-js';\nimport {\n generateRuleContent,\n generateRuleFiles,\n fetchLegacyStats,\n fetchActiveAgents,\n fetchProjectTechStack,\n getFileNameForIDE,\n IDEProvider,\n RuleFile\n} from '@rigstate/rules-engine';\nimport { registry } from '../lib/tool-registry.js';\nimport { GenerateCursorRulesInputSchema } from '../lib/schemas.js';\n\n// ============================================\n// Tool Registration\n// ============================================\n\nregistry.register({\n name: 'sync_ide_rules',\n description: `Generates the appropriate rules file content (e.g. .cursorrules, .windsurfrules) \nbased on project context and user settings.`,\n schema: GenerateCursorRulesInputSchema,\n handler: async (args, context) => {\n const result = await syncIdeRules(context.supabase, args.projectId);\n\n // Format response: Main file content + information about modular files\n let responseText = `FileName: ${result.fileName}\\n\\nContent:\\n${result.content}`;\n\n if (result.files && result.files.length > 0) {\n responseText += `\\n\\n--- MODULAR FILES GENERATED (${result.files.length}) ---\\n`;\n responseText += result.files.map(f => `- ${f.path}`).join('\\n');\n responseText += `\\n\\nNote: Please ensure these modular files are also updated if your IDE is following the V3 Rules standard.`;\n }\n\n return { content: [{ type: 'text', text: responseText }] };\n }\n});\n\n\n/**\n * Sync IDE rules for a project.\n * Uses the centralized rules-engine for consistent generation across all consumers.\n * \n * @param supabase - Supabase client instance\n * @param projectId - The project ID to generate rules for\n * @returns Object with fileName, content, and the new modular files[] array\n */\nexport async function syncIdeRules(\n supabase: SupabaseClient,\n projectId: string\n): Promise<{ fileName: string; content: string; files: RuleFile[] }> {\n // 1. Fetch Project & Preferred IDE\n const { data: project, error: projectError } = await supabase\n .from('projects')\n .select('*')\n .eq('id', projectId)\n .single();\n\n if (projectError || !project) {\n throw new Error(`Project ${projectId} not found.`);\n }\n\n // 2. Determine IDE (Preference -> Fallback)\n const ide: IDEProvider = (project.preferred_ide as IDEProvider) || 'cursor';\n\n // 3. Fetch Context Data (Parallel for speed)\n const [stack, roadmapRes, legacyStats, activeAgents, dbMetadataRes] = await Promise.all([\n fetchProjectTechStack(supabase, projectId),\n supabase\n .from('roadmap_chunks')\n .select('step_number, title, status, sprint_focus, prompt_content, is_legacy')\n .eq('project_id', projectId),\n fetchLegacyStats(supabase, projectId),\n fetchActiveAgents(supabase),\n supabase.rpc('get_table_metadata')\n ]);\n\n const databaseMetadata = dbMetadataRes.data || [];\n\n // 4. Generate Content (Mono-file)\n const content = generateRuleContent(\n { ...project, id: projectId },\n stack,\n roadmapRes.data || [],\n ide,\n legacyStats,\n activeAgents\n );\n\n // 5. Generate Modular Files (v3.0)\n const fileResult = generateRuleFiles(\n { ...project, id: projectId },\n stack,\n roadmapRes.data || [],\n ide,\n legacyStats,\n activeAgents,\n databaseMetadata\n );\n\n return {\n fileName: getFileNameForIDE(ide),\n content,\n files: fileResult.files\n };\n}\n\n","import { z } from 'zod';\nimport { ToolDefinition, registry } from '../lib/tool-registry.js';\n\n/**\n * Input Schema for List Features\n */\nconst InputSchema = z.object({\n projectId: z.string().uuid().describe('The UUID of the Rigstate project')\n});\n\n/**\n * Tool Definition: list_features\n */\nexport const listFeaturesTool: ToolDefinition<typeof InputSchema> = {\n name: 'list_features',\n description: `Lists all high-level features (epics) for a project.\nUseful for understanding the strategic context and major milestones.`,\n schema: InputSchema,\n handler: async ({ projectId }, { supabase, userId }) => {\n // 1. Verify project ownership\n const { data: project, error: projectError } = await supabase\n .from('projects')\n .select('id')\n .eq('id', projectId)\n .eq('owner_id', userId)\n .single();\n\n if (projectError || !project) {\n throw new Error('Project not found or access denied');\n }\n\n // 2. Fetch features\n const { data: features, error } = await supabase\n .from('features')\n .select('id, name, description, priority, status')\n .eq('project_id', projectId)\n .neq('status', 'ARCHIVED')\n .order('created_at', { ascending: false }); // Sort by newest (or priority if column existed properly typed)\n\n // Note: 'horizon' was not in my simple schema mental model, removed to be safe or use 'status' as proxy.\n // Assuming strict schema adherence.\n // If priority column is text, sorting by it strictly might be weird if not enum. \n // Let's trust 'created_at' for stability for now.\n\n if (error) {\n throw new Error(`Failed to fetch features: ${error.message}`);\n }\n\n // 3. Format response\n const formatted = (features || []).length > 0\n ? (features || []).map(f => {\n const priorityStr = f.priority === 'MVP' ? '[MVP] ' : '';\n return `- ${priorityStr}${f.name} (${f.status})`;\n }).join('\\n')\n : 'No active features found.';\n\n return {\n content: [\n {\n type: 'text',\n text: formatted\n }\n ]\n };\n }\n};\n\nregistry.register(listFeaturesTool);\n\n\n","/**\n * Tool: list_roadmap_tasks\n * \n * Lists all roadmap tasks for a project that are not completed.\n */\n\nimport { SupabaseClient } from '@supabase/supabase-js';\nimport type { ListRoadmapTasksResponse } from '../lib/types.js';\nimport { registry } from '../lib/tool-registry.js';\nimport { ListRoadmapTasksInputSchema } from '../lib/schemas.js';\n\n// ============================================\n// Tool Registration\n// ============================================\n\nregistry.register({\n name: 'list_roadmap_tasks',\n description: `Lists all actionable tasks for a project that are not yet COMPLETED.\nShows active and locked steps with their step numbers.`,\n schema: ListRoadmapTasksInputSchema,\n handler: async (args, context) => {\n const result = await listRoadmapTasks(\n context.supabase,\n context.userId,\n args.projectId\n );\n return { content: [{ type: 'text', text: result.formatted }] };\n }\n});\n\nexport async function listRoadmapTasks(\n supabase: SupabaseClient,\n userId: string,\n projectId: string\n): Promise<ListRoadmapTasksResponse> {\n // 1. Verify project ownership\n const { data: project, error: projectError } = await supabase\n .from('projects')\n .select('id')\n .eq('id', projectId)\n .eq('owner_id', userId)\n .single();\n\n if (projectError || !project) {\n throw new Error('Project not found or access denied');\n }\n\n // 2. Fetch non-completed tasks\n const { data: tasks, error } = await supabase\n .from('roadmap_chunks')\n .select('id, title, priority, status, step_number, prompt_content')\n .eq('project_id', projectId)\n .neq('status', 'COMPLETED')\n .order('priority', { ascending: false })\n .order('step_number', { ascending: true });\n\n if (error) {\n console.error('Failed to fetch roadmap tasks:', error);\n throw new Error('Failed to fetch roadmap tasks');\n }\n\n // 3. Format response\n const formatted = (tasks || []).length > 0\n ? (tasks || []).map(t => {\n const statusEmoji = t.status === 'ACTIVE' ? '🔵' : '🔒';\n const priorityStr = t.priority ? `[${t.priority}]` : '';\n return `${statusEmoji} Step ${t.step_number}: ${t.title} (ID: ${t.id})`;\n }).join('\\n')\n : 'No active or locked tasks found in the roadmap.';\n\n return {\n tasks: (tasks || []).map(t => ({\n id: t.id,\n title: t.title,\n priority: t.priority,\n status: t.status,\n step_number: t.step_number,\n prompt_content: t.prompt_content\n })),\n formatted\n };\n}\n","\nimport { SupabaseClient } from '@supabase/supabase-js';\nimport type { RoadmapChunk } from '../lib/types.js';\nimport { registry } from '../lib/tool-registry.js';\nimport { GetNextRoadmapStepInputSchema } from '../lib/schemas.js';\n\n// ============================================\n// Tool Registration\n// ============================================\n\nregistry.register({\n name: 'get_next_roadmap_step',\n description: `Fetches the next logical step from the roadmap for a project. \nUseful for transitioning between tasks.`,\n schema: GetNextRoadmapStepInputSchema,\n handler: async (args, context) => {\n const result = await getNextRoadmapStep(\n context.supabase,\n args.projectId,\n args.currentStepId\n );\n return { content: [{ type: 'text', text: result.message }] };\n }\n});\n\nexport interface GetNextRoadmapStepResponse {\n nextStep: RoadmapChunk | null;\n message: string;\n}\n\nexport async function getNextRoadmapStep(\n supabase: SupabaseClient,\n projectId: string,\n currentStepId?: string\n): Promise<GetNextRoadmapStepResponse> {\n\n // Strategy:\n // 1. If currentStepId is provided, look for the step with the next higher step_number.\n // 2. If not, look for the first 'ACTIVE' step.\n // 3. If no ACTIVE, look for the first 'LOCKED' step.\n\n let currentStepNumber = 0;\n\n if (currentStepId) {\n const { data: current } = await supabase\n .from('roadmap_chunks')\n .select('step_number')\n .eq('id', currentStepId)\n .single();\n\n if (current) {\n currentStepNumber = current.step_number;\n }\n } else {\n // Try to find currently active step to establish baseline\n const { data: active } = await supabase\n .from('roadmap_chunks')\n .select('step_number')\n .eq('project_id', projectId)\n .eq('status', 'ACTIVE')\n .order('step_number', { ascending: true })\n .limit(1)\n .single();\n\n if (active) {\n currentStepNumber = active.step_number;\n }\n }\n\n // Find the next step > currentStepNumber\n // We prioritize LOCKED or PENDING steps that come *after* the current one.\n const { data: nextStep, error } = await supabase\n .from('roadmap_chunks')\n .select('*')\n .eq('project_id', projectId)\n .gt('step_number', currentStepNumber)\n .neq('status', 'COMPLETED') // We want the next *workable* step\n .order('step_number', { ascending: true })\n .limit(1)\n .single();\n\n if (error && error.code !== 'PGRST116') { // PGRST116 is \"Row not found\" which is fine\n throw new Error(`Failed to fetch next roadmap step: ${error.message}`);\n }\n\n if (!nextStep) {\n return {\n nextStep: null,\n message: \"No further steps found in the roadmap. You might be done! 🎉\"\n };\n }\n\n return {\n nextStep: nextStep as RoadmapChunk,\n message: `Next step found: [Step ${nextStep.step_number}] ${nextStep.title}`\n };\n}\n","\nimport { SupabaseClient } from '@supabase/supabase-js';\nimport { CheckRulesSyncResponse } from '../lib/types.js';\nimport { registry } from '../lib/tool-registry.js';\nimport { CheckRulesSyncInputSchema } from '../lib/schemas.js';\n\n// ============================================\n// Tool Registration\n// ============================================\n\nregistry.register({\n name: 'check_rules_sync',\n description: `Verifies if the IDE rules are present and belong to the correct project.`,\n schema: CheckRulesSyncInputSchema,\n handler: async (args, context) => {\n const result = await checkRulesSync(\n context.supabase,\n args.projectId,\n args.currentRulesContent\n );\n return { content: [{ type: 'text', text: result.message }] };\n }\n});\n\nconst RIGSTATE_START = \"RIGSTATE_START\";\nconst RIGSTATE_END = \"RIGSTATE_END\";\n\n// Minimal Safety Cache (Guardian Rules)\nconst SAFETY_CACHE_RULES = `\n### 🛡️ RIGSTATE SAFETY CACHE (OFFLINE MODE)\n1. **Strict Types**: No 'any'. Define interfaces for all data structures.\n2. **Row Level Security**: All database queries MUST be scoped to 'user_id' or 'org_id'.\n3. **Validation**: Use Zod for all input validation.\n4. **Error Handling**: Use try/catch blocks for all external API calls.\n5. **No Blind Deletes**: Never delete data without explicit confirmation or soft-deletes.\n`;\n\nexport async function checkRulesSync(\n supabase: SupabaseClient,\n projectId: string,\n currentRulesContent?: string\n): Promise<CheckRulesSyncResponse> {\n\n // If no content provided, we can't really verify local files from MCP directly \n // without reading the file system, but MCP is often sandboxed or remote.\n // Ideally, the Agent provides the content of .cursorrules it sees.\n\n if (!currentRulesContent) {\n return {\n synced: false,\n message: \"No rules content provided for verification.\",\n shouldTriggerSync: true,\n missingBlock: true\n };\n }\n\n const hasStart = currentRulesContent.includes(RIGSTATE_START);\n const hasEnd = currentRulesContent.includes(RIGSTATE_END);\n\n if (!hasStart || !hasEnd) {\n return {\n synced: false,\n message: \"Rigstate rules block is missing or corrupted.\",\n shouldTriggerSync: true,\n missingBlock: true\n };\n }\n\n // Resilience: Wrap DB check in try/catch to handle network failures\n try {\n const { data: project, error } = await supabase\n .from('projects')\n .select('name')\n .eq('id', projectId)\n .single();\n\n if (error) throw error;\n\n if (project) {\n if (!currentRulesContent.includes(`Project Rules: ${project.name}`)) {\n return {\n synced: false,\n message: `Rules file appears to belong to a different project (Expected: ${project.name}).`,\n shouldTriggerSync: true\n };\n }\n }\n } catch (e) {\n // Network or DB Error -> Fallback to Offline Mode\n console.error(\"Rigstate Sync Verification Failed:\", e);\n\n return {\n synced: true, // Assume synced to allow work to continue\n shouldTriggerSync: false,\n offlineMode: true,\n message: `⚠️ Rigstate Sync utilgjengelig – bruker lokale sikkerhetsregler.\\n${SAFETY_CACHE_RULES}`\n };\n }\n\n return {\n synced: true,\n message: \"Rules are valid and present.\",\n shouldTriggerSync: false\n };\n}\n","\nimport { SupabaseClient } from '@supabase/supabase-js';\nimport fs from 'fs/promises';\nimport path from 'path';\n\nexport interface AnalyzeDatabasePerformanceInput {\n projectId: string;\n filePaths: string[];\n}\n\ninterface PerformanceIssue {\n type: 'MISSING_INDEX' | 'N_PLUS_ONE' | 'UNOPTIMIZED_FILTER' | 'DEAD_TABLE';\n severity: 'HIGH' | 'MEDIUM' | 'LOW';\n file: string;\n line?: number;\n description: string;\n suggestion: string;\n codeSnippet?: string;\n}\n\ninterface TableMetadata {\n table_name: string;\n indexed_columns: string[];\n foreign_keys: { column: string, target_table: string }[];\n}\n\nexport async function analyzeDatabasePerformance(\n supabase: SupabaseClient,\n input: AnalyzeDatabasePerformanceInput\n): Promise<{ issues: PerformanceIssue[], summary: string }> {\n const issues: PerformanceIssue[] = [];\n\n // 1. Fetch Database Metadata\n const { data: rawMetadata, error } = await supabase.rpc('get_table_metadata', {\n p_project_id: input.projectId\n });\n\n if (error) {\n throw new Error(`Failed to fetch database metadata: ${error.message}`);\n }\n\n const metadata: TableMetadata[] = rawMetadata.map((t: any) => ({\n table_name: t.t_name || t.table_name,\n indexed_columns: t.indexed_columns || [],\n foreign_keys: t.foreign_keys || []\n }));\n\n // Map for quick lookup\n const tableMap = new Map<string, TableMetadata>();\n metadata.forEach(t => tableMap.set(t.table_name, t));\n\n // 2. Analyze Code Files\n for (const filePath of input.filePaths) {\n try {\n const content = await fs.readFile(filePath, 'utf-8');\n const lines = content.split('\\n');\n\n // --- ANALYSIS PATTERNS ---\n\n // A. Detect N+1 Danger Zones (Loops with Await)\n // Regex: .map(async ... await ... from('...'))\n // This is complex for regex, using simple line heuristics\n // If line contains 'await supabase' AND is inside a .map() block? Hard to detect scope.\n // Simplified: If we see `await supabase` inside a loop structure in the same snippet?\n // Let's stick to \"Single Line Heuristics\" for MVP robustness.\n\n // B. Detect Unindexed Filters\n // Pattern: .eq('column', val) or .filter('column', ...)\n // We need to know WHICH table is being queried.\n // Look for `from('tableName')` then track subsequent `.eq('col')`?\n // AST would be better, but regex state machine is feasible for simple chains.\n\n let currentTable: string | null = null;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n\n // 1. Identify Table Context\n const fromMatch = line.match(/\\.from\\(['\"]([a-zA-Z0-9_]+)['\"]\\)/);\n if (fromMatch) {\n currentTable = fromMatch[1];\n }\n\n // Reset table context on semicolon (end of chain) mostly\n if (line.includes(';')) {\n currentTable = null; // Conservative reset\n }\n\n // 2. Check for Missing Indexes\n if (currentTable) {\n const eqMatch = line.match(/\\.(eq|match|not|gt|gte|lt|lte|like|ilike)\\(['\"]([a-zA-Z0-9_]+)['\"]/);\n if (eqMatch) {\n const colName = eqMatch[2];\n const tableMeta = tableMap.get(currentTable);\n\n if (tableMeta) {\n // Check if column is indexed\n // Note: Primary keys are usually indexed automatically, but get_table_metadata might typically return explicit indexes.\n // We should check if it's 'id' (usually PK) or in indexed_columns.\n const isIndexed = tableMeta.indexed_columns.includes(colName) || colName === 'id';\n const isForeignKey = tableMeta.foreign_keys.some(fk => fk.column === colName);\n\n if (!isIndexed) {\n issues.push({\n type: 'MISSING_INDEX',\n severity: isForeignKey ? 'HIGH' : 'MEDIUM', // Unindexed Foreign Keys are deadly\n file: filePath,\n line: i + 1,\n description: `Query filters on unindexed column '${colName}' in table '${currentTable}'.`,\n suggestion: `Create an index for '${currentTable}(${colName})'.`,\n codeSnippet: line.trim()\n });\n }\n }\n }\n }\n\n // 3. Check for N+1 (Crudely)\n if (line.includes('await supabase') && (line.includes('.map(') || lines[i - 1]?.includes('.map('))) {\n issues.push({\n type: 'N_PLUS_ONE',\n severity: 'HIGH',\n file: filePath,\n line: i + 1,\n description: `Potential N+1 Query detected. Await inside loop/map.`,\n suggestion: `Use Promise.all() or .in() operator instead of looping queries.`,\n codeSnippet: line.trim()\n });\n }\n }\n\n } catch (e) {\n console.warn(`Skipping file ${filePath}: ${e}`);\n }\n }\n\n // 3. Summary Report\n const highSev = issues.filter(i => i.severity === 'HIGH').length;\n const medSev = issues.filter(i => i.severity === 'MEDIUM').length;\n\n let summary = `## 🔍 Performance Audit Report\\n`;\n summary += `**Scanned Files:** ${input.filePaths.length}\\n`;\n summary += `**Issues Found:** ${issues.length} (🔴 ${highSev} High, 🟡 ${medSev} Medium)\\n\\n`;\n\n if (issues.length === 0) {\n summary += `✅ **Clean Scan:** No obvious performance bottlenecks detected based on current schema constraints.`;\n } else {\n summary += `### 🚨 Critical Findings\\n`;\n issues.filter(i => i.severity === 'HIGH').forEach(issue => {\n summary += `- **${issue.type}** in \\`${path.basename(issue.file)}:${issue.line}\\`\\n`;\n summary += ` - ${issue.description}\\n`;\n summary += ` - 💡 *Fix:* ${issue.suggestion}\\n`;\n });\n }\n\n return { issues, summary };\n}\n","\nexport interface SecurityViolation {\n id: string;\n type: string;\n severity: 'LOW' | 'MEDIUM' | 'HIGH' | 'FATAL';\n title: string;\n description: string;\n recommendation: string;\n}\n\n/**\n * Checks for SQL Injection Vulnerabilities (SEC-SQL-01)\n */\nexport function checkSqlInjection(content: string): SecurityViolation | null {\n const sqlKeywords = ['from', 'select', 'insert', 'update', 'delete', 'rpc', 'execute', 'query'];\n const hasSqlKeywords = sqlKeywords.some(kw => content.toLowerCase().includes(kw));\n\n if (hasSqlKeywords) {\n const interpolationRegex = /`[^`]*\\${[^`]*`|['\"][^'\"]*\\$\\{[^'\"]*['\"]/;\n if (interpolationRegex.test(content)) {\n return {\n id: 'SEC-SQL-01',\n type: 'SQL_INJECTION',\n severity: 'HIGH',\n title: 'Potential SQL Injection (Dynamic String)',\n description: 'Detected dynamic string building in a context containing SQL keywords.',\n recommendation: 'Use prepared statements or the project-standard query builder. Never interpolate user input directly.'\n };\n }\n }\n return null;\n}\n\n/**\n * Checks for RLS in Migrations (SEC-RLS-01)\n */\nexport function checkRlsInMigration(filePath: string, content: string): SecurityViolation | null {\n if (filePath.includes('supabase/migrations/') && filePath.endsWith('.sql')) {\n const hasCreateTable = /CREATE\\s+TABLE/i.test(content);\n const hasEnableRls = /ENABLE\\s+ROW\\s+LEVEL\\s+SECURITY/i.test(content);\n\n if (hasCreateTable && !hasEnableRls) {\n return {\n id: 'SEC-RLS-01',\n type: 'DB_INTEGRITY',\n severity: 'HIGH',\n title: 'Missing Row Level Security (RLS)',\n description: 'Migration creates a table but does not enable RLS.',\n recommendation: 'Add ALTER TABLE \"public\".\"your_table\" ENABLE ROW LEVEL SECURITY; for every new table.'\n };\n }\n }\n return null;\n}\n\n/**\n * Checks for Hardcoded Secrets (SEC-KEY-01)\n */\nexport function checkHardcodedSecrets(filePath: string, content: string): SecurityViolation[] {\n const violations: SecurityViolation[] = [];\n const keyPatterns = [\n { pattern: /sk_live_[a-zA-Z0-9]{20,}/, name: 'Stripe Secret Key' },\n { pattern: /sb_publishable_[a-zA-Z0-9]{20,}/, name: 'Supabase Publishable Key' },\n { pattern: /AIza[0-9A-Za-z\\\\-_]{35}/, name: 'Google API Key' },\n { pattern: /\"([^\"]*(?:password|secret|key|token)[^\"]*)\"\\s*:\\s*\"[^\"]{10,}\"/i, name: 'Generic Secret' }\n ];\n\n for (const p of keyPatterns) {\n if (p.pattern.test(content) && !filePath.includes('.env')) {\n violations.push({\n id: 'SEC-KEY-01',\n type: 'SECRET_LEAKAGE',\n severity: 'FATAL',\n title: `Hardcoded Secret Detected (${p.name})`,\n description: `Found a potential secret or API key hardcoded in the source file.`,\n recommendation: 'Move all secrets to environment variables (.env.local) and use process.env.'\n });\n }\n }\n return violations;\n}\n\n/**\n * Checks for XSS Vulnerabilities (SEC-UI-01)\n */\nexport function checkXss(content: string): SecurityViolation | null {\n if (content.includes('dangerouslySetInnerHTML')) {\n return {\n id: 'SEC-UI-01',\n type: 'XSS_VULNERABILITY',\n severity: 'MEDIUM',\n title: 'Dangerous HTML Rendering',\n description: 'Detected use of dangerouslySetInnerHTML which can lead to XSS.',\n recommendation: 'Sanitize content with DOMPurify or use safer rendering methods.'\n };\n }\n return null;\n}\n\n/**\n * Checks for strict identity isolation (SEC-AUTH-04)\n */\nexport function checkIdentityIsolation(filePath: string, content: string): SecurityViolation | null {\n if ((filePath.includes('app/api/') || filePath.includes('actions/')) && (content.includes('supabase.from') || content.includes('db.select'))) {\n const hasOwnerFilter = /\\.eq\\(['\"](owner_id|user_id)['\"],/.test(content);\n if (!hasOwnerFilter) {\n return {\n id: 'SEC-AUTH-04',\n type: 'ISOLATION_FAILURE',\n severity: 'HIGH',\n title: 'Missing Identity Filter',\n description: 'Data query lacks a user_id or owner_id filter. Required for multi-tenancy isolation.',\n recommendation: 'Always filter tenant-specific data using .eq(\"owner_id\", userId).'\n };\n }\n }\n return null;\n}\n\n// ... Additional checks for Phase 7.4 rules ...\n\nexport function checkSensitiveLogging(content: string): SecurityViolation | null {\n if (content.includes('console.log') && (content.includes('env') || content.includes('process.env') || content.includes('password') || content.includes('user'))) {\n return {\n id: 'SEC-LOG-01',\n type: 'PII_LEAKAGE',\n severity: 'MEDIUM',\n title: 'Potential Log Leakage',\n description: 'Detected console.log of potentially sensitive objects (user, env, password).',\n recommendation: 'Use a structured logger and ensure sensitive fields are redacted before logging.'\n };\n }\n return null;\n}\n\nexport function checkRbac(filePath: string, content: string): SecurityViolation | null {\n if ((filePath.includes('app/api/') || filePath.includes('actions/')) && !content.includes('role') && !content.includes('permission') && !content.includes('isAdmin')) {\n return {\n id: 'SEC-RBAC-01',\n type: 'AUTHORIZATION_GATHERING',\n severity: 'MEDIUM',\n title: 'Missing RBAC Check',\n description: 'Route/Action seems to lack explicit role or permission-based access control.',\n recommendation: 'Verify user roles (e.g., admin, editor) before granting access to sensitive endpoints.'\n };\n }\n return null;\n}\n\nexport function checkInputValidation(filePath: string, content: string): SecurityViolation | null {\n if ((filePath.includes('app/api/') || filePath.includes('actions/')) && !content.includes('z.object') && !content.includes('parse')) {\n if (content.includes('.update(') || content.includes('.insert(')) {\n return {\n id: 'SEC-VAL-01',\n type: 'INPUT_VALIDATION',\n severity: 'HIGH',\n title: 'Missing Input Validation',\n description: 'Database mutation detected without Zod schema validation.',\n recommendation: 'Use Zod to validate all incoming data before passing it to the database.'\n };\n }\n }\n return null;\n}\n\nexport function checkCleanFailures(content: string): SecurityViolation | null {\n const errorLeakageRegex = /(?:res\\..*(?:error|message|status).*\\.message)|(?:throw new Error\\(.*\\.message\\))/;\n if (errorLeakageRegex.test(content) && content.includes('catch')) {\n return {\n id: 'SEC-ERR-01',\n type: 'ERROR_EXPOSURE',\n severity: 'MEDIUM',\n title: 'Raw Database Error Leakage',\n description: 'Detected raw error messages being sent/thrown to the client.',\n recommendation: 'Catch errors and return standardized, non-technical messages to the frontend.'\n };\n }\n return null;\n}\n\nexport function checkDependencies(filePath: string, content: string): SecurityViolation | null {\n if (filePath.endsWith('package.json')) {\n if (content.includes('\"*') || content.includes('\"latest\"')) {\n return {\n id: 'SEC-DEPS-01',\n type: 'DEPENDENCY_BLOAT',\n severity: 'HIGH',\n title: 'Unpinned Dependencies',\n description: 'package.json contains unpinned or \"latest\" versions.',\n recommendation: 'Always pin dependencies to specific versions for reproducibility and security.'\n };\n }\n }\n return null;\n}\n\n// ... Anti-Lazy checks ...\n\nexport function checkAntiLazy(filePath: string, content: string): SecurityViolation[] {\n const violations: SecurityViolation[] = [];\n\n // SEC-LAZY-01: No 'any'\n const anyRegex = /: any([,\\s)\\]\\}]|$)/g;\n if (anyRegex.test(content) && !filePath.includes('node_modules')) {\n violations.push({\n id: 'SEC-LAZY-01',\n type: 'TYPE_LAZINESS',\n severity: 'HIGH',\n title: 'Use of \"any\" Type detected',\n description: 'Detected use of the \"any\" type, which bypasses the TypeSytem safety checks.',\n recommendation: 'Replace \"any\" with a specific interface, type, or \"unknown\" with proper narrowing.'\n });\n }\n\n // SEC-LAZY-02: No empty catch\n const emptyCatchRegex = /catch\\s*\\([^)]*\\)\\s*{\\s*}/g;\n if (emptyCatchRegex.test(content)) {\n violations.push({\n id: 'SEC-LAZY-02',\n type: 'ERROR_SWALLOWING',\n severity: 'HIGH',\n title: 'Empty Catch Block detected',\n description: 'Detected a catch block that swallows errors without logging or handling them.',\n recommendation: 'Always log the error or handle it. Never leave a catch block empty.'\n });\n }\n\n // SEC-LAZY-03: No TODOs\n if (content.includes('TODO') || content.includes('FIXME')) {\n violations.push({\n id: 'SEC-LAZY-03',\n type: 'INCOMPLETE_WORK',\n severity: 'MEDIUM',\n title: 'Technical Debt remnant (TODO/FIXME)',\n description: 'Detected TODO or FIXME comments in a file being evaluated for completion.',\n recommendation: 'Resolve the task fully or move the TODO to the project roadmap before committing.'\n });\n }\n\n return violations;\n}\n","import { SupabaseClient } from '@supabase/supabase-js';\nimport { AuditRlsStatusInput } from '../lib/types.js';\nimport * as Checks from './security-checks.js';\nimport { registry } from '../lib/tool-registry.js';\nimport { AuditRlsStatusInputSchema, AuditSecurityIntegrityInputSchema } from '../lib/schemas.js';\n\n// ============================================\n// Tool Registration\n// ============================================\n\nregistry.register({\n name: 'audit_rls_status',\n description: `Sven's Tool: Security Shield. Audits the database to ensure Row Level Security (RLS) is enforced.`,\n schema: AuditRlsStatusInputSchema,\n handler: async (args, context) => {\n const result = await auditRlsStatus(context.supabase, args);\n return { content: [{ type: 'text', text: result.summary || 'No summary available' }] };\n }\n});\n\nregistry.register({\n name: 'audit_security_integrity',\n description: `Frank's Tool: Security Oracle. Performs a diagnostic security audit against the Fortress Matrix.`,\n schema: AuditSecurityIntegrityInputSchema,\n handler: async (args, context) => {\n const result = await auditSecurityIntegrity(context.supabase, args);\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };\n }\n});\n\n/**\n * Sven's Tool: Security Shield\n * Audits the database to ensure Row Level Security (RLS) is enforced.\n */\nexport async function auditRlsStatus(\n supabase: SupabaseClient,\n input: AuditRlsStatusInput\n) {\n try {\n const { data, error } = await supabase.rpc('execute_sql', {\n query: `\n SELECT tablename, rowsecurity \n FROM pg_tables \n WHERE schemaname = 'public' \n ORDER BY tablename;\n `\n });\n\n if (error) {\n throw new Error(`Database query failed: ${error.message}`);\n }\n\n const tables = data as Array<{ tablename: string, rowsecurity: boolean }>;\n\n if (!tables) {\n return {\n status: 'ERROR',\n message: 'Could not fetch table list. Ensure execute_sql RPC is available or pg_tables is accessible.'\n };\n }\n\n const unsecuredTables = tables.filter(t => !t.rowsecurity);\n const securedTables = tables.filter(t => t.rowsecurity);\n\n const score = tables.length > 0\n ? Math.round((securedTables.length / tables.length) * 100)\n : 100;\n\n return {\n timestamp: new Date().toISOString(),\n projectId: input.projectId,\n securityScore: score,\n metrics: {\n totalTables: tables.length,\n securedTables: securedTables.length,\n unsecuredTables: unsecuredTables.length\n },\n unsecuredTables: unsecuredTables.map(t => t.tablename),\n status: unsecuredTables.length === 0 ? 'SECURE' : 'VULNERABLE',\n summary: unsecuredTables.length === 0\n ? `PASSED. All ${tables.length} tables have RLS enabled. Sven approves.`\n : `CRITICAL. ${unsecuredTables.length} tables are missing RLS: ${unsecuredTables.map(t => t.tablename).join(', ')}. Immediate action required.`\n };\n\n } catch (err: any) {\n return {\n status: 'ERROR',\n message: `Sven could not reach the database structure. Error: ${err.message || err}. check connection strings.`\n };\n }\n}\n\n/**\n * Frank's Tool: Security Oracle\n * Performs a diagnostic security audit against the Fortress Matrix.\n */\nexport async function auditSecurityIntegrity(\n supabase: SupabaseClient,\n input: { projectId: string, filePath: string, content: string }\n) {\n const violations: any[] = [];\n const { content, filePath } = input;\n\n // Use Modular Checks\n const sqlViolation = Checks.checkSqlInjection(content);\n if (sqlViolation) violations.push(sqlViolation);\n\n const rlsViolation = Checks.checkRlsInMigration(filePath, content);\n if (rlsViolation) violations.push(rlsViolation);\n\n const keyViolations = Checks.checkHardcodedSecrets(filePath, content);\n violations.push(...keyViolations);\n\n const xssViolation = Checks.checkXss(content);\n if (xssViolation) violations.push(xssViolation);\n\n const authViolation = Checks.checkIdentityIsolation(filePath, content);\n if (authViolation) violations.push(authViolation);\n\n const logViolation = Checks.checkSensitiveLogging(content);\n if (logViolation) violations.push(logViolation);\n\n const rbacViolation = Checks.checkRbac(filePath, content);\n if (rbacViolation) violations.push(rbacViolation);\n\n const valViolation = Checks.checkInputValidation(filePath, content);\n if (valViolation) violations.push(valViolation);\n\n const errViolation = Checks.checkCleanFailures(content);\n if (errViolation) violations.push(errViolation);\n\n const depViolation = Checks.checkDependencies(filePath, content);\n if (depViolation) violations.push(depViolation);\n\n const lazyViolations = Checks.checkAntiLazy(filePath, content);\n violations.push(...lazyViolations);\n\n const score = Math.max(0, 100 - (violations.length * 10));\n const passed = !violations.some((v: any) => v.severity === 'HIGH' || v.severity === 'FATAL');\n\n return {\n timestamp: new Date().toISOString(),\n projectId: input.projectId,\n filePath: input.filePath,\n passed,\n score,\n violations,\n summary: passed\n ? 'FRANK: Security audit PASSED. No critical Fortress violations detected.'\n : `FRANK: Security audit FAILED. Detected ${violations.length} violations against the Fortress Matrix.`\n };\n}\n","\nimport { SupabaseClient } from '@supabase/supabase-js';\nimport { analyzeDatabasePerformance } from './analyze-database-performance.js';\nimport { auditRlsStatus, auditSecurityIntegrity } from './security-tools.js';\nimport { IntegrityGateResponse, IntegrityCheckResult, AuditIntegrityGateInput } from '../lib/types.js';\nimport { registry } from '../lib/tool-registry.js';\nimport { AuditIntegrityGateInputSchema } from '../lib/schemas.js';\n\n// ============================================\n// Tool Registration\n// ============================================\n\nregistry.register({\n name: 'audit_integrity_gate',\n description: `Runs the full Integrity Gate (Security + Performance checks). \nCan trigger a SOFT LOCK if critical issues are found.`,\n schema: AuditIntegrityGateInputSchema,\n handler: async (args, context) => {\n const result = await runAuditIntegrityGate(context.supabase, args);\n return { content: [{ type: 'text', text: result.summary }] };\n }\n});\n\nexport async function runAuditIntegrityGate(\n supabase: SupabaseClient,\n input: AuditIntegrityGateInput\n): Promise<IntegrityGateResponse> {\n const checks: IntegrityCheckResult[] = [];\n let isSoftLocked = false;\n\n // 1. Run Guardian Security Audit (RLS)\n try {\n const rlsResult = await auditRlsStatus(supabase, { projectId: input.projectId });\n const unsecuredTables = rlsResult.unsecuredTables || [];\n\n if (unsecuredTables.length > 0) {\n isSoftLocked = true;\n checks.push({\n check: 'SECURITY',\n status: 'FAIL',\n message: `Found ${unsecuredTables.length} tables without RLS enabled.`,\n details: unsecuredTables\n });\n } else {\n checks.push({\n check: 'SECURITY',\n status: 'PASS',\n message: 'All tables have Row Level Security enabled.'\n });\n }\n } catch (e: any) {\n checks.push({\n check: 'SECURITY',\n status: 'WARN',\n message: `Failed to execute RLS audit: ${e.message}`\n });\n }\n\n // 2. Run Fortress Security Matrix (Phase 7)\n if (input.filePaths && input.filePaths.length > 0) {\n for (const path of input.filePaths) {\n try {\n // We need to read the file content here or pass it? \n // auditSecurityIntegrity requires 'content'. \n // But auditIntegrityGate only gets filePaths.\n // WE NEED TO READ THE FILE. \n // Since this runs on the server, we can use fs. \n // BUT we need to be careful about imports in this environment.\n // Ideally, auditSecurityIntegrity should accept a path and read it, \n // but currently it accepts { filePath, content }.\n\n // Let's assume we can read via fs if we are in Node environment (which MCP is).\n const fs = await import('fs/promises');\n const content = await fs.readFile(path, 'utf-8');\n\n const securityResult = await auditSecurityIntegrity(supabase, {\n projectId: input.projectId,\n filePath: path,\n content: content\n });\n\n if (!securityResult.passed) {\n isSoftLocked = true;\n checks.push({\n check: 'FORTRESS_MATRIX',\n status: 'FAIL',\n message: `Fortress Violations in ${path.split('/').pop()}`,\n details: securityResult.violations\n });\n } else {\n checks.push({\n check: 'FORTRESS_MATRIX',\n status: 'PASS',\n message: `Fortress Secured: ${path.split('/').pop()}`\n });\n }\n\n } catch (e: any) {\n checks.push({\n check: 'FORTRESS_MATRIX',\n status: 'WARN',\n message: `Failed to audit ${path}: ${e.message}`\n });\n }\n }\n }\n\n // 3. Run Sindre Performance Audit (Indexes & N+1)\n if (input.filePaths && input.filePaths.length > 0) {\n try {\n const perfResult = await analyzeDatabasePerformance(supabase, {\n projectId: input.projectId,\n filePaths: input.filePaths\n });\n\n const highSeverityIssues = perfResult.issues.filter(i => i.severity === 'HIGH');\n\n if (highSeverityIssues.length > 0) {\n isSoftLocked = true;\n checks.push({\n check: 'PERFORMANCE',\n status: 'FAIL',\n message: `Found ${highSeverityIssues.length} Critical Performance Issues (N+1 or Missing Indexes).`,\n details: highSeverityIssues\n });\n } else if (perfResult.issues.length > 0) {\n checks.push({\n check: 'PERFORMANCE',\n status: 'WARN',\n message: `Found ${perfResult.issues.length} non-critical performance hints.`,\n details: perfResult.issues\n });\n } else {\n checks.push({\n check: 'PERFORMANCE',\n status: 'PASS',\n message: 'No performance bottlenecks detected in scanned files.'\n });\n }\n } catch (e: any) {\n checks.push({\n check: 'PERFORMANCE',\n status: 'WARN',\n message: `Failed to execute Performance audit: ${e.message}`\n });\n }\n } else {\n checks.push({\n check: 'PERFORMANCE',\n status: 'WARN',\n message: 'Skipped performance scan (no file paths provided).'\n });\n }\n\n // 3. Construct Final Decision\n const summary = isSoftLocked\n ? `⛔ INTEGRITY GATE: SOFT LOCK ENGAGED. Critical issues found. Override required.`\n : `✅ INTEGRITY GATE: PASSED. System is secure and optimized.`;\n\n return {\n passed: !isSoftLocked,\n mode: isSoftLocked ? 'SOFT_LOCK' : 'OPEN',\n checks,\n summary\n };\n}\n","\nimport { SupabaseClient } from '@supabase/supabase-js';\nimport { IntegrityGateResponse, ReleaseManifest } from '../lib/types.js';\nimport { registry } from '../lib/tool-registry.js';\nimport { CompleteRoadmapTaskInputSchema } from '../lib/schemas.js';\n\n// ============================================\n// Tool Registration\n// ============================================\n\nregistry.register({\n name: 'complete_roadmap_task',\n description: `Finalizes a roadmap task. Generates a Release Manifest and triggers the Sovereign Harvesting protocol.`,\n schema: CompleteRoadmapTaskInputSchema,\n handler: async (args, context) => {\n const result = await completeRoadmapTask(\n context.supabase,\n args.projectId,\n args.summary,\n args.taskId,\n args.gitDiff,\n args.integrityGate\n );\n return { content: [{ type: 'text', text: result.message }] };\n }\n});\n\nexport interface CompleteRoadmapTaskResponse {\n success: boolean;\n taskId: string;\n message: string;\n}\n\nexport async function completeRoadmapTask(\n supabase: SupabaseClient,\n projectId: string,\n summary: string,\n taskId?: string,\n gitDiff?: string,\n integrityGate?: IntegrityGateResponse\n): Promise<CompleteRoadmapTaskResponse> {\n\n // 1. Identify the task\n let targetTaskId = taskId;\n\n if (!targetTaskId) {\n // Infer: Find the first IN_PROGRESS or ACTIVE task\n const { data: activeTask } = await supabase\n .from('roadmap_chunks')\n .select('id, title')\n .eq('project_id', projectId)\n .in('status', ['IN_PROGRESS', 'ACTIVE'])\n .order('step_number', { ascending: true })\n .limit(1)\n .single();\n\n if (activeTask) {\n targetTaskId = activeTask.id;\n } else {\n throw new Error('No active task found to complete. Please provide a specific taskId.');\n }\n }\n\n // 2. Generate Release Manifest if Integrity Gate info is present\n let metadata: any = {};\n if (integrityGate) {\n const securityCheck = integrityGate.checks.find(c => (c as any).check === 'SECURITY');\n const performanceCheck = integrityGate.checks.find(c => (c as any).check === 'PERFORMANCE');\n\n const manifest: ReleaseManifest = {\n executive_summary: summary,\n security_certificate: {\n status: securityCheck?.status === 'PASS' ? 'PASSED' : (securityCheck?.status === 'FAIL' ? 'FAILED' : 'WARNING'),\n message: securityCheck?.message || 'No security audit performed.',\n unsecured_tables: securityCheck?.details || []\n },\n performance_report: {\n status: performanceCheck?.status === 'PASS' ? 'PASSED' : (performanceCheck?.status === 'FAIL' ? 'FAILED' : 'WARNING'),\n message: performanceCheck?.message || 'No performance audit performed.',\n issues_found: performanceCheck?.details ? (Array.isArray(performanceCheck.details) ? performanceCheck.details.length : 0) : 0\n },\n timestamp: new Date().toISOString()\n };\n\n metadata.release_manifest = manifest;\n }\n\n // 3. Update the Task Status\n const { error: updateError } = await supabase\n .from('roadmap_chunks')\n .update({\n status: 'COMPLETED',\n completed_at: new Date().toISOString()\n })\n .eq('id', targetTaskId);\n\n if (updateError) {\n throw new Error(`Failed to update task status: ${updateError.message}`);\n }\n\n // 4. Create a Mission Report entry with the Manifest\n const { error: reportError } = await supabase\n .from('mission_reports')\n .insert({\n project_id: projectId,\n task_id: targetTaskId,\n human_summary: summary,\n technical_summary: gitDiff || 'Completed via IDE Direct Connection.',\n metadata: metadata\n });\n\n if (reportError) {\n console.warn('Failed to save mission report:', reportError.message);\n }\n\n // 5. SOVEREIGN HARVESTING: Trigger Reflection & Skill Extraction (Brynjar)\n // Fire and forget - don't block completion on harvesting\n try {\n const apiKey = process.env.RIGSTATE_API_KEY;\n // Default to localhost for development if not set\n const apiUrl = process.env.RIGSTATE_API_URL || 'http://localhost:3000';\n\n // In local dev, we might not have an API key set, so we allow it if it's localhost\n const isLocal = apiUrl.includes('localhost') || apiUrl.includes('127.0.0.1');\n\n if (apiKey || isLocal) {\n fetch(`${apiUrl}/api/v1/skills/harvest`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(apiKey ? { 'Authorization': `Bearer ${apiKey}` } : {})\n },\n body: JSON.stringify({\n projectId,\n taskId: targetTaskId,\n summary,\n technicalSummary: gitDiff || 'Completed via IDE Direct Connection.',\n metadata: metadata\n })\n }).catch(e => console.error('Harvesting failed (silent):', e));\n }\n } catch (e) {\n // Harvesting is non-critical, fail silently\n }\n\n return {\n success: true,\n taskId: targetTaskId!,\n message: integrityGate\n ? `Task completed! 🎖️ Release Manifest generated and attached.`\n : `Task completed successfully! Summary saved.`\n };\n}\n","import { SupabaseClient } from '@supabase/supabase-js';\nimport { SaveToProjectBrainInput, UpdateRoadmapStatusInput, AddRoadmapChunkInput } from '../lib/types.js';\nimport { registry } from '../lib/tool-registry.js';\nimport {\n SaveToProjectBrainInputSchema,\n UpdateRoadmapStatusInputSchema,\n AddRoadmapChunkInputSchema\n} from '../lib/schemas.js';\n\n// ============================================\n// Tool Registration\n// ============================================\n\nregistry.register({\n name: 'save_to_project_brain',\n description: `Maja's Tool: Persists knowledge, decisions, and lessons learned to the Project Brain.`,\n schema: SaveToProjectBrainInputSchema,\n handler: async (args, context) => {\n const result = await saveToProjectBrain(context.supabase, context.userId, args);\n return { content: [{ type: 'text', text: result.message }] };\n }\n});\n\nregistry.register({\n name: 'update_roadmap_status',\n description: `Kine's Tool: Updates the status of a roadmap task and notifies Scribe system.`,\n schema: UpdateRoadmapStatusInputSchema,\n handler: async (args, context) => {\n const result = await updateRoadmapStatus(context.supabase, context.userId, args);\n return { content: [{ type: 'text', text: result.message }] };\n }\n});\n\nregistry.register({\n name: 'add_roadmap_chunk',\n description: `Kine's Tool: Adds a new task/chunk to the roadmap for feature decomposition.`,\n schema: AddRoadmapChunkInputSchema,\n handler: async (args, context) => {\n const result = await addRoadmapChunk(context.supabase, context.userId, args);\n return { content: [{ type: 'text', text: result.message }] };\n }\n});\n\n/**\n * Maja's Tool: Save to Project Brain\n * Persists knowledge, decisions, and notes.\n */\nexport async function saveToProjectBrain(\n supabase: SupabaseClient,\n userId: string,\n input: SaveToProjectBrainInput\n) {\n const { projectId, title, content, category, tags } = input;\n\n // Confirm project access\n const { data: p, error: pErr } = await supabase.from('projects').select('id').eq('id', projectId).eq('owner_id', userId).single();\n if (pErr || !p) throw new Error('Access denied');\n\n const fullContent = `# ${title}\\n\\n${content}`;\n\n const { data, error } = await supabase\n .from('project_memories')\n .insert({\n project_id: projectId,\n content: fullContent,\n category: category.toLowerCase(),\n tags: tags,\n importance: (category === 'DECISION' || category === 'ARCHITECTURE') ? 9 : 5,\n is_active: true,\n source_type: 'chat_manual'\n })\n .select('id')\n .single();\n\n if (error) throw new Error(`Failed to save memory: ${error.message}`);\n\n return {\n success: true,\n memoryId: data.id,\n message: `✅ Saved [${category}] \"${title}\" to Project Brain.`\n };\n}\n\n/**\n * Kine's Tool: Update Roadmap Status\n * Updates task status and notifies Scribe system.\n */\nexport async function updateRoadmapStatus(\n supabase: SupabaseClient,\n userId: string,\n input: UpdateRoadmapStatusInput\n) {\n const { projectId, chunkId, status } = input;\n\n // Map status to DB enum: 'TODO' -> 'LOCKED' (Standard convention in Rigstate seems to be LOCKED/ACTIVE/COMPLETED)\n // If 'TODO' is meant to be 'PENDING', we check schema. Assuming 'LOCKED' is the backlog state.\n const dbStatus = status === 'TODO' ? 'LOCKED' : status === 'IN_PROGRESS' ? 'ACTIVE' : 'COMPLETED';\n\n const { error } = await supabase\n .from('roadmap_chunks')\n .update({ status: dbStatus })\n .eq('id', chunkId)\n .eq('project_id', projectId);\n\n if (error) throw new Error(`Update failed: ${error.message}`);\n\n let message = `Roadmap status updated to ${status} (${dbStatus}).`;\n\n if (status === 'COMPLETED') {\n // \"Notification\" to Gunhild\n message += \" 📢 Gunhild (Scribe) has been signaled. This completion will be reflected in the next report.\";\n } else if (status === 'IN_PROGRESS') {\n message += \" 🚀 Work started.\";\n }\n\n return { success: true, status: dbStatus, message };\n}\n\n/**\n * Kine's Tool: Add Roadmap Chunk\n * Decomposes features into actionable chunks.\n */\nexport async function addRoadmapChunk(\n supabase: SupabaseClient,\n userId: string,\n input: AddRoadmapChunkInput\n) {\n const { projectId, title, description, priority } = input;\n\n // Get max step number\n const { data: maxStep } = await supabase\n .from('roadmap_chunks')\n .select('step_number')\n .eq('project_id', projectId)\n .order('step_number', { ascending: false })\n .limit(1)\n .single();\n\n const nextStepNum = (maxStep?.step_number || 0) + 1;\n\n const { data, error } = await supabase\n .from('roadmap_chunks')\n .insert({\n project_id: projectId,\n title: title,\n description: description || '',\n status: 'LOCKED', // Default state\n priority: priority,\n step_number: nextStepNum,\n sprint_focus: input.featureId ? `Feature: ${input.featureId}` : null\n })\n .select('id')\n .single();\n\n if (error) throw new Error(`Failed to add chunk: ${error.message}`);\n\n return {\n success: true,\n chunkId: data.id,\n stepNumber: nextStepNum,\n message: `✅ Added new roadmap chunk: \"${title}\" (Step ${nextStepNum}).`\n };\n}\n","import { promises as fs } from 'fs';\nimport * as path from 'path';\nimport { AnalyzeDependencyGraphInput } from '../lib/types.js';\nimport { registry } from '../lib/tool-registry.js';\nimport { AnalyzeDependencyGraphInputSchema } from '../lib/schemas.js';\n\n// ============================================\n// Tool Registration\n// ============================================\n\nregistry.register({\n name: 'analyze_dependency_graph',\n description: `Einar's Tool: Architecture Integrity Scanner. Scans the codebase for circular dependencies and structural violations.`,\n schema: AnalyzeDependencyGraphInputSchema,\n handler: async (args, context) => {\n const result = await analyzeDependencyGraph(args);\n return { content: [{ type: 'text', text: (result as any).summary || 'Scan complete' }] };\n }\n});\n\n/**\n * Einar's Tool: Architecture Integrity Scanner\n * Scans the codebase for circular dependencies and structural violations.\n */\nexport async function analyzeDependencyGraph(input: AnalyzeDependencyGraphInput) {\n // Determine root. Input path is relative to CWD usually.\n // If input.path is absolute, use it. Otherwise resolve from CWD.\n const searchPath = path.isAbsolute(input.path)\n ? input.path\n : path.resolve(process.cwd(), input.path);\n\n try {\n await fs.access(searchPath);\n } catch {\n return {\n error: `Directory not found: ${searchPath}. Ensure you are running the MCP server in the project root or provide an absolute path.`\n };\n }\n\n // 1. Scan files\n const allFiles = await getAllFiles(searchPath);\n const tsFiles = allFiles.filter(f => /\\.(ts|tsx|js|jsx)$/.test(f) && !f.includes('node_modules') && !f.includes('.next') && !f.includes('dist'));\n\n // 2. Build Graph\n const graph: Record<string, string[]> = {};\n const fileSet = new Set(tsFiles);\n\n for (const file of tsFiles) {\n const content = await fs.readFile(file, 'utf-8');\n const imports = extractImports(content);\n\n const validDeps: string[] = [];\n\n for (const imp of imports) {\n const resolved = resolveImport(file, imp, searchPath);\n if (resolved && fileSet.has(resolved)) {\n validDeps.push(resolved);\n }\n }\n\n // Use relative paths for the graph to make it readable\n const relFile = path.relative(searchPath, file);\n graph[relFile] = validDeps.map(d => path.relative(searchPath, d));\n }\n\n // 3. Detect Cycles\n const cycles = detectCycles(graph);\n\n return {\n timestamp: new Date().toISOString(),\n analyzedPath: searchPath,\n metrics: {\n totalFiles: tsFiles.length,\n circularDependencies: cycles.length\n },\n cycles: cycles,\n status: cycles.length > 0 ? 'VIOLATION' : 'PASS',\n summary: cycles.length > 0\n ? `FAILED. Detected ${cycles.length} circular dependencies. These must be resolved to maintain architectural integrity.`\n : `PASSED. No circular dependencies detected in ${tsFiles.length} files.`\n };\n}\n\n// --- Helpers ---\n\nasync function getAllFiles(dir: string): Promise<string[]> {\n const entries = await fs.readdir(dir, { withFileTypes: true });\n const files = await Promise.all(entries.map(async (entry) => {\n const res = path.resolve(dir, entry.name);\n return entry.isDirectory() ? getAllFiles(res) : res;\n }));\n return files.flat();\n}\n\n/**\n * Simple regex extraction of import statements.\n * Matches: import ... from '...'\n * Matches: import '...'\n * Matches: export ... from '...'\n */\nfunction extractImports(content: string): string[] {\n const regex = /from\\s+['\"]([^'\"]+)['\"]|import\\s+['\"]([^'\"]+)['\"]/g;\n const imports: string[] = [];\n let match;\n while ((match = regex.exec(content)) !== null) {\n // match[1] is 'from \"...\"; match[2] is import \"...\";\n imports.push(match[1] || match[2]);\n }\n return imports;\n}\n\n/**\n * Naive resolver.\n * Handles:\n * - Relative: ./foo, ../bar\n * - Alias: @/ -> searchPath/ (Assumes Next.js style)\n * - Extensions: tries .ts, .tsx, .js, index.ts, etc.\n */\nfunction resolveImport(importer: string, importPath: string, root: string): string | null {\n if (!importPath.startsWith('.') && !importPath.startsWith('@/')) {\n return null; // Ignore node_modules\n }\n\n let searchDir = path.dirname(importer);\n let target = importPath;\n\n if (importPath.startsWith('@/')) {\n target = importPath.replace('@/', '');\n searchDir = root; // Assume root is where @/ points to (src or project root)\n // Adjust for src if root includes src, ensuring we don't double dip? \n // Actually, usually @/ maps to src/ or root. We'll try relative to 'root'.\n }\n\n const startPath = path.resolve(searchDir, target);\n\n // Try extensions\n const extensions = ['.ts', '.tsx', '.js', '.jsx', '/index.ts', '/index.tsx', '/index.js', ''];\n for (const ext of extensions) {\n const candidate = startPath + ext;\n if (require('fs').existsSync(candidate) && !require('fs').statSync(candidate).isDirectory()) {\n return candidate;\n }\n }\n\n return null;\n}\n\nfunction detectCycles(graph: Record<string, string[]>): string[][] {\n const visited = new Set<string>();\n const recursionStack = new Set<string>();\n const cycles: string[][] = [];\n\n function dfs(node: string, path: string[]) {\n visited.add(node);\n recursionStack.add(node);\n path.push(node);\n\n const deps = graph[node] || [];\n for (const dep of deps) {\n if (!visited.has(dep)) {\n dfs(dep, path);\n } else if (recursionStack.has(dep)) {\n // Cycle detected\n const cycleStart = path.indexOf(dep);\n if (cycleStart !== -1) {\n cycles.push([...path.slice(cycleStart), dep]);\n }\n }\n }\n\n recursionStack.delete(node);\n path.pop();\n }\n\n for (const node of Object.keys(graph)) {\n if (!visited.has(node)) {\n dfs(node, []);\n }\n }\n\n return cycles;\n}\n","import { CallToolRequestSchema, McpError, ErrorCode } from '@modelcontextprotocol/sdk/types.js';\nimport { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport { AuthContext } from './types.js';\nimport { registry } from '../lib/tool-registry.js';\nimport {\n GetProjectContextInputSchema,\n AuditSecurityIntegrityInputSchema\n} from '../lib/types.js';\nimport { getProjectContext } from '../tools/get-project-context.js';\nimport { auditSecurityIntegrity } from '../tools/security-tools.js';\nimport { watcherState } from './telemetry.js';\n\nexport function setupToolHandlers(server: Server, authContext: AuthContext) {\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n const { name } = request.params;\n const args = request.params.arguments as any;\n\n // 1. Check Registry (Modern Tools)\n try {\n return await registry.callTool(name, args, {\n supabase: authContext.supabase,\n userId: authContext.userId\n });\n } catch (e: any) {\n if (!e.message?.includes(`Tool '${name}' not found`)) {\n throw new McpError(ErrorCode.InvalidParams, e.message);\n }\n }\n\n // 2. Legacy Switch (Modularized)\n switch (name) {\n case 'get_agent_status': {\n return { content: [{ type: 'text', text: JSON.stringify(watcherState, null, 2) }] };\n }\n\n default:\n throw new McpError(ErrorCode.MethodNotFound, `Unknown tool: ${name}`);\n }\n });\n}\n","\nimport { SupabaseClient } from '@supabase/supabase-js';\n\n/**\n * The Scribe's core adapter for fetching its own persona from Prompt CMS.\n */\nexport async function getScribePersona(supabase: SupabaseClient) {\n const { data: persona, error } = await supabase\n .from('agent_personas')\n .select('*')\n .eq('slug', 'the-scribe')\n .single();\n\n if (error || !persona) {\n return {\n display_name: 'The Scribe',\n job_title: 'Technical Documentation Lead',\n content: 'You are The Scribe, an expert in technical manifest generation and investor-ready reporting.'\n };\n }\n\n return persona;\n}\n\n/**\n * Calculates real-world metrics for the Scribe to report on.\n * Focuses on Velocity, Quality, and Risk.\n * IMPORTANT: Excludes is_legacy=true items from velocity calculations\n * to prevent historical imports from skewing development metrics.\n */\nexport async function calculateScribeMetrics(supabase: SupabaseClient, projectId: string) {\n // A: Velocity - Average time for agent_bridge tasks in the last 7 days\n const { data: recentTasks } = await supabase\n .from('agent_bridge')\n .select('created_at, updated_at')\n .eq('project_id', projectId)\n .eq('status', 'COMPLETED')\n .gte('created_at', new Date(Date.now() - 7 * 24 * 60 * 60 * 1000).toISOString());\n\n let avgTimeMs = 0;\n if (recentTasks && recentTasks.length > 0) {\n const deltas = recentTasks.map(t =>\n new Date(t.updated_at).getTime() - new Date(t.created_at).getTime()\n );\n avgTimeMs = deltas.reduce((a, b) => a + b, 0) / deltas.length;\n }\n\n const velocityStr = avgTimeMs > 0\n ? `${(avgTimeMs / 1000).toFixed(1)}s avg execution time`\n : \"No execution history\";\n\n // B: Active Tasks Completed (EXCLUDES legacy items)\n const { count: activeTasksCompleted } = await supabase\n .from('roadmap_chunks')\n .select('*', { count: 'exact', head: true })\n .eq('project_id', projectId)\n .eq('status', 'COMPLETED')\n .or('is_legacy.is.null,is_legacy.eq.false');\n\n // C: Legacy Foundations Count (for separate reporting)\n const { count: legacyCount } = await supabase\n .from('roadmap_chunks')\n .select('*', { count: 'exact', head: true })\n .eq('project_id', projectId)\n .eq('is_legacy', true);\n\n // D: Quality - Fetch from intelligence_trends\n const { data: trends } = await supabase\n .from('intelligence_trends')\n .select('correction_count')\n .order('week_start', { ascending: false })\n .limit(2);\n\n let trendDir = 'stable';\n if (trends && trends.length === 2) {\n const latest = trends[0].correction_count;\n const prev = trends[1].correction_count;\n if (latest < prev) trendDir = 'improving';\n else if (latest > prev) trendDir = 'declining';\n }\n const qualityStr = `Quality trend is ${trendDir}` +\n (legacyCount && legacyCount > 0 ? `. Built on ${legacyCount} established foundations.` : '');\n\n // E: Risk - Count PING/CHECK rows\n const { count: riskCount } = await supabase\n .from('agent_bridge')\n .select('*', { count: 'exact', head: true })\n .eq('project_id', projectId)\n .or('proposal.ilike.%PING%,proposal.ilike.%CHECK%,summary.ilike.%PING%,summary.ilike.%CHECK%');\n\n // F: Enhanced Risk - Check for RLS\n const { count: rlsCount } = await supabase.from('pg_policies').select('*', { count: 'exact', head: true }).eq('schemaname', 'public');\n\n const riskMitigation = (riskCount || 0) > 0 || (rlsCount || 0) > 0\n ? `Security posture reinforced by ${rlsCount || 0} RLS policies and ${riskCount || 0} active guardian pings. All access is audited.`\n : \"Security controls inactive. Immediate RLS audit recommended.\";\n\n return {\n velocity: velocityStr,\n qualityTrend: qualityStr,\n riskScore: riskCount || 0,\n riskMitigation,\n activeTasksCompleted: activeTasksCompleted || 0,\n legacyFoundations: legacyCount || 0\n };\n}\n\n\n/**\n * Interpolates common variables into the Scribe's prompt.\n */\nexport function interpolateScribePrompt(\n basePrompt: string,\n vars: { projectName: string; velocity?: string; quality?: string; riskMitigation?: string }\n): string {\n let result = basePrompt;\n result = result.replace(/{{project_name}}/g, vars.projectName);\n if (vars.velocity) result = result.replace(/{{velocity}}/g, vars.velocity);\n if (vars.quality) result = result.replace(/{{quality}}/g, vars.quality);\n if (vars.riskMitigation) result = result.replace(/{{risk_mitigation}}/g, vars.riskMitigation);\n return result;\n}\n","\nimport { SupabaseClient } from '@supabase/supabase-js';\nimport { getScribePersona, interpolateScribePrompt, calculateScribeMetrics } from '../agents/the-scribe.js';\n\nexport async function generateProfessionalPdf(\n supabase: SupabaseClient,\n userId: string,\n projectId: string,\n reportType: 'SYSTEM_MANIFEST' | 'INVESTOR_REPORT'\n) {\n console.error(`🖋️ The Scribe is preparing a ${reportType} briefing for project ${projectId}...`);\n\n // 1. Fetch persona from Prompt CMS (via Scribe Adapter)\n const persona = await getScribePersona(supabase);\n\n // 2. Fetch Project Metadata (expanded)\n const { data: project } = await supabase\n .from('projects')\n .select('name, description, project_type, detected_stack')\n .eq('id', projectId)\n .single();\n\n const projectName = project?.name || 'Rigstate Project';\n const projectDescription = project?.description || 'A cutting-edge software project built with modern architecture.';\n const projectType = project?.project_type || 'Web Application';\n const detectedStack = project?.detected_stack || {};\n\n // 3. Fetch COMPREHENSIVE Real Context & Metrics\n const [\n metrics,\n dnaStatsResponse,\n recentDecisions,\n roadmapData,\n councilSessions,\n tableList\n ] = await Promise.all([\n calculateScribeMetrics(supabase, projectId),\n supabase.rpc('get_project_dna_stats', { p_project_id: projectId }),\n supabase.from('project_memories')\n .select('summary, category, created_at')\n .eq('project_id', projectId)\n .eq('category', 'decision')\n .order('created_at', { ascending: false })\n .limit(5),\n supabase.from('roadmap_chunks')\n .select('title, status, priority')\n .eq('project_id', projectId)\n .order('priority', { ascending: true }),\n supabase.from('council_sessions')\n .select('executive_summary, created_at')\n .eq('project_id', projectId)\n .order('created_at', { ascending: false })\n .limit(2),\n supabase.rpc('get_public_tables_list')\n ]);\n\n const dnaStats = dnaStatsResponse.data || { total_tables: 0, rls_tables: 0, rls_policies: 0 };\n const tables = tableList.data || [];\n\n // 4. Process Roadmap Data - Separate legacy from active\n const roadmapSteps = roadmapData.data || [];\n const allCompletedSteps = roadmapSteps.filter(s => s.status === 'COMPLETED');\n const legacySteps = roadmapSteps.filter((s: any) => s.is_legacy === true);\n const activeCompletedSteps = allCompletedSteps.filter((s: any) => s.is_legacy !== true);\n const activeStep = roadmapSteps.find(s => s.status === 'ACTIVE');\n const lockedSteps = roadmapSteps.filter(s => s.status === 'LOCKED');\n\n // Progress based on ALL steps (legacy count towards completion but are clearly marked)\n const totalNonLegacy = roadmapSteps.filter((s: any) => s.is_legacy !== true).length;\n const progress = totalNonLegacy > 0 ? Math.round((activeCompletedSteps.length / totalNonLegacy) * 100) : 0;\n\n // 5. Build Tech Stack Summary\n const deps = detectedStack.dependencies || {};\n const devDeps = detectedStack.devDependencies || {};\n const allDeps = { ...deps, ...devDeps };\n const techStackItems: string[] = [];\n\n if (allDeps['next']) techStackItems.push(`Next.js ${allDeps['next']}`);\n if (allDeps['react']) techStackItems.push(`React ${allDeps['react']}`);\n if (allDeps['@supabase/supabase-js']) techStackItems.push('Supabase');\n if (allDeps['tailwindcss']) techStackItems.push('Tailwind CSS');\n if (allDeps['typescript']) techStackItems.push('TypeScript');\n if (allDeps['zod']) techStackItems.push('Zod Validation');\n if (allDeps['@react-pdf/renderer']) techStackItems.push('React-PDF');\n if (allDeps['sonner']) techStackItems.push('Sonner Toasts');\n\n const techStackSummary = techStackItems.length > 0\n ? techStackItems.join(' • ')\n : 'Stack detection pending. Run repository indexing to populate.';\n\n // 6. Build ADRs Summary\n const adrList = recentDecisions.data?.map(d => `• ${d.summary}`) || [];\n const adrContent = adrList.length > 0\n ? adrList.join('\\n')\n : '• No architectural decisions recorded yet. Use the Council or save decisions via chat.';\n\n // 7. Build Roadmap Details - Separate legacy from active\n const legacyTitles = legacySteps.length > 0\n ? `Established Foundations (${legacySteps.length}):\\n${legacySteps.map((s: any) => `📚 ${s.title}`).join('\\n')}`\n : '';\n const activeTitles = activeCompletedSteps.map((s: any) => `✓ ${s.title}`).join('\\n');\n const activeTitle = activeStep ? `→ IN PROGRESS: ${activeStep.title}` : '';\n const nextUpTitles = lockedSteps.slice(0, 3).map((s: any) => `○ ${s.title}`).join('\\n');\n\n const roadmapDetails = [\n legacyTitles,\n activeTitles ? `\\nRecent Completions:\\n${activeTitles}` : '',\n activeTitle,\n nextUpTitles ? `\\nNext Up:\\n${nextUpTitles}` : ''\n ].filter(Boolean).join('\\n');\n\n\n // 8. Build Council Insights\n const councilInsights = councilSessions.data?.map(s => s.executive_summary).filter(Boolean).slice(0, 2) || [];\n const councilSummary = councilInsights.length > 0\n ? councilInsights.map(i => `• ${i}`).join('\\n')\n : 'No council sessions recorded yet.';\n\n // 9. Build Security Analysis (Comprehensive)\n const securedTables = dnaStats.rls_tables || 0;\n const totalTables = dnaStats.total_tables || tables.length || 0;\n const rlsPolicies = dnaStats.rls_policies || 0;\n const securityScore = totalTables > 0 ? Math.round((securedTables / totalTables) * 100) : 0;\n\n const securityAnalysis = `\nSecurity Score: ${securityScore}% of public tables secured with RLS.\n• Total Public Tables: ${totalTables}\n• Tables with RLS Enabled: ${securedTables}\n• Active RLS Policies: ${rlsPolicies}\n• Guardian Pings (Monitoring): ${metrics.riskScore} detected\n\n${securityScore >= 90 ? '✓ EXCELLENT: All critical tables are protected.' :\n securityScore >= 70 ? '⚠ STABLE: Most tables protected. Review remaining exposures.' :\n '⛔ AT RISK: Immediate RLS audit recommended.'}\n`.trim();\n\n // 10. Interpolate variables\n const interpolatedPrompt = interpolateScribePrompt(persona.content, {\n projectName,\n velocity: metrics.velocity,\n quality: metrics.qualityTrend,\n riskMitigation: metrics.riskMitigation\n });\n\n // 11. Structure MANIFEST report data\n const manifestData = {\n type: 'MANIFEST',\n projectName: projectName,\n sections: [\n {\n title: 'Project Overview',\n content: `${projectDescription}\\n\\nProject Type: ${projectType}\\nTech Stack: ${techStackSummary}`\n },\n {\n title: 'Codebase DNA (Real-time Scan)',\n content: `System consists of ${totalTables} tables with ${rlsPolicies} active RLS security policies.\\n\\nDatabase integrity is rated as ${securityScore >= 90 ? 'EXCELLENT' : securityScore >= 70 ? 'STABLE' : 'NEEDS ATTENTION'}.\\n\\nKey Tables Detected:\\n${tables.slice(0, 10).map((t: any) => `• ${t.table_name}`).join('\\n') || '• Run database scan to populate'}`\n },\n {\n title: 'Architectural Decisions (ADRs)',\n content: adrContent\n },\n {\n title: 'Roadmap Execution',\n content: `Development Progress: ${progress}% (${activeCompletedSteps.length} active / ${legacySteps.length} legacy foundations)\\n\\nVelocity: ${metrics.velocity}\\n\\n${roadmapDetails || 'No roadmap steps configured yet.'}`\n },\n {\n title: 'Council Insights',\n content: councilSummary\n },\n {\n title: 'Security & Risk Assessment',\n content: securityAnalysis\n },\n {\n title: 'Quality & Compliance',\n content: `Quality Trend: ${metrics.qualityTrend}\\n\\nGuard Clauses:\\n• Strict Type Checks (No Any)\\n• Mandatory Supabase RLS Enforcement\\n• Line Limit Enforcement: TS (400) / TSX (250)\\n• All API routes require authentication\\n• CORS policies enforced on public endpoints`\n }\n ],\n agent: persona.display_name,\n job_title: persona.job_title,\n metrics: {\n velocity: metrics.velocity,\n qualityTrend: metrics.qualityTrend,\n progress: `${progress}%`,\n securityScore: `${securityScore}%`,\n totalTables: totalTables,\n rlsPolicies: rlsPolicies\n }\n };\n\n // 12. Structure INVESTOR report data\n const investorData = {\n type: 'INVESTOR',\n projectName: projectName,\n data: {\n velocity: metrics.velocity,\n healthScore: Math.min(100, 70 + (activeCompletedSteps.length * 3) + (legacySteps.length * 2) + (progress / 5) + (securityScore / 10)),\n qualityTrend: metrics.qualityTrend,\n roadmapProgress: `${progress}% (${activeCompletedSteps.length} completed, ${legacySteps.length} established foundations)`,\n projectType: projectType,\n techStack: techStackSummary,\n keyAchievements: [\n ...activeCompletedSteps.slice(0, 3).map((s: any) => `Completed: ${s.title}`),\n ...(legacySteps.length > 0 ? [`Built on ${legacySteps.length} established foundations`] : []),\n ...(recentDecisions.data?.slice(0, 2).map((d: any) => d.summary) || [])\n ].slice(0, 5),\n currentFocus: activeStep?.title || 'Planning next phase',\n upcomingMilestones: lockedSteps.slice(0, 3).map(s => s.title),\n riskMitigation: metrics.riskMitigation,\n securityPosture: {\n score: `${securityScore}%`,\n status: securityScore >= 90 ? 'Excellent' : securityScore >= 70 ? 'Stable' : 'Needs Attention',\n rlsPolicies: rlsPolicies,\n protectedTables: securedTables,\n totalTables: totalTables\n },\n councilInsights: councilInsights.slice(0, 2)\n },\n agent: persona.display_name,\n job_title: persona.job_title\n };\n\n const reportData = reportType === 'SYSTEM_MANIFEST' ? manifestData : investorData;\n\n // 13. Return data to caller\n return {\n success: true,\n message: `${reportType} briefing is ready.`,\n data: reportData,\n debug_prompt_snippet: interpolatedPrompt.substring(0, 500)\n };\n}\n","import { SupabaseClient } from '@supabase/supabase-js';\nimport { WatcherState } from './types.js';\nimport { generateProfessionalPdf } from '../tools/generate-professional-pdf.js';\n\nexport let watcherState: WatcherState = {\n isRunning: false,\n lastCheck: null,\n tasksFound: 0,\n projectId: null\n};\n\nexport async function startFrankWatcher(supabase: SupabaseClient, userId: string) {\n if (watcherState.isRunning) return;\n watcherState.isRunning = true;\n console.error(`🤖 Frank Watcher started for user ${userId}`);\n\n const checkTasks = async () => {\n try {\n watcherState.lastCheck = new Date().toISOString();\n\n const { data: tasks, error } = await supabase\n .from('agent_bridge')\n .select('*')\n .in('status', ['PENDING', 'APPROVED'])\n .order('created_at', { ascending: true })\n .limit(1);\n\n if (error) return;\n\n if (tasks && tasks.length > 0) {\n const task = tasks[0];\n watcherState.tasksFound++;\n\n // Heartbeat Logic\n if (task.proposal?.startsWith('ping') || (task.task_id === null && !task.proposal?.startsWith('report'))) {\n console.error(`\\n⚡ HEARTBEAT: Frank received REAL-TIME PING for project ${task.project_id}. Response: PONG`);\n await supabase.from('agent_bridge').update({\n status: 'COMPLETED',\n summary: 'Pong! Frank is active and listening.',\n updated_at: new Date().toISOString()\n }).eq('id', task.id);\n return;\n }\n\n // Report Generation Logic\n if (task.proposal?.startsWith('report')) {\n const parts = task.proposal.split(':');\n const signalType = parts[1];\n const reportType = signalType === 'MANIFEST' ? 'SYSTEM_MANIFEST' : 'INVESTOR_REPORT';\n console.error(`\\n📄 Frank is generating ${reportType} report...`);\n\n try {\n const result = await generateProfessionalPdf(supabase, userId, task.project_id, reportType);\n await supabase.from('agent_bridge').update({\n status: 'COMPLETED',\n summary: `Report generated: ${reportType}.`,\n proposal: JSON.stringify(result.data),\n updated_at: new Date().toISOString()\n }).eq('id', task.id);\n } catch (genError: any) {\n await supabase.from('agent_bridge').update({\n status: 'FAILED',\n summary: `Generation failed: ${genError.message}`,\n updated_at: new Date().toISOString()\n }).eq('id', task.id);\n }\n return;\n }\n\n // Execution Logic\n if (task.status === 'APPROVED') {\n console.error(`\\n🏗️ Worker: EXECUTING approved task: [${task.id}]`);\n await supabase.from('agent_bridge').update({ status: 'EXECUTING', updated_at: new Date().toISOString() }).eq('id', task.id);\n\n await new Promise(resolve => setTimeout(resolve, 2000));\n\n const taskTitle = (task.roadmap_chunks as any)?.title || 'manual objective';\n const technicalSummary = `Processed ${task.task_id || 'manual task'}. Applied architectural alignment.`;\n const humanSummary = `Mission Accomplished for \"${taskTitle}\". 🚀`;\n\n await supabase.from('mission_reports').insert({\n bridge_id: task.id,\n project_id: task.project_id,\n task_id: task.task_id,\n human_summary: humanSummary,\n technical_summary: technicalSummary\n });\n\n await supabase.from('agent_bridge').update({\n status: 'COMPLETED',\n summary: humanSummary,\n execution_summary: technicalSummary,\n updated_at: new Date().toISOString(),\n completed_at: new Date().toISOString()\n }).eq('id', task.id);\n\n if (task.task_id) {\n await supabase.from('roadmap_chunks').update({ status: 'COMPLETED', completed_at: new Date().toISOString() }).eq('id', task.task_id);\n }\n return;\n }\n\n // Proposal Analysis Logic\n const taskTitle = (task.roadmap_chunks as any)?.title || '';\n let proposal = `Frank (Auto-Mode) has analyzed \"${taskTitle}\". Ready to proceed.`;\n\n await supabase.from('agent_bridge').update({\n status: 'AWAITING_APPROVAL',\n proposal,\n updated_at: new Date().toISOString()\n }).eq('id', task.id);\n }\n } catch (e) { }\n };\n\n const channel = supabase.channel('frank-watcher').on('postgres_changes', { event: '*', schema: 'public', table: 'agent_bridge' }, (payload: any) => {\n if (payload.new.status === 'PENDING' || payload.new.status === 'APPROVED') checkTasks();\n }).subscribe();\n\n setInterval(checkTasks, 5000);\n checkTasks();\n}\n"],"mappings":"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","names":["z","z","z","z","z","z","z","path","fs","fs","path","fs","path","resolve","taskTitle"]}