@mtaap/mcp 0.1.2 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/index.ts","../../../packages/auth/dist/nextauth.js","../../../packages/auth/dist/ldap.js","../../../packages/auth/dist/stateMachine.js","../src/version.ts","../../../packages/git/dist/github.js","../../../packages/git/dist/errors.js","../src/permissions.ts"],"sourcesContent":["import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { validateApiKey } from \"@mtaap/auth\";\nimport { prisma, Prisma } from \"@mtaap/db\";\nimport { VERSION } from \"./version.js\";\nimport {\n TaskState,\n ErrorType,\n ProjectType,\n ProjectOrigin,\n ApiKeyPermission,\n} from \"@mtaap/core\";\nimport { GitHubProvider } from \"@mtaap/git\";\nimport { assertApiKeyPermission } from \"./permissions.js\";\nimport {\n ListProjectsInputSchema,\n ListTasksInputSchema,\n GetTaskInputSchema,\n AssignTaskInputSchema,\n UpdateProgressInputSchema,\n CompleteTaskInputSchema,\n ReportErrorInputSchema,\n GetProjectContextInputSchema,\n AddNoteInputSchema,\n AbandonTaskInputSchema,\n CreatePersonalProjectInputSchema,\n} from \"@mtaap/core\";\n\nasync function getAuthenticatedUser(apiKey: string) {\n const result = await validateApiKey(apiKey);\n\n if (!result) {\n throw new Error(\"Invalid API key\");\n }\n\n return {\n userId: result.user.id,\n organizationId: result.organization?.id,\n apiKey: result.apiKey,\n };\n}\n\nasync function ensureAccessControl(\n projectId: string,\n userId: string,\n organizationId: string | null,\n): Promise<void> {\n if (!organizationId) {\n const project = await prisma.project.findUnique({\n where: { id: projectId },\n include: { owner: true },\n });\n\n if (project?.ownerId !== userId) {\n throw new Error(\n \"Access denied: You do not have permission to access this project\",\n );\n }\n } else {\n const project = await prisma.project.findUnique({\n where: { id: projectId },\n include: { organization: true },\n });\n\n if (!project || project.organizationId !== organizationId) {\n throw new Error(\n \"Access denied: You do not have permission to access this project\",\n );\n }\n\n const userTags = await prisma.userTag.findMany({\n where: { userId },\n include: { tag: true },\n });\n\n const projectTags = await prisma.projectTag.findMany({\n where: { projectId },\n include: { tag: true },\n });\n\n const userTagNames = new Set(\n userTags.map((ut: { tag: { name: string } }) => ut.tag.name),\n );\n const projectTagNames = new Set(\n projectTags.map((pt: { tag: { name: string } }) => pt.tag.name),\n );\n\n const hasAccess = [...userTagNames].some((tag) => projectTagNames.has(tag));\n\n if (!hasAccess) {\n throw new Error(\n \"Access denied: Your tags do not grant access to this project\",\n );\n }\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nasync function verifyPersonalAccess(\n projectId: string,\n userId: string,\n): Promise<void> {\n const project = await prisma.project.findUnique({\n where: { id: projectId },\n include: {\n collaborators: {\n where: { userId },\n },\n },\n });\n\n if (!project) {\n throw new Error(\"Project not found\");\n }\n\n const isOwner = project.ownerId === userId;\n const isCollaborator = project.collaborators.length > 0;\n\n if (!isOwner && !isCollaborator) {\n throw new Error(\n \"Access denied: You do not have permission to access this project\",\n );\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nfunction getGitHubClient(_organizationId: string): GitHubProvider {\n const githubToken = process.env.GITHUB_TOKEN;\n\n if (!githubToken) {\n throw new Error(\"GitHub token not configured\");\n }\n\n return new GitHubProvider(githubToken);\n}\n\nfunction slugify(text: string, maxLength = 50): string {\n return text\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .substring(0, maxLength);\n}\n\nexport async function createMCPServer() {\n const server = new McpServer({\n name: \"mtaap\",\n version: VERSION,\n });\n\n const apiKey = process.env.MTAAP_API_KEY;\n\n if (!apiKey) {\n throw new Error(\"MTAAP_API_KEY environment variable is required\");\n }\n\n const auth = await getAuthenticatedUser(apiKey);\n\n server.registerTool(\n \"list_projects\",\n {\n description: \"List accessible projects (personal + team via tags)\",\n },\n async (args) => {\n assertApiKeyPermission(\n auth.apiKey,\n ApiKeyPermission.READ,\n \"list_projects\",\n );\n const validated = ListProjectsInputSchema.parse(args);\n const projects = await listProjects(\n auth.userId,\n auth.organizationId,\n validated.workspaceType,\n );\n\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(projects, null, 2),\n },\n ],\n };\n },\n );\n\n server.registerTool(\n \"list_tasks\",\n {\n description: \"Returns available tasks (filterable by project, state)\",\n },\n async (args) => {\n assertApiKeyPermission(auth.apiKey, ApiKeyPermission.READ, \"list_tasks\");\n const validated = ListTasksInputSchema.parse(args);\n if (validated.projectId) {\n await ensureAccessControl(\n validated.projectId,\n auth.userId,\n auth.organizationId,\n );\n }\n const tasks = await listTasks(\n auth.userId,\n auth.organizationId,\n validated.projectId,\n validated.state,\n validated.assigneeId,\n );\n\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(tasks, null, 2),\n },\n ],\n };\n },\n );\n\n server.registerTool(\n \"get_task\",\n {\n description: \"Full task details including acceptance criteria\",\n },\n async (args) => {\n assertApiKeyPermission(auth.apiKey, ApiKeyPermission.READ, \"get_task\");\n const validated = GetTaskInputSchema.parse(args);\n const task = await getTaskWithChecks(\n validated.taskId,\n auth.userId,\n auth.organizationId,\n );\n\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(task, null, 2),\n },\n ],\n };\n },\n );\n\n server.registerTool(\n \"assign_task\",\n {\n description: \"Atomic claim → creates branch. Fails if already taken.\",\n },\n async (args) => {\n assertApiKeyPermission(\n auth.apiKey,\n ApiKeyPermission.WRITE,\n \"assign_task\",\n );\n const validated = AssignTaskInputSchema.parse(args);\n const result = await assignTask(\n validated.projectId,\n validated.taskId,\n auth.userId,\n auth.organizationId,\n validated.expectedState,\n );\n\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 \"update_progress\",\n {\n description: \"Reports status, updates checkboxes, writes checkpoint\",\n },\n async (args) => {\n assertApiKeyPermission(\n auth.apiKey,\n ApiKeyPermission.WRITE,\n \"update_progress\",\n );\n const validated = UpdateProgressInputSchema.parse(args);\n const result = await updateProgress(\n validated.taskId,\n auth.userId,\n validated.statusMessage,\n validated.completedCheckpointIds,\n validated.currentCheckpointIndex,\n );\n\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 \"complete_task\",\n {\n description: \"Marks complete, triggers PR, deletes local state file\",\n },\n async (args) => {\n assertApiKeyPermission(\n auth.apiKey,\n ApiKeyPermission.WRITE,\n \"complete_task\",\n );\n const validated = CompleteTaskInputSchema.parse(args);\n const result = await completeTask(\n validated.projectId,\n validated.taskId,\n auth.userId,\n auth.organizationId,\n validated.pullRequestTitle,\n validated.pullRequestBody,\n );\n\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 \"check_active_task\",\n {\n description: \"Check for resumable task in .mtaap/active-task.json\",\n },\n async () => {\n assertApiKeyPermission(\n auth.apiKey,\n ApiKeyPermission.READ,\n \"check_active_task\",\n );\n const result = await checkActiveTask();\n\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: \"Report unrecoverable error, displays on task in webapp\",\n },\n async (args) => {\n assertApiKeyPermission(\n auth.apiKey,\n ApiKeyPermission.WRITE,\n \"report_error\",\n );\n const validated = ReportErrorInputSchema.parse(args);\n const result = await reportTaskError(\n validated.taskId,\n auth.userId,\n validated.errorType,\n validated.errorMessage,\n validated.context,\n );\n\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 \"get_project_context\",\n {\n description: \"Returns assembled context (README, stack, conventions)\",\n },\n async (args) => {\n assertApiKeyPermission(\n auth.apiKey,\n ApiKeyPermission.READ,\n \"get_project_context\",\n );\n const validated = GetProjectContextInputSchema.parse(args);\n await ensureAccessControl(\n validated.projectId,\n auth.userId,\n auth.organizationId,\n );\n const context = await getProjectContext(validated.projectId);\n\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(context, null, 2),\n },\n ],\n };\n },\n );\n\n server.registerTool(\n \"add_note\",\n {\n description: \"Append implementation notes to task\",\n },\n async (args) => {\n assertApiKeyPermission(auth.apiKey, ApiKeyPermission.WRITE, \"add_note\");\n const validated = AddNoteInputSchema.parse(args);\n const result = await addTaskNote(\n validated.taskId,\n auth.userId,\n validated.content,\n );\n\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 \"abandon_task\",\n {\n description: \"Unassign from a task and optionally delete the branch\",\n },\n async (args) => {\n assertApiKeyPermission(\n auth.apiKey,\n ApiKeyPermission.WRITE,\n \"abandon_task\",\n );\n const validated = AbandonTaskInputSchema.parse(args);\n\n // Validate project access\n await ensureAccessControl(\n validated.projectId,\n auth.userId,\n auth.organizationId || null,\n );\n\n const result = await abandonTask(\n validated.taskId,\n validated.projectId,\n auth.userId,\n validated.deleteBranch,\n );\n\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 \"create_personal_project\",\n {\n description: \"Create project in user's personal workspace\",\n },\n async (args) => {\n assertApiKeyPermission(\n auth.apiKey,\n ApiKeyPermission.WRITE,\n \"create_personal_project\",\n );\n const validated = CreatePersonalProjectInputSchema.parse(args);\n const result = await createPersonalProject(\n auth.userId,\n validated.name,\n validated.description,\n validated.repositoryUrl,\n );\n\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 \"get_version\",\n {\n description: \"Get the current MTAAP version\",\n },\n async () => {\n assertApiKeyPermission(auth.apiKey, 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\nasync function listProjects(\n userId: string,\n organizationId: string | null,\n workspaceType: string = \"ALL\",\n) {\n const where: Prisma.ProjectWhereInput = {};\n const include: Prisma.ProjectInclude = {};\n\n if (workspaceType === \"PERSONAL\" || workspaceType === \"ALL\") {\n where.ownerId = userId;\n include.owner = true;\n }\n\n if (organizationId && (workspaceType === \"TEAM\" || workspaceType === \"ALL\")) {\n where.OR = [\n { organizationId },\n { type: ProjectType.PERSONAL, ownerId: userId },\n ];\n include.organization = true;\n include.projectTags = {\n include: { tag: true },\n };\n }\n\n const projects = await prisma.project.findMany({\n where,\n include,\n orderBy: { updatedAt: \"desc\" },\n });\n\n const formattedProjects = projects.map(\n (project: (typeof projects)[number]) => ({\n id: project.id,\n name: project.name,\n description: project.description,\n type: project.type,\n origin: project.origin,\n repositoryUrl: project.repositoryUrl,\n baseBranch: project.baseBranch,\n tags:\n (\n project as unknown as { projectTags?: Array<{ tag: { name: string } }> }\n ).projectTags?.map((pt) => pt.tag.name) || [],\n createdAt: project.createdAt,\n updatedAt: project.updatedAt,\n }),\n );\n\n return formattedProjects;\n}\n\nasync function listTasks(\n userId: string,\n organizationId: string | null,\n projectId: string | undefined,\n state: TaskState | undefined,\n assigneeId: string | undefined,\n) {\n const where: Prisma.TaskWhereInput = { projectId };\n\n if (organizationId) {\n where.project = {\n organizationId,\n };\n }\n\n if (state) {\n where.state = state;\n }\n\n if (assigneeId) {\n where.assigneeId = assigneeId;\n }\n\n const tasks = await prisma.task.findMany({\n where,\n include: {\n project: true,\n assignee: true,\n creator: true,\n epic: true,\n },\n orderBy: { createdAt: \"desc\" },\n });\n\n const formattedTasks = await Promise.all(\n tasks.map(async (task: (typeof tasks)[number]) => {\n const acceptanceCriteria = await prisma.acceptanceCriterion.findMany({\n where: { taskId: task.id },\n orderBy: { order: \"asc\" },\n });\n\n return {\n id: task.id,\n projectId: task.projectId,\n projectName: task.project?.name || \"Unknown\",\n epicId: task.epicId,\n epicName: task.epic?.name || null,\n title: task.title,\n description: task.description,\n state: task.state,\n priority: task.priority,\n assigneeId: task.assigneeId,\n assigneeName: task.assignee?.name || null,\n assigneeEmail: task.assignee?.email || null,\n createdBy: task.createdBy,\n createdByName: task.creator?.name || null,\n assignedAt: task.assignedAt,\n startedAt: task.startedAt,\n completedAt: task.completedAt,\n branchName: task.branchName,\n pullRequestUrl: task.pullRequestUrl,\n pullRequestNumber: task.pullRequestNumber,\n errorType: task.errorType,\n errorMessage: task.errorMessage,\n acceptanceCriteria: acceptanceCriteria.map((ac: (typeof acceptanceCriteria)[number]) => ({\n id: ac.id,\n description: ac.description,\n completed: ac.completed,\n completedAt: ac.completedAt,\n order: ac.order,\n })),\n createdAt: task.createdAt,\n updatedAt: task.updatedAt,\n };\n }),\n );\n\n return formattedTasks;\n}\n\nasync function getTaskWithChecks(\n taskId: string,\n userId: string,\n organizationId: string | null,\n) {\n const task = await prisma.task.findUnique({\n where: { id: taskId },\n include: {\n project: {\n include: {\n organization: true,\n projectTags: {\n include: { tag: true },\n },\n },\n },\n epic: true,\n assignee: true,\n creator: true,\n acceptanceCriteria: {\n orderBy: { order: \"asc\" },\n },\n progressUpdates: {\n orderBy: { createdAt: \"desc\" },\n take: 10,\n },\n notes: {\n orderBy: { createdAt: \"desc\" },\n take: 10,\n },\n },\n });\n\n if (!task) {\n throw new Error(\"Task not found\");\n }\n\n if (organizationId && task.project?.organizationId !== organizationId) {\n const userTags = await prisma.userTag.findMany({\n where: { userId },\n include: { tag: true },\n });\n\n const projectTagNames = new Set(\n task.project.projectTags?.map(\n (pt: { tag: { name: string } }) => pt.tag.name,\n ) || [],\n );\n const userTagNames = new Set(\n userTags.map((ut: { tag: { name: string } }) => ut.tag.name),\n );\n\n const hasAccess = [...userTagNames].some((tag) => projectTagNames.has(tag));\n\n if (!hasAccess) {\n throw new Error(\n \"Access denied: Your tags do not grant access to this project\",\n );\n }\n }\n\n const formattedTask = {\n id: task.id,\n projectId: task.projectId,\n projectName: task.project?.name || \"Unknown\",\n epicId: task.epicId,\n epicName: task.epic?.name || null,\n title: task.title,\n description: task.description,\n state: task.state,\n priority: task.priority,\n assigneeId: task.assigneeId,\n assigneeName: task.assignee?.name || null,\n assigneeEmail: task.assignee?.email || null,\n createdBy: task.createdBy,\n createdByName: task.creator?.name || null,\n assignedAt: task.assignedAt,\n startedAt: task.startedAt,\n completedAt: task.completedAt,\n branchName: task.branchName,\n pullRequestUrl: task.pullRequestUrl,\n pullRequestNumber: task.pullRequestNumber,\n errorType: task.errorType,\n errorMessage: task.errorMessage,\n acceptanceCriteria: task.acceptanceCriteria.map(\n (ac: (typeof task.acceptanceCriteria)[number]) => ({\n id: ac.id,\n description: ac.description,\n completed: ac.completed,\n completedAt: ac.completedAt,\n order: ac.order,\n }),\n ),\n progressUpdates: task.progressUpdates.map(\n (pu: (typeof task.progressUpdates)[number]) => ({\n id: pu.id,\n message: pu.message,\n checkpoints: pu.checkpoints,\n userId: pu.userId,\n createdAt: pu.createdAt,\n }),\n ),\n notes: task.notes.map((note: (typeof task.notes)[number]) => ({\n id: note.id,\n content: note.content,\n userId: note.userId,\n createdAt: note.createdAt,\n })),\n createdAt: task.createdAt,\n updatedAt: task.updatedAt,\n };\n\n return formattedTask;\n}\n\nasync function assignTask(\n projectId: string,\n taskId: string,\n userId: string,\n organizationId: string | null,\n expectedState = TaskState.READY,\n) {\n await ensureAccessControl(projectId, userId, organizationId);\n\n const task = await prisma.task.findUnique({\n where: { id: taskId },\n include: { project: true },\n });\n\n if (!task) {\n throw new Error(\"Task not found\");\n }\n\n if (task.state !== expectedState) {\n return {\n success: false,\n taskId,\n currentState: task.state,\n message: `Task is already in state: ${task.state}`,\n };\n }\n\n const repoInfo = GitHubProvider.parseRepositoryUrl(\n task.project?.repositoryUrl || \"\",\n );\n\n if (!repoInfo) {\n throw new Error(\"Invalid repository URL\");\n }\n\n const github = getGitHubClient(task.project?.organizationId || \"\");\n const branchSuffix = slugify(task.title);\n const branchName = `feature/${taskId}-${branchSuffix}`;\n\n const createResult = await github.createBranch({\n owner: repoInfo.owner,\n repo: repoInfo.repo,\n sourceBranch: task.project?.baseBranch || \"develop\",\n newBranch: branchName,\n });\n\n if (!createResult.success) {\n throw new Error(`Failed to create branch: ${createResult.error}`);\n }\n\n const updatedTask = await prisma.task.update({\n where: { id: taskId },\n data: {\n state: TaskState.IN_PROGRESS,\n assigneeId: userId,\n assignedAt: new Date(),\n branchName,\n startedAt: new Date(),\n },\n });\n\n return {\n success: true,\n taskId: updatedTask.id,\n branchName,\n };\n}\n\nasync function updateProgress(\n taskId: string,\n userId: string,\n statusMessage: string | undefined,\n completedCheckpointIds: string[] | undefined,\n _currentCheckpointIndex: number | undefined,\n) {\n const task = await prisma.task.findUnique({\n where: { id: taskId },\n });\n\n if (!task) {\n throw new Error(\"Task not found\");\n }\n\n if (task.assigneeId !== userId) {\n throw new Error(\"You are not assigned to this task\");\n }\n\n if (completedCheckpointIds && completedCheckpointIds.length > 0) {\n await prisma.acceptanceCriterion.updateMany({\n where: {\n id: { in: completedCheckpointIds },\n },\n data: {\n completed: true,\n completedAt: new Date(),\n },\n });\n }\n\n if (statusMessage) {\n await prisma.progressUpdate.create({\n data: {\n taskId,\n userId,\n message: statusMessage,\n checkpoints: [],\n },\n });\n }\n\n const updatedTask = await prisma.task.update({\n where: { id: taskId },\n data: {\n updatedAt: new Date(),\n },\n });\n\n return {\n success: true,\n taskId: updatedTask.id,\n };\n}\n\nasync function completeTask(\n projectId: string,\n taskId: string,\n userId: string,\n organizationId: string | null,\n pullRequestTitle: string | undefined,\n pullRequestBody: string | undefined,\n) {\n await ensureAccessControl(projectId, userId, organizationId);\n\n const task = await prisma.task.findUnique({\n where: { id: taskId },\n include: { project: true },\n });\n\n if (!task) {\n throw new Error(\"Task not found\");\n }\n\n if (task.assigneeId !== userId) {\n throw new Error(\"You are not assigned to this task\");\n }\n\n if (task.state !== TaskState.IN_PROGRESS) {\n throw new Error(\"Task must be in progress to be completed\");\n }\n\n if (!task.branchName) {\n throw new Error(\"Task has no associated branch\");\n }\n\n const repoInfo = GitHubProvider.parseRepositoryUrl(\n task.project?.repositoryUrl || \"\",\n );\n\n if (!repoInfo) {\n throw new Error(\"Invalid repository URL\");\n }\n\n const github = getGitHubClient(task.project?.organizationId || \"\");\n const acceptanceCriteria = await prisma.acceptanceCriterion.findMany({\n where: { taskId },\n orderBy: { order: \"asc\" },\n });\n\n const acceptanceChecklist = acceptanceCriteria\n .map(\n (ac: (typeof acceptanceCriteria)[number]) =>\n `- [${ac.completed ? \"x\" : \" \"}] ${ac.description}`,\n )\n .join(\"\\n\");\n\n const prTitle = pullRequestTitle || `[${taskId}] ${task.title}`;\n const prBody =\n pullRequestBody ||\n `${task.description}\\n\\n### Acceptance Criteria\\n\\n${acceptanceChecklist}`;\n\n const createResult = await github.createPR({\n owner: repoInfo.owner,\n repo: repoInfo.repo,\n title: prTitle,\n body: prBody,\n head: task.branchName,\n base: task.project?.baseBranch || \"develop\",\n });\n\n if (!createResult.success) {\n throw new Error(`Failed to create PR: ${createResult.error}`);\n }\n\n const updatedTask = await prisma.task.update({\n where: { id: taskId },\n data: {\n state: TaskState.REVIEW,\n completedAt: new Date(),\n pullRequestUrl: createResult.prUrl,\n pullRequestNumber: createResult.prNumber,\n },\n });\n\n return {\n success: true,\n taskId: updatedTask.id,\n prUrl: createResult.prUrl,\n prNumber: createResult.prNumber,\n };\n}\n\nasync function checkActiveTask() {\n const fs = await import(\"fs\");\n const path = await import(\"path\");\n\n const activeTaskPath = path.join(process.cwd(), \".mtaap\", \"active-task.json\");\n\n if (!(await fs.promises.access(activeTaskPath).catch(() => false))) {\n return {\n hasActiveTask: false,\n task: null,\n };\n }\n\n const content = await fs.promises.readFile(activeTaskPath, \"utf-8\");\n const activeTask = JSON.parse(content);\n\n return {\n hasActiveTask: true,\n task: activeTask,\n };\n}\n\nasync function reportTaskError(\n taskId: string,\n userId: string,\n errorType: ErrorType,\n errorMessage: string,\n _context: string | undefined,\n) {\n const task = await prisma.task.findUnique({\n where: { id: taskId },\n });\n\n if (!task) {\n throw new Error(\"Task not found\");\n }\n\n if (task.assigneeId !== userId) {\n throw new Error(\"You are not assigned to this task\");\n }\n\n const updatedTask = await prisma.task.update({\n where: { id: taskId },\n data: {\n errorType,\n errorMessage,\n },\n });\n\n return {\n success: true,\n taskId: updatedTask.id,\n };\n}\n\nasync function getProjectContext(projectId: string) {\n const project = await prisma.project.findUnique({\n where: { id: projectId },\n include: {\n organization: {\n include: { settings: true },\n },\n },\n });\n\n if (!project) {\n throw new Error(\"Project not found\");\n }\n\n const repoInfo = GitHubProvider.parseRepositoryUrl(project.repositoryUrl);\n\n let readme = \"\";\n let stack: string[] = [];\n\n if (repoInfo) {\n const github = getGitHubClient(project.organizationId || \"\");\n const readmeResult = await github.getRepositoryReadme(\n repoInfo.owner,\n repoInfo.repo,\n );\n\n readme = readmeResult || \"No README found\";\n\n const packageJsonResult = await github.getRepositoryPackageJson(\n repoInfo.owner,\n repoInfo.repo,\n );\n if (packageJsonResult) {\n const packageJson = JSON.parse(packageJsonResult);\n const deps = {\n ...packageJson.dependencies,\n ...packageJson.devDependencies,\n };\n stack = Object.keys(deps).slice(0, 20);\n }\n }\n\n const recentCompletedTasks = await prisma.task.findMany({\n where: {\n project: {\n id: projectId,\n },\n state: TaskState.DONE,\n },\n orderBy: { completedAt: \"desc\" },\n take: 10,\n include: {\n creator: {\n select: { id: true, name: true },\n },\n },\n });\n\n const conventions = {\n branchPrefix: \"feature/\",\n commitFormat: project.organization?.settings?.enforceConventionalCommits\n ? \"conventional\"\n : \"none\",\n testCommand: \"npm test\",\n baseBranch: project.baseBranch || \"develop\",\n notes:\n project.organization?.settings?.maxPersonalProjectsPerUser?.toString() ||\n \"\",\n };\n\n return {\n readme: readme.substring(0, 2000),\n stack,\n recentCompleted: recentCompletedTasks.map(\n (task: (typeof recentCompletedTasks)[number]) => ({\n id: task.id,\n title: task.title,\n completedAt: task.completedAt,\n }),\n ),\n conventions,\n };\n}\n\nasync function addTaskNote(taskId: string, userId: string, content: string) {\n const task = await prisma.task.findUnique({\n where: { id: taskId },\n });\n\n if (!task) {\n throw new Error(\"Task not found\");\n }\n\n if (task.assigneeId !== userId) {\n throw new Error(\"You are not assigned to this task\");\n }\n\n const note = await prisma.taskNote.create({\n data: {\n taskId,\n userId,\n content,\n },\n });\n\n return {\n success: true,\n noteId: note.id,\n };\n}\n\nasync function abandonTask(\n taskId: string,\n projectId: string,\n userId: string,\n deleteBranch?: boolean,\n) {\n const task = await prisma.task.findUnique({\n where: { id: taskId },\n include: { project: true },\n });\n\n if (!task) {\n throw new Error(\"Task not found\");\n }\n\n // Validate task belongs to specified project\n if (task.projectId !== projectId) {\n throw new Error(\"Task does not belong to the specified project\");\n }\n\n if (task.assigneeId !== userId) {\n throw new Error(\"You can only abandon tasks you are assigned to\");\n }\n\n // Check if repository URL exists before parsing\n const repositoryUrl = task.project?.repositoryUrl;\n const repoInfo = repositoryUrl\n ? GitHubProvider.parseRepositoryUrl(repositoryUrl)\n : undefined;\n\n if (deleteBranch && repoInfo && task.branchName) {\n const github = getGitHubClient(task.project?.organizationId || \"\");\n try {\n await github.deleteBranch(repoInfo.owner, repoInfo.repo, task.branchName);\n } catch (error) {\n console.error(\"Failed to delete GitHub branch when abandoning task\", {\n taskId,\n projectId: task.projectId,\n organizationId: task.project?.organizationId,\n repositoryOwner: repoInfo.owner,\n repositoryName: repoInfo.repo,\n branchName: task.branchName,\n error,\n });\n throw new Error(\"Failed to delete branch\");\n }\n }\n\n // Use TaskState enum constant instead of string literal\n const newState =\n task.state === TaskState.IN_PROGRESS ? TaskState.READY : task.state;\n\n const updatedTask = await prisma.task.update({\n where: { id: taskId },\n data: {\n state: newState,\n assigneeId: null,\n assignedAt: null,\n startedAt: null,\n updatedAt: new Date(),\n },\n });\n\n return {\n success: true,\n taskId: updatedTask.id,\n state: updatedTask.state,\n branchDeleted: deleteBranch ? !!repoInfo && !!task.branchName : false,\n };\n}\n\nasync function createPersonalProject(\n userId: string,\n name: string,\n description: string | undefined,\n repositoryUrl: string,\n) {\n const user = await prisma.user.findUnique({\n where: { id: userId },\n include: { organizations: true },\n });\n\n if (!user) {\n throw new Error(\"User not found\");\n }\n\n const repoInfo = GitHubProvider.parseRepositoryUrl(repositoryUrl);\n\n if (!repoInfo) {\n throw new Error(\"Invalid repository URL\");\n }\n\n const github = getGitHubClient(user.organizations[0]?.organizationId || \"\");\n const branchInfo = await github.getBranchInfo({\n owner: repoInfo.owner,\n repo: repoInfo.repo,\n branch: \"main\",\n });\n\n if (!branchInfo) {\n throw new Error(\"Could not get repository branch info\");\n }\n\n const project = await prisma.project.create({\n data: {\n name,\n description,\n type: ProjectType.PERSONAL,\n origin: ProjectOrigin.CREATED,\n ownerId: userId,\n organizationId: null,\n repositoryUrl,\n baseBranch: \"main\",\n },\n });\n\n return {\n success: true,\n projectId: project.id,\n };\n}\n","import Credentials from \"next-auth/providers/credentials\";\nimport { z } from \"@mtaap/core\";\nimport { prisma } from \"@mtaap/db\";\nimport { UserRole, ApiKeyPermission } from \"@mtaap/core\";\nimport { authenticateWithLdap, getOrganizationLdapConfig, findOrCreateLdapUser, } from \"./ldap\";\nconst THIRTY_DAYS_IN_SECONDS = 30 * 24 * 60 * 60;\nexport const authConfig = {\n providers: [\n Credentials({\n name: \"credentials\",\n credentials: {\n email: { label: \"Email\", type: \"email\" },\n password: { label: \"Password\", type: \"password\" },\n organizationSlug: { label: \"Organization\", type: \"text\" },\n },\n async authorize(credentials) {\n const parsed = z\n .object({\n email: z.string().email(),\n password: z.string().min(8),\n organizationSlug: z.string().optional(),\n })\n .safeParse(credentials);\n if (!parsed.success) {\n return null;\n }\n const { email, password, organizationSlug } = parsed.data;\n if (organizationSlug) {\n const ldapConfig = await getOrganizationLdapConfig(organizationSlug);\n if (ldapConfig?.enabled) {\n const ldapUser = await authenticateWithLdap(email, password, ldapConfig.organizationId);\n if (ldapUser) {\n const user = await findOrCreateLdapUser(ldapUser, ldapConfig.organizationId);\n return {\n id: user.id,\n email: user.email,\n name: user.name,\n role: UserRole.MEMBER,\n organizationId: ldapConfig.organizationId,\n };\n }\n return null;\n }\n }\n const whereClause = {};\n if (organizationSlug) {\n whereClause.organization = {\n slug: organizationSlug,\n };\n }\n const user = await prisma.user.findUnique({\n where: { email },\n include: {\n organizations: {\n where: whereClause,\n take: 1,\n },\n },\n });\n if (!user) {\n return null;\n }\n const bcrypt = await import(\"bcryptjs\");\n const isValid = await bcrypt.compare(password, user.passwordHash);\n if (!isValid) {\n return null;\n }\n const orgUser = user.organizations?.[0];\n // Use the per-organization role, defaulting to MEMBER if user has no org membership\n // Cast to UserRole from @mtaap/core (same values, different type)\n const role = orgUser ? orgUser.roleId : UserRole.MEMBER;\n return {\n id: user.id,\n email: user.email,\n name: user.name,\n role,\n organizationId: orgUser?.organizationId,\n };\n },\n }),\n ],\n session: {\n strategy: \"jwt\",\n maxAge: THIRTY_DAYS_IN_SECONDS,\n },\n pages: {\n signIn: \"/auth/signin\",\n error: \"/auth/error\",\n },\n callbacks: {\n async jwt({ token, user }) {\n if (user) {\n token.id = user.id;\n token.role = user.role;\n token.organizationId = user.organizationId;\n }\n return token;\n },\n async session({ session, token }) {\n if (token) {\n session.user = {\n ...session.user,\n id: token.id,\n role: token.role,\n organizationId: token.organizationId,\n };\n }\n return session;\n },\n },\n};\nexport async function hashPassword(password) {\n const bcrypt = await import(\"bcryptjs\");\n return bcrypt.hash(password, 10);\n}\nexport async function verifyPassword(password, hash) {\n const bcrypt = await import(\"bcryptjs\");\n return bcrypt.compare(password, hash);\n}\nexport async function validateApiKey(apiKey) {\n const keyHash = await hashApiKey(apiKey);\n const keyRecord = await prisma.apiKey.findFirst({\n where: {\n keyHash,\n revoked: false,\n },\n include: {\n user: {\n include: {\n organizations: {\n take: 1,\n include: {\n organization: true,\n },\n },\n },\n },\n },\n });\n if (!keyRecord || (keyRecord.expiresAt && keyRecord.expiresAt < new Date())) {\n return null;\n }\n await prisma.apiKey.update({\n where: { id: keyRecord.id },\n data: { lastUsedAt: new Date() },\n });\n const orgUser = keyRecord.user.organizations?.[0];\n return {\n user: keyRecord.user,\n organization: orgUser?.organization,\n apiKey: keyRecord,\n };\n}\nconst API_KEY_PERMISSION_RANK = {\n [ApiKeyPermission.READ]: 1,\n [ApiKeyPermission.WRITE]: 2,\n [ApiKeyPermission.ADMIN]: 3,\n};\nexport function checkApiKeyPermissions(apiKey, required) {\n const actual = apiKey.permissions ?? ApiKeyPermission.WRITE;\n return API_KEY_PERMISSION_RANK[actual] >= API_KEY_PERMISSION_RANK[required];\n}\nasync function hashApiKey(apiKey) {\n const crypto = await import(\"crypto\");\n return crypto.createHash(\"sha256\").update(apiKey).digest(\"hex\");\n}\nexport async function generateApiKey() {\n const crypto = await import(\"crypto\");\n return `usr_${crypto.randomBytes(32).toString(\"hex\")}`;\n}\nexport async function getCurrentUser() {\n const { cookies } = await import(\"next/headers\");\n const { decode } = await import(\"@auth/core/jwt\");\n const cookieStore = await cookies();\n const sessionToken = cookieStore.get(\"authjs.session-token\")?.value ||\n cookieStore.get(\"__Secure-authjs.session-token\")?.value;\n if (!sessionToken) {\n return null;\n }\n try {\n const secret = process.env.AUTH_SECRET || process.env.NEXTAUTH_SECRET;\n if (!secret) {\n console.error(\"AUTH_SECRET or NEXTAUTH_SECRET is not set\");\n return null;\n }\n const decoded = await decode({\n token: sessionToken,\n secret,\n salt: \"authjs.session-token\",\n });\n if (!decoded || !decoded.id) {\n return null;\n }\n return {\n id: decoded.id,\n email: decoded.email,\n name: decoded.name,\n role: decoded.role,\n organizationId: decoded.organizationId,\n };\n }\n catch (error) {\n console.error(\"Error decoding session token:\", error);\n return null;\n }\n}\nexport async function requireAuth() {\n const user = await getCurrentUser();\n if (!user) {\n throw new Error(\"Unauthorized\");\n }\n return user;\n}\n/**\n * @deprecated For organization-scoped operations, use requireOrganizationAdminRole() instead.\n * This function checks the session's global role which is set from the user's first organization\n * at login time and may not reflect their actual role in the current organization context.\n * Only use this for truly global/system-level admin operations.\n */\nexport async function requireAdmin() {\n const user = await getCurrentUser();\n if (!user) {\n const error = new Error(\"Unauthorized\");\n error.status = 401;\n throw error;\n }\n if (user.role !== UserRole.ADMIN) {\n const { logAuditEvent } = await import(\"./audit\");\n const { EventType } = await import(\"@mtaap/core\");\n await logAuditEvent({\n userId: user.id,\n organizationId: user.organizationId,\n eventType: EventType.AUTHORIZATION,\n eventDetails: {\n violation: \"ADMIN role required\",\n userRole: user.role,\n },\n });\n const error = new Error(\"You don't have permission to perform this action\");\n error.status = 403;\n throw error;\n }\n return user;\n}\n/**\n * @deprecated For organization-scoped operations, check OrganizationUser.roleId instead.\n * This function checks the session's global role which is set from the user's first organization\n * at login time and may not reflect their actual role in the current organization context.\n * Only use this for truly global/system-level member operations.\n */\nexport async function requireMember() {\n const user = await getCurrentUser();\n if (!user) {\n const error = new Error(\"Unauthorized\");\n error.status = 401;\n throw error;\n }\n if (user.role !== UserRole.MEMBER && user.role !== UserRole.ADMIN) {\n const { logAuditEvent } = await import(\"./audit\");\n const { EventType } = await import(\"@mtaap/core\");\n await logAuditEvent({\n userId: user.id,\n organizationId: user.organizationId,\n eventType: EventType.AUTHORIZATION,\n eventDetails: {\n violation: \"MEMBER or ADMIN role required\",\n userRole: user.role,\n },\n });\n const error = new Error(\"You don't have permission to perform this action\");\n error.status = 403;\n throw error;\n }\n return user;\n}\n/**\n * Check if user has access to a project based on tags (team projects)\n * or ownership/collaboration (personal projects)\n */\nexport async function checkProjectAccess(projectId, userId) {\n const project = await prisma.project.findUnique({\n where: { id: projectId },\n include: {\n collaborators: {\n where: { userId },\n },\n projectTags: {\n include: { tag: true },\n },\n },\n });\n if (!project) {\n return { hasAccess: false, reason: \"Project not found\" };\n }\n // Personal projects: check owner or collaborator\n if (project.type === \"PERSONAL\") {\n const isOwner = project.ownerId === userId;\n const isCollaborator = project.collaborators.length > 0;\n if (isOwner || isCollaborator) {\n return { hasAccess: true };\n }\n return {\n hasAccess: false,\n reason: \"You do not have permission to access this project\",\n };\n }\n // Team projects: check tag-based access\n if (!project.organizationId) {\n return { hasAccess: false, reason: \"Project has no organization\" };\n }\n // Check if user is in the org\n const membership = await prisma.organizationUser.findFirst({\n where: {\n userId,\n organizationId: project.organizationId,\n },\n });\n if (!membership) {\n return {\n hasAccess: false,\n reason: \"You are not a member of this organization\",\n };\n }\n // Check tag access (OR logic - any matching tag grants access)\n const userTags = await prisma.userTag.findMany({\n where: { userId },\n include: { tag: true },\n });\n const userTagIds = new Set(userTags.map((ut) => ut.tagId));\n const projectTagIds = project.projectTags.map((pt) => pt.tag.id);\n // If project has no tags, all org members can access\n if (projectTagIds.length === 0) {\n return { hasAccess: true };\n }\n const hasMatchingTag = projectTagIds.some((tagId) => userTagIds.has(tagId));\n if (hasMatchingTag) {\n return { hasAccess: true };\n }\n return {\n hasAccess: false,\n reason: \"Your tags do not grant access to this project\",\n };\n}\n/**\n * Require project access or throw error\n */\nexport async function requireProjectAccess(projectId, userId) {\n const result = await checkProjectAccess(projectId, userId);\n if (!result.hasAccess) {\n const { logAuditEvent } = await import(\"./audit\");\n const { EventType } = await import(\"@mtaap/core\");\n await logAuditEvent({\n userId,\n eventType: EventType.ACCESS,\n eventDetails: {\n resource: \"project\",\n resourceId: projectId,\n result: \"denied\",\n reason: result.reason,\n },\n });\n throw new Error(result.reason || \"Access denied\");\n }\n}\n/**\n * Get user's role in a specific organization\n * Returns the role from OrganizationUser, or null if not a member\n */\nexport async function getUserOrganizationRole(userId, organizationId) {\n const membership = await prisma.organizationUser.findUnique({\n where: {\n userId_organizationId: {\n userId,\n organizationId,\n },\n },\n });\n // Cast Prisma enum to @mtaap/core enum (same values)\n return membership ? membership.roleId : null;\n}\n/**\n * Get all organizations a user belongs to with their roles\n */\nexport async function getUserOrganizations(userId) {\n const memberships = await prisma.organizationUser.findMany({\n where: { userId },\n include: {\n organization: {\n select: {\n id: true,\n name: true,\n slug: true,\n },\n },\n },\n });\n return memberships.map((m) => ({\n organizationId: m.organizationId,\n organizationName: m.organization.name,\n organizationSlug: m.organization.slug,\n // Cast Prisma enum to @mtaap/core enum (same values)\n role: m.roleId,\n }));\n}\n/**\n * Require admin role in a specific organization\n * This is the preferred method for organization-scoped admin checks\n */\nexport async function requireOrganizationAdminRole(userId, organizationId) {\n const role = await getUserOrganizationRole(userId, organizationId);\n if (role === null) {\n const { logAuditEvent } = await import(\"./audit\");\n const { EventType } = await import(\"@mtaap/core\");\n await logAuditEvent({\n userId,\n organizationId,\n eventType: EventType.AUTHORIZATION,\n eventDetails: {\n violation: \"Not a member of organization\",\n organizationId,\n },\n });\n const error = new Error(\"You are not a member of this organization\");\n error.status = 403;\n throw error;\n }\n if (role !== UserRole.ADMIN) {\n const { logAuditEvent } = await import(\"./audit\");\n const { EventType } = await import(\"@mtaap/core\");\n await logAuditEvent({\n userId,\n organizationId,\n eventType: EventType.AUTHORIZATION,\n eventDetails: {\n violation: \"ADMIN role required\",\n userRole: role,\n organizationId,\n },\n });\n const error = new Error(\"You don't have admin permission in this organization\");\n error.status = 403;\n throw error;\n }\n}\n","import { prisma } from \"@mtaap/db\";\nimport { UserRole } from \"@mtaap/core/constants\";\nexport async function authenticateWithLdap(email, password, organizationId) {\n const settings = await prisma.organizationSettings.findUnique({\n where: { organizationId },\n });\n if (!settings?.ldapEnabled || !settings.ldapUrl) {\n return null;\n }\n const config = {\n url: settings.ldapUrl,\n bindDN: settings.ldapBindDN || \"\",\n searchBase: settings.ldapSearchBase || \"\",\n };\n return performLdapAuth(email, password, config);\n}\nasync function performLdapAuth(email, password, config) {\n const ldapjs = await import(\"ldapjs\");\n return new Promise((resolve) => {\n const client = ldapjs.createClient({\n url: config.url,\n timeout: 5000,\n connectTimeout: 10000,\n });\n client.on(\"error\", (err) => {\n console.error(\"LDAP connection error:\", err.message);\n resolve(null);\n });\n const usernameAttr = \"mail\";\n const searchFilter = `(${usernameAttr}=${ldapEscape(email)})`;\n const searchOptions = {\n filter: searchFilter,\n scope: \"sub\",\n attributes: [\"dn\", \"mail\", \"cn\", \"displayName\", \"givenName\", \"sn\"],\n };\n if (config.bindDN) {\n client.bind(config.bindDN, \"\", (bindErr) => {\n if (bindErr) {\n console.error(\"LDAP service bind failed:\", bindErr.message);\n client.unbind();\n resolve(null);\n return;\n }\n searchAndBind(client, config.searchBase, searchOptions, password, resolve);\n });\n }\n else {\n searchAndBind(client, config.searchBase, searchOptions, password, resolve);\n }\n });\n}\nfunction searchAndBind(client, searchBase, searchOptions, password, resolve) {\n client.search(searchBase, searchOptions, (searchErr, searchRes) => {\n if (searchErr) {\n console.error(\"LDAP search error:\", searchErr.message);\n client.unbind();\n resolve(null);\n return;\n }\n let userEntry = null;\n searchRes.on(\"searchEntry\", (entry) => {\n const dn = entry.dn.toString();\n const attrs = entry.attributes;\n const mail = getAttrValue(attrs, \"mail\");\n const displayName = getAttrValue(attrs, \"displayName\");\n const cn = getAttrValue(attrs, \"cn\");\n const givenName = getAttrValue(attrs, \"givenName\");\n const sn = getAttrValue(attrs, \"sn\");\n const name = displayName ||\n cn ||\n [givenName, sn].filter(Boolean).join(\" \") ||\n mail;\n userEntry = {\n email: mail || \"\",\n name: name || \"\",\n dn,\n };\n });\n searchRes.on(\"error\", (err) => {\n console.error(\"LDAP search result error:\", err.message);\n client.unbind();\n resolve(null);\n });\n searchRes.on(\"end\", () => {\n if (!userEntry) {\n client.unbind();\n resolve(null);\n return;\n }\n const userDn = userEntry.dn;\n const foundUser = userEntry;\n client.bind(userDn, password, (authErr) => {\n client.unbind();\n if (authErr) {\n console.error(\"LDAP user bind failed:\", authErr.message);\n resolve(null);\n return;\n }\n resolve(foundUser);\n });\n });\n });\n}\nfunction getAttrValue(attrs, name) {\n const attr = attrs.find((a) => a.type.toLowerCase() === name.toLowerCase());\n if (!attr || !attr.values || attr.values.length === 0) {\n return undefined;\n }\n const val = attr.values[0];\n if (typeof val === \"string\")\n return val;\n if (val && typeof val === \"object\" && \"toString\" in val) {\n return val.toString();\n }\n return undefined;\n}\nfunction ldapEscape(str) {\n return str.replace(/[\\\\*()]/g, (char) => `\\\\${char.charCodeAt(0).toString(16)}`);\n}\nexport async function getOrganizationLdapConfig(organizationSlug) {\n const org = await prisma.organization.findUnique({\n where: { slug: organizationSlug },\n include: { settings: true },\n });\n if (!org) {\n return null;\n }\n return {\n enabled: org.settings?.ldapEnabled ?? false,\n organizationId: org.id,\n };\n}\nexport async function findOrCreateLdapUser(ldapUser, organizationId) {\n let user = await prisma.user.findUnique({\n where: { email: ldapUser.email },\n });\n if (!user) {\n const crypto = await import(\"crypto\");\n const randomPassword = crypto.randomBytes(32).toString(\"hex\");\n const bcrypt = await import(\"bcryptjs\");\n const passwordHash = await bcrypt.hash(randomPassword, 10);\n user = await prisma.user.create({\n data: {\n email: ldapUser.email,\n name: ldapUser.name,\n passwordHash,\n role: UserRole.MEMBER,\n },\n });\n }\n const membership = await prisma.organizationUser.findFirst({\n where: {\n userId: user.id,\n organizationId,\n },\n });\n if (!membership) {\n const subscription = await prisma.subscription.findUnique({\n where: { organizationId },\n });\n if (subscription && subscription.seats > 0) {\n const currentSeats = await prisma.organizationUser.count({\n where: { organizationId },\n });\n if (currentSeats >= subscription.seats) {\n throw new Error(\"No available seats in organization subscription\");\n }\n }\n await prisma.organizationUser.create({\n data: {\n userId: user.id,\n organizationId,\n roleId: UserRole.MEMBER,\n },\n });\n }\n return {\n id: user.id,\n email: user.email,\n name: user.name,\n };\n}\n","import { TaskState } from \"@mtaap/core\";\nconst VALID_TRANSITIONS = {\n [TaskState.BACKLOG]: [TaskState.READY],\n [TaskState.READY]: [TaskState.IN_PROGRESS],\n [TaskState.IN_PROGRESS]: [TaskState.REVIEW],\n [TaskState.REVIEW]: [TaskState.DONE, TaskState.IN_PROGRESS],\n [TaskState.DONE]: [],\n};\nexport function isValidStateTransition(from, to) {\n if (from === to) {\n return true;\n }\n const validStates = VALID_TRANSITIONS[from];\n return validStates.includes(to);\n}\nexport function getValidNextStates(currentState) {\n return VALID_TRANSITIONS[currentState] || [];\n}\nexport class InvalidStateTransitionError extends Error {\n constructor(from, to) {\n super(`Invalid state transition: ${from} -> ${to}`);\n this.name = \"InvalidStateTransitionError\";\n }\n}\n","export const VERSION = \"0.1.2\" as const;\n\nexport type Version = typeof VERSION;\n","import { Octokit } from \"octokit\";\nexport class GitHubProvider {\n octokit;\n constructor(token) {\n this.octokit = new Octokit({ auth: token });\n }\n async createBranch(options) {\n try {\n const { data: ref } = await this.octokit.rest.git.getRef({\n owner: options.owner,\n repo: options.repo,\n ref: `heads/${options.sourceBranch}`,\n });\n await this.octokit.rest.git.createRef({\n owner: options.owner,\n repo: options.repo,\n ref: `refs/heads/${options.newBranch}`,\n sha: ref.object.sha,\n });\n return {\n success: true,\n branchName: options.newBranch,\n };\n }\n catch (error) {\n return {\n success: false,\n branchName: options.newBranch,\n error: error.message || \"Failed to create branch\",\n };\n }\n }\n async createPR(options) {\n try {\n const { data: pr } = await this.octokit.rest.pulls.create({\n owner: options.owner,\n repo: options.repo,\n title: options.title,\n body: options.body,\n head: options.head,\n base: options.base,\n });\n return {\n success: true,\n prUrl: pr.html_url,\n prNumber: pr.number,\n };\n }\n catch (error) {\n return {\n success: false,\n prUrl: \"\",\n prNumber: 0,\n error: error.message || \"Failed to create pull request\",\n };\n }\n }\n async getBranchInfo(options) {\n try {\n const { data: ref } = await this.octokit.rest.git.getRef({\n owner: options.owner,\n repo: options.repo,\n ref: `heads/${options.branch}`,\n });\n return ref.object.sha;\n }\n catch {\n return null;\n }\n }\n async listBranches(owner, repo) {\n try {\n const { data: branches } = await this.octokit.rest.repos.listBranches({\n owner,\n repo,\n per_page: 100,\n });\n return branches.map((branch) => ({\n name: branch.name,\n commitSha: branch.commit.sha,\n protected: branch.protected,\n }));\n }\n catch (error) {\n console.error(\"Failed to list branches:\", error);\n return [];\n }\n }\n async setupWebhook(options) {\n try {\n const { data: webhook } = await this.octokit.rest.repos.createWebhook({\n owner: options.owner,\n repo: options.repo,\n name: \"web\",\n config: {\n url: options.url,\n content_type: \"json\",\n secret: options.secret,\n },\n events: options.events || [\"push\", \"pull_request\"],\n active: true,\n });\n return {\n success: true,\n webhookId: webhook.id,\n };\n }\n catch (error) {\n return {\n success: false,\n webhookId: 0,\n error: error.message || \"Failed to setup webhook\",\n };\n }\n }\n async getPRInfo(prNumber, owner, repo) {\n try {\n const { data: pr } = await this.octokit.rest.pulls.get({\n owner,\n repo,\n pull_number: prNumber,\n });\n return {\n number: pr.number,\n title: pr.title,\n state: pr.state,\n htmlUrl: pr.html_url,\n mergedAt: pr.merged_at ? new Date(pr.merged_at) : undefined,\n user: pr.user\n ? {\n login: pr.user.login,\n }\n : undefined,\n };\n }\n catch {\n return null;\n }\n }\n async getRecentCommits(owner, repo, branch, limit = 10) {\n try {\n const { data: commits } = await this.octokit.rest.repos.listCommits({\n owner,\n repo,\n sha: branch,\n per_page: limit,\n });\n return commits.map((commit) => ({\n sha: commit.sha,\n message: commit.commit.message,\n author: commit.commit.author?.name && commit.commit.author?.email\n ? {\n name: commit.commit.author.name,\n email: commit.commit.author.email,\n }\n : undefined,\n date: new Date(commit.commit.author?.date || Date.now()),\n }));\n }\n catch {\n return [];\n }\n }\n async deleteBranch(owner, repo, branch) {\n try {\n await this.octokit.rest.git.deleteRef({\n owner,\n repo,\n ref: `heads/${branch}`,\n });\n return true;\n }\n catch (error) {\n console.error(`Failed to delete branch ${branch}:`, error.message);\n return false;\n }\n }\n async getRepositoryReadme(owner, repo) {\n try {\n const { data } = await this.octokit.rest.repos.getReadme({\n owner,\n repo,\n mediaType: {\n format: \"raw\",\n },\n });\n // When using raw format, data is returned as string\n return data;\n }\n catch {\n // 404 means no README exists\n return null;\n }\n }\n async getRepositoryPackageJson(owner, repo) {\n try {\n const { data } = await this.octokit.rest.repos.getContent({\n owner,\n repo,\n path: \"package.json\",\n });\n // getContent returns different shapes depending on path\n if (\"content\" in data && data.type === \"file\") {\n // Content is base64 encoded\n return Buffer.from(data.content, \"base64\").toString(\"utf-8\");\n }\n return null;\n }\n catch {\n // 404 means no package.json exists\n return null;\n }\n }\n static parseRepositoryUrl(url) {\n try {\n const match = url.match(/github\\.com[/:]([^/]+)\\/([^/.]+)/);\n if (!match || match.length < 3) {\n return null;\n }\n return {\n owner: match[1],\n repo: match[2].replace(/\\.git$/, \"\"),\n };\n }\n catch {\n return null;\n }\n }\n static async verifyWebhookSignature(payload, signature, secret) {\n const crypto = await import(\"crypto\");\n const expectedSignature = crypto\n .createHmac(\"sha256\", secret)\n .update(payload)\n .digest(\"hex\");\n const parts = signature.split(\"=\");\n if (parts.length < 2) {\n return false;\n }\n const receivedSignature = parts[1];\n return crypto.timingSafeEqual(Buffer.from(receivedSignature), Buffer.from(expectedSignature));\n }\n async verifyRepositoryAccess(owner, repo) {\n try {\n await this.octokit.rest.repos.get({\n owner,\n repo,\n });\n return { success: true };\n }\n catch (error) {\n if (error.status === 404) {\n return {\n success: false,\n error: \"Repository not found or you don't have access\",\n };\n }\n if (error.status === 401 || error.status === 403) {\n return {\n success: false,\n error: \"Authentication failed. Check your GitHub token permissions\",\n };\n }\n return {\n success: false,\n error: error.message || \"Failed to verify repository access\",\n };\n }\n }\n}\n","/**\n * Git error types for categorizing different failure scenarios\n */\nexport var GitErrorType;\n(function (GitErrorType) {\n GitErrorType[\"BRANCH_NOT_FOUND\"] = \"BRANCH_NOT_FOUND\";\n GitErrorType[\"BRANCH_EXISTS\"] = \"BRANCH_EXISTS\";\n GitErrorType[\"AUTH_INVALID\"] = \"AUTH_INVALID\";\n GitErrorType[\"REPOSITORY_NOT_FOUND\"] = \"REPOSITORY_NOT_FOUND\";\n GitErrorType[\"RATE_LIMITED\"] = \"RATE_LIMITED\";\n GitErrorType[\"NETWORK_ERROR\"] = \"NETWORK_ERROR\";\n GitErrorType[\"PERMISSION_DENIED\"] = \"PERMISSION_DENIED\";\n GitErrorType[\"UNKNOWN_ERROR\"] = \"UNKNOWN_ERROR\";\n})(GitErrorType || (GitErrorType = {}));\n/**\n * Custom error class for Git operations\n */\nexport class GitError extends Error {\n type;\n statusCode;\n retryAfter;\n constructor(type, message, statusCode, retryAfter) {\n super(message);\n this.name = \"GitError\";\n this.type = type;\n this.statusCode = statusCode;\n this.retryAfter = retryAfter;\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, GitError);\n }\n }\n /**\n * Create GitError from Octokit error response\n */\n static fromOctokitError(error) {\n const status = error.status;\n const message = error.message || \"Unknown error\";\n if (status === 429) {\n const retryAfter = error.response?.headers?.[\"retry-after\"] != null\n ? parseInt(error.response.headers[\"retry-after\"], 10)\n : undefined;\n return new GitError(GitErrorType.RATE_LIMITED, retryAfter\n ? `Rate limit exceeded, retry after ${retryAfter}s`\n : \"Rate limit exceeded\", status, retryAfter);\n }\n if (status === 401) {\n return new GitError(GitErrorType.AUTH_INVALID, \"Invalid authentication token\", status);\n }\n if (status === 403) {\n return new GitError(GitErrorType.PERMISSION_DENIED, \"Permission denied - insufficient access\", status);\n }\n if (status === 404) {\n if (message.toLowerCase().includes(\"branch\")) {\n return new GitError(GitErrorType.BRANCH_NOT_FOUND, message, status);\n }\n return new GitError(GitErrorType.REPOSITORY_NOT_FOUND, message, status);\n }\n if (status === 409 ||\n (status === 422 && message.toLowerCase().includes(\"already exists\"))) {\n return new GitError(GitErrorType.BRANCH_EXISTS, message, status);\n }\n if (!status ||\n error.code === \"ENOTFOUND\" ||\n error.code === \"ECONNREFUSED\" ||\n error.code === \"ETIMEDOUT\") {\n return new GitError(GitErrorType.NETWORK_ERROR, \"Network error: \" + (error.code || message), status);\n }\n return new GitError(GitErrorType.UNKNOWN_ERROR, message, status);\n }\n /**\n * Check if error is retryable\n */\n isRetryable() {\n return (this.type === GitErrorType.RATE_LIMITED ||\n this.type === GitErrorType.NETWORK_ERROR);\n }\n /**\n * Get user-friendly error message\n */\n toUserMessage() {\n switch (this.type) {\n case GitErrorType.BRANCH_NOT_FOUND:\n return \"Branch not found\";\n case GitErrorType.BRANCH_EXISTS:\n return \"Branch already exists\";\n case GitErrorType.AUTH_INVALID:\n return \"Authentication failed - check your GitHub token\";\n case GitErrorType.REPOSITORY_NOT_FOUND:\n return \"Repository not found or you don't have access\";\n case GitErrorType.RATE_LIMITED:\n return this.retryAfter\n ? `Rate limit exceeded - retry after ${this.retryAfter} seconds`\n : \"Rate limit exceeded - please try again later\";\n case GitErrorType.NETWORK_ERROR:\n return \"Network error - check your connection\";\n case GitErrorType.PERMISSION_DENIED:\n return \"Permission denied - insufficient repository access\";\n default:\n return this.message || \"An unknown error occurred\";\n }\n }\n}\n","import { ApiKeyPermission } from \"@mtaap/core\";\nimport { checkApiKeyPermissions } from \"@mtaap/auth\";\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\";\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"],"mappings":"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","names":["user","GitErrorType"]}