mirror of
http://10.0.2.1:3031/sauer/claude-code.git
synced 2026-06-30 23:56:58 +10:00
180 lines
22 KiB
TypeScript
180 lines
22 KiB
TypeScript
|
|
import { c as _c } from "react/compiler-runtime";
|
||
|
|
import * as React from 'react';
|
||
|
|
import { useCallback } from 'react';
|
||
|
|
import { Select } from '../../../components/CustomSelect/select.js';
|
||
|
|
import { Box, Text } from '../../../ink.js';
|
||
|
|
import type { ToolPermissionContext } from '../../../Tool.js';
|
||
|
|
import type { PermissionBehavior, PermissionRule, PermissionRuleValue } from '../../../utils/permissions/PermissionRule.js';
|
||
|
|
import { applyPermissionUpdate, persistPermissionUpdate } from '../../../utils/permissions/PermissionUpdate.js';
|
||
|
|
import { permissionRuleValueToString } from '../../../utils/permissions/permissionRuleParser.js';
|
||
|
|
import { detectUnreachableRules, type UnreachableRule } from '../../../utils/permissions/shadowedRuleDetection.js';
|
||
|
|
import { SandboxManager } from '../../../utils/sandbox/sandbox-adapter.js';
|
||
|
|
import { type EditableSettingSource, SOURCES } from '../../../utils/settings/constants.js';
|
||
|
|
import { getRelativeSettingsFilePathForSource } from '../../../utils/settings/settings.js';
|
||
|
|
import { plural } from '../../../utils/stringUtils.js';
|
||
|
|
import type { OptionWithDescription } from '../../CustomSelect/select.js';
|
||
|
|
import { Dialog } from '../../design-system/Dialog.js';
|
||
|
|
import { PermissionRuleDescription } from './PermissionRuleDescription.js';
|
||
|
|
export function optionForPermissionSaveDestination(saveDestination: EditableSettingSource): OptionWithDescription {
|
||
|
|
switch (saveDestination) {
|
||
|
|
case 'localSettings':
|
||
|
|
return {
|
||
|
|
label: 'Project settings (local)',
|
||
|
|
description: `Saved in ${getRelativeSettingsFilePathForSource('localSettings')}`,
|
||
|
|
value: saveDestination
|
||
|
|
};
|
||
|
|
case 'projectSettings':
|
||
|
|
return {
|
||
|
|
label: 'Project settings',
|
||
|
|
description: `Checked in at ${getRelativeSettingsFilePathForSource('projectSettings')}`,
|
||
|
|
value: saveDestination
|
||
|
|
};
|
||
|
|
case 'userSettings':
|
||
|
|
return {
|
||
|
|
label: 'User settings',
|
||
|
|
description: `Saved in at ~/.claude/settings.json`,
|
||
|
|
value: saveDestination
|
||
|
|
};
|
||
|
|
}
|
||
|
|
}
|
||
|
|
type Props = {
|
||
|
|
onAddRules: (rules: PermissionRule[], unreachable?: UnreachableRule[]) => void;
|
||
|
|
onCancel: () => void;
|
||
|
|
ruleValues: PermissionRuleValue[];
|
||
|
|
ruleBehavior: PermissionBehavior;
|
||
|
|
initialContext: ToolPermissionContext;
|
||
|
|
setToolPermissionContext: (newContext: ToolPermissionContext) => void;
|
||
|
|
};
|
||
|
|
export function AddPermissionRules(t0) {
|
||
|
|
const $ = _c(26);
|
||
|
|
const {
|
||
|
|
onAddRules,
|
||
|
|
onCancel,
|
||
|
|
ruleValues,
|
||
|
|
ruleBehavior,
|
||
|
|
initialContext,
|
||
|
|
setToolPermissionContext
|
||
|
|
} = t0;
|
||
|
|
let t1;
|
||
|
|
if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
|
||
|
|
t1 = SOURCES.map(optionForPermissionSaveDestination);
|
||
|
|
$[0] = t1;
|
||
|
|
} else {
|
||
|
|
t1 = $[0];
|
||
|
|
}
|
||
|
|
const allOptions = t1;
|
||
|
|
let t2;
|
||
|
|
if ($[1] !== initialContext || $[2] !== onAddRules || $[3] !== onCancel || $[4] !== ruleBehavior || $[5] !== ruleValues || $[6] !== setToolPermissionContext) {
|
||
|
|
t2 = selectedValue => {
|
||
|
|
if (selectedValue === "cancel") {
|
||
|
|
onCancel();
|
||
|
|
return;
|
||
|
|
} else {
|
||
|
|
if ((SOURCES as readonly string[]).includes(selectedValue)) {
|
||
|
|
const destination = selectedValue as EditableSettingSource;
|
||
|
|
const updatedContext = applyPermissionUpdate(initialContext, {
|
||
|
|
type: "addRules",
|
||
|
|
rules: ruleValues,
|
||
|
|
behavior: ruleBehavior,
|
||
|
|
destination
|
||
|
|
});
|
||
|
|
persistPermissionUpdate({
|
||
|
|
type: "addRules",
|
||
|
|
rules: ruleValues,
|
||
|
|
behavior: ruleBehavior,
|
||
|
|
destination
|
||
|
|
});
|
||
|
|
setToolPermissionContext(updatedContext);
|
||
|
|
const rules = ruleValues.map(ruleValue => ({
|
||
|
|
ruleValue,
|
||
|
|
ruleBehavior,
|
||
|
|
source: destination
|
||
|
|
}));
|
||
|
|
const sandboxAutoAllowEnabled = SandboxManager.isSandboxingEnabled() && SandboxManager.isAutoAllowBashIfSandboxedEnabled();
|
||
|
|
const allUnreachable = detectUnreachableRules(updatedContext, {
|
||
|
|
sandboxAutoAllowEnabled
|
||
|
|
});
|
||
|
|
const newUnreachable = allUnreachable.filter(u => ruleValues.some(rv => rv.toolName === u.rule.ruleValue.toolName && rv.ruleContent === u.rule.ruleValue.ruleContent));
|
||
|
|
onAddRules(rules, newUnreachable.length > 0 ? newUnreachable : undefined);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
};
|
||
|
|
$[1] = initialContext;
|
||
|
|
$[2] = onAddRules;
|
||
|
|
$[3] = onCancel;
|
||
|
|
$[4] = ruleBehavior;
|
||
|
|
$[5] = ruleValues;
|
||
|
|
$[6] = setToolPermissionContext;
|
||
|
|
$[7] = t2;
|
||
|
|
} else {
|
||
|
|
t2 = $[7];
|
||
|
|
}
|
||
|
|
const onSelect = t2;
|
||
|
|
let t3;
|
||
|
|
if ($[8] !== ruleValues.length) {
|
||
|
|
t3 = plural(ruleValues.length, "rule");
|
||
|
|
$[8] = ruleValues.length;
|
||
|
|
$[9] = t3;
|
||
|
|
} else {
|
||
|
|
t3 = $[9];
|
||
|
|
}
|
||
|
|
const title = `Add ${ruleBehavior} permission ${t3}`;
|
||
|
|
let t4;
|
||
|
|
if ($[10] !== ruleValues) {
|
||
|
|
t4 = ruleValues.map(_temp);
|
||
|
|
$[10] = ruleValues;
|
||
|
|
$[11] = t4;
|
||
|
|
} else {
|
||
|
|
t4 = $[11];
|
||
|
|
}
|
||
|
|
let t5;
|
||
|
|
if ($[12] !== t4) {
|
||
|
|
t5 = <Box flexDirection="column" paddingX={2}>{t4}</Box>;
|
||
|
|
$[12] = t4;
|
||
|
|
$[13] = t5;
|
||
|
|
} else {
|
||
|
|
t5 = $[13];
|
||
|
|
}
|
||
|
|
const t6 = ruleValues.length === 1 ? "Where should this rule be saved?" : "Where should these rules be saved?";
|
||
|
|
let t7;
|
||
|
|
if ($[14] !== t6) {
|
||
|
|
t7 = <Text>{t6}</Text>;
|
||
|
|
$[14] = t6;
|
||
|
|
$[15] = t7;
|
||
|
|
} else {
|
||
|
|
t7 = $[15];
|
||
|
|
}
|
||
|
|
let t8;
|
||
|
|
if ($[16] !== onSelect) {
|
||
|
|
t8 = <Select options={allOptions} onChange={onSelect} />;
|
||
|
|
$[16] = onSelect;
|
||
|
|
$[17] = t8;
|
||
|
|
} else {
|
||
|
|
t8 = $[17];
|
||
|
|
}
|
||
|
|
let t9;
|
||
|
|
if ($[18] !== t7 || $[19] !== t8) {
|
||
|
|
t9 = <Box flexDirection="column" marginY={1}>{t7}{t8}</Box>;
|
||
|
|
$[18] = t7;
|
||
|
|
$[19] = t8;
|
||
|
|
$[20] = t9;
|
||
|
|
} else {
|
||
|
|
t9 = $[20];
|
||
|
|
}
|
||
|
|
let t10;
|
||
|
|
if ($[21] !== onCancel || $[22] !== t5 || $[23] !== t9 || $[24] !== title) {
|
||
|
|
t10 = <Dialog title={title} onCancel={onCancel} color="permission">{t5}{t9}</Dialog>;
|
||
|
|
$[21] = onCancel;
|
||
|
|
$[22] = t5;
|
||
|
|
$[23] = t9;
|
||
|
|
$[24] = title;
|
||
|
|
$[25] = t10;
|
||
|
|
} else {
|
||
|
|
t10 = $[25];
|
||
|
|
}
|
||
|
|
return t10;
|
||
|
|
}
|
||
|
|
function _temp(ruleValue_0) {
|
||
|
|
return <Box flexDirection="column" key={permissionRuleValueToString(ruleValue_0)}><Text bold={true}>{permissionRuleValueToString(ruleValue_0)}</Text><PermissionRuleDescription ruleValue={ruleValue_0} /></Box>;
|
||
|
|
}
|
||
|
|
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsInVzZUNhbGxiYWNrIiwiU2VsZWN0IiwiQm94IiwiVGV4dCIsIlRvb2xQZXJtaXNzaW9uQ29udGV4dCIsIlBlcm1pc3Npb25CZWhhdmlvciIsIlBlcm1pc3Npb25SdWxlIiwiUGVybWlzc2lvblJ1bGVWYWx1ZSIsImFwcGx5UGVybWlzc2lvblVwZGF0ZSIsInBlcnNpc3RQZXJtaXNzaW9uVXBkYXRlIiwicGVybWlzc2lvblJ1bGVWYWx1ZVRvU3RyaW5nIiwiZGV0ZWN0VW5yZWFjaGFibGVSdWxlcyIsIlVucmVhY2hhYmxlUnVsZSIsIlNhbmRib3hNYW5hZ2VyIiwiRWRpdGFibGVTZXR0aW5nU291cmNlIiwiU09VUkNFUyIsImdldFJlbGF0aXZlU2V0dGluZ3NGaWxlUGF0aEZvclNvdXJjZSIsInBsdXJhbCIsIk9wdGlvbldpdGhEZXNjcmlwdGlvbiIsIkRpYWxvZyIsIlBlcm1pc3Npb25SdWxlRGVzY3JpcHRpb24iLCJvcHRpb25Gb3JQZXJtaXNzaW9uU2F2ZURlc3RpbmF0aW9uIiwic2F2ZURlc3RpbmF0aW9uIiwibGFiZWwiLCJkZXNjcmlwdGlvbiIsInZhbHVlIiwiUHJvcHMiLCJvbkFkZFJ1bGVzIiwicnVsZXMiLCJ1bnJlYWNoYWJsZSIsIm9uQ2FuY2VsIiwicnVsZVZhbHVlcyIsInJ1bGVCZWhhdmlvciIsImluaXRpYWxDb250ZXh0Iiwic2V0VG9vbFBlcm1pc3Npb25Db250ZXh0IiwibmV3Q29udGV4dCIsIkFkZFBlcm1pc3Npb25SdWxlcyIsInQwIiwiJCIsIl9jIiwidDEiLCJTeW1ib2wiLCJmb3IiLCJtYXAiLCJhbGxPcHRpb25zIiwidDIiLCJzZWxlY3RlZFZhbHVlIiwiaW5jbHVkZXMiLCJkZXN0aW5hdGlvbiIsInVwZGF0ZWRDb250ZXh0IiwidHlwZSIsImJlaGF2aW9yIiwicnVsZVZhbHVlIiwic291cmNlIiwic2FuZGJveEF1dG9BbGxvd0VuYWJsZWQiLCJpc1NhbmRib3hpbmdFbmFibGVkIiwiaXNBdXRvQWxsb3dCYXNoSWZTYW5kYm94ZWRFbmFibGVkIiwiYWxsVW5yZWFjaGFibGUiLCJuZXdVbnJlYWNoYWJsZSIsImZpbHRlciIsInUiLCJzb21lIiwicnYiLCJ0b29sTmFtZSIsInJ1bGUiLCJydWxlQ29udGVudCIsImxlbmd0aCIsInVuZGVmaW5lZCIsIm9uU2VsZWN0IiwidDMiLCJ0aXRsZSIsInQ0IiwiX3RlbXAiLCJ0NSIsInQ2IiwidDciLCJ0OCIsInQ5IiwidDEwIiwicnVsZVZhbHVlXzAiXSwic291cmNlcyI6WyJBZGRQZXJtaXNzaW9uUnVsZXMudHN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgdXNlQ2FsbGJhY2sgfSBmcm9tICdyZWFjdCdcbmltcG9ydCB7IFNlbGVjdCB9IGZyb20gJy4uLy4uLy4uL2NvbXBvbmVudHMvQ3VzdG9tU2VsZWN0L3NlbGVjdC5qcydcbmltcG9ydCB7IEJveCwgVGV4dCB9IGZyb20gJy4uLy4uLy4uL2luay5qcydcbmltcG9ydCB0eXBlIHsgVG9vbFBlcm1pc3Npb25Db250ZXh0IH0gZnJvbSAnLi4vLi4vLi4vVG9vbC5qcydcbmltcG9ydCB0eXBlIHtcbiAgUGVybWlzc2lvbkJlaGF2aW9yLFxuICBQZXJtaXNzaW9uUnVsZSxcbiAgUGVybWlzc2lvblJ1bGVWYWx1ZSxcbn0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvcGVybWlzc2lvbnMvUGVybWlzc2lvblJ1bGUuanMnXG5pbXBvcnQge1xuICBhcHBseVBlcm1pc3Npb25VcGRhdGUsXG4gIHBlcnNpc3RQZXJtaXNzaW9uVXBkYXRlLFxufSBmcm9tICcuLi8uLi8uLi91dGlscy9wZXJtaXNzaW9ucy9QZXJtaXNzaW9uVXBkYXRlLmpzJ1xuaW1wb3J0IHsgcGVybWlzc2lvblJ1bGVWYWx1ZVRvU3RyaW5nIH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvcGVybWlzc2lvbnMvcGVybWlzc2lvblJ1bGVQYXJzZXIuanMnXG5pbXBvcnQge1xuICBkZXRlY3RVbnJlYWNoYWJsZVJ1bGVzLFxuICB0eXBlIFVucmVhY2hhYmxlUnVsZSxcbn0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvcGVybWlzc2lvbnMvc2hhZG93ZWRSdWxlRGV0ZWN0aW9uLmpzJ1xuaW1wb3J0IHsgU2FuZGJveE1hbmFnZXIgfSBmcm9tICcuLi8uLi8uLi91dGlscy9zYW5kYm94L3NhbmRib3gtYWRhcHRlci5qcydcbmltcG9ydCB7XG4gIHR5cGUgRWRpdGFibGVTZXR0aW5nU291cmNlLFxuICBTT1VSQ0VTLFxufSBmcm9tICcuLi8uLi8uLi91dGlscy9zZXR0aW5ncy9jb25zdGFudHMuanMnXG5pbXBvcnQgeyBnZXRSZWxhdGl2ZVNldHRpbmdzRmlsZVBhdGhGb3JTb3VyY2UgfSBmcm9tICcuLi8uLi8uLi91dGlscy9zZXR0aW5ncy9zZXR0aW5ncy5qcydcbmltcG9ydCB7IHBsdXJhbCB9IGZyb20gJy4uLy4uLy4uL3V0aWxzL3N0cmluZ1V0aWxzLmpzJ1xuaW1wb3J0IHR5cGUgeyBPcHRpb25XaXRoRGVzY3JpcHRpb24gfSBmcm9tICcuLi8uLi9DdXN0b21TZWxlY3Qvc2VsZWN0LmpzJ1xuaW1wb3J0IHsgRGlhbG9nIH0gZnJvbSAnLi4vLi4vZGVzaWduLXN5c3RlbS9EaWFsb2cuanMnXG5pbXBvcnQgeyBQZXJtaXNzaW9uUnVsZURlc2NyaXB0aW9uIH0gZnJvbSAnLi9QZXJtaXNzaW9uUnVsZURlc2NyaXB0aW9uLmpzJ1xuXG5leHBvcnQgZnVuY3Rpb24gb3B0aW9uRm9yUGVybWlzc2lvblNhdmVEZXN0aW5hdGlvbihcbiAgc2F2ZURlc3RpbmF0aW9uOiBFZGl0YWJsZVNldHRpbmdTb3VyY2UsXG4pOiBPcHRpb25XaXRoRGVzY3JpcHRpb24ge1xuICBzd2l0Y2ggKHNhdmVEZXN0aW5hdGlvbikge1xuICAgIGNhc2UgJ2xvY2FsU2V0dGluZ3MnOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbGFiZWw6ICdQcm9qZWN0IHNldHRpbmdzIChsb2NhbCknLFxuICAgICAgICBkZXNjcmlwdGlvbjogYFNhdmVkIGluICR7Z2V0UmVsYXRpdmVTZXR0aW5nc0ZpbGVQYXRoRm9yU291cmNlKCdsb2NhbFNldHRpbmdzJyl9YCxcbiAgICAgICAgdmFsdWU6IHNhdmVEZXN0aW5hdGlvbixcbiAgICAgIH1cbiAgICBjYXNlICdwcm9qZWN0U2V0dGluZ3MnOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbGFiZWw6ICdQcm9qZWN0IHNldHRpbmdzJyxcbiAgICAgICAgZGVzY3JpcHRpb246IGBDaGVja2VkIGluIGF0ICR7Z2V0UmVsYXRpdmVTZXR0aW5nc0ZpbGVQYXRoRm9yU291cmNlKCdwcm9qZWN0U2V0dGluZ3MnKX1gLFxuICAgICAgICB2YWx1ZTogc2F2ZURlc3RpbmF0aW9uLFxuICAgICAgfVxuICA
|