{"version":3,"sources":["../src/cli/commands/remove.ts"],"sourcesContent":["import * as fs from \"fs\";\nimport * as path from \"path\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { FileManager } from \"../utils/fileManager\";\nimport { PromptsError } from \"@/client-sdk/services/prompts\";\nimport { formatApiErrorMessage } from \"@/client-sdk/services/_shared/format-api-error\";\nimport { failSpinner } from \"../utils/spinnerError\";\n\nexport const removeCommand = async (name: string): Promise<void> => {\n  try {\n    // Validate prompt name\n    if (!name || name.trim() === \"\") {\n      console.error(chalk.red(\"Error: Prompt name cannot be empty\"));\n      process.exit(1);\n    }\n\n    // Load existing config and lock\n    const config = FileManager.loadPromptsConfig();\n    const lock = FileManager.loadPromptsLock();\n\n    // Check if prompt exists in dependencies\n    if (!config.prompts[name]) {\n      console.error(chalk.red(`Error: Prompt \"${name}\" not found in dependencies`));\n      console.log(chalk.gray(`Available prompts: ${Object.keys(config.prompts).join(', ') || 'none'}`));\n      process.exit(1);\n    }\n\n    const dependency = config.prompts[name];\n    const isLocalPrompt = (typeof dependency === \"string\" && dependency.startsWith(\"file:\")) ||\n                         (typeof dependency === \"object\" && dependency.file);\n\n    const spinner = ora(`Removing ${chalk.cyan(name)}...`).start();\n\n    try {\n      // Handle local prompts\n      if (isLocalPrompt) {\n        let localFilePath: string;\n\n        if (typeof dependency === \"string\" && dependency.startsWith(\"file:\")) {\n          localFilePath = path.resolve(dependency.slice(5)); // Remove \"file:\" prefix\n        } else if (typeof dependency === \"object\" && dependency.file) {\n          localFilePath = path.resolve(dependency.file);\n        } else {\n          // Fallback: assume it's in the prompts directory\n          localFilePath = path.join(FileManager.getPromptsDir(), `${name}.prompt.yaml`);\n        }\n\n        // Delete the local file if it exists\n        if (fs.existsSync(localFilePath)) {\n          fs.unlinkSync(localFilePath);\n          const relativePath = path.relative(process.cwd(), localFilePath);\n          spinner.succeed();\n          console.log(chalk.green(`✓ Removed local file ${chalk.gray(relativePath)}`));\n        } else {\n          spinner.succeed();\n          console.log(chalk.yellow(`⚠ Local file not found (already deleted?)`));\n        }\n\n        console.log(chalk.yellow(`⚠ Note: This prompt may still exist on the server. Visit LangWatch to fully delete it.`));\n      }\n\n      // Remove materialized file if it exists\n      const lockEntry = lock.prompts[name];\n      if (lockEntry?.materialized) {\n        const materializedPath = path.resolve(lockEntry.materialized);\n        if (fs.existsSync(materializedPath)) {\n          fs.unlinkSync(materializedPath);\n\n          // Clean up empty directories\n          const materializedDir = path.dirname(materializedPath);\n          const rootMaterializedDir = FileManager.getMaterializedDir();\n\n          let currentDir = materializedDir;\n          while (currentDir !== rootMaterializedDir && currentDir !== path.dirname(currentDir)) {\n            try {\n              const entries = fs.readdirSync(currentDir);\n              if (entries.length === 0) {\n                fs.rmdirSync(currentDir);\n                currentDir = path.dirname(currentDir);\n              } else {\n                break;\n              }\n            } catch {\n              break;\n            }\n          }\n        }\n      }\n\n      // Remove from config and lock\n      delete config.prompts[name];\n      delete lock.prompts[name];\n\n      // Save updated files\n      FileManager.savePromptsConfig(config);\n      FileManager.savePromptsLock(lock);\n\n      if (!isLocalPrompt) {\n        spinner.succeed();\n        console.log(chalk.green(`✓ Removed ${chalk.cyan(name)} from dependencies`));\n      }\n\n    } catch (error) {\n      failSpinner({ spinner, error, action: \"remove prompt\" });\n      process.exit(1);\n    }\n\n  } catch (error) {\n    if (error instanceof PromptsError) {\n      console.error(chalk.red(`Error: ${error.message}`));\n    } else {\n      console.error(chalk.red(`Unexpected error: ${formatApiErrorMessage({ error })}`));\n    }\n    process.exit(1);\n  }\n};\n"],"mappings":"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","names":[]}