use std::collections::HashSet;
#[derive(Clone, Debug)]
pub struct CommandDetectionConfig {
pub dom_exclusions: HashSet<String>,
pub non_invoke_exclusions: HashSet<String>,
pub invalid_command_names: HashSet<String>,
}
pub(super) const DOM_EXCLUSIONS: &[&str] = &[
"execCommand",
"queryCommandState",
"queryCommandEnabled",
"queryCommandSupported",
"queryCommandValue",
];
pub(super) const NON_INVOKE_EXCLUSIONS: &[&str] = &[
"useVoiceCommands",
"useAssistantToolCommands",
"useNewVisitVoiceCommands",
"useAiTopicCommands",
"registerCommand",
"registerTextEditorCommand",
"runGitCommand",
"executeCommand",
"buildCommandString",
"buildCommandArgs",
"classifyCommand",
"onCommandContext",
"enqueueCommandContext",
"setLastCommand",
"setCommandError",
"recordCommandInvokeStart",
"recordCommandInvokeFinish",
"handleInvokeFailure",
"isCommandMissingError",
"isRetentionCommandMissing",
"collectInvokeCommands",
"collectUsedCommandsFromRoamLogs",
"extractInvokeCommandsFromText",
"scanCommandsInFiles",
"parseBackendCommands",
"buildSessionCommandPayload",
"onMentionCommand",
"onSlashCommand",
"invokeFallbackMock",
"resolveMockCommand",
];
pub(super) const INVALID_COMMAND_NAMES: &[&str] = &[
"node", "npm", "pnpm", "yarn", "bun", "cargo", "rustc", "rustup", "git", "gh", "python",
"python3", "pip", "brew", "apt", "yum", "sh", "bash", "zsh", "curl", "wget", "docker",
"kubectl", "test", "mock", "stub", "fake",
];
impl CommandDetectionConfig {
pub fn new(
dom_exclusions: &[String],
non_invoke_exclusions: &[String],
invalid_command_names: &[String],
) -> Self {
let mut dom: HashSet<String> = DOM_EXCLUSIONS.iter().map(|s| s.to_string()).collect();
dom.extend(dom_exclusions.iter().cloned());
let mut non_invoke: HashSet<String> = NON_INVOKE_EXCLUSIONS
.iter()
.map(|s| s.to_string())
.collect();
non_invoke.extend(non_invoke_exclusions.iter().cloned());
let mut invalid: HashSet<String> = INVALID_COMMAND_NAMES
.iter()
.map(|s| s.to_string())
.collect();
invalid.extend(invalid_command_names.iter().cloned());
Self {
dom_exclusions: dom,
non_invoke_exclusions: non_invoke,
invalid_command_names: invalid,
}
}
}
impl Default for CommandDetectionConfig {
fn default() -> Self {
Self::new(&[], &[], &[])
}
}