@mtaap/mcp 0.2.12 → 0.2.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +27 -0
- package/dist/cli.js +46 -26
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +392 -1
- package/dist/index.js +52 -25
- package/dist/index.js.map +1 -1
- package/dist/server.d.ts +1 -0
- package/dist/server.js +2656 -0
- package/dist/server.js.map +1 -0
- package/package.json +5 -2
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../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/cli.ts"],"sourcesContent":["/**\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 {\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)\n -> git checkout -b <branchName> (local git command)\n -> git push -u origin <branchName> (local git command)\n -> report_branch (tell server about the branch)\n -> [update_progress...]\n -> complete_task (returns PR suggestions)\n -> gh pr create (local gh command)\n -> report_pr (tell server about the PR)\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. After assign_task returns a suggested branch name,\n the agent creates the branch with git, pushes it, and reports it via report_branch.\n After complete_task returns PR suggestions, the agent creates the PR with gh, and reports it via report_pr.\n This eliminates the need for GitHub tokens on the server.\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\nexport async function createMCPServer() {\n const server = new McpServer(\n {\n name: \"collab\",\n version: VERSION,\n },\n {\n instructions: COLLAB_SERVER_INSTRUCTIONS,\n }\n );\n\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 // 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 and create git branch. Race-safe - fails if already assigned. Task must be TODO.\",\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 const transport = new StdioServerTransport();\n await server.connect(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 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 \"name\": \"@mtaap/mcp\",\n \"version\": \"0.2.11\",\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 },\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 \"zod\": \"^4.3.5\"\n },\n \"devDependencies\": {\n \"@mtaap/config-typescript\": \"workspace:*\",\n \"@mtaap/core\": \"workspace:*\",\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();\n\n if (!response.ok) {\n throw new ApiError(\n data.error || \"API request failed\",\n data.code || \"UNKNOWN_ERROR\",\n response.status,\n data.details,\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","#!/usr/bin/env node\n\nimport { createMCPServer } from \"./index.js\";\nimport { VERSION } from \"./version.js\";\n\n/**\n * CLI entry point for the Collab MCP server.\n * Validates environment, starts the server, and handles graceful shutdown.\n */\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 v${VERSION}`);\n process.exit(0);\n }\n\n if (args.includes(\"--help\") || args.includes(\"-h\")) {\n console.log(`collab-mcp v${VERSION}\n\nCollab MCP Server - Model Context Protocol server for Collab\n\nUsage:\n collab-mcp [options]\n\nOptions:\n -v, --version Show version number\n -h, --help Show this help message\n\nEnvironment Variables:\n COLLAB_API_KEY Your Collab API key (required)\n COLLAB_BASE_URL Collab webapp URL (required)\n\nExample mcp.json configuration:\n{\n \"mcpServers\": {\n \"collab\": {\n \"command\": \"npx\",\n \"args\": [\"@mtaap/mcp\"],\n \"env\": {\n \"COLLAB_API_KEY\": \"collab_your_api_key_here\",\n \"COLLAB_BASE_URL\": \"https://collab.mtaap.de\"\n }\n }\n }\n}`);\n process.exit(0);\n }\n}\n\nfunction validateEnvironment(): void {\n const errors: string[] = [];\n\n // Required: COLLAB_API_KEY\n if (!process.env.COLLAB_API_KEY) {\n errors.push(\n \"COLLAB_API_KEY is required. Generate one at https://collab.mtaap.de/settings/api-keys\",\n );\n }\n\n // Required: COLLAB_BASE_URL\n if (!process.env.COLLAB_BASE_URL) {\n errors.push(\n \"COLLAB_BASE_URL is required. Set to https://collab.mtaap.de for cloud or your self-hosted URL.\",\n );\n }\n\n // Exit if there are errors\n if (errors.length > 0) {\n for (const error of errors) {\n console.error(`[collab-mcp] Error: ${error}`);\n }\n console.error(\"\\nRequired environment variables:\");\n console.error(\" COLLAB_API_KEY Your Collab API key\");\n console.error(\" COLLAB_BASE_URL Collab webapp URL (e.g., https://collab.mtaap.de)\");\n console.error(\"\\nExample mcp.json configuration:\");\n console.error(`{\n \"mcpServers\": {\n \"collab\": {\n \"command\": \"npx\",\n \"args\": [\"@mtaap/mcp\"],\n \"env\": {\n \"COLLAB_API_KEY\": \"collab_your_api_key_here\",\n \"COLLAB_BASE_URL\": \"https://collab.mtaap.de\"\n }\n }\n }\n}`);\n process.exit(1);\n }\n\n // Validate URL format\n try {\n new URL(process.env.COLLAB_BASE_URL!);\n } catch {\n console.error(`[collab-mcp] Error: COLLAB_BASE_URL is not a valid URL: ${process.env.COLLAB_BASE_URL}`);\n process.exit(1);\n }\n}\n\nasync function checkConnectivity(): Promise<void> {\n const baseUrl = process.env.COLLAB_BASE_URL!;\n console.error(`[collab-mcp] Checking connectivity to ${baseUrl}...`);\n\n try {\n const response = await fetch(`${baseUrl}/api/mcp/auth`, {\n method: \"GET\",\n headers: {\n \"X-API-Key\": process.env.COLLAB_API_KEY!,\n },\n signal: AbortSignal.timeout(10000), // 10 second timeout\n });\n\n if (!response.ok) {\n const data = (await response.json().catch(() => ({}))) as { error?: string };\n if (response.status === 401) {\n console.error(\"[collab-mcp] Error: Invalid or expired API key\");\n process.exit(1);\n }\n console.error(`[collab-mcp] Error: API returned ${response.status}: ${data.error || \"Unknown error\"}`);\n process.exit(1);\n }\n\n console.error(\"[collab-mcp] Connected successfully\");\n } catch (error) {\n if (error instanceof Error && error.name === \"TimeoutError\") {\n console.error(`[collab-mcp] Error: Connection timed out to ${baseUrl}`);\n } else {\n console.error(`[collab-mcp] Error: Could not connect to ${baseUrl}`);\n console.error(`[collab-mcp] Details: ${error instanceof Error ? error.message : String(error)}`);\n }\n process.exit(1);\n }\n}\n\nasync function main(): Promise<void> {\n handleCliFlags();\n\n console.error(\"[collab-mcp] Starting Collab MCP server...\");\n\n validateEnvironment();\n await checkConnectivity();\n\n try {\n await createMCPServer();\n console.error(\"[collab-mcp] Server started successfully\");\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.error(`[collab-mcp] Failed to start server: ${message}`);\n process.exit(1);\n }\n}\n\n// Graceful shutdown handling\nfunction setupShutdownHandlers(): void {\n const shutdown = (signal: string): void => {\n console.error(`[collab-mcp] Received ${signal}, shutting down...`);\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] 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] Unhandled rejection:\", message);\n process.exit(1);\n });\n}\n\nsetupShutdownHandlers();\nmain();\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"]}
|
|
1
|
+
{"version":3,"sources":["../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/cli.ts"],"sourcesContent":["/**\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","#!/usr/bin/env node\n\nimport { createMCPServer } from \"./index.js\";\nimport { VERSION } from \"./version.js\";\n\n/**\n * CLI entry point for the Collab MCP server.\n * Validates environment, starts the server, and handles graceful shutdown.\n */\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 v${VERSION}`);\n process.exit(0);\n }\n\n if (args.includes(\"--help\") || args.includes(\"-h\")) {\n console.log(`collab-mcp v${VERSION}\n\nCollab MCP Server - Model Context Protocol server for Collab\n\nUsage:\n collab-mcp [options]\n\nOptions:\n -v, --version Show version number\n -h, --help Show this help message\n\nEnvironment Variables:\n COLLAB_API_KEY Your Collab API key (required)\n COLLAB_BASE_URL Collab webapp URL (required)\n\nExample mcp.json configuration:\n{\n \"mcpServers\": {\n \"collab\": {\n \"command\": \"npx\",\n \"args\": [\"@mtaap/mcp\"],\n \"env\": {\n \"COLLAB_API_KEY\": \"collab_your_api_key_here\",\n \"COLLAB_BASE_URL\": \"https://collab.mtaap.de\"\n }\n }\n }\n}`);\n process.exit(0);\n }\n}\n\nfunction validateEnvironment(): void {\n const errors: string[] = [];\n\n // Required: COLLAB_API_KEY\n if (!process.env.COLLAB_API_KEY) {\n errors.push(\n \"COLLAB_API_KEY is required. Generate one at https://collab.mtaap.de/settings/api-keys\",\n );\n }\n\n // Required: COLLAB_BASE_URL\n if (!process.env.COLLAB_BASE_URL) {\n errors.push(\n \"COLLAB_BASE_URL is required. Set to https://collab.mtaap.de for cloud or your self-hosted URL.\",\n );\n }\n\n // Exit if there are errors\n if (errors.length > 0) {\n for (const error of errors) {\n console.error(`[collab-mcp] Error: ${error}`);\n }\n console.error(\"\\nRequired environment variables:\");\n console.error(\" COLLAB_API_KEY Your Collab API key\");\n console.error(\" COLLAB_BASE_URL Collab webapp URL (e.g., https://collab.mtaap.de)\");\n console.error(\"\\nExample mcp.json configuration:\");\n console.error(`{\n \"mcpServers\": {\n \"collab\": {\n \"command\": \"npx\",\n \"args\": [\"@mtaap/mcp\"],\n \"env\": {\n \"COLLAB_API_KEY\": \"collab_your_api_key_here\",\n \"COLLAB_BASE_URL\": \"https://collab.mtaap.de\"\n }\n }\n }\n}`);\n process.exit(1);\n }\n\n // Validate URL format\n try {\n new URL(process.env.COLLAB_BASE_URL!);\n } catch {\n console.error(`[collab-mcp] Error: COLLAB_BASE_URL is not a valid URL: ${process.env.COLLAB_BASE_URL}`);\n process.exit(1);\n }\n}\n\nasync function checkConnectivity(): Promise<void> {\n const baseUrl = process.env.COLLAB_BASE_URL!;\n console.error(`[collab-mcp] Checking connectivity to ${baseUrl}...`);\n\n // Create abort controller for timeout (Node.js 18 compatible)\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 10000);\n\n try {\n const response = await fetch(`${baseUrl}/api/mcp/auth`, {\n method: \"GET\",\n headers: {\n \"X-API-Key\": process.env.COLLAB_API_KEY!,\n },\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const data = (await response.json().catch(() => ({}))) as { error?: string };\n if (response.status === 401) {\n console.error(\"[collab-mcp] Error: Invalid or expired API key\");\n process.exit(1);\n }\n console.error(`[collab-mcp] Error: API returned ${response.status}: ${data.error || \"Unknown error\"}`);\n process.exit(1);\n }\n\n console.error(\"[collab-mcp] Connected successfully\");\n } catch (error) {\n clearTimeout(timeoutId);\n if (error instanceof Error && error.name === \"AbortError\") {\n console.error(`[collab-mcp] Error: Connection timed out to ${baseUrl}`);\n } else {\n console.error(`[collab-mcp] Error: Could not connect to ${baseUrl}`);\n console.error(`[collab-mcp] Details: ${error instanceof Error ? error.message : String(error)}`);\n }\n process.exit(1);\n }\n}\n\nasync function main(): Promise<void> {\n handleCliFlags();\n\n console.error(\"[collab-mcp] Starting Collab MCP server...\");\n\n validateEnvironment();\n await checkConnectivity();\n\n try {\n await createMCPServer();\n console.error(\"[collab-mcp] Server started successfully\");\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.error(`[collab-mcp] Failed to start server: ${message}`);\n process.exit(1);\n }\n}\n\n// Graceful shutdown handling\nfunction setupShutdownHandlers(): void {\n const shutdown = (signal: string): void => {\n console.error(`[collab-mcp] Received ${signal}, shutting down...`);\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] 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] Unhandled rejection:\", message);\n process.exit(1);\n });\n}\n\nsetupShutdownHandlers();\nmain();\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"]}
|