@mtaap/mcp 0.2.13 → 0.5.1

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/server.ts","../src/index.ts","../package.json","../src/version.ts","../../../packages/core/dist/constants/enums.js","../../../packages/core/dist/constants/state-machine.js","../../../packages/core/dist/config/deployment.js","../../../packages/core/dist/version.js","../../../packages/core/dist/config/index.js","../../../packages/core/dist/types/index.js","../../../packages/core/dist/validation/index.js","../../../packages/core/dist/logging/metrics.js","../../../packages/core/dist/logging/performance-monitor.js","../../../packages/core/dist/logging/error-tracker.js","../src/api-client.ts","../src/permissions.ts","../src/auth.ts"],"sourcesContent":["#!/usr/bin/env node\n\n/**\n * Collab MCP HTTP Server\n *\n * HTTP server using StreamableHTTPServerTransport for remote MCP connections.\n * Enables Claude Desktop, Claude.ai, and Claude Mobile to connect directly\n * without requiring local installation.\n *\n * Uses the Streamable HTTP transport (2025-03-26 spec) which is the\n * recommended transport for remote MCP servers.\n */\n\nimport express from \"express\";\nimport { randomUUID } from \"node:crypto\";\nimport { StreamableHTTPServerTransport } from \"@modelcontextprotocol/sdk/server/streamableHttp.js\";\nimport { isInitializeRequest } from \"@modelcontextprotocol/sdk/types.js\";\nimport { initializeMCPServer, MCPApiClient, AuthContext, VERSION } from \"./index.js\";\nimport { createAuthMiddleware, AuthenticatedRequest } from \"./auth.js\";\n\nconst DEFAULT_PORT = 3001;\n\n/**\n * Session data stored per connection\n */\ninterface SessionData {\n transport: StreamableHTTPServerTransport;\n apiClient: MCPApiClient;\n authContext: AuthContext;\n createdAt: Date;\n lastAccessedAt: Date;\n}\n\n/**\n * In-memory session store\n * Maps session ID to session data\n */\nconst sessions: Map<string, SessionData> = new Map();\n\n/**\n * Session timeout configuration\n * Sessions inactive for longer than this duration will be cleaned up\n */\nconst SESSION_TIMEOUT_MS = 30 * 60 * 1000; // 30 minutes\nconst SESSION_CLEANUP_INTERVAL_MS = 60 * 1000; // 1 minute\n\n/**\n * Interval ID for session cleanup, stored for proper cleanup on shutdown\n */\nlet cleanupIntervalId: NodeJS.Timeout | null = null;\n\n/**\n * Periodic session cleanup to prevent memory leaks\n */\nfunction startSessionCleanup(): void {\n cleanupIntervalId = setInterval(() => {\n const now = Date.now();\n let cleanedCount = 0;\n\n for (const [id, session] of sessions.entries()) {\n if (now - session.lastAccessedAt.getTime() > SESSION_TIMEOUT_MS) {\n console.error(`[collab-mcp-server] Session timed out: ${id}`);\n session.transport.close();\n sessions.delete(id);\n cleanedCount++;\n }\n }\n\n if (cleanedCount > 0) {\n console.error(`[collab-mcp-server] Cleaned up ${cleanedCount} expired session(s)`);\n }\n }, SESSION_CLEANUP_INTERVAL_MS);\n}\n\n/**\n * Helper to get session ID from request headers\n * Handles both string and string[] header values\n */\nfunction getSessionIdHeader(req: express.Request): string | undefined {\n const header = req.headers[\"mcp-session-id\"];\n if (Array.isArray(header)) {\n return header[0];\n }\n return header;\n}\n\n/**\n * Create and start the HTTP MCP server\n */\nasync function createHTTPServer(): Promise<void> {\n const port = parseInt(process.env.PORT || String(DEFAULT_PORT), 10);\n const baseUrl = process.env.COLLAB_BASE_URL;\n\n if (!baseUrl) {\n console.error(\"[collab-mcp-server] Error: COLLAB_BASE_URL environment variable is required\");\n console.error(\"\\nRequired environment variables:\");\n console.error(\" COLLAB_BASE_URL Collab webapp URL (e.g., https://collab.mtaap.de)\");\n console.error(\" PORT Server port (default: 3001)\");\n console.error(\"\\nClients must provide X-API-Key header with their Collab API key.\");\n process.exit(1);\n }\n\n // Validate URL format\n try {\n new URL(baseUrl);\n } catch {\n console.error(`[collab-mcp-server] Error: COLLAB_BASE_URL is not a valid URL: ${baseUrl}`);\n process.exit(1);\n }\n\n const app = express();\n app.use(express.json());\n\n // Health check endpoint (no auth required)\n // Exposed at /mcp/health to match nginx routing for production deployments\n app.get(\"/mcp/health\", (_req, res) => {\n res.json({\n status: \"ok\",\n version: VERSION,\n activeSessions: sessions.size,\n timestamp: new Date().toISOString(),\n });\n });\n\n // Auth middleware for MCP endpoints\n const authMiddleware = createAuthMiddleware(baseUrl);\n\n /**\n * POST /mcp - Handle MCP requests\n *\n * - If no session ID header: must be an initialize request to create new session\n * - If session ID header present: route to existing session's transport\n */\n app.post(\"/mcp\", authMiddleware, async (req, res) => {\n const authReq = req as AuthenticatedRequest;\n const sessionId = getSessionIdHeader(req);\n\n let sessionData: SessionData | undefined;\n\n if (sessionId) {\n // Reuse existing session\n sessionData = sessions.get(sessionId);\n if (!sessionData) {\n res.status(400).json({\n jsonrpc: \"2.0\",\n error: {\n code: -32000,\n message: \"Invalid or expired session\",\n },\n id: null,\n });\n return;\n }\n // Update last accessed time\n sessionData.lastAccessedAt = new Date();\n } else if (isInitializeRequest(req.body)) {\n // New session initialization\n const now = new Date();\n const transport = new StreamableHTTPServerTransport({\n sessionIdGenerator: () => randomUUID(),\n onsessioninitialized: (id) => {\n sessions.set(id, {\n transport,\n apiClient: authReq.apiClient,\n authContext: authReq.authContext,\n createdAt: now,\n lastAccessedAt: now,\n });\n console.error(`[collab-mcp-server] Session initialized: ${id} (user: ${authReq.authContext.userEmail})`);\n },\n onsessionclosed: (id) => {\n sessions.delete(id);\n console.error(`[collab-mcp-server] Session closed: ${id}`);\n },\n });\n\n // Handle transport close\n transport.onclose = () => {\n if (transport.sessionId) {\n sessions.delete(transport.sessionId);\n console.error(`[collab-mcp-server] Transport closed for session: ${transport.sessionId}`);\n }\n };\n\n // Initialize MCP server with this user's context and connect to transport\n const server = initializeMCPServer(authReq.apiClient, authReq.authContext);\n await server.connect(transport);\n\n sessionData = {\n transport,\n apiClient: authReq.apiClient,\n authContext: authReq.authContext,\n createdAt: now,\n lastAccessedAt: now,\n };\n } else {\n // Not an initialize request and no session - reject\n res.status(400).json({\n jsonrpc: \"2.0\",\n error: {\n code: -32000,\n message: \"No session ID provided and request is not an initialize request\",\n },\n id: null,\n });\n return;\n }\n\n // Handle the request through the transport\n await sessionData.transport.handleRequest(req, res, req.body);\n });\n\n /**\n * GET /mcp - SSE stream for server notifications\n *\n * Requires mcp-session-id header to identify the session.\n */\n app.get(\"/mcp\", authMiddleware, async (req, res) => {\n const sessionId = getSessionIdHeader(req);\n\n if (!sessionId) {\n res.status(400).json({\n jsonrpc: \"2.0\",\n error: {\n code: -32000,\n message: \"mcp-session-id header is required for SSE stream\",\n },\n id: null,\n });\n return;\n }\n\n const sessionData = sessions.get(sessionId);\n if (!sessionData) {\n res.status(400).json({\n jsonrpc: \"2.0\",\n error: {\n code: -32000,\n message: \"Invalid or expired session\",\n },\n id: null,\n });\n return;\n }\n\n // Update last accessed time\n sessionData.lastAccessedAt = new Date();\n\n // Handle the SSE stream through the transport\n await sessionData.transport.handleRequest(req, res);\n });\n\n /**\n * DELETE /mcp - Terminate a session\n *\n * Requires mcp-session-id header to identify the session to terminate.\n */\n app.delete(\"/mcp\", authMiddleware, async (req, res) => {\n const sessionId = getSessionIdHeader(req);\n\n if (!sessionId) {\n res.status(400).json({\n jsonrpc: \"2.0\",\n error: {\n code: -32000,\n message: \"mcp-session-id header is required for session termination\",\n },\n id: null,\n });\n return;\n }\n\n const sessionData = sessions.get(sessionId);\n if (!sessionData) {\n res.status(400).json({\n jsonrpc: \"2.0\",\n error: {\n code: -32000,\n message: \"Invalid or expired session\",\n },\n id: null,\n });\n return;\n }\n\n // Handle the termination through the transport\n await sessionData.transport.handleRequest(req, res);\n });\n\n // Start session cleanup timer\n startSessionCleanup();\n\n // Start the server\n app.listen(port, () => {\n console.error(`[collab-mcp-server] Collab MCP HTTP Server v${VERSION}`);\n console.error(`[collab-mcp-server] Listening on http://0.0.0.0:${port}`);\n console.error(`[collab-mcp-server] MCP endpoint: POST/GET/DELETE /mcp`);\n console.error(`[collab-mcp-server] Health check: GET /mcp/health`);\n console.error(`[collab-mcp-server] API URL: ${baseUrl}`);\n console.error(`[collab-mcp-server] Session timeout: ${SESSION_TIMEOUT_MS / 1000 / 60} minutes`);\n });\n}\n\n/**\n * CLI entry point\n */\nfunction handleCliFlags(): void {\n const args = process.argv.slice(2);\n\n if (args.includes(\"--version\") || args.includes(\"-v\")) {\n console.log(`collab-mcp-server v${VERSION}`);\n process.exit(0);\n }\n\n if (args.includes(\"--help\") || args.includes(\"-h\")) {\n console.log(`collab-mcp-server v${VERSION}\n\nCollab MCP HTTP Server - Streamable HTTP transport for remote MCP connections\n\nUsage:\n collab-mcp-server [options]\n\nOptions:\n -v, --version Show version number\n -h, --help Show this help message\n\nEnvironment Variables:\n COLLAB_BASE_URL Collab webapp URL (required)\n PORT Server port (default: 3001)\n\nClient Authentication:\n Clients must provide an X-API-Key header with their Collab API key.\n Each session is authenticated independently.\n\nExample deployment with Docker:\n docker run -e COLLAB_BASE_URL=https://collab.mtaap.de -p 3001:3001 mtaap/mcp-server\n\nExample client configuration (Claude Desktop):\n{\n \"mcpServers\": {\n \"collab-remote\": {\n \"url\": \"https://your-server.com/mcp\",\n \"headers\": {\n \"X-API-Key\": \"collab_your_api_key_here\"\n }\n }\n }\n}`);\n process.exit(0);\n }\n}\n\n/**\n * Graceful shutdown handling\n */\nfunction setupShutdownHandlers(): void {\n const shutdown = (signal: string): void => {\n console.error(`[collab-mcp-server] Received ${signal}, shutting down...`);\n\n // Clear the cleanup interval\n if (cleanupIntervalId) {\n clearInterval(cleanupIntervalId);\n cleanupIntervalId = null;\n }\n\n // Close all active sessions\n for (const [sessionId, sessionData] of sessions.entries()) {\n console.error(`[collab-mcp-server] Closing session: ${sessionId}`);\n sessionData.transport.close();\n }\n sessions.clear();\n\n process.exit(0);\n };\n\n process.on(\"SIGINT\", () => shutdown(\"SIGINT\"));\n process.on(\"SIGTERM\", () => shutdown(\"SIGTERM\"));\n\n // Handle uncaught exceptions\n process.on(\"uncaughtException\", (error) => {\n console.error(\"[collab-mcp-server] Uncaught exception:\", error.message);\n process.exit(1);\n });\n\n // Handle unhandled promise rejections\n process.on(\"unhandledRejection\", (reason) => {\n const message = reason instanceof Error ? reason.message : String(reason);\n console.error(\"[collab-mcp-server] Unhandled rejection:\", message);\n process.exit(1);\n });\n}\n\n// Main entry point\nhandleCliFlags();\nsetupShutdownHandlers();\n\nconsole.error(\"[collab-mcp-server] Starting Collab MCP HTTP Server...\");\ncreateHTTPServer().catch((error) => {\n console.error(\"[collab-mcp-server] Failed to start server:\", error.message);\n process.exit(1);\n});\n","/**\n * Collab MCP Server\n *\n * Model Context Protocol server for AI agent integration.\n * Uses REST API to communicate with the Collab webapp.\n */\n\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { VERSION } from \"./version.js\";\nimport { z } from \"zod\";\nimport type { Transport } from \"@modelcontextprotocol/sdk/shared/transport.js\";\nimport {\n TaskState,\n TaskPriority,\n ApiKeyPermission,\n ListProjectsInputSchema,\n ListTasksInputSchema,\n GetTaskInputSchema,\n AssignTaskInputSchema,\n UpdateProgressInputSchema,\n CompleteTaskInputSchema,\n ReportErrorInputSchema,\n GetProjectContextInputSchema,\n AddNoteInputSchema,\n AbandonTaskInputSchema,\n ArchiveTaskInputSchema,\n UnarchiveTaskInputSchema,\n CreatePersonalProjectInputSchema,\n CreateTaskMCPInputSchema,\n RequestChangesInputSchema,\n ApproveTaskInputSchema,\n ErrorType,\n VerifyTaskInputSchema,\n GetTaskPromptInputSchema,\n UpdateTaskMCPInputSchema,\n ReportBranchInputSchema,\n ReportPRInputSchema,\n} from \"@mtaap/core\";\nimport {\n MCPApiClient,\n createApiClientFromEnv,\n ApiError,\n AuthContext,\n} from \"./api-client.js\";\nimport { assertApiKeyPermission } from \"./permissions.js\";\n\n/**\n * Server instructions for MCP Tool Search optimization.\n * Helps Claude discover and use tools effectively when dynamically loaded.\n */\nconst COLLAB_SERVER_INSTRUCTIONS = `Collab - AI-assisted software development task management platform.\n\nTOOL CATEGORIES:\n\n1. Project Discovery (READ):\n - list_projects, get_project_context, get_version\n\n2. Task Management (READ/WRITE):\n - list_tasks, get_task, create_task, update_task, archive_task, unarchive_task\n\n3. Task Verification (WRITE):\n - verify_task, get_task_prompt\n\n4. Task Execution (WRITE):\n - assign_task, update_progress, add_note, complete_task, abandon_task, report_error\n\n5. Git Operations (WRITE):\n - report_branch, report_pr\n\n6. Code Review (WRITE):\n - request_changes, approve_task\n\n7. Session Management (READ):\n - check_active_task\n\nWORKFLOWS:\n\nTask Creation & Verification:\n create_task -> get_task_prompt (DRAFT) -> verify_task(approved=true) -> task moves to TODO\n\nStandard Task Workflow:\n list_projects -> get_project_context -> list_tasks(state=TODO) -> get_task -> get_task_prompt (TODO)\n -> assign_task (returns suggested branch name and worktree path)\n -> git worktree add <worktreePath> -b <branchName> <baseBranch>\n -> cd <worktreePath>\n -> [update_progress...]\n -> git push -u origin <branchName>\n -> report_branch (tell server about the branch)\n -> complete_task (returns PR suggestions)\n -> gh pr create (local gh command)\n -> report_pr (tell server about the PR)\n -> git worktree remove <worktreePath>\n\nResume Workflow:\n check_active_task -> (if active) get_task -> get_task_prompt (IN_PROGRESS) -> update_progress -> complete_task\n\nReview Workflow:\n list_tasks(state=REVIEW) -> get_task -> approve_task OR request_changes\n\nTask Editing:\n update_task (DRAFT/TODO only) -> if was TODO, reverts to DRAFT -> verify_task again\n\nError Recovery:\n report_error -> abandon_task -> list_tasks -> assign_task (retry or pick different task)\n (abandon_task returns IN_PROGRESS tasks to TODO state)\n\nGIT OPERATIONS NOTE:\n The agent handles all git operations locally using git worktrees for isolation.\n After assign_task returns a suggested branch name and worktree path:\n 1. Create worktree: git worktree add <worktreePath> -b <branchName> <baseBranch>\n 2. Work in worktree directory: cd <worktreePath>\n 3. After completing work, push and call report_branch\n 4. After complete_task, create PR with gh and call report_pr\n 5. Clean up worktree: git worktree remove <worktreePath>\n Worktrees enable parallel task execution without git conflicts.\n\nTASK STATE FLOW:\n DRAFT -> TODO -> IN_PROGRESS -> REVIEW -> DONE\n (verify_task: DRAFT -> TODO)\n (update_task on TODO: reverts to DRAFT)\n (request_changes: REVIEW -> IN_PROGRESS)\n (abandon_task: IN_PROGRESS -> TODO)\n\nCONSTRAINTS:\n- DRAFT tasks must be verified before assignment\n- verify_task requires programmatic validation (title 10+ chars, description 50+ chars, criteria 20+ chars each)\n- update_task only works on DRAFT and TODO states\n- assign_task is atomic - fails if already claimed\n- Only TODO tasks can be assigned\n- complete_task requires IN_PROGRESS state\n- request_changes/approve_task require REVIEW state\n- Always check_active_task before starting new work\n- Call update_progress frequently to checkpoint\n- Agent must have git/gh CLI configured for local git operations`;\n\n/**\n * Initialize an MCP server with all tools registered.\n * This is the core setup used by both stdio and HTTP transports.\n *\n * @param apiClient - The API client for communicating with the Collab webapp\n * @param authContext - The authenticated user context\n * @returns The configured McpServer instance (not yet connected to a transport)\n */\nexport function initializeMCPServer(\n apiClient: MCPApiClient,\n authContext: AuthContext\n): McpServer {\n const server = new McpServer(\n {\n name: \"collab\",\n version: VERSION,\n },\n {\n instructions: COLLAB_SERVER_INSTRUCTIONS,\n }\n );\n\n // Create a mock API key object for permission checking\n // The actual permission check happens server-side, this is for local validation\n const mockApiKey = {\n permissions: authContext.permissions.includes(\"ADMIN\")\n ? ApiKeyPermission.ADMIN\n : authContext.permissions.includes(\"WRITE\")\n ? ApiKeyPermission.WRITE\n : ApiKeyPermission.READ,\n };\n\n server.registerTool(\n \"list_projects\",\n {\n description:\n \"Discover all accessible projects. Use first to find project IDs. Filter by TEAM, PERSONAL, or ALL workspaces.\",\n inputSchema: {\n workspaceType: z\n .enum([\"TEAM\", \"PERSONAL\", \"ALL\"])\n .optional()\n .describe(\"Filter by workspace type\"),\n },\n },\n async (args) => {\n assertApiKeyPermission(\n mockApiKey,\n ApiKeyPermission.READ,\n \"list_projects\",\n );\n const validated = ListProjectsInputSchema.parse(args);\n\n try {\n const projects = await apiClient.listProjects(validated.workspaceType);\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(projects, null, 2),\n },\n ],\n };\n } catch (error) {\n return handleApiError(error);\n }\n },\n );\n\n server.registerTool(\n \"list_tasks\",\n {\n description:\n \"Query tasks with filters. Use state=TODO for assignable tasks, state=REVIEW for pending reviews.\",\n inputSchema: {\n projectId: z.string().optional().describe(\"Filter by project ID\"),\n state: z.nativeEnum(TaskState).optional().describe(\"Filter by task state\"),\n assigneeId: z.string().optional().describe(\"Filter by assignee ID\"),\n includeArchived: z.boolean().optional().describe(\"Include archived tasks (default: false)\"),\n },\n },\n async (args) => {\n assertApiKeyPermission(mockApiKey, ApiKeyPermission.READ, \"list_tasks\");\n const validated = ListTasksInputSchema.parse(args);\n\n try {\n const tasks = await apiClient.listTasks({\n projectId: validated.projectId,\n state: validated.state,\n assigneeId: validated.assigneeId,\n includeArchived: validated.includeArchived,\n });\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(tasks, null, 2),\n },\n ],\n };\n } catch (error) {\n return handleApiError(error);\n }\n },\n );\n\n server.registerTool(\n \"get_task\",\n {\n description:\n \"Get complete task details with acceptance criteria and notes. Call before assign_task to understand requirements.\",\n inputSchema: {\n taskId: z.string().describe(\"The task ID to retrieve\"),\n },\n },\n async (args) => {\n assertApiKeyPermission(mockApiKey, ApiKeyPermission.READ, \"get_task\");\n const validated = GetTaskInputSchema.parse(args);\n\n try {\n const task = await apiClient.getTask(validated.taskId);\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(task, null, 2),\n },\n ],\n };\n } catch (error) {\n return handleApiError(error);\n }\n },\n );\n\n server.registerTool(\n \"assign_task\",\n {\n description:\n \"Atomically claim a task. Race-safe - fails if already assigned. Task must be TODO. Returns suggested branch name and worktree path for isolated parallel development.\",\n inputSchema: {\n projectId: z.string().describe(\"The project ID\"),\n taskId: z.string().describe(\"The task ID to assign\"),\n expectedState: z\n .nativeEnum(TaskState)\n .optional()\n .describe(\"Expected task state (default: TODO)\"),\n },\n },\n async (args) => {\n assertApiKeyPermission(\n mockApiKey,\n ApiKeyPermission.WRITE,\n \"assign_task\",\n );\n const validated = AssignTaskInputSchema.parse(args);\n\n try {\n const result = await apiClient.assignTask(\n validated.taskId,\n validated.projectId,\n validated.expectedState,\n );\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n } catch (error) {\n return handleApiError(error);\n }\n },\n );\n\n server.registerTool(\n \"update_progress\",\n {\n description:\n \"Report progress and checkpoint work. Call frequently during execution. Marks acceptance criteria complete.\",\n inputSchema: {\n taskId: z.string().describe(\"The task ID to update\"),\n statusMessage: z\n .string()\n .optional()\n .describe(\"Status message (max 1000 chars)\"),\n completedCheckpointIds: z\n .array(z.string())\n .optional()\n .describe(\"Array of completed checkpoint IDs\"),\n currentCheckpointIndex: z\n .number()\n .optional()\n .describe(\"Current checkpoint index\"),\n },\n },\n async (args) => {\n assertApiKeyPermission(\n mockApiKey,\n ApiKeyPermission.WRITE,\n \"update_progress\",\n );\n const validated = UpdateProgressInputSchema.parse(args);\n\n try {\n const result = await apiClient.updateProgress(validated.taskId, {\n statusMessage: validated.statusMessage,\n completedCheckpointIds: validated.completedCheckpointIds,\n currentCheckpointIndex: validated.currentCheckpointIndex,\n });\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n } catch (error) {\n return handleApiError(error);\n }\n },\n );\n\n server.registerTool(\n \"complete_task\",\n {\n description:\n \"Prepare task for PR creation. Returns PR suggestions. After creating PR locally, call report_pr to transition to REVIEW. Requires IN_PROGRESS state.\",\n inputSchema: {\n projectId: z.string().describe(\"The project ID\"),\n taskId: z.string().describe(\"The task ID to complete\"),\n pullRequestTitle: z\n .string()\n .optional()\n .describe(\"PR title (max 300 chars)\"),\n pullRequestBody: z\n .string()\n .optional()\n .describe(\"PR body/description (max 10000 chars)\"),\n },\n },\n async (args) => {\n assertApiKeyPermission(\n mockApiKey,\n ApiKeyPermission.WRITE,\n \"complete_task\",\n );\n const validated = CompleteTaskInputSchema.parse(args);\n\n try {\n const result = await apiClient.completeTask(\n validated.taskId,\n validated.projectId,\n validated.pullRequestTitle,\n validated.pullRequestBody,\n );\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n } catch (error) {\n return handleApiError(error);\n }\n },\n );\n\n server.registerTool(\n \"check_active_task\",\n {\n description:\n \"Check for resumable work from previous session. Always call before starting new work.\",\n },\n async () => {\n assertApiKeyPermission(\n mockApiKey,\n ApiKeyPermission.READ,\n \"check_active_task\",\n );\n\n // This is a local file operation, no API call needed\n const result = await checkActiveTask();\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n },\n );\n\n server.registerTool(\n \"report_error\",\n {\n description:\n \"Report unrecoverable errors (BUILD_FAILURE, TEST_FAILURE, CONFLICT, AUTH_ERROR). Consider abandon_task after.\",\n inputSchema: {\n taskId: z.string().describe(\"The task ID\"),\n errorType: z\n .nativeEnum(ErrorType)\n .describe(\"Error type: BUILD_FAILURE, TEST_FAILURE, CONFLICT, AUTH_ERROR, OTHER\"),\n errorMessage: z.string().describe(\"Error message (max 1000 chars)\"),\n context: z.string().optional().describe(\"Additional context (max 2000 chars)\"),\n },\n },\n async (args) => {\n assertApiKeyPermission(\n mockApiKey,\n ApiKeyPermission.WRITE,\n \"report_error\",\n );\n const validated = ReportErrorInputSchema.parse(args);\n\n try {\n const result = await apiClient.reportError(\n validated.taskId,\n validated.errorType,\n validated.errorMessage,\n validated.context,\n );\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n } catch (error) {\n return handleApiError(error);\n }\n },\n );\n\n server.registerTool(\n \"get_project_context\",\n {\n description:\n \"Load project README, tech stack, and coding conventions. Call after selecting project.\",\n inputSchema: {\n projectId: z.string().describe(\"The project ID\"),\n },\n },\n async (args) => {\n assertApiKeyPermission(\n mockApiKey,\n ApiKeyPermission.READ,\n \"get_project_context\",\n );\n const validated = GetProjectContextInputSchema.parse(args);\n\n try {\n const context = await apiClient.getProjectContext(validated.projectId);\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(context, null, 2),\n },\n ],\n };\n } catch (error) {\n return handleApiError(error);\n }\n },\n );\n\n server.registerTool(\n \"add_note\",\n {\n description:\n \"Document implementation decisions. Notes persist for future reference and handoff.\",\n inputSchema: {\n taskId: z.string().describe(\"The task ID\"),\n content: z.string().describe(\"Note content (max 500 chars)\"),\n },\n },\n async (args) => {\n assertApiKeyPermission(mockApiKey, ApiKeyPermission.WRITE, \"add_note\");\n const validated = AddNoteInputSchema.parse(args);\n\n try {\n const result = await apiClient.addNote(\n validated.taskId,\n validated.content,\n );\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n } catch (error) {\n return handleApiError(error);\n }\n },\n );\n\n server.registerTool(\n \"abandon_task\",\n {\n description:\n \"Release task assignment and optionally clean up branch. Task returns to TODO. Use after errors.\",\n inputSchema: {\n projectId: z.string().describe(\"The project ID\"),\n taskId: z.string().describe(\"The task ID to abandon\"),\n deleteBranch: z\n .boolean()\n .optional()\n .describe(\"Whether to delete the associated branch\"),\n },\n },\n async (args) => {\n assertApiKeyPermission(\n mockApiKey,\n ApiKeyPermission.WRITE,\n \"abandon_task\",\n );\n const validated = AbandonTaskInputSchema.parse(args);\n\n try {\n const result = await apiClient.abandonTask(\n validated.taskId,\n validated.projectId,\n validated.deleteBranch,\n );\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n } catch (error) {\n return handleApiError(error);\n }\n },\n );\n\n server.registerTool(\n \"report_branch\",\n {\n description:\n \"Report a branch created by the agent. Call after using git to create and push a branch. Task must be IN_PROGRESS.\",\n inputSchema: {\n projectId: z.string().describe(\"The project ID\"),\n taskId: z.string().describe(\"The task ID\"),\n branchName: z.string().describe(\"Name of the branch created (e.g., feature/TASK-123-fix-login)\"),\n },\n },\n async (args) => {\n assertApiKeyPermission(\n mockApiKey,\n ApiKeyPermission.WRITE,\n \"report_branch\",\n );\n const validated = ReportBranchInputSchema.parse(args);\n\n try {\n const result = await apiClient.reportBranch(\n validated.taskId,\n validated.projectId,\n validated.branchName,\n );\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n } catch (error) {\n return handleApiError(error);\n }\n },\n );\n\n server.registerTool(\n \"report_pr\",\n {\n description:\n \"Report a PR created by the agent. Call after using gh pr create. Transitions task to REVIEW state.\",\n inputSchema: {\n projectId: z.string().describe(\"The project ID\"),\n taskId: z.string().describe(\"The task ID\"),\n pullRequestUrl: z.string().describe(\"Full URL of the created PR (e.g., https://github.com/owner/repo/pull/123)\"),\n pullRequestNumber: z.number().describe(\"PR number (e.g., 123)\"),\n },\n },\n async (args) => {\n assertApiKeyPermission(\n mockApiKey,\n ApiKeyPermission.WRITE,\n \"report_pr\",\n );\n const validated = ReportPRInputSchema.parse(args);\n\n try {\n const result = await apiClient.reportPR(\n validated.taskId,\n validated.projectId,\n validated.pullRequestUrl,\n validated.pullRequestNumber,\n );\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n } catch (error) {\n return handleApiError(error);\n }\n },\n );\n\n server.registerTool(\n \"archive_task\",\n {\n description: \"Soft-delete a task. Hidden but restorable via unarchive_task.\",\n inputSchema: {\n projectId: z.string().describe(\"The project ID\"),\n taskId: z.string().describe(\"The task ID to archive\"),\n },\n },\n async (args) => {\n assertApiKeyPermission(\n mockApiKey,\n ApiKeyPermission.WRITE,\n \"archive_task\",\n );\n const validated = ArchiveTaskInputSchema.parse(args);\n\n try {\n const result = await apiClient.archiveTask(\n validated.taskId,\n validated.projectId,\n );\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n } catch (error) {\n return handleApiError(error);\n }\n },\n );\n\n server.registerTool(\n \"unarchive_task\",\n {\n description: \"Restore previously archived task to original state.\",\n inputSchema: {\n projectId: z.string().describe(\"The project ID\"),\n taskId: z.string().describe(\"The task ID to restore\"),\n },\n },\n async (args) => {\n assertApiKeyPermission(\n mockApiKey,\n ApiKeyPermission.WRITE,\n \"unarchive_task\",\n );\n const validated = UnarchiveTaskInputSchema.parse(args);\n\n try {\n const result = await apiClient.unarchiveTask(\n validated.taskId,\n validated.projectId,\n );\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n } catch (error) {\n return handleApiError(error);\n }\n },\n );\n\n server.registerTool(\n \"create_personal_project\",\n {\n description:\n \"Create new project in personal workspace linked to GitHub repository.\",\n inputSchema: {\n name: z.string().describe(\"Project name (max 100 chars)\"),\n description: z.string().optional().describe(\"Project description (max 500 chars)\"),\n repositoryUrl: z.string().describe(\"GitHub repository URL\"),\n },\n },\n async (args) => {\n assertApiKeyPermission(\n mockApiKey,\n ApiKeyPermission.WRITE,\n \"create_personal_project\",\n );\n const validated = CreatePersonalProjectInputSchema.parse(args);\n\n try {\n const result = await apiClient.createPersonalProject(\n validated.name,\n validated.description,\n validated.repositoryUrl,\n );\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n } catch (error) {\n return handleApiError(error);\n }\n },\n );\n\n server.registerTool(\n \"create_task\",\n {\n description:\n \"Create task with title, description, acceptance criteria. Starts in DRAFT. Priority: LOW/MEDIUM/HIGH/CRITICAL.\",\n inputSchema: {\n projectId: z.string().describe(\"The project ID to create the task in\"),\n epicId: z\n .string()\n .nullable()\n .optional()\n .describe(\"Optional epic ID to associate the task with\"),\n title: z.string().describe(\"Task title (max 200 chars)\"),\n description: z.string().describe(\"Task description (max 5000 chars)\"),\n priority: z\n .nativeEnum(TaskPriority)\n .optional()\n .describe(\"Task priority: LOW, MEDIUM, HIGH, CRITICAL (default: MEDIUM)\"),\n acceptanceCriteria: z\n .array(\n z.object({\n description: z\n .string()\n .describe(\"Acceptance criterion description (max 500 chars)\"),\n }),\n )\n .describe(\"Array of acceptance criteria (at least 1 required)\"),\n },\n },\n async (args) => {\n assertApiKeyPermission(\n mockApiKey,\n ApiKeyPermission.WRITE,\n \"create_task\",\n );\n const validated = CreateTaskMCPInputSchema.parse(args);\n\n try {\n const result = await apiClient.createTask({\n projectId: validated.projectId,\n epicId: validated.epicId,\n title: validated.title,\n description: validated.description,\n priority: validated.priority,\n acceptanceCriteria: validated.acceptanceCriteria,\n });\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n } catch (error) {\n return handleApiError(error);\n }\n },\n );\n\n server.registerTool(\n \"request_changes\",\n {\n description:\n \"Return task from REVIEW to IN_PROGRESS with feedback. Original assignee addresses changes.\",\n inputSchema: {\n projectId: z.string().describe(\"The project ID\"),\n taskId: z.string().describe(\"The task ID to review\"),\n reviewComments: z.string().describe(\"Review comments explaining requested changes (max 5000 chars)\"),\n requestedChanges: z\n .array(z.string())\n .optional()\n .describe(\"List of specific changes requested\"),\n },\n },\n async (args) => {\n assertApiKeyPermission(\n mockApiKey,\n ApiKeyPermission.WRITE,\n \"request_changes\",\n );\n const validated = RequestChangesInputSchema.parse(args);\n\n try {\n const result = await apiClient.requestChanges(\n validated.taskId,\n validated.projectId,\n validated.reviewComments,\n validated.requestedChanges,\n );\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n } catch (error) {\n return handleApiError(error);\n }\n },\n );\n\n server.registerTool(\n \"approve_task\",\n {\n description: \"Approve completed work and mark DONE. Only for REVIEW state tasks.\",\n inputSchema: {\n projectId: z.string().describe(\"The project ID\"),\n taskId: z.string().describe(\"The task ID to approve\"),\n reviewComments: z\n .string()\n .optional()\n .describe(\"Optional approval comments (max 2000 chars)\"),\n },\n },\n async (args) => {\n assertApiKeyPermission(\n mockApiKey,\n ApiKeyPermission.WRITE,\n \"approve_task\",\n );\n const validated = ApproveTaskInputSchema.parse(args);\n\n try {\n const result = await apiClient.approveTask(\n validated.taskId,\n validated.projectId,\n validated.reviewComments,\n );\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n } catch (error) {\n return handleApiError(error);\n }\n },\n );\n\n server.registerTool(\n \"verify_task\",\n {\n description:\n \"Verify a DRAFT task and move it to TODO state. Requires task to pass programmatic validation (title 10+ chars, description 50+ chars, each criterion 20+ chars). If approved=false, stores feedback with NEEDS_REVISION status.\",\n inputSchema: {\n projectId: z.string().describe(\"The project ID\"),\n taskId: z.string().describe(\"The task ID to verify\"),\n approved: z.boolean().describe(\"Whether to approve the task\"),\n feedback: z\n .string()\n .optional()\n .describe(\"Feedback for the task (required if not approved)\"),\n },\n },\n async (args) => {\n assertApiKeyPermission(mockApiKey, ApiKeyPermission.WRITE, \"verify_task\");\n const validated = VerifyTaskInputSchema.parse(args);\n\n try {\n const result = await apiClient.verifyTask(\n validated.taskId,\n validated.projectId,\n validated.approved,\n validated.feedback,\n );\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n } catch (error) {\n return handleApiError(error);\n }\n },\n );\n\n server.registerTool(\n \"get_task_prompt\",\n {\n description:\n \"Get state-appropriate prompt for a task. Returns verify prompt for DRAFT, assignment prompt for TODO, or continue prompt for IN_PROGRESS tasks.\",\n inputSchema: {\n projectId: z.string().describe(\"The project ID\"),\n taskId: z.string().describe(\"The task ID\"),\n },\n },\n async (args) => {\n assertApiKeyPermission(\n mockApiKey,\n ApiKeyPermission.READ,\n \"get_task_prompt\",\n );\n const validated = GetTaskPromptInputSchema.parse(args);\n\n try {\n const result = await apiClient.getTaskPrompt(\n validated.taskId,\n validated.projectId,\n );\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n } catch (error) {\n return handleApiError(error);\n }\n },\n );\n\n server.registerTool(\n \"update_task\",\n {\n description:\n \"Update task details (title, description, priority, acceptanceCriteria). Only works for DRAFT and TODO states. If task is in TODO state, it reverts to DRAFT and requires re-verification.\",\n inputSchema: {\n projectId: z.string().describe(\"The project ID\"),\n taskId: z.string().describe(\"The task ID to update\"),\n title: z.string().optional().describe(\"New task title\"),\n description: z.string().optional().describe(\"New task description\"),\n priority: z\n .nativeEnum(TaskPriority)\n .optional()\n .describe(\"New task priority\"),\n acceptanceCriteria: z\n .array(\n z.object({\n id: z.string().optional().describe(\"Existing criterion ID (for updates)\"),\n description: z.string().describe(\"Criterion description\"),\n }),\n )\n .optional()\n .describe(\"New acceptance criteria (replaces existing)\"),\n },\n },\n async (args) => {\n assertApiKeyPermission(mockApiKey, ApiKeyPermission.WRITE, \"update_task\");\n const validated = UpdateTaskMCPInputSchema.parse(args);\n\n try {\n const result = await apiClient.updateTask(\n validated.taskId,\n validated.projectId,\n {\n title: validated.title,\n description: validated.description,\n priority: validated.priority,\n acceptanceCriteria: validated.acceptanceCriteria,\n },\n );\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n } catch (error) {\n return handleApiError(error);\n }\n },\n );\n\n server.registerTool(\n \"get_version\",\n {\n description: \"Check MCP server version and connectivity.\",\n },\n async () => {\n assertApiKeyPermission(mockApiKey, ApiKeyPermission.READ, \"get_version\");\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(\n {\n version: VERSION,\n timestamp: new Date().toISOString(),\n },\n null,\n 2,\n ),\n },\n ],\n };\n },\n );\n\n return server;\n}\n\n/**\n * Connect an MCP server to a transport.\n *\n * @param server - The MCP server instance\n * @param transport - The transport to connect to\n */\nexport async function connectMCPServer(\n server: McpServer,\n transport: Transport\n): Promise<void> {\n await server.connect(transport);\n}\n\n/**\n * Create and start an MCP server with stdio transport.\n * This is the main entry point for CLI usage (collab-mcp command).\n *\n * Creates the API client, authenticates, initializes the server with all tools,\n * and connects to stdio transport for communication with Claude Code.\n */\nexport async function createMCPServer(): Promise<void> {\n // Create API client from environment\n const apiClient = createApiClientFromEnv();\n\n // Authenticate and get user context\n let authContext: AuthContext;\n try {\n authContext = await apiClient.authenticate();\n } catch (error) {\n if (error instanceof ApiError) {\n throw new Error(`Authentication failed: ${error.message}`);\n }\n throw error;\n }\n\n // Initialize the MCP server with all tools\n const server = initializeMCPServer(apiClient, authContext);\n\n // Connect to stdio transport\n const transport = new StdioServerTransport();\n await connectMCPServer(server, transport);\n}\n\n/**\n * Handle API errors and return appropriate MCP response\n */\nfunction handleApiError(error: unknown): {\n content: Array<{ type: \"text\"; text: string }>;\n isError: boolean;\n} {\n if (error instanceof ApiError) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: JSON.stringify(\n {\n error: error.message,\n code: error.code,\n status: error.status,\n details: error.details,\n },\n null,\n 2,\n ),\n },\n ],\n isError: true,\n };\n }\n\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [\n {\n type: \"text\" as const,\n text: JSON.stringify({ error: message }, null, 2),\n },\n ],\n isError: true,\n };\n}\n\n/**\n * Schema for validating active task file contents\n */\nconst ActiveTaskSchema = z.object({\n taskId: z.string().min(1),\n projectId: z.string().min(1),\n branchName: z.string().optional(),\n worktreePath: z.string().optional(),\n startedAt: z.string().optional(),\n});\n\n/**\n * Check for active task file (local operation, no API needed)\n * Includes protection against symlink attacks and path traversal.\n */\nasync function checkActiveTask() {\n const fs = await import(\"fs\");\n const path = await import(\"path\");\n\n const cwd = process.cwd();\n const collabDir = path.join(cwd, \".collab\");\n const activeTaskPath = path.join(collabDir, \"active-task.json\");\n\n try {\n // Resolve the path and verify it's within the .collab directory\n const resolvedPath = path.resolve(activeTaskPath);\n const resolvedCollabDir = path.resolve(collabDir);\n\n if (!resolvedPath.startsWith(resolvedCollabDir + path.sep) && resolvedPath !== resolvedCollabDir) {\n // Path traversal attempt detected\n return {\n hasActiveTask: false,\n task: null,\n error: \"Invalid active task path\",\n };\n }\n\n // Check for symlinks to prevent symlink attacks\n const stats = await fs.promises.lstat(activeTaskPath);\n if (stats.isSymbolicLink()) {\n // Symlink detected - reject to prevent reading arbitrary files\n return {\n hasActiveTask: false,\n task: null,\n error: \"Symlinks not allowed for active task file\",\n };\n }\n\n if (!stats.isFile()) {\n return {\n hasActiveTask: false,\n task: null,\n };\n }\n\n const content = await fs.promises.readFile(activeTaskPath, \"utf-8\");\n\n // Parse and validate the JSON content\n let parsed: unknown;\n try {\n parsed = JSON.parse(content);\n } catch {\n return {\n hasActiveTask: false,\n task: null,\n error: \"Invalid JSON in active task file\",\n };\n }\n\n // Validate against schema to ensure expected structure\n const validationResult = ActiveTaskSchema.safeParse(parsed);\n if (!validationResult.success) {\n return {\n hasActiveTask: false,\n task: null,\n error: \"Active task file has invalid structure\",\n };\n }\n\n return {\n hasActiveTask: true,\n task: validationResult.data,\n };\n } catch (err) {\n // Distinguish between \"file not found\" and other errors\n if (err instanceof Error && \"code\" in err && err.code === \"ENOENT\") {\n return {\n hasActiveTask: false,\n task: null,\n };\n }\n // Log unexpected errors but don't expose details\n return {\n hasActiveTask: false,\n task: null,\n error: \"Failed to read active task file\",\n };\n }\n}\n\n// Re-export types and functions needed by HTTP server\nexport { MCPApiClient, ApiError } from \"./api-client.js\";\nexport type { AuthContext } from \"./api-client.js\";\nexport { VERSION } from \"./version.js\";\n","{\n \"name\": \"@mtaap/mcp\",\n \"version\": \"0.2.12\",\n \"description\": \"Model Context Protocol (MCP) server for AI agents to interact with Collab - the multi-tenant collaborative agent development platform\",\n \"mcpName\": \"collab\",\n \"scripts\": {\n \"build\": \"tsup\"\n },\n \"main\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"bin\": {\n \"collab-mcp\": \"./dist/cli.js\",\n \"collab-mcp-server\": \"./dist/server.js\"\n },\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"require\": \"./dist/index.js\"\n }\n },\n \"files\": [\n \"dist\"\n ],\n \"keywords\": [\n \"mcp\",\n \"model-context-protocol\",\n \"ai\",\n \"agent\",\n \"collaboration\",\n \"task-management\",\n \"claude\",\n \"anthropic\"\n ],\n \"license\": \"Proprietary\",\n \"author\": \"MTAAP Contributors\",\n \"engines\": {\n \"node\": \">=18.18.0\"\n },\n \"dependencies\": {\n \"@modelcontextprotocol/sdk\": \"^1.0.0\",\n \"express\": \"^5.0.1\",\n \"zod\": \"^4.3.5\"\n },\n \"devDependencies\": {\n \"@mtaap/config-typescript\": \"workspace:*\",\n \"@mtaap/core\": \"workspace:*\",\n \"@types/express\": \"^5.0.0\",\n \"@types/node\": \"^22.0.0\",\n \"tsup\": \"^8.5.1\",\n \"typescript\": \"^5.4.0\"\n }\n}\n","import packageJson from \"../package.json\";\n\nexport const VERSION = packageJson.version;\n\nexport type Version = string;\n","/**\n * Task State Enum\n */\nexport var TaskState;\n(function (TaskState) {\n TaskState[\"DRAFT\"] = \"DRAFT\";\n TaskState[\"TODO\"] = \"TODO\";\n /** @deprecated Use DRAFT instead - kept for PostgreSQL compatibility */\n TaskState[\"BACKLOG\"] = \"BACKLOG\";\n /** @deprecated Use TODO instead - kept for PostgreSQL compatibility */\n TaskState[\"READY\"] = \"READY\";\n TaskState[\"IN_PROGRESS\"] = \"IN_PROGRESS\";\n TaskState[\"REVIEW\"] = \"REVIEW\";\n TaskState[\"DONE\"] = \"DONE\";\n})(TaskState || (TaskState = {}));\n/**\n * Verification Status Enum\n */\nexport var VerificationStatus;\n(function (VerificationStatus) {\n VerificationStatus[\"PENDING\"] = \"PENDING\";\n VerificationStatus[\"PASSED\"] = \"PASSED\";\n VerificationStatus[\"NEEDS_REVISION\"] = \"NEEDS_REVISION\";\n})(VerificationStatus || (VerificationStatus = {}));\n/**\n * User Role Enum\n */\nexport var UserRole;\n(function (UserRole) {\n UserRole[\"ADMIN\"] = \"ADMIN\";\n UserRole[\"MEMBER\"] = \"MEMBER\";\n})(UserRole || (UserRole = {}));\n/**\n * Project Type Enum\n */\nexport var ProjectType;\n(function (ProjectType) {\n ProjectType[\"TEAM\"] = \"TEAM\";\n ProjectType[\"PERSONAL\"] = \"PERSONAL\";\n})(ProjectType || (ProjectType = {}));\n/**\n * Project Origin Enum\n */\nexport var ProjectOrigin;\n(function (ProjectOrigin) {\n ProjectOrigin[\"CREATED\"] = \"CREATED\";\n ProjectOrigin[\"PROMOTED\"] = \"PROMOTED\";\n})(ProjectOrigin || (ProjectOrigin = {}));\n/**\n * Task Priority Enum\n */\nexport var TaskPriority;\n(function (TaskPriority) {\n TaskPriority[\"LOW\"] = \"LOW\";\n TaskPriority[\"MEDIUM\"] = \"MEDIUM\";\n TaskPriority[\"HIGH\"] = \"HIGH\";\n TaskPriority[\"CRITICAL\"] = \"CRITICAL\";\n})(TaskPriority || (TaskPriority = {}));\n/**\n * Deployment Mode Enum\n */\nexport var DeploymentMode;\n(function (DeploymentMode) {\n DeploymentMode[\"SAAS\"] = \"saas\";\n DeploymentMode[\"ONPREM\"] = \"onprem\";\n})(DeploymentMode || (DeploymentMode = {}));\n/**\n * Error Type Enum (for agent error reporting)\n */\nexport var ErrorType;\n(function (ErrorType) {\n ErrorType[\"BUILD_FAILURE\"] = \"BUILD_FAILURE\";\n ErrorType[\"TEST_FAILURE\"] = \"TEST_FAILURE\";\n ErrorType[\"CONFLICT\"] = \"CONFLICT\";\n ErrorType[\"AUTH_ERROR\"] = \"AUTH_ERROR\";\n ErrorType[\"OTHER\"] = \"OTHER\";\n})(ErrorType || (ErrorType = {}));\n/**\n * Pull Request Status Enum\n */\nexport var PRStatus;\n(function (PRStatus) {\n PRStatus[\"OPEN\"] = \"OPEN\";\n PRStatus[\"CLOSED\"] = \"CLOSED\";\n PRStatus[\"MERGED\"] = \"MERGED\";\n PRStatus[\"DELETED\"] = \"DELETED\";\n})(PRStatus || (PRStatus = {}));\n/**\n * Pricing Tier Enum\n */\nexport var PricingTier;\n(function (PricingTier) {\n PricingTier[\"FREE\"] = \"FREE\";\n PricingTier[\"PRO\"] = \"PRO\";\n PricingTier[\"ENTERPRISE\"] = \"ENTERPRISE\";\n})(PricingTier || (PricingTier = {}));\n/**\n * API Key Permission Levels\n */\nexport var ApiKeyPermission;\n(function (ApiKeyPermission) {\n ApiKeyPermission[\"READ\"] = \"READ\";\n ApiKeyPermission[\"WRITE\"] = \"WRITE\";\n ApiKeyPermission[\"ADMIN\"] = \"ADMIN\";\n})(ApiKeyPermission || (ApiKeyPermission = {}));\n/**\n * WebSocket Event Types\n */\nexport var WebSocketEventType;\n(function (WebSocketEventType) {\n WebSocketEventType[\"TASK_ASSIGNED\"] = \"task.assigned\";\n WebSocketEventType[\"TASK_ABANDONED\"] = \"task.abandoned\";\n WebSocketEventType[\"TASK_PROGRESS\"] = \"task.progress\";\n WebSocketEventType[\"TASK_PR_CREATED\"] = \"task.pr_created\";\n WebSocketEventType[\"TASK_REVIEW_REQUESTED\"] = \"task.review_requested\";\n WebSocketEventType[\"TASK_COMPLETED\"] = \"task.completed\";\n WebSocketEventType[\"TASK_ERROR\"] = \"task.error\";\n WebSocketEventType[\"TASK_STATE_CHANGED\"] = \"task.state_changed\";\n WebSocketEventType[\"TASK_UPDATED\"] = \"task.updated\";\n WebSocketEventType[\"TASK_DELETED\"] = \"task.deleted\";\n WebSocketEventType[\"MEMBER_JOINED\"] = \"member.joined\";\n})(WebSocketEventType || (WebSocketEventType = {}));\n/**\n * Authentication Provider Types\n */\nexport var AuthProvider;\n(function (AuthProvider) {\n AuthProvider[\"CREDENTIALS\"] = \"credentials\";\n AuthProvider[\"LDAP\"] = \"ldap\";\n AuthProvider[\"SSO\"] = \"sso\";\n})(AuthProvider || (AuthProvider = {}));\n/**\n * Subscription Status Enum\n */\nexport var SubscriptionStatus;\n(function (SubscriptionStatus) {\n SubscriptionStatus[\"ACTIVE\"] = \"ACTIVE\";\n SubscriptionStatus[\"INACTIVE\"] = \"INACTIVE\";\n SubscriptionStatus[\"PAST_DUE\"] = \"PAST_DUE\";\n SubscriptionStatus[\"CANCELED\"] = \"CANCELED\";\n SubscriptionStatus[\"INCOMPLETE\"] = \"INCOMPLETE\";\n})(SubscriptionStatus || (SubscriptionStatus = {}));\n/**\n * Audit Event Types\n */\nexport var EventType;\n(function (EventType) {\n EventType[\"AUTH\"] = \"AUTH\";\n EventType[\"AUTHORIZATION\"] = \"AUTHORIZATION\";\n EventType[\"ACCESS\"] = \"ACCESS\";\n EventType[\"MODIFICATION\"] = \"MODIFICATION\";\n})(EventType || (EventType = {}));\n","import { TaskState } from \"./enums\";\n// Valid state transitions for Kanban board drag-and-drop\n// Forward: DRAFT -> TODO -> IN_PROGRESS -> REVIEW -> DONE\n// Backward: Any state can move back to earlier states (except DONE which is final)\n// DONE is terminal - cannot be changed once completed\n// Note: BACKLOG and READY are deprecated but kept for PostgreSQL compatibility\nconst VALID_TRANSITIONS = {\n [TaskState.DRAFT]: [TaskState.TODO],\n [TaskState.TODO]: [TaskState.DRAFT, TaskState.IN_PROGRESS],\n // Deprecated: BACKLOG transitions to DRAFT (its replacement)\n [TaskState.BACKLOG]: [TaskState.DRAFT, TaskState.TODO],\n // Deprecated: READY transitions to TODO (its replacement)\n [TaskState.READY]: [TaskState.TODO, TaskState.IN_PROGRESS],\n [TaskState.IN_PROGRESS]: [\n TaskState.DRAFT,\n TaskState.TODO,\n TaskState.REVIEW,\n ],\n [TaskState.REVIEW]: [\n TaskState.DRAFT,\n TaskState.TODO,\n TaskState.IN_PROGRESS,\n TaskState.DONE,\n ],\n [TaskState.DONE]: [],\n};\nexport function isValidStateTransition(from, to) {\n if (from === to)\n return true;\n return VALID_TRANSITIONS[from]?.includes(to) ?? false;\n}\nexport function getValidNextStates(current) {\n return VALID_TRANSITIONS[current] ?? [];\n}\nexport function validateStateTransition(from, to) {\n if (from === to) {\n return { valid: true };\n }\n if (!isValidStateTransition(from, to)) {\n const validNext = getValidNextStates(from);\n const validStates = validNext.length > 0 ? validNext.join(\", \") : \"none\";\n return {\n valid: false,\n error: `Invalid state transition from ${from} to ${to}. Valid transitions: ${validStates}`,\n };\n }\n return { valid: true };\n}\n","export const config = {\n deploymentMode: (process.env.DEPLOYMENT_MODE || \"saas\"),\n};\nexport const isSaas = config.deploymentMode === \"saas\";\nexport const isOnPrem = config.deploymentMode === \"onprem\";\nexport function getBaseURL() {\n if (config.deploymentMode === \"onprem\") {\n return process.env.COLLAB_BASE_URL || \"http://localhost:3000\";\n }\n return process.env.COLLAB_BASE_URL || \"https://app.mtaap.io\";\n}\nexport function getGitHubConfig() {\n return {\n token: process.env.GITHUB_TOKEN,\n webhookSecret: process.env.GITHUB_WEBHOOK_SECRET,\n appId: process.env.GITHUB_APP_ID,\n privateKey: process.env.GITHUB_APP_PRIVATE_KEY,\n };\n}\nexport function getStripeConfig() {\n if (!isSaas) {\n return null;\n }\n return {\n secretKey: process.env.STRIPE_SECRET_KEY,\n webhookSecret: process.env.STRIPE_WEBHOOK_SECRET,\n publishableKey: process.env.STRIPE_PUBLISHABLE_KEY,\n };\n}\nexport function getEmailConfig() {\n return {\n host: process.env.SMTP_HOST || \"mail.mtaap.de\",\n port: parseInt(process.env.SMTP_PORT || \"587\", 10),\n user: process.env.SMTP_USER,\n password: process.env.SMTP_PASSWORD,\n from: process.env.SMTP_FROM || \"noreply@mtaap.de\",\n secure: process.env.SMTP_SECURE === \"true\",\n // Legacy field for backwards compatibility during migration\n apiKey: process.env.RESEND_API_KEY,\n };\n}\nexport function isEmailConfigured() {\n const config = getEmailConfig();\n // Email is configured if SMTP credentials are set\n return Boolean(config.user && config.password);\n}\nexport function getDatabaseConfig() {\n return {\n url: process.env.DATABASE_URL,\n shadowDbUrl: process.env.DATABASE_SHADOW_URL,\n };\n}\nexport function getLDAPConfig() {\n return {\n enabled: process.env.LDAP_ENABLED === \"true\",\n url: process.env.LDAP_URL,\n bindDN: process.env.LDAP_BIND_DN,\n bindCredentials: process.env.LDAP_BIND_CREDENTIALS,\n searchBase: process.env.LDAP_SEARCH_BASE,\n };\n}\nexport function getSentryConfig() {\n return {\n dsn: process.env.SENTRY_DSN,\n environment: process.env.NODE_ENV || \"development\",\n };\n}\nexport function getLogConfig() {\n return {\n level: process.env.LOG_LEVEL || \"info\",\n };\n}\n","export const VERSION = \"0.1.0\";\n","import { PricingTier } from \"../constants/enums\";\n// Re-export deployment and Supabase config utilities\nexport * from \"./deployment\";\nexport * from \"./supabase\";\nimport { VERSION } from \"../version\";\nconst DEPLOYMENT_MODE = (process.env.DEPLOYMENT_MODE ||\n \"saas\");\nexport const config = {\n version: VERSION,\n deploymentMode: DEPLOYMENT_MODE,\n billing: {\n enabled: DEPLOYMENT_MODE === \"saas\",\n revenuecat: {\n publicKey: process.env.REVENUECAT_PUBLIC_API_KEY,\n stripeKey: process.env.STRIPE_SECRET_KEY, // Required by RevenueCat Web Billing\n },\n },\n licensing: {\n enabled: DEPLOYMENT_MODE === \"onprem\",\n licenseKey: process.env.LICENSE_KEY,\n },\n auth: {\n credentials: true,\n ldap: process.env.LDAP_ENABLED === \"true\",\n },\n git: {\n deleteMergedBranches: process.env.DELETE_MERGED_BRANCHES !== \"false\",\n enforceConventionalCommits: process.env.ENFORCE_CONVENTIONAL_COMMITS === \"true\",\n defaultBaseBranch: process.env.DEFAULT_BASE_BRANCH || \"develop\",\n },\n pricing: {\n maxPersonalProjects: {\n FREE: 2,\n PRO: 5,\n ENTERPRISE: 10,\n },\n maxCollaboratorsPerProject: {\n FREE: 3,\n PRO: -1,\n ENTERPRISE: -1,\n },\n maxProjectsPerOrg: {\n FREE: 5,\n PRO: -1,\n ENTERPRISE: -1,\n },\n maxSeats: {\n FREE: 3,\n PRO: -1,\n ENTERPRISE: -1,\n },\n // Default seats when subscription doesn't specify an explicit seat count\n defaultSeats: {\n FREE: 3,\n PRO: 10,\n ENTERPRISE: 999999,\n },\n },\n features: {\n stripe: {\n enabled: DEPLOYMENT_MODE === \"saas\",\n },\n gitlab: {\n enabled: true,\n },\n ldap: {\n enabled: process.env.LDAP_ENABLED === \"true\",\n },\n auditLogs: {\n enabled: process.env.AUDIT_LOGS_ENABLED === \"true\",\n },\n },\n api: {\n apiKey: {\n defaultExpiryDays: 90,\n prefix: \"usr_\",\n },\n rateLimit: {\n requestsPerMinute: 100,\n requestsPerHour: 1000,\n },\n },\n limits: {\n projectNameMaxLength: 100,\n taskDescriptionMaxLength: 5000,\n notesMaxLength: 500,\n conventionsNotesMaxLength: 500,\n recentCompletedTasksLimit: 10,\n },\n};\nexport function getConfig(key) {\n return config[key];\n}\nexport function isFeatureEnabled(feature) {\n const featureConfig = config.features[feature];\n if (typeof featureConfig === \"object\" && \"enabled\" in featureConfig) {\n return featureConfig.enabled;\n }\n return true;\n}\nexport function getPricingLimits(tier) {\n return {\n maxPersonalProjects: config.pricing.maxPersonalProjects[tier],\n maxCollaboratorsPerProject: config.pricing.maxCollaboratorsPerProject[tier],\n maxProjectsPerOrg: config.pricing.maxProjectsPerOrg[tier],\n maxSeats: config.pricing.maxSeats[tier],\n };\n}\n/**\n * Default seat allocations per pricing tier.\n * Used when a subscription doesn't specify an explicit seat count.\n */\nexport const DEFAULT_SEAT_LIMITS = {\n [PricingTier.FREE]: config.pricing.defaultSeats.FREE,\n [PricingTier.PRO]: config.pricing.defaultSeats.PRO,\n [PricingTier.ENTERPRISE]: config.pricing.defaultSeats.ENTERPRISE,\n};\n","import { z } from \"zod\";\nimport { TaskState, TaskPriority, UserRole, ProjectType, ProjectOrigin, ErrorType, PRStatus, PricingTier, ApiKeyPermission, } from \"../constants/enums\";\nexport * from \"../constants/enums\";\n// Note: z is exported from validation/index.ts - do not export here to avoid ambiguity\n/**\n * User Types\n */\nexport const UserIdSchema = z.string().regex(/^usr_[a-zA-Z0-9]+$/);\nexport const UserSchema = z.object({\n id: UserIdSchema,\n email: z.string().email(),\n name: z.string().min(1).max(255),\n role: z.nativeEnum(UserRole),\n organizationId: z.string().optional(),\n lastActiveAt: z.coerce.date().optional(),\n createdAt: z.coerce.date(),\n});\nexport const OrganizationUserSchema = z.object({\n id: z.number().int(),\n userId: UserIdSchema,\n organizationId: z.string(),\n roleId: z.nativeEnum(UserRole).optional(),\n user: UserSchema.pick({ id: true, email: true, name: true, role: true }),\n createdAt: z.coerce.date(),\n});\n/**\n * Organization/Tenant Types\n */\nexport const OrganizationIdSchema = z.string().regex(/^org_[a-zA-Z0-9]+$/);\nexport const OrganizationSchema = z.object({\n id: OrganizationIdSchema,\n name: z.string().min(1).max(255),\n slug: z\n .string()\n .min(1)\n .max(100)\n .regex(/^[a-z0-9-]+$/),\n logoUrl: z.string().url().nullable(),\n accentColor: z\n .string()\n .regex(/^#[0-9A-Fa-f]{6}$/)\n .nullable(),\n tenantName: z.string().nullable(),\n pricingTier: z.nativeEnum(PricingTier),\n createdAt: z.coerce.date(),\n});\nexport const OrganizationSettingsSchema = z.object({\n organizationId: OrganizationIdSchema,\n ldapEnabled: z.boolean(),\n ldapUrl: z.string().url().nullable(),\n ldapBindDN: z.string().nullable(),\n ldapSearchBase: z.string().nullable(),\n deleteMergedBranches: z.boolean(),\n enforceConventionalCommits: z.boolean(),\n maxPersonalProjectsPerUser: z.number().int().min(0),\n});\n/**\n * Tag Types (for access control)\n */\nexport const TagSchema = z.object({\n id: z.string(),\n name: z.string().min(1).max(50),\n organizationId: OrganizationIdSchema,\n createdAt: z.coerce.date(),\n});\n/**\n * Project Types\n */\nexport const ProjectIdSchema = z.string().regex(/^prj_[a-zA-Z0-9]+$/);\nexport const ProjectSchema = z.object({\n id: ProjectIdSchema,\n name: z.string().min(1).max(100),\n description: z.string().max(500).nullable(),\n type: z.nativeEnum(ProjectType),\n origin: z.nativeEnum(ProjectOrigin),\n organizationId: OrganizationIdSchema,\n ownerId: UserIdSchema.nullable(),\n repositoryUrl: z.string().url(),\n baseBranch: z.string().default(\"develop\"),\n tags: z.array(z.string()),\n createdAt: z.coerce.date(),\n updatedAt: z.coerce.date(),\n});\n/**\n * Epic Types\n */\nexport const EpicIdSchema = z.string().regex(/^epc_[a-zA-Z0-9]+$/);\nexport const EpicSchema = z.object({\n id: EpicIdSchema,\n projectId: ProjectIdSchema,\n name: z.string().min(1).max(200),\n description: z.string().nullable(),\n createdAt: z.coerce.date(),\n updatedAt: z.coerce.date(),\n});\n/**\n * Task/User Story Types\n */\nexport const TaskIdSchema = z.string().regex(/^tsk_[a-zA-Z0-9]+$/);\nexport function generateTaskDisplayId(taskCuid) {\n const lastChars = taskCuid.slice(-3).toUpperCase();\n return `TASK-${lastChars}`;\n}\nexport const TaskSchema = z.object({\n id: TaskIdSchema,\n projectId: ProjectIdSchema,\n epicId: EpicIdSchema.nullable(),\n title: z.string().min(1).max(200),\n description: z.string().max(5000),\n state: z.nativeEnum(TaskState),\n priority: z.nativeEnum(TaskPriority),\n assigneeId: UserIdSchema.nullable(),\n createdBy: UserIdSchema.nullable(),\n assignedAt: z.coerce.date().nullable(),\n startedAt: z.coerce.date().nullable(),\n completedAt: z.coerce.date().nullable(),\n branchName: z.string().nullable(),\n pullRequestUrl: z.string().url().nullable(),\n pullRequestNumber: z.number().int().nullable(),\n pullRequestStatus: z.nativeEnum(PRStatus).nullable(),\n errorType: z.nativeEnum(ErrorType).nullable(),\n errorMessage: z.string().max(1000).nullable(),\n createdAt: z.coerce.date(),\n updatedAt: z.coerce.date(),\n});\nexport const AcceptanceCriterionSchema = z.object({\n id: z.string(),\n taskId: TaskIdSchema,\n description: z.string().min(1).max(500),\n completed: z.boolean(),\n completedAt: z.coerce.date().nullable(),\n order: z.number().int(),\n createdAt: z.coerce.date(),\n});\nexport const ProgressUpdateSchema = z.object({\n id: z.string(),\n taskId: TaskIdSchema,\n userId: UserIdSchema,\n message: z.string().max(2000),\n checkpoints: z.array(z.string()).optional(),\n createdAt: z.coerce.date(),\n});\nexport const TaskNoteSchema = z.object({\n id: z.string(),\n taskId: TaskIdSchema,\n userId: UserIdSchema,\n content: z.string().max(500),\n createdAt: z.coerce.date(),\n});\n/**\n * API Key Types\n */\nexport const ApiKeyIdSchema = z.string().regex(/^key_[a-zA-Z0-9]+$/);\nexport const ApiKeySchema = z.object({\n id: ApiKeyIdSchema,\n userId: UserIdSchema,\n name: z.string().min(1).max(100),\n keyHash: z.string(),\n permissions: z.nativeEnum(ApiKeyPermission),\n lastUsedAt: z.coerce.date().nullable(),\n expiresAt: z.coerce.date().nullable(),\n revoked: z.boolean(),\n createdAt: z.coerce.date(),\n});\n/**\n * Subscription/Seat Types\n */\nexport const SubscriptionIdSchema = z.string();\nexport const SubscriptionSchema = z.object({\n id: SubscriptionIdSchema,\n organizationId: OrganizationIdSchema,\n pricingTier: z.nativeEnum(PricingTier),\n seats: z.number().int().min(0),\n stripeSubscriptionId: z.string().nullable(),\n stripeCustomerId: z.string().nullable(),\n status: z.enum([\"active\", \"past_due\", \"canceled\", \"incomplete\"]),\n currentPeriodStart: z.coerce.date(),\n currentPeriodEnd: z.coerce.date(),\n createdAt: z.coerce.date(),\n});\n/**\n * Collaboration Types\n */\nexport const ProjectCollaboratorSchema = z.object({\n id: z.string(),\n projectId: ProjectIdSchema,\n userId: UserIdSchema,\n addedBy: UserIdSchema,\n createdAt: z.coerce.date(),\n});\n","import { z } from \"zod\";\nimport { TaskState, TaskPriority, UserRole, ProjectType, ErrorType, ApiKeyPermission, } from \"../constants/enums\";\nexport * from \"../constants/enums\";\nexport * from \"./tier-validation\";\nexport * from \"./task-quality\";\nexport { z };\n/**\n * Validation Schemas for MCP Server Tools\n */\nexport const ListProjectsInputSchema = z.object({\n workspaceType: z.preprocess((val) => (typeof val === \"string\" ? val.toUpperCase() : val), z.enum([\"TEAM\", \"PERSONAL\", \"ALL\"]).optional()),\n});\nexport const ListTasksInputSchema = z.object({\n projectId: z.string().optional(),\n state: z.nativeEnum(TaskState).optional(),\n assigneeId: z.string().optional(),\n includeArchived: z.boolean().optional(),\n});\n// CUID format: alphanumeric lowercase, typically 25 chars (e.g., cmkiwtmrp0002r6uvdhzzlyta)\n// Also accept prefixed format for backwards compatibility (tsk_, prj_, etc.)\nconst cuidOrPrefixedId = z.string().regex(/^([a-z0-9]+|[a-z]+_[a-zA-Z0-9]+)$/);\n/**\n * Git branch name validator - prevents injection attacks via malicious branch names.\n * Rules based on git-check-ref-format:\n * - Must start with alphanumeric character\n * - Can contain alphanumeric, hyphens, underscores, dots, and forward slashes\n * - Cannot start or end with a dot or hyphen\n * - Cannot contain: .., @{, consecutive slashes, or end with .lock\n * - Cannot contain shell metacharacters or path traversal sequences\n */\nconst gitBranchName = z\n .string()\n .min(1)\n .max(100)\n .regex(/^[a-zA-Z0-9][-a-zA-Z0-9._/]*[a-zA-Z0-9]$|^[a-zA-Z0-9]$/, \"Branch name must start and end with alphanumeric character\")\n .refine((val) => !val.includes(\"..\") &&\n !val.includes(\"@{\") &&\n !val.includes(\"//\") &&\n !val.endsWith(\".lock\") &&\n !val.includes(\"~\") &&\n !val.includes(\"^\") &&\n !val.includes(\":\") &&\n !val.includes(\"?\") &&\n !val.includes(\"*\") &&\n !val.includes(\"[\") &&\n !val.includes(\"\\\\\") &&\n !val.includes(\" \") &&\n !val.includes(\";\") &&\n !val.includes(\"&\") &&\n !val.includes(\"|\") &&\n !val.includes(\"$\") &&\n !val.includes(\"`\") &&\n !val.includes(\"'\") &&\n !val.includes('\"') &&\n !val.includes(\"<\") &&\n !val.includes(\">\") &&\n !val.includes(\"(\") &&\n !val.includes(\")\"), \"Invalid branch name: contains forbidden characters or sequences\");\nexport const GetTaskInputSchema = z.object({\n taskId: cuidOrPrefixedId,\n});\nexport const AssignTaskInputSchema = z.object({\n projectId: cuidOrPrefixedId,\n taskId: cuidOrPrefixedId,\n expectedState: z.nativeEnum(TaskState).default(TaskState.TODO),\n});\nexport const UpdateProgressInputSchema = z.object({\n taskId: cuidOrPrefixedId,\n statusMessage: z.string().max(1000).optional(),\n completedCheckpointIds: z.array(z.string()).optional(),\n currentCheckpointIndex: z.number().int().optional(),\n});\nexport const CompleteTaskInputSchema = z.object({\n projectId: cuidOrPrefixedId,\n taskId: cuidOrPrefixedId,\n pullRequestTitle: z.string().min(1).max(300).optional(),\n pullRequestBody: z.string().max(10000).optional(),\n});\nexport const ReportErrorInputSchema = z.object({\n taskId: cuidOrPrefixedId,\n errorType: z.nativeEnum(ErrorType),\n errorMessage: z.string().min(1).max(1000),\n context: z.string().max(2000).optional(),\n});\nexport const GetProjectContextInputSchema = z.object({\n projectId: cuidOrPrefixedId,\n});\nexport const AddNoteInputSchema = z.object({\n taskId: cuidOrPrefixedId,\n content: z.string().min(1).max(500),\n});\nexport const AbandonTaskInputSchema = z.object({\n projectId: cuidOrPrefixedId,\n taskId: cuidOrPrefixedId,\n deleteBranch: z.boolean().optional(),\n});\nexport const RequestChangesInputSchema = z.object({\n projectId: cuidOrPrefixedId,\n taskId: cuidOrPrefixedId,\n reviewComments: z.string().min(1).max(5000),\n requestedChanges: z.array(z.string().min(1).max(500)).optional(),\n});\nexport const ApproveTaskInputSchema = z.object({\n projectId: cuidOrPrefixedId,\n taskId: cuidOrPrefixedId,\n reviewComments: z.string().max(2000).optional(),\n});\nexport const ArchiveTaskInputSchema = z.object({\n projectId: cuidOrPrefixedId,\n taskId: cuidOrPrefixedId,\n});\nexport const UnarchiveTaskInputSchema = z.object({\n projectId: cuidOrPrefixedId,\n taskId: cuidOrPrefixedId,\n});\nexport const CreatePersonalProjectInputSchema = z.object({\n name: z.string().min(1).max(100),\n description: z.string().max(500).optional(),\n repositoryUrl: z.string().url(),\n});\nexport const CheckActiveTaskInputSchema = z.object({});\nexport const CreateTaskMCPInputSchema = z.object({\n projectId: cuidOrPrefixedId,\n epicId: cuidOrPrefixedId.nullable().optional(),\n title: z.string().min(1).max(200),\n description: z.string().max(5000),\n priority: z.nativeEnum(TaskPriority).default(TaskPriority.MEDIUM),\n acceptanceCriteria: z\n .array(z.object({\n description: z.string().min(1).max(500),\n }))\n .min(1),\n});\n/**\n * Validation Schemas for Webapp API Routes\n */\nexport const CreateOrganizationInputSchema = z.object({\n name: z.string().min(1).max(255),\n slug: z\n .string()\n .min(1)\n .max(100)\n .regex(/^[a-z0-9-]+$/)\n .optional(),\n});\nexport const UpdateOrganizationInputSchema = z.object({\n organizationId: cuidOrPrefixedId,\n name: z.string().min(1).max(255).optional(),\n logoUrl: z.string().url().nullable().optional(),\n accentColor: z\n .string()\n .regex(/^#[0-9A-Fa-f]{6}$/, \"Invalid hex color format. Expected #RRGGBB\")\n .nullable()\n .optional(),\n tenantName: z.string().max(255).nullable().optional(),\n});\nexport const CreateProjectInputSchema = z.object({\n name: z.string().min(1).max(100),\n description: z.string().max(500).optional(),\n type: z.nativeEnum(ProjectType),\n repositoryUrl: z.string().url(),\n baseBranch: z.string().default(\"develop\").optional(),\n tags: z.array(z.string()).default([]),\n});\nexport const UpdateProjectInputSchema = z.object({\n projectId: z.string().min(1).optional(),\n name: z.string().min(1).max(100).optional(),\n description: z.string().max(500).optional(),\n repositoryUrl: z.string().url().optional(),\n baseBranch: z.string().optional(),\n tags: z.array(z.string()).optional(),\n allowMemberArchive: z.boolean().optional(),\n});\nexport const CreateEpicInputSchema = z.object({\n projectId: cuidOrPrefixedId,\n name: z.string().min(1).max(200),\n description: z.string().max(2000).optional(),\n});\nexport const CreateTaskInputSchema = z.object({\n projectId: z.string().min(1),\n epicId: z.string().min(1).nullable().optional(),\n title: z.string().min(1).max(200),\n description: z.string().max(5000),\n priority: z.nativeEnum(TaskPriority).default(TaskPriority.MEDIUM),\n acceptanceCriteria: z\n .array(z.object({\n description: z.string().min(1).max(500),\n }))\n .min(1),\n});\nexport const UpdateTaskInputSchema = z.object({\n taskId: z.string().min(1),\n title: z.string().min(1).max(200).optional(),\n description: z.string().max(5000).optional(),\n priority: z.nativeEnum(TaskPriority).optional(),\n state: z.nativeEnum(TaskState).optional(),\n assigneeId: z.string().nullable().optional(),\n acceptanceCriteria: z\n .array(z.object({\n id: z.string().optional(),\n description: z.string().min(1).max(500),\n completed: z.boolean().optional(),\n }))\n .optional(),\n});\nexport const AssignTaskWebappInputSchema = z.object({\n taskId: z.string().min(1),\n userId: z.string().min(1),\n});\nexport const CreateTagInputSchema = z.object({\n organizationId: cuidOrPrefixedId,\n name: z\n .string()\n .min(1)\n .max(50)\n .regex(/^[a-zA-Z0-9\\s-]+$/),\n});\nexport const UpdateTagInputSchema = z.object({\n name: z\n .string()\n .min(1)\n .max(50)\n .regex(/^[a-zA-Z0-9\\s-]+$/),\n});\nexport const UpdateOrganizationSettingsInputSchema = z.object({\n organizationId: cuidOrPrefixedId,\n ldapEnabled: z.boolean().optional(),\n ldapUrl: z.string().url().nullable().optional(),\n ldapBindDN: z.string().nullable().optional(),\n ldapSearchBase: z.string().nullable().optional(),\n deleteMergedBranches: z.boolean().optional(),\n enforceConventionalCommits: z.boolean().optional(),\n maxPersonalProjectsPerUser: z.number().int().min(0).optional(),\n logoUrl: z.string().url().nullable().optional(),\n accentColor: z\n .string()\n .regex(/^#[0-9A-Fa-f]{6}$/, \"Invalid hex color format. Expected #RRGGBB\")\n .nullable()\n .optional(),\n tenantName: z.string().max(255).nullable().optional(),\n});\nexport const InviteUserInputSchema = z.object({\n organizationId: cuidOrPrefixedId,\n email: z.string().email(),\n role: z.nativeEnum(UserRole).default(UserRole.MEMBER),\n tags: z.array(z.string()).default([]),\n});\nexport const AssignUserTagsInputSchema = z.object({\n userId: cuidOrPrefixedId,\n tags: z.array(z.string()).min(0),\n});\nexport const InviteCollaboratorInputSchema = z.object({\n projectId: cuidOrPrefixedId,\n email: z.string().email(),\n});\nexport const PublishProjectInputSchema = z.object({\n projectId: cuidOrPrefixedId,\n transferOwnership: z.boolean().default(false),\n tags: z.array(z.string()).min(1),\n});\nexport const GenerateApiKeyInputSchema = z.object({\n name: z.string().min(1).max(100),\n expiresInDays: z.number().int().min(1).max(365).default(90),\n permissions: z.nativeEnum(ApiKeyPermission).default(ApiKeyPermission.WRITE),\n});\nexport const RevokeApiKeyInputSchema = z.object({\n keyId: cuidOrPrefixedId,\n});\n/**\n * Validation Schemas for Authentication\n */\nexport const LoginInputSchema = z.object({\n email: z.string().email(),\n password: z.string().min(8).max(255),\n});\nexport const RegisterInputSchema = z.object({\n email: z.string().email(),\n password: z.string().min(8).max(255),\n name: z.string().min(1).max(255),\n organizationSlug: z\n .string()\n .min(1)\n .max(100)\n .regex(/^[a-z0-9-]+$/)\n .optional(),\n});\n/**\n * Validation Schemas for Task Verification Workflow\n */\nexport const VerifyTaskInputSchema = z.object({\n projectId: cuidOrPrefixedId,\n taskId: cuidOrPrefixedId,\n approved: z.boolean(),\n feedback: z.string().max(5000).optional(),\n});\nexport const GetTaskPromptInputSchema = z.object({\n projectId: cuidOrPrefixedId,\n taskId: cuidOrPrefixedId,\n});\nexport const UpdateTaskMCPInputSchema = z.object({\n projectId: cuidOrPrefixedId,\n taskId: cuidOrPrefixedId,\n title: z.string().min(1).max(200).optional(),\n description: z.string().max(5000).optional(),\n priority: z.nativeEnum(TaskPriority).optional(),\n acceptanceCriteria: z\n .array(z.object({\n id: z.string().optional(),\n description: z.string().min(1).max(500),\n }))\n .optional(),\n});\n/**\n * Validation Schemas for Agent-Delegated Git Operations\n */\nexport const ReportBranchInputSchema = z.object({\n projectId: cuidOrPrefixedId,\n taskId: cuidOrPrefixedId,\n branchName: gitBranchName,\n});\nexport const ReportPRInputSchema = z.object({\n projectId: cuidOrPrefixedId,\n taskId: cuidOrPrefixedId,\n pullRequestUrl: z.string().url(),\n pullRequestNumber: z.number().int().positive(),\n});\n","/**\n * In-memory metrics storage.\n *\n * Note: Metric retention is intentionally handled by the external Prometheus scraper,\n * not at the application level. This is standard practice - the application exposes\n * current metric values, and Prometheus handles time-series storage, retention policies,\n * and historical queries. See Prometheus documentation for configuring retention periods.\n */\nconst metrics = new Map();\nfunction labelsToKey(labels) {\n if (!labels || Object.keys(labels).length === 0)\n return \"\";\n return Object.entries(labels)\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([k, v]) => `${k}=\"${v}\"`)\n .join(\",\");\n}\nexport function createCounter(name, help) {\n const data = {\n name,\n type: \"counter\",\n help,\n values: new Map(),\n };\n metrics.set(name, data);\n return {\n inc(labels, value = 1) {\n const key = labelsToKey(labels);\n const current = data.values.get(key) || 0;\n data.values.set(key, current + value);\n },\n };\n}\nexport function createGauge(name, help) {\n const data = {\n name,\n type: \"gauge\",\n help,\n values: new Map(),\n };\n metrics.set(name, data);\n return {\n set(labels, value) {\n const key = labelsToKey(labels);\n data.values.set(key, value);\n },\n inc(labels, value = 1) {\n const key = labelsToKey(labels);\n const current = data.values.get(key) || 0;\n data.values.set(key, current + value);\n },\n dec(labels, value = 1) {\n const key = labelsToKey(labels);\n const current = data.values.get(key) || 0;\n data.values.set(key, current - value);\n },\n };\n}\nexport function createHistogram(name, help, buckets = [0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10]) {\n const data = {\n name,\n type: \"histogram\",\n help,\n values: new Map(),\n buckets,\n };\n metrics.set(name, data);\n return {\n observe(labels, value) {\n const baseKey = labelsToKey(labels);\n const sumKey = `${baseKey}|sum`;\n const countKey = `${baseKey}|count`;\n data.values.set(sumKey, (data.values.get(sumKey) || 0) + value);\n data.values.set(countKey, (data.values.get(countKey) || 0) + 1);\n for (const bucket of buckets) {\n const bucketKey = `${baseKey}|le=\"${bucket}\"`;\n if (value <= bucket) {\n data.values.set(bucketKey, (data.values.get(bucketKey) || 0) + 1);\n }\n }\n const infKey = `${baseKey}|le=\"+Inf\"`;\n data.values.set(infKey, (data.values.get(infKey) || 0) + 1);\n },\n };\n}\nexport function getMetricsAsPrometheus() {\n const lines = [];\n for (const [, data] of metrics) {\n lines.push(`# HELP ${data.name} ${data.help}`);\n lines.push(`# TYPE ${data.name} ${data.type}`);\n if (data.type === \"histogram\") {\n const grouped = new Map();\n for (const [key, value] of data.values) {\n const [baseLabels, suffix] = key.split(\"|\");\n if (!grouped.has(baseLabels)) {\n grouped.set(baseLabels, new Map());\n }\n grouped.get(baseLabels).set(suffix, value);\n }\n for (const [baseLabels, suffixes] of grouped) {\n const labelStr = baseLabels ? `{${baseLabels}}` : \"\";\n for (const [suffix, value] of suffixes) {\n if (suffix.startsWith(\"le=\")) {\n const le = suffix.replace(\"le=\", \"\");\n const fullLabels = baseLabels\n ? `{${baseLabels},le=${le}}`\n : `{le=${le}}`;\n lines.push(`${data.name}_bucket${fullLabels} ${value}`);\n }\n }\n lines.push(`${data.name}_sum${labelStr} ${suffixes.get(\"sum\") || 0}`);\n lines.push(`${data.name}_count${labelStr} ${suffixes.get(\"count\") || 0}`);\n }\n }\n else {\n for (const [key, value] of data.values) {\n const labelStr = key ? `{${key}}` : \"\";\n lines.push(`${data.name}${labelStr} ${value}`);\n }\n }\n lines.push(\"\");\n }\n return lines.join(\"\\n\");\n}\nexport function resetMetrics() {\n for (const data of metrics.values()) {\n data.values.clear();\n }\n}\nexport const httpRequestsTotal = createCounter(\"mtaap_http_requests_total\", \"Total number of HTTP requests\");\nexport const httpRequestDuration = createHistogram(\"mtaap_http_request_duration_seconds\", \"HTTP request duration in seconds\");\nexport const activeUsers = createGauge(\"mtaap_active_users\", \"Number of active users\");\nexport const tasksTotal = createCounter(\"mtaap_tasks_total\", \"Total number of tasks by state\");\nexport const taskStateChanges = createCounter(\"mtaap_task_state_changes_total\", \"Total number of task state changes\");\nexport const httpErrorsTotal = createCounter(\"mtaap_http_errors_total\", \"Total number of HTTP errors\");\nexport const httpActiveConnections = createGauge(\"mtaap_http_active_connections\", \"Number of active HTTP connections\");\nexport const newSignupsTotal = createCounter(\"mtaap_new_signups_total\", \"Total number of new user signups\");\nexport const loginSuccessTotal = createCounter(\"mtaap_login_success_total\", \"Total number of successful logins\");\nexport const loginFailureTotal = createCounter(\"mtaap_login_failure_total\", \"Total number of failed logins\");\nexport const dbConnectionPoolActive = createGauge(\"mtaap_db_connection_pool_active\", \"Number of active database connections\");\nexport const dbConnectionPoolIdle = createGauge(\"mtaap_db_connection_pool_idle\", \"Number of idle database connections\");\nexport const dbConnectionPoolMax = createGauge(\"mtaap_db_connection_pool_max\", \"Maximum number of database connections\");\nexport const dbQueryDuration = createHistogram(\"mtaap_db_query_duration_seconds\", \"Database query duration in seconds\");\nexport const dbSlowQueriesTotal = createCounter(\"mtaap_db_slow_queries_total\", \"Total number of slow database queries (>1s)\");\nexport const dbErrorsTotal = createCounter(\"mtaap_db_errors_total\", \"Total number of database errors\");\nexport const tasksCreatedTotal = createCounter(\"mtaap_tasks_created_total\", \"Total number of tasks created\");\nexport const tasksAssignedTotal = createCounter(\"mtaap_tasks_assigned_total\", \"Total number of tasks assigned\");\nexport const tasksCompletedTotal = createCounter(\"mtaap_tasks_completed_total\", \"Total number of tasks completed\");\nexport const tasksByState = createGauge(\"mtaap_tasks_by_state\", \"Number of tasks by state\");\n","const MAX_SAMPLES = 1000;\nconst ALERT_COOLDOWN_MS = 5 * 60 * 1000;\nconst DEFAULT_THRESHOLDS = {\n api: {\n p50: 100,\n p95: 500,\n p99: 1000,\n },\n db: {\n p95: 100,\n p99: 500,\n },\n webvitals: {\n FCP: 2000,\n LCP: 2500,\n FID: 100,\n CLS: 0.1,\n },\n};\nfunction cloneThresholds() {\n return Object.fromEntries(Object.entries(DEFAULT_THRESHOLDS).map(([category, metrics]) => [\n category,\n { ...metrics },\n ]));\n}\nfunction labelsToKey(labels) {\n if (!labels || Object.keys(labels).length === 0)\n return \"\";\n return Object.entries(labels)\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([key, value]) => `${key}=\"${value}\"`)\n .join(\",\");\n}\nfunction percentile(sortedValues, percentileValue) {\n if (sortedValues.length === 0)\n return 0;\n const rank = Math.ceil((percentileValue / 100) * sortedValues.length);\n const index = Math.min(Math.max(rank - 1, 0), sortedValues.length - 1);\n return sortedValues[index];\n}\nclass CircularBuffer {\n capacity;\n values = [];\n index = 0;\n size = 0;\n constructor(capacity) {\n this.capacity = capacity;\n }\n add(value) {\n if (this.size < this.capacity) {\n this.values.push(value);\n this.size += 1;\n this.index = this.size % this.capacity;\n return;\n }\n this.values[this.index] = value;\n this.index = (this.index + 1) % this.capacity;\n }\n getValues() {\n if (this.size < this.capacity) {\n return this.values.slice(0, this.size);\n }\n return this.values.slice();\n }\n}\nexport class PerformanceMonitor {\n samples = new Map();\n thresholds = cloneThresholds();\n alertCallback;\n lastAlertTimestamps = new Map();\n recordTiming(category, name, durationMs, labels) {\n if (!Number.isFinite(durationMs))\n return;\n const categoryMap = this.getCategoryMap(category);\n const nameMap = this.getNameMap(categoryMap, name);\n const labelKey = labelsToKey(labels);\n const buffer = nameMap.get(labelKey) ?? new CircularBuffer(MAX_SAMPLES);\n buffer.add(durationMs);\n nameMap.set(labelKey, buffer);\n }\n getPercentiles(category, name) {\n const samples = this.collectSamples(category, name);\n if (samples.length === 0) {\n return { p50: 0, p95: 0, p99: 0 };\n }\n const sorted = [...samples].sort((a, b) => a - b);\n return {\n p50: percentile(sorted, 50),\n p95: percentile(sorted, 95),\n p99: percentile(sorted, 99),\n };\n }\n checkThresholds() {\n const alerts = [];\n const now = Date.now();\n const callbackAlerts = [];\n for (const [category, nameMap] of this.samples) {\n const thresholds = this.thresholds[category];\n if (!thresholds)\n continue;\n for (const name of nameMap.keys()) {\n const percentiles = this.getPercentiles(category, name);\n for (const [metric, threshold] of Object.entries(thresholds)) {\n const value = this.resolveMetricValue(metric, name, percentiles);\n if (value === undefined || value <= threshold)\n continue;\n const alert = {\n category,\n name,\n metric,\n value,\n threshold,\n };\n alerts.push(alert);\n const alertKey = `${category}|${name}|${metric}`;\n const lastAlertTime = this.lastAlertTimestamps.get(alertKey);\n if (!lastAlertTime || now - lastAlertTime >= ALERT_COOLDOWN_MS) {\n this.lastAlertTimestamps.set(alertKey, now);\n callbackAlerts.push(alert);\n }\n }\n }\n }\n if (callbackAlerts.length > 0 && this.alertCallback) {\n this.alertCallback(callbackAlerts);\n }\n return alerts;\n }\n setAlertCallback(callback) {\n this.alertCallback = callback;\n }\n setThreshold(category, metric, value) {\n if (!this.thresholds[category]) {\n this.thresholds[category] = {};\n }\n this.thresholds[category][metric] = value;\n }\n collectSamples(category, name) {\n const categoryMap = this.samples.get(category);\n if (!categoryMap)\n return [];\n const entries = name\n ? [[name, categoryMap.get(name)]]\n : Array.from(categoryMap.entries());\n const samples = [];\n for (const [, labelMap] of entries) {\n if (!labelMap)\n continue;\n for (const buffer of labelMap.values()) {\n samples.push(...buffer.getValues());\n }\n }\n return samples;\n }\n resolveMetricValue(metric, name, percentiles) {\n if (metric === \"p50\")\n return percentiles.p50;\n if (metric === \"p95\")\n return percentiles.p95;\n if (metric === \"p99\")\n return percentiles.p99;\n if (metric === name)\n return percentiles.p95;\n return undefined;\n }\n getCategoryMap(category) {\n const existing = this.samples.get(category);\n if (existing)\n return existing;\n const created = new Map();\n this.samples.set(category, created);\n return created;\n }\n getNameMap(categoryMap, name) {\n const existing = categoryMap.get(name);\n if (existing)\n return existing;\n const created = new Map();\n categoryMap.set(name, created);\n return created;\n }\n}\nconst defaultMonitor = new PerformanceMonitor();\nexport function recordTiming(category, name, durationMs, labels) {\n defaultMonitor.recordTiming(category, name, durationMs, labels);\n}\nexport function getPercentiles(category, name) {\n return defaultMonitor.getPercentiles(category, name);\n}\nexport function checkThresholds() {\n return defaultMonitor.checkThresholds();\n}\nexport function setAlertCallback(callback) {\n defaultMonitor.setAlertCallback(callback);\n}\nexport function setThreshold(category, metric, value) {\n defaultMonitor.setThreshold(category, metric, value);\n}\n","export class NoOpErrorTracker {\n captureError(error, context) {\n console.error(\"Error captured:\", error.message, context);\n }\n captureException(error, context) {\n console.error(\"Exception captured:\", error, context);\n }\n captureMessage(message, level, context) {\n console[level === \"warning\" ? \"warn\" : level](`Message captured [${level}]:`, message, context);\n }\n setUser(user) {\n console.log(\"User set:\", user);\n }\n clearUser() {\n console.log(\"User cleared\");\n }\n}\nlet errorTrackerInstance = new NoOpErrorTracker();\nexport function initializeErrorTracker(tracker) {\n errorTrackerInstance = tracker;\n}\nexport function getErrorTracker() {\n return errorTrackerInstance;\n}\nexport function captureError(error, context) {\n errorTrackerInstance.captureError(error, context);\n}\nexport function captureException(error, context) {\n errorTrackerInstance.captureException(error, context);\n}\nexport function captureMessage(message, level = \"error\", context) {\n errorTrackerInstance.captureMessage(message, level, context);\n}\nexport function setErrorUser(user) {\n errorTrackerInstance.setUser(user);\n}\nexport function clearErrorUser() {\n errorTrackerInstance.clearUser();\n}\nexport function shouldIgnoreError(statusCode) {\n if (!statusCode) {\n return false;\n }\n const ignoredStatusCodes = [404, 401];\n return ignoredStatusCodes.includes(statusCode);\n}\nexport function shouldIgnoreErrorByMessage(error) {\n const ignoredMessages = [\n \"ResizeObserver loop\",\n \"ResizeObserver loop limit exceeded\",\n \"Non-Error promise rejection captured\",\n \"NEXT_NOT_FOUND\",\n \"NEXT_REDIRECT\",\n ];\n return ignoredMessages.some((msg) => error.message.toLowerCase().includes(msg.toLowerCase()));\n}\n","/**\n * MCP API Client\n *\n * HTTP client for communicating with the Collab webapp REST API.\n * Replaces direct database access for a lighter, more secure MCP package.\n */\n\nimport {\n TaskState,\n ErrorType,\n} from \"@mtaap/core\";\n\nconst DEFAULT_TIMEOUT = 30000; // 30 seconds\n\n/**\n * Headers that should never be logged (case-insensitive)\n */\nconst SENSITIVE_HEADERS = new Set([\n \"x-api-key\",\n \"authorization\",\n \"cookie\",\n \"set-cookie\",\n \"x-auth-token\",\n \"x-access-token\",\n]);\n\n/**\n * Redact sensitive information from a string for safe logging.\n * Removes API keys, tokens, and other credentials.\n */\nfunction sanitizeForLogging(str: string): string {\n // Redact API keys (collab_xxx format) with word boundaries to avoid partial matches\n let sanitized = str.replace(/\\bcollab_[a-zA-Z0-9_-]+\\b/gi, \"[REDACTED_API_KEY]\");\n // Redact bearer tokens with word boundary\n sanitized = sanitized.replace(/\\bBearer\\s+[a-zA-Z0-9._-]+\\b/gi, \"Bearer [REDACTED]\");\n // Redact generic tokens in query params\n sanitized = sanitized.replace(/([?&](api_?key|token|auth|key|secret)=)[^&\\s]+/gi, \"$1[REDACTED]\");\n return sanitized;\n}\n\n/**\n * API Client Configuration\n */\nexport interface ApiClientConfig {\n baseUrl: string;\n apiKey: string;\n timeout?: number;\n debug?: boolean;\n}\n\n/**\n * Authentication context returned from the API\n */\nexport interface AuthContext {\n userId: string;\n organizationId: string | undefined;\n permissions: string[];\n userName: string;\n userEmail: string;\n}\n\n/**\n * Project from API\n */\nexport interface Project {\n id: string;\n name: string;\n description: string | null;\n type: string;\n origin: string;\n repositoryUrl: string;\n baseBranch: string;\n tags: string[];\n createdAt: string;\n updatedAt: string;\n}\n\n/**\n * Task from API\n */\nexport interface Task {\n id: string;\n projectId: string;\n projectName: string;\n epicId: string | null;\n epicName: string | null;\n title: string;\n description: string | null;\n state: TaskState;\n priority: string;\n assigneeId: string | null;\n assigneeName: string | null;\n assigneeEmail: string | null;\n createdBy: string;\n createdByName: string | null;\n assignedAt: string | null;\n startedAt: string | null;\n completedAt: string | null;\n branchName: string | null;\n pullRequestUrl: string | null;\n pullRequestNumber: number | null;\n errorType: string | null;\n errorMessage: string | null;\n verificationStatus: string | null;\n verificationFeedback: string | null;\n verifiedAt: string | null;\n acceptanceCriteria: Array<{\n id: string;\n description: string;\n completed: boolean;\n completedAt: string | null;\n order: number;\n }>;\n progressUpdates?: Array<{\n id: string;\n message: string;\n checkpoints: string[];\n userId: string;\n createdAt: string;\n }>;\n notes?: Array<{\n id: string;\n content: string;\n userId: string;\n userName: string | null;\n createdAt: string;\n }>;\n createdAt: string;\n updatedAt: string;\n archivedAt: string | null;\n}\n\n/**\n * Project context from API\n */\nexport interface ProjectContext {\n readme: string;\n stack: string[];\n recentCompleted: Array<{\n id: string;\n title: string;\n completedAt: string | null;\n }>;\n conventions: {\n branchPrefix: string;\n commitFormat: string;\n testCommand: string;\n baseBranch: string;\n notes: string;\n };\n}\n\n/**\n * API Error\n */\nexport class ApiError extends Error {\n constructor(\n message: string,\n public code: string,\n public status: number,\n public details?: Record<string, unknown>,\n ) {\n super(message);\n this.name = \"ApiError\";\n }\n}\n\n/**\n * MCP API Client\n */\nexport class MCPApiClient {\n private baseUrl: string;\n private apiKey: string;\n private timeout: number;\n private debug: boolean;\n private authContext: AuthContext | null = null;\n\n constructor(config: ApiClientConfig) {\n this.baseUrl = config.baseUrl.replace(/\\/$/, \"\"); // Remove trailing slash\n this.apiKey = config.apiKey;\n this.timeout = config.timeout ?? DEFAULT_TIMEOUT;\n this.debug = config.debug ?? false;\n }\n\n /**\n * Make an HTTP request to the API\n */\n private async request<T>(\n method: string,\n path: string,\n body?: Record<string, unknown>,\n ): Promise<T> {\n const url = `${this.baseUrl}${path}`;\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n if (this.debug) {\n // Only log the path, not the full URL (which could contain sensitive query params)\n console.error(`[mcp-api] ${method} ${sanitizeForLogging(path)}`);\n }\n\n try {\n const response = await fetch(url, {\n method,\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-API-Key\": this.apiKey,\n },\n body: body ? JSON.stringify(body) : undefined,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n const data = await response.json() as Record<string, unknown>;\n\n if (!response.ok) {\n throw new ApiError(\n (data.error as string) || \"API request failed\",\n (data.code as string) || \"UNKNOWN_ERROR\",\n response.status,\n data.details as Record<string, unknown> | undefined,\n );\n }\n\n return data as T;\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof ApiError) {\n throw error;\n }\n\n if (error instanceof Error && error.name === \"AbortError\") {\n throw new ApiError(\n \"Request timed out\",\n \"TIMEOUT\",\n 408,\n );\n }\n\n // Sanitize error messages to prevent credential leakage in logs/responses\n const rawMessage = error instanceof Error ? error.message : \"Unknown error\";\n throw new ApiError(\n sanitizeForLogging(rawMessage),\n \"NETWORK_ERROR\",\n 0,\n );\n }\n }\n\n /**\n * Authenticate and get user context\n */\n async authenticate(): Promise<AuthContext> {\n const context = await this.request<AuthContext>(\"GET\", \"/api/mcp/auth\");\n this.authContext = context;\n return context;\n }\n\n /**\n * Get cached auth context or authenticate\n */\n async getAuthContext(): Promise<AuthContext> {\n if (this.authContext) {\n return this.authContext;\n }\n return this.authenticate();\n }\n\n /**\n * List accessible projects\n */\n async listProjects(workspaceType?: string): Promise<Project[]> {\n const type = workspaceType || \"ALL\";\n return this.request<Project[]>(\n \"GET\",\n `/api/mcp/projects?workspaceType=${encodeURIComponent(type)}`,\n );\n }\n\n /**\n * Get single project details\n */\n async getProject(projectId: string): Promise<Project> {\n return this.request<Project>(\"GET\", `/api/mcp/projects/${projectId}`);\n }\n\n /**\n * Get project context (README, stack, conventions)\n */\n async getProjectContext(projectId: string): Promise<ProjectContext> {\n return this.request<ProjectContext>(\n \"GET\",\n `/api/mcp/projects/${projectId}/context`,\n );\n }\n\n /**\n * Create a personal project\n */\n async createPersonalProject(\n name: string,\n description: string | undefined,\n repositoryUrl: string,\n ): Promise<{ success: boolean; projectId: string }> {\n return this.request<{ success: boolean; projectId: string }>(\n \"POST\",\n \"/api/mcp/projects/personal\",\n { name, description, repositoryUrl },\n );\n }\n\n /**\n * Create a task in a project\n */\n async createTask(input: {\n projectId: string;\n epicId?: string | null;\n title: string;\n description: string;\n priority?: string;\n acceptanceCriteria: Array<{ description: string }>;\n }): Promise<{ success: boolean; taskId: string; task: Task }> {\n return this.request(\"POST\", \"/api/mcp/tasks\", input);\n }\n\n /**\n * List tasks with optional filters\n */\n async listTasks(filters: {\n projectId?: string;\n state?: TaskState;\n assigneeId?: string;\n includeArchived?: boolean;\n } = {}): Promise<Task[]> {\n const params = new URLSearchParams();\n if (filters.projectId) params.set(\"projectId\", filters.projectId);\n if (filters.state) params.set(\"state\", filters.state);\n if (filters.assigneeId) params.set(\"assigneeId\", filters.assigneeId);\n if (filters.includeArchived) params.set(\"includeArchived\", \"true\");\n\n const queryString = params.toString();\n const path = queryString ? `/api/mcp/tasks?${queryString}` : \"/api/mcp/tasks\";\n\n return this.request<Task[]>(\"GET\", path);\n }\n\n /**\n * Get full task details\n */\n async getTask(taskId: string): Promise<Task> {\n return this.request<Task>(\"GET\", `/api/mcp/tasks/${taskId}`);\n }\n\n /**\n * Assign task to current user and create branch\n */\n async assignTask(\n taskId: string,\n projectId: string,\n expectedState: TaskState = TaskState.TODO,\n ): Promise<{\n success: boolean;\n taskId: string;\n suggestedBranchName?: string;\n baseBranch?: string;\n repositoryUrl?: string;\n currentState?: string;\n message?: string;\n note?: string;\n }> {\n return this.request(\"POST\", `/api/mcp/tasks/${taskId}/assign`, {\n projectId,\n expectedState,\n });\n }\n\n /**\n * Update task progress\n */\n async updateProgress(\n taskId: string,\n data: {\n statusMessage?: string;\n completedCheckpointIds?: string[];\n currentCheckpointIndex?: number;\n },\n ): Promise<{ success: boolean; taskId: string }> {\n return this.request(\"POST\", `/api/mcp/tasks/${taskId}/progress`, data);\n }\n\n /**\n * Complete task and prepare for PR creation.\n * Returns PR suggestions for the agent to use when creating the PR locally.\n */\n async completeTask(\n taskId: string,\n projectId: string,\n pullRequestTitle?: string,\n pullRequestBody?: string,\n ): Promise<{\n success: boolean;\n taskId: string;\n suggestedPRTitle?: string;\n suggestedPRBody?: string;\n branchName?: string;\n baseBranch?: string;\n note?: string;\n }> {\n return this.request(\"POST\", `/api/mcp/tasks/${taskId}/complete`, {\n projectId,\n pullRequestTitle,\n pullRequestBody,\n });\n }\n\n /**\n * Abandon task and optionally delete branch\n */\n async abandonTask(\n taskId: string,\n projectId: string,\n deleteBranch: boolean = false,\n ): Promise<{\n success: boolean;\n taskId: string;\n state: string;\n branchDeleted: boolean;\n }> {\n return this.request(\"POST\", `/api/mcp/tasks/${taskId}/abandon`, {\n projectId,\n deleteBranch,\n });\n }\n\n /**\n * Archive a task (soft delete)\n */\n async archiveTask(\n taskId: string,\n projectId: string,\n ): Promise<{\n success: boolean;\n taskId: string;\n archivedAt: string;\n }> {\n return this.request(\"POST\", `/api/mcp/tasks/${taskId}/archive`, {\n projectId,\n });\n }\n\n /**\n * Unarchive a task (restore)\n */\n async unarchiveTask(\n taskId: string,\n projectId: string,\n ): Promise<{\n success: boolean;\n taskId: string;\n }> {\n return this.request(\"DELETE\", `/api/mcp/tasks/${taskId}/archive`, {\n projectId,\n });\n }\n\n /**\n * Report task error\n */\n async reportError(\n taskId: string,\n errorType: ErrorType,\n errorMessage: string,\n context?: string,\n ): Promise<{ success: boolean; taskId: string }> {\n return this.request(\"POST\", `/api/mcp/tasks/${taskId}/error`, {\n errorType,\n errorMessage,\n context,\n });\n }\n\n /**\n * Add note to task\n */\n async addNote(\n taskId: string,\n content: string,\n ): Promise<{ success: boolean; noteId: string }> {\n return this.request(\"POST\", `/api/mcp/tasks/${taskId}/notes`, { content });\n }\n\n /**\n * Request changes on a task in review\n */\n async requestChanges(\n taskId: string,\n projectId: string,\n reviewComments: string,\n requestedChanges?: string[],\n ): Promise<{\n success: boolean;\n taskId: string;\n noteId: string;\n message: string;\n }> {\n return this.request(\"POST\", `/api/mcp/tasks/${taskId}/request-changes`, {\n projectId,\n reviewComments,\n requestedChanges,\n });\n }\n\n /**\n * Approve a task in review and mark as DONE\n */\n async approveTask(\n taskId: string,\n projectId: string,\n reviewComments?: string,\n ): Promise<{\n success: boolean;\n taskId: string;\n message: string;\n }> {\n return this.request(\"POST\", `/api/mcp/tasks/${taskId}/approve`, {\n projectId,\n reviewComments,\n });\n }\n\n /**\n * Report branch created by agent\n */\n async reportBranch(\n taskId: string,\n projectId: string,\n branchName: string,\n ): Promise<{\n success: boolean;\n taskId: string;\n branchName: string;\n }> {\n return this.request(\"POST\", `/api/mcp/tasks/${taskId}/branch`, {\n projectId,\n branchName,\n });\n }\n\n /**\n * Report PR created by agent\n */\n async reportPR(\n taskId: string,\n projectId: string,\n pullRequestUrl: string,\n pullRequestNumber: number,\n ): Promise<{\n success: boolean;\n taskId: string;\n pullRequestUrl: string;\n pullRequestNumber: number;\n state: string;\n }> {\n return this.request(\"POST\", `/api/mcp/tasks/${taskId}/pr`, {\n projectId,\n pullRequestUrl,\n pullRequestNumber,\n });\n }\n\n /**\n * Verify a DRAFT task to move it to TODO state\n */\n async verifyTask(\n taskId: string,\n projectId: string,\n approved: boolean,\n feedback?: string,\n ): Promise<{\n success: boolean;\n taskId: string;\n previousState: string;\n newState: string;\n verificationStatus: string;\n message: string;\n feedback?: string;\n }> {\n return this.request(\"POST\", `/api/mcp/tasks/${taskId}/verify`, {\n projectId,\n approved,\n feedback,\n });\n }\n\n /**\n * Get state-appropriate prompt for a task\n */\n async getTaskPrompt(\n taskId: string,\n projectId: string,\n ): Promise<{\n success: boolean;\n taskId: string;\n state: string;\n promptType: string;\n promptDescription: string;\n prompt: string;\n }> {\n return this.request(\n \"GET\",\n `/api/mcp/tasks/${taskId}/prompt?projectId=${encodeURIComponent(projectId)}`,\n );\n }\n\n /**\n * Update task details (DRAFT/TODO states only)\n */\n async updateTask(\n taskId: string,\n projectId: string,\n data: {\n title?: string;\n description?: string;\n priority?: string;\n acceptanceCriteria?: Array<{ id?: string; description: string }>;\n },\n ): Promise<{\n success: boolean;\n taskId: string;\n previousState: string;\n newState: string;\n revertedToDraft: boolean;\n message: string;\n task: {\n id: string;\n title: string;\n description: string;\n priority: string;\n state: string;\n verificationStatus: string;\n acceptanceCriteria: Array<{ id: string; description: string; order: number }>;\n };\n }> {\n return this.request(\"PATCH\", `/api/mcp/tasks/${taskId}`, {\n projectId,\n ...data,\n });\n }\n}\n\n/**\n * Create API client from environment variables\n */\nexport function createApiClientFromEnv(): MCPApiClient {\n const baseUrl = process.env.COLLAB_BASE_URL;\n const apiKey = process.env.COLLAB_API_KEY;\n\n if (!baseUrl) {\n throw new Error(\"COLLAB_BASE_URL environment variable is required\");\n }\n\n if (!apiKey) {\n throw new Error(\"COLLAB_API_KEY environment variable is required\");\n }\n\n return new MCPApiClient({\n baseUrl,\n apiKey,\n debug: process.env.COLLAB_DEBUG === \"true\",\n });\n}\n","import { ApiKeyPermission } from \"@mtaap/core\";\n\n/**\n * Permission levels ranked by access level.\n * Using string values for compatibility between Prisma's enum and @mtaap/core enum.\n */\nconst PERMISSION_RANK: Record<string, number> = {\n READ: 1,\n WRITE: 2,\n ADMIN: 3,\n};\n\nexport interface ApiKeyPermissionContext {\n id?: string;\n permissions: \"READ\" | \"WRITE\" | \"ADMIN\" | ApiKeyPermission | null;\n}\n\nexport function assertApiKeyPermission(\n apiKey: ApiKeyPermissionContext,\n required: ApiKeyPermission,\n toolName: string,\n): void {\n const actualRank = PERMISSION_RANK[apiKey.permissions] ?? 0;\n const requiredRank = PERMISSION_RANK[required] ?? 0;\n\n if (actualRank >= requiredRank) {\n return;\n }\n\n console.warn(\"API key permission violation\", {\n keyId: apiKey.id,\n requiredPermission: required,\n actualPermission: apiKey.permissions,\n tool: toolName,\n });\n\n const error = new Error(\n `API key lacks required permissions (required: ${required})`,\n );\n (error as Error & { status?: number }).status = 403;\n throw error;\n}\n","/**\n * HTTP Authentication Middleware for MCP Server\n *\n * Validates API keys for HTTP transport connections.\n * Uses the same API key mechanism as the CLI transport.\n */\n\nimport type { Request, Response, NextFunction } from \"express\";\nimport { MCPApiClient, ApiError, AuthContext } from \"./api-client.js\";\n\n/**\n * Extended Express Request with authenticated context\n */\nexport interface AuthenticatedRequest extends Request {\n apiClient: MCPApiClient;\n authContext: AuthContext;\n}\n\n/**\n * Validate the X-API-Key header and authenticate the request.\n * Sets req.apiClient and req.authContext on success.\n *\n * @param baseUrl - The Collab webapp base URL\n */\nexport function createAuthMiddleware(baseUrl: string) {\n return async (\n req: Request,\n res: Response,\n next: NextFunction\n ): Promise<void> => {\n const apiKey = req.headers[\"x-api-key\"];\n\n if (!apiKey || typeof apiKey !== \"string\") {\n res.status(401).json({\n jsonrpc: \"2.0\",\n error: {\n code: -32001,\n message: \"Missing or invalid X-API-Key header\",\n },\n id: null,\n });\n return;\n }\n\n // Validate API key format (basic check)\n if (!apiKey.startsWith(\"collab_\")) {\n res.status(401).json({\n jsonrpc: \"2.0\",\n error: {\n code: -32001,\n message: \"Invalid API key format\",\n },\n id: null,\n });\n return;\n }\n\n try {\n // Create API client for this request\n const apiClient = new MCPApiClient({\n baseUrl,\n apiKey,\n timeout: 30000,\n });\n\n // Authenticate and get user context\n const authContext = await apiClient.authenticate();\n\n // Attach to request for downstream handlers\n (req as AuthenticatedRequest).apiClient = apiClient;\n (req as AuthenticatedRequest).authContext = authContext;\n\n next();\n } catch (error) {\n if (error instanceof ApiError) {\n const statusCode = error.status || 401;\n // Use distinct error codes: -32001 for 401 (auth), -32002 for 403 (forbidden)\n const errorCode =\n statusCode === 401 ? -32001 : statusCode === 403 ? -32002 : -32000;\n res.status(statusCode).json({\n jsonrpc: \"2.0\",\n error: {\n code: errorCode,\n message: error.message,\n },\n id: null,\n });\n return;\n }\n\n console.error(\"[collab-mcp-server] Authentication error:\", error);\n res.status(500).json({\n jsonrpc: \"2.0\",\n error: {\n code: -32000,\n message: \"Internal authentication error\",\n },\n id: null,\n });\n }\n };\n}\n"],"mappings":"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","names":["import_zod","TaskState","VerificationStatus","UserRole","ProjectType","ProjectOrigin","TaskPriority","DeploymentMode","ErrorType","PRStatus","PricingTier","ApiKeyPermission","WebSocketEventType","AuthProvider","SubscriptionStatus","EventType","VERSION","config","VERSION","config","import_zod","metrics","labelsToKey","config","express"]}
1
+ {"version":3,"sources":["../src/server.ts","../src/index.ts","../package.json","../src/version.ts","../../../packages/core/dist/constants/enums.js","../../../packages/core/dist/constants/state-machine.js","../../../packages/core/dist/constants/oauth.js","../../../packages/core/dist/config/deployment.js","../../../packages/core/dist/versions.js","../../../packages/core/dist/config/index.js","../../../packages/core/dist/types/index.js","../../../packages/core/dist/validation/index.js","../../../packages/core/dist/validation/oauth.js","../../../packages/core/dist/logging/metrics.js","../../../packages/core/dist/logging/performance-monitor.js","../../../packages/core/dist/logging/error-tracker.js","../src/api-client.ts","../src/permissions.ts","../src/apps/task-details.ts","../src/apps/helpers.ts","../src/apps/kanban.ts","../src/apps/activity.ts","../src/apps/project-overview.ts","../src/apps/agent-sessions.ts","../src/apps/index.ts","../src/auth.ts"],"sourcesContent":["#!/usr/bin/env node\n\n/**\n * Collab MCP HTTP Server\n *\n * HTTP server using StreamableHTTPServerTransport for remote MCP connections.\n * Enables Claude Desktop, Claude.ai, and Claude Mobile to connect directly\n * without requiring local installation.\n *\n * Uses the Streamable HTTP transport (2025-03-26 spec) which is the\n * recommended transport for remote MCP servers.\n */\n\nimport express from \"express\";\nimport { randomUUID } from \"node:crypto\";\nimport { StreamableHTTPServerTransport } from \"@modelcontextprotocol/sdk/server/streamableHttp.js\";\nimport { isInitializeRequest } from \"@modelcontextprotocol/sdk/types.js\";\nimport {\n initializeMCPServer,\n MCPApiClient,\n AuthContext,\n VERSION,\n} from \"./index.js\";\nimport { createAuthMiddleware, AuthenticatedRequest } from \"./auth.js\";\nimport { OAuthScopes } from \"@mtaap/core\";\n\nconst DEFAULT_PORT = 3001;\n\n/**\n * Session data stored per connection\n */\ninterface SessionData {\n transport: StreamableHTTPServerTransport;\n apiClient: MCPApiClient;\n authContext: AuthContext;\n createdAt: Date;\n lastAccessedAt: Date;\n}\n\n/**\n * In-memory session store\n * Maps session ID to session data\n */\nconst sessions: Map<string, SessionData> = new Map();\n\n/**\n * Session timeout configuration\n * Sessions inactive for longer than this duration will be cleaned up\n */\nconst SESSION_TIMEOUT_MS = 30 * 60 * 1000; // 30 minutes\nconst SESSION_CLEANUP_INTERVAL_MS = 60 * 1000; // 1 minute\n\n/**\n * Interval ID for session cleanup, stored for proper cleanup on shutdown\n */\nlet cleanupIntervalId: NodeJS.Timeout | null = null;\n\n/**\n * Periodic session cleanup to prevent memory leaks\n */\nfunction startSessionCleanup(): void {\n cleanupIntervalId = setInterval(() => {\n const now = Date.now();\n let cleanedCount = 0;\n\n for (const [id, session] of sessions.entries()) {\n if (now - session.lastAccessedAt.getTime() > SESSION_TIMEOUT_MS) {\n console.error(`[collab-mcp-server] Session timed out: ${id}`);\n session.transport.close();\n sessions.delete(id);\n cleanedCount++;\n }\n }\n\n if (cleanedCount > 0) {\n console.error(\n `[collab-mcp-server] Cleaned up ${cleanedCount} expired session(s)`,\n );\n }\n }, SESSION_CLEANUP_INTERVAL_MS);\n}\n\n/**\n * Helper to get session ID from request headers\n * Handles both string and string[] header values\n */\nfunction getSessionIdHeader(req: express.Request): string | undefined {\n const header = req.headers[\"mcp-session-id\"];\n if (Array.isArray(header)) {\n return header[0];\n }\n return header;\n}\n\n/**\n * Create and start the HTTP MCP server\n */\nasync function createHTTPServer(): Promise<void> {\n const port = parseInt(process.env.PORT || String(DEFAULT_PORT), 10);\n const baseUrl = process.env.COLLAB_BASE_URL;\n\n if (!baseUrl) {\n console.error(\n \"[collab-mcp-server] Error: COLLAB_BASE_URL environment variable is required\",\n );\n console.error(\"\\nRequired environment variables:\");\n console.error(\n \" COLLAB_BASE_URL Collab webapp URL (e.g., https://collab.mtaap.de)\",\n );\n console.error(\" PORT Server port (default: 3001)\");\n console.error(\"\\nClients must authenticate using one of:\");\n console.error(\n \" - Authorization: Bearer <token> header with OAuth access token\",\n );\n console.error(\" - X-API-Key header with their Collab API key\");\n process.exit(1);\n }\n\n // Validate URL format\n try {\n new URL(baseUrl);\n } catch {\n console.error(\n `[collab-mcp-server] Error: COLLAB_BASE_URL is not a valid URL: ${baseUrl}`,\n );\n process.exit(1);\n }\n\n const app = express();\n app.use(express.json());\n\n /**\n * Build Protected Resource Metadata response.\n * Reused by both root-level and /mcp-prefixed endpoints.\n */\n function buildProtectedResourceMetadata(req: express.Request): object {\n const protocol =\n req.headers[\"x-forwarded-proto\"] || req.protocol || \"https\";\n const host = req.headers[\"x-forwarded-host\"] || req.headers.host;\n const resourceUrl = `${protocol}://${host}/mcp`;\n\n return {\n resource: resourceUrl,\n authorization_servers: [baseUrl],\n scopes_supported: [\n OAuthScopes.READ,\n OAuthScopes.WRITE,\n OAuthScopes.ADMIN,\n ],\n bearer_methods_supported: [\"header\"],\n resource_documentation: `${baseUrl}/docs/mcp`,\n };\n }\n\n // CORS middleware for MCP endpoints\n // Required for browser-based MCP clients (Claude.ai, etc.)\n app.use((_req, res, next) => {\n const origin = _req.headers.origin;\n // Allow Claude.ai and common development origins\n const allowedOrigins = [\n \"https://claude.ai\",\n \"https://claude.com\",\n \"http://localhost:3000\",\n \"http://localhost:5173\",\n ];\n if (origin && allowedOrigins.includes(origin)) {\n res.header(\"Access-Control-Allow-Origin\", origin);\n }\n res.header(\n \"Access-Control-Allow-Methods\",\n \"GET, POST, DELETE, OPTIONS\",\n );\n res.header(\n \"Access-Control-Allow-Headers\",\n \"Content-Type, Authorization, X-API-Key, mcp-session-id\",\n );\n res.header(\"Access-Control-Expose-Headers\", \"mcp-session-id\");\n if (_req.method === \"OPTIONS\") {\n res.status(204).end();\n return;\n }\n next();\n });\n\n // Health check endpoint (no auth required)\n // Exposed at /mcp/health to match nginx routing for production deployments\n app.get(\"/mcp/health\", (_req, res) => {\n res.json({\n status: \"ok\",\n version: VERSION,\n activeSessions: sessions.size,\n timestamp: new Date().toISOString(),\n });\n });\n\n /**\n * RFC 9728 Protected Resource Metadata (root-level path)\n *\n * Per the MCP OAuth spec, clients probe this root-level .well-known\n * path to discover the OAuth authorization server. This is the primary\n * discovery endpoint that MCP clients (Claude.ai, Claude Desktop) look for.\n */\n app.get(\"/.well-known/oauth-protected-resource\", (req, res) => {\n res.json(buildProtectedResourceMetadata(req));\n });\n\n /**\n * RFC 9728 Protected Resource Metadata (legacy /mcp-prefixed path)\n *\n * Kept for backwards compatibility. In production behind nginx,\n * this path is accessible at /mcp/.well-known/oauth-protected-resource.\n */\n app.get(\"/mcp/.well-known/oauth-protected-resource\", (req, res) => {\n res.json(buildProtectedResourceMetadata(req));\n });\n\n // Auth middleware for MCP endpoints\n const authMiddleware = createAuthMiddleware(baseUrl);\n\n /**\n * POST /mcp - Handle MCP requests\n *\n * - If no session ID header: must be an initialize request to create new session\n * - If session ID header present: route to existing session's transport\n */\n app.post(\"/mcp\", authMiddleware, async (req, res) => {\n const authReq = req as AuthenticatedRequest;\n const sessionId = getSessionIdHeader(req);\n\n let sessionData: SessionData | undefined;\n\n if (sessionId) {\n // Reuse existing session\n sessionData = sessions.get(sessionId);\n if (!sessionData) {\n res.status(400).json({\n jsonrpc: \"2.0\",\n error: {\n code: -32000,\n message: \"Invalid or expired session\",\n },\n id: null,\n });\n return;\n }\n // Update last accessed time\n sessionData.lastAccessedAt = new Date();\n } else if (isInitializeRequest(req.body)) {\n // New session initialization\n const now = new Date();\n const transport = new StreamableHTTPServerTransport({\n sessionIdGenerator: () => randomUUID(),\n onsessioninitialized: (id) => {\n sessions.set(id, {\n transport,\n apiClient: authReq.apiClient,\n authContext: authReq.authContext,\n createdAt: now,\n lastAccessedAt: now,\n });\n console.error(\n `[collab-mcp-server] Session initialized: ${id} (user: ${authReq.authContext.userEmail})`,\n );\n },\n onsessionclosed: (id) => {\n sessions.delete(id);\n console.error(`[collab-mcp-server] Session closed: ${id}`);\n },\n });\n\n // Handle transport close\n transport.onclose = () => {\n if (transport.sessionId) {\n sessions.delete(transport.sessionId);\n console.error(\n `[collab-mcp-server] Transport closed for session: ${transport.sessionId}`,\n );\n }\n };\n\n // Initialize MCP server with this user's context and connect to transport\n const server = initializeMCPServer(\n authReq.apiClient,\n authReq.authContext,\n );\n await server.connect(transport);\n\n sessionData = {\n transport,\n apiClient: authReq.apiClient,\n authContext: authReq.authContext,\n createdAt: now,\n lastAccessedAt: now,\n };\n } else {\n // Not an initialize request and no session - reject\n res.status(400).json({\n jsonrpc: \"2.0\",\n error: {\n code: -32000,\n message:\n \"No session ID provided and request is not an initialize request\",\n },\n id: null,\n });\n return;\n }\n\n // Handle the request through the transport\n await sessionData.transport.handleRequest(req, res, req.body);\n });\n\n /**\n * GET /mcp - SSE stream for server notifications\n *\n * Requires mcp-session-id header to identify the session.\n */\n app.get(\"/mcp\", authMiddleware, async (req, res) => {\n const sessionId = getSessionIdHeader(req);\n\n if (!sessionId) {\n res.status(400).json({\n jsonrpc: \"2.0\",\n error: {\n code: -32000,\n message: \"mcp-session-id header is required for SSE stream\",\n },\n id: null,\n });\n return;\n }\n\n const sessionData = sessions.get(sessionId);\n if (!sessionData) {\n res.status(400).json({\n jsonrpc: \"2.0\",\n error: {\n code: -32000,\n message: \"Invalid or expired session\",\n },\n id: null,\n });\n return;\n }\n\n // Update last accessed time\n sessionData.lastAccessedAt = new Date();\n\n // Handle the SSE stream through the transport\n await sessionData.transport.handleRequest(req, res);\n });\n\n /**\n * DELETE /mcp - Terminate a session\n *\n * Requires mcp-session-id header to identify the session to terminate.\n */\n app.delete(\"/mcp\", authMiddleware, async (req, res) => {\n const sessionId = getSessionIdHeader(req);\n\n if (!sessionId) {\n res.status(400).json({\n jsonrpc: \"2.0\",\n error: {\n code: -32000,\n message: \"mcp-session-id header is required for session termination\",\n },\n id: null,\n });\n return;\n }\n\n const sessionData = sessions.get(sessionId);\n if (!sessionData) {\n res.status(400).json({\n jsonrpc: \"2.0\",\n error: {\n code: -32000,\n message: \"Invalid or expired session\",\n },\n id: null,\n });\n return;\n }\n\n // Handle the termination through the transport\n await sessionData.transport.handleRequest(req, res);\n });\n\n // Start session cleanup timer\n startSessionCleanup();\n\n // Start the server\n app.listen(port, () => {\n console.error(`[collab-mcp-server] Collab MCP HTTP Server v${VERSION}`);\n console.error(`[collab-mcp-server] Listening on http://0.0.0.0:${port}`);\n console.error(`[collab-mcp-server] MCP endpoint: POST/GET/DELETE /mcp`);\n console.error(`[collab-mcp-server] Health check: GET /mcp/health`);\n console.error(\n `[collab-mcp-server] OAuth PRM: GET /.well-known/oauth-protected-resource`,\n );\n console.error(`[collab-mcp-server] API URL: ${baseUrl}`);\n console.error(\n `[collab-mcp-server] Session timeout: ${SESSION_TIMEOUT_MS / 1000 / 60} minutes`,\n );\n });\n}\n\n/**\n * CLI entry point\n */\nfunction handleCliFlags(): void {\n const args = process.argv.slice(2);\n\n if (args.includes(\"--version\") || args.includes(\"-v\")) {\n console.log(`collab-mcp-server v${VERSION}`);\n process.exit(0);\n }\n\n if (args.includes(\"--help\") || args.includes(\"-h\")) {\n console.log(`collab-mcp-server v${VERSION}\n\nCollab MCP HTTP Server - Streamable HTTP transport for remote MCP connections\n\nUsage:\n collab-mcp-server [options]\n\nOptions:\n -v, --version Show version number\n -h, --help Show this help message\n\nEnvironment Variables:\n COLLAB_BASE_URL Collab webapp URL (required)\n PORT Server port (default: 3001)\n\nClient Authentication:\n Clients must authenticate using one of these methods:\n - X-API-Key header with their Collab API key\n - Authorization: Bearer <token> header with OAuth access token\n Each session is authenticated independently.\n\nExample deployment with Docker:\n docker run -e COLLAB_BASE_URL=https://collab.mtaap.de -p 3001:3001 mtaap/mcp-server\n\nExample client configuration (Claude Desktop):\n{\n \"mcpServers\": {\n \"collab-remote\": {\n \"url\": \"https://your-server.com/mcp\",\n \"headers\": {\n \"X-API-Key\": \"collab_your_api_key_here\"\n }\n }\n }\n}`);\n process.exit(0);\n }\n}\n\n/**\n * Graceful shutdown handling\n */\nfunction setupShutdownHandlers(): void {\n const shutdown = (signal: string): void => {\n console.error(`[collab-mcp-server] Received ${signal}, shutting down...`);\n\n // Clear the cleanup interval\n if (cleanupIntervalId) {\n clearInterval(cleanupIntervalId);\n cleanupIntervalId = null;\n }\n\n // Close all active sessions\n for (const [sessionId, sessionData] of sessions.entries()) {\n console.error(`[collab-mcp-server] Closing session: ${sessionId}`);\n sessionData.transport.close();\n }\n sessions.clear();\n\n process.exit(0);\n };\n\n process.on(\"SIGINT\", () => shutdown(\"SIGINT\"));\n process.on(\"SIGTERM\", () => shutdown(\"SIGTERM\"));\n\n // Handle uncaught exceptions\n process.on(\"uncaughtException\", (error) => {\n console.error(\"[collab-mcp-server] Uncaught exception:\", error.message);\n process.exit(1);\n });\n\n // Handle unhandled promise rejections\n process.on(\"unhandledRejection\", (reason) => {\n const message = reason instanceof Error ? reason.message : String(reason);\n console.error(\"[collab-mcp-server] Unhandled rejection:\", message);\n process.exit(1);\n });\n}\n\n// Main entry point\nhandleCliFlags();\nsetupShutdownHandlers();\n\nconsole.error(\"[collab-mcp-server] Starting Collab MCP HTTP Server...\");\ncreateHTTPServer().catch((error) => {\n console.error(\"[collab-mcp-server] Failed to start server:\", error.message);\n process.exit(1);\n});\n","/**\n * Collab MCP Server\n *\n * Model Context Protocol server for AI agent integration.\n * Uses REST API to communicate with the Collab webapp.\n */\n\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { VERSION } from \"./version.js\";\nimport { z } from \"zod\";\nimport type { Transport } from \"@modelcontextprotocol/sdk/shared/transport.js\";\nimport {\n TaskState,\n TaskPriority,\n ApiKeyPermission,\n ListProjectsInputSchema,\n ListTasksInputSchema,\n GetTaskInputSchema,\n AssignTaskInputSchema,\n UpdateProgressInputSchema,\n CompleteTaskInputSchema,\n ReportErrorInputSchema,\n GetProjectContextInputSchema,\n AddNoteInputSchema,\n AbandonTaskInputSchema,\n ArchiveTaskInputSchema,\n UnarchiveTaskInputSchema,\n CreatePersonalProjectInputSchema,\n CreateTaskMCPInputSchema,\n RequestChangesInputSchema,\n ApproveTaskInputSchema,\n ErrorType,\n VerifyTaskInputSchema,\n GetTaskPromptInputSchema,\n UpdateTaskMCPInputSchema,\n ReportBranchInputSchema,\n ReportPRInputSchema,\n} from \"@mtaap/core\";\nimport {\n MCPApiClient,\n createApiClientFromEnv,\n ApiError,\n AuthContext,\n} from \"./api-client.js\";\nimport { assertApiKeyPermission } from \"./permissions.js\";\nimport { registerMCPApps } from \"./apps/index.js\";\n\n/**\n * Server instructions for MCP Tool Search optimization.\n * Helps Claude discover and use tools effectively when dynamically loaded.\n */\nconst COLLAB_SERVER_INSTRUCTIONS = `Collab - AI-assisted software development task management platform.\n\nTOOL CATEGORIES:\n\n1. Project Discovery (READ):\n - list_projects, get_project_context, get_version\n\n2. Task Management (READ/WRITE):\n - list_tasks, get_task, create_task, update_task, archive_task, unarchive_task\n\n3. Task Verification (WRITE):\n - verify_task, get_task_prompt\n\n4. Task Execution (WRITE):\n - assign_task, update_progress, add_note, complete_task, abandon_task, report_error\n\n5. Git Operations (WRITE):\n - report_branch, report_pr\n\n6. Code Review (WRITE):\n - request_changes, approve_task\n\n7. Session Management (READ):\n - check_active_task\n\nWORKFLOWS:\n\nTask Creation & Verification:\n create_task -> get_task_prompt (DRAFT) -> verify_task(approved=true) -> task moves to TODO\n\nStandard Task Workflow:\n list_projects -> get_project_context -> list_tasks(state=TODO) -> get_task -> get_task_prompt (TODO)\n -> assign_task (returns suggested branch name and worktree path)\n -> git worktree add <worktreePath> -b <branchName> <baseBranch>\n -> cd <worktreePath>\n -> [update_progress...]\n -> git push -u origin <branchName>\n -> report_branch (tell server about the branch)\n -> complete_task (returns PR suggestions)\n -> gh pr create (local gh command)\n -> report_pr (tell server about the PR)\n -> git worktree remove <worktreePath>\n\nResume Workflow:\n check_active_task -> (if active) get_task -> get_task_prompt (IN_PROGRESS) -> update_progress -> complete_task\n\nReview Workflow:\n list_tasks(state=REVIEW) -> get_task -> approve_task OR request_changes\n\nTask Editing:\n update_task (DRAFT/TODO only) -> task stays in current state\n\nError Recovery:\n report_error -> abandon_task -> list_tasks -> assign_task (retry or pick different task)\n (abandon_task returns IN_PROGRESS tasks to TODO state)\n\nGIT OPERATIONS NOTE:\n The agent handles all git operations locally using git worktrees for isolation.\n After assign_task returns a suggested branch name and worktree path:\n 1. Create worktree: git worktree add <worktreePath> -b <branchName> <baseBranch>\n 2. Work in worktree directory: cd <worktreePath>\n 3. After completing work, push and call report_branch\n 4. After complete_task, create PR with gh and call report_pr\n 5. Clean up worktree: git worktree remove <worktreePath>\n Worktrees enable parallel task execution without git conflicts.\n\nTASK STATE FLOW:\n DRAFT -> TODO -> IN_PROGRESS -> REVIEW -> DONE\n (verify_task: DRAFT -> TODO)\n (update_task: DRAFT/TODO only, state unchanged)\n (request_changes: REVIEW -> IN_PROGRESS)\n (abandon_task: IN_PROGRESS -> TODO)\n\nCONSTRAINTS:\n- DRAFT tasks must be verified before assignment\n- verify_task requires programmatic validation (title 10+ chars, description 50+ chars, criteria 20+ chars each)\n- update_task only works on DRAFT and TODO states\n- assign_task is atomic - fails if already claimed\n- Only TODO tasks can be assigned\n- complete_task requires IN_PROGRESS state\n- request_changes/approve_task require REVIEW state\n- Always check_active_task before starting new work\n- Call update_progress frequently to checkpoint\n- Agent must have git/gh CLI configured for local git operations`;\n\n/**\n * Initialize an MCP server with all tools registered.\n * This is the core setup used by both stdio and HTTP transports.\n *\n * @param apiClient - The API client for communicating with the Collab webapp\n * @param authContext - The authenticated user context\n * @returns The configured McpServer instance (not yet connected to a transport)\n */\nexport function initializeMCPServer(\n apiClient: MCPApiClient,\n authContext: AuthContext\n): McpServer {\n const server = new McpServer(\n {\n name: \"collab\",\n version: VERSION,\n },\n {\n instructions: COLLAB_SERVER_INSTRUCTIONS,\n }\n );\n\n // Create a mock API key object for permission checking\n // The actual permission check happens server-side, this is for local validation\n const mockApiKey = {\n permissions: authContext.permissions.includes(\"ADMIN\")\n ? ApiKeyPermission.ADMIN\n : authContext.permissions.includes(\"WRITE\")\n ? ApiKeyPermission.WRITE\n : ApiKeyPermission.READ,\n };\n\n server.registerTool(\n \"list_projects\",\n {\n description:\n \"Discover all accessible projects. Use first to find project IDs. Filter by TEAM, PERSONAL, or ALL workspaces.\",\n inputSchema: {\n workspaceType: z\n .enum([\"TEAM\", \"PERSONAL\", \"ALL\"])\n .optional()\n .describe(\"Filter by workspace type\"),\n },\n },\n async (args) => {\n assertApiKeyPermission(\n mockApiKey,\n ApiKeyPermission.READ,\n \"list_projects\",\n );\n const validated = ListProjectsInputSchema.parse(args);\n\n try {\n const projects = await apiClient.listProjects(validated.workspaceType);\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(projects, null, 2),\n },\n ],\n };\n } catch (error) {\n return handleApiError(error);\n }\n },\n );\n\n server.registerTool(\n \"list_tasks\",\n {\n description:\n \"Query tasks with filters. Use state=TODO for assignable tasks, state=REVIEW for pending reviews.\",\n inputSchema: {\n projectId: z.string().optional().describe(\"Filter by project ID\"),\n state: z.nativeEnum(TaskState).optional().describe(\"Filter by task state\"),\n assigneeId: z.string().optional().describe(\"Filter by assignee ID\"),\n includeArchived: z.boolean().optional().describe(\"Include archived tasks (default: false)\"),\n },\n },\n async (args) => {\n assertApiKeyPermission(mockApiKey, ApiKeyPermission.READ, \"list_tasks\");\n const validated = ListTasksInputSchema.parse(args);\n\n try {\n const tasks = await apiClient.listTasks({\n projectId: validated.projectId,\n state: validated.state,\n assigneeId: validated.assigneeId,\n includeArchived: validated.includeArchived,\n });\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(tasks, null, 2),\n },\n ],\n };\n } catch (error) {\n return handleApiError(error);\n }\n },\n );\n\n server.registerTool(\n \"get_task\",\n {\n description:\n \"Get complete task details with acceptance criteria and notes. Call before assign_task to understand requirements.\",\n inputSchema: {\n taskId: z.string().describe(\"The task ID to retrieve\"),\n },\n },\n async (args) => {\n assertApiKeyPermission(mockApiKey, ApiKeyPermission.READ, \"get_task\");\n const validated = GetTaskInputSchema.parse(args);\n\n try {\n const task = await apiClient.getTask(validated.taskId);\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(task, null, 2),\n },\n ],\n };\n } catch (error) {\n return handleApiError(error);\n }\n },\n );\n\n server.registerTool(\n \"assign_task\",\n {\n description:\n \"Atomically claim a task. Race-safe - fails if already assigned. Task must be TODO. Returns suggested branch name and worktree path for isolated parallel development.\",\n inputSchema: {\n projectId: z.string().describe(\"The project ID\"),\n taskId: z.string().describe(\"The task ID to assign\"),\n expectedState: z\n .nativeEnum(TaskState)\n .optional()\n .describe(\"Expected task state (default: TODO)\"),\n },\n },\n async (args) => {\n assertApiKeyPermission(\n mockApiKey,\n ApiKeyPermission.WRITE,\n \"assign_task\",\n );\n const validated = AssignTaskInputSchema.parse(args);\n\n try {\n const result = await apiClient.assignTask(\n validated.taskId,\n validated.projectId,\n validated.expectedState,\n );\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n } catch (error) {\n return handleApiError(error);\n }\n },\n );\n\n server.registerTool(\n \"update_progress\",\n {\n description:\n \"Report progress and checkpoint work. Call frequently during execution. Marks acceptance criteria complete.\",\n inputSchema: {\n taskId: z.string().describe(\"The task ID to update\"),\n statusMessage: z\n .string()\n .optional()\n .describe(\"Status message (max 1000 chars)\"),\n completedCheckpointIds: z\n .array(z.string())\n .optional()\n .describe(\"Array of completed checkpoint IDs\"),\n currentCheckpointIndex: z\n .number()\n .optional()\n .describe(\"Current checkpoint index\"),\n },\n },\n async (args) => {\n assertApiKeyPermission(\n mockApiKey,\n ApiKeyPermission.WRITE,\n \"update_progress\",\n );\n const validated = UpdateProgressInputSchema.parse(args);\n\n try {\n const result = await apiClient.updateProgress(validated.taskId, {\n statusMessage: validated.statusMessage,\n completedCheckpointIds: validated.completedCheckpointIds,\n currentCheckpointIndex: validated.currentCheckpointIndex,\n });\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n } catch (error) {\n return handleApiError(error);\n }\n },\n );\n\n server.registerTool(\n \"complete_task\",\n {\n description:\n \"Prepare task for PR creation. Returns PR suggestions. After creating PR locally, call report_pr to transition to REVIEW. Requires IN_PROGRESS state.\",\n inputSchema: {\n projectId: z.string().describe(\"The project ID\"),\n taskId: z.string().describe(\"The task ID to complete\"),\n pullRequestTitle: z\n .string()\n .optional()\n .describe(\"PR title (max 300 chars)\"),\n pullRequestBody: z\n .string()\n .optional()\n .describe(\"PR body/description (max 10000 chars)\"),\n },\n },\n async (args) => {\n assertApiKeyPermission(\n mockApiKey,\n ApiKeyPermission.WRITE,\n \"complete_task\",\n );\n const validated = CompleteTaskInputSchema.parse(args);\n\n try {\n const result = await apiClient.completeTask(\n validated.taskId,\n validated.projectId,\n validated.pullRequestTitle,\n validated.pullRequestBody,\n );\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n } catch (error) {\n return handleApiError(error);\n }\n },\n );\n\n server.registerTool(\n \"check_active_task\",\n {\n description:\n \"Check for resumable work from previous session. Always call before starting new work.\",\n },\n async () => {\n assertApiKeyPermission(\n mockApiKey,\n ApiKeyPermission.READ,\n \"check_active_task\",\n );\n\n // This is a local file operation, no API call needed\n const result = await checkActiveTask();\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n },\n );\n\n server.registerTool(\n \"report_error\",\n {\n description:\n \"Report unrecoverable errors (BUILD_FAILURE, TEST_FAILURE, CONFLICT, AUTH_ERROR). Consider abandon_task after.\",\n inputSchema: {\n taskId: z.string().describe(\"The task ID\"),\n errorType: z\n .nativeEnum(ErrorType)\n .describe(\"Error type: BUILD_FAILURE, TEST_FAILURE, CONFLICT, AUTH_ERROR, OTHER\"),\n errorMessage: z.string().describe(\"Error message (max 1000 chars)\"),\n context: z.string().optional().describe(\"Additional context (max 2000 chars)\"),\n },\n },\n async (args) => {\n assertApiKeyPermission(\n mockApiKey,\n ApiKeyPermission.WRITE,\n \"report_error\",\n );\n const validated = ReportErrorInputSchema.parse(args);\n\n try {\n const result = await apiClient.reportError(\n validated.taskId,\n validated.errorType,\n validated.errorMessage,\n validated.context,\n );\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n } catch (error) {\n return handleApiError(error);\n }\n },\n );\n\n server.registerTool(\n \"get_project_context\",\n {\n description:\n \"Load project README, tech stack, and coding conventions. Call after selecting project.\",\n inputSchema: {\n projectId: z.string().describe(\"The project ID\"),\n },\n },\n async (args) => {\n assertApiKeyPermission(\n mockApiKey,\n ApiKeyPermission.READ,\n \"get_project_context\",\n );\n const validated = GetProjectContextInputSchema.parse(args);\n\n try {\n const context = await apiClient.getProjectContext(validated.projectId);\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(context, null, 2),\n },\n ],\n };\n } catch (error) {\n return handleApiError(error);\n }\n },\n );\n\n server.registerTool(\n \"add_note\",\n {\n description:\n \"Document implementation decisions. Notes persist for future reference and handoff.\",\n inputSchema: {\n taskId: z.string().describe(\"The task ID\"),\n content: z.string().describe(\"Note content (max 500 chars)\"),\n },\n },\n async (args) => {\n assertApiKeyPermission(mockApiKey, ApiKeyPermission.WRITE, \"add_note\");\n const validated = AddNoteInputSchema.parse(args);\n\n try {\n const result = await apiClient.addNote(\n validated.taskId,\n validated.content,\n );\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n } catch (error) {\n return handleApiError(error);\n }\n },\n );\n\n server.registerTool(\n \"abandon_task\",\n {\n description:\n \"Release task assignment and optionally clean up branch. Task returns to TODO. Use after errors.\",\n inputSchema: {\n projectId: z.string().describe(\"The project ID\"),\n taskId: z.string().describe(\"The task ID to abandon\"),\n deleteBranch: z\n .boolean()\n .optional()\n .describe(\"Whether to delete the associated branch\"),\n },\n },\n async (args) => {\n assertApiKeyPermission(\n mockApiKey,\n ApiKeyPermission.WRITE,\n \"abandon_task\",\n );\n const validated = AbandonTaskInputSchema.parse(args);\n\n try {\n const result = await apiClient.abandonTask(\n validated.taskId,\n validated.projectId,\n validated.deleteBranch,\n );\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n } catch (error) {\n return handleApiError(error);\n }\n },\n );\n\n server.registerTool(\n \"report_branch\",\n {\n description:\n \"Report a branch created by the agent. Call after using git to create and push a branch. Task must be IN_PROGRESS.\",\n inputSchema: {\n projectId: z.string().describe(\"The project ID\"),\n taskId: z.string().describe(\"The task ID\"),\n branchName: z.string().describe(\"Name of the branch created (e.g., feature/TASK-123-fix-login)\"),\n },\n },\n async (args) => {\n assertApiKeyPermission(\n mockApiKey,\n ApiKeyPermission.WRITE,\n \"report_branch\",\n );\n const validated = ReportBranchInputSchema.parse(args);\n\n try {\n const result = await apiClient.reportBranch(\n validated.taskId,\n validated.projectId,\n validated.branchName,\n );\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n } catch (error) {\n return handleApiError(error);\n }\n },\n );\n\n server.registerTool(\n \"report_pr\",\n {\n description:\n \"Report a PR created by the agent. Call after using gh pr create. Transitions task to REVIEW state.\",\n inputSchema: {\n projectId: z.string().describe(\"The project ID\"),\n taskId: z.string().describe(\"The task ID\"),\n pullRequestUrl: z.string().describe(\"Full URL of the created PR (e.g., https://github.com/owner/repo/pull/123)\"),\n pullRequestNumber: z.number().describe(\"PR number (e.g., 123)\"),\n },\n },\n async (args) => {\n assertApiKeyPermission(\n mockApiKey,\n ApiKeyPermission.WRITE,\n \"report_pr\",\n );\n const validated = ReportPRInputSchema.parse(args);\n\n try {\n const result = await apiClient.reportPR(\n validated.taskId,\n validated.projectId,\n validated.pullRequestUrl,\n validated.pullRequestNumber,\n );\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n } catch (error) {\n return handleApiError(error);\n }\n },\n );\n\n server.registerTool(\n \"archive_task\",\n {\n description: \"Soft-delete a task. Hidden but restorable via unarchive_task.\",\n inputSchema: {\n projectId: z.string().describe(\"The project ID\"),\n taskId: z.string().describe(\"The task ID to archive\"),\n },\n },\n async (args) => {\n assertApiKeyPermission(\n mockApiKey,\n ApiKeyPermission.WRITE,\n \"archive_task\",\n );\n const validated = ArchiveTaskInputSchema.parse(args);\n\n try {\n const result = await apiClient.archiveTask(\n validated.taskId,\n validated.projectId,\n );\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n } catch (error) {\n return handleApiError(error);\n }\n },\n );\n\n server.registerTool(\n \"unarchive_task\",\n {\n description: \"Restore previously archived task to original state.\",\n inputSchema: {\n projectId: z.string().describe(\"The project ID\"),\n taskId: z.string().describe(\"The task ID to restore\"),\n },\n },\n async (args) => {\n assertApiKeyPermission(\n mockApiKey,\n ApiKeyPermission.WRITE,\n \"unarchive_task\",\n );\n const validated = UnarchiveTaskInputSchema.parse(args);\n\n try {\n const result = await apiClient.unarchiveTask(\n validated.taskId,\n validated.projectId,\n );\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n } catch (error) {\n return handleApiError(error);\n }\n },\n );\n\n server.registerTool(\n \"create_personal_project\",\n {\n description:\n \"Create new project in personal workspace linked to GitHub repository.\",\n inputSchema: {\n name: z.string().describe(\"Project name (max 100 chars)\"),\n description: z.string().optional().describe(\"Project description (max 500 chars)\"),\n repositoryUrl: z.string().describe(\"GitHub repository URL\"),\n },\n },\n async (args) => {\n assertApiKeyPermission(\n mockApiKey,\n ApiKeyPermission.WRITE,\n \"create_personal_project\",\n );\n const validated = CreatePersonalProjectInputSchema.parse(args);\n\n try {\n const result = await apiClient.createPersonalProject(\n validated.name,\n validated.description,\n validated.repositoryUrl,\n );\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n } catch (error) {\n return handleApiError(error);\n }\n },\n );\n\n server.registerTool(\n \"create_task\",\n {\n description:\n \"Create task with title, description, acceptance criteria. Starts in DRAFT. Priority: LOW/MEDIUM/HIGH/CRITICAL.\",\n inputSchema: {\n projectId: z.string().describe(\"The project ID to create the task in\"),\n epicId: z\n .string()\n .nullable()\n .optional()\n .describe(\"Optional epic ID to associate the task with\"),\n title: z.string().describe(\"Task title (max 200 chars)\"),\n description: z.string().describe(\"Task description (max 5000 chars)\"),\n priority: z\n .nativeEnum(TaskPriority)\n .optional()\n .describe(\"Task priority: LOW, MEDIUM, HIGH, CRITICAL (default: MEDIUM)\"),\n acceptanceCriteria: z\n .array(\n z.object({\n description: z\n .string()\n .describe(\"Acceptance criterion description (max 500 chars)\"),\n }),\n )\n .describe(\"Array of acceptance criteria (at least 1 required)\"),\n },\n },\n async (args) => {\n assertApiKeyPermission(\n mockApiKey,\n ApiKeyPermission.WRITE,\n \"create_task\",\n );\n const validated = CreateTaskMCPInputSchema.parse(args);\n\n try {\n const result = await apiClient.createTask({\n projectId: validated.projectId,\n epicId: validated.epicId,\n title: validated.title,\n description: validated.description,\n priority: validated.priority,\n acceptanceCriteria: validated.acceptanceCriteria,\n });\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n } catch (error) {\n return handleApiError(error);\n }\n },\n );\n\n server.registerTool(\n \"request_changes\",\n {\n description:\n \"Return task from REVIEW to IN_PROGRESS with feedback. Original assignee addresses changes.\",\n inputSchema: {\n projectId: z.string().describe(\"The project ID\"),\n taskId: z.string().describe(\"The task ID to review\"),\n reviewComments: z.string().describe(\"Review comments explaining requested changes (max 5000 chars)\"),\n requestedChanges: z\n .array(z.string())\n .optional()\n .describe(\"List of specific changes requested\"),\n },\n },\n async (args) => {\n assertApiKeyPermission(\n mockApiKey,\n ApiKeyPermission.WRITE,\n \"request_changes\",\n );\n const validated = RequestChangesInputSchema.parse(args);\n\n try {\n const result = await apiClient.requestChanges(\n validated.taskId,\n validated.projectId,\n validated.reviewComments,\n validated.requestedChanges,\n );\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n } catch (error) {\n return handleApiError(error);\n }\n },\n );\n\n server.registerTool(\n \"approve_task\",\n {\n description: \"Approve completed work and mark DONE. Only for REVIEW state tasks.\",\n inputSchema: {\n projectId: z.string().describe(\"The project ID\"),\n taskId: z.string().describe(\"The task ID to approve\"),\n reviewComments: z\n .string()\n .optional()\n .describe(\"Optional approval comments (max 2000 chars)\"),\n },\n },\n async (args) => {\n assertApiKeyPermission(\n mockApiKey,\n ApiKeyPermission.WRITE,\n \"approve_task\",\n );\n const validated = ApproveTaskInputSchema.parse(args);\n\n try {\n const result = await apiClient.approveTask(\n validated.taskId,\n validated.projectId,\n validated.reviewComments,\n );\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n } catch (error) {\n return handleApiError(error);\n }\n },\n );\n\n server.registerTool(\n \"verify_task\",\n {\n description:\n \"Verify a DRAFT task and move it to TODO state. Requires task to pass programmatic validation (title 10+ chars, description 50+ chars, each criterion 20+ chars). If approved=false, stores feedback with NEEDS_REVISION status.\",\n inputSchema: {\n projectId: z.string().describe(\"The project ID\"),\n taskId: z.string().describe(\"The task ID to verify\"),\n approved: z.boolean().describe(\"Whether to approve the task\"),\n feedback: z\n .string()\n .optional()\n .describe(\"Feedback for the task (required if not approved)\"),\n },\n },\n async (args) => {\n assertApiKeyPermission(mockApiKey, ApiKeyPermission.WRITE, \"verify_task\");\n const validated = VerifyTaskInputSchema.parse(args);\n\n try {\n const result = await apiClient.verifyTask(\n validated.taskId,\n validated.projectId,\n validated.approved,\n validated.feedback,\n );\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n } catch (error) {\n return handleApiError(error);\n }\n },\n );\n\n server.registerTool(\n \"get_task_prompt\",\n {\n description:\n \"Get state-appropriate prompt for a task. Returns verify prompt for DRAFT, assignment prompt for TODO, or continue prompt for IN_PROGRESS tasks.\",\n inputSchema: {\n projectId: z.string().describe(\"The project ID\"),\n taskId: z.string().describe(\"The task ID\"),\n },\n },\n async (args) => {\n assertApiKeyPermission(\n mockApiKey,\n ApiKeyPermission.READ,\n \"get_task_prompt\",\n );\n const validated = GetTaskPromptInputSchema.parse(args);\n\n try {\n const result = await apiClient.getTaskPrompt(\n validated.taskId,\n validated.projectId,\n );\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n } catch (error) {\n return handleApiError(error);\n }\n },\n );\n\n server.registerTool(\n \"update_task\",\n {\n description:\n \"Update task details (title, description, priority, acceptanceCriteria). Only works for DRAFT and TODO states. Task stays in its current state.\",\n inputSchema: {\n projectId: z.string().describe(\"The project ID\"),\n taskId: z.string().describe(\"The task ID to update\"),\n title: z.string().optional().describe(\"New task title\"),\n description: z.string().optional().describe(\"New task description\"),\n priority: z\n .nativeEnum(TaskPriority)\n .optional()\n .describe(\"New task priority\"),\n acceptanceCriteria: z\n .array(\n z.object({\n id: z.string().optional().describe(\"Existing criterion ID (for updates)\"),\n description: z.string().describe(\"Criterion description\"),\n }),\n )\n .optional()\n .describe(\"New acceptance criteria (replaces existing)\"),\n },\n },\n async (args) => {\n assertApiKeyPermission(mockApiKey, ApiKeyPermission.WRITE, \"update_task\");\n const validated = UpdateTaskMCPInputSchema.parse(args);\n\n try {\n const result = await apiClient.updateTask(\n validated.taskId,\n validated.projectId,\n {\n title: validated.title,\n description: validated.description,\n priority: validated.priority,\n acceptanceCriteria: validated.acceptanceCriteria,\n },\n );\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n } catch (error) {\n return handleApiError(error);\n }\n },\n );\n\n server.registerTool(\n \"get_version\",\n {\n description: \"Check MCP server version and connectivity.\",\n },\n async () => {\n assertApiKeyPermission(mockApiKey, ApiKeyPermission.READ, \"get_version\");\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(\n {\n version: VERSION,\n timestamp: new Date().toISOString(),\n },\n null,\n 2,\n ),\n },\n ],\n };\n },\n );\n\n // Register MCP Apps (interactive UI tools)\n registerMCPApps(server, apiClient, authContext);\n\n return server;\n}\n\n/**\n * Connect an MCP server to a transport.\n *\n * @param server - The MCP server instance\n * @param transport - The transport to connect to\n */\nexport async function connectMCPServer(\n server: McpServer,\n transport: Transport\n): Promise<void> {\n await server.connect(transport);\n}\n\n/**\n * Create and start an MCP server with stdio transport.\n * This is the main entry point for CLI usage (collab-mcp command).\n *\n * Creates the API client, authenticates, initializes the server with all tools,\n * and connects to stdio transport for communication with Claude Code.\n */\nexport async function createMCPServer(): Promise<void> {\n // Create API client from environment\n const apiClient = createApiClientFromEnv();\n\n // Authenticate and get user context\n let authContext: AuthContext;\n try {\n authContext = await apiClient.authenticate();\n } catch (error) {\n if (error instanceof ApiError) {\n throw new Error(`Authentication failed: ${error.message}`);\n }\n throw error;\n }\n\n // Initialize the MCP server with all tools\n const server = initializeMCPServer(apiClient, authContext);\n\n // Connect to stdio transport\n const transport = new StdioServerTransport();\n await connectMCPServer(server, transport);\n}\n\n/**\n * Handle API errors and return appropriate MCP response\n */\nfunction handleApiError(error: unknown): {\n content: Array<{ type: \"text\"; text: string }>;\n isError: boolean;\n} {\n if (error instanceof ApiError) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: JSON.stringify(\n {\n error: error.message,\n code: error.code,\n status: error.status,\n details: error.details,\n },\n null,\n 2,\n ),\n },\n ],\n isError: true,\n };\n }\n\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [\n {\n type: \"text\" as const,\n text: JSON.stringify({ error: message }, null, 2),\n },\n ],\n isError: true,\n };\n}\n\n/**\n * Schema for validating active task file contents\n */\nconst ActiveTaskSchema = z.object({\n taskId: z.string().min(1),\n projectId: z.string().min(1),\n branchName: z.string().optional(),\n worktreePath: z.string().optional(),\n startedAt: z.string().optional(),\n});\n\n/**\n * Check for active task file (local operation, no API needed)\n * Includes protection against symlink attacks and path traversal.\n */\nasync function checkActiveTask() {\n const fs = await import(\"fs\");\n const path = await import(\"path\");\n\n const cwd = process.cwd();\n const collabDir = path.join(cwd, \".collab\");\n const activeTaskPath = path.join(collabDir, \"active-task.json\");\n\n try {\n // Resolve the path and verify it's within the .collab directory\n const resolvedPath = path.resolve(activeTaskPath);\n const resolvedCollabDir = path.resolve(collabDir);\n\n if (!resolvedPath.startsWith(resolvedCollabDir + path.sep) && resolvedPath !== resolvedCollabDir) {\n // Path traversal attempt detected\n return {\n hasActiveTask: false,\n task: null,\n error: \"Invalid active task path\",\n };\n }\n\n // Check for symlinks to prevent symlink attacks\n const stats = await fs.promises.lstat(activeTaskPath);\n if (stats.isSymbolicLink()) {\n // Symlink detected - reject to prevent reading arbitrary files\n return {\n hasActiveTask: false,\n task: null,\n error: \"Symlinks not allowed for active task file\",\n };\n }\n\n if (!stats.isFile()) {\n return {\n hasActiveTask: false,\n task: null,\n };\n }\n\n const content = await fs.promises.readFile(activeTaskPath, \"utf-8\");\n\n // Parse and validate the JSON content\n let parsed: unknown;\n try {\n parsed = JSON.parse(content);\n } catch {\n return {\n hasActiveTask: false,\n task: null,\n error: \"Invalid JSON in active task file\",\n };\n }\n\n // Validate against schema to ensure expected structure\n const validationResult = ActiveTaskSchema.safeParse(parsed);\n if (!validationResult.success) {\n return {\n hasActiveTask: false,\n task: null,\n error: \"Active task file has invalid structure\",\n };\n }\n\n return {\n hasActiveTask: true,\n task: validationResult.data,\n };\n } catch (err) {\n // Distinguish between \"file not found\" and other errors\n if (err instanceof Error && \"code\" in err && err.code === \"ENOENT\") {\n return {\n hasActiveTask: false,\n task: null,\n };\n }\n // Log unexpected errors but don't expose details\n return {\n hasActiveTask: false,\n task: null,\n error: \"Failed to read active task file\",\n };\n }\n}\n\n// Re-export types and functions needed by HTTP server\nexport { MCPApiClient, ApiError } from \"./api-client.js\";\nexport type { AuthContext } from \"./api-client.js\";\nexport { VERSION } from \"./version.js\";\n","{\n \"name\": \"@mtaap/mcp\",\n \"version\": \"0.5.1\",\n \"description\": \"Model Context Protocol (MCP) server for AI agents to interact with Collab - the multi-tenant collaborative agent development platform\",\n \"mcpName\": \"collab\",\n \"scripts\": {\n \"build\": \"pnpm build:ui && tsup\",\n \"build:ui\": \"node scripts/build-ui.mjs\",\n \"dev:ui\": \"vite build --watch\"\n },\n \"main\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"bin\": {\n \"mcp\": \"./dist/cli.js\",\n \"collab-mcp\": \"./dist/cli.js\",\n \"collab-mcp-server\": \"./dist/server.js\"\n },\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"require\": \"./dist/index.js\"\n }\n },\n \"files\": [\n \"dist\"\n ],\n \"keywords\": [\n \"mcp\",\n \"model-context-protocol\",\n \"ai\",\n \"agent\",\n \"collaboration\",\n \"task-management\",\n \"claude\",\n \"anthropic\"\n ],\n \"license\": \"Proprietary\",\n \"author\": \"MTAAP Contributors\",\n \"engines\": {\n \"node\": \">=18.18.0\"\n },\n \"dependencies\": {\n \"@modelcontextprotocol/sdk\": \"^1.0.0\",\n \"@modelcontextprotocol/ext-apps\": \"^1.0.1\",\n \"express\": \"^5.0.1\",\n \"zod\": \"^4.3.5\"\n },\n \"devDependencies\": {\n \"@mtaap/config-typescript\": \"workspace:*\",\n \"@mtaap/core\": \"workspace:*\",\n \"@types/express\": \"^5.0.0\",\n \"@types/node\": \"^22.0.0\",\n \"@types/react\": \"^19.0.0\",\n \"@types/react-dom\": \"^19.0.0\",\n \"@vitejs/plugin-react\": \"^4.4.0\",\n \"autoprefixer\": \"^10.4.21\",\n \"postcss\": \"^8.5.3\",\n \"react\": \"^19.0.0\",\n \"react-dom\": \"^19.0.0\",\n \"tailwindcss\": \"^3.4.17\",\n \"tsup\": \"^8.5.1\",\n \"typescript\": \"^5.4.0\",\n \"vite\": \"^6.3.2\",\n \"vite-plugin-singlefile\": \"^2.0.3\"\n }\n}\n","import packageJson from \"../package.json\";\n\nexport const VERSION = packageJson.version;\n","/**\n * Task State Enum\n */\nexport var TaskState;\n(function (TaskState) {\n TaskState[\"DRAFT\"] = \"DRAFT\";\n TaskState[\"TODO\"] = \"TODO\";\n /** @deprecated Use DRAFT instead - kept for PostgreSQL compatibility */\n TaskState[\"BACKLOG\"] = \"BACKLOG\";\n /** @deprecated Use TODO instead - kept for PostgreSQL compatibility */\n TaskState[\"READY\"] = \"READY\";\n TaskState[\"IN_PROGRESS\"] = \"IN_PROGRESS\";\n TaskState[\"REVIEW\"] = \"REVIEW\";\n TaskState[\"DONE\"] = \"DONE\";\n})(TaskState || (TaskState = {}));\n/**\n * Verification Status Enum\n */\nexport var VerificationStatus;\n(function (VerificationStatus) {\n VerificationStatus[\"PENDING\"] = \"PENDING\";\n VerificationStatus[\"PASSED\"] = \"PASSED\";\n VerificationStatus[\"NEEDS_REVISION\"] = \"NEEDS_REVISION\";\n})(VerificationStatus || (VerificationStatus = {}));\n/**\n * User Role Enum\n */\nexport var UserRole;\n(function (UserRole) {\n UserRole[\"ADMIN\"] = \"ADMIN\";\n UserRole[\"MEMBER\"] = \"MEMBER\";\n})(UserRole || (UserRole = {}));\n/**\n * Project Type Enum\n */\nexport var ProjectType;\n(function (ProjectType) {\n ProjectType[\"TEAM\"] = \"TEAM\";\n ProjectType[\"PERSONAL\"] = \"PERSONAL\";\n})(ProjectType || (ProjectType = {}));\n/**\n * Project Origin Enum\n */\nexport var ProjectOrigin;\n(function (ProjectOrigin) {\n ProjectOrigin[\"CREATED\"] = \"CREATED\";\n ProjectOrigin[\"PROMOTED\"] = \"PROMOTED\";\n})(ProjectOrigin || (ProjectOrigin = {}));\n/**\n * Task Priority Enum\n */\nexport var TaskPriority;\n(function (TaskPriority) {\n TaskPriority[\"LOW\"] = \"LOW\";\n TaskPriority[\"MEDIUM\"] = \"MEDIUM\";\n TaskPriority[\"HIGH\"] = \"HIGH\";\n TaskPriority[\"CRITICAL\"] = \"CRITICAL\";\n})(TaskPriority || (TaskPriority = {}));\n/**\n * Deployment Mode Enum\n */\nexport var DeploymentMode;\n(function (DeploymentMode) {\n DeploymentMode[\"SAAS\"] = \"saas\";\n DeploymentMode[\"ONPREM\"] = \"onprem\";\n})(DeploymentMode || (DeploymentMode = {}));\n/**\n * Error Type Enum (for agent error reporting)\n */\nexport var ErrorType;\n(function (ErrorType) {\n ErrorType[\"BUILD_FAILURE\"] = \"BUILD_FAILURE\";\n ErrorType[\"TEST_FAILURE\"] = \"TEST_FAILURE\";\n ErrorType[\"CONFLICT\"] = \"CONFLICT\";\n ErrorType[\"AUTH_ERROR\"] = \"AUTH_ERROR\";\n ErrorType[\"OTHER\"] = \"OTHER\";\n})(ErrorType || (ErrorType = {}));\n/**\n * Pull Request Status Enum\n */\nexport var PRStatus;\n(function (PRStatus) {\n PRStatus[\"OPEN\"] = \"OPEN\";\n PRStatus[\"CLOSED\"] = \"CLOSED\";\n PRStatus[\"MERGED\"] = \"MERGED\";\n PRStatus[\"DELETED\"] = \"DELETED\";\n})(PRStatus || (PRStatus = {}));\n/**\n * Pricing Tier Enum\n */\nexport var PricingTier;\n(function (PricingTier) {\n PricingTier[\"FREE\"] = \"FREE\";\n PricingTier[\"PRO\"] = \"PRO\";\n PricingTier[\"ENTERPRISE\"] = \"ENTERPRISE\";\n})(PricingTier || (PricingTier = {}));\n/**\n * API Key Permission Levels\n */\nexport var ApiKeyPermission;\n(function (ApiKeyPermission) {\n ApiKeyPermission[\"READ\"] = \"READ\";\n ApiKeyPermission[\"WRITE\"] = \"WRITE\";\n ApiKeyPermission[\"ADMIN\"] = \"ADMIN\";\n})(ApiKeyPermission || (ApiKeyPermission = {}));\n/**\n * WebSocket Event Types\n */\nexport var WebSocketEventType;\n(function (WebSocketEventType) {\n WebSocketEventType[\"TASK_ASSIGNED\"] = \"task.assigned\";\n WebSocketEventType[\"TASK_ABANDONED\"] = \"task.abandoned\";\n WebSocketEventType[\"TASK_PROGRESS\"] = \"task.progress\";\n WebSocketEventType[\"TASK_PR_CREATED\"] = \"task.pr_created\";\n WebSocketEventType[\"TASK_REVIEW_REQUESTED\"] = \"task.review_requested\";\n WebSocketEventType[\"TASK_COMPLETED\"] = \"task.completed\";\n WebSocketEventType[\"TASK_ERROR\"] = \"task.error\";\n WebSocketEventType[\"TASK_STATE_CHANGED\"] = \"task.state_changed\";\n WebSocketEventType[\"TASK_UPDATED\"] = \"task.updated\";\n WebSocketEventType[\"TASK_DELETED\"] = \"task.deleted\";\n WebSocketEventType[\"MEMBER_JOINED\"] = \"member.joined\";\n // Agent session events\n WebSocketEventType[\"AGENT_STARTED\"] = \"agent.started\";\n WebSocketEventType[\"AGENT_OUTPUT\"] = \"agent.output\";\n WebSocketEventType[\"AGENT_STOPPED\"] = \"agent.stopped\";\n WebSocketEventType[\"AGENT_ERROR\"] = \"agent.error\";\n})(WebSocketEventType || (WebSocketEventType = {}));\n/**\n * Subscription Status Enum\n */\nexport var SubscriptionStatus;\n(function (SubscriptionStatus) {\n SubscriptionStatus[\"ACTIVE\"] = \"ACTIVE\";\n SubscriptionStatus[\"INACTIVE\"] = \"INACTIVE\";\n SubscriptionStatus[\"PAST_DUE\"] = \"PAST_DUE\";\n SubscriptionStatus[\"CANCELED\"] = \"CANCELED\";\n SubscriptionStatus[\"INCOMPLETE\"] = \"INCOMPLETE\";\n})(SubscriptionStatus || (SubscriptionStatus = {}));\n/**\n * Audit Event Types\n */\nexport var EventType;\n(function (EventType) {\n EventType[\"AUTH\"] = \"AUTH\";\n EventType[\"AUTHORIZATION\"] = \"AUTHORIZATION\";\n EventType[\"ACCESS\"] = \"ACCESS\";\n EventType[\"MODIFICATION\"] = \"MODIFICATION\";\n})(EventType || (EventType = {}));\n/**\n * Created Via Enum - tracks how entries were created\n */\nexport var CreatedVia;\n(function (CreatedVia) {\n CreatedVia[\"UI\"] = \"UI\";\n CreatedVia[\"API_KEY\"] = \"API_KEY\";\n CreatedVia[\"OAUTH\"] = \"OAUTH\";\n})(CreatedVia || (CreatedVia = {}));\n/**\n * Agent Model Enum - supported AI models for agent spawning\n */\nexport var AgentModel;\n(function (AgentModel) {\n AgentModel[\"OPUS\"] = \"OPUS\";\n AgentModel[\"SONNET\"] = \"SONNET\";\n AgentModel[\"HAIKU\"] = \"HAIKU\";\n})(AgentModel || (AgentModel = {}));\n/**\n * Agent Model Mode Enum - how to configure the model for agent spawning\n * - DEFAULT: Use CLI's native/configured model (no --model flag)\n * - PRESET: Use haiku/sonnet/opus preset\n * - CUSTOM: Use custom model ID string (e.g., claude-opus-4-5-20251101)\n */\nexport var AgentModelMode;\n(function (AgentModelMode) {\n AgentModelMode[\"DEFAULT\"] = \"DEFAULT\";\n AgentModelMode[\"PRESET\"] = \"PRESET\";\n AgentModelMode[\"CUSTOM\"] = \"CUSTOM\";\n})(AgentModelMode || (AgentModelMode = {}));\n/**\n * Agent CLI Type Enum - supported CLI tools for agent spawning\n */\nexport var AgentCLIType;\n(function (AgentCLIType) {\n AgentCLIType[\"CLAUDE_CODE\"] = \"CLAUDE_CODE\";\n AgentCLIType[\"OPENCODE\"] = \"OPENCODE\";\n})(AgentCLIType || (AgentCLIType = {}));\n/**\n * Agent Session Status\n */\nexport var AgentSessionStatus;\n(function (AgentSessionStatus) {\n AgentSessionStatus[\"STARTING\"] = \"STARTING\";\n AgentSessionStatus[\"RUNNING\"] = \"RUNNING\";\n AgentSessionStatus[\"STOPPING\"] = \"STOPPING\";\n AgentSessionStatus[\"STOPPED\"] = \"STOPPED\";\n AgentSessionStatus[\"ERROR\"] = \"ERROR\";\n})(AgentSessionStatus || (AgentSessionStatus = {}));\n","import { TaskState } from \"./enums\";\n// Valid state transitions for Kanban board drag-and-drop\n// Forward: DRAFT -> TODO -> IN_PROGRESS -> REVIEW -> DONE\n// Backward: Any state can move back to earlier states (except DONE which is final)\n// DONE is terminal - cannot be changed once completed\n// Note: BACKLOG and READY are deprecated but kept for PostgreSQL compatibility\nconst VALID_TRANSITIONS = {\n [TaskState.DRAFT]: [TaskState.TODO],\n [TaskState.TODO]: [TaskState.DRAFT, TaskState.IN_PROGRESS],\n // Deprecated: BACKLOG transitions to DRAFT (its replacement)\n [TaskState.BACKLOG]: [TaskState.DRAFT, TaskState.TODO],\n // Deprecated: READY transitions to TODO (its replacement)\n [TaskState.READY]: [TaskState.TODO, TaskState.IN_PROGRESS],\n [TaskState.IN_PROGRESS]: [\n TaskState.DRAFT,\n TaskState.TODO,\n TaskState.REVIEW,\n ],\n [TaskState.REVIEW]: [\n TaskState.DRAFT,\n TaskState.TODO,\n TaskState.IN_PROGRESS,\n TaskState.DONE,\n ],\n [TaskState.DONE]: [],\n};\nexport function isValidStateTransition(from, to) {\n if (from === to)\n return true;\n return VALID_TRANSITIONS[from]?.includes(to) ?? false;\n}\nexport function getValidNextStates(current) {\n return VALID_TRANSITIONS[current] ?? [];\n}\nexport function validateStateTransition(from, to) {\n if (from === to) {\n return { valid: true };\n }\n if (!isValidStateTransition(from, to)) {\n const validNext = getValidNextStates(from);\n const validStates = validNext.length > 0 ? validNext.join(\", \") : \"none\";\n return {\n valid: false,\n error: `Invalid state transition from ${from} to ${to}. Valid transitions: ${validStates}`,\n };\n }\n return { valid: true };\n}\n","/**\n * OAuth 2.1 Constants\n *\n * Configuration values for OAuth 2.1 implementation.\n * Follows RFC 6749, RFC 7636 (PKCE), RFC 7591 (DCR), RFC 9728.\n */\nimport { ApiKeyPermission } from \"./enums\";\n// ============================================\n// OAuth Scopes\n// ============================================\n/**\n * Available OAuth scopes for MCP access.\n * Maps to ApiKeyPermission for consistent authorization.\n */\nexport const OAuthScopes = {\n /** Read-only access to MCP resources */\n READ: \"mcp:read\",\n /** Read and write access to MCP resources */\n WRITE: \"mcp:write\",\n /** Full administrative access */\n ADMIN: \"mcp:admin\",\n};\n/**\n * All valid OAuth scopes\n */\nexport const VALID_OAUTH_SCOPES = [\n OAuthScopes.READ,\n OAuthScopes.WRITE,\n OAuthScopes.ADMIN,\n];\n/**\n * Default scopes granted if none specified\n */\nexport const DEFAULT_OAUTH_SCOPES = `${OAuthScopes.READ} ${OAuthScopes.WRITE}`;\n/**\n * Maps OAuth scopes to ApiKeyPermission levels\n */\nexport const OAUTH_SCOPE_TO_PERMISSION = {\n [OAuthScopes.READ]: ApiKeyPermission.READ,\n [OAuthScopes.WRITE]: ApiKeyPermission.WRITE,\n [OAuthScopes.ADMIN]: ApiKeyPermission.ADMIN,\n};\n/**\n * Maps ApiKeyPermission levels to OAuth scopes\n */\nexport const PERMISSION_TO_OAUTH_SCOPE = {\n [ApiKeyPermission.READ]: OAuthScopes.READ,\n [ApiKeyPermission.WRITE]: OAuthScopes.WRITE,\n [ApiKeyPermission.ADMIN]: OAuthScopes.ADMIN,\n};\n/**\n * Get the highest permission level from a set of scopes\n */\nexport function getPermissionFromScopes(scopes) {\n const scopeArray = scopes.split(\" \").filter(Boolean);\n if (scopeArray.includes(OAuthScopes.ADMIN)) {\n return ApiKeyPermission.ADMIN;\n }\n if (scopeArray.includes(OAuthScopes.WRITE)) {\n return ApiKeyPermission.WRITE;\n }\n return ApiKeyPermission.READ;\n}\n/**\n * Validate and normalize scopes string\n */\nexport function normalizeScopes(scopes) {\n if (!scopes) {\n return DEFAULT_OAUTH_SCOPES;\n }\n const requestedScopes = scopes.split(\" \").filter(Boolean);\n const validScopes = requestedScopes.filter((s) => VALID_OAUTH_SCOPES.includes(s));\n return validScopes.length > 0 ? validScopes.join(\" \") : DEFAULT_OAUTH_SCOPES;\n}\n// ============================================\n// Token Lifetimes\n// ============================================\n/**\n * Token lifetime configuration (in milliseconds)\n */\nexport const OAuthTokenLifetimes = {\n /** Access token lifetime: 1 hour */\n ACCESS_TOKEN_MS: 60 * 60 * 1000,\n /** Refresh token lifetime: 30 days */\n REFRESH_TOKEN_MS: 30 * 24 * 60 * 60 * 1000,\n /** Authorization code lifetime: 10 minutes */\n AUTHORIZATION_CODE_MS: 10 * 60 * 1000,\n};\n/**\n * Token lifetime in seconds (for OAuth responses)\n */\nexport const OAuthTokenLifetimesSeconds = {\n /** Access token lifetime: 1 hour (3600 seconds) */\n ACCESS_TOKEN: 3600,\n /** Refresh token lifetime: 30 days (2592000 seconds) */\n REFRESH_TOKEN: 2592000,\n};\n// ============================================\n// Grant Types\n// ============================================\n/**\n * Supported OAuth grant types\n *\n * Note: Grant types are stored as lowercase strings in JSON fields (not database enum).\n * The database enum `oauthGrantTypeEnum` is only for PostgreSQL enum type definition.\n */\nexport const OAuthGrantTypes = {\n AUTHORIZATION_CODE: \"authorization_code\",\n REFRESH_TOKEN: \"refresh_token\",\n};\nexport const SUPPORTED_GRANT_TYPES = [\n OAuthGrantTypes.AUTHORIZATION_CODE,\n OAuthGrantTypes.REFRESH_TOKEN,\n];\n// ============================================\n// Response Types\n// ============================================\n/**\n * Supported OAuth response types\n */\nexport const OAuthResponseTypes = {\n CODE: \"code\",\n};\n// ============================================\n// Token Endpoint Auth Methods\n// ============================================\n/**\n * Supported token endpoint authentication methods\n *\n * Note: Token endpoint auth methods are stored as lowercase strings in JSON fields.\n * The database enum `oauthTokenEndpointAuthMethodEnum` uses UPPERCASE values\n * (per AGENTS.md Rule 1) but JSON fields use lowercase per OAuth spec.\n */\nexport const OAuthTokenEndpointAuthMethods = {\n /** No authentication (public clients with PKCE) */\n NONE: \"none\",\n /** Client secret in POST body */\n CLIENT_SECRET_POST: \"client_secret_post\",\n /** Client secret via Basic auth */\n CLIENT_SECRET_BASIC: \"client_secret_basic\",\n};\n/**\n * Map database enum values (UPPERCASE) to OAuth spec (lowercase)\n * Used when reading from database and sending to OAuth clients\n */\nexport function mapDbTokenEndpointAuthMethodToLowercase(method) {\n const mapping = {\n NONE: \"none\",\n CLIENT_SECRET_POST: \"client_secret_post\",\n CLIENT_SECRET_BASIC: \"client_secret_basic\",\n };\n return mapping[method];\n}\n// ============================================\n// PKCE\n// ============================================\n/**\n * Supported PKCE code challenge methods\n * Only S256 is supported per OAuth 2.1 security recommendations\n */\nexport const OAuthCodeChallengeMethods = {\n S256: \"S256\",\n};\n// ============================================\n// OAuth Error Codes\n// ============================================\n/**\n * OAuth 2.0 error codes (RFC 6749)\n */\nexport const OAuthErrorCodes = {\n INVALID_REQUEST: \"invalid_request\",\n UNAUTHORIZED_CLIENT: \"unauthorized_client\",\n ACCESS_DENIED: \"access_denied\",\n UNSUPPORTED_RESPONSE_TYPE: \"unsupported_response_type\",\n INVALID_SCOPE: \"invalid_scope\",\n SERVER_ERROR: \"server_error\",\n TEMPORARILY_UNAVAILABLE: \"temporarily_unavailable\",\n INVALID_CLIENT: \"invalid_client\",\n INVALID_GRANT: \"invalid_grant\",\n UNSUPPORTED_GRANT_TYPE: \"unsupported_grant_type\",\n};\n// ============================================\n// Rate Limiting\n// ============================================\n/**\n * Rate limit configuration for OAuth endpoints\n */\nexport const OAuthRateLimits = {\n /** /oauth/token: 30 requests per minute per client */\n TOKEN_ENDPOINT: { limit: 30, windowMs: 60 * 1000 },\n /** /oauth/authorize: 10 requests per minute per user */\n AUTHORIZE_ENDPOINT: { limit: 10, windowMs: 60 * 1000 },\n /** /oauth/register: 5 requests per minute per IP */\n REGISTER_ENDPOINT: { limit: 5, windowMs: 60 * 1000 },\n};\n// ============================================\n// Token Format\n// ============================================\n/**\n * Token prefix for identifying Collab OAuth tokens\n */\nexport const OAUTH_TOKEN_PREFIX = \"mcp_\";\n/**\n * Client ID prefix for dynamically registered clients\n */\nexport const DYNAMIC_CLIENT_ID_PREFIX = \"mcp_client_\";\n/**\n * Length of generated tokens/secrets (in bytes, hex encoded = 2x)\n */\nexport const OAuthTokenLengths = {\n /** Access token: 32 bytes = 64 hex chars */\n ACCESS_TOKEN: 32,\n /** Refresh token: 32 bytes = 64 hex chars */\n REFRESH_TOKEN: 32,\n /** Authorization code: 32 bytes = 64 hex chars */\n AUTHORIZATION_CODE: 32,\n /** Client ID: 16 bytes = 32 hex chars */\n CLIENT_ID: 16,\n /** Client secret: 32 bytes = 64 hex chars */\n CLIENT_SECRET: 32,\n /** Registration access token: 32 bytes = 64 hex chars */\n REGISTRATION_ACCESS_TOKEN: 32,\n};\n","export const config = {\n deploymentMode: (process.env.DEPLOYMENT_MODE || \"saas\"),\n};\nexport const isSaas = config.deploymentMode === \"saas\";\nexport const isOnPrem = config.deploymentMode === \"onprem\";\nexport function getBaseURL() {\n if (config.deploymentMode === \"onprem\") {\n return process.env.COLLAB_BASE_URL || \"http://localhost:3000\";\n }\n return process.env.COLLAB_BASE_URL || \"https://app.mtaap.io\";\n}\n// Note: Stripe is managed by RevenueCat in SaaS mode - no direct Stripe config needed\n// RevenueCat handles all payment processing internally\nexport function getEmailConfig() {\n return {\n host: process.env.SMTP_HOST || \"mail.mtaap.de\",\n port: parseInt(process.env.SMTP_PORT || \"587\", 10),\n user: process.env.SMTP_USER,\n password: process.env.SMTP_PASSWORD,\n from: process.env.SMTP_FROM || \"noreply@mtaap.de\",\n secure: process.env.SMTP_SECURE === \"true\",\n };\n}\nexport function isEmailConfigured() {\n const config = getEmailConfig();\n // Email is configured if SMTP credentials are set\n return Boolean(config.user && config.password);\n}\nexport function getDatabaseConfig() {\n return {\n url: process.env.DATABASE_URL,\n shadowDbUrl: process.env.DATABASE_SHADOW_URL,\n };\n}\nexport function getLDAPConfig() {\n return {\n enabled: process.env.LDAP_ENABLED === \"true\",\n url: process.env.LDAP_URL,\n bindDN: process.env.LDAP_BIND_DN,\n bindCredentials: process.env.LDAP_BIND_CREDENTIALS,\n searchBase: process.env.LDAP_SEARCH_BASE,\n };\n}\nexport function getSentryConfig() {\n return {\n dsn: process.env.SENTRY_DSN,\n environment: process.env.NODE_ENV || \"development\",\n };\n}\nexport function getLogConfig() {\n return {\n level: process.env.LOG_LEVEL || \"info\",\n };\n}\n","export const VERSIONS = {\n core: \"0.4.0\",\n web: \"0.4.0\",\n mcp: \"0.5.0\",\n};\nexport const VERSION = VERSIONS.core;\n","import { PricingTier } from \"../constants/enums\";\n// Re-export deployment and Supabase config utilities\nexport * from \"./deployment\";\nexport * from \"./supabase\";\nimport { VERSION, VERSIONS } from \"../versions\";\nconst DEPLOYMENT_MODE = (process.env.DEPLOYMENT_MODE ||\n \"saas\");\nexport const config = {\n version: VERSION,\n packages: VERSIONS,\n deploymentMode: DEPLOYMENT_MODE,\n billing: {\n enabled: DEPLOYMENT_MODE === \"saas\",\n revenuecat: {\n publicKey: process.env.NEXT_PUBLIC_REVENUECAT_PUBLIC_KEY,\n },\n },\n licensing: {\n enabled: DEPLOYMENT_MODE === \"onprem\",\n licenseKey: process.env.LICENSE_KEY,\n },\n auth: {\n credentials: true,\n ldap: process.env.LDAP_ENABLED === \"true\",\n },\n git: {\n deleteMergedBranches: process.env.DELETE_MERGED_BRANCHES !== \"false\",\n enforceConventionalCommits: process.env.ENFORCE_CONVENTIONAL_COMMITS === \"true\",\n defaultBaseBranch: process.env.DEFAULT_BASE_BRANCH || \"develop\",\n },\n pricing: {\n maxPersonalProjects: {\n FREE: 2,\n PRO: 5,\n ENTERPRISE: 10,\n },\n maxCollaboratorsPerProject: {\n FREE: 3,\n PRO: -1,\n ENTERPRISE: -1,\n },\n maxProjectsPerOrg: {\n FREE: 5,\n PRO: -1,\n ENTERPRISE: -1,\n },\n maxSeats: {\n FREE: 3,\n PRO: -1,\n ENTERPRISE: -1,\n },\n // Default seats when subscription doesn't specify an explicit seat count\n defaultSeats: {\n FREE: 3,\n PRO: 10,\n ENTERPRISE: 999999,\n },\n },\n features: {\n stripe: {\n enabled: DEPLOYMENT_MODE === \"saas\",\n },\n gitlab: {\n enabled: true,\n },\n ldap: {\n enabled: process.env.LDAP_ENABLED === \"true\",\n },\n auditLogs: {\n enabled: process.env.AUDIT_LOGS_ENABLED === \"true\",\n },\n },\n api: {\n apiKey: {\n defaultExpiryDays: 90,\n prefix: \"usr_\",\n },\n rateLimit: {\n requestsPerMinute: 100,\n requestsPerHour: 1000,\n },\n },\n agent: {\n defaultModel: \"SONNET\",\n sessionTimeoutMs: 30 * 60 * 1000, // 30 minutes\n maxSessionDurationMs: 4 * 60 * 60 * 1000, // 4 hours\n maxConcurrentSessions: {\n FREE: 1,\n PRO: 5,\n ENTERPRISE: -1,\n },\n },\n limits: {\n projectNameMaxLength: 100,\n taskDescriptionMaxLength: 5000,\n notesMaxLength: 500,\n conventionsNotesMaxLength: 500,\n recentCompletedTasksLimit: 10,\n },\n};\nexport function getConfig(key) {\n return config[key];\n}\nexport function isFeatureEnabled(feature) {\n const featureConfig = config.features[feature];\n if (typeof featureConfig === \"object\" && \"enabled\" in featureConfig) {\n return featureConfig.enabled;\n }\n return true;\n}\nexport function getPricingLimits(tier) {\n return {\n maxPersonalProjects: config.pricing.maxPersonalProjects[tier],\n maxCollaboratorsPerProject: config.pricing.maxCollaboratorsPerProject[tier],\n maxProjectsPerOrg: config.pricing.maxProjectsPerOrg[tier],\n maxSeats: config.pricing.maxSeats[tier],\n maxConcurrentAgents: config.agent.maxConcurrentSessions[tier],\n };\n}\n/**\n * Default seat allocations per pricing tier.\n * Used when a subscription doesn't specify an explicit seat count.\n */\nexport const DEFAULT_SEAT_LIMITS = {\n [PricingTier.FREE]: config.pricing.defaultSeats.FREE,\n [PricingTier.PRO]: config.pricing.defaultSeats.PRO,\n [PricingTier.ENTERPRISE]: config.pricing.defaultSeats.ENTERPRISE,\n};\n","import { z } from \"zod\";\nimport { TaskState, TaskPriority, UserRole, ProjectType, ProjectOrigin, ErrorType, PRStatus, PricingTier, ApiKeyPermission, } from \"../constants/enums\";\nexport * from \"../constants/enums\";\n// Note: z is exported from validation/index.ts - do not export here to avoid ambiguity\n/**\n * User Types\n */\nexport const UserIdSchema = z.string().regex(/^usr_[a-zA-Z0-9]+$/);\nexport const UserSchema = z.object({\n id: UserIdSchema,\n email: z.string().email(),\n name: z.string().min(1).max(255),\n role: z.nativeEnum(UserRole),\n organizationId: z.string().optional(),\n lastActiveAt: z.coerce.date().optional(),\n createdAt: z.coerce.date(),\n});\nexport const OrganizationUserSchema = z.object({\n id: z.number().int(),\n userId: UserIdSchema,\n organizationId: z.string(),\n roleId: z.nativeEnum(UserRole).optional(),\n user: UserSchema.pick({ id: true, email: true, name: true, role: true }),\n createdAt: z.coerce.date(),\n});\n/**\n * Organization/Tenant Types\n */\nexport const OrganizationIdSchema = z.string().regex(/^org_[a-zA-Z0-9]+$/);\nexport const OrganizationSchema = z.object({\n id: OrganizationIdSchema,\n name: z.string().min(1).max(255),\n logoUrl: z.string().url().nullable(),\n accentColor: z\n .string()\n .regex(/^#[0-9A-Fa-f]{6}$/)\n .nullable(),\n tenantName: z.string().nullable(),\n pricingTier: z.nativeEnum(PricingTier),\n createdAt: z.coerce.date(),\n});\nexport const OrganizationSettingsSchema = z.object({\n organizationId: OrganizationIdSchema,\n ldapEnabled: z.boolean(),\n ldapUrl: z.string().url().nullable(),\n ldapBindDN: z.string().nullable(),\n ldapSearchBase: z.string().nullable(),\n deleteMergedBranches: z.boolean(),\n enforceConventionalCommits: z.boolean(),\n maxPersonalProjectsPerUser: z.number().int().min(0),\n});\n/**\n * Tag Types (for access control)\n */\nexport const TagSchema = z.object({\n id: z.string(),\n name: z.string().min(1).max(50),\n organizationId: OrganizationIdSchema,\n createdAt: z.coerce.date(),\n});\n/**\n * Project Types\n */\nexport const ProjectIdSchema = z.string().regex(/^prj_[a-zA-Z0-9]+$/);\nexport const ProjectSchema = z.object({\n id: ProjectIdSchema,\n name: z.string().min(1).max(100),\n description: z.string().max(500).nullable(),\n type: z.nativeEnum(ProjectType),\n origin: z.nativeEnum(ProjectOrigin),\n organizationId: OrganizationIdSchema,\n ownerId: UserIdSchema.nullable(),\n repositoryUrl: z.string().url(),\n baseBranch: z.string().default(\"develop\"),\n tags: z.array(z.string()),\n createdAt: z.coerce.date(),\n updatedAt: z.coerce.date(),\n});\n/**\n * Epic Types\n */\nexport const EpicIdSchema = z.string().regex(/^epc_[a-zA-Z0-9]+$/);\nexport const EpicSchema = z.object({\n id: EpicIdSchema,\n projectId: ProjectIdSchema,\n name: z.string().min(1).max(200),\n description: z.string().nullable(),\n createdAt: z.coerce.date(),\n updatedAt: z.coerce.date(),\n});\n/**\n * Task/User Story Types\n */\nexport const TaskIdSchema = z.string().regex(/^tsk_[a-zA-Z0-9]+$/);\nexport function generateTaskDisplayId(taskCuid) {\n const lastChars = taskCuid.slice(-3).toUpperCase();\n return `TASK-${lastChars}`;\n}\nexport const TaskSchema = z.object({\n id: TaskIdSchema,\n projectId: ProjectIdSchema,\n epicId: EpicIdSchema.nullable(),\n title: z.string().min(1).max(200),\n description: z.string().max(5000),\n state: z.nativeEnum(TaskState),\n priority: z.nativeEnum(TaskPriority),\n assigneeId: UserIdSchema.nullable(),\n createdBy: UserIdSchema.nullable(),\n assignedAt: z.coerce.date().nullable(),\n startedAt: z.coerce.date().nullable(),\n completedAt: z.coerce.date().nullable(),\n branchName: z.string().nullable(),\n pullRequestUrl: z.string().url().nullable(),\n pullRequestNumber: z.number().int().nullable(),\n pullRequestStatus: z.nativeEnum(PRStatus).nullable(),\n errorType: z.nativeEnum(ErrorType).nullable(),\n errorMessage: z.string().max(1000).nullable(),\n createdAt: z.coerce.date(),\n updatedAt: z.coerce.date(),\n});\nexport const AcceptanceCriterionSchema = z.object({\n id: z.string(),\n taskId: TaskIdSchema,\n description: z.string().min(1).max(500),\n completed: z.boolean(),\n completedAt: z.coerce.date().nullable(),\n order: z.number().int(),\n createdAt: z.coerce.date(),\n});\nexport const ProgressUpdateSchema = z.object({\n id: z.string(),\n taskId: TaskIdSchema,\n userId: UserIdSchema,\n message: z.string().max(2000),\n checkpoints: z.array(z.string()).optional(),\n createdAt: z.coerce.date(),\n});\nexport const TaskNoteSchema = z.object({\n id: z.string(),\n taskId: TaskIdSchema,\n userId: UserIdSchema,\n content: z.string().max(500),\n createdAt: z.coerce.date(),\n});\n/**\n * API Key Types\n */\nexport const ApiKeyIdSchema = z.string().regex(/^key_[a-zA-Z0-9]+$/);\nexport const ApiKeySchema = z.object({\n id: ApiKeyIdSchema,\n userId: UserIdSchema,\n name: z.string().min(1).max(100),\n keyHash: z.string(),\n permissions: z.nativeEnum(ApiKeyPermission),\n lastUsedAt: z.coerce.date().nullable(),\n expiresAt: z.coerce.date().nullable(),\n revoked: z.boolean(),\n createdAt: z.coerce.date(),\n});\n/**\n * Subscription/Seat Types\n */\nexport const SubscriptionIdSchema = z.string();\nexport const SubscriptionSchema = z.object({\n id: SubscriptionIdSchema,\n organizationId: OrganizationIdSchema,\n pricingTier: z.nativeEnum(PricingTier),\n seats: z.number().int().min(0),\n stripeSubscriptionId: z.string().nullable(),\n stripeCustomerId: z.string().nullable(),\n status: z.enum([\"active\", \"past_due\", \"canceled\", \"incomplete\"]),\n currentPeriodStart: z.coerce.date(),\n currentPeriodEnd: z.coerce.date(),\n createdAt: z.coerce.date(),\n});\n/**\n * Collaboration Types\n */\nexport const ProjectCollaboratorSchema = z.object({\n id: z.string(),\n projectId: ProjectIdSchema,\n userId: UserIdSchema,\n addedBy: UserIdSchema,\n createdAt: z.coerce.date(),\n});\n","import { z } from \"zod\";\nimport { TaskState, TaskPriority, UserRole, ProjectType, ErrorType, ApiKeyPermission, } from \"../constants/enums\";\nexport * from \"../constants/enums\";\nexport * from \"./tier-validation\";\nexport * from \"./task-quality\";\nexport * from \"./oauth\";\nexport { z };\n/**\n * Validation Schemas for MCP Server Tools\n */\nexport const ListProjectsInputSchema = z.object({\n workspaceType: z.preprocess((val) => (typeof val === \"string\" ? val.toUpperCase() : val), z.enum([\"TEAM\", \"PERSONAL\", \"ALL\"]).optional()),\n});\nexport const ListTasksInputSchema = z.object({\n projectId: z.string().optional(),\n state: z.nativeEnum(TaskState).optional(),\n assigneeId: z.string().optional(),\n includeArchived: z.boolean().optional(),\n});\n// CUID format: alphanumeric lowercase, typically 25 chars (e.g., cmkiwtmrp0002r6uvdhzzlyta)\n// Also accept prefixed format for backwards compatibility (tsk_, prj_, etc.)\nconst cuidOrPrefixedId = z.string().regex(/^([a-z0-9]+|[a-z]+_[a-zA-Z0-9]+)$/);\n/**\n * Git branch name validator - prevents injection attacks via malicious branch names.\n * Rules based on git-check-ref-format:\n * - Must start with alphanumeric character\n * - Can contain alphanumeric, hyphens, underscores, dots, and forward slashes\n * - Cannot start or end with a dot or hyphen\n * - Cannot contain: .., @{, consecutive slashes, or end with .lock\n * - Cannot contain shell metacharacters or path traversal sequences\n */\nconst gitBranchName = z\n .string()\n .min(1)\n .max(100)\n .regex(/^[a-zA-Z0-9][-a-zA-Z0-9._/]*[a-zA-Z0-9]$|^[a-zA-Z0-9]$/, \"Branch name must start and end with alphanumeric character\")\n .refine((val) => !val.includes(\"..\") &&\n !val.includes(\"@{\") &&\n !val.includes(\"//\") &&\n !val.endsWith(\".lock\") &&\n !val.includes(\"~\") &&\n !val.includes(\"^\") &&\n !val.includes(\":\") &&\n !val.includes(\"?\") &&\n !val.includes(\"*\") &&\n !val.includes(\"[\") &&\n !val.includes(\"\\\\\") &&\n !val.includes(\" \") &&\n !val.includes(\";\") &&\n !val.includes(\"&\") &&\n !val.includes(\"|\") &&\n !val.includes(\"$\") &&\n !val.includes(\"`\") &&\n !val.includes(\"'\") &&\n !val.includes('\"') &&\n !val.includes(\"<\") &&\n !val.includes(\">\") &&\n !val.includes(\"(\") &&\n !val.includes(\")\"), \"Invalid branch name: contains forbidden characters or sequences\");\nexport const GetTaskInputSchema = z.object({\n taskId: cuidOrPrefixedId,\n});\nexport const AssignTaskInputSchema = z.object({\n projectId: cuidOrPrefixedId,\n taskId: cuidOrPrefixedId,\n expectedState: z.nativeEnum(TaskState).default(TaskState.TODO),\n});\nexport const UpdateProgressInputSchema = z.object({\n taskId: cuidOrPrefixedId,\n statusMessage: z.string().max(1000).optional(),\n completedCheckpointIds: z.array(z.string()).optional(),\n currentCheckpointIndex: z.number().int().optional(),\n});\nexport const CompleteTaskInputSchema = z.object({\n projectId: cuidOrPrefixedId,\n taskId: cuidOrPrefixedId,\n pullRequestTitle: z.string().min(1).max(300).optional(),\n pullRequestBody: z.string().max(10000).optional(),\n});\nexport const ReportErrorInputSchema = z.object({\n taskId: cuidOrPrefixedId,\n errorType: z.nativeEnum(ErrorType),\n errorMessage: z.string().min(1).max(1000),\n context: z.string().max(2000).optional(),\n});\nexport const GetProjectContextInputSchema = z.object({\n projectId: cuidOrPrefixedId,\n});\nexport const AddNoteInputSchema = z.object({\n taskId: cuidOrPrefixedId,\n content: z.string().min(1).max(500),\n});\nexport const AbandonTaskInputSchema = z.object({\n projectId: cuidOrPrefixedId,\n taskId: cuidOrPrefixedId,\n deleteBranch: z.boolean().optional(),\n});\nexport const RequestChangesInputSchema = z.object({\n projectId: cuidOrPrefixedId,\n taskId: cuidOrPrefixedId,\n reviewComments: z.string().min(1).max(5000),\n requestedChanges: z.array(z.string().min(1).max(500)).optional(),\n});\nexport const ApproveTaskInputSchema = z.object({\n projectId: cuidOrPrefixedId,\n taskId: cuidOrPrefixedId,\n reviewComments: z.string().max(2000).optional(),\n});\nexport const ArchiveTaskInputSchema = z.object({\n projectId: cuidOrPrefixedId,\n taskId: cuidOrPrefixedId,\n});\nexport const UnarchiveTaskInputSchema = z.object({\n projectId: cuidOrPrefixedId,\n taskId: cuidOrPrefixedId,\n});\nexport const CreatePersonalProjectInputSchema = z.object({\n name: z.string().min(1).max(100),\n description: z.string().max(500).optional(),\n repositoryUrl: z.string().url(),\n});\nexport const CheckActiveTaskInputSchema = z.object({});\nexport const CreateTaskMCPInputSchema = z.object({\n projectId: cuidOrPrefixedId,\n epicId: cuidOrPrefixedId.nullable().optional(),\n title: z.string().min(1).max(200),\n description: z.string().max(5000),\n priority: z.nativeEnum(TaskPriority).default(TaskPriority.MEDIUM),\n acceptanceCriteria: z\n .array(z.object({\n description: z.string().min(1).max(500),\n }))\n .min(1),\n});\n/**\n * Validation Schemas for Webapp API Routes\n */\nexport const CreateOrganizationInputSchema = z.object({\n name: z.string().min(1).max(255),\n});\nexport const UpdateOrganizationInputSchema = z.object({\n organizationId: cuidOrPrefixedId,\n name: z.string().min(1).max(255).optional(),\n logoUrl: z.string().url().nullable().optional(),\n accentColor: z\n .string()\n .regex(/^#[0-9A-Fa-f]{6}$/, \"Invalid hex color format. Expected #RRGGBB\")\n .nullable()\n .optional(),\n tenantName: z.string().max(255).nullable().optional(),\n});\nexport const CreateProjectInputSchema = z.object({\n name: z.string().min(1).max(100),\n description: z.string().max(500).optional(),\n type: z.nativeEnum(ProjectType),\n repositoryUrl: z.string().url(),\n baseBranch: z.string().default(\"develop\").optional(),\n tags: z.array(z.string()).default([]),\n});\nexport const UpdateProjectInputSchema = z.object({\n projectId: z.string().min(1).optional(),\n name: z.string().min(1).max(100).optional(),\n description: z.string().max(500).optional(),\n repositoryUrl: z.string().url().optional(),\n baseBranch: z.string().optional(),\n tags: z.array(z.string()).optional(),\n allowMemberArchive: z.boolean().optional(),\n localRepoPath: z.string().max(500).optional(),\n});\nexport const CreateEpicInputSchema = z.object({\n projectId: cuidOrPrefixedId,\n name: z.string().min(1).max(200),\n description: z.string().max(2000).optional(),\n});\nexport const CreateTaskInputSchema = z.object({\n projectId: z.string().min(1),\n epicId: z.string().min(1).nullable().optional(),\n title: z.string().min(1).max(200),\n description: z.string().max(5000),\n priority: z.nativeEnum(TaskPriority).default(TaskPriority.MEDIUM),\n acceptanceCriteria: z\n .array(z.object({\n description: z.string().min(1).max(500),\n }))\n .min(1),\n});\nexport const UpdateTaskInputSchema = z.object({\n taskId: z.string().min(1),\n title: z.string().min(1).max(200).optional(),\n description: z.string().max(5000).optional(),\n priority: z.nativeEnum(TaskPriority).optional(),\n state: z.nativeEnum(TaskState).optional(),\n assigneeId: z.string().nullable().optional(),\n acceptanceCriteria: z\n .array(z.object({\n id: z.string().optional(),\n description: z.string().min(1).max(500),\n completed: z.boolean().optional(),\n }))\n .optional(),\n});\nexport const AssignTaskWebappInputSchema = z.object({\n taskId: z.string().min(1),\n userId: z.string().min(1),\n});\nexport const CreateTagInputSchema = z.object({\n organizationId: cuidOrPrefixedId,\n name: z\n .string()\n .min(1)\n .max(50)\n .regex(/^[a-zA-Z0-9\\s-]+$/),\n});\nexport const UpdateTagInputSchema = z.object({\n name: z\n .string()\n .min(1)\n .max(50)\n .regex(/^[a-zA-Z0-9\\s-]+$/),\n});\nexport const UpdateOrganizationSettingsInputSchema = z.object({\n organizationId: cuidOrPrefixedId,\n ldapEnabled: z.boolean().optional(),\n ldapUrl: z.string().url().nullable().optional(),\n ldapBindDN: z.string().nullable().optional(),\n ldapSearchBase: z.string().nullable().optional(),\n deleteMergedBranches: z.boolean().optional(),\n enforceConventionalCommits: z.boolean().optional(),\n maxPersonalProjectsPerUser: z.number().int().min(0).optional(),\n logoUrl: z.string().url().nullable().optional(),\n accentColor: z\n .string()\n .regex(/^#[0-9A-Fa-f]{6}$/, \"Invalid hex color format. Expected #RRGGBB\")\n .nullable()\n .optional(),\n tenantName: z.string().max(255).nullable().optional(),\n});\nexport const InviteUserInputSchema = z.object({\n organizationId: cuidOrPrefixedId,\n email: z.string().email(),\n role: z.nativeEnum(UserRole).default(UserRole.MEMBER),\n tags: z.array(z.string()).default([]),\n});\nexport const AssignUserTagsInputSchema = z.object({\n userId: cuidOrPrefixedId,\n tags: z.array(z.string()).min(0),\n});\nexport const InviteCollaboratorInputSchema = z.object({\n projectId: cuidOrPrefixedId,\n email: z.string().email(),\n});\nexport const PublishProjectInputSchema = z.object({\n projectId: cuidOrPrefixedId,\n transferOwnership: z.boolean().default(false),\n tags: z.array(z.string()).min(1),\n});\nexport const GenerateApiKeyInputSchema = z.object({\n name: z.string().min(1).max(100),\n publicNickname: z.string().max(50).optional(),\n expiresInDays: z.number().int().min(1).max(365).default(90),\n permissions: z.nativeEnum(ApiKeyPermission).default(ApiKeyPermission.WRITE),\n});\nexport const UpdateApiKeyInputSchema = z.object({\n publicNickname: z.string().max(50).nullable().optional(),\n scopedOrganizationId: z.string().optional().nullable(),\n scopedProjectIds: z.array(z.string()).optional(),\n});\nexport const RevokeApiKeyInputSchema = z.object({\n keyId: cuidOrPrefixedId,\n});\n/**\n * Validation Schemas for Authentication\n */\nexport const LoginInputSchema = z.object({\n email: z.string().email(),\n password: z.string().min(8).max(255),\n});\nexport const RegisterInputSchema = z.object({\n email: z.string().email(),\n password: z.string().min(8).max(255),\n name: z.string().min(1).max(255),\n});\n/**\n * Validation Schemas for Task Verification Workflow\n */\nexport const VerifyTaskInputSchema = z.object({\n projectId: cuidOrPrefixedId,\n taskId: cuidOrPrefixedId,\n approved: z.boolean(),\n feedback: z.string().max(5000).optional(),\n});\nexport const GetTaskPromptInputSchema = z.object({\n projectId: cuidOrPrefixedId,\n taskId: cuidOrPrefixedId,\n});\nexport const UpdateTaskMCPInputSchema = z.object({\n projectId: cuidOrPrefixedId,\n taskId: cuidOrPrefixedId,\n title: z.string().min(1).max(200).optional(),\n description: z.string().max(5000).optional(),\n priority: z.nativeEnum(TaskPriority).optional(),\n acceptanceCriteria: z\n .array(z.object({\n id: z.string().optional(),\n description: z.string().min(1).max(500),\n }))\n .optional(),\n});\n/**\n * Validation Schemas for Agent-Delegated Git Operations\n */\nexport const ReportBranchInputSchema = z.object({\n projectId: cuidOrPrefixedId,\n taskId: cuidOrPrefixedId,\n branchName: gitBranchName,\n});\nexport const ReportPRInputSchema = z.object({\n projectId: cuidOrPrefixedId,\n taskId: cuidOrPrefixedId,\n pullRequestUrl: z.string().url(),\n pullRequestNumber: z.number().int().positive(),\n});\n","/**\n * OAuth 2.1 Validation Schemas\n *\n * Zod schemas for validating OAuth requests and responses.\n */\nimport { z } from \"zod\";\nimport { OAuthGrantTypes, OAuthResponseTypes, OAuthCodeChallengeMethods, VALID_OAUTH_SCOPES, } from \"../constants/oauth\";\n// ============================================\n// Common Validators\n// ============================================\n/**\n * Validate a space-separated scope string\n */\nconst scopeString = z\n .string()\n .optional()\n .transform((val) => {\n if (!val)\n return undefined;\n const scopes = val.split(\" \").filter(Boolean);\n const validScopes = scopes.filter((s) => VALID_OAUTH_SCOPES.includes(s));\n return validScopes.length > 0 ? validScopes.join(\" \") : undefined;\n});\n/**\n * Validate redirect URI - must be HTTPS or localhost for development\n */\nconst redirectUri = z\n .string()\n .url()\n .refine((uri) => {\n const url = new URL(uri);\n // Allow https or localhost for development\n return (url.protocol === \"https:\" ||\n url.hostname === \"localhost\" ||\n url.hostname === \"127.0.0.1\");\n}, { message: \"redirect_uri must use HTTPS or be localhost\" });\n/**\n * Validate PKCE code verifier (43-128 chars, unreserved characters only)\n */\nconst codeVerifier = z\n .string()\n .min(43)\n .max(128)\n .regex(/^[A-Za-z0-9._~-]+$/, \"code_verifier must only contain unreserved characters\");\n/**\n * Validate PKCE code challenge (base64url encoded)\n */\nconst codeChallenge = z\n .string()\n .min(43)\n .max(128)\n .regex(/^[A-Za-z0-9_-]+$/, \"code_challenge must be base64url encoded (no padding)\");\n// ============================================\n// Dynamic Client Registration (RFC 7591)\n// ============================================\n/**\n * Schema for Dynamic Client Registration request\n *\n * Note: Uses lowercase values per OAuth 2.1 RFC specification.\n * These are mapped to UPPERCASE database enum values in the application layer.\n */\nexport const DynamicClientRegistrationSchema = z.object({\n redirect_uris: z.array(redirectUri).min(1),\n client_name: z.string().min(1).max(255),\n client_uri: z.string().url().optional(),\n logo_uri: z.string().url().optional(),\n // Accept lowercase OAuth spec values\n grant_types: z\n .array(z.enum([\"authorization_code\", \"refresh_token\"]))\n .default([\"authorization_code\", \"refresh_token\"]),\n response_types: z\n .array(z.enum([OAuthResponseTypes.CODE]))\n .default([OAuthResponseTypes.CODE]),\n scope: scopeString,\n // Accept lowercase OAuth spec values\n token_endpoint_auth_method: z\n .enum([\"none\", \"client_secret_post\", \"client_secret_basic\"])\n .default(\"none\"),\n});\n/**\n * Schema for Dynamic Client Registration response\n */\nexport const DynamicClientRegistrationResponseSchema = z.object({\n client_id: z.string(),\n client_secret: z.string().optional(),\n client_id_issued_at: z.number(),\n client_secret_expires_at: z.number().optional(),\n redirect_uris: z.array(z.string()),\n client_name: z.string(),\n client_uri: z.string().optional(),\n logo_uri: z.string().optional(),\n grant_types: z.array(z.string()),\n response_types: z.array(z.string()),\n scope: z.string(),\n token_endpoint_auth_method: z.string(),\n registration_access_token: z.string().optional(),\n registration_client_uri: z.string().optional(),\n});\n// ============================================\n// Authorization Request (RFC 6749)\n// ============================================\n/**\n * Schema for Authorization Request\n * Requires PKCE per OAuth 2.1\n */\nexport const AuthorizationRequestSchema = z.object({\n response_type: z.literal(OAuthResponseTypes.CODE),\n client_id: z.string().min(1),\n redirect_uri: redirectUri,\n scope: scopeString,\n state: z.string().max(255).optional(),\n // PKCE is mandatory in OAuth 2.1\n code_challenge: codeChallenge,\n code_challenge_method: z.literal(OAuthCodeChallengeMethods.S256),\n});\n// ============================================\n// Token Request (RFC 6749)\n// ============================================\n/**\n * Schema for Authorization Code Token Request\n */\nexport const TokenRequestAuthorizationCodeSchema = z.object({\n grant_type: z.literal(OAuthGrantTypes.AUTHORIZATION_CODE),\n code: z.string().min(1),\n redirect_uri: redirectUri,\n client_id: z.string().min(1),\n // PKCE code verifier is mandatory\n code_verifier: codeVerifier,\n // Client secret is optional (for confidential clients)\n client_secret: z.string().optional(),\n});\n/**\n * Schema for Refresh Token Request\n */\nexport const TokenRequestRefreshTokenSchema = z.object({\n grant_type: z.literal(OAuthGrantTypes.REFRESH_TOKEN),\n refresh_token: z.string().min(1),\n client_id: z.string().min(1),\n // Optional: request reduced scope\n scope: scopeString,\n // Client secret is optional (for confidential clients)\n client_secret: z.string().optional(),\n});\n/**\n * Combined Token Request Schema\n */\nexport const TokenRequestSchema = z.discriminatedUnion(\"grant_type\", [\n TokenRequestAuthorizationCodeSchema,\n TokenRequestRefreshTokenSchema,\n]);\n/**\n * Schema for Token Response\n */\nexport const TokenResponseSchema = z.object({\n access_token: z.string(),\n token_type: z.literal(\"Bearer\"),\n expires_in: z.number(),\n refresh_token: z.string().optional(),\n scope: z.string(),\n});\n// ============================================\n// Token Revocation (RFC 7009)\n// ============================================\n/**\n * Schema for Token Revocation Request\n */\nexport const TokenRevocationRequestSchema = z.object({\n token: z.string().min(1),\n token_type_hint: z.enum([\"access_token\", \"refresh_token\"]).optional(),\n client_id: z.string().min(1),\n client_secret: z.string().optional(),\n});\n// ============================================\n// OAuth Error Response (RFC 6749)\n// ============================================\n/**\n * Schema for OAuth Error Response\n */\nexport const OAuthErrorResponseSchema = z.object({\n error: z.string(),\n error_description: z.string().optional(),\n error_uri: z.string().url().optional(),\n state: z.string().optional(),\n});\n// ============================================\n// Authorization Server Metadata (RFC 8414)\n// ============================================\n/**\n * Schema for Authorization Server Metadata\n */\nexport const AuthorizationServerMetadataSchema = z.object({\n issuer: z.string().url(),\n authorization_endpoint: z.string().url(),\n token_endpoint: z.string().url(),\n registration_endpoint: z.string().url().optional(),\n revocation_endpoint: z.string().url().optional(),\n scopes_supported: z.array(z.string()),\n response_types_supported: z.array(z.string()),\n grant_types_supported: z.array(z.string()),\n token_endpoint_auth_methods_supported: z.array(z.string()),\n code_challenge_methods_supported: z.array(z.string()),\n service_documentation: z.string().url().optional(),\n});\n// ============================================\n// Protected Resource Metadata (RFC 9728)\n// ============================================\n/**\n * Schema for Protected Resource Metadata\n */\nexport const ProtectedResourceMetadataSchema = z.object({\n resource: z.string().url(),\n authorization_servers: z.array(z.string().url()),\n scopes_supported: z.array(z.string()).optional(),\n bearer_methods_supported: z.array(z.string()).optional(),\n resource_signing_alg_values_supported: z.array(z.string()).optional(),\n resource_documentation: z.string().url().optional(),\n});\n// ============================================\n// Internal Validation Schemas\n// ============================================\n/**\n * Schema for internal token validation request (MCP server to web app)\n */\nexport const InternalTokenValidationRequestSchema = z.object({\n access_token: z.string().min(1),\n});\n/**\n * Schema for internal token validation response\n */\nexport const InternalTokenValidationResponseSchema = z.object({\n valid: z.boolean(),\n userId: z.string().optional(),\n userEmail: z.string().optional(),\n userName: z.string().optional(),\n scope: z.string().optional(),\n permissions: z.string().optional(),\n clientId: z.string().optional(),\n expiresAt: z.string().optional(),\n});\n","/**\n * In-memory metrics storage.\n *\n * Note: Metric retention is intentionally handled by the external Prometheus scraper,\n * not at the application level. This is standard practice - the application exposes\n * current metric values, and Prometheus handles time-series storage, retention policies,\n * and historical queries. See Prometheus documentation for configuring retention periods.\n */\nconst metrics = new Map();\nfunction labelsToKey(labels) {\n if (!labels || Object.keys(labels).length === 0)\n return \"\";\n return Object.entries(labels)\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([k, v]) => `${k}=\"${v}\"`)\n .join(\",\");\n}\nexport function createCounter(name, help) {\n const data = {\n name,\n type: \"counter\",\n help,\n values: new Map(),\n };\n metrics.set(name, data);\n return {\n inc(labels, value = 1) {\n const key = labelsToKey(labels);\n const current = data.values.get(key) || 0;\n data.values.set(key, current + value);\n },\n };\n}\nexport function createGauge(name, help) {\n const data = {\n name,\n type: \"gauge\",\n help,\n values: new Map(),\n };\n metrics.set(name, data);\n return {\n set(labels, value) {\n const key = labelsToKey(labels);\n data.values.set(key, value);\n },\n inc(labels, value = 1) {\n const key = labelsToKey(labels);\n const current = data.values.get(key) || 0;\n data.values.set(key, current + value);\n },\n dec(labels, value = 1) {\n const key = labelsToKey(labels);\n const current = data.values.get(key) || 0;\n data.values.set(key, current - value);\n },\n };\n}\nexport function createHistogram(name, help, buckets = [0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10]) {\n const data = {\n name,\n type: \"histogram\",\n help,\n values: new Map(),\n buckets,\n };\n metrics.set(name, data);\n return {\n observe(labels, value) {\n const baseKey = labelsToKey(labels);\n const sumKey = `${baseKey}|sum`;\n const countKey = `${baseKey}|count`;\n data.values.set(sumKey, (data.values.get(sumKey) || 0) + value);\n data.values.set(countKey, (data.values.get(countKey) || 0) + 1);\n for (const bucket of buckets) {\n const bucketKey = `${baseKey}|le=\"${bucket}\"`;\n if (value <= bucket) {\n data.values.set(bucketKey, (data.values.get(bucketKey) || 0) + 1);\n }\n }\n const infKey = `${baseKey}|le=\"+Inf\"`;\n data.values.set(infKey, (data.values.get(infKey) || 0) + 1);\n },\n };\n}\nexport function getMetricsAsPrometheus() {\n const lines = [];\n for (const [, data] of metrics) {\n lines.push(`# HELP ${data.name} ${data.help}`);\n lines.push(`# TYPE ${data.name} ${data.type}`);\n if (data.type === \"histogram\") {\n const grouped = new Map();\n for (const [key, value] of data.values) {\n const [baseLabels, suffix] = key.split(\"|\");\n if (!grouped.has(baseLabels)) {\n grouped.set(baseLabels, new Map());\n }\n grouped.get(baseLabels).set(suffix, value);\n }\n for (const [baseLabels, suffixes] of grouped) {\n const labelStr = baseLabels ? `{${baseLabels}}` : \"\";\n for (const [suffix, value] of suffixes) {\n if (suffix.startsWith(\"le=\")) {\n const le = suffix.replace(\"le=\", \"\");\n const fullLabels = baseLabels\n ? `{${baseLabels},le=${le}}`\n : `{le=${le}}`;\n lines.push(`${data.name}_bucket${fullLabels} ${value}`);\n }\n }\n lines.push(`${data.name}_sum${labelStr} ${suffixes.get(\"sum\") || 0}`);\n lines.push(`${data.name}_count${labelStr} ${suffixes.get(\"count\") || 0}`);\n }\n }\n else {\n for (const [key, value] of data.values) {\n const labelStr = key ? `{${key}}` : \"\";\n lines.push(`${data.name}${labelStr} ${value}`);\n }\n }\n lines.push(\"\");\n }\n return lines.join(\"\\n\");\n}\nexport const httpRequestsTotal = createCounter(\"mtaap_http_requests_total\", \"Total number of HTTP requests\");\nexport const httpRequestDuration = createHistogram(\"mtaap_http_request_duration_seconds\", \"HTTP request duration in seconds\");\nexport const activeUsers = createGauge(\"mtaap_active_users\", \"Number of active users\");\nexport const httpErrorsTotal = createCounter(\"mtaap_http_errors_total\", \"Total number of HTTP errors\");\nexport const httpActiveConnections = createGauge(\"mtaap_http_active_connections\", \"Number of active HTTP connections\");\nexport const newSignupsTotal = createCounter(\"mtaap_new_signups_total\", \"Total number of new user signups\");\nexport const loginSuccessTotal = createCounter(\"mtaap_login_success_total\", \"Total number of successful logins\");\nexport const loginFailureTotal = createCounter(\"mtaap_login_failure_total\", \"Total number of failed logins\");\nexport const dbQueryDuration = createHistogram(\"mtaap_db_query_duration_seconds\", \"Database query duration in seconds\");\nexport const dbSlowQueriesTotal = createCounter(\"mtaap_db_slow_queries_total\", \"Total number of slow database queries (>1s)\");\nexport const tasksCreatedTotal = createCounter(\"mtaap_tasks_created_total\", \"Total number of tasks created\");\nexport const tasksAssignedTotal = createCounter(\"mtaap_tasks_assigned_total\", \"Total number of tasks assigned\");\nexport const tasksCompletedTotal = createCounter(\"mtaap_tasks_completed_total\", \"Total number of tasks completed\");\nexport const agentSessionsTotal = createCounter(\"mtaap_agent_sessions_total\", \"Total number of agent sessions started\");\nexport const agentErrorsTotal = createCounter(\"mtaap_agent_errors_total\", \"Total number of agent errors\");\nexport const agentSessionDuration = createHistogram(\"mtaap_agent_session_duration_seconds\", \"Agent session duration in seconds\", [1, 5, 15, 30, 60, 120, 300, 600, 1800, 3600]);\nexport const agentSessionsActive = createGauge(\"mtaap_agent_sessions_active\", \"Number of currently active agent sessions\");\n","const MAX_SAMPLES = 1000;\nconst ALERT_COOLDOWN_MS = 5 * 60 * 1000;\nconst DEFAULT_THRESHOLDS = {\n api: {\n p50: 100,\n p95: 500,\n p99: 1000,\n },\n db: {\n p95: 100,\n p99: 500,\n },\n webvitals: {\n FCP: 2000,\n LCP: 2500,\n FID: 100,\n CLS: 0.1,\n },\n};\nfunction cloneThresholds() {\n return Object.fromEntries(Object.entries(DEFAULT_THRESHOLDS).map(([category, metrics]) => [\n category,\n { ...metrics },\n ]));\n}\nfunction labelsToKey(labels) {\n if (!labels || Object.keys(labels).length === 0)\n return \"\";\n return Object.entries(labels)\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([key, value]) => `${key}=\"${value}\"`)\n .join(\",\");\n}\nfunction percentile(sortedValues, percentileValue) {\n if (sortedValues.length === 0)\n return 0;\n const rank = Math.ceil((percentileValue / 100) * sortedValues.length);\n const index = Math.min(Math.max(rank - 1, 0), sortedValues.length - 1);\n return sortedValues[index];\n}\nclass CircularBuffer {\n capacity;\n values = [];\n index = 0;\n size = 0;\n constructor(capacity) {\n this.capacity = capacity;\n }\n add(value) {\n if (this.size < this.capacity) {\n this.values.push(value);\n this.size += 1;\n this.index = this.size % this.capacity;\n return;\n }\n this.values[this.index] = value;\n this.index = (this.index + 1) % this.capacity;\n }\n getValues() {\n if (this.size < this.capacity) {\n return this.values.slice(0, this.size);\n }\n return this.values.slice();\n }\n}\nclass PerformanceMonitor {\n samples = new Map();\n thresholds = cloneThresholds();\n alertCallback;\n lastAlertTimestamps = new Map();\n recordTiming(category, name, durationMs, labels) {\n if (!Number.isFinite(durationMs))\n return;\n const categoryMap = this.getCategoryMap(category);\n const nameMap = this.getNameMap(categoryMap, name);\n const labelKey = labelsToKey(labels);\n const buffer = nameMap.get(labelKey) ?? new CircularBuffer(MAX_SAMPLES);\n buffer.add(durationMs);\n nameMap.set(labelKey, buffer);\n }\n getPercentiles(category, name) {\n const samples = this.collectSamples(category, name);\n if (samples.length === 0) {\n return { p50: 0, p95: 0, p99: 0 };\n }\n const sorted = [...samples].sort((a, b) => a - b);\n return {\n p50: percentile(sorted, 50),\n p95: percentile(sorted, 95),\n p99: percentile(sorted, 99),\n };\n }\n checkThresholds() {\n const alerts = [];\n const now = Date.now();\n const callbackAlerts = [];\n for (const [category, nameMap] of this.samples) {\n const thresholds = this.thresholds[category];\n if (!thresholds)\n continue;\n for (const name of nameMap.keys()) {\n const percentiles = this.getPercentiles(category, name);\n for (const [metric, threshold] of Object.entries(thresholds)) {\n const value = this.resolveMetricValue(metric, name, percentiles);\n if (value === undefined || value <= threshold)\n continue;\n const alert = {\n category,\n name,\n metric,\n value,\n threshold,\n };\n alerts.push(alert);\n const alertKey = `${category}|${name}|${metric}`;\n const lastAlertTime = this.lastAlertTimestamps.get(alertKey);\n if (!lastAlertTime || now - lastAlertTime >= ALERT_COOLDOWN_MS) {\n this.lastAlertTimestamps.set(alertKey, now);\n callbackAlerts.push(alert);\n }\n }\n }\n }\n if (callbackAlerts.length > 0 && this.alertCallback) {\n this.alertCallback(callbackAlerts);\n }\n return alerts;\n }\n setAlertCallback(callback) {\n this.alertCallback = callback;\n }\n setThreshold(category, metric, value) {\n if (!this.thresholds[category]) {\n this.thresholds[category] = {};\n }\n this.thresholds[category][metric] = value;\n }\n collectSamples(category, name) {\n const categoryMap = this.samples.get(category);\n if (!categoryMap)\n return [];\n const entries = name\n ? [[name, categoryMap.get(name)]]\n : Array.from(categoryMap.entries());\n const samples = [];\n for (const [, labelMap] of entries) {\n if (!labelMap)\n continue;\n for (const buffer of labelMap.values()) {\n samples.push(...buffer.getValues());\n }\n }\n return samples;\n }\n resolveMetricValue(metric, name, percentiles) {\n if (metric === \"p50\")\n return percentiles.p50;\n if (metric === \"p95\")\n return percentiles.p95;\n if (metric === \"p99\")\n return percentiles.p99;\n if (metric === name)\n return percentiles.p95;\n return undefined;\n }\n getCategoryMap(category) {\n const existing = this.samples.get(category);\n if (existing)\n return existing;\n const created = new Map();\n this.samples.set(category, created);\n return created;\n }\n getNameMap(categoryMap, name) {\n const existing = categoryMap.get(name);\n if (existing)\n return existing;\n const created = new Map();\n categoryMap.set(name, created);\n return created;\n }\n}\nconst defaultMonitor = new PerformanceMonitor();\nexport function recordTiming(category, name, durationMs, labels) {\n defaultMonitor.recordTiming(category, name, durationMs, labels);\n}\nexport function getPercentiles(category, name) {\n return defaultMonitor.getPercentiles(category, name);\n}\nexport function checkThresholds() {\n return defaultMonitor.checkThresholds();\n}\nexport function setAlertCallback(callback) {\n defaultMonitor.setAlertCallback(callback);\n}\nexport function setThreshold(category, metric, value) {\n defaultMonitor.setThreshold(category, metric, value);\n}\n","export class NoOpErrorTracker {\n captureError(error, context) {\n console.error(\"Error captured:\", error.message, context);\n }\n captureException(error, context) {\n console.error(\"Exception captured:\", error, context);\n }\n captureMessage(message, level, context) {\n console[level === \"warning\" ? \"warn\" : level](`Message captured [${level}]:`, message, context);\n }\n setUser(user) {\n console.log(\"User set:\", user);\n }\n clearUser() {\n console.log(\"User cleared\");\n }\n}\nlet errorTrackerInstance = new NoOpErrorTracker();\nexport function initializeErrorTracker(tracker) {\n errorTrackerInstance = tracker;\n}\nexport function getErrorTracker() {\n return errorTrackerInstance;\n}\nexport function captureError(error, context) {\n errorTrackerInstance.captureError(error, context);\n}\nexport function captureException(error, context) {\n errorTrackerInstance.captureException(error, context);\n}\nexport function captureMessage(message, level = \"error\", context) {\n errorTrackerInstance.captureMessage(message, level, context);\n}\nexport function setErrorUser(user) {\n errorTrackerInstance.setUser(user);\n}\nexport function clearErrorUser() {\n errorTrackerInstance.clearUser();\n}\nexport function shouldIgnoreError(statusCode) {\n if (!statusCode) {\n return false;\n }\n const ignoredStatusCodes = [404, 401];\n return ignoredStatusCodes.includes(statusCode);\n}\nexport function shouldIgnoreErrorByMessage(error) {\n const ignoredMessages = [\n \"ResizeObserver loop\",\n \"ResizeObserver loop limit exceeded\",\n \"Non-Error promise rejection captured\",\n \"NEXT_NOT_FOUND\",\n \"NEXT_REDIRECT\",\n ];\n return ignoredMessages.some((msg) => error.message.toLowerCase().includes(msg.toLowerCase()));\n}\n","/**\n * MCP API Client\n *\n * HTTP client for communicating with the Collab webapp REST API.\n * Replaces direct database access for a lighter, more secure MCP package.\n */\n\nimport {\n TaskState,\n ErrorType,\n} from \"@mtaap/core\";\n\nconst DEFAULT_TIMEOUT = 30000; // 30 seconds\nconst DEFAULT_CACHE_TTL = 30000; // 30 seconds\nconst MAX_RETRIES = 2;\nconst INITIAL_RETRY_DELAY = 500; // ms\n\ninterface CacheEntry<T> {\n data: T;\n expiresAt: number;\n}\n\n/**\n * Headers that should never be logged (case-insensitive)\n */\nconst SENSITIVE_HEADERS = new Set([\n \"x-api-key\",\n \"authorization\",\n \"cookie\",\n \"set-cookie\",\n \"x-auth-token\",\n \"x-access-token\",\n]);\n\n/**\n * Redact sensitive information from a string for safe logging.\n * Removes API keys, tokens, and other credentials.\n */\nfunction sanitizeForLogging(str: string): string {\n // Redact API keys (collab_xxx format) with word boundaries to avoid partial matches\n let sanitized = str.replace(/\\bcollab_[a-zA-Z0-9_-]+\\b/gi, \"[REDACTED_API_KEY]\");\n // Redact bearer tokens with word boundary\n sanitized = sanitized.replace(/\\bBearer\\s+[a-zA-Z0-9._-]+\\b/gi, \"Bearer [REDACTED]\");\n // Redact generic tokens in query params\n sanitized = sanitized.replace(/([?&](api_?key|token|auth|key|secret)=)[^&\\s]+/gi, \"$1[REDACTED]\");\n return sanitized;\n}\n\n/**\n * API Client Configuration\n *\n * Supports two authentication methods:\n * - apiKey: Traditional API key authentication (X-API-Key header)\n * - oauthToken: OAuth 2.0 Bearer token (Authorization header)\n *\n * At least one authentication method must be provided.\n */\nexport interface ApiClientConfig {\n baseUrl: string;\n /** API key for X-API-Key authentication */\n apiKey?: string;\n /** OAuth access token for Bearer authentication */\n oauthToken?: string;\n timeout?: number;\n debug?: boolean;\n}\n\n/**\n * Authentication context returned from the API\n */\nexport interface AuthContext {\n userId: string;\n organizationId?: string;\n /** Permission level: \"READ\" | \"WRITE\" | \"ADMIN\" for OAuth, or string[] for API keys */\n permissions: string | string[];\n userName: string;\n userEmail: string;\n}\n\n/**\n * Project from API\n */\nexport interface Project {\n id: string;\n name: string;\n description: string | null;\n type: string;\n origin: string;\n repositoryUrl: string;\n baseBranch: string;\n tags: string[];\n createdAt: string;\n updatedAt: string;\n}\n\n/**\n * Task from API\n */\nexport interface Task {\n id: string;\n projectId: string;\n projectName: string;\n epicId: string | null;\n epicName: string | null;\n title: string;\n description: string | null;\n state: TaskState;\n priority: string;\n assigneeId: string | null;\n assigneeName: string | null;\n assigneeEmail: string | null;\n createdBy: string;\n createdByName: string | null;\n assignedAt: string | null;\n startedAt: string | null;\n completedAt: string | null;\n branchName: string | null;\n pullRequestUrl: string | null;\n pullRequestNumber: number | null;\n errorType: string | null;\n errorMessage: string | null;\n verificationStatus: string | null;\n verificationFeedback: string | null;\n verifiedAt: string | null;\n acceptanceCriteria: Array<{\n id: string;\n description: string;\n completed: boolean;\n completedAt: string | null;\n order: number;\n }>;\n progressUpdates?: Array<{\n id: string;\n message: string;\n checkpoints: string[];\n userId: string;\n apiKeyNickname: string | null;\n createdVia: \"UI\" | \"API_KEY\" | \"OAUTH\";\n createdAt: string;\n }>;\n notes?: Array<{\n id: string;\n content: string;\n userId: string;\n userName: string | null;\n apiKeyNickname: string | null;\n createdVia: \"UI\" | \"API_KEY\" | \"OAUTH\";\n createdAt: string;\n }>;\n createdAt: string;\n updatedAt: string;\n archivedAt: string | null;\n}\n\n/**\n * Project context from API\n */\nexport interface ProjectContext {\n readme: string;\n stack: string[];\n recentCompleted: Array<{\n id: string;\n title: string;\n completedAt: string | null;\n }>;\n conventions: {\n branchPrefix: string;\n commitFormat: string;\n testCommand: string;\n baseBranch: string;\n notes: string;\n };\n}\n\n/**\n * API Error\n */\nexport class ApiError extends Error {\n constructor(\n message: string,\n public code: string,\n public status: number,\n public details?: Record<string, unknown>,\n ) {\n super(message);\n this.name = \"ApiError\";\n }\n\n /**\n * Whether this error is transient and the request can be retried.\n * Retries on network errors (status 0), timeouts (408), and server errors (5xx).\n */\n get isRetryable(): boolean {\n return this.status === 0 || this.status === 408 || this.status >= 500;\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * MCP API Client\n */\nexport class MCPApiClient {\n private baseUrl: string;\n private apiKey?: string;\n private oauthToken?: string;\n private timeout: number;\n private debug: boolean;\n private authContext: AuthContext | null = null;\n private cache = new Map<string, CacheEntry<unknown>>();\n\n constructor(config: ApiClientConfig) {\n if (!config.apiKey && !config.oauthToken) {\n throw new Error(\"Either apiKey or oauthToken must be provided\");\n }\n this.baseUrl = config.baseUrl.replace(/\\/$/, \"\"); // Remove trailing slash\n this.apiKey = config.apiKey;\n this.oauthToken = config.oauthToken;\n this.timeout = config.timeout ?? DEFAULT_TIMEOUT;\n this.debug = config.debug ?? false;\n }\n\n /**\n * Get a cached value if it exists and hasn't expired.\n */\n private getCached<T>(key: string): T | undefined {\n const entry = this.cache.get(key);\n if (!entry) return undefined;\n if (Date.now() > entry.expiresAt) {\n this.cache.delete(key);\n return undefined;\n }\n return entry.data as T;\n }\n\n /**\n * Store a value in cache with a TTL.\n */\n private setCache<T>(key: string, data: T, ttl: number = DEFAULT_CACHE_TTL): void {\n this.cache.set(key, { data, expiresAt: Date.now() + ttl });\n }\n\n /**\n * Make an HTTP request to the API with automatic retry on transient failures.\n */\n private async request<T>(\n method: string,\n path: string,\n body?: Record<string, unknown>,\n ): Promise<T> {\n let lastError: ApiError | undefined;\n\n for (let attempt = 0; attempt <= MAX_RETRIES; attempt++) {\n try {\n return await this.requestOnce<T>(method, path, body);\n } catch (error) {\n if (!(error instanceof ApiError) || !error.isRetryable || attempt === MAX_RETRIES) {\n throw error;\n }\n lastError = error;\n const delay = INITIAL_RETRY_DELAY * Math.pow(2, attempt);\n if (this.debug) {\n console.error(`[mcp-api] Retry ${attempt + 1}/${MAX_RETRIES} after ${delay}ms (${lastError.code})`);\n }\n await sleep(delay);\n }\n }\n\n // Should not reach here, but satisfy TypeScript\n throw lastError;\n }\n\n /**\n * Execute a single HTTP request to the API.\n */\n private async requestOnce<T>(\n method: string,\n path: string,\n body?: Record<string, unknown>,\n ): Promise<T> {\n const url = `${this.baseUrl}${path}`;\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n if (this.debug) {\n // Only log the path, not the full URL (which could contain sensitive query params)\n console.error(`[mcp-api] ${method} ${sanitizeForLogging(path)}`);\n }\n\n try {\n // Build headers with appropriate authentication\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n\n if (this.oauthToken) {\n headers[\"Authorization\"] = `Bearer ${this.oauthToken}`;\n } else if (this.apiKey) {\n headers[\"X-API-Key\"] = this.apiKey;\n }\n\n const response = await fetch(url, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n const data = await response.json() as Record<string, unknown>;\n\n if (!response.ok) {\n // Handle email verification errors with actionable guidance\n if (\n response.status === 403 &&\n data.code === \"EMAIL_NOT_VERIFIED\" &&\n data.verificationUrl\n ) {\n throw new ApiError(\n `${data.error as string}\\n\\nTo verify your email, visit: ${data.verificationUrl as string}\\n${data.hint ? `Hint: ${data.hint as string}` : \"\"}`,\n \"EMAIL_NOT_VERIFIED\",\n 403,\n );\n }\n\n throw new ApiError(\n (data.error as string) || \"API request failed\",\n (data.code as string) || \"UNKNOWN_ERROR\",\n response.status,\n data.details as Record<string, unknown> | undefined,\n );\n }\n\n return data as T;\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof ApiError) {\n throw error;\n }\n\n if (error instanceof Error && error.name === \"AbortError\") {\n throw new ApiError(\n \"Request timed out\",\n \"TIMEOUT\",\n 408,\n );\n }\n\n // Sanitize error messages to prevent credential leakage in logs/responses\n const rawMessage = error instanceof Error ? error.message : \"Unknown error\";\n throw new ApiError(\n sanitizeForLogging(rawMessage),\n \"NETWORK_ERROR\",\n 0,\n );\n }\n }\n\n /**\n * Authenticate and get user context\n */\n async authenticate(): Promise<AuthContext> {\n const context = await this.request<AuthContext>(\"GET\", \"/api/mcp/auth\");\n this.authContext = context;\n return context;\n }\n\n /**\n * Get cached auth context or authenticate\n */\n async getAuthContext(): Promise<AuthContext> {\n if (this.authContext) {\n return this.authContext;\n }\n return this.authenticate();\n }\n\n /**\n * List accessible projects (cached for 30s)\n */\n async listProjects(workspaceType?: string): Promise<Project[]> {\n const type = workspaceType || \"ALL\";\n const cacheKey = `listProjects:${type}`;\n const cached = this.getCached<Project[]>(cacheKey);\n if (cached) return cached;\n\n const result = await this.request<Project[]>(\n \"GET\",\n `/api/mcp/projects?workspaceType=${encodeURIComponent(type)}`,\n );\n this.setCache(cacheKey, result);\n return result;\n }\n\n /**\n * Get single project details\n */\n async getProject(projectId: string): Promise<Project> {\n return this.request<Project>(\"GET\", `/api/mcp/projects/${projectId}`);\n }\n\n /**\n * Get project context (README, stack, conventions) (cached for 60s)\n */\n async getProjectContext(projectId: string): Promise<ProjectContext> {\n const cacheKey = `projectContext:${projectId}`;\n const cached = this.getCached<ProjectContext>(cacheKey);\n if (cached) return cached;\n\n const result = await this.request<ProjectContext>(\n \"GET\",\n `/api/mcp/projects/${projectId}/context`,\n );\n this.setCache(cacheKey, result, 60000);\n return result;\n }\n\n /**\n * Create a personal project\n */\n async createPersonalProject(\n name: string,\n description: string | undefined,\n repositoryUrl: string,\n ): Promise<{ success: boolean; projectId: string }> {\n return this.request<{ success: boolean; projectId: string }>(\n \"POST\",\n \"/api/mcp/projects/personal\",\n { name, description, repositoryUrl },\n );\n }\n\n /**\n * Create a task in a project\n */\n async createTask(input: {\n projectId: string;\n epicId?: string | null;\n title: string;\n description: string;\n priority?: string;\n acceptanceCriteria: Array<{ description: string }>;\n }): Promise<{ success: boolean; taskId: string; task: Task }> {\n return this.request(\"POST\", \"/api/mcp/tasks\", input);\n }\n\n /**\n * List tasks with optional filters\n */\n async listTasks(filters: {\n projectId?: string;\n state?: TaskState;\n assigneeId?: string;\n includeArchived?: boolean;\n } = {}): Promise<Task[]> {\n const params = new URLSearchParams();\n if (filters.projectId) params.set(\"projectId\", filters.projectId);\n if (filters.state) params.set(\"state\", filters.state);\n if (filters.assigneeId) params.set(\"assigneeId\", filters.assigneeId);\n if (filters.includeArchived) params.set(\"includeArchived\", \"true\");\n\n const queryString = params.toString();\n const path = queryString ? `/api/mcp/tasks?${queryString}` : \"/api/mcp/tasks\";\n\n return this.request<Task[]>(\"GET\", path);\n }\n\n /**\n * Get full task details\n */\n async getTask(taskId: string): Promise<Task> {\n return this.request<Task>(\"GET\", `/api/mcp/tasks/${taskId}`);\n }\n\n /**\n * Assign task to current user and create branch\n */\n async assignTask(\n taskId: string,\n projectId: string,\n expectedState: TaskState = TaskState.TODO,\n ): Promise<{\n success: boolean;\n taskId: string;\n suggestedBranchName?: string;\n baseBranch?: string;\n repositoryUrl?: string;\n currentState?: string;\n message?: string;\n note?: string;\n }> {\n return this.request(\"POST\", `/api/mcp/tasks/${taskId}/assign`, {\n projectId,\n expectedState,\n });\n }\n\n /**\n * Update task progress\n */\n async updateProgress(\n taskId: string,\n data: {\n statusMessage?: string;\n completedCheckpointIds?: string[];\n currentCheckpointIndex?: number;\n },\n ): Promise<{ success: boolean; taskId: string }> {\n return this.request(\"POST\", `/api/mcp/tasks/${taskId}/progress`, data);\n }\n\n /**\n * Complete task and prepare for PR creation.\n * Returns PR suggestions for the agent to use when creating the PR locally.\n */\n async completeTask(\n taskId: string,\n projectId: string,\n pullRequestTitle?: string,\n pullRequestBody?: string,\n ): Promise<{\n success: boolean;\n taskId: string;\n suggestedPRTitle?: string;\n suggestedPRBody?: string;\n branchName?: string;\n baseBranch?: string;\n note?: string;\n }> {\n return this.request(\"POST\", `/api/mcp/tasks/${taskId}/complete`, {\n projectId,\n pullRequestTitle,\n pullRequestBody,\n });\n }\n\n /**\n * Abandon task and optionally delete branch\n */\n async abandonTask(\n taskId: string,\n projectId: string,\n deleteBranch: boolean = false,\n ): Promise<{\n success: boolean;\n taskId: string;\n state: string;\n branchDeleted: boolean;\n }> {\n return this.request(\"POST\", `/api/mcp/tasks/${taskId}/abandon`, {\n projectId,\n deleteBranch,\n });\n }\n\n /**\n * Archive a task (soft delete)\n */\n async archiveTask(\n taskId: string,\n projectId: string,\n ): Promise<{\n success: boolean;\n taskId: string;\n archivedAt: string;\n }> {\n return this.request(\"POST\", `/api/mcp/tasks/${taskId}/archive`, {\n projectId,\n });\n }\n\n /**\n * Unarchive a task (restore)\n */\n async unarchiveTask(\n taskId: string,\n projectId: string,\n ): Promise<{\n success: boolean;\n taskId: string;\n }> {\n return this.request(\"DELETE\", `/api/mcp/tasks/${taskId}/archive`, {\n projectId,\n });\n }\n\n /**\n * Report task error\n */\n async reportError(\n taskId: string,\n errorType: ErrorType,\n errorMessage: string,\n context?: string,\n ): Promise<{ success: boolean; taskId: string }> {\n return this.request(\"POST\", `/api/mcp/tasks/${taskId}/error`, {\n errorType,\n errorMessage,\n context,\n });\n }\n\n /**\n * Add note to task\n */\n async addNote(\n taskId: string,\n content: string,\n ): Promise<{ success: boolean; noteId: string }> {\n return this.request(\"POST\", `/api/mcp/tasks/${taskId}/notes`, { content });\n }\n\n /**\n * Request changes on a task in review\n */\n async requestChanges(\n taskId: string,\n projectId: string,\n reviewComments: string,\n requestedChanges?: string[],\n ): Promise<{\n success: boolean;\n taskId: string;\n noteId: string;\n message: string;\n }> {\n return this.request(\"POST\", `/api/mcp/tasks/${taskId}/request-changes`, {\n projectId,\n reviewComments,\n requestedChanges,\n });\n }\n\n /**\n * Approve a task in review and mark as DONE\n */\n async approveTask(\n taskId: string,\n projectId: string,\n reviewComments?: string,\n ): Promise<{\n success: boolean;\n taskId: string;\n message: string;\n }> {\n return this.request(\"POST\", `/api/mcp/tasks/${taskId}/approve`, {\n projectId,\n reviewComments,\n });\n }\n\n /**\n * Report branch created by agent\n */\n async reportBranch(\n taskId: string,\n projectId: string,\n branchName: string,\n ): Promise<{\n success: boolean;\n taskId: string;\n branchName: string;\n }> {\n return this.request(\"POST\", `/api/mcp/tasks/${taskId}/branch`, {\n projectId,\n branchName,\n });\n }\n\n /**\n * Report PR created by agent\n */\n async reportPR(\n taskId: string,\n projectId: string,\n pullRequestUrl: string,\n pullRequestNumber: number,\n ): Promise<{\n success: boolean;\n taskId: string;\n pullRequestUrl: string;\n pullRequestNumber: number;\n state: string;\n }> {\n return this.request(\"POST\", `/api/mcp/tasks/${taskId}/pr`, {\n projectId,\n pullRequestUrl,\n pullRequestNumber,\n });\n }\n\n /**\n * Verify a DRAFT task to move it to TODO state\n */\n async verifyTask(\n taskId: string,\n projectId: string,\n approved: boolean,\n feedback?: string,\n ): Promise<{\n success: boolean;\n taskId: string;\n previousState: string;\n newState: string;\n verificationStatus: string;\n message: string;\n feedback?: string;\n }> {\n return this.request(\"POST\", `/api/mcp/tasks/${taskId}/verify`, {\n projectId,\n approved,\n feedback,\n });\n }\n\n /**\n * Get state-appropriate prompt for a task\n */\n async getTaskPrompt(\n taskId: string,\n projectId: string,\n ): Promise<{\n success: boolean;\n taskId: string;\n state: string;\n promptType: string;\n promptDescription: string;\n prompt: string;\n }> {\n return this.request(\n \"GET\",\n `/api/mcp/tasks/${taskId}/prompt?projectId=${encodeURIComponent(projectId)}`,\n );\n }\n\n /**\n * Update task details (DRAFT/TODO states only).\n * Task stays in its current state.\n */\n async updateTask(\n taskId: string,\n projectId: string,\n data: {\n title?: string;\n description?: string;\n priority?: string;\n acceptanceCriteria?: Array<{ id?: string; description: string }>;\n },\n ): Promise<Record<string, unknown>> {\n return this.request(\"PATCH\", `/api/mcp/tasks/${taskId}`, {\n projectId,\n ...data,\n });\n }\n}\n\n/**\n * Create API client from environment variables\n */\nexport function createApiClientFromEnv(): MCPApiClient {\n const baseUrl = process.env.COLLAB_BASE_URL;\n const apiKey = process.env.COLLAB_API_KEY;\n\n if (!baseUrl) {\n throw new Error(\"COLLAB_BASE_URL environment variable is required\");\n }\n\n if (!apiKey) {\n throw new Error(\"COLLAB_API_KEY environment variable is required\");\n }\n\n return new MCPApiClient({\n baseUrl,\n apiKey,\n debug: process.env.COLLAB_DEBUG === \"true\",\n });\n}\n","import { ApiKeyPermission } from \"@mtaap/core\";\n\n/**\n * Permission levels ranked by access level.\n */\nconst PERMISSION_RANK: Record<string, number> = {\n READ: 1,\n WRITE: 2,\n ADMIN: 3,\n};\n\nexport interface ApiKeyPermissionContext {\n id?: string;\n permissions: \"READ\" | \"WRITE\" | \"ADMIN\" | ApiKeyPermission | null;\n}\n\nexport function assertApiKeyPermission(\n apiKey: ApiKeyPermissionContext,\n required: ApiKeyPermission,\n toolName: string,\n): void {\n const actualRank = apiKey.permissions\n ? (PERMISSION_RANK[apiKey.permissions] ?? 0)\n : 0;\n const requiredRank = PERMISSION_RANK[required] ?? 0;\n\n if (actualRank >= requiredRank) {\n return;\n }\n\n console.warn(\"API key permission violation\", {\n keyId: apiKey.id,\n requiredPermission: required,\n actualPermission: apiKey.permissions,\n tool: toolName,\n });\n\n const error = new Error(\n `API key lacks required permissions (required: ${required})`,\n );\n (error as Error & { status?: number }).status = 403;\n throw error;\n}\n","/**\n * Task Details MCP App\n *\n * Rich task visualization with acceptance criteria, notes, and progress history.\n */\n\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { registerAppTool } from \"@modelcontextprotocol/ext-apps/server\";\nimport { z } from \"zod\";\nimport type { MCPApiClient, AuthContext } from \"../api-client.js\";\nimport { registerAppHtmlResource } from \"./helpers.js\";\n\nconst RESOURCE_URI = \"ui://collab/task-details.html\";\n\n/**\n * Register the Task Details app tool and resource.\n */\nexport function registerTaskDetailsApp(\n server: McpServer,\n apiClient: MCPApiClient,\n _authContext: AuthContext\n): void {\n registerAppTool(\n server,\n \"view_task_details\",\n {\n title: \"Task Details\",\n description:\n \"View interactive task details with acceptance criteria, notes, and progress. Opens a rich UI panel.\",\n inputSchema: {\n taskId: z.string().describe(\"The task ID to view\"),\n projectId: z.string().describe(\"The project ID\"),\n },\n _meta: { ui: { resourceUri: RESOURCE_URI } },\n },\n async ({ taskId, projectId }) => {\n try {\n const task = await apiClient.getTask(taskId);\n\n let project = null;\n try {\n project = await apiClient.getProject(projectId);\n } catch {\n // Project fetch is optional, continue without it\n }\n\n return {\n content: [\n {\n type: \"text\",\n text: `Viewing task: ${task.title}`,\n },\n ],\n structuredContent: {\n task,\n project,\n },\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: \"text\", text: `Error loading task: ${message}` }],\n isError: true,\n };\n }\n }\n );\n\n registerAppHtmlResource(server, {\n name: \"Task Details UI\",\n uri: RESOURCE_URI,\n description: \"Interactive task details view with acceptance criteria and notes\",\n htmlFileName: \"task-details.html\",\n fallbackLabel: \"Task Details\",\n });\n}\n","/**\n * Shared helpers for MCP App registration.\n *\n * Eliminates duplicated getDirname(), resource registration, and\n * HTML-loading boilerplate across all app files.\n */\n\nimport {\n registerAppResource,\n RESOURCE_MIME_TYPE,\n} from \"@modelcontextprotocol/ext-apps/server\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\n/**\n * Get __dirname equivalent that works in both ESM and CJS bundled code.\n */\nexport const getDirname = () => {\n try {\n return path.dirname(fileURLToPath(import.meta.url));\n } catch {\n return __dirname;\n }\n};\n\n/**\n * Build the absolute path to a compiled HTML app file.\n */\nexport function getAppHtmlPath(htmlFileName: string): string {\n return path.join(getDirname(), \"apps\", htmlFileName);\n}\n\n/**\n * Register an HTML resource for an MCP App with automatic file loading and fallback.\n *\n * Handles the common pattern of:\n * 1. Building the HTML file path from getDirname()\n * 2. Reading the file at request time\n * 3. Returning a fallback HTML if the file is missing\n */\nexport function registerAppHtmlResource(\n server: McpServer,\n config: {\n name: string;\n uri: string;\n description: string;\n htmlFileName: string;\n fallbackLabel: string;\n }\n): void {\n registerAppResource(\n server,\n config.name,\n config.uri,\n {\n mimeType: RESOURCE_MIME_TYPE,\n description: config.description,\n },\n async () => {\n const htmlPath = getAppHtmlPath(config.htmlFileName);\n\n try {\n const html = await fs.readFile(htmlPath, \"utf-8\");\n return {\n contents: [\n {\n uri: config.uri,\n mimeType: RESOURCE_MIME_TYPE,\n text: html,\n },\n ],\n };\n } catch {\n return {\n contents: [\n {\n uri: config.uri,\n mimeType: RESOURCE_MIME_TYPE,\n text: `<!DOCTYPE html><html><body><p>${config.fallbackLabel} UI not available. Build the UI apps first.</p></body></html>`,\n },\n ],\n };\n }\n }\n );\n}\n","/**\n * Kanban Board MCP App\n *\n * Interactive drag-and-drop task board showing all tasks by state column.\n */\n\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { registerAppTool } from \"@modelcontextprotocol/ext-apps/server\";\nimport { z } from \"zod\";\nimport type { MCPApiClient, AuthContext } from \"../api-client.js\";\nimport { registerAppHtmlResource } from \"./helpers.js\";\n\nconst RESOURCE_URI = \"ui://collab/kanban.html\";\n\n/**\n * Register the Kanban Board app tool and resource.\n */\nexport function registerKanbanApp(\n server: McpServer,\n apiClient: MCPApiClient,\n _authContext: AuthContext\n): void {\n registerAppTool(\n server,\n \"view_kanban_board\",\n {\n title: \"Kanban Board\",\n description:\n \"View interactive drag-and-drop Kanban board for a project. Drag tasks between columns to change their state.\",\n inputSchema: {\n projectId: z.string().describe(\"The project ID to display\"),\n },\n _meta: { ui: { resourceUri: RESOURCE_URI } },\n },\n async ({ projectId }) => {\n try {\n const [project, tasks] = await Promise.all([\n apiClient.getProject(projectId),\n apiClient.listTasks({ projectId }),\n ]);\n\n return {\n content: [\n {\n type: \"text\",\n text: `Kanban board for ${project.name} (${tasks.length} tasks)`,\n },\n ],\n structuredContent: {\n project,\n tasks,\n },\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: \"text\", text: `Error loading kanban: ${message}` }],\n isError: true,\n };\n }\n }\n );\n\n registerAppHtmlResource(server, {\n name: \"Kanban Board UI\",\n uri: RESOURCE_URI,\n description: \"Interactive drag-and-drop Kanban board for task management\",\n htmlFileName: \"kanban.html\",\n fallbackLabel: \"Kanban\",\n });\n}\n","/**\n * User Activity Dashboard MCP App\n *\n * Shows who is working on what across the project/organization.\n */\n\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { registerAppTool } from \"@modelcontextprotocol/ext-apps/server\";\nimport { z } from \"zod\";\nimport { TaskState } from \"@mtaap/core\";\nimport type { MCPApiClient, AuthContext } from \"../api-client.js\";\nimport { registerAppHtmlResource } from \"./helpers.js\";\n\ninterface User {\n id: string;\n name: string;\n email: string;\n avatarUrl?: string | null;\n}\n\ninterface ActivityUser extends User {\n activeTasks: unknown[];\n reviewTasks: unknown[];\n}\n\nconst RESOURCE_URI = \"ui://collab/activity.html\";\n\n/**\n * Register the User Activity app tool and resource.\n */\nexport function registerActivityApp(\n server: McpServer,\n apiClient: MCPApiClient,\n _authContext: AuthContext\n): void {\n registerAppTool(\n server,\n \"view_activity\",\n {\n title: \"User Activity\",\n description:\n \"View who is working on what across the team. Shows IN_PROGRESS and REVIEW tasks per user.\",\n inputSchema: {\n projectId: z\n .string()\n .optional()\n .describe(\"Optional project ID to filter by\"),\n },\n _meta: { ui: { resourceUri: RESOURCE_URI } },\n },\n async ({ projectId }) => {\n try {\n const [inProgressTasks, reviewTasks] = await Promise.all([\n apiClient.listTasks({\n projectId,\n state: TaskState.IN_PROGRESS,\n }),\n apiClient.listTasks({\n projectId,\n state: TaskState.REVIEW,\n }),\n ]);\n\n const userMap = new Map<string, ActivityUser>();\n\n for (const task of inProgressTasks) {\n if (task.assigneeId) {\n if (!userMap.has(task.assigneeId)) {\n userMap.set(task.assigneeId, {\n id: task.assigneeId,\n name: task.assigneeName || \"Unknown\",\n email: task.assigneeEmail || \"\",\n activeTasks: [],\n reviewTasks: [],\n });\n }\n userMap.get(task.assigneeId)!.activeTasks.push(task);\n }\n }\n\n for (const task of reviewTasks) {\n if (task.assigneeId) {\n if (!userMap.has(task.assigneeId)) {\n userMap.set(task.assigneeId, {\n id: task.assigneeId,\n name: task.assigneeName || \"Unknown\",\n email: task.assigneeEmail || \"\",\n activeTasks: [],\n reviewTasks: [],\n });\n }\n userMap.get(task.assigneeId)!.reviewTasks.push(task);\n }\n }\n\n const users = Array.from(userMap.values());\n\n return {\n content: [\n {\n type: \"text\",\n text: `Activity: ${users.length} users with active work`,\n },\n ],\n structuredContent: {\n users,\n projectId,\n },\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [\n { type: \"text\", text: `Error loading activity: ${message}` },\n ],\n isError: true,\n };\n }\n }\n );\n\n registerAppHtmlResource(server, {\n name: \"User Activity UI\",\n uri: RESOURCE_URI,\n description: \"Dashboard showing team member activity and workload\",\n htmlFileName: \"activity.html\",\n fallbackLabel: \"Activity\",\n });\n}\n","/**\n * Project Overview MCP App\n *\n * Project health dashboard with metrics and progress visualization.\n */\n\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { registerAppTool } from \"@modelcontextprotocol/ext-apps/server\";\nimport { z } from \"zod\";\nimport { TaskState } from \"@mtaap/core\";\nimport type { MCPApiClient, AuthContext } from \"../api-client.js\";\nimport { registerAppHtmlResource } from \"./helpers.js\";\n\ntype TaskStateCount = Record<\n \"DRAFT\" | \"TODO\" | \"IN_PROGRESS\" | \"REVIEW\" | \"DONE\",\n number\n>;\ntype TaskPriorityCount = Record<\"LOW\" | \"MEDIUM\" | \"HIGH\" | \"CRITICAL\", number>;\n\nconst RESOURCE_URI = \"ui://collab/project-overview.html\";\n\n/**\n * Register the Project Overview app tool and resource.\n */\nexport function registerProjectOverviewApp(\n server: McpServer,\n apiClient: MCPApiClient,\n _authContext: AuthContext\n): void {\n registerAppTool(\n server,\n \"view_project_overview\",\n {\n title: \"Project Overview\",\n description:\n \"View project health dashboard with task metrics, state distribution, and conventions.\",\n inputSchema: {\n projectId: z.string().describe(\"The project ID to display\"),\n },\n _meta: { ui: { resourceUri: RESOURCE_URI } },\n },\n async ({ projectId }) => {\n try {\n const [project, context, tasks] = await Promise.all([\n apiClient.getProject(projectId),\n apiClient.getProjectContext(projectId).catch(() => null),\n apiClient.listTasks({ projectId }),\n ]);\n\n const activeTasks = tasks.filter((t) => !t.isArchived);\n const inProgress = activeTasks.filter(\n (t) => t.state === TaskState.IN_PROGRESS\n ).length;\n const done = activeTasks.filter(\n (t) => t.state === TaskState.DONE\n ).length;\n const blocked = activeTasks.filter((t) => t.errorType).length;\n\n const tasksByState: TaskStateCount = {\n DRAFT: 0,\n TODO: 0,\n IN_PROGRESS: 0,\n REVIEW: 0,\n DONE: 0,\n };\n for (const task of activeTasks) {\n tasksByState[task.state as keyof TaskStateCount]++;\n }\n\n const tasksByPriority: TaskPriorityCount = {\n LOW: 0,\n MEDIUM: 0,\n HIGH: 0,\n CRITICAL: 0,\n };\n for (const task of activeTasks) {\n tasksByPriority[task.priority as keyof TaskPriorityCount]++;\n }\n\n const recentCompleted = activeTasks\n .filter((t) => t.state === TaskState.DONE)\n .sort(\n (a, b) =>\n new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime()\n )\n .slice(0, 5);\n\n return {\n content: [\n {\n type: \"text\",\n text: `Project overview for ${project.name}: ${activeTasks.length} tasks`,\n },\n ],\n structuredContent: {\n project,\n context,\n metrics: {\n totalTasks: activeTasks.length,\n inProgress,\n blocked,\n done,\n },\n tasksByState,\n tasksByPriority,\n recentCompleted,\n },\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [\n { type: \"text\", text: `Error loading project overview: ${message}` },\n ],\n isError: true,\n };\n }\n }\n );\n\n registerAppHtmlResource(server, {\n name: \"Project Overview UI\",\n uri: RESOURCE_URI,\n description: \"Project health dashboard with metrics and visualizations\",\n htmlFileName: \"project-overview.html\",\n fallbackLabel: \"Project Overview\",\n });\n}\n","/**\n * Agent Session Monitor MCP App\n *\n * Real-time view of active AI agent sessions working on tasks.\n * Note: This app requires agent session tracking to be implemented in the Collab webapp.\n * Currently returns mock/placeholder data structure for UI development.\n */\n\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { registerAppTool } from \"@modelcontextprotocol/ext-apps/server\";\nimport { z } from \"zod\";\nimport { TaskState } from \"@mtaap/core\";\nimport type { MCPApiClient, AuthContext } from \"../api-client.js\";\nimport { registerAppHtmlResource } from \"./helpers.js\";\n\ninterface AgentSession {\n id: string;\n taskId: string;\n taskTitle: string;\n agentName: string;\n status: \"STARTING\" | \"RUNNING\" | \"STOPPING\" | \"STOPPED\" | \"ERROR\";\n startedAt: string;\n lastCheckpoint?: string;\n currentStep?: string;\n progress?: number;\n}\n\nconst RESOURCE_URI = \"ui://collab/agent-sessions.html\";\n\n/**\n * Register the Agent Sessions app tool and resource.\n */\nexport function registerAgentSessionsApp(\n server: McpServer,\n apiClient: MCPApiClient,\n authContext: AuthContext\n): void {\n registerAppTool(\n server,\n \"view_agent_sessions\",\n {\n title: \"Agent Sessions\",\n description:\n \"View active AI agent sessions working on tasks. Monitor real-time progress and session status.\",\n inputSchema: {\n projectId: z\n .string()\n .optional()\n .describe(\"Optional project ID to filter by\"),\n },\n _meta: { ui: { resourceUri: RESOURCE_URI } },\n },\n async ({ projectId }) => {\n try {\n const [inProgressTasks, reviewTasks] = await Promise.all([\n apiClient.listTasks({\n projectId,\n state: TaskState.IN_PROGRESS,\n }),\n apiClient.listTasks({\n projectId,\n state: TaskState.REVIEW,\n }),\n ]);\n\n const sessions: AgentSession[] = [];\n\n for (const task of inProgressTasks) {\n if (task.assigneeId) {\n const totalCriteria = task.acceptanceCriteria?.length || 0;\n const completedCriteria =\n task.acceptanceCriteria?.filter((c) => c.completed).length || 0;\n const progress =\n totalCriteria > 0\n ? Math.round((completedCriteria / totalCriteria) * 100)\n : 0;\n\n const latestUpdate = task.progressUpdates?.[\n task.progressUpdates.length - 1\n ];\n\n sessions.push({\n id: `session-${task.id}`,\n taskId: task.id,\n taskTitle: task.title,\n agentName: task.assigneeName || \"Agent\",\n status: \"RUNNING\" as const,\n startedAt: task.updatedAt,\n lastCheckpoint: latestUpdate?.timestamp,\n currentStep: latestUpdate?.statusMessage,\n progress,\n });\n }\n }\n\n for (const task of reviewTasks) {\n if (task.assigneeId) {\n sessions.push({\n id: `session-${task.id}`,\n taskId: task.id,\n taskTitle: task.title,\n agentName: task.assigneeName || \"Agent\",\n status: \"STOPPED\" as const,\n startedAt: task.updatedAt,\n progress: 100,\n });\n }\n }\n\n return {\n content: [\n {\n type: \"text\",\n text: `Agent sessions: ${sessions.length} active`,\n },\n ],\n structuredContent: {\n sessions,\n projectId,\n },\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [\n { type: \"text\", text: `Error loading agent sessions: ${message}` },\n ],\n isError: true,\n };\n }\n }\n );\n\n registerAppHtmlResource(server, {\n name: \"Agent Sessions UI\",\n uri: RESOURCE_URI,\n description: \"Real-time view of AI agent sessions and their progress\",\n htmlFileName: \"agent-sessions.html\",\n fallbackLabel: \"Agent Sessions\",\n });\n}\n","/**\n * MCP Apps Registration\n *\n * Registers all interactive UI tools and resources for the Collab MCP Server.\n * Uses the @modelcontextprotocol/ext-apps SDK to provide rich visualizations.\n */\n\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { MCPApiClient, AuthContext } from \"../api-client.js\";\nimport { registerTaskDetailsApp } from \"./task-details.js\";\nimport { registerKanbanApp } from \"./kanban.js\";\nimport { registerActivityApp } from \"./activity.js\";\nimport { registerProjectOverviewApp } from \"./project-overview.js\";\nimport { registerAgentSessionsApp } from \"./agent-sessions.js\";\n\n/**\n * Register all MCP Apps with the server.\n *\n * @param server - The MCP server instance\n * @param apiClient - The API client for communicating with the Collab webapp\n * @param authContext - The authenticated user context\n */\nexport function registerMCPApps(\n server: McpServer,\n apiClient: MCPApiClient,\n authContext: AuthContext\n): void {\n // Register each app\n registerTaskDetailsApp(server, apiClient, authContext);\n registerKanbanApp(server, apiClient, authContext);\n registerActivityApp(server, apiClient, authContext);\n registerProjectOverviewApp(server, apiClient, authContext);\n registerAgentSessionsApp(server, apiClient, authContext);\n}\n","/**\n * HTTP Authentication Middleware for MCP Server\n *\n * Supports two authentication methods:\n * 1. OAuth 2.0 Bearer tokens (Authorization: Bearer <token>)\n * 2. API keys (X-API-Key: collab_<key>)\n *\n * OAuth tokens are validated against the web app's /api/oauth/validate endpoint.\n * API keys are validated using the existing MCPApiClient.\n */\n\nimport type { Request, Response, NextFunction } from \"express\";\nimport { MCPApiClient, ApiError, AuthContext } from \"./api-client.js\";\nimport type { InternalTokenValidationResponse } from \"@mtaap/core\";\n\n/**\n * Extract Bearer token from Authorization header\n */\nfunction extractBearerToken(\n authorizationHeader: string | undefined,\n): string | null {\n if (!authorizationHeader) return null;\n\n const parts = authorizationHeader.split(\" \");\n if (parts.length !== 2 || parts[0].toLowerCase() !== \"bearer\") {\n return null;\n }\n\n return parts[1];\n}\n\n/**\n * Extended Express Request with authenticated context\n */\nexport interface AuthenticatedRequest extends Request {\n apiClient: MCPApiClient;\n authContext: AuthContext;\n authMethod: \"oauth\" | \"api_key\";\n}\n\n/**\n * Validate OAuth Bearer token against the web app\n *\n * Note: The /api/oauth/validate endpoint only accepts requests from localhost.\n * When MCP server and web app are on the same host, use http://localhost:3000\n * as the baseUrl (or configure COLLAB_INTERNAL_URL for internal communication).\n */\nasync function validateOAuthToken(\n baseUrl: string,\n accessToken: string,\n): Promise<InternalTokenValidationResponse> {\n // Use internal URL for localhost communication if configured\n const internalUrl = process.env.COLLAB_INTERNAL_URL || baseUrl;\n\n const response = await fetch(`${internalUrl}/api/oauth/validate`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ access_token: accessToken }),\n });\n\n if (!response.ok) {\n throw new Error(`Token validation failed: ${response.status}`);\n }\n\n return response.json();\n}\n\n/**\n * Build the WWW-Authenticate header value for 401 responses.\n * Per RFC 9728, this tells MCP clients where to find the Protected Resource Metadata.\n */\nfunction buildWwwAuthenticateHeader(req: Request): string {\n const protocol =\n (req.headers[\"x-forwarded-proto\"] as string) || req.protocol || \"https\";\n const host =\n (req.headers[\"x-forwarded-host\"] as string) || req.headers.host;\n const resourceMetadataUrl = `${protocol}://${host}/.well-known/oauth-protected-resource`;\n return `Bearer resource_metadata=\"${resourceMetadataUrl}\"`;\n}\n\n/**\n * Validate the authentication header and authenticate the request.\n * Supports both OAuth Bearer tokens and API keys.\n * Sets req.apiClient and req.authContext on success.\n *\n * @param baseUrl - The Collab webapp base URL\n */\nexport function createAuthMiddleware(baseUrl: string) {\n return async (\n req: Request,\n res: Response,\n next: NextFunction,\n ): Promise<void> => {\n // Check for OAuth Bearer token first\n const authHeader = req.headers.authorization;\n const bearerToken = extractBearerToken(authHeader);\n\n if (bearerToken) {\n // OAuth token authentication\n try {\n const validation = await validateOAuthToken(baseUrl, bearerToken);\n\n if (!validation.valid) {\n res\n .status(401)\n .set(\"WWW-Authenticate\", buildWwwAuthenticateHeader(req))\n .json({\n jsonrpc: \"2.0\",\n error: {\n code: -32001,\n message: validation.userId ? \"Token expired\" : \"Invalid access token\",\n },\n id: null,\n });\n return;\n }\n\n // Create auth context from validated token\n // Validate permissions value to ensure it's a known permission level\n const rawPermissions = validation.permissions || \"WRITE\";\n const validPermissions = [\"READ\", \"WRITE\", \"ADMIN\"] as const;\n let permissions: \"READ\" | \"WRITE\" | \"ADMIN\";\n if (validPermissions.includes(rawPermissions as typeof validPermissions[number])) {\n permissions = rawPermissions as \"READ\" | \"WRITE\" | \"ADMIN\";\n } else {\n // Log warning for unexpected permissions value - may indicate config or database issue\n console.warn(`[collab-mcp-server] Unexpected permissions value \"${rawPermissions}\", defaulting to WRITE`);\n permissions = \"WRITE\";\n }\n\n const authContext: AuthContext = {\n userId: validation.userId!,\n userEmail: validation.userEmail!,\n userName: validation.userName || validation.userEmail!,\n permissions,\n };\n\n // Create API client with OAuth token for subsequent API calls\n const apiClient = new MCPApiClient({\n baseUrl,\n oauthToken: bearerToken,\n timeout: 30000,\n });\n\n // Attach to request for downstream handlers\n (req as AuthenticatedRequest).apiClient = apiClient;\n (req as AuthenticatedRequest).authContext = authContext;\n (req as AuthenticatedRequest).authMethod = \"oauth\";\n\n next();\n return;\n } catch (error) {\n console.error(\"[collab-mcp-server] OAuth validation error:\", error);\n res\n .status(401)\n .set(\"WWW-Authenticate\", buildWwwAuthenticateHeader(req))\n .json({\n jsonrpc: \"2.0\",\n error: {\n code: -32001,\n message: \"OAuth token validation failed\",\n },\n id: null,\n });\n return;\n }\n }\n\n // Fall back to API key authentication\n const apiKey = req.headers[\"x-api-key\"];\n\n if (!apiKey || typeof apiKey !== \"string\") {\n res\n .status(401)\n .set(\"WWW-Authenticate\", buildWwwAuthenticateHeader(req))\n .json({\n jsonrpc: \"2.0\",\n error: {\n code: -32001,\n message: \"Missing authentication. Provide Authorization: Bearer <token> or X-API-Key header\",\n },\n id: null,\n });\n return;\n }\n\n // Validate API key format (basic check)\n if (!apiKey.startsWith(\"collab_\")) {\n res.status(401).json({\n jsonrpc: \"2.0\",\n error: {\n code: -32001,\n message: \"Invalid API key format\",\n },\n id: null,\n });\n return;\n }\n\n try {\n // Create API client for this request\n const apiClient = new MCPApiClient({\n baseUrl,\n apiKey,\n timeout: 30000,\n });\n\n // Authenticate and get user context\n const authContext = await apiClient.authenticate();\n\n // Attach to request for downstream handlers\n (req as AuthenticatedRequest).apiClient = apiClient;\n (req as AuthenticatedRequest).authContext = authContext;\n (req as AuthenticatedRequest).authMethod = \"api_key\";\n\n next();\n } catch (error) {\n if (error instanceof ApiError) {\n const statusCode = error.status || 401;\n // Use distinct error codes: -32001 for 401 (auth), -32002 for 403 (forbidden)\n const errorCode =\n statusCode === 401 ? -32001 : statusCode === 403 ? -32002 : -32000;\n res.status(statusCode).json({\n jsonrpc: \"2.0\",\n error: {\n code: errorCode,\n message: error.message,\n },\n id: null,\n });\n return;\n }\n\n console.error(\"[collab-mcp-server] Authentication error:\", error);\n res.status(500).json({\n jsonrpc: \"2.0\",\n error: {\n code: -32000,\n message: \"Internal authentication error\",\n },\n id: null,\n });\n }\n };\n}\n"],"mappings":"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","names":["import_zod","TaskState","VerificationStatus","UserRole","ProjectType","ProjectOrigin","TaskPriority","DeploymentMode","ErrorType","PRStatus","PricingTier","ApiKeyPermission","WebSocketEventType","SubscriptionStatus","EventType","CreatedVia","AgentModel","AgentModelMode","AgentCLIType","AgentSessionStatus","VERSION","config","VERSION","config","import_zod","import_zod","metrics","labelsToKey","config","path","import_server","import_zod","path","config","fs","import_server","import_zod","RESOURCE_URI","import_server","import_zod","RESOURCE_URI","import_server","import_zod","RESOURCE_URI","import_server","import_zod","RESOURCE_URI","sessions","fs","path","express"]}