@rallycry/conveyor-mcp 4.3.13 → 4.3.14

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/cli.js CHANGED
@@ -140,7 +140,7 @@ function registerUpdateProjectSettings(server2, conn2) {
140
140
  projectId: z3.string().optional().describe("Target Conveyor project ID"),
141
141
  name: z3.string().optional().describe("New project name"),
142
142
  description: z3.string().optional().describe("New project description"),
143
- settings: z3.record(z3.unknown()).optional().describe(
143
+ settings: z3.record(z3.string(), z3.unknown()).optional().describe(
144
144
  "Deep-merged patch of the project settings JSON (JSON Merge Patch semantics: null deletes a key; advanced)"
145
145
  ),
146
146
  defaultPmAgentId: z3.string().nullable().optional().describe("Default PM agent ID"),
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli.ts","../src/tools/project.ts","../src/tools/connection.ts","../src/tools/project-config.ts","../src/tools/tasks.ts","../../shared/dist/tool-contracts/index.js","../src/tools/contract-tool.ts","../src/tools/tasks-format.ts","../src/tools/builds.ts","../src/tools/attachments.ts","../src/tools/pull-request.ts","../src/tools/subtasks.ts","../src/tools/dependencies.ts","../src/tools/suggestions.ts","../src/tools/checklists.ts","../src/tools/workspace.ts","../src/workspace-ssh-tunnel.ts","../src/tools/logs.ts","../src/tools/index.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { createRequire } from \"node:module\";\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { ConveyorConnection } from \"./connection.js\";\nimport { registerAllTools } from \"./tools/index.js\";\n\nconst { version } = createRequire(import.meta.url)(\"../package.json\") as { version: string };\n\nconst apiUrl = process.env.CONVEYOR_API_URL;\nconst projectToken = process.env.CONVEYOR_USER_TOKEN ?? process.env.CONVEYOR_PROJECT_TOKEN;\nconst projectId = process.env.CONVEYOR_PROJECT_ID;\nconst subProjectId = process.env.CONVEYOR_SUBPROJECT_ID;\n\nif (!apiUrl || !projectToken) {\n process.stderr.write(\n \"Error: CONVEYOR_API_URL and CONVEYOR_USER_TOKEN or CONVEYOR_PROJECT_TOKEN environment variables are required. CONVEYOR_PROJECT_ID is optional and sets the default project.\\n\",\n );\n process.exit(1);\n}\n\nconst conn = new ConveyorConnection({ apiUrl, projectToken, projectId, subProjectId });\n\ntry {\n await conn.connect();\n process.stderr.write(\"Connected to Conveyor API\\n\");\n} catch (err) {\n process.stderr.write(`Failed to connect to Conveyor API: ${err}\\n`);\n process.exit(1);\n}\n\nconst server = new McpServer({\n name: \"conveyor\",\n version,\n});\n\nregisterAllTools(server, conn);\n\nconst transport = new StdioServerTransport();\nawait server.connect(transport);\n\nprocess.on(\"SIGINT\", () => {\n conn.disconnect();\n process.exit(0);\n});\n\nprocess.on(\"SIGTERM\", () => {\n conn.disconnect();\n process.exit(0);\n});\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { ConveyorConnection } from \"../connection.js\";\n\nexport function registerProjectTools(server: McpServer, conn: ConveyorConnection): void {\n server.tool(\n \"list_projects\",\n \"List Conveyor projects available to this MCP token's user. Use a returned project id as projectId on other tools when no default project is configured or when targeting a different project.\",\n {},\n async () => {\n const projects = await conn.listProjects();\n return { content: [{ type: \"text\", text: JSON.stringify(projects, null, 2) }] };\n },\n );\n\n server.tool(\n \"get_project_summary\",\n \"Get overall project status: task counts by status, active builds, repo info. Pass projectId to target a specific project; otherwise the configured default project is used.\",\n {\n projectId: z.string().optional().describe(\"Target Conveyor project ID\"),\n },\n async (params) => {\n const summary = await conn.getProjectSummary(params.projectId);\n return { content: [{ type: \"text\", text: JSON.stringify(summary, null, 2) }] };\n },\n );\n\n server.tool(\n \"get_onboarding_status\",\n \"Get the project's onboarding/setup readiness checklist so you can drive setup to green without the user opening Project Settings. Returns { ok, checks[] } where each check has a key (githubApp, githubOauthScopes, claudeToken, devcontainer, devBranch, anthropicKey, compute, codespaceQuota), a status (ok | warn | fail), a human-readable reason, and an optional fix hint. Call this first during onboarding, resolve every 'fail' (use gh/gcloud CLIs or point the user at the fix), then call again until ok is true. Pass projectId to target a specific project; otherwise the configured default project is used.\",\n {\n projectId: z.string().optional().describe(\"Target Conveyor project ID\"),\n },\n async (params) => {\n const status = await conn.getOnboardingStatus(params.projectId);\n return { content: [{ type: \"text\", text: JSON.stringify(status, null, 2) }] };\n },\n );\n\n server.tool(\n \"get_onboarding_step\",\n \"Drive project setup one contextual step at a time (the choose-your-own-adventure onboarding flow). Returns { done, ok, step, remaining, checks }: `step` is the SINGLE next thing to configure (fails before warnings) with a human `title`, the `reason`, agent-facing `guidance` on how to resolve it, `autoFixable` (true = you can fix it via gh/git/tools, false = a browser-only step the user must do), an optional `fix` hint, and `connectUrls` (URLs to hand the user for browser-only steps). `remaining` lists the other unresolved checks. Prefer this over get_onboarding_status during setup: call it, resolve the returned step (do it yourself if autoFixable, otherwise give the user the connectUrl and wait), then call again — repeat until `done` is true. The repository and branches are already configured; never change them. Pass projectId to target a specific project; otherwise the configured default project is used.\",\n {\n projectId: z.string().optional().describe(\"Target Conveyor project ID\"),\n },\n async (params) => {\n const step = await conn.getOnboardingStep(params.projectId);\n return { content: [{ type: \"text\", text: JSON.stringify(step, null, 2) }] };\n },\n );\n\n server.tool(\n \"list_project_members\",\n \"List project members with user ID, name, email, and access level — use to resolve a person's name or email to a user ID for task assignment or review. Pass projectId to target a specific project; otherwise the configured default project is used.\",\n {\n projectId: z.string().optional().describe(\"Target Conveyor project ID\"),\n },\n async (params) => {\n const members = await conn.listProjectMembers(params.projectId);\n return { content: [{ type: \"text\", text: JSON.stringify(members, null, 2) }] };\n },\n );\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { ConveyorConnection } from \"../connection.js\";\n\nconst CAPABILITY_ENUM = [\"read\", \"create\", \"update\", \"chat\", \"files\", \"build\"] as const;\n\nexport function registerConnectionTools(server: McpServer, conn: ConveyorConnection): void {\n server.tool(\n \"get_connection_context\",\n \"Resolve WHO this connection is and WHAT project/board it points at — call this FIRST, before inferring anything from names. Returns the effective account, project, and board (sub-project) each with BOTH its immutable ID and its human-readable name/slug, the granted capabilities (read/create/update/chat/files/build), management URLs, and a one-line summary. Removes the ambiguity between a project's canonical name and a board label. Pass projectId to target a specific project; otherwise the configured default project is used.\",\n {\n projectId: z.string().optional().describe(\"Target Conveyor project ID\"),\n },\n async (params) => {\n const ctx = await conn.getConnectionContext(params.projectId);\n return { content: [{ type: \"text\", text: JSON.stringify(ctx, null, 2) }] };\n },\n );\n\n server.tool(\n \"verify_connection\",\n \"Prove the connection is correct AND that you can actually write to the intended board — not just that auth works. Runs layered checks (auth → account → project → target board → capabilities → read) and returns a plain pass/fail with, on failure, the exact failing layer and ONE next action. Use this instead of get_project_summary to confirm setup: a summary that returns data proves auth, not scope. Pass intendedActions to verify specific capabilities (defaults to read+create+update). Pass projectId to target a specific project; otherwise the configured default project is used. The board scope comes from CONVEYOR_SUBPROJECT_ID.\",\n {\n projectId: z.string().optional().describe(\"Target Conveyor project ID\"),\n intendedActions: z\n .array(z.enum(CAPABILITY_ENUM))\n .optional()\n .describe(\n \"Capabilities to verify the connection can perform (default: read, create, update).\",\n ),\n },\n async (params) => {\n const result = await conn.verifyConnection(params);\n return { content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }] };\n },\n );\n\n server.tool(\n \"list_accessible_subprojects\",\n \"List the boards (sub-projects) under the connected project — each with its ID, name, slug, board URL, owned root path, and the role/capabilities this token has on it. Use this to discover which board to create or list cards on (pass a returned id as subProjectId, or set CONVEYOR_SUBPROJECT_ID) instead of asking the human for one. Pass projectId to target a specific project; otherwise the configured default project is used.\",\n {\n projectId: z.string().optional().describe(\"Target Conveyor project ID\"),\n },\n async (params) => {\n const subprojects = await conn.listAccessibleSubprojects(params.projectId);\n return { content: [{ type: \"text\", text: JSON.stringify(subprojects, null, 2) }] };\n },\n );\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { ConveyorConnection } from \"../connection.js\";\n\nfunction jsonResult(data: unknown): { content: { type: \"text\"; text: string }[] } {\n return { content: [{ type: \"text\", text: JSON.stringify(data, null, 2) }] };\n}\n\nfunction textResult(text: string): { content: { type: \"text\"; text: string }[] } {\n return { content: [{ type: \"text\", text }] };\n}\n\nconst AGENT_DEFAULT_KEYS = [\n \"defaultPmAgentId\",\n \"defaultTaskAgentId\",\n \"defaultReviewerAgentId\",\n \"helperAgentId\",\n] as const;\n\nfunction registerGetConnectUrls(server: McpServer, conn: ConveyorConnection): void {\n server.tool(\n \"get_connect_urls\",\n \"Get browser-only setup URLs to hand to the user: the Google Cloud OAuth connect link (gcpConnect) plus Settings deep links (gcpSettings, memberSettings, projectSettings, setupWizard). Use these for setup steps an agent cannot perform (OAuth grants, secret entry). Pass projectId to target a specific project; otherwise the configured default project is used.\",\n {\n projectId: z.string().optional().describe(\"Target Conveyor project ID\"),\n },\n async (params) => jsonResult(await conn.getConnectUrls(params.projectId)),\n );\n}\n\nfunction registerUpdateProjectSettings(server: McpServer, conn: ConveyorConnection): void {\n server.tool(\n \"update_project_settings\",\n \"Update project configuration: name, description, default agent assignments, or a deep-merged patch of the project settings JSON (JSON Merge Patch: nested objects merge recursively, null deletes a key, arrays replace — a partial patch never wipes sibling keys). Requires a Moderate project role. Does NOT touch repositories or branches — those are configured in the Conveyor UI.\",\n {\n projectId: z.string().optional().describe(\"Target Conveyor project ID\"),\n name: z.string().optional().describe(\"New project name\"),\n description: z.string().optional().describe(\"New project description\"),\n settings: z\n .record(z.unknown())\n .optional()\n .describe(\n \"Deep-merged patch of the project settings JSON (JSON Merge Patch semantics: null deletes a key; advanced)\",\n ),\n defaultPmAgentId: z.string().nullable().optional().describe(\"Default PM agent ID\"),\n defaultTaskAgentId: z.string().nullable().optional().describe(\"Default task agent ID\"),\n defaultReviewerAgentId: z\n .string()\n .nullable()\n .optional()\n .describe(\"Default reviewer agent ID\"),\n helperAgentId: z.string().nullable().optional().describe(\"Helper agent ID\"),\n },\n async (params) => {\n const { projectId, name, description, settings, ...agents } = params;\n const results: unknown[] = [];\n\n const config: Record<string, unknown> = {};\n if (name !== undefined) config.name = name;\n if (description !== undefined) config.description = description;\n if (settings !== undefined) config.settings = settings;\n if (Object.keys(config).length > 0) {\n results.push(await conn.updateProjectConfig({ projectId, ...config }));\n }\n\n const defaults: Record<string, unknown> = {};\n for (const key of AGENT_DEFAULT_KEYS) {\n if (agents[key] !== undefined) defaults[key] = agents[key];\n }\n if (Object.keys(defaults).length > 0) {\n results.push(await conn.updateProjectAgentDefaults({ projectId, ...defaults }));\n }\n\n if (results.length === 0) return textResult(\"Nothing to update — pass at least one field.\");\n return jsonResult(results.length === 1 ? results[0] : results);\n },\n );\n}\n\nconst contextPathSchema = z.object({\n type: z\n .enum([\"rule\", \"doc\", \"file\", \"folder\"])\n .describe(\"Kind of context link — a rule/doc file, a source file, or a folder\"),\n path: z.string().describe(\"Repo-relative path, e.g. '.claude/rules/refactor-verification.md'\"),\n label: z.string().optional().describe(\"Optional human-readable label for the link\"),\n});\n\nfunction registerManageTags(server: McpServer, conn: ConveyorConnection): void {\n server.tool(\n \"manage_tags\",\n \"List, create, update, or delete project tags. create requires name (optional color/description/contextPaths); update/delete require the tag id. contextPaths wire files/rules/docs into the agent context of any card carrying the tag (replace-set — pass the full list, [] clears). Mutations require a Moderate project role.\",\n {\n action: z.enum([\"list\", \"create\", \"update\", \"delete\"]).describe(\"Operation to perform\"),\n projectId: z.string().optional().describe(\"Target Conveyor project ID (list/create)\"),\n id: z.string().optional().describe(\"Tag ID (update/delete)\"),\n name: z.string().optional().describe(\"Tag name\"),\n color: z.string().optional().describe(\"Hex color, e.g. #ff0000\"),\n description: z.string().optional().describe(\"Tag description\"),\n contextPaths: z\n .array(contextPathSchema)\n .max(20)\n .optional()\n .describe(\n \"Context links (rules/docs/files/folders) auto-loaded into the agent context of cards with this tag. Replace-set: the full list replaces the tag's existing links; pass [] to clear. Only used on create/update.\",\n ),\n },\n async (params) => {\n const { action, projectId, id, name, color, description, contextPaths } = params;\n if (action === \"list\") return jsonResult(await conn.listTagsDetailed(projectId));\n if (action === \"create\") {\n if (!name) return textResult(\"name is required for create.\");\n return jsonResult(\n await conn.createTag({\n projectId,\n name,\n ...(color !== undefined && { color }),\n ...(description !== undefined && { description }),\n ...(contextPaths !== undefined && { contextPaths }),\n }),\n );\n }\n if (!id) return textResult(`id is required for ${action}.`);\n if (action === \"delete\") return jsonResult(await conn.deleteTag(id));\n return jsonResult(\n await conn.updateTag({\n id,\n ...(name !== undefined && { name }),\n ...(color !== undefined && { color }),\n ...(description !== undefined && { description }),\n ...(contextPaths !== undefined && { contextPaths }),\n }),\n );\n },\n );\n}\n\nfunction registerManagePriorities(server: McpServer, conn: ConveyorConnection): void {\n server.tool(\n \"manage_priorities\",\n \"List, create, update, or delete project priorities. create requires value (1-100), name, and color; update/delete require the priority id. create/update require a Moderate role; delete requires Admin.\",\n {\n action: z.enum([\"list\", \"create\", \"update\", \"delete\"]).describe(\"Operation to perform\"),\n projectId: z.string().optional().describe(\"Target Conveyor project ID (list/create)\"),\n id: z.string().optional().describe(\"Priority ID (update/delete)\"),\n value: z\n .number()\n .int()\n .min(1)\n .max(100)\n .optional()\n .describe(\"Priority value (1 = highest urgency scale point)\"),\n name: z.string().optional().describe(\"Priority name\"),\n color: z.string().optional().describe(\"Hex color, e.g. #ff0000\"),\n description: z.string().optional().describe(\"Priority description\"),\n },\n async (params) => {\n const { action, projectId, id, value, name, color, description } = params;\n if (action === \"list\") return jsonResult(await conn.listPriorities(projectId));\n if (action === \"create\") {\n if (value === undefined || !name || !color) {\n return textResult(\"value, name, and color are required for create.\");\n }\n return jsonResult(\n await conn.createPriority({\n projectId,\n value,\n name,\n color,\n ...(description !== undefined && { description }),\n }),\n );\n }\n if (!id) return textResult(`id is required for ${action}.`);\n if (action === \"delete\") return jsonResult(await conn.deletePriority(id));\n return jsonResult(\n await conn.updatePriority({\n id,\n ...(value !== undefined && { value }),\n ...(name !== undefined && { name }),\n ...(color !== undefined && { color }),\n ...(description !== undefined && { description }),\n }),\n );\n },\n );\n}\n\nexport function registerProjectConfigTools(server: McpServer, conn: ConveyorConnection): void {\n registerGetConnectUrls(server, conn);\n registerUpdateProjectSettings(server, conn);\n registerManageTags(server, conn);\n registerManagePriorities(server, conn);\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport {\n approveAndMergePrContract,\n getTaskContract,\n listTagsContract,\n postToChatContract,\n readTaskChatContract,\n} from \"@project/shared/tool-contracts\";\nimport { registerContractTool } from \"./contract-tool.js\";\nimport type { ConveyorConnection } from \"../connection.js\";\nimport { formatCliEventSummary, formatTaskSessionState, summarizeTask } from \"./tasks-format.js\";\n\nconst STATUS_ENUM = [\n \"Planning\",\n \"Open\",\n \"InProgress\",\n \"ReviewPR\",\n \"ReviewDev\",\n \"ReviewLive\",\n \"Complete\",\n \"Cancelled\",\n] as const;\n\nconst CARD_TYPE_ENUM = [\"task\", \"incident\", \"suggestion\"] as const;\n\n// Canonical risk levels — mirror RISK_LEVELS in @project/shared (conveyor-mcp is\n// published standalone without the shared dep).\nconst RISK_ENUM = [\"critical\", \"high\", \"medium\", \"low\"] as const;\n\n// Shared board (sub-project) scope fields. Omit → the connection's default board\n// (CONVEYOR_SUBPROJECT_ID) when set, else the whole project; null → force the\n// whole project. Reused across list/search (filter) and create (assign) so the\n// semantics stay identical and the file stays under the line cap.\nconst BOARD_FILTER = z\n .string()\n .nullable()\n .optional()\n .describe(\n \"Filter to a sub-project board. Omit to use the connection's default board (CONVEYOR_SUBPROJECT_ID) when set, else the whole project; pass null to force the whole project. Use list_accessible_subprojects to find board IDs.\",\n );\nconst BOARD_ASSIGN = z\n .string()\n .nullable()\n .optional()\n .describe(\n \"Assign the card to a sub-project board. Omit to use the connection's default board (CONVEYOR_SUBPROJECT_ID) when set, else the parent project; pass null to force the parent project. Use list_accessible_subprojects to find board IDs.\",\n );\n\nfunction registerListTasks(server: McpServer, conn: ConveyorConnection): void {\n server.tool(\n \"list_tasks\",\n \"List project cards, optionally filtered by card type, status, or assignment (a specific assignee, or unassigned tasks). Defaults to type=task — pass typeFilters to list incidents/suggestions. Results are relevance-ordered: highest priority first then newest; suggestions-only queries rank by upvote score. Pass projectId to target a specific project; otherwise the configured default project is used. Returns summaries — plan omitted, description truncated; use get_task for full details.\",\n {\n projectId: z.string().optional().describe(\"Target Conveyor project ID\"),\n status: z.enum(STATUS_ENUM).optional().describe(\"Filter by task status\"),\n typeFilters: z\n .array(z.enum(CARD_TYPE_ENUM))\n .optional()\n .describe(\n 'Card types to include, e.g. [\"incident\"] or [\"task\", \"incident\"]. Omit for tasks only.',\n ),\n assigneeId: z.string().optional().describe(\"Filter by assigned user ID\"),\n unassigned: z\n .boolean()\n .optional()\n .describe(\"Only return tasks with no assignee (mutually exclusive with assigneeId)\"),\n subProjectId: BOARD_FILTER,\n limit: z.number().optional().describe(\"Max tasks to return (default 50)\"),\n },\n async (params) => {\n const tasks = await conn.listTasks(params);\n return {\n content: [{ type: \"text\", text: JSON.stringify(tasks.map(summarizeTask), null, 2) }],\n };\n },\n );\n}\n\nfunction registerGetTask(server: McpServer, conn: ConveyorConnection): void {\n registerContractTool(server, getTaskContract, async (params) => {\n const task = await conn.getTask(params.taskId, params.projectId);\n return { content: [{ type: \"text\", text: JSON.stringify(task, null, 2) }] };\n });\n}\n\nfunction registerGetCardBySlug(server: McpServer, conn: ConveyorConnection): void {\n server.tool(\n \"get_card_by_slug\",\n \"Get full card details by the slug from a card URL (/cards/<slug>) instead of a task ID. Pass projectId to target a specific project; otherwise the configured default project is used.\",\n {\n projectId: z.string().optional().describe(\"Target Conveyor project ID\"),\n slug: z.string().describe(\"The card slug from a Conveyor card URL, e.g. 'ship-it'\"),\n },\n async (params) => {\n const task = await conn.getCardBySlug(params.slug, params.projectId);\n return { content: [{ type: \"text\", text: JSON.stringify(task, null, 2) }] };\n },\n );\n}\n\nfunction registerCreateTask(server: McpServer, conn: ConveyorConnection): void {\n server.tool(\n \"create_task\",\n \"Create a new task with title, description, and optional plan. Pass projectId to target a specific project; otherwise the configured default project is used. Icon, story points, and agent assignment are auto-filled when a task is created in (or later moved to) a status beyond Planning — don't spend turns on them.\",\n {\n projectId: z.string().optional().describe(\"Target Conveyor project ID\"),\n title: z.string().describe(\"Task title\"),\n description: z.string().optional().describe(\"Task description\"),\n plan: z.string().optional().describe(\"Task implementation plan (markdown)\"),\n status: z\n .enum([\"Planning\", \"Open\"])\n .optional()\n .describe(\"Initial status (default: Planning)\"),\n subProjectId: BOARD_ASSIGN,\n tags: z\n .array(z.string())\n .optional()\n .describe(\n 'Tag names to assign to the new card (e.g. [\"refactor\"]). Unknown names are rejected — create the tag first with manage_tags. Use list_tags to see available tags.',\n ),\n },\n async (params) => {\n const task = await conn.createTask(params);\n return {\n content: [\n {\n type: \"text\",\n text: `Task created: ${task.id} (slug: ${task.slug}). effectiveScope: ${JSON.stringify(task.effectiveScope)}`,\n },\n ],\n };\n },\n );\n}\n\nfunction registerUpdateTask(server: McpServer, conn: ConveyorConnection): void {\n server.tool(\n \"update_task\",\n \"Update task fields: title, description, plan, status, risk, assignment, or tags. Set status to claim a card (InProgress), triage it (Open), or cancel it (Cancelled); for review approvals prefer approve_task / request_changes, which guard against stale-state races. Tags are additive/subtractive — pass addTags/removeTags with tag names (not a replace-set). Pass projectId to target a specific project; otherwise the configured default project is used. Moving a task beyond Planning auto-fills any missing icon, story points, and agent assignment — don't spend turns on them.\",\n {\n projectId: z.string().optional().describe(\"Target Conveyor project ID\"),\n taskId: z.string().describe(\"The task ID\"),\n title: z.string().optional().describe(\"New title\"),\n description: z.string().optional().describe(\"New description\"),\n plan: z.string().optional().describe(\"New plan (markdown)\"),\n status: z.enum(STATUS_ENUM).optional().describe(\"New status\"),\n risk: z\n .enum(RISK_ENUM)\n .nullable()\n .optional()\n .describe(\n \"Risk level — how much important surface the task touches (critical/high/medium/low). Pass null to clear.\",\n ),\n assignedUserId: z.string().nullable().optional().describe(\"User ID to assign, or null\"),\n subProjectId: z\n .string()\n .nullable()\n .optional()\n .describe(\n \"Assign the task to a sub-project board; null moves it back to the parent board. Omit to leave unchanged.\",\n ),\n addTags: z\n .array(z.string())\n .optional()\n .describe(\n 'Tag names to add to the card (e.g. [\"refactor\"]). Additive — existing tags are kept. Unknown names are rejected; use list_tags to see available tags or manage_tags to create one.',\n ),\n removeTags: z\n .array(z.string())\n .optional()\n .describe(\n \"Tag names to remove from the card. Removing a tag the card doesn't have is a no-op.\",\n ),\n },\n async (params) => {\n const result = await conn.updateTask(params);\n const parts = [`Task ${result.id} updated`];\n if (result.status) parts.push(`status: ${result.status}`);\n if ((result.addedTags ?? []).length > 0) parts.push(`+tags: ${result.addedTags.join(\", \")}`);\n if ((result.removedTags ?? []).length > 0)\n parts.push(`-tags: ${result.removedTags.join(\", \")}`);\n return {\n content: [{ type: \"text\", text: parts.join(\" · \") }],\n };\n },\n );\n}\n\nfunction registerMoveCard(server: McpServer, conn: ConveyorConnection): void {\n server.tool(\n \"move_card\",\n \"Move an eligible Planning or Open task, incident, or suggestion card to another project. Cards with identification or automation in progress, active compute, pull requests, deployments, releases, reviews, or delivered reporter email cannot move. Project-specific metadata is cleared instead of mapped by name. Pass projectId for the source project; otherwise the configured default project is used.\",\n {\n projectId: z.string().optional().describe(\"Source Conveyor project ID\"),\n taskId: z.string().describe(\"Card ID or slug\"),\n destinationProjectId: z.string().describe(\"Destination Conveyor project ID\"),\n },\n async (params) => {\n const result = await conn.moveCard(params);\n const clearedFields =\n result.clearedFields.length > 0 ? result.clearedFields.join(\", \") : \"none\";\n return {\n content: [\n {\n type: \"text\",\n text: `Card moved as ${result.slug} to project ${result.destinationProjectId}. Cleared fields: ${clearedFields}`,\n },\n ],\n };\n },\n );\n}\n\nfunction registerChatTools(server: McpServer, conn: ConveyorConnection): void {\n registerContractTool(server, readTaskChatContract, async (params) => {\n const messages = await conn.getTaskChat(params.taskId, params.limit, params.projectId);\n return { content: [{ type: \"text\", text: JSON.stringify(messages, null, 2) }] };\n });\n\n registerContractTool(server, postToChatContract, async (params) => {\n // Cross-surface alias: the in-pod agent surface calls this field\n // `message`, and models regularly carry that name over. Accept either.\n const text = params.content ?? params.message;\n if (text === undefined) {\n return {\n content: [\n {\n type: \"text\",\n text: \"Nothing to post — provide `content` (or its alias `message`).\",\n },\n ],\n };\n }\n await conn.postToTaskChat(params.taskId, text, params.projectId);\n return { content: [{ type: \"text\", text: \"Message posted\" }] };\n });\n}\n\nfunction registerGetTaskCli(server: McpServer, conn: ConveyorConnection): void {\n server.tool(\n \"get_task_logs\",\n \"Read CLI execution logs from a task. Pass projectId to target a specific project; otherwise the configured default project is used. Returns agent reasoning, tool calls, setup output, and other execution events. For human chat use read_task_chat.\",\n {\n projectId: z.string().optional().describe(\"Target Conveyor project ID\"),\n taskId: z.string().describe(\"The task ID or slug\"),\n source: z\n .enum([\"agent\", \"application\"])\n .optional()\n .describe(\n \"Filter by log source: 'agent' for reasoning/tool calls, 'application' for setup/dev-server output\",\n ),\n limit: z.number().optional().describe(\"Max entries to return (default 50, max 500)\"),\n },\n async ({ taskId, source, limit, projectId }) => {\n const effectiveLimit = Math.min(limit ?? 50, 500);\n const logs = await conn.getTaskCli(taskId, effectiveLimit, source, projectId);\n const formatted = logs\n .map((log) => {\n return `[${log.timestamp}] [${log.type}] ${formatCliEventSummary(log.type, log.data)}`;\n })\n .join(\"\\n\");\n return {\n content: [{ type: \"text\" as const, text: formatted || \"No CLI logs found for this task.\" }],\n };\n },\n );\n}\n\nfunction registerGetTaskSessions(server: McpServer, conn: ConveyorConnection): void {\n server.tool(\n \"get_task_sessions\",\n \"Read compute-session state for a task: legacy CodespaceSession rows plus v3 workspaces, including purpose=review review workspaces. Shows pod identity, liveness, lifecycle, and code-review claim state. Use to diagnose stalled/dead agents or code-review runs. Pass projectId to target a specific project; otherwise the configured default project is used.\",\n {\n projectId: z.string().optional().describe(\"Target Conveyor project ID\"),\n taskId: z.string().describe(\"The task ID or slug\"),\n },\n async ({ taskId, projectId }) => {\n const tasks = await conn.getTaskSessions(taskId, projectId);\n const lines = tasks.flatMap(formatTaskSessionState);\n return {\n content: [\n { type: \"text\" as const, text: lines.join(\"\\n\") || \"No sessions found for this task.\" },\n ],\n };\n },\n );\n}\n\nfunction registerSearchTasks(server: McpServer, conn: ConveyorConnection): void {\n server.tool(\n \"search_tasks\",\n \"Search cards by tag name, text query, status, type, and/or assignment. Defaults to type=task — pass typeFilters to include incidents/suggestions. Results are relevance-ordered: highest priority first then newest; suggestions-only queries rank by upvote score. Pass projectId to target a specific project; otherwise the configured default project is used. Use tag names like 'agent-runner', not IDs. Returns summaries — plan omitted, description truncated; use get_task for full details.\",\n {\n projectId: z.string().optional().describe(\"Target Conveyor project ID\"),\n tagNames: z\n .array(z.string())\n .optional()\n .describe('Tag names to filter by (e.g., [\"agent-runner\", \"chat\"])'),\n searchQuery: z.string().optional().describe(\"Text search on title and description\"),\n statusFilters: z\n .array(z.enum(STATUS_ENUM))\n .optional()\n .describe(\"Filter by one or more statuses\"),\n typeFilters: z\n .array(z.enum(CARD_TYPE_ENUM))\n .optional()\n .describe(\n 'Card types to include (default [\"task\"]). Pass e.g. [\"incident\"] or list several to search across types.',\n ),\n assigneeId: z.string().optional().describe(\"Filter by assigned user ID\"),\n unassigned: z\n .boolean()\n .optional()\n .describe(\"Only return tasks with no assignee (mutually exclusive with assigneeId)\"),\n subProjectId: BOARD_FILTER,\n limit: z.number().optional().describe(\"Max results to return (default 20)\"),\n },\n async (params) => {\n const tasks = await conn.searchTasks(params);\n return {\n content: [{ type: \"text\", text: JSON.stringify(tasks.map(summarizeTask), null, 2) }],\n };\n },\n );\n}\n\nfunction registerListTags(server: McpServer, conn: ConveyorConnection): void {\n registerContractTool(server, listTagsContract, async (params) => {\n const tags = await conn.listTags(params.projectId);\n return { content: [{ type: \"text\", text: JSON.stringify(tags, null, 2) }] };\n });\n}\n\nfunction registerReviewTools(server: McpServer, conn: ConveyorConnection): void {\n server.tool(\n \"approve_task\",\n \"Move a task forward in the review flow (ReviewPR -> ReviewDev, or -> Complete). Pass projectId to target a specific project; otherwise the configured default project is used.\",\n {\n projectId: z.string().optional().describe(\"Target Conveyor project ID\"),\n taskId: z.string().describe(\"The task ID\"),\n risk: z\n .enum(RISK_ENUM)\n .optional()\n .describe(\"Optional risk level to record; defaults to a raise-only 'low' on approval.\"),\n },\n async (params) => {\n const result = await conn.approveTask(params.taskId, params.projectId, params.risk);\n return {\n content: [{ type: \"text\", text: `Task approved, new status: ${result.status}` }],\n };\n },\n );\n\n registerContractTool(server, approveAndMergePrContract, async (params) => {\n const result = await conn.approveAndMergePR(params.childTaskId, params.projectId);\n return {\n content: [\n {\n type: \"text\",\n text: `PR #${result.prNumber} approved and merged for task ${result.childTaskId}`,\n },\n ],\n };\n });\n\n server.tool(\n \"request_changes\",\n \"Post feedback and send task back to InProgress for more work. Pass projectId to target a specific project; otherwise the configured default project is used.\",\n {\n projectId: z.string().optional().describe(\"Target Conveyor project ID\"),\n taskId: z.string().describe(\"The task ID\"),\n feedback: z.string().describe(\"Feedback message describing requested changes\"),\n risk: z\n .enum(RISK_ENUM)\n .optional()\n .describe(\"Optional risk level to record; defaults to a raise-only 'medium' on changes.\"),\n },\n async (params) => {\n await conn.requestChanges(params.taskId, params.feedback, params.projectId, params.risk);\n return { content: [{ type: \"text\", text: \"Changes requested, task moved to InProgress\" }] };\n },\n );\n}\n\nfunction formatReviewerList(reviewers: Array<{ userId: string; name: string | null }>): string {\n if (reviewers.length === 0) return \"none\";\n return reviewers.map((r) => `${r.name ?? \"unknown\"} (${r.userId})`).join(\", \");\n}\n\nfunction registerReviewerTools(server: McpServer, conn: ConveyorConnection): void {\n server.tool(\n \"add_reviewer\",\n \"Add a project member as a reviewer on a task. Pass projectId to target a specific project; otherwise the configured default project is used. Idempotent — adding an existing reviewer is a no-op.\",\n {\n projectId: z.string().optional().describe(\"Target Conveyor project ID\"),\n taskId: z.string().describe(\"The task ID or slug\"),\n userId: z\n .string()\n .describe(\"User ID of the reviewer (use list_project_members to resolve a name or email)\"),\n },\n async (params) => {\n const result = await conn.addReviewer(params);\n return {\n content: [\n {\n type: \"text\",\n text: `Reviewer added to task ${result.taskId}. Reviewers: ${formatReviewerList(result.reviewers)}`,\n },\n ],\n };\n },\n );\n\n server.tool(\n \"remove_reviewer\",\n \"Remove a reviewer from a task. Pass projectId to target a specific project; otherwise the configured default project is used. Idempotent — removing a non-reviewer is a no-op.\",\n {\n projectId: z.string().optional().describe(\"Target Conveyor project ID\"),\n taskId: z.string().describe(\"The task ID or slug\"),\n userId: z.string().describe(\"User ID of the reviewer to remove\"),\n },\n async (params) => {\n const result = await conn.removeReviewer(params);\n return {\n content: [\n {\n type: \"text\",\n text: `Reviewer removed from task ${result.taskId}. Reviewers: ${formatReviewerList(result.reviewers)}`,\n },\n ],\n };\n },\n );\n}\n\nexport function registerTaskTools(server: McpServer, conn: ConveyorConnection): void {\n registerListTasks(server, conn);\n registerGetTask(server, conn);\n registerGetCardBySlug(server, conn);\n registerCreateTask(server, conn);\n registerUpdateTask(server, conn);\n registerMoveCard(server, conn);\n registerChatTools(server, conn);\n registerGetTaskCli(server, conn);\n registerGetTaskSessions(server, conn);\n registerSearchTasks(server, conn);\n registerListTags(server, conn);\n registerReviewTools(server, conn);\n registerReviewerTools(server, conn);\n}\n","// src/tool-contracts/spec.ts\nvar f = {\n string(opts) {\n return { kind: \"string\", ...opts };\n },\n number(opts) {\n return { kind: \"number\", ...opts };\n },\n boolean(opts) {\n return { kind: \"boolean\", ...opts };\n },\n enum(values, opts) {\n return { kind: \"enum\", values, ...opts };\n },\n array(item, opts) {\n return { kind: \"array\", item, ...opts };\n },\n object(fields, opts) {\n return { kind: \"object\", fields, ...opts };\n },\n optional(inner) {\n return { kind: \"optional\", inner };\n }\n};\n\n// src/tool-contracts/compile.ts\nfunction compileString(z, spec) {\n let schema = z.string();\n if (spec.min !== void 0) schema = schema.min(spec.min);\n if (spec.max !== void 0) schema = schema.max(spec.max);\n return schema;\n}\nfunction compileNumber(z, spec) {\n let schema = z.number();\n if (spec.int) schema = schema.int();\n if (spec.positive) schema = schema.positive();\n if (spec.nonnegative) schema = schema.nonnegative();\n if (spec.min !== void 0) schema = schema.min(spec.min);\n if (spec.max !== void 0) schema = schema.max(spec.max);\n return schema;\n}\nfunction compileArray(z, spec) {\n let schema = z.array(compileField(z, spec.item));\n if (spec.min !== void 0) schema = schema.min(spec.min);\n return schema;\n}\nfunction compileBase(z, spec) {\n switch (spec.kind) {\n case \"string\":\n return compileString(z, spec);\n case \"number\":\n return compileNumber(z, spec);\n case \"boolean\":\n return z.boolean();\n case \"enum\":\n return z.enum([...spec.values]);\n case \"array\":\n return compileArray(z, spec);\n case \"object\":\n return z.object(compileShape(z, spec.fields));\n }\n}\nfunction compileField(z, spec) {\n if (spec.kind === \"optional\") {\n return compileField(z, spec.inner).optional();\n }\n const schema = compileBase(z, spec);\n return spec.desc === void 0 ? schema : schema.describe(spec.desc);\n}\nfunction compileShape(z, fields) {\n const shape = {};\n for (const [key, spec] of Object.entries(fields)) {\n shape[key] = compileField(z, spec);\n }\n return shape;\n}\n\n// src/tool-contracts/contract.ts\nfunction defineToolContract(contract) {\n return contract;\n}\n\n// src/tool-contracts/fields.ts\nvar mcpProjectId = f.optional(f.string({ desc: \"Target Conveyor project ID\" }));\n\n// src/tool-contracts/tasks.ts\nvar getTaskContract = defineToolContract({\n name: \"get_task\",\n agent: {\n description: \"Look up any task by slug or ID. Returns JSON with id, slug, title, description, plan, status, branch, githubPRNumber, githubPRUrl, storyPoints. For children use list_subtasks.\",\n fields: {\n slug_or_id: f.string({ desc: \"The task slug (e.g. 'my-task') or CUID\" })\n }\n },\n mcp: {\n description: \"Get full task details including plan, chat history, PR info, subtasks, and build status. Pass projectId to target a specific project; otherwise the configured default project is used.\",\n fields: {\n projectId: mcpProjectId,\n taskId: f.string({\n desc: \"The task ID or slug (the value in a card URL, /cards/<slug>)\"\n })\n }\n }\n});\nvar postToChatContract = defineToolContract({\n name: \"post_to_chat\",\n agent: {\n description: \"Post a message to the task chat for the team to see. Your turn output is NOT shown in chat, so this is the only way the team sees your status, summaries, and questions. Omit task_id to post to the current task's chat; pass a child's ID to message its chat.\",\n fields: {\n message: f.optional(f.string({ desc: \"The message to post to the team\" })),\n content: f.optional(\n f.string({\n desc: \"Alias of `message` (the external conveyor-mcp surface names this field `content`). Provide exactly one of the two.\"\n })\n ),\n task_id: f.optional(\n f.string({\n desc: \"Child task ID to post to. Omit to post to the current task's chat.\"\n })\n ),\n milestone: f.optional(\n f.enum([\"plan_ready\", \"implementation_complete\", \"blocked\"], {\n desc: \"Declare a narrative milestone instead of a routine update. Use SPARINGLY \\u2014 only when the plan is ready, implementation is complete, or you are blocked. Milestones appear on the card's activity timeline and in Slack.\"\n })\n )\n }\n },\n mcp: {\n description: \"Post a message to a task's chat. Pass projectId to target a specific project; otherwise the configured default project is used.\",\n fields: {\n projectId: mcpProjectId,\n taskId: f.string({ desc: \"The task ID\" }),\n content: f.optional(f.string({ desc: \"Message content\" })),\n message: f.optional(\n f.string({\n desc: \"Alias of `content` (the in-pod agent surface names this field `message`). Provide exactly one of the two.\"\n })\n )\n }\n }\n});\nvar readTaskChatContract = defineToolContract({\n name: \"read_task_chat\",\n agent: {\n description: \"Read recent human/user chat messages for a task. Omit task_id for the current task; pass a child ID for a child's chat. For agent logs use get_execution_logs.\",\n fields: {\n limit: f.optional(f.number({ desc: \"Number of recent messages to fetch (default 20)\" })),\n task_id: f.optional(\n f.string({\n desc: \"Child task ID to read chat from. Omit to read the current task's chat.\"\n })\n )\n }\n },\n mcp: {\n description: \"Read messages from a task's chat. Pass projectId to target a specific project; otherwise the configured default project is used. For agent execution logs use get_task_logs.\",\n fields: {\n projectId: mcpProjectId,\n taskId: f.string({ desc: \"The task ID\" }),\n limit: f.optional(f.number({ desc: \"Max messages to return (default 50)\" }))\n }\n }\n});\nvar listTagsContract = defineToolContract({\n name: \"list_tags\",\n agent: {\n description: \"List this project's tags (id, name, color). Use the ids with update_tag.\",\n fields: {}\n },\n mcp: {\n description: \"List all project tags with their names, IDs, and colors. Pass projectId to target a specific project; otherwise the configured default project is used.\",\n fields: {\n projectId: mcpProjectId\n }\n }\n});\nvar childTaskIdForMerge = f.string({\n desc: \"The child task ID whose PR should be approved and merged\"\n});\nvar approveAndMergePrContract = defineToolContract({\n name: \"approve_and_merge_pr\",\n agent: {\n description: \"Approve and merge a child task's PR. Preconditions: child in ReviewPR. Returns { merged }: true = merged (status\\u2192ReviewDev); false = automerge queued, wait for ReviewDev.\",\n fields: {\n childTaskId: childTaskIdForMerge\n }\n },\n mcp: {\n description: \"Approve and merge a child task's pull request. Pass projectId to target a specific project; otherwise the configured default project is used. Only succeeds if all CI/CD checks are passing. The child task must be in ReviewPR status with a PR.\",\n fields: {\n projectId: mcpProjectId,\n childTaskId: childTaskIdForMerge\n }\n }\n});\nvar tasksContracts = [\n getTaskContract,\n postToChatContract,\n readTaskChatContract,\n listTagsContract,\n approveAndMergePrContract\n];\n\n// src/tool-contracts/checklists.ts\nvar mcpChecklistTaskId = f.string({ desc: \"The task ID or slug\" });\nvar testStatuses = f.optional(\n f.array(f.enum([\"open\", \"approved\", \"rejected\"]), {\n desc: \"Filter tests by status: open | approved | rejected\"\n })\n);\nvar setManualTestItems = f.array(\n f.object({ title: f.string({ min: 1, desc: \"A concise, actionable test step\" }) }),\n { min: 1, desc: \"List of manual test steps to add\" }\n);\nvar titleToEdit = f.string({ min: 1, desc: \"The current title of the manual test to edit\" });\nvar newTitle = f.string({ min: 1, desc: \"The new title for the manual test\" });\nvar titleToRemove = f.string({ min: 1, desc: \"The title of the manual test to remove\" });\nvar titleToApprove = f.string({ min: 1, desc: \"The title of the manual test to approve\" });\nvar titleToReject = f.string({ min: 1, desc: \"The title of the manual test to reject\" });\nvar rejectReason = f.string({\n min: 1,\n max: 2e3,\n desc: \"Why the test failed \\u2014 what went wrong, shown to the team\"\n});\nvar listManualTestsContract = defineToolContract({\n name: \"list_manual_tests\",\n agent: {\n description: \"List the manual test checklist items for the current task. Use to see what manual verification steps have already been recorded.\",\n fields: {}\n },\n mcp: {\n description: \"List the manual test checklist items for a task. Pass projectId to target a specific project; otherwise the configured default project is used. Use to see what manual verification steps have already been recorded.\",\n fields: {\n projectId: mcpProjectId,\n taskId: f.string({ desc: \"The task ID or slug (the value in a card URL, /cards/<slug>)\" })\n }\n }\n});\nvar queryManualTestsContract = defineToolContract({\n name: \"query_manual_tests\",\n agent: {\n description: \"Query manual tests across many tasks in this project, grouped by task. Filter by card status (ReviewDev, ReviewLive, Complete, ...) and/or test status (open | approved | rejected). Use to answer 'show all OPEN manual tests in ReviewDev' or 'show all REJECTED manual tests with the failing reason'. With no filters it defaults to the needs-attention view: open+rejected tests on ReviewDev/ReviewLive cards.\",\n fields: {\n cardStatuses: f.optional(\n f.array(f.string(), {\n desc: 'Filter tasks by card status, e.g. [\"ReviewDev\", \"ReviewLive\"]'\n })\n ),\n testStatuses\n }\n },\n mcp: {\n description: \"Query manual tests across many tasks in a project, grouped by task. Filter by card status (e.g. ReviewDev, ReviewLive, Complete) and/or test status (open | approved | rejected). Use to answer questions like 'show all OPEN manual tests in ReviewDev' or 'show all REJECTED manual tests in ReviewDev/ReviewLive with the failing reason'. With no filters it defaults to the needs-attention view: open+rejected tests on ReviewDev/ReviewLive cards. Pass projectId to target a specific project; otherwise the configured default project is used.\",\n fields: {\n projectId: mcpProjectId,\n cardStatuses: f.optional(\n f.array(f.string(), {\n desc: 'Filter tasks by card/column status, e.g. [\"ReviewDev\", \"ReviewLive\"]'\n })\n ),\n testStatuses\n }\n }\n});\nvar setManualTestsContract = defineToolContract({\n name: \"set_manual_tests\",\n agent: {\n description: \"Add manual test steps to the task checklist. Existing items with the same title are automatically skipped (deduplication). Use to record specific manual verification steps that reviewers should follow when testing this PR.\",\n fields: {\n items: setManualTestItems\n }\n },\n mcp: {\n description: \"Add manual test steps to a task's checklist. Pass projectId to target a specific project; otherwise the configured default project is used. Existing items with the same title are automatically skipped (deduplication). Use to record specific manual verification steps that reviewers should follow when testing the task's PR.\",\n fields: {\n projectId: mcpProjectId,\n taskId: mcpChecklistTaskId,\n items: setManualTestItems\n }\n }\n});\nvar editManualTestContract = defineToolContract({\n name: \"edit_manual_test\",\n agent: {\n description: \"Rename an existing manual test step. Identify the test by its current title (case-insensitive); pass the new title to replace it. Use to correct or refine a recorded manual verification step.\",\n fields: {\n title: titleToEdit,\n newTitle\n }\n },\n mcp: {\n description: \"Rename an existing manual test step on a task. Pass projectId to target a specific project; otherwise the configured default project is used. Identify the test by its current title (case-insensitive) and pass the new title to replace it.\",\n fields: {\n projectId: mcpProjectId,\n taskId: mcpChecklistTaskId,\n title: titleToEdit,\n newTitle\n }\n }\n});\nvar removeManualTestContract = defineToolContract({\n name: \"remove_manual_test\",\n agent: {\n description: \"Remove an existing manual test step from the task checklist. Identify the test by its title (case-insensitive). Use to delete a stale or incorrect manual verification step.\",\n fields: {\n title: titleToRemove\n }\n },\n mcp: {\n description: \"Remove an existing manual test step from a task's checklist. Pass projectId to target a specific project; otherwise the configured default project is used. Identify the test by its title (case-insensitive).\",\n fields: {\n projectId: mcpProjectId,\n taskId: mcpChecklistTaskId,\n title: titleToRemove\n }\n }\n});\nvar approveManualTestContract = defineToolContract({\n name: \"approve_manual_test\",\n agent: {\n description: \"Sign off on (approve) a manual test step on behalf of your authenticated user. Identify the test by its title (case-insensitive). Use after you have verified the step passes.\",\n fields: {\n title: titleToApprove\n }\n },\n mcp: {\n description: \"Sign off on (approve) a manual test step on a task on behalf of your authenticated user. Pass projectId to target a specific project; otherwise the configured default project is used. Identify the test by its title (case-insensitive). Use after you have verified the step passes.\",\n fields: {\n projectId: mcpProjectId,\n taskId: mcpChecklistTaskId,\n title: titleToApprove\n }\n }\n});\nvar rejectManualTestContract = defineToolContract({\n name: \"reject_manual_test\",\n agent: {\n description: \"Flag an issue with (reject) a manual test step on behalf of your authenticated user, recording the reason. Identify the test by its title (case-insensitive). Use when the step fails verification.\",\n fields: {\n title: titleToReject,\n reason: rejectReason\n }\n },\n mcp: {\n description: \"Flag an issue with (reject) a manual test step on a task on behalf of your authenticated user, recording the reason. Pass projectId to target a specific project; otherwise the configured default project is used. Identify the test by its title (case-insensitive). Use when the step fails verification.\",\n fields: {\n projectId: mcpProjectId,\n taskId: mcpChecklistTaskId,\n title: titleToReject,\n reason: rejectReason\n }\n }\n});\nvar checklistContracts = [\n listManualTestsContract,\n queryManualTestsContract,\n setManualTestsContract,\n editManualTestContract,\n removeManualTestContract,\n approveManualTestContract,\n rejectManualTestContract\n];\n\n// src/tool-contracts/dependencies.ts\nvar getDependenciesContract = defineToolContract({\n name: \"get_dependencies\",\n agent: {\n description: \"Get this task's dependencies and their met/unmet status (met = merged to dev). Use to confirm blockers merged, or see why a task cannot start. For task state use get_task.\",\n fields: {}\n },\n mcp: {\n description: \"Get a task's dependencies and their met/unmet status (met = merged to dev). Pass projectId to target a specific project; otherwise the configured default project is used. Use to confirm blockers merged, or see why a task cannot start. For task state use get_task.\",\n fields: {\n projectId: mcpProjectId,\n taskId: f.string({ desc: \"The task ID\" })\n }\n }\n});\nvar addDependencyContract = defineToolContract({\n name: \"add_dependency\",\n agent: {\n description: \"Add a blocking dependency \\u2014 this task cannot start until the named task is merged to dev. For post-task follow-ups use create_follow_up_task instead.\",\n fields: {\n depends_on_slug_or_id: f.string({ desc: \"Slug or ID of the task this task depends on\" })\n }\n },\n mcp: {\n description: \"Add a blocking dependency \\u2014 this task cannot start until the named task is merged to dev. Pass projectId to target a specific project; otherwise the configured default project is used.\",\n fields: {\n projectId: mcpProjectId,\n taskId: f.string({ desc: \"The task ID that will be blocked\" }),\n dependsOnSlugOrId: f.string({ desc: \"Slug or ID of the task this one depends on\" })\n }\n }\n});\nvar removeDependencyContract = defineToolContract({\n name: \"remove_dependency\",\n agent: {\n description: \"Remove a previously added dependency from this task. When to use: the dependency was added in error or is no longer relevant. Returns: confirmation string.\",\n fields: {\n depends_on_slug_or_id: f.string({ desc: \"Slug or ID of the task to remove as dependency\" })\n }\n },\n mcp: {\n description: \"Remove a previously added dependency from a task. Pass projectId to target a specific project; otherwise the configured default project is used. The task is no longer blocked by the named task. Returns: confirmation string.\",\n fields: {\n projectId: mcpProjectId,\n taskId: f.string({ desc: \"The task ID to unblock\" }),\n dependsOnSlugOrId: f.string({ desc: \"Slug or ID of the dependency to remove\" })\n }\n }\n});\nvar dependenciesContracts = [\n getDependenciesContract,\n addDependencyContract,\n removeDependencyContract\n];\n\n// src/tool-contracts/subtasks.ts\nvar SP_DESCRIPTION = \"Story point value (1=Common, 2=Magic, 3=Rare, 5=Unique)\";\nvar AGENT_FOLLOW_PARENT_STATUS = \"Child mirrors the parent task's status automatically \\u2014 for subtasks that ship on the parent's branch/PR with no build or PR of their own. Manual status writes on a follower stick only until the parent's next transition.\";\nvar MCP_FOLLOW_PARENT_STATUS = \"When true, this subtask mirrors the parent task's status automatically \\u2014 for children that ship on the parent's branch/PR and have no build or PR of their own. Manual status writes on a follower stick only until the parent's next transition.\";\nvar AGENT_DEPENDS_ON = \"Sibling subtask ids or slugs this subtask blocks on (it won't start until they merge to dev). Set explicit dependency metadata here instead of describing order in the plan text \\u2014 the pack runner schedules children off these edges. Omit / leave empty for independent children so they run in parallel.\";\nvar MCP_STATUS_ENUM = [\n \"Planning\",\n \"Open\",\n \"InProgress\",\n \"ReviewPR\",\n \"ReviewDev\",\n \"ReviewLive\",\n \"Complete\",\n \"Cancelled\"\n];\nvar createSubtaskContract = defineToolContract({\n name: \"create_subtask\",\n agent: {\n description: \"Create a subtask under the current parent task. Use when breaking a complex parent into smaller pieces during planning. For post-task follow-ups use create_follow_up_task.\",\n fields: {\n title: f.string({ desc: \"Subtask title\" }),\n description: f.optional(f.string({ desc: \"Brief description\" })),\n plan: f.optional(f.string({ desc: \"Implementation plan in markdown\" })),\n ordinal: f.optional(f.number({ desc: \"Step/order number (0-based)\" })),\n storyPointValue: f.optional(f.number({ desc: SP_DESCRIPTION })),\n followParentStatus: f.optional(f.boolean({ desc: AGENT_FOLLOW_PARENT_STATUS })),\n dependsOn: f.optional(f.array(f.string(), { desc: AGENT_DEPENDS_ON }))\n }\n },\n mcp: {\n description: \"Create a subtask under a parent task. Pass projectId to target a specific project; otherwise the configured default project is used. Subtasks break a larger task into independently buildable pieces. For children that instead ship on the parent's own branch/PR (e.g. per-theme tracking cards for one bundled PR), set followParentStatus so their status rides the parent's automatically.\",\n fields: {\n projectId: mcpProjectId,\n parentTaskId: f.string({ desc: \"The parent task ID\" }),\n title: f.string({ desc: \"Subtask title\" }),\n description: f.optional(f.string({ desc: \"Subtask description\" })),\n plan: f.optional(f.string({ desc: \"Subtask implementation plan (markdown)\" })),\n ordinal: f.optional(f.number({ desc: \"Ordering position among siblings\" })),\n storyPointValue: f.optional(f.number({ desc: SP_DESCRIPTION })),\n followParentStatus: f.optional(f.boolean({ desc: MCP_FOLLOW_PARENT_STATUS })),\n dependsOn: f.optional(\n f.array(f.string(), {\n desc: \"Sibling subtask ids or slugs this subtask blocks on (it won't start until they merge to dev). Set explicit dependency metadata here instead of describing order in the plan text. Omit / leave empty for independent children so they run in parallel.\"\n })\n ),\n tags: f.optional(\n f.array(f.string(), {\n desc: 'Tag names to assign to the subtask (e.g. [\"refactor\"]). Unknown names are rejected \\u2014 create the tag first with manage_tags. Use list_tags to see available tags.'\n })\n )\n }\n }\n});\nvar updateSubtaskContract = defineToolContract({\n name: \"update_subtask\",\n agent: {\n description: \"Update an existing subtask's fields (title, description, plan, ordinal, storyPointValue, dependsOn) \\u2014 and the sanctioned path to make a child buildable: promote it to status Open, assign its agent (agentIdOrName), and set story points. Setting story points does NOT auto-promote; set status explicitly. For the current task use update_task_plan.\",\n fields: {\n subtaskId: f.string({ desc: \"The subtask ID to update\" }),\n title: f.optional(f.string()),\n description: f.optional(f.string()),\n plan: f.optional(f.string()),\n status: f.optional(\n f.enum([\"Planning\", \"Open\"], {\n desc: 'Move the child between \"Planning\" and \"Open\". \"Open\" marks it ready to execute \\u2014 required before start_child_cloud_build. Execution statuses transition automatically.'\n })\n ),\n agentIdOrName: f.optional(\n f.string({\n desc: \"Assign a project agent to the child (agent id or exact name from the Project Agents list). Required before start_child_cloud_build.\"\n })\n ),\n ordinal: f.optional(f.number()),\n storyPointValue: f.optional(f.number({ desc: SP_DESCRIPTION })),\n followParentStatus: f.optional(f.boolean({ desc: AGENT_FOLLOW_PARENT_STATUS })),\n dependsOn: f.optional(\n f.array(f.string(), {\n desc: `${AGENT_DEPENDS_ON} Replaces the full dependency set \\u2014 pass [] to clear all, omit to leave unchanged.`\n })\n )\n }\n },\n mcp: {\n description: \"Update a subtask's fields: title, description, plan, status, ordering, story points, or dependencies. Pass projectId to target a specific project; otherwise the configured default project is used. Moving a subtask beyond Planning auto-fills missing story points and agent assignment \\u2014 don't spend turns on them.\",\n fields: {\n projectId: mcpProjectId,\n subtaskId: f.string({ desc: \"The subtask ID\" }),\n title: f.optional(f.string({ desc: \"New title\" })),\n description: f.optional(f.string({ desc: \"New description\" })),\n plan: f.optional(f.string({ desc: \"New plan (markdown)\" })),\n status: f.optional(f.enum(MCP_STATUS_ENUM, { desc: \"New status\" })),\n ordinal: f.optional(f.number({ desc: \"New ordering position among siblings\" })),\n storyPointValue: f.optional(f.number({ desc: SP_DESCRIPTION })),\n followParentStatus: f.optional(f.boolean({ desc: MCP_FOLLOW_PARENT_STATUS })),\n dependsOn: f.optional(\n f.array(f.string(), {\n desc: \"Replace the sibling subtask ids/slugs this subtask blocks on (pass [] to clear). Omit to leave dependencies unchanged.\"\n })\n )\n }\n }\n});\nvar deleteSubtaskContract = defineToolContract({\n name: \"delete_subtask\",\n agent: {\n description: \"Delete a subtask by id. When to use: a subtask was created in error or is no longer needed. Returns: confirmation string.\",\n fields: {\n subtaskId: f.string({ desc: \"The subtask ID to delete\" })\n }\n },\n mcp: {\n description: \"Delete a subtask by ID. Pass projectId to target a specific project; otherwise the configured default project is used. This is permanent \\u2014 use update_subtask to set status to Cancelled if you only want to close it.\",\n fields: {\n projectId: mcpProjectId,\n subtaskId: f.string({ desc: \"The subtask ID to delete\" })\n }\n }\n});\nvar listSubtasksContract = defineToolContract({\n name: \"list_subtasks\",\n agent: {\n description: \"List all subtasks under the current parent task. Default compact view returns per child: status, agent, story points, PR number/state, dependencies, and holdsBuildSlot \\u2014 plus packSlots (in-flight environments vs the PACK_CHILD_LIMIT cap, and which children hold the slots). Use to coordinate child work; pass verbose:true only when you need full description/plan text (large). For non-child tasks use get_task.\",\n fields: {\n verbose: f.optional(\n f.boolean({\n desc: \"Return full task rows including description and plan text (large \\u2014 can exceed tool result limits on big packs). Default: compact orchestration view.\"\n })\n )\n }\n },\n mcp: {\n description: \"List all subtasks of a parent task with their status and ordering. Pass projectId to target a specific project; otherwise the configured default project is used.\",\n fields: {\n projectId: mcpProjectId,\n taskId: f.string({ desc: \"The parent task ID\" })\n }\n }\n});\nvar subtasksContracts = [\n createSubtaskContract,\n updateSubtaskContract,\n deleteSubtaskContract,\n listSubtasksContract\n];\n\n// src/tool-contracts/attachments.ts\nvar mcpTaskIdOrSlug = f.string({ desc: \"The task ID or slug\" });\nvar listTaskFilesContract = defineToolContract({\n name: \"list_task_files\",\n agent: {\n description: \"List all files attached to this task with metadata. Use before fetching a specific file to see what is available and how large each is. For file contents use get_attachment.\",\n fields: {}\n },\n mcp: {\n description: \"List all files attached to a task with metadata (no contents \\u2014 fast and small). Pass projectId to target a specific project; otherwise the configured default project is used. Use before fetching a specific file to see what is available and how large each is. For file contents use get_attachment.\",\n fields: {\n projectId: mcpProjectId,\n taskId: mcpTaskIdOrSlug\n }\n }\n});\nvar getAttachmentContract = defineToolContract({\n name: \"get_attachment\",\n agent: {\n description: \"Fetch one task file's content plus metadata by file ID. Call list_task_files first to discover IDs and check sizes \\u2014 large binaries may be truncated by the service's size limit.\",\n fields: {\n fileId: f.string({ desc: \"The file ID to retrieve\" })\n }\n },\n mcp: {\n description: \"Fetch one task file's content plus metadata by file ID (accepts task id or slug). Pass projectId to target a specific project; otherwise the configured default project is used. Images are returned as viewable image blocks. Large text files (logs, JSON) are returned in pages \\u2014 use `offset`/`maxBytes` to read more, or fetch `downloadUrl` for the whole file. Call list_task_files first to discover IDs and sizes.\",\n fields: {\n projectId: mcpProjectId,\n taskId: mcpTaskIdOrSlug,\n fileId: f.string({ desc: \"The file ID to fetch\" }),\n offset: f.optional(\n f.number({\n int: true,\n nonnegative: true,\n desc: \"Byte offset into text content (paging). Default 0.\"\n })\n ),\n maxBytes: f.optional(\n f.number({\n int: true,\n positive: true,\n desc: \"Max bytes of text content to return from offset.\"\n })\n )\n }\n }\n});\nvar uploadAttachmentContract = defineToolContract({\n name: \"upload_attachment\",\n agent: {\n description: \"Upload an image file (e.g. a Playwright screenshot) as a task attachment AND post it to the task chat in one step \\u2014 no follow-up post_to_chat call needed. Supports png/jpg/gif/webp.\",\n fields: {\n path: f.string({\n desc: \"Path to the image file \\u2014 absolute, or relative to the workspace root\"\n }),\n title: f.optional(\n f.string({ desc: \"Short caption posted with the image (defaults to the file name)\" })\n )\n }\n },\n mcp: {\n description: \"Upload a local file as a task attachment (any file type, up to 25MB). Pass projectId to target a specific project; otherwise the configured default project is used. The file appears under the task's Files. Pass `comment` to also post it to the task chat in the same step.\",\n fields: {\n projectId: mcpProjectId,\n taskId: mcpTaskIdOrSlug,\n path: f.string({ desc: \"Absolute path to the local file to upload\" }),\n comment: f.optional(\n f.string({ desc: \"When set, also posts the attachment to the task chat with this text\" })\n ),\n mimeType: f.optional(\n f.string({ desc: \"Override the mime type inferred from the file extension\" })\n )\n }\n }\n});\nvar attachmentsContracts = [\n listTaskFilesContract,\n getAttachmentContract,\n uploadAttachmentContract\n];\n\n// src/tool-contracts/suggestions.ts\nvar createSuggestionContract = defineToolContract({\n name: \"create_suggestion\",\n agent: {\n description: \"File a project suggestion (idea/improvement for maintainers to review). Duplicates are AI-deduped into an existing suggestion with an upvote. Returns the suggestion id.\",\n fields: {\n title: f.string({ min: 1, desc: \"Short title\" }),\n description: f.optional(f.string({ desc: \"1-3 sentences: what should change and why\" })),\n tag_names: f.optional(f.array(f.string(), { desc: \"Tag names to categorize\" }))\n }\n },\n mcp: {\n description: \"Suggest a feature, improvement, rule, or idea for the project. Pass projectId to target a specific project; otherwise the configured default project is used. Duplicates are deduped and your upvote is recorded.\",\n fields: {\n projectId: mcpProjectId,\n title: f.string({ desc: \"Suggestion title\" }),\n description: f.optional(f.string({ desc: \"Suggestion details (markdown)\" })),\n tagNames: f.optional(\n f.array(f.string(), {\n desc: 'Tag names to categorize the suggestion (e.g., [\"agent-runner\"])'\n })\n )\n }\n }\n});\nvar suggestionsContracts = [createSuggestionContract];\n\n// src/tool-contracts/pull-request.ts\nvar createPullRequestContract = defineToolContract({\n name: \"create_pull_request\",\n agent: {\n description: \"Create a GitHub PR for this task. Auto-stages, commits (commitMessage or title default), pushes to origin, then opens the PR. Always use this instead of gh CLI or raw git.\",\n fields: {\n title: f.string({ desc: \"The PR title\" }),\n body: f.string({ desc: \"The PR description/body in markdown\" }),\n branch: f.optional(\n f.string({\n desc: \"The head branch name for the PR. If the task doesn't have a branch set, this will be used. Defaults to the task's existing branch.\"\n })\n ),\n baseBranch: f.optional(\n f.string({\n desc: \"The base branch to target for the PR (e.g. 'main', 'develop'). Defaults to the project's configured dev branch.\"\n })\n ),\n commitMessage: f.optional(\n f.string({\n desc: \"Commit message for staging uncommitted changes. If not provided, a default message based on the PR title will be used.\"\n })\n ),\n skipVerify: f.optional(\n f.boolean({\n desc: \"Controls the local pre-push quality gate (lint/typecheck/test). Defaults to true (--no-verify): the push skips the local gate because you should run gates yourself before opening the PR and CI re-runs them on the resulting PR. Running the full gate synchronously during the push would block the agent's event loop long enough to drop the Conveyor socket connection. Pass false to force the local pre-push hook to run.\"\n })\n )\n }\n },\n mcp: {\n description: \"Open a GitHub pull request for a task's existing branch (the branch must already be pushed to origin). Pass projectId to target a specific project; otherwise the configured default project is used. Moves the task to ReviewPR. Returns the PR number and URL.\",\n fields: {\n projectId: mcpProjectId,\n taskId: f.string({ desc: \"The task ID whose branch should be opened as a PR\" }),\n title: f.string({ desc: \"Pull request title\" }),\n body: f.string({ desc: \"Pull request body (markdown)\" }),\n head: f.optional(\n f.string({ desc: \"Source branch for the PR (defaults to the task's branch)\" })\n ),\n base: f.optional(\n f.string({ desc: \"Target branch for the PR (defaults to the repo default)\" })\n )\n }\n }\n});\nvar pullRequestContracts = [createPullRequestContract];\n\n// src/tool-contracts/index.ts\nvar TOOL_CONTRACTS = Object.fromEntries(\n [\n ...tasksContracts,\n ...checklistContracts,\n ...dependenciesContracts,\n ...subtasksContracts,\n ...attachmentsContracts,\n ...suggestionsContracts,\n ...pullRequestContracts\n ].map((contract) => [contract.name, contract])\n);\nexport {\n TOOL_CONTRACTS,\n addDependencyContract,\n approveAndMergePrContract,\n approveManualTestContract,\n attachmentsContracts,\n checklistContracts,\n compileShape,\n createPullRequestContract,\n createSubtaskContract,\n createSuggestionContract,\n defineToolContract,\n deleteSubtaskContract,\n dependenciesContracts,\n editManualTestContract,\n f,\n getAttachmentContract,\n getDependenciesContract,\n getTaskContract,\n listManualTestsContract,\n listSubtasksContract,\n listTagsContract,\n listTaskFilesContract,\n mcpProjectId,\n postToChatContract,\n pullRequestContracts,\n queryManualTestsContract,\n readTaskChatContract,\n rejectManualTestContract,\n removeDependencyContract,\n removeManualTestContract,\n setManualTestsContract,\n subtasksContracts,\n suggestionsContracts,\n tasksContracts,\n updateSubtaskContract,\n uploadAttachmentContract\n};\n","/**\n * Bridge from shared tool contracts to `server.tool()` registrations.\n *\n * Contracts are zod-version-neutral DATA (`@project/shared/tool-contracts`);\n * this package compiles them with its OWN zod (v3) so every registered\n * shape is a genuine zod-v3 object — the test suite wraps registered\n * shapes with v3 `z.object(...)`, and mixing zod majors inside one schema\n * tree is undefined behavior. Handler inputs are typed from the contract\n * data (`InferShape`) to stay off zod's object-inference hot path.\n */\nimport { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { CallToolResult } from \"@modelcontextprotocol/sdk/types.js\";\nimport {\n compileShape,\n type FieldMap,\n type InferField,\n type InferShape,\n type OptionalSpec,\n type ToolContract,\n type ToolSurface,\n} from \"@project/shared/tool-contracts\";\n\n/** Precise zod-v3 shape type for a contract surface (optional specs → ZodOptional keys). */\nexport type McpContractShape<F extends FieldMap> = {\n [K in keyof F]: F[K] extends OptionalSpec<infer I>\n ? z.ZodOptional<z.ZodType<InferField<I>>>\n : z.ZodType<InferField<F[K]>>;\n};\n\nexport function mcpShape<F extends FieldMap>(surface: ToolSurface<F>): McpContractShape<F> {\n return compileShape(z, surface.fields) as McpContractShape<F>;\n}\n\n/** Register a contract's mcp surface on the server with a typed handler. */\nexport function registerContractTool<M extends FieldMap>(\n server: McpServer,\n contract: ToolContract<FieldMap, M>,\n handler: (params: InferShape<M>) => Promise<CallToolResult>,\n): void {\n server.tool(\n contract.name,\n contract.mcp.description,\n mcpShape(contract.mcp) as unknown as z.ZodRawShape,\n handler as (params: unknown) => Promise<CallToolResult>,\n );\n}\n","import type { ConveyorConnection } from \"../connection.js\";\n\nconst CLI_EVENT_FORMATTERS: Record<string, (data: Record<string, unknown>) => string> = {\n thinking: (data) => String(data.message ?? \"\"),\n tool_use: (data) => `${data.tool}: ${String(data.input ?? \"\").slice(0, 1000)}`,\n tool_result: (data) =>\n `${data.tool} → ${String(data.output ?? \"\").slice(0, 500)}${data.isError ? \" [ERROR]\" : \"\"}`,\n message: (data) => String(data.content ?? \"\"),\n error: (data) => `ERROR: ${String(data.message ?? \"\")}`,\n completed: (data) =>\n `Completed: ${data.summary ?? \"\"} (cost: $${data.costUsd ?? \"?\"}, duration: ${data.durationMs ?? \"?\"}ms)`,\n setup_output: (data) => `[${data.stream ?? \"stdout\"}] ${String(data.data ?? \"\")}`,\n start_command_output: (data) => `[${data.stream ?? \"stdout\"}] ${String(data.data ?? \"\")}`,\n turn_end: (data) =>\n `Turn complete (${Array.isArray(data.toolCalls) ? data.toolCalls.length : 0} tool calls)`,\n};\n\nexport function formatCliEventSummary(type: string, data: Record<string, unknown>): string {\n const formatter = CLI_EVENT_FORMATTERS[type];\n return formatter ? formatter(data) : JSON.stringify(data);\n}\n\ntype TaskSessionState = Awaited<ReturnType<ConveyorConnection[\"getTaskSessions\"]>>[number];\ntype LegacyComputeSession = TaskSessionState[\"sessions\"][number];\ntype WorkspaceState = TaskSessionState[\"workspaces\"][number];\ntype WorkspaceSessionState = WorkspaceState[\"sessions\"][number];\n\nfunction formatLegacyComputeSession(s: LegacyComputeSession): string {\n return (\n ` - session ${s.id} [${s.provider}] pod=${s.instanceName ?? \"-\"} status=${s.status}` +\n ` runner=${s.agentRunnerStatus ?? \"-\"} lastHeartbeat=${s.lastHeartbeatAt ?? \"-\"}` +\n ` created=${s.createdAt} stopped=${s.stoppedAt ?? \"-\"}` +\n (s.deletionRequestedAt\n ? ` deletionRequested=${s.deletionRequestedAt} (attempts ${s.deletionAttempts})`\n : \"\") +\n (s.lastAgentEvent ? ` lastAgentEvent=${s.lastAgentEvent}` : \"\")\n );\n}\n\nfunction formatWorkspaceSession(s: WorkspaceSessionState): string {\n return (\n ` - workspaceSession ${s.id} role=${s.role} mode=${s.mode}` +\n ` status=${s.status} leaseUntil=${s.leaseUntil ?? \"-\"} created=${s.createdAt}`\n );\n}\n\nfunction formatWorkspace(w: WorkspaceState): string[] {\n const lines = [\n ` - workspace ${w.id} purpose=${w.purpose} desired=${w.desiredState}` +\n ` observed=${w.observedState} branch=${w.branch ?? \"-\"} checkoutRef=${w.checkoutRef ?? \"-\"}` +\n (w.pod ? ` pod=${w.pod.namespace}/${w.pod.name} podPhase=${w.pod.phase}` : \" pod=-\"),\n ];\n if (w.sessions.length === 0) {\n lines.push(\" (no workspace sessions)\");\n return lines;\n }\n lines.push(...w.sessions.map(formatWorkspaceSession));\n return lines;\n}\n\nexport function formatTaskSessionState(t: TaskSessionState): string[] {\n const review = t.codeReviewStatus\n ? ` codeReview=${t.codeReviewStatus} (attempts ${t.codeReviewAttempts})`\n : \"\";\n const kind = t.reviewTargetTaskId ? `review card for ${t.reviewTargetTaskId}` : t.type;\n const lines = [`# ${t.slug} — ${t.title} [${kind}, status ${t.status}]${review}`];\n if (t.sessions.length === 0) {\n lines.push(\" (no compute sessions)\");\n } else {\n lines.push(...t.sessions.map(formatLegacyComputeSession));\n }\n if (t.workspaces.length === 0) {\n lines.push(\" (no v3 workspaces)\");\n } else {\n lines.push(...t.workspaces.flatMap(formatWorkspace));\n }\n return lines;\n}\n\nconst DESCRIPTION_PREVIEW_CHARS = 300;\n\n/** List/search results omit `plan` and truncate `description` — `get_task` returns the full record. */\nexport function summarizeTask(task: unknown): unknown {\n if (typeof task !== \"object\" || task === null) return task;\n const { plan, description, ...rest } = task as Record<string, unknown>;\n const summary: Record<string, unknown> = { ...rest };\n summary.description =\n typeof description === \"string\" && description.length > DESCRIPTION_PREVIEW_CHARS\n ? `${description.slice(0, DESCRIPTION_PREVIEW_CHARS)}… [truncated — use get_task for the full description]`\n : (description ?? null);\n summary.hasPlan = typeof plan === \"string\" && plan.length > 0;\n return summary;\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { ConveyorConnection } from \"../connection.js\";\n\nfunction textResult(result: unknown): { content: Array<{ type: \"text\"; text: string }> } {\n return { content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }] };\n}\n\nfunction registerTaskLifecycleTools(server: McpServer, conn: ConveyorConnection): void {\n server.tool(\n \"stop_task\",\n \"Compatibility alias for the legacy stop path. stop_task now performs the same durable sleep behavior as sleep_task, preserving task Claudespace state while stopping compute. Pass projectId to target a specific project; otherwise the configured default project is used.\",\n {\n projectId: z.string().optional().describe(\"Target Conveyor project ID\"),\n taskId: z.string().describe(\"The task ID\"),\n },\n async (params) => textResult(await conn.sleepTask(params.taskId, params.projectId)),\n );\n\n server.tool(\n \"sleep_task\",\n \"Sleep a task Claudespace, stopping compute while preserving durable state. Pass projectId to target a specific project; otherwise the configured default project is used.\",\n {\n projectId: z.string().optional().describe(\"Target Conveyor project ID\"),\n taskId: z.string().describe(\"The task ID\"),\n },\n async (params) => textResult(await conn.sleepTask(params.taskId, params.projectId)),\n );\n\n server.tool(\n \"resume_task\",\n \"Resume a sleeping task Claudespace. Pass projectId to target a specific project; otherwise the configured default project is used.\",\n {\n projectId: z.string().optional().describe(\"Target Conveyor project ID\"),\n taskId: z.string().describe(\"The task ID\"),\n },\n async (params) => textResult(await conn.resumeTask(params.taskId, params.projectId)),\n );\n\n server.tool(\n \"delete_task_environment\",\n \"Delete a task environment, including durable Claudespace state. Pass projectId to target a specific project; otherwise the configured default project is used.\",\n {\n projectId: z.string().optional().describe(\"Target Conveyor project ID\"),\n taskId: z.string().describe(\"The task ID\"),\n },\n async (params) => textResult(await conn.deleteTaskEnvironment(params.taskId, params.projectId)),\n );\n}\n\nexport function registerBuildTools(server: McpServer, conn: ConveyorConnection): void {\n server.tool(\n \"start_task\",\n \"Start a cloud build (codespace) for a task. Pass projectId to target a specific project; otherwise the configured default project is used.\",\n {\n projectId: z.string().optional().describe(\"Target Conveyor project ID\"),\n taskId: z.string().describe(\"The task ID\"),\n },\n async (params) => {\n const result = await conn.startBuild(params.taskId, params.projectId);\n return textResult(result);\n },\n );\n\n registerTaskLifecycleTools(server, conn);\n\n server.tool(\n \"create_release\",\n \"Create a release for the project — the same flow as the Release button in the web UI. Pass projectId to target a specific project; otherwise the configured default project is used. Creates a release task with a release/YYYY.MM.N branch and a PR from the dev branch to the default branch. Omit taskIds to release ALL cards currently in Review (Dev); pass a subset to cherry-pick — a cloud build agent then cherry-picks those changes and resolves conflicts. Fails if a release is already in progress or no cards are in Review (Dev).\",\n {\n projectId: z.string().optional().describe(\"Target Conveyor project ID\"),\n taskIds: z\n .array(z.string())\n .optional()\n .describe(\n \"Task IDs in Review (Dev) to cherry-pick into the release. Omit to release all of them.\",\n ),\n },\n async (params) => {\n const result = await conn.createRelease(params.taskIds, params.projectId);\n return textResult(result);\n },\n );\n\n server.tool(\n \"add_to_release\",\n \"Add Review (Dev) cards to the project's pending release — the same flow as the 'Add to Release' button in the web UI. Pass projectId to target a specific project; otherwise the configured default project is used. Cards must be in Review (Dev) and not already part of another release; the release branch is updated with the latest dev changes. Fails if no release is pending (use create_release instead).\",\n {\n projectId: z.string().optional().describe(\"Target Conveyor project ID\"),\n taskIds: z\n .array(z.string())\n .min(1)\n .describe(\"Task IDs (not slugs) in Review (Dev) to add to the pending release.\"),\n },\n async (params) => {\n const result = await conn.addTasksToRelease(params.taskIds, params.projectId);\n return textResult(result);\n },\n );\n\n server.tool(\n \"get_build_status\",\n \"Check codespace and agent status for a task. Pass projectId to target a specific project; otherwise the configured default project is used.\",\n {\n projectId: z.string().optional().describe(\"Target Conveyor project ID\"),\n taskId: z.string().describe(\"The task ID\"),\n },\n async (params) => {\n const status = await conn.getBuildStatus(params.taskId, params.projectId);\n return textResult(status);\n },\n );\n}\n","import { readFile, stat } from \"node:fs/promises\";\nimport { basename, extname } from \"node:path\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport {\n getAttachmentContract,\n listTaskFilesContract,\n uploadAttachmentContract,\n} from \"@project/shared/tool-contracts\";\nimport type { ConveyorConnection } from \"../connection.js\";\nimport { registerContractTool } from \"./contract-tool.js\";\n\n// Mirrors MAX_FILE_SIZE_BYTES in @project/shared service-map.ts (conveyor-mcp\n// has no workspace dependencies — the server enforces the real limit).\nconst MAX_FILE_SIZE_BYTES = 25 * 1024 * 1024;\n\nconst MIME_BY_EXT: Record<string, string> = {\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".gif\": \"image/gif\",\n \".webp\": \"image/webp\",\n \".svg\": \"image/svg+xml\",\n \".txt\": \"text/plain\",\n \".log\": \"text/plain\",\n \".md\": \"text/markdown\",\n \".csv\": \"text/csv\",\n \".html\": \"text/html\",\n \".css\": \"text/css\",\n \".js\": \"text/javascript\",\n \".ts\": \"text/plain\",\n \".json\": \"application/json\",\n \".yaml\": \"application/yaml\",\n \".yml\": \"application/yaml\",\n \".pdf\": \"application/pdf\",\n \".zip\": \"application/zip\",\n \".gz\": \"application/gzip\",\n \".mp4\": \"video/mp4\",\n \".webm\": \"video/webm\",\n \".mp3\": \"audio/mpeg\",\n \".wav\": \"audio/wav\",\n};\n\nexport function inferMimeType(filePath: string, override?: string): string {\n if (override) return override;\n return MIME_BY_EXT[extname(filePath).toLowerCase()] ?? \"application/octet-stream\";\n}\n\nfunction registerListTaskFiles(server: McpServer, conn: ConveyorConnection): void {\n registerContractTool(server, listTaskFilesContract, async (params) => {\n const files = await conn.listTaskFiles(params.taskId, params.projectId);\n return { content: [{ type: \"text\", text: JSON.stringify(files, null, 2) }] };\n });\n}\n\nexport interface AttachmentResult {\n fileName?: string;\n mimeType?: string;\n fileSize?: number;\n content?: string;\n contentEncoding?: string;\n contentByteOffset?: number;\n contentTotalBytes?: number;\n contentTruncated?: boolean;\n downloadUrl?: string;\n}\n\nexport type AttachmentContentBlock =\n | { type: \"text\"; text: string }\n | { type: \"image\"; data: string; mimeType: string };\n\nfunction buildTextContent(file: AttachmentResult, content: string): AttachmentContentBlock[] {\n const start = file.contentByteOffset ?? 0;\n const shown = Buffer.byteLength(content, \"utf-8\");\n const total = file.contentTotalBytes ?? shown;\n const more = file.contentTruncated\n ? ` — showing bytes ${start}–${start + shown} of ${total}; pass offset=${start + shown} for the next page, or fetch the full file at downloadUrl`\n : \"\";\n const header = `${file.fileName ?? \"file\"} (${file.mimeType ?? \"?\"}, ${total} bytes)${more}\\n${file.downloadUrl ? `downloadUrl: ${file.downloadUrl}\\n` : \"\"}---\\n`;\n return [{ type: \"text\", text: header + content }];\n}\n\nfunction buildImageContent(\n file: AttachmentResult,\n content: string,\n mimeType: string,\n): AttachmentContentBlock[] {\n const header = `${file.fileName ?? \"file\"} (${mimeType}, ${file.fileSize ?? \"?\"} bytes)${file.downloadUrl ? `\\ndownloadUrl: ${file.downloadUrl}` : \"\"}`;\n return [\n { type: \"text\", text: header },\n { type: \"image\", data: content, mimeType },\n ];\n}\n\n/**\n * Convert an attachment DTO into MCP content blocks.\n *\n * - utf-8 text → metadata/paging header + raw text (not JSON.stringify'd —\n * that double-escapes it).\n * - base64 images → metadata header + a proper MCP image block so the model\n * actually sees the image. Dumping base64 into a text block both blows the\n * client's token limit and is unviewable.\n * - anything else → metadata JSON with `content` stripped, so inlined bytes\n * can never leak into a text block.\n */\nexport function buildAttachmentContent(file: AttachmentResult): AttachmentContentBlock[] {\n if (typeof file.content === \"string\" && file.contentEncoding === \"utf-8\") {\n return buildTextContent(file, file.content);\n }\n if (\n typeof file.content === \"string\" &&\n file.contentEncoding === \"base64\" &&\n file.mimeType?.startsWith(\"image/\")\n ) {\n return buildImageContent(file, file.content, file.mimeType);\n }\n const { content: _content, ...metadata } = file;\n return [{ type: \"text\", text: JSON.stringify(metadata, null, 2) }];\n}\n\nfunction registerGetAttachment(server: McpServer, conn: ConveyorConnection): void {\n registerContractTool(server, getAttachmentContract, async (params) => {\n const file = (await conn.getAttachment(params.taskId, params.fileId, {\n offset: params.offset,\n maxBytes: params.maxBytes,\n projectId: params.projectId,\n })) as AttachmentResult;\n return { content: buildAttachmentContent(file) };\n });\n}\n\nfunction registerUploadAttachment(server: McpServer, conn: ConveyorConnection): void {\n registerContractTool(server, uploadAttachmentContract, async (params) => {\n const info = await stat(params.path).catch(() => null);\n if (!info?.isFile()) {\n return { content: [{ type: \"text\" as const, text: `File not found: ${params.path}` }] };\n }\n if (info.size > MAX_FILE_SIZE_BYTES) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: `File is ${info.size} bytes — exceeds the ${MAX_FILE_SIZE_BYTES} byte (25MB) upload limit.`,\n },\n ],\n };\n }\n\n const fileName = basename(params.path);\n const mimeType = inferMimeType(params.path, params.mimeType);\n const { fileId, uploadUrl } = await conn.requestFileUpload(params.taskId, {\n fileName,\n mimeType,\n fileSize: info.size,\n projectId: params.projectId,\n });\n\n // PUT raw bytes to the capability upload URL (the API byte-proxy streams\n // them to GCS). Content-Type carries the mime so the stored object is set.\n const body = await readFile(params.path);\n const res = await fetch(uploadUrl, {\n method: \"PUT\",\n headers: { \"Content-Type\": mimeType },\n body,\n });\n if (!res.ok) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: `Upload to storage failed: HTTP ${res.status} ${await res.text().catch(() => \"\")}`,\n },\n ],\n };\n }\n\n const result = await conn.confirmFileUpload(\n params.taskId,\n fileId,\n params.comment,\n params.projectId,\n );\n const lines = [\n `Uploaded ${result.fileName} (${info.size} bytes, ${mimeType}). File ID: ${result.fileId}`,\n ];\n if (result.downloadUrl) lines.push(`downloadUrl: ${result.downloadUrl}`);\n if (result.messageId) lines.push(\"Posted to the task chat.\");\n return { content: [{ type: \"text\" as const, text: lines.join(\"\\n\") }] };\n });\n}\n\nexport function registerAttachmentTools(server: McpServer, conn: ConveyorConnection): void {\n registerListTaskFiles(server, conn);\n registerGetAttachment(server, conn);\n registerUploadAttachment(server, conn);\n}\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { createPullRequestContract } from \"@project/shared/tool-contracts\";\nimport type { ConveyorConnection } from \"../connection.js\";\nimport { registerContractTool } from \"./contract-tool.js\";\n\nexport function registerPullRequestTools(server: McpServer, conn: ConveyorConnection): void {\n registerContractTool(server, createPullRequestContract, async (params) => {\n const result = await conn.createPullRequest(params);\n return {\n content: [{ type: \"text\", text: `PR #${result.prNumber} opened: ${result.prUrl}` }],\n };\n });\n}\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport {\n createSubtaskContract,\n deleteSubtaskContract,\n listSubtasksContract,\n updateSubtaskContract,\n} from \"@project/shared/tool-contracts\";\nimport type { ConveyorConnection } from \"../connection.js\";\nimport { registerContractTool } from \"./contract-tool.js\";\n\nfunction registerCreateSubtask(server: McpServer, conn: ConveyorConnection): void {\n registerContractTool(server, createSubtaskContract, async (params) => {\n const subtask = await conn.createSubtask(params);\n return {\n content: [{ type: \"text\", text: `Subtask created: ${subtask.id} (slug: ${subtask.slug})` }],\n };\n });\n}\n\nfunction registerUpdateSubtask(server: McpServer, conn: ConveyorConnection): void {\n registerContractTool(server, updateSubtaskContract, async (params) => {\n const result = await conn.updateSubtask(params);\n return {\n content: [{ type: \"text\", text: `Subtask ${result.id} updated (status: ${result.status})` }],\n };\n });\n}\n\nfunction registerListSubtasks(server: McpServer, conn: ConveyorConnection): void {\n registerContractTool(server, listSubtasksContract, async (params) => {\n const subtasks = await conn.listSubtasks(params.taskId, params.projectId);\n return { content: [{ type: \"text\", text: JSON.stringify(subtasks, null, 2) }] };\n });\n}\n\nfunction registerDeleteSubtask(server: McpServer, conn: ConveyorConnection): void {\n registerContractTool(server, deleteSubtaskContract, async (params) => {\n const result = await conn.deleteSubtask(params.subtaskId, params.projectId);\n return {\n content: [{ type: \"text\", text: result.deleted ? \"Subtask deleted\" : \"Subtask not deleted\" }],\n };\n });\n}\n\nexport function registerSubtaskTools(server: McpServer, conn: ConveyorConnection): void {\n registerCreateSubtask(server, conn);\n registerUpdateSubtask(server, conn);\n registerListSubtasks(server, conn);\n registerDeleteSubtask(server, conn);\n}\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport {\n addDependencyContract,\n getDependenciesContract,\n removeDependencyContract,\n} from \"@project/shared/tool-contracts\";\nimport type { ConveyorConnection } from \"../connection.js\";\nimport { registerContractTool } from \"./contract-tool.js\";\n\nfunction registerGetDependencies(server: McpServer, conn: ConveyorConnection): void {\n registerContractTool(server, getDependenciesContract, async (params) => {\n const deps = await conn.getDependencies(params.taskId, params.projectId);\n return { content: [{ type: \"text\", text: JSON.stringify(deps, null, 2) }] };\n });\n}\n\nfunction registerAddDependency(server: McpServer, conn: ConveyorConnection): void {\n registerContractTool(server, addDependencyContract, async (params) => {\n await conn.addDependency(params);\n return { content: [{ type: \"text\", text: \"Dependency added\" }] };\n });\n}\n\nfunction registerRemoveDependency(server: McpServer, conn: ConveyorConnection): void {\n registerContractTool(server, removeDependencyContract, async (params) => {\n await conn.removeDependency(params);\n return { content: [{ type: \"text\", text: \"Dependency removed\" }] };\n });\n}\n\nexport function registerDependencyTools(server: McpServer, conn: ConveyorConnection): void {\n registerGetDependencies(server, conn);\n registerAddDependency(server, conn);\n registerRemoveDependency(server, conn);\n}\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { createSuggestionContract } from \"@project/shared/tool-contracts\";\nimport type { ConveyorConnection } from \"../connection.js\";\nimport { registerContractTool } from \"./contract-tool.js\";\n\nexport function registerSuggestionTools(server: McpServer, conn: ConveyorConnection): void {\n registerContractTool(server, createSuggestionContract, async (params) => {\n const result = await conn.createSuggestion(params);\n const text = result.merged\n ? `Suggestion merged into existing suggestion ${result.mergedIntoId} (upvote recorded)`\n : `Suggestion created: ${result.id}`;\n return { content: [{ type: \"text\", text }] };\n });\n}\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport {\n approveManualTestContract,\n editManualTestContract,\n listManualTestsContract,\n queryManualTestsContract,\n rejectManualTestContract,\n removeManualTestContract,\n setManualTestsContract,\n} from \"@project/shared/tool-contracts\";\nimport type { ConveyorConnection } from \"../connection.js\";\nimport { registerContractTool } from \"./contract-tool.js\";\n\ntype ManualTestGroup = Awaited<ReturnType<ConveyorConnection[\"queryManualTests\"]>>[number];\n\n/** Compact grouped rendering for cross-task manual-test queries: one header per\n * task, one line per test with a status glyph, and the failing reason indented\n * under each rejected test. */\nfunction renderManualTestGroups(groups: ManualTestGroup[]): string {\n const lines: string[] = [];\n for (const g of groups) {\n lines.push(`## ${g.title} [${g.status}] (${g.slug})`);\n for (const t of g.tests) {\n const mark = t.status === \"approved\" ? \"✓\" : t.status === \"rejected\" ? \"✗\" : \"○\";\n lines.push(` ${mark} ${t.title} — ${t.status}`);\n if (t.status === \"rejected\") {\n for (const f of t.failures ?? []) {\n lines.push(` ⚠ ${f.userName ?? \"Someone\"}: ${f.reason ?? \"(no message)\"}`);\n }\n }\n }\n lines.push(\"\");\n }\n return lines.join(\"\\n\").trimEnd();\n}\n\nfunction registerListManualTests(server: McpServer, conn: ConveyorConnection): void {\n registerContractTool(server, listManualTestsContract, async (params) => {\n const items = await conn.listManualTests(params.taskId, params.projectId);\n if (items.length === 0) {\n return { content: [{ type: \"text\", text: \"No manual tests recorded for this task.\" }] };\n }\n const lines = items.flatMap((item, i) => {\n const checked = item.checked ? \"[x]\" : \"[ ]\";\n const row = [`${i + 1}. ${checked} ${item.title}`];\n for (const f of item.failures ?? []) {\n const who = f.userName ?? \"Someone\";\n const reason = f.reason ?? \"(no message)\";\n row.push(` ⚠ Failed (${who}): ${reason}`);\n }\n return row;\n });\n return { content: [{ type: \"text\", text: lines.join(\"\\n\") }] };\n });\n}\n\nfunction registerSetManualTests(server: McpServer, conn: ConveyorConnection): void {\n registerContractTool(server, setManualTestsContract, async (params) => {\n const result = await conn.setManualTests(params.taskId, params.items, params.projectId);\n const parts = [`Created ${result.created} manual test item(s).`];\n if (result.skipped > 0) parts.push(`Skipped ${result.skipped} duplicate(s).`);\n return { content: [{ type: \"text\", text: parts.join(\" \") }] };\n });\n}\n\nfunction registerEditManualTest(server: McpServer, conn: ConveyorConnection): void {\n registerContractTool(server, editManualTestContract, async (params) => {\n await conn.editManualTest(params.taskId, params.title, params.newTitle, params.projectId);\n return { content: [{ type: \"text\", text: `Updated manual test to \"${params.newTitle}\".` }] };\n });\n}\n\nfunction registerRemoveManualTest(server: McpServer, conn: ConveyorConnection): void {\n registerContractTool(server, removeManualTestContract, async (params) => {\n await conn.removeManualTest(params.taskId, params.title, params.projectId);\n return { content: [{ type: \"text\", text: `Removed manual test \"${params.title}\".` }] };\n });\n}\n\nfunction registerApproveManualTest(server: McpServer, conn: ConveyorConnection): void {\n registerContractTool(server, approveManualTestContract, async (params) => {\n await conn.approveManualTest(params.taskId, params.title, params.projectId);\n return { content: [{ type: \"text\", text: `Approved manual test \"${params.title}\".` }] };\n });\n}\n\nfunction registerRejectManualTest(server: McpServer, conn: ConveyorConnection): void {\n registerContractTool(server, rejectManualTestContract, async (params) => {\n await conn.rejectManualTest(params.taskId, params.title, params.reason, params.projectId);\n return {\n content: [\n {\n type: \"text\",\n text: `Flagged an issue with manual test \"${params.title}\": ${params.reason}`,\n },\n ],\n };\n });\n}\n\nfunction registerQueryManualTests(server: McpServer, conn: ConveyorConnection): void {\n registerContractTool(server, queryManualTestsContract, async (params) => {\n const groups = await conn.queryManualTests({\n projectId: params.projectId,\n cardStatuses: params.cardStatuses,\n testStatuses: params.testStatuses,\n });\n if (groups.length === 0) {\n return { content: [{ type: \"text\", text: \"No manual tests match those filters.\" }] };\n }\n return { content: [{ type: \"text\", text: renderManualTestGroups(groups) }] };\n });\n}\n\nexport function registerChecklistTools(server: McpServer, conn: ConveyorConnection): void {\n registerListManualTests(server, conn);\n registerQueryManualTests(server, conn);\n registerSetManualTests(server, conn);\n registerEditManualTest(server, conn);\n registerRemoveManualTest(server, conn);\n registerApproveManualTest(server, conn);\n registerRejectManualTest(server, conn);\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { ConveyorConnection } from \"../connection.js\";\nimport {\n startWorkspaceSshTunnel,\n type WorkspaceSshTunnelHandle,\n type WorkspaceSshTunnelOptions,\n} from \"../workspace-ssh-tunnel.js\";\n\ninterface WorkspaceToolDeps {\n startTunnel?: (options: WorkspaceSshTunnelOptions) => Promise<WorkspaceSshTunnelHandle>;\n}\n\nconst activeTunnels = new Map<string, WorkspaceSshTunnelHandle>();\n\nfunction createTunnelId(taskId: string, port: number): string {\n return `${taskId}:${port}:${Date.now().toString(36)}:${Math.random().toString(36).slice(2, 8)}`;\n}\n\nfunction localUrlFor(port: number, host: string, localPort: number): string | undefined {\n if (port === 2222) return undefined;\n return `http://${host}:${localPort}`;\n}\n\nfunction registerAttachInfoTool(server: McpServer, conn: ConveyorConnection): void {\n server.tool(\n \"workspace_attach_info\",\n \"Return SSH/SFTP attach metadata for a running task Claudespace, plus hosted preview URLs and configured preview ports. Optionally installs an OpenSSH public key for this attach session.\",\n {\n taskId: z.string().describe(\"The task ID\"),\n sshPublicKey: z\n .string()\n .optional()\n .describe(\"Optional OpenSSH public key to install into the workspace\"),\n },\n async ({ taskId, sshPublicKey }) => {\n const info = await conn.getWorkspaceAttachInfo(taskId, sshPublicKey);\n return { content: [{ type: \"text\", text: JSON.stringify(info, null, 2) }] };\n },\n );\n}\n\nfunction registerPreviewUrlsTool(server: McpServer, conn: ConveyorConnection): void {\n server.tool(\n \"workspace_preview_urls\",\n \"Return the hosted preview URLs and preview ports for a running task Claudespace. This mirrors the web UI preview link metadata.\",\n {\n taskId: z.string().describe(\"The task ID\"),\n },\n async ({ taskId }) => {\n const info = await conn.getWorkspaceAttachInfo(taskId);\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(\n {\n taskId: info.taskId,\n sessionId: info.sessionId,\n previewPorts: info.previewPorts,\n previewUrls: info.previewUrls,\n },\n null,\n 2,\n ),\n },\n ],\n };\n },\n );\n}\n\nfunction registerStartTunnelTool(\n server: McpServer,\n conn: ConveyorConnection,\n startTunnel: (options: WorkspaceSshTunnelOptions) => Promise<WorkspaceSshTunnelHandle>,\n): void {\n server.tool(\n \"workspace_start_tunnel\",\n \"Start a local loopback tunnel through the MCP server to a running task Claudespace port. Use port 2222 for SSH/SFTP, or one of previewPorts for app access.\",\n {\n taskId: z.string().describe(\"The task ID\"),\n port: z.number().optional().describe(\"Remote Claudespace port. Defaults to SSH port 2222.\"),\n preferredLocalPort: z\n .number()\n .optional()\n .describe(\"Preferred local loopback port. If omitted, the OS chooses one.\"),\n sshPublicKey: z\n .string()\n .optional()\n .describe(\"Optional OpenSSH public key to install before opening the tunnel\"),\n },\n async ({ taskId, port, preferredLocalPort, sshPublicKey }) => {\n const info = await conn.getWorkspaceAttachInfo(taskId, sshPublicKey);\n const remotePort = port ?? info.ssh?.remotePort ?? 2222;\n const handle = await startTunnel({\n remotePort,\n preferredLocalPort,\n // Re-mint per connection so the tunnel outlives the attach-token TTL.\n // The key (if any) is already installed by the call above; the refetch\n // only needs a fresh token, so it omits sshPublicKey.\n resolveTarget: async () => {\n const fresh = await conn.getWorkspaceAttachInfo(taskId);\n return { tunnelUrl: fresh.tunnelUrl, attachToken: fresh.attachToken };\n },\n });\n const tunnelId = createTunnelId(taskId, remotePort);\n activeTunnels.set(tunnelId, handle);\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(\n {\n tunnelId,\n taskId,\n remotePort,\n localHost: handle.host,\n localPort: handle.port,\n localUrl: localUrlFor(remotePort, handle.host, handle.port),\n // `-o ServerAliveInterval=30` drives client-side keepalives so an\n // idle session keeps the tunnel warm (the tunnel layer pings too,\n // but the client must keep its own TCP path alive across every hop).\n sshCommand:\n remotePort === 2222\n ? `ssh -o ServerAliveInterval=30 -o ServerAliveCountMax=3 -p ${handle.port} ${info.ssh?.username ?? \"conveyor\"}@${handle.host}`\n : undefined,\n sftpCommand:\n remotePort === 2222\n ? `sftp -o ServerAliveInterval=30 -o ServerAliveCountMax=3 -P ${handle.port} ${info.ssh?.username ?? \"conveyor\"}@${handle.host}`\n : undefined,\n previewPorts: info.previewPorts,\n previewUrls: info.previewUrls,\n expiresAt: info.expiresAt,\n },\n null,\n 2,\n ),\n },\n ],\n };\n },\n );\n}\n\nfunction registerStopTunnelTool(server: McpServer): void {\n server.tool(\n \"workspace_stop_tunnel\",\n \"Stop a local workspace tunnel previously opened by workspace_start_tunnel.\",\n {\n tunnelId: z.string().describe(\"Tunnel id returned by workspace_start_tunnel\"),\n },\n async ({ tunnelId }) => {\n const tunnel = activeTunnels.get(tunnelId);\n if (!tunnel) throw new Error(\"Workspace tunnel not found\");\n await tunnel.close();\n activeTunnels.delete(tunnelId);\n return { content: [{ type: \"text\", text: \"Workspace tunnel stopped\" }] };\n },\n );\n}\n\nexport function registerWorkspaceTools(\n server: McpServer,\n conn: ConveyorConnection,\n deps: WorkspaceToolDeps = {},\n): void {\n registerAttachInfoTool(server, conn);\n registerPreviewUrlsTool(server, conn);\n registerStartTunnelTool(server, conn, deps.startTunnel ?? startWorkspaceSshTunnel);\n registerStopTunnelTool(server);\n}\n","import net from \"node:net\";\nimport { once } from \"node:events\";\nimport { WebSocket } from \"ws\";\n\n// Mirrors WORKSPACE_TUNNEL_HEARTBEAT_MS in @project/shared constants/workspace-tunnel.ts\n// (conveyor-mcp has no workspace dependencies — the two tunnel ends share this\n// value by convention). Cloudflare reaps idle proxied WebSockets, so both ends\n// ping on this interval to keep the edge connection warm.\nconst WORKSPACE_TUNNEL_HEARTBEAT_MS = 30_000;\n\nexport interface WorkspaceTunnelTarget {\n tunnelUrl: string;\n attachToken: string;\n}\n\nexport interface WorkspaceSshTunnelOptions {\n // Minted fresh for every local connection so long-lived clients (VS Code\n // Remote-SSH / SSHFS open many short connections over one session) keep\n // working after the short-lived attach token expires — no refresh plumbing,\n // just re-fetch on connect.\n resolveTarget: () => Promise<WorkspaceTunnelTarget>;\n remotePort: number;\n preferredLocalPort?: number;\n host?: string;\n}\n\nexport interface WorkspaceSshTunnelHandle {\n host: string;\n port: number;\n close: () => Promise<void>;\n}\n\nfunction withPort(url: string, port: number): string {\n const parsed = new URL(url);\n parsed.searchParams.set(\"port\", String(port));\n return parsed.toString();\n}\n\nfunction toBuffer(data: WebSocket.RawData): Buffer {\n if (Buffer.isBuffer(data)) return data;\n if (data instanceof ArrayBuffer) return Buffer.from(data);\n return Buffer.concat(data);\n}\n\n// Ping from this end too: a long-lived single connection (interactive `ssh`,\n// `ssh -L` forward) carries no traffic while idle, and Cloudflare reaps idle\n// proxied WebSockets. The heartbeat keeps the upstream warm so the tunnel\n// lives as long as the workspace, not just until the next idle reap.\nfunction startHeartbeat(ws: WebSocket): () => void {\n const timer = setInterval(() => {\n if (ws.readyState === WebSocket.OPEN) ws.ping();\n }, WORKSPACE_TUNNEL_HEARTBEAT_MS);\n timer.unref?.();\n return () => clearInterval(timer);\n}\n\n// Bridge one accepted local connection (ssh/sftp) to a freshly-minted upstream\n// WebSocket. Each local connection re-mints via `resolveTarget`, so long-lived\n// clients keep working past the attach-token TTL.\nfunction bridgeClient(client: net.Socket, options: WorkspaceSshTunnelOptions): void {\n let ws: WebSocket | null = null;\n let ready = false;\n // Client (ssh) bytes can arrive before the async re-mint + WS open; hold\n // them until the upstream is ready so the handshake isn't dropped.\n const pending: Buffer[] = [];\n client.on(\"data\", (data) => {\n // No encoding is set on `client`, so `data` is always a Buffer at runtime;\n // @types/node types the stream chunk as `string | Buffer`, so normalize.\n const chunk = Buffer.isBuffer(data) ? data : Buffer.from(data);\n if (ready && ws && ws.readyState === WebSocket.OPEN) ws.send(chunk);\n else pending.push(chunk);\n });\n client.on(\"close\", () => ws?.close());\n client.on(\"error\", () => ws?.close());\n\n options\n .resolveTarget()\n .then(({ tunnelUrl, attachToken }) => {\n // Token rides in a header, not the query string, so it isn't captured\n // by edge/proxy access logs. (Node `ws` can set request headers; the\n // browser WebSocket API can't — but this client is always Node.)\n const socket = new WebSocket(withPort(tunnelUrl, options.remotePort), {\n headers: { \"x-workspace-attach-token\": attachToken },\n });\n ws = socket;\n const stopHeartbeat = startHeartbeat(socket);\n socket.on(\"message\", (data) => {\n const chunk = toBuffer(data);\n if (!ready) {\n const text = chunk.toString(\"utf8\");\n if (text === JSON.stringify({ ok: true })) {\n ready = true;\n for (const buffered of pending.splice(0)) socket.send(buffered);\n return;\n }\n client.destroy(new Error(`Workspace tunnel rejected connection: ${text}`));\n socket.close();\n return;\n }\n client.write(chunk);\n });\n socket.on(\"close\", () => {\n stopHeartbeat();\n client.destroy();\n });\n socket.on(\"error\", (err) => {\n stopHeartbeat();\n client.destroy(err);\n });\n })\n .catch((err) => {\n client.destroy(err instanceof Error ? err : new Error(String(err)));\n });\n}\n\nexport async function startWorkspaceSshTunnel(\n options: WorkspaceSshTunnelOptions,\n): Promise<WorkspaceSshTunnelHandle> {\n const host = options.host ?? \"127.0.0.1\";\n const server = net.createServer((client) => bridgeClient(client, options));\n\n // Race \"listening\" against \"error\": a busy preferredLocalPort emits \"error\"\n // with no listener, which would otherwise crash the MCP process.\n const ac = new AbortController();\n server.listen(options.preferredLocalPort ?? 0, host);\n try {\n await Promise.race([\n once(server, \"listening\", { signal: ac.signal }),\n once(server, \"error\", { signal: ac.signal }).then(([err]) => {\n throw err instanceof Error ? err : new Error(String(err));\n }),\n ]);\n } catch (err) {\n server.close();\n throw new Error(\n `Failed to bind workspace SSH tunnel: ${err instanceof Error ? err.message : String(err)}`,\n { cause: err },\n );\n } finally {\n ac.abort();\n }\n const address = server.address();\n if (!address || typeof address === \"string\") {\n server.close();\n throw new Error(\"Failed to bind workspace SSH tunnel\");\n }\n\n return {\n host,\n port: address.port,\n close: () =>\n new Promise<void>((resolve, reject) => {\n server.close((err) => {\n if (err) reject(err);\n else resolve();\n });\n }),\n };\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { ConveyorConnection, GcpLogEntry } from \"../connection.js\";\n\nconst SEVERITY_ENUM = [\n \"DEBUG\",\n \"INFO\",\n \"NOTICE\",\n \"WARNING\",\n \"ERROR\",\n \"CRITICAL\",\n \"ALERT\",\n \"EMERGENCY\",\n] as const;\n\nconst MAX_LINE_CHARS = 400;\nconst DEFAULT_SINCE_MINUTES = 60;\n\nfunction truncateLine(text: string): string {\n const oneLine = text.replace(/\\s*\\n\\s*/g, \" ⏎ \");\n if (oneLine.length <= MAX_LINE_CHARS) return oneLine;\n const overflow = oneLine.length - MAX_LINE_CHARS;\n return `${oneLine.slice(0, MAX_LINE_CHARS)}…[+${overflow}c]`;\n}\n\nfunction entrySource(entry: GcpLogEntry): string {\n return (\n entry.resource.service_name ??\n entry.resource.pod_name ??\n entry.resource.database_id ??\n entry.resourceType ??\n \"-\"\n );\n}\n\n/** Payload keys that add nothing over the message/severity columns. */\nconst PAYLOAD_SKIP_KEYS = new Set([\"message\", \"severity\", \"timestamp\", \"level\", \"stack\"]);\n/** Highest-signal keys render first so the line cap trims the boring tail. */\nconst PAYLOAD_PRIORITY = [\n \"error\",\n \"outcome\",\n \"serviceName\",\n \"methodName\",\n \"userId\",\n \"taskId\",\n \"sessionId\",\n \"workspaceId\",\n \"projectId\",\n \"durationMs\",\n];\nconst PAYLOAD_VALUE_MAX_CHARS = 160;\n\nfunction compactPayloadValue(value: unknown): string {\n const raw = typeof value === \"string\" ? value : JSON.stringify(value);\n const flat = (raw ?? \"undefined\").replace(/\\s+/g, \" \");\n const quoted = typeof value === \"string\" && /[\\s\"]/.test(flat) ? JSON.stringify(flat) : flat;\n return quoted.length > PAYLOAD_VALUE_MAX_CHARS\n ? `${quoted.slice(0, PAYLOAD_VALUE_MAX_CHARS)}…`\n : quoted;\n}\n\n/**\n * Render the entry's structured payload as a compact ` | k=v k=v` suffix so a\n * failed method call reads as WHO did WHAT and WHY it failed on one line,\n * instead of a bare \"-> fail\" with the context dropped.\n */\nexport function formatPayloadSuffix(payloadJson: string | undefined): string {\n if (!payloadJson) return \"\";\n let parsed: unknown;\n try {\n parsed = JSON.parse(payloadJson);\n } catch {\n return \"\";\n }\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) return \"\";\n const obj = parsed as Record<string, unknown>;\n const rank = (key: string): number => {\n const i = PAYLOAD_PRIORITY.indexOf(key);\n return i === -1 ? PAYLOAD_PRIORITY.length : i;\n };\n const parts = Object.keys(obj)\n .filter((k) => !PAYLOAD_SKIP_KEYS.has(k) && obj[k] !== undefined && obj[k] !== null)\n .sort((a, b) => rank(a) - rank(b) || a.localeCompare(b))\n .map((k) => `${k}=${compactPayloadValue(obj[k])}`);\n return parts.length > 0 ? ` | ${parts.join(\" \")}` : \"\";\n}\n\nexport function formatLogEntryLine(entry: GcpLogEntry): string {\n const httpPrefix = entry.httpRequest?.status\n ? `http ${entry.httpRequest.status} ${entry.httpRequest.method ?? \"\"} ${entry.httpRequest.url ?? \"\"}`.trim() +\n \" — \"\n : \"\";\n return `${entry.timestamp} ${entry.severity.padEnd(7)} [${entrySource(entry)}] ${truncateLine(\n `${httpPrefix}${entry.message}${formatPayloadSuffix(entry.payload)}`,\n )}`;\n}\n\nexport interface QueryGcpLogsToolParams {\n projectId?: string;\n env?: \"prod\" | \"dev\" | \"claudespace\";\n sinceMinutes?: number;\n startTime?: string;\n endTime?: string;\n severity?: (typeof SEVERITY_ENUM)[number];\n services?: string[];\n sqlInstances?: string[];\n allServices?: boolean;\n search?: string;\n filter?: string;\n limit?: number;\n pageToken?: string;\n}\n\n/** Exported for tests — the tool handler minus MCP plumbing. */\nexport async function runQueryGcpLogs(\n conn: ConveyorConnection,\n params: QueryGcpLogsToolParams,\n now: () => number = Date.now,\n): Promise<string> {\n const startTime =\n params.startTime ??\n new Date(now() - (params.sinceMinutes ?? DEFAULT_SINCE_MINUTES) * 60_000).toISOString();\n\n const result = await conn.queryGcpLogs({\n projectId: params.projectId,\n env: params.env,\n severity: params.severity,\n services: params.services,\n sqlInstances: params.sqlInstances,\n allServices: params.allServices,\n search: params.search,\n filter: params.filter,\n startTime,\n endTime: params.endTime,\n limit: params.limit,\n pageToken: params.pageToken,\n });\n\n if (result.error) return result.error;\n\n const header = [\n `env=${params.env ?? \"prod\"}`,\n `window=${startTime}→${params.endTime ?? \"now\"}`,\n ...(params.severity ? [`minSeverity=${params.severity}`] : []),\n `scope=${result.scopedServices ? `[${result.scopedServices.join(\", \")}]` : \"all\"}`,\n `entries=${result.entries.length}`,\n ].join(\" \");\n\n const lines = result.entries.map(formatLogEntryLine);\n const footer = result.nextPageToken\n ? [`-- more available: pass pageToken=\"${result.nextPageToken}\" to continue`]\n : [];\n\n if (lines.length === 0) {\n return [\n header,\n \"(no matching log entries — widen the window, lower minSeverity, or drop filters)\",\n ].join(\"\\n\");\n }\n return [header, ...lines, ...footer].join(\"\\n\");\n}\n\nexport interface QueryGrafanaLogsToolParams {\n projectId?: string;\n env?: \"prod\" | \"dev\";\n sinceMinutes?: number;\n startTime?: string;\n endTime?: string;\n level?: \"debug\" | \"info\" | \"warn\" | \"error\" | \"fatal\";\n services?: string[];\n search?: string;\n logql?: string;\n limit?: number;\n}\n\n/** Exported for tests — the tool handler minus MCP plumbing. */\nexport async function runQueryGrafanaLogs(\n conn: ConveyorConnection,\n params: QueryGrafanaLogsToolParams,\n now: () => number = Date.now,\n): Promise<string> {\n const startTime =\n params.startTime ??\n new Date(now() - (params.sinceMinutes ?? DEFAULT_SINCE_MINUTES) * 60_000).toISOString();\n\n const result = await conn.queryGrafanaLogs({\n projectId: params.projectId,\n env: params.env,\n level: params.level,\n services: params.services,\n search: params.search,\n logql: params.logql,\n startTime,\n endTime: params.endTime,\n limit: params.limit,\n });\n\n if (result.error) return result.error;\n\n const header = [\n `env=${params.env ?? \"prod\"}`,\n `window=${startTime}→${params.endTime ?? \"now\"}`,\n ...(params.level ? [`minLevel=${params.level}`] : []),\n ...(result.logql ? [`logql=${truncateLine(result.logql)}`] : []),\n `entries=${result.entries.length}`,\n ].join(\" \");\n\n const lines = result.entries.map(formatLogEntryLine);\n const footer = result.hasMore\n ? [\"-- hit the limit: narrow the window (startTime/endTime) for older lines\"]\n : [];\n\n if (lines.length === 0) {\n return [\n header,\n \"(no matching log entries — widen the window, lower minLevel, or drop filters)\",\n ].join(\"\\n\");\n }\n return [header, ...lines, ...footer].join(\"\\n\");\n}\n\nfunction registerGrafanaLogTool(server: McpServer, conn: ConveyorConnection): void {\n server.tool(\n \"query_grafana_logs\",\n \"Query the project's connected Grafana (Loki) logs — the application logs shipped to Grafana Cloud/Loki, complementing query_gcp_logs (GCP infrastructure logs). Start with structured filters (env, level=error, sinceMinutes=60, services), then narrow with search; pass raw LogQL via logql only when structured filters can't express the query (it REPLACES them). The response header echoes the composed LogQL — iterate on it. Returns compact lines: '<time> <SEVERITY> [<service>] <message>'.\",\n {\n projectId: z.string().optional().describe(\"Target Conveyor project ID\"),\n env: z\n .enum([\"prod\", \"dev\"])\n .optional()\n .describe(\"Configured Grafana env mapping to scope by (default prod)\"),\n sinceMinutes: z\n .number()\n .int()\n .min(1)\n .max(10080)\n .optional()\n .describe(\n \"Relative time window ending now, in minutes (default 60). Ignored if startTime is set.\",\n ),\n startTime: z.string().optional().describe(\"ISO 8601 lower bound (overrides sinceMinutes)\"),\n endTime: z.string().optional().describe(\"ISO 8601 upper bound (default now)\"),\n level: z\n .enum([\"debug\", \"info\", \"warn\", \"error\", \"fatal\"])\n .optional()\n .describe(\"Minimum severity, inclusive — error returns error and above\"),\n services: z\n .array(z.string())\n .optional()\n .describe(\"Restrict to these service_name label values\"),\n search: z\n .string()\n .max(256)\n .optional()\n .describe(\"Substring line filter (exact substring, not regex)\"),\n logql: z\n .string()\n .max(2000)\n .optional()\n .describe(\"Advanced: raw LogQL query — REPLACES env/services/level/search composition\"),\n limit: z.number().int().min(1).max(200).optional().describe(\"Max entries (default 50)\"),\n },\n async (params) => {\n const text = await runQueryGrafanaLogs(conn, params);\n return { content: [{ type: \"text\", text }] };\n },\n );\n}\n\nexport function registerLogTools(server: McpServer, conn: ConveyorConnection): void {\n server.tool(\n \"query_gcp_logs\",\n \"Query Google Cloud Logging for a project's linked GCP environments — use this to investigate production or dev issues directly ('something broke on prod'). Envs: 'prod' and 'dev' are the project's Cloud Run apps + Cloud SQL databases (scoped by default to the resources linked in project settings); 'claudespace' is the project's GKE agent-pod namespace. Start broad (severity=ERROR, sinceMinutes=60), then narrow with services/search. Returns compact lines: '<time> <SEVERITY> [<source>] <message> | key=value …' (the key=value tail is the entry's structured payload — error details, service/method, actor and entity ids). When the response ends with a pageToken line, pass that token back as pageToken for the next page. Pass projectId to target a specific project; otherwise the configured default project is used.\",\n {\n projectId: z.string().optional().describe(\"Target Conveyor project ID\"),\n env: z\n .enum([\"prod\", \"dev\", \"claudespace\"])\n .optional()\n .describe(\"GCP environment slot to query (default prod)\"),\n sinceMinutes: z\n .number()\n .int()\n .min(1)\n .max(10080)\n .optional()\n .describe(\n \"Relative time window ending now, in minutes (default 60). Ignored if startTime is set.\",\n ),\n startTime: z.string().optional().describe(\"ISO 8601 lower bound (overrides sinceMinutes)\"),\n endTime: z.string().optional().describe(\"ISO 8601 upper bound (default now)\"),\n severity: z\n .enum(SEVERITY_ENUM)\n .optional()\n .describe(\"Minimum severity, inclusive — ERROR returns ERROR and above\"),\n services: z\n .array(z.string())\n .optional()\n .describe(\n \"Restrict to these Cloud Run service names (prod/dev only). Defaults to all services linked in project settings.\",\n ),\n sqlInstances: z\n .array(z.string())\n .optional()\n .describe(\"Restrict to these Cloud SQL instance names (prod/dev only)\"),\n allServices: z\n .boolean()\n .optional()\n .describe(\n \"Set true to search ALL logs in the GCP project, ignoring the linked-resource scope\",\n ),\n search: z\n .string()\n .max(256)\n .optional()\n .describe(\"Free-text search across all log fields (exact substring, not regex)\"),\n filter: z\n .string()\n .max(1000)\n .optional()\n .describe(\"Advanced: raw Cloud Logging filter expression, ANDed with the scope\"),\n limit: z\n .number()\n .int()\n .min(1)\n .max(200)\n .optional()\n .describe(\"Max entries per page (default 50)\"),\n pageToken: z\n .string()\n .optional()\n .describe(\"Opaque token from a previous response to fetch the next page\"),\n },\n async (params) => {\n const text = await runQueryGcpLogs(conn, params);\n return { content: [{ type: \"text\", text }] };\n },\n );\n\n registerGrafanaLogTool(server, conn);\n}\n","/* oxlint-disable import/max-dependencies -- registration aggregator imports every tool module by design */\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { ConveyorConnection } from \"../connection.js\";\nimport { registerProjectTools } from \"./project.js\";\nimport { registerConnectionTools } from \"./connection.js\";\nimport { registerProjectConfigTools } from \"./project-config.js\";\nimport { registerTaskTools } from \"./tasks.js\";\nimport { registerBuildTools } from \"./builds.js\";\nimport { registerAttachmentTools } from \"./attachments.js\";\nimport { registerPullRequestTools } from \"./pull-request.js\";\nimport { registerSubtaskTools } from \"./subtasks.js\";\nimport { registerDependencyTools } from \"./dependencies.js\";\nimport { registerSuggestionTools } from \"./suggestions.js\";\nimport { registerChecklistTools } from \"./checklists.js\";\nimport { registerWorkspaceTools } from \"./workspace.js\";\nimport { registerLogTools } from \"./logs.js\";\n\nexport function registerAllTools(server: McpServer, conn: ConveyorConnection): void {\n registerProjectTools(server, conn);\n registerConnectionTools(server, conn);\n registerProjectConfigTools(server, conn);\n registerTaskTools(server, conn);\n registerBuildTools(server, conn);\n registerAttachmentTools(server, conn);\n registerPullRequestTools(server, conn);\n registerSubtaskTools(server, conn);\n registerDependencyTools(server, conn);\n registerSuggestionTools(server, conn);\n registerChecklistTools(server, conn);\n registerWorkspaceTools(server, conn);\n registerLogTools(server, conn);\n}\n"],"mappings":"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","names":["server","conn","z","server","conn","z","server","conn","projectId","z","z","z","z","server","z","server","conn","projectId","z","textResult","server","conn","server","conn","server","conn","server","conn","server","conn","server","conn","f","server","conn","z","server","server","conn","z","z","conn","server","server","conn"]}
1
+ {"version":3,"sources":["../src/cli.ts","../src/tools/project.ts","../src/tools/connection.ts","../src/tools/project-config.ts","../src/tools/tasks.ts","../../shared/dist/tool-contracts/index.js","../src/tools/contract-tool.ts","../src/tools/tasks-format.ts","../src/tools/builds.ts","../src/tools/attachments.ts","../src/tools/pull-request.ts","../src/tools/subtasks.ts","../src/tools/dependencies.ts","../src/tools/suggestions.ts","../src/tools/checklists.ts","../src/tools/workspace.ts","../src/workspace-ssh-tunnel.ts","../src/tools/logs.ts","../src/tools/index.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { createRequire } from \"node:module\";\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { ConveyorConnection } from \"./connection.js\";\nimport { registerAllTools } from \"./tools/index.js\";\n\nconst { version } = createRequire(import.meta.url)(\"../package.json\") as { version: string };\n\nconst apiUrl = process.env.CONVEYOR_API_URL;\nconst projectToken = process.env.CONVEYOR_USER_TOKEN ?? process.env.CONVEYOR_PROJECT_TOKEN;\nconst projectId = process.env.CONVEYOR_PROJECT_ID;\nconst subProjectId = process.env.CONVEYOR_SUBPROJECT_ID;\n\nif (!apiUrl || !projectToken) {\n process.stderr.write(\n \"Error: CONVEYOR_API_URL and CONVEYOR_USER_TOKEN or CONVEYOR_PROJECT_TOKEN environment variables are required. CONVEYOR_PROJECT_ID is optional and sets the default project.\\n\",\n );\n process.exit(1);\n}\n\nconst conn = new ConveyorConnection({ apiUrl, projectToken, projectId, subProjectId });\n\ntry {\n await conn.connect();\n process.stderr.write(\"Connected to Conveyor API\\n\");\n} catch (err) {\n process.stderr.write(`Failed to connect to Conveyor API: ${err}\\n`);\n process.exit(1);\n}\n\nconst server = new McpServer({\n name: \"conveyor\",\n version,\n});\n\nregisterAllTools(server, conn);\n\nconst transport = new StdioServerTransport();\nawait server.connect(transport);\n\nprocess.on(\"SIGINT\", () => {\n conn.disconnect();\n process.exit(0);\n});\n\nprocess.on(\"SIGTERM\", () => {\n conn.disconnect();\n process.exit(0);\n});\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { ConveyorConnection } from \"../connection.js\";\n\nexport function registerProjectTools(server: McpServer, conn: ConveyorConnection): void {\n server.tool(\n \"list_projects\",\n \"List Conveyor projects available to this MCP token's user. Use a returned project id as projectId on other tools when no default project is configured or when targeting a different project.\",\n {},\n async () => {\n const projects = await conn.listProjects();\n return { content: [{ type: \"text\", text: JSON.stringify(projects, null, 2) }] };\n },\n );\n\n server.tool(\n \"get_project_summary\",\n \"Get overall project status: task counts by status, active builds, repo info. Pass projectId to target a specific project; otherwise the configured default project is used.\",\n {\n projectId: z.string().optional().describe(\"Target Conveyor project ID\"),\n },\n async (params) => {\n const summary = await conn.getProjectSummary(params.projectId);\n return { content: [{ type: \"text\", text: JSON.stringify(summary, null, 2) }] };\n },\n );\n\n server.tool(\n \"get_onboarding_status\",\n \"Get the project's onboarding/setup readiness checklist so you can drive setup to green without the user opening Project Settings. Returns { ok, checks[] } where each check has a key (githubApp, githubOauthScopes, claudeToken, devcontainer, devBranch, anthropicKey, compute, codespaceQuota), a status (ok | warn | fail), a human-readable reason, and an optional fix hint. Call this first during onboarding, resolve every 'fail' (use gh/gcloud CLIs or point the user at the fix), then call again until ok is true. Pass projectId to target a specific project; otherwise the configured default project is used.\",\n {\n projectId: z.string().optional().describe(\"Target Conveyor project ID\"),\n },\n async (params) => {\n const status = await conn.getOnboardingStatus(params.projectId);\n return { content: [{ type: \"text\", text: JSON.stringify(status, null, 2) }] };\n },\n );\n\n server.tool(\n \"get_onboarding_step\",\n \"Drive project setup one contextual step at a time (the choose-your-own-adventure onboarding flow). Returns { done, ok, step, remaining, checks }: `step` is the SINGLE next thing to configure (fails before warnings) with a human `title`, the `reason`, agent-facing `guidance` on how to resolve it, `autoFixable` (true = you can fix it via gh/git/tools, false = a browser-only step the user must do), an optional `fix` hint, and `connectUrls` (URLs to hand the user for browser-only steps). `remaining` lists the other unresolved checks. Prefer this over get_onboarding_status during setup: call it, resolve the returned step (do it yourself if autoFixable, otherwise give the user the connectUrl and wait), then call again — repeat until `done` is true. The repository and branches are already configured; never change them. Pass projectId to target a specific project; otherwise the configured default project is used.\",\n {\n projectId: z.string().optional().describe(\"Target Conveyor project ID\"),\n },\n async (params) => {\n const step = await conn.getOnboardingStep(params.projectId);\n return { content: [{ type: \"text\", text: JSON.stringify(step, null, 2) }] };\n },\n );\n\n server.tool(\n \"list_project_members\",\n \"List project members with user ID, name, email, and access level — use to resolve a person's name or email to a user ID for task assignment or review. Pass projectId to target a specific project; otherwise the configured default project is used.\",\n {\n projectId: z.string().optional().describe(\"Target Conveyor project ID\"),\n },\n async (params) => {\n const members = await conn.listProjectMembers(params.projectId);\n return { content: [{ type: \"text\", text: JSON.stringify(members, null, 2) }] };\n },\n );\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { ConveyorConnection } from \"../connection.js\";\n\nconst CAPABILITY_ENUM = [\"read\", \"create\", \"update\", \"chat\", \"files\", \"build\"] as const;\n\nexport function registerConnectionTools(server: McpServer, conn: ConveyorConnection): void {\n server.tool(\n \"get_connection_context\",\n \"Resolve WHO this connection is and WHAT project/board it points at — call this FIRST, before inferring anything from names. Returns the effective account, project, and board (sub-project) each with BOTH its immutable ID and its human-readable name/slug, the granted capabilities (read/create/update/chat/files/build), management URLs, and a one-line summary. Removes the ambiguity between a project's canonical name and a board label. Pass projectId to target a specific project; otherwise the configured default project is used.\",\n {\n projectId: z.string().optional().describe(\"Target Conveyor project ID\"),\n },\n async (params) => {\n const ctx = await conn.getConnectionContext(params.projectId);\n return { content: [{ type: \"text\", text: JSON.stringify(ctx, null, 2) }] };\n },\n );\n\n server.tool(\n \"verify_connection\",\n \"Prove the connection is correct AND that you can actually write to the intended board — not just that auth works. Runs layered checks (auth → account → project → target board → capabilities → read) and returns a plain pass/fail with, on failure, the exact failing layer and ONE next action. Use this instead of get_project_summary to confirm setup: a summary that returns data proves auth, not scope. Pass intendedActions to verify specific capabilities (defaults to read+create+update). Pass projectId to target a specific project; otherwise the configured default project is used. The board scope comes from CONVEYOR_SUBPROJECT_ID.\",\n {\n projectId: z.string().optional().describe(\"Target Conveyor project ID\"),\n intendedActions: z\n .array(z.enum(CAPABILITY_ENUM))\n .optional()\n .describe(\n \"Capabilities to verify the connection can perform (default: read, create, update).\",\n ),\n },\n async (params) => {\n const result = await conn.verifyConnection(params);\n return { content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }] };\n },\n );\n\n server.tool(\n \"list_accessible_subprojects\",\n \"List the boards (sub-projects) under the connected project — each with its ID, name, slug, board URL, owned root path, and the role/capabilities this token has on it. Use this to discover which board to create or list cards on (pass a returned id as subProjectId, or set CONVEYOR_SUBPROJECT_ID) instead of asking the human for one. Pass projectId to target a specific project; otherwise the configured default project is used.\",\n {\n projectId: z.string().optional().describe(\"Target Conveyor project ID\"),\n },\n async (params) => {\n const subprojects = await conn.listAccessibleSubprojects(params.projectId);\n return { content: [{ type: \"text\", text: JSON.stringify(subprojects, null, 2) }] };\n },\n );\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { ConveyorConnection } from \"../connection.js\";\n\nfunction jsonResult(data: unknown): { content: { type: \"text\"; text: string }[] } {\n return { content: [{ type: \"text\", text: JSON.stringify(data, null, 2) }] };\n}\n\nfunction textResult(text: string): { content: { type: \"text\"; text: string }[] } {\n return { content: [{ type: \"text\", text }] };\n}\n\nconst AGENT_DEFAULT_KEYS = [\n \"defaultPmAgentId\",\n \"defaultTaskAgentId\",\n \"defaultReviewerAgentId\",\n \"helperAgentId\",\n] as const;\n\nfunction registerGetConnectUrls(server: McpServer, conn: ConveyorConnection): void {\n server.tool(\n \"get_connect_urls\",\n \"Get browser-only setup URLs to hand to the user: the Google Cloud OAuth connect link (gcpConnect) plus Settings deep links (gcpSettings, memberSettings, projectSettings, setupWizard). Use these for setup steps an agent cannot perform (OAuth grants, secret entry). Pass projectId to target a specific project; otherwise the configured default project is used.\",\n {\n projectId: z.string().optional().describe(\"Target Conveyor project ID\"),\n },\n async (params) => jsonResult(await conn.getConnectUrls(params.projectId)),\n );\n}\n\nfunction registerUpdateProjectSettings(server: McpServer, conn: ConveyorConnection): void {\n server.tool(\n \"update_project_settings\",\n \"Update project configuration: name, description, default agent assignments, or a deep-merged patch of the project settings JSON (JSON Merge Patch: nested objects merge recursively, null deletes a key, arrays replace — a partial patch never wipes sibling keys). Requires a Moderate project role. Does NOT touch repositories or branches — those are configured in the Conveyor UI.\",\n {\n projectId: z.string().optional().describe(\"Target Conveyor project ID\"),\n name: z.string().optional().describe(\"New project name\"),\n description: z.string().optional().describe(\"New project description\"),\n settings: z\n .record(z.string(), z.unknown())\n .optional()\n .describe(\n \"Deep-merged patch of the project settings JSON (JSON Merge Patch semantics: null deletes a key; advanced)\",\n ),\n defaultPmAgentId: z.string().nullable().optional().describe(\"Default PM agent ID\"),\n defaultTaskAgentId: z.string().nullable().optional().describe(\"Default task agent ID\"),\n defaultReviewerAgentId: z\n .string()\n .nullable()\n .optional()\n .describe(\"Default reviewer agent ID\"),\n helperAgentId: z.string().nullable().optional().describe(\"Helper agent ID\"),\n },\n async (params) => {\n const { projectId, name, description, settings, ...agents } = params;\n const results: unknown[] = [];\n\n const config: Record<string, unknown> = {};\n if (name !== undefined) config.name = name;\n if (description !== undefined) config.description = description;\n if (settings !== undefined) config.settings = settings;\n if (Object.keys(config).length > 0) {\n results.push(await conn.updateProjectConfig({ projectId, ...config }));\n }\n\n const defaults: Record<string, unknown> = {};\n for (const key of AGENT_DEFAULT_KEYS) {\n if (agents[key] !== undefined) defaults[key] = agents[key];\n }\n if (Object.keys(defaults).length > 0) {\n results.push(await conn.updateProjectAgentDefaults({ projectId, ...defaults }));\n }\n\n if (results.length === 0) return textResult(\"Nothing to update — pass at least one field.\");\n return jsonResult(results.length === 1 ? results[0] : results);\n },\n );\n}\n\nconst contextPathSchema = z.object({\n type: z\n .enum([\"rule\", \"doc\", \"file\", \"folder\"])\n .describe(\"Kind of context link — a rule/doc file, a source file, or a folder\"),\n path: z.string().describe(\"Repo-relative path, e.g. '.claude/rules/refactor-verification.md'\"),\n label: z.string().optional().describe(\"Optional human-readable label for the link\"),\n});\n\nfunction registerManageTags(server: McpServer, conn: ConveyorConnection): void {\n server.tool(\n \"manage_tags\",\n \"List, create, update, or delete project tags. create requires name (optional color/description/contextPaths); update/delete require the tag id. contextPaths wire files/rules/docs into the agent context of any card carrying the tag (replace-set — pass the full list, [] clears). Mutations require a Moderate project role.\",\n {\n action: z.enum([\"list\", \"create\", \"update\", \"delete\"]).describe(\"Operation to perform\"),\n projectId: z.string().optional().describe(\"Target Conveyor project ID (list/create)\"),\n id: z.string().optional().describe(\"Tag ID (update/delete)\"),\n name: z.string().optional().describe(\"Tag name\"),\n color: z.string().optional().describe(\"Hex color, e.g. #ff0000\"),\n description: z.string().optional().describe(\"Tag description\"),\n contextPaths: z\n .array(contextPathSchema)\n .max(20)\n .optional()\n .describe(\n \"Context links (rules/docs/files/folders) auto-loaded into the agent context of cards with this tag. Replace-set: the full list replaces the tag's existing links; pass [] to clear. Only used on create/update.\",\n ),\n },\n async (params) => {\n const { action, projectId, id, name, color, description, contextPaths } = params;\n if (action === \"list\") return jsonResult(await conn.listTagsDetailed(projectId));\n if (action === \"create\") {\n if (!name) return textResult(\"name is required for create.\");\n return jsonResult(\n await conn.createTag({\n projectId,\n name,\n ...(color !== undefined && { color }),\n ...(description !== undefined && { description }),\n ...(contextPaths !== undefined && { contextPaths }),\n }),\n );\n }\n if (!id) return textResult(`id is required for ${action}.`);\n if (action === \"delete\") return jsonResult(await conn.deleteTag(id));\n return jsonResult(\n await conn.updateTag({\n id,\n ...(name !== undefined && { name }),\n ...(color !== undefined && { color }),\n ...(description !== undefined && { description }),\n ...(contextPaths !== undefined && { contextPaths }),\n }),\n );\n },\n );\n}\n\nfunction registerManagePriorities(server: McpServer, conn: ConveyorConnection): void {\n server.tool(\n \"manage_priorities\",\n \"List, create, update, or delete project priorities. create requires value (1-100), name, and color; update/delete require the priority id. create/update require a Moderate role; delete requires Admin.\",\n {\n action: z.enum([\"list\", \"create\", \"update\", \"delete\"]).describe(\"Operation to perform\"),\n projectId: z.string().optional().describe(\"Target Conveyor project ID (list/create)\"),\n id: z.string().optional().describe(\"Priority ID (update/delete)\"),\n value: z\n .number()\n .int()\n .min(1)\n .max(100)\n .optional()\n .describe(\"Priority value (1 = highest urgency scale point)\"),\n name: z.string().optional().describe(\"Priority name\"),\n color: z.string().optional().describe(\"Hex color, e.g. #ff0000\"),\n description: z.string().optional().describe(\"Priority description\"),\n },\n async (params) => {\n const { action, projectId, id, value, name, color, description } = params;\n if (action === \"list\") return jsonResult(await conn.listPriorities(projectId));\n if (action === \"create\") {\n if (value === undefined || !name || !color) {\n return textResult(\"value, name, and color are required for create.\");\n }\n return jsonResult(\n await conn.createPriority({\n projectId,\n value,\n name,\n color,\n ...(description !== undefined && { description }),\n }),\n );\n }\n if (!id) return textResult(`id is required for ${action}.`);\n if (action === \"delete\") return jsonResult(await conn.deletePriority(id));\n return jsonResult(\n await conn.updatePriority({\n id,\n ...(value !== undefined && { value }),\n ...(name !== undefined && { name }),\n ...(color !== undefined && { color }),\n ...(description !== undefined && { description }),\n }),\n );\n },\n );\n}\n\nexport function registerProjectConfigTools(server: McpServer, conn: ConveyorConnection): void {\n registerGetConnectUrls(server, conn);\n registerUpdateProjectSettings(server, conn);\n registerManageTags(server, conn);\n registerManagePriorities(server, conn);\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport {\n approveAndMergePrContract,\n getTaskContract,\n listTagsContract,\n postToChatContract,\n readTaskChatContract,\n} from \"@project/shared/tool-contracts\";\nimport { registerContractTool } from \"./contract-tool.js\";\nimport type { ConveyorConnection } from \"../connection.js\";\nimport { formatCliEventSummary, formatTaskSessionState, summarizeTask } from \"./tasks-format.js\";\n\nconst STATUS_ENUM = [\n \"Planning\",\n \"Open\",\n \"InProgress\",\n \"ReviewPR\",\n \"ReviewDev\",\n \"ReviewLive\",\n \"Complete\",\n \"Cancelled\",\n] as const;\n\nconst CARD_TYPE_ENUM = [\"task\", \"incident\", \"suggestion\"] as const;\n\n// Canonical risk levels — mirror RISK_LEVELS in @project/shared (conveyor-mcp is\n// published standalone without the shared dep).\nconst RISK_ENUM = [\"critical\", \"high\", \"medium\", \"low\"] as const;\n\n// Shared board (sub-project) scope fields. Omit → the connection's default board\n// (CONVEYOR_SUBPROJECT_ID) when set, else the whole project; null → force the\n// whole project. Reused across list/search (filter) and create (assign) so the\n// semantics stay identical and the file stays under the line cap.\nconst BOARD_FILTER = z\n .string()\n .nullable()\n .optional()\n .describe(\n \"Filter to a sub-project board. Omit to use the connection's default board (CONVEYOR_SUBPROJECT_ID) when set, else the whole project; pass null to force the whole project. Use list_accessible_subprojects to find board IDs.\",\n );\nconst BOARD_ASSIGN = z\n .string()\n .nullable()\n .optional()\n .describe(\n \"Assign the card to a sub-project board. Omit to use the connection's default board (CONVEYOR_SUBPROJECT_ID) when set, else the parent project; pass null to force the parent project. Use list_accessible_subprojects to find board IDs.\",\n );\n\nfunction registerListTasks(server: McpServer, conn: ConveyorConnection): void {\n server.tool(\n \"list_tasks\",\n \"List project cards, optionally filtered by card type, status, or assignment (a specific assignee, or unassigned tasks). Defaults to type=task — pass typeFilters to list incidents/suggestions. Results are relevance-ordered: highest priority first then newest; suggestions-only queries rank by upvote score. Pass projectId to target a specific project; otherwise the configured default project is used. Returns summaries — plan omitted, description truncated; use get_task for full details.\",\n {\n projectId: z.string().optional().describe(\"Target Conveyor project ID\"),\n status: z.enum(STATUS_ENUM).optional().describe(\"Filter by task status\"),\n typeFilters: z\n .array(z.enum(CARD_TYPE_ENUM))\n .optional()\n .describe(\n 'Card types to include, e.g. [\"incident\"] or [\"task\", \"incident\"]. Omit for tasks only.',\n ),\n assigneeId: z.string().optional().describe(\"Filter by assigned user ID\"),\n unassigned: z\n .boolean()\n .optional()\n .describe(\"Only return tasks with no assignee (mutually exclusive with assigneeId)\"),\n subProjectId: BOARD_FILTER,\n limit: z.number().optional().describe(\"Max tasks to return (default 50)\"),\n },\n async (params) => {\n const tasks = await conn.listTasks(params);\n return {\n content: [{ type: \"text\", text: JSON.stringify(tasks.map(summarizeTask), null, 2) }],\n };\n },\n );\n}\n\nfunction registerGetTask(server: McpServer, conn: ConveyorConnection): void {\n registerContractTool(server, getTaskContract, async (params) => {\n const task = await conn.getTask(params.taskId, params.projectId);\n return { content: [{ type: \"text\", text: JSON.stringify(task, null, 2) }] };\n });\n}\n\nfunction registerGetCardBySlug(server: McpServer, conn: ConveyorConnection): void {\n server.tool(\n \"get_card_by_slug\",\n \"Get full card details by the slug from a card URL (/cards/<slug>) instead of a task ID. Pass projectId to target a specific project; otherwise the configured default project is used.\",\n {\n projectId: z.string().optional().describe(\"Target Conveyor project ID\"),\n slug: z.string().describe(\"The card slug from a Conveyor card URL, e.g. 'ship-it'\"),\n },\n async (params) => {\n const task = await conn.getCardBySlug(params.slug, params.projectId);\n return { content: [{ type: \"text\", text: JSON.stringify(task, null, 2) }] };\n },\n );\n}\n\nfunction registerCreateTask(server: McpServer, conn: ConveyorConnection): void {\n server.tool(\n \"create_task\",\n \"Create a new task with title, description, and optional plan. Pass projectId to target a specific project; otherwise the configured default project is used. Icon, story points, and agent assignment are auto-filled when a task is created in (or later moved to) a status beyond Planning — don't spend turns on them.\",\n {\n projectId: z.string().optional().describe(\"Target Conveyor project ID\"),\n title: z.string().describe(\"Task title\"),\n description: z.string().optional().describe(\"Task description\"),\n plan: z.string().optional().describe(\"Task implementation plan (markdown)\"),\n status: z\n .enum([\"Planning\", \"Open\"])\n .optional()\n .describe(\"Initial status (default: Planning)\"),\n subProjectId: BOARD_ASSIGN,\n tags: z\n .array(z.string())\n .optional()\n .describe(\n 'Tag names to assign to the new card (e.g. [\"refactor\"]). Unknown names are rejected — create the tag first with manage_tags. Use list_tags to see available tags.',\n ),\n },\n async (params) => {\n const task = await conn.createTask(params);\n return {\n content: [\n {\n type: \"text\",\n text: `Task created: ${task.id} (slug: ${task.slug}). effectiveScope: ${JSON.stringify(task.effectiveScope)}`,\n },\n ],\n };\n },\n );\n}\n\nfunction registerUpdateTask(server: McpServer, conn: ConveyorConnection): void {\n server.tool(\n \"update_task\",\n \"Update task fields: title, description, plan, status, risk, assignment, or tags. Set status to claim a card (InProgress), triage it (Open), or cancel it (Cancelled); for review approvals prefer approve_task / request_changes, which guard against stale-state races. Tags are additive/subtractive — pass addTags/removeTags with tag names (not a replace-set). Pass projectId to target a specific project; otherwise the configured default project is used. Moving a task beyond Planning auto-fills any missing icon, story points, and agent assignment — don't spend turns on them.\",\n {\n projectId: z.string().optional().describe(\"Target Conveyor project ID\"),\n taskId: z.string().describe(\"The task ID\"),\n title: z.string().optional().describe(\"New title\"),\n description: z.string().optional().describe(\"New description\"),\n plan: z.string().optional().describe(\"New plan (markdown)\"),\n status: z.enum(STATUS_ENUM).optional().describe(\"New status\"),\n risk: z\n .enum(RISK_ENUM)\n .nullable()\n .optional()\n .describe(\n \"Risk level — how much important surface the task touches (critical/high/medium/low). Pass null to clear.\",\n ),\n assignedUserId: z.string().nullable().optional().describe(\"User ID to assign, or null\"),\n subProjectId: z\n .string()\n .nullable()\n .optional()\n .describe(\n \"Assign the task to a sub-project board; null moves it back to the parent board. Omit to leave unchanged.\",\n ),\n addTags: z\n .array(z.string())\n .optional()\n .describe(\n 'Tag names to add to the card (e.g. [\"refactor\"]). Additive — existing tags are kept. Unknown names are rejected; use list_tags to see available tags or manage_tags to create one.',\n ),\n removeTags: z\n .array(z.string())\n .optional()\n .describe(\n \"Tag names to remove from the card. Removing a tag the card doesn't have is a no-op.\",\n ),\n },\n async (params) => {\n const result = await conn.updateTask(params);\n const parts = [`Task ${result.id} updated`];\n if (result.status) parts.push(`status: ${result.status}`);\n if ((result.addedTags ?? []).length > 0) parts.push(`+tags: ${result.addedTags.join(\", \")}`);\n if ((result.removedTags ?? []).length > 0)\n parts.push(`-tags: ${result.removedTags.join(\", \")}`);\n return {\n content: [{ type: \"text\", text: parts.join(\" · \") }],\n };\n },\n );\n}\n\nfunction registerMoveCard(server: McpServer, conn: ConveyorConnection): void {\n server.tool(\n \"move_card\",\n \"Move an eligible Planning or Open task, incident, or suggestion card to another project. Cards with identification or automation in progress, active compute, pull requests, deployments, releases, reviews, or delivered reporter email cannot move. Project-specific metadata is cleared instead of mapped by name. Pass projectId for the source project; otherwise the configured default project is used.\",\n {\n projectId: z.string().optional().describe(\"Source Conveyor project ID\"),\n taskId: z.string().describe(\"Card ID or slug\"),\n destinationProjectId: z.string().describe(\"Destination Conveyor project ID\"),\n },\n async (params) => {\n const result = await conn.moveCard(params);\n const clearedFields =\n result.clearedFields.length > 0 ? result.clearedFields.join(\", \") : \"none\";\n return {\n content: [\n {\n type: \"text\",\n text: `Card moved as ${result.slug} to project ${result.destinationProjectId}. Cleared fields: ${clearedFields}`,\n },\n ],\n };\n },\n );\n}\n\nfunction registerChatTools(server: McpServer, conn: ConveyorConnection): void {\n registerContractTool(server, readTaskChatContract, async (params) => {\n const messages = await conn.getTaskChat(params.taskId, params.limit, params.projectId);\n return { content: [{ type: \"text\", text: JSON.stringify(messages, null, 2) }] };\n });\n\n registerContractTool(server, postToChatContract, async (params) => {\n // Cross-surface alias: the in-pod agent surface calls this field\n // `message`, and models regularly carry that name over. Accept either.\n const text = params.content ?? params.message;\n if (text === undefined) {\n return {\n content: [\n {\n type: \"text\",\n text: \"Nothing to post — provide `content` (or its alias `message`).\",\n },\n ],\n };\n }\n await conn.postToTaskChat(params.taskId, text, params.projectId);\n return { content: [{ type: \"text\", text: \"Message posted\" }] };\n });\n}\n\nfunction registerGetTaskCli(server: McpServer, conn: ConveyorConnection): void {\n server.tool(\n \"get_task_logs\",\n \"Read CLI execution logs from a task. Pass projectId to target a specific project; otherwise the configured default project is used. Returns agent reasoning, tool calls, setup output, and other execution events. For human chat use read_task_chat.\",\n {\n projectId: z.string().optional().describe(\"Target Conveyor project ID\"),\n taskId: z.string().describe(\"The task ID or slug\"),\n source: z\n .enum([\"agent\", \"application\"])\n .optional()\n .describe(\n \"Filter by log source: 'agent' for reasoning/tool calls, 'application' for setup/dev-server output\",\n ),\n limit: z.number().optional().describe(\"Max entries to return (default 50, max 500)\"),\n },\n async ({ taskId, source, limit, projectId }) => {\n const effectiveLimit = Math.min(limit ?? 50, 500);\n const logs = await conn.getTaskCli(taskId, effectiveLimit, source, projectId);\n const formatted = logs\n .map((log) => {\n return `[${log.timestamp}] [${log.type}] ${formatCliEventSummary(log.type, log.data)}`;\n })\n .join(\"\\n\");\n return {\n content: [{ type: \"text\" as const, text: formatted || \"No CLI logs found for this task.\" }],\n };\n },\n );\n}\n\nfunction registerGetTaskSessions(server: McpServer, conn: ConveyorConnection): void {\n server.tool(\n \"get_task_sessions\",\n \"Read compute-session state for a task: legacy CodespaceSession rows plus v3 workspaces, including purpose=review review workspaces. Shows pod identity, liveness, lifecycle, and code-review claim state. Use to diagnose stalled/dead agents or code-review runs. Pass projectId to target a specific project; otherwise the configured default project is used.\",\n {\n projectId: z.string().optional().describe(\"Target Conveyor project ID\"),\n taskId: z.string().describe(\"The task ID or slug\"),\n },\n async ({ taskId, projectId }) => {\n const tasks = await conn.getTaskSessions(taskId, projectId);\n const lines = tasks.flatMap(formatTaskSessionState);\n return {\n content: [\n { type: \"text\" as const, text: lines.join(\"\\n\") || \"No sessions found for this task.\" },\n ],\n };\n },\n );\n}\n\nfunction registerSearchTasks(server: McpServer, conn: ConveyorConnection): void {\n server.tool(\n \"search_tasks\",\n \"Search cards by tag name, text query, status, type, and/or assignment. Defaults to type=task — pass typeFilters to include incidents/suggestions. Results are relevance-ordered: highest priority first then newest; suggestions-only queries rank by upvote score. Pass projectId to target a specific project; otherwise the configured default project is used. Use tag names like 'agent-runner', not IDs. Returns summaries — plan omitted, description truncated; use get_task for full details.\",\n {\n projectId: z.string().optional().describe(\"Target Conveyor project ID\"),\n tagNames: z\n .array(z.string())\n .optional()\n .describe('Tag names to filter by (e.g., [\"agent-runner\", \"chat\"])'),\n searchQuery: z.string().optional().describe(\"Text search on title and description\"),\n statusFilters: z\n .array(z.enum(STATUS_ENUM))\n .optional()\n .describe(\"Filter by one or more statuses\"),\n typeFilters: z\n .array(z.enum(CARD_TYPE_ENUM))\n .optional()\n .describe(\n 'Card types to include (default [\"task\"]). Pass e.g. [\"incident\"] or list several to search across types.',\n ),\n assigneeId: z.string().optional().describe(\"Filter by assigned user ID\"),\n unassigned: z\n .boolean()\n .optional()\n .describe(\"Only return tasks with no assignee (mutually exclusive with assigneeId)\"),\n subProjectId: BOARD_FILTER,\n limit: z.number().optional().describe(\"Max results to return (default 20)\"),\n },\n async (params) => {\n const tasks = await conn.searchTasks(params);\n return {\n content: [{ type: \"text\", text: JSON.stringify(tasks.map(summarizeTask), null, 2) }],\n };\n },\n );\n}\n\nfunction registerListTags(server: McpServer, conn: ConveyorConnection): void {\n registerContractTool(server, listTagsContract, async (params) => {\n const tags = await conn.listTags(params.projectId);\n return { content: [{ type: \"text\", text: JSON.stringify(tags, null, 2) }] };\n });\n}\n\nfunction registerReviewTools(server: McpServer, conn: ConveyorConnection): void {\n server.tool(\n \"approve_task\",\n \"Move a task forward in the review flow (ReviewPR -> ReviewDev, or -> Complete). Pass projectId to target a specific project; otherwise the configured default project is used.\",\n {\n projectId: z.string().optional().describe(\"Target Conveyor project ID\"),\n taskId: z.string().describe(\"The task ID\"),\n risk: z\n .enum(RISK_ENUM)\n .optional()\n .describe(\"Optional risk level to record; defaults to a raise-only 'low' on approval.\"),\n },\n async (params) => {\n const result = await conn.approveTask(params.taskId, params.projectId, params.risk);\n return {\n content: [{ type: \"text\", text: `Task approved, new status: ${result.status}` }],\n };\n },\n );\n\n registerContractTool(server, approveAndMergePrContract, async (params) => {\n const result = await conn.approveAndMergePR(params.childTaskId, params.projectId);\n return {\n content: [\n {\n type: \"text\",\n text: `PR #${result.prNumber} approved and merged for task ${result.childTaskId}`,\n },\n ],\n };\n });\n\n server.tool(\n \"request_changes\",\n \"Post feedback and send task back to InProgress for more work. Pass projectId to target a specific project; otherwise the configured default project is used.\",\n {\n projectId: z.string().optional().describe(\"Target Conveyor project ID\"),\n taskId: z.string().describe(\"The task ID\"),\n feedback: z.string().describe(\"Feedback message describing requested changes\"),\n risk: z\n .enum(RISK_ENUM)\n .optional()\n .describe(\"Optional risk level to record; defaults to a raise-only 'medium' on changes.\"),\n },\n async (params) => {\n await conn.requestChanges(params.taskId, params.feedback, params.projectId, params.risk);\n return { content: [{ type: \"text\", text: \"Changes requested, task moved to InProgress\" }] };\n },\n );\n}\n\nfunction formatReviewerList(reviewers: Array<{ userId: string; name: string | null }>): string {\n if (reviewers.length === 0) return \"none\";\n return reviewers.map((r) => `${r.name ?? \"unknown\"} (${r.userId})`).join(\", \");\n}\n\nfunction registerReviewerTools(server: McpServer, conn: ConveyorConnection): void {\n server.tool(\n \"add_reviewer\",\n \"Add a project member as a reviewer on a task. Pass projectId to target a specific project; otherwise the configured default project is used. Idempotent — adding an existing reviewer is a no-op.\",\n {\n projectId: z.string().optional().describe(\"Target Conveyor project ID\"),\n taskId: z.string().describe(\"The task ID or slug\"),\n userId: z\n .string()\n .describe(\"User ID of the reviewer (use list_project_members to resolve a name or email)\"),\n },\n async (params) => {\n const result = await conn.addReviewer(params);\n return {\n content: [\n {\n type: \"text\",\n text: `Reviewer added to task ${result.taskId}. Reviewers: ${formatReviewerList(result.reviewers)}`,\n },\n ],\n };\n },\n );\n\n server.tool(\n \"remove_reviewer\",\n \"Remove a reviewer from a task. Pass projectId to target a specific project; otherwise the configured default project is used. Idempotent — removing a non-reviewer is a no-op.\",\n {\n projectId: z.string().optional().describe(\"Target Conveyor project ID\"),\n taskId: z.string().describe(\"The task ID or slug\"),\n userId: z.string().describe(\"User ID of the reviewer to remove\"),\n },\n async (params) => {\n const result = await conn.removeReviewer(params);\n return {\n content: [\n {\n type: \"text\",\n text: `Reviewer removed from task ${result.taskId}. Reviewers: ${formatReviewerList(result.reviewers)}`,\n },\n ],\n };\n },\n );\n}\n\nexport function registerTaskTools(server: McpServer, conn: ConveyorConnection): void {\n registerListTasks(server, conn);\n registerGetTask(server, conn);\n registerGetCardBySlug(server, conn);\n registerCreateTask(server, conn);\n registerUpdateTask(server, conn);\n registerMoveCard(server, conn);\n registerChatTools(server, conn);\n registerGetTaskCli(server, conn);\n registerGetTaskSessions(server, conn);\n registerSearchTasks(server, conn);\n registerListTags(server, conn);\n registerReviewTools(server, conn);\n registerReviewerTools(server, conn);\n}\n","// src/tool-contracts/spec.ts\nvar f = {\n string(opts) {\n return { kind: \"string\", ...opts };\n },\n number(opts) {\n return { kind: \"number\", ...opts };\n },\n boolean(opts) {\n return { kind: \"boolean\", ...opts };\n },\n enum(values, opts) {\n return { kind: \"enum\", values, ...opts };\n },\n array(item, opts) {\n return { kind: \"array\", item, ...opts };\n },\n object(fields, opts) {\n return { kind: \"object\", fields, ...opts };\n },\n optional(inner) {\n return { kind: \"optional\", inner };\n }\n};\n\n// src/tool-contracts/compile.ts\nfunction compileString(z, spec) {\n let schema = z.string();\n if (spec.min !== void 0) schema = schema.min(spec.min);\n if (spec.max !== void 0) schema = schema.max(spec.max);\n return schema;\n}\nfunction compileNumber(z, spec) {\n let schema = z.number();\n if (spec.int) schema = schema.int();\n if (spec.positive) schema = schema.positive();\n if (spec.nonnegative) schema = schema.nonnegative();\n if (spec.min !== void 0) schema = schema.min(spec.min);\n if (spec.max !== void 0) schema = schema.max(spec.max);\n return schema;\n}\nfunction compileArray(z, spec) {\n let schema = z.array(compileField(z, spec.item));\n if (spec.min !== void 0) schema = schema.min(spec.min);\n return schema;\n}\nfunction compileBase(z, spec) {\n switch (spec.kind) {\n case \"string\":\n return compileString(z, spec);\n case \"number\":\n return compileNumber(z, spec);\n case \"boolean\":\n return z.boolean();\n case \"enum\":\n return z.enum([...spec.values]);\n case \"array\":\n return compileArray(z, spec);\n case \"object\":\n return z.object(compileShape(z, spec.fields));\n }\n}\nfunction compileField(z, spec) {\n if (spec.kind === \"optional\") {\n return compileField(z, spec.inner).optional();\n }\n const schema = compileBase(z, spec);\n return spec.desc === void 0 ? schema : schema.describe(spec.desc);\n}\nfunction compileShape(z, fields) {\n const shape = {};\n for (const [key, spec] of Object.entries(fields)) {\n shape[key] = compileField(z, spec);\n }\n return shape;\n}\n\n// src/tool-contracts/contract.ts\nfunction defineToolContract(contract) {\n return contract;\n}\n\n// src/tool-contracts/fields.ts\nvar mcpProjectId = f.optional(f.string({ desc: \"Target Conveyor project ID\" }));\n\n// src/tool-contracts/tasks.ts\nvar getTaskContract = defineToolContract({\n name: \"get_task\",\n agent: {\n description: \"Look up any task by slug or ID. Returns JSON with id, slug, title, description, plan, status, branch, githubPRNumber, githubPRUrl, storyPoints. For children use list_subtasks.\",\n fields: {\n slug_or_id: f.string({ desc: \"The task slug (e.g. 'my-task') or CUID\" })\n }\n },\n mcp: {\n description: \"Get full task details including plan, chat history, PR info, subtasks, and build status. Pass projectId to target a specific project; otherwise the configured default project is used.\",\n fields: {\n projectId: mcpProjectId,\n taskId: f.string({\n desc: \"The task ID or slug (the value in a card URL, /cards/<slug>)\"\n })\n }\n }\n});\nvar postToChatContract = defineToolContract({\n name: \"post_to_chat\",\n agent: {\n description: \"Post a message to the task chat for the team to see. Your turn output is NOT shown in chat, so this is the only way the team sees your status, summaries, and questions. Omit task_id to post to the current task's chat; pass a child's ID to message its chat.\",\n fields: {\n message: f.optional(f.string({ desc: \"The message to post to the team\" })),\n content: f.optional(\n f.string({\n desc: \"Alias of `message` (the external conveyor-mcp surface names this field `content`). Provide exactly one of the two.\"\n })\n ),\n task_id: f.optional(\n f.string({\n desc: \"Child task ID to post to. Omit to post to the current task's chat.\"\n })\n ),\n milestone: f.optional(\n f.enum([\"plan_ready\", \"implementation_complete\", \"blocked\"], {\n desc: \"Declare a narrative milestone instead of a routine update. Use SPARINGLY \\u2014 only when the plan is ready, implementation is complete, or you are blocked. Milestones appear on the card's activity timeline and in Slack.\"\n })\n )\n }\n },\n mcp: {\n description: \"Post a message to a task's chat. Pass projectId to target a specific project; otherwise the configured default project is used.\",\n fields: {\n projectId: mcpProjectId,\n taskId: f.string({ desc: \"The task ID\" }),\n content: f.optional(f.string({ desc: \"Message content\" })),\n message: f.optional(\n f.string({\n desc: \"Alias of `content` (the in-pod agent surface names this field `message`). Provide exactly one of the two.\"\n })\n )\n }\n }\n});\nvar readTaskChatContract = defineToolContract({\n name: \"read_task_chat\",\n agent: {\n description: \"Read recent human/user chat messages for a task. Omit task_id for the current task; pass a child ID for a child's chat. For agent logs use get_execution_logs.\",\n fields: {\n limit: f.optional(f.number({ desc: \"Number of recent messages to fetch (default 20)\" })),\n task_id: f.optional(\n f.string({\n desc: \"Child task ID to read chat from. Omit to read the current task's chat.\"\n })\n )\n }\n },\n mcp: {\n description: \"Read messages from a task's chat. Pass projectId to target a specific project; otherwise the configured default project is used. For agent execution logs use get_task_logs.\",\n fields: {\n projectId: mcpProjectId,\n taskId: f.string({ desc: \"The task ID\" }),\n limit: f.optional(f.number({ desc: \"Max messages to return (default 50)\" }))\n }\n }\n});\nvar listTagsContract = defineToolContract({\n name: \"list_tags\",\n agent: {\n description: \"List this project's tags (id, name, color). Use the ids with update_tag.\",\n fields: {}\n },\n mcp: {\n description: \"List all project tags with their names, IDs, and colors. Pass projectId to target a specific project; otherwise the configured default project is used.\",\n fields: {\n projectId: mcpProjectId\n }\n }\n});\nvar childTaskIdForMerge = f.string({\n desc: \"The child task ID whose PR should be approved and merged\"\n});\nvar approveAndMergePrContract = defineToolContract({\n name: \"approve_and_merge_pr\",\n agent: {\n description: \"Approve and merge a child task's PR. Preconditions: child in ReviewPR. Returns { merged }: true = merged (status\\u2192ReviewDev); false = automerge queued, wait for ReviewDev.\",\n fields: {\n childTaskId: childTaskIdForMerge\n }\n },\n mcp: {\n description: \"Approve and merge a child task's pull request. Pass projectId to target a specific project; otherwise the configured default project is used. Only succeeds if all CI/CD checks are passing. The child task must be in ReviewPR status with a PR.\",\n fields: {\n projectId: mcpProjectId,\n childTaskId: childTaskIdForMerge\n }\n }\n});\nvar tasksContracts = [\n getTaskContract,\n postToChatContract,\n readTaskChatContract,\n listTagsContract,\n approveAndMergePrContract\n];\n\n// src/tool-contracts/checklists.ts\nvar mcpChecklistTaskId = f.string({ desc: \"The task ID or slug\" });\nvar testStatuses = f.optional(\n f.array(f.enum([\"open\", \"approved\", \"rejected\"]), {\n desc: \"Filter tests by status: open | approved | rejected\"\n })\n);\nvar setManualTestItems = f.array(\n f.object({ title: f.string({ min: 1, desc: \"A concise, actionable test step\" }) }),\n { min: 1, desc: \"List of manual test steps to add\" }\n);\nvar titleToEdit = f.string({ min: 1, desc: \"The current title of the manual test to edit\" });\nvar newTitle = f.string({ min: 1, desc: \"The new title for the manual test\" });\nvar titleToRemove = f.string({ min: 1, desc: \"The title of the manual test to remove\" });\nvar titleToApprove = f.string({ min: 1, desc: \"The title of the manual test to approve\" });\nvar titleToReject = f.string({ min: 1, desc: \"The title of the manual test to reject\" });\nvar rejectReason = f.string({\n min: 1,\n max: 2e3,\n desc: \"Why the test failed \\u2014 what went wrong, shown to the team\"\n});\nvar listManualTestsContract = defineToolContract({\n name: \"list_manual_tests\",\n agent: {\n description: \"List the manual test checklist items for the current task. Use to see what manual verification steps have already been recorded.\",\n fields: {}\n },\n mcp: {\n description: \"List the manual test checklist items for a task. Pass projectId to target a specific project; otherwise the configured default project is used. Use to see what manual verification steps have already been recorded.\",\n fields: {\n projectId: mcpProjectId,\n taskId: f.string({ desc: \"The task ID or slug (the value in a card URL, /cards/<slug>)\" })\n }\n }\n});\nvar queryManualTestsContract = defineToolContract({\n name: \"query_manual_tests\",\n agent: {\n description: \"Query manual tests across many tasks in this project, grouped by task. Filter by card status (ReviewDev, ReviewLive, Complete, ...) and/or test status (open | approved | rejected). Use to answer 'show all OPEN manual tests in ReviewDev' or 'show all REJECTED manual tests with the failing reason'. With no filters it defaults to the needs-attention view: open+rejected tests on ReviewDev/ReviewLive cards.\",\n fields: {\n cardStatuses: f.optional(\n f.array(f.string(), {\n desc: 'Filter tasks by card status, e.g. [\"ReviewDev\", \"ReviewLive\"]'\n })\n ),\n testStatuses\n }\n },\n mcp: {\n description: \"Query manual tests across many tasks in a project, grouped by task. Filter by card status (e.g. ReviewDev, ReviewLive, Complete) and/or test status (open | approved | rejected). Use to answer questions like 'show all OPEN manual tests in ReviewDev' or 'show all REJECTED manual tests in ReviewDev/ReviewLive with the failing reason'. With no filters it defaults to the needs-attention view: open+rejected tests on ReviewDev/ReviewLive cards. Pass projectId to target a specific project; otherwise the configured default project is used.\",\n fields: {\n projectId: mcpProjectId,\n cardStatuses: f.optional(\n f.array(f.string(), {\n desc: 'Filter tasks by card/column status, e.g. [\"ReviewDev\", \"ReviewLive\"]'\n })\n ),\n testStatuses\n }\n }\n});\nvar setManualTestsContract = defineToolContract({\n name: \"set_manual_tests\",\n agent: {\n description: \"Add manual test steps to the task checklist. Existing items with the same title are automatically skipped (deduplication). Use to record specific manual verification steps that reviewers should follow when testing this PR.\",\n fields: {\n items: setManualTestItems\n }\n },\n mcp: {\n description: \"Add manual test steps to a task's checklist. Pass projectId to target a specific project; otherwise the configured default project is used. Existing items with the same title are automatically skipped (deduplication). Use to record specific manual verification steps that reviewers should follow when testing the task's PR.\",\n fields: {\n projectId: mcpProjectId,\n taskId: mcpChecklistTaskId,\n items: setManualTestItems\n }\n }\n});\nvar editManualTestContract = defineToolContract({\n name: \"edit_manual_test\",\n agent: {\n description: \"Rename an existing manual test step. Identify the test by its current title (case-insensitive); pass the new title to replace it. Use to correct or refine a recorded manual verification step.\",\n fields: {\n title: titleToEdit,\n newTitle\n }\n },\n mcp: {\n description: \"Rename an existing manual test step on a task. Pass projectId to target a specific project; otherwise the configured default project is used. Identify the test by its current title (case-insensitive) and pass the new title to replace it.\",\n fields: {\n projectId: mcpProjectId,\n taskId: mcpChecklistTaskId,\n title: titleToEdit,\n newTitle\n }\n }\n});\nvar removeManualTestContract = defineToolContract({\n name: \"remove_manual_test\",\n agent: {\n description: \"Remove an existing manual test step from the task checklist. Identify the test by its title (case-insensitive). Use to delete a stale or incorrect manual verification step.\",\n fields: {\n title: titleToRemove\n }\n },\n mcp: {\n description: \"Remove an existing manual test step from a task's checklist. Pass projectId to target a specific project; otherwise the configured default project is used. Identify the test by its title (case-insensitive).\",\n fields: {\n projectId: mcpProjectId,\n taskId: mcpChecklistTaskId,\n title: titleToRemove\n }\n }\n});\nvar approveManualTestContract = defineToolContract({\n name: \"approve_manual_test\",\n agent: {\n description: \"Sign off on (approve) a manual test step on behalf of your authenticated user. Identify the test by its title (case-insensitive). Use after you have verified the step passes.\",\n fields: {\n title: titleToApprove\n }\n },\n mcp: {\n description: \"Sign off on (approve) a manual test step on a task on behalf of your authenticated user. Pass projectId to target a specific project; otherwise the configured default project is used. Identify the test by its title (case-insensitive). Use after you have verified the step passes.\",\n fields: {\n projectId: mcpProjectId,\n taskId: mcpChecklistTaskId,\n title: titleToApprove\n }\n }\n});\nvar rejectManualTestContract = defineToolContract({\n name: \"reject_manual_test\",\n agent: {\n description: \"Flag an issue with (reject) a manual test step on behalf of your authenticated user, recording the reason. Identify the test by its title (case-insensitive). Use when the step fails verification.\",\n fields: {\n title: titleToReject,\n reason: rejectReason\n }\n },\n mcp: {\n description: \"Flag an issue with (reject) a manual test step on a task on behalf of your authenticated user, recording the reason. Pass projectId to target a specific project; otherwise the configured default project is used. Identify the test by its title (case-insensitive). Use when the step fails verification.\",\n fields: {\n projectId: mcpProjectId,\n taskId: mcpChecklistTaskId,\n title: titleToReject,\n reason: rejectReason\n }\n }\n});\nvar checklistContracts = [\n listManualTestsContract,\n queryManualTestsContract,\n setManualTestsContract,\n editManualTestContract,\n removeManualTestContract,\n approveManualTestContract,\n rejectManualTestContract\n];\n\n// src/tool-contracts/dependencies.ts\nvar getDependenciesContract = defineToolContract({\n name: \"get_dependencies\",\n agent: {\n description: \"Get this task's dependencies and their met/unmet status (met = merged to dev). Use to confirm blockers merged, or see why a task cannot start. For task state use get_task.\",\n fields: {}\n },\n mcp: {\n description: \"Get a task's dependencies and their met/unmet status (met = merged to dev). Pass projectId to target a specific project; otherwise the configured default project is used. Use to confirm blockers merged, or see why a task cannot start. For task state use get_task.\",\n fields: {\n projectId: mcpProjectId,\n taskId: f.string({ desc: \"The task ID\" })\n }\n }\n});\nvar addDependencyContract = defineToolContract({\n name: \"add_dependency\",\n agent: {\n description: \"Add a blocking dependency \\u2014 this task cannot start until the named task is merged to dev. For post-task follow-ups use create_follow_up_task instead.\",\n fields: {\n depends_on_slug_or_id: f.string({ desc: \"Slug or ID of the task this task depends on\" })\n }\n },\n mcp: {\n description: \"Add a blocking dependency \\u2014 this task cannot start until the named task is merged to dev. Pass projectId to target a specific project; otherwise the configured default project is used.\",\n fields: {\n projectId: mcpProjectId,\n taskId: f.string({ desc: \"The task ID that will be blocked\" }),\n dependsOnSlugOrId: f.string({ desc: \"Slug or ID of the task this one depends on\" })\n }\n }\n});\nvar removeDependencyContract = defineToolContract({\n name: \"remove_dependency\",\n agent: {\n description: \"Remove a previously added dependency from this task. When to use: the dependency was added in error or is no longer relevant. Returns: confirmation string.\",\n fields: {\n depends_on_slug_or_id: f.string({ desc: \"Slug or ID of the task to remove as dependency\" })\n }\n },\n mcp: {\n description: \"Remove a previously added dependency from a task. Pass projectId to target a specific project; otherwise the configured default project is used. The task is no longer blocked by the named task. Returns: confirmation string.\",\n fields: {\n projectId: mcpProjectId,\n taskId: f.string({ desc: \"The task ID to unblock\" }),\n dependsOnSlugOrId: f.string({ desc: \"Slug or ID of the dependency to remove\" })\n }\n }\n});\nvar dependenciesContracts = [\n getDependenciesContract,\n addDependencyContract,\n removeDependencyContract\n];\n\n// src/tool-contracts/subtasks.ts\nvar SP_DESCRIPTION = \"Story point value (1=Common, 2=Magic, 3=Rare, 5=Unique)\";\nvar AGENT_FOLLOW_PARENT_STATUS = \"Child mirrors the parent task's status automatically \\u2014 for subtasks that ship on the parent's branch/PR with no build or PR of their own. Manual status writes on a follower stick only until the parent's next transition.\";\nvar MCP_FOLLOW_PARENT_STATUS = \"When true, this subtask mirrors the parent task's status automatically \\u2014 for children that ship on the parent's branch/PR and have no build or PR of their own. Manual status writes on a follower stick only until the parent's next transition.\";\nvar AGENT_DEPENDS_ON = \"Sibling subtask ids or slugs this subtask blocks on (it won't start until they merge to dev). Set explicit dependency metadata here instead of describing order in the plan text \\u2014 the pack runner schedules children off these edges. Omit / leave empty for independent children so they run in parallel.\";\nvar MCP_STATUS_ENUM = [\n \"Planning\",\n \"Open\",\n \"InProgress\",\n \"ReviewPR\",\n \"ReviewDev\",\n \"ReviewLive\",\n \"Complete\",\n \"Cancelled\"\n];\nvar createSubtaskContract = defineToolContract({\n name: \"create_subtask\",\n agent: {\n description: \"Create a subtask under the current parent task. Use when breaking a complex parent into smaller pieces during planning. For post-task follow-ups use create_follow_up_task.\",\n fields: {\n title: f.string({ desc: \"Subtask title\" }),\n description: f.optional(f.string({ desc: \"Brief description\" })),\n plan: f.optional(f.string({ desc: \"Implementation plan in markdown\" })),\n ordinal: f.optional(f.number({ desc: \"Step/order number (0-based)\" })),\n storyPointValue: f.optional(f.number({ desc: SP_DESCRIPTION })),\n followParentStatus: f.optional(f.boolean({ desc: AGENT_FOLLOW_PARENT_STATUS })),\n dependsOn: f.optional(f.array(f.string(), { desc: AGENT_DEPENDS_ON }))\n }\n },\n mcp: {\n description: \"Create a subtask under a parent task. Pass projectId to target a specific project; otherwise the configured default project is used. Subtasks break a larger task into independently buildable pieces. For children that instead ship on the parent's own branch/PR (e.g. per-theme tracking cards for one bundled PR), set followParentStatus so their status rides the parent's automatically.\",\n fields: {\n projectId: mcpProjectId,\n parentTaskId: f.string({ desc: \"The parent task ID\" }),\n title: f.string({ desc: \"Subtask title\" }),\n description: f.optional(f.string({ desc: \"Subtask description\" })),\n plan: f.optional(f.string({ desc: \"Subtask implementation plan (markdown)\" })),\n ordinal: f.optional(f.number({ desc: \"Ordering position among siblings\" })),\n storyPointValue: f.optional(f.number({ desc: SP_DESCRIPTION })),\n followParentStatus: f.optional(f.boolean({ desc: MCP_FOLLOW_PARENT_STATUS })),\n dependsOn: f.optional(\n f.array(f.string(), {\n desc: \"Sibling subtask ids or slugs this subtask blocks on (it won't start until they merge to dev). Set explicit dependency metadata here instead of describing order in the plan text. Omit / leave empty for independent children so they run in parallel.\"\n })\n ),\n tags: f.optional(\n f.array(f.string(), {\n desc: 'Tag names to assign to the subtask (e.g. [\"refactor\"]). Unknown names are rejected \\u2014 create the tag first with manage_tags. Use list_tags to see available tags.'\n })\n )\n }\n }\n});\nvar updateSubtaskContract = defineToolContract({\n name: \"update_subtask\",\n agent: {\n description: \"Update an existing subtask's fields (title, description, plan, ordinal, storyPointValue, dependsOn) \\u2014 and the sanctioned path to make a child buildable: promote it to status Open, assign its agent (agentIdOrName), and set story points. Setting story points does NOT auto-promote; set status explicitly. For the current task use update_task_plan.\",\n fields: {\n subtaskId: f.string({ desc: \"The subtask ID to update\" }),\n title: f.optional(f.string()),\n description: f.optional(f.string()),\n plan: f.optional(f.string()),\n status: f.optional(\n f.enum([\"Planning\", \"Open\"], {\n desc: 'Move the child between \"Planning\" and \"Open\". \"Open\" marks it ready to execute \\u2014 required before start_child_cloud_build. Execution statuses transition automatically.'\n })\n ),\n agentIdOrName: f.optional(\n f.string({\n desc: \"Assign a project agent to the child (agent id or exact name from the Project Agents list). Required before start_child_cloud_build.\"\n })\n ),\n ordinal: f.optional(f.number()),\n storyPointValue: f.optional(f.number({ desc: SP_DESCRIPTION })),\n followParentStatus: f.optional(f.boolean({ desc: AGENT_FOLLOW_PARENT_STATUS })),\n dependsOn: f.optional(\n f.array(f.string(), {\n desc: `${AGENT_DEPENDS_ON} Replaces the full dependency set \\u2014 pass [] to clear all, omit to leave unchanged.`\n })\n )\n }\n },\n mcp: {\n description: \"Update a subtask's fields: title, description, plan, status, ordering, story points, or dependencies. Pass projectId to target a specific project; otherwise the configured default project is used. Moving a subtask beyond Planning auto-fills missing story points and agent assignment \\u2014 don't spend turns on them.\",\n fields: {\n projectId: mcpProjectId,\n subtaskId: f.string({ desc: \"The subtask ID\" }),\n title: f.optional(f.string({ desc: \"New title\" })),\n description: f.optional(f.string({ desc: \"New description\" })),\n plan: f.optional(f.string({ desc: \"New plan (markdown)\" })),\n status: f.optional(f.enum(MCP_STATUS_ENUM, { desc: \"New status\" })),\n ordinal: f.optional(f.number({ desc: \"New ordering position among siblings\" })),\n storyPointValue: f.optional(f.number({ desc: SP_DESCRIPTION })),\n followParentStatus: f.optional(f.boolean({ desc: MCP_FOLLOW_PARENT_STATUS })),\n dependsOn: f.optional(\n f.array(f.string(), {\n desc: \"Replace the sibling subtask ids/slugs this subtask blocks on (pass [] to clear). Omit to leave dependencies unchanged.\"\n })\n )\n }\n }\n});\nvar deleteSubtaskContract = defineToolContract({\n name: \"delete_subtask\",\n agent: {\n description: \"Delete a subtask by id. When to use: a subtask was created in error or is no longer needed. Returns: confirmation string.\",\n fields: {\n subtaskId: f.string({ desc: \"The subtask ID to delete\" })\n }\n },\n mcp: {\n description: \"Delete a subtask by ID. Pass projectId to target a specific project; otherwise the configured default project is used. This is permanent \\u2014 use update_subtask to set status to Cancelled if you only want to close it.\",\n fields: {\n projectId: mcpProjectId,\n subtaskId: f.string({ desc: \"The subtask ID to delete\" })\n }\n }\n});\nvar listSubtasksContract = defineToolContract({\n name: \"list_subtasks\",\n agent: {\n description: \"List all subtasks under the current parent task. Default compact view returns per child: status, agent, story points, PR number/state, dependencies, and holdsBuildSlot \\u2014 plus packSlots (in-flight environments vs the PACK_CHILD_LIMIT cap, and which children hold the slots). Use to coordinate child work; pass verbose:true only when you need full description/plan text (large). For non-child tasks use get_task.\",\n fields: {\n verbose: f.optional(\n f.boolean({\n desc: \"Return full task rows including description and plan text (large \\u2014 can exceed tool result limits on big packs). Default: compact orchestration view.\"\n })\n )\n }\n },\n mcp: {\n description: \"List all subtasks of a parent task with their status and ordering. Pass projectId to target a specific project; otherwise the configured default project is used.\",\n fields: {\n projectId: mcpProjectId,\n taskId: f.string({ desc: \"The parent task ID\" })\n }\n }\n});\nvar subtasksContracts = [\n createSubtaskContract,\n updateSubtaskContract,\n deleteSubtaskContract,\n listSubtasksContract\n];\n\n// src/tool-contracts/attachments.ts\nvar mcpTaskIdOrSlug = f.string({ desc: \"The task ID or slug\" });\nvar listTaskFilesContract = defineToolContract({\n name: \"list_task_files\",\n agent: {\n description: \"List all files attached to this task with metadata. Use before fetching a specific file to see what is available and how large each is. For file contents use get_attachment.\",\n fields: {}\n },\n mcp: {\n description: \"List all files attached to a task with metadata (no contents \\u2014 fast and small). Pass projectId to target a specific project; otherwise the configured default project is used. Use before fetching a specific file to see what is available and how large each is. For file contents use get_attachment.\",\n fields: {\n projectId: mcpProjectId,\n taskId: mcpTaskIdOrSlug\n }\n }\n});\nvar getAttachmentContract = defineToolContract({\n name: \"get_attachment\",\n agent: {\n description: \"Fetch one task file's content plus metadata by file ID. Call list_task_files first to discover IDs and check sizes \\u2014 large binaries may be truncated by the service's size limit.\",\n fields: {\n fileId: f.string({ desc: \"The file ID to retrieve\" })\n }\n },\n mcp: {\n description: \"Fetch one task file's content plus metadata by file ID (accepts task id or slug). Pass projectId to target a specific project; otherwise the configured default project is used. Images are returned as viewable image blocks. Large text files (logs, JSON) are returned in pages \\u2014 use `offset`/`maxBytes` to read more, or fetch `downloadUrl` for the whole file. Call list_task_files first to discover IDs and sizes.\",\n fields: {\n projectId: mcpProjectId,\n taskId: mcpTaskIdOrSlug,\n fileId: f.string({ desc: \"The file ID to fetch\" }),\n offset: f.optional(\n f.number({\n int: true,\n nonnegative: true,\n desc: \"Byte offset into text content (paging). Default 0.\"\n })\n ),\n maxBytes: f.optional(\n f.number({\n int: true,\n positive: true,\n desc: \"Max bytes of text content to return from offset.\"\n })\n )\n }\n }\n});\nvar uploadAttachmentContract = defineToolContract({\n name: \"upload_attachment\",\n agent: {\n description: \"Upload an image file (e.g. a Playwright screenshot) as a task attachment AND post it to the task chat in one step \\u2014 no follow-up post_to_chat call needed. Supports png/jpg/gif/webp.\",\n fields: {\n path: f.string({\n desc: \"Path to the image file \\u2014 absolute, or relative to the workspace root\"\n }),\n title: f.optional(\n f.string({ desc: \"Short caption posted with the image (defaults to the file name)\" })\n )\n }\n },\n mcp: {\n description: \"Upload a local file as a task attachment (any file type, up to 25MB). Pass projectId to target a specific project; otherwise the configured default project is used. The file appears under the task's Files. Pass `comment` to also post it to the task chat in the same step.\",\n fields: {\n projectId: mcpProjectId,\n taskId: mcpTaskIdOrSlug,\n path: f.string({ desc: \"Absolute path to the local file to upload\" }),\n comment: f.optional(\n f.string({ desc: \"When set, also posts the attachment to the task chat with this text\" })\n ),\n mimeType: f.optional(\n f.string({ desc: \"Override the mime type inferred from the file extension\" })\n )\n }\n }\n});\nvar attachmentsContracts = [\n listTaskFilesContract,\n getAttachmentContract,\n uploadAttachmentContract\n];\n\n// src/tool-contracts/suggestions.ts\nvar createSuggestionContract = defineToolContract({\n name: \"create_suggestion\",\n agent: {\n description: \"File a project suggestion (idea/improvement for maintainers to review). Duplicates are AI-deduped into an existing suggestion with an upvote. Returns the suggestion id.\",\n fields: {\n title: f.string({ min: 1, desc: \"Short title\" }),\n description: f.optional(f.string({ desc: \"1-3 sentences: what should change and why\" })),\n tag_names: f.optional(f.array(f.string(), { desc: \"Tag names to categorize\" }))\n }\n },\n mcp: {\n description: \"Suggest a feature, improvement, rule, or idea for the project. Pass projectId to target a specific project; otherwise the configured default project is used. Duplicates are deduped and your upvote is recorded.\",\n fields: {\n projectId: mcpProjectId,\n title: f.string({ desc: \"Suggestion title\" }),\n description: f.optional(f.string({ desc: \"Suggestion details (markdown)\" })),\n tagNames: f.optional(\n f.array(f.string(), {\n desc: 'Tag names to categorize the suggestion (e.g., [\"agent-runner\"])'\n })\n )\n }\n }\n});\nvar suggestionsContracts = [createSuggestionContract];\n\n// src/tool-contracts/pull-request.ts\nvar createPullRequestContract = defineToolContract({\n name: \"create_pull_request\",\n agent: {\n description: \"Create a GitHub PR for this task. Auto-stages, commits (commitMessage or title default), pushes to origin, then opens the PR. Always use this instead of gh CLI or raw git.\",\n fields: {\n title: f.string({ desc: \"The PR title\" }),\n body: f.string({ desc: \"The PR description/body in markdown\" }),\n branch: f.optional(\n f.string({\n desc: \"The head branch name for the PR. If the task doesn't have a branch set, this will be used. Defaults to the task's existing branch.\"\n })\n ),\n baseBranch: f.optional(\n f.string({\n desc: \"The base branch to target for the PR (e.g. 'main', 'develop'). Defaults to the project's configured dev branch.\"\n })\n ),\n commitMessage: f.optional(\n f.string({\n desc: \"Commit message for staging uncommitted changes. If not provided, a default message based on the PR title will be used.\"\n })\n ),\n skipVerify: f.optional(\n f.boolean({\n desc: \"Controls the local pre-push quality gate (lint/typecheck/test). Defaults to true (--no-verify): the push skips the local gate because you should run gates yourself before opening the PR and CI re-runs them on the resulting PR. Running the full gate synchronously during the push would block the agent's event loop long enough to drop the Conveyor socket connection. Pass false to force the local pre-push hook to run.\"\n })\n )\n }\n },\n mcp: {\n description: \"Open a GitHub pull request for a task's existing branch (the branch must already be pushed to origin). Pass projectId to target a specific project; otherwise the configured default project is used. Moves the task to ReviewPR. Returns the PR number and URL.\",\n fields: {\n projectId: mcpProjectId,\n taskId: f.string({ desc: \"The task ID whose branch should be opened as a PR\" }),\n title: f.string({ desc: \"Pull request title\" }),\n body: f.string({ desc: \"Pull request body (markdown)\" }),\n head: f.optional(\n f.string({ desc: \"Source branch for the PR (defaults to the task's branch)\" })\n ),\n base: f.optional(\n f.string({ desc: \"Target branch for the PR (defaults to the repo default)\" })\n )\n }\n }\n});\nvar pullRequestContracts = [createPullRequestContract];\n\n// src/tool-contracts/index.ts\nvar TOOL_CONTRACTS = Object.fromEntries(\n [\n ...tasksContracts,\n ...checklistContracts,\n ...dependenciesContracts,\n ...subtasksContracts,\n ...attachmentsContracts,\n ...suggestionsContracts,\n ...pullRequestContracts\n ].map((contract) => [contract.name, contract])\n);\nexport {\n TOOL_CONTRACTS,\n addDependencyContract,\n approveAndMergePrContract,\n approveManualTestContract,\n attachmentsContracts,\n checklistContracts,\n compileShape,\n createPullRequestContract,\n createSubtaskContract,\n createSuggestionContract,\n defineToolContract,\n deleteSubtaskContract,\n dependenciesContracts,\n editManualTestContract,\n f,\n getAttachmentContract,\n getDependenciesContract,\n getTaskContract,\n listManualTestsContract,\n listSubtasksContract,\n listTagsContract,\n listTaskFilesContract,\n mcpProjectId,\n postToChatContract,\n pullRequestContracts,\n queryManualTestsContract,\n readTaskChatContract,\n rejectManualTestContract,\n removeDependencyContract,\n removeManualTestContract,\n setManualTestsContract,\n subtasksContracts,\n suggestionsContracts,\n tasksContracts,\n updateSubtaskContract,\n uploadAttachmentContract\n};\n","/**\n * Bridge from shared tool contracts to `server.tool()` registrations.\n *\n * Contracts are zod-version-neutral DATA (`@project/shared/tool-contracts`);\n * this package compiles them with its OWN zod (v3) so every registered\n * shape is a genuine zod-v3 object — the test suite wraps registered\n * shapes with v3 `z.object(...)`, and mixing zod majors inside one schema\n * tree is undefined behavior. Handler inputs are typed from the contract\n * data (`InferShape`) to stay off zod's object-inference hot path.\n */\nimport { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { CallToolResult } from \"@modelcontextprotocol/sdk/types.js\";\nimport {\n compileShape,\n type FieldMap,\n type InferField,\n type InferShape,\n type OptionalSpec,\n type ToolContract,\n type ToolSurface,\n} from \"@project/shared/tool-contracts\";\n\n/** Precise zod-v3 shape type for a contract surface (optional specs → ZodOptional keys). */\nexport type McpContractShape<F extends FieldMap> = {\n [K in keyof F]: F[K] extends OptionalSpec<infer I>\n ? z.ZodOptional<z.ZodType<InferField<I>>>\n : z.ZodType<InferField<F[K]>>;\n};\n\nexport function mcpShape<F extends FieldMap>(surface: ToolSurface<F>): McpContractShape<F> {\n return compileShape(z, surface.fields) as McpContractShape<F>;\n}\n\n/** Register a contract's mcp surface on the server with a typed handler. */\nexport function registerContractTool<M extends FieldMap>(\n server: McpServer,\n contract: ToolContract<FieldMap, M>,\n handler: (params: InferShape<M>) => Promise<CallToolResult>,\n): void {\n server.tool(\n contract.name,\n contract.mcp.description,\n mcpShape(contract.mcp) as unknown as z.ZodRawShape,\n handler as (params: unknown) => Promise<CallToolResult>,\n );\n}\n","import type { ConveyorConnection } from \"../connection.js\";\n\nconst CLI_EVENT_FORMATTERS: Record<string, (data: Record<string, unknown>) => string> = {\n thinking: (data) => String(data.message ?? \"\"),\n tool_use: (data) => `${data.tool}: ${String(data.input ?? \"\").slice(0, 1000)}`,\n tool_result: (data) =>\n `${data.tool} → ${String(data.output ?? \"\").slice(0, 500)}${data.isError ? \" [ERROR]\" : \"\"}`,\n message: (data) => String(data.content ?? \"\"),\n error: (data) => `ERROR: ${String(data.message ?? \"\")}`,\n completed: (data) =>\n `Completed: ${data.summary ?? \"\"} (cost: $${data.costUsd ?? \"?\"}, duration: ${data.durationMs ?? \"?\"}ms)`,\n setup_output: (data) => `[${data.stream ?? \"stdout\"}] ${String(data.data ?? \"\")}`,\n start_command_output: (data) => `[${data.stream ?? \"stdout\"}] ${String(data.data ?? \"\")}`,\n turn_end: (data) =>\n `Turn complete (${Array.isArray(data.toolCalls) ? data.toolCalls.length : 0} tool calls)`,\n};\n\nexport function formatCliEventSummary(type: string, data: Record<string, unknown>): string {\n const formatter = CLI_EVENT_FORMATTERS[type];\n return formatter ? formatter(data) : JSON.stringify(data);\n}\n\ntype TaskSessionState = Awaited<ReturnType<ConveyorConnection[\"getTaskSessions\"]>>[number];\ntype LegacyComputeSession = TaskSessionState[\"sessions\"][number];\ntype WorkspaceState = TaskSessionState[\"workspaces\"][number];\ntype WorkspaceSessionState = WorkspaceState[\"sessions\"][number];\n\nfunction formatLegacyComputeSession(s: LegacyComputeSession): string {\n return (\n ` - session ${s.id} [${s.provider}] pod=${s.instanceName ?? \"-\"} status=${s.status}` +\n ` runner=${s.agentRunnerStatus ?? \"-\"} lastHeartbeat=${s.lastHeartbeatAt ?? \"-\"}` +\n ` created=${s.createdAt} stopped=${s.stoppedAt ?? \"-\"}` +\n (s.deletionRequestedAt\n ? ` deletionRequested=${s.deletionRequestedAt} (attempts ${s.deletionAttempts})`\n : \"\") +\n (s.lastAgentEvent ? ` lastAgentEvent=${s.lastAgentEvent}` : \"\")\n );\n}\n\nfunction formatWorkspaceSession(s: WorkspaceSessionState): string {\n return (\n ` - workspaceSession ${s.id} role=${s.role} mode=${s.mode}` +\n ` status=${s.status} leaseUntil=${s.leaseUntil ?? \"-\"} created=${s.createdAt}`\n );\n}\n\nfunction formatWorkspace(w: WorkspaceState): string[] {\n const lines = [\n ` - workspace ${w.id} purpose=${w.purpose} desired=${w.desiredState}` +\n ` observed=${w.observedState} branch=${w.branch ?? \"-\"} checkoutRef=${w.checkoutRef ?? \"-\"}` +\n (w.pod ? ` pod=${w.pod.namespace}/${w.pod.name} podPhase=${w.pod.phase}` : \" pod=-\"),\n ];\n if (w.sessions.length === 0) {\n lines.push(\" (no workspace sessions)\");\n return lines;\n }\n lines.push(...w.sessions.map(formatWorkspaceSession));\n return lines;\n}\n\nexport function formatTaskSessionState(t: TaskSessionState): string[] {\n const review = t.codeReviewStatus\n ? ` codeReview=${t.codeReviewStatus} (attempts ${t.codeReviewAttempts})`\n : \"\";\n const kind = t.reviewTargetTaskId ? `review card for ${t.reviewTargetTaskId}` : t.type;\n const lines = [`# ${t.slug} — ${t.title} [${kind}, status ${t.status}]${review}`];\n if (t.sessions.length === 0) {\n lines.push(\" (no compute sessions)\");\n } else {\n lines.push(...t.sessions.map(formatLegacyComputeSession));\n }\n if (t.workspaces.length === 0) {\n lines.push(\" (no v3 workspaces)\");\n } else {\n lines.push(...t.workspaces.flatMap(formatWorkspace));\n }\n return lines;\n}\n\nconst DESCRIPTION_PREVIEW_CHARS = 300;\n\n/** List/search results omit `plan` and truncate `description` — `get_task` returns the full record. */\nexport function summarizeTask(task: unknown): unknown {\n if (typeof task !== \"object\" || task === null) return task;\n const { plan, description, ...rest } = task as Record<string, unknown>;\n const summary: Record<string, unknown> = { ...rest };\n summary.description =\n typeof description === \"string\" && description.length > DESCRIPTION_PREVIEW_CHARS\n ? `${description.slice(0, DESCRIPTION_PREVIEW_CHARS)}… [truncated — use get_task for the full description]`\n : (description ?? null);\n summary.hasPlan = typeof plan === \"string\" && plan.length > 0;\n return summary;\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { ConveyorConnection } from \"../connection.js\";\n\nfunction textResult(result: unknown): { content: Array<{ type: \"text\"; text: string }> } {\n return { content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }] };\n}\n\nfunction registerTaskLifecycleTools(server: McpServer, conn: ConveyorConnection): void {\n server.tool(\n \"stop_task\",\n \"Compatibility alias for the legacy stop path. stop_task now performs the same durable sleep behavior as sleep_task, preserving task Claudespace state while stopping compute. Pass projectId to target a specific project; otherwise the configured default project is used.\",\n {\n projectId: z.string().optional().describe(\"Target Conveyor project ID\"),\n taskId: z.string().describe(\"The task ID\"),\n },\n async (params) => textResult(await conn.sleepTask(params.taskId, params.projectId)),\n );\n\n server.tool(\n \"sleep_task\",\n \"Sleep a task Claudespace, stopping compute while preserving durable state. Pass projectId to target a specific project; otherwise the configured default project is used.\",\n {\n projectId: z.string().optional().describe(\"Target Conveyor project ID\"),\n taskId: z.string().describe(\"The task ID\"),\n },\n async (params) => textResult(await conn.sleepTask(params.taskId, params.projectId)),\n );\n\n server.tool(\n \"resume_task\",\n \"Resume a sleeping task Claudespace. Pass projectId to target a specific project; otherwise the configured default project is used.\",\n {\n projectId: z.string().optional().describe(\"Target Conveyor project ID\"),\n taskId: z.string().describe(\"The task ID\"),\n },\n async (params) => textResult(await conn.resumeTask(params.taskId, params.projectId)),\n );\n\n server.tool(\n \"delete_task_environment\",\n \"Delete a task environment, including durable Claudespace state. Pass projectId to target a specific project; otherwise the configured default project is used.\",\n {\n projectId: z.string().optional().describe(\"Target Conveyor project ID\"),\n taskId: z.string().describe(\"The task ID\"),\n },\n async (params) => textResult(await conn.deleteTaskEnvironment(params.taskId, params.projectId)),\n );\n}\n\nexport function registerBuildTools(server: McpServer, conn: ConveyorConnection): void {\n server.tool(\n \"start_task\",\n \"Start a cloud build (codespace) for a task. Pass projectId to target a specific project; otherwise the configured default project is used.\",\n {\n projectId: z.string().optional().describe(\"Target Conveyor project ID\"),\n taskId: z.string().describe(\"The task ID\"),\n },\n async (params) => {\n const result = await conn.startBuild(params.taskId, params.projectId);\n return textResult(result);\n },\n );\n\n registerTaskLifecycleTools(server, conn);\n\n server.tool(\n \"create_release\",\n \"Create a release for the project — the same flow as the Release button in the web UI. Pass projectId to target a specific project; otherwise the configured default project is used. Creates a release task with a release/YYYY.MM.N branch and a PR from the dev branch to the default branch. Omit taskIds to release ALL cards currently in Review (Dev); pass a subset to cherry-pick — a cloud build agent then cherry-picks those changes and resolves conflicts. Fails if a release is already in progress or no cards are in Review (Dev).\",\n {\n projectId: z.string().optional().describe(\"Target Conveyor project ID\"),\n taskIds: z\n .array(z.string())\n .optional()\n .describe(\n \"Task IDs in Review (Dev) to cherry-pick into the release. Omit to release all of them.\",\n ),\n },\n async (params) => {\n const result = await conn.createRelease(params.taskIds, params.projectId);\n return textResult(result);\n },\n );\n\n server.tool(\n \"add_to_release\",\n \"Add Review (Dev) cards to the project's pending release — the same flow as the 'Add to Release' button in the web UI. Pass projectId to target a specific project; otherwise the configured default project is used. Cards must be in Review (Dev) and not already part of another release; the release branch is updated with the latest dev changes. Fails if no release is pending (use create_release instead).\",\n {\n projectId: z.string().optional().describe(\"Target Conveyor project ID\"),\n taskIds: z\n .array(z.string())\n .min(1)\n .describe(\"Task IDs (not slugs) in Review (Dev) to add to the pending release.\"),\n },\n async (params) => {\n const result = await conn.addTasksToRelease(params.taskIds, params.projectId);\n return textResult(result);\n },\n );\n\n server.tool(\n \"get_build_status\",\n \"Check codespace and agent status for a task. Pass projectId to target a specific project; otherwise the configured default project is used.\",\n {\n projectId: z.string().optional().describe(\"Target Conveyor project ID\"),\n taskId: z.string().describe(\"The task ID\"),\n },\n async (params) => {\n const status = await conn.getBuildStatus(params.taskId, params.projectId);\n return textResult(status);\n },\n );\n}\n","import { readFile, stat } from \"node:fs/promises\";\nimport { basename, extname } from \"node:path\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport {\n getAttachmentContract,\n listTaskFilesContract,\n uploadAttachmentContract,\n} from \"@project/shared/tool-contracts\";\nimport type { ConveyorConnection } from \"../connection.js\";\nimport { registerContractTool } from \"./contract-tool.js\";\n\n// Mirrors MAX_FILE_SIZE_BYTES in @project/shared service-map.ts (conveyor-mcp\n// has no workspace dependencies — the server enforces the real limit).\nconst MAX_FILE_SIZE_BYTES = 25 * 1024 * 1024;\n\nconst MIME_BY_EXT: Record<string, string> = {\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".gif\": \"image/gif\",\n \".webp\": \"image/webp\",\n \".svg\": \"image/svg+xml\",\n \".txt\": \"text/plain\",\n \".log\": \"text/plain\",\n \".md\": \"text/markdown\",\n \".csv\": \"text/csv\",\n \".html\": \"text/html\",\n \".css\": \"text/css\",\n \".js\": \"text/javascript\",\n \".ts\": \"text/plain\",\n \".json\": \"application/json\",\n \".yaml\": \"application/yaml\",\n \".yml\": \"application/yaml\",\n \".pdf\": \"application/pdf\",\n \".zip\": \"application/zip\",\n \".gz\": \"application/gzip\",\n \".mp4\": \"video/mp4\",\n \".webm\": \"video/webm\",\n \".mp3\": \"audio/mpeg\",\n \".wav\": \"audio/wav\",\n};\n\nexport function inferMimeType(filePath: string, override?: string): string {\n if (override) return override;\n return MIME_BY_EXT[extname(filePath).toLowerCase()] ?? \"application/octet-stream\";\n}\n\nfunction registerListTaskFiles(server: McpServer, conn: ConveyorConnection): void {\n registerContractTool(server, listTaskFilesContract, async (params) => {\n const files = await conn.listTaskFiles(params.taskId, params.projectId);\n return { content: [{ type: \"text\", text: JSON.stringify(files, null, 2) }] };\n });\n}\n\nexport interface AttachmentResult {\n fileName?: string;\n mimeType?: string;\n fileSize?: number;\n content?: string;\n contentEncoding?: string;\n contentByteOffset?: number;\n contentTotalBytes?: number;\n contentTruncated?: boolean;\n downloadUrl?: string;\n}\n\nexport type AttachmentContentBlock =\n | { type: \"text\"; text: string }\n | { type: \"image\"; data: string; mimeType: string };\n\nfunction buildTextContent(file: AttachmentResult, content: string): AttachmentContentBlock[] {\n const start = file.contentByteOffset ?? 0;\n const shown = Buffer.byteLength(content, \"utf-8\");\n const total = file.contentTotalBytes ?? shown;\n const more = file.contentTruncated\n ? ` — showing bytes ${start}–${start + shown} of ${total}; pass offset=${start + shown} for the next page, or fetch the full file at downloadUrl`\n : \"\";\n const header = `${file.fileName ?? \"file\"} (${file.mimeType ?? \"?\"}, ${total} bytes)${more}\\n${file.downloadUrl ? `downloadUrl: ${file.downloadUrl}\\n` : \"\"}---\\n`;\n return [{ type: \"text\", text: header + content }];\n}\n\nfunction buildImageContent(\n file: AttachmentResult,\n content: string,\n mimeType: string,\n): AttachmentContentBlock[] {\n const header = `${file.fileName ?? \"file\"} (${mimeType}, ${file.fileSize ?? \"?\"} bytes)${file.downloadUrl ? `\\ndownloadUrl: ${file.downloadUrl}` : \"\"}`;\n return [\n { type: \"text\", text: header },\n { type: \"image\", data: content, mimeType },\n ];\n}\n\n/**\n * Convert an attachment DTO into MCP content blocks.\n *\n * - utf-8 text → metadata/paging header + raw text (not JSON.stringify'd —\n * that double-escapes it).\n * - base64 images → metadata header + a proper MCP image block so the model\n * actually sees the image. Dumping base64 into a text block both blows the\n * client's token limit and is unviewable.\n * - anything else → metadata JSON with `content` stripped, so inlined bytes\n * can never leak into a text block.\n */\nexport function buildAttachmentContent(file: AttachmentResult): AttachmentContentBlock[] {\n if (typeof file.content === \"string\" && file.contentEncoding === \"utf-8\") {\n return buildTextContent(file, file.content);\n }\n if (\n typeof file.content === \"string\" &&\n file.contentEncoding === \"base64\" &&\n file.mimeType?.startsWith(\"image/\")\n ) {\n return buildImageContent(file, file.content, file.mimeType);\n }\n const { content: _content, ...metadata } = file;\n return [{ type: \"text\", text: JSON.stringify(metadata, null, 2) }];\n}\n\nfunction registerGetAttachment(server: McpServer, conn: ConveyorConnection): void {\n registerContractTool(server, getAttachmentContract, async (params) => {\n const file = (await conn.getAttachment(params.taskId, params.fileId, {\n offset: params.offset,\n maxBytes: params.maxBytes,\n projectId: params.projectId,\n })) as AttachmentResult;\n return { content: buildAttachmentContent(file) };\n });\n}\n\nfunction registerUploadAttachment(server: McpServer, conn: ConveyorConnection): void {\n registerContractTool(server, uploadAttachmentContract, async (params) => {\n const info = await stat(params.path).catch(() => null);\n if (!info?.isFile()) {\n return { content: [{ type: \"text\" as const, text: `File not found: ${params.path}` }] };\n }\n if (info.size > MAX_FILE_SIZE_BYTES) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: `File is ${info.size} bytes — exceeds the ${MAX_FILE_SIZE_BYTES} byte (25MB) upload limit.`,\n },\n ],\n };\n }\n\n const fileName = basename(params.path);\n const mimeType = inferMimeType(params.path, params.mimeType);\n const { fileId, uploadUrl } = await conn.requestFileUpload(params.taskId, {\n fileName,\n mimeType,\n fileSize: info.size,\n projectId: params.projectId,\n });\n\n // PUT raw bytes to the capability upload URL (the API byte-proxy streams\n // them to GCS). Content-Type carries the mime so the stored object is set.\n const body = await readFile(params.path);\n const res = await fetch(uploadUrl, {\n method: \"PUT\",\n headers: { \"Content-Type\": mimeType },\n body,\n });\n if (!res.ok) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: `Upload to storage failed: HTTP ${res.status} ${await res.text().catch(() => \"\")}`,\n },\n ],\n };\n }\n\n const result = await conn.confirmFileUpload(\n params.taskId,\n fileId,\n params.comment,\n params.projectId,\n );\n const lines = [\n `Uploaded ${result.fileName} (${info.size} bytes, ${mimeType}). File ID: ${result.fileId}`,\n ];\n if (result.downloadUrl) lines.push(`downloadUrl: ${result.downloadUrl}`);\n if (result.messageId) lines.push(\"Posted to the task chat.\");\n return { content: [{ type: \"text\" as const, text: lines.join(\"\\n\") }] };\n });\n}\n\nexport function registerAttachmentTools(server: McpServer, conn: ConveyorConnection): void {\n registerListTaskFiles(server, conn);\n registerGetAttachment(server, conn);\n registerUploadAttachment(server, conn);\n}\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { createPullRequestContract } from \"@project/shared/tool-contracts\";\nimport type { ConveyorConnection } from \"../connection.js\";\nimport { registerContractTool } from \"./contract-tool.js\";\n\nexport function registerPullRequestTools(server: McpServer, conn: ConveyorConnection): void {\n registerContractTool(server, createPullRequestContract, async (params) => {\n const result = await conn.createPullRequest(params);\n return {\n content: [{ type: \"text\", text: `PR #${result.prNumber} opened: ${result.prUrl}` }],\n };\n });\n}\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport {\n createSubtaskContract,\n deleteSubtaskContract,\n listSubtasksContract,\n updateSubtaskContract,\n} from \"@project/shared/tool-contracts\";\nimport type { ConveyorConnection } from \"../connection.js\";\nimport { registerContractTool } from \"./contract-tool.js\";\n\nfunction registerCreateSubtask(server: McpServer, conn: ConveyorConnection): void {\n registerContractTool(server, createSubtaskContract, async (params) => {\n const subtask = await conn.createSubtask(params);\n return {\n content: [{ type: \"text\", text: `Subtask created: ${subtask.id} (slug: ${subtask.slug})` }],\n };\n });\n}\n\nfunction registerUpdateSubtask(server: McpServer, conn: ConveyorConnection): void {\n registerContractTool(server, updateSubtaskContract, async (params) => {\n const result = await conn.updateSubtask(params);\n return {\n content: [{ type: \"text\", text: `Subtask ${result.id} updated (status: ${result.status})` }],\n };\n });\n}\n\nfunction registerListSubtasks(server: McpServer, conn: ConveyorConnection): void {\n registerContractTool(server, listSubtasksContract, async (params) => {\n const subtasks = await conn.listSubtasks(params.taskId, params.projectId);\n return { content: [{ type: \"text\", text: JSON.stringify(subtasks, null, 2) }] };\n });\n}\n\nfunction registerDeleteSubtask(server: McpServer, conn: ConveyorConnection): void {\n registerContractTool(server, deleteSubtaskContract, async (params) => {\n const result = await conn.deleteSubtask(params.subtaskId, params.projectId);\n return {\n content: [{ type: \"text\", text: result.deleted ? \"Subtask deleted\" : \"Subtask not deleted\" }],\n };\n });\n}\n\nexport function registerSubtaskTools(server: McpServer, conn: ConveyorConnection): void {\n registerCreateSubtask(server, conn);\n registerUpdateSubtask(server, conn);\n registerListSubtasks(server, conn);\n registerDeleteSubtask(server, conn);\n}\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport {\n addDependencyContract,\n getDependenciesContract,\n removeDependencyContract,\n} from \"@project/shared/tool-contracts\";\nimport type { ConveyorConnection } from \"../connection.js\";\nimport { registerContractTool } from \"./contract-tool.js\";\n\nfunction registerGetDependencies(server: McpServer, conn: ConveyorConnection): void {\n registerContractTool(server, getDependenciesContract, async (params) => {\n const deps = await conn.getDependencies(params.taskId, params.projectId);\n return { content: [{ type: \"text\", text: JSON.stringify(deps, null, 2) }] };\n });\n}\n\nfunction registerAddDependency(server: McpServer, conn: ConveyorConnection): void {\n registerContractTool(server, addDependencyContract, async (params) => {\n await conn.addDependency(params);\n return { content: [{ type: \"text\", text: \"Dependency added\" }] };\n });\n}\n\nfunction registerRemoveDependency(server: McpServer, conn: ConveyorConnection): void {\n registerContractTool(server, removeDependencyContract, async (params) => {\n await conn.removeDependency(params);\n return { content: [{ type: \"text\", text: \"Dependency removed\" }] };\n });\n}\n\nexport function registerDependencyTools(server: McpServer, conn: ConveyorConnection): void {\n registerGetDependencies(server, conn);\n registerAddDependency(server, conn);\n registerRemoveDependency(server, conn);\n}\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { createSuggestionContract } from \"@project/shared/tool-contracts\";\nimport type { ConveyorConnection } from \"../connection.js\";\nimport { registerContractTool } from \"./contract-tool.js\";\n\nexport function registerSuggestionTools(server: McpServer, conn: ConveyorConnection): void {\n registerContractTool(server, createSuggestionContract, async (params) => {\n const result = await conn.createSuggestion(params);\n const text = result.merged\n ? `Suggestion merged into existing suggestion ${result.mergedIntoId} (upvote recorded)`\n : `Suggestion created: ${result.id}`;\n return { content: [{ type: \"text\", text }] };\n });\n}\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport {\n approveManualTestContract,\n editManualTestContract,\n listManualTestsContract,\n queryManualTestsContract,\n rejectManualTestContract,\n removeManualTestContract,\n setManualTestsContract,\n} from \"@project/shared/tool-contracts\";\nimport type { ConveyorConnection } from \"../connection.js\";\nimport { registerContractTool } from \"./contract-tool.js\";\n\ntype ManualTestGroup = Awaited<ReturnType<ConveyorConnection[\"queryManualTests\"]>>[number];\n\n/** Compact grouped rendering for cross-task manual-test queries: one header per\n * task, one line per test with a status glyph, and the failing reason indented\n * under each rejected test. */\nfunction renderManualTestGroups(groups: ManualTestGroup[]): string {\n const lines: string[] = [];\n for (const g of groups) {\n lines.push(`## ${g.title} [${g.status}] (${g.slug})`);\n for (const t of g.tests) {\n const mark = t.status === \"approved\" ? \"✓\" : t.status === \"rejected\" ? \"✗\" : \"○\";\n lines.push(` ${mark} ${t.title} — ${t.status}`);\n if (t.status === \"rejected\") {\n for (const f of t.failures ?? []) {\n lines.push(` ⚠ ${f.userName ?? \"Someone\"}: ${f.reason ?? \"(no message)\"}`);\n }\n }\n }\n lines.push(\"\");\n }\n return lines.join(\"\\n\").trimEnd();\n}\n\nfunction registerListManualTests(server: McpServer, conn: ConveyorConnection): void {\n registerContractTool(server, listManualTestsContract, async (params) => {\n const items = await conn.listManualTests(params.taskId, params.projectId);\n if (items.length === 0) {\n return { content: [{ type: \"text\", text: \"No manual tests recorded for this task.\" }] };\n }\n const lines = items.flatMap((item, i) => {\n const checked = item.checked ? \"[x]\" : \"[ ]\";\n const row = [`${i + 1}. ${checked} ${item.title}`];\n for (const f of item.failures ?? []) {\n const who = f.userName ?? \"Someone\";\n const reason = f.reason ?? \"(no message)\";\n row.push(` ⚠ Failed (${who}): ${reason}`);\n }\n return row;\n });\n return { content: [{ type: \"text\", text: lines.join(\"\\n\") }] };\n });\n}\n\nfunction registerSetManualTests(server: McpServer, conn: ConveyorConnection): void {\n registerContractTool(server, setManualTestsContract, async (params) => {\n const result = await conn.setManualTests(params.taskId, params.items, params.projectId);\n const parts = [`Created ${result.created} manual test item(s).`];\n if (result.skipped > 0) parts.push(`Skipped ${result.skipped} duplicate(s).`);\n return { content: [{ type: \"text\", text: parts.join(\" \") }] };\n });\n}\n\nfunction registerEditManualTest(server: McpServer, conn: ConveyorConnection): void {\n registerContractTool(server, editManualTestContract, async (params) => {\n await conn.editManualTest(params.taskId, params.title, params.newTitle, params.projectId);\n return { content: [{ type: \"text\", text: `Updated manual test to \"${params.newTitle}\".` }] };\n });\n}\n\nfunction registerRemoveManualTest(server: McpServer, conn: ConveyorConnection): void {\n registerContractTool(server, removeManualTestContract, async (params) => {\n await conn.removeManualTest(params.taskId, params.title, params.projectId);\n return { content: [{ type: \"text\", text: `Removed manual test \"${params.title}\".` }] };\n });\n}\n\nfunction registerApproveManualTest(server: McpServer, conn: ConveyorConnection): void {\n registerContractTool(server, approveManualTestContract, async (params) => {\n await conn.approveManualTest(params.taskId, params.title, params.projectId);\n return { content: [{ type: \"text\", text: `Approved manual test \"${params.title}\".` }] };\n });\n}\n\nfunction registerRejectManualTest(server: McpServer, conn: ConveyorConnection): void {\n registerContractTool(server, rejectManualTestContract, async (params) => {\n await conn.rejectManualTest(params.taskId, params.title, params.reason, params.projectId);\n return {\n content: [\n {\n type: \"text\",\n text: `Flagged an issue with manual test \"${params.title}\": ${params.reason}`,\n },\n ],\n };\n });\n}\n\nfunction registerQueryManualTests(server: McpServer, conn: ConveyorConnection): void {\n registerContractTool(server, queryManualTestsContract, async (params) => {\n const groups = await conn.queryManualTests({\n projectId: params.projectId,\n cardStatuses: params.cardStatuses,\n testStatuses: params.testStatuses,\n });\n if (groups.length === 0) {\n return { content: [{ type: \"text\", text: \"No manual tests match those filters.\" }] };\n }\n return { content: [{ type: \"text\", text: renderManualTestGroups(groups) }] };\n });\n}\n\nexport function registerChecklistTools(server: McpServer, conn: ConveyorConnection): void {\n registerListManualTests(server, conn);\n registerQueryManualTests(server, conn);\n registerSetManualTests(server, conn);\n registerEditManualTest(server, conn);\n registerRemoveManualTest(server, conn);\n registerApproveManualTest(server, conn);\n registerRejectManualTest(server, conn);\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { ConveyorConnection } from \"../connection.js\";\nimport {\n startWorkspaceSshTunnel,\n type WorkspaceSshTunnelHandle,\n type WorkspaceSshTunnelOptions,\n} from \"../workspace-ssh-tunnel.js\";\n\ninterface WorkspaceToolDeps {\n startTunnel?: (options: WorkspaceSshTunnelOptions) => Promise<WorkspaceSshTunnelHandle>;\n}\n\nconst activeTunnels = new Map<string, WorkspaceSshTunnelHandle>();\n\nfunction createTunnelId(taskId: string, port: number): string {\n return `${taskId}:${port}:${Date.now().toString(36)}:${Math.random().toString(36).slice(2, 8)}`;\n}\n\nfunction localUrlFor(port: number, host: string, localPort: number): string | undefined {\n if (port === 2222) return undefined;\n return `http://${host}:${localPort}`;\n}\n\nfunction registerAttachInfoTool(server: McpServer, conn: ConveyorConnection): void {\n server.tool(\n \"workspace_attach_info\",\n \"Return SSH/SFTP attach metadata for a running task Claudespace, plus hosted preview URLs and configured preview ports. Optionally installs an OpenSSH public key for this attach session.\",\n {\n taskId: z.string().describe(\"The task ID\"),\n sshPublicKey: z\n .string()\n .optional()\n .describe(\"Optional OpenSSH public key to install into the workspace\"),\n },\n async ({ taskId, sshPublicKey }) => {\n const info = await conn.getWorkspaceAttachInfo(taskId, sshPublicKey);\n return { content: [{ type: \"text\", text: JSON.stringify(info, null, 2) }] };\n },\n );\n}\n\nfunction registerPreviewUrlsTool(server: McpServer, conn: ConveyorConnection): void {\n server.tool(\n \"workspace_preview_urls\",\n \"Return the hosted preview URLs and preview ports for a running task Claudespace. This mirrors the web UI preview link metadata.\",\n {\n taskId: z.string().describe(\"The task ID\"),\n },\n async ({ taskId }) => {\n const info = await conn.getWorkspaceAttachInfo(taskId);\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(\n {\n taskId: info.taskId,\n sessionId: info.sessionId,\n previewPorts: info.previewPorts,\n previewUrls: info.previewUrls,\n },\n null,\n 2,\n ),\n },\n ],\n };\n },\n );\n}\n\nfunction registerStartTunnelTool(\n server: McpServer,\n conn: ConveyorConnection,\n startTunnel: (options: WorkspaceSshTunnelOptions) => Promise<WorkspaceSshTunnelHandle>,\n): void {\n server.tool(\n \"workspace_start_tunnel\",\n \"Start a local loopback tunnel through the MCP server to a running task Claudespace port. Use port 2222 for SSH/SFTP, or one of previewPorts for app access.\",\n {\n taskId: z.string().describe(\"The task ID\"),\n port: z.number().optional().describe(\"Remote Claudespace port. Defaults to SSH port 2222.\"),\n preferredLocalPort: z\n .number()\n .optional()\n .describe(\"Preferred local loopback port. If omitted, the OS chooses one.\"),\n sshPublicKey: z\n .string()\n .optional()\n .describe(\"Optional OpenSSH public key to install before opening the tunnel\"),\n },\n async ({ taskId, port, preferredLocalPort, sshPublicKey }) => {\n const info = await conn.getWorkspaceAttachInfo(taskId, sshPublicKey);\n const remotePort = port ?? info.ssh?.remotePort ?? 2222;\n const handle = await startTunnel({\n remotePort,\n preferredLocalPort,\n // Re-mint per connection so the tunnel outlives the attach-token TTL.\n // The key (if any) is already installed by the call above; the refetch\n // only needs a fresh token, so it omits sshPublicKey.\n resolveTarget: async () => {\n const fresh = await conn.getWorkspaceAttachInfo(taskId);\n return { tunnelUrl: fresh.tunnelUrl, attachToken: fresh.attachToken };\n },\n });\n const tunnelId = createTunnelId(taskId, remotePort);\n activeTunnels.set(tunnelId, handle);\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(\n {\n tunnelId,\n taskId,\n remotePort,\n localHost: handle.host,\n localPort: handle.port,\n localUrl: localUrlFor(remotePort, handle.host, handle.port),\n // `-o ServerAliveInterval=30` drives client-side keepalives so an\n // idle session keeps the tunnel warm (the tunnel layer pings too,\n // but the client must keep its own TCP path alive across every hop).\n sshCommand:\n remotePort === 2222\n ? `ssh -o ServerAliveInterval=30 -o ServerAliveCountMax=3 -p ${handle.port} ${info.ssh?.username ?? \"conveyor\"}@${handle.host}`\n : undefined,\n sftpCommand:\n remotePort === 2222\n ? `sftp -o ServerAliveInterval=30 -o ServerAliveCountMax=3 -P ${handle.port} ${info.ssh?.username ?? \"conveyor\"}@${handle.host}`\n : undefined,\n previewPorts: info.previewPorts,\n previewUrls: info.previewUrls,\n expiresAt: info.expiresAt,\n },\n null,\n 2,\n ),\n },\n ],\n };\n },\n );\n}\n\nfunction registerStopTunnelTool(server: McpServer): void {\n server.tool(\n \"workspace_stop_tunnel\",\n \"Stop a local workspace tunnel previously opened by workspace_start_tunnel.\",\n {\n tunnelId: z.string().describe(\"Tunnel id returned by workspace_start_tunnel\"),\n },\n async ({ tunnelId }) => {\n const tunnel = activeTunnels.get(tunnelId);\n if (!tunnel) throw new Error(\"Workspace tunnel not found\");\n await tunnel.close();\n activeTunnels.delete(tunnelId);\n return { content: [{ type: \"text\", text: \"Workspace tunnel stopped\" }] };\n },\n );\n}\n\nexport function registerWorkspaceTools(\n server: McpServer,\n conn: ConveyorConnection,\n deps: WorkspaceToolDeps = {},\n): void {\n registerAttachInfoTool(server, conn);\n registerPreviewUrlsTool(server, conn);\n registerStartTunnelTool(server, conn, deps.startTunnel ?? startWorkspaceSshTunnel);\n registerStopTunnelTool(server);\n}\n","import net from \"node:net\";\nimport { once } from \"node:events\";\nimport { WebSocket } from \"ws\";\n\n// Mirrors WORKSPACE_TUNNEL_HEARTBEAT_MS in @project/shared constants/workspace-tunnel.ts\n// (conveyor-mcp has no workspace dependencies — the two tunnel ends share this\n// value by convention). Cloudflare reaps idle proxied WebSockets, so both ends\n// ping on this interval to keep the edge connection warm.\nconst WORKSPACE_TUNNEL_HEARTBEAT_MS = 30_000;\n\nexport interface WorkspaceTunnelTarget {\n tunnelUrl: string;\n attachToken: string;\n}\n\nexport interface WorkspaceSshTunnelOptions {\n // Minted fresh for every local connection so long-lived clients (VS Code\n // Remote-SSH / SSHFS open many short connections over one session) keep\n // working after the short-lived attach token expires — no refresh plumbing,\n // just re-fetch on connect.\n resolveTarget: () => Promise<WorkspaceTunnelTarget>;\n remotePort: number;\n preferredLocalPort?: number;\n host?: string;\n}\n\nexport interface WorkspaceSshTunnelHandle {\n host: string;\n port: number;\n close: () => Promise<void>;\n}\n\nfunction withPort(url: string, port: number): string {\n const parsed = new URL(url);\n parsed.searchParams.set(\"port\", String(port));\n return parsed.toString();\n}\n\nfunction toBuffer(data: WebSocket.RawData): Buffer {\n if (Buffer.isBuffer(data)) return data;\n if (data instanceof ArrayBuffer) return Buffer.from(data);\n return Buffer.concat(data);\n}\n\n// Ping from this end too: a long-lived single connection (interactive `ssh`,\n// `ssh -L` forward) carries no traffic while idle, and Cloudflare reaps idle\n// proxied WebSockets. The heartbeat keeps the upstream warm so the tunnel\n// lives as long as the workspace, not just until the next idle reap.\nfunction startHeartbeat(ws: WebSocket): () => void {\n const timer = setInterval(() => {\n if (ws.readyState === WebSocket.OPEN) ws.ping();\n }, WORKSPACE_TUNNEL_HEARTBEAT_MS);\n timer.unref?.();\n return () => clearInterval(timer);\n}\n\n// Bridge one accepted local connection (ssh/sftp) to a freshly-minted upstream\n// WebSocket. Each local connection re-mints via `resolveTarget`, so long-lived\n// clients keep working past the attach-token TTL.\nfunction bridgeClient(client: net.Socket, options: WorkspaceSshTunnelOptions): void {\n let ws: WebSocket | null = null;\n let ready = false;\n // Client (ssh) bytes can arrive before the async re-mint + WS open; hold\n // them until the upstream is ready so the handshake isn't dropped.\n const pending: Buffer[] = [];\n client.on(\"data\", (data) => {\n // No encoding is set on `client`, so `data` is always a Buffer at runtime;\n // @types/node types the stream chunk as `string | Buffer`, so normalize.\n const chunk = Buffer.isBuffer(data) ? data : Buffer.from(data);\n if (ready && ws && ws.readyState === WebSocket.OPEN) ws.send(chunk);\n else pending.push(chunk);\n });\n client.on(\"close\", () => ws?.close());\n client.on(\"error\", () => ws?.close());\n\n options\n .resolveTarget()\n .then(({ tunnelUrl, attachToken }) => {\n // Token rides in a header, not the query string, so it isn't captured\n // by edge/proxy access logs. (Node `ws` can set request headers; the\n // browser WebSocket API can't — but this client is always Node.)\n const socket = new WebSocket(withPort(tunnelUrl, options.remotePort), {\n headers: { \"x-workspace-attach-token\": attachToken },\n });\n ws = socket;\n const stopHeartbeat = startHeartbeat(socket);\n socket.on(\"message\", (data) => {\n const chunk = toBuffer(data);\n if (!ready) {\n const text = chunk.toString(\"utf8\");\n if (text === JSON.stringify({ ok: true })) {\n ready = true;\n for (const buffered of pending.splice(0)) socket.send(buffered);\n return;\n }\n client.destroy(new Error(`Workspace tunnel rejected connection: ${text}`));\n socket.close();\n return;\n }\n client.write(chunk);\n });\n socket.on(\"close\", () => {\n stopHeartbeat();\n client.destroy();\n });\n socket.on(\"error\", (err) => {\n stopHeartbeat();\n client.destroy(err);\n });\n })\n .catch((err) => {\n client.destroy(err instanceof Error ? err : new Error(String(err)));\n });\n}\n\nexport async function startWorkspaceSshTunnel(\n options: WorkspaceSshTunnelOptions,\n): Promise<WorkspaceSshTunnelHandle> {\n const host = options.host ?? \"127.0.0.1\";\n const server = net.createServer((client) => bridgeClient(client, options));\n\n // Race \"listening\" against \"error\": a busy preferredLocalPort emits \"error\"\n // with no listener, which would otherwise crash the MCP process.\n const ac = new AbortController();\n server.listen(options.preferredLocalPort ?? 0, host);\n try {\n await Promise.race([\n once(server, \"listening\", { signal: ac.signal }),\n once(server, \"error\", { signal: ac.signal }).then(([err]) => {\n throw err instanceof Error ? err : new Error(String(err));\n }),\n ]);\n } catch (err) {\n server.close();\n throw new Error(\n `Failed to bind workspace SSH tunnel: ${err instanceof Error ? err.message : String(err)}`,\n { cause: err },\n );\n } finally {\n ac.abort();\n }\n const address = server.address();\n if (!address || typeof address === \"string\") {\n server.close();\n throw new Error(\"Failed to bind workspace SSH tunnel\");\n }\n\n return {\n host,\n port: address.port,\n close: () =>\n new Promise<void>((resolve, reject) => {\n server.close((err) => {\n if (err) reject(err);\n else resolve();\n });\n }),\n };\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { ConveyorConnection, GcpLogEntry } from \"../connection.js\";\n\nconst SEVERITY_ENUM = [\n \"DEBUG\",\n \"INFO\",\n \"NOTICE\",\n \"WARNING\",\n \"ERROR\",\n \"CRITICAL\",\n \"ALERT\",\n \"EMERGENCY\",\n] as const;\n\nconst MAX_LINE_CHARS = 400;\nconst DEFAULT_SINCE_MINUTES = 60;\n\nfunction truncateLine(text: string): string {\n const oneLine = text.replace(/\\s*\\n\\s*/g, \" ⏎ \");\n if (oneLine.length <= MAX_LINE_CHARS) return oneLine;\n const overflow = oneLine.length - MAX_LINE_CHARS;\n return `${oneLine.slice(0, MAX_LINE_CHARS)}…[+${overflow}c]`;\n}\n\nfunction entrySource(entry: GcpLogEntry): string {\n return (\n entry.resource.service_name ??\n entry.resource.pod_name ??\n entry.resource.database_id ??\n entry.resourceType ??\n \"-\"\n );\n}\n\n/** Payload keys that add nothing over the message/severity columns. */\nconst PAYLOAD_SKIP_KEYS = new Set([\"message\", \"severity\", \"timestamp\", \"level\", \"stack\"]);\n/** Highest-signal keys render first so the line cap trims the boring tail. */\nconst PAYLOAD_PRIORITY = [\n \"error\",\n \"outcome\",\n \"serviceName\",\n \"methodName\",\n \"userId\",\n \"taskId\",\n \"sessionId\",\n \"workspaceId\",\n \"projectId\",\n \"durationMs\",\n];\nconst PAYLOAD_VALUE_MAX_CHARS = 160;\n\nfunction compactPayloadValue(value: unknown): string {\n const raw = typeof value === \"string\" ? value : JSON.stringify(value);\n const flat = (raw ?? \"undefined\").replace(/\\s+/g, \" \");\n const quoted = typeof value === \"string\" && /[\\s\"]/.test(flat) ? JSON.stringify(flat) : flat;\n return quoted.length > PAYLOAD_VALUE_MAX_CHARS\n ? `${quoted.slice(0, PAYLOAD_VALUE_MAX_CHARS)}…`\n : quoted;\n}\n\n/**\n * Render the entry's structured payload as a compact ` | k=v k=v` suffix so a\n * failed method call reads as WHO did WHAT and WHY it failed on one line,\n * instead of a bare \"-> fail\" with the context dropped.\n */\nexport function formatPayloadSuffix(payloadJson: string | undefined): string {\n if (!payloadJson) return \"\";\n let parsed: unknown;\n try {\n parsed = JSON.parse(payloadJson);\n } catch {\n return \"\";\n }\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) return \"\";\n const obj = parsed as Record<string, unknown>;\n const rank = (key: string): number => {\n const i = PAYLOAD_PRIORITY.indexOf(key);\n return i === -1 ? PAYLOAD_PRIORITY.length : i;\n };\n const parts = Object.keys(obj)\n .filter((k) => !PAYLOAD_SKIP_KEYS.has(k) && obj[k] !== undefined && obj[k] !== null)\n .sort((a, b) => rank(a) - rank(b) || a.localeCompare(b))\n .map((k) => `${k}=${compactPayloadValue(obj[k])}`);\n return parts.length > 0 ? ` | ${parts.join(\" \")}` : \"\";\n}\n\nexport function formatLogEntryLine(entry: GcpLogEntry): string {\n const httpPrefix = entry.httpRequest?.status\n ? `http ${entry.httpRequest.status} ${entry.httpRequest.method ?? \"\"} ${entry.httpRequest.url ?? \"\"}`.trim() +\n \" — \"\n : \"\";\n return `${entry.timestamp} ${entry.severity.padEnd(7)} [${entrySource(entry)}] ${truncateLine(\n `${httpPrefix}${entry.message}${formatPayloadSuffix(entry.payload)}`,\n )}`;\n}\n\nexport interface QueryGcpLogsToolParams {\n projectId?: string;\n env?: \"prod\" | \"dev\" | \"claudespace\";\n sinceMinutes?: number;\n startTime?: string;\n endTime?: string;\n severity?: (typeof SEVERITY_ENUM)[number];\n services?: string[];\n sqlInstances?: string[];\n allServices?: boolean;\n search?: string;\n filter?: string;\n limit?: number;\n pageToken?: string;\n}\n\n/** Exported for tests — the tool handler minus MCP plumbing. */\nexport async function runQueryGcpLogs(\n conn: ConveyorConnection,\n params: QueryGcpLogsToolParams,\n now: () => number = Date.now,\n): Promise<string> {\n const startTime =\n params.startTime ??\n new Date(now() - (params.sinceMinutes ?? DEFAULT_SINCE_MINUTES) * 60_000).toISOString();\n\n const result = await conn.queryGcpLogs({\n projectId: params.projectId,\n env: params.env,\n severity: params.severity,\n services: params.services,\n sqlInstances: params.sqlInstances,\n allServices: params.allServices,\n search: params.search,\n filter: params.filter,\n startTime,\n endTime: params.endTime,\n limit: params.limit,\n pageToken: params.pageToken,\n });\n\n if (result.error) return result.error;\n\n const header = [\n `env=${params.env ?? \"prod\"}`,\n `window=${startTime}→${params.endTime ?? \"now\"}`,\n ...(params.severity ? [`minSeverity=${params.severity}`] : []),\n `scope=${result.scopedServices ? `[${result.scopedServices.join(\", \")}]` : \"all\"}`,\n `entries=${result.entries.length}`,\n ].join(\" \");\n\n const lines = result.entries.map(formatLogEntryLine);\n const footer = result.nextPageToken\n ? [`-- more available: pass pageToken=\"${result.nextPageToken}\" to continue`]\n : [];\n\n if (lines.length === 0) {\n return [\n header,\n \"(no matching log entries — widen the window, lower minSeverity, or drop filters)\",\n ].join(\"\\n\");\n }\n return [header, ...lines, ...footer].join(\"\\n\");\n}\n\nexport interface QueryGrafanaLogsToolParams {\n projectId?: string;\n env?: \"prod\" | \"dev\";\n sinceMinutes?: number;\n startTime?: string;\n endTime?: string;\n level?: \"debug\" | \"info\" | \"warn\" | \"error\" | \"fatal\";\n services?: string[];\n search?: string;\n logql?: string;\n limit?: number;\n}\n\n/** Exported for tests — the tool handler minus MCP plumbing. */\nexport async function runQueryGrafanaLogs(\n conn: ConveyorConnection,\n params: QueryGrafanaLogsToolParams,\n now: () => number = Date.now,\n): Promise<string> {\n const startTime =\n params.startTime ??\n new Date(now() - (params.sinceMinutes ?? DEFAULT_SINCE_MINUTES) * 60_000).toISOString();\n\n const result = await conn.queryGrafanaLogs({\n projectId: params.projectId,\n env: params.env,\n level: params.level,\n services: params.services,\n search: params.search,\n logql: params.logql,\n startTime,\n endTime: params.endTime,\n limit: params.limit,\n });\n\n if (result.error) return result.error;\n\n const header = [\n `env=${params.env ?? \"prod\"}`,\n `window=${startTime}→${params.endTime ?? \"now\"}`,\n ...(params.level ? [`minLevel=${params.level}`] : []),\n ...(result.logql ? [`logql=${truncateLine(result.logql)}`] : []),\n `entries=${result.entries.length}`,\n ].join(\" \");\n\n const lines = result.entries.map(formatLogEntryLine);\n const footer = result.hasMore\n ? [\"-- hit the limit: narrow the window (startTime/endTime) for older lines\"]\n : [];\n\n if (lines.length === 0) {\n return [\n header,\n \"(no matching log entries — widen the window, lower minLevel, or drop filters)\",\n ].join(\"\\n\");\n }\n return [header, ...lines, ...footer].join(\"\\n\");\n}\n\nfunction registerGrafanaLogTool(server: McpServer, conn: ConveyorConnection): void {\n server.tool(\n \"query_grafana_logs\",\n \"Query the project's connected Grafana (Loki) logs — the application logs shipped to Grafana Cloud/Loki, complementing query_gcp_logs (GCP infrastructure logs). Start with structured filters (env, level=error, sinceMinutes=60, services), then narrow with search; pass raw LogQL via logql only when structured filters can't express the query (it REPLACES them). The response header echoes the composed LogQL — iterate on it. Returns compact lines: '<time> <SEVERITY> [<service>] <message>'.\",\n {\n projectId: z.string().optional().describe(\"Target Conveyor project ID\"),\n env: z\n .enum([\"prod\", \"dev\"])\n .optional()\n .describe(\"Configured Grafana env mapping to scope by (default prod)\"),\n sinceMinutes: z\n .number()\n .int()\n .min(1)\n .max(10080)\n .optional()\n .describe(\n \"Relative time window ending now, in minutes (default 60). Ignored if startTime is set.\",\n ),\n startTime: z.string().optional().describe(\"ISO 8601 lower bound (overrides sinceMinutes)\"),\n endTime: z.string().optional().describe(\"ISO 8601 upper bound (default now)\"),\n level: z\n .enum([\"debug\", \"info\", \"warn\", \"error\", \"fatal\"])\n .optional()\n .describe(\"Minimum severity, inclusive — error returns error and above\"),\n services: z\n .array(z.string())\n .optional()\n .describe(\"Restrict to these service_name label values\"),\n search: z\n .string()\n .max(256)\n .optional()\n .describe(\"Substring line filter (exact substring, not regex)\"),\n logql: z\n .string()\n .max(2000)\n .optional()\n .describe(\"Advanced: raw LogQL query — REPLACES env/services/level/search composition\"),\n limit: z.number().int().min(1).max(200).optional().describe(\"Max entries (default 50)\"),\n },\n async (params) => {\n const text = await runQueryGrafanaLogs(conn, params);\n return { content: [{ type: \"text\", text }] };\n },\n );\n}\n\nexport function registerLogTools(server: McpServer, conn: ConveyorConnection): void {\n server.tool(\n \"query_gcp_logs\",\n \"Query Google Cloud Logging for a project's linked GCP environments — use this to investigate production or dev issues directly ('something broke on prod'). Envs: 'prod' and 'dev' are the project's Cloud Run apps + Cloud SQL databases (scoped by default to the resources linked in project settings); 'claudespace' is the project's GKE agent-pod namespace. Start broad (severity=ERROR, sinceMinutes=60), then narrow with services/search. Returns compact lines: '<time> <SEVERITY> [<source>] <message> | key=value …' (the key=value tail is the entry's structured payload — error details, service/method, actor and entity ids). When the response ends with a pageToken line, pass that token back as pageToken for the next page. Pass projectId to target a specific project; otherwise the configured default project is used.\",\n {\n projectId: z.string().optional().describe(\"Target Conveyor project ID\"),\n env: z\n .enum([\"prod\", \"dev\", \"claudespace\"])\n .optional()\n .describe(\"GCP environment slot to query (default prod)\"),\n sinceMinutes: z\n .number()\n .int()\n .min(1)\n .max(10080)\n .optional()\n .describe(\n \"Relative time window ending now, in minutes (default 60). Ignored if startTime is set.\",\n ),\n startTime: z.string().optional().describe(\"ISO 8601 lower bound (overrides sinceMinutes)\"),\n endTime: z.string().optional().describe(\"ISO 8601 upper bound (default now)\"),\n severity: z\n .enum(SEVERITY_ENUM)\n .optional()\n .describe(\"Minimum severity, inclusive — ERROR returns ERROR and above\"),\n services: z\n .array(z.string())\n .optional()\n .describe(\n \"Restrict to these Cloud Run service names (prod/dev only). Defaults to all services linked in project settings.\",\n ),\n sqlInstances: z\n .array(z.string())\n .optional()\n .describe(\"Restrict to these Cloud SQL instance names (prod/dev only)\"),\n allServices: z\n .boolean()\n .optional()\n .describe(\n \"Set true to search ALL logs in the GCP project, ignoring the linked-resource scope\",\n ),\n search: z\n .string()\n .max(256)\n .optional()\n .describe(\"Free-text search across all log fields (exact substring, not regex)\"),\n filter: z\n .string()\n .max(1000)\n .optional()\n .describe(\"Advanced: raw Cloud Logging filter expression, ANDed with the scope\"),\n limit: z\n .number()\n .int()\n .min(1)\n .max(200)\n .optional()\n .describe(\"Max entries per page (default 50)\"),\n pageToken: z\n .string()\n .optional()\n .describe(\"Opaque token from a previous response to fetch the next page\"),\n },\n async (params) => {\n const text = await runQueryGcpLogs(conn, params);\n return { content: [{ type: \"text\", text }] };\n },\n );\n\n registerGrafanaLogTool(server, conn);\n}\n","/* oxlint-disable import/max-dependencies -- registration aggregator imports every tool module by design */\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { ConveyorConnection } from \"../connection.js\";\nimport { registerProjectTools } from \"./project.js\";\nimport { registerConnectionTools } from \"./connection.js\";\nimport { registerProjectConfigTools } from \"./project-config.js\";\nimport { registerTaskTools } from \"./tasks.js\";\nimport { registerBuildTools } from \"./builds.js\";\nimport { registerAttachmentTools } from \"./attachments.js\";\nimport { registerPullRequestTools } from \"./pull-request.js\";\nimport { registerSubtaskTools } from \"./subtasks.js\";\nimport { registerDependencyTools } from \"./dependencies.js\";\nimport { registerSuggestionTools } from \"./suggestions.js\";\nimport { registerChecklistTools } from \"./checklists.js\";\nimport { registerWorkspaceTools } from \"./workspace.js\";\nimport { registerLogTools } from \"./logs.js\";\n\nexport function registerAllTools(server: McpServer, conn: ConveyorConnection): void {\n registerProjectTools(server, conn);\n registerConnectionTools(server, conn);\n registerProjectConfigTools(server, conn);\n registerTaskTools(server, conn);\n registerBuildTools(server, conn);\n registerAttachmentTools(server, conn);\n registerPullRequestTools(server, conn);\n registerSubtaskTools(server, conn);\n registerDependencyTools(server, conn);\n registerSuggestionTools(server, conn);\n registerChecklistTools(server, conn);\n registerWorkspaceTools(server, conn);\n registerLogTools(server, conn);\n}\n"],"mappings":"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","names":["server","conn","z","server","conn","z","server","conn","projectId","z","z","z","z","server","z","server","conn","projectId","z","textResult","server","conn","server","conn","server","conn","server","conn","server","conn","server","conn","f","server","conn","z","server","server","conn","z","z","conn","server","server","conn"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rallycry/conveyor-mcp",
3
- "version": "4.3.13",
3
+ "version": "4.3.14",
4
4
  "description": "Conveyor MCP server for Claude Code PM integration",
5
5
  "keywords": [
6
6
  "claude",
@@ -37,7 +37,7 @@
37
37
  "@modelcontextprotocol/sdk": "^1.12.1",
38
38
  "socket.io-client": "^4.8.3",
39
39
  "ws": "8.21.1",
40
- "zod": "^3.25.76"
40
+ "zod": "^4.0.0"
41
41
  },
42
42
  "devDependencies": {
43
43
  "@project/shared": "workspace:*",