mirror of
http://10.0.2.1:3031/sauer/claude-code.git
synced 2026-06-30 17:56:58 +10:00
161 lines
16 KiB
TypeScript
161 lines
16 KiB
TypeScript
|
|
import { c as _c } from "react/compiler-runtime";
|
||
|
|
import { basename, relative } from 'path';
|
||
|
|
import React, { useMemo } from 'react';
|
||
|
|
import type { z } from 'zod/v4';
|
||
|
|
import { Text } from '../../../ink.js';
|
||
|
|
import { FileWriteTool } from '../../../tools/FileWriteTool/FileWriteTool.js';
|
||
|
|
import { getCwd } from '../../../utils/cwd.js';
|
||
|
|
import { isENOENT } from '../../../utils/errors.js';
|
||
|
|
import { readFileSync } from '../../../utils/fileRead.js';
|
||
|
|
import { FilePermissionDialog } from '../FilePermissionDialog/FilePermissionDialog.js';
|
||
|
|
import { createSingleEditDiffConfig, type FileEdit, type IDEDiffSupport } from '../FilePermissionDialog/ideDiffConfig.js';
|
||
|
|
import type { PermissionRequestProps } from '../PermissionRequest.js';
|
||
|
|
import { FileWriteToolDiff } from './FileWriteToolDiff.js';
|
||
|
|
type FileWriteToolInput = z.infer<typeof FileWriteTool.inputSchema>;
|
||
|
|
const ideDiffSupport: IDEDiffSupport<FileWriteToolInput> = {
|
||
|
|
getConfig: (input: FileWriteToolInput) => {
|
||
|
|
let oldContent: string;
|
||
|
|
try {
|
||
|
|
oldContent = readFileSync(input.file_path);
|
||
|
|
} catch (e) {
|
||
|
|
if (!isENOENT(e)) throw e;
|
||
|
|
oldContent = '';
|
||
|
|
}
|
||
|
|
return createSingleEditDiffConfig(input.file_path, oldContent, input.content, false // For file writes, we replace the entire content
|
||
|
|
);
|
||
|
|
},
|
||
|
|
applyChanges: (input: FileWriteToolInput, modifiedEdits: FileEdit[]) => {
|
||
|
|
const firstEdit = modifiedEdits[0];
|
||
|
|
if (firstEdit) {
|
||
|
|
return {
|
||
|
|
...input,
|
||
|
|
content: firstEdit.new_string
|
||
|
|
};
|
||
|
|
}
|
||
|
|
return input;
|
||
|
|
}
|
||
|
|
};
|
||
|
|
export function FileWritePermissionRequest(props) {
|
||
|
|
const $ = _c(30);
|
||
|
|
const parseInput = _temp;
|
||
|
|
let t0;
|
||
|
|
if ($[0] !== props.toolUseConfirm.input) {
|
||
|
|
t0 = parseInput(props.toolUseConfirm.input);
|
||
|
|
$[0] = props.toolUseConfirm.input;
|
||
|
|
$[1] = t0;
|
||
|
|
} else {
|
||
|
|
t0 = $[1];
|
||
|
|
}
|
||
|
|
const parsed = t0;
|
||
|
|
const {
|
||
|
|
file_path,
|
||
|
|
content
|
||
|
|
} = parsed;
|
||
|
|
let t1;
|
||
|
|
if ($[2] !== file_path) {
|
||
|
|
;
|
||
|
|
try {
|
||
|
|
t1 = {
|
||
|
|
fileExists: true,
|
||
|
|
oldContent: readFileSync(file_path)
|
||
|
|
};
|
||
|
|
} catch (t2) {
|
||
|
|
const e = t2;
|
||
|
|
if (!isENOENT(e)) {
|
||
|
|
throw e;
|
||
|
|
}
|
||
|
|
let t3;
|
||
|
|
if ($[4] === Symbol.for("react.memo_cache_sentinel")) {
|
||
|
|
t3 = {
|
||
|
|
fileExists: false,
|
||
|
|
oldContent: ""
|
||
|
|
};
|
||
|
|
$[4] = t3;
|
||
|
|
} else {
|
||
|
|
t3 = $[4];
|
||
|
|
}
|
||
|
|
t1 = t3;
|
||
|
|
}
|
||
|
|
$[2] = file_path;
|
||
|
|
$[3] = t1;
|
||
|
|
} else {
|
||
|
|
t1 = $[3];
|
||
|
|
}
|
||
|
|
const {
|
||
|
|
fileExists,
|
||
|
|
oldContent
|
||
|
|
} = t1;
|
||
|
|
const actionText = fileExists ? "overwrite" : "create";
|
||
|
|
const t2 = props.toolUseConfirm;
|
||
|
|
const t3 = props.toolUseContext;
|
||
|
|
const t4 = props.onDone;
|
||
|
|
const t5 = props.onReject;
|
||
|
|
const t6 = props.workerBadge;
|
||
|
|
const t7 = fileExists ? "Overwrite file" : "Create file";
|
||
|
|
let t8;
|
||
|
|
if ($[5] !== file_path) {
|
||
|
|
t8 = relative(getCwd(), file_path);
|
||
|
|
$[5] = file_path;
|
||
|
|
$[6] = t8;
|
||
|
|
} else {
|
||
|
|
t8 = $[6];
|
||
|
|
}
|
||
|
|
let t9;
|
||
|
|
if ($[7] !== file_path) {
|
||
|
|
t9 = basename(file_path);
|
||
|
|
$[7] = file_path;
|
||
|
|
$[8] = t9;
|
||
|
|
} else {
|
||
|
|
t9 = $[8];
|
||
|
|
}
|
||
|
|
let t10;
|
||
|
|
if ($[9] !== t9) {
|
||
|
|
t10 = <Text bold={true}>{t9}</Text>;
|
||
|
|
$[9] = t9;
|
||
|
|
$[10] = t10;
|
||
|
|
} else {
|
||
|
|
t10 = $[10];
|
||
|
|
}
|
||
|
|
let t11;
|
||
|
|
if ($[11] !== actionText || $[12] !== t10) {
|
||
|
|
t11 = <Text>Do you want to {actionText} {t10}?</Text>;
|
||
|
|
$[11] = actionText;
|
||
|
|
$[12] = t10;
|
||
|
|
$[13] = t11;
|
||
|
|
} else {
|
||
|
|
t11 = $[13];
|
||
|
|
}
|
||
|
|
let t12;
|
||
|
|
if ($[14] !== content || $[15] !== fileExists || $[16] !== file_path || $[17] !== oldContent) {
|
||
|
|
t12 = <FileWriteToolDiff file_path={file_path} content={content} fileExists={fileExists} oldContent={oldContent} />;
|
||
|
|
$[14] = content;
|
||
|
|
$[15] = fileExists;
|
||
|
|
$[16] = file_path;
|
||
|
|
$[17] = oldContent;
|
||
|
|
$[18] = t12;
|
||
|
|
} else {
|
||
|
|
t12 = $[18];
|
||
|
|
}
|
||
|
|
let t13;
|
||
|
|
if ($[19] !== file_path || $[20] !== props.onDone || $[21] !== props.onReject || $[22] !== props.toolUseConfirm || $[23] !== props.toolUseContext || $[24] !== props.workerBadge || $[25] !== t11 || $[26] !== t12 || $[27] !== t7 || $[28] !== t8) {
|
||
|
|
t13 = <FilePermissionDialog toolUseConfirm={t2} toolUseContext={t3} onDone={t4} onReject={t5} workerBadge={t6} title={t7} subtitle={t8} question={t11} content={t12} path={file_path} completionType="write_file_single" parseInput={parseInput} ideDiffSupport={ideDiffSupport} />;
|
||
|
|
$[19] = file_path;
|
||
|
|
$[20] = props.onDone;
|
||
|
|
$[21] = props.onReject;
|
||
|
|
$[22] = props.toolUseConfirm;
|
||
|
|
$[23] = props.toolUseContext;
|
||
|
|
$[24] = props.workerBadge;
|
||
|
|
$[25] = t11;
|
||
|
|
$[26] = t12;
|
||
|
|
$[27] = t7;
|
||
|
|
$[28] = t8;
|
||
|
|
$[29] = t13;
|
||
|
|
} else {
|
||
|
|
t13 = $[29];
|
||
|
|
}
|
||
|
|
return t13;
|
||
|
|
}
|
||
|
|
function _temp(input) {
|
||
|
|
return FileWriteTool.inputSchema.parse(input);
|
||
|
|
}
|
||
|
|
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJiYXNlbmFtZSIsInJlbGF0aXZlIiwiUmVhY3QiLCJ1c2VNZW1vIiwieiIsIlRleHQiLCJGaWxlV3JpdGVUb29sIiwiZ2V0Q3dkIiwiaXNFTk9FTlQiLCJyZWFkRmlsZVN5bmMiLCJGaWxlUGVybWlzc2lvbkRpYWxvZyIsImNyZWF0ZVNpbmdsZUVkaXREaWZmQ29uZmlnIiwiRmlsZUVkaXQiLCJJREVEaWZmU3VwcG9ydCIsIlBlcm1pc3Npb25SZXF1ZXN0UHJvcHMiLCJGaWxlV3JpdGVUb29sRGlmZiIsIkZpbGVXcml0ZVRvb2xJbnB1dCIsImluZmVyIiwiaW5wdXRTY2hlbWEiLCJpZGVEaWZmU3VwcG9ydCIsImdldENvbmZpZyIsImlucHV0Iiwib2xkQ29udGVudCIsImZpbGVfcGF0aCIsImUiLCJjb250ZW50IiwiYXBwbHlDaGFuZ2VzIiwibW9kaWZpZWRFZGl0cyIsImZpcnN0RWRpdCIsIm5ld19zdHJpbmciLCJGaWxlV3JpdGVQZXJtaXNzaW9uUmVxdWVzdCIsInByb3BzIiwiJCIsIl9jIiwicGFyc2VJbnB1dCIsIl90ZW1wIiwidDAiLCJ0b29sVXNlQ29uZmlybSIsInBhcnNlZCIsInQxIiwiZmlsZUV4aXN0cyIsInQyIiwidDMiLCJTeW1ib2wiLCJmb3IiLCJhY3Rpb25UZXh0IiwidG9vbFVzZUNvbnRleHQiLCJ0NCIsIm9uRG9uZSIsInQ1Iiwib25SZWplY3QiLCJ0NiIsIndvcmtlckJhZGdlIiwidDciLCJ0OCIsInQ5IiwidDEwIiwidDExIiwidDEyIiwidDEzIiwicGFyc2UiXSwic291cmNlcyI6WyJGaWxlV3JpdGVQZXJtaXNzaW9uUmVxdWVzdC50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYmFzZW5hbWUsIHJlbGF0aXZlIH0gZnJvbSAncGF0aCdcbmltcG9ydCBSZWFjdCwgeyB1c2VNZW1vIH0gZnJvbSAncmVhY3QnXG5pbXBvcnQgdHlwZSB7IHogfSBmcm9tICd6b2QvdjQnXG5pbXBvcnQgeyBUZXh0IH0gZnJvbSAnLi4vLi4vLi4vaW5rLmpzJ1xuaW1wb3J0IHsgRmlsZVdyaXRlVG9vbCB9IGZyb20gJy4uLy4uLy4uL3Rvb2xzL0ZpbGVXcml0ZVRvb2wvRmlsZVdyaXRlVG9vbC5qcydcbmltcG9ydCB7IGdldEN3ZCB9IGZyb20gJy4uLy4uLy4uL3V0aWxzL2N3ZC5qcydcbmltcG9ydCB7IGlzRU5PRU5UIH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvZXJyb3JzLmpzJ1xuaW1wb3J0IHsgcmVhZEZpbGVTeW5jIH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvZmlsZVJlYWQuanMnXG5pbXBvcnQgeyBGaWxlUGVybWlzc2lvbkRpYWxvZyB9IGZyb20gJy4uL0ZpbGVQZXJtaXNzaW9uRGlhbG9nL0ZpbGVQZXJtaXNzaW9uRGlhbG9nLmpzJ1xuaW1wb3J0IHtcbiAgY3JlYXRlU2luZ2xlRWRpdERpZmZDb25maWcsXG4gIHR5cGUgRmlsZUVkaXQsXG4gIHR5cGUgSURFRGlmZlN1cHBvcnQsXG59IGZyb20gJy4uL0ZpbGVQZXJtaXNzaW9uRGlhbG9nL2lkZURpZmZDb25maWcuanMnXG5pbXBvcnQgdHlwZSB7IFBlcm1pc3Npb25SZXF1ZXN0UHJvcHMgfSBmcm9tICcuLi9QZXJtaXNzaW9uUmVxdWVzdC5qcydcbmltcG9ydCB7IEZpbGVXcml0ZVRvb2xEaWZmIH0gZnJvbSAnLi9GaWxlV3JpdGVUb29sRGlmZi5qcydcblxudHlwZSBGaWxlV3JpdGVUb29sSW5wdXQgPSB6LmluZmVyPHR5cGVvZiBGaWxlV3JpdGVUb29sLmlucHV0U2NoZW1hPlxuXG5jb25zdCBpZGVEaWZmU3VwcG9ydDogSURFRGlmZlN1cHBvcnQ8RmlsZVdyaXRlVG9vbElucHV0PiA9IHtcbiAgZ2V0Q29uZmlnOiAoaW5wdXQ6IEZpbGVXcml0ZVRvb2xJbnB1dCkgPT4ge1xuICAgIGxldCBvbGRDb250ZW50OiBzdHJpbmdcbiAgICB0cnkge1xuICAgICAgb2xkQ29udGVudCA9IHJlYWRGaWxlU3luYyhpbnB1dC5maWxlX3BhdGgpXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKCFpc0VOT0VOVChlKSkgdGhyb3cgZVxuICAgICAgb2xkQ29udGVudCA9ICcnXG4gICAgfVxuXG4gICAgcmV0dXJuIGNyZWF0ZVNpbmdsZUVkaXREaWZmQ29uZmlnKFxuICAgICAgaW5wdXQuZmlsZV9wYXRoLFxuICAgICAgb2xkQ29udGVudCxcbiAgICAgIGlucHV0LmNvbnRlbnQsXG4gICAgICBmYWxzZSwgLy8gRm9yIGZpbGUgd3JpdGVzLCB3ZSByZXBsYWNlIHRoZSBlbnRpcmUgY29udGVudFxuICAgIClcbiAgfSxcbiAgYXBwbHlDaGFuZ2VzOiAoaW5wdXQ6IEZpbGVXcml0ZVRvb2xJbnB1dCwgbW9kaWZpZWRFZGl0czogRmlsZUVkaXRbXSkgPT4ge1xuICAgIGNvbnN0IGZpcnN0RWRpdCA9IG1vZGlmaWVkRWRpdHNbMF1cbiAgICBpZiAoZmlyc3RFZGl0KSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5pbnB1dCxcbiAgICAgICAgY29udGVudDogZmlyc3RFZGl0Lm5ld19zdHJpbmcsXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBpbnB1dFxuICB9LFxufVxuXG5leHBvcnQgZnVuY3Rpb24gRmlsZVdyaXRlUGVybWlzc2lvblJlcXVlc3QoXG4gIHByb3BzOiBQZXJtaXNzaW9uUmVxdWVzdFByb3BzLFxuKTogUmVhY3QuUmVhY3ROb2RlIHtcbiAgY29uc3QgcGFyc2VJbnB1dCA9IChpbnB1dDogdW5rbm93bik6IEZpbGVXcml0ZVRvb2xJbnB1dCA9PiB7XG4gICAgcmV0dXJuIEZpbGVXcml0ZVRvb2wuaW5wdXRTY2hlbWEucGFyc2UoaW5wdXQpXG4gIH1cblxuICBjb25zdCBwYXJzZWQgPSBwYXJzZUlucHV0KHByb3BzLnRvb2xVc2VDb25maXJtLmlucHV0KVxuICBjb25zdCB7IGZpbGVfcGF0aCwgY29udGVudCB9ID0gcGFyc2VkXG5cbiAgLy8gU2luZ2xlIHJlYWQgZHJpdmVzIGJvdGggVUkgdGV4dCAoXCJDcmVhdGVcIiB2cyBcIk92ZXJ3cml0ZVwiKSBhbmQgdGhlIGRpZmZcbiAgLy8gc2hvd24gYnkgRmlsZVdyaXRlVG9vbERpZmYg4oCUIGF2b2lkcyBhIHJlZHVuZGFudCBleGlzdHNTeW5jIHN0YXQgdGhhdCB3b3VsZFxuICAvLyBibG9jayBmaXJzdC1tb3VudCBjb21taXQgb24gc2xvdy9uZXR3b3JrZWQgZmlsZXN5c3RlbXMuXG4gIGNvbnN0IHsgZmlsZUV4aXN0cywgb2xkQ29udGVudCB9ID0gdXNlTWVtbygoKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB7IGZpbGVFeGlzdHM6IHRydWUsIG9sZENvbnRlbnQ6IHJlYWRGaWxlU3luYyhmaWxlX3BhdGgpIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoIWlzRU5PRU5
|