mirror of
http://10.0.2.1:3031/sauer/claude-code.git
synced 2026-06-30 19:16:58 +10:00
91 lines
12 KiB
TypeScript
91 lines
12 KiB
TypeScript
|
|
import { POWERSHELL_TOOL_NAME } from '../../../tools/PowerShellTool/toolName.js';
|
||
|
|
import type { PermissionUpdate } from '../../../utils/permissions/PermissionUpdateSchema.js';
|
||
|
|
import { shouldShowAlwaysAllowOptions } from '../../../utils/permissions/permissionsLoader.js';
|
||
|
|
import type { OptionWithDescription } from '../../CustomSelect/select.js';
|
||
|
|
import { generateShellSuggestionsLabel } from '../shellPermissionHelpers.js';
|
||
|
|
export type PowerShellToolUseOption = 'yes' | 'yes-apply-suggestions' | 'yes-prefix-edited' | 'no';
|
||
|
|
export function powershellToolUseOptions({
|
||
|
|
suggestions = [],
|
||
|
|
onRejectFeedbackChange,
|
||
|
|
onAcceptFeedbackChange,
|
||
|
|
yesInputMode = false,
|
||
|
|
noInputMode = false,
|
||
|
|
editablePrefix,
|
||
|
|
onEditablePrefixChange
|
||
|
|
}: {
|
||
|
|
suggestions?: PermissionUpdate[];
|
||
|
|
onRejectFeedbackChange: (value: string) => void;
|
||
|
|
onAcceptFeedbackChange: (value: string) => void;
|
||
|
|
yesInputMode?: boolean;
|
||
|
|
noInputMode?: boolean;
|
||
|
|
editablePrefix?: string;
|
||
|
|
onEditablePrefixChange?: (value: string) => void;
|
||
|
|
}): OptionWithDescription<PowerShellToolUseOption>[] {
|
||
|
|
const options: OptionWithDescription<PowerShellToolUseOption>[] = [];
|
||
|
|
if (yesInputMode) {
|
||
|
|
options.push({
|
||
|
|
type: 'input',
|
||
|
|
label: 'Yes',
|
||
|
|
value: 'yes',
|
||
|
|
placeholder: 'and tell Claude what to do next',
|
||
|
|
onChange: onAcceptFeedbackChange,
|
||
|
|
allowEmptySubmitToCancel: true
|
||
|
|
});
|
||
|
|
} else {
|
||
|
|
options.push({
|
||
|
|
label: 'Yes',
|
||
|
|
value: 'yes'
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
// Note: No sandbox toggle for PowerShell - sandbox is not supported on Windows
|
||
|
|
// Note: No classifier-reviewed option for PowerShell (ANT-ONLY feature for Bash)
|
||
|
|
|
||
|
|
// Only show "always allow" options when not restricted by allowManagedPermissionRulesOnly.
|
||
|
|
// Prefer the editable prefix input (static extractor + user edits) over the
|
||
|
|
// non-editable suggestions label. The editable input can't represent
|
||
|
|
// directory permissions or Read-tool rules, so fall back to the label when
|
||
|
|
// those are present.
|
||
|
|
if (shouldShowAlwaysAllowOptions() && suggestions.length > 0) {
|
||
|
|
const hasNonPowerShellSuggestions = suggestions.some(s => s.type === 'addDirectories' || s.type === 'addRules' && s.rules?.some(r => r.toolName !== POWERSHELL_TOOL_NAME));
|
||
|
|
if (editablePrefix !== undefined && onEditablePrefixChange && !hasNonPowerShellSuggestions) {
|
||
|
|
options.push({
|
||
|
|
type: 'input',
|
||
|
|
label: 'Yes, and don\u2019t ask again for',
|
||
|
|
value: 'yes-prefix-edited',
|
||
|
|
placeholder: 'command prefix (e.g., Get-Process:*)',
|
||
|
|
initialValue: editablePrefix,
|
||
|
|
onChange: onEditablePrefixChange,
|
||
|
|
allowEmptySubmitToCancel: true,
|
||
|
|
showLabelWithValue: true,
|
||
|
|
labelValueSeparator: ': ',
|
||
|
|
resetCursorOnUpdate: true
|
||
|
|
});
|
||
|
|
} else {
|
||
|
|
const label = generateShellSuggestionsLabel(suggestions, POWERSHELL_TOOL_NAME);
|
||
|
|
if (label) {
|
||
|
|
options.push({
|
||
|
|
label,
|
||
|
|
value: 'yes-apply-suggestions'
|
||
|
|
});
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
if (noInputMode) {
|
||
|
|
options.push({
|
||
|
|
type: 'input',
|
||
|
|
label: 'No',
|
||
|
|
value: 'no',
|
||
|
|
placeholder: 'and tell Claude what to do differently',
|
||
|
|
onChange: onRejectFeedbackChange,
|
||
|
|
allowEmptySubmitToCancel: true
|
||
|
|
});
|
||
|
|
} else {
|
||
|
|
options.push({
|
||
|
|
label: 'No',
|
||
|
|
value: 'no'
|
||
|
|
});
|
||
|
|
}
|
||
|
|
return options;
|
||
|
|
}
|
||
|
|
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJQT1dFUlNIRUxMX1RPT0xfTkFNRSIsIlBlcm1pc3Npb25VcGRhdGUiLCJzaG91bGRTaG93QWx3YXlzQWxsb3dPcHRpb25zIiwiT3B0aW9uV2l0aERlc2NyaXB0aW9uIiwiZ2VuZXJhdGVTaGVsbFN1Z2dlc3Rpb25zTGFiZWwiLCJQb3dlclNoZWxsVG9vbFVzZU9wdGlvbiIsInBvd2Vyc2hlbGxUb29sVXNlT3B0aW9ucyIsInN1Z2dlc3Rpb25zIiwib25SZWplY3RGZWVkYmFja0NoYW5nZSIsIm9uQWNjZXB0RmVlZGJhY2tDaGFuZ2UiLCJ5ZXNJbnB1dE1vZGUiLCJub0lucHV0TW9kZSIsImVkaXRhYmxlUHJlZml4Iiwib25FZGl0YWJsZVByZWZpeENoYW5nZSIsInZhbHVlIiwib3B0aW9ucyIsInB1c2giLCJ0eXBlIiwibGFiZWwiLCJwbGFjZWhvbGRlciIsIm9uQ2hhbmdlIiwiYWxsb3dFbXB0eVN1Ym1pdFRvQ2FuY2VsIiwibGVuZ3RoIiwiaGFzTm9uUG93ZXJTaGVsbFN1Z2dlc3Rpb25zIiwic29tZSIsInMiLCJydWxlcyIsInIiLCJ0b29sTmFtZSIsInVuZGVmaW5lZCIsImluaXRpYWxWYWx1ZSIsInNob3dMYWJlbFdpdGhWYWx1ZSIsImxhYmVsVmFsdWVTZXBhcmF0b3IiLCJyZXNldEN1cnNvck9uVXBkYXRlIl0sInNvdXJjZXMiOlsicG93ZXJzaGVsbFRvb2xVc2VPcHRpb25zLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQT1dFUlNIRUxMX1RPT0xfTkFNRSB9IGZyb20gJy4uLy4uLy4uL3Rvb2xzL1Bvd2VyU2hlbGxUb29sL3Rvb2xOYW1lLmpzJ1xuaW1wb3J0IHR5cGUgeyBQZXJtaXNzaW9uVXBkYXRlIH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvcGVybWlzc2lvbnMvUGVybWlzc2lvblVwZGF0ZVNjaGVtYS5qcydcbmltcG9ydCB7IHNob3VsZFNob3dBbHdheXNBbGxvd09wdGlvbnMgfSBmcm9tICcuLi8uLi8uLi91dGlscy9wZXJtaXNzaW9ucy9wZXJtaXNzaW9uc0xvYWRlci5qcydcbmltcG9ydCB0eXBlIHsgT3B0aW9uV2l0aERlc2NyaXB0aW9uIH0gZnJvbSAnLi4vLi4vQ3VzdG9tU2VsZWN0L3NlbGVjdC5qcydcbmltcG9ydCB7IGdlbmVyYXRlU2hlbGxTdWdnZXN0aW9uc0xhYmVsIH0gZnJvbSAnLi4vc2hlbGxQZXJtaXNzaW9uSGVscGVycy5qcydcblxuZXhwb3J0IHR5cGUgUG93ZXJTaGVsbFRvb2xVc2VPcHRpb24gPVxuICB8ICd5ZXMnXG4gIHwgJ3llcy1hcHBseS1zdWdnZXN0aW9ucydcbiAgfCAneWVzLXByZWZpeC1lZGl0ZWQnXG4gIHwgJ25vJ1xuXG5leHBvcnQgZnVuY3Rpb24gcG93ZXJzaGVsbFRvb2xVc2VPcHRpb25zKHtcbiAgc3VnZ2VzdGlvbnMgPSBbXSxcbiAgb25SZWplY3RGZWVkYmFja0NoYW5nZSxcbiAgb25BY2NlcHRGZWVkYmFja0NoYW5nZSxcbiAgeWVzSW5wdXRNb2RlID0gZmFsc2UsXG4gIG5vSW5wdXRNb2RlID0gZmFsc2UsXG4gIGVkaXRhYmxlUHJlZml4LFxuICBvbkVkaXRhYmxlUHJlZml4Q2hhbmdlLFxufToge1xuICBzdWdnZXN0aW9ucz86IFBlcm1pc3Npb25VcGRhdGVbXVxuICBvblJlamVjdEZlZWRiYWNrQ2hhbmdlOiAodmFsdWU6IHN0cmluZykgPT4gdm9pZFxuICBvbkFjY2VwdEZlZWRiYWNrQ2hhbmdlOiAodmFsdWU6IHN0cmluZykgPT4gdm9pZFxuICB5ZXNJbnB1dE1vZGU/OiBib29sZWFuXG4gIG5vSW5wdXRNb2RlPzogYm9vbGVhblxuICBlZGl0YWJsZVByZWZpeD86IHN0cmluZ1xuICBvbkVkaXRhYmxlUHJlZml4Q2hhbmdlPzogKHZhbHVlOiBzdHJpbmcpID0+IHZvaWRcbn0pOiBPcHRpb25XaXRoRGVzY3JpcHRpb248UG93ZXJTaGVsbFRvb2xVc2VPcHRpb24+W10ge1xuICBjb25zdCBvcHRpb25zOiBPcHRpb25XaXRoRGVzY3JpcHRpb248UG93ZXJTaGVsbFRvb2xVc2VPcHRpb24+W10gPSBbXVxuXG4gIGlmICh5ZXNJbnB1dE1vZGUpIHtcbiAgICBvcHRpb25zLnB1c2goe1xuICAgICAgdHlwZTogJ2lucHV0JyxcbiAgICAgIGxhYmVsOiAnWWVzJyxcbiAgICAgIHZhbHVlOiAneWVzJyxcbiAgICAgIHBsYWNlaG9sZGVyOiAnYW5kIHRlbGwgQ2xhdWRlIHdoYXQgdG8gZG8gbmV4dCcsXG4gICAgICBvbkNoYW5nZTogb25BY2NlcHRGZWVkYmFja0NoYW5nZSxcbiAgICAgIGFsbG93RW1wdHlTdWJtaXRUb0NhbmNlbDogdHJ1ZSxcbiAgICB9KVxuICB9IGVsc2Uge1xuICAgIG9wdGlvbnMucHVzaCh7XG4gICAgICBsYWJlbDogJ1llcycsXG4gICAgICB2YWx1ZTogJ3llcycsXG4gICAgfSlcbiAgfVxuXG4gIC8vIE5vdGU6IE5vIHNhbmRib3ggdG9nZ2xlIGZvciBQb3dlclNoZWxsIC0gc2FuZGJveCBpcyBub3Qgc3VwcG9ydGVkIG9uIFdpbmRvd3NcbiAgLy8gTm90ZTogTm8gY2xhc3NpZmllci1yZXZpZXdlZCBvcHRpb24gZm9yIFBvd2VyU2hlbGwgKEFOVC1PTkxZIGZlYXR1cmUgZm9yIEJhc2gpXG5cbiAgLy8gT25seSBzaG93IFwiYWx3YXlzIGFsbG93XCIgb3B0aW9ucyB3aGVuIG5vdCByZXN0cmljdGVkIGJ5IGFsbG93TWFuYWdlZFBlcm1pc3Npb25SdWxlc09ubHkuXG4gIC8vIFByZWZlciB0aGUgZWRpdGFibGUgcHJlZml4IGlucHV0IChzdGF0aWMgZXh0cmFjdG9yICsgdXNlciBlZGl0cykgb3ZlciB0aGVcbiAgLy8gbm9uLWVkaXRhYmxlIHN1Z2dlc3Rpb25zIGxhYmVsLiBUaGUgZWRpdGFibGUgaW5wdXQgY2FuJ3QgcmVwcmVzZW50XG4gIC8vIGRpcmVjdG9yeSBwZXJtaXNzaW9ucyBvciBSZWFkLXRvb2wgcnVsZXMsIHNvIGZhbGwgYmFjayB0byB0aGUgbGFiZWwgd2hlblxuICAvLyB0aG9zZSBhcmUgcHJlc2VudC5cbiAgaWYgKHNob3VsZFNob3dBbHdheXNBbGxvd09wdGlvbnMoKSAmJiBzdWdnZXN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgaGFzTm9uUG93ZXJTaGVsbFN1Z2dlc3Rpb25zID0gc3VnZ2VzdGlvbnMuc29tZShcbiAgICAgIHMgPT5cbiAgICAgICAgcy50eXBlID09PSAnYWRkRGlyZWN0b3JpZXMnIHx8XG4gICAgICAgIChzLnR5cGUgPT09ICdhZGRSdWxlcycgJiZcbiAgICAgICAgICBzLnJ1bGVzPy5zb21lKHIgPT4gci50b29sTmFtZSAhPT0gUE9XRVJTSEVMTF9UT09MX05BTUUpKSxcbiAgICApXG4gICAgaWYgKFxuICAgICAgZWRpdGFibGVQcmVmaXggIT09IHVuZGVmaW5lZCAmJlxuICA
|