codetether_rlm/
capability.rs1use std::collections::HashSet;
8
9#[derive(Debug, Clone, Copy, PartialEq, Eq)]
11pub enum OutputCapability {
12 BulkSummarizable,
15 ExactContent,
17 Unknown,
19}
20
21pub(super) fn rlm_eligible_tools() -> &'static HashSet<&'static str> {
23 static TOOLS: std::sync::OnceLock<HashSet<&'static str>> = std::sync::OnceLock::new();
24 TOOLS.get_or_init(|| ["webfetch", "websearch", "batch"].into_iter().collect())
25}
26
27fn rlm_exact_content_tools() -> &'static HashSet<&'static str> {
29 static TOOLS: std::sync::OnceLock<HashSet<&'static str>> = std::sync::OnceLock::new();
30 TOOLS.get_or_init(|| {
31 [
32 "read",
33 "grep",
34 "bash",
35 "glob",
36 "ls",
37 "edit",
38 "write",
39 "session_recall",
40 "notebook_read",
41 "notebook_edit",
42 ]
43 .into_iter()
44 .collect()
45 })
46}
47
48pub fn output_capability(tool_id: &str) -> OutputCapability {
51 if tool_id == "session_context" || rlm_eligible_tools().contains(tool_id) {
52 OutputCapability::BulkSummarizable
53 } else if rlm_exact_content_tools().contains(tool_id) {
54 OutputCapability::ExactContent
55 } else {
56 OutputCapability::Unknown
57 }
58}
59
60#[cfg(test)]
61mod tests {
62 use super::{OutputCapability, output_capability};
63
64 #[test]
65 fn classifies_known_tools() {
66 assert_eq!(
67 output_capability("webfetch"),
68 OutputCapability::BulkSummarizable
69 );
70 assert_eq!(
71 output_capability("session_context"),
72 OutputCapability::BulkSummarizable
73 );
74 assert_eq!(output_capability("read"), OutputCapability::ExactContent);
75 assert_eq!(output_capability("bash"), OutputCapability::ExactContent);
76 assert_eq!(
77 output_capability("session_recall"),
78 OutputCapability::ExactContent
79 );
80 assert_eq!(
81 output_capability("brand_new_tool"),
82 OutputCapability::Unknown
83 );
84 }
85}