editcodewithai
Version:
Edit Code With AI
92 lines (91 loc) • 4.91 kB
JavaScript
;
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.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; } });
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 preparedFiles = (0, fileUtils_1.prepareFilesForPrompt)(files);
const filesContext = (0, llm_code_format_1.formatMarkdownFiles)(preparedFiles);
// 2. Assemble the final prompt
const fullPrompt = (0, prompt_1.assembleFullPrompt)({ filesContext, prompt, editFormat });
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
};
}