claude-code/components/permissions/SedEditPermissionRequest/SedEditPermissionRequest.tsx

230 lines
20 KiB
TypeScript
Raw Permalink Normal View History

import { c as _c } from "react/compiler-runtime";
import { basename, relative } from 'path';
import React, { Suspense, use, useMemo } from 'react';
import { FileEditToolDiff } from 'src/components/FileEditToolDiff.js';
import { getCwd } from 'src/utils/cwd.js';
import { isENOENT } from 'src/utils/errors.js';
import { detectEncodingForResolvedPath } from 'src/utils/fileRead.js';
import { getFsImplementation } from 'src/utils/fsOperations.js';
import { Text } from '../../../ink.js';
import { BashTool } from '../../../tools/BashTool/BashTool.js';
import { applySedSubstitution, type SedEditInfo } from '../../../tools/BashTool/sedEditParser.js';
import { FilePermissionDialog } from '../FilePermissionDialog/FilePermissionDialog.js';
import type { PermissionRequestProps } from '../PermissionRequest.js';
type SedEditPermissionRequestProps = PermissionRequestProps & {
sedInfo: SedEditInfo;
};
type FileReadResult = {
oldContent: string;
fileExists: boolean;
};
export function SedEditPermissionRequest(t0) {
const $ = _c(9);
let props;
let sedInfo;
if ($[0] !== t0) {
({
sedInfo,
...props
} = t0);
$[0] = t0;
$[1] = props;
$[2] = sedInfo;
} else {
props = $[1];
sedInfo = $[2];
}
const {
filePath
} = sedInfo;
let t1;
if ($[3] !== filePath) {
t1 = (async () => {
const encoding = detectEncodingForResolvedPath(filePath);
const raw = await getFsImplementation().readFile(filePath, {
encoding
});
return {
oldContent: raw.replaceAll("\r\n", "\n"),
fileExists: true
};
})().catch(_temp);
$[3] = filePath;
$[4] = t1;
} else {
t1 = $[4];
}
const contentPromise = t1;
let t2;
if ($[5] !== contentPromise || $[6] !== props || $[7] !== sedInfo) {
t2 = <Suspense fallback={null}><SedEditPermissionRequestInner sedInfo={sedInfo} contentPromise={contentPromise} {...props} /></Suspense>;
$[5] = contentPromise;
$[6] = props;
$[7] = sedInfo;
$[8] = t2;
} else {
t2 = $[8];
}
return t2;
}
function _temp(e) {
if (!isENOENT(e)) {
throw e;
}
return {
oldContent: "",
fileExists: false
};
}
function SedEditPermissionRequestInner(t0) {
const $ = _c(35);
let contentPromise;
let props;
let sedInfo;
if ($[0] !== t0) {
({
sedInfo,
contentPromise,
...props
} = t0);
$[0] = t0;
$[1] = contentPromise;
$[2] = props;
$[3] = sedInfo;
} else {
contentPromise = $[1];
props = $[2];
sedInfo = $[3];
}
const {
filePath
} = sedInfo;
const {
oldContent,
fileExists
} = use(contentPromise);
let t1;
if ($[4] !== oldContent || $[5] !== sedInfo) {
t1 = applySedSubstitution(oldContent, sedInfo);
$[4] = oldContent;
$[5] = sedInfo;
$[6] = t1;
} else {
t1 = $[6];
}
const newContent = t1;
let t2;
bb0: {
if (oldContent === newContent) {
let t3;
if ($[7] === Symbol.for("react.memo_cache_sentinel")) {
t3 = [];
$[7] = t3;
} else {
t3 = $[7];
}
t2 = t3;
break bb0;
}
let t3;
if ($[8] !== newContent || $[9] !== oldContent) {
t3 = [{
old_string: oldContent,
new_string: newContent,
replace_all: false
}];
$[8] = newContent;
$[9] = oldContent;
$[10] = t3;
} else {
t3 = $[10];
}
t2 = t3;
}
const edits = t2;
let t3;
bb1: {
if (!fileExists) {
t3 = "File does not exist";
break bb1;
}
t3 = "Pattern did not match any content";
}
const noChangesMessage = t3;
let t4;
if ($[11] !== filePath || $[12] !== newContent) {
t4 = input => {
const parsed = BashTool.inputSchema.parse(input);
return {
...parsed,
_simulatedSedEdit: {
filePath,
newContent
}
};
};
$[11] = filePath;
$[12] = newContent;
$[13] = t4;
} else {
t4 = $[13];
}
const parseInput = t4;
const t5 = props.toolUseConfirm;
const t6 = props.toolUseContext;
const t7 = props.onDone;
const t8 = props.onReject;
let t9;
if ($[14] !== filePath) {
t9 = relative(getCwd(), filePath);
$[14] = filePath;
$[15] = t9;
} else {
t9 = $[15];
}
let t10;
if ($[16] !== filePath) {
t10 = basename(filePath);
$[16] = filePath;
$[17] = t10;
} else {
t10 = $[17];
}
let t11;
if ($[18] !== t10) {
t11 = <Text>Do you want to make this edit to{" "}<Text bold={true}>{t10}</Text>?</Text>;
$[18] = t10;
$[19] = t11;
} else {
t11 = $[19];
}
let t12;
if ($[20] !== edits || $[21] !== filePath || $[22] !== noChangesMessage) {
t12 = edits.length > 0 ? <FileEditToolDiff file_path={filePath} edits={edits} /> : <Text dimColor={true}>{noChangesMessage}</Text>;
$[20] = edits;
$[21] = filePath;
$[22] = noChangesMessage;
$[23] = t12;
} else {
t12 = $[23];
}
let t13;
if ($[24] !== filePath || $[25] !== parseInput || $[26] !== props.onDone || $[27] !== props.onReject || $[28] !== props.toolUseConfirm || $[29] !== props.toolUseContext || $[30] !== props.workerBadge || $[31] !== t11 || $[32] !== t12 || $[33] !== t9) {
t13 = <FilePermissionDialog toolUseConfirm={t5} toolUseContext={t6} onDone={t7} onReject={t8} title="Edit file" subtitle={t9} question={t11} content={t12} path={filePath} completionType="str_replace_single" parseInput={parseInput} workerBadge={props.workerBadge} />;
$[24] = filePath;
$[25] = parseInput;
$[26] = props.onDone;
$[27] = props.onReject;
$[28] = props.toolUseConfirm;
$[29] = props.toolUseContext;
$[30] = props.workerBadge;
$[31] = t11;
$[32] = t12;
$[33] = t9;
$[34] = t13;
} else {
t13 = $[34];
}
return t13;
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJiYXNlbmFtZSIsInJlbGF0aXZlIiwiUmVhY3QiLCJTdXNwZW5zZSIsInVzZSIsInVzZU1lbW8iLCJGaWxlRWRpdFRvb2xEaWZmIiwiZ2V0Q3dkIiwiaXNFTk9FTlQiLCJkZXRlY3RFbmNvZGluZ0ZvclJlc29sdmVkUGF0aCIsImdldEZzSW1wbGVtZW50YXRpb24iLCJUZXh0IiwiQmFzaFRvb2wiLCJhcHBseVNlZFN1YnN0aXR1dGlvbiIsIlNlZEVkaXRJbmZvIiwiRmlsZVBlcm1pc3Npb25EaWFsb2ciLCJQZXJtaXNzaW9uUmVxdWVzdFByb3BzIiwiU2VkRWRpdFBlcm1pc3Npb25SZXF1ZXN0UHJvcHMiLCJzZWRJbmZvIiwiRmlsZVJlYWRSZXN1bHQiLCJvbGRDb250ZW50IiwiZmlsZUV4aXN0cyIsIlNlZEVkaXRQZXJtaXNzaW9uUmVxdWVzdCIsInQwIiwiJCIsIl9jIiwicHJvcHMiLCJmaWxlUGF0aCIsInQxIiwiZW5jb2RpbmciLCJyYXciLCJyZWFkRmlsZSIsInJlcGxhY2VBbGwiLCJjYXRjaCIsIl90ZW1wIiwiY29udGVudFByb21pc2UiLCJ0MiIsImUiLCJTZWRFZGl0UGVybWlzc2lvblJlcXVlc3RJbm5lciIsIm5ld0NvbnRlbnQiLCJiYjAiLCJ0MyIsIlN5bWJvbCIsImZvciIsIm9sZF9zdHJpbmciLCJuZXdfc3RyaW5nIiwicmVwbGFjZV9hbGwiLCJlZGl0cyIsImJiMSIsIm5vQ2hhbmdlc01lc3NhZ2UiLCJ0NCIsImlucHV0IiwicGFyc2VkIiwiaW5wdXRTY2hlbWEiLCJwYXJzZSIsIl9zaW11bGF0ZWRTZWRFZGl0IiwicGFyc2VJbnB1dCIsInQ1IiwidG9vbFVzZUNvbmZpcm0iLCJ0NiIsInRvb2xVc2VDb250ZXh0IiwidDciLCJvbkRvbmUiLCJ0OCIsIm9uUmVqZWN0IiwidDkiLCJ0MTAiLCJ0MTEiLCJ0MTIiLCJsZW5ndGgiLCJ0MTMiLCJ3b3JrZXJCYWRnZSJdLCJzb3VyY2VzIjpbIlNlZEVkaXRQZXJtaXNzaW9uUmVxdWVzdC50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYmFzZW5hbWUsIHJlbGF0aXZlIH0gZnJvbSAncGF0aCdcbmltcG9ydCBSZWFjdCwgeyBTdXNwZW5zZSwgdXNlLCB1c2VNZW1vIH0gZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBGaWxlRWRpdFRvb2xEaWZmIH0gZnJvbSAnc3JjL2NvbXBvbmVudHMvRmlsZUVkaXRUb29sRGlmZi5qcydcbmltcG9ydCB7IGdldEN3ZCB9IGZyb20gJ3NyYy91dGlscy9jd2QuanMnXG5pbXBvcnQgeyBpc0VOT0VOVCB9IGZyb20gJ3NyYy91dGlscy9lcnJvcnMuanMnXG5pbXBvcnQgeyBkZXRlY3RFbmNvZGluZ0ZvclJlc29sdmVkUGF0aCB9IGZyb20gJ3NyYy91dGlscy9maWxlUmVhZC5qcydcbmltcG9ydCB7IGdldEZzSW1wbGVtZW50YXRpb24gfSBmcm9tICdzcmMvdXRpbHMvZnNPcGVyYXRpb25zLmpzJ1xuaW1wb3J0IHsgVGV4dCB9IGZyb20gJy4uLy4uLy4uL2luay5qcydcbmltcG9ydCB7IEJhc2hUb29sIH0gZnJvbSAnLi4vLi4vLi4vdG9vbHMvQmFzaFRvb2wvQmFzaFRvb2wuanMnXG5pbXBvcnQge1xuICBhcHBseVNlZFN1YnN0aXR1dGlvbixcbiAgdHlwZSBTZWRFZGl0SW5mbyxcbn0gZnJvbSAnLi4vLi4vLi4vdG9vbHMvQmFzaFRvb2wvc2VkRWRpdFBhcnNlci5qcydcbmltcG9ydCB7IEZpbGVQZXJtaXNzaW9uRGlhbG9nIH0gZnJvbSAnLi4vRmlsZVBlcm1pc3Npb25EaWFsb2cvRmlsZVBlcm1pc3Npb25EaWFsb2cuanMnXG5pbXBvcnQgdHlwZSB7IFBlcm1pc3Npb25SZXF1ZXN0UHJvcHMgfSBmcm9tICcuLi9QZXJtaXNzaW9uUmVxdWVzdC5qcydcblxudHlwZSBTZWRFZGl0UGVybWlzc2lvblJlcXVlc3RQcm9wcyA9IFBlcm1pc3Npb25SZXF1ZXN0UHJvcHMgJiB7XG4gIHNlZEluZm86IFNlZEVkaXRJbmZvXG59XG5cbnR5cGUgRmlsZVJlYWRSZXN1bHQgPSB7IG9sZENvbnRlbnQ6IHN0cmluZzsgZmlsZUV4aXN0czogYm9vbGVhbiB9XG5cbmV4cG9ydCBmdW5jdGlvbiBTZWRFZGl0UGVybWlzc2lvblJlcXVlc3Qoe1xuICBzZWRJbmZvLFxuICAuLi5wcm9wc1xufTogU2VkRWRpdFBlcm1pc3Npb25SZXF1ZXN0UHJvcHMpOiBSZWFjdC5SZWFjdE5vZGUge1xuICBjb25zdCB7IGZpbGVQYXRoIH0gPSBzZWRJbmZvXG5cbiAgLy8gUmVhZCBmaWxlIGNvbnRlbnQgYXN5bmMgc28gbW91bnQgZG9lc24ndCBibG9jayBSZWFjdCBjb21taXQgb24gZGlzayBJL08uXG4gIC8vIExhcmdlIGZpbGVzIHdvdWxkIG90aGVyd2lzZSBoYW5nIHRoZSBkaWFsb2cgYmVmb3JlIGl0IHJlbmRlcnMuXG4gIC8vIE1lbW9pemVkIG9uIGZpbGVQYXRoIHNvIHdlIGRvbid0IHJlLXJlYWQgb24gZXZlcnkgcmVuZGVyLlxuICBjb25zdCBjb250ZW50UHJvbWlzZSA9IHVzZU1lbW8oXG4gICAgKCkgPT5cbiAgICAgIChhc3luYyAoKTogUHJvbWlzZTxGaWxlUmVhZFJlc3VsdD4gPT4ge1xuICAgICAgICAvLyBEZXRlY3QgZW5jb2RpbmcgZmlyc3QgKHN5bmMgNEtCIHJlYWQg4oCUIG5lZ2xpZ2libGUpIHNvIFVURi0xNkxFIEJPTXNcbiAgICAgICAgLy8gcmVuZGVyIGNvcnJlY3RseS4gVGhpcyBtYXRjaGVzIHdoYXQgcmVhZEZpbGVTeW5jIGRpZCBiZWZvcmUgdGhlXG4gICAgICAgIC8vIGFzeW5jIGNvbnZlcnNpb24uXG4gICAgICAgIGNvbnN0IGVuY29kaW5nID0gZGV0ZWN0RW5jb2RpbmdGb3JSZXNvbHZlZFBhdGgoZmlsZVBhdGgpXG4gICAgICAgIGNvbnN0IHJhdyA9IGF3YWl0IGdldEZzSW1wbGVtZW50YXRpb24oKS5yZWFkRmlsZShmaWxlUGF0aCwgeyBlbmNvZGluZyB9KVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG9sZENvbnRlbnQ6IHJhdy5yZXBsYWNlQWxsKCdcXHJcXG4nLCAnXFxuJyksXG4gICAgICAgICAgZmlsZUV4aXN0czogdHJ1ZSxcbiAgICAgICAgfVxuICAgICAgfSkoKS5jYXRjaCgoZTogdW5rbm93bik6IEZpbGVSZWFkUmVzdWx0ID0+IHtcbiAgICAgICAgaWYgKCFpc0VOT0VOVChlKSkgdGhyb3cgZVxuICAgICAgICByZXR1cm4geyBvbGRDb250ZW50OiAnJywgZmlsZUV4aXN0czogZmFsc2UgfVxuICAgICAgfSksXG4gICAgW2ZpbGVQYXRoXSxcbiAgKVxuXG4gIHJldHVybiAoXG4gICAgPFN1c3BlbnNlIGZhbGxiYWNrPXtudWxsfT5cbiAgICAgIDxTZWRFZGl0UGVybWlzc2lvblJlcXVlc3RJbm5lclxuICAgICA