"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; })(); Object.defineProperty(exports, "__esModule", { value: true }); exports.ZedAgent = void 0; const path = __importStar(require("path")); const fs_1 = require("fs"); const AgentsMdAgent_1 = require("./AgentsMdAgent"); /** * Zed editor agent adapter. * Inherits from AgentsMdAgent to write instructions to AGENTS.md and handles * MCP server configuration in .zed/settings.json at the project root. */ class ZedAgent extends AgentsMdAgent_1.AgentsMdAgent { getIdentifier() { return 'zed'; } getName() { return 'Zed'; } async applyRulerConfig(concatenatedRules, projectRoot, rulerMcpJson, agentConfig) { // First, perform idempotent AGENTS.md write via base class await super.applyRulerConfig(concatenatedRules, projectRoot, null, { outputPath: agentConfig?.outputPath, }); // Handle MCP server configuration if enabled and provided const mcpEnabled = agentConfig?.mcp?.enabled ?? true; if (mcpEnabled && rulerMcpJson) { const zedSettingsPath = path.join(projectRoot, '.zed', 'settings.json'); // Read existing settings let existingSettings = {}; try { const content = await fs_1.promises.readFile(zedSettingsPath, 'utf8'); existingSettings = JSON.parse(content); } catch (error) { if (error.code !== 'ENOENT') { throw error; } // File doesn't exist, use empty settings } // Get the merge strategy const strategy = agentConfig?.mcp?.strategy ?? 'merge'; // Handle merging based on strategy let mergedSettings; if (strategy === 'overwrite') { // For overwrite, preserve all existing settings except MCP servers mergedSettings = { ...existingSettings }; // Extract incoming MCP servers and transform them for Zed format const incomingServers = rulerMcpJson.mcpServers || {}; const transformedServers = {}; for (const [serverName, serverConfig] of Object.entries(incomingServers)) { transformedServers[serverName] = this.transformMcpServerForZed(serverConfig); } // Replace MCP servers completely mergedSettings[this.getMcpServerKey()] = transformedServers; } else { // For merge strategy, preserve all existing settings const baseServers = existingSettings[this.getMcpServerKey()] || {}; const incomingServers = rulerMcpJson.mcpServers || {}; // Transform incoming servers for Zed format const transformedIncomingServers = {}; for (const [serverName, serverConfig] of Object.entries(incomingServers)) { transformedIncomingServers[serverName] = this.transformMcpServerForZed(serverConfig); } const mergedServers = { ...baseServers, ...transformedIncomingServers }; mergedSettings = { ...existingSettings, [this.getMcpServerKey()]: mergedServers, }; } // Write updated settings await fs_1.promises.mkdir(path.dirname(zedSettingsPath), { recursive: true }); await fs_1.promises.writeFile(zedSettingsPath, JSON.stringify(mergedSettings, null, 2)); } } getMcpServerKey() { return 'context_servers'; } supportsMcpStdio() { return true; } supportsMcpRemote() { return true; } /** * Transform MCP server configuration from ruler format to Zed format. * Converts "type": "stdio" to "source": "custom" and preserves other fields. */ transformMcpServerForZed(rulerServer) { const transformedServer = { ...rulerServer }; // Remove "type" field if present delete transformedServer.type; // Add "source": "custom" as required by Zed transformedServer.source = 'custom'; return transformedServer; } } exports.ZedAgent = ZedAgent;