UNPKG

editcodewithai

Version:
98 lines (97 loc) 5.14 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.PROMPT_TEMPLATE_VERSION = exports.getGenerationMetadata = exports.assembleFullPrompt = exports.applyUdiffs = exports.parseUdiffs = exports.parseDiffFenced = exports.applyDiffs = exports.parseDiffs = exports.isImageFile = exports.prepareFilesForPrompt = exports.mergeFileChanges = exports.FORMAT_INSTRUCTIONS = void 0; exports.performAiEdit = performAiEdit; const llm_code_format_1 = require("llm-code-format"); const prompt_1 = require("./prompt"); Object.defineProperty(exports, "PROMPT_TEMPLATE_VERSION", { enumerable: true, get: function () { return prompt_1.PROMPT_TEMPLATE_VERSION; } }); Object.defineProperty(exports, "assembleFullPrompt", { enumerable: true, get: function () { return prompt_1.assembleFullPrompt; } }); Object.defineProperty(exports, "FORMAT_INSTRUCTIONS", { enumerable: true, get: function () { return prompt_1.FORMAT_INSTRUCTIONS; } }); const metadata_1 = require("./metadata"); Object.defineProperty(exports, "getGenerationMetadata", { enumerable: true, get: function () { return metadata_1.getGenerationMetadata; } }); const fileUtils_1 = require("./fileUtils"); Object.defineProperty(exports, "prepareFilesForPrompt", { enumerable: true, get: function () { return fileUtils_1.prepareFilesForPrompt; } }); Object.defineProperty(exports, "mergeFileChanges", { enumerable: true, get: function () { return fileUtils_1.mergeFileChanges; } }); Object.defineProperty(exports, "parseDiffs", { enumerable: true, get: function () { return fileUtils_1.parseDiffs; } }); Object.defineProperty(exports, "applyDiffs", { enumerable: true, get: function () { return fileUtils_1.applyDiffs; } }); Object.defineProperty(exports, "parseDiffFenced", { enumerable: true, get: function () { return fileUtils_1.parseDiffFenced; } }); Object.defineProperty(exports, "parseUdiffs", { enumerable: true, get: function () { return fileUtils_1.parseUdiffs; } }); Object.defineProperty(exports, "applyUdiffs", { enumerable: true, get: function () { return fileUtils_1.applyUdiffs; } }); Object.defineProperty(exports, "isImageFile", { enumerable: true, get: function () { return fileUtils_1.isImageFile; } }); const debug = false; /** * Core AI logic for: * - Building the prompt (including context) * - Calling the provided LLM function * - Parsing and merging file changes * - Retrieving cost metadata */ async function performAiEdit({ prompt, files, llmFunction, apiKey, editFormat = "whole", }) { // 1. Format the existing files into the "markdown code block" format const preparedResult = (0, fileUtils_1.prepareFilesForPrompt)(files); const filesContext = (0, llm_code_format_1.formatMarkdownFiles)(preparedResult.files); // 2. Assemble the final prompt const fullPrompt = (0, prompt_1.assembleFullPrompt)({ filesContext, prompt, editFormat, imageFiles: preparedResult.imageFiles, }); debug && console.log("[performAiEdit] fullPrompt:", fullPrompt); // 3. Invoke the model via the provided LLM function const result = await llmFunction(fullPrompt); // 4. We parse the output to figure out which files changed const resultString = result.content; let changedFiles; switch (editFormat) { case "whole": { const parsed = (0, llm_code_format_1.parseMarkdownFiles)(resultString, "bold"); changedFiles = (0, fileUtils_1.mergeFileChanges)(files, parsed.files); break; } case "diff": { const diffs = (0, fileUtils_1.parseDiffs)(resultString); changedFiles = (0, fileUtils_1.applyDiffs)(files, diffs); break; } case "diff-fenced": { const diffs = (0, fileUtils_1.parseDiffFenced)(resultString); changedFiles = (0, fileUtils_1.applyDiffs)(files, diffs); break; } case "udiff": { const hunks = (0, fileUtils_1.parseUdiffs)(resultString); changedFiles = (0, fileUtils_1.applyUdiffs)(files, hunks); break; } default: // This will catch any unhandled or unknown edit formats. throw new Error(`Unknown edit format: ${editFormat}`); } // 6. Retrieve cost metadata for charging the user const openRouterGenerationId = result.generationId || ""; let upstreamCostCents = 0; let provider = ""; let inputTokens = 0; let outputTokens = 0; if (openRouterGenerationId && apiKey) { const costData = await (0, metadata_1.getGenerationMetadata)({ apiKey, generationId: openRouterGenerationId, }); upstreamCostCents = costData.upstreamCostCents; provider = costData.provider; inputTokens = costData.inputTokens; outputTokens = costData.outputTokens; } return { changedFiles, openRouterGenerationId, upstreamCostCents, provider, inputTokens, outputTokens, promptTemplateVersion: prompt_1.PROMPT_TEMPLATE_VERSION, rawResponse: resultString, // Include the raw response }; }