import { type BusinessArgumentHintTemplate, type MCPHintTranslator, type MCPBusinessArgumentHintCategory, hasDockerImageArg, hasPackageLikeArg, localizeBusinessArgumentHintTemplate, normalizeFlagName, resolveBusinessArgumentHintTemplate, sanitizeFlagForDisplay, translateMCPHintCopy, toTrimmedString, } from './mcpArgumentHints'; export interface MCPArgumentDetailHint { key: string; argument: string; category: MCPBusinessArgumentHintCategory; label: string; detail: string; valueHint: string; sensitive: boolean; } const VALUE_ARG_FLAGS = new Set([ 'api-key', 'token', 'access-token', 'password', 'secret', 'config', 'config-file', 'c', 'directory', 'dir', 'root', 'workspace', 'path', 'url', 'endpoint', 'base-url', 'host', 'port', 'transport', 'mode', 'profile', 'tenant', 'project', 'account', 'executable-path', 'repo', 'e', 'env', 'name', 'network', 'v', 'volume', 'p', 'publish', 'entrypoint', 'w', 'workdir', 'u', 'user', 'platform', 'h', 'hostname', ]); const flagExpectsValue = (flag: string): boolean => VALUE_ARG_FLAGS.has(flag); const fallbackArgumentHint = (flag: string): BusinessArgumentHintTemplate => ({ category: 'generic', label: 'Unrecognized argument', detail: `GoNavi cannot infer the business meaning of --${flag} from the argument name, but it will pass it to the MCP process in the current order.`, valueHint: 'Check the MCP README to confirm whether this argument needs a value; if it does, put the value as the next argument tag or use --name=value.', sensitive: false, labelKey: 'ai_settings.mcp_server.argument_hints.generic.label', detailKey: 'ai_settings.mcp_server.argument_hints.generic.detail', valueHintKey: 'ai_settings.mcp_server.argument_hints.generic.value_hint', params: { flag }, }); const sanitizeArgumentValueForDisplay = ( value: string, sensitive = false, translate?: MCPHintTranslator, ): string => { const text = toTrimmedString(value); if (!text) return ''; if (sensitive) { return translateMCPHintCopy(translate, 'ai_settings.mcp_server.argument_hints.hidden_value', ''); } if (/^(.{0,24})=(.*)$/u.test(text) && /(token|api[-_]?key|secret|password|credential)/iu.test(text.split('=')[0])) { return `${text.split('=')[0]}=${translateMCPHintCopy(translate, 'ai_settings.mcp_server.argument_hints.hidden_value', '')}`; } if (/(sk-[a-z0-9_-]{8,}|ghp_[a-z0-9_]{8,}|xox[baprs]-[a-z0-9-]{8,})/iu.test(text)) { return translateMCPHintCopy(translate, 'ai_settings.mcp_server.argument_hints.possible_secret_hidden', '