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[] { const options: OptionWithDescription[] = []; 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 (internal-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; }