@mgsoftwarebv/mcp-server-bridge 3.0.1 → 3.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/db.ts","../src/storage.ts","../src/index.ts"],"names":["sql","or","eq","and","args"],"mappings":"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","file":"index.js","sourcesContent":["/**\r\n * Drizzle DB singleton + access-control helpers for the MCP bridge.\r\n *\r\n * The bridge runs as a long-lived stdio process started by Cursor/Claude\r\n * Desktop. We open ONE connection pool for the lifetime of the process\r\n * (no per-request `disconnect()`); the OS reclaims it on shutdown.\r\n *\r\n * NOTE for customers: set `DATABASE_PRIMARY_POOLER_URL` (or pass\r\n * `--database-url=...`) before starting the bridge. There is no longer\r\n * a safe public default — these are real Postgres credentials.\r\n */\r\n\r\nimport { createJobDb } from \"@refront/db/job-client\";\r\nimport * as schema from \"@refront/db/schema\";\r\nimport { and, eq, or, sql } from \"drizzle-orm\";\r\n\r\ntype JobClient = ReturnType<typeof createJobDb>;\r\ntype JobDb = JobClient[\"db\"];\r\n\r\nlet _client: JobClient | null = null;\r\n\r\nfunction getClient(): JobClient {\r\n if (!_client) {\r\n if (!process.env.DATABASE_PRIMARY_POOLER_URL) {\r\n throw new Error(\r\n \"DATABASE_PRIMARY_POOLER_URL is not set. Pass --database-url=... or export the env var before starting the MCP bridge.\",\r\n );\r\n }\r\n _client = createJobDb();\r\n }\r\n return _client;\r\n}\r\n\r\n/** Drizzle DB handle. Lazy because env validation needs to happen after CLI parsing. */\r\nexport const db: JobDb = new Proxy({} as JobDb, {\r\n get(_target, prop) {\r\n const real = getClient().db;\r\n const value = Reflect.get(real, prop, real);\r\n return typeof value === \"function\" ? value.bind(real) : value;\r\n },\r\n});\r\n\r\nexport { schema };\r\n\r\n/**\r\n * Returns the team's own ID plus IDs of all direct child teams.\r\n * Mirrors the previous PostgREST `or(id.eq.X, parent_team_id.eq.X)` query.\r\n */\r\nexport async function getAccessibleTeamIds(teamId: string): Promise<string[]> {\r\n const rows = await db\r\n .select({ id: schema.teams.id })\r\n .from(schema.teams)\r\n .where(\r\n or(eq(schema.teams.id, teamId), eq(schema.teams.parentTeamId, teamId)),\r\n );\r\n\r\n const ids = rows.map((r) => r.id);\r\n return ids.length > 0 ? ids : [teamId];\r\n}\r\n\r\n/**\r\n * Calls the `public.get_accessible_project_ids(user_id, team_id)` SQL\r\n * function. The function encodes the full RLS-style access logic\r\n * (owners + members + shared customer projects) and returns one\r\n * column `project_id`.\r\n */\r\nexport async function getAccessibleProjectIds(\r\n userId: string,\r\n teamId: string,\r\n): Promise<string[]> {\r\n try {\r\n const rows = (await db.execute(\r\n sql`SELECT project_id FROM get_accessible_project_ids(${userId}::uuid, ${teamId}::uuid)`,\r\n )) as unknown as Array<{ project_id: string }>;\r\n return rows.map((r) => r.project_id).filter(Boolean);\r\n } catch (error) {\r\n console.error(\"❌ Error getting accessible project IDs:\", error);\r\n return [];\r\n }\r\n}\r\n\r\n/**\r\n * Returns IDs of customers the team can see: customers it owns\r\n * (across its own team + child teams) plus customers explicitly\r\n * shared via `customer_shared_teams`.\r\n */\r\nexport async function getAccessibleCustomerIds(\r\n teamId: string,\r\n): Promise<string[]> {\r\n const teamIds = await getAccessibleTeamIds(teamId);\r\n\r\n const ownCustomers = await db\r\n .select({ id: schema.customers.id })\r\n .from(schema.customers)\r\n .where(\r\n teamIds.length === 1\r\n ? eq(schema.customers.teamId, teamIds[0]!)\r\n : sql`${schema.customers.teamId} = ANY(${teamIds}::uuid[])`,\r\n );\r\n\r\n const sharedCustomers = await db\r\n .select({ customerId: schema.customerSharedTeams.customerId })\r\n .from(schema.customerSharedTeams)\r\n .where(eq(schema.customerSharedTeams.teamId, teamId));\r\n\r\n return [\r\n ...new Set([\r\n ...ownCustomers.map((c) => c.id),\r\n ...sharedCustomers.map((c) => c.customerId),\r\n ]),\r\n ];\r\n}\r\n\r\n/**\r\n * Resolves a short `ai-sess-xxxxxxxx` prefix to the full `ai_sessions.id`\r\n * UUID, restricted to teams the caller can see. Returns null if no\r\n * matching session exists.\r\n *\r\n * Legacy MCP tools accept readable IDs (first 8 chars of the UUID);\r\n * we keep that contract by doing the prefix match in SQL via\r\n * `id::text LIKE 'xxxxxxxx%'`.\r\n */\r\nexport async function resolveAiSessionId(\r\n prefix: string,\r\n teamIds: string[],\r\n): Promise<string | null> {\r\n if (teamIds.length === 0) return null;\r\n const rows = await db\r\n .select({ id: schema.aiSessions.id })\r\n .from(schema.aiSessions)\r\n .where(\r\n and(\r\n teamIds.length === 1\r\n ? eq(schema.aiSessions.teamId, teamIds[0]!)\r\n : sql`${schema.aiSessions.teamId} = ANY(${teamIds}::uuid[])`,\r\n sql`${schema.aiSessions.id}::text LIKE ${`${prefix}%`}`,\r\n ),\r\n )\r\n .limit(1);\r\n return rows[0]?.id ?? null;\r\n}\r\n","import { createStorageClient, type StorageClient } from \"@refront/storage\";\r\n\r\n/**\r\n * Singleton R2 storage client for the MCP bridge process.\r\n *\r\n * Replaces the previous storage RPC calls. Lazy-instantiated through a\r\n * Proxy so that a missing R2_* env var only crashes paths that\r\n * actually use storage instead of taking down the bridge on boot.\r\n */\r\nlet _storage: StorageClient | null = null;\r\n\r\nfunction buildClient(): StorageClient {\r\n const endpoint = process.env.R2_ENDPOINT;\r\n const accessKeyId = process.env.R2_ACCESS_KEY_ID;\r\n const secretAccessKey = process.env.R2_SECRET_ACCESS_KEY;\r\n\r\n if (!endpoint || !accessKeyId || !secretAccessKey) {\r\n throw new Error(\r\n \"R2 storage is not configured. Set R2_ENDPOINT, R2_ACCESS_KEY_ID, R2_SECRET_ACCESS_KEY.\",\r\n );\r\n }\r\n\r\n return createStorageClient({\r\n endpoint,\r\n accessKeyId,\r\n secretAccessKey,\r\n publicDomain: process.env.R2_PUBLIC_DOMAIN || undefined,\r\n publicBuckets: [\r\n \"vault\",\r\n \"avatars\",\r\n \"team-logos\",\r\n \"blog-images\",\r\n \"customer-assets\",\r\n ],\r\n });\r\n}\r\n\r\nexport const storage: StorageClient = new Proxy({} as StorageClient, {\r\n get(_target, prop) {\r\n if (!_storage) _storage = buildClient();\r\n return Reflect.get(_storage, prop, _storage);\r\n },\r\n});\r\n","#!/usr/bin/env node\n\n/**\n * Refront MCP bridge — stdio MCP server that exposes Refront tickets,\n * customers, projects, AI dev sessions and time tracking to AI editors\n * (Cursor, Claude Desktop, Windsurf, ...).\n *\n * This bridge now talks directly to the vanilla Postgres database via\n * Drizzle ORM (see `db.ts`). The previous PostgREST/JWT transport\n * has been removed; customers must export `DATABASE_PRIMARY_POOLER_URL`\n * (or pass `--database-url=...`) before starting the bridge.\n */\n\nimport { Server } from \"@modelcontextprotocol/sdk/server/index.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport {\n CallToolRequestSchema,\n ListResourcesRequestSchema,\n ListToolsRequestSchema,\n ReadResourceRequestSchema,\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport { Octokit } from \"@octokit/rest\";\nimport { createHash } from \"crypto\";\nimport { and, asc, desc, eq, ilike, inArray, or, sql } from \"drizzle-orm\";\nimport {\n db,\n getAccessibleCustomerIds,\n getAccessibleProjectIds,\n getAccessibleTeamIds,\n resolveAiSessionId,\n schema,\n} from \"./db.js\";\nimport { storage } from \"./storage.js\";\n\n// ---------------------------------------------------------------------------\n// CLI / env parsing\n// ---------------------------------------------------------------------------\n\nconst args = process.argv.slice(2);\n\nfunction readArg(name: string): string | undefined {\n const prefix = `--${name}=`;\n const hit = args.find((a) => a.startsWith(prefix));\n return hit ? hit.slice(prefix.length) : undefined;\n}\n\nconst apiKey = readArg(\"api-key\") ?? process.env.MG_TICKETS_API_KEY;\n\nconst databaseUrl =\n readArg(\"database-url\") ??\n process.env.DATABASE_PRIMARY_POOLER_URL ??\n process.env.DATABASE_URL;\n\nif (!apiKey) {\n console.error(\n \"❌ API key is required. Use --api-key=your_key or set MG_TICKETS_API_KEY environment variable\",\n );\n process.exit(1);\n}\n\nif (!databaseUrl) {\n console.error(\n \"❌ Database URL is required. Use --database-url=postgresql://... or set DATABASE_PRIMARY_POOLER_URL (or DATABASE_URL) environment variable.\",\n );\n process.exit(1);\n}\n\n// Job DB client reads DATABASE_PRIMARY_POOLER_URL — normalize whichever\n// variable the user provided so both work.\nprocess.env.DATABASE_PRIMARY_POOLER_URL = databaseUrl;\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ninterface AuthContext {\n userId: string;\n teamId: string;\n scopes: string[];\n}\n\ntype ToolArgs = Record<string, unknown> | undefined;\n\ninterface GetTicketsArgs {\n status?: string;\n priority?: string;\n projectId?: string;\n customerId?: string;\n q?: string;\n pageSize?: number;\n}\n\ninterface GetTicketByIdArgs {\n id: string;\n}\n\ninterface CreateTicketArgs {\n title: string;\n description?: string;\n status?: string;\n priority?: string;\n type?: string;\n projectId?: string;\n customerId?: string;\n}\n\ninterface GetCustomersArgs {\n q?: string;\n pageSize?: number;\n}\n\ninterface CreateCustomerArgs {\n name: string;\n email?: string;\n website?: string;\n}\n\ninterface GetProjectsArgs {\n customerId?: string;\n q?: string;\n pageSize?: number;\n}\n\ninterface CreateProjectArgs {\n name: string;\n description?: string;\n customerId?: string;\n status?: string;\n}\n\ninterface StartAiSessionArgs {\n ticketId: string;\n ticketUrl?: string;\n cursorSessionId?: string;\n totalEstimatedMinutes: number;\n complexityScore?: number;\n}\n\ninterface TrackManualFollowUpArgs {\n aiSessionId: string;\n originalPrompt: string;\n aiResponse: string;\n developerFollowUp: string;\n followUpReason: string;\n outcome?: string;\n estimatedMinutes: number;\n workDescription: string;\n}\n\ninterface GetSessionContextArgs {\n aiSessionId: string;\n includeTicketData?: boolean;\n includeTodoProgress?: boolean;\n includeFollowUpHistory?: boolean;\n}\n\ninterface SessionTodoInput {\n todoId?: string;\n content: string;\n status: string;\n estimatedMinutes?: number;\n}\n\ninterface SyncSessionTodosArgs {\n aiSessionId: string;\n todos: SessionTodoInput[];\n replaceAll?: boolean;\n}\n\ninterface FollowUpTodoInput {\n content: string;\n status?: string;\n estimatedMinutes?: number;\n addedInFollowUp?: boolean;\n}\n\ninterface AddFollowUpTodosArgs {\n aiSessionId: string;\n newTodos: FollowUpTodoInput[];\n followUpReason?: string;\n}\n\ninterface UpdateSessionStatusArgs {\n aiSessionId: string;\n status: string;\n actualTimeMinutes?: number;\n completionNotes?: string;\n}\n\ninterface GetCompletionContextArgs {\n aiSessionId: string;\n includeFollowUps?: boolean;\n includeTimeMetrics?: boolean;\n includeTodos?: boolean;\n}\n\ninterface SaveCustomerResponseArgs {\n aiSessionId: string;\n customerResponse: string;\n responseType?: string;\n}\n\ninterface CompleteAiSessionArgs {\n aiSessionId: string;\n workCompleted: string[];\n technicalSummary?: string;\n invoiceDescription?: string;\n efficiencyNotes?: string;\n}\n\ninterface LogHoursArgs {\n projectId?: string;\n ticketId?: string;\n aiSessionId?: string;\n workDescription: string;\n estimatedHours: number;\n chatContextSummary?: string;\n}\n\ninterface GetGithubFileArgs {\n projectId: string;\n filePath: string;\n ref?: string;\n}\n\ninterface ListGithubDirectoryArgs {\n projectId: string;\n directoryPath: string;\n ref?: string;\n}\n\nfunction asToolArgs<T>(input: ToolArgs): T {\n return (input ?? {}) as T;\n}\n\n// ---------------------------------------------------------------------------\n// Misc helpers\n// ---------------------------------------------------------------------------\n\nfunction roundToNearest15Minutes(minutes: number): number {\n if (minutes <= 0) return 0;\n return Math.round(minutes / 15) * 15;\n}\n\nfunction isImageFile(mimeType: string): boolean {\n return (\n mimeType.startsWith(\"image/\") &&\n [\"image/jpeg\", \"image/jpg\", \"image/png\", \"image/gif\", \"image/webp\"].includes(\n mimeType,\n )\n );\n}\n\nasync function downloadImageAsBase64(\n storageKey: string,\n): Promise<string | null> {\n try {\n let signedUrl: string;\n try {\n const { url } = await storage.createSignedUrl({\n bucket: \"vault\",\n path: storageKey,\n expiresIn: 3600,\n });\n signedUrl = url;\n } catch (err) {\n console.error(`Failed to create signed URL for ${storageKey}:`, err);\n return null;\n }\n\n const response = await fetch(signedUrl);\n if (!response.ok) {\n console.error(\n `Failed to download file ${storageKey}: ${response.status}`,\n );\n return null;\n }\n\n const arrayBuffer = await response.arrayBuffer();\n return Buffer.from(arrayBuffer).toString(\"base64\");\n } catch (error) {\n console.error(`Error downloading image ${storageKey}:`, error);\n return null;\n }\n}\n\n/**\n * Build a Drizzle predicate that matches tickets visible to the caller:\n * own team(s), accessible projects, and shared customers.\n */\nfunction buildTicketAccessPredicate(\n teamIds: string[],\n projectIds: string[],\n customerIds: string[],\n) {\n const branches: ReturnType<typeof inArray>[] = [];\n if (teamIds.length > 0) branches.push(inArray(schema.tickets.teamId, teamIds));\n if (projectIds.length > 0)\n branches.push(inArray(schema.tickets.projectId, projectIds));\n if (customerIds.length > 0)\n branches.push(inArray(schema.tickets.customerId, customerIds));\n if (branches.length === 0) return sql`false`;\n if (branches.length === 1) return branches[0]!;\n return or(...branches)!;\n}\n\n// ---------------------------------------------------------------------------\n// API key validation\n// ---------------------------------------------------------------------------\n\nasync function validateApiKey(key: string): Promise<AuthContext | null> {\n if (!key.startsWith(\"mid_\") || key.length !== 68) {\n console.error(\"🔑 Invalid API key format\");\n return null;\n }\n\n try {\n const keyHash = createHash(\"sha256\").update(key).digest(\"hex\");\n console.error(`🔍 Validating API key hash: ${keyHash.substring(0, 16)}...`);\n\n const [apiKeyData] = await db\n .select({\n id: schema.apiKeys.id,\n userId: schema.apiKeys.userId,\n teamId: schema.apiKeys.teamId,\n scopes: schema.apiKeys.scopes,\n lastUsedAt: schema.apiKeys.lastUsedAt,\n })\n .from(schema.apiKeys)\n .where(eq(schema.apiKeys.keyHash, keyHash))\n .limit(1);\n\n if (!apiKeyData) {\n console.error(\"❌ API key not found or invalid\");\n return null;\n }\n\n await db\n .update(schema.apiKeys)\n .set({ lastUsedAt: new Date().toISOString() })\n .where(eq(schema.apiKeys.id, apiKeyData.id));\n\n console.error(\n `✅ API key validated for user ${apiKeyData.userId} in team ${apiKeyData.teamId}`,\n );\n\n return {\n userId: apiKeyData.userId,\n teamId: apiKeyData.teamId,\n scopes: apiKeyData.scopes ?? [],\n };\n } catch (error) {\n console.error(\"💥 API key validation error:\", error);\n return null;\n }\n}\n\nlet authContext: AuthContext | null = null;\n\n// ---------------------------------------------------------------------------\n// GitHub helpers\n// ---------------------------------------------------------------------------\n\nasync function getGithubTokenForProject(\n projectId: string,\n teamId: string,\n): Promise<{\n token: string;\n repositoryFullName: string;\n owner: string;\n repo: string;\n} | null> {\n try {\n const [repoData] = await db\n .select({\n repositoryFullName: schema.projectGithubRepositories.repositoryFullName,\n })\n .from(schema.projectGithubRepositories)\n .where(\n and(\n eq(schema.projectGithubRepositories.projectId, projectId),\n eq(schema.projectGithubRepositories.teamId, teamId),\n ),\n )\n .limit(1);\n\n if (!repoData) {\n console.error(`No GitHub repository linked to project ${projectId}`);\n return null;\n }\n\n const [appData] = await db\n .select({ config: schema.apps.config })\n .from(schema.apps)\n .where(\n and(eq(schema.apps.teamId, teamId), eq(schema.apps.appId, \"github\")),\n )\n .limit(1);\n\n const accessToken = (appData?.config as { access_token?: string } | null)\n ?.access_token;\n if (!appData || !accessToken) {\n console.error(`GitHub app not connected for team ${teamId}`);\n return null;\n }\n\n const repositoryFullName = repoData.repositoryFullName;\n const [owner, repo] = repositoryFullName.split(\"/\");\n if (!owner || !repo) {\n console.error(`Invalid repository full name: ${repositoryFullName}`);\n return null;\n }\n\n return { token: accessToken, repositoryFullName, owner, repo };\n } catch (error) {\n console.error(\"Error getting GitHub token for project:\", error);\n return null;\n }\n}\n\n// ---------------------------------------------------------------------------\n// AI session phase transitions\n// ---------------------------------------------------------------------------\n\n/**\n * Auto-advance an AI session through the canonical phase order\n * (analysis → bug_investigation → development → communication),\n * skipping any phase with 0 estimated minutes.\n */\nasync function transitionToNextPhase(\n sessionId: string,\n currentPhase?: string,\n): Promise<void> {\n try {\n const now = new Date();\n const phaseOrder = [\n \"analysis\",\n \"bug_investigation\",\n \"development\",\n \"communication\",\n ];\n\n const allPhases = await db\n .select()\n .from(schema.aiTimeLogs)\n .where(eq(schema.aiTimeLogs.aiSessionId, sessionId))\n .orderBy(asc(schema.aiTimeLogs.activityType));\n\n let currentPhaseType = currentPhase;\n if (!currentPhaseType) {\n const activePhase = allPhases.find((p) => p.status === \"in_progress\");\n currentPhaseType = activePhase?.activityType ?? undefined;\n }\n\n if (!currentPhaseType) {\n const analysisPhase = allPhases.find(\n (p) => p.activityType === \"analysis\",\n );\n if (\n analysisPhase &&\n analysisPhase.status === \"pending\" &&\n (analysisPhase.estimatedDurationSeconds ?? 0) > 0\n ) {\n await db\n .update(schema.aiTimeLogs)\n .set({ status: \"in_progress\", startedAt: now.toISOString() })\n .where(eq(schema.aiTimeLogs.id, analysisPhase.id));\n console.error(\"✅ Started analysis phase\");\n }\n return;\n }\n\n const currentPhaseRecord = allPhases.find(\n (p) =>\n p.activityType === currentPhaseType && p.status === \"in_progress\",\n );\n if (currentPhaseRecord) {\n const duration = Math.round(\n (now.getTime() -\n new Date(currentPhaseRecord.startedAt).getTime()) /\n 1000,\n );\n await db\n .update(schema.aiTimeLogs)\n .set({\n status: \"completed\",\n endedAt: now.toISOString(),\n durationSeconds: duration,\n })\n .where(eq(schema.aiTimeLogs.id, currentPhaseRecord.id));\n console.error(`✅ Completed phase: ${currentPhaseType} (${duration}s)`);\n }\n\n const currentIndex = phaseOrder.indexOf(currentPhaseType);\n if (currentIndex === -1 || currentIndex === phaseOrder.length - 1) {\n console.error(\"No next phase to transition to\");\n return;\n }\n\n for (let i = currentIndex + 1; i < phaseOrder.length; i++) {\n const nextPhaseType = phaseOrder[i];\n const nextPhase = allPhases.find(\n (p) => p.activityType === nextPhaseType,\n );\n if (!nextPhase) continue;\n\n if ((nextPhase.estimatedDurationSeconds ?? 0) === 0) {\n await db\n .update(schema.aiTimeLogs)\n .set({ status: \"skipped\" })\n .where(eq(schema.aiTimeLogs.id, nextPhase.id));\n console.error(\n `⏭️ Skipped phase: ${nextPhaseType} (0 minutes estimated)`,\n );\n continue;\n }\n\n if (nextPhase.status === \"pending\") {\n await db\n .update(schema.aiTimeLogs)\n .set({ status: \"in_progress\", startedAt: now.toISOString() })\n .where(eq(schema.aiTimeLogs.id, nextPhase.id));\n console.error(`✅ Started next phase: ${nextPhaseType}`);\n return;\n }\n }\n\n console.error(\"All remaining phases skipped or completed\");\n } catch (error) {\n console.error(\"Error transitioning to next phase:\", error);\n }\n}\n\n// ---------------------------------------------------------------------------\n// MCP Server setup\n// ---------------------------------------------------------------------------\n\nconst server = new Server(\n {\n name: \"mg-tickets-mcp-bridge\",\n version: \"3.0.0\",\n },\n {\n capabilities: {\n tools: {},\n resources: {},\n },\n },\n);\n\nconst TOOLS = [\n {\n name: \"get-tickets\",\n description:\n \"Get tickets with optional filtering by status, priority, project, customer, or search query\",\n inputSchema: {\n type: \"object\",\n properties: {\n status: {\n type: \"string\",\n enum: [\n \"open\",\n \"in_progress\",\n \"review\",\n \"resolved\",\n \"closed\",\n \"backlog\",\n ],\n },\n priority: {\n type: \"string\",\n enum: [\"low\", \"medium\", \"high\", \"critical\"],\n },\n projectId: { type: \"string\" },\n customerId: { type: \"string\" },\n q: {\n type: \"string\",\n description: \"Search query for ticket number, title, or description\",\n },\n pageSize: { type: \"number\", default: 20, maximum: 100 },\n },\n required: [],\n },\n },\n {\n name: \"get-ticket-by-id\",\n description:\n \"Get a specific ticket by its ID, including all attachments, comments, and images. Images from ticket attachments and comment attachments are automatically downloaded and returned as base64-encoded content that can be analyzed by AI.\",\n inputSchema: {\n type: \"object\",\n properties: {\n id: { type: \"string\", description: \"Ticket ID\" },\n },\n required: [\"id\"],\n },\n },\n {\n name: \"create-ticket\",\n description: \"Create a new ticket\",\n inputSchema: {\n type: \"object\",\n properties: {\n title: { type: \"string\", description: \"Ticket title\" },\n description: { type: \"string\" },\n status: {\n type: \"string\",\n enum: [\n \"open\",\n \"in_progress\",\n \"review\",\n \"resolved\",\n \"closed\",\n \"backlog\",\n ],\n default: \"open\",\n },\n priority: {\n type: \"string\",\n enum: [\"low\", \"medium\", \"high\", \"critical\"],\n default: \"medium\",\n },\n type: {\n type: \"string\",\n enum: [\n \"task\",\n \"bug\",\n \"feature\",\n \"support\",\n \"question\",\n \"improvement\",\n ],\n default: \"task\",\n },\n projectId: { type: \"string\" },\n customerId: { type: \"string\" },\n },\n required: [\"title\"],\n },\n },\n {\n name: \"get-customers\",\n description: \"Get customers with optional search\",\n inputSchema: {\n type: \"object\",\n properties: {\n q: {\n type: \"string\",\n description: \"Search query for customer name or email\",\n },\n pageSize: { type: \"number\", default: 20, maximum: 100 },\n },\n required: [],\n },\n },\n {\n name: \"create-customer\",\n description: \"Create a new customer\",\n inputSchema: {\n type: \"object\",\n properties: {\n name: { type: \"string\", description: \"Customer name\" },\n email: { type: \"string\" },\n website: { type: \"string\" },\n },\n required: [\"name\"],\n },\n },\n {\n name: \"get-projects\",\n description: \"Get projects with optional filtering\",\n inputSchema: {\n type: \"object\",\n properties: {\n customerId: { type: \"string\", description: \"Filter by customer ID\" },\n q: { type: \"string\", description: \"Search query for project name\" },\n pageSize: { type: \"number\", default: 20, maximum: 100 },\n },\n required: [],\n },\n },\n {\n name: \"create-project\",\n description: \"Create a new project\",\n inputSchema: {\n type: \"object\",\n properties: {\n name: { type: \"string\", description: \"Project name\" },\n description: { type: \"string\" },\n customerId: { type: \"string\" },\n status: {\n type: \"string\",\n enum: [\"active\", \"on_hold\", \"completed\", \"cancelled\"],\n default: \"active\",\n },\n },\n required: [\"name\"],\n },\n },\n {\n name: \"start-ai-session-smart\",\n description: \"Start a new AI development session with automatic tracking\",\n inputSchema: {\n type: \"object\",\n properties: {\n ticketId: { type: \"string\" },\n ticketUrl: { type: \"string\", description: \"URL to the ticket\" },\n cursorSessionId: {\n type: \"string\",\n description: \"Cursor session identifier\",\n },\n totalEstimatedMinutes: {\n type: \"number\",\n description:\n \"Total estimated time in minutes (senior dev WITHOUT AI, rounded to 15 min)\",\n },\n complexityScore: {\n type: \"number\",\n minimum: 1,\n maximum: 10,\n description: \"Estimated complexity from 1-10\",\n },\n },\n required: [\"ticketId\", \"totalEstimatedMinutes\"],\n },\n },\n {\n name: \"track-manual-follow-up\",\n description: \"Track manual follow-up prompt by developer\",\n inputSchema: {\n type: \"object\",\n properties: {\n aiSessionId: { type: \"string\" },\n originalPrompt: { type: \"string\" },\n aiResponse: { type: \"string\" },\n developerFollowUp: { type: \"string\" },\n followUpReason: {\n type: \"string\",\n enum: [\n \"incomplete_result\",\n \"wrong_approach\",\n \"needs_clarification\",\n \"error_in_code\",\n ],\n },\n outcome: {\n type: \"string\",\n enum: [\"success\", \"partial_success\", \"still_failed\"],\n default: \"success\",\n },\n estimatedMinutes: {\n type: \"number\",\n description:\n \"Estimated time needed for this follow-up work (think as senior dev WITHOUT AI, in minutes)\",\n },\n workDescription: {\n type: \"string\",\n description:\n \"Detailed work description generated by AI (2-3 sentences, summarizing all work done in session including follow-ups)\",\n },\n },\n required: [\n \"aiSessionId\",\n \"originalPrompt\",\n \"aiResponse\",\n \"developerFollowUp\",\n \"followUpReason\",\n \"estimatedMinutes\",\n \"workDescription\",\n ],\n },\n },\n {\n name: \"get-session-context\",\n description: \"Get current session context for follow-up continuity\",\n inputSchema: {\n type: \"object\",\n properties: {\n aiSessionId: { type: \"string\" },\n includeTicketData: { type: \"boolean\", default: true },\n includeTodoProgress: { type: \"boolean\", default: true },\n includeFollowUpHistory: { type: \"boolean\", default: false },\n },\n required: [\"aiSessionId\"],\n },\n },\n {\n name: \"sync-session-todos\",\n description:\n \"Synchronize todo list with AI session (replace existing) or add new todos\",\n inputSchema: {\n type: \"object\",\n properties: {\n aiSessionId: { type: \"string\" },\n todos: {\n type: \"array\",\n items: {\n type: \"object\",\n properties: {\n todoId: {\n type: \"string\",\n description: \"Optional external todo ID for tracking\",\n },\n content: { type: \"string\" },\n status: {\n type: \"string\",\n enum: [\"pending\", \"in_progress\", \"completed\", \"cancelled\"],\n },\n estimatedMinutes: { type: \"number\" },\n },\n required: [\"content\", \"status\"],\n },\n },\n replaceAll: {\n type: \"boolean\",\n default: true,\n description:\n \"If true, replace all existing todos. If false, add new todos to existing ones\",\n },\n },\n required: [\"aiSessionId\", \"todos\"],\n },\n },\n {\n name: \"add-follow-up-todos\",\n description:\n \"Add new todos from follow-up (without replacing existing ones)\",\n inputSchema: {\n type: \"object\",\n properties: {\n aiSessionId: { type: \"string\" },\n newTodos: {\n type: \"array\",\n items: {\n type: \"object\",\n properties: {\n content: { type: \"string\" },\n status: {\n type: \"string\",\n enum: [\"pending\", \"in_progress\"],\n default: \"pending\",\n },\n estimatedMinutes: { type: \"number\" },\n addedInFollowUp: { type: \"boolean\", default: true },\n },\n required: [\"content\"],\n },\n },\n followUpReason: {\n type: \"string\",\n description: \"Why were these todos added in follow-up\",\n },\n },\n required: [\"aiSessionId\", \"newTodos\"],\n },\n },\n {\n name: \"update-session-status\",\n description: \"Update AI session status and completion info\",\n inputSchema: {\n type: \"object\",\n properties: {\n aiSessionId: { type: \"string\" },\n status: {\n type: \"string\",\n enum: [\"started\", \"in_progress\", \"paused\", \"completed\", \"failed\"],\n },\n actualTimeMinutes: { type: \"number\" },\n completionNotes: { type: \"string\" },\n },\n required: [\"aiSessionId\", \"status\"],\n },\n },\n {\n name: \"get-completion-context\",\n description:\n \"Get all context needed for Cursor AI to generate customer response\",\n inputSchema: {\n type: \"object\",\n properties: {\n aiSessionId: { type: \"string\" },\n includeFollowUps: { type: \"boolean\", default: true },\n includeTimeMetrics: { type: \"boolean\", default: true },\n includeTodos: { type: \"boolean\", default: true },\n },\n required: [\"aiSessionId\"],\n },\n },\n {\n name: \"save-customer-response\",\n description: \"Save customer response generated by Cursor AI\",\n inputSchema: {\n type: \"object\",\n properties: {\n aiSessionId: { type: \"string\" },\n customerResponse: {\n type: \"string\",\n description: \"Customer response generated by Cursor AI\",\n },\n responseType: {\n type: \"string\",\n enum: [\"completion\", \"progress_update\", \"needs_clarification\"],\n default: \"completion\",\n },\n },\n required: [\"aiSessionId\", \"customerResponse\"],\n },\n },\n {\n name: \"complete-ai-session\",\n description:\n \"Complete AI session with work summary - time calculated automatically\",\n inputSchema: {\n type: \"object\",\n properties: {\n aiSessionId: { type: \"string\" },\n workCompleted: {\n type: \"array\",\n items: { type: \"string\" },\n description: \"List of completed tasks/todos in English\",\n },\n technicalSummary: {\n type: \"string\",\n description: \"Technical summary of work done in English\",\n },\n invoiceDescription: {\n type: \"string\",\n description:\n \"Short invoice-friendly description in the language of the ticket (2-3 sentences max, suitable for billing)\",\n },\n efficiencyNotes: { type: \"string\" },\n },\n required: [\"aiSessionId\", \"workCompleted\"],\n },\n },\n {\n name: \"log-hours\",\n description:\n \"Analyze current chat conversation and log hours as draft tracker entry. AI analyzes chat context to estimate hours as a senior developer would (without AI assistance). Cursor AI matches workspace name to correct project from list (optional).\",\n inputSchema: {\n type: \"object\",\n properties: {\n projectId: {\n type: \"string\",\n description:\n \"Project ID (UUID) - Optional. Cursor AI should call get-projects first to try matching workspace name. If no clear match, omit this field.\",\n },\n ticketId: {\n type: \"string\",\n description:\n \"Ticket ID (UUID) - Optional. Cursor AI should call get-tickets (filtered by project) to try matching chat context to an open ticket. Only include if a clear match is found.\",\n },\n aiSessionId: {\n type: \"string\",\n description:\n \"AI Session ID - Optional. If a ticket has an active AI dev session, include this ID to link the hours to that session.\",\n },\n workDescription: {\n type: \"string\",\n description:\n \"Short description of the work done (for the tracker entry)\",\n },\n estimatedHours: {\n type: \"number\",\n description:\n \"AI-estimated hours as senior developer would spend WITHOUT AI (e.g., 2.5 for 2.5 hours)\",\n },\n chatContextSummary: {\n type: \"string\",\n description:\n \"Brief summary of chat context for internal logging (optional)\",\n },\n },\n required: [\"workDescription\", \"estimatedHours\"],\n },\n },\n {\n name: \"get-github-file\",\n description:\n \"Get the contents of a specific file from a GitHub repository. Use this after finding relevant files to read their full content.\",\n inputSchema: {\n type: \"object\",\n properties: {\n projectId: { type: \"string\", description: \"Project ID (UUID)\" },\n filePath: {\n type: \"string\",\n description:\n 'Full path to the file in the repository (e.g., \"src/components/Button.tsx\")',\n },\n ref: {\n type: \"string\",\n description:\n \"Optional: Git reference (branch, tag, or commit SHA). Defaults to repository default branch.\",\n },\n },\n required: [\"projectId\", \"filePath\"],\n },\n },\n {\n name: \"list-github-directory\",\n description:\n \"List files and directories in a GitHub repository directory. Use this to explore repository structure.\",\n inputSchema: {\n type: \"object\",\n properties: {\n projectId: { type: \"string\", description: \"Project ID (UUID)\" },\n directoryPath: {\n type: \"string\",\n description:\n 'Path to directory (e.g., \"src/components\"). Use empty string or \"/\" for root directory.',\n },\n ref: {\n type: \"string\",\n description:\n \"Optional: Git reference (branch, tag, or commit SHA). Defaults to repository default branch.\",\n },\n },\n required: [\"projectId\", \"directoryPath\"],\n },\n },\n];\n\nconst RESOURCES = [\n {\n uri: \"tickets://recent\",\n name: \"Recent Tickets\",\n description: \"Most recently created tickets\",\n mimeType: \"application/json\",\n },\n {\n uri: \"customers://all\",\n name: \"All Customers\",\n description: \"Complete customer directory\",\n mimeType: \"application/json\",\n },\n {\n uri: \"projects://active\",\n name: \"Active Projects\",\n description: \"Currently active projects\",\n mimeType: \"application/json\",\n },\n];\n\nserver.setRequestHandler(ListToolsRequestSchema, async () => ({ tools: TOOLS }));\nserver.setRequestHandler(ListResourcesRequestSchema, async () => ({\n resources: RESOURCES,\n}));\n\n// ---------------------------------------------------------------------------\n// Tool dispatch\n// ---------------------------------------------------------------------------\n\nserver.setRequestHandler(CallToolRequestSchema, async (request) => {\n if (!authContext) {\n return {\n content: [\n {\n type: \"text\",\n text: \"Error: Not authenticated. API key validation failed.\",\n },\n ],\n };\n }\n\n const { name, arguments: args } = request.params;\n console.error(`🛠️ Executing tool: ${name} for team ${authContext.teamId}`);\n\n try {\n switch (name) {\n case \"get-tickets\":\n return await handleGetTickets(asToolArgs<GetTicketsArgs>(args));\n case \"get-ticket-by-id\":\n return await handleGetTicketById(asToolArgs<GetTicketByIdArgs>(args));\n case \"create-ticket\":\n return await handleCreateTicket(asToolArgs<CreateTicketArgs>(args));\n case \"get-customers\":\n return await handleGetCustomers(asToolArgs<GetCustomersArgs>(args));\n case \"create-customer\":\n return await handleCreateCustomer(asToolArgs<CreateCustomerArgs>(args));\n case \"get-projects\":\n return await handleGetProjects(asToolArgs<GetProjectsArgs>(args));\n case \"create-project\":\n return await handleCreateProject(asToolArgs<CreateProjectArgs>(args));\n case \"start-ai-session-smart\":\n return await handleStartAiSession(\n asToolArgs<StartAiSessionArgs>(args),\n );\n case \"track-manual-follow-up\":\n return await handleTrackManualFollowUp(\n asToolArgs<TrackManualFollowUpArgs>(args),\n );\n case \"get-session-context\":\n return await handleGetSessionContext(\n asToolArgs<GetSessionContextArgs>(args),\n );\n case \"sync-session-todos\":\n return await handleSyncSessionTodos(\n asToolArgs<SyncSessionTodosArgs>(args),\n );\n case \"add-follow-up-todos\":\n return await handleAddFollowUpTodos(\n asToolArgs<AddFollowUpTodosArgs>(args),\n );\n case \"update-session-status\":\n return await handleUpdateSessionStatus(\n asToolArgs<UpdateSessionStatusArgs>(args),\n );\n case \"get-completion-context\":\n return await handleGetCompletionContext(\n asToolArgs<GetCompletionContextArgs>(args),\n );\n case \"save-customer-response\":\n return await handleSaveCustomerResponse(\n asToolArgs<SaveCustomerResponseArgs>(args),\n );\n case \"complete-ai-session\":\n return await handleCompleteAiSession(\n asToolArgs<CompleteAiSessionArgs>(args),\n );\n case \"log-hours\":\n return await handleLogHours(asToolArgs<LogHoursArgs>(args));\n case \"get-github-file\":\n return await handleGetGithubFile(asToolArgs<GetGithubFileArgs>(args));\n case \"list-github-directory\":\n return await handleListGithubDirectory(\n asToolArgs<ListGithubDirectoryArgs>(args),\n );\n default:\n throw new Error(`Unknown tool: ${name}`);\n }\n } catch (error: unknown) {\n console.error(\"❌ Tool execution error:\", error);\n const message =\n error instanceof Error\n ? error.message\n : typeof error === \"string\"\n ? error\n : JSON.stringify(error);\n return {\n content: [{ type: \"text\", text: `Error executing ${name}: ${message}` }],\n };\n }\n});\n\n// ---------------------------------------------------------------------------\n// Tool handlers\n// ---------------------------------------------------------------------------\n\nasync function handleGetTickets(input: GetTicketsArgs) {\n const ctx = authContext!;\n const { status, priority, projectId, customerId, q, pageSize = 20 } = input;\n\n const teamIds = await getAccessibleTeamIds(ctx.teamId);\n const projectIds = await getAccessibleProjectIds(ctx.userId, ctx.teamId);\n const customerIds = await getAccessibleCustomerIds(ctx.teamId);\n\n const accessPredicate = buildTicketAccessPredicate(\n teamIds,\n projectIds,\n customerIds,\n );\n\n const filters = [accessPredicate, eq(schema.tickets.isDeleted, false)];\n if (status) filters.push(eq(schema.tickets.status, status as never));\n if (priority) filters.push(eq(schema.tickets.priority, priority as never));\n if (projectId) filters.push(eq(schema.tickets.projectId, projectId));\n if (customerId) filters.push(eq(schema.tickets.customerId, customerId));\n if (q) {\n const pattern = `%${q}%`;\n filters.push(\n or(\n ilike(schema.tickets.ticketNumber, pattern),\n ilike(schema.tickets.title, pattern),\n ilike(schema.tickets.description, pattern),\n )!,\n );\n }\n\n const rows = await db\n .select({\n id: schema.tickets.id,\n ticketNumber: schema.tickets.ticketNumber,\n title: schema.tickets.title,\n description: schema.tickets.description,\n status: schema.tickets.status,\n priority: schema.tickets.priority,\n type: schema.tickets.type,\n createdAt: schema.tickets.createdAt,\n projectId: schema.tickets.projectId,\n customerId: schema.tickets.customerId,\n projectName: schema.projects.name,\n customerName: schema.customers.name,\n })\n .from(schema.tickets)\n .leftJoin(schema.projects, eq(schema.projects.id, schema.tickets.projectId))\n .leftJoin(\n schema.customers,\n eq(schema.customers.id, schema.tickets.customerId),\n )\n .where(and(...filters))\n .orderBy(desc(schema.tickets.createdAt))\n .limit(Math.min(pageSize, 100));\n\n return {\n content: [\n {\n type: \"text\",\n text: `Found ${rows.length} tickets:\\n\\n${\n rows\n .map(\n (t) =>\n `**${t.ticketNumber}**: ${t.title}\\n` +\n `Status: ${t.status} | Priority: ${t.priority}\\n` +\n `${t.projectName ? `Project: ${t.projectName}\\n` : \"\"}` +\n `${t.customerName ? `Customer: ${t.customerName}\\n` : \"\"}` +\n `Created: ${new Date(t.createdAt).toLocaleDateString()}\\n`,\n )\n .join(\"\\n\") || \"No tickets found.\"\n }`,\n },\n ],\n };\n}\n\nasync function handleGetTicketById(input: GetTicketByIdArgs) {\n const ctx = authContext!;\n const { id } = input;\n\n const teamIds = await getAccessibleTeamIds(ctx.teamId);\n const projectIds = await getAccessibleProjectIds(ctx.userId, ctx.teamId);\n const customerIds = await getAccessibleCustomerIds(ctx.teamId);\n\n const ticketRow = await db.query.tickets.findFirst({\n where: eq(schema.tickets.id, id),\n with: {\n project: { columns: { id: true, name: true } },\n customer: { columns: { id: true, name: true } },\n assignee: { columns: { id: true, fullName: true, email: true } },\n requester: { columns: { id: true, fullName: true, email: true } },\n },\n });\n\n if (!ticketRow) {\n throw new Error(`Ticket not found: ${id}`);\n }\n\n let hasAccess = false;\n if (teamIds.includes(ticketRow.teamId)) hasAccess = true;\n if (\n !hasAccess &&\n ticketRow.projectId &&\n projectIds.includes(ticketRow.projectId)\n )\n hasAccess = true;\n if (\n !hasAccess &&\n ticketRow.customerId &&\n customerIds.includes(ticketRow.customerId)\n )\n hasAccess = true;\n if (!hasAccess) {\n throw new Error(\n \"Access denied: You do not have permission to view this ticket\",\n );\n }\n\n const attachments = await db\n .select({\n id: schema.ticketAttachments.id,\n fileName: schema.ticketAttachments.fileName,\n fileSize: schema.ticketAttachments.fileSize,\n mimeType: schema.ticketAttachments.mimeType,\n storageKey: schema.ticketAttachments.storageKey,\n createdAt: schema.ticketAttachments.createdAt,\n uploaderId: schema.ticketAttachments.userId,\n uploaderName: schema.users.fullName,\n })\n .from(schema.ticketAttachments)\n .leftJoin(\n schema.users,\n eq(schema.users.id, schema.ticketAttachments.userId),\n )\n .where(eq(schema.ticketAttachments.ticketId, id))\n .orderBy(asc(schema.ticketAttachments.createdAt));\n\n const comments = await db\n .select({\n id: schema.ticketComments.id,\n content: schema.ticketComments.content,\n createdAt: schema.ticketComments.createdAt,\n userId: schema.ticketComments.userId,\n })\n .from(schema.ticketComments)\n .where(eq(schema.ticketComments.ticketId, id))\n .orderBy(asc(schema.ticketComments.createdAt));\n\n const commentUserIds = [\n ...new Set(\n comments.map((c) => c.userId).filter((v): v is string => Boolean(v)),\n ),\n ];\n const commentUserMap = new Map<string, { id: string; fullName: string | null }>();\n if (commentUserIds.length > 0) {\n const commentUsers = await db\n .select({ id: schema.users.id, fullName: schema.users.fullName })\n .from(schema.users)\n .where(inArray(schema.users.id, commentUserIds));\n commentUsers.forEach((u) => commentUserMap.set(u.id, u));\n }\n\n const commentIds = comments.map((c) => c.id);\n const commentAttachments =\n commentIds.length > 0\n ? await db\n .select({\n id: schema.ticketCommentAttachments.id,\n commentId: schema.ticketCommentAttachments.commentId,\n fileName: schema.ticketCommentAttachments.fileName,\n fileSize: schema.ticketCommentAttachments.fileSize,\n mimeType: schema.ticketCommentAttachments.mimeType,\n storageKey: schema.ticketCommentAttachments.storageKey,\n createdAt: schema.ticketCommentAttachments.createdAt,\n })\n .from(schema.ticketCommentAttachments)\n .where(\n inArray(schema.ticketCommentAttachments.commentId, commentIds),\n )\n : [];\n\n const content: Array<\n { type: \"text\"; text: string } | { type: \"image\"; data: string; mimeType: string }\n > = [\n {\n type: \"text\",\n text:\n `**Ticket Details:**\\n\\n` +\n `**${ticketRow.ticketNumber}**: ${ticketRow.title}\\n` +\n `Status: ${ticketRow.status}\\n` +\n `Priority: ${ticketRow.priority}\\n` +\n `Type: ${ticketRow.type}\\n` +\n `${ticketRow.description ? `Description: ${ticketRow.description}\\n` : \"\"}` +\n `${ticketRow.project?.name ? `Project: ${ticketRow.project.name}\\n` : \"\"}` +\n `${ticketRow.customer?.name ? `Customer: ${ticketRow.customer.name}\\n` : \"\"}` +\n `${ticketRow.assignee?.fullName ? `Assignee: ${ticketRow.assignee.fullName}\\n` : \"\"}` +\n `Requester: ${ticketRow.requester?.fullName || \"Unknown\"}\\n` +\n `Created: ${new Date(ticketRow.createdAt).toLocaleDateString()}\\n` +\n `${attachments.length > 0 ? `\\n📎 Attachments: ${attachments.length}\\n` : \"\"}` +\n `${comments.length > 0 ? `💬 Comments: ${comments.length}\\n` : \"\"}`,\n },\n ];\n\n if (attachments.length > 0) {\n console.error(`📎 Processing ${attachments.length} ticket attachments...`);\n for (const attachment of attachments) {\n if (isImageFile(attachment.mimeType)) {\n console.error(`🖼️ Downloading image: ${attachment.fileName}`);\n const base64 = await downloadImageAsBase64(attachment.storageKey);\n if (base64) {\n content.push({\n type: \"image\",\n data: base64,\n mimeType: attachment.mimeType,\n });\n content.push({\n type: \"text\",\n text: `\\n📸 **Image from ticket**: ${attachment.fileName} (${Math.round(\n attachment.fileSize / 1024,\n )}KB, uploaded by ${attachment.uploaderName || \"Unknown\"} on ${new Date(\n attachment.createdAt,\n ).toLocaleDateString()})\\n`,\n });\n }\n }\n }\n }\n\n if (commentAttachments.length > 0) {\n console.error(\n `📎 Processing ${commentAttachments.length} comment attachments...`,\n );\n for (const attachment of commentAttachments) {\n if (isImageFile(attachment.mimeType)) {\n console.error(\n `🖼️ Downloading comment image: ${attachment.fileName}`,\n );\n const base64 = await downloadImageAsBase64(attachment.storageKey);\n if (base64) {\n const comment = comments.find((c) => c.id === attachment.commentId);\n const author = comment?.userId\n ? commentUserMap.get(comment.userId)?.fullName\n : null;\n content.push({\n type: \"image\",\n data: base64,\n mimeType: attachment.mimeType,\n });\n content.push({\n type: \"text\",\n text:\n `\\n📸 **Image from comment** by ${author || \"Unknown\"} on ${new Date(\n attachment.createdAt,\n ).toLocaleDateString()}: ${attachment.fileName} (${Math.round(\n attachment.fileSize / 1024,\n )}KB)\\n` +\n (comment?.content\n ? `Comment text: \"${comment.content.substring(0, 100)}${\n comment.content.length > 100 ? \"...\" : \"\"\n }\"\\n`\n : \"\"),\n });\n }\n }\n }\n }\n\n console.error(\n `✅ Returning ticket with ${content.filter((c) => c.type === \"image\").length} images`,\n );\n\n return { content };\n}\n\nasync function handleCreateTicket(input: CreateTicketArgs) {\n const ctx = authContext!;\n const {\n title,\n description,\n status = \"open\",\n priority = \"medium\",\n type = \"task\",\n projectId,\n customerId,\n } = input;\n\n const year = new Date().getFullYear();\n let resolvedTeamId = ctx.teamId;\n let resolvedCustomerId = customerId;\n let projectAbbreviation = \"\";\n\n if (projectId) {\n const [project] = await db\n .select({\n name: schema.projects.name,\n teamId: schema.projects.teamId,\n customerId: schema.projects.customerId,\n })\n .from(schema.projects)\n .where(eq(schema.projects.id, projectId))\n .limit(1);\n\n if (project) {\n if (project.teamId) resolvedTeamId = project.teamId;\n if (!resolvedCustomerId && project.customerId) {\n resolvedCustomerId = project.customerId;\n }\n if (project.name) {\n const upper = project.name.toUpperCase().replace(/[^A-Z0-9\\s]/g, \"\");\n const words = upper.split(/\\s+/).filter(Boolean);\n if (words.length >= 2) {\n projectAbbreviation = words\n .slice(0, 2)\n .map((w) => w.substring(0, 3))\n .join(\"\")\n .substring(0, 5);\n } else if (words.length === 1 && words[0]) {\n projectAbbreviation = words[0].substring(0, 5);\n }\n }\n }\n }\n\n let ticketNumber: string;\n if (projectId && projectAbbreviation) {\n const pattern = `${year}-${projectAbbreviation}-%`;\n const [highest] = await db\n .select({ ticketNumber: schema.tickets.ticketNumber })\n .from(schema.tickets)\n .where(\n and(\n eq(schema.tickets.projectId, projectId),\n ilike(schema.tickets.ticketNumber, pattern),\n ),\n )\n .orderBy(desc(schema.tickets.ticketNumber))\n .limit(1);\n\n let nextSequence = 1;\n if (highest?.ticketNumber) {\n const parts = highest.ticketNumber.split(\"-\");\n if (parts.length === 3 && parts[2]) {\n const lastSeq = Number.parseInt(parts[2], 10);\n if (!Number.isNaN(lastSeq)) nextSequence = lastSeq + 1;\n }\n }\n ticketNumber = `${year}-${projectAbbreviation}-${String(nextSequence).padStart(3, \"0\")}`;\n } else {\n const [countRow] = await db\n .select({ n: sql<number>`count(*)::int` })\n .from(schema.tickets)\n .where(eq(schema.tickets.teamId, resolvedTeamId));\n const count = Number(countRow?.n ?? 0);\n ticketNumber = `${year}-${String(count + 1).padStart(3, \"0\")}`;\n }\n\n await db.insert(schema.tickets).values({\n teamId: resolvedTeamId,\n ticketNumber,\n title,\n description: description ?? null,\n status: status as never,\n priority: priority as never,\n type: type as never,\n projectId: projectId ?? null,\n customerId: resolvedCustomerId ?? null,\n requesterId: ctx.userId,\n });\n\n return {\n content: [\n {\n type: \"text\",\n text:\n `✅ **Ticket Created Successfully!**\\n\\n` +\n `Ticket Number: **${ticketNumber}**\\n` +\n `Title: ${title}\\n` +\n `Status: ${status}\\n` +\n `Priority: ${priority}\\n` +\n `Type: ${type}\\n`,\n },\n ],\n };\n}\n\nasync function handleGetCustomers(input: GetCustomersArgs) {\n const ctx = authContext!;\n const { q, pageSize = 20 } = input;\n\n const customerIds = await getAccessibleCustomerIds(ctx.teamId);\n if (customerIds.length === 0) {\n return {\n content: [\n {\n type: \"text\",\n text: \"No customers found or no access to any customers.\",\n },\n ],\n };\n }\n\n const filters = [inArray(schema.customers.id, customerIds)];\n if (q) {\n const pattern = `%${q}%`;\n filters.push(\n or(\n ilike(schema.customers.name, pattern),\n ilike(schema.customers.email, pattern),\n )!,\n );\n }\n\n const rows = await db\n .select({\n id: schema.customers.id,\n name: schema.customers.name,\n email: schema.customers.email,\n website: schema.customers.website,\n createdAt: schema.customers.createdAt,\n })\n .from(schema.customers)\n .where(and(...filters))\n .orderBy(asc(schema.customers.name))\n .limit(Math.min(pageSize, 100));\n\n return {\n content: [\n {\n type: \"text\",\n text: `Found ${rows.length} customers:\\n\\n${\n rows\n .map(\n (c) =>\n `**${c.name}**\\n` +\n `${c.email ? `Email: ${c.email}\\n` : \"\"}` +\n `${c.website ? `Website: ${c.website}\\n` : \"\"}` +\n `Created: ${new Date(c.createdAt).toLocaleDateString()}\\n`,\n )\n .join(\"\\n\") || \"No customers found.\"\n }`,\n },\n ],\n };\n}\n\nasync function handleCreateCustomer(input: CreateCustomerArgs) {\n const ctx = authContext!;\n const { name, email, website } = input;\n\n await db.insert(schema.customers).values({\n teamId: ctx.teamId,\n name,\n email: email ?? \"\",\n website: website ?? null,\n });\n\n return {\n content: [\n {\n type: \"text\",\n text:\n `✅ **Customer Created Successfully!**\\n\\n` +\n `Name: ${name}\\n` +\n `${email ? `Email: ${email}\\n` : \"\"}` +\n `${website ? `Website: ${website}\\n` : \"\"}`,\n },\n ],\n };\n}\n\nasync function handleGetProjects(input: GetProjectsArgs) {\n const ctx = authContext!;\n const { customerId, q, pageSize = 20 } = input;\n\n const projectIds = await getAccessibleProjectIds(ctx.userId, ctx.teamId);\n if (projectIds.length === 0) {\n return {\n content: [\n {\n type: \"text\",\n text: \"No projects found or no access to any projects.\",\n },\n ],\n };\n }\n\n const filters = [inArray(schema.projects.id, projectIds)];\n if (customerId) filters.push(eq(schema.projects.customerId, customerId));\n if (q) filters.push(ilike(schema.projects.name, `%${q}%`));\n\n const rows = await db\n .select({\n id: schema.projects.id,\n name: schema.projects.name,\n description: schema.projects.description,\n customerId: schema.projects.customerId,\n createdAt: schema.projects.createdAt,\n })\n .from(schema.projects)\n .where(and(...filters))\n .orderBy(asc(schema.projects.name))\n .limit(Math.min(pageSize, 100));\n\n return {\n content: [\n {\n type: \"text\",\n text: `Found ${rows.length} projects:\\n\\n${\n rows\n .map(\n (p) =>\n `**${p.name}** (ID: ${p.id})\\n` +\n `${p.description ? `Description: ${p.description}\\n` : \"\"}` +\n `Created: ${new Date(p.createdAt).toLocaleDateString()}\\n`,\n )\n .join(\"\\n\") || \"No projects found.\"\n }`,\n },\n ],\n };\n}\n\nasync function handleCreateProject(input: CreateProjectArgs) {\n const ctx = authContext!;\n const { name, description, customerId } = input;\n // NOTE: previous insert also set `status` and `user_id`, but\n // neither column exists on the current `projects` schema (status was\n // removed; ownership tracked elsewhere). We silently drop them.\n\n await db.insert(schema.projects).values({\n teamId: ctx.teamId,\n name,\n description: description ?? null,\n customerId: customerId ?? null,\n });\n\n return {\n content: [\n {\n type: \"text\",\n text:\n `✅ **Project Created Successfully!**\\n\\n` +\n `Name: ${name}\\n` +\n `${description ? `Description: ${description}\\n` : \"\"}`,\n },\n ],\n };\n}\n\n// --------- AI session handlers ----------\n\nasync function handleStartAiSession(input: StartAiSessionArgs) {\n const ctx = authContext!;\n const {\n ticketId,\n cursorSessionId,\n totalEstimatedMinutes,\n complexityScore,\n } = input;\n\n if (!totalEstimatedMinutes) {\n throw new Error(\"totalEstimatedMinutes is required\");\n }\n\n const roundedMinutes = roundToNearest15Minutes(totalEstimatedMinutes);\n const sessionStartTime = new Date();\n\n const [sessionData] = await db\n .insert(schema.aiSessions)\n .values({\n ticketId,\n providerUserId: ctx.userId,\n teamId: ctx.teamId,\n cursorSessionId: cursorSessionId ?? null,\n aiTimeEstimateMinutes: roundedMinutes,\n complexityScore: complexityScore ?? null,\n status: \"in_progress\",\n })\n .returning({\n id: schema.aiSessions.id,\n ticketId: schema.aiSessions.ticketId,\n cursorSessionId: schema.aiSessions.cursorSessionId,\n createdAt: schema.aiSessions.createdAt,\n });\n\n if (!sessionData) {\n throw new Error(\"Failed to create AI session\");\n }\n\n const sessionId = `ai-sess-${sessionData.id.substring(0, 8)}`;\n\n return {\n content: [\n {\n type: \"text\",\n text:\n `🚀 **AI Session Started!**\\n\\n` +\n `🆔 Session ID: **${sessionId}**\\n` +\n `🎫 Ticket: ${ticketId}\\n` +\n `⏱️ Estimated: ${roundedMinutes} min\\n` +\n `${complexityScore ? `🎯 Complexity: ${complexityScore}/10\\n` : \"\"}` +\n `📅 Started: ${sessionStartTime.toLocaleString()}\\n\\n` +\n `📝 Timetrack entry will be created when you complete the session.`,\n },\n ],\n };\n}\n\nasync function handleTrackManualFollowUp(input: TrackManualFollowUpArgs) {\n const ctx = authContext!;\n const {\n aiSessionId,\n originalPrompt,\n aiResponse,\n developerFollowUp,\n followUpReason,\n outcome = \"success\",\n estimatedMinutes,\n workDescription,\n } = input;\n\n const prefix = aiSessionId.replace(\"ai-sess-\", \"\");\n const teamIds = await getAccessibleTeamIds(ctx.teamId);\n const fullSessionId = await resolveAiSessionId(prefix, teamIds);\n if (!fullSessionId) {\n throw new Error(`Session not found: ${aiSessionId}`);\n }\n\n const [session] = await db\n .select({\n id: schema.aiSessions.id,\n status: schema.aiSessions.status,\n createdAt: schema.aiSessions.createdAt,\n aiTimeEstimateMinutes: schema.aiSessions.aiTimeEstimateMinutes,\n })\n .from(schema.aiSessions)\n .where(eq(schema.aiSessions.id, fullSessionId))\n .limit(1);\n if (!session) throw new Error(`Session not found: ${aiSessionId}`);\n\n const followUpTime = new Date();\n const oldEstimate = session.aiTimeEstimateMinutes ?? 60;\n const roundedFollowUpMinutes = roundToNearest15Minutes(\n estimatedMinutes || 0,\n );\n const newEstimate = oldEstimate + roundedFollowUpMinutes;\n\n await db\n .update(schema.aiSessions)\n .set({\n status: \"in_progress\",\n aiTimeEstimateMinutes: newEstimate,\n })\n .where(eq(schema.aiSessions.id, session.id));\n\n await db.insert(schema.manualFollowUps).values({\n aiSessionId: session.id,\n developerId: ctx.userId,\n teamId: ctx.teamId,\n originalPrompt,\n aiResponse,\n followUpPrompt: developerFollowUp,\n followUpReason,\n outcome,\n timeSpentMinutes: null,\n resolvedAt: outcome === \"success\" ? new Date().toISOString() : null,\n });\n\n await db.insert(schema.aiTimeLogs).values({\n aiSessionId: session.id,\n activityType: \"debugging\",\n description: `Follow-up: ${followUpReason.replace(\"_\", \" \")} - ${outcome}`,\n durationSeconds: 0,\n productivityScore:\n outcome === \"success\" ? 9 : outcome === \"partial_success\" ? 6 : 4,\n startedAt: followUpTime.toISOString(),\n });\n\n const sessionStartTime = new Date(session.createdAt);\n const totalMinutesElapsed = Math.round(\n (followUpTime.getTime() - sessionStartTime.getTime()) / 60000,\n );\n const currentEfficiency =\n totalMinutesElapsed > 0 ? totalMinutesElapsed / newEstimate : 1;\n\n await db\n .update(schema.aiSessions)\n .set({\n efficiencyScore: currentEfficiency.toFixed(2),\n actualTimeMinutes: totalMinutesElapsed,\n })\n .where(eq(schema.aiSessions.id, session.id));\n\n const existingEntries = await db\n .select({\n id: schema.agendaEvents.id,\n trackedDuration: schema.agendaEvents.trackedDuration,\n title: schema.agendaEvents.title,\n description: schema.agendaEvents.description,\n startTime: schema.agendaEvents.startTime,\n })\n .from(schema.agendaEvents)\n .where(\n and(\n eq(schema.agendaEvents.aiSessionId, session.id),\n eq(schema.agendaEvents.status, \"draft\"),\n ),\n )\n .orderBy(desc(schema.agendaEvents.createdAt));\n\n let trackerAction = \"\";\n let trackerDetails = \"\";\n\n let existingEntry = existingEntries[0] ?? null;\n\n if (existingEntries.length > 1) {\n const totalExistingDuration = existingEntries.reduce(\n (sum, entry) => sum + (entry.trackedDuration ?? 0),\n 0,\n );\n const duplicateIds = existingEntries.slice(1).map((e) => e.id);\n await db\n .delete(schema.agendaEvents)\n .where(inArray(schema.agendaEvents.id, duplicateIds));\n\n if (existingEntry && totalExistingDuration > (existingEntry.trackedDuration ?? 0)) {\n await db\n .update(schema.agendaEvents)\n .set({ trackedDuration: totalExistingDuration })\n .where(eq(schema.agendaEvents.id, existingEntry.id));\n existingEntry = { ...existingEntry, trackedDuration: totalExistingDuration };\n }\n trackerAction = `Consolidated ${existingEntries.length} duplicate entries`;\n }\n\n if (existingEntry) {\n const newDuration =\n (existingEntry.trackedDuration ?? 0) + roundedFollowUpMinutes * 60;\n\n await db\n .update(schema.agendaEvents)\n .set({\n trackedDuration: newDuration,\n endTime: followUpTime.toISOString(),\n title: workDescription,\n description: workDescription,\n })\n .where(eq(schema.agendaEvents.id, existingEntry.id));\n\n trackerAction = trackerAction || \"Updated existing tracker\";\n trackerDetails =\n ` • Total tracked time: ${Math.round(newDuration / 60)} minutes (+${roundedFollowUpMinutes} min)\\n` +\n ` • Description: ${workDescription}\\n`;\n } else {\n const durationSeconds = roundedFollowUpMinutes * 60;\n const startTime = new Date(\n followUpTime.getTime() - durationSeconds * 1000,\n );\n\n await db.insert(schema.agendaEvents).values({\n teamId: ctx.teamId,\n userId: ctx.userId,\n aiSessionId: session.id,\n title: workDescription,\n description: workDescription,\n startTime: startTime.toISOString(),\n endTime: followUpTime.toISOString(),\n type: \"work\" as never,\n status: \"draft\" as never,\n allDay: false,\n isTracked: true,\n trackedDuration: durationSeconds,\n });\n\n trackerAction = \"Created new tracker\";\n trackerDetails =\n ` • Tracked time: ${roundedFollowUpMinutes} minutes\\n` +\n ` • Description: ${workDescription}\\n`;\n }\n\n return {\n content: [\n {\n type: \"text\",\n text:\n `🔄 **Follow-up Tracked & Session Restarted!**\\n\\n` +\n `🆔 Session: ${aiSessionId} (back to active)\\n` +\n `🔍 Reason: ${followUpReason.replace(\"_\", \" \")}\\n` +\n `✅ Outcome: ${outcome}\\n` +\n `\\n📊 **Time Estimate Updated:**\\n` +\n ` • Old estimate: ${oldEstimate} minutes\\n` +\n ` • Follow-up estimate: +${roundedFollowUpMinutes} minutes (rounded to 15min)\\n` +\n ` • New estimate: ${newEstimate} minutes\\n` +\n `\\n📈 **Current Progress:**\\n` +\n ` • Total time elapsed: ${totalMinutesElapsed} minutes\\n` +\n ` • Efficiency: ${currentEfficiency < 1 ? \"🚀 \" : currentEfficiency > 1.5 ? \"⚠️ \" : \"⏱️ \"}${(currentEfficiency * 100).toFixed(0)}%\\n` +\n `\\n⏱️ **Tracker Entry: ${trackerAction}**\\n` +\n trackerDetails +\n `\\n⚡ **Time tracking resumed** - continue with confidence!`,\n },\n ],\n };\n}\n\nasync function handleGetSessionContext(input: GetSessionContextArgs) {\n const ctx = authContext!;\n const {\n aiSessionId,\n includeTicketData = true,\n includeTodoProgress = true,\n includeFollowUpHistory = false,\n } = input;\n\n const prefix = aiSessionId.replace(\"ai-sess-\", \"\");\n const teamIds = await getAccessibleTeamIds(ctx.teamId);\n const fullSessionId = await resolveAiSessionId(prefix, teamIds);\n if (!fullSessionId) throw new Error(`Session not found: ${aiSessionId}`);\n\n const [session] = await db\n .select({\n id: schema.aiSessions.id,\n ticketId: schema.aiSessions.ticketId,\n status: schema.aiSessions.status,\n aiTimeEstimateMinutes: schema.aiSessions.aiTimeEstimateMinutes,\n actualTimeMinutes: schema.aiSessions.actualTimeMinutes,\n complexityScore: schema.aiSessions.complexityScore,\n createdAt: schema.aiSessions.createdAt,\n cursorSessionId: schema.aiSessions.cursorSessionId,\n })\n .from(schema.aiSessions)\n .where(eq(schema.aiSessions.id, fullSessionId))\n .limit(1);\n if (!session) throw new Error(`Session not found: ${aiSessionId}`);\n\n const context: Record<string, unknown> = {\n sessionId: aiSessionId,\n status: session.status,\n timeEstimate: session.aiTimeEstimateMinutes,\n actualTime: session.actualTimeMinutes,\n complexity: session.complexityScore,\n createdAt: session.createdAt,\n };\n\n if (includeTicketData) {\n const [ticket] = await db\n .select({\n id: schema.tickets.id,\n ticketNumber: schema.tickets.ticketNumber,\n title: schema.tickets.title,\n description: schema.tickets.description,\n status: schema.tickets.status,\n priority: schema.tickets.priority,\n type: schema.tickets.type,\n })\n .from(schema.tickets)\n .where(eq(schema.tickets.id, session.ticketId))\n .limit(1);\n context.ticketData = ticket ?? null;\n }\n\n if (includeTodoProgress) {\n const todos = await db\n .select({\n id: schema.aiTodos.id,\n content: schema.aiTodos.content,\n status: schema.aiTodos.status,\n estimatedMinutes: schema.aiTodos.estimatedMinutes,\n actualMinutes: schema.aiTodos.actualMinutes,\n })\n .from(schema.aiTodos)\n .where(eq(schema.aiTodos.aiSessionId, session.id))\n .orderBy(asc(schema.aiTodos.sequenceOrder));\n\n context.todos = todos;\n context.todoProgress = {\n total: todos.length,\n completed: todos.filter((t) => t.status === \"completed\").length,\n inProgress: todos.filter((t) => t.status === \"in_progress\").length,\n };\n }\n\n if (includeFollowUpHistory) {\n const followUps = await db\n .select({\n followUpReason: schema.manualFollowUps.followUpReason,\n outcome: schema.manualFollowUps.outcome,\n timeSpentMinutes: schema.manualFollowUps.timeSpentMinutes,\n createdAt: schema.manualFollowUps.createdAt,\n })\n .from(schema.manualFollowUps)\n .where(eq(schema.manualFollowUps.aiSessionId, session.id))\n .orderBy(asc(schema.manualFollowUps.createdAt));\n context.followUpHistory = followUps;\n }\n\n const ticketData = context.ticketData as\n | { ticketNumber?: string; title?: string }\n | null\n | undefined;\n const todoProgress = context.todoProgress as\n | { total: number; completed: number; inProgress: number }\n | undefined;\n const followUpHistory = context.followUpHistory as unknown[] | undefined;\n\n return {\n content: [\n {\n type: \"text\",\n text:\n `🎯 **Session Context Retrieved**\\n\\n` +\n `Session: ${aiSessionId}\\n` +\n `Status: ${session.status}\\n` +\n `${ticketData ? `Ticket: ${ticketData.ticketNumber} - ${ticketData.title}\\n` : \"\"}` +\n `${todoProgress ? `Todo Progress: ${todoProgress.completed}/${todoProgress.total} completed\\n` : \"\"}` +\n `${followUpHistory ? `Follow-ups: ${followUpHistory.length}\\n` : \"\"}` +\n `\\n📋 Full context preserved for seamless continuation!`,\n },\n ],\n };\n}\n\nasync function handleSyncSessionTodos(input: SyncSessionTodosArgs) {\n const ctx = authContext!;\n const { aiSessionId, todos, replaceAll = true } = input;\n\n const prefix = aiSessionId.replace(\"ai-sess-\", \"\");\n const teamIds = await getAccessibleTeamIds(ctx.teamId);\n const fullSessionId = await resolveAiSessionId(prefix, teamIds);\n if (!fullSessionId) throw new Error(`Session not found: ${aiSessionId}`);\n\n if (replaceAll) {\n await db\n .delete(schema.aiTodos)\n .where(eq(schema.aiTodos.aiSessionId, fullSessionId));\n }\n\n if (todos && todos.length > 0) {\n let startSequence = 0;\n if (!replaceAll) {\n const [maxTodo] = await db\n .select({ sequenceOrder: schema.aiTodos.sequenceOrder })\n .from(schema.aiTodos)\n .where(eq(schema.aiTodos.aiSessionId, fullSessionId))\n .orderBy(desc(schema.aiTodos.sequenceOrder))\n .limit(1);\n startSequence = (maxTodo?.sequenceOrder ?? 0) + 1;\n }\n\n await db.insert(schema.aiTodos).values(\n todos.map((todo, index) => ({\n aiSessionId: fullSessionId,\n content: todo.content,\n status: todo.status,\n cursorTodoId: todo.todoId ?? null,\n estimatedMinutes: todo.estimatedMinutes ?? null,\n sequenceOrder: startSequence + index,\n })),\n );\n }\n\n let phaseTransition: string | null = null;\n\n const currentTodos = await db\n .select({ status: schema.aiTodos.status })\n .from(schema.aiTodos)\n .where(eq(schema.aiTodos.aiSessionId, fullSessionId));\n\n if (currentTodos.length > 0) {\n const hasInProgress = currentTodos.some((t) => t.status === \"in_progress\");\n const allCompleted = currentTodos.every((t) => t.status === \"completed\");\n\n const [currentPhase] = await db\n .select({\n activityType: schema.aiTimeLogs.activityType,\n status: schema.aiTimeLogs.status,\n })\n .from(schema.aiTimeLogs)\n .where(\n and(\n eq(schema.aiTimeLogs.aiSessionId, fullSessionId),\n eq(schema.aiTimeLogs.status, \"in_progress\"),\n ),\n )\n .limit(1);\n\n if (hasInProgress && currentPhase?.activityType === \"analysis\") {\n await transitionToNextPhase(fullSessionId, \"analysis\");\n phaseTransition =\n \"Analysis completed → Next phase started (Investigation/Development)\";\n }\n\n if (\n hasInProgress &&\n currentPhase?.activityType === \"bug_investigation\"\n ) {\n const completedCount = currentTodos.filter(\n (t) => t.status === \"completed\",\n ).length;\n if (completedCount > 0) {\n await transitionToNextPhase(fullSessionId, \"bug_investigation\");\n phaseTransition =\n \"Investigation completed → Development phase started\";\n }\n }\n\n if (allCompleted && currentPhase?.activityType === \"development\") {\n await transitionToNextPhase(fullSessionId, \"development\");\n phaseTransition =\n \"Development completed → Communication phase started\";\n }\n }\n\n return {\n content: [\n {\n type: \"text\",\n text:\n `✅ **Todos ${replaceAll ? \"Synced\" : \"Added\"} Successfully!**\\n\\n` +\n `Session: ${aiSessionId}\\n` +\n `${replaceAll ? \"Synced\" : \"Added\"} ${todos?.length || 0} todos\\n` +\n `${replaceAll ? \"\" : \"➕ Added to existing todo list\\n\"}` +\n `${phaseTransition ? `🔄 Phase Transition: ${phaseTransition}\\n` : \"\"}` +\n `\\n📝 Todo list updated and tracked for progress monitoring!`,\n },\n ],\n };\n}\n\nasync function handleAddFollowUpTodos(input: AddFollowUpTodosArgs) {\n const ctx = authContext!;\n const { aiSessionId, newTodos, followUpReason } = input;\n\n const prefix = aiSessionId.replace(\"ai-sess-\", \"\");\n const teamIds = await getAccessibleTeamIds(ctx.teamId);\n const fullSessionId = await resolveAiSessionId(prefix, teamIds);\n if (!fullSessionId) throw new Error(`Session not found: ${aiSessionId}`);\n\n if (newTodos && newTodos.length > 0) {\n const [maxTodo] = await db\n .select({ sequenceOrder: schema.aiTodos.sequenceOrder })\n .from(schema.aiTodos)\n .where(eq(schema.aiTodos.aiSessionId, fullSessionId))\n .orderBy(desc(schema.aiTodos.sequenceOrder))\n .limit(1);\n const startSequence = (maxTodo?.sequenceOrder ?? 0) + 1;\n\n await db.insert(schema.aiTodos).values(\n newTodos.map((todo, index) => ({\n aiSessionId: fullSessionId,\n content: `[Follow-up] ${todo.content}`,\n status: todo.status ?? \"pending\",\n estimatedMinutes: todo.estimatedMinutes ?? null,\n sequenceOrder: startSequence + index,\n })),\n );\n }\n\n return {\n content: [\n {\n type: \"text\",\n text:\n `✅ **Follow-up Todos Added Successfully!**\\n\\n` +\n `Session: ${aiSessionId}\\n` +\n `Added ${newTodos?.length || 0} new todos from follow-up\\n` +\n `${followUpReason ? `Reason: ${followUpReason}\\n` : \"\"}` +\n `\\n📝 New tasks identified and added to existing workflow!`,\n },\n ],\n };\n}\n\nasync function handleUpdateSessionStatus(input: UpdateSessionStatusArgs) {\n const ctx = authContext!;\n const { aiSessionId, status, actualTimeMinutes, completionNotes } = input;\n\n const prefix = aiSessionId.replace(\"ai-sess-\", \"\");\n const teamIds = await getAccessibleTeamIds(ctx.teamId);\n const fullSessionId = await resolveAiSessionId(prefix, teamIds);\n if (!fullSessionId) throw new Error(`Session not found: ${aiSessionId}`);\n\n await db\n .update(schema.aiSessions)\n .set({\n status,\n actualTimeMinutes: actualTimeMinutes ?? null,\n completedAt: status === \"completed\" ? new Date().toISOString() : null,\n })\n .where(eq(schema.aiSessions.id, fullSessionId));\n\n return {\n content: [\n {\n type: \"text\",\n text:\n `🎯 **Session Status Updated!**\\n\\n` +\n `Session: ${aiSessionId}\\n` +\n `Status: ${status}\\n` +\n `${actualTimeMinutes ? `Actual Time: ${actualTimeMinutes} minutes\\n` : \"\"}` +\n `${status === \"completed\" ? `✅ Session completed successfully!\\n` : \"\"}` +\n `${completionNotes ? `Notes: ${completionNotes}\\n` : \"\"}`,\n },\n ],\n };\n}\n\nasync function handleGetCompletionContext(input: GetCompletionContextArgs) {\n const ctx = authContext!;\n const {\n aiSessionId,\n includeFollowUps = true,\n includeTimeMetrics = true,\n includeTodos = true,\n } = input;\n\n const prefix = aiSessionId.replace(\"ai-sess-\", \"\");\n const teamIds = await getAccessibleTeamIds(ctx.teamId);\n const fullSessionId = await resolveAiSessionId(prefix, teamIds);\n if (!fullSessionId) throw new Error(`Session not found: ${aiSessionId}`);\n\n const [session] = await db\n .select({\n id: schema.aiSessions.id,\n ticketId: schema.aiSessions.ticketId,\n aiTimeEstimateMinutes: schema.aiSessions.aiTimeEstimateMinutes,\n actualTimeMinutes: schema.aiSessions.actualTimeMinutes,\n efficiencyScore: schema.aiSessions.efficiencyScore,\n createdAt: schema.aiSessions.createdAt,\n completedAt: schema.aiSessions.completedAt,\n status: schema.aiSessions.status,\n complexityScore: schema.aiSessions.complexityScore,\n })\n .from(schema.aiSessions)\n .where(eq(schema.aiSessions.id, fullSessionId))\n .limit(1);\n if (!session) throw new Error(`Session not found: ${aiSessionId}`);\n\n const [ticket] = await db\n .select({\n ticketNumber: schema.tickets.ticketNumber,\n title: schema.tickets.title,\n description: schema.tickets.description,\n type: schema.tickets.type,\n priority: schema.tickets.priority,\n })\n .from(schema.tickets)\n .where(eq(schema.tickets.id, session.ticketId))\n .limit(1);\n if (!ticket) throw new Error(\"Ticket not found for session\");\n\n const contextData: Record<string, unknown> = {\n session: {\n id: aiSessionId,\n status: session.status,\n complexity: session.complexityScore,\n createdAt: session.createdAt,\n completedAt: session.completedAt,\n },\n ticket: {\n number: ticket.ticketNumber,\n title: ticket.title,\n description: ticket.description,\n type: ticket.type,\n priority: ticket.priority,\n },\n };\n\n if (includeTimeMetrics) {\n const timeSaved =\n session.aiTimeEstimateMinutes && session.actualTimeMinutes\n ? Math.max(\n 0,\n session.aiTimeEstimateMinutes - session.actualTimeMinutes,\n )\n : null;\n\n contextData.timeMetrics = {\n estimatedMinutes: session.aiTimeEstimateMinutes,\n actualMinutes: session.actualTimeMinutes,\n timeSaved,\n efficiency: session.efficiencyScore,\n sessionDuration:\n session.completedAt && session.createdAt\n ? Math.round(\n (new Date(session.completedAt).getTime() -\n new Date(session.createdAt).getTime()) /\n 60000,\n )\n : null,\n };\n }\n\n if (includeTodos) {\n const todos = await db\n .select({\n content: schema.aiTodos.content,\n status: schema.aiTodos.status,\n estimatedMinutes: schema.aiTodos.estimatedMinutes,\n actualMinutes: schema.aiTodos.actualMinutes,\n completedAt: schema.aiTodos.completedAt,\n })\n .from(schema.aiTodos)\n .where(eq(schema.aiTodos.aiSessionId, session.id))\n .orderBy(asc(schema.aiTodos.createdAt));\n contextData.todos = todos;\n }\n\n if (includeFollowUps) {\n const followUps = await db\n .select({\n followUpReason: schema.manualFollowUps.followUpReason,\n outcome: schema.manualFollowUps.outcome,\n timeSpentMinutes: schema.manualFollowUps.timeSpentMinutes,\n createdAt: schema.manualFollowUps.createdAt,\n })\n .from(schema.manualFollowUps)\n .where(eq(schema.manualFollowUps.aiSessionId, session.id))\n .orderBy(asc(schema.manualFollowUps.createdAt));\n contextData.followUps = followUps;\n }\n\n const todosLen = (contextData.todos as Array<{ status: string }> | undefined) ?? [];\n const completedTodos = todosLen.filter((t) => t.status === \"completed\").length;\n const followUpsLen =\n (contextData.followUps as unknown[] | undefined)?.length ?? 0;\n\n return {\n content: [\n {\n type: \"text\",\n text:\n `📋 **Completion Context Retrieved!**\\n\\n` +\n `🎫 **Ticket:** ${ticket.ticketNumber} - ${ticket.title}\\n` +\n `🆔 **Session:** ${aiSessionId} (${session.status})\\n` +\n `⏱️ **Time:** ${session.actualTimeMinutes || \"N/A\"}/${session.aiTimeEstimateMinutes || \"N/A\"} minutes\\n` +\n `📋 **Todos:** ${completedTodos}/${todosLen.length} completed\\n` +\n `🔄 **Follow-ups:** ${followUpsLen}\\n\\n` +\n `✅ **Full context ready for Cursor AI to generate customer response!**\\n\\n` +\n `**Context Data:**\\n\\`\\`\\`json\\n${JSON.stringify(contextData, null, 2)}\\`\\`\\``,\n },\n ],\n };\n}\n\nasync function handleSaveCustomerResponse(input: SaveCustomerResponseArgs) {\n const ctx = authContext!;\n const { aiSessionId, customerResponse, responseType = \"completion\" } = input;\n\n const prefix = aiSessionId.replace(\"ai-sess-\", \"\");\n const teamIds = await getAccessibleTeamIds(ctx.teamId);\n const fullSessionId = await resolveAiSessionId(prefix, teamIds);\n if (!fullSessionId) throw new Error(`Session not found: ${aiSessionId}`);\n\n await db.insert(schema.aiResponses).values({\n aiSessionId: fullSessionId,\n responseType,\n content: customerResponse,\n isReadyForCustomer: true,\n providerApproved: false,\n });\n\n return {\n content: [\n {\n type: \"text\",\n text:\n `💾 **Customer Response Saved!**\\n\\n` +\n `🆔 Session: ${aiSessionId}\\n` +\n `📝 Response Type: ${responseType}\\n` +\n `📄 Length: ${customerResponse.length} characters\\n\\n` +\n `✅ **Response ready for provider approval**\\n` +\n `🔍 Provider can review in AI tab before sending to customer\\n\\n` +\n `**Preview:**\\n\\`\\`\\`\\n${customerResponse.substring(0, 200)}${customerResponse.length > 200 ? \"...\" : \"\"}\\`\\`\\``,\n },\n ],\n };\n}\n\nasync function handleCompleteAiSession(input: CompleteAiSessionArgs) {\n const ctx = authContext!;\n const {\n aiSessionId,\n workCompleted,\n technicalSummary,\n invoiceDescription,\n efficiencyNotes,\n } = input;\n\n const prefix = aiSessionId.replace(\"ai-sess-\", \"\");\n const teamIds = await getAccessibleTeamIds(ctx.teamId);\n const fullSessionId = await resolveAiSessionId(prefix, teamIds);\n if (!fullSessionId) throw new Error(`Session not found: ${aiSessionId}`);\n\n const [existingSession] = await db\n .select({\n id: schema.aiSessions.id,\n ticketId: schema.aiSessions.ticketId,\n aiTimeEstimateMinutes: schema.aiSessions.aiTimeEstimateMinutes,\n createdAt: schema.aiSessions.createdAt,\n })\n .from(schema.aiSessions)\n .where(eq(schema.aiSessions.id, fullSessionId))\n .limit(1);\n if (!existingSession) {\n throw new Error(`Session not found: ${aiSessionId}`);\n }\n\n const completionTime = new Date();\n const sessionStartTime = new Date(existingSession.createdAt);\n const timeSpentMinutes = Math.round(\n (completionTime.getTime() - sessionStartTime.getTime()) / 60000,\n );\n\n const [session] = await db\n .update(schema.aiSessions)\n .set({\n status: \"completed\",\n actualTimeMinutes: timeSpentMinutes,\n completedAt: completionTime.toISOString(),\n efficiencyScore: null,\n })\n .where(eq(schema.aiSessions.id, existingSession.id))\n .returning({\n id: schema.aiSessions.id,\n ticketId: schema.aiSessions.ticketId,\n aiTimeEstimateMinutes: schema.aiSessions.aiTimeEstimateMinutes,\n createdAt: schema.aiSessions.createdAt,\n });\n if (!session) throw new Error(`Failed to update session: ${aiSessionId}`);\n\n const efficiencyScore = session.aiTimeEstimateMinutes\n ? timeSpentMinutes / session.aiTimeEstimateMinutes\n : 1.0;\n\n await db\n .update(schema.aiSessions)\n .set({ efficiencyScore: efficiencyScore.toFixed(2) })\n .where(eq(schema.aiSessions.id, session.id));\n\n const activePhases = await db\n .select()\n .from(schema.aiTimeLogs)\n .where(\n and(\n eq(schema.aiTimeLogs.aiSessionId, existingSession.id),\n eq(schema.aiTimeLogs.status, \"in_progress\"),\n ),\n );\n\n for (const phase of activePhases) {\n const duration = Math.round(\n (completionTime.getTime() - new Date(phase.startedAt).getTime()) / 1000,\n );\n await db\n .update(schema.aiTimeLogs)\n .set({\n endedAt: completionTime.toISOString(),\n durationSeconds: duration,\n status: \"completed\",\n })\n .where(eq(schema.aiTimeLogs.id, phase.id));\n }\n\n await db\n .update(schema.aiTimeLogs)\n .set({ status: \"skipped\" })\n .where(\n and(\n eq(schema.aiTimeLogs.aiSessionId, existingSession.id),\n eq(schema.aiTimeLogs.status, \"pending\"),\n eq(schema.aiTimeLogs.estimatedDurationSeconds, 0),\n ),\n );\n\n const sessionDuration = Math.round(\n (completionTime.getTime() - new Date(session.createdAt).getTime()) / 60000,\n );\n\n const workSummary = `Completed ${workCompleted.length} tasks including: ${workCompleted\n .slice(0, 3)\n .join(\", \")}${workCompleted.length > 3 ? \" and more\" : \"\"}.`;\n\n const [ticketInfo] = await db\n .select({\n ticketNumber: schema.tickets.ticketNumber,\n title: schema.tickets.title,\n projectId: schema.tickets.projectId,\n })\n .from(schema.tickets)\n .where(eq(schema.tickets.id, session.ticketId))\n .limit(1);\n\n let completionDescription: string;\n if (invoiceDescription) {\n completionDescription = `${ticketInfo?.ticketNumber || \"Ticket\"}: ${invoiceDescription}`;\n } else {\n const workDescription = workCompleted\n .map((task, index) => `${index + 1}. ${task}`)\n .join(\"\\n\");\n completionDescription = `${ticketInfo?.ticketNumber || \"Ticket\"}: ${technicalSummary || workSummary}\\n\\nCompleted work:\\n${workDescription}`;\n }\n\n const estimatedMinutes =\n session.aiTimeEstimateMinutes ?? timeSpentMinutes;\n const sessionStart = new Date(session.createdAt);\n const estimatedEnd = new Date(\n sessionStart.getTime() + estimatedMinutes * 60000,\n );\n\n const existingAgendaEntries = await db\n .select({\n id: schema.agendaEvents.id,\n trackedDuration: schema.agendaEvents.trackedDuration,\n })\n .from(schema.agendaEvents)\n .where(\n and(\n eq(schema.agendaEvents.aiSessionId, session.id),\n eq(schema.agendaEvents.status, \"draft\"),\n ),\n )\n .orderBy(desc(schema.agendaEvents.createdAt));\n\n let agendaEventId: string | null = null;\n let wasUpdated = false;\n let consolidatedCount = 0;\n\n const existingAgendaEntry = existingAgendaEntries[0] ?? null;\n\n if (existingAgendaEntries.length > 1) {\n const duplicateIds = existingAgendaEntries.slice(1).map((e) => e.id);\n await db\n .delete(schema.agendaEvents)\n .where(inArray(schema.agendaEvents.id, duplicateIds));\n consolidatedCount = existingAgendaEntries.length - 1;\n }\n\n try {\n if (existingAgendaEntry) {\n const [updated] = await db\n .update(schema.agendaEvents)\n .set({\n title: ticketInfo?.title || \"Development Work\",\n description: completionDescription,\n endTime: estimatedEnd.toISOString(),\n projectId: ticketInfo?.projectId ?? null,\n trackedDuration: estimatedMinutes * 60,\n })\n .where(eq(schema.agendaEvents.id, existingAgendaEntry.id))\n .returning({ id: schema.agendaEvents.id });\n agendaEventId = updated?.id ?? null;\n wasUpdated = true;\n } else {\n const [created] = await db\n .insert(schema.agendaEvents)\n .values({\n teamId: ctx.teamId,\n userId: ctx.userId,\n title: ticketInfo?.title || \"Development Work\",\n description: completionDescription,\n startTime: sessionStart.toISOString(),\n endTime: estimatedEnd.toISOString(),\n projectId: ticketInfo?.projectId ?? null,\n aiSessionId: session.id,\n type: \"work\" as never,\n status: \"draft\" as never,\n allDay: false,\n isTracked: true,\n trackedDuration: estimatedMinutes * 60,\n })\n .returning({ id: schema.agendaEvents.id });\n agendaEventId = created?.id ?? null;\n }\n\n if (agendaEventId && session.ticketId) {\n await db\n .insert(schema.agendaEventTickets)\n .values({\n agendaEventId,\n ticketId: session.ticketId,\n })\n .onConflictDoNothing();\n }\n } catch (err) {\n console.error(\n `⚠️ Failed to ${wasUpdated ? \"update\" : \"create\"} agenda event:`,\n err,\n );\n }\n\n if (consolidatedCount > 0) {\n console.log(\n `🧹 Cleaned up ${consolidatedCount} duplicate agenda entries for session ${aiSessionId}`,\n );\n }\n\n let responseText = `🎉 **AI Session Completed Successfully!**\\n\\n`;\n responseText += `🆔 Session: ${aiSessionId}\\n`;\n responseText += `📊 **Performance Summary:**\\n`;\n responseText += ` • Tasks Completed: ${workCompleted.length}\\n`;\n responseText += ` • Time Spent: ${timeSpentMinutes} minutes\\n`;\n responseText += ` • Estimated Time: ${session.aiTimeEstimateMinutes || \"N/A\"} minutes\\n`;\n responseText += ` • Efficiency: ${efficiencyScore < 1 ? \"🚀\" : efficiencyScore > 1.5 ? \"⚠️\" : \"⏱️\"} ${(efficiencyScore * 100).toFixed(0)}%\\n`;\n responseText += ` • Session Duration: ${sessionDuration} minutes\\n\\n`;\n\n responseText += `✅ **Work Completed:**\\n`;\n workCompleted.forEach((task, index) => {\n responseText += `${index + 1}. ${task}\\n`;\n });\n responseText += `\\n`;\n\n if (technicalSummary) {\n responseText += `🔧 **Technical Summary:**\\n${technicalSummary}\\n\\n`;\n }\n if (efficiencyNotes) {\n responseText += `📈 **Efficiency Notes:**\\n${efficiencyNotes}\\n\\n`;\n }\n if (agendaEventId) {\n responseText += `📅 **Timetrack Entry ${wasUpdated ? \"Updated\" : \"Created\"}:**\\n`;\n responseText += ` • Agenda event ${wasUpdated ? \"updated with final\" : \"created with\"} work summary\\n`;\n responseText += ` • Status: DRAFT (requires approval in agenda)\\n`;\n responseText += ` • Duration: ${estimatedMinutes} minutes\\n`;\n responseText += ` • Period: ${sessionStart.toLocaleString()} - ${completionTime.toLocaleString()}\\n\\n`;\n }\n\n responseText += `📋 **Context for Customer Response:**\\n`;\n responseText += ` • Use \"get-completion-context\" to retrieve full context\\n`;\n responseText += ` • Generate customer-friendly response based on completed work\\n`;\n responseText += ` • Focus on business value and customer benefits\\n\\n`;\n responseText += `🎯 **Session archived successfully!**`;\n\n return { content: [{ type: \"text\", text: responseText }] };\n}\n\nasync function handleLogHours(input: LogHoursArgs) {\n const ctx = authContext!;\n const {\n projectId,\n ticketId,\n aiSessionId,\n workDescription,\n estimatedHours,\n chatContextSummary,\n } = input;\n\n let project: { id: string; name: string; teamId: string | null } | null = null;\n let ticket: {\n id: string;\n title: string;\n status: string;\n teamId: string;\n projectId: string | null;\n customerId: string | null;\n } | null = null;\n let aiSession: { id: string; ticketId: string; status: string } | null = null;\n\n if (projectId) {\n const projectIds = await getAccessibleProjectIds(ctx.userId, ctx.teamId);\n if (!projectIds.includes(projectId)) {\n throw new Error(\n `Project not found or no access: ${projectId}. Please call get-projects first to find the correct project.`,\n );\n }\n const [projectData] = await db\n .select({\n id: schema.projects.id,\n name: schema.projects.name,\n teamId: schema.projects.teamId,\n })\n .from(schema.projects)\n .where(eq(schema.projects.id, projectId))\n .limit(1);\n if (!projectData) throw new Error(`Project not found: ${projectId}.`);\n project = projectData;\n }\n\n if (ticketId) {\n const [ticketData] = await db\n .select({\n id: schema.tickets.id,\n title: schema.tickets.title,\n status: schema.tickets.status,\n teamId: schema.tickets.teamId,\n projectId: schema.tickets.projectId,\n customerId: schema.tickets.customerId,\n })\n .from(schema.tickets)\n .where(eq(schema.tickets.id, ticketId))\n .limit(1);\n if (!ticketData) {\n throw new Error(\n `Ticket not found: ${ticketId}. Please call get-tickets first to find the correct ticket.`,\n );\n }\n\n let hasAccess = false;\n const teamIds = await getAccessibleTeamIds(ctx.teamId);\n if (teamIds.includes(ticketData.teamId)) hasAccess = true;\n if (!hasAccess && ticketData.projectId) {\n const projectIds = await getAccessibleProjectIds(ctx.userId, ctx.teamId);\n if (projectIds.includes(ticketData.projectId)) hasAccess = true;\n }\n if (!hasAccess && ticketData.customerId) {\n const customerIds = await getAccessibleCustomerIds(ctx.teamId);\n if (customerIds.includes(ticketData.customerId)) hasAccess = true;\n }\n if (!hasAccess) {\n throw new Error(\n `No access to ticket: ${ticketId}. Please call get-tickets first to find the correct ticket.`,\n );\n }\n ticket = ticketData;\n }\n\n if (aiSessionId) {\n const [sessionData] = await db\n .select({\n id: schema.aiSessions.id,\n ticketId: schema.aiSessions.ticketId,\n status: schema.aiSessions.status,\n })\n .from(schema.aiSessions)\n .where(eq(schema.aiSessions.id, aiSessionId))\n .limit(1);\n if (!sessionData) throw new Error(`AI Session not found: ${aiSessionId}.`);\n aiSession = sessionData;\n }\n\n const durationSeconds = Math.round(estimatedHours * 3600);\n const now = new Date();\n\n let agendaEntry: {\n id: string;\n trackedDuration: number | null;\n projectId: string | null;\n aiSessionId: string | null;\n } | null = null;\n let wasUpdated = false;\n let consolidatedCount = 0;\n\n if (aiSession?.id || ticket?.id) {\n let existingEntries: Array<{\n id: string;\n trackedDuration: number | null;\n projectId: string | null;\n aiSessionId: string | null;\n }> = [];\n\n if (aiSession?.id) {\n existingEntries = await db\n .select({\n id: schema.agendaEvents.id,\n trackedDuration: schema.agendaEvents.trackedDuration,\n projectId: schema.agendaEvents.projectId,\n aiSessionId: schema.agendaEvents.aiSessionId,\n })\n .from(schema.agendaEvents)\n .where(\n and(\n eq(schema.agendaEvents.status, \"draft\"),\n eq(schema.agendaEvents.userId, ctx.userId),\n eq(schema.agendaEvents.aiSessionId, aiSession.id),\n ),\n )\n .orderBy(desc(schema.agendaEvents.createdAt));\n } else if (ticket?.id) {\n const linkedEvents = await db\n .select({\n agendaEventId: schema.agendaEventTickets.agendaEventId,\n })\n .from(schema.agendaEventTickets)\n .where(eq(schema.agendaEventTickets.ticketId, ticket.id));\n\n const eventIds = linkedEvents.map((e) => e.agendaEventId);\n if (eventIds.length > 0) {\n existingEntries = await db\n .select({\n id: schema.agendaEvents.id,\n trackedDuration: schema.agendaEvents.trackedDuration,\n projectId: schema.agendaEvents.projectId,\n aiSessionId: schema.agendaEvents.aiSessionId,\n })\n .from(schema.agendaEvents)\n .where(\n and(\n inArray(schema.agendaEvents.id, eventIds),\n eq(schema.agendaEvents.status, \"draft\"),\n eq(schema.agendaEvents.userId, ctx.userId),\n ),\n )\n .orderBy(desc(schema.agendaEvents.createdAt));\n }\n }\n\n if (existingEntries.length > 0) {\n const existingEntry = existingEntries[0]!;\n\n if (existingEntries.length > 1) {\n const duplicateIds = existingEntries.slice(1).map((e) => e.id);\n await db\n .delete(schema.agendaEvents)\n .where(inArray(schema.agendaEvents.id, duplicateIds));\n consolidatedCount = existingEntries.length - 1;\n }\n\n const newDuration =\n (existingEntry.trackedDuration ?? 0) + durationSeconds;\n const [updated] = await db\n .update(schema.agendaEvents)\n .set({\n trackedDuration: newDuration,\n endTime: now.toISOString(),\n title: workDescription,\n description: chatContextSummary ?? workDescription,\n projectId: project?.id ?? existingEntry.projectId,\n })\n .where(eq(schema.agendaEvents.id, existingEntry.id))\n .returning({\n id: schema.agendaEvents.id,\n trackedDuration: schema.agendaEvents.trackedDuration,\n projectId: schema.agendaEvents.projectId,\n aiSessionId: schema.agendaEvents.aiSessionId,\n });\n agendaEntry = updated ?? null;\n wasUpdated = true;\n }\n }\n\n if (!agendaEntry) {\n const startTime = new Date(now.getTime() - durationSeconds * 1000);\n const [created] = await db\n .insert(schema.agendaEvents)\n .values({\n teamId: ctx.teamId,\n userId: ctx.userId,\n projectId: project?.id ?? null,\n aiSessionId: aiSession?.id ?? null,\n title: workDescription,\n description: chatContextSummary ?? workDescription,\n startTime: startTime.toISOString(),\n endTime: now.toISOString(),\n type: \"work\" as never,\n status: \"draft\" as never,\n allDay: false,\n isTracked: true,\n trackedDuration: durationSeconds,\n })\n .returning({\n id: schema.agendaEvents.id,\n trackedDuration: schema.agendaEvents.trackedDuration,\n projectId: schema.agendaEvents.projectId,\n aiSessionId: schema.agendaEvents.aiSessionId,\n });\n agendaEntry = created ?? null;\n\n if (agendaEntry && ticket?.id) {\n await db\n .insert(schema.agendaEventTickets)\n .values({ agendaEventId: agendaEntry.id, ticketId: ticket.id })\n .onConflictDoNothing();\n }\n }\n\n if (!agendaEntry) {\n throw new Error(\n `Failed to ${wasUpdated ? \"update\" : \"create\"} time entry`,\n );\n }\n\n let responseText = `⏱️ **Hours ${wasUpdated ? \"Added to Existing Entry\" : \"Logged Successfully\"}!**\\n\\n`;\n if (wasUpdated) {\n responseText += `🔄 **Updated existing draft entry** (avoiding duplicates)\\n`;\n responseText += ` • New total: ${Math.round(((agendaEntry.trackedDuration ?? 0) / 3600) * 10) / 10}h\\n\\n`;\n }\n if (consolidatedCount > 0) {\n responseText += `🧹 **Cleaned up ${consolidatedCount} duplicate entries**\\n\\n`;\n }\n\n responseText += `📋 **Entry Details:**\\n`;\n responseText += ` • Project: ${project ? project.name : \"(No project assigned)\"}\\n`;\n if (ticket) responseText += ` • Ticket: ${ticket.title} (${ticket.status})\\n`;\n if (aiSession)\n responseText += ` • AI Session: ${aiSession.id} (${aiSession.status})\\n`;\n responseText += ` • Description: ${workDescription}\\n`;\n responseText += ` • ${wasUpdated ? \"Added\" : \"Estimated\"} Hours: ${estimatedHours}h (${Math.floor(estimatedHours)}h ${Math.round((estimatedHours % 1) * 60)}m)\\n`;\n responseText += ` • Status: DRAFT (not billed yet)\\n`;\n responseText += ` • Entry ID: ${agendaEntry.id}\\n\\n`;\n\n if (chatContextSummary) {\n responseText += `📊 **Work Context:**\\n`;\n responseText += `${chatContextSummary.substring(0, 200)}${chatContextSummary.length > 200 ? \"...\" : \"\"}\\n\\n`;\n }\n\n responseText += `✅ Time entry ${wasUpdated ? \"updated\" : \"created\"} and ready for review in the agenda!`;\n\n return { content: [{ type: \"text\", text: responseText }] };\n}\n\n// --------- GitHub handlers ----------\n\nasync function handleGetGithubFile(input: GetGithubFileArgs) {\n const ctx = authContext!;\n const { projectId, filePath, ref } = input;\n\n const githubInfo = await getGithubTokenForProject(projectId, ctx.teamId);\n if (!githubInfo) {\n return {\n content: [\n { type: \"text\", text: \"❌ GitHub not configured for this project.\" },\n ],\n };\n }\n\n try {\n const octokit = new Octokit({ auth: githubInfo.token });\n console.error(\n `📄 Reading file: ${filePath} from ${githubInfo.repositoryFullName}`,\n );\n\n const { data } = await octokit.rest.repos.getContent({\n owner: githubInfo.owner,\n repo: githubInfo.repo,\n path: filePath,\n ref,\n });\n\n if (Array.isArray(data) || data.type !== \"file\") {\n return {\n content: [\n {\n type: \"text\",\n text: `❌ \"${filePath}\" is not a file or contains multiple items.`,\n },\n ],\n };\n }\n\n const content = Buffer.from(data.content, \"base64\").toString(\"utf-8\");\n let responseText = `📄 **File: ${filePath}**\\n`;\n responseText += `Repository: ${githubInfo.repositoryFullName}\\n`;\n responseText += `Size: ${data.size} bytes\\n`;\n responseText += `URL: ${data.html_url}\\n\\n`;\n responseText += `**Content:**\\n\\`\\`\\`\\n${content}\\n\\`\\`\\``;\n return { content: [{ type: \"text\", text: responseText }] };\n } catch (error: unknown) {\n console.error(\"GitHub get file error:\", error);\n const status = (error as { status?: number })?.status;\n if (status === 404) {\n return {\n content: [{ type: \"text\", text: `❌ File not found: ${filePath}` }],\n };\n }\n const message =\n error instanceof Error ? error.message : \"Unknown error\";\n return {\n content: [\n { type: \"text\", text: `❌ Failed to read file: ${message}` },\n ],\n };\n }\n}\n\nasync function handleListGithubDirectory(input: ListGithubDirectoryArgs) {\n const ctx = authContext!;\n const { projectId, directoryPath, ref } = input;\n\n const githubInfo = await getGithubTokenForProject(projectId, ctx.teamId);\n if (!githubInfo) {\n return {\n content: [\n { type: \"text\", text: \"❌ GitHub not configured for this project.\" },\n ],\n };\n }\n\n try {\n const octokit = new Octokit({ auth: githubInfo.token });\n const normalizedPath =\n !directoryPath || directoryPath === \"/\" ? \"\" : directoryPath;\n\n console.error(\n `📁 Listing directory: ${normalizedPath || \"(root)\"} in ${githubInfo.repositoryFullName}`,\n );\n\n const { data } = await octokit.rest.repos.getContent({\n owner: githubInfo.owner,\n repo: githubInfo.repo,\n path: normalizedPath,\n ref,\n });\n\n if (!Array.isArray(data)) {\n return {\n content: [\n {\n type: \"text\",\n text: `❌ \"${directoryPath}\" is not a directory.`,\n },\n ],\n };\n }\n\n let responseText = `📁 **Directory: ${directoryPath || \"(root)\"}**\\n`;\n responseText += `Repository: ${githubInfo.repositoryFullName}\\n`;\n responseText += `Items: ${data.length}\\n\\n`;\n\n const directories = data.filter((item) => item.type === \"dir\");\n const files = data.filter((item) => item.type === \"file\");\n\n if (directories.length > 0) {\n responseText += `**📁 Directories (${directories.length}):**\\n`;\n for (const dir of directories) responseText += ` - ${dir.name}/\\n`;\n responseText += `\\n`;\n }\n\n if (files.length > 0) {\n responseText += `**📄 Files (${files.length}):**\\n`;\n for (const file of files)\n responseText += ` - ${file.name} (${file.size} bytes)\\n`;\n }\n\n return { content: [{ type: \"text\", text: responseText }] };\n } catch (error: unknown) {\n console.error(\"GitHub list directory error:\", error);\n const status = (error as { status?: number })?.status;\n if (status === 404) {\n return {\n content: [\n { type: \"text\", text: `❌ Directory not found: ${directoryPath}` },\n ],\n };\n }\n const message =\n error instanceof Error ? error.message : \"Unknown error\";\n return {\n content: [\n { type: \"text\", text: `❌ Failed to list directory: ${message}` },\n ],\n };\n }\n}\n\n// ---------------------------------------------------------------------------\n// Resource dispatch\n// ---------------------------------------------------------------------------\n\nserver.setRequestHandler(ReadResourceRequestSchema, async (request) => {\n if (!authContext) {\n return {\n contents: [\n {\n uri: request.params.uri,\n mimeType: \"text/plain\",\n text: \"Error: Not authenticated. API key validation failed.\",\n },\n ],\n };\n }\n\n const ctx = authContext;\n const { uri } = request.params;\n console.error(`📚 Reading resource: ${uri}`);\n\n try {\n switch (uri) {\n case \"tickets://recent\": {\n const teamIds = await getAccessibleTeamIds(ctx.teamId);\n const projectIds = await getAccessibleProjectIds(ctx.userId, ctx.teamId);\n const customerIds = await getAccessibleCustomerIds(ctx.teamId);\n const accessPredicate = buildTicketAccessPredicate(\n teamIds,\n projectIds,\n customerIds,\n );\n\n const rows = await db\n .select({\n id: schema.tickets.id,\n ticketNumber: schema.tickets.ticketNumber,\n title: schema.tickets.title,\n status: schema.tickets.status,\n priority: schema.tickets.priority,\n createdAt: schema.tickets.createdAt,\n })\n .from(schema.tickets)\n .where(and(accessPredicate, eq(schema.tickets.isDeleted, false)))\n .orderBy(desc(schema.tickets.createdAt))\n .limit(20);\n\n return {\n contents: [\n {\n uri,\n mimeType: \"application/json\",\n text: JSON.stringify(rows, null, 2),\n },\n ],\n };\n }\n\n case \"customers://all\": {\n const customerIds = await getAccessibleCustomerIds(ctx.teamId);\n if (customerIds.length === 0) {\n return {\n contents: [\n { uri, mimeType: \"application/json\", text: JSON.stringify([], null, 2) },\n ],\n };\n }\n\n const rows = await db\n .select({\n id: schema.customers.id,\n name: schema.customers.name,\n email: schema.customers.email,\n website: schema.customers.website,\n createdAt: schema.customers.createdAt,\n })\n .from(schema.customers)\n .where(inArray(schema.customers.id, customerIds))\n .orderBy(asc(schema.customers.name))\n .limit(50);\n\n return {\n contents: [\n { uri, mimeType: \"application/json\", text: JSON.stringify(rows, null, 2) },\n ],\n };\n }\n\n case \"projects://active\": {\n const projectIds = await getAccessibleProjectIds(ctx.userId, ctx.teamId);\n if (projectIds.length === 0) {\n return {\n contents: [\n { uri, mimeType: \"application/json\", text: JSON.stringify([], null, 2) },\n ],\n };\n }\n\n // NOTE: previous resource filtered `status = 'active'`, but\n // the `projects` schema no longer has a `status` column. Returning\n // all accessible projects matches the dashboard's behavior.\n const rows = await db\n .select({\n id: schema.projects.id,\n name: schema.projects.name,\n description: schema.projects.description,\n createdAt: schema.projects.createdAt,\n customerId: schema.projects.customerId,\n customerName: schema.customers.name,\n })\n .from(schema.projects)\n .leftJoin(\n schema.customers,\n eq(schema.customers.id, schema.projects.customerId),\n )\n .where(inArray(schema.projects.id, projectIds))\n .orderBy(asc(schema.projects.name))\n .limit(50);\n\n return {\n contents: [\n { uri, mimeType: \"application/json\", text: JSON.stringify(rows, null, 2) },\n ],\n };\n }\n\n default:\n throw new Error(`Unknown resource: ${uri}`);\n }\n } catch (error) {\n console.error(\"❌ Resource read error:\", error);\n return {\n contents: [\n {\n uri,\n mimeType: \"text/plain\",\n text: `Error reading ${uri}: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n },\n ],\n };\n }\n});\n\n// ---------------------------------------------------------------------------\n// Entry point\n// ---------------------------------------------------------------------------\n\nasync function main() {\n console.error(\"🚀 Starting Refront MCP Bridge Server...\");\n console.error(`🔑 API Key: ${apiKey?.substring(0, 10)}...`);\n\n authContext = await validateApiKey(apiKey!);\n if (!authContext) {\n console.error(\n \"❌ API key validation failed. Please check your key and try again.\",\n );\n process.exit(1);\n }\n\n console.error(\n `✅ Authenticated as user ${authContext.userId} in team ${authContext.teamId}`,\n );\n console.error(`📋 Available scopes: ${authContext.scopes.join(\", \")}`);\n console.error(\"📡 MCP Bridge Server ready for connections\");\n\n const transport = new StdioServerTransport();\n await server.connect(transport);\n}\n\nprocess.on(\"SIGINT\", async () => {\n console.error(\"👋 Shutting down MCP Bridge Server...\");\n process.exit(0);\n});\n\nprocess.on(\"SIGTERM\", async () => {\n console.error(\"👋 Shutting down MCP Bridge Server...\");\n process.exit(0);\n});\n\nmain().catch((error) => {\n console.error(\"💥 Fatal error:\", error);\n process.exit(1);\n});\n"]}
1
+ {"version":3,"sources":["../src/db.ts","../src/auth.ts","../src/index.ts","../src/resources.ts","../src/types.ts","../src/tools/definitions.ts","../src/tools/customers.ts","../src/tools/team-resolution.ts","../src/tools/github.ts","../src/tools/hours.ts","../src/tools/projects.ts","../src/tools/session-completion.ts","../src/tools/sessions.ts","../src/tools/teams.ts","../src/tools/ticket-attachments.ts","../src/storage.ts","../src/tools/ticket-access.ts","../src/tools/ticket-comments.ts","../src/tools/tiptap-text.ts","../src/tools/ticket-update.ts","../src/tools/tickets.ts"],"names":["teams","eq","inArray","sql","or","and","teamIds","projectIds","customerIds","asc","desc","ilike","ensureTipTapFormat","authContext"],"mappings":"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","file":"index.js","sourcesContent":["/**\r\n * Drizzle DB singleton + access-control helpers for the MCP bridge.\r\n *\r\n * The bridge runs as a long-lived stdio process started by Cursor/Claude\r\n * Desktop. We open ONE connection pool for the lifetime of the process\r\n * (no per-request `disconnect()`); the OS reclaims it on shutdown.\r\n *\r\n * NOTE for customers: set `DATABASE_PRIMARY_POOLER_URL` (or pass\r\n * `--database-url=...`) before starting the bridge. There is no longer\r\n * a safe public default — these are real Postgres credentials.\r\n */\r\n\r\nimport { createJobDb } from \"@refront/db/job-client\";\r\nimport * as schema from \"@refront/db/schema\";\r\nimport { and, eq, inArray, or, sql } from \"drizzle-orm\";\r\n\r\ntype JobClient = ReturnType<typeof createJobDb>;\r\ntype JobDb = JobClient[\"db\"];\r\n\r\nlet _client: JobClient | null = null;\r\n\r\nfunction getClient(): JobClient {\r\n if (!_client) {\r\n if (!process.env.DATABASE_PRIMARY_POOLER_URL) {\r\n throw new Error(\r\n \"DATABASE_PRIMARY_POOLER_URL is not set. Pass --database-url=... or export the env var before starting the MCP bridge.\",\r\n );\r\n }\r\n _client = createJobDb();\r\n }\r\n return _client;\r\n}\r\n\r\n/** Drizzle DB handle. Lazy because env validation needs to happen after CLI parsing. */\r\nexport const db: JobDb = new Proxy({} as JobDb, {\r\n get(_target, prop) {\r\n const real = getClient().db;\r\n const value = Reflect.get(real, prop, real);\r\n return typeof value === \"function\" ? value.bind(real) : value;\r\n },\r\n});\r\n\r\nexport { schema };\r\n\r\n/**\r\n * Returns the team's own ID plus IDs of all direct child teams.\r\n * Mirrors the previous PostgREST `or(id.eq.X, parent_team_id.eq.X)` query.\r\n */\r\nexport async function getAccessibleTeamIds(teamId: string): Promise<string[]> {\r\n const rows = await db\r\n .select({ id: schema.teams.id })\r\n .from(schema.teams)\r\n .where(\r\n or(eq(schema.teams.id, teamId), eq(schema.teams.parentTeamId, teamId)),\r\n );\r\n\r\n const ids = rows.map((r) => r.id);\r\n return ids.length > 0 ? ids : [teamId];\r\n}\r\n\r\n/**\r\n * Calls the `public.get_accessible_project_ids(user_id, team_id)` SQL\r\n * function. The function encodes the full RLS-style access logic\r\n * (owners + members + shared customer projects) and returns one\r\n * column `project_id`.\r\n */\r\nexport async function getAccessibleProjectIds(\r\n userId: string,\r\n teamId: string,\r\n): Promise<string[]> {\r\n try {\r\n const rows = (await db.execute(\r\n sql`SELECT project_id FROM get_accessible_project_ids(${userId}::uuid, ${teamId}::uuid)`,\r\n )) as unknown as Array<{ project_id: string }>;\r\n return rows.map((r) => r.project_id).filter(Boolean);\r\n } catch (error) {\r\n console.error(\"❌ Error getting accessible project IDs:\", error);\r\n return [];\r\n }\r\n}\r\n\r\n/**\r\n * Returns IDs of customers the team can see: customers it owns\r\n * (across its own team + child teams) plus customers explicitly\r\n * shared via `customer_shared_teams`.\r\n */\r\nexport async function getAccessibleCustomerIds(\r\n teamId: string,\r\n): Promise<string[]> {\r\n const teamIds = await getAccessibleTeamIds(teamId);\r\n\r\n const ownCustomers = await db\r\n .select({ id: schema.customers.id })\r\n .from(schema.customers)\r\n .where(inArray(schema.customers.teamId, teamIds));\r\n\r\n const sharedCustomers = await db\r\n .select({ customerId: schema.customerSharedTeams.customerId })\r\n .from(schema.customerSharedTeams)\r\n .where(eq(schema.customerSharedTeams.teamId, teamId));\r\n\r\n return [\r\n ...new Set([\r\n ...ownCustomers.map((c) => c.id),\r\n ...sharedCustomers.map((c) => c.customerId),\r\n ]),\r\n ];\r\n}\r\n\r\n/**\r\n * Returns the provider teams (workspaces) the user is a direct member of.\r\n * Customer teams (`team_type = 'customer'`) are excluded. Used to power the\r\n * multi-provider `teamId` selection in MCP tools.\r\n */\r\nexport async function getUserProviderTeams(\r\n userId: string,\r\n): Promise<Array<{ id: string; name: string | null }>> {\r\n const rows = await db\r\n .select({\r\n id: schema.teams.id,\r\n name: schema.teams.name,\r\n teamType: schema.teams.teamType,\r\n })\r\n .from(schema.usersOnTeam)\r\n .leftJoin(schema.teams, eq(schema.usersOnTeam.teamId, schema.teams.id))\r\n .where(eq(schema.usersOnTeam.userId, userId));\r\n\r\n const seen = new Set<string>();\r\n const result: Array<{ id: string; name: string | null }> = [];\r\n for (const row of rows) {\r\n if (!row.id || row.teamType === \"customer\" || seen.has(row.id)) continue;\r\n seen.add(row.id);\r\n result.push({ id: row.id, name: row.name });\r\n }\r\n return result;\r\n}\r\n\r\n/** True when the user has a direct `users_on_team` membership for the team. */\r\nexport async function isUserTeamMember(\r\n userId: string,\r\n teamId: string,\r\n): Promise<boolean> {\r\n const [row] = await db\r\n .select({ id: schema.usersOnTeam.id })\r\n .from(schema.usersOnTeam)\r\n .where(\r\n and(\r\n eq(schema.usersOnTeam.userId, userId),\r\n eq(schema.usersOnTeam.teamId, teamId),\r\n ),\r\n )\r\n .limit(1);\r\n return Boolean(row);\r\n}\r\n\r\n/**\r\n * Union of accessible team IDs across every provider team the user belongs to\r\n * (each expanded to its child teams). Used by by-id/session tools so a record\r\n * resolves regardless of which provider it lives in.\r\n */\r\nexport async function getUserAccessibleTeamIds(\r\n userId: string,\r\n): Promise<string[]> {\r\n const teams = await getUserProviderTeams(userId);\r\n const all = new Set<string>();\r\n for (const team of teams) {\r\n const ids = await getAccessibleTeamIds(team.id);\r\n ids.forEach((id) => all.add(id));\r\n }\r\n return [...all];\r\n}\r\n\r\n/** Union of accessible project IDs across all the user's provider teams. */\r\nexport async function getUserAccessibleProjectIds(\r\n userId: string,\r\n): Promise<string[]> {\r\n const teams = await getUserProviderTeams(userId);\r\n const all = new Set<string>();\r\n for (const team of teams) {\r\n const ids = await getAccessibleProjectIds(userId, team.id);\r\n ids.forEach((id) => all.add(id));\r\n }\r\n return [...all];\r\n}\r\n\r\n/** Union of accessible customer IDs across all the user's provider teams. */\r\nexport async function getUserAccessibleCustomerIds(\r\n userId: string,\r\n): Promise<string[]> {\r\n const teams = await getUserProviderTeams(userId);\r\n const all = new Set<string>();\r\n for (const team of teams) {\r\n const ids = await getAccessibleCustomerIds(team.id);\r\n ids.forEach((id) => all.add(id));\r\n }\r\n return [...all];\r\n}\r\n\r\n/**\r\n * Resolves a short `ai-sess-xxxxxxxx` prefix to the full `ai_sessions.id`\r\n * UUID, restricted to teams the caller can see. Returns null if no\r\n * matching session exists.\r\n *\r\n * Legacy MCP tools accept readable IDs (first 8 chars of the UUID);\r\n * we keep that contract by doing the prefix match in SQL via\r\n * `id::text LIKE 'xxxxxxxx%'`.\r\n */\r\nexport async function resolveAiSessionId(\r\n prefix: string,\r\n teamIds: string[],\r\n): Promise<string | null> {\r\n if (teamIds.length === 0) return null;\r\n const rows = await db\r\n .select({ id: schema.aiSessions.id })\r\n .from(schema.aiSessions)\r\n .where(\r\n and(\r\n teamIds.length === 1\r\n ? eq(schema.aiSessions.teamId, teamIds[0]!)\r\n : sql`${schema.aiSessions.teamId} = ANY(${teamIds}::uuid[])`,\r\n sql`${schema.aiSessions.id}::text LIKE ${`${prefix}%`}`,\r\n ),\r\n )\r\n .limit(1);\r\n return rows[0]?.id ?? null;\r\n}\r\n","import { createHash } from \"crypto\";\r\nimport { eq } from \"drizzle-orm\";\r\nimport { db, schema } from \"./db.js\";\r\nimport type { AuthContext } from \"./types.js\";\r\n\r\nexport let authContext: AuthContext | null = null;\r\n\r\nexport function setAuthContext(ctx: AuthContext | null) {\r\n authContext = ctx;\r\n}\r\n\r\nexport async function validateApiKey(key: string): Promise<AuthContext | null> {\r\n if (!key.startsWith(\"mid_\") || key.length !== 68) {\r\n console.error(\"🔑 Invalid API key format\");\r\n return null;\r\n }\r\n\r\n try {\r\n const keyHash = createHash(\"sha256\").update(key).digest(\"hex\");\r\n console.error(`🔍 Validating API key hash: ${keyHash.substring(0, 16)}...`);\r\n\r\n const [apiKeyData] = await db\r\n .select({\r\n id: schema.apiKeys.id,\r\n userId: schema.apiKeys.userId,\r\n teamId: schema.apiKeys.teamId,\r\n scopes: schema.apiKeys.scopes,\r\n lastUsedAt: schema.apiKeys.lastUsedAt,\r\n })\r\n .from(schema.apiKeys)\r\n .where(eq(schema.apiKeys.keyHash, keyHash))\r\n .limit(1);\r\n\r\n if (!apiKeyData) {\r\n console.error(\"❌ API key not found or invalid\");\r\n return null;\r\n }\r\n\r\n await db\r\n .update(schema.apiKeys)\r\n .set({ lastUsedAt: new Date().toISOString() })\r\n .where(eq(schema.apiKeys.id, apiKeyData.id));\r\n\r\n console.error(\r\n `✅ API key validated for user ${apiKeyData.userId} in team ${apiKeyData.teamId}`,\r\n );\r\n\r\n return {\r\n userId: apiKeyData.userId,\r\n teamId: apiKeyData.teamId,\r\n scopes: apiKeyData.scopes ?? [],\r\n };\r\n } catch (error) {\r\n console.error(\"💥 API key validation error:\", error);\r\n return null;\r\n }\r\n}\r\n","#!/usr/bin/env node\r\n\r\n/**\r\n * Refront MCP bridge — stdio MCP server that exposes Refront tickets,\r\n * customers, projects, AI dev sessions and time tracking to AI editors\r\n * (Cursor, Claude Desktop, Windsurf, ...).\r\n *\r\n * This bridge now talks directly to the vanilla Postgres database via\r\n * Drizzle ORM (see `db.ts`). The previous PostgREST/JWT transport\r\n * has been removed; customers must export `DATABASE_PRIMARY_POOLER_URL`\r\n * (or pass `--database-url=...`) before starting the bridge.\r\n */\r\n\r\nimport { Server } from \"@modelcontextprotocol/sdk/server/index.js\";\r\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\r\nimport {\r\n CallToolRequestSchema,\r\n ListResourcesRequestSchema,\r\n ListToolsRequestSchema,\r\n ReadResourceRequestSchema,\r\n} from \"@modelcontextprotocol/sdk/types.js\";\r\nimport { setAuthContext, validateApiKey } from \"./auth.js\";\r\nimport { handleReadResource } from \"./resources.js\";\r\nimport { RESOURCES, TOOLS } from \"./tools/definitions.js\";\r\nimport { handleCreateCustomer, handleGetCustomers } from \"./tools/customers.js\";\r\nimport { handleGetGithubFile, handleListGithubDirectory } from \"./tools/github.js\";\r\nimport { handleLogHours } from \"./tools/hours.js\";\r\nimport { handleCreateProject, handleGetProjects } from \"./tools/projects.js\";\r\nimport {\r\n handleCompleteAiSession,\r\n handleGetCompletionContext,\r\n handleSaveCustomerResponse,\r\n} from \"./tools/session-completion.js\";\r\nimport {\r\n handleAddFollowUpTodos,\r\n handleGetSessionContext,\r\n handleStartAiSession,\r\n handleSyncSessionTodos,\r\n handleTrackManualFollowUp,\r\n handleUpdateSessionStatus,\r\n} from \"./tools/sessions.js\";\r\nimport { handleGetTeams } from \"./tools/teams.js\";\r\nimport { handleGetTicketAttachment } from \"./tools/ticket-attachments.js\";\r\nimport {\r\n handleAddTicketComment,\r\n handleGetTicketComments,\r\n} from \"./tools/ticket-comments.js\";\r\nimport { handleUpdateTicket } from \"./tools/ticket-update.js\";\r\nimport {\r\n handleCreateTicket,\r\n handleGetTicketById,\r\n handleGetTickets,\r\n} from \"./tools/tickets.js\";\r\nimport {\r\n asToolArgs,\r\n type AddFollowUpTodosArgs,\r\n type AddTicketCommentArgs,\r\n type CompleteAiSessionArgs,\r\n type CreateCustomerArgs,\r\n type CreateProjectArgs,\r\n type CreateTicketArgs,\r\n type GetCompletionContextArgs,\r\n type GetCustomersArgs,\r\n type GetGithubFileArgs,\r\n type GetProjectsArgs,\r\n type GetSessionContextArgs,\r\n type GetTicketAttachmentArgs,\r\n type GetTicketByIdArgs,\r\n type GetTicketCommentsArgs,\r\n type GetTicketsArgs,\r\n type ListGithubDirectoryArgs,\r\n type LogHoursArgs,\r\n type SaveCustomerResponseArgs,\r\n type StartAiSessionArgs,\r\n type SyncSessionTodosArgs,\r\n type TrackManualFollowUpArgs,\r\n type UpdateSessionStatusArgs,\r\n type UpdateTicketArgs,\r\n} from \"./types.js\";\r\n\r\n// CLI / env parsing\r\n\r\nconst args = process.argv.slice(2);\r\n\r\nfunction readArg(name: string): string | undefined {\r\n const prefix = `--${name}=`;\r\n const hit = args.find((a) => a.startsWith(prefix));\r\n return hit ? hit.slice(prefix.length) : undefined;\r\n}\r\n\r\nconst apiKey = readArg(\"api-key\") ?? process.env.MG_TICKETS_API_KEY;\r\n\r\nconst databaseUrl =\r\n readArg(\"database-url\") ??\r\n process.env.DATABASE_PRIMARY_POOLER_URL ??\r\n process.env.DATABASE_URL;\r\n\r\nif (!apiKey) {\r\n console.error(\r\n \"❌ API key is required. Use --api-key=your_key or set MG_TICKETS_API_KEY environment variable\",\r\n );\r\n process.exit(1);\r\n}\r\n\r\nif (!databaseUrl) {\r\n console.error(\r\n \"❌ Database URL is required. Use --database-url=postgresql://... or set DATABASE_PRIMARY_POOLER_URL (or DATABASE_URL) environment variable.\",\r\n );\r\n process.exit(1);\r\n}\r\n\r\n// Job DB client reads DATABASE_PRIMARY_POOLER_URL — normalize whichever\r\n// variable the user provided so both work.\r\nprocess.env.DATABASE_PRIMARY_POOLER_URL = databaseUrl;\r\n\r\n// ---------------------------------------------------------------------------\r\n// MCP Server setup\r\n// ---------------------------------------------------------------------------\r\n\r\nconst server = new Server(\r\n {\r\n name: \"mg-tickets-mcp-bridge\",\r\n version: \"3.0.2\",\r\n },\r\n {\r\n capabilities: {\r\n tools: {},\r\n resources: {},\r\n },\r\n },\r\n);\r\n\r\nserver.setRequestHandler(ListToolsRequestSchema, async () => ({ tools: TOOLS }));\r\nserver.setRequestHandler(ListResourcesRequestSchema, async () => ({\r\n resources: RESOURCES,\r\n}));\r\n\r\n// ---------------------------------------------------------------------------\r\n// Tool dispatch\r\n// ---------------------------------------------------------------------------\r\n\r\nserver.setRequestHandler(CallToolRequestSchema, async (request) => {\r\n const { authContext } = await import(\"./auth.js\");\r\n if (!authContext) {\r\n return {\r\n content: [\r\n {\r\n type: \"text\",\r\n text: \"Error: Not authenticated. API key validation failed.\",\r\n },\r\n ],\r\n };\r\n }\r\n\r\n const { name, arguments: toolArgs } = request.params;\r\n console.error(`🛠️ Executing tool: ${name} for team ${authContext.teamId}`);\r\n\r\n try {\r\n switch (name) {\r\n case \"get-teams\":\r\n return await handleGetTeams();\r\n case \"get-tickets\":\r\n return await handleGetTickets(asToolArgs<GetTicketsArgs>(toolArgs));\r\n case \"get-ticket-by-id\":\r\n return await handleGetTicketById(asToolArgs<GetTicketByIdArgs>(toolArgs));\r\n case \"create-ticket\":\r\n return await handleCreateTicket(asToolArgs<CreateTicketArgs>(toolArgs));\r\n case \"update-ticket\":\r\n return await handleUpdateTicket(asToolArgs<UpdateTicketArgs>(toolArgs));\r\n case \"add-ticket-comment\":\r\n return await handleAddTicketComment(\r\n asToolArgs<AddTicketCommentArgs>(toolArgs),\r\n );\r\n case \"get-ticket-comments\":\r\n return await handleGetTicketComments(\r\n asToolArgs<GetTicketCommentsArgs>(toolArgs),\r\n );\r\n case \"get-ticket-attachment\":\r\n return await handleGetTicketAttachment(\r\n asToolArgs<GetTicketAttachmentArgs>(toolArgs),\r\n );\r\n case \"get-customers\":\r\n return await handleGetCustomers(asToolArgs<GetCustomersArgs>(toolArgs));\r\n case \"create-customer\":\r\n return await handleCreateCustomer(asToolArgs<CreateCustomerArgs>(toolArgs));\r\n case \"get-projects\":\r\n return await handleGetProjects(asToolArgs<GetProjectsArgs>(toolArgs));\r\n case \"create-project\":\r\n return await handleCreateProject(asToolArgs<CreateProjectArgs>(toolArgs));\r\n case \"start-ai-session-smart\":\r\n return await handleStartAiSession(\r\n asToolArgs<StartAiSessionArgs>(toolArgs),\r\n );\r\n case \"track-manual-follow-up\":\r\n return await handleTrackManualFollowUp(\r\n asToolArgs<TrackManualFollowUpArgs>(toolArgs),\r\n );\r\n case \"get-session-context\":\r\n return await handleGetSessionContext(\r\n asToolArgs<GetSessionContextArgs>(toolArgs),\r\n );\r\n case \"sync-session-todos\":\r\n return await handleSyncSessionTodos(\r\n asToolArgs<SyncSessionTodosArgs>(toolArgs),\r\n );\r\n case \"add-follow-up-todos\":\r\n return await handleAddFollowUpTodos(\r\n asToolArgs<AddFollowUpTodosArgs>(toolArgs),\r\n );\r\n case \"update-session-status\":\r\n return await handleUpdateSessionStatus(\r\n asToolArgs<UpdateSessionStatusArgs>(toolArgs),\r\n );\r\n case \"get-completion-context\":\r\n return await handleGetCompletionContext(\r\n asToolArgs<GetCompletionContextArgs>(toolArgs),\r\n );\r\n case \"save-customer-response\":\r\n return await handleSaveCustomerResponse(\r\n asToolArgs<SaveCustomerResponseArgs>(toolArgs),\r\n );\r\n case \"complete-ai-session\":\r\n return await handleCompleteAiSession(\r\n asToolArgs<CompleteAiSessionArgs>(toolArgs),\r\n );\r\n case \"log-hours\":\r\n return await handleLogHours(asToolArgs<LogHoursArgs>(toolArgs));\r\n case \"get-github-file\":\r\n return await handleGetGithubFile(asToolArgs<GetGithubFileArgs>(toolArgs));\r\n case \"list-github-directory\":\r\n return await handleListGithubDirectory(\r\n asToolArgs<ListGithubDirectoryArgs>(toolArgs),\r\n );\r\n default:\r\n throw new Error(`Unknown tool: ${name}`);\r\n }\r\n } catch (error: unknown) {\r\n console.error(\"❌ Tool execution error:\", error);\r\n const message =\r\n error instanceof Error\r\n ? error.message\r\n : typeof error === \"string\"\r\n ? error\r\n : JSON.stringify(error);\r\n return {\r\n content: [{ type: \"text\", text: `Error executing ${name}: ${message}` }],\r\n };\r\n }\r\n});\r\n\r\n// ---------------------------------------------------------------------------\r\n// Resource dispatch\r\n// ---------------------------------------------------------------------------\r\n\r\nserver.setRequestHandler(ReadResourceRequestSchema, async (request) => {\r\n return await handleReadResource(request.params.uri);\r\n});\r\n\r\n// ---------------------------------------------------------------------------\r\n// Entry point\r\n// ---------------------------------------------------------------------------\r\n\r\nasync function main() {\r\n console.error(\"🚀 Starting Refront MCP Bridge Server...\");\r\n console.error(`🔑 API Key: ${apiKey?.substring(0, 10)}...`);\r\n\r\n const ctx = await validateApiKey(apiKey!);\r\n if (!ctx) {\r\n console.error(\r\n \"❌ API key validation failed. Please check your key and try again.\",\r\n );\r\n process.exit(1);\r\n }\r\n\r\n setAuthContext(ctx);\r\n\r\n console.error(\r\n `✅ Authenticated as user ${ctx.userId} in team ${ctx.teamId}`,\r\n );\r\n console.error(`📋 Available scopes: ${ctx.scopes.join(\", \")}`);\r\n console.error(\"📡 MCP Bridge Server ready for connections\");\r\n\r\n const transport = new StdioServerTransport();\r\n await server.connect(transport);\r\n}\r\n\r\nprocess.on(\"SIGINT\", async () => {\r\n console.error(\"👋 Shutting down MCP Bridge Server...\");\r\n process.exit(0);\r\n});\r\n\r\nprocess.on(\"SIGTERM\", async () => {\r\n console.error(\"👋 Shutting down MCP Bridge Server...\");\r\n process.exit(0);\r\n});\r\n\r\nmain().catch((error) => {\r\n console.error(\"💥 Fatal error:\", error);\r\n process.exit(1);\r\n});\r\n","import { and, asc, desc, eq, inArray } from \"drizzle-orm\";\r\nimport { authContext } from \"./auth.js\";\r\nimport {\r\n db,\r\n getUserAccessibleCustomerIds,\r\n getUserAccessibleProjectIds,\r\n getUserAccessibleTeamIds,\r\n schema,\r\n} from \"./db.js\";\r\nimport { buildTicketAccessPredicate } from \"./types.js\";\r\n\r\nexport async function handleReadResource(uri: string) {\r\n if (!authContext) {\r\n return {\r\n contents: [\r\n {\r\n uri,\r\n mimeType: \"text/plain\",\r\n text: \"Error: Not authenticated. API key validation failed.\",\r\n },\r\n ],\r\n };\r\n }\r\n\r\n const ctx = authContext;\r\n console.error(`📚 Reading resource: ${uri}`);\r\n\r\n try {\r\n switch (uri) {\r\n case \"tickets://recent\": {\r\n const teamIds = await getUserAccessibleTeamIds(ctx.userId);\r\n const projectIds = await getUserAccessibleProjectIds(ctx.userId);\r\n const customerIds = await getUserAccessibleCustomerIds(ctx.userId);\r\n const accessPredicate = buildTicketAccessPredicate(\r\n teamIds,\r\n projectIds,\r\n customerIds,\r\n );\r\n\r\n const rows = await db\r\n .select({\r\n id: schema.tickets.id,\r\n ticketNumber: schema.tickets.ticketNumber,\r\n title: schema.tickets.title,\r\n status: schema.tickets.status,\r\n priority: schema.tickets.priority,\r\n createdAt: schema.tickets.createdAt,\r\n })\r\n .from(schema.tickets)\r\n .where(and(accessPredicate, eq(schema.tickets.isDeleted, false)))\r\n .orderBy(desc(schema.tickets.createdAt))\r\n .limit(20);\r\n\r\n return {\r\n contents: [\r\n {\r\n uri,\r\n mimeType: \"application/json\",\r\n text: JSON.stringify(rows, null, 2),\r\n },\r\n ],\r\n };\r\n }\r\n\r\n case \"customers://all\": {\r\n const customerIds = await getUserAccessibleCustomerIds(ctx.userId);\r\n if (customerIds.length === 0) {\r\n return {\r\n contents: [\r\n { uri, mimeType: \"application/json\", text: JSON.stringify([], null, 2) },\r\n ],\r\n };\r\n }\r\n\r\n const rows = await db\r\n .select({\r\n id: schema.customers.id,\r\n name: schema.customers.name,\r\n email: schema.customers.email,\r\n website: schema.customers.website,\r\n createdAt: schema.customers.createdAt,\r\n })\r\n .from(schema.customers)\r\n .where(inArray(schema.customers.id, customerIds))\r\n .orderBy(asc(schema.customers.name))\r\n .limit(50);\r\n\r\n return {\r\n contents: [\r\n { uri, mimeType: \"application/json\", text: JSON.stringify(rows, null, 2) },\r\n ],\r\n };\r\n }\r\n\r\n case \"projects://active\": {\r\n const projectIds = await getUserAccessibleProjectIds(ctx.userId);\r\n if (projectIds.length === 0) {\r\n return {\r\n contents: [\r\n { uri, mimeType: \"application/json\", text: JSON.stringify([], null, 2) },\r\n ],\r\n };\r\n }\r\n\r\n // NOTE: previous resource filtered `status = 'active'`, but\r\n // the `projects` schema no longer has a `status` column. Returning\r\n // all accessible projects matches the dashboard's behavior.\r\n const rows = await db\r\n .select({\r\n id: schema.projects.id,\r\n name: schema.projects.name,\r\n description: schema.projects.description,\r\n createdAt: schema.projects.createdAt,\r\n customerId: schema.projects.customerId,\r\n customerName: schema.customers.name,\r\n })\r\n .from(schema.projects)\r\n .leftJoin(\r\n schema.customers,\r\n eq(schema.customers.id, schema.projects.customerId),\r\n )\r\n .where(inArray(schema.projects.id, projectIds))\r\n .orderBy(asc(schema.projects.name))\r\n .limit(50);\r\n\r\n return {\r\n contents: [\r\n { uri, mimeType: \"application/json\", text: JSON.stringify(rows, null, 2) },\r\n ],\r\n };\r\n }\r\n\r\n default:\r\n throw new Error(`Unknown resource: ${uri}`);\r\n }\r\n } catch (error) {\r\n console.error(\"❌ Resource read error:\", error);\r\n return {\r\n contents: [\r\n {\r\n uri,\r\n mimeType: \"text/plain\",\r\n text: `Error reading ${uri}: ${error instanceof Error ? error.message : \"Unknown error\"}`,\r\n },\r\n ],\r\n };\r\n }\r\n}\r\n","import { inArray, or, sql } from \"drizzle-orm\";\r\nimport { schema } from \"./db.js\";\r\n\r\nexport interface AuthContext {\r\n userId: string;\r\n teamId: string;\r\n scopes: string[];\r\n}\r\n\r\nexport type ToolArgs = Record<string, unknown> | undefined;\r\n\r\nexport interface GetTicketsArgs {\r\n teamId?: string;\r\n status?: string;\r\n priority?: string;\r\n projectId?: string;\r\n customerId?: string;\r\n q?: string;\r\n pageSize?: number;\r\n}\r\n\r\nexport interface GetTicketByIdArgs {\r\n id: string;\r\n teamId?: string;\r\n}\r\n\r\nexport interface CreateTicketArgs {\r\n teamId?: string;\r\n title: string;\r\n description?: string;\r\n status?: string;\r\n priority?: string;\r\n type?: string;\r\n projectId?: string;\r\n customerId?: string;\r\n}\r\n\r\nexport interface UpdateTicketArgs {\r\n id: string;\r\n teamId?: string;\r\n title?: string;\r\n description?: string;\r\n status?: string;\r\n priority?: string;\r\n type?: string;\r\n projectId?: string;\r\n customerId?: string;\r\n assigneeId?: string | null;\r\n estimatedHours?: number;\r\n}\r\n\r\nexport interface AddTicketCommentArgs {\r\n ticketId: string;\r\n teamId?: string;\r\n content: string;\r\n isInternal?: boolean;\r\n}\r\n\r\nexport interface GetTicketCommentsArgs {\r\n ticketId: string;\r\n teamId?: string;\r\n}\r\n\r\nexport interface GetTicketAttachmentArgs {\r\n attachmentId: string;\r\n teamId?: string;\r\n}\r\n\r\nexport interface GetCustomersArgs {\r\n teamId?: string;\r\n q?: string;\r\n pageSize?: number;\r\n}\r\n\r\nexport interface CreateCustomerArgs {\r\n teamId?: string;\r\n name: string;\r\n email?: string;\r\n website?: string;\r\n}\r\n\r\nexport interface GetProjectsArgs {\r\n teamId?: string;\r\n customerId?: string;\r\n q?: string;\r\n pageSize?: number;\r\n}\r\n\r\nexport interface CreateProjectArgs {\r\n teamId?: string;\r\n name: string;\r\n description?: string;\r\n customerId?: string;\r\n status?: string;\r\n}\r\n\r\nexport interface StartAiSessionArgs {\r\n teamId?: string;\r\n ticketId: string;\r\n ticketUrl?: string;\r\n cursorSessionId?: string;\r\n totalEstimatedMinutes: number;\r\n complexityScore?: number;\r\n}\r\n\r\nexport interface TrackManualFollowUpArgs {\r\n aiSessionId: string;\r\n teamId?: string;\r\n originalPrompt: string;\r\n aiResponse: string;\r\n developerFollowUp: string;\r\n followUpReason: string;\r\n outcome?: string;\r\n estimatedMinutes: number;\r\n workDescription: string;\r\n}\r\n\r\nexport interface GetSessionContextArgs {\r\n aiSessionId: string;\r\n teamId?: string;\r\n includeTicketData?: boolean;\r\n includeTodoProgress?: boolean;\r\n includeFollowUpHistory?: boolean;\r\n}\r\n\r\nexport interface SessionTodoInput {\r\n todoId?: string;\r\n content: string;\r\n status: string;\r\n estimatedMinutes?: number;\r\n}\r\n\r\nexport interface SyncSessionTodosArgs {\r\n aiSessionId: string;\r\n teamId?: string;\r\n todos: SessionTodoInput[];\r\n replaceAll?: boolean;\r\n}\r\n\r\nexport interface FollowUpTodoInput {\r\n content: string;\r\n status?: string;\r\n estimatedMinutes?: number;\r\n addedInFollowUp?: boolean;\r\n}\r\n\r\nexport interface AddFollowUpTodosArgs {\r\n aiSessionId: string;\r\n teamId?: string;\r\n newTodos: FollowUpTodoInput[];\r\n followUpReason?: string;\r\n}\r\n\r\nexport interface UpdateSessionStatusArgs {\r\n aiSessionId: string;\r\n teamId?: string;\r\n status: string;\r\n actualTimeMinutes?: number;\r\n completionNotes?: string;\r\n}\r\n\r\nexport interface GetCompletionContextArgs {\r\n aiSessionId: string;\r\n teamId?: string;\r\n includeFollowUps?: boolean;\r\n includeTimeMetrics?: boolean;\r\n includeTodos?: boolean;\r\n}\r\n\r\nexport interface SaveCustomerResponseArgs {\r\n aiSessionId: string;\r\n teamId?: string;\r\n customerResponse: string;\r\n responseType?: string;\r\n}\r\n\r\nexport interface CompleteAiSessionArgs {\r\n aiSessionId: string;\r\n teamId?: string;\r\n workCompleted: string[];\r\n technicalSummary?: string;\r\n invoiceDescription?: string;\r\n efficiencyNotes?: string;\r\n}\r\n\r\nexport interface LogHoursArgs {\r\n teamId?: string;\r\n projectId?: string;\r\n ticketId?: string;\r\n aiSessionId?: string;\r\n workDescription: string;\r\n estimatedHours: number;\r\n chatContextSummary?: string;\r\n}\r\n\r\nexport interface GetGithubFileArgs {\r\n teamId?: string;\r\n projectId: string;\r\n filePath: string;\r\n ref?: string;\r\n}\r\n\r\nexport interface ListGithubDirectoryArgs {\r\n teamId?: string;\r\n projectId: string;\r\n directoryPath: string;\r\n ref?: string;\r\n}\r\n\r\nexport function asToolArgs<T>(input: ToolArgs): T {\r\n return (input ?? {}) as T;\r\n}\r\n\r\nexport function roundToNearest15Minutes(minutes: number): number {\r\n if (minutes <= 0) return 0;\r\n return Math.round(minutes / 15) * 15;\r\n}\r\n\r\nexport function buildTicketAccessPredicate(\r\n teamIds: string[],\r\n projectIds: string[],\r\n customerIds: string[],\r\n) {\r\n const branches: ReturnType<typeof inArray>[] = [];\r\n if (teamIds.length > 0) branches.push(inArray(schema.tickets.teamId, teamIds));\r\n if (projectIds.length > 0)\r\n branches.push(inArray(schema.tickets.projectId, projectIds));\r\n if (customerIds.length > 0)\r\n branches.push(inArray(schema.tickets.customerId, customerIds));\r\n if (branches.length === 0) return sql`false`;\r\n if (branches.length === 1) return branches[0]!;\r\n return or(...branches)!;\r\n}\r\n","const teamIdProp = {\r\n type: \"string\",\r\n description:\r\n \"Provider team ID. Optional when you belong to a single provider; required when you belong to several. Call get-teams to list the providers you can act on.\",\r\n} as const;\r\n\r\nexport const TOOLS = [\r\n {\r\n name: \"get-teams\",\r\n description:\r\n \"List the provider teams (workspaces) you can act on. Use a returned id as the `teamId` argument on other tools. Call this when a tool says you belong to multiple providers.\",\r\n inputSchema: {\r\n type: \"object\",\r\n properties: {},\r\n required: [],\r\n },\r\n },\r\n {\r\n name: \"get-tickets\",\r\n description:\r\n \"Get tickets with optional filtering by status, priority, project, customer, or search query\",\r\n inputSchema: {\r\n type: \"object\",\r\n properties: {\r\n teamId: teamIdProp,\r\n status: {\r\n type: \"string\",\r\n enum: [\r\n \"open\",\r\n \"in_progress\",\r\n \"review\",\r\n \"resolved\",\r\n \"closed\",\r\n \"backlog\",\r\n ],\r\n },\r\n priority: {\r\n type: \"string\",\r\n enum: [\"low\", \"medium\", \"high\", \"critical\"],\r\n },\r\n projectId: { type: \"string\" },\r\n customerId: { type: \"string\" },\r\n q: {\r\n type: \"string\",\r\n description: \"Search query for ticket number, title, or description\",\r\n },\r\n pageSize: { type: \"number\", default: 20, maximum: 100 },\r\n },\r\n required: [],\r\n },\r\n },\r\n {\r\n name: \"get-ticket-by-id\",\r\n description:\r\n \"Get a specific ticket by its ID, including comment text and a full attachment listing (with ids). Images from ticket and comment attachments are downloaded and returned inline as base64. For non-image attachments, call get-ticket-attachment with the listed id to get a download URL.\",\r\n inputSchema: {\r\n type: \"object\",\r\n properties: {\r\n teamId: teamIdProp,\r\n id: { type: \"string\", description: \"Ticket ID\" },\r\n },\r\n required: [\"id\"],\r\n },\r\n },\r\n {\r\n name: \"create-ticket\",\r\n description: \"Create a new ticket\",\r\n inputSchema: {\r\n type: \"object\",\r\n properties: {\r\n teamId: teamIdProp,\r\n title: { type: \"string\", description: \"Ticket title\" },\r\n description: { type: \"string\" },\r\n status: {\r\n type: \"string\",\r\n enum: [\r\n \"open\",\r\n \"in_progress\",\r\n \"review\",\r\n \"resolved\",\r\n \"closed\",\r\n \"backlog\",\r\n ],\r\n default: \"open\",\r\n },\r\n priority: {\r\n type: \"string\",\r\n enum: [\"low\", \"medium\", \"high\", \"critical\"],\r\n default: \"medium\",\r\n },\r\n type: {\r\n type: \"string\",\r\n enum: [\r\n \"task\",\r\n \"bug\",\r\n \"feature\",\r\n \"support\",\r\n \"question\",\r\n \"improvement\",\r\n ],\r\n default: \"task\",\r\n },\r\n projectId: { type: \"string\" },\r\n customerId: { type: \"string\" },\r\n },\r\n required: [\"title\"],\r\n },\r\n },\r\n {\r\n name: \"update-ticket\",\r\n description:\r\n \"Update an existing ticket's fields (title, description, status, priority, type, project, customer, assignee, estimated hours). Only provided fields are changed. Changes are written to the ticket activity feed but do NOT send notifications. Set assigneeId to null to unassign; a provided assigneeId must be a member of the ticket's team. Common workflow: set status=in_progress when starting work; after merge/push set status=review and assigneeId to the requester (creator) id from get-ticket-by-id.\",\r\n inputSchema: {\r\n type: \"object\",\r\n properties: {\r\n teamId: teamIdProp,\r\n id: { type: \"string\", description: \"Ticket ID\" },\r\n title: { type: \"string\" },\r\n description: {\r\n type: \"string\",\r\n description: \"Plain text or TipTap JSON; plain text is converted.\",\r\n },\r\n status: {\r\n type: \"string\",\r\n enum: [\r\n \"open\",\r\n \"in_progress\",\r\n \"review\",\r\n \"resolved\",\r\n \"closed\",\r\n \"backlog\",\r\n ],\r\n },\r\n priority: {\r\n type: \"string\",\r\n enum: [\"low\", \"medium\", \"high\", \"critical\"],\r\n },\r\n type: {\r\n type: \"string\",\r\n enum: [\r\n \"task\",\r\n \"bug\",\r\n \"feature\",\r\n \"support\",\r\n \"question\",\r\n \"improvement\",\r\n ],\r\n },\r\n projectId: { type: \"string\" },\r\n customerId: { type: \"string\" },\r\n assigneeId: {\r\n type: [\"string\", \"null\"],\r\n description: \"User ID to assign, or null to unassign.\",\r\n },\r\n estimatedHours: { type: \"number\" },\r\n },\r\n required: [\"id\"],\r\n },\r\n },\r\n {\r\n name: \"add-ticket-comment\",\r\n description:\r\n \"Add a comment to a ticket. Content can be plain text or TipTap JSON. Set isInternal=true for an internal-only note. The comment appears in the ticket activity feed but does NOT send notifications or trigger @mention routing.\",\r\n inputSchema: {\r\n type: \"object\",\r\n properties: {\r\n teamId: teamIdProp,\r\n ticketId: { type: \"string\", description: \"Ticket ID\" },\r\n content: { type: \"string\", description: \"Comment body\" },\r\n isInternal: { type: \"boolean\", default: false },\r\n },\r\n required: [\"ticketId\", \"content\"],\r\n },\r\n },\r\n {\r\n name: \"get-ticket-comments\",\r\n description:\r\n \"Get all comments for a ticket, rendered as plain text with author, internal flag, and timestamp.\",\r\n inputSchema: {\r\n type: \"object\",\r\n properties: {\r\n teamId: teamIdProp,\r\n ticketId: { type: \"string\", description: \"Ticket ID\" },\r\n },\r\n required: [\"ticketId\"],\r\n },\r\n },\r\n {\r\n name: \"get-ticket-attachment\",\r\n description:\r\n \"Get a temporary signed download URL (valid 1 hour) for any ticket or comment attachment by its id. Works for any file type (PDF, docx, zip, images). Find attachment ids via get-ticket-by-id.\",\r\n inputSchema: {\r\n type: \"object\",\r\n properties: {\r\n teamId: teamIdProp,\r\n attachmentId: {\r\n type: \"string\",\r\n description: \"Attachment ID (ticket or comment attachment)\",\r\n },\r\n },\r\n required: [\"attachmentId\"],\r\n },\r\n },\r\n {\r\n name: \"get-customers\",\r\n description: \"Get customers with optional search\",\r\n inputSchema: {\r\n type: \"object\",\r\n properties: {\r\n teamId: teamIdProp,\r\n q: {\r\n type: \"string\",\r\n description: \"Search query for customer name or email\",\r\n },\r\n pageSize: { type: \"number\", default: 20, maximum: 100 },\r\n },\r\n required: [],\r\n },\r\n },\r\n {\r\n name: \"create-customer\",\r\n description: \"Create a new customer\",\r\n inputSchema: {\r\n type: \"object\",\r\n properties: {\r\n teamId: teamIdProp,\r\n name: { type: \"string\", description: \"Customer name\" },\r\n email: { type: \"string\" },\r\n website: { type: \"string\" },\r\n },\r\n required: [\"name\"],\r\n },\r\n },\r\n {\r\n name: \"get-projects\",\r\n description: \"Get projects with optional filtering\",\r\n inputSchema: {\r\n type: \"object\",\r\n properties: {\r\n teamId: teamIdProp,\r\n customerId: { type: \"string\", description: \"Filter by customer ID\" },\r\n q: { type: \"string\", description: \"Search query for project name\" },\r\n pageSize: { type: \"number\", default: 20, maximum: 100 },\r\n },\r\n required: [],\r\n },\r\n },\r\n {\r\n name: \"create-project\",\r\n description: \"Create a new project\",\r\n inputSchema: {\r\n type: \"object\",\r\n properties: {\r\n teamId: teamIdProp,\r\n name: { type: \"string\", description: \"Project name\" },\r\n description: { type: \"string\" },\r\n customerId: { type: \"string\" },\r\n status: {\r\n type: \"string\",\r\n enum: [\"active\", \"on_hold\", \"completed\", \"cancelled\"],\r\n default: \"active\",\r\n },\r\n },\r\n required: [\"name\"],\r\n },\r\n },\r\n {\r\n name: \"start-ai-session-smart\",\r\n description: \"Start a new AI development session with automatic tracking\",\r\n inputSchema: {\r\n type: \"object\",\r\n properties: {\r\n teamId: teamIdProp,\r\n ticketId: { type: \"string\" },\r\n ticketUrl: { type: \"string\", description: \"URL to the ticket\" },\r\n cursorSessionId: {\r\n type: \"string\",\r\n description: \"Cursor session identifier\",\r\n },\r\n totalEstimatedMinutes: {\r\n type: \"number\",\r\n description:\r\n \"Total estimated time in minutes (senior dev WITHOUT AI, rounded to 15 min)\",\r\n },\r\n complexityScore: {\r\n type: \"number\",\r\n minimum: 1,\r\n maximum: 10,\r\n description: \"Estimated complexity from 1-10\",\r\n },\r\n },\r\n required: [\"ticketId\", \"totalEstimatedMinutes\"],\r\n },\r\n },\r\n {\r\n name: \"track-manual-follow-up\",\r\n description: \"Track manual follow-up prompt by developer\",\r\n inputSchema: {\r\n type: \"object\",\r\n properties: {\r\n teamId: teamIdProp,\r\n aiSessionId: { type: \"string\" },\r\n originalPrompt: { type: \"string\" },\r\n aiResponse: { type: \"string\" },\r\n developerFollowUp: { type: \"string\" },\r\n followUpReason: {\r\n type: \"string\",\r\n enum: [\r\n \"incomplete_result\",\r\n \"wrong_approach\",\r\n \"needs_clarification\",\r\n \"error_in_code\",\r\n ],\r\n },\r\n outcome: {\r\n type: \"string\",\r\n enum: [\"success\", \"partial_success\", \"still_failed\"],\r\n default: \"success\",\r\n },\r\n estimatedMinutes: {\r\n type: \"number\",\r\n description:\r\n \"Estimated time needed for this follow-up work (think as senior dev WITHOUT AI, in minutes)\",\r\n },\r\n workDescription: {\r\n type: \"string\",\r\n description:\r\n \"Detailed work description generated by AI (2-3 sentences, summarizing all work done in session including follow-ups)\",\r\n },\r\n },\r\n required: [\r\n \"aiSessionId\",\r\n \"originalPrompt\",\r\n \"aiResponse\",\r\n \"developerFollowUp\",\r\n \"followUpReason\",\r\n \"estimatedMinutes\",\r\n \"workDescription\",\r\n ],\r\n },\r\n },\r\n {\r\n name: \"get-session-context\",\r\n description: \"Get current session context for follow-up continuity\",\r\n inputSchema: {\r\n type: \"object\",\r\n properties: {\r\n teamId: teamIdProp,\r\n aiSessionId: { type: \"string\" },\r\n includeTicketData: { type: \"boolean\", default: true },\r\n includeTodoProgress: { type: \"boolean\", default: true },\r\n includeFollowUpHistory: { type: \"boolean\", default: false },\r\n },\r\n required: [\"aiSessionId\"],\r\n },\r\n },\r\n {\r\n name: \"sync-session-todos\",\r\n description:\r\n \"Synchronize todo list with AI session (replace existing) or add new todos\",\r\n inputSchema: {\r\n type: \"object\",\r\n properties: {\r\n teamId: teamIdProp,\r\n aiSessionId: { type: \"string\" },\r\n todos: {\r\n type: \"array\",\r\n items: {\r\n type: \"object\",\r\n properties: {\r\n todoId: {\r\n type: \"string\",\r\n description: \"Optional external todo ID for tracking\",\r\n },\r\n content: { type: \"string\" },\r\n status: {\r\n type: \"string\",\r\n enum: [\"pending\", \"in_progress\", \"completed\", \"cancelled\"],\r\n },\r\n estimatedMinutes: { type: \"number\" },\r\n },\r\n required: [\"content\", \"status\"],\r\n },\r\n },\r\n replaceAll: {\r\n type: \"boolean\",\r\n default: true,\r\n description:\r\n \"If true, replace all existing todos. If false, add new todos to existing ones\",\r\n },\r\n },\r\n required: [\"aiSessionId\", \"todos\"],\r\n },\r\n },\r\n {\r\n name: \"add-follow-up-todos\",\r\n description:\r\n \"Add new todos from follow-up (without replacing existing ones)\",\r\n inputSchema: {\r\n type: \"object\",\r\n properties: {\r\n teamId: teamIdProp,\r\n aiSessionId: { type: \"string\" },\r\n newTodos: {\r\n type: \"array\",\r\n items: {\r\n type: \"object\",\r\n properties: {\r\n content: { type: \"string\" },\r\n status: {\r\n type: \"string\",\r\n enum: [\"pending\", \"in_progress\"],\r\n default: \"pending\",\r\n },\r\n estimatedMinutes: { type: \"number\" },\r\n addedInFollowUp: { type: \"boolean\", default: true },\r\n },\r\n required: [\"content\"],\r\n },\r\n },\r\n followUpReason: {\r\n type: \"string\",\r\n description: \"Why were these todos added in follow-up\",\r\n },\r\n },\r\n required: [\"aiSessionId\", \"newTodos\"],\r\n },\r\n },\r\n {\r\n name: \"update-session-status\",\r\n description: \"Update AI session status and completion info\",\r\n inputSchema: {\r\n type: \"object\",\r\n properties: {\r\n teamId: teamIdProp,\r\n aiSessionId: { type: \"string\" },\r\n status: {\r\n type: \"string\",\r\n enum: [\"started\", \"in_progress\", \"paused\", \"completed\", \"failed\"],\r\n },\r\n actualTimeMinutes: { type: \"number\" },\r\n completionNotes: { type: \"string\" },\r\n },\r\n required: [\"aiSessionId\", \"status\"],\r\n },\r\n },\r\n {\r\n name: \"get-completion-context\",\r\n description:\r\n \"Get all context needed for Cursor AI to generate customer response\",\r\n inputSchema: {\r\n type: \"object\",\r\n properties: {\r\n teamId: teamIdProp,\r\n aiSessionId: { type: \"string\" },\r\n includeFollowUps: { type: \"boolean\", default: true },\r\n includeTimeMetrics: { type: \"boolean\", default: true },\r\n includeTodos: { type: \"boolean\", default: true },\r\n },\r\n required: [\"aiSessionId\"],\r\n },\r\n },\r\n {\r\n name: \"save-customer-response\",\r\n description: \"Save customer response generated by Cursor AI\",\r\n inputSchema: {\r\n type: \"object\",\r\n properties: {\r\n teamId: teamIdProp,\r\n aiSessionId: { type: \"string\" },\r\n customerResponse: {\r\n type: \"string\",\r\n description: \"Customer response generated by Cursor AI\",\r\n },\r\n responseType: {\r\n type: \"string\",\r\n enum: [\"completion\", \"progress_update\", \"needs_clarification\"],\r\n default: \"completion\",\r\n },\r\n },\r\n required: [\"aiSessionId\", \"customerResponse\"],\r\n },\r\n },\r\n {\r\n name: \"complete-ai-session\",\r\n description:\r\n \"Complete AI session with work summary - time calculated automatically\",\r\n inputSchema: {\r\n type: \"object\",\r\n properties: {\r\n teamId: teamIdProp,\r\n aiSessionId: { type: \"string\" },\r\n workCompleted: {\r\n type: \"array\",\r\n items: { type: \"string\" },\r\n description: \"List of completed tasks/todos in English\",\r\n },\r\n technicalSummary: {\r\n type: \"string\",\r\n description: \"Technical summary of work done in English\",\r\n },\r\n invoiceDescription: {\r\n type: \"string\",\r\n description:\r\n \"Short invoice-friendly description in the language of the ticket (2-3 sentences max, suitable for billing)\",\r\n },\r\n efficiencyNotes: { type: \"string\" },\r\n },\r\n required: [\"aiSessionId\", \"workCompleted\"],\r\n },\r\n },\r\n {\r\n name: \"log-hours\",\r\n description:\r\n \"Analyze current chat conversation and log hours as draft tracker entry. AI analyzes chat context to estimate hours as a senior developer would (without AI assistance). Cursor AI matches workspace name to correct project from list (optional).\",\r\n inputSchema: {\r\n type: \"object\",\r\n properties: {\r\n teamId: teamIdProp,\r\n projectId: {\r\n type: \"string\",\r\n description:\r\n \"Project ID (UUID) - Optional. Cursor AI should call get-projects first to try matching workspace name. If no clear match, omit this field.\",\r\n },\r\n ticketId: {\r\n type: \"string\",\r\n description:\r\n \"Ticket ID (UUID) - Optional. Cursor AI should call get-tickets (filtered by project) to try matching chat context to an open ticket. Only include if a clear match is found.\",\r\n },\r\n aiSessionId: {\r\n type: \"string\",\r\n description:\r\n \"AI Session ID - Optional. If a ticket has an active AI dev session, include this ID to link the hours to that session.\",\r\n },\r\n workDescription: {\r\n type: \"string\",\r\n description:\r\n \"Short description of the work done (for the tracker entry)\",\r\n },\r\n estimatedHours: {\r\n type: \"number\",\r\n description:\r\n \"AI-estimated hours as senior developer would spend WITHOUT AI (e.g., 2.5 for 2.5 hours)\",\r\n },\r\n chatContextSummary: {\r\n type: \"string\",\r\n description:\r\n \"Brief summary of chat context for internal logging (optional)\",\r\n },\r\n },\r\n required: [\"workDescription\", \"estimatedHours\"],\r\n },\r\n },\r\n {\r\n name: \"get-github-file\",\r\n description:\r\n \"Get the contents of a specific file from a GitHub repository. Use this after finding relevant files to read their full content.\",\r\n inputSchema: {\r\n type: \"object\",\r\n properties: {\r\n teamId: teamIdProp,\r\n projectId: { type: \"string\", description: \"Project ID (UUID)\" },\r\n filePath: {\r\n type: \"string\",\r\n description:\r\n 'Full path to the file in the repository (e.g., \"src/components/Button.tsx\")',\r\n },\r\n ref: {\r\n type: \"string\",\r\n description:\r\n \"Optional: Git reference (branch, tag, or commit SHA). Defaults to repository default branch.\",\r\n },\r\n },\r\n required: [\"projectId\", \"filePath\"],\r\n },\r\n },\r\n {\r\n name: \"list-github-directory\",\r\n description:\r\n \"List files and directories in a GitHub repository directory. Use this to explore repository structure.\",\r\n inputSchema: {\r\n type: \"object\",\r\n properties: {\r\n teamId: teamIdProp,\r\n projectId: { type: \"string\", description: \"Project ID (UUID)\" },\r\n directoryPath: {\r\n type: \"string\",\r\n description:\r\n 'Path to directory (e.g., \"src/components\"). Use empty string or \"/\" for root directory.',\r\n },\r\n ref: {\r\n type: \"string\",\r\n description:\r\n \"Optional: Git reference (branch, tag, or commit SHA). Defaults to repository default branch.\",\r\n },\r\n },\r\n required: [\"projectId\", \"directoryPath\"],\r\n },\r\n },\r\n];\r\n\r\nexport const RESOURCES = [\r\n {\r\n uri: \"tickets://recent\",\r\n name: \"Recent Tickets\",\r\n description: \"Most recently created tickets\",\r\n mimeType: \"application/json\",\r\n },\r\n {\r\n uri: \"customers://all\",\r\n name: \"All Customers\",\r\n description: \"Complete customer directory\",\r\n mimeType: \"application/json\",\r\n },\r\n {\r\n uri: \"projects://active\",\r\n name: \"Active Projects\",\r\n description: \"Currently active projects\",\r\n mimeType: \"application/json\",\r\n },\r\n];\r\n","import { and, asc, ilike, inArray, or } from \"drizzle-orm\";\r\nimport { db, getAccessibleCustomerIds, schema } from \"../db.js\";\r\nimport type { CreateCustomerArgs, GetCustomersArgs } from \"../types.js\";\r\nimport { resolveTeamId } from \"./team-resolution.js\";\r\n\r\nexport async function handleGetCustomers(input: GetCustomersArgs) {\r\n const { q, pageSize = 20 } = input;\r\n\r\n const resolved = await resolveTeamId(input.teamId);\r\n if (!resolved.ok) return resolved.response;\r\n\r\n const customerIds = await getAccessibleCustomerIds(resolved.teamId);\r\n if (customerIds.length === 0) {\r\n return {\r\n content: [\r\n {\r\n type: \"text\",\r\n text: \"No customers found or no access to any customers.\",\r\n },\r\n ],\r\n };\r\n }\r\n\r\n const filters = [inArray(schema.customers.id, customerIds)];\r\n if (q) {\r\n const pattern = `%${q}%`;\r\n filters.push(\r\n or(\r\n ilike(schema.customers.name, pattern),\r\n ilike(schema.customers.email, pattern),\r\n )!,\r\n );\r\n }\r\n\r\n const rows = await db\r\n .select({\r\n id: schema.customers.id,\r\n name: schema.customers.name,\r\n email: schema.customers.email,\r\n website: schema.customers.website,\r\n createdAt: schema.customers.createdAt,\r\n })\r\n .from(schema.customers)\r\n .where(and(...filters))\r\n .orderBy(asc(schema.customers.name))\r\n .limit(Math.min(pageSize, 100));\r\n\r\n return {\r\n content: [\r\n {\r\n type: \"text\",\r\n text: `Found ${rows.length} customers:\\n\\n${\r\n rows\r\n .map(\r\n (c) =>\r\n `**${c.name}**\\n` +\r\n `${c.email ? `Email: ${c.email}\\n` : \"\"}` +\r\n `${c.website ? `Website: ${c.website}\\n` : \"\"}` +\r\n `Created: ${new Date(c.createdAt).toLocaleDateString()}\\n`,\r\n )\r\n .join(\"\\n\") || \"No customers found.\"\r\n }`,\r\n },\r\n ],\r\n };\r\n}\r\n\r\nexport async function handleCreateCustomer(input: CreateCustomerArgs) {\r\n const { name, email, website } = input;\r\n\r\n const resolved = await resolveTeamId(input.teamId);\r\n if (!resolved.ok) return resolved.response;\r\n\r\n await db.insert(schema.customers).values({\r\n teamId: resolved.teamId,\r\n name,\r\n email: email ?? \"\",\r\n website: website ?? null,\r\n });\r\n\r\n return {\r\n content: [\r\n {\r\n type: \"text\",\r\n text:\r\n `✅ **Customer Created Successfully!**\\n\\n` +\r\n `Name: ${name}\\n` +\r\n `${email ? `Email: ${email}\\n` : \"\"}` +\r\n `${website ? `Website: ${website}\\n` : \"\"}`,\r\n },\r\n ],\r\n };\r\n}\r\n","import { authContext } from \"../auth.js\";\r\nimport {\r\n getAccessibleCustomerIds,\r\n getAccessibleProjectIds,\r\n getAccessibleTeamIds,\r\n getUserAccessibleCustomerIds,\r\n getUserAccessibleProjectIds,\r\n getUserAccessibleTeamIds,\r\n getUserProviderTeams,\r\n isUserTeamMember,\r\n} from \"../db.js\";\r\n\r\nexport type McpTextResponse = {\r\n content: Array<{ type: \"text\"; text: string }>;\r\n};\r\n\r\nexport type TeamIdResult =\r\n | { ok: true; teamId: string }\r\n | { ok: false; response: McpTextResponse };\r\n\r\nexport type TeamScopeResult =\r\n | { ok: true; teamIds: string[]; projectIds: string[]; customerIds: string[] }\r\n | { ok: false; response: McpTextResponse };\r\n\r\nexport function teamSelectionResponse(\r\n teams: Array<{ id: string; name: string | null }>,\r\n): McpTextResponse {\r\n const list = teams\r\n .map((t) => `- ${t.name ?? \"(unnamed provider)\"} (teamId: ${t.id})`)\r\n .join(\"\\n\");\r\n return {\r\n content: [\r\n {\r\n type: \"text\",\r\n text:\r\n \"You belong to multiple providers, so this action is ambiguous. \" +\r\n \"Re-call this tool with a `teamId` set to the intended provider.\\n\\n\" +\r\n `Available providers:\\n${list}\\n\\n` +\r\n \"Ask the user which provider to use (or infer it from the conversation), \" +\r\n \"then call the tool again with the chosen `teamId`.\",\r\n },\r\n ],\r\n };\r\n}\r\n\r\nexport function notAMemberResponse(teamId: string): McpTextResponse {\r\n return {\r\n content: [\r\n {\r\n type: \"text\",\r\n text:\r\n `Access denied: you are not a member of team ${teamId}. ` +\r\n \"Call `get-teams` to list the providers you can act on.\",\r\n },\r\n ],\r\n };\r\n}\r\n\r\n/**\r\n * Resolve a single effective team for list/create tools.\r\n * - requested -> validate membership -> use it\r\n * - omitted + exactly one provider -> default to it\r\n * - omitted + multiple providers -> needs-selection response\r\n */\r\nexport async function resolveTeamId(\r\n requestedTeamId?: string,\r\n): Promise<TeamIdResult> {\r\n const ctx = authContext!;\r\n\r\n if (requestedTeamId) {\r\n const member = await isUserTeamMember(ctx.userId, requestedTeamId);\r\n if (!member) {\r\n return { ok: false, response: notAMemberResponse(requestedTeamId) };\r\n }\r\n return { ok: true, teamId: requestedTeamId };\r\n }\r\n\r\n const teams = await getUserProviderTeams(ctx.userId);\r\n if (teams.length === 0) {\r\n // Defensive fallback: the key's bound team (user should have >= 1 team).\r\n return { ok: true, teamId: ctx.teamId };\r\n }\r\n if (teams.length === 1) {\r\n return { ok: true, teamId: teams[0]!.id };\r\n }\r\n return { ok: false, response: teamSelectionResponse(teams) };\r\n}\r\n\r\n/**\r\n * Resolve an access scope (team/project/customer IDs) for by-id and session\r\n * tools. When a teamId is provided it is validated and used; when omitted the\r\n * scope spans all the user's provider teams (the id disambiguates the record).\r\n */\r\nexport async function resolveTeamScope(\r\n requestedTeamId?: string,\r\n): Promise<TeamScopeResult> {\r\n const ctx = authContext!;\r\n\r\n if (requestedTeamId) {\r\n const member = await isUserTeamMember(ctx.userId, requestedTeamId);\r\n if (!member) {\r\n return { ok: false, response: notAMemberResponse(requestedTeamId) };\r\n }\r\n const [teamIds, projectIds, customerIds] = await Promise.all([\r\n getAccessibleTeamIds(requestedTeamId),\r\n getAccessibleProjectIds(ctx.userId, requestedTeamId),\r\n getAccessibleCustomerIds(requestedTeamId),\r\n ]);\r\n return { ok: true, teamIds, projectIds, customerIds };\r\n }\r\n\r\n const [teamIds, projectIds, customerIds] = await Promise.all([\r\n getUserAccessibleTeamIds(ctx.userId),\r\n getUserAccessibleProjectIds(ctx.userId),\r\n getUserAccessibleCustomerIds(ctx.userId),\r\n ]);\r\n return { ok: true, teamIds, projectIds, customerIds };\r\n}\r\n","import { Octokit } from \"@octokit/rest\";\r\nimport { and, eq, inArray } from \"drizzle-orm\";\r\nimport { db, schema } from \"../db.js\";\r\nimport type { GetGithubFileArgs, ListGithubDirectoryArgs } from \"../types.js\";\r\nimport { resolveTeamScope } from \"./team-resolution.js\";\r\n\r\nasync function getGithubTokenForProject(\r\n projectId: string,\r\n teamIds: string[],\r\n): Promise<{\r\n token: string;\r\n repositoryFullName: string;\r\n owner: string;\r\n repo: string;\r\n} | null> {\r\n try {\r\n if (teamIds.length === 0) return null;\r\n\r\n const [repoData] = await db\r\n .select({\r\n repositoryFullName: schema.projectGithubRepositories.repositoryFullName,\r\n teamId: schema.projectGithubRepositories.teamId,\r\n })\r\n .from(schema.projectGithubRepositories)\r\n .where(\r\n and(\r\n eq(schema.projectGithubRepositories.projectId, projectId),\r\n inArray(schema.projectGithubRepositories.teamId, teamIds),\r\n ),\r\n )\r\n .limit(1);\r\n\r\n if (!repoData) {\r\n console.error(`No GitHub repository linked to project ${projectId}`);\r\n return null;\r\n }\r\n\r\n const teamId = repoData.teamId;\r\n\r\n const [appData] = await db\r\n .select({ config: schema.apps.config })\r\n .from(schema.apps)\r\n .where(\r\n and(eq(schema.apps.teamId, teamId), eq(schema.apps.appId, \"github\")),\r\n )\r\n .limit(1);\r\n\r\n const accessToken = (appData?.config as { access_token?: string } | null)\r\n ?.access_token;\r\n if (!appData || !accessToken) {\r\n console.error(`GitHub app not connected for team ${teamId}`);\r\n return null;\r\n }\r\n\r\n const repositoryFullName = repoData.repositoryFullName;\r\n const [owner, repo] = repositoryFullName.split(\"/\");\r\n if (!owner || !repo) {\r\n console.error(`Invalid repository full name: ${repositoryFullName}`);\r\n return null;\r\n }\r\n\r\n return { token: accessToken, repositoryFullName, owner, repo };\r\n } catch (error) {\r\n console.error(\"Error getting GitHub token for project:\", error);\r\n return null;\r\n }\r\n}\r\n\r\nexport async function handleGetGithubFile(input: GetGithubFileArgs) {\r\n const { projectId, filePath, ref } = input;\r\n\r\n const scope = await resolveTeamScope(input.teamId);\r\n if (!scope.ok) return scope.response;\r\n\r\n const githubInfo = await getGithubTokenForProject(projectId, scope.teamIds);\r\n if (!githubInfo) {\r\n return {\r\n content: [\r\n { type: \"text\", text: \"❌ GitHub not configured for this project.\" },\r\n ],\r\n };\r\n }\r\n\r\n try {\r\n const octokit = new Octokit({ auth: githubInfo.token });\r\n console.error(\r\n `📄 Reading file: ${filePath} from ${githubInfo.repositoryFullName}`,\r\n );\r\n\r\n const { data } = await octokit.rest.repos.getContent({\r\n owner: githubInfo.owner,\r\n repo: githubInfo.repo,\r\n path: filePath,\r\n ref,\r\n });\r\n\r\n if (Array.isArray(data) || data.type !== \"file\") {\r\n return {\r\n content: [\r\n {\r\n type: \"text\",\r\n text: `❌ \"${filePath}\" is not a file or contains multiple items.`,\r\n },\r\n ],\r\n };\r\n }\r\n\r\n const content = Buffer.from(data.content, \"base64\").toString(\"utf-8\");\r\n let responseText = `📄 **File: ${filePath}**\\n`;\r\n responseText += `Repository: ${githubInfo.repositoryFullName}\\n`;\r\n responseText += `Size: ${data.size} bytes\\n`;\r\n responseText += `URL: ${data.html_url}\\n\\n`;\r\n responseText += `**Content:**\\n\\`\\`\\`\\n${content}\\n\\`\\`\\``;\r\n return { content: [{ type: \"text\", text: responseText }] };\r\n } catch (error: unknown) {\r\n console.error(\"GitHub get file error:\", error);\r\n const status = (error as { status?: number })?.status;\r\n if (status === 404) {\r\n return {\r\n content: [{ type: \"text\", text: `❌ File not found: ${filePath}` }],\r\n };\r\n }\r\n const message =\r\n error instanceof Error ? error.message : \"Unknown error\";\r\n return {\r\n content: [\r\n { type: \"text\", text: `❌ Failed to read file: ${message}` },\r\n ],\r\n };\r\n }\r\n}\r\n\r\nexport async function handleListGithubDirectory(input: ListGithubDirectoryArgs) {\r\n const { projectId, directoryPath, ref } = input;\r\n\r\n const scope = await resolveTeamScope(input.teamId);\r\n if (!scope.ok) return scope.response;\r\n\r\n const githubInfo = await getGithubTokenForProject(projectId, scope.teamIds);\r\n if (!githubInfo) {\r\n return {\r\n content: [\r\n { type: \"text\", text: \"❌ GitHub not configured for this project.\" },\r\n ],\r\n };\r\n }\r\n\r\n try {\r\n const octokit = new Octokit({ auth: githubInfo.token });\r\n const normalizedPath =\r\n !directoryPath || directoryPath === \"/\" ? \"\" : directoryPath;\r\n\r\n console.error(\r\n `📁 Listing directory: ${normalizedPath || \"(root)\"} in ${githubInfo.repositoryFullName}`,\r\n );\r\n\r\n const { data } = await octokit.rest.repos.getContent({\r\n owner: githubInfo.owner,\r\n repo: githubInfo.repo,\r\n path: normalizedPath,\r\n ref,\r\n });\r\n\r\n if (!Array.isArray(data)) {\r\n return {\r\n content: [\r\n {\r\n type: \"text\",\r\n text: `❌ \"${directoryPath}\" is not a directory.`,\r\n },\r\n ],\r\n };\r\n }\r\n\r\n let responseText = `📁 **Directory: ${directoryPath || \"(root)\"}**\\n`;\r\n responseText += `Repository: ${githubInfo.repositoryFullName}\\n`;\r\n responseText += `Items: ${data.length}\\n\\n`;\r\n\r\n const directories = data.filter((item) => item.type === \"dir\");\r\n const files = data.filter((item) => item.type === \"file\");\r\n\r\n if (directories.length > 0) {\r\n responseText += `**📁 Directories (${directories.length}):**\\n`;\r\n for (const dir of directories) responseText += ` - ${dir.name}/\\n`;\r\n responseText += `\\n`;\r\n }\r\n\r\n if (files.length > 0) {\r\n responseText += `**📄 Files (${files.length}):**\\n`;\r\n for (const file of files)\r\n responseText += ` - ${file.name} (${file.size} bytes)\\n`;\r\n }\r\n\r\n return { content: [{ type: \"text\", text: responseText }] };\r\n } catch (error: unknown) {\r\n console.error(\"GitHub list directory error:\", error);\r\n const status = (error as { status?: number })?.status;\r\n if (status === 404) {\r\n return {\r\n content: [\r\n { type: \"text\", text: `❌ Directory not found: ${directoryPath}` },\r\n ],\r\n };\r\n }\r\n const message =\r\n error instanceof Error ? error.message : \"Unknown error\";\r\n return {\r\n content: [\r\n { type: \"text\", text: `❌ Failed to list directory: ${message}` },\r\n ],\r\n };\r\n }\r\n}\r\n","import { and, desc, eq, inArray } from \"drizzle-orm\";\r\nimport { authContext } from \"../auth.js\";\r\nimport { db, schema } from \"../db.js\";\r\nimport type { LogHoursArgs } from \"../types.js\";\r\nimport { resolveTeamId, resolveTeamScope } from \"./team-resolution.js\";\r\n\r\nexport async function handleLogHours(input: LogHoursArgs) {\r\n const ctx = authContext!;\r\n const {\r\n projectId,\r\n ticketId,\r\n aiSessionId,\r\n workDescription,\r\n estimatedHours,\r\n chatContextSummary,\r\n } = input;\r\n\r\n // Access checks span all the user's provider teams (or the requested one),\r\n // so a project/ticket/session resolves regardless of which provider it is in.\r\n const scope = await resolveTeamScope(input.teamId);\r\n if (!scope.ok) return scope.response;\r\n\r\n let project: { id: string; name: string; teamId: string | null } | null =\r\n null;\r\n let ticket: {\r\n id: string;\r\n title: string;\r\n status: string;\r\n teamId: string;\r\n projectId: string | null;\r\n customerId: string | null;\r\n } | null = null;\r\n let aiSession: { id: string; ticketId: string; status: string } | null = null;\r\n\r\n if (projectId) {\r\n if (!scope.projectIds.includes(projectId)) {\r\n throw new Error(\r\n `Project not found or no access: ${projectId}. Please call get-projects first to find the correct project.`,\r\n );\r\n }\r\n const [projectData] = await db\r\n .select({\r\n id: schema.projects.id,\r\n name: schema.projects.name,\r\n teamId: schema.projects.teamId,\r\n })\r\n .from(schema.projects)\r\n .where(eq(schema.projects.id, projectId))\r\n .limit(1);\r\n if (!projectData) throw new Error(`Project not found: ${projectId}.`);\r\n project = projectData;\r\n }\r\n\r\n if (ticketId) {\r\n const [ticketData] = await db\r\n .select({\r\n id: schema.tickets.id,\r\n title: schema.tickets.title,\r\n status: schema.tickets.status,\r\n teamId: schema.tickets.teamId,\r\n projectId: schema.tickets.projectId,\r\n customerId: schema.tickets.customerId,\r\n })\r\n .from(schema.tickets)\r\n .where(eq(schema.tickets.id, ticketId))\r\n .limit(1);\r\n if (!ticketData) {\r\n throw new Error(\r\n `Ticket not found: ${ticketId}. Please call get-tickets first to find the correct ticket.`,\r\n );\r\n }\r\n\r\n let hasAccess = false;\r\n if (scope.teamIds.includes(ticketData.teamId)) hasAccess = true;\r\n if (\r\n !hasAccess &&\r\n ticketData.projectId &&\r\n scope.projectIds.includes(ticketData.projectId)\r\n )\r\n hasAccess = true;\r\n if (\r\n !hasAccess &&\r\n ticketData.customerId &&\r\n scope.customerIds.includes(ticketData.customerId)\r\n )\r\n hasAccess = true;\r\n if (!hasAccess) {\r\n throw new Error(\r\n `No access to ticket: ${ticketId}. Please call get-tickets first to find the correct ticket.`,\r\n );\r\n }\r\n ticket = ticketData;\r\n }\r\n\r\n if (aiSessionId) {\r\n const [sessionData] = await db\r\n .select({\r\n id: schema.aiSessions.id,\r\n ticketId: schema.aiSessions.ticketId,\r\n status: schema.aiSessions.status,\r\n })\r\n .from(schema.aiSessions)\r\n .where(eq(schema.aiSessions.id, aiSessionId))\r\n .limit(1);\r\n if (!sessionData) throw new Error(`AI Session not found: ${aiSessionId}.`);\r\n aiSession = sessionData;\r\n }\r\n\r\n // New entries are owned by the ticket/project's team when known; otherwise\r\n // fall back to the resolved provider (asking to pick when ambiguous).\r\n let insertTeamId = ticket?.teamId ?? project?.teamId ?? null;\r\n if (!insertTeamId) {\r\n const resolved = await resolveTeamId(input.teamId);\r\n if (!resolved.ok) return resolved.response;\r\n insertTeamId = resolved.teamId;\r\n }\r\n\r\n const durationSeconds = Math.round(estimatedHours * 3600);\r\n const now = new Date();\r\n\r\n let agendaEntry: {\r\n id: string;\r\n trackedDuration: number | null;\r\n projectId: string | null;\r\n aiSessionId: string | null;\r\n } | null = null;\r\n let wasUpdated = false;\r\n let consolidatedCount = 0;\r\n\r\n if (aiSession?.id || ticket?.id) {\r\n let existingEntries: Array<{\r\n id: string;\r\n trackedDuration: number | null;\r\n projectId: string | null;\r\n aiSessionId: string | null;\r\n }> = [];\r\n\r\n if (aiSession?.id) {\r\n existingEntries = await db\r\n .select({\r\n id: schema.timesheetEvents.id,\r\n trackedDuration: schema.timesheetEvents.trackedDuration,\r\n projectId: schema.timesheetEvents.projectId,\r\n aiSessionId: schema.timesheetEvents.aiSessionId,\r\n })\r\n .from(schema.timesheetEvents)\r\n .where(\r\n and(\r\n eq(schema.timesheetEvents.status, \"draft\"),\r\n eq(schema.timesheetEvents.userId, ctx.userId),\r\n eq(schema.timesheetEvents.aiSessionId, aiSession.id),\r\n ),\r\n )\r\n .orderBy(desc(schema.timesheetEvents.createdAt));\r\n } else if (ticket?.id) {\r\n const linkedEvents = await db\r\n .select({\r\n timesheetEventId: schema.timesheetEventTickets.timesheetEventId,\r\n })\r\n .from(schema.timesheetEventTickets)\r\n .where(eq(schema.timesheetEventTickets.ticketId, ticket.id));\r\n\r\n const eventIds = linkedEvents.map((e) => e.timesheetEventId);\r\n if (eventIds.length > 0) {\r\n existingEntries = await db\r\n .select({\r\n id: schema.timesheetEvents.id,\r\n trackedDuration: schema.timesheetEvents.trackedDuration,\r\n projectId: schema.timesheetEvents.projectId,\r\n aiSessionId: schema.timesheetEvents.aiSessionId,\r\n })\r\n .from(schema.timesheetEvents)\r\n .where(\r\n and(\r\n inArray(schema.timesheetEvents.id, eventIds),\r\n eq(schema.timesheetEvents.status, \"draft\"),\r\n eq(schema.timesheetEvents.userId, ctx.userId),\r\n ),\r\n )\r\n .orderBy(desc(schema.timesheetEvents.createdAt));\r\n }\r\n }\r\n\r\n if (existingEntries.length > 0) {\r\n const existingEntry = existingEntries[0]!;\r\n\r\n if (existingEntries.length > 1) {\r\n const duplicateIds = existingEntries.slice(1).map((e) => e.id);\r\n await db\r\n .delete(schema.timesheetEvents)\r\n .where(inArray(schema.timesheetEvents.id, duplicateIds));\r\n consolidatedCount = existingEntries.length - 1;\r\n }\r\n\r\n const newDuration =\r\n (existingEntry.trackedDuration ?? 0) + durationSeconds;\r\n const [updated] = await db\r\n .update(schema.timesheetEvents)\r\n .set({\r\n trackedDuration: newDuration,\r\n endTime: now.toISOString(),\r\n title: workDescription,\r\n description: chatContextSummary ?? workDescription,\r\n projectId: project?.id ?? existingEntry.projectId,\r\n })\r\n .where(eq(schema.timesheetEvents.id, existingEntry.id))\r\n .returning({\r\n id: schema.timesheetEvents.id,\r\n trackedDuration: schema.timesheetEvents.trackedDuration,\r\n projectId: schema.timesheetEvents.projectId,\r\n aiSessionId: schema.timesheetEvents.aiSessionId,\r\n });\r\n agendaEntry = updated ?? null;\r\n wasUpdated = true;\r\n }\r\n }\r\n\r\n if (!agendaEntry) {\r\n const startTime = new Date(now.getTime() - durationSeconds * 1000);\r\n const [created] = await db\r\n .insert(schema.timesheetEvents)\r\n .values({\r\n teamId: insertTeamId,\r\n userId: ctx.userId,\r\n projectId: project?.id ?? null,\r\n aiSessionId: aiSession?.id ?? null,\r\n title: workDescription,\r\n description: chatContextSummary ?? workDescription,\r\n startTime: startTime.toISOString(),\r\n endTime: now.toISOString(),\r\n type: \"work\" as never,\r\n status: \"draft\" as never,\r\n allDay: false,\r\n isTracked: true,\r\n trackedDuration: durationSeconds,\r\n })\r\n .returning({\r\n id: schema.timesheetEvents.id,\r\n trackedDuration: schema.timesheetEvents.trackedDuration,\r\n projectId: schema.timesheetEvents.projectId,\r\n aiSessionId: schema.timesheetEvents.aiSessionId,\r\n });\r\n agendaEntry = created ?? null;\r\n\r\n if (agendaEntry && ticket?.id) {\r\n await db\r\n .insert(schema.timesheetEventTickets)\r\n .values({ timesheetEventId: agendaEntry.id, ticketId: ticket.id })\r\n .onConflictDoNothing();\r\n }\r\n }\r\n\r\n if (!agendaEntry) {\r\n throw new Error(`Failed to ${wasUpdated ? \"update\" : \"create\"} time entry`);\r\n }\r\n\r\n let responseText = `⏱️ **Hours ${wasUpdated ? \"Added to Existing Entry\" : \"Logged Successfully\"}!**\\n\\n`;\r\n if (wasUpdated) {\r\n responseText += `🔄 **Updated existing draft entry** (avoiding duplicates)\\n`;\r\n responseText += ` • New total: ${Math.round(((agendaEntry.trackedDuration ?? 0) / 3600) * 10) / 10}h\\n\\n`;\r\n }\r\n if (consolidatedCount > 0) {\r\n responseText += `🧹 **Cleaned up ${consolidatedCount} duplicate entries**\\n\\n`;\r\n }\r\n\r\n responseText += `📋 **Entry Details:**\\n`;\r\n responseText += ` • Project: ${project ? project.name : \"(No project assigned)\"}\\n`;\r\n if (ticket)\r\n responseText += ` • Ticket: ${ticket.title} (${ticket.status})\\n`;\r\n if (aiSession)\r\n responseText += ` • AI Session: ${aiSession.id} (${aiSession.status})\\n`;\r\n responseText += ` • Description: ${workDescription}\\n`;\r\n responseText += ` • ${wasUpdated ? \"Added\" : \"Estimated\"} Hours: ${estimatedHours}h (${Math.floor(estimatedHours)}h ${Math.round((estimatedHours % 1) * 60)}m)\\n`;\r\n responseText += ` • Status: DRAFT (not billed yet)\\n`;\r\n responseText += ` • Entry ID: ${agendaEntry.id}\\n\\n`;\r\n\r\n if (chatContextSummary) {\r\n responseText += `📊 **Work Context:**\\n`;\r\n responseText += `${chatContextSummary.substring(0, 200)}${chatContextSummary.length > 200 ? \"...\" : \"\"}\\n\\n`;\r\n }\r\n\r\n responseText += `✅ Time entry ${wasUpdated ? \"updated\" : \"created\"} and ready for review in the agenda!`;\r\n\r\n return { content: [{ type: \"text\", text: responseText }] };\r\n}\r\n","import { and, asc, eq, ilike, inArray } from \"drizzle-orm\";\r\nimport { authContext } from \"../auth.js\";\r\nimport { db, getAccessibleProjectIds, schema } from \"../db.js\";\r\nimport type { CreateProjectArgs, GetProjectsArgs } from \"../types.js\";\r\nimport { resolveTeamId } from \"./team-resolution.js\";\r\n\r\nexport async function handleGetProjects(input: GetProjectsArgs) {\r\n const ctx = authContext!;\r\n const { customerId, q, pageSize = 20 } = input;\r\n\r\n const resolved = await resolveTeamId(input.teamId);\r\n if (!resolved.ok) return resolved.response;\r\n\r\n const projectIds = await getAccessibleProjectIds(ctx.userId, resolved.teamId);\r\n if (projectIds.length === 0) {\r\n return {\r\n content: [\r\n {\r\n type: \"text\",\r\n text: \"No projects found or no access to any projects.\",\r\n },\r\n ],\r\n };\r\n }\r\n\r\n const filters = [inArray(schema.projects.id, projectIds)];\r\n if (customerId) filters.push(eq(schema.projects.customerId, customerId));\r\n if (q) filters.push(ilike(schema.projects.name, `%${q}%`));\r\n\r\n const rows = await db\r\n .select({\r\n id: schema.projects.id,\r\n name: schema.projects.name,\r\n description: schema.projects.description,\r\n customerId: schema.projects.customerId,\r\n createdAt: schema.projects.createdAt,\r\n })\r\n .from(schema.projects)\r\n .where(and(...filters))\r\n .orderBy(asc(schema.projects.name))\r\n .limit(Math.min(pageSize, 100));\r\n\r\n return {\r\n content: [\r\n {\r\n type: \"text\",\r\n text: `Found ${rows.length} projects:\\n\\n${\r\n rows\r\n .map(\r\n (p) =>\r\n `**${p.name}** (ID: ${p.id})\\n` +\r\n `${p.description ? `Description: ${p.description}\\n` : \"\"}` +\r\n `Created: ${new Date(p.createdAt).toLocaleDateString()}\\n`,\r\n )\r\n .join(\"\\n\") || \"No projects found.\"\r\n }`,\r\n },\r\n ],\r\n };\r\n}\r\n\r\nexport async function handleCreateProject(input: CreateProjectArgs) {\r\n const { name, description, customerId } = input;\r\n // NOTE: previous insert also set `status` and `user_id`, but\r\n // neither column exists on the current `projects` schema (status was\r\n // removed; ownership tracked elsewhere). We silently drop them.\r\n\r\n const resolved = await resolveTeamId(input.teamId);\r\n if (!resolved.ok) return resolved.response;\r\n\r\n await db.insert(schema.projects).values({\r\n teamId: resolved.teamId,\r\n name,\r\n description: description ?? null,\r\n customerId: customerId ?? null,\r\n });\r\n\r\n return {\r\n content: [\r\n {\r\n type: \"text\",\r\n text:\r\n `✅ **Project Created Successfully!**\\n\\n` +\r\n `Name: ${name}\\n` +\r\n `${description ? `Description: ${description}\\n` : \"\"}`,\r\n },\r\n ],\r\n };\r\n}\r\n","import { and, asc, desc, eq, inArray } from \"drizzle-orm\";\r\nimport { authContext } from \"../auth.js\";\r\nimport { db, resolveAiSessionId, schema } from \"../db.js\";\r\nimport type {\r\n CompleteAiSessionArgs,\r\n GetCompletionContextArgs,\r\n SaveCustomerResponseArgs,\r\n} from \"../types.js\";\r\nimport { resolveTeamScope } from \"./team-resolution.js\";\r\n\r\nexport async function handleGetCompletionContext(\r\n input: GetCompletionContextArgs,\r\n) {\r\n const {\r\n aiSessionId,\r\n includeFollowUps = true,\r\n includeTimeMetrics = true,\r\n includeTodos = true,\r\n } = input;\r\n\r\n const scope = await resolveTeamScope(input.teamId);\r\n if (!scope.ok) return scope.response;\r\n\r\n const prefix = aiSessionId.replace(\"ai-sess-\", \"\");\r\n const fullSessionId = await resolveAiSessionId(prefix, scope.teamIds);\r\n if (!fullSessionId) throw new Error(`Session not found: ${aiSessionId}`);\r\n\r\n const [session] = await db\r\n .select({\r\n id: schema.aiSessions.id,\r\n ticketId: schema.aiSessions.ticketId,\r\n aiTimeEstimateMinutes: schema.aiSessions.aiTimeEstimateMinutes,\r\n actualTimeMinutes: schema.aiSessions.actualTimeMinutes,\r\n efficiencyScore: schema.aiSessions.efficiencyScore,\r\n createdAt: schema.aiSessions.createdAt,\r\n completedAt: schema.aiSessions.completedAt,\r\n status: schema.aiSessions.status,\r\n complexityScore: schema.aiSessions.complexityScore,\r\n })\r\n .from(schema.aiSessions)\r\n .where(eq(schema.aiSessions.id, fullSessionId))\r\n .limit(1);\r\n if (!session) throw new Error(`Session not found: ${aiSessionId}`);\r\n\r\n const [ticket] = await db\r\n .select({\r\n ticketNumber: schema.tickets.ticketNumber,\r\n title: schema.tickets.title,\r\n description: schema.tickets.description,\r\n type: schema.tickets.type,\r\n priority: schema.tickets.priority,\r\n })\r\n .from(schema.tickets)\r\n .where(eq(schema.tickets.id, session.ticketId))\r\n .limit(1);\r\n if (!ticket) throw new Error(\"Ticket not found for session\");\r\n\r\n const contextData: Record<string, unknown> = {\r\n session: {\r\n id: aiSessionId,\r\n status: session.status,\r\n complexity: session.complexityScore,\r\n createdAt: session.createdAt,\r\n completedAt: session.completedAt,\r\n },\r\n ticket: {\r\n number: ticket.ticketNumber,\r\n title: ticket.title,\r\n description: ticket.description,\r\n type: ticket.type,\r\n priority: ticket.priority,\r\n },\r\n };\r\n\r\n if (includeTimeMetrics) {\r\n const timeSaved =\r\n session.aiTimeEstimateMinutes && session.actualTimeMinutes\r\n ? Math.max(0, session.aiTimeEstimateMinutes - session.actualTimeMinutes)\r\n : null;\r\n\r\n contextData.timeMetrics = {\r\n estimatedMinutes: session.aiTimeEstimateMinutes,\r\n actualMinutes: session.actualTimeMinutes,\r\n timeSaved,\r\n efficiency: session.efficiencyScore,\r\n sessionDuration:\r\n session.completedAt && session.createdAt\r\n ? Math.round(\r\n (new Date(session.completedAt).getTime() -\r\n new Date(session.createdAt).getTime()) /\r\n 60000,\r\n )\r\n : null,\r\n };\r\n }\r\n\r\n if (includeTodos) {\r\n const todos = await db\r\n .select({\r\n content: schema.aiTodos.content,\r\n status: schema.aiTodos.status,\r\n estimatedMinutes: schema.aiTodos.estimatedMinutes,\r\n actualMinutes: schema.aiTodos.actualMinutes,\r\n completedAt: schema.aiTodos.completedAt,\r\n })\r\n .from(schema.aiTodos)\r\n .where(eq(schema.aiTodos.aiSessionId, session.id))\r\n .orderBy(asc(schema.aiTodos.createdAt));\r\n contextData.todos = todos;\r\n }\r\n\r\n if (includeFollowUps) {\r\n const followUps = await db\r\n .select({\r\n followUpReason: schema.manualFollowUps.followUpReason,\r\n outcome: schema.manualFollowUps.outcome,\r\n timeSpentMinutes: schema.manualFollowUps.timeSpentMinutes,\r\n createdAt: schema.manualFollowUps.createdAt,\r\n })\r\n .from(schema.manualFollowUps)\r\n .where(eq(schema.manualFollowUps.aiSessionId, session.id))\r\n .orderBy(asc(schema.manualFollowUps.createdAt));\r\n contextData.followUps = followUps;\r\n }\r\n\r\n const todosLen =\r\n (contextData.todos as Array<{ status: string }> | undefined) ?? [];\r\n const completedTodos = todosLen.filter(\r\n (t) => t.status === \"completed\",\r\n ).length;\r\n const followUpsLen =\r\n (contextData.followUps as unknown[] | undefined)?.length ?? 0;\r\n\r\n return {\r\n content: [\r\n {\r\n type: \"text\",\r\n text:\r\n `📋 **Completion Context Retrieved!**\\n\\n` +\r\n `🎫 **Ticket:** ${ticket.ticketNumber} - ${ticket.title}\\n` +\r\n `🆔 **Session:** ${aiSessionId} (${session.status})\\n` +\r\n `⏱️ **Time:** ${session.actualTimeMinutes || \"N/A\"}/${session.aiTimeEstimateMinutes || \"N/A\"} minutes\\n` +\r\n `📋 **Todos:** ${completedTodos}/${todosLen.length} completed\\n` +\r\n `🔄 **Follow-ups:** ${followUpsLen}\\n\\n` +\r\n `✅ **Full context ready for Cursor AI to generate customer response!**\\n\\n` +\r\n `**Context Data:**\\n\\`\\`\\`json\\n${JSON.stringify(contextData, null, 2)}\\`\\`\\``,\r\n },\r\n ],\r\n };\r\n}\r\n\r\nexport async function handleSaveCustomerResponse(\r\n input: SaveCustomerResponseArgs,\r\n) {\r\n const { aiSessionId, customerResponse, responseType = \"completion\" } = input;\r\n\r\n const scope = await resolveTeamScope(input.teamId);\r\n if (!scope.ok) return scope.response;\r\n\r\n const prefix = aiSessionId.replace(\"ai-sess-\", \"\");\r\n const fullSessionId = await resolveAiSessionId(prefix, scope.teamIds);\r\n if (!fullSessionId) throw new Error(`Session not found: ${aiSessionId}`);\r\n\r\n await db.insert(schema.aiResponses).values({\r\n aiSessionId: fullSessionId,\r\n responseType,\r\n content: customerResponse,\r\n isReadyForCustomer: true,\r\n providerApproved: false,\r\n });\r\n\r\n return {\r\n content: [\r\n {\r\n type: \"text\",\r\n text:\r\n `💾 **Customer Response Saved!**\\n\\n` +\r\n `🆔 Session: ${aiSessionId}\\n` +\r\n `📝 Response Type: ${responseType}\\n` +\r\n `📄 Length: ${customerResponse.length} characters\\n\\n` +\r\n `✅ **Response ready for provider approval**\\n` +\r\n `🔍 Provider can review in AI tab before sending to customer\\n\\n` +\r\n `**Preview:**\\n\\`\\`\\`\\n${customerResponse.substring(0, 200)}${customerResponse.length > 200 ? \"...\" : \"\"}\\`\\`\\``,\r\n },\r\n ],\r\n };\r\n}\r\n\r\nexport async function handleCompleteAiSession(input: CompleteAiSessionArgs) {\r\n const ctx = authContext!;\r\n const {\r\n aiSessionId,\r\n workCompleted,\r\n technicalSummary,\r\n invoiceDescription,\r\n efficiencyNotes,\r\n } = input;\r\n\r\n const scope = await resolveTeamScope(input.teamId);\r\n if (!scope.ok) return scope.response;\r\n\r\n const prefix = aiSessionId.replace(\"ai-sess-\", \"\");\r\n const fullSessionId = await resolveAiSessionId(prefix, scope.teamIds);\r\n if (!fullSessionId) throw new Error(`Session not found: ${aiSessionId}`);\r\n\r\n const [existingSession] = await db\r\n .select({\r\n id: schema.aiSessions.id,\r\n ticketId: schema.aiSessions.ticketId,\r\n aiTimeEstimateMinutes: schema.aiSessions.aiTimeEstimateMinutes,\r\n createdAt: schema.aiSessions.createdAt,\r\n teamId: schema.aiSessions.teamId,\r\n })\r\n .from(schema.aiSessions)\r\n .where(eq(schema.aiSessions.id, fullSessionId))\r\n .limit(1);\r\n if (!existingSession) {\r\n throw new Error(`Session not found: ${aiSessionId}`);\r\n }\r\n\r\n const completionTime = new Date();\r\n const sessionStartTime = new Date(existingSession.createdAt);\r\n const timeSpentMinutes = Math.round(\r\n (completionTime.getTime() - sessionStartTime.getTime()) / 60000,\r\n );\r\n\r\n const [session] = await db\r\n .update(schema.aiSessions)\r\n .set({\r\n status: \"completed\",\r\n actualTimeMinutes: timeSpentMinutes,\r\n completedAt: completionTime.toISOString(),\r\n efficiencyScore: null,\r\n })\r\n .where(eq(schema.aiSessions.id, existingSession.id))\r\n .returning({\r\n id: schema.aiSessions.id,\r\n ticketId: schema.aiSessions.ticketId,\r\n aiTimeEstimateMinutes: schema.aiSessions.aiTimeEstimateMinutes,\r\n createdAt: schema.aiSessions.createdAt,\r\n });\r\n if (!session) throw new Error(`Failed to update session: ${aiSessionId}`);\r\n\r\n const efficiencyScore = session.aiTimeEstimateMinutes\r\n ? timeSpentMinutes / session.aiTimeEstimateMinutes\r\n : 1.0;\r\n\r\n await db\r\n .update(schema.aiSessions)\r\n .set({ efficiencyScore: efficiencyScore.toFixed(2) })\r\n .where(eq(schema.aiSessions.id, session.id));\r\n\r\n const activePhases = await db\r\n .select()\r\n .from(schema.aiTimeLogs)\r\n .where(\r\n and(\r\n eq(schema.aiTimeLogs.aiSessionId, existingSession.id),\r\n eq(schema.aiTimeLogs.status, \"in_progress\"),\r\n ),\r\n );\r\n\r\n for (const phase of activePhases) {\r\n const duration = Math.round(\r\n (completionTime.getTime() - new Date(phase.startedAt).getTime()) / 1000,\r\n );\r\n await db\r\n .update(schema.aiTimeLogs)\r\n .set({\r\n endedAt: completionTime.toISOString(),\r\n durationSeconds: duration,\r\n status: \"completed\",\r\n })\r\n .where(eq(schema.aiTimeLogs.id, phase.id));\r\n }\r\n\r\n await db\r\n .update(schema.aiTimeLogs)\r\n .set({ status: \"skipped\" })\r\n .where(\r\n and(\r\n eq(schema.aiTimeLogs.aiSessionId, existingSession.id),\r\n eq(schema.aiTimeLogs.status, \"pending\"),\r\n eq(schema.aiTimeLogs.estimatedDurationSeconds, 0),\r\n ),\r\n );\r\n\r\n const sessionDuration = Math.round(\r\n (completionTime.getTime() - new Date(session.createdAt).getTime()) / 60000,\r\n );\r\n\r\n const workSummary = `Completed ${workCompleted.length} tasks including: ${workCompleted\r\n .slice(0, 3)\r\n .join(\", \")}${workCompleted.length > 3 ? \" and more\" : \"\"}.`;\r\n\r\n const [ticketInfo] = await db\r\n .select({\r\n ticketNumber: schema.tickets.ticketNumber,\r\n title: schema.tickets.title,\r\n projectId: schema.tickets.projectId,\r\n })\r\n .from(schema.tickets)\r\n .where(eq(schema.tickets.id, session.ticketId))\r\n .limit(1);\r\n\r\n let completionDescription: string;\r\n if (invoiceDescription) {\r\n completionDescription = `${ticketInfo?.ticketNumber || \"Ticket\"}: ${invoiceDescription}`;\r\n } else {\r\n const workDescription = workCompleted\r\n .map((task, index) => `${index + 1}. ${task}`)\r\n .join(\"\\n\");\r\n completionDescription = `${ticketInfo?.ticketNumber || \"Ticket\"}: ${technicalSummary || workSummary}\\n\\nCompleted work:\\n${workDescription}`;\r\n }\r\n\r\n const estimatedMinutes = session.aiTimeEstimateMinutes ?? timeSpentMinutes;\r\n const sessionStart = new Date(session.createdAt);\r\n const estimatedEnd = new Date(\r\n sessionStart.getTime() + estimatedMinutes * 60000,\r\n );\r\n\r\n const existingAgendaEntries = await db\r\n .select({\r\n id: schema.timesheetEvents.id,\r\n trackedDuration: schema.timesheetEvents.trackedDuration,\r\n })\r\n .from(schema.timesheetEvents)\r\n .where(\r\n and(\r\n eq(schema.timesheetEvents.aiSessionId, session.id),\r\n eq(schema.timesheetEvents.status, \"draft\"),\r\n ),\r\n )\r\n .orderBy(desc(schema.timesheetEvents.createdAt));\r\n\r\n let timesheetEventId: string | null = null;\r\n let wasUpdated = false;\r\n let consolidatedCount = 0;\r\n\r\n const existingAgendaEntry = existingAgendaEntries[0] ?? null;\r\n\r\n if (existingAgendaEntries.length > 1) {\r\n const duplicateIds = existingAgendaEntries.slice(1).map((e) => e.id);\r\n await db\r\n .delete(schema.timesheetEvents)\r\n .where(inArray(schema.timesheetEvents.id, duplicateIds));\r\n consolidatedCount = existingAgendaEntries.length - 1;\r\n }\r\n\r\n try {\r\n if (existingAgendaEntry) {\r\n const [updated] = await db\r\n .update(schema.timesheetEvents)\r\n .set({\r\n title: ticketInfo?.title || \"Development Work\",\r\n description: completionDescription,\r\n endTime: estimatedEnd.toISOString(),\r\n projectId: ticketInfo?.projectId ?? null,\r\n trackedDuration: estimatedMinutes * 60,\r\n })\r\n .where(eq(schema.timesheetEvents.id, existingAgendaEntry.id))\r\n .returning({ id: schema.timesheetEvents.id });\r\n timesheetEventId = updated?.id ?? null;\r\n wasUpdated = true;\r\n } else {\r\n const [created] = await db\r\n .insert(schema.timesheetEvents)\r\n .values({\r\n teamId: existingSession.teamId,\r\n userId: ctx.userId,\r\n title: ticketInfo?.title || \"Development Work\",\r\n description: completionDescription,\r\n startTime: sessionStart.toISOString(),\r\n endTime: estimatedEnd.toISOString(),\r\n projectId: ticketInfo?.projectId ?? null,\r\n aiSessionId: session.id,\r\n type: \"work\" as never,\r\n status: \"draft\" as never,\r\n allDay: false,\r\n isTracked: true,\r\n trackedDuration: estimatedMinutes * 60,\r\n })\r\n .returning({ id: schema.timesheetEvents.id });\r\n timesheetEventId = created?.id ?? null;\r\n }\r\n\r\n if (timesheetEventId && session.ticketId) {\r\n await db\r\n .insert(schema.timesheetEventTickets)\r\n .values({\r\n timesheetEventId,\r\n ticketId: session.ticketId,\r\n })\r\n .onConflictDoNothing();\r\n }\r\n } catch (err) {\r\n console.error(\r\n `⚠️ Failed to ${wasUpdated ? \"update\" : \"create\"} agenda event:`,\r\n err,\r\n );\r\n }\r\n\r\n if (consolidatedCount > 0) {\r\n console.log(\r\n `🧹 Cleaned up ${consolidatedCount} duplicate agenda entries for session ${aiSessionId}`,\r\n );\r\n }\r\n\r\n let responseText = `🎉 **AI Session Completed Successfully!**\\n\\n`;\r\n responseText += `🆔 Session: ${aiSessionId}\\n`;\r\n responseText += `📊 **Performance Summary:**\\n`;\r\n responseText += ` • Tasks Completed: ${workCompleted.length}\\n`;\r\n responseText += ` • Time Spent: ${timeSpentMinutes} minutes\\n`;\r\n responseText += ` • Estimated Time: ${session.aiTimeEstimateMinutes || \"N/A\"} minutes\\n`;\r\n responseText += ` • Efficiency: ${efficiencyScore < 1 ? \"🚀\" : efficiencyScore > 1.5 ? \"⚠️\" : \"⏱️\"} ${(efficiencyScore * 100).toFixed(0)}%\\n`;\r\n responseText += ` • Session Duration: ${sessionDuration} minutes\\n\\n`;\r\n\r\n responseText += `✅ **Work Completed:**\\n`;\r\n workCompleted.forEach((task, index) => {\r\n responseText += `${index + 1}. ${task}\\n`;\r\n });\r\n responseText += `\\n`;\r\n\r\n if (technicalSummary) {\r\n responseText += `🔧 **Technical Summary:**\\n${technicalSummary}\\n\\n`;\r\n }\r\n if (efficiencyNotes) {\r\n responseText += `📈 **Efficiency Notes:**\\n${efficiencyNotes}\\n\\n`;\r\n }\r\n if (timesheetEventId) {\r\n responseText += `📅 **Timetrack Entry ${wasUpdated ? \"Updated\" : \"Created\"}:**\\n`;\r\n responseText += ` • Agenda event ${wasUpdated ? \"updated with final\" : \"created with\"} work summary\\n`;\r\n responseText += ` • Status: DRAFT (requires approval in agenda)\\n`;\r\n responseText += ` • Duration: ${estimatedMinutes} minutes\\n`;\r\n responseText += ` • Period: ${sessionStart.toLocaleString()} - ${completionTime.toLocaleString()}\\n\\n`;\r\n }\r\n\r\n responseText += `📋 **Context for Customer Response:**\\n`;\r\n responseText += ` • Use \"get-completion-context\" to retrieve full context\\n`;\r\n responseText += ` • Generate customer-friendly response based on completed work\\n`;\r\n responseText += ` • Focus on business value and customer benefits\\n\\n`;\r\n responseText += `🎯 **Session archived successfully!**`;\r\n\r\n return { content: [{ type: \"text\", text: responseText }] };\r\n}\r\n","import { and, asc, desc, eq, inArray } from \"drizzle-orm\";\r\nimport { authContext } from \"../auth.js\";\r\nimport { db, resolveAiSessionId, schema } from \"../db.js\";\r\nimport {\r\n type AddFollowUpTodosArgs,\r\n type GetSessionContextArgs,\r\n roundToNearest15Minutes,\r\n type StartAiSessionArgs,\r\n type SyncSessionTodosArgs,\r\n type TrackManualFollowUpArgs,\r\n type UpdateSessionStatusArgs,\r\n} from \"../types.js\";\r\nimport { resolveTeamScope } from \"./team-resolution.js\";\r\n\r\n/**\r\n * Auto-advance an AI session through the canonical phase order\r\n * (analysis → bug_investigation → development → communication),\r\n * skipping any phase with 0 estimated minutes.\r\n */\r\nasync function transitionToNextPhase(\r\n sessionId: string,\r\n currentPhase?: string,\r\n): Promise<void> {\r\n try {\r\n const now = new Date();\r\n const phaseOrder = [\r\n \"analysis\",\r\n \"bug_investigation\",\r\n \"development\",\r\n \"communication\",\r\n ];\r\n\r\n const allPhases = await db\r\n .select()\r\n .from(schema.aiTimeLogs)\r\n .where(eq(schema.aiTimeLogs.aiSessionId, sessionId))\r\n .orderBy(asc(schema.aiTimeLogs.activityType));\r\n\r\n let currentPhaseType = currentPhase;\r\n if (!currentPhaseType) {\r\n const activePhase = allPhases.find((p) => p.status === \"in_progress\");\r\n currentPhaseType = activePhase?.activityType ?? undefined;\r\n }\r\n\r\n if (!currentPhaseType) {\r\n const analysisPhase = allPhases.find(\r\n (p) => p.activityType === \"analysis\",\r\n );\r\n if (\r\n analysisPhase &&\r\n analysisPhase.status === \"pending\" &&\r\n (analysisPhase.estimatedDurationSeconds ?? 0) > 0\r\n ) {\r\n await db\r\n .update(schema.aiTimeLogs)\r\n .set({ status: \"in_progress\", startedAt: now.toISOString() })\r\n .where(eq(schema.aiTimeLogs.id, analysisPhase.id));\r\n console.error(\"✅ Started analysis phase\");\r\n }\r\n return;\r\n }\r\n\r\n const currentPhaseRecord = allPhases.find(\r\n (p) => p.activityType === currentPhaseType && p.status === \"in_progress\",\r\n );\r\n if (currentPhaseRecord) {\r\n const duration = Math.round(\r\n (now.getTime() - new Date(currentPhaseRecord.startedAt).getTime()) /\r\n 1000,\r\n );\r\n await db\r\n .update(schema.aiTimeLogs)\r\n .set({\r\n status: \"completed\",\r\n endedAt: now.toISOString(),\r\n durationSeconds: duration,\r\n })\r\n .where(eq(schema.aiTimeLogs.id, currentPhaseRecord.id));\r\n console.error(`✅ Completed phase: ${currentPhaseType} (${duration}s)`);\r\n }\r\n\r\n const currentIndex = phaseOrder.indexOf(currentPhaseType);\r\n if (currentIndex === -1 || currentIndex === phaseOrder.length - 1) {\r\n console.error(\"No next phase to transition to\");\r\n return;\r\n }\r\n\r\n for (let i = currentIndex + 1; i < phaseOrder.length; i++) {\r\n const nextPhaseType = phaseOrder[i];\r\n const nextPhase = allPhases.find((p) => p.activityType === nextPhaseType);\r\n if (!nextPhase) continue;\r\n\r\n if ((nextPhase.estimatedDurationSeconds ?? 0) === 0) {\r\n await db\r\n .update(schema.aiTimeLogs)\r\n .set({ status: \"skipped\" })\r\n .where(eq(schema.aiTimeLogs.id, nextPhase.id));\r\n console.error(\r\n `⏭️ Skipped phase: ${nextPhaseType} (0 minutes estimated)`,\r\n );\r\n continue;\r\n }\r\n\r\n if (nextPhase.status === \"pending\") {\r\n await db\r\n .update(schema.aiTimeLogs)\r\n .set({ status: \"in_progress\", startedAt: now.toISOString() })\r\n .where(eq(schema.aiTimeLogs.id, nextPhase.id));\r\n console.error(`✅ Started next phase: ${nextPhaseType}`);\r\n return;\r\n }\r\n }\r\n\r\n console.error(\"All remaining phases skipped or completed\");\r\n } catch (error) {\r\n console.error(\"Error transitioning to next phase:\", error);\r\n }\r\n}\r\n\r\nexport async function handleStartAiSession(input: StartAiSessionArgs) {\r\n const ctx = authContext!;\r\n const { ticketId, cursorSessionId, totalEstimatedMinutes, complexityScore } =\r\n input;\r\n\r\n if (!totalEstimatedMinutes) {\r\n throw new Error(\"totalEstimatedMinutes is required\");\r\n }\r\n\r\n const scope = await resolveTeamScope(input.teamId);\r\n if (!scope.ok) return scope.response;\r\n\r\n // The session belongs to the ticket's team; verify the user can access it.\r\n const [ticketRow] = await db\r\n .select({\r\n teamId: schema.tickets.teamId,\r\n projectId: schema.tickets.projectId,\r\n customerId: schema.tickets.customerId,\r\n })\r\n .from(schema.tickets)\r\n .where(eq(schema.tickets.id, ticketId))\r\n .limit(1);\r\n if (!ticketRow) {\r\n throw new Error(\r\n `Ticket not found: ${ticketId}. Call get-tickets to find the correct ticket.`,\r\n );\r\n }\r\n const hasTicketAccess =\r\n scope.teamIds.includes(ticketRow.teamId) ||\r\n (!!ticketRow.projectId && scope.projectIds.includes(ticketRow.projectId)) ||\r\n (!!ticketRow.customerId && scope.customerIds.includes(ticketRow.customerId));\r\n if (!hasTicketAccess) {\r\n throw new Error(`No access to ticket: ${ticketId}.`);\r\n }\r\n const insertTeamId = ticketRow.teamId;\r\n\r\n const roundedMinutes = roundToNearest15Minutes(totalEstimatedMinutes);\r\n const sessionStartTime = new Date();\r\n\r\n const [sessionData] = await db\r\n .insert(schema.aiSessions)\r\n .values({\r\n ticketId,\r\n providerUserId: ctx.userId,\r\n teamId: insertTeamId,\r\n cursorSessionId: cursorSessionId ?? null,\r\n aiTimeEstimateMinutes: roundedMinutes,\r\n complexityScore: complexityScore ?? null,\r\n status: \"in_progress\",\r\n })\r\n .returning({\r\n id: schema.aiSessions.id,\r\n ticketId: schema.aiSessions.ticketId,\r\n cursorSessionId: schema.aiSessions.cursorSessionId,\r\n createdAt: schema.aiSessions.createdAt,\r\n });\r\n\r\n if (!sessionData) {\r\n throw new Error(\"Failed to create AI session\");\r\n }\r\n\r\n const sessionId = `ai-sess-${sessionData.id.substring(0, 8)}`;\r\n\r\n return {\r\n content: [\r\n {\r\n type: \"text\",\r\n text:\r\n `🚀 **AI Session Started!**\\n\\n` +\r\n `🆔 Session ID: **${sessionId}**\\n` +\r\n `🎫 Ticket: ${ticketId}\\n` +\r\n `⏱️ Estimated: ${roundedMinutes} min\\n` +\r\n `${complexityScore ? `🎯 Complexity: ${complexityScore}/10\\n` : \"\"}` +\r\n `📅 Started: ${sessionStartTime.toLocaleString()}\\n\\n` +\r\n `📝 Timetrack entry will be created when you complete the session.`,\r\n },\r\n ],\r\n };\r\n}\r\n\r\nexport async function handleTrackManualFollowUp(\r\n input: TrackManualFollowUpArgs,\r\n) {\r\n const ctx = authContext!;\r\n const {\r\n aiSessionId,\r\n originalPrompt,\r\n aiResponse,\r\n developerFollowUp,\r\n followUpReason,\r\n outcome = \"success\",\r\n estimatedMinutes,\r\n workDescription,\r\n } = input;\r\n\r\n const scope = await resolveTeamScope(input.teamId);\r\n if (!scope.ok) return scope.response;\r\n\r\n const prefix = aiSessionId.replace(\"ai-sess-\", \"\");\r\n const fullSessionId = await resolveAiSessionId(prefix, scope.teamIds);\r\n if (!fullSessionId) {\r\n throw new Error(`Session not found: ${aiSessionId}`);\r\n }\r\n\r\n const [session] = await db\r\n .select({\r\n id: schema.aiSessions.id,\r\n status: schema.aiSessions.status,\r\n createdAt: schema.aiSessions.createdAt,\r\n aiTimeEstimateMinutes: schema.aiSessions.aiTimeEstimateMinutes,\r\n teamId: schema.aiSessions.teamId,\r\n })\r\n .from(schema.aiSessions)\r\n .where(eq(schema.aiSessions.id, fullSessionId))\r\n .limit(1);\r\n if (!session) throw new Error(`Session not found: ${aiSessionId}`);\r\n\r\n const followUpTime = new Date();\r\n const oldEstimate = session.aiTimeEstimateMinutes ?? 60;\r\n const roundedFollowUpMinutes = roundToNearest15Minutes(estimatedMinutes || 0);\r\n const newEstimate = oldEstimate + roundedFollowUpMinutes;\r\n\r\n await db\r\n .update(schema.aiSessions)\r\n .set({\r\n status: \"in_progress\",\r\n aiTimeEstimateMinutes: newEstimate,\r\n })\r\n .where(eq(schema.aiSessions.id, session.id));\r\n\r\n await db.insert(schema.manualFollowUps).values({\r\n aiSessionId: session.id,\r\n developerId: ctx.userId,\r\n teamId: session.teamId,\r\n originalPrompt,\r\n aiResponse,\r\n followUpPrompt: developerFollowUp,\r\n followUpReason,\r\n outcome,\r\n timeSpentMinutes: null,\r\n resolvedAt: outcome === \"success\" ? new Date().toISOString() : null,\r\n });\r\n\r\n await db.insert(schema.aiTimeLogs).values({\r\n aiSessionId: session.id,\r\n activityType: \"debugging\",\r\n description: `Follow-up: ${followUpReason.replace(\"_\", \" \")} - ${outcome}`,\r\n durationSeconds: 0,\r\n productivityScore:\r\n outcome === \"success\" ? 9 : outcome === \"partial_success\" ? 6 : 4,\r\n startedAt: followUpTime.toISOString(),\r\n });\r\n\r\n const sessionStartTime = new Date(session.createdAt);\r\n const totalMinutesElapsed = Math.round(\r\n (followUpTime.getTime() - sessionStartTime.getTime()) / 60000,\r\n );\r\n const currentEfficiency =\r\n totalMinutesElapsed > 0 ? totalMinutesElapsed / newEstimate : 1;\r\n\r\n await db\r\n .update(schema.aiSessions)\r\n .set({\r\n efficiencyScore: currentEfficiency.toFixed(2),\r\n actualTimeMinutes: totalMinutesElapsed,\r\n })\r\n .where(eq(schema.aiSessions.id, session.id));\r\n\r\n const existingEntries = await db\r\n .select({\r\n id: schema.timesheetEvents.id,\r\n trackedDuration: schema.timesheetEvents.trackedDuration,\r\n title: schema.timesheetEvents.title,\r\n description: schema.timesheetEvents.description,\r\n startTime: schema.timesheetEvents.startTime,\r\n })\r\n .from(schema.timesheetEvents)\r\n .where(\r\n and(\r\n eq(schema.timesheetEvents.aiSessionId, session.id),\r\n eq(schema.timesheetEvents.status, \"draft\"),\r\n ),\r\n )\r\n .orderBy(desc(schema.timesheetEvents.createdAt));\r\n\r\n let trackerAction = \"\";\r\n let trackerDetails = \"\";\r\n\r\n let existingEntry = existingEntries[0] ?? null;\r\n\r\n if (existingEntries.length > 1) {\r\n const totalExistingDuration = existingEntries.reduce(\r\n (sum, entry) => sum + (entry.trackedDuration ?? 0),\r\n 0,\r\n );\r\n const duplicateIds = existingEntries.slice(1).map((e) => e.id);\r\n await db\r\n .delete(schema.timesheetEvents)\r\n .where(inArray(schema.timesheetEvents.id, duplicateIds));\r\n\r\n if (\r\n existingEntry &&\r\n totalExistingDuration > (existingEntry.trackedDuration ?? 0)\r\n ) {\r\n await db\r\n .update(schema.timesheetEvents)\r\n .set({ trackedDuration: totalExistingDuration })\r\n .where(eq(schema.timesheetEvents.id, existingEntry.id));\r\n existingEntry = {\r\n ...existingEntry,\r\n trackedDuration: totalExistingDuration,\r\n };\r\n }\r\n trackerAction = `Consolidated ${existingEntries.length} duplicate entries`;\r\n }\r\n\r\n if (existingEntry) {\r\n const newDuration =\r\n (existingEntry.trackedDuration ?? 0) + roundedFollowUpMinutes * 60;\r\n\r\n await db\r\n .update(schema.timesheetEvents)\r\n .set({\r\n trackedDuration: newDuration,\r\n endTime: followUpTime.toISOString(),\r\n title: workDescription,\r\n description: workDescription,\r\n })\r\n .where(eq(schema.timesheetEvents.id, existingEntry.id));\r\n\r\n trackerAction = trackerAction || \"Updated existing tracker\";\r\n trackerDetails =\r\n ` • Total tracked time: ${Math.round(newDuration / 60)} minutes (+${roundedFollowUpMinutes} min)\\n` +\r\n ` • Description: ${workDescription}\\n`;\r\n } else {\r\n const durationSeconds = roundedFollowUpMinutes * 60;\r\n const startTime = new Date(followUpTime.getTime() - durationSeconds * 1000);\r\n\r\n await db.insert(schema.timesheetEvents).values({\r\n teamId: session.teamId,\r\n userId: ctx.userId,\r\n aiSessionId: session.id,\r\n title: workDescription,\r\n description: workDescription,\r\n startTime: startTime.toISOString(),\r\n endTime: followUpTime.toISOString(),\r\n type: \"work\" as never,\r\n status: \"draft\" as never,\r\n allDay: false,\r\n isTracked: true,\r\n trackedDuration: durationSeconds,\r\n });\r\n\r\n trackerAction = \"Created new tracker\";\r\n trackerDetails =\r\n ` • Tracked time: ${roundedFollowUpMinutes} minutes\\n` +\r\n ` • Description: ${workDescription}\\n`;\r\n }\r\n\r\n return {\r\n content: [\r\n {\r\n type: \"text\",\r\n text:\r\n `🔄 **Follow-up Tracked & Session Restarted!**\\n\\n` +\r\n `🆔 Session: ${aiSessionId} (back to active)\\n` +\r\n `🔍 Reason: ${followUpReason.replace(\"_\", \" \")}\\n` +\r\n `✅ Outcome: ${outcome}\\n` +\r\n `\\n📊 **Time Estimate Updated:**\\n` +\r\n ` • Old estimate: ${oldEstimate} minutes\\n` +\r\n ` • Follow-up estimate: +${roundedFollowUpMinutes} minutes (rounded to 15min)\\n` +\r\n ` • New estimate: ${newEstimate} minutes\\n` +\r\n `\\n📈 **Current Progress:**\\n` +\r\n ` • Total time elapsed: ${totalMinutesElapsed} minutes\\n` +\r\n ` • Efficiency: ${currentEfficiency < 1 ? \"🚀 \" : currentEfficiency > 1.5 ? \"⚠️ \" : \"⏱️ \"}${(currentEfficiency * 100).toFixed(0)}%\\n` +\r\n `\\n⏱️ **Tracker Entry: ${trackerAction}**\\n` +\r\n trackerDetails +\r\n `\\n⚡ **Time tracking resumed** - continue with confidence!`,\r\n },\r\n ],\r\n };\r\n}\r\n\r\nexport async function handleGetSessionContext(input: GetSessionContextArgs) {\r\n const {\r\n aiSessionId,\r\n includeTicketData = true,\r\n includeTodoProgress = true,\r\n includeFollowUpHistory = false,\r\n } = input;\r\n\r\n const scope = await resolveTeamScope(input.teamId);\r\n if (!scope.ok) return scope.response;\r\n\r\n const prefix = aiSessionId.replace(\"ai-sess-\", \"\");\r\n const fullSessionId = await resolveAiSessionId(prefix, scope.teamIds);\r\n if (!fullSessionId) throw new Error(`Session not found: ${aiSessionId}`);\r\n\r\n const [session] = await db\r\n .select({\r\n id: schema.aiSessions.id,\r\n ticketId: schema.aiSessions.ticketId,\r\n status: schema.aiSessions.status,\r\n aiTimeEstimateMinutes: schema.aiSessions.aiTimeEstimateMinutes,\r\n actualTimeMinutes: schema.aiSessions.actualTimeMinutes,\r\n complexityScore: schema.aiSessions.complexityScore,\r\n createdAt: schema.aiSessions.createdAt,\r\n cursorSessionId: schema.aiSessions.cursorSessionId,\r\n })\r\n .from(schema.aiSessions)\r\n .where(eq(schema.aiSessions.id, fullSessionId))\r\n .limit(1);\r\n if (!session) throw new Error(`Session not found: ${aiSessionId}`);\r\n\r\n const context: Record<string, unknown> = {\r\n sessionId: aiSessionId,\r\n status: session.status,\r\n timeEstimate: session.aiTimeEstimateMinutes,\r\n actualTime: session.actualTimeMinutes,\r\n complexity: session.complexityScore,\r\n createdAt: session.createdAt,\r\n };\r\n\r\n if (includeTicketData) {\r\n const [ticket] = await db\r\n .select({\r\n id: schema.tickets.id,\r\n ticketNumber: schema.tickets.ticketNumber,\r\n title: schema.tickets.title,\r\n description: schema.tickets.description,\r\n status: schema.tickets.status,\r\n priority: schema.tickets.priority,\r\n type: schema.tickets.type,\r\n })\r\n .from(schema.tickets)\r\n .where(eq(schema.tickets.id, session.ticketId))\r\n .limit(1);\r\n context.ticketData = ticket ?? null;\r\n }\r\n\r\n if (includeTodoProgress) {\r\n const todos = await db\r\n .select({\r\n id: schema.aiTodos.id,\r\n content: schema.aiTodos.content,\r\n status: schema.aiTodos.status,\r\n estimatedMinutes: schema.aiTodos.estimatedMinutes,\r\n actualMinutes: schema.aiTodos.actualMinutes,\r\n })\r\n .from(schema.aiTodos)\r\n .where(eq(schema.aiTodos.aiSessionId, session.id))\r\n .orderBy(asc(schema.aiTodos.sequenceOrder));\r\n\r\n context.todos = todos;\r\n context.todoProgress = {\r\n total: todos.length,\r\n completed: todos.filter((t) => t.status === \"completed\").length,\r\n inProgress: todos.filter((t) => t.status === \"in_progress\").length,\r\n };\r\n }\r\n\r\n if (includeFollowUpHistory) {\r\n const followUps = await db\r\n .select({\r\n followUpReason: schema.manualFollowUps.followUpReason,\r\n outcome: schema.manualFollowUps.outcome,\r\n timeSpentMinutes: schema.manualFollowUps.timeSpentMinutes,\r\n createdAt: schema.manualFollowUps.createdAt,\r\n })\r\n .from(schema.manualFollowUps)\r\n .where(eq(schema.manualFollowUps.aiSessionId, session.id))\r\n .orderBy(asc(schema.manualFollowUps.createdAt));\r\n context.followUpHistory = followUps;\r\n }\r\n\r\n const ticketData = context.ticketData as\r\n | { ticketNumber?: string; title?: string }\r\n | null\r\n | undefined;\r\n const todoProgress = context.todoProgress as\r\n | { total: number; completed: number; inProgress: number }\r\n | undefined;\r\n const followUpHistory = context.followUpHistory as unknown[] | undefined;\r\n\r\n return {\r\n content: [\r\n {\r\n type: \"text\",\r\n text:\r\n `🎯 **Session Context Retrieved**\\n\\n` +\r\n `Session: ${aiSessionId}\\n` +\r\n `Status: ${session.status}\\n` +\r\n `${ticketData ? `Ticket: ${ticketData.ticketNumber} - ${ticketData.title}\\n` : \"\"}` +\r\n `${todoProgress ? `Todo Progress: ${todoProgress.completed}/${todoProgress.total} completed\\n` : \"\"}` +\r\n `${followUpHistory ? `Follow-ups: ${followUpHistory.length}\\n` : \"\"}` +\r\n `\\n📋 Full context preserved for seamless continuation!`,\r\n },\r\n ],\r\n };\r\n}\r\n\r\nexport async function handleSyncSessionTodos(input: SyncSessionTodosArgs) {\r\n const { aiSessionId, todos, replaceAll = true } = input;\r\n\r\n const scope = await resolveTeamScope(input.teamId);\r\n if (!scope.ok) return scope.response;\r\n\r\n const prefix = aiSessionId.replace(\"ai-sess-\", \"\");\r\n const fullSessionId = await resolveAiSessionId(prefix, scope.teamIds);\r\n if (!fullSessionId) throw new Error(`Session not found: ${aiSessionId}`);\r\n\r\n if (replaceAll) {\r\n await db\r\n .delete(schema.aiTodos)\r\n .where(eq(schema.aiTodos.aiSessionId, fullSessionId));\r\n }\r\n\r\n if (todos && todos.length > 0) {\r\n let startSequence = 0;\r\n if (!replaceAll) {\r\n const [maxTodo] = await db\r\n .select({ sequenceOrder: schema.aiTodos.sequenceOrder })\r\n .from(schema.aiTodos)\r\n .where(eq(schema.aiTodos.aiSessionId, fullSessionId))\r\n .orderBy(desc(schema.aiTodos.sequenceOrder))\r\n .limit(1);\r\n startSequence = (maxTodo?.sequenceOrder ?? 0) + 1;\r\n }\r\n\r\n await db.insert(schema.aiTodos).values(\r\n todos.map((todo, index) => ({\r\n aiSessionId: fullSessionId,\r\n content: todo.content,\r\n status: todo.status,\r\n cursorTodoId: todo.todoId ?? null,\r\n estimatedMinutes: todo.estimatedMinutes ?? null,\r\n sequenceOrder: startSequence + index,\r\n })),\r\n );\r\n }\r\n\r\n let phaseTransition: string | null = null;\r\n\r\n const currentTodos = await db\r\n .select({ status: schema.aiTodos.status })\r\n .from(schema.aiTodos)\r\n .where(eq(schema.aiTodos.aiSessionId, fullSessionId));\r\n\r\n if (currentTodos.length > 0) {\r\n const hasInProgress = currentTodos.some((t) => t.status === \"in_progress\");\r\n const allCompleted = currentTodos.every((t) => t.status === \"completed\");\r\n\r\n const [currentPhase] = await db\r\n .select({\r\n activityType: schema.aiTimeLogs.activityType,\r\n status: schema.aiTimeLogs.status,\r\n })\r\n .from(schema.aiTimeLogs)\r\n .where(\r\n and(\r\n eq(schema.aiTimeLogs.aiSessionId, fullSessionId),\r\n eq(schema.aiTimeLogs.status, \"in_progress\"),\r\n ),\r\n )\r\n .limit(1);\r\n\r\n if (hasInProgress && currentPhase?.activityType === \"analysis\") {\r\n await transitionToNextPhase(fullSessionId, \"analysis\");\r\n phaseTransition =\r\n \"Analysis completed → Next phase started (Investigation/Development)\";\r\n }\r\n\r\n if (hasInProgress && currentPhase?.activityType === \"bug_investigation\") {\r\n const completedCount = currentTodos.filter(\r\n (t) => t.status === \"completed\",\r\n ).length;\r\n if (completedCount > 0) {\r\n await transitionToNextPhase(fullSessionId, \"bug_investigation\");\r\n phaseTransition = \"Investigation completed → Development phase started\";\r\n }\r\n }\r\n\r\n if (allCompleted && currentPhase?.activityType === \"development\") {\r\n await transitionToNextPhase(fullSessionId, \"development\");\r\n phaseTransition = \"Development completed → Communication phase started\";\r\n }\r\n }\r\n\r\n return {\r\n content: [\r\n {\r\n type: \"text\",\r\n text:\r\n `✅ **Todos ${replaceAll ? \"Synced\" : \"Added\"} Successfully!**\\n\\n` +\r\n `Session: ${aiSessionId}\\n` +\r\n `${replaceAll ? \"Synced\" : \"Added\"} ${todos?.length || 0} todos\\n` +\r\n `${replaceAll ? \"\" : \"➕ Added to existing todo list\\n\"}` +\r\n `${phaseTransition ? `🔄 Phase Transition: ${phaseTransition}\\n` : \"\"}` +\r\n `\\n📝 Todo list updated and tracked for progress monitoring!`,\r\n },\r\n ],\r\n };\r\n}\r\n\r\nexport async function handleAddFollowUpTodos(input: AddFollowUpTodosArgs) {\r\n const { aiSessionId, newTodos, followUpReason } = input;\r\n\r\n const scope = await resolveTeamScope(input.teamId);\r\n if (!scope.ok) return scope.response;\r\n\r\n const prefix = aiSessionId.replace(\"ai-sess-\", \"\");\r\n const fullSessionId = await resolveAiSessionId(prefix, scope.teamIds);\r\n if (!fullSessionId) throw new Error(`Session not found: ${aiSessionId}`);\r\n\r\n if (newTodos && newTodos.length > 0) {\r\n const [maxTodo] = await db\r\n .select({ sequenceOrder: schema.aiTodos.sequenceOrder })\r\n .from(schema.aiTodos)\r\n .where(eq(schema.aiTodos.aiSessionId, fullSessionId))\r\n .orderBy(desc(schema.aiTodos.sequenceOrder))\r\n .limit(1);\r\n const startSequence = (maxTodo?.sequenceOrder ?? 0) + 1;\r\n\r\n await db.insert(schema.aiTodos).values(\r\n newTodos.map((todo, index) => ({\r\n aiSessionId: fullSessionId,\r\n content: `[Follow-up] ${todo.content}`,\r\n status: todo.status ?? \"pending\",\r\n estimatedMinutes: todo.estimatedMinutes ?? null,\r\n sequenceOrder: startSequence + index,\r\n })),\r\n );\r\n }\r\n\r\n return {\r\n content: [\r\n {\r\n type: \"text\",\r\n text:\r\n `✅ **Follow-up Todos Added Successfully!**\\n\\n` +\r\n `Session: ${aiSessionId}\\n` +\r\n `Added ${newTodos?.length || 0} new todos from follow-up\\n` +\r\n `${followUpReason ? `Reason: ${followUpReason}\\n` : \"\"}` +\r\n `\\n📝 New tasks identified and added to existing workflow!`,\r\n },\r\n ],\r\n };\r\n}\r\n\r\nexport async function handleUpdateSessionStatus(\r\n input: UpdateSessionStatusArgs,\r\n) {\r\n const { aiSessionId, status, actualTimeMinutes, completionNotes } = input;\r\n\r\n const scope = await resolveTeamScope(input.teamId);\r\n if (!scope.ok) return scope.response;\r\n\r\n const prefix = aiSessionId.replace(\"ai-sess-\", \"\");\r\n const fullSessionId = await resolveAiSessionId(prefix, scope.teamIds);\r\n if (!fullSessionId) throw new Error(`Session not found: ${aiSessionId}`);\r\n\r\n await db\r\n .update(schema.aiSessions)\r\n .set({\r\n status,\r\n actualTimeMinutes: actualTimeMinutes ?? null,\r\n completedAt: status === \"completed\" ? new Date().toISOString() : null,\r\n })\r\n .where(eq(schema.aiSessions.id, fullSessionId));\r\n\r\n return {\r\n content: [\r\n {\r\n type: \"text\",\r\n text:\r\n `🎯 **Session Status Updated!**\\n\\n` +\r\n `Session: ${aiSessionId}\\n` +\r\n `Status: ${status}\\n` +\r\n `${actualTimeMinutes ? `Actual Time: ${actualTimeMinutes} minutes\\n` : \"\"}` +\r\n `${status === \"completed\" ? `✅ Session completed successfully!\\n` : \"\"}` +\r\n `${completionNotes ? `Notes: ${completionNotes}\\n` : \"\"}`,\r\n },\r\n ],\r\n };\r\n}\r\n","import { authContext } from \"../auth.js\";\r\nimport { getUserProviderTeams } from \"../db.js\";\r\n\r\nexport async function handleGetTeams() {\r\n const ctx = authContext!;\r\n const teams = await getUserProviderTeams(ctx.userId);\r\n\r\n if (teams.length === 0) {\r\n return {\r\n content: [\r\n {\r\n type: \"text\",\r\n text: \"You are not a member of any provider team.\",\r\n },\r\n ],\r\n };\r\n }\r\n\r\n const list = teams\r\n .map((t) => `- ${t.name ?? \"(unnamed provider)\"} (teamId: ${t.id})`)\r\n .join(\"\\n\");\r\n\r\n return {\r\n content: [\r\n {\r\n type: \"text\",\r\n text:\r\n `You can act on ${teams.length} provider${teams.length === 1 ? \"\" : \"s\"}. ` +\r\n \"Pass the chosen `teamId` to other tools when needed.\\n\\n\" +\r\n `${list}\\n\\n` +\r\n `${JSON.stringify(teams)}`,\r\n },\r\n ],\r\n };\r\n}\r\n","import { eq } from \"drizzle-orm\";\r\nimport { db, schema } from \"../db.js\";\r\nimport { storage } from \"../storage.js\";\r\nimport type { GetTicketAttachmentArgs } from \"../types.js\";\r\nimport { loadAccessibleTicket } from \"./ticket-access.js\";\r\n\r\ntype AttachmentRow = {\r\n ticketId: string;\r\n fileName: string;\r\n fileSize: number;\r\n mimeType: string;\r\n storageKey: string;\r\n source: \"ticket\" | \"comment\";\r\n};\r\n\r\nasync function findAttachment(\r\n attachmentId: string,\r\n): Promise<AttachmentRow | null> {\r\n const [ticketAtt] = await db\r\n .select({\r\n ticketId: schema.ticketAttachments.ticketId,\r\n fileName: schema.ticketAttachments.fileName,\r\n fileSize: schema.ticketAttachments.fileSize,\r\n mimeType: schema.ticketAttachments.mimeType,\r\n storageKey: schema.ticketAttachments.storageKey,\r\n })\r\n .from(schema.ticketAttachments)\r\n .where(eq(schema.ticketAttachments.id, attachmentId))\r\n .limit(1);\r\n if (ticketAtt) return { ...ticketAtt, source: \"ticket\" };\r\n\r\n const [commentAtt] = await db\r\n .select({\r\n ticketId: schema.ticketCommentAttachments.ticketId,\r\n fileName: schema.ticketCommentAttachments.fileName,\r\n fileSize: schema.ticketCommentAttachments.fileSize,\r\n mimeType: schema.ticketCommentAttachments.mimeType,\r\n storageKey: schema.ticketCommentAttachments.storageKey,\r\n })\r\n .from(schema.ticketCommentAttachments)\r\n .where(eq(schema.ticketCommentAttachments.id, attachmentId))\r\n .limit(1);\r\n if (commentAtt) return { ...commentAtt, source: \"comment\" };\r\n\r\n return null;\r\n}\r\n\r\nexport async function handleGetTicketAttachment(\r\n input: GetTicketAttachmentArgs,\r\n) {\r\n const { attachmentId } = input;\r\n\r\n const attachment = await findAttachment(attachmentId);\r\n if (!attachment) {\r\n return {\r\n content: [\r\n {\r\n type: \"text\",\r\n text: `Attachment not found: ${attachmentId}. Use get-ticket-by-id to list attachment ids.`,\r\n },\r\n ],\r\n };\r\n }\r\n\r\n // Reuse ticket access (covers team, shared project, and shared customer).\r\n const access = await loadAccessibleTicket(input.teamId, attachment.ticketId);\r\n if (!access.ok) return access.response;\r\n\r\n let url: string;\r\n try {\r\n const signed = await storage.createSignedUrl({\r\n bucket: \"vault\",\r\n path: attachment.storageKey,\r\n expiresIn: 3600,\r\n });\r\n url = signed.url;\r\n } catch (error) {\r\n return {\r\n content: [\r\n {\r\n type: \"text\",\r\n text: `Failed to create a download URL for attachment ${attachmentId}: ${\r\n error instanceof Error ? error.message : String(error)\r\n }`,\r\n },\r\n ],\r\n };\r\n }\r\n\r\n return {\r\n content: [\r\n {\r\n type: \"text\",\r\n text:\r\n `📎 **${attachment.fileName}**\\n` +\r\n `Type: ${attachment.mimeType}\\n` +\r\n `Size: ${Math.round(attachment.fileSize / 1024)}KB\\n` +\r\n `Source: ${attachment.source} attachment\\n\\n` +\r\n `Download URL (valid for 1 hour):\\n${url}`,\r\n },\r\n ],\r\n };\r\n}\r\n","import { createStorageClient, type StorageClient } from \"@refront/storage\";\r\n\r\n/**\r\n * Singleton R2 storage client for the MCP bridge process.\r\n *\r\n * Replaces the previous storage RPC calls. Lazy-instantiated through a\r\n * Proxy so that a missing R2_* env var only crashes paths that\r\n * actually use storage instead of taking down the bridge on boot.\r\n */\r\nlet _storage: StorageClient | null = null;\r\n\r\nfunction buildClient(): StorageClient {\r\n const endpoint = process.env.R2_ENDPOINT;\r\n const accessKeyId = process.env.R2_ACCESS_KEY_ID;\r\n const secretAccessKey = process.env.R2_SECRET_ACCESS_KEY;\r\n\r\n if (!endpoint || !accessKeyId || !secretAccessKey) {\r\n throw new Error(\r\n \"R2 storage is not configured. Set R2_ENDPOINT, R2_ACCESS_KEY_ID, R2_SECRET_ACCESS_KEY.\",\r\n );\r\n }\r\n\r\n return createStorageClient({\r\n endpoint,\r\n accessKeyId,\r\n secretAccessKey,\r\n publicDomain: process.env.R2_PUBLIC_DOMAIN || undefined,\r\n publicBuckets: [\r\n \"vault\",\r\n \"avatars\",\r\n \"team-logos\",\r\n \"blog-images\",\r\n \"customer-assets\",\r\n ],\r\n });\r\n}\r\n\r\nexport const storage: StorageClient = new Proxy({} as StorageClient, {\r\n get(_target, prop) {\r\n if (!_storage) _storage = buildClient();\r\n return Reflect.get(_storage, prop, _storage);\r\n },\r\n});\r\n","import { eq } from \"drizzle-orm\";\r\nimport { db, schema } from \"../db.js\";\r\nimport { type McpTextResponse, resolveTeamScope } from \"./team-resolution.js\";\r\n\r\nexport type AccessibleTicket = {\r\n id: string;\r\n teamId: string;\r\n projectId: string | null;\r\n customerId: string | null;\r\n ticketNumber: string;\r\n title: string;\r\n status: string;\r\n priority: string;\r\n type: string;\r\n assigneeId: string | null;\r\n};\r\n\r\nexport type TicketAccessResult =\r\n | { ok: true; ticket: AccessibleTicket }\r\n | { ok: false; response: McpTextResponse };\r\n\r\nfunction notFoundResponse(ticketId: string): McpTextResponse {\r\n return {\r\n content: [\r\n {\r\n type: \"text\",\r\n text: `Ticket not found or no access: ${ticketId}. Call get-tickets to find the correct ticket.`,\r\n },\r\n ],\r\n };\r\n}\r\n\r\n/**\r\n * Load a ticket by id and verify the caller can access it within the resolved\r\n * team scope (its own team, an accessible project, or an accessible customer).\r\n * When a teamId is provided it narrows the scope; otherwise the scope spans all\r\n * the user's provider teams (the id disambiguates the record).\r\n */\r\nexport async function loadAccessibleTicket(\r\n requestedTeamId: string | undefined,\r\n ticketId: string,\r\n): Promise<TicketAccessResult> {\r\n const scope = await resolveTeamScope(requestedTeamId);\r\n if (!scope.ok) return scope;\r\n\r\n const [ticket] = await db\r\n .select({\r\n id: schema.tickets.id,\r\n teamId: schema.tickets.teamId,\r\n projectId: schema.tickets.projectId,\r\n customerId: schema.tickets.customerId,\r\n ticketNumber: schema.tickets.ticketNumber,\r\n title: schema.tickets.title,\r\n status: schema.tickets.status,\r\n priority: schema.tickets.priority,\r\n type: schema.tickets.type,\r\n assigneeId: schema.tickets.assigneeId,\r\n })\r\n .from(schema.tickets)\r\n .where(eq(schema.tickets.id, ticketId))\r\n .limit(1);\r\n\r\n if (!ticket) return { ok: false, response: notFoundResponse(ticketId) };\r\n\r\n const hasAccess =\r\n scope.teamIds.includes(ticket.teamId) ||\r\n (!!ticket.projectId && scope.projectIds.includes(ticket.projectId)) ||\r\n (!!ticket.customerId && scope.customerIds.includes(ticket.customerId));\r\n\r\n if (!hasAccess) return { ok: false, response: notFoundResponse(ticketId) };\r\n\r\n return { ok: true, ticket: ticket as AccessibleTicket };\r\n}\r\n","import { ensureTipTapFormat } from \"@refront/utils/tiptap\";\r\nimport { desc, eq, sql } from \"drizzle-orm\";\r\nimport { authContext } from \"../auth.js\";\r\nimport { db, schema } from \"../db.js\";\r\nimport type { AddTicketCommentArgs, GetTicketCommentsArgs } from \"../types.js\";\r\nimport { loadAccessibleTicket } from \"./ticket-access.js\";\r\nimport { tiptapToPlainText } from \"./tiptap-text.js\";\r\n\r\nexport async function handleAddTicketComment(input: AddTicketCommentArgs) {\r\n const ctx = authContext!;\r\n const isInternal = input.isInternal ?? false;\r\n\r\n const access = await loadAccessibleTicket(input.teamId, input.ticketId);\r\n if (!access.ok) return access.response;\r\n const ticket = access.ticket;\r\n\r\n const content = ensureTipTapFormat(input.content) ?? input.content;\r\n\r\n const [comment] = await db\r\n .insert(schema.ticketComments)\r\n .values({\r\n ticketId: ticket.id,\r\n teamId: ticket.teamId,\r\n userId: ctx.userId,\r\n content,\r\n isInternal,\r\n })\r\n .returning({ id: schema.ticketComments.id });\r\n\r\n await db\r\n .update(schema.tickets)\r\n .set({ updatedAt: sql`NOW()`, updatedBy: ctx.userId })\r\n .where(eq(schema.tickets.id, ticket.id));\r\n\r\n await db.insert(schema.ticketActivity).values({\r\n ticketId: ticket.id,\r\n teamId: ticket.teamId,\r\n userId: ctx.userId,\r\n activityType: isInternal ? \"comment_internal_added\" : \"comment_added\",\r\n });\r\n\r\n return {\r\n content: [\r\n {\r\n type: \"text\",\r\n text:\r\n `✅ **Comment added to ${ticket.ticketNumber}**` +\r\n `${isInternal ? \" (internal)\" : \"\"}\\n\\nComment id: ${comment?.id}`,\r\n },\r\n ],\r\n };\r\n}\r\n\r\nexport async function handleGetTicketComments(input: GetTicketCommentsArgs) {\r\n const access = await loadAccessibleTicket(input.teamId, input.ticketId);\r\n if (!access.ok) return access.response;\r\n const ticket = access.ticket;\r\n\r\n const comments = await db\r\n .select({\r\n id: schema.ticketComments.id,\r\n content: schema.ticketComments.content,\r\n isInternal: schema.ticketComments.isInternal,\r\n createdAt: schema.ticketComments.createdAt,\r\n userName: schema.ticketComments.userName,\r\n authorName: schema.users.fullName,\r\n })\r\n .from(schema.ticketComments)\r\n .leftJoin(schema.users, eq(schema.users.id, schema.ticketComments.userId))\r\n .where(eq(schema.ticketComments.ticketId, ticket.id))\r\n .orderBy(desc(schema.ticketComments.createdAt));\r\n\r\n if (comments.length === 0) {\r\n return {\r\n content: [\r\n {\r\n type: \"text\",\r\n text: `No comments on ticket ${ticket.ticketNumber}.`,\r\n },\r\n ],\r\n };\r\n }\r\n\r\n const rendered = comments\r\n .map((c) => {\r\n const author = c.authorName ?? c.userName ?? \"Unknown\";\r\n const flag = c.isInternal ? \" [internal]\" : \"\";\r\n const text = tiptapToPlainText(c.content) || \"(empty)\";\r\n return `• ${author}${flag} — ${c.createdAt}\\n${text}`;\r\n })\r\n .join(\"\\n\\n\");\r\n\r\n return {\r\n content: [\r\n {\r\n type: \"text\",\r\n text: `💬 **Comments on ${ticket.ticketNumber}** (${comments.length})\\n\\n${rendered}`,\r\n },\r\n ],\r\n };\r\n}\r\n","/**\r\n * Render TipTap JSON (or plain text) to a readable plain-text string.\r\n *\r\n * Ticket comments are stored as TipTap JSON (see `ensureTipTapFormat` in\r\n * `@refront/utils`). For MCP output we only need a faithful text rendering:\r\n * paragraphs become newlines, bullet list items get a leading \"- \", and\r\n * hard breaks become newlines. If the input is already plain text, it is\r\n * returned as-is.\r\n */\r\n\r\ntype TipTapNode = {\r\n type?: string;\r\n text?: string;\r\n content?: TipTapNode[];\r\n};\r\n\r\nfunction renderNode(node: TipTapNode): string {\r\n if (!node) return \"\";\r\n if (node.type === \"text\") return node.text ?? \"\";\r\n if (node.type === \"hardBreak\") return \"\\n\";\r\n\r\n const inner = (node.content ?? []).map(renderNode).join(\"\");\r\n\r\n switch (node.type) {\r\n case \"paragraph\":\r\n return `${inner}\\n`;\r\n case \"heading\":\r\n return `${inner}\\n`;\r\n case \"listItem\":\r\n return `- ${inner.trimEnd()}\\n`;\r\n case \"bulletList\":\r\n case \"orderedList\":\r\n return inner;\r\n case \"blockquote\":\r\n return `${inner}\\n`;\r\n default:\r\n return inner;\r\n }\r\n}\r\n\r\nexport function tiptapToPlainText(content: string | null | undefined): string {\r\n if (!content) return \"\";\r\n\r\n const trimmed = content.trim();\r\n if (!trimmed.startsWith(\"{\")) return content;\r\n\r\n let doc: TipTapNode;\r\n try {\r\n doc = JSON.parse(trimmed) as TipTapNode;\r\n } catch {\r\n return content;\r\n }\r\n\r\n if (doc?.type !== \"doc\" || !Array.isArray(doc.content)) return content;\r\n\r\n return doc.content.map(renderNode).join(\"\").trim();\r\n}\r\n","import { ensureTipTapFormat } from \"@refront/utils/tiptap\";\r\nimport { eq, sql } from \"drizzle-orm\";\r\nimport { authContext } from \"../auth.js\";\r\nimport { db, isUserTeamMember, schema } from \"../db.js\";\r\nimport type { UpdateTicketArgs } from \"../types.js\";\r\nimport { loadAccessibleTicket } from \"./ticket-access.js\";\r\n\r\nexport async function handleUpdateTicket(input: UpdateTicketArgs) {\r\n const ctx = authContext!;\r\n const { id } = input;\r\n\r\n const access = await loadAccessibleTicket(input.teamId, id);\r\n if (!access.ok) return access.response;\r\n const ticket = access.ticket;\r\n\r\n // Validate a provided assignee belongs to the ticket's team (null = unassign).\r\n if (input.assigneeId !== undefined && input.assigneeId !== null) {\r\n const member = await isUserTeamMember(input.assigneeId, ticket.teamId);\r\n if (!member) {\r\n return {\r\n content: [\r\n {\r\n type: \"text\",\r\n text: `Cannot assign ticket: user ${input.assigneeId} is not a member of the ticket's team (${ticket.teamId}).`,\r\n },\r\n ],\r\n };\r\n }\r\n }\r\n\r\n const updateValues: Record<string, unknown> = {\r\n updatedAt: sql`NOW()`,\r\n updatedBy: ctx.userId,\r\n };\r\n\r\n if (input.title !== undefined) updateValues.title = input.title;\r\n if (input.description !== undefined) {\r\n updateValues.description = ensureTipTapFormat(input.description);\r\n }\r\n if (input.status !== undefined) {\r\n updateValues.status = input.status as never;\r\n }\r\n if (input.priority !== undefined) {\r\n updateValues.priority = input.priority as never;\r\n }\r\n if (input.type !== undefined) updateValues.type = input.type as never;\r\n if (input.projectId !== undefined) updateValues.projectId = input.projectId;\r\n if (input.customerId !== undefined) {\r\n updateValues.customerId = input.customerId;\r\n }\r\n if (input.assigneeId !== undefined) {\r\n updateValues.assigneeId = input.assigneeId;\r\n }\r\n if (input.estimatedHours !== undefined) {\r\n updateValues.estimatedHours = input.estimatedHours;\r\n }\r\n\r\n await db\r\n .update(schema.tickets)\r\n .set(updateValues)\r\n .where(eq(schema.tickets.id, ticket.id));\r\n\r\n // Mirror the dashboard's ticket activity feed (no notifications here).\r\n const changes: string[] = [];\r\n const activities: Array<{\r\n activityType: string;\r\n oldValue?: string;\r\n newValue?: string;\r\n }> = [];\r\n\r\n if (input.status !== undefined && input.status !== ticket.status) {\r\n activities.push({\r\n activityType: \"status_changed\",\r\n oldValue: ticket.status,\r\n newValue: input.status,\r\n });\r\n changes.push(`status ${ticket.status} -> ${input.status}`);\r\n }\r\n if (input.priority !== undefined && input.priority !== ticket.priority) {\r\n activities.push({\r\n activityType: \"priority_changed\",\r\n oldValue: ticket.priority,\r\n newValue: input.priority,\r\n });\r\n changes.push(`priority ${ticket.priority} -> ${input.priority}`);\r\n }\r\n if (input.type !== undefined && input.type !== ticket.type) {\r\n activities.push({\r\n activityType: \"type_changed\",\r\n oldValue: ticket.type,\r\n newValue: input.type,\r\n });\r\n changes.push(`type ${ticket.type} -> ${input.type}`);\r\n }\r\n if (\r\n input.assigneeId !== undefined &&\r\n (input.assigneeId ?? null) !== ticket.assigneeId\r\n ) {\r\n activities.push({\r\n activityType: \"assignee_changed\",\r\n oldValue: ticket.assigneeId ?? undefined,\r\n newValue: input.assigneeId ?? undefined,\r\n });\r\n changes.push(\r\n input.assigneeId ? `assigned to ${input.assigneeId}` : \"unassigned\",\r\n );\r\n }\r\n if (input.title !== undefined && input.title !== ticket.title) {\r\n changes.push(\"title updated\");\r\n }\r\n if (input.description !== undefined) changes.push(\"description updated\");\r\n if (input.projectId !== undefined) changes.push(\"project updated\");\r\n if (input.customerId !== undefined) changes.push(\"customer updated\");\r\n if (input.estimatedHours !== undefined) changes.push(\"estimated hours updated\");\r\n\r\n for (const activity of activities) {\r\n await db.insert(schema.ticketActivity).values({\r\n ticketId: ticket.id,\r\n teamId: ticket.teamId,\r\n userId: ctx.userId,\r\n activityType: activity.activityType,\r\n oldValue: activity.oldValue,\r\n newValue: activity.newValue,\r\n });\r\n }\r\n\r\n return {\r\n content: [\r\n {\r\n type: \"text\",\r\n text:\r\n `✅ **Ticket Updated: ${ticket.ticketNumber}**\\n\\n` +\r\n `${\r\n changes.length > 0\r\n ? `Changes:\\n${changes.map((c) => ` • ${c}`).join(\"\\n\")}`\r\n : \"No field changes were applied.\"\r\n }`,\r\n },\r\n ],\r\n };\r\n}\r\n","import { and, asc, desc, eq, ilike, inArray, or, sql } from \"drizzle-orm\";\r\nimport { authContext } from \"../auth.js\";\r\nimport {\r\n db,\r\n getAccessibleCustomerIds,\r\n getAccessibleProjectIds,\r\n getAccessibleTeamIds,\r\n isUserTeamMember,\r\n schema,\r\n} from \"../db.js\";\r\nimport { storage } from \"../storage.js\";\r\nimport {\r\n buildTicketAccessPredicate,\r\n type CreateTicketArgs,\r\n type GetTicketByIdArgs,\r\n type GetTicketsArgs,\r\n} from \"../types.js\";\r\nimport {\r\n notAMemberResponse,\r\n resolveTeamId,\r\n resolveTeamScope,\r\n} from \"./team-resolution.js\";\r\nimport { tiptapToPlainText } from \"./tiptap-text.js\";\r\n\r\nfunction isImageFile(mimeType: string): boolean {\r\n return (\r\n mimeType.startsWith(\"image/\") &&\r\n [\"image/jpeg\", \"image/jpg\", \"image/png\", \"image/gif\", \"image/webp\"].includes(\r\n mimeType,\r\n )\r\n );\r\n}\r\n\r\nasync function downloadImageAsBase64(\r\n storageKey: string,\r\n): Promise<string | null> {\r\n try {\r\n let signedUrl: string;\r\n try {\r\n const { url } = await storage.createSignedUrl({\r\n bucket: \"vault\",\r\n path: storageKey,\r\n expiresIn: 3600,\r\n });\r\n signedUrl = url;\r\n } catch (err) {\r\n console.error(`Failed to create signed URL for ${storageKey}:`, err);\r\n return null;\r\n }\r\n\r\n const response = await fetch(signedUrl);\r\n if (!response.ok) {\r\n console.error(\r\n `Failed to download file ${storageKey}: ${response.status}`,\r\n );\r\n return null;\r\n }\r\n\r\n const arrayBuffer = await response.arrayBuffer();\r\n return Buffer.from(arrayBuffer).toString(\"base64\");\r\n } catch (error) {\r\n console.error(`Error downloading image ${storageKey}:`, error);\r\n return null;\r\n }\r\n}\r\n\r\nexport async function handleGetTickets(input: GetTicketsArgs) {\r\n const ctx = authContext!;\r\n const { status, priority, projectId, customerId, q, pageSize = 20 } = input;\r\n\r\n const resolved = await resolveTeamId(input.teamId);\r\n if (!resolved.ok) return resolved.response;\r\n const teamId = resolved.teamId;\r\n\r\n const teamIds = await getAccessibleTeamIds(teamId);\r\n const projectIds = await getAccessibleProjectIds(ctx.userId, teamId);\r\n const customerIds = await getAccessibleCustomerIds(teamId);\r\n\r\n const accessPredicate = buildTicketAccessPredicate(\r\n teamIds,\r\n projectIds,\r\n customerIds,\r\n );\r\n\r\n const filters = [accessPredicate, eq(schema.tickets.isDeleted, false)];\r\n if (status) filters.push(eq(schema.tickets.status, status as never));\r\n if (priority) filters.push(eq(schema.tickets.priority, priority as never));\r\n if (projectId) filters.push(eq(schema.tickets.projectId, projectId));\r\n if (customerId) filters.push(eq(schema.tickets.customerId, customerId));\r\n if (q) {\r\n const pattern = `%${q}%`;\r\n filters.push(\r\n or(\r\n ilike(schema.tickets.ticketNumber, pattern),\r\n ilike(schema.tickets.title, pattern),\r\n ilike(schema.tickets.description, pattern),\r\n )!,\r\n );\r\n }\r\n\r\n const rows = await db\r\n .select({\r\n id: schema.tickets.id,\r\n ticketNumber: schema.tickets.ticketNumber,\r\n title: schema.tickets.title,\r\n description: schema.tickets.description,\r\n status: schema.tickets.status,\r\n priority: schema.tickets.priority,\r\n type: schema.tickets.type,\r\n createdAt: schema.tickets.createdAt,\r\n projectId: schema.tickets.projectId,\r\n customerId: schema.tickets.customerId,\r\n projectName: schema.projects.name,\r\n customerName: schema.customers.name,\r\n })\r\n .from(schema.tickets)\r\n .leftJoin(schema.projects, eq(schema.projects.id, schema.tickets.projectId))\r\n .leftJoin(\r\n schema.customers,\r\n eq(schema.customers.id, schema.tickets.customerId),\r\n )\r\n .where(and(...filters))\r\n .orderBy(desc(schema.tickets.createdAt))\r\n .limit(Math.min(pageSize, 100));\r\n\r\n return {\r\n content: [\r\n {\r\n type: \"text\",\r\n text: `Found ${rows.length} tickets:\\n\\n${\r\n rows\r\n .map(\r\n (t) =>\r\n `**${t.ticketNumber}**: ${t.title}\\n` +\r\n `Status: ${t.status} | Priority: ${t.priority}\\n` +\r\n `${t.projectName ? `Project: ${t.projectName}\\n` : \"\"}` +\r\n `${t.customerName ? `Customer: ${t.customerName}\\n` : \"\"}` +\r\n `Created: ${new Date(t.createdAt).toLocaleDateString()}\\n`,\r\n )\r\n .join(\"\\n\") || \"No tickets found.\"\r\n }`,\r\n },\r\n ],\r\n };\r\n}\r\n\r\nexport async function handleGetTicketById(input: GetTicketByIdArgs) {\r\n const { id } = input;\r\n\r\n const scope = await resolveTeamScope(input.teamId);\r\n if (!scope.ok) return scope.response;\r\n const { teamIds, projectIds, customerIds } = scope;\r\n\r\n const ticketRow = await db.query.tickets.findFirst({\r\n where: eq(schema.tickets.id, id),\r\n with: {\r\n project: { columns: { id: true, name: true } },\r\n customer: { columns: { id: true, name: true } },\r\n assignee: { columns: { id: true, fullName: true, email: true } },\r\n requester: { columns: { id: true, fullName: true, email: true } },\r\n },\r\n });\r\n\r\n if (!ticketRow) {\r\n throw new Error(`Ticket not found: ${id}`);\r\n }\r\n\r\n let hasAccess = false;\r\n if (teamIds.includes(ticketRow.teamId)) hasAccess = true;\r\n if (\r\n !hasAccess &&\r\n ticketRow.projectId &&\r\n projectIds.includes(ticketRow.projectId)\r\n )\r\n hasAccess = true;\r\n if (\r\n !hasAccess &&\r\n ticketRow.customerId &&\r\n customerIds.includes(ticketRow.customerId)\r\n )\r\n hasAccess = true;\r\n if (!hasAccess) {\r\n throw new Error(\r\n \"Access denied: You do not have permission to view this ticket\",\r\n );\r\n }\r\n\r\n const attachments = await db\r\n .select({\r\n id: schema.ticketAttachments.id,\r\n fileName: schema.ticketAttachments.fileName,\r\n fileSize: schema.ticketAttachments.fileSize,\r\n mimeType: schema.ticketAttachments.mimeType,\r\n storageKey: schema.ticketAttachments.storageKey,\r\n createdAt: schema.ticketAttachments.createdAt,\r\n uploaderId: schema.ticketAttachments.userId,\r\n uploaderName: schema.users.fullName,\r\n })\r\n .from(schema.ticketAttachments)\r\n .leftJoin(\r\n schema.users,\r\n eq(schema.users.id, schema.ticketAttachments.userId),\r\n )\r\n .where(eq(schema.ticketAttachments.ticketId, id))\r\n .orderBy(asc(schema.ticketAttachments.createdAt));\r\n\r\n const comments = await db\r\n .select({\r\n id: schema.ticketComments.id,\r\n content: schema.ticketComments.content,\r\n createdAt: schema.ticketComments.createdAt,\r\n userId: schema.ticketComments.userId,\r\n })\r\n .from(schema.ticketComments)\r\n .where(eq(schema.ticketComments.ticketId, id))\r\n .orderBy(asc(schema.ticketComments.createdAt));\r\n\r\n const commentUserIds = [\r\n ...new Set(\r\n comments.map((c) => c.userId).filter((v): v is string => Boolean(v)),\r\n ),\r\n ];\r\n const commentUserMap = new Map<string, { id: string; fullName: string | null }>();\r\n if (commentUserIds.length > 0) {\r\n const commentUsers = await db\r\n .select({ id: schema.users.id, fullName: schema.users.fullName })\r\n .from(schema.users)\r\n .where(inArray(schema.users.id, commentUserIds));\r\n commentUsers.forEach((u) => commentUserMap.set(u.id, u));\r\n }\r\n\r\n const commentIds = comments.map((c) => c.id);\r\n const commentAttachments =\r\n commentIds.length > 0\r\n ? await db\r\n .select({\r\n id: schema.ticketCommentAttachments.id,\r\n commentId: schema.ticketCommentAttachments.commentId,\r\n fileName: schema.ticketCommentAttachments.fileName,\r\n fileSize: schema.ticketCommentAttachments.fileSize,\r\n mimeType: schema.ticketCommentAttachments.mimeType,\r\n storageKey: schema.ticketCommentAttachments.storageKey,\r\n createdAt: schema.ticketCommentAttachments.createdAt,\r\n })\r\n .from(schema.ticketCommentAttachments)\r\n .where(\r\n inArray(schema.ticketCommentAttachments.commentId, commentIds),\r\n )\r\n : [];\r\n\r\n const allAttachments = [\r\n ...attachments.map((a) => ({\r\n id: a.id,\r\n fileName: a.fileName,\r\n mimeType: a.mimeType,\r\n fileSize: a.fileSize,\r\n source: \"ticket\" as const,\r\n })),\r\n ...commentAttachments.map((a) => ({\r\n id: a.id,\r\n fileName: a.fileName,\r\n mimeType: a.mimeType,\r\n fileSize: a.fileSize,\r\n source: \"comment\" as const,\r\n })),\r\n ];\r\n\r\n const attachmentList =\r\n allAttachments.length > 0\r\n ? `\\n📎 **Attachments (${allAttachments.length})** — call get-ticket-attachment with the id for a download URL (images are also shown inline below):\\n` +\r\n allAttachments\r\n .map(\r\n (a) =>\r\n ` • ${a.fileName} (${a.mimeType}, ${Math.round(\r\n a.fileSize / 1024,\r\n )}KB) — id: ${a.id}${a.source === \"comment\" ? \" [on a comment]\" : \"\"}`,\r\n )\r\n .join(\"\\n\") +\r\n \"\\n\"\r\n : \"\";\r\n\r\n const commentList =\r\n comments.length > 0\r\n ? `\\n💬 **Comments (${comments.length})**:\\n` +\r\n comments\r\n .map((c) => {\r\n const author = c.userId\r\n ? commentUserMap.get(c.userId)?.fullName ?? \"Unknown\"\r\n : \"Unknown\";\r\n const text = tiptapToPlainText(c.content) || \"(empty)\";\r\n return ` • ${author} (${new Date(\r\n c.createdAt,\r\n ).toLocaleDateString()}):\\n${text\r\n .split(\"\\n\")\r\n .map((l) => ` ${l}`)\r\n .join(\"\\n\")}`;\r\n })\r\n .join(\"\\n\")\r\n : \"\";\r\n\r\n const requesterLine = ticketRow.requester\r\n ? `Requester (creator): ${ticketRow.requester.fullName || \"Unknown\"} [id: ${ticketRow.requester.id}]\\n`\r\n : `Requester (creator): Unknown\\n`;\r\n\r\n const assigneeLine = ticketRow.assignee\r\n ? `Assignee: ${ticketRow.assignee.fullName || \"Unknown\"} [id: ${ticketRow.assignee.id}]\\n`\r\n : ticketRow.requester\r\n ? `Assignee: (unassigned) — use requester id ${ticketRow.requester.id} for review handoff\\n`\r\n : `Assignee: (unassigned)\\n`;\r\n\r\n const content: Array<\r\n { type: \"text\"; text: string } | { type: \"image\"; data: string; mimeType: string }\r\n > = [\r\n {\r\n type: \"text\",\r\n text:\r\n `**Ticket Details:**\\n\\n` +\r\n `**${ticketRow.ticketNumber}**: ${ticketRow.title}\\n` +\r\n `Ticket id: ${ticketRow.id}\\n` +\r\n `Team id: ${ticketRow.teamId}\\n` +\r\n `Status: ${ticketRow.status}\\n` +\r\n `Priority: ${ticketRow.priority}\\n` +\r\n `Type: ${ticketRow.type}\\n` +\r\n `${ticketRow.description ? `Description: ${tiptapToPlainText(ticketRow.description)}\\n` : \"\"}` +\r\n `${ticketRow.project?.name ? `Project: ${ticketRow.project.name}\\n` : \"\"}` +\r\n `${ticketRow.customer?.name ? `Customer: ${ticketRow.customer.name}\\n` : \"\"}` +\r\n assigneeLine +\r\n requesterLine +\r\n `Created: ${new Date(ticketRow.createdAt).toLocaleDateString()}\\n` +\r\n attachmentList +\r\n commentList,\r\n },\r\n ];\r\n\r\n if (attachments.length > 0) {\r\n console.error(`📎 Processing ${attachments.length} ticket attachments...`);\r\n for (const attachment of attachments) {\r\n if (isImageFile(attachment.mimeType)) {\r\n console.error(`🖼️ Downloading image: ${attachment.fileName}`);\r\n const base64 = await downloadImageAsBase64(attachment.storageKey);\r\n if (base64) {\r\n content.push({\r\n type: \"image\",\r\n data: base64,\r\n mimeType: attachment.mimeType,\r\n });\r\n content.push({\r\n type: \"text\",\r\n text: `\\n📸 **Image from ticket**: ${attachment.fileName} (${Math.round(\r\n attachment.fileSize / 1024,\r\n )}KB, uploaded by ${attachment.uploaderName || \"Unknown\"} on ${new Date(\r\n attachment.createdAt,\r\n ).toLocaleDateString()})\\n`,\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (commentAttachments.length > 0) {\r\n console.error(\r\n `📎 Processing ${commentAttachments.length} comment attachments...`,\r\n );\r\n for (const attachment of commentAttachments) {\r\n if (isImageFile(attachment.mimeType)) {\r\n console.error(\r\n `🖼️ Downloading comment image: ${attachment.fileName}`,\r\n );\r\n const base64 = await downloadImageAsBase64(attachment.storageKey);\r\n if (base64) {\r\n const comment = comments.find((c) => c.id === attachment.commentId);\r\n const author = comment?.userId\r\n ? commentUserMap.get(comment.userId)?.fullName\r\n : null;\r\n content.push({\r\n type: \"image\",\r\n data: base64,\r\n mimeType: attachment.mimeType,\r\n });\r\n content.push({\r\n type: \"text\",\r\n text:\r\n `\\n📸 **Image from comment** by ${author || \"Unknown\"} on ${new Date(\r\n attachment.createdAt,\r\n ).toLocaleDateString()}: ${attachment.fileName} (${Math.round(\r\n attachment.fileSize / 1024,\r\n )}KB)\\n` +\r\n (comment?.content\r\n ? `Comment text: \"${comment.content.substring(0, 100)}${\r\n comment.content.length > 100 ? \"...\" : \"\"\r\n }\"\\n`\r\n : \"\"),\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n console.error(\r\n `✅ Returning ticket with ${content.filter((c) => c.type === \"image\").length} images`,\r\n );\r\n\r\n return { content };\r\n}\r\n\r\nexport async function handleCreateTicket(input: CreateTicketArgs) {\r\n const ctx = authContext!;\r\n const {\r\n title,\r\n description,\r\n status = \"open\",\r\n priority = \"medium\",\r\n type = \"task\",\r\n projectId,\r\n customerId,\r\n } = input;\r\n\r\n const resolved = await resolveTeamId(input.teamId);\r\n if (!resolved.ok) return resolved.response;\r\n\r\n const year = new Date().getFullYear();\r\n let resolvedTeamId = resolved.teamId;\r\n let resolvedCustomerId = customerId;\r\n let projectAbbreviation = \"\";\r\n\r\n if (projectId) {\r\n const [project] = await db\r\n .select({\r\n name: schema.projects.name,\r\n teamId: schema.projects.teamId,\r\n customerId: schema.projects.customerId,\r\n })\r\n .from(schema.projects)\r\n .where(eq(schema.projects.id, projectId))\r\n .limit(1);\r\n\r\n if (project) {\r\n if (project.teamId) {\r\n const member = await isUserTeamMember(ctx.userId, project.teamId);\r\n if (!member) return notAMemberResponse(project.teamId);\r\n resolvedTeamId = project.teamId;\r\n }\r\n if (!resolvedCustomerId && project.customerId) {\r\n resolvedCustomerId = project.customerId;\r\n }\r\n if (project.name) {\r\n const upper = project.name.toUpperCase().replace(/[^A-Z0-9\\s]/g, \"\");\r\n const words = upper.split(/\\s+/).filter(Boolean);\r\n if (words.length >= 2) {\r\n projectAbbreviation = words\r\n .slice(0, 2)\r\n .map((w) => w.substring(0, 3))\r\n .join(\"\")\r\n .substring(0, 5);\r\n } else if (words.length === 1 && words[0]) {\r\n projectAbbreviation = words[0].substring(0, 5);\r\n }\r\n }\r\n }\r\n }\r\n\r\n let ticketNumber: string;\r\n if (projectId && projectAbbreviation) {\r\n const pattern = `${year}-${projectAbbreviation}-%`;\r\n const [highest] = await db\r\n .select({ ticketNumber: schema.tickets.ticketNumber })\r\n .from(schema.tickets)\r\n .where(\r\n and(\r\n eq(schema.tickets.projectId, projectId),\r\n ilike(schema.tickets.ticketNumber, pattern),\r\n ),\r\n )\r\n .orderBy(desc(schema.tickets.ticketNumber))\r\n .limit(1);\r\n\r\n let nextSequence = 1;\r\n if (highest?.ticketNumber) {\r\n const parts = highest.ticketNumber.split(\"-\");\r\n if (parts.length === 3 && parts[2]) {\r\n const lastSeq = Number.parseInt(parts[2], 10);\r\n if (!Number.isNaN(lastSeq)) nextSequence = lastSeq + 1;\r\n }\r\n }\r\n ticketNumber = `${year}-${projectAbbreviation}-${String(nextSequence).padStart(3, \"0\")}`;\r\n } else {\r\n const [countRow] = await db\r\n .select({ n: sql<number>`count(*)::int` })\r\n .from(schema.tickets)\r\n .where(eq(schema.tickets.teamId, resolvedTeamId));\r\n const count = Number(countRow?.n ?? 0);\r\n ticketNumber = `${year}-${String(count + 1).padStart(3, \"0\")}`;\r\n }\r\n\r\n await db.insert(schema.tickets).values({\r\n teamId: resolvedTeamId,\r\n ticketNumber,\r\n title,\r\n description: description ?? null,\r\n status: status as never,\r\n priority: priority as never,\r\n type: type as never,\r\n projectId: projectId ?? null,\r\n customerId: resolvedCustomerId ?? null,\r\n requesterId: ctx.userId,\r\n });\r\n\r\n return {\r\n content: [\r\n {\r\n type: \"text\",\r\n text:\r\n `✅ **Ticket Created Successfully!**\\n\\n` +\r\n `Ticket Number: **${ticketNumber}**\\n` +\r\n `Title: ${title}\\n` +\r\n `Status: ${status}\\n` +\r\n `Priority: ${priority}\\n` +\r\n `Type: ${type}\\n`,\r\n },\r\n ],\r\n };\r\n}\r\n"]}