mirror of
http://10.0.2.1:3031/sauer/claude-code.git
synced 2026-06-30 21:46:58 +10:00
138 lines
16 KiB
TypeScript
138 lines
16 KiB
TypeScript
|
|
import { c as _c } from "react/compiler-runtime";
|
||
|
|
import figures from 'figures';
|
||
|
|
import * as React from 'react';
|
||
|
|
import { useState } from 'react';
|
||
|
|
import TextInput from '../../../components/TextInput.js';
|
||
|
|
import { useExitOnCtrlCDWithKeybindings } from '../../../hooks/useExitOnCtrlCDWithKeybindings.js';
|
||
|
|
import { useTerminalSize } from '../../../hooks/useTerminalSize.js';
|
||
|
|
import { Box, Newline, Text } from '../../../ink.js';
|
||
|
|
import { useKeybinding } from '../../../keybindings/useKeybinding.js';
|
||
|
|
import { BashTool } from '../../../tools/BashTool/BashTool.js';
|
||
|
|
import { WebFetchTool } from '../../../tools/WebFetchTool/WebFetchTool.js';
|
||
|
|
import type { PermissionBehavior, PermissionRuleValue } from '../../../utils/permissions/PermissionRule.js';
|
||
|
|
import { permissionRuleValueFromString, permissionRuleValueToString } from '../../../utils/permissions/permissionRuleParser.js';
|
||
|
|
export type PermissionRuleInputProps = {
|
||
|
|
onCancel: () => void;
|
||
|
|
onSubmit: (ruleValue: PermissionRuleValue, ruleBehavior: PermissionBehavior) => void;
|
||
|
|
ruleBehavior: PermissionBehavior;
|
||
|
|
};
|
||
|
|
export function PermissionRuleInput(t0) {
|
||
|
|
const $ = _c(24);
|
||
|
|
const {
|
||
|
|
onCancel,
|
||
|
|
onSubmit,
|
||
|
|
ruleBehavior
|
||
|
|
} = t0;
|
||
|
|
const [inputValue, setInputValue] = useState("");
|
||
|
|
const [cursorOffset, setCursorOffset] = useState(0);
|
||
|
|
const exitState = useExitOnCtrlCDWithKeybindings();
|
||
|
|
let t1;
|
||
|
|
if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
|
||
|
|
t1 = {
|
||
|
|
context: "Settings"
|
||
|
|
};
|
||
|
|
$[0] = t1;
|
||
|
|
} else {
|
||
|
|
t1 = $[0];
|
||
|
|
}
|
||
|
|
useKeybinding("confirm:no", onCancel, t1);
|
||
|
|
const {
|
||
|
|
columns
|
||
|
|
} = useTerminalSize();
|
||
|
|
const textInputColumns = columns - 6;
|
||
|
|
let t2;
|
||
|
|
if ($[1] !== onSubmit || $[2] !== ruleBehavior) {
|
||
|
|
t2 = value => {
|
||
|
|
const trimmedValue = value.trim();
|
||
|
|
if (trimmedValue.length === 0) {
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
const ruleValue = permissionRuleValueFromString(trimmedValue);
|
||
|
|
onSubmit(ruleValue, ruleBehavior);
|
||
|
|
};
|
||
|
|
$[1] = onSubmit;
|
||
|
|
$[2] = ruleBehavior;
|
||
|
|
$[3] = t2;
|
||
|
|
} else {
|
||
|
|
t2 = $[3];
|
||
|
|
}
|
||
|
|
const handleSubmit = t2;
|
||
|
|
let t3;
|
||
|
|
if ($[4] !== ruleBehavior) {
|
||
|
|
t3 = <Text bold={true} color="permission">Add {ruleBehavior} permission rule</Text>;
|
||
|
|
$[4] = ruleBehavior;
|
||
|
|
$[5] = t3;
|
||
|
|
} else {
|
||
|
|
t3 = $[5];
|
||
|
|
}
|
||
|
|
let t4;
|
||
|
|
if ($[6] === Symbol.for("react.memo_cache_sentinel")) {
|
||
|
|
t4 = <Newline />;
|
||
|
|
$[6] = t4;
|
||
|
|
} else {
|
||
|
|
t4 = $[6];
|
||
|
|
}
|
||
|
|
let t5;
|
||
|
|
let t6;
|
||
|
|
if ($[7] === Symbol.for("react.memo_cache_sentinel")) {
|
||
|
|
t5 = <Text bold={true}>{permissionRuleValueToString({
|
||
|
|
toolName: WebFetchTool.name
|
||
|
|
})}</Text>;
|
||
|
|
t6 = <Text bold={false}> or </Text>;
|
||
|
|
$[7] = t5;
|
||
|
|
$[8] = t6;
|
||
|
|
} else {
|
||
|
|
t5 = $[7];
|
||
|
|
t6 = $[8];
|
||
|
|
}
|
||
|
|
let t7;
|
||
|
|
if ($[9] === Symbol.for("react.memo_cache_sentinel")) {
|
||
|
|
t7 = <Text>Permission rules are a tool name, optionally followed by a specifier in parentheses.{t4}e.g.,{" "}{t5}{t6}<Text bold={true}>{permissionRuleValueToString({
|
||
|
|
toolName: BashTool.name,
|
||
|
|
ruleContent: "ls:*"
|
||
|
|
})}</Text></Text>;
|
||
|
|
$[9] = t7;
|
||
|
|
} else {
|
||
|
|
t7 = $[9];
|
||
|
|
}
|
||
|
|
let t8;
|
||
|
|
if ($[10] !== cursorOffset || $[11] !== handleSubmit || $[12] !== inputValue || $[13] !== textInputColumns) {
|
||
|
|
t8 = <Box flexDirection="column">{t7}<Box borderDimColor={true} borderStyle="round" marginY={1} paddingLeft={1}><TextInput showCursor={true} value={inputValue} onChange={setInputValue} onSubmit={handleSubmit} placeholder={`Enter permission rule${figures.ellipsis}`} columns={textInputColumns} cursorOffset={cursorOffset} onChangeCursorOffset={setCursorOffset} /></Box></Box>;
|
||
|
|
$[10] = cursorOffset;
|
||
|
|
$[11] = handleSubmit;
|
||
|
|
$[12] = inputValue;
|
||
|
|
$[13] = textInputColumns;
|
||
|
|
$[14] = t8;
|
||
|
|
} else {
|
||
|
|
t8 = $[14];
|
||
|
|
}
|
||
|
|
let t9;
|
||
|
|
if ($[15] !== t3 || $[16] !== t8) {
|
||
|
|
t9 = <Box flexDirection="column" gap={1} borderStyle="round" paddingLeft={1} paddingRight={1} borderColor="permission">{t3}{t8}</Box>;
|
||
|
|
$[15] = t3;
|
||
|
|
$[16] = t8;
|
||
|
|
$[17] = t9;
|
||
|
|
} else {
|
||
|
|
t9 = $[17];
|
||
|
|
}
|
||
|
|
let t10;
|
||
|
|
if ($[18] !== exitState.keyName || $[19] !== exitState.pending) {
|
||
|
|
t10 = <Box marginLeft={3}>{exitState.pending ? <Text dimColor={true}>Press {exitState.keyName} again to exit</Text> : <Text dimColor={true}>Enter to submit · Esc to cancel</Text>}</Box>;
|
||
|
|
$[18] = exitState.keyName;
|
||
|
|
$[19] = exitState.pending;
|
||
|
|
$[20] = t10;
|
||
|
|
} else {
|
||
|
|
t10 = $[20];
|
||
|
|
}
|
||
|
|
let t11;
|
||
|
|
if ($[21] !== t10 || $[22] !== t9) {
|
||
|
|
t11 = <>{t9}{t10}</>;
|
||
|
|
$[21] = t10;
|
||
|
|
$[22] = t9;
|
||
|
|
$[23] = t11;
|
||
|
|
} else {
|
||
|
|
t11 = $[23];
|
||
|
|
}
|
||
|
|
return t11;
|
||
|
|
}
|
||
|
|
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJmaWd1cmVzIiwiUmVhY3QiLCJ1c2VTdGF0ZSIsIlRleHRJbnB1dCIsInVzZUV4aXRPbkN0cmxDRFdpdGhLZXliaW5kaW5ncyIsInVzZVRlcm1pbmFsU2l6ZSIsIkJveCIsIk5ld2xpbmUiLCJUZXh0IiwidXNlS2V5YmluZGluZyIsIkJhc2hUb29sIiwiV2ViRmV0Y2hUb29sIiwiUGVybWlzc2lvbkJlaGF2aW9yIiwiUGVybWlzc2lvblJ1bGVWYWx1ZSIsInBlcm1pc3Npb25SdWxlVmFsdWVGcm9tU3RyaW5nIiwicGVybWlzc2lvblJ1bGVWYWx1ZVRvU3RyaW5nIiwiUGVybWlzc2lvblJ1bGVJbnB1dFByb3BzIiwib25DYW5jZWwiLCJvblN1Ym1pdCIsInJ1bGVWYWx1ZSIsInJ1bGVCZWhhdmlvciIsIlBlcm1pc3Npb25SdWxlSW5wdXQiLCJ0MCIsIiQiLCJfYyIsImlucHV0VmFsdWUiLCJzZXRJbnB1dFZhbHVlIiwiY3Vyc29yT2Zmc2V0Iiwic2V0Q3Vyc29yT2Zmc2V0IiwiZXhpdFN0YXRlIiwidDEiLCJTeW1ib2wiLCJmb3IiLCJjb250ZXh0IiwiY29sdW1ucyIsInRleHRJbnB1dENvbHVtbnMiLCJ0MiIsInZhbHVlIiwidHJpbW1lZFZhbHVlIiwidHJpbSIsImxlbmd0aCIsImhhbmRsZVN1Ym1pdCIsInQzIiwidDQiLCJ0NSIsInQ2IiwidG9vbE5hbWUiLCJuYW1lIiwidDciLCJydWxlQ29udGVudCIsInQ4IiwiZWxsaXBzaXMiLCJ0OSIsInQxMCIsImtleU5hbWUiLCJwZW5kaW5nIiwidDExIl0sInNvdXJjZXMiOlsiUGVybWlzc2lvblJ1bGVJbnB1dC50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGZpZ3VyZXMgZnJvbSAnZmlndXJlcydcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCdcbmltcG9ydCBUZXh0SW5wdXQgZnJvbSAnLi4vLi4vLi4vY29tcG9uZW50cy9UZXh0SW5wdXQuanMnXG5pbXBvcnQgeyB1c2VFeGl0T25DdHJsQ0RXaXRoS2V5YmluZGluZ3MgfSBmcm9tICcuLi8uLi8uLi9ob29rcy91c2VFeGl0T25DdHJsQ0RXaXRoS2V5YmluZGluZ3MuanMnXG5pbXBvcnQgeyB1c2VUZXJtaW5hbFNpemUgfSBmcm9tICcuLi8uLi8uLi9ob29rcy91c2VUZXJtaW5hbFNpemUuanMnXG5pbXBvcnQgeyBCb3gsIE5ld2xpbmUsIFRleHQgfSBmcm9tICcuLi8uLi8uLi9pbmsuanMnXG5pbXBvcnQgeyB1c2VLZXliaW5kaW5nIH0gZnJvbSAnLi4vLi4vLi4va2V5YmluZGluZ3MvdXNlS2V5YmluZGluZy5qcydcbmltcG9ydCB7IEJhc2hUb29sIH0gZnJvbSAnLi4vLi4vLi4vdG9vbHMvQmFzaFRvb2wvQmFzaFRvb2wuanMnXG5pbXBvcnQgeyBXZWJGZXRjaFRvb2wgfSBmcm9tICcuLi8uLi8uLi90b29scy9XZWJGZXRjaFRvb2wvV2ViRmV0Y2hUb29sLmpzJ1xuaW1wb3J0IHR5cGUge1xuICBQZXJtaXNzaW9uQmVoYXZpb3IsXG4gIFBlcm1pc3Npb25SdWxlVmFsdWUsXG59IGZyb20gJy4uLy4uLy4uL3V0aWxzL3Blcm1pc3Npb25zL1Blcm1pc3Npb25SdWxlLmpzJ1xuaW1wb3J0IHtcbiAgcGVybWlzc2lvblJ1bGVWYWx1ZUZyb21TdHJpbmcsXG4gIHBlcm1pc3Npb25SdWxlVmFsdWVUb1N0cmluZyxcbn0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvcGVybWlzc2lvbnMvcGVybWlzc2lvblJ1bGVQYXJzZXIuanMnXG5cbmV4cG9ydCB0eXBlIFBlcm1pc3Npb25SdWxlSW5wdXRQcm9wcyA9IHtcbiAgb25DYW5jZWw6ICgpID0+IHZvaWRcbiAgb25TdWJtaXQ6IChcbiAgICBydWxlVmFsdWU6IFBlcm1pc3Npb25SdWxlVmFsdWUsXG4gICAgcnVsZUJlaGF2aW9yOiBQZXJtaXNzaW9uQmVoYXZpb3IsXG4gICkgPT4gdm9pZFxuICBydWxlQmVoYXZpb3I6IFBlcm1pc3Npb25CZWhhdmlvclxufVxuXG5leHBvcnQgZnVuY3Rpb24gUGVybWlzc2lvblJ1bGVJbnB1dCh7XG4gIG9uQ2FuY2VsLFxuICBvblN1Ym1pdCxcbiAgcnVsZUJlaGF2aW9yLFxufTogUGVybWlzc2lvblJ1bGVJbnB1dFByb3BzKTogUmVhY3QuUmVhY3ROb2RlIHtcbiAgY29uc3QgW2lucHV0VmFsdWUsIHNldElucHV0VmFsdWVdID0gdXNlU3RhdGUoJycpXG4gIGNvbnN0IFtjdXJzb3JPZmZzZXQsIHNldEN1cnNvck9mZnNldF0gPSB1c2VTdGF0ZSgwKVxuICBjb25zdCBleGl0U3RhdGUgPSB1c2VFeGl0T25DdHJsQ0RXaXRoS2V5YmluZGluZ3MoKVxuXG4gIC8vIFVzZSBjb25maWd1cmFibGUga2V5YmluZGluZyBmb3IgRVNDIHRvIGNhbmNlbFxuICAvLyBVc2UgU2V0dGluZ3MgY29udGV4dCBzbyAnbicga2V5IGRvZXNuJ3QgY2FuY2VsIChhbGxvd3MgdHlwaW5nICduJyBpbiBpbnB1dClcbiAgdXNlS2V5YmluZGluZygnY29uZmlybTpubycsIG9uQ2FuY2VsLCB7IGNvbnRleHQ6ICdTZXR0aW5ncycgfSlcblxuICBjb25zdCB7IGNvbHVtbnMgfSA9IHVzZVRlcm1pbmFsU2l6ZSgpXG4gIGNvbnN0IHRleHRJbnB1dENvbHVtbnMgPSBjb2x1bW5zIC0gNlxuXG4gIGNvbnN0IGhhbmRsZVN1Ym1pdCA9ICh2YWx1ZTogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgdHJpbW1lZFZhbHVlID0gdmFsdWUudHJpbSgpXG4gICAgaWYgKHRyaW1tZWRWYWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBjb25zdCBydWxlVmFsdWUgPSBwZXJtaXNzaW9uUnVsZVZhbHVlRnJvbVN0cmluZyh0cmltbWVkVmFsdWUpXG4gICAgb25TdWJtaXQocnVsZVZhbHVlLCBydWxlQmVoYXZpb3IpXG4gIH1cblxuICByZXR1cm4gKFxuICAgIDw+XG4gICAgICA8Qm94XG4gICAgICAgIGZsZXhEaXJlY3Rpb249XCJjb2x1bW5cIlxuICAgICAgICBnYXA9ezF9XG4gICAgICAgIGJvcmRlclN0eWxlPVwicm91bmRcIlxuICAgICAgICBwYWRkaW5nTGVmdD17MX1cbiAgICAgICAgcGFkZGluZ1JpZ2h0PXsxfVxuICAgICAgICBib3JkZXJDb2xvcj1cInBlcm1pc3Npb25cIlxuICAgICAgPlxuICAgICAgICA8VGV4dCBib2xkIGNvbG9yPVwicGVybWlzc2lvblwiPlxuICAgICAgICAgIEFkZCB7cnVsZUJlaGF2aW9yfSBwZXJtaXNzaW9uIHJ1bGVcbiAgICAgICAgPC9UZXh0PlxuICAgICAgICA8Qm94IGZsZXhEaXJlY3Rpb249XCJjb2x1bW5cIj5cbiAgICAgICAgICA8VGV4dD5cbiAgICA
|