SYMBOL INDEX (11958 symbols across 382 files) FILE: .claude/skills/skill-creator/eval-viewer/generate_review.py function get_mime_type (line 52) | def get_mime_type(path: Path) -> str: function find_runs (line 60) | def find_runs(workspace: Path) -> list[dict]: function _find_runs_recursive (line 68) | def _find_runs_recursive(root: Path, current: Path, runs: list[dict]) ->... function build_run (line 85) | def build_run(root: Path, run_dir: Path) -> dict | None: function embed_file (line 149) | def embed_file(path: Path) -> dict: function load_previous_iteration (line 213) | def load_previous_iteration(workspace: Path) -> dict[str, dict]: function generate_html (line 250) | def generate_html( function _kill_port (line 288) | def _kill_port(port: int) -> None: class ReviewHandler (line 308) | class ReviewHandler(BaseHTTPRequestHandler): method __init__ (line 315) | def __init__( method do_GET (line 332) | def do_GET(self) -> None: method do_POST (line 361) | def do_POST(self) -> None: method log_message (line 382) | def log_message(self, format: str, *args: object) -> None: function main (line 387) | def main() -> None: FILE: .claude/skills/skill-creator/scripts/aggregate_benchmark.py function calculate_stats (line 45) | def calculate_stats(values: list[float]) -> dict: function load_run_results (line 67) | def load_run_results(benchmark_dir: Path) -> dict: function aggregate_results (line 176) | def aggregate_results(results: dict) -> dict: function generate_benchmark (line 227) | def generate_benchmark(benchmark_dir: Path, skill_name: str = "", skill_... function generate_markdown (line 281) | def generate_markdown(benchmark: dict) -> str: function main (line 338) | def main(): FILE: .claude/skills/skill-creator/scripts/generate_report.py function generate_html (line 16) | def generate_html(data: dict, auto_refresh: bool = False, skill_name: st... function main (line 304) | def main(): FILE: .claude/skills/skill-creator/scripts/improve_description.py function _call_claude (line 20) | def _call_claude(prompt: str, model: str | None, timeout: int = 300) -> ... function improve_description (line 50) | def improve_description( function main (line 194) | def main(): FILE: .claude/skills/skill-creator/scripts/package_skill.py function should_exclude (line 27) | def should_exclude(rel_path: Path) -> bool: function package_skill (line 42) | def package_skill(skill_path, output_dir=None): function main (line 111) | def main(): FILE: .claude/skills/skill-creator/scripts/quick_validate.py function validate_skill (line 12) | def validate_skill(skill_path): FILE: .claude/skills/skill-creator/scripts/run_eval.py function find_project_root (line 22) | def find_project_root() -> Path: function run_single_query (line 35) | def run_single_query( function run_eval (line 184) | def run_eval( function main (line 259) | def main(): FILE: .claude/skills/skill-creator/scripts/run_loop.py function split_eval_set (line 24) | def split_eval_set(eval_set: list[dict], holdout: float, seed: int = 42)... function run_loop (line 47) | def run_loop( function main (line 244) | def main(): FILE: .claude/skills/skill-creator/scripts/utils.py function parse_skill_md (line 7) | def parse_skill_md(skill_path: Path) -> tuple[str, str, str]: FILE: benches/agent_benchmarks.rs type BenchProvider (line 32) | struct BenchProvider { method text_only (line 37) | fn text_only(text: &str) -> Self { method with_tool_then_text (line 48) | fn with_tool_then_text() -> Self { method chat_with_system (line 74) | async fn chat_with_system( method chat (line 84) | async fn chat( type NoopTool (line 103) | struct NoopTool; method name (line 107) | fn name(&self) -> &str { method description (line 110) | fn description(&self) -> &str { method parameters_schema (line 113) | fn parameters_schema(&self) -> serde_json::Value { method execute (line 116) | async fn execute(&self, _args: serde_json::Value) -> Result { function make_memory (line 125) | fn make_memory() -> Arc { function make_sqlite_memory (line 133) | fn make_sqlite_memory(dir: &std::path::Path) -> Arc { function make_observer (line 141) | fn make_observer() -> Arc { function bench_xml_parsing (line 149) | fn bench_xml_parsing(c: &mut Criterion) { function bench_native_parsing (line 197) | fn bench_native_parsing(c: &mut Criterion) { function bench_memory_operations (line 227) | fn bench_memory_operations(c: &mut Criterion) { function bench_agent_turn (line 282) | fn bench_agent_turn(c: &mut Criterion) { FILE: build.rs function main (line 6) | fn main() { function web_build_required (line 90) | fn web_build_required(web_dir: &Path, dist_dir: &Path) -> bool { function latest_modified (line 111) | fn latest_modified(path: &Path) -> Option { function ensure_dist_dir (line 135) | fn ensure_dist_dir(dist_dir: &Path) { function ensure_dashboard_assets (line 141) | fn ensure_dashboard_assets(dist_dir: &Path) { function which_npm (line 160) | fn which_npm() -> Result { FILE: crates/robot-kit/src/config.rs type RobotConfig (line 8) | pub struct RobotConfig { method load (line 206) | pub fn load(path: &std::path::Path) -> anyhow::Result { method save (line 212) | pub fn save(&self, path: &std::path::Path) -> anyhow::Result<()> { type DriveConfig (line 26) | pub struct DriveConfig { type CameraConfig (line 44) | pub struct CameraConfig { type AudioConfig (line 60) | pub struct AudioConfig { type SensorConfig (line 81) | pub struct SensorConfig { type SafetyConfig (line 96) | pub struct SafetyConfig { method default (line 157) | fn default() -> Self { FILE: crates/robot-kit/src/drive.rs type DriveBackend (line 20) | trait DriveBackend: Send + Sync { method move_robot (line 21) | async fn move_robot( method stop (line 28) | async fn stop(&self) -> Result<()>; method get_odometry (line 30) | async fn get_odometry(&self) -> Result<(f64, f64, f64)>; method move_robot (line 38) | async fn move_robot( method stop (line 56) | async fn stop(&self) -> Result<()> { method get_odometry (line 61) | async fn get_odometry(&self) -> Result<(f64, f64, f64)> { method move_robot (line 73) | async fn move_robot( method stop (line 113) | async fn stop(&self) -> Result<()> { method get_odometry (line 129) | async fn get_odometry(&self) -> Result<(f64, f64, f64)> { method move_robot (line 142) | async fn move_robot( method stop (line 171) | async fn stop(&self) -> Result<()> { method get_odometry (line 175) | async fn get_odometry(&self) -> Result<(f64, f64, f64)> { type MockDrive (line 34) | struct MockDrive; type Ros2Drive (line 67) | struct Ros2Drive { type SerialDrive (line 136) | struct SerialDrive { type DriveTool (line 181) | pub struct DriveTool { method new (line 188) | pub fn new(config: RobotConfig) -> Self { method name (line 210) | fn name(&self) -> &str { method description (line 214) | fn description(&self) -> &str { method parameters_schema (line 219) | fn parameters_schema(&self) -> Value { method execute (line 253) | async fn execute(&self, args: Value) -> Result { function drive_tool_name (line 391) | fn drive_tool_name() { function drive_tool_schema_has_action (line 397) | fn drive_tool_schema_has_action() { function drive_forward_mock (line 404) | async fn drive_forward_mock() { function drive_stop (line 415) | async fn drive_stop() { function drive_unknown_action (line 423) | async fn drive_unknown_action() { FILE: crates/robot-kit/src/emote.rs type Expression (line 15) | pub enum Expression { method from_str (line 29) | fn from_str(s: &str) -> Option { method pattern (line 47) | fn pattern(&self) -> Vec<(u8, u8, u8)> { type EmoteTool (line 117) | pub struct EmoteTool { method new (line 124) | pub fn new(config: RobotConfig) -> Self { method set_expression (line 133) | async fn set_expression(&self, expr: Expression) -> Result<()> { method play_emotion_sound (line 164) | async fn play_emotion_sound(&self, emotion: &str) -> Result<()> { method animate (line 181) | async fn animate(&self, animation: &str) -> Result<()> { method name (line 217) | fn name(&self) -> &str { method description (line 221) | fn description(&self) -> &str { method parameters_schema (line 227) | fn parameters_schema(&self) -> Value { method execute (line 254) | async fn execute(&self, args: Value) -> Result { function emote_tool_name (line 296) | fn emote_tool_name() { function expression_parsing (line 302) | fn expression_parsing() { function expression_pattern_size (line 309) | fn expression_pattern_size() { function emote_happy (line 315) | async fn emote_happy() { FILE: crates/robot-kit/src/lib.rs constant VERSION (line 121) | pub const VERSION: &str = env!("CARGO_PKG_VERSION"); function create_tools (line 126) | pub fn create_tools(config: &RobotConfig) -> Vec> { function create_safe_tools (line 139) | pub fn create_safe_tools( FILE: crates/robot-kit/src/listen.rs type ListenTool (line 13) | pub struct ListenTool { method new (line 19) | pub fn new(config: RobotConfig) -> Self { method record_audio (line 33) | async fn record_audio(&self, duration_secs: u64) -> Result { method transcribe (line 70) | async fn transcribe(&self, audio_path: &Path) -> Result { method name (line 119) | fn name(&self) -> &str { method description (line 123) | fn description(&self) -> &str { method parameters_schema (line 128) | fn parameters_schema(&self) -> Value { method execute (line 146) | async fn execute(&self, args: Value) -> Result { function listen_tool_name (line 197) | fn listen_tool_name() { function listen_tool_schema (line 203) | fn listen_tool_schema() { FILE: crates/robot-kit/src/look.rs type LookTool (line 13) | pub struct LookTool { method new (line 19) | pub fn new(config: RobotConfig) -> Self { method capture_image (line 34) | async fn capture_image(&self) -> Result { method describe_image (line 88) | async fn describe_image(&self, image_path: &PathBuf, prompt: &str) -> ... method name (line 129) | fn name(&self) -> &str { method description (line 133) | fn description(&self) -> &str { method parameters_schema (line 138) | fn parameters_schema(&self) -> Value { method execute (line 156) | async fn execute(&self, args: Value) -> Result { function look_tool_name (line 239) | fn look_tool_name() { function look_tool_schema (line 245) | fn look_tool_schema() { FILE: crates/robot-kit/src/safety.rs type SafetyEvent (line 30) | pub enum SafetyEvent { type SafetyState (line 48) | pub struct SafetyState { method default (line 64) | fn default() -> Self { type SafetyMonitor (line 77) | pub struct SafetyMonitor { method new (line 85) | pub fn new(config: SafetyConfig) -> (Self, broadcast::Receiver Arc { method subscribe (line 100) | pub fn subscribe(&self) -> broadcast::Receiver { method can_move (line 105) | pub async fn can_move(&self) -> bool { method speed_limit (line 113) | pub async fn speed_limit(&self) -> f64 { method request_movement (line 118) | pub async fn request_movement(&self, direction: &str, distance: f64) -... method calculate_speed_limit (line 178) | async fn calculate_speed_limit(&self, obstacle_distance: f64) -> f64 { method emergency_stop (line 196) | pub async fn emergency_stop(&self, reason: &str) { method reset_estop (line 208) | pub async fn reset_estop(&self) { method update_obstacle_distance (line 218) | pub async fn update_obstacle_distance(&self, distance: f64, angle: u16) { method bump_detected (line 246) | pub async fn bump_detected(&self, sensor: &str) { method shutdown (line 273) | pub fn shutdown(&self) { method run (line 278) | pub async fn run(&self, mut sensor_rx: tokio::sync::mpsc::Receiver, safety: Arc &str { method description (line 363) | fn description(&self) -> &str { method parameters_schema (line 367) | fn parameters_schema(&self) -> serde_json::Value { method execute (line 371) | async fn execute(&self, args: serde_json::Value) -> Result { function preflight_check (line 409) | pub async fn preflight_check(config: &RobotConfig) -> Result> { function safety_state_defaults (line 445) | async fn safety_state_defaults() { function safety_monitor_blocks_on_obstacle (line 452) | async fn safety_monitor_blocks_on_obstacle() { function safety_monitor_estop (line 468) | async fn safety_monitor_estop() { function speed_limit_calculation (line 483) | async fn speed_limit_calculation() { function request_movement_blocked (line 505) | async fn request_movement_blocked() { method default (line 521) | fn default() -> Self { FILE: crates/robot-kit/src/sense.rs type LidarScan (line 16) | pub struct LidarScan { type MotionResult (line 27) | pub struct MotionResult { type SenseTool (line 32) | pub struct SenseTool { method new (line 38) | pub fn new(config: RobotConfig) -> Self { method scan_lidar (line 46) | async fn scan_lidar(&self) -> Result { method scan_mock (line 55) | async fn scan_mock(&self) -> Result { method scan_rplidar (line 92) | async fn scan_rplidar(&self) -> Result { method scan_ros2 (line 143) | async fn scan_ros2(&self) -> Result { method check_motion (line 183) | async fn check_motion(&self) -> Result { method check_distance (line 207) | async fn check_distance(&self) -> Result { method name (line 239) | fn name(&self) -> &str { method description (line 243) | fn description(&self) -> &str { method parameters_schema (line 249) | fn parameters_schema(&self) -> Value { method execute (line 268) | async fn execute(&self, args: Value) -> Result { function sense_tool_name (line 432) | fn sense_tool_name() { function sense_scan_mock (line 438) | async fn sense_scan_mock() { function sense_clear_ahead (line 449) | async fn sense_clear_ahead() { FILE: crates/robot-kit/src/speak.rs type SpeakTool (line 13) | pub struct SpeakTool { method new (line 19) | pub fn new(config: RobotConfig) -> Self { method speak (line 30) | async fn speak(&self, text: &str, emotion: &str) -> Result<()> { method play_sound (line 101) | async fn play_sound(&self, sound: &str) -> Result<()> { method name (line 128) | fn name(&self) -> &str { method description (line 132) | fn description(&self) -> &str { method parameters_schema (line 137) | fn parameters_schema(&self) -> Value { method execute (line 158) | async fn execute(&self, args: Value) -> Result { function speak_tool_name (line 219) | fn speak_tool_name() { function speak_tool_schema (line 225) | fn speak_tool_schema() { FILE: crates/robot-kit/src/tests.rs function all_tools_have_valid_names (line 20) | fn all_tools_have_valid_names() { function all_tools_have_descriptions (line 42) | fn all_tools_have_descriptions() { function all_tools_have_valid_schemas (line 63) | fn all_tools_have_valid_schemas() { function drive_forward_mock (line 94) | async fn drive_forward_mock() { function drive_stop_always_succeeds (line 108) | async fn drive_stop_always_succeeds() { function drive_strafe_left (line 119) | async fn drive_strafe_left() { function drive_rotate (line 132) | async fn drive_rotate() { function drive_invalid_action_fails (line 145) | async fn drive_invalid_action_fails() { function drive_missing_action_fails (line 156) | async fn drive_missing_action_fails() { function drive_speed_clamped (line 166) | async fn drive_speed_clamped() { function sense_scan_returns_distances (line 184) | async fn sense_scan_returns_distances() { function sense_clear_ahead_check (line 200) | async fn sense_clear_ahead_check() { function sense_motion_detection (line 215) | async fn sense_motion_detection() { function emote_happy (line 229) | async fn emote_happy() { function emote_all_expressions_valid (line 242) | async fn emote_all_expressions_valid() { function emote_invalid_expression_fails (line 270) | async fn emote_invalid_expression_fails() { function config_default_is_safe (line 284) | fn config_default_is_safe() { function config_serializes_to_toml (line 295) | fn config_serializes_to_toml() { function config_roundtrips (line 303) | fn config_roundtrips() { function test_safety_config (line 323) | fn test_safety_config() -> SafetyConfig { function safety_initially_allows_movement (line 340) | async fn safety_initially_allows_movement() { function safety_blocks_on_close_obstacle (line 348) | async fn safety_blocks_on_close_obstacle() { function safety_allows_after_obstacle_clears (line 359) | async fn safety_allows_after_obstacle_clears() { function safety_estop_blocks_everything (line 373) | async fn safety_estop_blocks_everything() { function safety_estop_reset (line 388) | async fn safety_estop_reset() { function safety_speed_limit_far (line 400) | async fn safety_speed_limit_far() { function safety_speed_limit_approaching (line 412) | async fn safety_speed_limit_approaching() { function safety_movement_request_approved (line 425) | async fn safety_movement_request_approved() { function safety_movement_request_denied_close (line 437) | async fn safety_movement_request_denied_close() { function safety_bump_triggers_stop (line 449) | async fn safety_bump_triggers_stop() { function drive_then_sense_workflow (line 470) | async fn drive_then_sense_workflow() { function create_tools_returns_all_tools (line 500) | async fn create_tools_returns_all_tools() { function safe_drive_blocks_on_obstacle (line 517) | async fn safe_drive_blocks_on_obstacle() { FILE: crates/robot-kit/src/traits.rs type ToolResult (line 12) | pub struct ToolResult { method success (line 23) | pub fn success(output: impl Into) -> Self { method error (line 32) | pub fn error(error: impl Into) -> Self { method partial (line 41) | pub fn partial(output: impl Into, error: impl Into) ->... type ToolSpec (line 52) | pub struct ToolSpec { type Tool (line 98) | pub trait Tool: Send + Sync { method name (line 100) | fn name(&self) -> &str; method description (line 103) | fn description(&self) -> &str; method parameters_schema (line 108) | fn parameters_schema(&self) -> Value; method execute (line 113) | async fn execute(&self, args: Value) -> anyhow::Result; method spec (line 116) | fn spec(&self) -> ToolSpec { FILE: example-plugin/src/lib.rs type WeatherInput (line 10) | struct WeatherInput { type WeatherOutput (line 15) | struct WeatherOutput { function get_weather (line 25) | pub fn get_weather(input: String) -> FnResult { FILE: firmware/esp32-ui/build.rs function main (line 3) | fn main() { FILE: firmware/esp32-ui/src/main.rs function main (line 12) | fn main() -> anyhow::Result<()> { FILE: firmware/esp32/build.rs function main (line 1) | fn main() { FILE: firmware/esp32/src/main.rs type Request (line 17) | struct Request { type Response (line 25) | struct Response { function main (line 33) | fn main() -> anyhow::Result<()> { function handle_request (line 89) | fn handle_request( function gpio_read (line 140) | fn gpio_read(_pin: i32) -> anyhow::Result { function gpio_write (line 145) | fn gpio_write( FILE: firmware/nucleo/src/main.rs constant LED_PIN (line 21) | const LED_PIN: u8 = 13; function parse_arg (line 24) | fn parse_arg(line: &[u8], key: &[u8]) -> Option { function has_cmd (line 65) | fn has_cmd(line: &[u8], cmd: &[u8]) -> bool { function copy_id (line 86) | fn copy_id(line: &[u8], out: &mut [u8]) -> usize { function main (line 108) | async fn main(_spawner: Spawner) { FILE: firmware/uno-q-bridge/python/main.py function handle_client (line 10) | def handle_client(conn): function accept_loop (line 41) | def accept_loop(server): function loop (line 51) | def loop(): function main (line 54) | def main(): FILE: python/tests/test_tools.py function test_import_main (line 8) | def test_import_main(): function test_import_tool_decorator (line 18) | def test_import_tool_decorator(): function test_tool_decorator_custom_metadata (line 30) | def test_tool_decorator_custom_metadata(): function test_agent_creation (line 42) | def test_agent_creation(): function test_cli_allows_interactive_without_message (line 54) | def test_cli_allows_interactive_without_message(): function test_cli_requires_message_when_not_interactive (line 64) | def test_cli_requires_message_when_not_interactive(): function test_invoke_in_event_loop_raises (line 73) | async def test_invoke_in_event_loop_raises(): function test_shell_tool (line 84) | async def test_shell_tool(): function test_file_tools (line 93) | async def test_file_tools(tmp_path): FILE: python/zeroclaw_tools/__main__.py function chat (line 29) | async def chat(message: str, api_key: str, base_url: Optional[str], mode... function _build_parser (line 43) | def _build_parser() -> argparse.ArgumentParser: function parse_args (line 60) | def parse_args(argv: list[str] | None = None) -> argparse.Namespace: function main (line 71) | def main(argv: list[str] | None = None): FILE: python/zeroclaw_tools/agent.py class ZeroclawAgent (line 20) | class ZeroclawAgent: method __init__ (line 29) | def __init__( method _build_graph (line 63) | def _build_graph(self) -> StateGraph: method ainvoke (line 87) | async def ainvoke(self, input: dict[str, Any], config: Optional[dict] ... method invoke (line 106) | def invoke(self, input: dict[str, Any], config: Optional[dict] = None)... function create_agent (line 123) | def create_agent( FILE: python/zeroclaw_tools/integrations/discord_bot.py class DiscordBot (line 22) | class DiscordBot: method __init__ (line 42) | def __init__( method _setup_events (line 88) | def _setup_events(self): method _process_message (line 128) | async def _process_message(self, content: str, user_id: str) -> str: method _split_message (line 153) | def _split_message(text: str, max_len: int = 1900) -> list[str]: method run (line 175) | def run(self): FILE: python/zeroclaw_tools/tools/base.py function tool (line 10) | def tool( FILE: python/zeroclaw_tools/tools/file.py function file_read (line 14) | def file_read(path: str) -> str: function file_write (line 39) | def file_write(path: str, content: str) -> str: FILE: python/zeroclaw_tools/tools/memory.py function _get_memory_path (line 11) | def _get_memory_path() -> Path: function _load_memory (line 16) | def _load_memory() -> dict: function _save_memory (line 28) | def _save_memory(data: dict) -> None: function memory_store (line 37) | def memory_store(key: str, value: str) -> str: function memory_recall (line 58) | def memory_recall(query: str) -> str: FILE: python/zeroclaw_tools/tools/shell.py function shell (line 11) | def shell(command: str) -> str: FILE: python/zeroclaw_tools/tools/web.py function http_request (line 15) | def http_request(url: str, method: str = "GET", headers: str = "", body:... function web_search (line 50) | def web_search(query: str) -> str: FILE: scripts/ci/collect_changed_links.py function run_git (line 20) | def run_git(args: list[str]) -> subprocess.CompletedProcess[str]: function commit_exists (line 24) | def commit_exists(rev: str) -> bool: function normalize_docs_files (line 30) | def normalize_docs_files(raw: str) -> list[str]: function infer_base_sha (line 41) | def infer_base_sha(provided: str) -> str: function infer_docs_files (line 51) | def infer_docs_files(base_sha: str, provided: list[str]) -> list[str]: function normalize_link_target (line 67) | def normalize_link_target(raw_target: str, source_path: str) -> str | None: function extract_links (line 105) | def extract_links(text: str, source_path: str) -> list[str]: function added_lines_for_file (line 126) | def added_lines_for_file(base_sha: str, path: str) -> list[str]: function main (line 143) | def main() -> int: FILE: scripts/ci/fetch_actions_data.py function parse_args (line 22) | def parse_args(): function fetch_runs (line 47) | def fetch_runs(repo, date_str, page=1, per_page=100): function fetch_jobs (line 60) | def fetch_jobs(repo, run_id): function parse_duration (line 70) | def parse_duration(started, completed): function main (line 82) | def main(): FILE: src/agent/agent.rs type Agent (line 20) | pub struct Agent { method builder (line 286) | pub fn builder() -> AgentBuilder { method history (line 290) | pub fn history(&self) -> &[ConversationMessage] { method clear_history (line 294) | pub fn clear_history(&mut self) { method set_memory_session_id (line 298) | pub fn set_memory_session_id(&mut self, session_id: Option) { method seed_history (line 307) | pub fn seed_history(&mut self, messages: &[ChatMessage]) { method from_config (line 321) | pub fn from_config(config: &Config) -> Result { method trim_history (line 444) | fn trim_history(&mut self) { method build_system_prompt (line 471) | fn build_system_prompt(&self) -> Result { method execute_tool_call (line 487) | async fn execute_tool_call(&self, call: &ParsedToolCall) -> ToolExecut... method execute_tools (line 525) | async fn execute_tools(&self, calls: &[ParsedToolCall]) -> Vec String { method turn (line 565) | pub async fn turn(&mut self, user_message: &str) -> Result { method run_single (line 726) | pub async fn run_single(&mut self, message: &str) -> Result { method run_interactive (line 730) | pub async fn run_interactive(&mut self) -> Result<()> { type AgentBuilder (line 50) | pub struct AgentBuilder { method new (line 77) | pub fn new() -> Self { method provider (line 105) | pub fn provider(mut self, provider: Box) -> Self { method tools (line 110) | pub fn tools(mut self, tools: Vec>) -> Self { method memory (line 115) | pub fn memory(mut self, memory: Arc) -> Self { method observer (line 120) | pub fn observer(mut self, observer: Arc) -> Self { method prompt_builder (line 125) | pub fn prompt_builder(mut self, prompt_builder: SystemPromptBuilder) -... method tool_dispatcher (line 130) | pub fn tool_dispatcher(mut self, tool_dispatcher: Box) -... method config (line 140) | pub fn config(mut self, config: crate::config::AgentConfig) -> Self { method model_name (line 145) | pub fn model_name(mut self, model_name: String) -> Self { method temperature (line 150) | pub fn temperature(mut self, temperature: f64) -> Self { method workspace_dir (line 155) | pub fn workspace_dir(mut self, workspace_dir: std::path::PathBuf) -> S... method identity_config (line 160) | pub fn identity_config(mut self, identity_config: crate::config::Ident... method skills (line 165) | pub fn skills(mut self, skills: Vec) -> Self { method skills_prompt_mode (line 170) | pub fn skills_prompt_mode( method auto_save (line 178) | pub fn auto_save(mut self, auto_save: bool) -> Self { method memory_session_id (line 183) | pub fn memory_session_id(mut self, memory_session_id: Option) ... method classification_config (line 188) | pub fn classification_config( method available_hints (line 196) | pub fn available_hints(mut self, available_hints: Vec) -> Self { method route_model_by_hint (line 201) | pub fn route_model_by_hint(mut self, route_model_by_hint: HashMap>) -> ... method response_cache (line 211) | pub fn response_cache( method tool_descriptions (line 219) | pub fn tool_descriptions(mut self, tool_descriptions: Option) -> Self { method build (line 229) | pub fn build(self) -> Result { function run (line 757) | pub async fn run( type MockProvider (line 818) | struct MockProvider { method chat_with_system (line 824) | async fn chat_with_system( method chat (line 834) | async fn chat( type ModelCaptureProvider (line 853) | struct ModelCaptureProvider { method chat_with_system (line 860) | async fn chat_with_system( method chat (line 870) | async fn chat( type MockTool (line 890) | struct MockTool; method name (line 894) | fn name(&self) -> &str { method description (line 898) | fn description(&self) -> &str { method parameters_schema (line 902) | fn parameters_schema(&self) -> serde_json::Value { method execute (line 906) | async fn execute(&self, _args: serde_json::Value) -> Result Op... function classify_with_decision (line 20) | pub fn classify_with_decision( function make_config (line 73) | fn make_config(enabled: bool, rules: Vec) -> QueryCl... function disabled_returns_none (line 78) | fn disabled_returns_none() { function empty_rules_returns_none (line 91) | fn empty_rules_returns_none() { function keyword_match_case_insensitive (line 97) | fn keyword_match_case_insensitive() { function pattern_match_case_sensitive (line 110) | fn pattern_match_case_sensitive() { function length_constraints (line 124) | fn length_constraints() { function priority_ordering (line 157) | fn priority_ordering() { function no_match_returns_none (line 179) | fn no_match_returns_none() { function classify_with_decision_exposes_priority_of_matched_rule (line 192) | fn classify_with_decision_exposes_priority_of_matched_rule() { FILE: src/agent/dispatcher.rs type ParsedToolCall (line 7) | pub struct ParsedToolCall { type ToolExecutionResult (line 14) | pub struct ToolExecutionResult { type ToolDispatcher (line 21) | pub trait ToolDispatcher: Send + Sync { method parse_response (line 22) | fn parse_response(&self, response: &ChatResponse) -> (String, Vec Conversat... method prompt_instructions (line 24) | fn prompt_instructions(&self, tools: &[Box]) -> String; method to_provider_messages (line 25) | fn to_provider_messages(&self, history: &[ConversationMessage]) -> Vec... method should_send_tool_specs (line 26) | fn should_send_tool_specs(&self) -> bool; method parse_response (line 113) | fn parse_response(&self, response: &ChatResponse) -> (String, Vec Conversat... method prompt_instructions (line 131) | fn prompt_instructions(&self, _tools: &[Box]) -> String { method to_provider_messages (line 143) | fn to_provider_messages(&self, history: &[ConversationMessage]) -> Vec... method should_send_tool_specs (line 166) | fn should_send_tool_specs(&self) -> bool { method parse_response (line 174) | fn parse_response(&self, response: &ChatResponse) -> (String, Vec Conversat... method prompt_instructions (line 209) | fn prompt_instructions(&self, _tools: &[Box]) -> String { method to_provider_messages (line 213) | fn to_provider_messages(&self, history: &[ConversationMessage]) -> Vec... method should_send_tool_specs (line 248) | fn should_send_tool_specs(&self) -> bool { type XmlToolDispatcher (line 30) | pub struct XmlToolDispatcher; method parse_xml_tool_calls (line 33) | fn parse_xml_tool_calls(response: &str) -> (String, Vec String { method tool_specs (line 107) | pub fn tool_specs(tools: &[Box]) -> Vec { type NativeToolDispatcher (line 171) | pub struct NativeToolDispatcher; function xml_dispatcher_parses_tool_calls (line 258) | fn xml_dispatcher_parses_tool_calls() { function xml_dispatcher_strips_think_before_tool_call (line 275) | fn xml_dispatcher_strips_think_before_tool_call() { function xml_dispatcher_think_only_returns_no_calls (line 296) | fn xml_dispatcher_think_only_returns_no_calls() { function native_dispatcher_roundtrip (line 309) | fn native_dispatcher_roundtrip() { function xml_format_results_contains_tool_result_tags (line 341) | fn xml_format_results_contains_tool_result_tags() { function native_format_results_keeps_tool_call_id (line 358) | fn native_format_results_keeps_tool_call_id() { function native_to_provider_messages_includes_reasoning_content (line 381) | fn native_to_provider_messages_includes_reasoning_content() { function native_to_provider_messages_omits_reasoning_content_when_none (line 404) | fn native_to_provider_messages_omits_reasoning_content_when_none() { function xml_to_provider_messages_ignores_reasoning_content (line 424) | fn xml_to_provider_messages_ignores_reasoning_content() { FILE: src/agent/loop_.rs constant STREAM_CHUNK_MIN_CHARS (line 27) | const STREAM_CHUNK_MIN_CHARS: usize = 80; constant DEFAULT_MAX_TOOL_ITERATIONS (line 31) | const DEFAULT_MAX_TOOL_ITERATIONS: usize = 10; constant AUTOSAVE_MIN_MESSAGE_CHARS (line 35) | const AUTOSAVE_MIN_MESSAGE_CHARS: usize = 20; type ModelSwitchCallback (line 39) | pub type ModelSwitchCallback = Arc>>; function get_model_switch_state (line 48) | pub fn get_model_switch_state() -> ModelSwitchCallback { function clear_model_switch_request (line 53) | pub fn clear_model_switch_request() { function glob_match (line 60) | fn glob_match(pattern: &str, name: &str) -> bool { function filter_tool_specs_for_turn (line 82) | pub(crate) fn filter_tool_specs_for_turn( function filter_by_allowed_tools (line 125) | pub(crate) fn filter_by_allowed_tools( function compute_excluded_mcp_tools (line 142) | fn compute_excluded_mcp_tools( function scrub_credentials (line 183) | pub(crate) fn scrub_credentials(input: &str) -> String { constant DEFAULT_MAX_HISTORY_MESSAGES (line 229) | const DEFAULT_MAX_HISTORY_MESSAGES: usize = 50; constant COMPACTION_KEEP_RECENT_MESSAGES (line 232) | const COMPACTION_KEEP_RECENT_MESSAGES: usize = 20; constant COMPACTION_MAX_SOURCE_CHARS (line 235) | const COMPACTION_MAX_SOURCE_CHARS: usize = 12_000; constant COMPACTION_MAX_SUMMARY_CHARS (line 238) | const COMPACTION_MAX_SUMMARY_CHARS: usize = 2_000; function estimate_history_tokens (line 242) | fn estimate_history_tokens(history: &[ChatMessage]) -> usize { constant PROGRESS_MIN_INTERVAL_MS (line 253) | pub(crate) const PROGRESS_MIN_INTERVAL_MS: u64 = 500; constant DRAFT_CLEAR_SENTINEL (line 257) | pub(crate) const DRAFT_CLEAR_SENTINEL: &str = "\x00CLEAR\x00"; function truncate_tool_args_for_progress (line 260) | fn truncate_tool_args_for_progress(name: &str, args: &serde_json::Value,... function tools_to_openai_format (line 276) | fn tools_to_openai_format(tools_registry: &[Box]) -> Vec String { function memory_session_id_from_state_file (line 296) | fn memory_session_id_from_state_file(path: &Path) -> Option { function trim_history (line 307) | fn trim_history(history: &mut Vec, max_history: usize) { function build_compaction_transcript (line 325) | fn build_compaction_transcript(messages: &[ChatMessage]) -> String { function apply_compaction_summary (line 339) | fn apply_compaction_summary( function auto_compact_history (line 349) | async fn auto_compact_history( type InteractiveSessionState (line 412) | struct InteractiveSessionState { method from_history (line 418) | fn from_history(history: &[ChatMessage]) -> Self { function load_interactive_session_history (line 426) | fn load_interactive_session_history(path: &Path, system_prompt: &str) ->... function save_interactive_session_history (line 442) | fn save_interactive_session_history(path: &Path, history: &[ChatMessage]... function build_context (line 455) | async fn build_context( function build_hardware_context (line 503) | fn build_hardware_context( function find_tool (line 542) | fn find_tool<'a>(tools: &'a [Box], name: &str) -> Option<&'a d... function parse_arguments_value (line 546) | fn parse_arguments_value(raw: Option<&serde_json::Value>) -> serde_json:... function parse_tool_call_id (line 555) | fn parse_tool_call_id( function canonicalize_json_for_tool_signature (line 570) | fn canonicalize_json_for_tool_signature(value: &serde_json::Value) -> se... function tool_call_signature (line 593) | fn tool_call_signature(name: &str, arguments: &serde_json::Value) -> (St... function parse_tool_call_value (line 599) | fn parse_tool_call_value(value: &serde_json::Value) -> Option Vec bool { function extract_xml_pairs (line 710) | fn extract_xml_pairs(input: &str) -> Vec<(&str, &str)> { function parse_xml_tool_calls (line 734) | fn parse_xml_tool_calls(xml_content: &str) -> Option> { function parse_minimax_invoke_calls (line 797) | fn parse_minimax_invoke_calls(response: &str) -> Option<(String, Vec(haystack: &str, tags: &'a [&'a str]) -> Option<(us... function matching_tool_call_close_tag (line 917) | fn matching_tool_call_close_tag(open_tag: &str) -> Option<&'static str> { function extract_first_json_value_with_end (line 929) | fn extract_first_json_value_with_end(input: &str) -> Option<(serde_json:... function strip_leading_close_tags (line 951) | fn strip_leading_close_tags(mut input: &str) -> &str { function extract_json_values (line 974) | fn extract_json_values(input: &str) -> Vec { function find_json_end (line 1013) | fn find_json_end(input: &str) -> Option { function parse_xml_attribute_tool_calls (line 1057) | fn parse_xml_attribute_tool_calls(response: &str) -> Vec { function parse_perl_style_tool_calls (line 1114) | fn parse_perl_style_tool_calls(response: &str) -> Vec { function parse_function_call_tool_calls (line 1188) | fn parse_function_call_tool_calls(response: &str) -> Vec { function map_tool_name_alias (line 1235) | fn map_tool_name_alias(tool_name: &str) -> &str { function build_curl_command (line 1256) | fn build_curl_command(url: &str) -> Option { function parse_glm_style_tool_calls (line 1269) | fn parse_glm_style_tool_calls(text: &str) -> Vec<(String, serde_json::Va... function default_param_for_tool (line 1335) | fn default_param_for_tool(tool: &str) -> &'static str { function parse_glm_shortened_body (line 1364) | fn parse_glm_shortened_body(body: &str) -> Option { function parse_tool_calls (line 1532) | fn parse_tool_calls(response: &str) -> (String, Vec) { function strip_think_tags (line 1926) | fn strip_think_tags(s: &str) -> String { function strip_tool_result_blocks (line 1948) | fn strip_tool_result_blocks(text: &str) -> String { function detect_tool_call_parse_issue (line 1969) | fn detect_tool_call_parse_issue(response: &str, parsed_calls: &[ParsedTo... function parse_structured_tool_calls (line 2001) | fn parse_structured_tool_calls(tool_calls: &[ToolCall]) -> Vec) -> std::fmt::Result { function is_tool_loop_cancelled (line 2152) | pub(crate) fn is_tool_loop_cancelled(err: &anyhow::Error) -> bool { type ModelSwitchRequested (line 2157) | pub(crate) struct ModelSwitchRequested { method fmt (line 2163) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { function is_model_switch_requested (line 2174) | pub(crate) fn is_model_switch_requested(err: &anyhow::Error) -> Option<(... function agent_turn (line 2185) | pub(crate) async fn agent_turn( function maybe_inject_channel_delivery_defaults (line 2229) | fn maybe_inject_channel_delivery_defaults( function execute_one_tool (line 2323) | async fn execute_one_tool( type ToolExecutionOutcome (line 2413) | struct ToolExecutionOutcome { function should_execute_tools_in_parallel (line 2420) | fn should_execute_tools_in_parallel( function execute_tools_parallel (line 2439) | async fn execute_tools_parallel( function execute_tools_sequential (line 2464) | async fn execute_tools_sequential( function run_tool_call_loop (line 2505) | pub(crate) async fn run_tool_call_loop( function build_tool_instructions (line 3210) | pub(crate) fn build_tool_instructions( function run (line 3251) | pub async fn run( function process_message (line 4024) | pub async fn process_message( function interactive_session_state_round_trips_history (line 4335) | fn interactive_session_state_round_trips_history() { function interactive_session_state_adds_missing_system_prompt (line 4354) | fn interactive_session_state_adds_missing_system_prompt() { function scrub_credentials_redacts_bearer_token (line 4380) | fn scrub_credentials_redacts_bearer_token() { function scrub_credentials_redacts_json_api_key (line 4391) | fn scrub_credentials_redacts_json_api_key() { function execute_one_tool_does_not_panic_on_utf8_boundary (line 4399) | async fn execute_one_tool_does_not_panic_on_utf8_boundary() { function execute_one_tool_resolves_unique_activated_tool_suffix (line 4419) | async fn execute_one_tool_resolves_unique_activated_tool_suffix() { type NonVisionProvider (line 4454) | struct NonVisionProvider { method chat_with_system (line 4460) | async fn chat_with_system( type VisionProvider (line 4472) | struct VisionProvider { method capabilities (line 4478) | fn capabilities(&self) -> ProviderCapabilities { method chat_with_system (line 4486) | async fn chat_with_system( method chat (line 4497) | async fn chat( type ScriptedProvider (line 4522) | struct ScriptedProvider { method from_text_responses (line 4528) | fn from_text_responses(responses: Vec<&str>) -> Self { method with_native_tool_support (line 4544) | fn with_native_tool_support(mut self) -> Self { method capabilities (line 4552) | fn capabilities(&self) -> ProviderCapabilities { method chat_with_system (line 4556) | async fn chat_with_system( method chat (line 4566) | async fn chat( type CountingTool (line 4582) | struct CountingTool { method new (line 4588) | fn new(name: &str, invocations: Arc) -> Self { method name (line 4598) | fn name(&self) -> &str { method description (line 4602) | fn description(&self) -> &str { method parameters_schema (line 4606) | fn parameters_schema(&self) -> serde_json::Value { method execute (line 4615) | async fn execute( type RecordingArgsTool (line 4632) | struct RecordingArgsTool { method new (line 4638) | fn new(name: &str, recorded_args: Arc>>) ... method name (line 4648) | fn name(&self) -> &str { method description (line 4652) | fn description(&self) -> &str { method parameters_schema (line 4656) | fn parameters_schema(&self) -> serde_json::Value { method execute (line 4667) | async fn execute( type DelayTool (line 4683) | struct DelayTool { method new (line 4691) | fn new( method name (line 4708) | fn name(&self) -> &str { method description (line 4712) | fn description(&self) -> &str { method parameters_schema (line 4716) | fn parameters_schema(&self) -> serde_json::Value { method execute (line 4726) | async fn execute( type FailingTool (line 4752) | struct FailingTool { method new (line 4758) | fn new(name: &str, error_reason: &str) -> Self { method name (line 4768) | fn name(&self) -> &str { method description (line 4772) | fn description(&self) -> &str { method parameters_schema (line 4776) | fn parameters_schema(&self) -> serde_json::Value { method execute (line 4785) | async fn execute( function run_tool_call_loop_returns_structured_error_for_non_vision_provider (line 4798) | async fn run_tool_call_loop_returns_structured_error_for_non_vision_prov... function run_tool_call_loop_rejects_oversized_image_payload (line 4841) | async fn run_tool_call_loop_rejects_oversized_image_payload() { function run_tool_call_loop_accepts_valid_multimodal_request_flow (line 4892) | async fn run_tool_call_loop_accepts_valid_multimodal_request_flow() { function should_execute_tools_in_parallel_returns_false_for_single_call (line 4934) | fn should_execute_tools_in_parallel_returns_false_for_single_call() { function should_execute_tools_in_parallel_returns_false_when_approval_is_required (line 4945) | fn should_execute_tools_in_parallel_returns_false_when_approval_is_requi... function should_execute_tools_in_parallel_returns_true_when_cli_has_no_interactive_approvals (line 4968) | fn should_execute_tools_in_parallel_returns_true_when_cli_has_no_interac... function run_tool_call_loop_executes_multiple_tools_with_ordered_results (line 4994) | async fn run_tool_call_loop_executes_multiple_tools_with_ordered_results... function run_tool_call_loop_injects_channel_delivery_defaults_for_cron_add (line 5084) | async fn run_tool_call_loop_injects_channel_delivery_defaults_for_cron_a... function run_tool_call_loop_preserves_explicit_cron_delivery_none (line 5146) | async fn run_tool_call_loop_preserves_explicit_cron_delivery_none() { function run_tool_call_loop_deduplicates_repeated_tool_calls (line 5200) | async fn run_tool_call_loop_deduplicates_repeated_tool_calls() { function run_tool_call_loop_allows_low_risk_shell_in_non_interactive_mode (line 5264) | async fn run_tool_call_loop_allows_low_risk_shell_in_non_interactive_mod... function run_tool_call_loop_dedup_exempt_allows_repeated_calls (line 5328) | async fn run_tool_call_loop_dedup_exempt_allows_repeated_calls() { function run_tool_call_loop_dedup_exempt_only_affects_listed_tools (line 5395) | async fn run_tool_call_loop_dedup_exempt_only_affects_listed_tools() { function run_tool_call_loop_native_mode_preserves_fallback_tool_call_ids (line 5470) | async fn run_tool_call_loop_native_mode_preserves_fallback_tool_call_ids... function run_tool_call_loop_relays_native_tool_call_text_via_on_delta (line 5531) | async fn run_tool_call_loop_relays_native_tool_call_text_via_on_delta() { function agent_turn_executes_activated_tool_from_wrapper (line 5624) | fn agent_turn_executes_activated_tool_from_wrapper() { function resolve_display_text_hides_raw_payload_for_tool_only_turns (line 5684) | fn resolve_display_text_hides_raw_payload_for_tool_only_turns() { function resolve_display_text_keeps_plain_text_for_tool_turns (line 5695) | fn resolve_display_text_keeps_plain_text_for_tool_turns() { function resolve_display_text_uses_response_text_for_native_tool_turns (line 5706) | fn resolve_display_text_uses_response_text_for_native_tool_turns() { function resolve_display_text_uses_response_text_for_final_turns (line 5712) | fn resolve_display_text_uses_response_text_for_final_turns() { function parse_tool_calls_extracts_single_call (line 5718) | fn parse_tool_calls_extracts_single_call() { function parse_tool_calls_extracts_multiple_calls (line 5735) | fn parse_tool_calls_extracts_multiple_calls() { function parse_tool_calls_returns_text_only_when_no_calls (line 5750) | fn parse_tool_calls_returns_text_only_when_no_calls() { function parse_tool_calls_handles_malformed_json (line 5758) | fn parse_tool_calls_handles_malformed_json() { function parse_tool_calls_text_before_and_after (line 5770) | fn parse_tool_calls_text_before_and_after() { function parse_tool_calls_handles_openai_format (line 5784) | fn parse_tool_calls_handles_openai_format() { function parse_tool_calls_handles_openai_format_multiple_calls (line 5799) | fn parse_tool_calls_handles_openai_format_multiple_calls() { function parse_tool_calls_openai_format_without_content (line 5809) | fn parse_tool_calls_openai_format_without_content() { function parse_tool_calls_preserves_openai_tool_call_ids (line 5820) | fn parse_tool_calls_preserves_openai_tool_call_ids() { function parse_tool_calls_handles_markdown_json_inside_tool_call_tag (line 5828) | fn parse_tool_calls_handles_markdown_json_inside_tool_call_tag() { function parse_tool_calls_handles_noisy_tool_call_tag_body (line 5846) | fn parse_tool_calls_handles_noisy_tool_call_tag_body() { function parse_tool_calls_handles_tool_call_inline_attributes_with_send_message_alias (line 5863) | fn parse_tool_calls_handles_tool_call_inline_attributes_with_send_messag... function parse_tool_calls_handles_tool_call_function_style_arguments (line 5881) | fn parse_tool_calls_handles_tool_call_function_style_arguments() { function parse_tool_calls_handles_xml_nested_tool_payload (line 5899) | fn parse_tool_calls_handles_xml_nested_tool_payload() { function parse_tool_calls_ignores_xml_thinking_wrapper (line 5917) | fn parse_tool_calls_ignores_xml_thinking_wrapper() { function parse_tool_calls_handles_xml_with_json_arguments (line 5936) | fn parse_tool_calls_handles_xml_with_json_arguments() { function parse_tool_calls_handles_markdown_tool_call_fence (line 5952) | fn parse_tool_calls_handles_markdown_tool_call_fence() { function parse_tool_calls_handles_markdown_tool_call_hybrid_close_tag (line 5972) | fn parse_tool_calls_handles_markdown_tool_call_hybrid_close_tag() { function parse_tool_calls_handles_markdown_invoke_fence (line 5992) | fn parse_tool_calls_handles_markdown_invoke_fence() { function parse_tool_calls_handles_tool_name_fence_format (line 6011) | fn parse_tool_calls_handles_tool_name_fence_format() { function parse_tool_calls_handles_tool_name_fence_shell (line 6031) | fn parse_tool_calls_handles_tool_name_fence_shell() { function parse_tool_calls_handles_multiple_tool_name_fences (line 6047) | fn parse_tool_calls_handles_multiple_tool_name_fences() { function parse_tool_calls_handles_toolcall_tag_alias (line 6069) | fn parse_tool_calls_handles_toolcall_tag_alias() { function parse_tool_calls_handles_tool_dash_call_tag_alias (line 6085) | fn parse_tool_calls_handles_tool_dash_call_tag_alias() { function parse_tool_calls_handles_invoke_tag_alias (line 6101) | fn parse_tool_calls_handles_invoke_tag_alias() { function parse_tool_calls_handles_minimax_invoke_parameter_format (line 6117) | fn parse_tool_calls_handles_minimax_invoke_parameter_format() { function parse_tool_calls_handles_minimax_invoke_with_surrounding_text (line 6135) | fn parse_tool_calls_handles_minimax_invoke_with_surrounding_text() { function parse_tool_calls_handles_minimax_toolcall_alias_and_cross_close_tag (line 6161) | fn parse_tool_calls_handles_minimax_toolcall_alias_and_cross_close_tag() { function parse_tool_calls_handles_perl_style_tool_call_blocks (line 6177) | fn parse_tool_calls_handles_perl_style_tool_call_blocks() { function parse_tool_calls_recovers_unclosed_tool_call_with_json (line 6192) | fn parse_tool_calls_recovers_unclosed_tool_call_with_json() { function parse_tool_calls_recovers_mismatched_close_tag (line 6208) | fn parse_tool_calls_recovers_mismatched_close_tag() { function parse_tool_calls_recovers_cross_alias_closing_tags (line 6224) | fn parse_tool_calls_recovers_cross_alias_closing_tags() { function parse_tool_calls_rejects_raw_tool_json_without_tags (line 6236) | fn parse_tool_calls_rejects_raw_tool_json_without_tags() { function build_tool_instructions_includes_all_tools (line 6253) | fn build_tool_instructions_includes_all_tools() { function tools_to_openai_format_produces_valid_schema (line 6270) | fn tools_to_openai_format_produces_valid_schema() { function trim_history_preserves_system_prompt (line 6296) | fn trim_history_preserves_system_prompt() { function trim_history_noop_when_within_limit (line 6320) | fn trim_history_noop_when_within_limit() { function build_compaction_transcript_formats_roles (line 6331) | fn build_compaction_transcript_formats_roles() { function apply_compaction_summary_replaces_old_segment (line 6342) | fn apply_compaction_summary_replaces_old_segment() { function autosave_memory_key_has_prefix_and_uniqueness (line 6360) | fn autosave_memory_key_has_prefix_and_uniqueness() { function autosave_memory_keys_preserve_multiple_turns (line 6370) | async fn autosave_memory_keys_preserve_multiple_turns() { function build_context_ignores_legacy_assistant_autosave_entries (line 6391) | async fn build_context_ignores_legacy_assistant_autosave_entries() { function parse_tool_calls_handles_empty_tool_result (line 6422) | fn parse_tool_calls_handles_empty_tool_result() { function strip_tool_result_blocks_removes_single_block (line 6435) | fn strip_tool_result_blocks_removes_single_block() { function strip_tool_result_blocks_removes_multiple_blocks (line 6444) | fn strip_tool_result_blocks_removes_multiple_blocks() { function strip_tool_result_blocks_removes_prefix (line 6456) | fn strip_tool_result_blocks_removes_prefix() { function strip_tool_result_blocks_removes_thinking (line 6463) | fn strip_tool_result_blocks_removes_thinking() { function strip_tool_result_blocks_removes_think_tags (line 6469) | fn strip_tool_result_blocks_removes_think_tags() { function strip_think_tags_removes_single_block (line 6475) | fn strip_think_tags_removes_single_block() { function strip_think_tags_removes_multiple_blocks (line 6480) | fn strip_think_tags_removes_multiple_blocks() { function strip_think_tags_handles_unclosed_block (line 6485) | fn strip_think_tags_handles_unclosed_block() { function strip_think_tags_preserves_text_without_tags (line 6490) | fn strip_think_tags_preserves_text_without_tags() { function parse_tool_calls_strips_think_before_tool_call (line 6495) | fn parse_tool_calls_strips_think_before_tool_call() { function parse_tool_calls_strips_think_only_returns_empty (line 6514) | fn parse_tool_calls_strips_think_only_returns_empty() { function parse_tool_calls_handles_qwen_think_with_multiple_tool_calls (line 6524) | fn parse_tool_calls_handles_qwen_think_with_multiple_tool_calls() { function strip_tool_result_blocks_preserves_clean_text (line 6539) | fn strip_tool_result_blocks_preserves_clean_text() { function strip_tool_result_blocks_returns_empty_for_only_tags (line 6545) | fn strip_tool_result_blocks_returns_empty_for_only_tags() { function parse_arguments_value_handles_null (line 6551) | fn parse_arguments_value_handles_null() { function parse_tool_calls_handles_empty_tool_calls_array (line 6559) | fn parse_tool_calls_handles_empty_tool_calls_array() { function detect_tool_call_parse_issue_flags_malformed_payloads (line 6569) | fn detect_tool_call_parse_issue_flags_malformed_payloads() { function detect_tool_call_parse_issue_ignores_normal_text (line 6580) | fn detect_tool_call_parse_issue_ignores_normal_text() { function parse_tool_calls_handles_whitespace_only_name (line 6586) | fn parse_tool_calls_handles_whitespace_only_name() { function parse_tool_calls_handles_empty_string_arguments (line 6594) | fn parse_tool_calls_handles_empty_string_arguments() { function trim_history_with_no_system_prompt (line 6607) | fn trim_history_with_no_system_prompt() { function trim_history_preserves_role_ordering (line 6618) | fn trim_history_preserves_role_ordering() { function trim_history_with_only_system_prompt (line 6631) | fn trim_history_with_only_system_prompt() { function parse_arguments_value_handles_invalid_json_string (line 6643) | fn parse_arguments_value_handles_invalid_json_string() { function parse_arguments_value_handles_none (line 6652) | fn parse_arguments_value_handles_none() { function extract_json_values_handles_empty_string (line 6664) | fn extract_json_values_handles_empty_string() { function extract_json_values_handles_whitespace_only (line 6671) | fn extract_json_values_handles_whitespace_only() { function extract_json_values_handles_multiple_objects (line 6678) | fn extract_json_values_handles_multiple_objects() { function extract_json_values_handles_arrays (line 6686) | fn extract_json_values_handles_arrays() { constant _ (line 6697) | const _: () = { function constants_bounds_are_compile_time_checked (line 6705) | fn constants_bounds_are_compile_time_checked() { function parse_tool_call_value_handles_missing_name_field (line 6714) | fn parse_tool_call_value_handles_missing_name_field() { function parse_tool_call_value_handles_top_level_name (line 6722) | fn parse_tool_call_value_handles_top_level_name() { function parse_tool_call_value_accepts_top_level_parameters_alias (line 6731) | fn parse_tool_call_value_accepts_top_level_parameters_alias() { function parse_tool_call_value_accepts_function_parameters_alias (line 6745) | fn parse_tool_call_value_accepts_function_parameters_alias() { function parse_tool_call_value_preserves_tool_call_id_aliases (line 6761) | fn parse_tool_call_value_preserves_tool_call_id_aliases() { function parse_tool_calls_from_json_value_handles_empty_array (line 6774) | fn parse_tool_calls_from_json_value_handles_empty_array() { function parse_tool_calls_from_json_value_handles_missing_tool_calls (line 6782) | fn parse_tool_calls_from_json_value_handles_missing_tool_calls() { function parse_tool_calls_from_json_value_handles_top_level_array (line 6790) | fn parse_tool_calls_from_json_value_handles_top_level_array() { function parse_glm_style_browser_open_url (line 6805) | fn parse_glm_style_browser_open_url() { function parse_glm_style_shell_command (line 6818) | fn parse_glm_style_shell_command() { function parse_glm_style_http_request (line 6827) | fn parse_glm_style_http_request() { function parse_glm_style_ignores_plain_url (line 6837) | fn parse_glm_style_ignores_plain_url() { function parse_glm_style_json_args (line 6849) | fn parse_glm_style_json_args() { function parse_glm_style_multiple_calls (line 6858) | fn parse_glm_style_multiple_calls() { function parse_glm_style_tool_call_integration (line 6866) | fn parse_glm_style_tool_call_integration() { function parse_glm_style_rejects_non_http_url_param (line 6877) | fn parse_glm_style_rejects_non_http_url_param() { function parse_tool_calls_handles_unclosed_tool_call_tag (line 6884) | fn parse_tool_calls_handles_unclosed_tool_call_tag() { function parse_tool_calls_empty_input_returns_empty (line 6899) | fn parse_tool_calls_empty_input_returns_empty() { function parse_tool_calls_whitespace_only_returns_empty_calls (line 6906) | fn parse_tool_calls_whitespace_only_returns_empty_calls() { function parse_tool_calls_nested_xml_tags_handled (line 6913) | fn parse_tool_calls_nested_xml_tags_handled() { function parse_tool_calls_truncated_json_no_panic (line 6925) | fn parse_tool_calls_truncated_json_no_panic() { function parse_tool_calls_empty_json_object_in_tag (line 6933) | fn parse_tool_calls_empty_json_object_in_tag() { function parse_tool_calls_closing_tag_only_returns_text (line 6944) | fn parse_tool_calls_closing_tag_only_returns_text() { function parse_tool_calls_very_large_arguments_no_panic (line 6958) | fn parse_tool_calls_very_large_arguments_no_panic() { function parse_tool_calls_special_characters_in_arguments (line 6970) | fn parse_tool_calls_special_characters_in_arguments() { function parse_tool_calls_text_with_embedded_json_not_extracted (line 6978) | fn parse_tool_calls_text_with_embedded_json_not_extracted() { function parse_tool_calls_multiple_formats_mixed (line 6989) | fn parse_tool_calls_multiple_formats_mixed() { function scrub_credentials_empty_input (line 7016) | fn scrub_credentials_empty_input() { function scrub_credentials_no_sensitive_data (line 7022) | fn scrub_credentials_no_sensitive_data() { function scrub_credentials_multibyte_chars_no_panic (line 7032) | fn scrub_credentials_multibyte_chars_no_panic() { function scrub_credentials_short_values_not_redacted (line 7046) | fn scrub_credentials_short_values_not_redacted() { function trim_history_empty_history (line 7058) | fn trim_history_empty_history() { function trim_history_system_only (line 7065) | fn trim_history_system_only() { function trim_history_exactly_at_limit (line 7073) | fn trim_history_exactly_at_limit() { function trim_history_removes_oldest_non_system (line 7084) | fn trim_history_removes_oldest_non_system() { function native_tools_system_prompt_contains_zero_xml (line 7103) | fn native_tools_system_prompt_contains_zero_xml() { function parse_tool_calls_cross_alias_close_tag_with_json (line 7159) | fn parse_tool_calls_cross_alias_close_tag_with_json() { function parse_tool_calls_cross_alias_close_tag_with_glm_shortened (line 7170) | fn parse_tool_calls_cross_alias_close_tag_with_glm_shortened() { function parse_tool_calls_glm_shortened_body_in_matched_tags (line 7181) | fn parse_tool_calls_glm_shortened_body_in_matched_tags() { function parse_tool_calls_glm_yaml_style_in_tags (line 7192) | fn parse_tool_calls_glm_yaml_style_in_tags() { function parse_tool_calls_attribute_style_in_tags (line 7204) | fn parse_tool_calls_attribute_style_in_tags() { function parse_tool_calls_file_read_shortened_in_cross_alias (line 7215) | fn parse_tool_calls_file_read_shortened_in_cross_alias() { function parse_tool_calls_unclosed_glm_shortened_no_close_tag (line 7226) | fn parse_tool_calls_unclosed_glm_shortened_no_close_tag() { function parse_tool_calls_text_before_cross_alias (line 7237) | fn parse_tool_calls_text_before_cross_alias() { function parse_glm_shortened_body_url_to_curl (line 7249) | fn parse_glm_shortened_body_url_to_curl() { function parse_glm_shortened_body_browser_open_maps_to_shell_command (line 7259) | fn parse_glm_shortened_body_browser_open_maps_to_shell_command() { function parse_glm_shortened_body_memory_recall (line 7270) | fn parse_glm_shortened_body_memory_recall() { function parse_glm_shortened_body_function_style_alias_maps_to_message_send (line 7278) | fn parse_glm_shortened_body_function_style_alias_maps_to_message_send() { function map_tool_name_alias_direct_coverage (line 7287) | fn map_tool_name_alias_direct_coverage() { function default_param_for_tool_coverage (line 7300) | fn default_param_for_tool_coverage() { function parse_glm_shortened_body_rejects_empty (line 7312) | fn parse_glm_shortened_body_rejects_empty() { function parse_glm_shortened_body_rejects_invalid_tool_name (line 7318) | fn parse_glm_shortened_body_rejects_invalid_tool_name() { function build_native_assistant_history_includes_reasoning_content (line 7329) | fn build_native_assistant_history_includes_reasoning_content() { function build_native_assistant_history_omits_reasoning_content_when_none (line 7343) | fn build_native_assistant_history_omits_reasoning_content_when_none() { function build_native_assistant_history_from_parsed_calls_includes_reasoning_content (line 7356) | fn build_native_assistant_history_from_parsed_calls_includes_reasoning_c... function build_native_assistant_history_from_parsed_calls_omits_reasoning_content_when_none (line 7375) | fn build_native_assistant_history_from_parsed_calls_omits_reasoning_cont... function glob_match_exact_no_wildcard (line 7391) | fn glob_match_exact_no_wildcard() { function glob_match_prefix_wildcard (line 7397) | fn glob_match_prefix_wildcard() { function glob_match_star_matches_everything (line 7413) | fn glob_match_star_matches_everything() { function make_spec (line 7420) | fn make_spec(name: &str) -> crate::tools::ToolSpec { function filter_tool_specs_no_groups_returns_all (line 7429) | fn filter_tool_specs_no_groups_returns_all() { function filter_tool_specs_always_group_includes_matching_mcp_tool (line 7440) | fn filter_tool_specs_always_group_includes_matching_mcp_tool() { function filter_tool_specs_dynamic_group_included_on_keyword_match (line 7462) | fn filter_tool_specs_dynamic_group_included_on_keyword_match() { function filter_tool_specs_dynamic_group_excluded_on_no_keyword_match (line 7478) | fn filter_tool_specs_dynamic_group_excluded_on_no_keyword_match() { function filter_tool_specs_dynamic_keyword_match_is_case_insensitive (line 7494) | fn filter_tool_specs_dynamic_keyword_match_is_case_insensitive() { function estimate_history_tokens_empty (line 7510) | fn estimate_history_tokens_empty() { function estimate_history_tokens_single_message (line 7515) | fn estimate_history_tokens_single_message() { function estimate_history_tokens_multiple_messages (line 7523) | fn estimate_history_tokens_multiple_messages() { function run_tool_call_loop_surfaces_tool_failure_reason_in_on_delta (line 7534) | async fn run_tool_call_loop_surfaces_tool_failure_reason_in_on_delta() { function filter_by_allowed_tools_none_passes_all (line 7606) | fn filter_by_allowed_tools_none_passes_all() { function filter_by_allowed_tools_some_restricts_to_listed (line 7617) | fn filter_by_allowed_tools_some_restricts_to_listed() { function filter_by_allowed_tools_unknown_names_silently_ignored (line 7633) | fn filter_by_allowed_tools_unknown_names_silently_ignored() { function filter_by_allowed_tools_empty_list_excludes_all (line 7647) | fn filter_by_allowed_tools_empty_list_excludes_all() { FILE: src/agent/memory_loader.rs type MemoryLoader (line 6) | pub trait MemoryLoader: Send + Sync { method load_context (line 7) | async fn load_context( method load_context (line 40) | async fn load_context( type DefaultMemoryLoader (line 15) | pub struct DefaultMemoryLoader { method new (line 30) | pub fn new(limit: usize, min_relevance_score: f64) -> Self { method default (line 21) | fn default() -> Self { type MockMemory (line 83) | struct MockMemory; type MockMemoryWithEntries (line 84) | struct MockMemoryWithEntries { method store (line 90) | async fn store( method recall (line 100) | async fn recall( method get (line 120) | async fn get(&self, _key: &str) -> anyhow::Result> { method list (line 124) | async fn list( method forget (line 132) | async fn forget(&self, _key: &str) -> anyhow::Result { method count (line 136) | async fn count(&self) -> anyhow::Result { method health_check (line 140) | async fn health_check(&self) -> bool { method name (line 144) | fn name(&self) -> &str { method store (line 151) | async fn store( method recall (line 161) | async fn recall( method get (line 170) | async fn get(&self, _key: &str) -> anyhow::Result> { method list (line 174) | async fn list( method forget (line 182) | async fn forget(&self, _key: &str) -> anyhow::Result { method count (line 186) | async fn count(&self) -> anyhow::Result { method health_check (line 190) | async fn health_check(&self) -> bool { method name (line 194) | fn name(&self) -> &str { function default_loader_formats_context (line 200) | async fn default_loader_formats_context() { function default_loader_skips_legacy_assistant_autosave_entries (line 211) | async fn default_loader_skips_legacy_assistant_autosave_entries() { FILE: src/agent/prompt.rs constant BOOTSTRAP_MAX_CHARS (line 11) | const BOOTSTRAP_MAX_CHARS: usize = 20_000; type PromptContext (line 13) | pub struct PromptContext<'a> { type PromptSection (line 31) | pub trait PromptSection: Send + Sync { method name (line 32) | fn name(&self) -> &str; method build (line 33) | fn build(&self, ctx: &PromptContext<'_>) -> Result; method name (line 88) | fn name(&self) -> &str { method build (line 92) | fn build(&self, ctx: &PromptContext<'_>) -> Result { method name (line 131) | fn name(&self) -> &str { method build (line 135) | fn build(&self, _ctx: &PromptContext<'_>) -> Result { method name (line 147) | fn name(&self) -> &str { method build (line 151) | fn build(&self, ctx: &PromptContext<'_>) -> Result { method name (line 175) | fn name(&self) -> &str { method build (line 179) | fn build(&self, ctx: &PromptContext<'_>) -> Result { method name (line 202) | fn name(&self) -> &str { method build (line 206) | fn build(&self, ctx: &PromptContext<'_>) -> Result { method name (line 216) | fn name(&self) -> &str { method build (line 220) | fn build(&self, ctx: &PromptContext<'_>) -> Result { method name (line 229) | fn name(&self) -> &str { method build (line 233) | fn build(&self, ctx: &PromptContext<'_>) -> Result { method name (line 245) | fn name(&self) -> &str { method build (line 249) | fn build(&self, _ctx: &PromptContext<'_>) -> Result { method name (line 260) | fn name(&self) -> &str { method build (line 264) | fn build(&self, _ctx: &PromptContext<'_>) -> Result { type SystemPromptBuilder (line 37) | pub struct SystemPromptBuilder { method with_defaults (line 42) | pub fn with_defaults() -> Self { method add_section (line 58) | pub fn add_section(mut self, section: Box) -> Self { method build (line 63) | pub fn build(&self, ctx: &PromptContext<'_>) -> Result { type IdentitySection (line 77) | pub struct IdentitySection; type ToolHonestySection (line 78) | pub struct ToolHonestySection; type ToolsSection (line 79) | pub struct ToolsSection; type SafetySection (line 80) | pub struct SafetySection; type SkillsSection (line 81) | pub struct SkillsSection; type WorkspaceSection (line 82) | pub struct WorkspaceSection; type RuntimeSection (line 83) | pub struct RuntimeSection; type DateTimeSection (line 84) | pub struct DateTimeSection; type ChannelMediaSection (line 85) | pub struct ChannelMediaSection; function inject_workspace_file (line 274) | fn inject_workspace_file(prompt: &mut String, workspace_dir: &Path, file... type TestTool (line 314) | struct TestTool; method name (line 318) | fn name(&self) -> &str { method description (line 322) | fn description(&self) -> &str { method parameters_schema (line 326) | fn parameters_schema(&self) -> serde_json::Value { method execute (line 330) | async fn execute( function identity_section_with_aieos_includes_workspace_files (line 343) | fn identity_section_with_aieos_includes_workspace_files() { function prompt_builder_assembles_sections (line 388) | fn prompt_builder_assembles_sections() { function skills_section_includes_instructions_and_tools (line 408) | fn skills_section_includes_instructions_and_tools() { function skills_section_compact_mode_omits_instructions_but_keeps_tools (line 448) | fn skills_section_compact_mode_omits_instructions_but_keeps_tools() { function datetime_section_includes_timestamp_and_timezone (line 492) | fn datetime_section_includes_timestamp_and_timezone() { function prompt_builder_inlines_and_escapes_skills (line 516) | fn prompt_builder_inlines_and_escapes_skills() { function safety_section_includes_security_summary_when_present (line 562) | fn safety_section_includes_security_summary_when_present() { function safety_section_omits_security_policy_when_none (line 599) | fn safety_section_omits_security_policy_when_none() { FILE: src/agent/tests.rs type ScriptedProvider (line 49) | struct ScriptedProvider { method new (line 56) | fn new(responses: Vec) -> Self { method request_count (line 63) | fn request_count(&self) -> usize { method chat_with_system (line 70) | async fn chat_with_system( method chat (line 80) | async fn chat( type FailingProvider (line 105) | struct FailingProvider; method chat_with_system (line 109) | async fn chat_with_system( method chat (line 119) | async fn chat( type EchoTool (line 130) | struct EchoTool; method name (line 134) | fn name(&self) -> &str { method description (line 138) | fn description(&self) -> &str { method parameters_schema (line 142) | fn parameters_schema(&self) -> serde_json::Value { method execute (line 151) | async fn execute(&self, args: serde_json::Value) -> Result { type FailingTool (line 166) | struct FailingTool; method name (line 170) | fn name(&self) -> &str { method description (line 174) | fn description(&self) -> &str { method parameters_schema (line 178) | fn parameters_schema(&self) -> serde_json::Value { method execute (line 182) | async fn execute(&self, _args: serde_json::Value) -> Result { type PanickingTool (line 192) | struct PanickingTool; method name (line 196) | fn name(&self) -> &str { method description (line 200) | fn description(&self) -> &str { method parameters_schema (line 204) | fn parameters_schema(&self) -> serde_json::Value { method execute (line 208) | async fn execute(&self, _args: serde_json::Value) -> Result { type CountingTool (line 214) | struct CountingTool { method new (line 219) | fn new() -> (Self, Arc>) { method name (line 232) | fn name(&self) -> &str { method description (line 236) | fn description(&self) -> &str { method parameters_schema (line 240) | fn parameters_schema(&self) -> serde_json::Value { method execute (line 244) | async fn execute(&self, _args: serde_json::Value) -> Result { function make_memory (line 255) | fn make_memory() -> Arc { function make_sqlite_memory (line 263) | fn make_sqlite_memory() -> (Arc, tempfile::TempDir) { function make_observer (line 273) | fn make_observer() -> Arc { function build_agent_with (line 277) | fn build_agent_with( function build_agent_with_memory (line 293) | fn build_agent_with_memory( function build_agent_with_config (line 311) | fn build_agent_with_config( function tool_response (line 329) | fn tool_response(calls: Vec) -> ChatResponse { function text_response (line 339) | fn text_response(text: &str) -> ChatResponse { function xml_tool_response (line 349) | fn xml_tool_response(name: &str, args: &str) -> ChatResponse { function turn_returns_text_when_no_tools_called (line 365) | async fn turn_returns_text_when_no_tools_called() { function turn_executes_single_tool_then_returns (line 385) | async fn turn_executes_single_tool_then_returns() { function turn_handles_multi_step_tool_chain (line 413) | async fn turn_handles_multi_step_tool_chain() { function turn_bails_out_at_max_iterations (line 454) | async fn turn_bails_out_at_max_iterations() { function turn_handles_unknown_tool_gracefully (line 489) | async fn turn_handles_unknown_tool_gracefully() { function turn_recovers_from_tool_failure (line 529) | async fn turn_recovers_from_tool_failure() { function turn_recovers_from_tool_error (line 553) | async fn turn_recovers_from_tool_error() { function turn_propagates_provider_error (line 581) | async fn turn_propagates_provider_error() { function history_trims_after_max_messages (line 597) | async fn history_trims_after_max_messages() { function auto_save_stores_only_user_messages_in_memory (line 635) | async fn auto_save_stores_only_user_messages_in_memory() { function auto_save_disabled_does_not_store (line 673) | async fn auto_save_disabled_does_not_store() { function xml_dispatcher_parses_and_loops (line 695) | async fn xml_dispatcher_parses_and_loops() { function native_dispatcher_sends_tool_specs (line 715) | async fn native_dispatcher_sends_tool_specs() { function xml_dispatcher_does_not_send_tool_specs (line 731) | async fn xml_dispatcher_does_not_send_tool_specs() { function turn_handles_empty_text_response (line 741) | async fn turn_handles_empty_text_response() { function turn_handles_none_text_response (line 756) | async fn turn_handles_none_text_response() { function turn_preserves_text_alongside_tool_calls (line 776) | async fn turn_preserves_text_alongside_tool_calls() { function turn_handles_multiple_tools_in_one_response (line 816) | async fn turn_handles_multiple_tools_in_one_response() { function system_prompt_injected_on_first_turn (line 863) | async fn system_prompt_injected_on_first_turn() { function system_prompt_not_duplicated_on_second_turn (line 884) | async fn system_prompt_not_duplicated_on_second_turn() { function history_contains_all_expected_entries_after_tool_loop (line 911) | async fn history_contains_all_expected_entries_after_tool_loop() { function builder_fails_without_provider (line 959) | async fn builder_fails_without_provider() { function multi_turn_maintains_growing_history (line 976) | async fn multi_turn_maintains_growing_history() { function native_dispatcher_handles_stringified_arguments (line 1014) | async fn native_dispatcher_handles_stringified_arguments() { function xml_dispatcher_handles_nested_json (line 1041) | fn xml_dispatcher_handles_nested_json() { function xml_dispatcher_handles_empty_tool_call_tag (line 1065) | fn xml_dispatcher_handles_empty_tool_call_tag() { function xml_dispatcher_handles_unclosed_tool_call (line 1080) | fn xml_dispatcher_handles_unclosed_tool_call() { function conversation_message_serialization_roundtrip (line 1100) | fn conversation_message_serialization_roundtrip() { function xml_format_results_includes_status_and_output (line 1158) | fn xml_format_results_includes_status_and_output() { function native_format_results_maps_tool_call_ids (line 1189) | fn native_format_results_maps_tool_call_ids() { function xml_dispatcher_converts_history_to_provider_messages (line 1224) | fn xml_dispatcher_converts_history_to_provider_messages() { function native_dispatcher_converts_tool_results_to_tool_messages (line 1254) | fn native_dispatcher_converts_tool_results_to_tool_messages() { function xml_dispatcher_generates_tool_instructions (line 1278) | fn xml_dispatcher_generates_tool_instructions() { function native_dispatcher_returns_empty_instructions (line 1294) | fn native_dispatcher_returns_empty_instructions() { function clear_history_resets_conversation (line 1306) | async fn clear_history_resets_conversation() { function run_single_delegates_to_turn (line 1333) | async fn run_single_delegates_to_turn() { FILE: src/approval/mod.rs type ApprovalRequest (line 18) | pub struct ApprovalRequest { type ApprovalResponse (line 26) | pub enum ApprovalResponse { type ApprovalLogEntry (line 37) | pub struct ApprovalLogEntry { type ApprovalManager (line 59) | pub struct ApprovalManager { method from_config (line 77) | pub fn from_config(config: &AutonomyConfig) -> Self { method for_non_interactive (line 93) | pub fn for_non_interactive(config: &AutonomyConfig) -> Self { method is_non_interactive (line 106) | pub fn is_non_interactive(&self) -> bool { method needs_approval (line 113) | pub fn needs_approval(&self, tool_name: &str) -> bool { method record_decision (line 154) | pub fn record_decision( method audit_log (line 181) | pub fn audit_log(&self) -> Vec { method session_allowlist (line 186) | pub fn session_allowlist(&self) -> HashSet { method prompt_cli (line 194) | pub fn prompt_cli(&self, request: &ApprovalRequest) -> ApprovalResponse { function prompt_cli_interactive (line 202) | fn prompt_cli_interactive(request: &ApprovalRequest) -> ApprovalResponse { function summarize_args (line 224) | fn summarize_args(args: &serde_json::Value) -> String { function truncate_for_summary (line 249) | fn truncate_for_summary(input: &str, max_chars: usize) -> String { function supervised_config (line 266) | fn supervised_config() -> AutonomyConfig { function full_config (line 275) | fn full_config() -> AutonomyConfig { function auto_approve_tools_skip_prompt (line 285) | fn auto_approve_tools_skip_prompt() { function always_ask_tools_always_prompt (line 292) | fn always_ask_tools_always_prompt() { function unknown_tool_needs_approval_in_supervised (line 298) | fn unknown_tool_needs_approval_in_supervised() { function full_autonomy_never_prompts (line 305) | fn full_autonomy_never_prompts() { function readonly_never_prompts (line 313) | fn readonly_never_prompts() { function always_response_adds_to_session_allowlist (line 325) | fn always_response_adds_to_session_allowlist() { function always_ask_overrides_session_allowlist (line 341) | fn always_ask_overrides_session_allowlist() { function yes_response_does_not_add_to_allowlist (line 357) | fn yes_response_does_not_add_to_allowlist() { function audit_log_records_decisions (line 371) | fn audit_log_records_decisions() { function audit_log_contains_timestamp_and_channel (line 396) | fn audit_log_contains_timestamp_and_channel() { function summarize_args_object (line 414) | fn summarize_args_object() { function summarize_args_truncates_long_values (line 422) | fn summarize_args_truncates_long_values() { function summarize_args_unicode_safe_truncation (line 431) | fn summarize_args_unicode_safe_truncation() { function summarize_args_non_object (line 440) | fn summarize_args_non_object() { function non_interactive_manager_reports_non_interactive (line 449) | fn non_interactive_manager_reports_non_interactive() { function interactive_manager_reports_interactive (line 455) | fn interactive_manager_reports_interactive() { function non_interactive_auto_approve_tools_skip_approval (line 461) | fn non_interactive_auto_approve_tools_skip_approval() { function non_interactive_shell_skips_outer_approval_by_default (line 469) | fn non_interactive_shell_skips_outer_approval_by_default() { function non_interactive_always_ask_tools_need_approval (line 475) | fn non_interactive_always_ask_tools_need_approval() { function non_interactive_unknown_tools_need_approval_in_supervised (line 483) | fn non_interactive_unknown_tools_need_approval_in_supervised() { function non_interactive_full_autonomy_never_needs_approval (line 492) | fn non_interactive_full_autonomy_never_needs_approval() { function non_interactive_readonly_never_needs_approval (line 501) | fn non_interactive_readonly_never_needs_approval() { function non_interactive_session_allowlist_still_works (line 512) | fn non_interactive_session_allowlist_still_works() { function non_interactive_always_ask_overrides_session_allowlist (line 529) | fn non_interactive_always_ask_overrides_session_allowlist() { function approval_response_serde_roundtrip (line 546) | fn approval_response_serde_roundtrip() { function approval_request_serde (line 556) | fn approval_request_serde() { FILE: src/auth/anthropic_token.rs type AnthropicAuthKind (line 6) | pub enum AnthropicAuthKind { method as_metadata_value (line 14) | pub fn as_metadata_value(self) -> &'static str { method from_metadata_value (line 21) | pub fn from_metadata_value(value: &str) -> Option { function detect_auth_kind (line 31) | pub fn detect_auth_kind(token: &str, explicit: Option<&str>) -> Anthropi... function parse_kind_from_metadata (line 57) | fn parse_kind_from_metadata() { function detect_prefers_override (line 70) | fn detect_prefers_override() { function detect_jwt_like_as_authorization (line 76) | fn detect_jwt_like_as_authorization() { function detect_default_for_api_prefix (line 82) | fn detect_default_for_api_prefix() { FILE: src/auth/gemini_oauth.rs function gemini_oauth_client_id (line 27) | pub fn gemini_oauth_client_id() -> Option { function gemini_oauth_client_secret (line 35) | pub fn gemini_oauth_client_secret() -> Option { function get_oauth_credentials (line 42) | fn get_oauth_credentials() -> Result<(String, String)> { constant GOOGLE_OAUTH_AUTHORIZE_URL (line 52) | pub const GOOGLE_OAUTH_AUTHORIZE_URL: &str = "https://accounts.google.co... constant GOOGLE_OAUTH_TOKEN_URL (line 53) | pub const GOOGLE_OAUTH_TOKEN_URL: &str = "https://oauth2.googleapis.com/... constant GOOGLE_OAUTH_DEVICE_CODE_URL (line 54) | pub const GOOGLE_OAUTH_DEVICE_CODE_URL: &str = "https://oauth2.googleapi... constant GEMINI_OAUTH_REDIRECT_URI (line 55) | pub const GEMINI_OAUTH_REDIRECT_URI: &str = "http://localhost:1456/auth/... constant GEMINI_OAUTH_SCOPES (line 58) | pub const GEMINI_OAUTH_SCOPES: &str = type DeviceCodeStart (line 62) | pub struct DeviceCodeStart { type TokenResponse (line 72) | struct TokenResponse { type DeviceCodeResponse (line 87) | struct DeviceCodeResponse { type OAuthErrorResponse (line 98) | struct OAuthErrorResponse { function build_authorize_url (line 104) | pub fn build_authorize_url(pkce: &PkceState) -> Result { function exchange_code_for_tokens (line 129) | pub async fn exchange_code_for_tokens( function refresh_access_token (line 185) | pub async fn refresh_access_token(client: &Client, refresh_token: &str) ... function start_device_code_flow (line 235) | pub async fn start_device_code_flow(client: &Client) -> Result Result { function parse_callback_request (line 437) | fn parse_callback_request(request: &str) -> Result<(String, String)> { function parse_code_from_redirect (line 467) | pub fn parse_code_from_redirect(input: &str, expected_state: Option<&str... function extract_account_email_from_id_token (line 504) | pub fn extract_account_email_from_id_token(id_token: &str) -> Option Self { method drop (line 541) | fn drop(&mut self) { function pkce_generates_valid_state (line 551) | fn pkce_generates_valid_state() { function authorize_url_contains_required_params (line 559) | fn authorize_url_contains_required_params() { function parse_code_from_url (line 575) | fn parse_code_from_url() { function parse_code_from_raw (line 582) | fn parse_code_from_raw() { function extract_email_from_id_token (line 589) | fn extract_email_from_id_token() { FILE: src/auth/mod.rs constant OPENAI_CODEX_PROVIDER (line 18) | const OPENAI_CODEX_PROVIDER: &str = "openai-codex"; constant ANTHROPIC_PROVIDER (line 19) | const ANTHROPIC_PROVIDER: &str = "anthropic"; constant GEMINI_PROVIDER (line 20) | const GEMINI_PROVIDER: &str = "gemini"; constant DEFAULT_PROFILE_NAME (line 21) | const DEFAULT_PROFILE_NAME: &str = "default"; constant OPENAI_REFRESH_SKEW_SECS (line 22) | const OPENAI_REFRESH_SKEW_SECS: u64 = 90; constant OPENAI_REFRESH_FAILURE_BACKOFF_SECS (line 23) | const OPENAI_REFRESH_FAILURE_BACKOFF_SECS: u64 = 10; constant OAUTH_REFRESH_MAX_ATTEMPTS (line 24) | const OAUTH_REFRESH_MAX_ATTEMPTS: usize = 3; constant OAUTH_REFRESH_RETRY_BASE_DELAY_MS (line 25) | const OAUTH_REFRESH_RETRY_BASE_DELAY_MS: u64 = 350; type AuthService (line 29) | pub struct AuthService { method from_config (line 35) | pub fn from_config(config: &Config) -> Self { method new (line 40) | pub fn new(state_dir: &Path, encrypt_secrets: bool) -> Self { method load_profiles (line 47) | pub async fn load_profiles(&self) -> Result { method store_openai_tokens (line 51) | pub async fn store_openai_tokens( method store_gemini_tokens (line 66) | pub async fn store_gemini_tokens( method store_provider_token (line 81) | pub async fn store_provider_token( method set_active_profile (line 97) | pub async fn set_active_profile( method remove_profile (line 125) | pub async fn remove_profile(&self, provider: &str, requested_profile: ... method get_profile (line 131) | pub async fn get_profile( method get_provider_bearer_token (line 144) | pub async fn get_provider_bearer_token( method get_valid_openai_access_token (line 162) | pub async fn get_valid_openai_access_token( method get_valid_gemini_access_token (line 252) | pub async fn get_valid_gemini_access_token( method get_gemini_profile (line 342) | pub async fn get_gemini_profile( function normalize_provider (line 350) | pub fn normalize_provider(provider: &str) -> Result { function state_dir_from_config (line 361) | pub fn state_dir_from_config(config: &Config) -> PathBuf { function default_profile_id (line 368) | pub fn default_profile_id(provider: &str) -> String { function resolve_requested_profile_id (line 372) | fn resolve_requested_profile_id(provider: &str, requested: &str) -> Stri... function select_profile_id (line 380) | pub fn select_profile_id( function refresh_openai_access_token_with_retries (line 409) | async fn refresh_openai_access_token_with_retries( function refresh_gemini_access_token_with_retries (line 441) | async fn refresh_gemini_access_token_with_retries( function refresh_lock_for_profile (line 473) | fn refresh_lock_for_profile(profile_id: &str) -> Arc Option { function set_refresh_backoff (line 497) | fn set_refresh_backoff(profile_id: &str, duration: Duration) { function clear_refresh_backoff (line 504) | fn clear_refresh_backoff(profile_id: &str) { function normalize_provider_aliases (line 517) | fn normalize_provider_aliases() { function select_profile_prefers_override_then_active_then_default (line 524) | fn select_profile_prefers_override_then_active_then_default() { FILE: src/auth/oauth_common.rs type PkceState (line 14) | pub struct PkceState { function generate_pkce_state (line 24) | pub fn generate_pkce_state() -> PkceState { function random_base64url (line 37) | pub fn random_base64url(byte_len: usize) -> String { function url_encode (line 46) | pub fn url_encode(input: &str) -> String { function url_decode (line 59) | pub fn url_decode(input: &str) -> String { function parse_query_params (line 96) | pub fn parse_query_params(input: &str) -> BTreeMap { function pkce_generation_is_valid (line 116) | fn pkce_generation_is_valid() { function pkce_challenge_is_sha256_of_verifier (line 125) | fn pkce_challenge_is_sha256_of_verifier() { function url_encode_basic (line 135) | fn url_encode_basic() { function url_decode_basic (line 142) | fn url_decode_basic() { function url_encode_decode_roundtrip (line 150) | fn url_encode_decode_roundtrip() { function parse_query_params_basic (line 158) | fn parse_query_params_basic() { function parse_query_params_encoded (line 165) | fn parse_query_params_encoded() { function parse_query_params_empty (line 172) | fn parse_query_params_empty() { function random_base64url_length (line 178) | fn random_base64url_length() { FILE: src/auth/openai_oauth.rs constant OPENAI_OAUTH_CLIENT_ID (line 18) | pub const OPENAI_OAUTH_CLIENT_ID: &str = "app_EMoamEEZ73f0CkXaXp7hrann"; constant OPENAI_OAUTH_AUTHORIZE_URL (line 19) | pub const OPENAI_OAUTH_AUTHORIZE_URL: &str = "https://auth.openai.com/oa... constant OPENAI_OAUTH_TOKEN_URL (line 20) | pub const OPENAI_OAUTH_TOKEN_URL: &str = "https://auth.openai.com/oauth/... constant OPENAI_OAUTH_DEVICE_CODE_URL (line 21) | pub const OPENAI_OAUTH_DEVICE_CODE_URL: &str = "https://auth.openai.com/... constant OPENAI_OAUTH_REDIRECT_URI (line 22) | pub const OPENAI_OAUTH_REDIRECT_URI: &str = "http://localhost:1455/auth/... type DeviceCodeStart (line 25) | pub struct DeviceCodeStart { type TokenResponse (line 36) | struct TokenResponse { type DeviceCodeResponse (line 51) | struct DeviceCodeResponse { type OAuthErrorResponse (line 65) | struct OAuthErrorResponse { function build_authorize_url (line 71) | pub fn build_authorize_url(pkce: &PkceState) -> String { function exchange_code_for_tokens (line 91) | pub async fn exchange_code_for_tokens( function refresh_access_token (line 114) | pub async fn refresh_access_token(client: &Client, refresh_token: &str) ... function start_device_code_flow (line 131) | pub async fn start_device_code_flow(client: &Client) -> Result Option { function parse_token_response (line 341) | async fn parse_token_response(response: reqwest::Response) -> Result bool { type AuthProfile (line 55) | pub struct AuthProfile { method fmt (line 75) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { method new_oauth (line 90) | pub fn new_oauth(provider: &str, profile_name: &str, token_set: TokenS... method new_token (line 108) | pub fn new_token(provider: &str, profile_name: &str, token: String) ->... type AuthProfilesData (line 128) | pub struct AuthProfilesData { method default (line 136) | fn default() -> Self { type AuthProfilesStore (line 147) | pub struct AuthProfilesStore { method new (line 154) | pub fn new(state_dir: &Path, encrypt_secrets: bool) -> Self { method path (line 162) | pub fn path(&self) -> &Path { method load (line 166) | pub async fn load(&self) -> Result { method upsert_profile (line 171) | pub async fn upsert_profile(&self, mut profile: AuthProfile, set_activ... method remove_profile (line 191) | pub async fn remove_profile(&self, profile_id: &str) -> Result { method set_active_profile (line 207) | pub async fn set_active_profile(&self, provider: &str, profile_id: &st... method clear_active_profile (line 221) | pub async fn clear_active_profile(&self, provider: &str) -> Result<()> { method update_profile (line 229) | pub async fn update_profile(&self, profile_id: &str, mut updater: F... method load_locked (line 249) | async fn load_locked(&self) -> Result { method save_locked (line 327) | async fn save_locked(&self, data: &AuthProfilesData) -> Result<()> { method read_persisted_locked (line 376) | async fn read_persisted_locked(&self) -> Result { method write_persisted_locked (line 415) | async fn write_persisted_locked(&self, persisted: &PersistedAuthProfil... method encrypt_optional (line 452) | fn encrypt_optional(&self, value: Option<&str>) -> Result) -> Result<(Option Result { type AuthProfileLockGuard (line 528) | struct AuthProfileLockGuard { method drop (line 533) | fn drop(&mut self) { type PersistedAuthProfiles (line 539) | struct PersistedAuthProfiles { method default (line 551) | fn default() -> Self { type PersistedAuthProfile (line 562) | struct PersistedAuthProfile { function default_schema_version (line 592) | fn default_schema_version() -> u32 { function default_now_rfc3339 (line 596) | fn default_now_rfc3339() -> String { function parse_profile_kind (line 600) | fn parse_profile_kind(value: &str) -> Result { function profile_kind_to_string (line 608) | fn profile_kind_to_string(kind: AuthProfileKind) -> &'static str { function parse_optional_datetime (line 615) | fn parse_optional_datetime(value: Option<&str>) -> Result Result> { function parse_datetime_with_fallback (line 625) | fn parse_datetime_with_fallback(value: &str) -> DateTime { function profile_id (line 629) | pub fn profile_id(provider: &str, profile_name: &str) -> String { function profile_id_format (line 639) | fn profile_id_format() { function token_expiry_math (line 647) | fn token_expiry_math() { function store_roundtrip_with_encryption (line 662) | async fn store_roundtrip_with_encryption() { function atomic_write_replaces_file (line 703) | async fn atomic_write_replaces_file() { FILE: src/channels/bluesky.rs type BlueskyChannel (line 9) | pub struct BlueskyChannel { method new (line 103) | pub fn new(handle: String, app_password: String) -> Self { method http_client (line 116) | fn http_client(&self) -> reqwest::Client { method create_session (line 121) | async fn create_session(&self) -> Result<()> { method refresh_session (line 152) | async fn refresh_session(&self) -> Result<()> { method get_access_jwt (line 184) | async fn get_access_jwt(&self) -> Result { method get_did (line 197) | fn get_did(&self) -> String { method parse_notification (line 202) | fn parse_notification(&self, notif: &Notification) -> Option Result<()> { type BlueskyAuth (line 15) | struct BlueskyAuth { constant BSKY_API_BASE (line 22) | const BSKY_API_BASE: &str = "https://bsky.social/xrpc"; constant POLL_INTERVAL (line 23) | const POLL_INTERVAL: Duration = Duration::from_secs(5); type CreateSessionResponse (line 26) | struct CreateSessionResponse { type RefreshSessionResponse (line 35) | struct RefreshSessionResponse { type NotificationListResponse (line 43) | struct NotificationListResponse { type Notification (line 50) | struct Notification { type NotificationAuthor (line 64) | struct NotificationAuthor { type CreateRecordRequest (line 73) | struct CreateRecordRequest { type PostRecord (line 80) | struct PostRecord { type ReplyRef (line 91) | struct ReplyRef { type PostRef (line 97) | struct PostRef { method name (line 279) | fn name(&self) -> &str { method send (line 283) | async fn send(&self, message: &SendMessage) -> Result<()> { method listen (line 351) | async fn listen(&self, tx: tokio::sync::mpsc::Sender) ->... method health_check (line 419) | async fn health_check(&self) -> bool { function make_channel (line 428) | fn make_channel() -> BlueskyChannel { function make_notification (line 438) | fn make_notification( function parse_mention_notification (line 461) | fn parse_mention_notification() { function parse_reply_notification (line 479) | fn parse_reply_notification() { function skip_read_notifications (line 495) | fn skip_read_notifications() { function skip_own_notifications (line 509) | fn skip_own_notifications() { function skip_like_notifications (line 523) | fn skip_like_notifications() { function skip_empty_text (line 537) | fn skip_empty_text() { function reply_target_encoding (line 545) | fn reply_target_encoding() { function send_message_formatting (line 564) | fn send_message_formatting() { FILE: src/channels/clawdtalk.rs type ClawdTalkChannel (line 16) | pub struct ClawdTalkChannel { method new (line 59) | pub fn new(config: ClawdTalkConfig) -> Self { constant TELNYX_API_URL (line 74) | const TELNYX_API_URL: &'static str = "https://api.telnyx.com/v2"; method is_destination_allowed (line 77) | fn is_destination_allowed(&self, destination: &str) -> bool { method initiate_call (line 87) | pub async fn initiate_call( method speak (line 132) | pub async fn speak(&self, call_control_id: &str, text: &str) -> anyhow... method hangup (line 163) | pub async fn hangup(&self, call_control_id: &str) -> anyhow::Result<()> { method start_ai_conversation (line 184) | pub async fn start_ai_conversation( type ClawdTalkConfig (line 33) | pub struct ClawdTalkConfig { method name (line 49) | fn name() -> &'static str { method desc (line 52) | fn desc() -> &'static str { type CallSession (line 223) | pub struct CallSession { type CallRequest (line 231) | struct CallRequest { type AnsweringMachineDetection (line 244) | struct AnsweringMachineDetection { type CallResponse (line 250) | struct CallResponse { type SpeakRequest (line 258) | struct SpeakRequest { type AiConversationRequest (line 268) | struct AiConversationRequest { type VoiceSettings (line 275) | struct VoiceSettings { method name (line 282) | fn name(&self) -> &str { method send (line 286) | async fn send(&self, message: &SendMessage) -> anyhow::Result<()> { method listen (line 304) | async fn listen(&self, tx: mpsc::Sender) -> anyhow::Resu... method health_check (line 323) | async fn health_check(&self) -> bool { type TelnyxWebhookEvent (line 344) | pub struct TelnyxWebhookEvent { type TelnyxWebhookData (line 349) | pub struct TelnyxWebhookData { type TelnyxCallPayload (line 355) | pub struct TelnyxCallPayload { function test_config (line 369) | fn test_config() -> ClawdTalkConfig { function creates_channel (line 380) | fn creates_channel() { function destination_allowed_exact_match (line 386) | fn destination_allowed_exact_match() { function destination_allowed_wildcard (line 393) | fn destination_allowed_wildcard() { function destination_allowed_empty_means_all (line 402) | fn destination_allowed_empty_means_all() { function webhook_event_deserializes (line 411) | fn webhook_event_deserializes() { FILE: src/channels/cli.rs type CliChannel (line 7) | pub struct CliChannel; method new (line 10) | pub fn new() -> Self { method name (line 17) | fn name(&self) -> &str { method send (line 21) | async fn send(&self, message: &SendMessage) -> anyhow::Result<()> { method listen (line 26) | async fn listen(&self, tx: tokio::sync::mpsc::Sender) ->... function cli_channel_name (line 67) | fn cli_channel_name() { function cli_channel_send_does_not_panic (line 72) | async fn cli_channel_send_does_not_panic() { function cli_channel_send_empty_message (line 86) | async fn cli_channel_send_empty_message() { function cli_channel_health_check (line 100) | async fn cli_channel_health_check() { function channel_message_struct (line 106) | fn channel_message_struct() { function channel_message_clone (line 126) | fn channel_message_clone() { FILE: src/channels/dingtalk.rs constant DINGTALK_BOT_CALLBACK_TOPIC (line 10) | const DINGTALK_BOT_CALLBACK_TOPIC: &str = "/v1.0/im/bot/messages/get"; type DingTalkChannel (line 14) | pub struct DingTalkChannel { method new (line 31) | pub fn new(client_id: String, client_secret: String, allowed_users: Ve... method http_client (line 40) | fn http_client(&self) -> reqwest::Client { method is_user_allowed (line 44) | fn is_user_allowed(&self, user_id: &str) -> bool { method parse_stream_data (line 48) | fn parse_stream_data(frame: &serde_json::Value) -> Option String { method register_connection (line 78) | async fn register_connection(&self) -> anyhow::Result { type GatewayResponse (line 25) | struct GatewayResponse { method name (line 110) | fn name(&self) -> &str { method send (line 114) | async fn send(&self, message: &SendMessage) -> anyhow::Result<()> { method listen (line 149) | async fn listen(&self, tx: tokio::sync::mpsc::Sender) ->... method health_check (line 293) | async fn health_check(&self) -> bool { function test_name (line 303) | fn test_name() { function test_user_allowed_wildcard (line 309) | fn test_user_allowed_wildcard() { function test_user_allowed_specific (line 315) | fn test_user_allowed_specific() { function test_user_denied_empty (line 322) | fn test_user_denied_empty() { function test_config_serde (line 328) | fn test_config_serde() { function test_config_serde_defaults (line 341) | fn test_config_serde_defaults() { function parse_stream_data_supports_string_payload (line 351) | fn parse_stream_data_supports_string_payload() { function parse_stream_data_supports_object_payload (line 363) | fn parse_stream_data_supports_object_payload() { function resolve_chat_id_handles_numeric_group_conversation_type (line 375) | fn resolve_chat_id_handles_numeric_group_conversation_type() { FILE: src/channels/discord.rs type DiscordChannel (line 14) | pub struct DiscordChannel { method new (line 24) | pub fn new( method http_client (line 41) | fn http_client(&self) -> reqwest::Client { method is_user_allowed (line 48) | fn is_user_allowed(&self, user_id: &str) -> bool { method bot_user_id_from_token (line 52) | fn bot_user_id_from_token(token: &str) -> Option { function process_attachments (line 64) | async fn process_attachments( type DiscordAttachmentKind (line 108) | enum DiscordAttachmentKind { method from_marker (line 117) | fn from_marker(kind: &str) -> Option { method marker_name (line 128) | fn marker_name(&self) -> &'static str { type DiscordAttachment (line 140) | struct DiscordAttachment { function parse_attachment_markers (line 145) | fn parse_attachment_markers(message: &str) -> (String, Vec Vec { function pick_uniform_index (line 366) | fn pick_uniform_index(len: usize) -> usize { function random_discord_ack_reaction (line 380) | fn random_discord_ack_reaction() -> &'static str { function encode_emoji_for_discord (line 389) | fn encode_emoji_for_discord(emoji: &str) -> String { function discord_reaction_url (line 401) | fn discord_reaction_url(channel_id: &str, message_id: &str, emoji: &str)... function mention_tags (line 409) | fn mention_tags(bot_user_id: &str) -> [String; 2] { function contains_bot_mention (line 413) | fn contains_bot_mention(content: &str, bot_user_id: &str) -> bool { function normalize_incoming_content (line 418) | fn normalize_incoming_content( function base64_decode (line 448) | fn base64_decode(input: &str) -> Option { method name (line 486) | fn name(&self) -> &str { method send (line 490) | async fn send(&self, message: &SendMessage) -> anyhow::Result<()> { method listen (line 541) | async fn listen(&self, tx: tokio::sync::mpsc::Sender) ->... method health_check (line 805) | async fn health_check(&self) -> bool { method start_typing (line 815) | async fn start_typing(&self, recipient: &str) -> anyhow::Result<()> { method stop_typing (line 840) | async fn stop_typing(&self, recipient: &str) -> anyhow::Result<()> { method add_reaction (line 848) | async fn add_reaction( method remove_reaction (line 876) | async fn remove_reaction( function discord_channel_name (line 909) | fn discord_channel_name() { function base64_decode_bot_id (line 915) | fn base64_decode_bot_id() { function bot_user_id_extraction (line 922) | fn bot_user_id_extraction() { function empty_allowlist_denies_everyone (line 930) | fn empty_allowlist_denies_everyone() { function wildcard_allows_everyone (line 937) | fn wildcard_allows_everyone() { function specific_allowlist_filters (line 944) | fn specific_allowlist_filters() { function allowlist_is_exact_match_not_substring (line 959) | fn allowlist_is_exact_match_not_substring() { function allowlist_empty_string_user_id (line 967) | fn allowlist_empty_string_user_id() { function allowlist_with_wildcard_and_specific (line 973) | fn allowlist_with_wildcard_and_specific() { function allowlist_case_sensitive (line 986) | fn allowlist_case_sensitive() { function base64_decode_empty_string (line 994) | fn base64_decode_empty_string() { function base64_decode_invalid_chars (line 1000) | fn base64_decode_invalid_chars() { function bot_user_id_from_empty_token (line 1006) | fn bot_user_id_from_empty_token() { function contains_bot_mention_supports_plain_and_nick_forms (line 1012) | fn contains_bot_mention_supports_plain_and_nick_forms() { function normalize_incoming_content_requires_mention_when_enabled (line 1019) | fn normalize_incoming_content_requires_mention_when_enabled() { function normalize_incoming_content_strips_mentions_and_trims (line 1025) | fn normalize_incoming_content_strips_mentions_and_trims() { function normalize_incoming_content_rejects_empty_after_strip (line 1031) | fn normalize_incoming_content_rejects_empty_after_strip() { function mention_only_dm_bypasses_mention_gate (line 1039) | fn mention_only_dm_bypasses_mention_gate() { function mention_only_guild_message_without_mention_is_rejected (line 1050) | fn mention_only_guild_message_without_mention_is_rejected() { function mention_only_guild_message_with_mention_passes_and_strips (line 1061) | fn mention_only_guild_message_with_mention_passes_and_strips() { function split_empty_message (line 1074) | fn split_empty_message() { function split_short_message_under_limit (line 1080) | fn split_short_message_under_limit() { function split_message_exactly_2000_chars (line 1087) | fn split_message_exactly_2000_chars() { function split_message_just_over_limit (line 1095) | fn split_message_just_over_limit() { function split_very_long_message (line 1104) | fn split_very_long_message() { function split_prefer_newline_break (line 1118) | fn split_prefer_newline_break() { function split_prefer_space_break (line 1128) | fn split_prefer_space_break() { function split_without_good_break_points_hard_split (line 1135) | fn split_without_good_break_points_hard_split() { function split_multiple_breaks (line 1146) | fn split_multiple_breaks() { function split_preserves_content (line 1160) | fn split_preserves_content() { function split_unicode_content (line 1168) | fn split_unicode_content() { function split_newline_too_close_to_end (line 1183) | fn split_newline_too_close_to_end() { function split_multibyte_only_content_without_panics (line 1192) | fn split_multibyte_only_content_without_panics() { function split_chunks_always_within_discord_limit (line 1203) | fn split_chunks_always_within_discord_limit() { function split_message_with_multiple_newlines (line 1212) | fn split_message_with_multiple_newlines() { function typing_handles_start_empty (line 1221) | fn typing_handles_start_empty() { function start_typing_sets_handle (line 1228) | async fn start_typing_sets_handle() { function stop_typing_clears_handle (line 1236) | async fn stop_typing_clears_handle() { function stop_typing_is_idempotent (line 1245) | async fn stop_typing_is_idempotent() { function concurrent_typing_handles_are_independent (line 1252) | async fn concurrent_typing_handles_are_independent() { function encode_emoji_unicode_percent_encodes (line 1272) | fn encode_emoji_unicode_percent_encodes() { function encode_emoji_checkmark (line 1278) | fn encode_emoji_checkmark() { function encode_emoji_custom_guild_emoji_passthrough (line 1284) | fn encode_emoji_custom_guild_emoji_passthrough() { function encode_emoji_simple_ascii_char (line 1290) | fn encode_emoji_simple_ascii_char() { function random_discord_ack_reaction_is_from_pool (line 1296) | fn random_discord_ack_reaction_is_from_pool() { function discord_reaction_url_encodes_emoji_and_strips_prefix (line 1304) | fn discord_reaction_url_encodes_emoji_and_strips_prefix() { function discord_message_id_format_includes_discord_prefix (line 1315) | fn discord_message_id_format_includes_discord_prefix() { function discord_message_id_is_deterministic (line 1323) | fn discord_message_id_is_deterministic() { function discord_message_id_different_message_different_id (line 1332) | fn discord_message_id_different_message_different_id() { function discord_message_id_uses_snowflake_id (line 1340) | fn discord_message_id_uses_snowflake_id() { function discord_message_id_fallback_to_uuid_on_empty (line 1350) | fn discord_message_id_fallback_to_uuid_on_empty() { function split_message_code_block_at_boundary (line 1369) | fn split_message_code_block_at_boundary() { function split_message_single_long_word_exceeds_limit (line 1390) | fn split_message_single_long_word_exceeds_limit() { function split_message_exactly_at_limit_no_split (line 1408) | fn split_message_exactly_at_limit_no_split() { function split_message_one_over_limit_splits (line 1416) | fn split_message_one_over_limit_splits() { function split_message_many_short_lines (line 1423) | fn split_message_many_short_lines() { function split_message_only_whitespace (line 1442) | fn split_message_only_whitespace() { function split_message_emoji_at_boundary (line 1450) | fn split_message_emoji_at_boundary() { function split_message_consecutive_newlines_at_boundary (line 1465) | fn split_message_consecutive_newlines_at_boundary() { function process_attachments_empty_list_returns_empty (line 1478) | async fn process_attachments_empty_list_returns_empty() { function process_attachments_skips_unsupported_types (line 1485) | async fn process_attachments_skips_unsupported_types() { function parse_attachment_markers_extracts_supported_markers (line 1497) | fn parse_attachment_markers_extracts_supported_markers() { function parse_attachment_markers_keeps_invalid_marker_text (line 1510) | fn parse_attachment_markers_keeps_invalid_marker_text() { function classify_outgoing_attachments_splits_local_remote_and_unresolved (line 1519) | fn classify_outgoing_attachments_splits_local_remote_and_unresolved() { function with_inline_attachment_urls_appends_urls_and_unresolved_markers (line 1550) | fn with_inline_attachment_urls_appends_urls_and_unresolved_markers() { FILE: src/channels/email_channel.rs type EmailConfig (line 40) | pub struct EmailConfig { method name (line 76) | fn name() -> &'static str { method desc (line 79) | fn desc() -> &'static str { function default_imap_port (line 84) | fn default_imap_port() -> u16 { function default_smtp_port (line 87) | fn default_smtp_port() -> u16 { function default_imap_folder (line 90) | fn default_imap_folder() -> String { function default_idle_timeout (line 93) | fn default_idle_timeout() -> u64 { function default_true (line 96) | fn default_true() -> bool { function default_subject (line 99) | fn default_subject() -> String { method default (line 104) | fn default() -> Self { type ImapSession (line 122) | type ImapSession = Session>; type EmailChannel (line 125) | pub struct EmailChannel { method new (line 131) | pub fn new(config: EmailConfig) -> Self { method is_sender_allowed (line 139) | pub fn is_sender_allowed(&self, email: &str) -> bool { method strip_html (line 162) | pub fn strip_html(html: &str) -> String { method extract_sender (line 184) | fn extract_sender(parsed: &mail_parser::Message) -> String { method extract_text (line 194) | fn extract_text(parsed: &mail_parser::Message) -> String { method connect_imap (line 216) | async fn connect_imap(&self) -> Result { method fetch_unseen (line 248) | async fn fetch_unseen(&self, session: &mut ImapSession) -> Result) -> ... method run_idle_session (line 400) | async fn run_idle_session(&self, tx: &mpsc::Sender) ->... method process_unseen (line 440) | async fn process_unseen( method create_smtp_transport (line 482) | fn create_smtp_transport(&self) -> Result { type ParsedEmail (line 500) | struct ParsedEmail { type IdleWaitResult (line 509) | enum IdleWaitResult { method name (line 517) | fn name(&self) -> &str { method send (line 521) | async fn send(&self, message: &SendMessage) -> Result<()> { method listen (line 548) | async fn listen(&self, tx: mpsc::Sender) -> Result<()> { method health_check (line 556) | async fn health_check(&self) -> bool { function default_smtp_port_uses_tls_port (line 581) | fn default_smtp_port_uses_tls_port() { function email_config_default_uses_tls_smtp_defaults (line 586) | fn email_config_default_uses_tls_smtp_defaults() { function default_idle_timeout_is_29_minutes (line 593) | fn default_idle_timeout_is_29_minutes() { function seen_messages_starts_empty (line 598) | async fn seen_messages_starts_empty() { function seen_messages_tracks_unique_ids (line 605) | async fn seen_messages_tracks_unique_ids() { function email_config_default (line 618) | fn email_config_default() { function email_config_custom (line 634) | fn email_config_custom() { function email_config_clone (line 656) | fn email_config_clone() { function email_channel_new (line 681) | async fn email_channel_new() { function email_channel_name (line 691) | fn email_channel_name() { function is_sender_allowed_empty_list_denies_all (line 699) | fn is_sender_allowed_empty_list_denies_all() { function is_sender_allowed_wildcard_allows_all (line 710) | fn is_sender_allowed_wildcard_allows_all() { function is_sender_allowed_specific_email (line 722) | fn is_sender_allowed_specific_email() { function is_sender_allowed_domain_with_at_prefix (line 734) | fn is_sender_allowed_domain_with_at_prefix() { function is_sender_allowed_domain_without_at_prefix (line 746) | fn is_sender_allowed_domain_without_at_prefix() { function is_sender_allowed_case_insensitive (line 758) | fn is_sender_allowed_case_insensitive() { function is_sender_allowed_multiple_senders (line 770) | fn is_sender_allowed_multiple_senders() { function is_sender_allowed_wildcard_with_specific (line 787) | fn is_sender_allowed_wildcard_with_specific() { function is_sender_allowed_empty_sender (line 798) | fn is_sender_allowed_empty_sender() { function strip_html_basic (line 812) | fn strip_html_basic() { function strip_html_nested_tags (line 818) | fn strip_html_nested_tags() { function strip_html_multiple_lines (line 826) | fn strip_html_multiple_lines() { function strip_html_preserves_text (line 832) | fn strip_html_preserves_text() { function strip_html_handles_malformed (line 838) | fn strip_html_handles_malformed() { function strip_html_self_closing_tags (line 848) | fn strip_html_self_closing_tags() { function strip_html_attributes_preserved (line 855) | fn strip_html_attributes_preserved() { function strip_html_multiple_spaces_collapsed (line 863) | fn strip_html_multiple_spaces_collapsed() { function strip_html_special_characters (line 871) | fn strip_html_special_characters() { function default_imap_port_returns_993 (line 881) | fn default_imap_port_returns_993() { function default_smtp_port_returns_465 (line 886) | fn default_smtp_port_returns_465() { function default_imap_folder_returns_inbox (line 891) | fn default_imap_folder_returns_inbox() { function default_true_returns_true (line 896) | fn default_true_returns_true() { function email_config_serialize_deserialize (line 903) | fn email_config_serialize_deserialize() { function email_config_deserialize_with_defaults (line 929) | fn email_config_deserialize_with_defaults() { function idle_timeout_deserializes_explicit_value (line 947) | fn idle_timeout_deserializes_explicit_value() { function idle_timeout_deserializes_legacy_poll_interval_alias (line 961) | fn idle_timeout_deserializes_legacy_poll_interval_alias() { function idle_timeout_propagates_to_channel (line 975) | fn idle_timeout_propagates_to_channel() { function email_config_debug_output (line 985) | fn email_config_debug_output() { FILE: src/channels/imessage.rs function extract_text_from_attributed_body (line 17) | fn extract_text_from_attributed_body(blob: &[u8]) -> Option { function resolve_message_content (line 58) | fn resolve_message_content(rowid: i64, text: Option, body: Optio... type IMessageChannel (line 73) | pub struct IMessageChannel { method new (line 79) | pub fn new(allowed_contacts: Vec) -> Self { method is_contact_allowed (line 86) | fn is_contact_allowed(&self, sender: &str) -> bool { function escape_applescript (line 102) | fn escape_applescript(s: &str) -> String { function is_valid_imessage_target (line 117) | fn is_valid_imessage_target(target: &str) -> bool { method name (line 156) | fn name(&self) -> &str { method send (line 160) | async fn send(&self, message: &SendMessage) -> anyhow::Result<()> { method listen (line 195) | async fn listen(&self, tx: mpsc::Sender) -> anyhow::Resu... method health_check (line 312) | async fn health_check(&self) -> bool { function get_max_rowid (line 327) | async fn get_max_rowid(db_path: &Path) -> anyhow::Result { function fetch_new_messages (line 345) | async fn fetch_new_messages( function creates_with_contacts (line 389) | fn creates_with_contacts() { function creates_with_empty_contacts (line 396) | fn creates_with_empty_contacts() { function wildcard_allows_anyone (line 402) | fn wildcard_allows_anyone() { function specific_contact_allowed (line 410) | fn specific_contact_allowed() { function unknown_contact_denied (line 417) | fn unknown_contact_denied() { function contact_case_insensitive (line 424) | fn contact_case_insensitive() { function empty_allowlist_denies_all (line 431) | fn empty_allowlist_denies_all() { function name_returns_imessage (line 438) | fn name_returns_imessage() { function wildcard_among_others_still_allows_all (line 444) | fn wildcard_among_others_still_allows_all() { function contact_with_spaces_exact_match (line 450) | fn contact_with_spaces_exact_match() { function escape_applescript_double_quotes (line 461) | fn escape_applescript_double_quotes() { function escape_applescript_backslashes (line 466) | fn escape_applescript_backslashes() { function escape_applescript_mixed (line 471) | fn escape_applescript_mixed() { function escape_applescript_injection_attempt (line 479) | fn escape_applescript_injection_attempt() { function escape_applescript_empty_string (line 500) | fn escape_applescript_empty_string() { function escape_applescript_no_special_chars (line 505) | fn escape_applescript_no_special_chars() { function escape_applescript_unicode (line 510) | fn escape_applescript_unicode() { function escape_applescript_newlines_escaped (line 515) | fn escape_applescript_newlines_escaped() { function valid_phone_number_simple (line 526) | fn valid_phone_number_simple() { function valid_phone_number_with_country_code (line 531) | fn valid_phone_number_with_country_code() { function valid_phone_number_with_spaces (line 536) | fn valid_phone_number_with_spaces() { function valid_phone_number_with_dashes (line 541) | fn valid_phone_number_with_dashes() { function valid_phone_number_international (line 546) | fn valid_phone_number_international() { function valid_email_simple (line 552) | fn valid_email_simple() { function valid_email_with_subdomain (line 557) | fn valid_email_with_subdomain() { function valid_email_with_plus (line 562) | fn valid_email_with_plus() { function valid_email_with_dots (line 567) | fn valid_email_with_dots() { function valid_email_icloud (line 572) | fn valid_email_icloud() { function invalid_target_empty (line 578) | fn invalid_target_empty() { function invalid_target_no_plus_prefix (line 584) | fn invalid_target_no_plus_prefix() { function invalid_target_too_short_phone (line 590) | fn invalid_target_too_short_phone() { function invalid_target_too_long_phone (line 596) | fn invalid_target_too_long_phone() { function invalid_target_email_no_at (line 602) | fn invalid_target_email_no_at() { function invalid_target_email_no_domain (line 607) | fn invalid_target_email_no_domain() { function invalid_target_email_no_local (line 612) | fn invalid_target_email_no_local() { function invalid_target_email_no_dot_in_domain (line 617) | fn invalid_target_email_no_dot_in_domain() { function invalid_target_injection_attempt (line 622) | fn invalid_target_injection_attempt() { function invalid_target_applescript_injection (line 628) | fn invalid_target_applescript_injection() { function invalid_target_special_chars (line 636) | fn invalid_target_special_chars() { function invalid_target_null_byte (line 642) | fn invalid_target_null_byte() { function invalid_target_newline (line 647) | fn invalid_target_newline() { function target_with_leading_trailing_whitespace_trimmed (line 652) | fn target_with_leading_trailing_whitespace_trimmed() { function create_test_db (line 663) | fn create_test_db() -> (tempfile::TempDir, std::path::PathBuf) { function get_max_rowid_empty_database (line 690) | async fn get_max_rowid_empty_database() { function get_max_rowid_with_messages (line 699) | async fn get_max_rowid_with_messages() { function get_max_rowid_nonexistent_database (line 731) | async fn get_max_rowid_nonexistent_database() { function fetch_new_messages_empty_database (line 738) | async fn fetch_new_messages_empty_database() { function fetch_new_messages_returns_correct_data (line 746) | async fn fetch_new_messages_returns_correct_data() { function fetch_new_messages_filters_by_rowid (line 789) | async fn fetch_new_messages_filters_by_rowid() { function fetch_new_messages_excludes_sent_messages (line 818) | async fn fetch_new_messages_excludes_sent_messages() { function fetch_new_messages_excludes_null_text_and_null_body (line 845) | async fn fetch_new_messages_excludes_null_text_and_null_body() { function fetch_new_messages_respects_limit (line 874) | async fn fetch_new_messages_respects_limit() { function fetch_new_messages_ordered_by_rowid_asc (line 900) | async fn fetch_new_messages_ordered_by_rowid_asc() { function fetch_new_messages_nonexistent_database (line 933) | async fn fetch_new_messages_nonexistent_database() { function fetch_new_messages_handles_special_characters (line 940) | async fn fetch_new_messages_handles_special_characters() { function fetch_new_messages_handles_unicode (line 964) | async fn fetch_new_messages_handles_unicode() { function fetch_new_messages_filters_empty_text (line 986) | async fn fetch_new_messages_filters_empty_text() { function fetch_new_messages_negative_rowid_edge_case (line 1009) | async fn fetch_new_messages_negative_rowid_edge_case() { function fetch_new_messages_large_rowid_edge_case (line 1031) | async fn fetch_new_messages_large_rowid_edge_case() { function make_attributed_body (line 1058) | fn make_attributed_body(text: &str) -> Vec { constant REAL_BLOB_TESTING (line 1091) | const REAL_BLOB_TESTING: &[u8] = &[ constant REAL_BLOB_ONE (line 1110) | const REAL_BLOB_ONE: &[u8] = &[ function extract_real_blob_testing_with_imsg (line 1126) | fn extract_real_blob_testing_with_imsg() { function extract_real_blob_single_char (line 1132) | fn extract_real_blob_single_char() { function extract_text_containing_end_marker_bytes (line 1139) | fn extract_text_containing_end_marker_bytes() { function extract_zero_length_returns_empty_string (line 1150) | fn extract_zero_length_returns_empty_string() { function extract_no_markers_returns_none (line 1160) | fn extract_no_markers_returns_none() { function extract_invalid_utf8_returns_none (line 1167) | fn extract_invalid_utf8_returns_none() { function extract_truncated_blob_returns_none (line 1174) | fn extract_truncated_blob_returns_none() { function extract_long_text_two_byte_length (line 1182) | fn extract_long_text_two_byte_length() { function extract_four_byte_length_prefix (line 1191) | fn extract_four_byte_length_prefix() { function extract_text_boundary_127_to_128 (line 1205) | fn extract_text_boundary_127_to_128() { function fetch_new_messages_reads_attributed_body_fallback (line 1216) | async fn fetch_new_messages_reads_attributed_body_fallback() { function fetch_new_messages_empty_text_falls_back_to_attributed_body (line 1239) | async fn fetch_new_messages_empty_text_falls_back_to_attributed_body() { function fetch_new_messages_prefers_text_over_attributed_body (line 1262) | async fn fetch_new_messages_prefers_text_over_attributed_body() { function fetch_new_messages_mixed_text_and_attributed_body (line 1285) | async fn fetch_new_messages_mixed_text_and_attributed_body() { FILE: src/channels/irc.rs constant READ_TIMEOUT (line 13) | const READ_TIMEOUT: std::time::Duration = std::time::Duration::from_secs... type IrcChannel (line 23) | pub struct IrcChannel { method new (line 243) | pub fn new(cfg: IrcChannelConfig) -> Self { method is_user_allowed (line 260) | fn is_user_allowed(&self, nick: &str) -> bool { method connect (line 270) | async fn connect( method send_raw (line 297) | async fn send_raw(writer: &mut WriteHalf, line: &str) -> anyhow::Resul... type WriteHalf (line 38) | type WriteHalf = tokio::io::WriteHalf &'static str { method ws_base (line 72) | fn ws_base(self) -> &'static str { method locale_header (line 79) | fn locale_header(self) -> &'static str { method proxy_service_key (line 86) | fn proxy_service_key(self) -> &'static str { method channel_name (line 93) | fn channel_name(self) -> &'static str { type PbHeader (line 106) | struct PbHeader { type PbFrame (line 116) | struct PbFrame { method header_value (line 132) | fn header_value<'a>(&'a self, key: &str) -> &'a str { type WsClientConfig (line 143) | struct WsClientConfig { type WsEndpointResp (line 150) | struct WsEndpointResp { type WsEndpoint (line 159) | struct WsEndpoint { type LarkEvent (line 168) | struct LarkEvent { type LarkEventHeader (line 174) | struct LarkEventHeader { type MsgReceivePayload (line 181) | struct MsgReceivePayload { type LarkSender (line 187) | struct LarkSender { type LarkSenderId (line 194) | struct LarkSenderId { type LarkMessage (line 199) | struct LarkMessage { constant WS_HEARTBEAT_TIMEOUT (line 212) | const WS_HEARTBEAT_TIMEOUT: Duration = Duration::from_secs(300); constant LARK_TOKEN_REFRESH_SKEW (line 214) | const LARK_TOKEN_REFRESH_SKEW: Duration = Duration::from_secs(120); constant LARK_DEFAULT_TOKEN_TTL (line 216) | const LARK_DEFAULT_TOKEN_TTL: Duration = Duration::from_secs(7200); constant LARK_INVALID_ACCESS_TOKEN_CODE (line 218) | const LARK_INVALID_ACCESS_TOKEN_CODE: i64 = 99_991_663; function should_refresh_last_recv (line 222) | fn should_refresh_last_recv(msg: &WsMsg) -> bool { type CachedTenantToken (line 227) | struct CachedTenantToken { function extract_lark_response_code (line 232) | fn extract_lark_response_code(body: &serde_json::Value) -> Option { function is_lark_invalid_access_token (line 236) | fn is_lark_invalid_access_token(body: &serde_json::Value) -> bool { function should_refresh_lark_tenant_token (line 240) | fn should_refresh_lark_tenant_token(status: reqwest::StatusCode, body: &... function extract_lark_token_ttl_seconds (line 244) | fn extract_lark_token_ttl_seconds(body: &serde_json::Value) -> u64 { function next_token_refresh_deadline (line 259) | fn next_token_refresh_deadline(now: Instant, ttl_seconds: u64) -> Instant { function ensure_lark_send_success (line 267) | fn ensure_lark_send_success( type LarkChannel (line 290) | pub struct LarkChannel { method new (line 310) | pub fn new( method new_with_platform (line 329) | fn new_with_platform( method from_config (line 355) | pub fn from_config(config: &crate::config::schema::LarkConfig) -> Self { method from_lark_config (line 377) | pub fn from_lark_config(config: &crate::config::schema::LarkConfig) ->... method from_feishu_config (line 392) | pub fn from_feishu_config(config: &crate::config::schema::FeishuConfig... method http_client (line 406) | fn http_client(&self) -> reqwest::Client { method channel_name (line 410) | fn channel_name(&self) -> &'static str { method api_base (line 414) | fn api_base(&self) -> &'static str { method ws_base (line 418) | fn ws_base(&self) -> &'static str { method tenant_access_token_url (line 422) | fn tenant_access_token_url(&self) -> String { method bot_info_url (line 426) | fn bot_info_url(&self) -> String { method send_message_url (line 430) | fn send_message_url(&self) -> String { method message_reaction_url (line 434) | fn message_reaction_url(&self, message_id: &str) -> String { method resolved_bot_open_id (line 438) | fn resolved_bot_open_id(&self) -> Option { method set_resolved_bot_open_id (line 445) | fn set_resolved_bot_open_id(&self, open_id: Option) { method post_message_reaction_with_token (line 451) | async fn post_message_reaction_with_token( method try_add_ack_reaction (line 478) | async fn try_add_ack_reaction(&self, message_id: &str, emoji_type: &st... method get_ws_endpoint (line 549) | async fn get_ws_endpoint(&self) -> anyhow::Result<(String, WsClientCon... method listen_ws (line 578) | async fn listen_ws(&self, tx: tokio::sync::mpsc::Sender bool { method get_tenant_access_token (line 843) | async fn get_tenant_access_token(&self) -> anyhow::Result { method invalidate_token (line 899) | async fn invalidate_token(&self) { method fetch_bot_open_id_with_token (line 904) | async fn fetch_bot_open_id_with_token( method refresh_bot_open_id (line 922) | async fn refresh_bot_open_id(&self) -> anyhow::Result> { method ensure_bot_open_id (line 960) | async fn ensure_bot_open_id(&self) { method send_text_once (line 982) | async fn send_text_once( method parse_event_payload (line 1004) | pub fn parse_event_payload(&self, payload: &serde_json::Value) -> Vec<... method listen_http (line 1187) | pub async fn listen_http( method name (line 1133) | fn name(&self) -> &str { method send (line 1137) | async fn send(&self, message: &SendMessage) -> anyhow::Result<()> { method listen (line 1171) | async fn listen(&self, tx: tokio::sync::mpsc::Sender) ->... method health_check (line 1179) | async fn health_check(&self) -> bool { function pick_uniform_index (line 1282) | fn pick_uniform_index(len: usize) -> usize { function random_from_pool (line 1295) | fn random_from_pool(pool: &'static [&'static str]) -> &'static str { function lark_ack_pool (line 1299) | fn lark_ack_pool(locale: LarkAckLocale) -> &'static [&'static str] { function map_locale_tag (line 1308) | fn map_locale_tag(tag: &str) -> Option { function find_locale_hint (line 1333) | fn find_locale_hint(value: &serde_json::Value) -> Option { function detect_locale_from_post_content (line 1368) | fn detect_locale_from_post_content(content: &str) -> Option bool { function is_cjk_han (line 1388) | fn is_cjk_han(ch: char) -> bool { function is_traditional_only_han (line 1396) | fn is_traditional_only_han(ch: char) -> bool { function is_simplified_only_han (line 1415) | fn is_simplified_only_han(ch: char) -> bool { function detect_locale_from_text (line 1434) | fn detect_locale_from_text(text: &str) -> Option { function detect_lark_ack_locale (line 1450) | fn detect_lark_ack_locale( function random_lark_ack_reaction (line 1476) | fn random_lark_ack_reaction( type ParsedPostContent (line 1489) | struct ParsedPostContent { function parse_post_content_details (line 1494) | fn parse_post_content_details(content: &str) -> Option { function parse_post_content (line 1572) | fn parse_post_content(content: &str) -> Option { function strip_at_placeholders (line 1577) | fn strip_at_placeholders(text: &str) -> String { function mention_matches_bot_open_id (line 1600) | fn mention_matches_bot_open_id(mention: &serde_json::Value, bot_open_id:... function should_respond_in_group (line 1609) | fn should_respond_in_group( function with_bot_open_id (line 1636) | fn with_bot_open_id(ch: LarkChannel, bot_open_id: &str) -> LarkChannel { function make_channel (line 1641) | fn make_channel() -> LarkChannel { function lark_channel_name (line 1656) | fn lark_channel_name() { function lark_ws_activity_refreshes_heartbeat_watchdog (line 1662) | fn lark_ws_activity_refreshes_heartbeat_watchdog() { function lark_ws_non_activity_frames_do_not_refresh_heartbeat_watchdog (line 1671) | fn lark_ws_non_activity_frames_do_not_refresh_heartbeat_watchdog() { function lark_group_response_requires_matching_bot_mention_when_ids_available (line 1677) | fn lark_group_response_requires_matching_bot_mention_when_ids_available() { function lark_group_response_requires_resolved_open_id_when_mention_only_enabled (line 1700) | fn lark_group_response_requires_resolved_open_id_when_mention_only_enabl... function lark_group_response_allows_post_mentions_for_bot_open_id (line 1708) | fn lark_group_response_allows_post_mentions_for_bot_open_id() { function lark_should_refresh_token_on_http_401 (line 1718) | fn lark_should_refresh_token_on_http_401() { function lark_should_refresh_token_on_body_code_99991663 (line 1727) | fn lark_should_refresh_token_on_body_code_99991663() { function lark_should_not_refresh_token_on_success_body (line 1739) | fn lark_should_not_refresh_token_on_success_body() { function lark_extract_token_ttl_seconds_supports_expire_and_expires_in (line 1748) | fn lark_extract_token_ttl_seconds_supports_expire_and_expires_in() { function lark_next_token_refresh_deadline_reserves_refresh_skew (line 1761) | fn lark_next_token_refresh_deadline_reserves_refresh_skew() { function lark_ensure_send_success_rejects_non_zero_code (line 1771) | fn lark_ensure_send_success_rejects_non_zero_code() { function lark_user_allowed_exact (line 1780) | fn lark_user_allowed_exact() { function lark_user_allowed_wildcard (line 1787) | fn lark_user_allowed_wildcard() { function lark_user_denied_empty (line 1800) | fn lark_user_denied_empty() { function lark_parse_challenge (line 1813) | fn lark_parse_challenge() { function lark_parse_valid_text_message (line 1826) | fn lark_parse_valid_text_message() { function lark_parse_unauthorized_user (line 1856) | fn lark_parse_unauthorized_user() { function lark_parse_non_text_message_skipped (line 1876) | fn lark_parse_non_text_message_skipped() { function lark_parse_empty_text_skipped (line 1902) | fn lark_parse_empty_text_skipped() { function lark_parse_wrong_event_type (line 1928) | fn lark_parse_wrong_event_type() { function lark_parse_missing_sender (line 1940) | fn lark_parse_missing_sender() { function lark_parse_unicode_message (line 1965) | fn lark_parse_unicode_message() { function lark_parse_missing_event (line 1993) | fn lark_parse_missing_event() { function lark_parse_invalid_content_json (line 2004) | fn lark_parse_invalid_content_json() { function lark_config_serde (line 2030) | fn lark_config_serde() { function lark_config_toml_roundtrip (line 2052) | fn lark_config_toml_roundtrip() { function lark_config_defaults_optional_fields (line 2073) | fn lark_config_defaults_optional_fields() { function lark_from_config_preserves_mode_and_region (line 2085) | fn lark_from_config_preserves_mode_and_region() { function lark_from_lark_config_ignores_legacy_feishu_flag (line 2109) | fn lark_from_lark_config_ignores_legacy_feishu_flag() { function lark_from_feishu_config_sets_feishu_platform (line 2132) | fn lark_from_feishu_config_sets_feishu_platform() { function lark_parse_fallback_sender_to_open_id (line 2153) | fn lark_parse_fallback_sender_to_open_id() { function lark_parse_group_message_requires_bot_mention_when_enabled (line 2181) | fn lark_parse_group_message_requires_bot_mention_when_enabled() { function lark_parse_group_post_message_accepts_at_when_top_level_mentions_empty (line 2241) | fn lark_parse_group_post_message_accepts_at_when_top_level_mentions_empt... function lark_parse_group_message_allows_without_mention_when_disabled (line 2272) | fn lark_parse_group_message_allows_without_mention_when_disabled() { function lark_reaction_url_matches_region (line 2300) | fn lark_reaction_url_matches_region() { function lark_reaction_locale_explicit_language_tags (line 2324) | fn lark_reaction_locale_explicit_language_tags() { function lark_reaction_locale_prefers_explicit_payload_locale (line 2334) | fn lark_reaction_locale_prefers_explicit_payload_locale() { function lark_reaction_locale_unsupported_payload_falls_back_to_text_script (line 2350) | fn lark_reaction_locale_unsupported_payload_falls_back_to_text_script() { function lark_reaction_locale_detects_simplified_and_traditional_text (line 2366) | fn lark_reaction_locale_detects_simplified_and_traditional_text() { function lark_reaction_locale_defaults_to_english_for_unsupported_text (line 2378) | fn lark_reaction_locale_defaults_to_english_for_unsupported_text() { function random_lark_ack_reaction_respects_detected_locale_pool (line 2386) | fn random_lark_ack_reaction_respects_detected_locale_pool() { FILE: src/channels/linq.rs type LinqChannel (line 11) | pub struct LinqChannel { method new (line 21) | pub fn new(api_token: String, from_phone: String, allowed_senders: Vec... method is_sender_allowed (line 31) | fn is_sender_allowed(&self, phone: &str) -> bool { method phone_number (line 36) | pub fn phone_number(&self) -> &str { method media_part_to_image_marker (line 40) | fn media_part_to_image_marker(part: &serde_json::Value) -> Option bool { method sender_handle (line 83) | fn sender_handle(data: &serde_json::Value) -> Option<&str> { method chat_id (line 93) | fn chat_id(data: &serde_json::Value) -> Option<&str> { method message_parts (line 103) | fn message_parts(data: &serde_json::Value) -> Option<&Vec Ve... constant LINQ_API_BASE (line 18) | const LINQ_API_BASE: &str = "https://api.linqapp.com/api/partner/v3"; method name (line 279) | fn name(&self) -> &str { method send (line 283) | async fn send(&self, message: &SendMessage) -> anyhow::Result<()> { method listen (line 351) | async fn listen(&self, _tx: tokio::sync::mpsc::Sender) -... method health_check (line 365) | async fn health_check(&self) -> bool { method start_typing (line 378) | async fn start_typing(&self, recipient: &str) -> anyhow::Result<()> { method stop_typing (line 395) | async fn stop_typing(&self, recipient: &str) -> anyhow::Result<()> { function verify_linq_signature (line 418) | pub fn verify_linq_signature(secret: &str, body: &str, timestamp: &str, ... function make_channel (line 457) | fn make_channel() -> LinqChannel { function linq_channel_name (line 466) | fn linq_channel_name() { function linq_sender_allowed_exact (line 472) | fn linq_sender_allowed_exact() { function linq_sender_allowed_wildcard (line 479) | fn linq_sender_allowed_wildcard() { function linq_sender_allowed_empty (line 486) | fn linq_sender_allowed_empty() { function linq_parse_valid_text_message (line 492) | fn linq_parse_valid_text_message() { function linq_parse_latest_webhook_shape (line 525) | fn linq_parse_latest_webhook_shape() { function linq_parse_skip_is_from_me (line 561) | fn linq_parse_skip_is_from_me() { function linq_parse_skip_latest_outbound_message (line 581) | fn linq_parse_skip_latest_outbound_message() { function linq_parse_skip_non_message_event (line 609) | fn linq_parse_skip_non_message_event() { function linq_parse_unauthorized_sender (line 624) | fn linq_parse_unauthorized_sender() { function linq_parse_empty_payload (line 644) | fn linq_parse_empty_payload() { function linq_parse_media_only_translated_to_image_marker (line 652) | fn linq_parse_media_only_translated_to_image_marker() { function linq_parse_media_non_image_still_skipped (line 677) | fn linq_parse_media_non_image_still_skipped() { function linq_parse_multiple_text_parts (line 701) | fn linq_parse_multiple_text_parts() { constant TEST_WEBHOOK_SECRET (line 725) | const TEST_WEBHOOK_SECRET: &str = "test_webhook_secret"; function linq_signature_verification_valid (line 728) | fn linq_signature_verification_valid() { function linq_signature_verification_invalid (line 745) | fn linq_signature_verification_invalid() { function linq_signature_verification_stale_timestamp (line 759) | fn linq_signature_verification_stale_timestamp() { function linq_signature_verification_accepts_sha256_prefix (line 780) | fn linq_signature_verification_accepts_sha256_prefix() { function linq_signature_verification_accepts_uppercase_hex (line 796) | fn linq_signature_verification_accepts_uppercase_hex() { function linq_parse_normalizes_phone_with_plus (line 812) | fn linq_parse_normalizes_phone_with_plus() { function linq_parse_missing_data (line 838) | fn linq_parse_missing_data() { function linq_parse_missing_message_parts (line 848) | fn linq_parse_missing_message_parts() { function linq_parse_empty_text_value (line 867) | fn linq_parse_empty_text_value() { function linq_parse_fallback_reply_target_when_no_chat_id (line 887) | fn linq_parse_fallback_reply_target_when_no_chat_id() { function linq_phone_number_accessor (line 908) | fn linq_phone_number_accessor() { function linq_parse_new_format_text_message (line 916) | fn linq_parse_new_format_text_message() { function linq_parse_new_format_skip_is_me (line 950) | fn linq_parse_new_format_skip_is_me() { function linq_parse_new_format_skip_outbound_direction (line 975) | fn linq_parse_new_format_skip_outbound_direction() { function linq_parse_new_format_unauthorized_sender (line 997) | fn linq_parse_new_format_unauthorized_sender() { function linq_parse_new_format_media_image (line 1022) | fn linq_parse_new_format_media_image() { function linq_parse_new_format_multiple_parts (line 1049) | fn linq_parse_new_format_multiple_parts() { function linq_parse_new_format_fallback_reply_target_when_no_chat (line 1078) | fn linq_parse_new_format_fallback_reply_target_when_no_chat() { function linq_parse_new_format_normalizes_phone (line 1100) | fn linq_parse_new_format_normalizes_phone() { FILE: src/channels/matrix.rs type MatrixChannel (line 30) | pub struct MatrixChannel { method fmt (line 46) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { method normalize_optional_field (line 112) | fn normalize_optional_field(value: Option) -> Option { method new (line 118) | pub fn new( method new_with_session_hint (line 127) | pub fn new_with_session_hint( method new_with_session_hint_and_zeroclaw_dir (line 146) | pub fn new_with_session_hint_and_zeroclaw_dir( method encode_path_segment (line 180) | fn encode_path_segment(value: &str) -> String { method auth_header_value (line 201) | fn auth_header_value(&self) -> String { method matrix_store_dir (line 205) | fn matrix_store_dir(&self) -> Option { method is_user_allowed (line 211) | fn is_user_allowed(&self, sender: &str) -> bool { method is_sender_allowed (line 215) | fn is_sender_allowed(allowed_users: &[String], sender: &str) -> bool { method is_supported_message_type (line 223) | fn is_supported_message_type(msgtype: &str) -> bool { method has_non_empty_body (line 227) | fn has_non_empty_body(body: &str) -> bool { method cache_event_id (line 231) | fn cache_event_id( method target_room_id (line 255) | async fn target_room_id(&self) -> anyhow::Result { method get_my_identity (line 269) | async fn get_my_identity(&self) -> anyhow::Result { method get_my_user_id (line 286) | async fn get_my_user_id(&self) -> anyhow::Result { method matrix_client (line 290) | async fn matrix_client(&self) -> anyhow::Result { method resolve_room_id (line 392) | async fn resolve_room_id(&self) -> anyhow::Result { method ensure_room_accessible (line 427) | async fn ensure_room_accessible(&self, room_id: &str) -> anyhow::Resul... method room_is_encrypted (line 449) | async fn room_is_encrypted(&self, room_id: &str) -> anyhow::Result anyhow::Result... method sync_filter_for_room (line 488) | fn sync_filter_for_room(room_id: &str, timeline_limit: usize) -> String { method log_e2ee_diagnostics (line 501) | async fn log_e2ee_diagnostics(&self, client: &MatrixSdkClient) { type SyncResponse (line 56) | struct SyncResponse { type Rooms (line 63) | struct Rooms { type JoinedRoom (line 69) | struct JoinedRoom { type Timeline (line 75) | struct Timeline { type TimelineEvent (line 81) | struct TimelineEvent { type EventContent (line 92) | struct EventContent { type WhoAmIResponse (line 100) | struct WhoAmIResponse { type RoomAliasResponse (line 107) | struct RoomAliasResponse { method name (line 538) | fn name(&self) -> &str { method send (line 542) | async fn send(&self, message: &SendMessage) -> anyhow::Result<()> { method listen (line 661) | async fn listen(&self, tx: mpsc::Sender) -> anyhow::Resu... method health_check (line 932) | async fn health_check(&self) -> bool { method add_reaction (line 944) | async fn add_reaction( method remove_reaction (line 974) | async fn remove_reaction( method pin_message (line 1002) | async fn pin_message(&self, _channel_id: &str, message_id: &str) -> anyh... method unpin_message (line 1058) | async fn unpin_message(&self, _channel_id: &str, message_id: &str) -> an... function make_channel (line 1122) | fn make_channel() -> MatrixChannel { function creates_with_correct_fields (line 1132) | fn creates_with_correct_fields() { function strips_trailing_slash (line 1141) | fn strips_trailing_slash() { function no_trailing_slash_unchanged (line 1152) | fn no_trailing_slash_unchanged() { function multiple_trailing_slashes_strip_all (line 1163) | fn multiple_trailing_slashes_strip_all() { function trims_access_token (line 1174) | fn trims_access_token() { function session_hints_are_normalized (line 1185) | fn session_hints_are_normalized() { function empty_session_hints_are_ignored (line 1200) | fn empty_session_hints_are_ignored() { function matrix_store_dir_is_derived_from_zeroclaw_dir (line 1215) | fn matrix_store_dir_is_derived_from_zeroclaw_dir() { function matrix_store_dir_absent_without_zeroclaw_dir (line 1233) | fn matrix_store_dir_absent_without_zeroclaw_dir() { function encode_path_segment_encodes_room_refs (line 1247) | fn encode_path_segment_encodes_room_refs() { function supported_message_type_detection (line 1259) | fn supported_message_type_detection() { function body_presence_detection (line 1267) | fn body_presence_detection() { function send_content_uses_markdown_formatting (line 1275) | fn send_content_uses_markdown_formatting() { function sync_filter_for_room_targets_requested_room (line 1289) | fn sync_filter_for_room_targets_requested_room() { function event_id_cache_deduplicates_and_evicts_old_entries (line 1298) | fn event_id_cache_deduplicates_and_evicts_old_entries() { function trims_room_id_and_allowed_users (line 1326) | fn trims_room_id_and_allowed_users() { function wildcard_allows_anyone (line 1345) | fn wildcard_allows_anyone() { function specific_user_allowed (line 1357) | fn specific_user_allowed() { function unknown_user_denied (line 1363) | fn unknown_user_denied() { function user_case_insensitive (line 1370) | fn user_case_insensitive() { function empty_allowlist_denies_all (line 1382) | fn empty_allowlist_denies_all() { function name_returns_matrix (line 1393) | fn name_returns_matrix() { function sync_response_deserializes_empty (line 1399) | fn sync_response_deserializes_empty() { function sync_response_deserializes_with_events (line 1407) | fn sync_response_deserializes_with_events() { function sync_response_ignores_non_text_events (line 1450) | fn sync_response_ignores_non_text_events() { function whoami_response_deserializes (line 1476) | fn whoami_response_deserializes() { function event_content_defaults (line 1483) | fn event_content_defaults() { function event_content_supports_notice_msgtype (line 1491) | fn event_content_supports_notice_msgtype() { function invalid_room_reference_fails_fast (line 1505) | async fn invalid_room_reference_fails_fast() { function target_room_id_keeps_canonical_room_id_without_lookup (line 1520) | async fn target_room_id_keeps_canonical_room_id_without_lookup() { function target_room_id_uses_cached_alias_resolution (line 1533) | async fn target_room_id_uses_cached_alias_resolution() { function sync_response_missing_rooms_defaults (line 1547) | fn sync_response_missing_rooms_defaults() { FILE: src/channels/mattermost.rs type MattermostChannel (line 8) | pub struct MattermostChannel { method new (line 23) | pub fn new( method http_client (line 44) | fn http_client(&self) -> reqwest::Client { method is_user_allowed (line 50) | fn is_user_allowed(&self, user_id: &str) -> bool { method get_bot_identity (line 56) | async fn get_bot_identity(&self) -> (String, String) { method parse_mattermost_post (line 273) | fn parse_mattermost_post( method name (line 88) | fn name(&self) -> &str { method send (line 92) | async fn send(&self, message: &SendMessage) -> Result<()> { method listen (line 133) | async fn listen(&self, tx: tokio::sync::mpsc::Sender) ->... method health_check (line 206) | async fn health_check(&self) -> bool { method start_typing (line 216) | async fn start_typing(&self, recipient: &str) -> Result<()> { method stop_typing (line 263) | async fn stop_typing(&self, _recipient: &str) -> Result<()> { function contains_bot_mention_mm (line 335) | fn contains_bot_mention_mm( function is_mattermost_username_char (line 362) | fn is_mattermost_username_char(c: char) -> bool { function find_bot_mention_spans (line 366) | fn find_bot_mention_spans(text: &str, bot_username: &str) -> Vec<(usize,... function normalize_mattermost_content (line 413) | fn normalize_mattermost_content( function make_channel (line 458) | fn make_channel(allowed: Vec, thread_replies: bool) -> Mattermos... function make_mention_only_channel (line 470) | fn make_mention_only_channel() -> MattermostChannel { function mattermost_url_trimming (line 482) | fn mattermost_url_trimming() { function mattermost_allowlist_wildcard (line 495) | fn mattermost_allowlist_wildcard() { function mattermost_parse_post_basic (line 501) | fn mattermost_parse_post_basic() { function mattermost_parse_post_thread_replies_enabled (line 520) | fn mattermost_parse_post_thread_replies_enabled() { function mattermost_parse_post_thread (line 537) | fn mattermost_parse_post_thread() { function mattermost_parse_post_ignore_self (line 554) | fn mattermost_parse_post_ignore_self() { function mattermost_parse_post_ignore_old (line 569) | fn mattermost_parse_post_ignore_old() { function mattermost_parse_post_no_thread_when_disabled (line 584) | fn mattermost_parse_post_no_thread_when_disabled() { function mattermost_existing_thread_always_threads (line 601) | fn mattermost_existing_thread_always_threads() { function mention_only_skips_message_without_mention (line 621) | fn mention_only_skips_message_without_mention() { function mention_only_accepts_message_with_at_mention (line 637) | fn mention_only_accepts_message_with_at_mention() { function mention_only_strips_mention_and_trims (line 654) | fn mention_only_strips_mention_and_trims() { function mention_only_rejects_empty_after_stripping (line 671) | fn mention_only_rejects_empty_after_stripping() { function mention_only_case_insensitive (line 687) | fn mention_only_case_insensitive() { function mention_only_detects_metadata_mentions (line 704) | fn mention_only_detects_metadata_mentions() { function mention_only_word_boundary_prevents_partial_match (line 726) | fn mention_only_word_boundary_prevents_partial_match() { function mention_only_mention_in_middle_of_text (line 743) | fn mention_only_mention_in_middle_of_text() { function mention_only_disabled_passes_all_messages (line 760) | fn mention_only_disabled_passes_all_messages() { function contains_mention_text_at_end (line 780) | fn contains_mention_text_at_end() { function contains_mention_text_at_start (line 791) | fn contains_mention_text_at_start() { function contains_mention_text_alone (line 802) | fn contains_mention_text_alone() { function no_mention_different_username (line 808) | fn no_mention_different_username() { function no_mention_partial_username (line 819) | fn no_mention_partial_username() { function mention_detects_later_valid_mention_after_partial_prefix (line 831) | fn mention_detects_later_valid_mention_after_partial_prefix() { function mention_followed_by_punctuation (line 842) | fn mention_followed_by_punctuation() { function mention_via_metadata_only (line 854) | fn mention_via_metadata_only() { function no_mention_empty_username_no_metadata (line 867) | fn no_mention_empty_username_no_metadata() { function normalize_strips_and_trims (line 875) | fn normalize_strips_and_trims() { function normalize_returns_none_for_no_mention (line 882) | fn normalize_returns_none_for_no_mention() { function normalize_returns_none_when_only_mention (line 889) | fn normalize_returns_none_when_only_mention() { function normalize_preserves_text_for_metadata_mention (line 896) | fn normalize_preserves_text_for_metadata_mention() { function normalize_strips_multiple_mentions (line 905) | fn normalize_strips_multiple_mentions() { function normalize_keeps_partial_username_mentions (line 913) | fn normalize_keeps_partial_username_mentions() { FILE: src/channels/mochat.rs constant DEDUP_CAPACITY (line 10) | const DEDUP_CAPACITY: usize = 10_000; type MochatChannel (line 16) | pub struct MochatChannel { method new (line 26) | pub fn new( method http_client (line 41) | fn http_client(&self) -> reqwest::Client { method is_user_allowed (line 45) | fn is_user_allowed(&self, user_id: &str) -> bool { method is_duplicate (line 50) | async fn is_duplicate(&self, msg_id: &str) -> bool { method name (line 75) | fn name(&self) -> &str { method send (line 79) | async fn send(&self, message: &SendMessage) -> anyhow::Result<()> { method listen (line 116) | async fn listen(&self, tx: tokio::sync::mpsc::Sender) ->... method health_check (line 229) | async fn health_check(&self) -> bool { function test_name (line 249) | fn test_name() { function test_api_url_trailing_slash_stripped (line 255) | fn test_api_url_trailing_slash_stripped() { function test_user_allowed_wildcard (line 266) | fn test_user_allowed_wildcard() { function test_user_allowed_specific (line 272) | fn test_user_allowed_specific() { function test_user_denied_empty (line 284) | fn test_user_denied_empty() { function test_dedup (line 290) | async fn test_dedup() { function test_dedup_empty_id (line 298) | async fn test_dedup_empty_id() { function test_config_serde (line 305) | fn test_config_serde() { function test_config_serde_defaults (line 318) | fn test_config_serde_defaults() { FILE: src/channels/mod.rs type ChannelNotifyObserver (line 118) | struct ChannelNotifyObserver { method record_event (line 125) | fn record_event(&self, event: &ObserverEvent) { method record_metric (line 154) | fn record_metric(&self, metric: &ObserverMetric) { method flush (line 157) | fn flush(&self) { method name (line 160) | fn name(&self) -> &str { method as_any (line 163) | fn as_any(&self) -> &dyn std::any::Any { type ConversationHistoryMap (line 169) | type ConversationHistoryMap = Arc... type PendingNewSessionSet (line 171) | type PendingNewSessionSet = Arc>>; constant MAX_CHANNEL_HISTORY (line 173) | const MAX_CHANNEL_HISTORY: usize = 50; constant AUTOSAVE_MIN_MESSAGE_CHARS (line 177) | const AUTOSAVE_MIN_MESSAGE_CHARS: usize = 20; constant BOOTSTRAP_MAX_CHARS (line 180) | const BOOTSTRAP_MAX_CHARS: usize = 20_000; constant DEFAULT_CHANNEL_INITIAL_BACKOFF_SECS (line 182) | const DEFAULT_CHANNEL_INITIAL_BACKOFF_SECS: u64 = 2; constant DEFAULT_CHANNEL_MAX_BACKOFF_SECS (line 183) | const DEFAULT_CHANNEL_MAX_BACKOFF_SECS: u64 = 60; constant MIN_CHANNEL_MESSAGE_TIMEOUT_SECS (line 184) | const MIN_CHANNEL_MESSAGE_TIMEOUT_SECS: u64 = 30; constant CHANNEL_MESSAGE_TIMEOUT_SECS (line 187) | const CHANNEL_MESSAGE_TIMEOUT_SECS: u64 = 300; constant CHANNEL_MESSAGE_TIMEOUT_SCALE_CAP (line 189) | const CHANNEL_MESSAGE_TIMEOUT_SCALE_CAP: u64 = 4; constant CHANNEL_PARALLELISM_PER_CHANNEL (line 190) | const CHANNEL_PARALLELISM_PER_CHANNEL: usize = 4; constant CHANNEL_MIN_IN_FLIGHT_MESSAGES (line 191) | const CHANNEL_MIN_IN_FLIGHT_MESSAGES: usize = 8; constant CHANNEL_MAX_IN_FLIGHT_MESSAGES (line 192) | const CHANNEL_MAX_IN_FLIGHT_MESSAGES: usize = 64; constant CHANNEL_TYPING_REFRESH_INTERVAL_SECS (line 193) | const CHANNEL_TYPING_REFRESH_INTERVAL_SECS: u64 = 4; constant CHANNEL_HEALTH_HEARTBEAT_SECS (line 194) | const CHANNEL_HEALTH_HEARTBEAT_SECS: u64 = 30; constant MODEL_CACHE_FILE (line 195) | const MODEL_CACHE_FILE: &str = "models_cache.json"; constant MODEL_CACHE_PREVIEW_LIMIT (line 196) | const MODEL_CACHE_PREVIEW_LIMIT: usize = 10; constant MEMORY_CONTEXT_MAX_ENTRIES (line 197) | const MEMORY_CONTEXT_MAX_ENTRIES: usize = 4; constant MEMORY_CONTEXT_ENTRY_MAX_CHARS (line 198) | const MEMORY_CONTEXT_ENTRY_MAX_CHARS: usize = 800; constant MEMORY_CONTEXT_MAX_CHARS (line 199) | const MEMORY_CONTEXT_MAX_CHARS: usize = 4_000; constant CHANNEL_HISTORY_COMPACT_KEEP_MESSAGES (line 200) | const CHANNEL_HISTORY_COMPACT_KEEP_MESSAGES: usize = 12; constant CHANNEL_HISTORY_COMPACT_CONTENT_CHARS (line 201) | const CHANNEL_HISTORY_COMPACT_CONTENT_CHARS: usize = 600; constant PROACTIVE_CONTEXT_BUDGET_CHARS (line 208) | const PROACTIVE_CONTEXT_BUDGET_CHARS: usize = 400_000; constant CHANNEL_HOOK_MAX_OUTBOUND_CHARS (line 210) | const CHANNEL_HOOK_MAX_OUTBOUND_CHARS: usize = 20_000; type ProviderCacheMap (line 212) | type ProviderCacheMap = Arc>>>; type RouteSelectionMap (line 213) | type RouteSelectionMap = Arc u64 { function channel_message_timeout_budget_secs (line 219) | fn channel_message_timeout_budget_secs( type ChannelRouteSelection (line 229) | struct ChannelRouteSelection { type ChannelRuntimeCommand (line 239) | enum ChannelRuntimeCommand { type ModelCacheState (line 248) | struct ModelCacheState { type ModelCacheEntry (line 253) | struct ModelCacheEntry { type ChannelRuntimeDefaults (line 259) | struct ChannelRuntimeDefaults { type ConfigFileStamp (line 269) | struct ConfigFileStamp { type RuntimeConfigState (line 275) | struct RuntimeConfigState { function runtime_config_store (line 280) | fn runtime_config_store() -> &'static Mutex bool { type ChannelRuntimeContext (line 312) | struct ChannelRuntimeContext { type InFlightSenderTaskState (line 356) | struct InFlightSenderTaskState { type InFlightTaskCompletion (line 362) | struct InFlightTaskCompletion { method new (line 368) | fn new() -> Self { method mark_done (line 375) | fn mark_done(&self) { method wait (line 380) | async fn wait(&self) { function conversation_memory_key (line 388) | fn conversation_memory_key(msg: &traits::ChannelMessage) -> String { function conversation_history_key (line 396) | fn conversation_history_key(msg: &traits::ChannelMessage) -> String { function followup_thread_id (line 408) | fn followup_thread_id(msg: &traits::ChannelMessage) -> Option { function interruption_scope_key (line 412) | fn interruption_scope_key(msg: &traits::ChannelMessage) -> String { function is_stop_command (line 424) | fn is_stop_command(content: &str) -> bool { function strip_tool_call_tags (line 440) | fn strip_tool_call_tags(message: &str) -> String { function channel_delivery_instructions (line 550) | fn channel_delivery_instructions(channel_name: &str) -> Option<&'static ... function build_channel_system_prompt (line 577) | fn build_channel_system_prompt( function normalize_cached_channel_turns (line 625) | fn normalize_cached_channel_turns(turns: Vec) -> Vec String { function supports_runtime_model_switch (line 677) | fn supports_runtime_model_switch(channel_name: &str) -> bool { function parse_runtime_command (line 681) | fn parse_runtime_command(channel_name: &str, content: &str) -> Option Option { function resolved_default_provider (line 743) | fn resolved_default_provider(config: &Config) -> String { function resolved_default_model (line 750) | fn resolved_default_model(config: &Config) -> String { function runtime_defaults_from_config (line 757) | fn runtime_defaults_from_config(config: &Config) -> ChannelRuntimeDefaul... function runtime_config_path (line 768) | fn runtime_config_path(ctx: &ChannelRuntimeContext) -> Option { function runtime_defaults_snapshot (line 775) | fn runtime_defaults_snapshot(ctx: &ChannelRuntimeContext) -> ChannelRunt... function config_file_stamp (line 795) | async fn config_file_stamp(path: &Path) -> Option { function decrypt_optional_secret_for_runtime_reload (line 804) | fn decrypt_optional_secret_for_runtime_reload( function load_runtime_defaults_from_config_file (line 821) | async fn load_runtime_defaults_from_config_file(path: &Path) -> Result ChannelRouteS... function get_route_selection (line 947) | fn get_route_selection(ctx: &ChannelRuntimeContext, sender_key: &str) ->... function set_route_selection (line 956) | fn set_route_selection(ctx: &ChannelRuntimeContext, sender_key: &str, ne... function clear_sender_history (line 969) | fn clear_sender_history(ctx: &ChannelRuntimeContext, sender_key: &str) { function mark_sender_for_new_session (line 976) | fn mark_sender_for_new_session(ctx: &ChannelRuntimeContext, sender_key: ... function take_pending_new_session (line 983) | fn take_pending_new_session(ctx: &ChannelRuntimeContext, sender_key: &st... function replace_available_skills_section (line 990) | fn replace_available_skills_section(base_prompt: &str, refreshed_skills:... function refreshed_new_session_system_prompt (line 1033) | fn refreshed_new_session_system_prompt(ctx: &ChannelRuntimeContext) -> S... function compact_sender_history (line 1045) | fn compact_sender_history(ctx: &ChannelRuntimeContext, sender_key: &str)... function proactive_trim_turns (line 1084) | fn proactive_trim_turns(turns: &mut Vec, budget: usize) -> ... function append_sender_turn (line 1105) | fn append_sender_turn(ctx: &ChannelRuntimeContext, sender_key: &str, tur... function rollback_orphan_user_turn (line 1124) | fn rollback_orphan_user_turn( function should_skip_memory_context_entry (line 1160) | fn should_skip_memory_context_entry(key: &str, content: &str) -> bool { function is_context_window_overflow_error (line 1192) | fn is_context_window_overflow_error(err: &anyhow::Error) -> bool { function load_cached_model_preview (line 1208) | fn load_cached_model_preview(workspace_dir: &Path, provider_name: &str) ... function provider_cache_key (line 1235) | fn provider_cache_key(provider_name: &str, route_api_key: Option<&str>) ... function get_or_create_provider (line 1247) | async fn get_or_create_provider( function create_resilient_provider_nonblocking (line 1304) | async fn create_resilient_provider_nonblocking( function build_models_help_response (line 1325) | fn build_models_help_response( function build_providers_help_response (line 1370) | fn build_providers_help_response(current: &ChannelRouteSelection) -> Str... function handle_runtime_command_if_needed (line 1395) | async fn handle_runtime_command_if_needed( function build_memory_context (line 1492) | async fn build_memory_context( function extract_tool_context_summary (line 1549) | fn extract_tool_context_summary(history: &[ChatMessage], start_index: us... function sanitize_channel_response (line 1639) | fn sanitize_channel_response(response: &str, tools: &[Box]) ->... function strip_tool_narration (line 1656) | fn strip_tool_narration(message: &str) -> String { function is_tool_call_payload (line 1708) | fn is_tool_call_payload(value: &serde_json::Value, known_tool_names: &Ha... function is_tool_result_payload (line 1739) | fn is_tool_result_payload( function sanitize_tool_json_value (line 1755) | fn sanitize_tool_json_value( function is_line_isolated_json_segment (line 1800) | fn is_line_isolated_json_segment(message: &str, start: usize, end: usize... function strip_isolated_tool_json_artifacts (line 1809) | fn strip_isolated_tool_json_artifacts(message: &str, known_tool_names: &... function spawn_supervised_listener (line 1862) | fn spawn_supervised_listener( function spawn_supervised_listener_with_health_interval (line 1877) | fn spawn_supervised_listener_with_health_interval( function compute_max_in_flight_messages (line 1938) | fn compute_max_in_flight_messages(channel_count: usize) -> usize { function log_worker_join_result (line 1947) | fn log_worker_join_result(result: Result<(), tokio::task::JoinError>) { function spawn_scoped_typing_task (line 1953) | fn spawn_scoped_typing_task( function process_channel_message (line 1983) | async fn process_channel_message( function run_message_dispatch_loop (line 2773) | async fn run_message_dispatch_loop( function load_openclaw_bootstrap_files (line 2905) | fn load_openclaw_bootstrap_files( function build_system_prompt (line 2946) | pub fn build_system_prompt( function build_system_prompt_with_mode (line 2967) | pub fn build_system_prompt_with_mode( function build_system_prompt_with_mode_and_autonomy (line 2995) | pub fn build_system_prompt_with_mode_and_autonomy( function inject_workspace_file (line 3211) | fn inject_workspace_file( function normalize_telegram_identity (line 3255) | fn normalize_telegram_identity(value: &str) -> String { function bind_telegram_identity (line 3259) | async fn bind_telegram_identity(config: &Config, identity: &str) -> Resu... function maybe_restart_managed_daemon_service (line 3311) | fn maybe_restart_managed_daemon_service() -> Result { function handle_command (line 3406) | pub(crate) async fn handle_command(command: crate::ChannelCommands, conf... function build_channel_by_id (line 3468) | fn build_channel_by_id(config: &Config, channel_id: &str) -> Result Result<()> { function start_channels (line 4030) | pub async fn start_channels(config: Config) -> Result<()> { function make_workspace (line 4529) | fn make_workspace() -> TempDir { function effective_channel_message_timeout_secs_clamps_to_minimum (line 4551) | fn effective_channel_message_timeout_secs_clamps_to_minimum() { function channel_message_timeout_budget_scales_with_tool_iterations (line 4564) | fn channel_message_timeout_budget_scales_with_tool_iterations() { function channel_message_timeout_budget_uses_safe_defaults_and_cap (line 4571) | fn channel_message_timeout_budget_uses_safe_defaults_and_cap() { function context_window_overflow_error_detector_matches_known_messages (line 4582) | fn context_window_overflow_error_detector_matches_known_messages() { function memory_context_skip_rules_exclude_history_blobs (line 4594) | fn memory_context_skip_rules_exclude_history_blobs() { function strip_tool_result_content_removes_blocks_and_header (line 4634) | fn strip_tool_result_content_removes_blocks_and_header() { function normalize_cached_channel_turns_merges_consecutive_user_turns (line 4654) | fn normalize_cached_channel_turns_merges_consecutive_user_turns() { function normalize_cached_channel_turns_merges_consecutive_assistant_turns (line 4668) | fn normalize_cached_channel_turns_merges_consecutive_assistant_turns() { function normalize_preserves_failure_marker_after_orphan_user_turn (line 4689) | fn normalize_preserves_failure_marker_after_orphan_user_turn() { function normalize_preserves_timeout_marker_after_orphan_user_turn (line 4707) | fn normalize_preserves_timeout_marker_after_orphan_user_turn() { function compact_sender_history_keeps_recent_truncated_messages (line 4722) | fn compact_sender_history_keeps_recent_truncated_messages() { function proactive_trim_drops_oldest_turns_when_over_budget (line 4804) | fn proactive_trim_drops_oldest_turns_when_over_budget() { function proactive_trim_noop_when_within_budget (line 4832) | fn proactive_trim_noop_when_within_budget() { function proactive_trim_preserves_last_turn_even_when_over_budget (line 4843) | fn proactive_trim_preserves_last_turn_even_when_over_budget() { function append_sender_turn_stores_single_turn_per_call (line 4851) | fn append_sender_turn_stores_single_turn_per_call() { function rollback_orphan_user_turn_removes_only_latest_matching_user_turn (line 4912) | fn rollback_orphan_user_turn_removes_only_latest_matching_user_turn() { function rollback_orphan_user_turn_also_removes_from_session_store (line 4984) | fn rollback_orphan_user_turn_also_removes_from_session_store() { type DummyProvider (line 5083) | struct DummyProvider; method chat_with_system (line 5087) | async fn chat_with_system( type RecordingChannel (line 5099) | struct RecordingChannel { type TelegramRecordingChannel (line 5108) | struct TelegramRecordingChannel { type SlackRecordingChannel (line 5113) | struct SlackRecordingChannel { method name (line 5119) | fn name(&self) -> &str { method send (line 5123) | async fn send(&self, message: &SendMessage) -> anyhow::Result<()> { method listen (line 5131) | async fn listen( method start_typing (line 5138) | async fn start_typing(&self, _recipient: &str) -> anyhow::Result<()> { method stop_typing (line 5142) | async fn stop_typing(&self, _recipient: &str) -> anyhow::Result<()> { method name (line 5149) | fn name(&self) -> &str { method send (line 5153) | async fn send(&self, message: &SendMessage) -> anyhow::Result<()> { method listen (line 5161) | async fn listen( method start_typing (line 5168) | async fn start_typing(&self, _recipient: &str) -> anyhow::Result<()> { method stop_typing (line 5172) | async fn stop_typing(&self, _recipient: &str) -> anyhow::Result<()> { method name (line 5179) | fn name(&self) -> &str { method send (line 5183) | async fn send(&self, message: &SendMessage) -> anyhow::Result<()> { method listen (line 5191) | async fn listen( method start_typing (line 5198) | async fn start_typing(&self, _recipient: &str) -> anyhow::Result<()> { method stop_typing (line 5203) | async fn stop_typing(&self, _recipient: &str) -> anyhow::Result<()> { method add_reaction (line 5208) | async fn add_reaction( method remove_reaction (line 5222) | async fn remove_reaction( type SlowProvider (line 5237) | struct SlowProvider { method chat_with_system (line 5243) | async fn chat_with_system( type ToolCallingProvider (line 5255) | struct ToolCallingProvider; function tool_call_payload (line 5257) | fn tool_call_payload() -> String { function tool_call_payload_with_alias_tag (line 5264) | fn tool_call_payload_with_alias_tag() -> String { method chat_with_system (line 5273) | async fn chat_with_system( method chat_with_history (line 5283) | async fn chat_with_history( type ToolCallingAliasProvider (line 5300) | struct ToolCallingAliasProvider; method chat_with_system (line 5304) | async fn chat_with_system( method chat_with_history (line 5314) | async fn chat_with_history( type RawToolArtifactProvider (line 5331) | struct RawToolArtifactProvider; method chat_with_system (line 5335) | async fn chat_with_system( method chat_with_history (line 5345) | async fn chat_with_history( type IterativeToolProvider (line 5358) | struct IterativeToolProvider { method completed_tool_iterations (line 5363) | fn completed_tool_iterations(messages: &[ChatMessage]) -> usize { method chat_with_system (line 5373) | async fn chat_with_system( method chat_with_history (line 5383) | async fn chat_with_history( type HistoryCaptureProvider (line 5401) | struct HistoryCaptureProvider { method chat_with_system (line 5407) | async fn chat_with_system( method chat_with_history (line 5417) | async fn chat_with_history( type DelayedHistoryCaptureProvider (line 5433) | struct DelayedHistoryCaptureProvider { method chat_with_system (line 5440) | async fn chat_with_system( method chat_with_history (line 5450) | async fn chat_with_history( type MockPriceTool (line 5470) | struct MockPriceTool; type ModelCaptureProvider (line 5473) | struct ModelCaptureProvider { method chat_with_system (line 5480) | async fn chat_with_system( method chat_with_history (line 5490) | async fn chat_with_history( method name (line 5507) | fn name(&self) -> &str { method description (line 5511) | fn description(&self) -> &str { method parameters_schema (line 5515) | fn parameters_schema(&self) -> serde_json::Value { method execute (line 5525) | async fn execute(&self, args: serde_json::Value) -> anyhow::Result &str { method store (line 6440) | async fn store( method recall (line 6450) | async fn recall( method get (line 6459) | async fn get(&self, _key: &str) -> anyhow::Result anyhow::Result { method count (line 6475) | async fn count(&self) -> anyhow::Result { method health_check (line 6479) | async fn health_check(&self) -> bool { type RecallMemory (line 6484) | struct RecallMemory; method name (line 6488) | fn name(&self) -> &str { method store (line 6492) | async fn store( method recall (line 6502) | async fn recall( method get (line 6519) | async fn get(&self, _key: &str) -> anyhow::Result anyhow::Result { method count (line 6535) | async fn count(&self) -> anyhow::Result { method health_check (line 6539) | async fn health_check(&self) -> bool { function message_dispatch_processes_messages_in_parallel (line 6545) | async fn message_dispatch_processes_messages_in_parallel() { function message_dispatch_interrupts_in_flight_telegram_request_and_preserves_context (line 6642) | async fn message_dispatch_interrupts_in_flight_telegram_request_and_pres... function message_dispatch_interrupts_in_flight_slack_request_and_preserves_context (line 6757) | async fn message_dispatch_interrupts_in_flight_slack_request_and_preserv... function message_dispatch_interrupt_scope_is_same_sender_same_chat (line 6872) | async fn message_dispatch_interrupt_scope_is_same_sender_same_chat() { function process_channel_message_cancels_scoped_typing_task (line 6966) | async fn process_channel_message_cancels_scoped_typing_task() { function process_channel_message_adds_and_swaps_reactions (line 7044) | async fn process_channel_message_adds_and_swaps_reactions() { function prompt_contains_all_sections (line 7134) | fn prompt_contains_all_sections() { function prompt_injects_tools (line 7155) | fn prompt_injects_tools() { function prompt_includes_single_tool_protocol_block_after_append (line 7169) | fn prompt_includes_single_tool_protocol_block_after_append() { function prompt_injects_safety (line 7189) | fn prompt_injects_safety() { function prompt_injects_workspace_files (line 7199) | fn prompt_injects_workspace_files() { function prompt_missing_file_markers (line 7225) | fn prompt_missing_file_markers() { function prompt_bootstrap_only_if_exists (line 7236) | fn prompt_bootstrap_only_if_exists() { function prompt_no_daily_memory_injection (line 7256) | fn prompt_no_daily_memory_injection() { function prompt_runtime_metadata (line 7281) | fn prompt_runtime_metadata() { function prompt_skills_include_instructions_and_tools (line 7291) | fn prompt_skills_include_instructions_and_tools() { function prompt_skills_compact_mode_omits_instructions_but_keeps_tools (line 7326) | fn prompt_skills_compact_mode_omits_instructions_but_keeps_tools() { function prompt_skills_escape_reserved_xml_chars (line 7371) | fn prompt_skills_escape_reserved_xml_chars() { function prompt_truncation (line 7405) | fn prompt_truncation() { function prompt_empty_files_skipped (line 7424) | fn prompt_empty_files_skipped() { function channel_log_truncation_is_utf8_safe_for_multibyte_text (line 7438) | fn channel_log_truncation_is_utf8_safe_for_multibyte_text() { function prompt_contains_channel_capabilities (line 7454) | fn prompt_contains_channel_capabilities() { function full_autonomy_prompt_executes_allowed_tools_without_extra_approval (line 7473) | fn full_autonomy_prompt_executes_allowed_tools_without_extra_approval() { function readonly_prompt_explains_policy_blocks_without_fake_approval (line 7502) | fn readonly_prompt_explains_policy_blocks_without_fake_approval() { function prompt_workspace_path (line 7531) | fn prompt_workspace_path() { function full_autonomy_omits_approval_instructions (line 7539) | fn full_autonomy_omits_approval_instructions() { function supervised_autonomy_includes_approval_instructions (line 7573) | fn supervised_autonomy_includes_approval_instructions() { function channel_notify_observer_truncates_utf8_arguments_safely (line 7598) | fn channel_notify_observer_truncates_utf8_arguments_safely() { function conversation_memory_key_uses_message_id (line 7625) | fn conversation_memory_key_uses_message_id() { function followup_thread_id_prefers_thread_ts (line 7641) | fn followup_thread_id_prefers_thread_ts() { function followup_thread_id_falls_back_to_message_id (line 7660) | fn followup_thread_id_falls_back_to_message_id() { function conversation_memory_key_is_unique_per_message (line 7676) | fn conversation_memory_key_is_unique_per_message() { function autosave_keys_preserve_multiple_conversation_facts (line 7705) | async fn autosave_keys_preserve_multiple_conversation_facts() { function build_memory_context_includes_recalled_entries (line 7754) | async fn build_memory_context_includes_recalled_entries() { function build_memory_context_excludes_image_marker_entries (line 7769) | async fn build_memory_context_excludes_image_marker_entries() { function process_channel_message_restores_per_sender_history_on_follow_ups (line 7808) | async fn process_channel_message_restores_per_sender_history_on_follow_u... function process_channel_message_refreshes_available_skills_after_new_session (line 7914) | async fn process_channel_message_refreshes_available_skills_after_new_se... function process_channel_message_enriches_current_turn_without_persisting_context (line 8107) | async fn process_channel_message_enriches_current_turn_without_persistin... function process_channel_message_telegram_keeps_system_instruction_at_top_only (line 8201) | async fn process_channel_message_telegram_keeps_system_instruction_at_to... function extract_tool_context_summary_collects_alias_and_native_tool_calls (line 8305) | fn extract_tool_context_summary_collects_alias_and_native_tool_calls() { function extract_tool_context_summary_collects_prompt_mode_tool_result_names (line 8323) | fn extract_tool_context_summary_collects_prompt_mode_tool_result_names() { function extract_tool_context_summary_respects_start_index (line 8343) | fn extract_tool_context_summary_respects_start_index() { function strip_isolated_tool_json_artifacts_removes_tool_calls_and_results (line 8362) | fn strip_isolated_tool_json_artifacts_removes_tool_calls_and_results() { function strip_isolated_tool_json_artifacts_preserves_non_tool_json (line 8386) | fn strip_isolated_tool_json_artifacts_preserves_non_tool_json() { function aieos_identity_from_file (line 8400) | fn aieos_identity_from_file() { function aieos_identity_from_inline (line 8457) | fn aieos_identity_from_inline() { function aieos_fallback_to_openclaw_on_parse_error (line 8480) | fn aieos_fallback_to_openclaw_on_parse_error() { function aieos_empty_uses_openclaw (line 8498) | fn aieos_empty_uses_openclaw() { function openclaw_format_uses_bootstrap_files (line 8517) | fn openclaw_format_uses_bootstrap_files() { function none_identity_config_uses_openclaw (line 8536) | fn none_identity_config_uses_openclaw() { function classify_health_ok_true (line 8547) | fn classify_health_ok_true() { function classify_health_ok_false (line 8553) | fn classify_health_ok_false() { function classify_health_timeout (line 8559) | async fn classify_health_timeout() { function collect_configured_channels_includes_mattermost_when_configured (line 8570) | fn collect_configured_channels_includes_mattermost_when_configured() { type AlwaysFailChannel (line 8592) | struct AlwaysFailChannel { type BlockUntilClosedChannel (line 8597) | struct BlockUntilClosedChannel { method name (line 8604) | fn name(&self) -> &str { method send (line 8608) | async fn send(&self, _message: &SendMessage) -> anyhow::Result<()> { method listen (line 8612) | async fn listen( method name (line 8623) | fn name(&self) -> &str { method send (line 8627) | async fn send(&self, _message: &SendMessage) -> anyhow::Result<()> { method listen (line 8631) | async fn listen( function supervised_listener_marks_error_and_restarts_on_failures (line 8642) | async fn supervised_listener_marks_error_and_restarts_on_failures() { function supervised_listener_refreshes_health_while_running (line 8669) | async fn supervised_listener_refreshes_health_while_running() { function maybe_restart_daemon_systemd_args_regression (line 8714) | fn maybe_restart_daemon_systemd_args_regression() { function maybe_restart_daemon_openrc_args_regression (line 8726) | fn maybe_restart_daemon_openrc_args_regression() { function normalize_merges_consecutive_user_turns (line 8732) | fn normalize_merges_consecutive_user_turns() { function normalize_preserves_strict_alternation (line 8741) | fn normalize_preserves_strict_alternation() { function normalize_merges_multiple_consecutive_user_turns (line 8755) | fn normalize_merges_multiple_consecutive_user_turns() { function normalize_empty_input (line 8768) | fn normalize_empty_input() { function e2e_photo_attachment_rejected_by_non_vision_provider (line 8780) | async fn e2e_photo_attachment_rejected_by_non_vision_provider() { function e2e_failed_vision_turn_does_not_poison_follow_up_text_turn (line 8866) | async fn e2e_failed_vision_turn_does_not_poison_follow_up_text_turn() { function build_channel_by_id_unknown_channel_returns_error (line 8984) | fn build_channel_by_id_unknown_channel_returns_error() { function process_channel_message_applies_query_classification_route (line 9001) | async fn process_channel_message_applies_query_classification_route() { function process_channel_message_classification_disabled_uses_default_route (line 9109) | async fn process_channel_message_classification_disabled_uses_default_ro... function process_channel_message_classification_no_match_uses_default_route (line 9210) | async fn process_channel_message_classification_no_match_uses_default_ro... function process_channel_message_classification_priority_selects_highest (line 9311) | async fn process_channel_message_classification_priority_selects_highest... function build_channel_by_id_unconfigured_telegram_returns_error (line 9441) | fn build_channel_by_id_unconfigured_telegram_returns_error() { function build_channel_by_id_configured_telegram_succeeds (line 9456) | fn build_channel_by_id_configured_telegram_succeeds() { function is_stop_command_matches_bare_slash_stop (line 9476) | fn is_stop_command_matches_bare_slash_stop() { function is_stop_command_matches_with_leading_trailing_whitespace (line 9481) | fn is_stop_command_matches_with_leading_trailing_whitespace() { function is_stop_command_is_case_insensitive (line 9486) | fn is_stop_command_is_case_insensitive() { function is_stop_command_matches_with_bot_suffix (line 9492) | fn is_stop_command_matches_with_bot_suffix() { function is_stop_command_rejects_other_slash_commands (line 9497) | fn is_stop_command_rejects_other_slash_commands() { function is_stop_command_rejects_plain_text (line 9504) | fn is_stop_command_rejects_plain_text() { function is_stop_command_rejects_stop_as_substring (line 9511) | fn is_stop_command_rejects_stop_as_substring() { function interrupt_on_new_message_enabled_for_mattermost_when_true (line 9517) | fn interrupt_on_new_message_enabled_for_mattermost_when_true() { function interrupt_on_new_message_disabled_for_mattermost_by_default (line 9528) | fn interrupt_on_new_message_disabled_for_mattermost_by_default() { function interrupt_on_new_message_enabled_for_discord (line 9539) | fn interrupt_on_new_message_enabled_for_discord() { function interrupt_on_new_message_disabled_for_discord_by_default (line 9550) | fn interrupt_on_new_message_disabled_for_discord_by_default() { function interruption_scope_key_without_scope_id_is_three_component (line 9563) | fn interruption_scope_key_without_scope_id_is_three_component() { function interruption_scope_key_with_scope_id_is_four_component (line 9578) | fn interruption_scope_key_with_scope_id_is_four_component() { function interruption_scope_key_thread_ts_alone_does_not_affect_key (line 9593) | fn interruption_scope_key_thread_ts_alone_does_not_affect_key() { function message_dispatch_different_threads_do_not_cancel_each_other (line 9609) | async fn message_dispatch_different_threads_do_not_cancel_each_other() { FILE: src/channels/mqtt.rs function run_mqtt_sop_listener (line 22) | pub async fn run_mqtt_sop_listener( function broker_host (line 95) | fn broker_host(url: &str) -> String { function broker_port (line 108) | fn broker_port(url: &str) -> u16 { function mqtt_config_validation_rejects_bad_qos (line 127) | fn mqtt_config_validation_rejects_bad_qos() { function mqtt_config_validation_rejects_bad_url (line 143) | fn mqtt_config_validation_rejects_bad_url() { function mqtt_config_validation_rejects_empty_topics (line 159) | fn mqtt_config_validation_rejects_empty_topics() { function mqtt_config_validation_rejects_empty_client_id (line 175) | fn mqtt_config_validation_rejects_empty_client_id() { function mqtt_config_validation_accepts_valid (line 191) | fn mqtt_config_validation_accepts_valid() { function mqtt_tls_flag_rejects_mqtt_scheme_with_use_tls (line 206) | fn mqtt_tls_flag_rejects_mqtt_scheme_with_use_tls() { function mqtt_tls_flag_rejects_mqtts_scheme_without_use_tls (line 222) | fn mqtt_tls_flag_rejects_mqtts_scheme_without_use_tls() { function mqtt_tls_flag_accepts_mqtts_with_use_tls (line 238) | fn mqtt_tls_flag_accepts_mqtts_with_use_tls() { function broker_host_extracts_host (line 253) | fn broker_host_extracts_host() { function broker_port_extracts_port (line 262) | fn broker_port_extracts_port() { function broker_port_defaults_1883_for_mqtt (line 268) | fn broker_port_defaults_1883_for_mqtt() { function broker_port_defaults_8883_for_mqtts (line 273) | fn broker_port_defaults_8883_for_mqtts() { FILE: src/channels/nextcloud_talk.rs type NextcloudTalkChannel (line 11) | pub struct NextcloudTalkChannel { method new (line 19) | pub fn new(base_url: String, app_token: String, allowed_users: Vec bool { method now_unix_secs (line 32) | fn now_unix_secs() -> u64 { method parse_timestamp_secs (line 39) | fn parse_timestamp_secs(value: Option<&serde_json::Value>) -> u64 { method value_to_string (line 55) | fn value_to_string(value: Option<&serde_json::Value>) -> Option { method parse_webhook_payload (line 86) | pub fn parse_webhook_payload(&self, payload: &serde_json::Value) -> Ve... method parse_as2_payload (line 109) | fn parse_as2_payload(&self, payload: &serde_json::Value) -> Vec Vec anyho... method name (line 334) | fn name(&self) -> &str { method send (line 338) | async fn send(&self, message: &SendMessage) -> anyhow::Result<()> { method listen (line 343) | async fn listen(&self, _tx: tokio::sync::mpsc::Sender) -... method health_check (line 355) | async fn health_check(&self) -> bool { function verify_nextcloud_talk_signature (line 371) | pub fn verify_nextcloud_talk_signature( function make_channel (line 407) | fn make_channel() -> NextcloudTalkChannel { function nextcloud_talk_channel_name (line 416) | fn nextcloud_talk_channel_name() { function nextcloud_talk_user_allowlist_exact_and_wildcard (line 422) | fn nextcloud_talk_user_allowlist_exact_and_wildcard() { function nextcloud_talk_parse_valid_message_payload (line 436) | fn nextcloud_talk_parse_valid_message_payload() { function nextcloud_talk_parse_as2_create_payload (line 470) | fn nextcloud_talk_parse_as2_create_payload() { function nextcloud_talk_parse_as2_skips_bot_originated (line 508) | fn nextcloud_talk_parse_as2_skips_bot_originated() { function nextcloud_talk_parse_as2_skips_non_note_objects (line 539) | fn nextcloud_talk_parse_as2_skips_non_note_objects() { function nextcloud_talk_parse_skips_non_message_events (line 557) | fn nextcloud_talk_parse_skips_non_message_events() { function nextcloud_talk_parse_skips_bot_messages (line 574) | fn nextcloud_talk_parse_skips_bot_messages() { function nextcloud_talk_parse_skips_unauthorized_sender (line 595) | fn nextcloud_talk_parse_skips_unauthorized_sender() { function nextcloud_talk_parse_skips_system_message (line 612) | fn nextcloud_talk_parse_skips_system_message() { function nextcloud_talk_parse_timestamp_millis_to_seconds (line 635) | fn nextcloud_talk_parse_timestamp_millis_to_seconds() { constant TEST_WEBHOOK_SECRET (line 657) | const TEST_WEBHOOK_SECRET: &str = "nextcloud_test_webhook_secret"; function nextcloud_talk_signature_verification_valid (line 660) | fn nextcloud_talk_signature_verification_valid() { function nextcloud_talk_signature_verification_invalid (line 676) | fn nextcloud_talk_signature_verification_invalid() { function nextcloud_talk_signature_verification_accepts_sha256_prefix (line 686) | fn nextcloud_talk_signature_verification_accepts_sha256_prefix() { FILE: src/channels/nostr.rs type NostrProtocol (line 11) | enum NostrProtocol { type AllowList (line 18) | enum AllowList { method parse (line 28) | fn parse(raw: &[String]) -> Result { method is_allowed (line 42) | fn is_allowed(&self, pubkey: &PublicKey) -> bool { type NostrChannel (line 52) | pub struct NostrChannel { method new (line 64) | pub async fn new( method name (line 93) | fn name(&self) -> &str { method send (line 97) | async fn send(&self, message: &SendMessage) -> Result<()> { method listen (line 142) | async fn listen(&self, tx: tokio::sync::mpsc::Sender) ->... method health_check (line 275) | async fn health_check(&self) -> bool { function allow_list_empty_denies_all (line 289) | fn allow_list_empty_denies_all() { function allow_list_wildcard_allows_all (line 296) | fn allow_list_wildcard_allows_all() { function allow_list_specific_pubkeys (line 303) | fn allow_list_specific_pubkeys() { function allow_list_rejects_invalid_key (line 314) | fn allow_list_rejects_invalid_key() { function nostr_channel_name_is_nostr (line 320) | async fn nostr_channel_name_is_nostr() { function nostr_channel_stores_parsed_keys (line 329) | async fn nostr_channel_stores_parsed_keys() { function new_rejects_invalid_key (line 338) | async fn new_rejects_invalid_key() { function new_rejects_invalid_allowed_pubkey (line 344) | async fn new_rejects_invalid_allowed_pubkey() { function health_check_false_with_no_relays (line 356) | async fn health_check_false_with_no_relays() { function default_protocol_is_nip17 (line 365) | async fn default_protocol_is_nip17() { function sender_protocol_tracks_updates (line 376) | async fn sender_protocol_tracks_updates() { FILE: src/channels/notion.rs constant NOTION_API_BASE (line 8) | const NOTION_API_BASE: &str = "https://api.notion.com/v1"; constant NOTION_VERSION (line 9) | const NOTION_VERSION: &str = "2022-06-28"; constant MAX_RESULT_LENGTH (line 10) | const MAX_RESULT_LENGTH: usize = 2000; constant MAX_RETRIES (line 11) | const MAX_RETRIES: u32 = 3; constant RETRY_BASE_DELAY_MS (line 12) | const RETRY_BASE_DELAY_MS: u64 = 2000; constant MAX_ERROR_BODY_CHARS (line 14) | const MAX_ERROR_BODY_CHARS: usize = 500; function floor_utf8_char_boundary (line 17) | fn floor_utf8_char_boundary(s: &str, max_bytes: usize) -> usize { type NotionChannel (line 33) | pub struct NotionChannel { method new (line 49) | pub fn new( method headers (line 75) | fn headers(&self) -> Result { method api_call (line 89) | async fn api_call( method detect_status_type (line 140) | async fn detect_status_type(&self) -> Result { method query_pending (line 154) | async fn query_pending(&self) -> Result> { method claim_task (line 173) | async fn claim_task(&self, page_id: &str) -> bool { method release_task (line 186) | async fn release_task(&self, page_id: &str) { method set_status (line 192) | async fn set_status(&self, page_id: &str, status_value: &str) -> Resul... method set_result (line 206) | async fn set_result(&self, page_id: &str, result_text: &str) -> Result... method recover_stale (line 219) | async fn recover_stale(&self) -> Result<()> { method name (line 271) | fn name(&self) -> &str { method send (line 275) | async fn send(&self, message: &SendMessage) -> Result<()> { method listen (line 292) | async fn listen(&self, tx: tokio::sync::mpsc::Sender) ->... method health_check (line 382) | async fn health_check(&self) -> bool { function build_status_filter (line 393) | fn build_status_filter(property: &str, status_type: &str, value: &str) -... function build_status_payload (line 408) | fn build_status_payload(status_type: &str, value: &str) -> serde_json::V... function build_rich_text_payload (line 417) | fn build_rich_text_payload(value: &str) -> serde_json::Value { function truncate_result (line 427) | fn truncate_result(value: &str) -> String { function extract_text_from_property (line 438) | fn extract_text_from_property(prop: Option<&serde_json::Value>) -> String { function claim_task_deduplication (line 465) | async fn claim_task_deduplication() { function result_truncation_within_limit (line 489) | fn result_truncation_within_limit() { function result_truncation_over_limit (line 495) | fn result_truncation_over_limit() { function result_truncation_multibyte_safe (line 503) | fn result_truncation_multibyte_safe() { function status_payload_select_type (line 516) | fn status_payload_select_type() { function status_payload_status_type (line 525) | fn status_payload_status_type() { function rich_text_payload_construction (line 531) | fn rich_text_payload_construction() { function status_filter_select_type (line 538) | fn status_filter_select_type() { function status_filter_status_type (line 550) | fn status_filter_status_type() { function extract_text_from_title_property (line 562) | fn extract_text_from_title_property() { function extract_text_from_rich_text_property (line 574) | fn extract_text_from_rich_text_property() { function extract_text_from_none (line 583) | fn extract_text_from_none() { function extract_text_from_unknown_type (line 588) | fn extract_text_from_unknown_type() { function claim_task_respects_max_concurrent (line 594) | async fn claim_task_respects_max_concurrent() { FILE: src/channels/qq.rs constant QQ_API_BASE (line 11) | const QQ_API_BASE: &str = "https://api.sgroup.qq.com"; constant QQ_AUTH_URL (line 12) | const QQ_AUTH_URL: &str = "https://bots.qq.com/app/getAppAccessToken"; function ensure_https (line 14) | fn ensure_https(url: &str) -> anyhow::Result<()> { function is_image_filename (line 23) | fn is_image_filename(filename: &str) -> bool { function extract_image_marker_from_attachment (line 36) | fn extract_image_marker_from_attachment(attachment: &serde_json::Value) ... function compose_message_content (line 60) | fn compose_message_content(payload: &serde_json::Value) -> Option { constant DEDUP_CAPACITY (line 94) | const DEDUP_CAPACITY: usize = 10_000; type QQChannel (line 98) | pub struct QQChannel { method new (line 109) | pub fn new(app_id: String, app_secret: String, allowed_users: Vec reqwest::Client { method is_user_allowed (line 123) | fn is_user_allowed(&self, user_id: &str) -> bool { method fetch_access_token (line 128) | async fn fetch_access_token(&self) -> anyhow::Result<(String, u64)> { method get_token (line 172) | async fn get_token(&self) -> anyhow::Result { method get_gateway_url (line 196) | async fn get_gateway_url(&self, token: &str) -> anyhow::Result { method is_duplicate (line 221) | async fn is_duplicate(&self, msg_id: &str) -> bool { method name (line 247) | fn name(&self) -> &str { method send (line 251) | async fn send(&self, message: &SendMessage) -> anyhow::Result<()> { method listen (line 306) | async fn listen(&self, tx: tokio::sync::mpsc::Sender) ->... method health_check (line 524) | async fn health_check(&self) -> bool { function test_name (line 535) | fn test_name() { function test_user_allowed_wildcard (line 541) | fn test_user_allowed_wildcard() { function test_user_allowed_specific (line 547) | fn test_user_allowed_specific() { function test_user_denied_empty (line 554) | fn test_user_denied_empty() { function test_dedup (line 560) | async fn test_dedup() { function test_dedup_empty_id (line 568) | async fn test_dedup_empty_id() { function test_config_serde (line 576) | fn test_config_serde() { function test_compose_message_content_text_only (line 589) | fn test_compose_message_content_text_only() { function test_compose_message_content_attachment_only_image (line 601) | fn test_compose_message_content_attachment_only_image() { function test_compose_message_content_text_and_image_attachments (line 619) | fn test_compose_message_content_text_and_image_attachments() { function test_compose_message_content_ignores_non_image_attachments (line 644) | fn test_compose_message_content_ignores_non_image_attachments() { function test_compose_message_content_drops_empty_without_valid_attachments (line 659) | fn test_compose_message_content_drops_empty_without_valid_attachments() { function test_send_body_uses_markdown_msg_type (line 678) | fn test_send_body_uses_markdown_msg_type() { FILE: src/channels/reddit.rs type RedditChannel (line 9) | pub struct RedditChannel { method new (line 68) | pub fn new( method http_client (line 88) | fn http_client(&self) -> reqwest::Client { method refresh_access_token (line 93) | async fn refresh_access_token(&self) -> Result<()> { method get_access_token (line 124) | async fn get_access_token(&self) -> Result { method fetch_inbox (line 137) | async fn fetch_inbox(&self) -> Result> { method mark_read (line 164) | async fn mark_read(&self, fullnames: &[String]) -> Result<()> { method parse_item (line 187) | fn parse_item(&self, item: &RedditItemData) -> Option { type RedditAuth (line 18) | struct RedditAuth { type RedditTokenResponse (line 24) | struct RedditTokenResponse { type RedditListing (line 30) | struct RedditListing { type RedditListingData (line 35) | struct RedditListingData { type RedditChild (line 40) | struct RedditChild { type RedditItemData (line 46) | struct RedditItemData { constant REDDIT_API_BASE (line 61) | const REDDIT_API_BASE: &str = "https://oauth.reddit.com"; constant REDDIT_TOKEN_URL (line 62) | const REDDIT_TOKEN_URL: &str = "https://www.reddit.com/api/v1/access_tok... constant USER_AGENT (line 63) | const USER_AGENT: &str = "zeroclaw:channel:v0.1.0 (by /u/zeroclaw-bot)"; constant POLL_INTERVAL (line 65) | const POLL_INTERVAL: Duration = Duration::from_secs(5); method name (line 235) | fn name(&self) -> &str { method send (line 239) | async fn send(&self, message: &SendMessage) -> Result<()> { method listen (line 300) | async fn listen(&self, tx: tokio::sync::mpsc::Sender) ->... method health_check (line 342) | async fn health_check(&self) -> bool { function make_channel (line 351) | fn make_channel() -> RedditChannel { function make_channel_with_sub (line 361) | fn make_channel_with_sub(sub: &str) -> RedditChannel { function parse_comment_reply (line 372) | fn parse_comment_reply() { function parse_dm (line 397) | fn parse_dm() { function skip_self_messages (line 420) | fn skip_self_messages() { function skip_empty_body (line 440) | fn skip_empty_body() { function subreddit_filter (line 460) | fn subreddit_filter() { function send_message_formatting (line 496) | fn send_message_formatting() { FILE: src/channels/session_backend.rs type SessionMetadata (line 12) | pub struct SessionMetadata { type SessionQuery (line 25) | pub struct SessionQuery { type SessionBackend (line 35) | pub trait SessionBackend: Send + Sync { method load (line 37) | fn load(&self, session_key: &str) -> Vec; method append (line 40) | fn append(&self, session_key: &str, message: &ChatMessage) -> std::io:... method remove_last (line 43) | fn remove_last(&self, session_key: &str) -> std::io::Result; method list_sessions (line 46) | fn list_sessions(&self) -> Vec; method list_sessions_with_metadata (line 49) | fn list_sessions_with_metadata(&self) -> Vec { method compact (line 66) | fn compact(&self, _session_key: &str) -> std::io::Result<()> { method cleanup_stale (line 71) | fn cleanup_stale(&self, _ttl_hours: u32) -> std::io::Result { method search (line 76) | fn search(&self, _query: &SessionQuery) -> Vec { method delete_session (line 81) | fn delete_session(&self, _session_key: &str) -> std::io::Result { function session_metadata_is_constructible (line 91) | fn session_metadata_is_constructible() { function session_query_defaults (line 103) | fn session_query_defaults() { FILE: src/channels/session_sqlite.rs type SqliteSessionBackend (line 16) | pub struct SqliteSessionBackend { method new (line 24) | pub fn new(workspace_dir: &Path) -> Result { method migrate_from_jsonl (line 79) | pub fn migrate_from_jsonl(&self, workspace_dir: &Path) -> Result { method load (line 133) | fn load(&self, session_key: &str) -> Vec { method append (line 155) | fn append(&self, session_key: &str, message: &ChatMessage) -> std::io::R... method remove_last (line 180) | fn remove_last(&self, session_key: &str) -> std::io::Result { method list_sessions (line 209) | fn list_sessions(&self) -> Vec { method list_sessions_with_metadata (line 226) | fn list_sessions_with_metadata(&self) -> Vec { method cleanup_stale (line 264) | fn cleanup_stale(&self, ttl_hours: u32) -> std::io::Result { method delete_session (line 291) | fn delete_session(&self, session_key: &str) -> std::io::Result { method search (line 324) | fn search(&self, query: &SessionQuery) -> Vec { function round_trip_sqlite (line 391) | fn round_trip_sqlite() { function remove_last_sqlite (line 409) | fn remove_last_sqlite() { function remove_last_empty_sqlite (line 423) | fn remove_last_empty_sqlite() { function list_sessions_sqlite (line 430) | fn list_sessions_sqlite() { function metadata_tracks_counts (line 442) | fn metadata_tracks_counts() { function fts5_search_finds_content (line 456) | fn fts5_search_finds_content() { function cleanup_stale_removes_old_sessions (line 479) | fn cleanup_stale_removes_old_sessions() { function delete_session_removes_all_data (line 510) | fn delete_session_removes_all_data() { function delete_session_returns_false_for_missing (line 525) | fn delete_session_returns_false_for_missing() { function migrate_from_jsonl_imports_and_renames (line 532) | fn migrate_from_jsonl_imports_and_renames() { FILE: src/channels/session_store.rs type SessionStore (line 14) | pub struct SessionStore { method new (line 20) | pub fn new(workspace_dir: &Path) -> std::io::Result { method session_path (line 27) | fn session_path(&self, session_key: &str) -> PathBuf { method load (line 43) | pub fn load(&self, session_key: &str) -> Vec { method append (line 68) | pub fn append(&self, session_key: &str, message: &ChatMessage) -> std:... method remove_last (line 86) | pub fn remove_last(&self, session_key: &str) -> std::io::Result { method compact (line 97) | pub fn compact(&self, session_key: &str) -> std::io::Result<()> { method rewrite (line 102) | fn rewrite(&self, session_key: &str, messages: &[ChatMessage]) -> std:... method delete_session (line 114) | pub fn delete_session(&self, session_key: &str) -> std::io::Result Vec { method load (line 141) | fn load(&self, session_key: &str) -> Vec { method append (line 145) | fn append(&self, session_key: &str, message: &ChatMessage) -> std::io::R... method remove_last (line 149) | fn remove_last(&self, session_key: &str) -> std::io::Result { method list_sessions (line 153) | fn list_sessions(&self) -> Vec { method compact (line 157) | fn compact(&self, session_key: &str) -> std::io::Result<()> { method delete_session (line 161) | fn delete_session(&self, session_key: &str) -> std::io::Result { function round_trip_append_and_load (line 172) | fn round_trip_append_and_load() { function load_nonexistent_session_returns_empty (line 192) | fn load_nonexistent_session_returns_empty() { function key_sanitization (line 201) | fn key_sanitization() { function list_sessions_returns_keys (line 215) | fn list_sessions_returns_keys() { function append_is_truly_append_only (line 234) | fn append_is_truly_append_only() { function remove_last_drops_final_message (line 250) | fn remove_last_drops_final_message() { function remove_last_empty_returns_false (line 268) | fn remove_last_empty_returns_false() { function compact_removes_corrupt_lines (line 275) | fn compact_removes_corrupt_lines() { function session_backend_trait_works_via_dyn (line 294) | fn session_backend_trait_works_via_dyn() { function handles_corrupt_lines_gracefully (line 307) | fn handles_corrupt_lines_gracefully() { function delete_session_removes_jsonl_file (line 327) | fn delete_session_removes_jsonl_file() { function delete_session_nonexistent_returns_false (line 342) | fn delete_session_nonexistent_returns_false() { function delete_session_via_trait (line 351) | fn delete_session_via_trait() { FILE: src/channels/signal.rs constant GROUP_TARGET_PREFIX (line 10) | const GROUP_TARGET_PREFIX: &str = "group:"; type RecipientTarget (line 13) | enum RecipientTarget { type SignalChannel (line 24) | pub struct SignalChannel { method new (line 74) | pub fn new( method http_client (line 93) | fn http_client(&self) -> Client { method sender (line 100) | fn sender(envelope: &Envelope) -> Option { method is_sender_allowed (line 108) | fn is_sender_allowed(&self, sender: &str) -> bool { method is_e164 (line 115) | fn is_e164(recipient: &str) -> bool { method is_uuid (line 124) | fn is_uuid(s: &str) -> bool { method parse_recipient_target (line 128) | fn parse_recipient_target(recipient: &str) -> RecipientTarget { method matches_group (line 143) | fn matches_group(&self, data_msg: &DataMessage) -> bool { method reply_target (line 158) | fn reply_target(&self, data_msg: &DataMessage, sender: &str) -> String { method rpc_request (line 171) | async fn rpc_request( method process_envelope (line 219) | fn process_envelope(&self, envelope: &Envelope) -> Option &str { method send (line 280) | async fn send(&self, message: &SendMessage) -> anyhow::Result<()> { method listen (line 298) | async fn listen(&self, tx: mpsc::Sender) -> anyhow::Resu... method health_check (line 416) | async fn health_check(&self) -> bool { method start_typing (line 430) | async fn start_typing(&self, recipient: &str) -> anyhow::Result<()> { method stop_typing (line 445) | async fn stop_typing(&self, _recipient: &str) -> anyhow::Result<()> { function make_channel (line 456) | fn make_channel() -> SignalChannel { function make_channel_with_group (line 467) | fn make_channel_with_group(group_id: &str) -> SignalChannel { function make_envelope (line 478) | fn make_envelope(source_number: Option<&str>, message: Option<&str>) -> ... function creates_with_correct_fields (line 494) | fn creates_with_correct_fields() { function strips_trailing_slash (line 505) | fn strips_trailing_slash() { function wildcard_allows_anyone (line 518) | fn wildcard_allows_anyone() { function specific_sender_allowed (line 524) | fn specific_sender_allowed() { function unknown_sender_denied (line 530) | fn unknown_sender_denied() { function empty_allowlist_denies_all (line 536) | fn empty_allowlist_denies_all() { function name_returns_signal (line 549) | fn name_returns_signal() { function matches_group_no_group_id_accepts_all (line 555) | fn matches_group_no_group_id_accepts_all() { function matches_group_filters_group (line 577) | fn matches_group_filters_group() { function matches_group_dm_keyword (line 601) | fn matches_group_dm_keyword() { function reply_target_dm (line 623) | fn reply_target_dm() { function reply_target_group (line 635) | fn reply_target_group() { function parse_recipient_target_e164_is_direct (line 649) | fn parse_recipient_target_e164_is_direct() { function parse_recipient_target_prefixed_group_is_group (line 657) | fn parse_recipient_target_prefixed_group_is_group() { function parse_recipient_target_uuid_is_direct (line 665) | fn parse_recipient_target_uuid_is_direct() { function parse_recipient_target_non_e164_plus_is_group (line 674) | fn parse_recipient_target_non_e164_plus_is_group() { function is_uuid_valid (line 682) | fn is_uuid_valid() { function is_uuid_invalid (line 692) | fn is_uuid_invalid() { function sender_prefers_source_number (line 700) | fn sender_prefers_source_number() { function sender_falls_back_to_source (line 712) | fn sender_falls_back_to_source() { function process_envelope_uuid_sender_dm (line 724) | fn process_envelope_uuid_sender_dm() { function process_envelope_uuid_sender_in_group (line 757) | fn process_envelope_uuid_sender_in_group() { function sender_none_when_both_missing (line 791) | fn sender_none_when_both_missing() { function process_envelope_valid_dm (line 803) | fn process_envelope_valid_dm() { function process_envelope_denied_sender (line 813) | fn process_envelope_denied_sender() { function process_envelope_empty_message (line 820) | fn process_envelope_empty_message() { function process_envelope_no_data_message (line 827) | fn process_envelope_no_data_message() { function process_envelope_skips_stories (line 834) | fn process_envelope_skips_stories() { function process_envelope_skips_attachment_only (line 842) | fn process_envelope_skips_attachment_only() { function sse_envelope_deserializes (line 860) | fn sse_envelope_deserializes() { function sse_envelope_deserializes_group (line 880) | fn sse_envelope_deserializes_group() { function envelope_defaults (line 902) | fn envelope_defaults() { FILE: src/channels/slack.rs type CachedSlackDisplayName (line 16) | struct CachedSlackDisplayName { type SlackChannel (line 22) | pub struct SlackChannel { method new (line 66) | pub fn new( method with_group_reply_policy (line 88) | pub fn with_group_reply_policy( method with_thread_replies (line 100) | pub fn with_thread_replies(mut self, thread_replies: bool) -> Self { method with_workspace_dir (line 106) | pub fn with_workspace_dir(mut self, dir: PathBuf) -> Self { method http_client (line 111) | fn http_client(&self) -> reqwest::Client { method is_user_allowed (line 118) | fn is_user_allowed(&self, user_id: &str) -> bool { method is_group_sender_trigger_enabled (line 122) | fn is_group_sender_trigger_enabled(&self, user_id: &str) -> bool { method outbound_thread_ts (line 133) | fn outbound_thread_ts<'a>(&self, message: &'a SendMessage) -> Option<&... method get_bot_user_id (line 142) | async fn get_bot_user_id(&self) -> Option { method inbound_thread_ts (line 161) | fn inbound_thread_ts(msg: &serde_json::Value, ts: &str) -> Option... method normalized_channel_id (line 185) | fn normalized_channel_id(input: Option<&str>) -> Option { method configured_channel_id (line 192) | fn configured_channel_id(&self) -> Option { method scoped_channel_ids (line 198) | fn scoped_channel_ids(&self) -> Option> { method configured_app_token (line 212) | fn configured_app_token(&self) -> Option { method normalize_group_reply_allowed_sender_ids (line 220) | fn normalize_group_reply_allowed_sender_ids(sender_ids: Vec) -... method user_cache_ttl (line 231) | fn user_cache_ttl() -> Duration { method sanitize_display_name (line 235) | fn sanitize_display_name(name: &str) -> Option { method extract_user_display_name (line 244) | fn extract_user_display_name(payload: &serde_json::Value) -> Option Option { method cache_sender_display_name (line 290) | fn cache_sender_display_name(&self, user_id: &str, display_name: &str) { method fetch_sender_display_name (line 307) | async fn fetch_sender_display_name(&self, user_id: &str) -> Option String { method is_group_channel_id (line 366) | fn is_group_channel_id(channel_id: &str) -> bool { method contains_bot_mention (line 370) | fn contains_bot_mention(text: &str, bot_user_id: &str) -> bool { method strip_bot_mentions (line 377) | fn strip_bot_mentions(text: &str, bot_user_id: &str) -> String { method normalize_incoming_text (line 386) | fn normalize_incoming_text( method normalize_incoming_content (line 402) | fn normalize_incoming_content( method is_supported_message_subtype (line 414) | fn is_supported_message_subtype(subtype: Option<&str>) -> bool { method compose_incoming_content (line 418) | fn compose_incoming_content(text: String, attachment_blocks: Vec Optio... method fetch_file_info (line 536) | async fn fetch_file_info(&self, file_id: &str) -> Option Option<&str> { method slack_file_name (line 580) | fn slack_file_name(file: &serde_json::Value) -> String { method slack_file_mode (line 590) | fn slack_file_mode(file: &serde_json::Value) -> Option { method slack_file_mime (line 596) | fn slack_file_mime(file: &serde_json::Value) -> Option { method slack_file_download_url (line 602) | fn slack_file_download_url(file: &serde_json::Value) -> Option<&str> { method slack_image_candidate_urls (line 608) | fn slack_image_candidate_urls(file: &serde_json::Value) -> Vec { method is_allowed_slack_media_hostname (line 635) | fn is_allowed_slack_media_hostname(host: &str) -> bool { method redact_slack_url (line 646) | fn redact_slack_url(url: &reqwest::Url) -> String { method redact_raw_slack_url (line 659) | fn redact_raw_slack_url(raw_url: &str) -> String { method redact_redirect_location (line 665) | fn redact_redirect_location(location: &str) -> String { method validate_slack_private_file_url (line 683) | fn validate_slack_private_file_url(raw_url: &str) -> Option anyhow::Result Option Option... method download_private_image_as_marker (line 847) | async fn download_private_image_as_marker( method detect_image_mime (line 944) | fn detect_image_mime( method normalized_content_type (line 991) | fn normalized_content_type(content_type: &str) -> Option { method is_supported_image_mime (line 1005) | fn is_supported_image_mime(mime: &str) -> bool { method mime_from_extension (line 1009) | fn mime_from_extension(ext: &str) -> Option<&'static str> { method mime_from_magic (line 1020) | fn mime_from_magic(bytes: &[u8]) -> Option<&'static str> { method persist_image_attachment (line 1041) | async fn persist_image_attachment( method resolve_workspace_attachment_output_path (line 1158) | async fn resolve_workspace_attachment_output_path( method sanitize_attachment_filename (line 1189) | fn sanitize_attachment_filename(file_name: &str) -> Option { method sanitize_file_id (line 1207) | fn sanitize_file_id(file_id: &str) -> String { method ensure_file_extension (line 1220) | fn ensure_file_extension(file_name: &str, extension: &str) -> String { method image_extension_for_mime (line 1228) | fn image_extension_for_mime(mime: &str) -> Option<&'static str> { method file_extension (line 1239) | fn file_extension(value: &str) -> Option { method file_text_preview (line 1249) | fn file_text_preview(file: &serde_json::Value) -> Option { method truncate_text (line 1265) | fn truncate_text(value: &str, max_chars: usize) -> Option { method is_probably_text_file (line 1286) | fn is_probably_text_file(file: &serde_json::Value) -> bool { method is_text_filetype (line 1316) | fn is_text_filetype(filetype: &str) -> bool { method is_image_file (line 1362) | fn is_image_file(file: &serde_json::Value) -> bool { method download_text_snippet (line 1385) | async fn download_text_snippet(&self, file: &serde_json::Value) -> Opt... method format_snippet_attachment (line 1445) | fn format_snippet_attachment(file: &serde_json::Value, snippet: &str) ... method sanitize_code_fence_language (line 1461) | fn sanitize_code_fence_language(input: &str) -> String { method format_attachment_summary (line 1474) | fn format_attachment_summary(file: &serde_json::Value) -> String { method extract_channel_ids (line 1485) | fn extract_channel_ids(list_payload: &serde_json::Value) -> Vec { method list_accessible_channels (line 1512) | async fn list_accessible_channels(&self) -> anyhow::Result> { method slack_now_ts (line 1577) | fn slack_now_ts() -> String { method ensure_poll_cursor (line 1584) | fn ensure_poll_cursor( method open_socket_mode_url (line 1595) | async fn open_socket_mode_url(&self) -> anyhow::Result { method listen_socket_mode (line 1634) | async fn listen_socket_mode( method parse_retry_after_secs (line 1831) | fn parse_retry_after_secs(headers: &HeaderMap) -> Option { method parse_retry_after_value (line 1840) | fn parse_retry_after_value(value: &str) -> Option { method jitter_ms (line 1856) | fn jitter_ms(max_jitter_ms: u64) -> u64 { method compute_exponential_backoff_delay (line 1863) | fn compute_exponential_backoff_delay( method compute_retry_delay (line 1876) | fn compute_retry_delay(base_retry_after_secs: u64, attempt: u32, jitte... method compute_socket_mode_retry_delay (line 1885) | fn compute_socket_mode_retry_delay(attempt: u32) -> Duration { method next_retry_timestamp (line 1895) | fn next_retry_timestamp(wait: Duration) -> String { method evaluate_health (line 1902) | fn evaluate_health(bot_ok: bool, socket_mode_enabled: bool, socket_mod... method slack_api_call_succeeded (line 1912) | fn slack_api_call_succeeded(status: reqwest::StatusCode, body: &str) -... method fetch_history_with_retry (line 1924) | async fn fetch_history_with_retry( method fetch_thread_replies_with_retry (line 2017) | async fn fetch_thread_replies_with_retry( method extract_active_threads (line 2128) | fn extract_active_threads(messages: &[serde_json::Value]) -> Vec<(Stri... method evict_stale_threads (line 2153) | fn evict_stale_threads( constant SLACK_HISTORY_MAX_RETRIES (line 35) | const SLACK_HISTORY_MAX_RETRIES: u32 = 3; constant SLACK_HISTORY_DEFAULT_RETRY_AFTER_SECS (line 36) | const SLACK_HISTORY_DEFAULT_RETRY_AFTER_SECS: u64 = 1; constant SLACK_HISTORY_MAX_BACKOFF_SECS (line 37) | const SLACK_HISTORY_MAX_BACKOFF_SECS: u64 = 120; constant SLACK_HISTORY_MAX_JITTER_MS (line 38) | const SLACK_HISTORY_MAX_JITTER_MS: u64 = 500; constant SLACK_SOCKET_MODE_INITIAL_BACKOFF_SECS (line 39) | const SLACK_SOCKET_MODE_INITIAL_BACKOFF_SECS: u64 = 3; constant SLACK_SOCKET_MODE_MAX_BACKOFF_SECS (line 40) | const SLACK_SOCKET_MODE_MAX_BACKOFF_SECS: u64 = 120; constant SLACK_SOCKET_MODE_MAX_JITTER_MS (line 41) | const SLACK_SOCKET_MODE_MAX_JITTER_MS: u64 = 500; constant SLACK_USER_CACHE_TTL_SECS (line 42) | const SLACK_USER_CACHE_TTL_SECS: u64 = 6 * 60 * 60; constant SLACK_ATTACHMENT_IMAGE_MAX_BYTES (line 43) | const SLACK_ATTACHMENT_IMAGE_MAX_BYTES: usize = 5 * 1024 * 1024; constant SLACK_ATTACHMENT_IMAGE_INLINE_FALLBACK_MAX_BYTES (line 44) | const SLACK_ATTACHMENT_IMAGE_INLINE_FALLBACK_MAX_BYTES: usize = 512 * 1024; constant SLACK_ATTACHMENT_TEXT_DOWNLOAD_MAX_BYTES (line 45) | const SLACK_ATTACHMENT_TEXT_DOWNLOAD_MAX_BYTES: usize = 256 * 1024; constant SLACK_ATTACHMENT_TEXT_INLINE_MAX_CHARS (line 46) | const SLACK_ATTACHMENT_TEXT_INLINE_MAX_CHARS: usize = 12_000; constant SLACK_ATTACHMENT_FILENAME_MAX_CHARS (line 47) | const SLACK_ATTACHMENT_FILENAME_MAX_CHARS: usize = 128; constant SLACK_USER_CACHE_MAX_ENTRIES (line 48) | const SLACK_USER_CACHE_MAX_ENTRIES: usize = 1000; constant SLACK_ATTACHMENT_SAVE_SUBDIR (line 49) | const SLACK_ATTACHMENT_SAVE_SUBDIR: &str = "slack_files"; constant SLACK_ATTACHMENT_MAX_FILES_PER_MESSAGE (line 50) | const SLACK_ATTACHMENT_MAX_FILES_PER_MESSAGE: usize = 8; constant SLACK_ATTACHMENT_RENDER_CONCURRENCY (line 51) | const SLACK_ATTACHMENT_RENDER_CONCURRENCY: usize = 3; constant SLACK_POLL_ACTIVE_THREAD_MAX (line 52) | const SLACK_POLL_ACTIVE_THREAD_MAX: usize = 50; constant SLACK_POLL_THREAD_EXPIRE_SECS (line 53) | const SLACK_POLL_THREAD_EXPIRE_SECS: u64 = 24 * 60 * 60; constant SLACK_MEDIA_REDIRECT_MAX_HOPS (line 54) | const SLACK_MEDIA_REDIRECT_MAX_HOPS: usize = 5; constant SLACK_ALLOWED_MEDIA_HOST_SUFFIXES (line 55) | const SLACK_ALLOWED_MEDIA_HOST_SUFFIXES: &[&str] = constant SLACK_SUPPORTED_IMAGE_MIME_TYPES (line 57) | const SLACK_SUPPORTED_IMAGE_MIME_TYPES: &[&str] = &[ method name (line 2176) | fn name(&self) -> &str { method send (line 2180) | async fn send(&self, message: &SendMessage) -> anyhow::Result<()> { method listen (line 2222) | async fn listen(&self, tx: tokio::sync::mpsc::Sender) ->... method health_check (line 2473) | async fn health_check(&self) -> bool { function slack_channel_name (line 2503) | fn slack_channel_name() { function slack_channel_with_channel_id (line 2509) | fn slack_channel_with_channel_id() { function slack_group_reply_policy_defaults_to_all_messages (line 2521) | fn slack_group_reply_policy_defaults_to_all_messages() { function with_thread_replies_sets_flag (line 2529) | fn with_thread_replies_sets_flag() { function outbound_thread_ts_respects_thread_replies_setting (line 2536) | fn outbound_thread_ts_respects_thread_replies_setting() { function with_workspace_dir_sets_field (line 2548) | fn with_workspace_dir_sets_field() { function slack_group_reply_policy_applies_sender_overrides (line 2558) | fn slack_group_reply_policy_applies_sender_overrides() { function normalized_channel_id_respects_wildcard_and_blank (line 2572) | fn normalized_channel_id_respects_wildcard_and_blank() { function configured_app_token_ignores_blank_values (line 2585) | fn configured_app_token_ignores_blank_values() { function configured_app_token_trims_value (line 2591) | fn configured_app_token_trims_value() { function scoped_channel_ids_prefers_explicit_list (line 2603) | fn scoped_channel_ids_prefers_explicit_list() { function scoped_channel_ids_falls_back_to_single_channel_id (line 2618) | fn scoped_channel_ids_falls_back_to_single_channel_id() { function scoped_channel_ids_returns_none_for_wildcard_mode (line 2630) | fn scoped_channel_ids_returns_none_for_wildcard_mode() { function is_group_channel_id_detects_channel_prefixes (line 2636) | fn is_group_channel_id_detects_channel_prefixes() { function extract_channel_ids_filters_archived_and_non_member_entries (line 2644) | fn extract_channel_ids_filters_archived_and_non_member_entries() { function empty_allowlist_denies_everyone (line 2659) | fn empty_allowlist_denies_everyone() { function wildcard_allows_everyone (line 2666) | fn wildcard_allows_everyone() { function extract_user_display_name_prefers_profile_display_name (line 2672) | fn extract_user_display_name_prefers_profile_display_name() { function extract_user_display_name_falls_back_to_username (line 2691) | fn extract_user_display_name_falls_back_to_username() { function cached_sender_display_name_returns_none_when_expired (line 2710) | fn cached_sender_display_name_returns_none_when_expired() { function cached_sender_display_name_returns_cached_value_when_valid (line 2729) | fn cached_sender_display_name_returns_cached_value_when_valid() { function normalize_incoming_content_requires_mention_when_enabled (line 2740) | fn normalize_incoming_content_requires_mention_when_enabled() { function normalize_incoming_content_without_mention_mode_keeps_message (line 2749) | fn normalize_incoming_content_without_mention_mode_keeps_message() { function compose_incoming_content_allows_attachment_only_messages (line 2757) | fn compose_incoming_content_allows_attachment_only_messages() { function message_subtype_support_allows_file_share (line 2769) | fn message_subtype_support_allows_file_share() { function file_text_preview_prefers_preview_field (line 2786) | fn file_text_preview_prefers_preview_field() { function is_image_file_detects_mimetype_or_extension (line 2798) | fn is_image_file_detects_mimetype_or_extension() { function detect_image_mime_rejects_non_image_bytes_despite_image_metadata (line 2808) | fn detect_image_mime_rejects_non_image_bytes_despite_image_metadata() { function detect_image_mime_prefers_magic_bytes_over_misleading_metadata (line 2823) | fn detect_image_mime_prefers_magic_bytes_over_misleading_metadata() { function is_probably_text_file_accepts_snippet_mode (line 2839) | fn is_probably_text_file_accepts_snippet_mode() { function sanitize_attachment_filename_strips_path_traversal (line 2849) | fn sanitize_attachment_filename_strips_path_traversal() { function ensure_file_extension_appends_when_missing (line 2862) | fn ensure_file_extension_appends_when_missing() { function is_allowed_slack_media_hostname_matches_suffixes (line 2874) | fn is_allowed_slack_media_hostname_matches_suffixes() { function validate_slack_private_file_url_rejects_invalid_schemes_and_hosts (line 2890) | fn validate_slack_private_file_url_rejects_invalid_schemes_and_hosts() { function resolve_https_redirect_target_enforces_https (line 2902) | fn resolve_https_redirect_target_enforces_https() { function redact_slack_url_hides_query_fragments (line 2920) | fn redact_slack_url_hides_query_fragments() { function redact_redirect_location_keeps_only_relative_tail (line 2933) | fn redact_redirect_location_keeps_only_relative_tail() { function resolve_workspace_attachment_output_path_stays_in_workspace (line 2941) | async fn resolve_workspace_attachment_output_path_stays_in_workspace() { function persist_image_attachment_writes_bytes_without_part_leftovers (line 2954) | async fn persist_image_attachment_writes_bytes_without_part_leftovers() { function evaluate_health_enforces_socket_mode_probe_when_enabled (line 2982) | fn evaluate_health_enforces_socket_mode_probe_when_enabled() { function slack_api_call_succeeded_requires_ok_true_in_body (line 2992) | fn slack_api_call_succeeded_requires_ok_true_in_body() { function slack_api_call_succeeded_accepts_ok_true (line 3000) | fn slack_api_call_succeeded_accepts_ok_true() { function specific_allowlist_filters (line 3008) | fn specific_allowlist_filters() { function allowlist_exact_match_not_substring (line 3022) | fn allowlist_exact_match_not_substring() { function allowlist_empty_user_id (line 3029) | fn allowlist_empty_user_id() { function allowlist_case_sensitive (line 3035) | fn allowlist_case_sensitive() { function allowlist_wildcard_and_specific (line 3042) | fn allowlist_wildcard_and_specific() { function slack_message_id_format_includes_channel_and_ts (line 3057) | fn slack_message_id_format_includes_channel_and_ts() { function slack_message_id_is_deterministic (line 3066) | fn slack_message_id_is_deterministic() { function slack_message_id_different_ts_different_id (line 3076) | fn slack_message_id_different_ts_different_id() { function slack_message_id_different_channel_different_id (line 3085) | fn slack_message_id_different_channel_different_id() { function slack_message_id_no_uuid_randomness (line 3094) | fn slack_message_id_no_uuid_randomness() { function inbound_thread_ts_prefers_explicit_thread_ts (line 3104) | fn inbound_thread_ts_prefers_explicit_thread_ts() { function inbound_thread_ts_falls_back_to_ts (line 3115) | fn inbound_thread_ts_falls_back_to_ts() { function inbound_thread_ts_none_when_ts_missing (line 3125) | fn inbound_thread_ts_none_when_ts_missing() { function ensure_poll_cursor_bootstraps_new_channel (line 3133) | fn ensure_poll_cursor_bootstraps_new_channel() { function ensure_poll_cursor_keeps_existing_cursor (line 3143) | fn ensure_poll_cursor_keeps_existing_cursor() { function parse_retry_after_value_accepts_integer_seconds (line 3155) | fn parse_retry_after_value_accepts_integer_seconds() { function parse_retry_after_value_accepts_decimal_seconds (line 3160) | fn parse_retry_after_value_accepts_decimal_seconds() { function parse_retry_after_value_rejects_non_numeric_values (line 3165) | fn parse_retry_after_value_rejects_non_numeric_values() { function parse_retry_after_secs_reads_header_value (line 3171) | fn parse_retry_after_secs_reads_header_value() { function compute_retry_delay_applies_backoff_and_jitter_with_cap (line 3178) | fn compute_retry_delay_applies_backoff_and_jitter_with_cap() { function extract_active_threads_finds_thread_parents_with_replies (line 3186) | fn extract_active_threads_finds_thread_parents_with_replies() { function extract_active_threads_ignores_reply_messages (line 3212) | fn extract_active_threads_ignores_reply_messages() { function extract_active_threads_uses_thread_ts_as_fallback_latest_reply (line 3225) | fn extract_active_threads_uses_thread_ts_as_fallback_latest_reply() { function evict_stale_threads_removes_expired_entries (line 3238) | fn evict_stale_threads_removes_expired_entries() { function evict_stale_threads_trims_excess_by_oldest_key (line 3258) | fn evict_stale_threads_trims_excess_by_oldest_key() { function is_supported_message_subtype_rejects_message_replied (line 3273) | fn is_supported_message_subtype_rejects_message_replied() { function inbound_thread_ts_on_thread_reply_uses_thread_ts (line 3281) | fn inbound_thread_ts_on_thread_reply_uses_thread_ts() { FILE: src/channels/telegram.rs constant TELEGRAM_MAX_MESSAGE_LENGTH (line 16) | const TELEGRAM_MAX_MESSAGE_LENGTH: usize = 4096; constant TELEGRAM_CONTINUATION_OVERHEAD (line 19) | const TELEGRAM_CONTINUATION_OVERHEAD: usize = 30; constant TELEGRAM_ACK_REACTIONS (line 20) | const TELEGRAM_ACK_REACTIONS: &[&str] = &["⚡️", "👌", "👀", "🔥", "👍"]; type IncomingAttachment (line 24) | struct IncomingAttachment { type IncomingAttachmentKind (line 34) | enum IncomingAttachmentKind { constant TELEGRAM_BIND_COMMAND (line 38) | const TELEGRAM_BIND_COMMAND: &str = "/bind"; function split_message_for_telegram (line 43) | fn split_message_for_telegram(message: &str) -> Vec { function pick_uniform_index (line 96) | fn pick_uniform_index(len: usize) -> usize { function random_telegram_ack_reaction (line 110) | fn random_telegram_ack_reaction() -> &'static str { function build_telegram_ack_reaction_request (line 114) | fn build_telegram_ack_reaction_request( type TelegramAttachmentKind (line 130) | enum TelegramAttachmentKind { method from_marker (line 145) | fn from_marker(marker: &str) -> Option { type TelegramAttachment (line 139) | struct TelegramAttachment { function is_image_extension (line 158) | fn is_image_extension(path: &Path) -> bool { function format_attachment_content (line 176) | fn format_attachment_content( function is_http_url (line 193) | fn is_http_url(target: &str) -> bool { function infer_attachment_kind_from_target (line 197) | fn infer_attachment_kind_from_target(target: &str) -> Option Option String { function find_matching_close (line 251) | fn find_matching_close(s: &str) -> Option { function parse_attachment_markers (line 268) | fn parse_attachment_markers(message: &str) -> (String, Vec, mention_only... method with_ack_reactions (line 386) | pub fn with_ack_reactions(mut self, enabled: bool) -> Self { method with_workspace_dir (line 392) | pub fn with_workspace_dir(mut self, dir: std::path::PathBuf) -> Self { method with_streaming (line 398) | pub fn with_streaming( method with_api_base (line 410) | pub fn with_api_base(mut self, api_base: String) -> Self { method with_transcription (line 416) | pub fn with_transcription(mut self, config: crate::config::Transcripti... method with_tts (line 424) | pub fn with_tts(mut self, config: crate::config::TtsConfig) -> Self { method parse_reply_target (line 432) | fn parse_reply_target(reply_target: &str) -> (String, Option) { method extract_update_message_target (line 440) | fn extract_update_message_target(update: &serde_json::Value) -> Option... method try_add_ack_reaction_nonblocking (line 453) | fn try_add_ack_reaction_nonblocking(&self, chat_id: String, message_id... method http_client (line 480) | fn http_client(&self) -> reqwest::Client { method normalize_identity (line 484) | fn normalize_identity(value: &str) -> String { method normalize_allowed_users (line 488) | fn normalize_allowed_users(allowed_users: Vec) -> Vec { method load_config_without_env (line 496) | async fn load_config_without_env() -> anyhow::Result { method persist_allowed_identity (line 514) | async fn persist_allowed_identity(&self, identity: &str) -> anyhow::Re... method add_allowed_identity_runtime (line 540) | fn add_allowed_identity_runtime(&self, identity: &str) { method extract_bind_code (line 552) | fn extract_bind_code(text: &str) -> Option<&str> { method pairing_code_active (line 562) | fn pairing_code_active(&self) -> bool { method api_url (line 569) | fn api_url(&self, method: &str) -> String { method synthesize_and_send_voice (line 574) | async fn synthesize_and_send_voice( method classify_edit_message_response (line 618) | async fn classify_edit_message_response(resp: reqwest::Response) -> Ed... method fetch_bot_username (line 632) | async fn fetch_bot_username(&self) -> anyhow::Result { method get_bot_username (line 649) | async fn get_bot_username(&self) -> Option { method is_telegram_username_char (line 670) | fn is_telegram_username_char(ch: char) -> bool { method find_bot_mention_spans (line 674) | fn find_bot_mention_spans(text: &str, bot_username: &str) -> Vec<(usiz... method contains_bot_mention (line 718) | fn contains_bot_mention(text: &str, bot_username: &str) -> bool { method normalize_incoming_content (line 722) | fn normalize_incoming_content(text: &str, bot_username: &str) -> Optio... method is_group_message (line 741) | fn is_group_message(message: &serde_json::Value) -> bool { method is_user_allowed (line 750) | fn is_user_allowed(&self, username: &str) -> bool { method is_any_user_allowed (line 758) | fn is_any_user_allowed<'a, I>(&self, identities: I) -> bool method handle_unauthorized_message (line 765) | async fn handle_unauthorized_message(&self, update: &serde_json::Value) { method get_file_path (line 920) | async fn get_file_path(&self, file_id: &str) -> anyhow::Result { method download_file (line 939) | async fn download_file(&self, file_path: &str) -> anyhow::Result Option<(String... method parse_attachment_metadata (line 972) | fn parse_attachment_metadata(message: &serde_json::Value) -> Option... method extract_sender_info (line 1273) | fn extract_sender_info(message: &serde_json::Value) -> (String, Option... method extract_reply_context (line 1294) | fn extract_reply_context(&self, message: &serde_json::Value) -> Option... method parse_update_message (line 1348) | fn parse_update_message(&self, update: &serde_json::Value) -> Option anyhow::Resul... method markdown_to_telegram_html (line 1483) | fn markdown_to_telegram_html(text: &str) -> String { method escape_html (line 1628) | fn escape_html(s: &str) -> String { method send_text_chunks (line 1636) | async fn send_text_chunks( method send_media_by_url (line 1725) | async fn send_media_by_url( method send_attachment (line 1763) | async fn send_attachment( method send_document (line 1851) | pub async fn send_document( method send_document_bytes (line 1895) | pub async fn send_document_bytes( method send_photo (line 1934) | pub async fn send_photo( method send_photo_bytes (line 1978) | pub async fn send_photo_bytes( method send_video (line 2017) | pub async fn send_video( method send_audio (line 2061) | pub async fn send_audio( method send_voice (line 2105) | pub async fn send_voice( method send_document_by_url (line 2149) | pub async fn send_document_by_url( method send_photo_by_url (line 2186) | pub async fn send_photo_by_url( method send_video_by_url (line 2223) | pub async fn send_video_by_url( method send_audio_by_url (line 2235) | pub async fn send_audio_by_url( method send_voice_by_url (line 2247) | pub async fn send_voice_by_url( type EditMessageResult (line 343) | enum EditMessageResult { method name (line 2261) | fn name(&self) -> &str { method supports_draft_updates (line 2265) | fn supports_draft_updates(&self) -> bool { method send_draft (line 2269) | async fn send_draft(&self, message: &SendMessage) -> anyhow::Result anyho... method send (line 2575) | async fn send(&self, message: &SendMessage) -> anyhow::Result<()> { method listen (line 2687) | async fn listen(&self, tx: tokio::sync::mpsc::Sender) ->... method health_check (line 2882) | async fn health_check(&self) -> bool { method start_typing (line 2903) | async fn start_typing(&self, recipient: &str) -> anyhow::Result<()> { method stop_typing (line 2928) | async fn stop_typing(&self, _recipient: &str) -> anyhow::Result<()> { function telegram_channel_name (line 2942) | fn telegram_channel_name() { function random_telegram_ack_reaction_is_from_pool (line 2948) | fn random_telegram_ack_reaction_is_from_pool() { function telegram_ack_reaction_request_shape (line 2956) | fn telegram_ack_reaction_request_shape() { function telegram_extract_update_message_target_parses_ids (line 2965) | fn telegram_extract_update_message_target_parses_ids() { function typing_handle_starts_as_none (line 2979) | fn typing_handle_starts_as_none() { function stop_typing_clears_handle (line 2986) | async fn stop_typing_clears_handle() { function start_typing_replaces_previous_handle (line 3005) | async fn start_typing_replaces_previous_handle() { function supports_draft_updates_respects_stream_mode (line 3024) | fn supports_draft_updates_respects_stream_mode() { function send_draft_returns_none_when_stream_mode_off (line 3035) | async fn send_draft_returns_none_when_stream_mode_off() { function update_draft_rate_limit_short_circuits_network (line 3045) | async fn update_draft_rate_limit_short_circuits_network() { function update_draft_utf8_truncation_is_safe_for_multibyte_text (line 3057) | async fn update_draft_utf8_truncation_is_safe_for_multibyte_text() { function finalize_draft_invalid_message_id_falls_back_to_chunk_send (line 3071) | async fn finalize_draft_invalid_message_id_falls_back_to_chunk_send() { function telegram_api_url (line 3083) | fn telegram_api_url() { function telegram_markdown_to_html_escapes_quotes_in_link_href (line 3092) | fn telegram_markdown_to_html_escapes_quotes_in_link_href() { function telegram_markdown_to_html_escapes_quotes_in_plain_text (line 3103) | fn telegram_markdown_to_html_escapes_quotes_in_plain_text() { function telegram_markdown_to_html_code_block_drops_language_attribute (line 3112) | fn telegram_markdown_to_html_code_block_drops_language_attribute() { function telegram_user_allowed_wildcard (line 3122) | fn telegram_user_allowed_wildcard() { function telegram_user_allowed_specific (line 3128) | fn telegram_user_allowed_specific() { function telegram_user_allowed_with_at_prefix_in_config (line 3135) | fn telegram_user_allowed_with_at_prefix_in_config() { function telegram_user_denied_empty (line 3141) | fn telegram_user_denied_empty() { function telegram_user_exact_match_not_substring (line 3147) | fn telegram_user_exact_match_not_substring() { function telegram_user_empty_string_denied (line 3155) | fn telegram_user_empty_string_denied() { function telegram_user_case_sensitive (line 3161) | fn telegram_user_case_sensitive() { function telegram_wildcard_with_specific_users (line 3169) | fn telegram_wildcard_with_specific_users() { function telegram_user_allowed_by_numeric_id_identity (line 3177) | fn telegram_user_allowed_by_numeric_id_identity() { function telegram_user_denied_when_none_of_identities_match (line 3183) | fn telegram_user_denied_when_none_of_identities_match() { function telegram_pairing_enabled_with_empty_allowlist (line 3189) | fn telegram_pairing_enabled_with_empty_allowlist() { function telegram_pairing_disabled_with_nonempty_allowlist (line 3195) | fn telegram_pairing_disabled_with_nonempty_allowlist() { function telegram_extract_bind_code_plain_command (line 3201) | fn telegram_extract_bind_code_plain_command() { function telegram_extract_bind_code_supports_bot_mention (line 3209) | fn telegram_extract_bind_code_supports_bot_mention() { function telegram_extract_bind_code_rejects_invalid_forms (line 3217) | fn telegram_extract_bind_code_rejects_invalid_forms() { function parse_attachment_markers_extracts_multiple_types (line 3223) | fn parse_attachment_markers_extracts_multiple_types() { function parse_attachment_markers_keeps_invalid_markers_in_text (line 3236) | fn parse_attachment_markers_keeps_invalid_markers_in_text() { function parse_path_only_attachment_detects_existing_file (line 3245) | fn parse_path_only_attachment_detects_existing_file() { function parse_path_only_attachment_rejects_sentence_text (line 3258) | fn parse_path_only_attachment_rejects_sentence_text() { function infer_attachment_kind_from_target_detects_document_extension (line 3263) | fn infer_attachment_kind_from_target_detects_document_extension() { function parse_update_message_uses_chat_id_as_reply_target (line 3271) | fn parse_update_message_uses_chat_id_as_reply_target() { function parse_update_message_allows_numeric_id_without_username (line 3299) | fn parse_update_message_allows_numeric_id_without_username() { function parse_update_message_extracts_thread_id_for_forum_topic (line 3324) | fn parse_update_message_extracts_thread_id_for_forum_topic() { function telegram_api_url_send_document (line 3355) | fn telegram_api_url_send_document() { function telegram_api_url_send_photo (line 3364) | fn telegram_api_url_send_photo() { function telegram_api_url_send_video (line 3373) | fn telegram_api_url_send_video() { function telegram_api_url_send_audio (line 3382) | fn telegram_api_url_send_audio() { function telegram_api_url_send_voice (line 3391) | fn telegram_api_url_send_voice() { function telegram_send_document_bytes_builds_correct_form (line 3402) | async fn telegram_send_document_bytes_builds_correct_form() { function telegram_send_photo_bytes_builds_correct_form (line 3424) | async fn telegram_send_photo_bytes_builds_correct_form() { function telegram_send_document_by_url_builds_correct_json (line 3437) | async fn telegram_send_document_by_url_builds_correct_json() { function telegram_send_photo_by_url_builds_correct_json (line 3453) | async fn telegram_send_photo_by_url_builds_correct_json() { function telegram_send_document_nonexistent_file (line 3466) | async fn telegram_send_document_nonexistent_file() { function telegram_send_photo_nonexistent_file (line 3482) | async fn telegram_send_photo_nonexistent_file() { function telegram_send_video_nonexistent_file (line 3492) | async fn telegram_send_video_nonexistent_file() { function telegram_send_audio_nonexistent_file (line 3502) | async fn telegram_send_audio_nonexistent_file() { function telegram_send_voice_nonexistent_file (line 3512) | async fn telegram_send_voice_nonexistent_file() { function telegram_split_short_message (line 3524) | fn telegram_split_short_message() { function telegram_split_exact_limit (line 3532) | fn telegram_split_exact_limit() { function telegram_split_over_limit (line 3540) | fn telegram_split_over_limit() { function telegram_split_at_word_boundary (line 3549) | fn telegram_split_at_word_boundary() { function telegram_split_at_newline (line 3563) | fn telegram_split_at_newline() { function telegram_split_preserves_content (line 3573) | fn telegram_split_preserves_content() { function telegram_split_empty_message (line 3581) | fn telegram_split_empty_message() { function telegram_split_very_long_message (line 3588) | fn telegram_split_very_long_message() { function telegram_send_document_bytes_with_caption (line 3600) | async fn telegram_send_document_bytes_with_caption() { function telegram_send_photo_bytes_with_caption (line 3624) | async fn telegram_send_photo_bytes_with_caption() { function telegram_send_document_bytes_empty_file (line 3650) | async fn telegram_send_document_bytes_empty_file() { function telegram_send_document_bytes_empty_filename (line 3663) | async fn telegram_send_document_bytes_empty_filename() { function telegram_send_document_bytes_empty_chat_id (line 3676) | async fn telegram_send_document_bytes_empty_chat_id() { function telegram_message_id_format_includes_chat_and_message_id (line 3691) | fn telegram_message_id_format_includes_chat_and_message_id() { function telegram_message_id_is_deterministic (line 3700) | fn telegram_message_id_is_deterministic() { function telegram_message_id_different_message_different_id (line 3710) | fn telegram_message_id_different_message_different_id() { function telegram_message_id_different_chat_different_id (line 3719) | fn telegram_message_id_different_chat_different_id() { function telegram_message_id_no_uuid_randomness (line 3728) | fn telegram_message_id_no_uuid_randomness() { function telegram_message_id_handles_zero_message_id (line 3738) | fn telegram_message_id_handles_zero_message_id() { function strip_tool_call_tags_removes_standard_tags (line 3749) | fn strip_tool_call_tags_removes_standard_tags() { function strip_tool_call_tags_removes_alias_tags (line 3757) | fn strip_tool_call_tags_removes_alias_tags() { function strip_tool_call_tags_removes_dash_tags (line 3764) | fn strip_tool_call_tags_removes_dash_tags() { function strip_tool_call_tags_removes_tool_call_tags (line 3771) | fn strip_tool_call_tags_removes_tool_call_tags() { function strip_tool_call_tags_removes_invoke_tags (line 3778) | fn strip_tool_call_tags_removes_invoke_tags() { function strip_tool_call_tags_handles_multiple_tags (line 3785) | fn strip_tool_call_tags_handles_multiple_tags() { function strip_tool_call_tags_handles_mixed_tags (line 3792) | fn strip_tool_call_tags_handles_mixed_tags() { function strip_tool_call_tags_preserves_normal_text (line 3799) | fn strip_tool_call_tags_preserves_normal_text() { function strip_tool_call_tags_handles_unclosed_tags (line 3806) | fn strip_tool_call_tags_handles_unclosed_tags() { function strip_tool_call_tags_handles_unclosed_tool_call_with_json (line 3813) | fn strip_tool_call_tags_handles_unclosed_tool_call_with_json() { function strip_tool_call_tags_handles_mismatched_close_tag (line 3821) | fn strip_tool_call_tags_handles_mismatched_close_tag() { function strip_tool_call_tags_cleans_extra_newlines (line 3829) | fn strip_tool_call_tags_cleans_extra_newlines() { function strip_tool_call_tags_handles_empty_input (line 3836) | fn strip_tool_call_tags_handles_empty_input() { function strip_tool_call_tags_handles_only_tags (line 3843) | fn strip_tool_call_tags_handles_only_tags() { function telegram_contains_bot_mention_finds_mention (line 3850) | fn telegram_contains_bot_mention_finds_mention() { function telegram_contains_bot_mention_no_false_positives (line 3870) | fn telegram_contains_bot_mention_no_false_positives() { function telegram_normalize_incoming_content_strips_mention (line 3887) | fn telegram_normalize_incoming_content_strips_mention() { function telegram_normalize_incoming_content_handles_multiple_mentions (line 3893) | fn telegram_normalize_incoming_content_handles_multiple_mentions() { function telegram_normalize_incoming_content_returns_none_for_empty (line 3899) | fn telegram_normalize_incoming_content_returns_none_for_empty() { function parse_update_message_mention_only_group_requires_exact_mention (line 3905) | fn parse_update_message_mention_only_group_requires_exact_mention() { function parse_update_message_mention_only_group_strips_mention_and_drops_empty (line 3932) | fn parse_update_message_mention_only_group_strips_mention_and_drops_empt... function telegram_is_group_message_detects_groups (line 3980) | fn telegram_is_group_message_detects_groups() { function telegram_mention_only_enabled_by_config (line 3998) | fn telegram_mention_only_enabled_by_config() { function telegram_split_code_block_at_boundary (line 4012) | fn telegram_split_code_block_at_boundary() { function telegram_split_single_long_word (line 4032) | fn telegram_split_single_long_word() { function telegram_split_exactly_at_limit_no_split (line 4048) | fn telegram_split_exactly_at_limit_no_split() { function telegram_split_one_over_limit (line 4055) | fn telegram_split_one_over_limit() { function telegram_split_many_short_lines (line 4062) | fn telegram_split_many_short_lines() { function telegram_split_only_whitespace (line 4077) | fn telegram_split_only_whitespace() { function telegram_split_emoji_at_boundary (line 4084) | fn telegram_split_emoji_at_boundary() { function telegram_split_consecutive_newlines (line 4098) | fn telegram_split_consecutive_newlines() { function parse_voice_metadata_extracts_voice (line 4109) | fn parse_voice_metadata_extracts_voice() { function parse_voice_metadata_extracts_audio (line 4122) | fn parse_voice_metadata_extracts_audio() { function parse_voice_metadata_returns_none_for_text (line 4135) | fn parse_voice_metadata_returns_none_for_text() { function parse_voice_metadata_defaults_duration_to_zero (line 4143) | fn parse_voice_metadata_defaults_duration_to_zero() { function extract_sender_info_with_username (line 4158) | fn extract_sender_info_with_username() { function extract_sender_info_without_username (line 4169) | fn extract_sender_info_without_username() { function extract_reply_context_text_message (line 4184) | fn extract_reply_context_text_message() { function extract_reply_context_voice_message (line 4197) | fn extract_reply_context_voice_message() { function extract_reply_context_no_reply (line 4210) | fn extract_reply_context_no_reply() { function extract_reply_context_no_username_uses_first_name (line 4219) | fn extract_reply_context_no_username_uses_first_name() { function extract_reply_context_voice_with_cached_transcription (line 4232) | fn extract_reply_context_voice_with_cached_transcription() { function parse_update_message_includes_reply_context (line 4251) | fn parse_update_message_includes_reply_context() { function with_transcription_sets_config_when_enabled (line 4282) | fn with_transcription_sets_config_when_enabled() { function with_transcription_skips_when_disabled (line 4292) | fn with_transcription_skips_when_disabled() { function try_parse_voice_message_returns_none_when_transcription_disabled (line 4300) | async fn try_parse_voice_message_returns_none_when_transcription_disable... function try_parse_voice_message_skips_when_duration_exceeds_limit (line 4316) | async fn try_parse_voice_message_skips_when_duration_exceeds_limit() { function try_parse_voice_message_rejects_unauthorized_sender_before_download (line 4337) | async fn try_parse_voice_message_rejects_unauthorized_sender_before_down... function e2e_live_voice_transcription_and_reply_cache (line 4373) | async fn e2e_live_voice_transcription_and_reply_cache() { function parse_attachment_metadata_detects_document (line 4445) | fn parse_attachment_metadata_detects_document() { function parse_attachment_metadata_detects_photo (line 4462) | fn parse_attachment_metadata_detects_photo() { function parse_attachment_metadata_extracts_caption (line 4478) | fn parse_attachment_metadata_extracts_caption() { function parse_attachment_metadata_document_without_optional_fields (line 4502) | fn parse_attachment_metadata_document_without_optional_fields() { function parse_attachment_metadata_returns_none_for_text (line 4517) | fn parse_attachment_metadata_returns_none_for_text() { function parse_attachment_metadata_returns_none_for_voice (line 4525) | fn parse_attachment_metadata_returns_none_for_voice() { function parse_attachment_metadata_empty_photo_array (line 4536) | fn parse_attachment_metadata_empty_photo_array() { function with_workspace_dir_sets_field (line 4544) | fn with_workspace_dir_sets_field() { function telegram_max_file_download_bytes_is_20mb (line 4554) | fn telegram_max_file_download_bytes_is_20mb() { function attachment_photo_content_uses_image_marker (line 4563) | fn attachment_photo_content_uses_image_marker() { function attachment_document_content_uses_document_label (line 4577) | fn attachment_document_content_uses_document_label() { function markdown_file_never_produces_image_marker (line 4590) | fn markdown_file_never_produces_image_marker() { function non_image_photo_falls_back_to_document_format (line 4614) | fn non_image_photo_falls_back_to_document_format() { function image_extensions_produce_image_marker (line 4639) | fn image_extensions_produce_image_marker() { function markdown_attachment_not_detected_by_multimodal_image_markers (line 4655) | fn markdown_attachment_not_detected_by_multimodal_image_markers() { function is_image_extension_recognizes_images (line 4671) | fn is_image_extension_recognizes_images() { function photo_image_marker_detected_by_multimodal (line 4690) | fn photo_image_marker_detected_by_multimodal() { function photo_image_marker_with_caption (line 4704) | fn photo_image_marker_with_caption() { function e2e_attachment_saves_file_and_formats_content (line 4726) | fn e2e_attachment_saves_file_and_formats_content() { function groq_provider_rejects_photo_with_vision_error (line 4817) | fn groq_provider_rejects_photo_with_vision_error() { function ack_reactions_defaults_to_true (line 4847) | fn ack_reactions_defaults_to_true() { function with_ack_reactions_false_disables_reactions (line 4853) | fn with_ack_reactions_false_disables_reactions() { function with_ack_reactions_true_keeps_reactions (line 4860) | fn with_ack_reactions_true_keeps_reactions() { FILE: src/channels/traits.rs type ChannelMessage (line 5) | pub struct ChannelMessage { type SendMessage (line 24) | pub struct SendMessage { method new (line 34) | pub fn new(content: impl Into, recipient: impl Into) -... method with_subject (line 44) | pub fn with_subject( method in_thread (line 58) | pub fn in_thread(mut self, thread_ts: Option) -> Self { type Channel (line 66) | pub trait Channel: Send + Sync { method name (line 68) | fn name(&self) -> &str; method send (line 71) | async fn send(&self, message: &SendMessage) -> anyhow::Result<()>; method listen (line 74) | async fn listen(&self, tx: tokio::sync::mpsc::Sender) ... method health_check (line 77) | async fn health_check(&self) -> bool { method start_typing (line 83) | async fn start_typing(&self, _recipient: &str) -> anyhow::Result<()> { method stop_typing (line 88) | async fn stop_typing(&self, _recipient: &str) -> anyhow::Result<()> { method supports_draft_updates (line 93) | fn supports_draft_updates(&self) -> bool { method send_draft (line 98) | async fn send_draft(&self, _message: &SendMessage) -> anyhow::Result a... method add_reaction (line 132) | async fn add_reaction( method remove_reaction (line 142) | async fn remove_reaction( method pin_message (line 152) | async fn pin_message(&self, _channel_id: &str, _message_id: &str) -> a... method unpin_message (line 157) | async fn unpin_message(&self, _channel_id: &str, _message_id: &str) ->... method name (line 170) | fn name(&self) -> &str { method send (line 174) | async fn send(&self, _message: &SendMessage) -> anyhow::Result<()> { method listen (line 178) | async fn listen( type DummyChannel (line 166) | struct DummyChannel; function channel_message_clone_preserves_fields (line 198) | fn channel_message_clone_preserves_fields() { function default_trait_methods_return_success (line 220) | async fn default_trait_methods_return_success() { function default_reaction_methods_return_success (line 233) | async fn default_reaction_methods_return_success() { function default_draft_methods_return_success (line 247) | async fn default_draft_methods_return_success() { function listen_sends_message_to_channel (line 265) | async fn listen_sends_message_to_channel() { FILE: src/channels/transcription.rs constant MAX_AUDIO_BYTES (line 10) | const MAX_AUDIO_BYTES: usize = 25 * 1024 * 1024; constant TRANSCRIPTION_TIMEOUT_SECS (line 13) | const TRANSCRIPTION_TIMEOUT_SECS: u64 = 120; function mime_for_audio (line 18) | fn mime_for_audio(extension: &str) -> Option<&'static str> { function normalize_audio_filename (line 35) | fn normalize_audio_filename(file_name: &str) -> String { function resolve_transcription_api_key (line 50) | fn resolve_transcription_api_key(config: &TranscriptionConfig) -> Result... function validate_audio (line 86) | fn validate_audio(audio_data: &[u8], file_name: &str) -> Result<(String,... type TranscriptionProvider (line 112) | pub trait TranscriptionProvider: Send + Sync { method name (line 114) | fn name(&self) -> &str; method transcribe (line 118) | async fn transcribe(&self, audio_data: &[u8], file_name: &str) -> Resu... method supported_formats (line 121) | fn supported_formats(&self) -> Vec { method name (line 175) | fn name(&self) -> &str { method transcribe (line 179) | async fn transcribe(&self, audio_data: &[u8], file_name: &str) -> Resu... method name (line 237) | fn name(&self) -> &str { method transcribe (line 241) | async fn transcribe(&self, audio_data: &[u8], file_name: &str) -> Resu... method name (line 295) | fn name(&self) -> &str { method transcribe (line 299) | async fn transcribe(&self, audio_data: &[u8], file_name: &str) -> Resu... method name (line 365) | fn name(&self) -> &str { method transcribe (line 369) | async fn transcribe(&self, audio_data: &[u8], file_name: &str) -> Resu... method name (line 511) | fn name(&self) -> &str { method supported_formats (line 515) | fn supported_formats(&self) -> Vec { method transcribe (line 523) | async fn transcribe(&self, audio_data: &[u8], file_name: &str) -> Resu... type GroqProvider (line 134) | pub struct GroqProvider { method from_config (line 147) | pub fn from_config(config: &TranscriptionConfig) -> Result { type OpenAiWhisperProvider (line 213) | pub struct OpenAiWhisperProvider { method from_config (line 219) | pub fn from_config(config: &crate::config::OpenAiSttConfig) -> Result<... type DeepgramProvider (line 271) | pub struct DeepgramProvider { method from_config (line 277) | pub fn from_config(config: &crate::config::DeepgramSttConfig) -> Resul... type AssemblyAiProvider (line 345) | pub struct AssemblyAiProvider { method from_config (line 350) | pub fn from_config(config: &crate::config::AssemblyAiSttConfig) -> Res... type GoogleSttProvider (line 487) | pub struct GoogleSttProvider { method from_config (line 493) | pub fn from_config(config: &crate::config::GoogleSttConfig) -> Result<... function parse_whisper_response (line 592) | async fn parse_whisper_response(resp: reqwest::Response) -> Result Result { method transcribe (line 677) | pub async fn transcribe(&self, audio_data: &[u8], file_name: &str) -> ... method transcribe_with_provider (line 683) | pub async fn transcribe_with_provider( method available_providers (line 700) | pub fn available_providers(&self) -> Vec<&str> { function transcribe_audio (line 721) | pub async fn transcribe_audio( function rejects_oversized_audio (line 739) | async fn rejects_oversized_audio() { function rejects_missing_api_key (line 753) | async fn rejects_missing_api_key() { function uses_config_api_key_without_groq_env (line 772) | async fn uses_config_api_key_without_groq_env() { function mime_for_audio_maps_accepted_formats (line 790) | fn mime_for_audio_maps_accepted_formats() { function mime_for_audio_case_insensitive (line 814) | fn mime_for_audio_case_insensitive() { function mime_for_audio_rejects_unknown (line 821) | fn mime_for_audio_rejects_unknown() { function normalize_audio_filename_rewrites_oga (line 829) | fn normalize_audio_filename_rewrites_oga() { function normalize_audio_filename_preserves_accepted (line 835) | fn normalize_audio_filename_preserves_accepted() { function normalize_audio_filename_no_extension (line 842) | fn normalize_audio_filename_no_extension() { function rejects_unsupported_audio_format (line 847) | async fn rejects_unsupported_audio_format() { function manager_creation_with_default_config (line 868) | fn manager_creation_with_default_config() { function manager_registers_groq_with_key (line 879) | fn manager_registers_groq_with_key() { function manager_registers_multiple_providers (line 891) | fn manager_registers_multiple_providers() { function manager_rejects_unconfigured_provider (line 913) | async fn manager_rejects_unconfigured_provider() { function manager_default_provider_from_config (line 931) | fn manager_default_provider_from_config() { function validate_audio_rejects_oversized (line 946) | fn validate_audio_rejects_oversized() { function validate_audio_rejects_unsupported_format (line 953) | fn validate_audio_rejects_unsupported_format() { function validate_audio_accepts_supported_format (line 960) | fn validate_audio_accepts_supported_format() { function validate_audio_normalizes_oga (line 968) | fn validate_audio_normalizes_oga() { function backward_compat_config_defaults_unchanged (line 976) | fn backward_compat_config_defaults_unchanged() { FILE: src/channels/tts.rs constant DEFAULT_MAX_TEXT_LENGTH (line 13) | const DEFAULT_MAX_TEXT_LENGTH: usize = 4096; constant TTS_HTTP_TIMEOUT (line 16) | const TTS_HTTP_TIMEOUT: std::time::Duration = std::time::Duration::from_... type TtsProvider (line 22) | pub trait TtsProvider: Send + Sync { method name (line 24) | fn name(&self) -> &str; method synthesize (line 27) | async fn synthesize(&self, text: &str, voice: &str) -> Result>; method supported_voices (line 30) | fn supported_voices(&self) -> Vec; method supported_formats (line 33) | fn supported_formats(&self) -> Vec; method name (line 78) | fn name(&self) -> &str { method synthesize (line 82) | async fn synthesize(&self, text: &str, voice: &str) -> Result> { method supported_voices (line 119) | fn supported_voices(&self) -> Vec { method supported_formats (line 126) | fn supported_formats(&self) -> Vec { method name (line 180) | fn name(&self) -> &str { method synthesize (line 184) | async fn synthesize(&self, text: &str, voice: &str) -> Result> { method supported_voices (line 230) | fn supported_voices(&self) -> Vec { method supported_formats (line 235) | fn supported_formats(&self) -> Vec { method name (line 285) | fn name(&self) -> &str { method synthesize (line 289) | async fn synthesize(&self, text: &str, voice: &str) -> Result> { method supported_voices (line 335) | fn supported_voices(&self) -> Vec { method supported_formats (line 348) | fn supported_formats(&self) -> Vec { method name (line 393) | fn name(&self) -> &str { method synthesize (line 397) | async fn synthesize(&self, text: &str, voice: &str) -> Result> { method supported_voices (line 436) | fn supported_voices(&self) -> Vec { method supported_formats (line 449) | fn supported_formats(&self) -> Vec { type OpenAiTtsProvider (line 39) | pub struct OpenAiTtsProvider { method new (line 49) | pub fn new(config: &crate::config::OpenAiTtsConfig) -> Result { type ElevenLabsTtsProvider (line 137) | pub struct ElevenLabsTtsProvider { method new (line 148) | pub fn new(config: &crate::config::ElevenLabsTtsConfig) -> Result { type GoogleTtsProvider (line 246) | pub struct GoogleTtsProvider { method new (line 255) | pub fn new(config: &crate::config::GoogleTtsConfig) -> Result { type EdgeTtsProvider (line 359) | pub struct EdgeTtsProvider { constant ALLOWED_BINARIES (line 365) | const ALLOWED_BINARIES: &[&str] = &["edge-tts", "edge-playback"]; method new (line 372) | pub fn new(config: &crate::config::EdgeTtsConfig) -> Result { type TtsManager (line 457) | pub struct TtsManager { method new (line 466) | pub fn new(config: &TtsConfig) -> Result { method synthesize (line 528) | pub async fn synthesize(&self, text: &str) -> Result> { method synthesize_with_provider (line 534) | pub async fn synthesize_with_provider( method available_providers (line 564) | pub fn available_providers(&self) -> Vec { function default_tts_config (line 577) | fn default_tts_config() -> TtsConfig { function tts_manager_creation_with_defaults (line 582) | fn tts_manager_creation_with_defaults() { function tts_manager_with_edge_provider (line 590) | fn tts_manager_with_edge_provider() { function tts_rejects_empty_text (line 602) | async fn tts_rejects_empty_text() { function tts_rejects_text_exceeding_max_length (line 621) | async fn tts_rejects_text_exceeding_max_length() { function tts_rejects_unknown_provider (line 642) | async fn tts_rejects_unknown_provider() { function tts_config_defaults (line 656) | fn tts_config_defaults() { function tts_manager_max_text_length_zero_uses_default (line 670) | fn tts_manager_max_text_length_zero_uses_default() { FILE: src/channels/twitter.rs constant TWITTER_API_BASE (line 9) | const TWITTER_API_BASE: &str = "https://api.x.com/2"; type TwitterChannel (line 13) | pub struct TwitterChannel { method new (line 24) | pub fn new(bearer_token: String, allowed_users: Vec) -> Self { method http_client (line 32) | fn http_client(&self) -> reqwest::Client { method is_user_allowed (line 36) | fn is_user_allowed(&self, user_id: &str) -> bool { method is_duplicate (line 41) | async fn is_duplicate(&self, tweet_id: &str) -> bool { method get_authenticated_user_id (line 64) | async fn get_authenticated_user_id(&self) -> anyhow::Result { method create_tweet (line 90) | async fn create_tweet( method send_dm (line 127) | async fn send_dm(&self, recipient_id: &str, text: &str) -> anyhow::Res... constant DEDUP_CAPACITY (line 21) | const DEDUP_CAPACITY: usize = 10_000; method name (line 154) | fn name(&self) -> &str { method send (line 158) | async fn send(&self, message: &SendMessage) -> anyhow::Result<()> { method listen (line 182) | async fn listen(&self, tx: tokio::sync::mpsc::Sender) ->... method health_check (line 335) | async fn health_check(&self) -> bool { function strip_at_mention (line 341) | fn strip_at_mention(text: &str, _bot_user_id: &str) -> String { function split_tweet_text (line 355) | fn split_tweet_text(text: &str, max_len: usize) -> Vec { function test_name (line 384) | fn test_name() { function test_user_allowed_wildcard (line 390) | fn test_user_allowed_wildcard() { function test_user_allowed_specific (line 396) | fn test_user_allowed_specific() { function test_user_denied_empty (line 403) | fn test_user_denied_empty() { function test_dedup (line 409) | async fn test_dedup() { function test_dedup_empty_id (line 417) | async fn test_dedup_empty_id() { function test_strip_at_mention_single (line 424) | fn test_strip_at_mention_single() { function test_strip_at_mention_multiple (line 429) | fn test_strip_at_mention_multiple() { function test_strip_at_mention_only (line 434) | fn test_strip_at_mention_only() { function test_strip_at_mention_no_mention (line 439) | fn test_strip_at_mention_no_mention() { function test_split_tweet_text_short (line 444) | fn test_split_tweet_text_short() { function test_split_tweet_text_long (line 450) | fn test_split_tweet_text_long() { function test_split_tweet_text_no_spaces (line 460) | fn test_split_tweet_text_no_spaces() { function test_config_serde (line 468) | fn test_config_serde() { function test_config_serde_defaults (line 479) | fn test_config_serde_defaults() { FILE: src/channels/wati.rs type WatiChannel (line 11) | pub struct WatiChannel { method new (line 20) | pub fn new( method is_number_allowed (line 36) | fn is_number_allowed(&self, phone: &str) -> bool { method build_target (line 41) | fn build_target(&self, phone: &str) -> String { method parse_webhook_payload (line 59) | pub fn parse_webhook_payload(&self, payload: &serde_json::Value) -> Ve... method name (line 175) | fn name(&self) -> &str { method send (line 179) | async fn send(&self, message: &SendMessage) -> anyhow::Result<()> { method listen (line 208) | async fn listen(&self, _tx: tokio::sync::mpsc::Sender) -... method health_check (line 222) | async fn health_check(&self) -> bool { method start_typing (line 234) | async fn start_typing(&self, _recipient: &str) -> anyhow::Result<()> { method stop_typing (line 239) | async fn stop_typing(&self, _recipient: &str) -> anyhow::Result<()> { function make_channel (line 249) | fn make_channel() -> WatiChannel { function make_wildcard_channel (line 259) | fn make_wildcard_channel() -> WatiChannel { function wati_channel_name (line 270) | fn wati_channel_name() { function wati_number_allowed_exact (line 276) | fn wati_number_allowed_exact() { function wati_number_allowed_wildcard (line 283) | fn wati_number_allowed_wildcard() { function wati_number_allowed_empty (line 290) | fn wati_number_allowed_empty() { function wati_build_target_with_tenant (line 302) | fn wati_build_target_with_tenant() { function wati_build_target_without_tenant (line 314) | fn wati_build_target_without_tenant() { function wati_build_target_already_prefixed (line 320) | fn wati_build_target_already_prefixed() { function wati_parse_valid_message (line 333) | fn wati_parse_valid_message() { function wati_parse_skip_from_me (line 352) | fn wati_parse_skip_from_me() { function wati_parse_skip_no_text (line 365) | fn wati_parse_skip_no_text() { function wati_parse_alternative_field_names (line 377) | fn wati_parse_alternative_field_names() { function wati_parse_timestamp_seconds (line 395) | fn wati_parse_timestamp_seconds() { function wati_parse_timestamp_milliseconds (line 408) | fn wati_parse_timestamp_milliseconds() { function wati_parse_timestamp_iso (line 421) | fn wati_parse_timestamp_iso() { function wati_parse_normalizes_phone (line 434) | fn wati_parse_normalizes_phone() { function wati_parse_empty_payload (line 456) | fn wati_parse_empty_payload() { function wati_parse_from_field_fallback (line 464) | fn wati_parse_from_field_fallback() { function wati_parse_message_text_fallback (line 479) | fn wati_parse_message_text_fallback() { function wati_parse_owner_field_as_from_me (line 494) | fn wati_parse_owner_field_as_from_me() { FILE: src/channels/webhook.rs type WebhookChannel (line 9) | pub struct WebhookChannel { method new (line 38) | pub fn new( method http_client (line 66) | fn http_client(&self) -> reqwest::Client { method verify_signature (line 71) | fn verify_signature(&self, body: &[u8], signature: Option<&str>) -> bo... type IncomingWebhook (line 20) | struct IncomingWebhook { type OutgoingWebhook (line 29) | struct OutgoingWebhook { method name (line 102) | fn name(&self) -> &str { method send (line 106) | async fn send(&self, message: &SendMessage) -> Result<()> { method listen (line 146) | async fn listen(&self, tx: tokio::sync::mpsc::Sender) ->... method health_check (line 269) | async fn health_check(&self) -> bool { function make_channel (line 280) | fn make_channel() -> WebhookChannel { function make_channel_with_secret (line 291) | fn make_channel_with_secret() -> WebhookChannel { function default_path (line 303) | fn default_path() { function path_normalized (line 309) | fn path_normalized() { function send_method_default (line 315) | fn send_method_default() { function send_method_put (line 321) | fn send_method_put() { function incoming_payload_deserializes_all_fields (line 334) | fn incoming_payload_deserializes_all_fields() { function incoming_payload_without_thread (line 343) | fn incoming_payload_without_thread() { function outgoing_payload_serializes_content (line 352) | fn outgoing_payload_serializes_content() { function outgoing_payload_omits_none_fields (line 365) | fn outgoing_payload_omits_none_fields() { function verify_signature_no_secret (line 378) | fn verify_signature_no_secret() { function verify_signature_missing_header (line 384) | fn verify_signature_missing_header() { function verify_signature_valid (line 390) | fn verify_signature_valid() { function verify_signature_invalid (line 406) | fn verify_signature_invalid() { FILE: src/channels/wecom.rs type WeComChannel (line 8) | pub struct WeComChannel { method new (line 14) | pub fn new(webhook_key: String, allowed_users: Vec) -> Self { method http_client (line 21) | fn http_client(&self) -> reqwest::Client { method webhook_url (line 25) | fn webhook_url(&self) -> String { method is_user_allowed (line 32) | fn is_user_allowed(&self, user_id: &str) -> bool { method name (line 39) | fn name(&self) -> &str { method send (line 43) | async fn send(&self, message: &SendMessage) -> anyhow::Result<()> { method listen (line 78) | async fn listen(&self, tx: tokio::sync::mpsc::Sender) ->... method health_check (line 89) | async fn health_check(&self) -> bool { function test_name (line 115) | fn test_name() { function test_webhook_url (line 121) | fn test_webhook_url() { function test_user_allowed_wildcard (line 130) | fn test_user_allowed_wildcard() { function test_user_allowed_specific (line 136) | fn test_user_allowed_specific() { function test_user_denied_empty (line 143) | fn test_user_denied_empty() { function test_config_serde (line 149) | fn test_config_serde() { function test_config_serde_defaults (line 160) | fn test_config_serde_defaults() { FILE: src/channels/whatsapp.rs function ensure_https (line 11) | fn ensure_https(url: &str) -> anyhow::Result<()> { type WhatsAppChannel (line 25) | pub struct WhatsAppChannel { method new (line 33) | pub fn new( method http_client (line 47) | fn http_client(&self) -> reqwest::Client { method is_number_allowed (line 52) | fn is_number_allowed(&self, phone: &str) -> bool { method verify_token (line 57) | pub fn verify_token(&self) -> &str { method parse_webhook_payload (line 62) | pub fn parse_webhook_payload(&self, payload: &serde_json::Value) -> Ve... method name (line 157) | fn name(&self) -> &str { method send (line 161) | async fn send(&self, message: &SendMessage) -> anyhow::Result<()> { method listen (line 206) | async fn listen(&self, _tx: tokio::sync::mpsc::Sender) -... method health_check (line 221) | async fn health_check(&self) -> bool { function make_channel (line 243) | fn make_channel() -> WhatsAppChannel { function whatsapp_channel_name (line 253) | fn whatsapp_channel_name() { function whatsapp_verify_token (line 259) | fn whatsapp_verify_token() { function whatsapp_number_allowed_exact (line 265) | fn whatsapp_number_allowed_exact() { function whatsapp_number_allowed_wildcard (line 272) | fn whatsapp_number_allowed_wildcard() { function whatsapp_number_denied_empty (line 279) | fn whatsapp_number_denied_empty() { function whatsapp_parse_empty_payload (line 285) | fn whatsapp_parse_empty_payload() { function whatsapp_parse_valid_text_message (line 293) | fn whatsapp_parse_valid_text_message() { function whatsapp_parse_unauthorized_number (line 330) | fn whatsapp_parse_unauthorized_number() { function whatsapp_parse_non_text_message_skipped (line 353) | fn whatsapp_parse_non_text_message_skipped() { function whatsapp_parse_multiple_messages (line 375) | fn whatsapp_parse_multiple_messages() { function whatsapp_parse_normalizes_phone_with_plus (line 397) | fn whatsapp_parse_normalizes_phone_with_plus() { function whatsapp_empty_text_skipped (line 426) | fn whatsapp_empty_text_skipped() { function whatsapp_parse_missing_entry_array (line 452) | fn whatsapp_parse_missing_entry_array() { function whatsapp_parse_entry_not_array (line 462) | fn whatsapp_parse_entry_not_array() { function whatsapp_parse_missing_changes_array (line 472) | fn whatsapp_parse_missing_changes_array() { function whatsapp_parse_changes_not_array (line 482) | fn whatsapp_parse_changes_not_array() { function whatsapp_parse_missing_value (line 494) | fn whatsapp_parse_missing_value() { function whatsapp_parse_missing_messages_array (line 506) | fn whatsapp_parse_missing_messages_array() { function whatsapp_parse_messages_not_array (line 522) | fn whatsapp_parse_messages_not_array() { function whatsapp_parse_missing_from_field (line 538) | fn whatsapp_parse_missing_from_field() { function whatsapp_parse_missing_text_body (line 558) | fn whatsapp_parse_missing_text_body() { function whatsapp_parse_null_text_body (line 582) | fn whatsapp_parse_null_text_body() { function whatsapp_parse_invalid_timestamp_uses_current (line 603) | fn whatsapp_parse_invalid_timestamp_uses_current() { function whatsapp_parse_missing_timestamp_uses_current (line 626) | fn whatsapp_parse_missing_timestamp_uses_current() { function whatsapp_parse_multiple_entries (line 647) | fn whatsapp_parse_multiple_entries() { function whatsapp_parse_multiple_changes (line 684) | fn whatsapp_parse_multiple_changes() { function whatsapp_parse_status_update_ignored (line 719) | fn whatsapp_parse_status_update_ignored() { function whatsapp_parse_audio_message_skipped (line 740) | fn whatsapp_parse_audio_message_skipped() { function whatsapp_parse_video_message_skipped (line 761) | fn whatsapp_parse_video_message_skipped() { function whatsapp_parse_document_message_skipped (line 782) | fn whatsapp_parse_document_message_skipped() { function whatsapp_parse_sticker_message_skipped (line 803) | fn whatsapp_parse_sticker_message_skipped() { function whatsapp_parse_location_message_skipped (line 824) | fn whatsapp_parse_location_message_skipped() { function whatsapp_parse_contacts_message_skipped (line 845) | fn whatsapp_parse_contacts_message_skipped() { function whatsapp_parse_reaction_message_skipped (line 866) | fn whatsapp_parse_reaction_message_skipped() { function whatsapp_parse_mixed_authorized_unauthorized (line 887) | fn whatsapp_parse_mixed_authorized_unauthorized() { function whatsapp_parse_unicode_message (line 914) | fn whatsapp_parse_unicode_message() { function whatsapp_parse_very_long_message (line 936) | fn whatsapp_parse_very_long_message() { function whatsapp_parse_whitespace_only_message_skipped (line 959) | fn whatsapp_parse_whitespace_only_message_skipped() { function whatsapp_number_allowed_multiple_numbers (line 982) | fn whatsapp_number_allowed_multiple_numbers() { function whatsapp_number_allowed_case_sensitive (line 1000) | fn whatsapp_number_allowed_case_sensitive() { function whatsapp_parse_phone_already_has_plus (line 1014) | fn whatsapp_parse_phone_already_has_plus() { function whatsapp_channel_fields_stored_correctly (line 1042) | fn whatsapp_channel_fields_stored_correctly() { function whatsapp_parse_empty_messages_array (line 1056) | fn whatsapp_parse_empty_messages_array() { function whatsapp_parse_empty_entry_array (line 1072) | fn whatsapp_parse_empty_entry_array() { function whatsapp_parse_empty_changes_array (line 1082) | fn whatsapp_parse_empty_changes_array() { function whatsapp_parse_newlines_preserved (line 1094) | fn whatsapp_parse_newlines_preserved() { function whatsapp_parse_special_characters (line 1116) | fn whatsapp_parse_special_characters() { FILE: src/channels/whatsapp_storage.rs type RusqliteStore (line 48) | pub struct RusqliteStore { method new (line 79) | pub fn new>(db_path: P) -> anyhow::Result { method init_schema (line 107) | fn init_schema(&self) -> anyhow::Result<()> { method put_identity (line 269) | async fn put_identity( method load_identity (line 282) | async fn load_identity( method delete_identity (line 302) | async fn delete_identity(&self, address: &str) -> wa_rs_core::store::err... method get_session (line 312) | async fn get_session( method put_session (line 332) | async fn put_session( method delete_session (line 345) | async fn delete_session(&self, address: &str) -> wa_rs_core::store::erro... method store_prekey (line 355) | async fn store_prekey( method load_prekey (line 369) | async fn load_prekey(&self, id: u32) -> wa_rs_core::store::error::Result... method remove_prekey (line 386) | async fn remove_prekey(&self, id: u32) -> wa_rs_core::store::error::Resu... method store_signed_prekey (line 396) | async fn store_signed_prekey( method load_signed_prekey (line 409) | async fn load_signed_prekey( method load_all_signed_prekeys (line 429) | async fn load_all_signed_prekeys( method remove_signed_prekey (line 449) | async fn remove_signed_prekey(&self, id: u32) -> wa_rs_core::store::erro... method put_sender_key (line 459) | async fn put_sender_key( method get_sender_key (line 472) | async fn get_sender_key( method delete_sender_key (line 492) | async fn delete_sender_key(&self, address: &str) -> wa_rs_core::store::e... method get_sync_key (line 504) | async fn get_sync_key( method set_sync_key (line 528) | async fn set_sync_key( method get_version (line 543) | async fn get_version(&self, name: &str) -> wa_rs_core::store::error::Res... method set_version (line 554) | async fn set_version( method put_mutation_macs (line 569) | async fn put_mutation_macs( method get_mutation_mac (line 592) | async fn get_mutation_mac( method delete_mutation_macs (line 616) | async fn delete_mutation_macs( method get_skdm_recipients (line 642) | async fn get_skdm_recipients( method add_skdm_recipients (line 666) | async fn add_skdm_recipients( method clear_skdm_recipients (line 685) | async fn clear_skdm_recipients(&self, group_jid: &str) -> wa_rs_core::st... method get_lid_mapping (line 695) | async fn get_lid_mapping( method get_pn_mapping (line 724) | async fn get_pn_mapping( method put_lid_mapping (line 754) | async fn put_lid_mapping( method get_all_lid_mappings (line 774) | async fn get_all_lid_mappings( method save_base_key (line 803) | async fn save_base_key( method has_same_base_key (line 819) | async fn has_same_base_key( method delete_base_key (line 845) | async fn delete_base_key( method update_device_list (line 859) | async fn update_device_list( method get_devices (line 882) | async fn get_devices( method mark_forget_sender_key (line 922) | async fn mark_forget_sender_key( method consume_forget_marks (line 937) | async fn consume_forget_marks( method get_tc_token (line 967) | async fn get_tc_token( method put_tc_token (line 994) | async fn put_tc_token( method delete_tc_token (line 1017) | async fn delete_tc_token(&self, jid: &str) -> wa_rs_core::store::error::... method get_all_tc_token_jids (line 1025) | async fn get_all_tc_token_jids(&self) -> wa_rs_core::store::error::Resul... method delete_expired_tc_tokens (line 1042) | async fn delete_expired_tc_tokens( method save (line 1067) | async fn save(&self, device: &CoreDevice) -> wa_rs_core::store::error::R... method load (line 1130) | async fn load(&self) -> wa_rs_core::store::error::Result wa_rs_core::store::error::Result { method create (line 1239) | async fn create(&self) -> wa_rs_core::store::error::Result { method snapshot_db (line 1244) | async fn snapshot_db( function rusqlite_store_creates_database (line 1272) | fn rusqlite_store_creates_database() { function lid_mapping_round_trip_preserves_learning_source_and_updated_at (line 1280) | async fn lid_mapping_round_trip_preserves_learning_source_and_updated_at... function delete_expired_tc_tokens_returns_deleted_row_count (line 1312) | async fn delete_expired_tc_tokens_returns_deleted_row_count() { FILE: src/channels/whatsapp_web.rs type WhatsAppWebChannel (line 52) | pub struct WhatsAppWebChannel { method new (line 90) | pub fn new( method with_transcription (line 113) | pub fn with_transcription(mut self, config: crate::config::Transcripti... method with_tts (line 122) | pub fn with_tts(mut self, config: crate::config::TtsConfig) -> Self { method is_number_allowed (line 131) | fn is_number_allowed(&self, phone: &str) -> bool { method is_number_allowed_for_list (line 137) | fn is_number_allowed_for_list(allowed_numbers: &[String], phone: &str)... method normalize_phone_token (line 157) | fn normalize_phone_token(value: &str) -> Option { method sender_phone_candidates (line 179) | fn sender_phone_candidates( method normalize_phone (line 207) | fn normalize_phone(&self, phone: &str) -> String { method is_jid (line 223) | fn is_jid(recipient: &str) -> bool { method render_pairing_qr (line 229) | fn render_pairing_qr(code: &str) -> Result { method recipient_to_jid (line 250) | fn recipient_to_jid(&self, recipient: &str) -> Result u64 { method should_purge_session (line 288) | fn should_purge_session(session_revoked: &std::sync::atomic::AtomicBoo... method record_retry (line 293) | fn record_retry(retry_count: &std::sync::atomic::AtomicU32) -> (u32, b... method reset_retry (line 299) | fn reset_retry(retry_count: &std::sync::atomic::AtomicU32) { method session_file_paths (line 304) | fn session_file_paths(expanded_session_path: &str) -> [String; 3] { method try_transcribe_voice_note (line 317) | async fn try_transcribe_voice_note( method synthesize_voice_static (line 382) | async fn synthesize_voice_static( method new (line 977) | pub fn new( method with_transcription (line 986) | pub fn with_transcription(self, _config: crate::config::TranscriptionC... method with_tts (line 990) | pub fn with_tts(self, _config: crate::config::TtsConfig) -> Self { method name (line 444) | fn name(&self) -> &str { method send (line 448) | async fn send(&self, message: &SendMessage) -> Result<()> { method listen (line 563) | async fn listen(&self, tx: tokio::sync::mpsc::Sender) ->... method health_check (line 907) | async fn health_check(&self) -> bool { method start_typing (line 912) | async fn start_typing(&self, recipient: &str) -> Result<()> { method stop_typing (line 940) | async fn stop_typing(&self, recipient: &str) -> Result<()> { type WhatsAppWebChannel (line 971) | pub struct WhatsAppWebChannel { method new (line 90) | pub fn new( method with_transcription (line 113) | pub fn with_transcription(mut self, config: crate::config::Transcripti... method with_tts (line 122) | pub fn with_tts(mut self, config: crate::config::TtsConfig) -> Self { method is_number_allowed (line 131) | fn is_number_allowed(&self, phone: &str) -> bool { method is_number_allowed_for_list (line 137) | fn is_number_allowed_for_list(allowed_numbers: &[String], phone: &str)... method normalize_phone_token (line 157) | fn normalize_phone_token(value: &str) -> Option { method sender_phone_candidates (line 179) | fn sender_phone_candidates( method normalize_phone (line 207) | fn normalize_phone(&self, phone: &str) -> String { method is_jid (line 223) | fn is_jid(recipient: &str) -> bool { method render_pairing_qr (line 229) | fn render_pairing_qr(code: &str) -> Result { method recipient_to_jid (line 250) | fn recipient_to_jid(&self, recipient: &str) -> Result u64 { method should_purge_session (line 288) | fn should_purge_session(session_revoked: &std::sync::atomic::AtomicBoo... method record_retry (line 293) | fn record_retry(retry_count: &std::sync::atomic::AtomicU32) -> (u32, b... method reset_retry (line 299) | fn reset_retry(retry_count: &std::sync::atomic::AtomicU32) { method session_file_paths (line 304) | fn session_file_paths(expanded_session_path: &str) -> [String; 3] { method try_transcribe_voice_note (line 317) | async fn try_transcribe_voice_note( method synthesize_voice_static (line 382) | async fn synthesize_voice_static( method new (line 977) | pub fn new( method with_transcription (line 986) | pub fn with_transcription(self, _config: crate::config::TranscriptionC... method with_tts (line 990) | pub fn with_tts(self, _config: crate::config::TtsConfig) -> Self { method name (line 998) | fn name(&self) -> &str { method send (line 1002) | async fn send(&self, _message: &SendMessage) -> Result<()> { method listen (line 1009) | async fn listen(&self, _tx: tokio::sync::mpsc::Sender) -... method health_check (line 1016) | async fn health_check(&self) -> bool { method start_typing (line 1020) | async fn start_typing(&self, _recipient: &str) -> Result<()> { method stop_typing (line 1027) | async fn stop_typing(&self, _recipient: &str) -> Result<()> { function make_channel (line 1042) | fn make_channel() -> WhatsAppWebChannel { function whatsapp_web_channel_name (line 1053) | fn whatsapp_web_channel_name() { function whatsapp_web_number_allowed_exact (line 1060) | fn whatsapp_web_number_allowed_exact() { function whatsapp_web_number_allowed_wildcard (line 1068) | fn whatsapp_web_number_allowed_wildcard() { function whatsapp_web_number_denied_empty (line 1076) | fn whatsapp_web_number_denied_empty() { function whatsapp_web_normalize_phone_adds_plus (line 1084) | fn whatsapp_web_normalize_phone_adds_plus() { function whatsapp_web_normalize_phone_preserves_plus (line 1091) | fn whatsapp_web_normalize_phone_preserves_plus() { function whatsapp_web_normalize_phone_from_jid (line 1098) | fn whatsapp_web_normalize_phone_from_jid() { function whatsapp_web_normalize_phone_token_accepts_formatted_phone (line 1108) | fn whatsapp_web_normalize_phone_token_accepts_formatted_phone() { function whatsapp_web_allowlist_matches_normalized_format (line 1117) | fn whatsapp_web_allowlist_matches_normalized_format() { function whatsapp_web_sender_candidates_include_sender_alt_phone (line 1127) | fn whatsapp_web_sender_candidates_include_sender_alt_phone() { function whatsapp_web_sender_candidates_include_lid_mapping_phone (line 1137) | fn whatsapp_web_sender_candidates_include_lid_mapping_phone() { function whatsapp_web_health_check_disconnected (line 1146) | async fn whatsapp_web_health_check_disconnected() { function compute_retry_delay_doubles_with_cap (line 1155) | fn compute_retry_delay_doubles_with_cap() { function compute_retry_delay_zero_attempt (line 1171) | fn compute_retry_delay_zero_attempt() { function record_retry_increments_and_detects_exceeded (line 1181) | fn record_retry_increments_and_detects_exceeded() { function reset_retry_clears_counter (line 1200) | fn reset_retry_clears_counter() { function should_purge_session_only_when_revoked (line 1222) | fn should_purge_session_only_when_revoked() { function with_transcription_sets_config_when_enabled (line 1236) | fn with_transcription_sets_config_when_enabled() { function with_transcription_ignores_when_disabled (line 1246) | fn with_transcription_ignores_when_disabled() { function session_file_paths_includes_wal_and_shm (line 1254) | fn session_file_paths_includes_wal_and_shm() { FILE: src/commands/self_test.rs type CheckResult (line 7) | pub struct CheckResult { method pass (line 14) | fn pass(name: &'static str, detail: impl Into) -> Self { method fail (line 21) | fn fail(name: &'static str, detail: impl Into) -> Self { function run_quick (line 31) | pub async fn run_quick(config: &crate::config::Config) -> Result Result CheckResult { function check_workspace (line 112) | async fn check_workspace(workspace_dir: &Path) -> CheckResult { function check_sqlite (line 142) | fn check_sqlite(workspace_dir: &Path) -> CheckResult { function check_provider_registry (line 153) | fn check_provider_registry() -> CheckResult { function check_tool_registry (line 165) | fn check_tool_registry(config: &crate::config::Config) -> CheckResult { function check_channel_config (line 178) | fn check_channel_config(config: &crate::config::Config) -> CheckResult { function check_security_policy (line 191) | fn check_security_policy(config: &crate::config::Config) -> CheckResult { function check_version (line 200) | fn check_version() -> CheckResult { function check_gateway_health (line 205) | async fn check_gateway_health(config: &crate::config::Config) -> CheckRe... function check_memory_roundtrip (line 227) | async fn check_memory_roundtrip(config: &crate::config::Config) -> Check... function check_websocket_handshake (line 268) | async fn check_websocket_handshake(config: &crate::config::Config) -> Ch... FILE: src/commands/update.rs constant GITHUB_RELEASES_LATEST_URL (line 7) | const GITHUB_RELEASES_LATEST_URL: &str = constant GITHUB_RELEASES_TAG_URL (line 9) | const GITHUB_RELEASES_TAG_URL: &str = type UpdateInfo (line 13) | pub struct UpdateInfo { function check (line 23) | pub async fn check(target_version: Option<&str>) -> Result { function run (line 74) | pub async fn run(target_version: Option<&str>) -> Result<()> { function find_asset_url (line 148) | fn find_asset_url(release: &serde_json::Value) -> Option { function version_is_newer (line 177) | fn version_is_newer(current: &str, candidate: &str) -> bool { function download_binary (line 184) | async fn download_binary(url: &str, dest: &Path) -> Result<()> { function validate_binary (line 215) | async fn validate_binary(path: &Path) -> Result<()> { function swap_binary (line 243) | async fn swap_binary(new: &Path, target: &Path) -> Result<()> { function smoke_test (line 250) | async fn smoke_test(binary: &Path) -> Result<()> { function test_version_comparison (line 269) | fn test_version_comparison() { FILE: src/config/mod.rs function name_and_presence (line 32) | pub fn name_and_presence(channel: Option<&T>) ... function reexported_config_default_is_constructible (line 41) | fn reexported_config_default_is_constructible() { function reexported_channel_configs_are_constructible (line 50) | fn reexported_channel_configs_are_constructible() { FILE: src/config/schema.rs constant SUPPORTED_PROXY_SERVICE_KEYS (line 16) | const SUPPORTED_PROXY_SERVICE_KEYS: &[&str] = &[ constant SUPPORTED_PROXY_SERVICE_SELECTORS (line 47) | const SUPPORTED_PROXY_SERVICE_SELECTORS: &[&str] = &[ type Config (line 66) | pub struct Config { method load_or_init (line 6727) | pub async fn load_or_init() -> Result { method lookup_model_provider_profile (line 7144) | fn lookup_model_provider_profile( method apply_named_model_provider_profile (line 7159) | fn apply_named_model_provider_profile(&mut self) { method validate (line 7242) | pub fn validate(&self) -> Result<()> { method apply_env_overrides (line 7682) | pub fn apply_env_overrides(&mut self) { method resolve_config_path_for_save (line 8031) | async fn resolve_config_path_for_save(&self) -> Result { method save (line 8058) | pub async fn save(&self) -> Result<()> { type WorkspaceConfig (line 378) | pub struct WorkspaceConfig { function default_workspaces_dir (line 402) | fn default_workspaces_dir() -> String { method default (line 407) | fn default() -> Self { type ModelProviderConfig (line 422) | pub struct ModelProviderConfig { type DelegateToolConfig (line 454) | pub struct DelegateToolConfig { method default (line 468) | fn default() -> Self { type DelegateAgentConfig (line 480) | pub struct DelegateAgentConfig { function default_delegate_timeout_secs (line 516) | fn default_delegate_timeout_secs() -> u64 { function default_delegate_agentic_timeout_secs (line 520) | fn default_delegate_agentic_timeout_secs() -> u64 { type SwarmStrategy (line 529) | pub enum SwarmStrategy { type SwarmConfig (line 540) | pub struct SwarmConfig { constant DEFAULT_SWARM_TIMEOUT_SECS (line 556) | const DEFAULT_SWARM_TIMEOUT_SECS: u64 = 300; function default_swarm_timeout_secs (line 558) | fn default_swarm_timeout_secs() -> u64 { constant TEMPERATURE_RANGE (line 563) | pub const TEMPERATURE_RANGE: std::ops::RangeInclusive = 0.0..=2.0; constant DEFAULT_TEMPERATURE (line 566) | const DEFAULT_TEMPERATURE: f64 = 0.7; function default_temperature (line 568) | fn default_temperature() -> f64 { constant DEFAULT_PROVIDER_TIMEOUT_SECS (line 573) | const DEFAULT_PROVIDER_TIMEOUT_SECS: u64 = 120; function default_provider_timeout_secs (line 575) | fn default_provider_timeout_secs() -> u64 { constant DEFAULT_DELEGATE_TIMEOUT_SECS (line 580) | pub const DEFAULT_DELEGATE_TIMEOUT_SECS: u64 = 120; constant DEFAULT_DELEGATE_AGENTIC_TIMEOUT_SECS (line 583) | pub const DEFAULT_DELEGATE_AGENTIC_TIMEOUT_SECS: u64 = 300; function validate_temperature (line 586) | pub fn validate_temperature(value: f64) -> std::result::Result(deserializer: D) -> std::result::Resu... function normalize_reasoning_effort (line 607) | fn normalize_reasoning_effort(value: &str) -> std::result::Result( function default_max_depth (line 629) | fn default_max_depth() -> u32 { function default_max_tool_iterations (line 633) | fn default_max_tool_iterations() -> usize { type HardwareTransport (line 641) | pub enum HardwareTransport { method fmt (line 650) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { type HardwareConfig (line 662) | pub struct HardwareConfig { method transport_mode (line 689) | pub fn transport_mode(&self) -> HardwareTransport { function default_baud_rate (line 683) | fn default_baud_rate() -> u32 { method default (line 695) | fn default() -> Self { function default_transcription_api_url (line 709) | fn default_transcription_api_url() -> String { function default_transcription_model (line 713) | fn default_transcription_model() -> String { function default_transcription_max_duration_secs (line 717) | fn default_transcription_max_duration_secs() -> u64 { function default_transcription_provider (line 721) | fn default_transcription_provider() -> String { function default_openai_stt_model (line 725) | fn default_openai_stt_model() -> String { function default_deepgram_stt_model (line 729) | fn default_deepgram_stt_model() -> String { function default_google_stt_language_code (line 733) | fn default_google_stt_language_code() -> String { type TranscriptionConfig (line 742) | pub struct TranscriptionConfig { method default (line 786) | fn default() -> Self { type McpTransport (line 809) | pub enum McpTransport { type McpServerConfig (line 821) | pub struct McpServerConfig { type McpConfig (line 849) | pub struct McpConfig { function default_deferred_loading (line 864) | fn default_deferred_loading() -> bool { method default (line 869) | fn default() -> Self { type NodesConfig (line 885) | pub struct NodesConfig { function default_max_nodes (line 897) | fn default_max_nodes() -> usize { method default (line 902) | fn default() -> Self { function default_tts_provider (line 913) | fn default_tts_provider() -> String { function default_tts_voice (line 917) | fn default_tts_voice() -> String { function default_tts_format (line 921) | fn default_tts_format() -> String { function default_tts_max_text_length (line 925) | fn default_tts_max_text_length() -> usize { function default_openai_tts_model (line 929) | fn default_openai_tts_model() -> String { function default_openai_tts_speed (line 933) | fn default_openai_tts_speed() -> f64 { function default_elevenlabs_model_id (line 937) | fn default_elevenlabs_model_id() -> String { function default_elevenlabs_stability (line 941) | fn default_elevenlabs_stability() -> f64 { function default_elevenlabs_similarity_boost (line 945) | fn default_elevenlabs_similarity_boost() -> f64 { function default_google_tts_language_code (line 949) | fn default_google_tts_language_code() -> String { function default_edge_tts_binary_path (line 953) | fn default_edge_tts_binary_path() -> String { type TtsConfig (line 959) | pub struct TtsConfig { method default (line 990) | fn default() -> Self { type OpenAiTtsConfig (line 1007) | pub struct OpenAiTtsConfig { type ElevenLabsTtsConfig (line 1021) | pub struct ElevenLabsTtsConfig { type GoogleTtsConfig (line 1038) | pub struct GoogleTtsConfig { type EdgeTtsConfig (line 1049) | pub struct EdgeTtsConfig { type ToolFilterGroupMode (line 1058) | pub enum ToolFilterGroupMode { type ToolFilterGroup (line 1087) | pub struct ToolFilterGroup { type OpenAiSttConfig (line 1102) | pub struct OpenAiSttConfig { type DeepgramSttConfig (line 1113) | pub struct DeepgramSttConfig { type AssemblyAiSttConfig (line 1124) | pub struct AssemblyAiSttConfig { type GoogleSttConfig (line 1132) | pub struct GoogleSttConfig { type AgentConfig (line 1143) | pub struct AgentConfig { function default_agent_max_tool_iterations (line 1177) | fn default_agent_max_tool_iterations() -> usize { function default_agent_max_history_messages (line 1181) | fn default_agent_max_history_messages() -> usize { function default_agent_max_context_tokens (line 1185) | fn default_agent_max_context_tokens() -> usize { function default_agent_tool_dispatcher (line 1189) | fn default_agent_tool_dispatcher() -> String { method default (line 1194) | fn default() -> Self { type SkillsPromptInjectionMode (line 1211) | pub enum SkillsPromptInjectionMode { function parse_skills_prompt_injection_mode (line 1219) | fn parse_skills_prompt_injection_mode(raw: &str) -> Option Self { type MultimodalConfig (line 1278) | pub struct MultimodalConfig { method effective_limits (line 1300) | pub fn effective_limits(&self) -> (usize, usize) { function default_multimodal_max_images (line 1290) | fn default_multimodal_max_images() -> usize { function default_multimodal_max_image_size_mb (line 1294) | fn default_multimodal_max_image_size_mb() -> usize { method default (line 1308) | fn default() -> Self { type IdentityConfig (line 1323) | pub struct IdentityConfig { function default_identity_format (line 1335) | fn default_identity_format() -> String { method default (line 1340) | fn default() -> Self { type CostConfig (line 1353) | pub struct CostConfig { type ModelPricing (line 1381) | pub struct ModelPricing { function default_daily_limit (line 1391) | fn default_daily_limit() -> f64 { function default_monthly_limit (line 1395) | fn default_monthly_limit() -> f64 { function default_warn_percent (line 1399) | fn default_warn_percent() -> u8 { method default (line 1404) | fn default() -> Self { function get_default_pricing (line 1417) | fn get_default_pricing() -> std::collections::HashMap String { function default_peripheral_baud (line 1531) | fn default_peripheral_baud() -> u32 { method default (line 1536) | fn default() -> Self { type GatewayConfig (line 1553) | pub struct GatewayConfig { function default_gateway_port (line 1608) | fn default_gateway_port() -> u16 { function default_gateway_host (line 1612) | fn default_gateway_host() -> String { function default_pair_rate_limit (line 1616) | fn default_pair_rate_limit() -> u32 { function default_webhook_rate_limit (line 1620) | fn default_webhook_rate_limit() -> u32 { function default_idempotency_ttl_secs (line 1624) | fn default_idempotency_ttl_secs() -> u64 { function default_gateway_rate_limit_max_keys (line 1628) | fn default_gateway_rate_limit_max_keys() -> usize { function default_gateway_idempotency_max_keys (line 1632) | fn default_gateway_idempotency_max_keys() -> usize { function default_true (line 1636) | fn default_true() -> bool { function default_false (line 1640) | fn default_false() -> bool { method default (line 1645) | fn default() -> Self { type PairingDashboardConfig (line 1667) | pub struct PairingDashboardConfig { function default_pairing_code_length (line 1685) | fn default_pairing_code_length() -> usize { function default_pairing_ttl (line 1688) | fn default_pairing_ttl() -> u64 { function default_max_pending_codes (line 1691) | fn default_max_pending_codes() -> usize { function default_max_failed_attempts (line 1694) | fn default_max_failed_attempts() -> u32 { function default_pairing_lockout_secs (line 1697) | fn default_pairing_lockout_secs() -> u64 { method default (line 1702) | fn default() -> Self { type NodeTransportConfig (line 1715) | pub struct NodeTransportConfig { function default_node_transport_enabled (line 1745) | fn default_node_transport_enabled() -> bool { function default_max_request_age (line 1748) | fn default_max_request_age() -> i64 { function default_require_https (line 1751) | fn default_require_https() -> bool { function default_connection_pool_size (line 1754) | fn default_connection_pool_size() -> usize { method default (line 1759) | fn default() -> Self { type ComposioConfig (line 1780) | pub struct ComposioConfig { function default_entity_id (line 1792) | fn default_entity_id() -> String { method default (line 1797) | fn default() -> Self { type Microsoft365Config (line 1813) | pub struct Microsoft365Config { method fmt (line 1849) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { function default_ms365_auth_flow (line 1840) | fn default_ms365_auth_flow() -> String { function default_ms365_scopes (line 1844) | fn default_ms365_scopes() -> Vec { method default (line 1864) | fn default() -> Self { type SecretsConfig (line 1882) | pub struct SecretsConfig { method default (line 1889) | fn default() -> Self { type BrowserComputerUseConfig (line 1900) | pub struct BrowserComputerUseConfig { function default_browser_computer_use_endpoint (line 1924) | fn default_browser_computer_use_endpoint() -> String { function default_browser_computer_use_timeout_ms (line 1928) | fn default_browser_computer_use_timeout_ms() -> u64 { method default (line 1933) | fn default() -> Self { type BrowserConfig (line 1950) | pub struct BrowserConfig { function default_browser_backend (line 1977) | fn default_browser_backend() -> String { function default_browser_webdriver_url (line 1981) | fn default_browser_webdriver_url() -> String { method default (line 1986) | fn default() -> Self { type HttpRequestConfig (line 2006) | pub struct HttpRequestConfig { method default (line 2026) | fn default() -> Self { function default_http_max_response_size (line 2037) | fn default_http_max_response_size() -> usize { function default_http_timeout_secs (line 2041) | fn default_http_timeout_secs() -> u64 { type WebFetchConfig (line 2054) | pub struct WebFetchConfig { function default_web_fetch_max_response_size (line 2072) | fn default_web_fetch_max_response_size() -> usize { function default_web_fetch_timeout_secs (line 2076) | fn default_web_fetch_timeout_secs() -> u64 { function default_web_fetch_allowed_domains (line 2080) | fn default_web_fetch_allowed_domains() -> Vec { method default (line 2085) | fn default() -> Self { type TextBrowserConfig (line 2103) | pub struct TextBrowserConfig { function default_text_browser_timeout_secs (line 2115) | fn default_text_browser_timeout_secs() -> u64 { method default (line 2120) | fn default() -> Self { type WebSearchConfig (line 2133) | pub struct WebSearchConfig { function default_web_search_provider (line 2151) | fn default_web_search_provider() -> String { function default_web_search_max_results (line 2155) | fn default_web_search_max_results() -> usize { function default_web_search_timeout_secs (line 2159) | fn default_web_search_timeout_secs() -> u64 { method default (line 2164) | fn default() -> Self { type ProjectIntelConfig (line 2179) | pub struct ProjectIntelConfig { function default_project_intel_language (line 2206) | fn default_project_intel_language() -> String { function default_project_intel_report_dir (line 2210) | fn default_project_intel_report_dir() -> String { function default_project_intel_risk_sensitivity (line 2214) | fn default_project_intel_risk_sensitivity() -> String { method default (line 2219) | fn default() -> Self { type BackupConfig (line 2237) | pub struct BackupConfig { function default_backup_max_keep (line 2264) | fn default_backup_max_keep() -> usize { function default_backup_include_dirs (line 2268) | fn default_backup_include_dirs() -> Vec { function default_backup_destination_dir (line 2277) | fn default_backup_destination_dir() -> String { method default (line 2282) | fn default() -> Self { type DataRetentionConfig (line 2300) | pub struct DataRetentionConfig { function default_retention_days (line 2315) | fn default_retention_days() -> u64 { method default (line 2320) | fn default() -> Self { type GoogleWorkspaceConfig (line 2360) | pub struct GoogleWorkspaceConfig { function default_gws_rate_limit (line 2396) | fn default_gws_rate_limit() -> u32 { function default_gws_timeout_secs (line 2400) | fn default_gws_timeout_secs() -> u64 { method default (line 2405) | fn default() -> Self { type KnowledgeConfig (line 2423) | pub struct KnowledgeConfig { function default_knowledge_db_path (line 2444) | fn default_knowledge_db_path() -> String { function default_knowledge_max_nodes (line 2448) | fn default_knowledge_max_nodes() -> usize { method default (line 2453) | fn default() -> Self { type LinkedInConfig (line 2472) | pub struct LinkedInConfig { method default (line 2491) | fn default() -> Self { function default_linkedin_api_version (line 2501) | fn default_linkedin_api_version() -> String { type PluginsConfig (line 2507) | pub struct PluginsConfig { function default_plugins_dir (line 2522) | fn default_plugins_dir() -> String { function default_max_plugins (line 2526) | fn default_max_plugins() -> usize { method default (line 2531) | fn default() -> Self { type LinkedInContentConfig (line 2546) | pub struct LinkedInContentConfig { type LinkedInImageConfig (line 2574) | pub struct LinkedInImageConfig { function default_image_providers (line 2612) | fn default_image_providers() -> Vec { function default_card_accent_color (line 2621) | fn default_card_accent_color() -> String { function default_image_temp_dir (line 2625) | fn default_image_temp_dir() -> String { method default (line 2630) | fn default() -> Self { type ImageProviderStabilityConfig (line 2647) | pub struct ImageProviderStabilityConfig { function default_stability_api_key_env (line 2656) | fn default_stability_api_key_env() -> String { function default_stability_model (line 2659) | fn default_stability_model() -> String { method default (line 2664) | fn default() -> Self { type ImageProviderImagenConfig (line 2674) | pub struct ImageProviderImagenConfig { function default_imagen_api_key_env (line 2686) | fn default_imagen_api_key_env() -> String { function default_imagen_project_id_env (line 2689) | fn default_imagen_project_id_env() -> String { function default_imagen_region (line 2692) | fn default_imagen_region() -> String { method default (line 2697) | fn default() -> Self { type ImageProviderDalleConfig (line 2708) | pub struct ImageProviderDalleConfig { function default_dalle_api_key_env (line 2720) | fn default_dalle_api_key_env() -> String { function default_dalle_model (line 2723) | fn default_dalle_model() -> String { function default_dalle_size (line 2726) | fn default_dalle_size() -> String { method default (line 2731) | fn default() -> Self { type ImageProviderFluxConfig (line 2742) | pub struct ImageProviderFluxConfig { function default_flux_api_key_env (line 2751) | fn default_flux_api_key_env() -> String { function default_flux_model (line 2754) | fn default_flux_model() -> String { method default (line 2759) | fn default() -> Self { type ProxyScope (line 2772) | pub enum ProxyScope { type ProxyConfig (line 2784) | pub struct ProxyConfig { method supported_service_keys (line 2823) | pub fn supported_service_keys() -> &'static [&'static str] { method supported_service_selectors (line 2827) | pub fn supported_service_selectors() -> &'static [&'static str] { method has_any_proxy_url (line 2831) | pub fn has_any_proxy_url(&self) -> bool { method normalized_services (line 2837) | pub fn normalized_services(&self) -> Vec { method normalized_no_proxy (line 2841) | pub fn normalized_no_proxy(&self) -> Vec { method validate (line 2845) | pub fn validate(&self) -> Result<()> { method should_apply_to_service (line 2882) | pub fn should_apply_to_service(&self, service_key: &str) -> bool { method apply_to_reqwest_builder (line 2903) | pub fn apply_to_reqwest_builder( method apply_to_process_env (line 2962) | pub fn apply_to_process_env(&self) { method clear_process_env (line 2974) | pub fn clear_process_env() { method no_proxy_value (line 2981) | fn no_proxy_value(&self) -> Option { method default (line 2809) | fn default() -> Self { function apply_no_proxy (line 2990) | fn apply_no_proxy(proxy: reqwest::Proxy, no_proxy: Option) -> Option { function normalize_no_proxy_list (line 2999) | fn normalize_no_proxy_list(values: Vec) -> Vec { function normalize_service_list (line 3003) | fn normalize_service_list(values: Vec) -> Vec { function normalize_comma_values (line 3013) | fn normalize_comma_values(values: Vec) -> Vec { function is_supported_proxy_service_selector (line 3029) | fn is_supported_proxy_service_selector(selector: &str) -> bool { function service_selector_matches (line 3042) | fn service_selector_matches(selector: &str, service_key: &str) -> bool { constant MCP_MAX_TOOL_TIMEOUT_SECS (line 3057) | const MCP_MAX_TOOL_TIMEOUT_SECS: u64 = 600; function validate_mcp_config (line 3059) | fn validate_mcp_config(config: &McpConfig) -> Result<()> { function validate_proxy_url (line 3116) | fn validate_proxy_url(field: &str, url: &str) -> Result<()> { function set_proxy_env_pair (line 3136) | fn set_proxy_env_pair(key: &str, value: Option<&str>) { function clear_proxy_env_pair (line 3147) | fn clear_proxy_env_pair(key: &str) { function runtime_proxy_state (line 3152) | fn runtime_proxy_state() -> &'static RwLock { function runtime_proxy_client_cache (line 3156) | fn runtime_proxy_client_cache() -> &'static RwLock Option ProxyConfig { function apply_runtime_proxy_to_builder (line 3226) | pub fn apply_runtime_proxy_to_builder( function build_runtime_proxy_client (line 3233) | pub fn build_runtime_proxy_client(service_key: &str) -> reqwest::Client { function build_runtime_proxy_client_with_timeouts (line 3248) | pub fn build_runtime_proxy_client_with_timeouts( function parse_proxy_scope (line 3274) | fn parse_proxy_scope(raw: &str) -> Option { function parse_proxy_enabled (line 3283) | fn parse_proxy_enabled(raw: &str) -> Option { type StorageConfig (line 3294) | pub struct StorageConfig { type StorageProviderSection (line 3302) | pub struct StorageProviderSection { type StorageProviderConfig (line 3310) | pub struct StorageProviderConfig { function default_storage_schema (line 3338) | fn default_storage_schema() -> String { function default_storage_table (line 3342) | fn default_storage_table() -> String { method default (line 3347) | fn default() -> Self { type QdrantConfig (line 3365) | pub struct QdrantConfig { function default_qdrant_collection (line 3380) | fn default_qdrant_collection() -> String { method default (line 3385) | fn default() -> Self { type MemoryConfig (line 3396) | pub struct MemoryConfig { function default_embedding_provider (line 3481) | fn default_embedding_provider() -> String { function default_hygiene_enabled (line 3484) | fn default_hygiene_enabled() -> bool { function default_archive_after_days (line 3487) | fn default_archive_after_days() -> u32 { function default_purge_after_days (line 3490) | fn default_purge_after_days() -> u32 { function default_conversation_retention_days (line 3493) | fn default_conversation_retention_days() -> u32 { function default_embedding_model (line 3496) | fn default_embedding_model() -> String { function default_embedding_dims (line 3499) | fn default_embedding_dims() -> usize { function default_vector_weight (line 3502) | fn default_vector_weight() -> f64 { function default_keyword_weight (line 3505) | fn default_keyword_weight() -> f64 { function default_min_relevance_score (line 3508) | fn default_min_relevance_score() -> f64 { function default_cache_size (line 3511) | fn default_cache_size() -> usize { function default_chunk_size (line 3514) | fn default_chunk_size() -> usize { function default_response_cache_ttl (line 3517) | fn default_response_cache_ttl() -> u32 { function default_response_cache_max (line 3520) | fn default_response_cache_max() -> usize { function default_response_cache_hot_entries (line 3524) | fn default_response_cache_hot_entries() -> usize { method default (line 3529) | fn default() -> Self { type ObservabilityConfig (line 3562) | pub struct ObservabilityConfig { method default (line 3589) | fn default() -> Self { function default_runtime_trace_mode (line 3601) | fn default_runtime_trace_mode() -> String { function default_runtime_trace_path (line 3605) | fn default_runtime_trace_path() -> String { function default_runtime_trace_max_entries (line 3609) | fn default_runtime_trace_max_entries() -> usize { type HooksConfig (line 3616) | pub struct HooksConfig { method default (line 3627) | fn default() -> Self { type BuiltinHooksConfig (line 3636) | pub struct BuiltinHooksConfig { type WebhookAuditConfig (line 3653) | pub struct WebhookAuditConfig { function default_max_args_bytes (line 3676) | fn default_max_args_bytes() -> u64 { method default (line 3681) | fn default() -> Self { type AutonomyConfig (line 3700) | pub struct AutonomyConfig { function default_auto_approve (line 3752) | fn default_auto_approve() -> Vec { function default_always_ask (line 3756) | fn default_always_ask() -> Vec { function is_valid_env_var_name (line 3760) | fn is_valid_env_var_name(name: &str) -> bool { method default (line 3770) | fn default() -> Self { type RuntimeConfig (line 3826) | pub struct RuntimeConfig { type DockerRuntimeConfig (line 3848) | pub struct DockerRuntimeConfig { function default_runtime_kind (line 3878) | fn default_runtime_kind() -> String { function default_docker_image (line 3882) | fn default_docker_image() -> String { function default_docker_network (line 3886) | fn default_docker_network() -> String { function default_docker_memory_limit_mb (line 3890) | fn default_docker_memory_limit_mb() -> Option { function default_docker_cpu_limit (line 3894) | fn default_docker_cpu_limit() -> Option { method default (line 3899) | fn default() -> Self { method default (line 3913) | fn default() -> Self { type ReliabilityConfig (line 3929) | pub struct ReliabilityConfig { function default_provider_retries (line 3961) | fn default_provider_retries() -> u32 { function default_provider_backoff_ms (line 3965) | fn default_provider_backoff_ms() -> u64 { function default_channel_backoff_secs (line 3969) | fn default_channel_backoff_secs() -> u64 { function default_channel_backoff_max_secs (line 3973) | fn default_channel_backoff_max_secs() -> u64 { function default_scheduler_poll_secs (line 3977) | fn default_scheduler_poll_secs() -> u64 { function default_scheduler_retries (line 3981) | fn default_scheduler_retries() -> u32 { method default (line 3986) | fn default() -> Self { type SchedulerConfig (line 4005) | pub struct SchedulerConfig { function default_scheduler_enabled (line 4017) | fn default_scheduler_enabled() -> bool { function default_scheduler_max_tasks (line 4021) | fn default_scheduler_max_tasks() -> usize { function default_scheduler_max_concurrent (line 4025) | fn default_scheduler_max_concurrent() -> usize { method default (line 4030) | fn default() -> Self { type ModelRouteConfig (line 4057) | pub struct ModelRouteConfig { type EmbeddingRouteConfig (line 4084) | pub struct EmbeddingRouteConfig { type QueryClassificationConfig (line 4104) | pub struct QueryClassificationConfig { type ClassificationRule (line 4115) | pub struct ClassificationRule { type HeartbeatConfig (line 4139) | pub struct HeartbeatConfig { function default_heartbeat_interval (line 4187) | fn default_heartbeat_interval() -> u32 { function default_two_phase (line 4191) | fn default_two_phase() -> bool { function default_heartbeat_min_interval (line 4195) | fn default_heartbeat_min_interval() -> u32 { function default_heartbeat_max_interval (line 4199) | fn default_heartbeat_max_interval() -> u32 { function default_heartbeat_max_run_history (line 4203) | fn default_heartbeat_max_run_history() -> u32 { method default (line 4208) | fn default() -> Self { type CronConfig (line 4231) | pub struct CronConfig { function default_max_run_history (line 4249) | fn default_max_run_history() -> u32 { method default (line 4254) | fn default() -> Self { type TunnelConfig (line 4269) | pub struct TunnelConfig { method default (line 4295) | fn default() -> Self { type CloudflareTunnelConfig (line 4308) | pub struct CloudflareTunnelConfig { type TailscaleTunnelConfig (line 4314) | pub struct TailscaleTunnelConfig { type NgrokTunnelConfig (line 4323) | pub struct NgrokTunnelConfig { type OpenVpnTunnelConfig (line 4338) | pub struct OpenVpnTunnelConfig { function default_openvpn_timeout (line 4356) | fn default_openvpn_timeout() -> u64 { type CustomTunnelConfig (line 4361) | pub struct CustomTunnelConfig { type ConfigWrapper (line 4373) | struct ConfigWrapper(std::marker::PhantomData); function new (line 4376) | fn new(_: Option<&T>) -> Self { function name (line 4382) | fn name(&self) -> &'static str { function desc (line 4385) | fn desc(&self) -> &'static str { type ChannelsConfig (line 4396) | pub struct ChannelsConfig { method channels_except_webhook (line 4482) | pub fn channels_except_webhook(&self) -> Vec<(Box Vec<(Box, b... function default_channel_message_timeout_secs (line 4586) | fn default_channel_message_timeout_secs() -> u64 { function default_session_backend (line 4590) | fn default_session_backend() -> String { method default (line 4595) | fn default() -> Self { type StreamMode (line 4637) | pub enum StreamMode { function default_draft_update_interval_ms (line 4645) | fn default_draft_update_interval_ms() -> u64 { type TelegramConfig (line 4651) | pub struct TelegramConfig { method name (line 4678) | fn name() -> &'static str { method desc (line 4681) | fn desc() -> &'static str { type DiscordConfig (line 4688) | pub struct DiscordConfig { method name (line 4711) | fn name() -> &'static str { method desc (line 4714) | fn desc() -> &'static str { type SlackConfig (line 4721) | pub struct SlackConfig { method name (line 4747) | fn name() -> &'static str { method desc (line 4750) | fn desc() -> &'static str { type MattermostConfig (line 4757) | pub struct MattermostConfig { method name (line 4782) | fn name() -> &'static str { method desc (line 4785) | fn desc() -> &'static str { type WebhookConfig (line 4795) | pub struct WebhookConfig { method name (line 4815) | fn name() -> &'static str { method desc (line 4818) | fn desc() -> &'static str { type IMessageConfig (line 4825) | pub struct IMessageConfig { method name (line 4831) | fn name() -> &'static str { method desc (line 4834) | fn desc() -> &'static str { type MatrixConfig (line 4841) | pub struct MatrixConfig { method name (line 4859) | fn name() -> &'static str { method desc (line 4862) | fn desc() -> &'static str { type SignalConfig (line 4868) | pub struct SignalConfig { method name (line 4891) | fn name() -> &'static str { method desc (line 4894) | fn desc() -> &'static str { type WhatsAppConfig (line 4903) | pub struct WhatsAppConfig { method backend_type (line 5027) | pub fn backend_type(&self) -> &'static str { method is_cloud_config (line 5039) | pub fn is_cloud_config(&self) -> bool { method is_web_config (line 5044) | pub fn is_web_config(&self) -> bool { method is_ambiguous_config (line 5051) | pub fn is_ambiguous_config(&self) -> bool { method name (line 4938) | fn name() -> &'static str { method desc (line 4941) | fn desc() -> &'static str { type LinqConfig (line 4947) | pub struct LinqConfig { method name (line 4961) | fn name() -> &'static str { method desc (line 4964) | fn desc() -> &'static str { type WatiConfig (line 4971) | pub struct WatiConfig { function default_wati_api_url (line 4985) | fn default_wati_api_url() -> String { method name (line 4990) | fn name() -> &'static str { method desc (line 4993) | fn desc() -> &'static str { type NextcloudTalkConfig (line 5000) | pub struct NextcloudTalkConfig { method name (line 5016) | fn name() -> &'static str { method desc (line 5019) | fn desc() -> &'static str { type IrcConfig (line 5058) | pub struct IrcConfig { method name (line 5085) | fn name() -> &'static str { method desc (line 5088) | fn desc() -> &'static str { function default_irc_port (line 5093) | fn default_irc_port() -> u16 { type LarkReceiveMode (line 5103) | pub enum LarkReceiveMode { type LarkConfig (line 5112) | pub struct LarkConfig { method name (line 5143) | fn name() -> &'static str { method desc (line 5146) | fn desc() -> &'static str { type FeishuConfig (line 5153) | pub struct FeishuConfig { method name (line 5177) | fn name() -> &'static str { method desc (line 5180) | fn desc() -> &'static str { type SecurityConfig (line 5189) | pub struct SecurityConfig { type OtpMethod (line 5218) | pub enum OtpMethod { type OtpConfig (line 5231) | pub struct OtpConfig { function default_otp_token_ttl_secs (line 5265) | fn default_otp_token_ttl_secs() -> u64 { function default_otp_cache_valid_secs (line 5269) | fn default_otp_cache_valid_secs() -> u64 { function default_otp_challenge_max_attempts (line 5273) | fn default_otp_challenge_max_attempts() -> u32 { function default_otp_gated_actions (line 5277) | fn default_otp_gated_actions() -> Vec { method default (line 5288) | fn default() -> Self { type EstopConfig (line 5305) | pub struct EstopConfig { function default_estop_state_file (line 5319) | fn default_estop_state_file() -> String { method default (line 5324) | fn default() -> Self { type NevisConfig (line 5339) | pub struct NevisConfig { method fmt (line 5382) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { method validate (line 5406) | pub fn validate(&self) -> Result<(), String> { function default_nevis_realm (line 5445) | fn default_nevis_realm() -> String { function default_nevis_token_validation (line 5449) | fn default_nevis_token_validation() -> String { function default_nevis_session_timeout_secs (line 5453) | fn default_nevis_session_timeout_secs() -> u64 { method default (line 5458) | fn default() -> Self { type NevisRoleMappingConfig (line 5477) | pub struct NevisRoleMappingConfig { type SandboxConfig (line 5492) | pub struct SandboxConfig { method default (line 5507) | fn default() -> Self { type SandboxBackend (line 5519) | pub enum SandboxBackend { type ResourceLimitsConfig (line 5537) | pub struct ResourceLimitsConfig { function default_max_memory_mb (line 5555) | fn default_max_memory_mb() -> u32 { function default_max_cpu_time_seconds (line 5559) | fn default_max_cpu_time_seconds() -> u64 { function default_max_subprocesses (line 5563) | fn default_max_subprocesses() -> u32 { function default_memory_monitoring_enabled (line 5567) | fn default_memory_monitoring_enabled() -> bool { method default (line 5572) | fn default() -> Self { type AuditConfig (line 5584) | pub struct AuditConfig { function default_audit_enabled (line 5602) | fn default_audit_enabled() -> bool { function default_audit_log_path (line 5606) | fn default_audit_log_path() -> String { function default_audit_max_size_mb (line 5610) | fn default_audit_max_size_mb() -> u32 { method default (line 5615) | fn default() -> Self { type DingTalkConfig (line 5627) | pub struct DingTalkConfig { method name (line 5638) | fn name() -> &'static str { method desc (line 5641) | fn desc() -> &'static str { type WeComConfig (line 5648) | pub struct WeComConfig { method name (line 5657) | fn name() -> &'static str { method desc (line 5660) | fn desc() -> &'static str { type QQConfig (line 5667) | pub struct QQConfig { method name (line 5678) | fn name() -> &'static str { method desc (line 5681) | fn desc() -> &'static str { type TwitterConfig (line 5688) | pub struct TwitterConfig { method name (line 5697) | fn name() -> &'static str { method desc (line 5700) | fn desc() -> &'static str { type MochatConfig (line 5707) | pub struct MochatConfig { function default_mochat_poll_interval (line 5720) | fn default_mochat_poll_interval() -> u64 { method name (line 5725) | fn name() -> &'static str { method desc (line 5728) | fn desc() -> &'static str { type RedditConfig (line 5735) | pub struct RedditConfig { method name (line 5751) | fn name() -> &'static str { method desc (line 5754) | fn desc() -> &'static str { type BlueskyConfig (line 5761) | pub struct BlueskyConfig { method name (line 5769) | fn name() -> &'static str { method desc (line 5772) | fn desc() -> &'static str { type NostrConfig (line 5780) | pub struct NostrConfig { method name (line 5793) | fn name() -> &'static str { method desc (line 5796) | fn desc() -> &'static str { function default_nostr_relays (line 5802) | pub fn default_nostr_relays() -> Vec { type NotionConfig (line 5819) | pub struct NotionConfig { function default_notion_poll_interval (line 5840) | fn default_notion_poll_interval() -> u64 { function default_notion_status_prop (line 5843) | fn default_notion_status_prop() -> String { function default_notion_input_prop (line 5846) | fn default_notion_input_prop() -> String { function default_notion_result_prop (line 5849) | fn default_notion_result_prop() -> String { function default_notion_max_concurrent (line 5852) | fn default_notion_max_concurrent() -> usize { function default_notion_recover_stale (line 5855) | fn default_notion_recover_stale() -> bool { method default (line 5860) | fn default() -> Self { type JiraConfig (line 5891) | pub struct JiraConfig { function default_jira_allowed_actions (line 5914) | fn default_jira_allowed_actions() -> Vec { function default_jira_timeout_secs (line 5918) | fn default_jira_timeout_secs() -> u64 { method default (line 5923) | fn default() -> Self { type CloudOpsConfig (line 5939) | pub struct CloudOpsConfig { method validate (line 5974) | pub fn validate(&self) -> Result<()> { method default (line 5961) | fn default() -> Self { function default_cloud_ops_cloud (line 6012) | fn default_cloud_ops_cloud() -> String { function default_cloud_ops_supported_clouds (line 6016) | fn default_cloud_ops_supported_clouds() -> Vec { function default_cloud_ops_iac_tools (line 6020) | fn default_cloud_ops_iac_tools() -> Vec { function default_cloud_ops_cost_threshold (line 6024) | fn default_cloud_ops_cost_threshold() -> f64 { function default_cloud_ops_waf (line 6028) | fn default_cloud_ops_waf() -> Vec { function default_conversational_ai_language (line 6034) | fn default_conversational_ai_language() -> String { function default_conversational_ai_supported_languages (line 6038) | fn default_conversational_ai_supported_languages() -> Vec { function default_conversational_ai_escalation_threshold (line 6042) | fn default_conversational_ai_escalation_threshold() -> f64 { function default_conversational_ai_max_turns (line 6046) | fn default_conversational_ai_max_turns() -> usize { function default_conversational_ai_timeout_secs (line 6050) | fn default_conversational_ai_timeout_secs() -> u64 { type ConversationalAiConfig (line 6059) | pub struct ConversationalAiConfig { method is_disabled (line 6095) | pub fn is_disabled(&self) -> bool { method default (line 6101) | fn default() -> Self { type SecurityOpsConfig (line 6120) | pub struct SecurityOpsConfig { function default_playbooks_dir (line 6145) | fn default_playbooks_dir() -> String { function default_require_approval (line 6149) | fn default_require_approval() -> bool { function default_max_auto_severity (line 6153) | fn default_max_auto_severity() -> String { function default_report_output_dir (line 6157) | fn default_report_output_dir() -> String { method default (line 6162) | fn default() -> Self { method default (line 6178) | fn default() -> Self { function default_config_and_workspace_dirs (line 6255) | fn default_config_and_workspace_dirs() -> Result<(PathBuf, PathBuf)> { constant ACTIVE_WORKSPACE_STATE_FILE (line 6260) | const ACTIVE_WORKSPACE_STATE_FILE: &str = "active_workspace.toml"; type ActiveWorkspaceState (line 6263) | struct ActiveWorkspaceState { function default_config_dir (line 6267) | fn default_config_dir() -> Result { function active_workspace_state_path (line 6274) | fn active_workspace_state_path(default_dir: &Path) -> PathBuf { function is_temp_directory (line 6279) | fn is_temp_directory(path: &Path) -> bool { function load_persisted_workspace_dirs (line 6287) | async fn load_persisted_workspace_dirs( function persist_active_workspace_config_dir (line 6335) | pub(crate) async fn persist_active_workspace_config_dir(config_dir: &Pat... function resolve_config_dir_for_workspace (line 6401) | pub(crate) fn resolve_config_dir_for_workspace(workspace_dir: &Path) -> ... function resolve_runtime_dirs_for_onboarding (line 6436) | pub async fn resolve_runtime_dirs_for_onboarding() -> Result<(PathBuf, P... type ConfigResolutionSource (line 6444) | enum ConfigResolutionSource { method as_str (line 6452) | const fn as_str(self) -> &'static str { function expand_tilde_path (line 6467) | fn expand_tilde_path(path: &str) -> PathBuf { function resolve_runtime_config_dirs (line 6491) | async fn resolve_runtime_config_dirs( function decrypt_optional_secret (line 6536) | fn decrypt_optional_secret( function decrypt_secret (line 6553) | fn decrypt_secret( function encrypt_optional_secret (line 6566) | fn encrypt_optional_secret( function encrypt_secret (line 6583) | fn encrypt_secret( function config_dir_creation_error (line 6596) | fn config_dir_creation_error(path: &Path) -> String { function is_local_ollama_endpoint (line 6604) | fn is_local_ollama_endpoint(api_url: Option<&str>) -> bool { function has_ollama_cloud_credential (line 6615) | fn has_ollama_cloud_credential(config_api_key: Option<&str>) -> bool { function parse_extra_headers_env (line 6638) | pub fn parse_extra_headers_env(raw: &str) -> Vec<(String, String)> { function normalize_wire_api (line 6660) | fn normalize_wire_api(raw: &str) -> Option<&'static str> { function read_codex_openai_api_key (line 6673) | fn read_codex_openai_api_key() -> Option { function ensure_bootstrap_files (line 6692) | async fn ensure_bootstrap_files(workspace_dir: &Path) -> Result<()> { function sync_directory (line 8483) | async fn sync_directory(path: &Path) -> Result<()> { function expand_tilde_path_handles_absolute_path (line 8520) | async fn expand_tilde_path_handles_absolute_path() { function expand_tilde_path_handles_relative_path (line 8526) | async fn expand_tilde_path_handles_relative_path() { function expand_tilde_path_expands_tilde_when_home_set (line 8532) | async fn expand_tilde_path_expands_tilde_when_home_set() { function has_test_table (line 8548) | fn has_test_table(raw: &str, table: &str) -> bool { function parse_test_config (line 8556) | fn parse_test_config(raw: &str) -> Config { function http_request_config_default_has_correct_values (line 8580) | async fn http_request_config_default_has_correct_values() { function config_default_has_sane_values (line 8589) | async fn config_default_has_sane_values() { type SharedLogBuffer (line 8607) | struct SharedLogBuffer(Arc>>); method captured (line 8612) | fn captured(&self) -> String { type Writer (line 8618) | type Writer = SharedLogWriter; method make_writer (line 8620) | fn make_writer(&'a self) -> Self::Writer { type SharedLogWriter (line 8609) | struct SharedLogWriter(Arc>>); method write (line 8626) | fn write(&mut self, buf: &[u8]) -> io::Result { method flush (line 8631) | fn flush(&mut self) -> io::Result<()> { function config_dir_creation_error_mentions_openrc_and_path (line 8637) | async fn config_dir_creation_error_mentions_openrc_and_path() { function config_schema_export_contains_expected_contract_shape (line 8645) | async fn config_schema_export_contains_expected_contract_shape() { function save_sets_config_permissions_on_new_file (line 8679) | async fn save_sets_config_permissions_on_new_file() { function observability_config_default (line 8699) | async fn observability_config_default() { function autonomy_config_default (line 8708) | async fn autonomy_config_default() { function runtime_config_default (line 8723) | async fn runtime_config_default() { function heartbeat_config_default (line 8735) | async fn heartbeat_config_default() { function heartbeat_config_parses_delivery_aliases (line 8745) | async fn heartbeat_config_parses_delivery_aliases() { function cron_config_default (line 8762) | async fn cron_config_default() { function cron_config_serde_roundtrip (line 8769) | async fn cron_config_serde_roundtrip() { function config_defaults_cron_when_section_missing (line 8783) | async fn config_defaults_cron_when_section_missing() { function memory_config_default_hygiene_settings (line 8797) | async fn memory_config_default_hygiene_settings() { function storage_provider_config_defaults (line 8809) | async fn storage_provider_config_defaults() { function channels_config_default (line 8819) | async fn channels_config_default() { function config_toml_roundtrip (line 8830) | async fn config_toml_roundtrip() { function config_minimal_toml_uses_defaults (line 8999) | async fn config_minimal_toml_uses_defaults() { function provider_timeout_secs_parses_from_toml (line 9023) | async fn provider_timeout_secs_parses_from_toml() { function parse_extra_headers_env_basic (line 9033) | async fn parse_extra_headers_env_basic() { function parse_extra_headers_env_with_url_value (line 9044) | async fn parse_extra_headers_env_with_url_value() { function parse_extra_headers_env_empty_string (line 9054) | async fn parse_extra_headers_env_empty_string() { function parse_extra_headers_env_whitespace_trimming (line 9060) | async fn parse_extra_headers_env_whitespace_trimming() { function parse_extra_headers_env_skips_malformed (line 9071) | async fn parse_extra_headers_env_skips_malformed() { function parse_extra_headers_env_skips_empty_key (line 9079) | async fn parse_extra_headers_env_skips_empty_key() { function parse_extra_headers_env_allows_empty_value (line 9086) | async fn parse_extra_headers_env_allows_empty_value() { function parse_extra_headers_env_trailing_comma (line 9093) | async fn parse_extra_headers_env_trailing_comma() { function extra_headers_parses_from_toml (line 9100) | async fn extra_headers_parses_from_toml() { function extra_headers_defaults_to_empty (line 9115) | async fn extra_headers_defaults_to_empty() { function storage_provider_dburl_alias_deserializes (line 9124) | async fn storage_provider_dburl_alias_deserializes() { function runtime_reasoning_enabled_deserializes (line 9151) | async fn runtime_reasoning_enabled_deserializes() { function runtime_reasoning_effort_deserializes (line 9164) | async fn runtime_reasoning_effort_deserializes() { function runtime_reasoning_effort_rejects_invalid_values (line 9177) | async fn runtime_reasoning_effort_rejects_invalid_values() { function agent_config_defaults (line 9190) | async fn agent_config_defaults() { function agent_config_deserializes (line 9200) | async fn agent_config_deserializes() { function sync_directory_handles_existing_directory (line 9219) | async fn sync_directory_handles_existing_directory() { function config_save_and_load_tmpdir (line 9232) | async fn config_save_and_load_tmpdir() { function config_save_encrypts_nested_credentials (line 9327) | async fn config_save_encrypts_nested_credentials() { function config_save_atomic_cleanup (line 9450) | async fn config_save_atomic_cleanup() { function telegram_config_serde (line 9482) | async fn telegram_config_serde() { function telegram_config_defaults_stream_off (line 9502) | async fn telegram_config_defaults_stream_off() { function discord_config_serde (line 9511) | async fn discord_config_serde() { function discord_config_optional_guild (line 9527) | async fn discord_config_optional_guild() { function imessage_config_serde (line 9544) | async fn imessage_config_serde() { function imessage_config_empty_contacts (line 9555) | async fn imessage_config_empty_contacts() { function imessage_config_wildcard (line 9565) | async fn imessage_config_wildcard() { function matrix_config_serde (line 9575) | async fn matrix_config_serde() { function matrix_config_toml_roundtrip (line 9595) | async fn matrix_config_toml_roundtrip() { function matrix_config_backward_compatible_without_session_hints (line 9611) | async fn matrix_config_backward_compatible_without_session_hints() { function signal_config_serde (line 9626) | async fn signal_config_serde() { function signal_config_toml_roundtrip (line 9646) | async fn signal_config_toml_roundtrip() { function signal_config_defaults (line 9664) | async fn signal_config_defaults() { function channels_config_with_imessage_and_matrix (line 9674) | async fn channels_config_with_imessage_and_matrix() { function channels_config_default_has_no_imessage_matrix (line 9727) | async fn channels_config_default_has_no_imessage_matrix() { function discord_config_deserializes_without_allowed_users (line 9736) | async fn discord_config_deserializes_without_allowed_users() { function discord_config_deserializes_with_allowed_users (line 9744) | async fn discord_config_deserializes_with_allowed_users() { function slack_config_deserializes_without_allowed_users (line 9751) | async fn slack_config_deserializes_without_allowed_users() { function slack_config_deserializes_with_allowed_users (line 9761) | async fn slack_config_deserializes_with_allowed_users() { function slack_config_deserializes_with_mention_only (line 9771) | async fn slack_config_deserializes_with_mention_only() { function slack_config_deserializes_interrupt_on_new_message (line 9780) | async fn slack_config_deserializes_interrupt_on_new_message() { function slack_config_deserializes_thread_replies (line 9789) | async fn slack_config_deserializes_thread_replies() { function discord_config_default_interrupt_on_new_message_is_false (line 9798) | async fn discord_config_default_interrupt_on_new_message_is_false() { function discord_config_deserializes_interrupt_on_new_message_true (line 9805) | async fn discord_config_deserializes_interrupt_on_new_message_true() { function discord_config_toml_backward_compat (line 9812) | async fn discord_config_toml_backward_compat() { function slack_config_toml_backward_compat (line 9823) | async fn slack_config_toml_backward_compat() { function mattermost_config_default_interrupt_on_new_message_is_false (line 9837) | async fn mattermost_config_default_interrupt_on_new_message_is_false() { function mattermost_config_deserializes_interrupt_on_new_message_true (line 9844) | async fn mattermost_config_deserializes_interrupt_on_new_message_true() { function webhook_config_with_secret (line 9852) | async fn webhook_config_with_secret() { function webhook_config_without_secret (line 9859) | async fn webhook_config_without_secret() { function whatsapp_config_serde (line 9869) | async fn whatsapp_config_serde() { function whatsapp_config_toml_roundtrip (line 9889) | async fn whatsapp_config_toml_roundtrip() { function whatsapp_config_deserializes_without_allowed_numbers (line 9907) | async fn whatsapp_config_deserializes_without_allowed_numbers() { function whatsapp_config_wildcard_allowed (line 9914) | async fn whatsapp_config_wildcard_allowed() { function whatsapp_config_backend_type_cloud_precedence_when_ambiguous (line 9931) | async fn whatsapp_config_backend_type_cloud_precedence_when_ambiguous() { function whatsapp_config_backend_type_web (line 9947) | async fn whatsapp_config_backend_type_web() { function channels_config_with_whatsapp (line 9963) | async fn channels_config_with_whatsapp() { function channels_config_default_has_no_whatsapp (line 10016) | async fn channels_config_default_has_no_whatsapp() { function channels_config_default_has_no_nextcloud_talk (line 10022) | async fn channels_config_default_has_no_nextcloud_talk() { function checklist_gateway_default_requires_pairing (line 10032) | async fn checklist_gateway_default_requires_pairing() { function checklist_gateway_default_blocks_public_bind (line 10038) | async fn checklist_gateway_default_blocks_public_bind() { function checklist_gateway_default_no_tokens (line 10047) | async fn checklist_gateway_default_no_tokens() { function checklist_gateway_cli_default_host_is_localhost (line 10062) | async fn checklist_gateway_cli_default_host_is_localhost() { function checklist_gateway_serde_roundtrip (line 10077) | async fn checklist_gateway_serde_roundtrip() { function checklist_gateway_backward_compat_no_gateway_section (line 10110) | async fn checklist_gateway_backward_compat_no_gateway_section() { function checklist_autonomy_default_is_workspace_scoped (line 10129) | async fn checklist_autonomy_default_is_workspace_scoped() { function composio_config_default_disabled (line 10151) | async fn composio_config_default_disabled() { function composio_config_serde_roundtrip (line 10159) | async fn composio_config_serde_roundtrip() { function composio_config_backward_compat_missing_section (line 10173) | async fn composio_config_backward_compat_missing_section() { function composio_config_partial_toml (line 10188) | async fn composio_config_partial_toml() { function composio_config_enable_alias_supported (line 10199) | async fn composio_config_enable_alias_supported() { function secrets_config_default_encrypts (line 10214) | async fn secrets_config_default_encrypts() { function secrets_config_serde_roundtrip (line 10220) | async fn secrets_config_serde_roundtrip() { function secrets_config_backward_compat_missing_section (line 10228) | async fn secrets_config_backward_compat_missing_section() { function config_default_has_composio_and_secrets (line 10242) | async fn config_default_has_composio_and_secrets() { function browser_config_default_disabled (line 10252) | async fn browser_config_default_disabled() { function browser_config_serde_roundtrip (line 10269) | async fn browser_config_serde_roundtrip() { function browser_config_backward_compat_missing_section (line 10313) | async fn browser_config_backward_compat_missing_section() { function env_override_lock (line 10326) | async fn env_override_lock() -> MutexGuard<'static, ()> { function clear_proxy_env_test_vars (line 10331) | fn clear_proxy_env_test_vars() { function env_override_api_key (line 10354) | async fn env_override_api_key() { function env_override_api_key_fallback (line 10367) | async fn env_override_api_key_fallback() { function env_override_provider (line 10380) | async fn env_override_provider() { function env_override_model_provider_alias (line 10392) | async fn env_override_model_provider_alias() { function toml_supports_model_provider_and_model_alias_fields (line 10405) | async fn toml_supports_model_provider_and_model_alias_fields() { function env_override_open_skills_enabled_and_dir (line 10430) | async fn env_override_open_skills_enabled_and_dir() { function env_override_open_skills_enabled_invalid_value_keeps_existing_value (line 10464) | async fn env_override_open_skills_enabled_invalid_value_keeps_existing_v... function env_override_provider_fallback (line 10488) | async fn env_override_provider_fallback() { function env_override_provider_fallback_does_not_replace_non_default_provider (line 10501) | async fn env_override_provider_fallback_does_not_replace_non_default_pro... function env_override_zero_claw_provider_overrides_non_default_provider (line 10520) | async fn env_override_zero_claw_provider_overrides_non_default_provider() { function env_override_glm_api_key_for_regional_aliases (line 10537) | async fn env_override_glm_api_key_for_regional_aliases() { function env_override_zai_api_key_for_regional_aliases (line 10552) | async fn env_override_zai_api_key_for_regional_aliases() { function env_override_model (line 10567) | async fn env_override_model() { function model_provider_profile_maps_to_custom_endpoint (line 10579) | async fn model_provider_profile_maps_to_custom_endpoint() { function model_provider_profile_responses_uses_openai_codex_and_openai_key (line 10611) | async fn model_provider_profile_responses_uses_openai_codex_and_openai_k... function save_repairs_bare_config_filename_using_runtime_resolution (line 10642) | async fn save_repairs_bare_config_filename_using_runtime_resolution() { function validate_ollama_cloud_model_requires_remote_api_url (line 10676) | async fn validate_ollama_cloud_model_requires_remote_api_url() { function validate_ollama_cloud_model_accepts_remote_endpoint_and_env_key (line 10693) | async fn validate_ollama_cloud_model_accepts_remote_endpoint_and_env_key... function validate_rejects_unknown_model_provider_wire_api (line 10711) | async fn validate_rejects_unknown_model_provider_wire_api() { function env_override_model_fallback (line 10738) | async fn env_override_model_fallback() { function env_override_workspace (line 10754) | async fn env_override_workspace() { function resolve_runtime_config_dirs_uses_env_workspace_first (line 10766) | async fn resolve_runtime_config_dirs_uses_env_workspace_first() { function resolve_runtime_config_dirs_uses_env_config_dir_first (line 10787) | async fn resolve_runtime_config_dirs_uses_env_config_dir_first() { function resolve_runtime_config_dirs_uses_active_workspace_marker (line 10823) | async fn resolve_runtime_config_dirs_uses_active_workspace_marker() { function resolve_runtime_config_dirs_falls_back_to_default_layout (line 10852) | async fn resolve_runtime_config_dirs_falls_back_to_default_layout() { function load_or_init_workspace_override_uses_workspace_root_for_config (line 10871) | async fn load_or_init_workspace_override_uses_workspace_root_for_config() { function load_or_init_workspace_suffix_uses_legacy_config_layout (line 10897) | async fn load_or_init_workspace_suffix_uses_legacy_config_layout() { function load_or_init_workspace_override_keeps_existing_legacy_config (line 10924) | async fn load_or_init_workspace_override_keeps_existing_legacy_config() { function load_or_init_decrypts_feishu_channel_secrets (line 10962) | async fn load_or_init_decrypts_feishu_channel_secrets() { function load_or_init_uses_persisted_active_workspace_marker (line 11005) | async fn load_or_init_uses_persisted_active_workspace_marker() { function load_or_init_env_workspace_override_takes_priority_over_marker (line 11042) | async fn load_or_init_env_workspace_override_takes_priority_over_marker() { function persist_active_workspace_marker_is_cleared_for_default_config_dir (line 11079) | async fn persist_active_workspace_marker_is_cleared_for_default_config_d... function load_or_init_logs_existing_config_as_initialized (line 11110) | async fn load_or_init_logs_existing_config_as_initialized() { function env_override_empty_values_ignored (line 11163) | async fn env_override_empty_values_ignored() { function env_override_gateway_port (line 11176) | async fn env_override_gateway_port() { function env_override_port_fallback (line 11189) | async fn env_override_port_fallback() { function env_override_gateway_host (line 11202) | async fn env_override_gateway_host() { function env_override_host_fallback (line 11215) | async fn env_override_host_fallback() { function env_override_temperature (line 11228) | async fn env_override_temperature() { function env_override_temperature_out_of_range_ignored (line 11240) | async fn env_override_temperature_out_of_range_ignored() { function env_override_reasoning_enabled (line 11260) | async fn env_override_reasoning_enabled() { function env_override_reasoning_invalid_value_ignored (line 11277) | async fn env_override_reasoning_invalid_value_ignored() { function env_override_reasoning_effort (line 11290) | async fn env_override_reasoning_effort() { function env_override_reasoning_effort_legacy_codex_env (line 11303) | async fn env_override_reasoning_effort_legacy_codex_env() { function env_override_invalid_port_ignored (line 11315) | async fn env_override_invalid_port_ignored() { function env_override_web_search_config (line 11328) | async fn env_override_web_search_config() { function env_override_web_search_invalid_values_ignored (line 11357) | async fn env_override_web_search_invalid_values_ignored() { function env_override_storage_provider_config (line 11376) | async fn env_override_storage_provider_config() { function proxy_config_scope_services_requires_entries_when_enabled (line 11402) | async fn proxy_config_scope_services_requires_entries_when_enabled() { function env_override_proxy_scope_services (line 11418) | async fn env_override_proxy_scope_services() { function env_override_proxy_scope_environment_applies_process_env (line 11447) | async fn env_override_proxy_scope_environment_applies_process_env() { function runtime_proxy_cache_contains (line 11476) | fn runtime_proxy_cache_contains(cache_key: &str) -> bool { function runtime_proxy_client_cache_reuses_default_profile_key (line 11484) | async fn runtime_proxy_client_cache_reuses_default_profile_key() { function set_runtime_proxy_config_clears_runtime_proxy_client_cache (line 11505) | async fn set_runtime_proxy_config_clears_runtime_proxy_client_cache() { function gateway_config_default_values (line 11524) | async fn gateway_config_default_values() { function peripherals_config_default_disabled (line 11539) | async fn peripherals_config_default_disabled() { function peripheral_board_config_defaults (line 11546) | async fn peripheral_board_config_defaults() { function peripherals_config_toml_roundtrip (line 11555) | async fn peripherals_config_toml_roundtrip() { function lark_config_serde (line 11575) | async fn lark_config_serde() { function lark_config_toml_roundtrip (line 11598) | async fn lark_config_toml_roundtrip() { function lark_config_deserializes_without_optional_fields (line 11618) | async fn lark_config_deserializes_without_optional_fields() { function lark_config_defaults_to_lark_endpoint (line 11629) | async fn lark_config_defaults_to_lark_endpoint() { function lark_config_with_wildcard_allowed_users (line 11639) | async fn lark_config_with_wildcard_allowed_users() { function feishu_config_serde (line 11646) | async fn feishu_config_serde() { function feishu_config_toml_roundtrip (line 11666) | async fn feishu_config_toml_roundtrip() { function feishu_config_deserializes_without_optional_fields (line 11685) | async fn feishu_config_deserializes_without_optional_fields() { function nextcloud_talk_config_serde (line 11696) | async fn nextcloud_talk_config_serde() { function nextcloud_talk_config_defaults_optional_fields (line 11713) | async fn nextcloud_talk_config_defaults_optional_fields() { function new_config_file_has_restricted_permissions (line 11724) | async fn new_config_file_has_restricted_permissions() { function save_restricts_existing_world_readable_config_to_owner_only (line 11743) | async fn save_restricts_existing_world_readable_config_to_owner_only() { function world_readable_config_is_detectable (line 11779) | async fn world_readable_config_is_detectable() { function transcription_config_defaults (line 11798) | async fn transcription_config_defaults() { function config_roundtrip_with_transcription (line 11808) | async fn config_roundtrip_with_transcription() { function config_without_transcription_uses_defaults (line 11822) | async fn config_without_transcription_uses_defaults() { function security_defaults_are_backward_compatible (line 11834) | async fn security_defaults_are_backward_compatible() { function security_toml_parses_otp_and_estop_sections (line 11850) | async fn security_toml_parses_otp_and_estop_sections() { function security_validation_rejects_invalid_domain_glob (line 11881) | async fn security_validation_rejects_invalid_domain_glob() { function channel_secret_telegram_bot_token_roundtrip (line 11890) | async fn channel_secret_telegram_bot_token_roundtrip() { function security_validation_rejects_unknown_domain_category (line 11958) | async fn security_validation_rejects_unknown_domain_category() { function security_validation_rejects_zero_token_ttl (line 11969) | async fn security_validation_rejects_zero_token_ttl() { function stdio_server (line 11981) | fn stdio_server(name: &str, command: &str) -> McpServerConfig { function http_server (line 11990) | fn http_server(name: &str, url: &str) -> McpServerConfig { function sse_server (line 11999) | fn sse_server(name: &str, url: &str) -> McpServerConfig { function validate_mcp_config_empty_servers_ok (line 12009) | async fn validate_mcp_config_empty_servers_ok() { function validate_mcp_config_valid_stdio_ok (line 12015) | async fn validate_mcp_config_valid_stdio_ok() { function validate_mcp_config_valid_http_ok (line 12025) | async fn validate_mcp_config_valid_http_ok() { function validate_mcp_config_valid_sse_ok (line 12035) | async fn validate_mcp_config_valid_sse_ok() { function validate_mcp_config_rejects_empty_name (line 12045) | async fn validate_mcp_config_rejects_empty_name() { function validate_mcp_config_rejects_whitespace_name (line 12059) | async fn validate_mcp_config_rejects_whitespace_name() { function validate_mcp_config_rejects_duplicate_names (line 12073) | async fn validate_mcp_config_rejects_duplicate_names() { function validate_mcp_config_rejects_zero_timeout (line 12087) | async fn validate_mcp_config_rejects_zero_timeout() { function validate_mcp_config_rejects_timeout_exceeding_max (line 12100) | async fn validate_mcp_config_rejects_timeout_exceeding_max() { function validate_mcp_config_allows_max_timeout_exactly (line 12113) | async fn validate_mcp_config_allows_max_timeout_exactly() { function validate_mcp_config_rejects_stdio_with_empty_command (line 12125) | async fn validate_mcp_config_rejects_stdio_with_empty_command() { function validate_mcp_config_rejects_http_without_url (line 12139) | async fn validate_mcp_config_rejects_http_without_url() { function validate_mcp_config_rejects_sse_without_url (line 12155) | async fn validate_mcp_config_rejects_sse_without_url() { function validate_mcp_config_rejects_non_http_scheme (line 12171) | async fn validate_mcp_config_rejects_non_http_scheme() { function validate_mcp_config_rejects_invalid_url (line 12182) | async fn validate_mcp_config_rejects_invalid_url() { function mcp_config_default_disabled_with_empty_servers (line 12193) | async fn mcp_config_default_disabled_with_empty_servers() { function mcp_transport_serde_roundtrip_lowercase (line 12200) | async fn mcp_transport_serde_roundtrip_lowercase() { function swarm_strategy_roundtrip (line 12216) | async fn swarm_strategy_roundtrip() { function swarm_config_deserializes_with_defaults (line 12232) | async fn swarm_config_deserializes_with_defaults() { function swarm_config_deserializes_full (line 12246) | async fn swarm_config_deserializes_full() { function config_with_swarms_section_deserializes (line 12263) | async fn config_with_swarms_section_deserializes() { function nevis_client_secret_encrypt_decrypt_roundtrip (line 12284) | async fn nevis_client_secret_encrypt_decrypt_roundtrip() { function nevis_config_validate_disabled_accepts_empty_fields (line 12346) | async fn nevis_config_validate_disabled_accepts_empty_fields() { function nevis_config_validate_rejects_empty_instance_url (line 12353) | async fn nevis_config_validate_rejects_empty_instance_url() { function nevis_config_validate_rejects_empty_client_id (line 12365) | async fn nevis_config_validate_rejects_empty_client_id() { function nevis_config_validate_rejects_empty_realm (line 12377) | async fn nevis_config_validate_rejects_empty_realm() { function nevis_config_validate_rejects_local_without_jwks (line 12390) | async fn nevis_config_validate_rejects_local_without_jwks() { function nevis_config_validate_rejects_zero_session_timeout (line 12404) | async fn nevis_config_validate_rejects_zero_session_timeout() { function nevis_config_validate_accepts_valid_enabled_config (line 12418) | async fn nevis_config_validate_accepts_valid_enabled_config() { function nevis_config_validate_rejects_invalid_token_validation (line 12432) | async fn nevis_config_validate_rejects_invalid_token_validation() { function nevis_config_debug_redacts_client_secret (line 12450) | async fn nevis_config_debug_redacts_client_secret() { function telegram_config_ack_reactions_false_deserializes (line 12467) | async fn telegram_config_ack_reactions_false_deserializes() { function telegram_config_ack_reactions_true_deserializes (line 12478) | async fn telegram_config_ack_reactions_true_deserializes() { function telegram_config_ack_reactions_missing_defaults_to_none (line 12489) | async fn telegram_config_ack_reactions_missing_defaults_to_none() { function telegram_config_ack_reactions_channel_overrides_top_level (line 12499) | async fn telegram_config_ack_reactions_channel_overrides_top_level() { function telegram_config_ack_reactions_falls_back_to_top_level (line 12515) | async fn telegram_config_ack_reactions_falls_back_to_top_level() { function ensure_bootstrap_files_creates_missing_files (line 12532) | async fn ensure_bootstrap_files_creates_missing_files() { function ensure_bootstrap_files_does_not_overwrite_existing (line 12548) | async fn ensure_bootstrap_files_does_not_overwrite_existing() { FILE: src/config/traits.rs type ChannelConfig (line 2) | pub trait ChannelConfig { method name (line 4) | fn name() -> &'static str; method desc (line 6) | fn desc() -> &'static str; type ConfigHandle (line 11) | pub trait ConfigHandle { method name (line 12) | fn name(&self) -> &'static str; method desc (line 13) | fn desc(&self) -> &'static str; FILE: src/config/workspace.rs type WorkspaceProfile (line 14) | pub struct WorkspaceProfile { method effective_memory_namespace (line 36) | pub fn effective_memory_namespace(&self) -> &str { method effective_audit_namespace (line 43) | pub fn effective_audit_namespace(&self) -> &str { method is_tool_restricted (line 50) | pub fn is_tool_restricted(&self, tool_name: &str) -> bool { method is_domain_allowed (line 58) | pub fn is_domain_allowed(&self, domain: &str) -> bool { type WorkspaceManager (line 71) | pub struct WorkspaceManager { method new (line 82) | pub fn new(workspaces_dir: PathBuf) -> Self { method load_profiles (line 94) | pub async fn load_profiles(&mut self) -> Result<()> { method switch (line 140) | pub fn switch(&mut self, name: &str) -> Result<&WorkspaceProfile> { method active_profile (line 149) | pub fn active_profile(&self) -> Option<&WorkspaceProfile> { method active_name (line 156) | pub fn active_name(&self) -> Option<&str> { method list (line 161) | pub fn list(&self) -> Vec<&str> { method get (line 168) | pub fn get(&self, name: &str) -> Option<&WorkspaceProfile> { method create (line 173) | pub async fn create(&mut self, name: &str) -> Result<&WorkspaceProfile> { method export (line 215) | pub fn export(&self, name: &str) -> Result { method workspace_dir (line 234) | pub fn workspace_dir(&self, name: &str) -> PathBuf { method workspaces_dir (line 239) | pub fn workspaces_dir(&self) -> &Path { function sample_profile (line 249) | fn sample_profile(name: &str) -> WorkspaceProfile { function workspace_profile_tool_restriction_check (line 261) | fn workspace_profile_tool_restriction_check() { function workspace_profile_domain_allowlist_empty_allows_all (line 269) | fn workspace_profile_domain_allowlist_empty_allows_all() { function workspace_profile_domain_allowlist_enforced (line 276) | fn workspace_profile_domain_allowlist_enforced() { function workspace_profile_effective_namespaces (line 283) | fn workspace_profile_effective_namespaces() { function workspace_manager_create_and_list (line 299) | async fn workspace_manager_create_and_list() { function workspace_manager_create_rejects_duplicate (line 311) | async fn workspace_manager_create_rejects_duplicate() { function workspace_manager_create_rejects_invalid_name (line 321) | async fn workspace_manager_create_rejects_invalid_name() { function workspace_manager_switch_and_active (line 331) | async fn workspace_manager_switch_and_active() { function workspace_manager_switch_nonexistent_fails (line 344) | fn workspace_manager_switch_nonexistent_fails() { function workspace_manager_load_profiles_from_disk (line 351) | async fn workspace_manager_load_profiles_from_disk() { function workspace_manager_export_redacts_credentials (line 368) | async fn workspace_manager_export_redacts_credentials() { FILE: src/cost/tracker.rs type CostTracker (line 13) | pub struct CostTracker { method new (line 22) | pub fn new(config: CostConfig, workspace_dir: &Path) -> Result { method session_id (line 38) | pub fn session_id(&self) -> &str { method lock_storage (line 42) | fn lock_storage(&self) -> MutexGuard<'_, CostStorage> { method lock_session_costs (line 46) | fn lock_session_costs(&self) -> MutexGuard<'_, Vec> { method check_budget (line 51) | pub fn check_budget(&self, estimated_cost_usd: f64) -> Result Result<()> { method get_summary (line 137) | pub fn get_summary(&self) -> Result { method get_daily_cost (line 166) | pub fn get_daily_cost(&self, date: NaiveDate) -> Result { method get_monthly_cost (line 172) | pub fn get_monthly_cost(&self, year: i32, month: u32) -> Result { function resolve_storage_path (line 178) | fn resolve_storage_path(workspace_dir: &Path) -> Result { function build_session_model_stats (line 207) | fn build_session_model_stats(session_costs: &[CostRecord]) -> HashMap Result { method for_each_record (line 265) | fn for_each_record(&self, mut on_record: F) -> Result<()> method rebuild_aggregates (line 306) | fn rebuild_aggregates(&mut self, day: NaiveDate, year: i32, month: u32... method ensure_period_cache_current (line 331) | fn ensure_period_cache_current(&mut self) -> Result<()> { method add_record (line 345) | fn add_record(&mut self, record: CostRecord) -> Result<()> { method get_aggregated_costs (line 371) | fn get_aggregated_costs(&mut self) -> Result<(f64, f64)> { method get_cost_for_date (line 377) | fn get_cost_for_date(&self, date: NaiveDate) -> Result { method get_cost_for_month (line 390) | fn get_cost_for_month(&self, year: i32, month: u32) -> Result { function enabled_config (line 409) | fn enabled_config() -> CostConfig { function cost_tracker_initialization (line 417) | fn cost_tracker_initialization() { function budget_check_when_disabled (line 424) | fn budget_check_when_disabled() { function record_usage_and_get_summary (line 437) | fn record_usage_and_get_summary() { function budget_exceeded_daily_limit (line 451) | fn budget_exceeded_daily_limit() { function summary_by_model_is_session_scoped (line 470) | fn summary_by_model_is_session_scoped() { function malformed_lines_are_ignored_while_loading (line 501) | fn malformed_lines_are_ignored_while_loading() { function invalid_budget_estimate_is_rejected (line 527) | fn invalid_budget_estimate_is_rejected() { FILE: src/cost/types.rs type TokenUsage (line 5) | pub struct TokenUsage { method sanitize_price (line 21) | fn sanitize_price(value: f64) -> f64 { method new (line 30) | pub fn new( method cost (line 58) | pub fn cost(&self) -> f64 { type UsagePeriod (line 65) | pub enum UsagePeriod { type CostRecord (line 73) | pub struct CostRecord { method new (line 84) | pub fn new(session_id: impl Into, usage: TokenUsage) -> Self { type BudgetCheck (line 95) | pub enum BudgetCheck { type CostSummary (line 114) | pub struct CostSummary { type ModelStats (line 131) | pub struct ModelStats { method default (line 143) | fn default() -> Self { function token_usage_calculation (line 160) | fn token_usage_calculation() { function token_usage_zero_tokens (line 171) | fn token_usage_zero_tokens() { function token_usage_negative_or_non_finite_prices_are_clamped (line 178) | fn token_usage_negative_or_non_finite_prices_are_clamped() { function cost_record_creation (line 185) | fn cost_record_creation() { FILE: src/cron/mod.rs function validate_shell_command (line 29) | pub fn validate_shell_command(config: &Config, command: &str, approved: ... function validate_shell_command_with_security (line 37) | pub(crate) fn validate_shell_command_with_security( function add_shell_job_with_approval (line 52) | pub fn add_shell_job_with_approval( function update_shell_job_with_approval (line 66) | pub fn update_shell_job_with_approval( function add_once_validated (line 79) | pub fn add_once_validated( function add_once_at_validated (line 91) | pub fn add_once_at_validated( function add_shell_job (line 103) | pub(crate) fn add_shell_job( function add_job (line 112) | pub(crate) fn add_job(config: &Config, expression: &str, command: &str) ... function handle_command (line 121) | pub fn handle_command(command: crate::CronCommands, config: &Config) -> ... function add_once (line 405) | pub(crate) fn add_once(config: &Config, delay: &str, command: &str) -> R... function add_once_at (line 409) | pub(crate) fn add_once_at( function pause_job (line 417) | pub fn pause_job(config: &Config, id: &str) -> Result { function resume_job (line 428) | pub fn resume_job(config: &Config, id: &str) -> Result { function parse_delay (line 439) | fn parse_delay(input: &str) -> Result { function test_config (line 465) | fn test_config(tmp: &TempDir) -> Config { function make_job (line 475) | fn make_job(config: &Config, expr: &str, tz: Option<&str>, cmd: &str) ->... function run_update (line 488) | fn run_update( function update_changes_command_via_handler (line 510) | fn update_changes_command_via_handler() { function update_changes_expression_via_handler (line 523) | fn update_changes_expression_via_handler() { function update_changes_name_via_handler (line 535) | fn update_changes_name_via_handler() { function update_tz_alone_sets_timezone (line 547) | fn update_tz_alone_sets_timezone() { function update_expression_preserves_existing_tz (line 573) | fn update_expression_preserves_existing_tz() { function update_preserves_unchanged_fields (line 596) | fn update_preserves_unchanged_fields() { function update_no_flags_fails (line 619) | fn update_no_flags_fails() { function update_nonexistent_job_fails (line 630) | fn update_nonexistent_job_fails() { function update_security_allows_safe_command (line 646) | fn update_security_allows_safe_command() { function add_shell_job_requires_explicit_approval_for_medium_risk (line 655) | fn add_shell_job_requires_explicit_approval_for_medium_risk() { function update_requires_explicit_approval_for_medium_risk (line 689) | fn update_requires_explicit_approval_for_medium_risk() { function cli_update_requires_explicit_approval_for_medium_risk (line 724) | fn cli_update_requires_explicit_approval_for_medium_risk() { function add_once_validated_creates_one_shot_job (line 746) | fn add_once_validated_creates_one_shot_job() { function add_once_validated_blocks_disallowed_command (line 756) | fn add_once_validated_blocks_disallowed_command() { function add_once_at_validated_creates_one_shot_job (line 771) | fn add_once_at_validated_creates_one_shot_job() { function add_once_at_validated_blocks_medium_risk_without_approval (line 782) | fn add_once_at_validated_blocks_medium_risk_without_approval() { function gateway_api_path_validates_shell_command (line 800) | fn gateway_api_path_validates_shell_command() { function scheduler_path_validates_shell_command (line 825) | fn scheduler_path_validates_shell_command() { function cli_agent_flag_creates_agent_job (line 843) | fn cli_agent_flag_creates_agent_job() { function cli_agent_flag_bypasses_shell_security_validation (line 869) | fn cli_agent_flag_bypasses_shell_security_validation() { function cli_agent_allowed_tools_persist (line 896) | fn cli_agent_allowed_tools_persist() { function cli_update_agent_allowed_tools_persist (line 921) | fn cli_update_agent_allowed_tools_persist() { function cli_without_agent_flag_defaults_to_shell_job (line 958) | fn cli_without_agent_flag_defaults_to_shell_job() { FILE: src/cron/schedule.rs function next_run_for_schedule (line 7) | pub fn next_run_for_schedule(schedule: &Schedule, from: DateTime) -... function validate_schedule (line 41) | pub fn validate_schedule(schedule: &Schedule, now: DateTime) -> Res... function schedule_cron_expression (line 63) | pub fn schedule_cron_expression(schedule: &Schedule) -> Option { function normalize_expression (line 70) | pub fn normalize_expression(expression: &str) -> Result { function next_run_for_schedule_supports_every_and_at (line 91) | fn next_run_for_schedule_supports_every_and_at() { function next_run_for_schedule_supports_timezone (line 104) | fn next_run_for_schedule_supports_timezone() { FILE: src/cron/scheduler.rs constant MIN_POLL_SECONDS (line 22) | const MIN_POLL_SECONDS: u64 = 5; constant SHELL_JOB_TIMEOUT_SECS (line 23) | const SHELL_JOB_TIMEOUT_SECS: u64 = 120; constant SCHEDULER_COMPONENT (line 24) | const SCHEDULER_COMPONENT: &str = "scheduler"; function run (line 26) | pub async fn run(config: Config) -> Result<()> { function catch_up_overdue_jobs (line 71) | async fn catch_up_overdue_jobs(config: &Config, security: &Arc (bool, S... function execute_job_with_retry (line 101) | async fn execute_job_with_retry( function process_due_jobs (line 136) | async fn process_due_jobs( function execute_and_persist_job (line 169) | async fn execute_and_persist_job( function run_agent_job (line 194) | async fn run_agent_job( function persist_job_result (line 254) | async fn persist_job_result( function is_one_shot_auto_delete (line 320) | fn is_one_shot_auto_delete(job: &CronJob) -> bool { function warn_if_high_frequency_agent_job (line 324) | fn warn_if_high_frequency_agent_job(job: &CronJob) { function resolve_matrix_delivery_room (line 351) | fn resolve_matrix_delivery_room(configured_room_id: &str, target: &str) ... function deliver_if_configured (line 360) | async fn deliver_if_configured(config: &Config, job: &CronJob, output: &... function deliver_announcement (line 378) | pub(crate) async fn deliver_announcement( function run_job_command (line 492) | async fn run_job_command( function run_job_command_with_timeout (line 506) | async fn run_job_command_with_timeout( function build_cron_shell_command (line 592) | fn build_cron_shell_command( function test_config (line 617) | async fn test_config(tmp: &TempDir) -> Config { function test_job (line 629) | fn test_job(command: &str) -> CronJob { function unique_component (line 655) | fn unique_component(prefix: &str) -> String { function run_job_command_success (line 660) | async fn run_job_command_success() { function run_job_command_failure (line 673) | async fn run_job_command_failure() { function run_job_command_times_out (line 686) | async fn run_job_command_times_out() { function run_job_command_blocks_disallowed_command (line 700) | async fn run_job_command_blocks_disallowed_command() { function run_job_command_blocks_forbidden_path_argument (line 714) | async fn run_job_command_blocks_forbidden_path_argument() { function run_job_command_blocks_forbidden_option_assignment_path_argument (line 729) | async fn run_job_command_blocks_forbidden_option_assignment_path_argumen... function run_job_command_blocks_forbidden_short_option_attached_path_argument (line 744) | async fn run_job_command_blocks_forbidden_short_option_attached_path_arg... function run_job_command_blocks_tilde_user_path_argument (line 759) | async fn run_job_command_blocks_tilde_user_path_argument() { function run_job_command_blocks_input_redirection_path_bypass (line 774) | async fn run_job_command_blocks_input_redirection_path_bypass() { function run_job_command_blocks_readonly_mode (line 788) | async fn run_job_command_blocks_readonly_mode() { function run_job_command_blocks_rate_limited (line 802) | async fn run_job_command_blocks_rate_limited() { function execute_job_with_retry_recovers_after_first_failure (line 816) | async fn execute_job_with_retry_recovers_after_first_failure() { function execute_job_with_retry_exhausts_attempts (line 838) | async fn execute_job_with_retry_exhausts_attempts() { function run_agent_job_returns_error_without_provider_key (line 853) | async fn run_agent_job_returns_error_without_provider_key() { function run_agent_job_blocks_readonly_mode (line 867) | async fn run_agent_job_blocks_readonly_mode() { function run_agent_job_blocks_rate_limited (line 883) | async fn run_agent_job_blocks_rate_limited() { function process_due_jobs_marks_component_ok_even_when_idle (line 899) | async fn process_due_jobs_marks_component_ok_even_when_idle() { function process_due_jobs_failure_does_not_mark_component_unhealthy (line 919) | async fn process_due_jobs_failure_does_not_mark_component_unhealthy() { function persist_job_result_records_run_and_reschedules_shell_job (line 938) | async fn persist_job_result_records_run_and_reschedules_shell_job() { function persist_job_result_success_deletes_one_shot (line 955) | async fn persist_job_result_success_deletes_one_shot() { function persist_job_result_failure_disables_one_shot (line 981) | async fn persist_job_result_failure_disables_one_shot() { function persist_job_result_success_deletes_one_shot_shell_job (line 1008) | async fn persist_job_result_success_deletes_one_shot_shell_job() { function persist_job_result_failure_disables_one_shot_shell_job (line 1024) | async fn persist_job_result_failure_disables_one_shot_shell_job() { function persist_job_result_delivery_failure_non_best_effort_marks_error (line 1041) | async fn persist_job_result_delivery_failure_non_best_effort_marks_error... function persist_job_result_delivery_failure_best_effort_keeps_success (line 1080) | async fn persist_job_result_delivery_failure_best_effort_keeps_success() { function persist_job_result_at_schedule_without_delete_after_run_is_disabled (line 1119) | async fn persist_job_result_at_schedule_without_delete_after_run_is_disa... function deliver_if_configured_handles_none_and_invalid_channel (line 1153) | async fn deliver_if_configured_handles_none_and_invalid_channel() { function resolve_matrix_delivery_room_prefers_target_when_present (line 1171) | fn resolve_matrix_delivery_room_prefers_target_when_present() { function resolve_matrix_delivery_room_falls_back_to_configured_room (line 1179) | fn resolve_matrix_delivery_room_falls_back_to_configured_room() { function deliver_if_configured_matrix_missing_config (line 1188) | async fn deliver_if_configured_matrix_missing_config() { function deliver_if_configured_matrix_feature_disabled (line 1207) | async fn deliver_if_configured_matrix_feature_disabled() { function build_cron_shell_command_uses_sh_non_login (line 1227) | fn build_cron_shell_command_uses_sh_non_login() { function build_cron_shell_command_executes_successfully (line 1242) | async fn build_cron_shell_command_executes_successfully() { function catch_up_queries_all_overdue_jobs_ignoring_max_tasks (line 1252) | async fn catch_up_queries_all_overdue_jobs_ignoring_max_tasks() { FILE: src/cron/store.rs constant MAX_CRON_OUTPUT_BYTES (line 12) | const MAX_CRON_OUTPUT_BYTES: usize = 16 * 1024; constant TRUNCATED_OUTPUT_MARKER (line 13) | const TRUNCATED_OUTPUT_MARKER: &str = "\n...[truncated]"; method column_result (line 16) | fn column_result(value: ValueRef<'_>) -> FromSqlResult { function add_job (line 22) | pub fn add_job(config: &Config, expression: &str, command: &str) -> Resu... function add_shell_job (line 30) | pub fn add_shell_job( function add_agent_job (line 71) | pub fn add_agent_job( function list_jobs (line 118) | pub fn list_jobs(config: &Config) -> Result> { function get_job (line 137) | pub fn get_job(config: &Config, job_id: &str) -> Result { function remove_job (line 155) | pub fn remove_job(config: &Config, id: &str) -> Result<()> { function due_jobs (line 169) | pub fn due_jobs(config: &Config, now: DateTime) -> Result) -> Result... function record_last_run (line 297) | pub fn record_last_run( function reschedule_after_run (line 318) | pub fn reschedule_after_run( function record_run (line 362) | pub fn record_run( function truncate_cron_output (line 412) | fn truncate_cron_output(output: &str) -> String { function list_runs (line 431) | pub fn list_runs(config: &Config, job_id: &str, limit: usize) -> Result<... function parse_rfc3339 (line 464) | fn parse_rfc3339(raw: &str) -> Result> { function sql_conversion_error (line 470) | fn sql_conversion_error(err: anyhow::Error) -> rusqlite::Error { function map_cron_job_row (line 474) | fn map_cron_job_row(row: &rusqlite::Row<'_>) -> rusqlite::Result { function decode_schedule (line 514) | fn decode_schedule(schedule_raw: Option<&str>, expression: &str) -> Resu... function decode_delivery (line 533) | fn decode_delivery(delivery_raw: Option<&str>) -> Result { function encode_allowed_tools (line 544) | fn encode_allowed_tools(allowed_tools: Option<&Vec>) -> Result) -> Result>> { function add_column_if_missing (line 563) | fn add_column_if_missing(conn: &Connection, name: &str, sql_type: &str) ... function with_connection (line 593) | fn with_connection(config: &Config, f: impl FnOnce(&Connection) -> Re... function test_config (line 664) | fn test_config(tmp: &TempDir) -> Config { function add_job_accepts_five_field_expression (line 675) | fn add_job_accepts_five_field_expression() { function add_shell_job_marks_at_schedule_for_auto_delete (line 686) | fn add_shell_job_marks_at_schedule_for_auto_delete() { function add_list_remove_roundtrip (line 712) | fn add_list_remove_roundtrip() { function due_jobs_filters_by_timestamp_and_enabled (line 726) | fn due_jobs_filters_by_timestamp_and_enabled() { function due_jobs_respects_scheduler_max_tasks_limit (line 753) | fn due_jobs_respects_scheduler_max_tasks_limit() { function all_overdue_jobs_ignores_max_tasks_limit (line 768) | fn all_overdue_jobs_ignores_max_tasks_limit() { function all_overdue_jobs_excludes_disabled_jobs (line 787) | fn all_overdue_jobs_excludes_disabled_jobs() { function add_agent_job_persists_allowed_tools (line 808) | fn add_agent_job_persists_allowed_tools() { function update_job_persists_allowed_tools_patch (line 835) | fn update_job_persists_allowed_tools_patch() { function reschedule_after_run_persists_last_status_and_last_run (line 870) | fn reschedule_after_run_persists_last_status_and_last_run() { function job_type_from_sql_reads_valid_value (line 885) | fn job_type_from_sql_reads_valid_value() { function job_type_from_sql_rejects_invalid_value (line 913) | fn job_type_from_sql_rejects_invalid_value() { function migration_falls_back_to_legacy_expression (line 940) | fn migration_falls_back_to_legacy_expression() { function record_and_prune_runs (line 969) | fn record_and_prune_runs() { function remove_job_cascades_run_history (line 987) | fn remove_job_cascades_run_history() { function record_run_truncates_large_output (line 1009) | fn record_run_truncates_large_output() { function reschedule_after_run_disables_at_schedule_job (line 1033) | fn reschedule_after_run_disables_at_schedule_job() { function reschedule_after_run_disables_at_schedule_job_on_failure (line 1050) | fn reschedule_after_run_disables_at_schedule_job_on_failure() { function reschedule_after_run_truncates_last_output (line 1068) | fn reschedule_after_run_truncates_last_output() { FILE: src/cron/types.rs function deserialize_maybe_stringified (line 9) | pub fn deserialize_maybe_stringified( type JobType (line 32) | pub enum JobType { type Error (line 48) | type Error = String; method try_from (line 50) | fn try_from(value: &str) -> Result { function from (line 39) | fn from(value: JobType) -> Self { type SessionTarget (line 64) | pub enum SessionTarget { method as_str (line 71) | pub(crate) fn as_str(&self) -> &'static str { method parse (line 78) | pub(crate) fn parse(raw: &str) -> Self { type Schedule (line 89) | pub enum Schedule { type DeliveryConfig (line 104) | pub struct DeliveryConfig { method default (line 116) | fn default() -> Self { function default_true (line 126) | fn default_true() -> bool { type CronJob (line 131) | pub struct CronJob { type CronRun (line 157) | pub struct CronRun { type CronJobPatch (line 168) | pub struct CronJobPatch { function deserialize_schedule_from_object (line 186) | fn deserialize_schedule_from_object() { function deserialize_schedule_from_string (line 193) | fn deserialize_schedule_from_string() { function deserialize_schedule_string_with_tz (line 200) | fn deserialize_schedule_string_with_tz() { function deserialize_every_from_string (line 212) | fn deserialize_every_from_string() { function deserialize_invalid_string_returns_error (line 219) | fn deserialize_invalid_string_returns_error() { function job_type_try_from_accepts_known_values_case_insensitive (line 225) | fn job_type_try_from_accepts_known_values_case_insensitive() { function job_type_try_from_rejects_invalid_values (line 233) | fn job_type_try_from_rejects_invalid_values() { FILE: src/daemon/mod.rs constant STATUS_FLUSH_SECONDS (line 9) | const STATUS_FLUSH_SECONDS: u64 = 5; function wait_for_shutdown_signal (line 13) | async fn wait_for_shutdown_signal() -> Result<()> { function run (line 48) | pub async fn run(config: Config, host: String, port: u16) -> Result<()> { function state_file_path (line 149) | pub fn state_file_path(config: &Config) -> PathBuf { function spawn_state_writer (line 157) | fn spawn_state_writer(config: Config) -> JoinHandle<()> { function spawn_component_supervisor (line 180) | fn spawn_component_supervisor( function run_heartbeat_worker (line 217) | async fn run_heartbeat_worker(config: Config) -> Result<()> { function resolve_heartbeat_delivery (line 472) | fn resolve_heartbeat_delivery(config: &Config) -> Result Option<(String, Str... function validate_heartbeat_channel_config (line 526) | fn validate_heartbeat_channel_config(config: &Config, channel: &str) -> ... function has_supervised_channels (line 562) | fn has_supervised_channels(config: &Config) -> bool { function test_config (line 575) | fn test_config(tmp: &TempDir) -> Config { function state_file_path_uses_config_directory (line 586) | fn state_file_path_uses_config_directory() { function supervisor_marks_error_and_restart_on_failure (line 595) | async fn supervisor_marks_error_and_restart_on_failure() { function supervisor_marks_unexpected_exit_as_error (line 615) | async fn supervisor_marks_unexpected_exit_as_error() { function detects_no_supervised_channels (line 633) | fn detects_no_supervised_channels() { function detects_supervised_channels_present (line 639) | fn detects_supervised_channels_present() { function detects_dingtalk_as_supervised_channel (line 654) | fn detects_dingtalk_as_supervised_channel() { function detects_mattermost_as_supervised_channel (line 665) | fn detects_mattermost_as_supervised_channel() { function detects_qq_as_supervised_channel (line 680) | fn detects_qq_as_supervised_channel() { function detects_nextcloud_talk_as_supervised_channel (line 691) | fn detects_nextcloud_talk_as_supervised_channel() { function resolve_delivery_none_when_unset (line 703) | fn resolve_delivery_none_when_unset() { function resolve_delivery_requires_to_field (line 710) | fn resolve_delivery_requires_to_field() { function resolve_delivery_requires_target_field (line 720) | fn resolve_delivery_requires_target_field() { function resolve_delivery_rejects_unsupported_channel (line 730) | fn resolve_delivery_rejects_unsupported_channel() { function resolve_delivery_requires_channel_configuration (line 741) | fn resolve_delivery_requires_channel_configuration() { function resolve_delivery_accepts_telegram_configuration (line 752) | fn resolve_delivery_accepts_telegram_configuration() { function auto_detect_telegram_when_configured (line 771) | fn auto_detect_telegram_when_configured() { function auto_detect_none_when_no_channels (line 791) | fn auto_detect_none_when_no_channels() { function sighup_does_not_shut_down_daemon (line 801) | async fn sighup_does_not_shut_down_daemon() { FILE: src/doctor/mod.rs constant DAEMON_STALE_SECONDS (line 7) | const DAEMON_STALE_SECONDS: i64 = 30; constant SCHEDULER_STALE_SECONDS (line 8) | const SCHEDULER_STALE_SECONDS: i64 = 120; constant CHANNEL_STALE_SECONDS (line 9) | const CHANNEL_STALE_SECONDS: i64 = 300; constant COMMAND_VERSION_PREVIEW_CHARS (line 10) | const COMMAND_VERSION_PREVIEW_CHARS: usize = 60; type Severity (line 16) | pub enum Severity { type DiagResult (line 24) | pub struct DiagResult { type DiagItem (line 30) | struct DiagItem { method ok (line 37) | fn ok(category: &'static str, msg: impl Into) -> Self { method warn (line 44) | fn warn(category: &'static str, msg: impl Into) -> Self { method error (line 51) | fn error(category: &'static str, msg: impl Into) -> Self { method icon (line 59) | fn icon(&self) -> &'static str { method into_result (line 67) | fn into_result(self) -> DiagResult { function diagnose (line 79) | pub fn diagnose(config: &Config) -> Vec { function run (line 92) | pub fn run(config: &Config) -> Result<()> { type ModelProbeOutcome (line 137) | enum ModelProbeOutcome { function model_probe_status_label (line 144) | fn model_probe_status_label(outcome: ModelProbeOutcome) -> &'static str { function classify_model_probe_error (line 153) | fn classify_model_probe_error(err_message: &str) -> ModelProbeOutcome { function doctor_model_targets (line 182) | fn doctor_model_targets(provider_override: Option<&str>) -> Vec { function run_models (line 193) | pub async fn run_models( function run_traces (line 335) | pub fn run_traces( function check_config_semantics (line 419) | fn check_config_semantics(config: &Config, items: &mut Vec) { function provider_validation_error (line 618) | fn provider_validation_error(name: &str) -> Option { function embedding_provider_validation_error (line 631) | fn embedding_provider_validation_error(name: &str) -> Option { function check_workspace (line 658) | fn check_workspace(config: &Config, items: &mut Vec) { function check_file_exists (line 722) | fn check_file_exists( function disk_available_mb (line 739) | fn disk_available_mb(path: &Path) -> Option { function parse_df_available_mb (line 752) | fn parse_df_available_mb(stdout: &str) -> Option { function workspace_probe_path (line 758) | fn workspace_probe_path(workspace_dir: &Path) -> std::path::PathBuf { function check_daemon_state (line 771) | fn check_daemon_state(config: &Config, items: &mut Vec) { function check_environment (line 905) | fn check_environment(items: &mut Vec) { function check_cli_tools (line 933) | fn check_cli_tools(items: &mut Vec) { function check_command_available (line 959) | fn check_command_available(cmd: &str, args: &[&str], cat: &'static str, ... function format_error_chain (line 984) | fn format_error_chain(error: &anyhow::Error) -> String { function truncate_for_display (line 1000) | fn truncate_for_display(input: &str, max_chars: usize) -> String { function parse_rfc3339 (line 1012) | fn parse_rfc3339(raw: &str) -> Option> { function provider_validation_checks_custom_url_shape (line 1024) | fn provider_validation_checks_custom_url_shape() { function diag_item_icons (line 1037) | fn diag_item_icons() { function classify_model_probe_error_marks_unsupported_as_skipped (line 1044) | fn classify_model_probe_error_marks_unsupported_as_skipped() { function classify_model_probe_error_marks_auth_and_plan_issues (line 1052) | fn classify_model_probe_error_marks_auth_and_plan_issues() { function config_validation_catches_bad_temperature (line 1063) | fn config_validation_catches_bad_temperature() { function config_validation_accepts_valid_temperature (line 1074) | fn config_validation_accepts_valid_temperature() { function config_validation_warns_no_channels (line 1085) | fn config_validation_warns_no_channels() { function config_validation_catches_unknown_provider (line 1095) | fn config_validation_catches_unknown_provider() { function config_validation_catches_malformed_custom_provider (line 1108) | fn config_validation_catches_malformed_custom_provider() { function config_validation_accepts_custom_provider (line 1123) | fn config_validation_accepts_custom_provider() { function config_validation_warns_bad_fallback (line 1134) | fn config_validation_warns_bad_fallback() { function config_validation_warns_bad_custom_fallback (line 1147) | fn config_validation_warns_bad_custom_fallback() { function config_validation_warns_empty_model_route (line 1162) | fn config_validation_warns_empty_model_route() { function config_validation_warns_empty_embedding_route_model (line 1178) | fn config_validation_warns_empty_embedding_route_model() { function config_validation_warns_invalid_embedding_route_provider (line 1199) | fn config_validation_warns_invalid_embedding_route_provider() { function config_validation_warns_missing_embedding_hint_target (line 1219) | fn config_validation_warns_missing_embedding_hint_target() { function environment_check_finds_git (line 1234) | fn environment_check_finds_git() { function parse_df_available_mb_uses_last_data_line (line 1244) | fn parse_df_available_mb_uses_last_data_line() { function truncate_for_display_preserves_utf8_boundaries (line 1251) | fn truncate_for_display_preserves_utf8_boundaries() { function workspace_probe_path_is_hidden_and_unique (line 1257) | fn workspace_probe_path_is_hidden_and_unique() { function config_validation_reports_delegate_agents_in_sorted_order (line 1270) | fn config_validation_reports_delegate_agents_in_sorted_order() { FILE: src/gateway/api.rs constant MASKED_SECRET (line 13) | const MASKED_SECRET: &str = "***MASKED***"; function extract_bearer_token (line 18) | fn extract_bearer_token(headers: &HeaderMap) -> Option<&str> { function require_auth (line 26) | fn require_auth( type MemoryQuery (line 50) | pub struct MemoryQuery { type MemoryStoreBody (line 56) | pub struct MemoryStoreBody { type CronRunsQuery (line 63) | pub struct CronRunsQuery { type CronAddBody (line 68) | pub struct CronAddBody { function handle_api_status (line 77) | pub async fn handle_api_status( function handle_api_config_get (line 111) | pub async fn handle_api_config_get( function handle_api_config_put (line 142) | pub async fn handle_api_config_put( function handle_api_tools (line 190) | pub async fn handle_api_tools( function handle_api_cron_list (line 214) | pub async fn handle_api_cron_list( function handle_api_cron_add (line 250) | pub async fn handle_api_cron_add( function handle_api_cron_runs (line 291) | pub async fn handle_api_cron_runs( function handle_api_cron_delete (line 340) | pub async fn handle_api_cron_delete( function handle_api_cron_settings_get (line 361) | pub async fn handle_api_cron_settings_get( function handle_api_cron_settings_patch (line 379) | pub async fn handle_api_cron_settings_patch( function handle_api_integrations (line 420) | pub async fn handle_api_integrations( function handle_api_integrations_settings (line 448) | pub async fn handle_api_integrations_settings( function handle_api_doctor (line 477) | pub async fn handle_api_doctor( function handle_api_memory_list (line 513) | pub async fn handle_api_memory_list( function handle_api_memory_store (line 553) | pub async fn handle_api_memory_store( function handle_api_memory_delete (line 588) | pub async fn handle_api_memory_delete( function handle_api_cost (line 610) | pub async fn handle_api_cost( function handle_api_cli_tools (line 643) | pub async fn handle_api_cli_tools( function handle_api_health (line 657) | pub async fn handle_api_health( function is_masked_secret (line 671) | fn is_masked_secret(value: &str) -> bool { function mask_optional_secret (line 675) | fn mask_optional_secret(value: &mut Option) { function mask_required_secret (line 681) | fn mask_required_secret(value: &mut String) { function mask_vec_secrets (line 687) | fn mask_vec_secrets(values: &mut [String]) { function restore_optional_secret (line 696) | fn restore_optional_secret(value: &mut Option, current: &Option<... function restore_required_secret (line 702) | fn restore_required_secret(value: &mut String, current: &str) { function restore_vec_secrets (line 708) | fn restore_vec_secrets(values: &mut [String], current: &[String]) { function normalize_route_field (line 718) | fn normalize_route_field(value: &str) -> String { function model_route_identity_matches (line 722) | fn model_route_identity_matches( function model_route_provider_model_matches (line 731) | fn model_route_provider_model_matches( function embedding_route_identity_matches (line 739) | fn embedding_route_identity_matches( function embedding_route_provider_model_matches (line 748) | fn embedding_route_provider_model_matches( function restore_model_route_api_keys (line 756) | fn restore_model_route_api_keys( function restore_embedding_route_api_keys (line 799) | fn restore_embedding_route_api_keys( function mask_sensitive_fields (line 843) | fn mask_sensitive_fields(config: &crate::config::Config) -> crate::confi... function restore_masked_sensitive_fields (line 941) | fn restore_masked_sensitive_fields( function hydrate_config_for_save (line 1127) | fn hydrate_config_for_save( function handle_api_sessions_list (line 1141) | pub async fn handle_api_sessions_list( function handle_api_session_delete (line 1175) | pub async fn handle_api_session_delete( function masking_keeps_toml_valid_and_preserves_api_keys_type (line 1213) | fn masking_keeps_toml_valid_and_preserves_api_keys_type() { function hydrate_config_for_save_restores_masked_secrets_and_paths (line 1341) | fn hydrate_config_for_save_restores_masked_secrets_and_paths() { function hydrate_config_for_save_restores_route_keys_by_identity_and_clears_unmatched_masks (line 1535) | fn hydrate_config_for_save_restores_route_keys_by_identity_and_clears_un... FILE: src/gateway/api_pairing.rs type DeviceInfo (line 18) | pub struct DeviceInfo { type DeviceRegistry (line 29) | pub struct DeviceRegistry { method new (line 35) | pub fn new(workspace_dir: &Path) -> Self { method open_db (line 94) | fn open_db(&self) -> Connection { method register (line 98) | pub fn register(&self, token_hash: String, info: DeviceInfo) { method list (line 116) | pub fn list(&self) -> Vec { method revoke (line 148) | pub fn revoke(&self, device_id: &str) -> bool { method update_last_seen (line 171) | pub fn update_last_seen(&self, token_hash: &str) { method device_count (line 184) | pub fn device_count(&self) -> usize { type PairingStore (line 191) | pub struct PairingStore { method new (line 206) | pub fn new(max_pending: usize) -> Self { method pending_count (line 213) | pub fn pending_count(&self) -> usize { type PendingPairing (line 197) | struct PendingPairing { function extract_bearer (line 220) | fn extract_bearer(headers: &HeaderMap) -> Option<&str> { function require_auth (line 227) | fn require_auth(state: &AppState, headers: &HeaderMap) -> Result<(), (St... function initiate_pairing (line 238) | pub async fn initiate_pairing( function submit_pairing_enhanced (line 261) | pub async fn submit_pairing_enhanced( function list_devices (line 313) | pub async fn list_devices(State(state): State, headers: Header... function revoke_device (line 333) | pub async fn revoke_device( function rotate_token (line 360) | pub async fn rotate_token( FILE: src/gateway/api_plugins.rs function list_plugins (line 14) | pub async fn list_plugins( FILE: src/gateway/mod.rs constant MAX_BODY_SIZE (line 52) | pub const MAX_BODY_SIZE: usize = 65_536; constant REQUEST_TIMEOUT_SECS (line 54) | pub const REQUEST_TIMEOUT_SECS: u64 = 30; constant RATE_LIMIT_WINDOW_SECS (line 56) | pub const RATE_LIMIT_WINDOW_SECS: u64 = 60; constant RATE_LIMIT_MAX_KEYS_DEFAULT (line 58) | pub const RATE_LIMIT_MAX_KEYS_DEFAULT: usize = 10_000; constant IDEMPOTENCY_MAX_KEYS_DEFAULT (line 60) | pub const IDEMPOTENCY_MAX_KEYS_DEFAULT: usize = 10_000; function webhook_memory_key (line 62) | fn webhook_memory_key() -> String { function whatsapp_memory_key (line 66) | fn whatsapp_memory_key(msg: &crate::channels::traits::ChannelMessage) ->... function linq_memory_key (line 70) | fn linq_memory_key(msg: &crate::channels::traits::ChannelMessage) -> Str... function wati_memory_key (line 74) | fn wati_memory_key(msg: &crate::channels::traits::ChannelMessage) -> Str... function nextcloud_talk_memory_key (line 78) | fn nextcloud_talk_memory_key(msg: &crate::channels::traits::ChannelMessa... function sender_session_id (line 82) | fn sender_session_id(channel: &str, msg: &crate::channels::traits::Chann... function webhook_session_id (line 89) | fn webhook_session_id(headers: &HeaderMap) -> Option { function hash_webhook_secret (line 98) | fn hash_webhook_secret(value: &str) -> String { constant RATE_LIMITER_SWEEP_INTERVAL_SECS (line 106) | const RATE_LIMITER_SWEEP_INTERVAL_SECS: u64 = 300; type SlidingWindowRateLimiter (line 109) | struct SlidingWindowRateLimiter { method new (line 117) | fn new(limit_per_window: u32, window: Duration, max_keys: usize) -> Se... method prune_stale (line 126) | fn prune_stale(requests: &mut HashMap>, cutoff: I... method allow (line 133) | fn allow(&self, key: &str) -> bool { type GatewayRateLimiter (line 179) | pub struct GatewayRateLimiter { method new (line 185) | fn new(pair_per_minute: u32, webhook_per_minute: u32, max_keys: usize)... method allow_pair (line 193) | fn allow_pair(&self, key: &str) -> bool { method allow_webhook (line 197) | fn allow_webhook(&self, key: &str) -> bool { type IdempotencyStore (line 203) | pub struct IdempotencyStore { method new (line 210) | fn new(ttl: Duration, max_keys: usize) -> Self { method record_if_new (line 219) | fn record_if_new(&self, key: &str) -> bool { function parse_client_ip (line 244) | fn parse_client_ip(value: &str) -> Option { function forwarded_client_ip (line 262) | fn forwarded_client_ip(headers: &HeaderMap) -> Option { function client_key_from_request (line 277) | fn client_key_from_request( function normalize_max_keys (line 293) | fn normalize_max_keys(configured: usize, fallback: usize) -> usize { type AppState (line 303) | pub struct AppState { function run_gateway (line 348) | pub async fn run_gateway(host: &str, port: u16, config: Config) -> Resul... function handle_health (line 848) | async fn handle_health(State(state): State) -> impl IntoRespon... constant PROMETHEUS_CONTENT_TYPE (line 859) | const PROMETHEUS_CONTENT_TYPE: &str = "text/plain; version=0.0.4; charse... function prometheus_disabled_hint (line 861) | fn prometheus_disabled_hint() -> String { function handle_metrics (line 866) | async fn handle_metrics(State(state): State) -> impl IntoRespo... function handle_pair (line 897) | async fn handle_pair( function persist_pairing_tokens (line 960) | async fn persist_pairing_tokens(config: Arc>, pairing: &Pa... function run_gateway_chat_simple (line 977) | async fn run_gateway_chat_simple(state: &AppState, message: &str) -> any... function run_gateway_chat_with_tools (line 1009) | async fn run_gateway_chat_with_tools( type WebhookBody (line 1020) | pub struct WebhookBody { function handle_webhook (line 1025) | async fn handle_webhook( type WhatsAppVerifyQuery (line 1218) | pub struct WhatsAppVerifyQuery { function handle_whatsapp_verify (line 1228) | async fn handle_whatsapp_verify( function verify_whatsapp_signature (line 1256) | pub fn verify_whatsapp_signature(app_secret: &str, body: &[u8], signatur... function handle_whatsapp_message (line 1281) | async fn handle_whatsapp_message( function handle_linq_webhook (line 1388) | async fn handle_linq_webhook( function handle_wati_verify (line 1508) | async fn handle_wati_verify( type WatiVerifyQuery (line 1526) | pub struct WatiVerifyQuery { function handle_wati_webhook (line 1532) | async fn handle_wati_webhook(State(state): State, body: Bytes)... function handle_nextcloud_talk_webhook (line 1612) | async fn handle_nextcloud_talk_webhook( type AdminResponse (line 1731) | struct AdminResponse { function require_localhost (line 1737) | fn require_localhost(peer: &SocketAddr) -> Result<(), (StatusCode, Json<... function handle_admin_shutdown (line 1751) | async fn handle_admin_shutdown( function handle_admin_paircode (line 1769) | async fn handle_admin_paircode( function handle_admin_paircode_new (line 1800) | async fn handle_admin_paircode_new( function generate_test_secret (line 1842) | fn generate_test_secret() -> String { function security_body_limit_is_64kb (line 1848) | fn security_body_limit_is_64kb() { function security_timeout_is_30_seconds (line 1853) | fn security_timeout_is_30_seconds() { function webhook_body_requires_message_field (line 1858) | fn webhook_body_requires_message_field() { function whatsapp_query_fields_are_optional (line 1870) | fn whatsapp_query_fields_are_optional() { function app_state_is_clone (line 1880) | fn app_state_is_clone() { function metrics_endpoint_returns_hint_when_prometheus_is_disabled (line 1886) | async fn metrics_endpoint_returns_hint_when_prometheus_is_disabled() { function metrics_endpoint_renders_prometheus_output (line 1934) | async fn metrics_endpoint_renders_prometheus_output() { function gateway_rate_limiter_blocks_after_limit (line 1981) | fn gateway_rate_limiter_blocks_after_limit() { function rate_limiter_sweep_removes_stale_entries (line 1989) | fn rate_limiter_sweep_removes_stale_entries() { function rate_limiter_zero_limit_always_allows (line 2023) | fn rate_limiter_zero_limit_always_allows() { function idempotency_store_rejects_duplicate_key (line 2031) | fn idempotency_store_rejects_duplicate_key() { function rate_limiter_bounded_cardinality_evicts_oldest_key (line 2039) | fn rate_limiter_bounded_cardinality_evicts_oldest_key() { function idempotency_store_bounded_cardinality_evicts_oldest_key (line 2052) | fn idempotency_store_bounded_cardinality_evicts_oldest_key() { function client_key_defaults_to_peer_addr_when_untrusted_proxy_mode (line 2068) | fn client_key_defaults_to_peer_addr_when_untrusted_proxy_mode() { function client_key_uses_forwarded_ip_only_in_trusted_proxy_mode (line 2081) | fn client_key_uses_forwarded_ip_only_in_trusted_proxy_mode() { function client_key_falls_back_to_peer_when_forwarded_header_invalid (line 2094) | fn client_key_falls_back_to_peer_when_forwarded_header_invalid() { function normalize_max_keys_uses_fallback_for_zero (line 2104) | fn normalize_max_keys_uses_fallback_for_zero() { function normalize_max_keys_preserves_nonzero_values (line 2110) | fn normalize_max_keys_preserves_nonzero_values() { function persist_pairing_tokens_writes_config_tokens (line 2116) | async fn persist_pairing_tokens_writes_config_tokens() { function webhook_memory_key_is_unique (line 2157) | fn webhook_memory_key_is_unique() { function whatsapp_memory_key_includes_sender_and_message_id (line 2167) | fn whatsapp_memory_key_includes_sender_and_message_id() { type MockMemory (line 2184) | struct MockMemory; method name (line 2188) | fn name(&self) -> &str { method store (line 2192) | async fn store( method recall (line 2202) | async fn recall( method get (line 2211) | async fn get(&self, _key: &str) -> anyhow::Result> { method list (line 2215) | async fn list( method forget (line 2223) | async fn forget(&self, _key: &str) -> anyhow::Result { method count (line 2227) | async fn count(&self) -> anyhow::Result { method health_check (line 2231) | async fn health_check(&self) -> bool { type MockProvider (line 2237) | struct MockProvider { method chat_with_system (line 2243) | async fn chat_with_system( type TrackingMemory (line 2256) | struct TrackingMemory { method name (line 2262) | fn name(&self) -> &str { method store (line 2266) | async fn store( method recall (line 2277) | async fn recall( method get (line 2286) | async fn get(&self, _key: &str) -> anyhow::Result> { method list (line 2290) | async fn list( method forget (line 2298) | async fn forget(&self, _key: &str) -> anyhow::Result { method count (line 2302) | async fn count(&self) -> anyhow::Result { method health_check (line 2307) | async fn health_check(&self) -> bool { function test_connect_info (line 2312) | fn test_connect_info() -> ConnectInfo { function webhook_idempotency_skips_duplicate_provider_calls (line 2317) | async fn webhook_idempotency_skips_duplicate_provider_calls() { function webhook_autosave_stores_distinct_keys_per_request (line 2384) | async fn webhook_autosave_stores_distinct_keys_per_request() { function webhook_secret_hash_is_deterministic_and_nonempty (line 2453) | fn webhook_secret_hash_is_deterministic_and_nonempty() { function webhook_secret_hash_rejects_missing_header (line 2466) | async fn webhook_secret_hash_rejects_missing_header() { function webhook_secret_hash_rejects_invalid_header (line 2518) | async fn webhook_secret_hash_rejects_invalid_header() { function webhook_secret_hash_accepts_valid_header (line 2577) | async fn webhook_secret_hash_accepts_valid_header() { function compute_nextcloud_signature_hex (line 2631) | fn compute_nextcloud_signature_hex(secret: &str, random: &str, body: &st... function nextcloud_talk_webhook_returns_not_found_when_not_configured (line 2642) | async fn nextcloud_talk_webhook_returns_not_found_when_not_configured() { function nextcloud_talk_webhook_rejects_invalid_signature (line 2688) | async fn nextcloud_talk_webhook_rejects_invalid_signature() { function compute_whatsapp_signature_hex (line 2760) | fn compute_whatsapp_signature_hex(secret: &str, body: &[u8]) -> String { function compute_whatsapp_signature_header (line 2769) | fn compute_whatsapp_signature_header(secret: &str, body: &[u8]) -> String { function whatsapp_signature_valid (line 2774) | fn whatsapp_signature_valid() { function whatsapp_signature_invalid_wrong_secret (line 2788) | fn whatsapp_signature_invalid_wrong_secret() { function whatsapp_signature_invalid_wrong_body (line 2803) | fn whatsapp_signature_invalid_wrong_body() { function whatsapp_signature_missing_prefix (line 2819) | fn whatsapp_signature_missing_prefix() { function whatsapp_signature_empty_header (line 2834) | fn whatsapp_signature_empty_header() { function whatsapp_signature_invalid_hex (line 2842) | fn whatsapp_signature_invalid_hex() { function whatsapp_signature_empty_body (line 2857) | fn whatsapp_signature_empty_body() { function whatsapp_signature_unicode_body (line 2871) | fn whatsapp_signature_unicode_body() { function whatsapp_signature_json_payload (line 2885) | fn whatsapp_signature_json_payload() { function whatsapp_signature_case_sensitive_prefix (line 2899) | fn whatsapp_signature_case_sensitive_prefix() { function whatsapp_signature_truncated_hex (line 2919) | fn whatsapp_signature_truncated_hex() { function whatsapp_signature_extra_bytes (line 2935) | fn whatsapp_signature_extra_bytes() { function idempotency_store_allows_different_keys (line 2955) | fn idempotency_store_allows_different_keys() { function idempotency_store_max_keys_clamped_to_one (line 2964) | fn idempotency_store_max_keys_clamped_to_one() { function idempotency_store_rapid_duplicate_rejected (line 2971) | fn idempotency_store_rapid_duplicate_rejected() { function idempotency_store_accepts_after_ttl_expires (line 2978) | fn idempotency_store_accepts_after_ttl_expires() { function idempotency_store_eviction_preserves_newest (line 2986) | fn idempotency_store_eviction_preserves_newest() { function rate_limiter_allows_after_window_expires (line 2999) | fn rate_limiter_allows_after_window_expires() { function rate_limiter_independent_keys_tracked_separately (line 3014) | fn rate_limiter_independent_keys_tracked_separately() { function rate_limiter_exact_boundary_at_max_keys (line 3027) | fn rate_limiter_exact_boundary_at_max_keys() { function gateway_rate_limiter_pair_and_webhook_are_independent (line 3047) | fn gateway_rate_limiter_pair_and_webhook_are_independent() { function rate_limiter_single_key_max_allows_one_request (line 3063) | fn rate_limiter_single_key_max_allows_one_request() { function rate_limiter_concurrent_access_safe (line 3075) | fn rate_limiter_concurrent_access_safe() { function idempotency_store_concurrent_access_safe (line 3104) | fn idempotency_store_concurrent_access_safe() { function rate_limiter_rapid_burst_then_cooldown (line 3128) | fn rate_limiter_rapid_burst_then_cooldown() { function require_localhost_accepts_ipv4_loopback (line 3145) | fn require_localhost_accepts_ipv4_loopback() { function require_localhost_accepts_ipv6_loopback (line 3151) | fn require_localhost_accepts_ipv6_loopback() { function require_localhost_rejects_non_loopback_ipv4 (line 3157) | fn require_localhost_rejects_non_loopback_ipv4() { function require_localhost_rejects_non_loopback_ipv6 (line 3164) | fn require_localhost_rejects_non_loopback_ipv6() { FILE: src/gateway/nodes.rs constant BEARER_SUBPROTO_PREFIX (line 33) | const BEARER_SUBPROTO_PREFIX: &str = "bearer."; constant WS_NODE_PROTOCOL (line 36) | const WS_NODE_PROTOCOL: &str = "zeroclaw.nodes.v1"; type NodeCapability (line 40) | pub struct NodeCapability { function default_capability_parameters (line 47) | fn default_capability_parameters() -> serde_json::Value { type NodeInfo (line 56) | pub struct NodeInfo { type NodeInvocation (line 65) | pub struct NodeInvocation { type NodeInvocationResult (line 74) | pub struct NodeInvocationResult { type NodeRegistry (line 82) | pub struct NodeRegistry { method new (line 89) | pub fn new(max_nodes: usize) -> Self { method register (line 97) | pub fn register(&self, info: NodeInfo) -> bool { method unregister (line 107) | pub fn unregister(&self, node_id: &str) { method node_ids (line 112) | pub fn node_ids(&self) -> Vec { method all_capabilities (line 117) | pub fn all_capabilities(&self) -> Vec<(String, String, NodeCapability)> { method invoke_tx (line 129) | pub fn invoke_tx(&self, node_id: &str) -> Option bool { method len (line 139) | pub fn len(&self) -> usize { method is_empty (line 144) | pub fn is_empty(&self) -> bool { type NodeMessage (line 152) | enum NodeMessage { type GatewayMessage (line 169) | enum GatewayMessage { type NodeWsQuery (line 186) | pub struct NodeWsQuery { function extract_node_ws_token (line 191) | fn extract_node_ws_token<'a>( function handle_ws_nodes (line 233) | pub async fn handle_ws_nodes( function handle_node_socket (line 281) | async fn handle_node_socket(socket: WebSocket, registry: Arc &str { method as_any (line 155) | fn as_any(&self) -> &dyn std::any::Any { FILE: src/gateway/static_files.rs type WebAssets (line 13) | struct WebAssets; function handle_static (line 16) | pub async fn handle_static(uri: Uri) -> Response { function handle_spa_fallback (line 27) | pub async fn handle_spa_fallback() -> Response { function serve_embedded_file (line 38) | fn serve_embedded_file(path: &str) -> Response { FILE: src/gateway/ws.rs type ConnectParams (line 32) | struct ConnectParams { constant WS_PROTOCOL (line 47) | const WS_PROTOCOL: &str = "zeroclaw.v1"; constant BEARER_SUBPROTO_PREFIX (line 50) | const BEARER_SUBPROTO_PREFIX: &str = "bearer."; type WsQuery (line 53) | pub struct WsQuery { function extract_ws_token (line 67) | fn extract_ws_token<'a>(headers: &'a HeaderMap, query_token: Option<&'a ... function handle_ws_chat (line 106) | pub async fn handle_ws_chat( constant GW_SESSION_PREFIX (line 142) | const GW_SESSION_PREFIX: &str = "gw_"; function handle_socket (line 144) | async fn handle_socket(socket: WebSocket, state: AppState, session_id: O... function process_chat_message (line 284) | async fn process_chat_message( function extract_ws_token_from_authorization_header (line 351) | fn extract_ws_token_from_authorization_header() { function extract_ws_token_from_subprotocol (line 358) | fn extract_ws_token_from_subprotocol() { function extract_ws_token_from_query_param (line 368) | fn extract_ws_token_from_query_param() { function extract_ws_token_precedence_header_over_subprotocol (line 377) | fn extract_ws_token_precedence_header_over_subprotocol() { function extract_ws_token_precedence_subprotocol_over_query (line 388) | fn extract_ws_token_precedence_subprotocol_over_query() { function extract_ws_token_returns_none_when_empty (line 395) | fn extract_ws_token_returns_none_when_empty() { function extract_ws_token_skips_empty_header_value (line 401) | fn extract_ws_token_skips_empty_header_value() { function extract_ws_token_skips_empty_query_param (line 411) | fn extract_ws_token_skips_empty_query_param() { function extract_ws_token_subprotocol_with_multiple_entries (line 417) | fn extract_ws_token_subprotocol_with_multiple_entries() { FILE: src/hands/mod.rs function load_hands (line 12) | pub fn load_hands(hands_dir: &Path) -> Result> { function load_hand_context (line 44) | pub fn load_hand_context(hands_dir: &Path, name: &str) -> Result Res... function write_hand_toml (line 76) | fn write_hand_toml(dir: &Path, filename: &str, content: &str) { function load_hands_empty_dir (line 81) | fn load_hands_empty_dir() { function load_hands_nonexistent_dir (line 88) | fn load_hands_nonexistent_dir() { function load_hands_parses_valid_files (line 94) | fn load_hands_parses_valid_files() { function load_hands_skips_malformed_files (line 128) | fn load_hands_skips_malformed_files() { function load_hands_ignores_non_toml_files (line 151) | fn load_hands_ignores_non_toml_files() { function context_roundtrip_through_filesystem (line 161) | fn context_roundtrip_through_filesystem() { function load_context_returns_fresh_when_missing (line 186) | fn load_context_returns_fresh_when_missing() { function save_context_creates_directory (line 195) | fn save_context_creates_directory() { function save_then_load_preserves_multiple_runs (line 204) | fn save_then_load_preserves_multiple_runs() { FILE: src/hands/types.rs type Hand (line 15) | pub struct Hand { function default_true (line 41) | fn default_true() -> bool { function default_max_runs (line 45) | fn default_max_runs() -> usize { type HandRunStatus (line 54) | pub enum HandRunStatus { type HandRun (line 62) | pub struct HandRun { type HandContext (line 89) | pub struct HandContext { method new (line 107) | pub fn new(hand_name: &str) -> Self { method record_run (line 118) | pub fn record_run(&mut self, run: HandRun, max_history: usize) { function sample_hand (line 144) | fn sample_hand() -> Hand { function sample_run (line 161) | fn sample_run(name: &str, status: HandRunStatus) -> HandRun { function hand_deserializes_from_toml (line 178) | fn hand_deserializes_from_toml() { function hand_deserializes_full_toml (line 199) | fn hand_deserializes_full_toml() { function hand_roundtrip_json (line 230) | fn hand_roundtrip_json() { function hand_run_status_serde_roundtrip (line 241) | fn hand_run_status_serde_roundtrip() { function context_new_is_empty (line 259) | fn context_new_is_empty() { function context_record_run_increments_counters (line 269) | fn context_record_run_increments_counters() { function context_record_failed_run_does_not_increment_total (line 281) | fn context_record_failed_run_does_not_increment_total() { function context_caps_history_at_max (line 297) | fn context_caps_history_at_max() { function context_deduplicates_learned_facts (line 308) | fn context_deduplicates_learned_facts() { function context_json_roundtrip (line 320) | fn context_json_roundtrip() { function most_recent_run_is_first_in_history (line 335) | fn most_recent_run_is_first_in_history() { FILE: src/hardware/discover.rs type UsbDeviceInfo (line 15) | pub struct UsbDeviceInfo { function list_usb_devices (line 27) | pub fn list_usb_devices() -> Result> { FILE: src/hardware/introspect.rs type IntrospectResult (line 9) | pub struct IntrospectResult { function introspect_device (line 21) | pub fn introspect_device(path: &str) -> Result { function memory_map_for_board (line 65) | fn memory_map_for_board(board_name: Option<&str>) -> String { function probe_memory_map (line 86) | fn probe_memory_map(chip: &str) -> anyhow::Result { FILE: src/hardware/mod.rs type DiscoveredDevice (line 27) | pub struct DiscoveredDevice { function discover_hardware (line 36) | pub fn discover_hardware() -> Vec { function recommended_wizard_default (line 67) | pub fn recommended_wizard_default(devices: &[DiscoveredDevice]) -> usize { function config_from_wizard_choice (line 76) | pub fn config_from_wizard_choice(choice: usize, devices: &[DiscoveredDev... function handle_command (line 106) | pub fn handle_command(cmd: crate::HardwareCommands, _config: &Config) ->... function run_discover (line 141) | fn run_discover() -> Result<()> { function run_introspect (line 172) | fn run_introspect(path: &str) -> Result<()> { function run_info (line 197) | fn run_info(chip: &str) -> Result<()> { function info_via_probe (line 233) | fn info_via_probe(chip: &str) -> anyhow::Result<()> { FILE: src/hardware/registry.rs type BoardInfo (line 5) | pub struct BoardInfo { constant KNOWN_BOARDS (line 14) | const KNOWN_BOARDS: &[BoardInfo] = &[ function lookup_board (line 73) | pub fn lookup_board(vid: u16, pid: u16) -> Option<&'static BoardInfo> { function known_boards (line 78) | pub fn known_boards() -> &'static [BoardInfo] { function lookup_nucleo_f401re (line 87) | fn lookup_nucleo_f401re() { function lookup_unknown_returns_none (line 94) | fn lookup_unknown_returns_none() { function known_boards_not_empty (line 99) | fn known_boards_not_empty() { FILE: src/health/mod.rs type ComponentHealth (line 9) | pub struct ComponentHealth { type HealthSnapshot (line 18) | pub struct HealthSnapshot { type HealthRegistry (line 25) | struct HealthRegistry { function registry (line 32) | fn registry() -> &'static HealthRegistry { function now_rfc3339 (line 39) | fn now_rfc3339() -> String { function upsert_component (line 43) | fn upsert_component(component: &str, update: F) function mark_component_ok (line 62) | pub fn mark_component_ok(component: &str) { function mark_component_error (line 71) | pub fn mark_component_error(component: &str, error: impl ToString) { function bump_component_restart (line 79) | pub fn bump_component_restart(component: &str) { function snapshot (line 85) | pub fn snapshot() -> HealthSnapshot { function snapshot_json (line 96) | pub fn snapshot_json() -> serde_json::Value { function unique_component (line 109) | fn unique_component(prefix: &str) -> String { function mark_component_ok_initializes_component_state (line 114) | fn mark_component_ok_initializes_component_state() { function mark_component_error_then_ok_clears_last_error (line 131) | fn mark_component_error_then_ok_clears_last_error() { function bump_component_restart_increments_counter (line 155) | fn bump_component_restart_increments_counter() { function snapshot_json_contains_registered_component_fields (line 171) | fn snapshot_json_contains_registered_component_fields() { FILE: src/heartbeat/engine.rs type TaskPriority (line 18) | pub enum TaskPriority { method fmt (line 25) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { type TaskStatus (line 37) | pub enum TaskStatus { method fmt (line 44) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { type HeartbeatTask (line 55) | pub struct HeartbeatTask { method is_runnable (line 62) | pub fn is_runnable(&self) -> bool { method fmt (line 68) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { type HeartbeatMetrics (line 80) | pub struct HeartbeatMetrics { method record_success (line 110) | pub fn record_success(&mut self, duration_ms: f64) { method record_failure (line 119) | pub fn record_failure(&mut self, duration_ms: f64) { method update_avg_duration (line 127) | fn update_avg_duration(&mut self, duration_ms: f64) { method default (line 96) | fn default() -> Self { function compute_adaptive_interval (line 144) | pub fn compute_adaptive_interval( type HeartbeatEngine (line 169) | pub struct HeartbeatEngine { method new (line 177) | pub fn new( method metrics (line 191) | pub fn metrics(&self) -> Arc> { method run (line 196) | pub async fn run(&self) -> Result<()> { method tick (line 229) | async fn tick(&self) -> Result { method collect_tasks (line 234) | pub async fn collect_tasks(&self) -> Result> { method collect_runnable_tasks (line 244) | pub async fn collect_runnable_tasks(&self) -> Result Vec { method parse_task_line (line 284) | fn parse_task_line(text: &str) -> HeartbeatTask { method parse_meta (line 307) | fn parse_meta(meta: &str) -> (TaskPriority, TaskStatus) { method build_decision_prompt (line 327) | pub fn build_decision_prompt(tasks: &[HeartbeatTask]) -> String { method parse_decision_response (line 356) | pub fn parse_decision_response(response: &str, task_count: usize) -> V... method ensure_heartbeat_file (line 387) | pub async fn ensure_heartbeat_file(workspace_dir: &Path) -> Result<()> { function parse_tasks_basic (line 413) | fn parse_tasks_basic() { function parse_tasks_empty_content (line 423) | fn parse_tasks_empty_content() { function parse_tasks_only_comments (line 428) | fn parse_tasks_only_comments() { function parse_tasks_with_leading_whitespace (line 434) | fn parse_tasks_with_leading_whitespace() { function parse_tasks_dash_without_space_ignored (line 443) | fn parse_tasks_dash_without_space_ignored() { function parse_tasks_trailing_space_bullet_trimmed_to_dash (line 452) | fn parse_tasks_trailing_space_bullet_trimmed_to_dash() { function parse_tasks_bullet_with_content_after_spaces (line 459) | fn parse_tasks_bullet_with_content_after_spaces() { function parse_tasks_unicode (line 467) | fn parse_tasks_unicode() { function parse_tasks_mixed_markdown (line 476) | fn parse_tasks_mixed_markdown() { function parse_tasks_single_task (line 485) | fn parse_tasks_single_task() { function parse_tasks_many_tasks (line 492) | fn parse_tasks_many_tasks() { function parse_task_with_high_priority (line 506) | fn parse_task_with_high_priority() { function parse_task_with_low_paused (line 516) | fn parse_task_with_low_paused() { function parse_task_completed (line 526) | fn parse_task_completed() { function parse_task_without_metadata_defaults (line 535) | fn parse_task_without_metadata_defaults() { function parse_mixed_structured_and_legacy (line 545) | fn parse_mixed_structured_and_legacy() { function runnable_filters_paused_and_completed (line 556) | fn runnable_filters_paused_and_completed() { function decision_prompt_includes_all_tasks (line 570) | fn decision_prompt_includes_all_tasks() { function parse_decision_skip (line 591) | fn parse_decision_skip() { function parse_decision_skip_with_reason (line 597) | fn parse_decision_skip_with_reason() { function parse_decision_run_single (line 604) | fn parse_decision_run_single() { function parse_decision_run_multiple (line 610) | fn parse_decision_run_multiple() { function parse_decision_run_out_of_range_ignored (line 616) | fn parse_decision_run_out_of_range_ignored() { function parse_decision_run_zero_ignored (line 622) | fn parse_decision_run_zero_ignored() { function task_display_format (line 630) | fn task_display_format() { function priority_ordering (line 640) | fn priority_ordering() { function ensure_heartbeat_file_creates_file (line 648) | async fn ensure_heartbeat_file_creates_file() { function ensure_heartbeat_file_does_not_overwrite (line 665) | async fn ensure_heartbeat_file_does_not_overwrite() { function tick_returns_zero_when_no_file (line 682) | async fn tick_returns_zero_when_no_file() { function tick_counts_tasks_from_file (line 704) | async fn tick_counts_tasks_from_file() { function run_returns_immediately_when_disabled (line 730) | async fn run_returns_immediately_when_disabled() { function collect_runnable_tasks_sorts_by_priority (line 747) | async fn collect_runnable_tasks_sorts_by_priority() { function metrics_record_success_updates_fields (line 782) | fn metrics_record_success_updates_fields() { function metrics_record_failure_resets_successes (line 793) | fn metrics_record_failure_resets_successes() { function metrics_ema_smoothing (line 804) | fn metrics_ema_smoothing() { function adaptive_uses_base_when_no_failures (line 816) | fn adaptive_uses_base_when_no_failures() { function adaptive_uses_min_for_high_priority (line 822) | fn adaptive_uses_min_for_high_priority() { function adaptive_backs_off_on_failures (line 828) | fn adaptive_backs_off_on_failures() { function adaptive_backoff_respects_min (line 838) | fn adaptive_backoff_respects_min() { function engine_exposes_shared_metrics (line 846) | fn engine_exposes_shared_metrics() { FILE: src/heartbeat/mod.rs function heartbeat_engine_is_constructible_via_module_export (line 12) | fn heartbeat_engine_is_constructible_via_module_export() { function ensure_heartbeat_file_creates_expected_file (line 24) | async fn ensure_heartbeat_file_creates_expected_file() { FILE: src/heartbeat/store.rs constant MAX_OUTPUT_BYTES (line 11) | const MAX_OUTPUT_BYTES: usize = 16 * 1024; constant TRUNCATED_MARKER (line 12) | const TRUNCATED_MARKER: &str = "\n...[truncated]"; type HeartbeatRun (line 16) | pub struct HeartbeatRun { function record_run (line 28) | pub fn record_run( function list_runs (line 78) | pub fn list_runs(workspace_dir: &Path, limit: usize) -> Result Result<(u64, u64, u64)> { function db_path (line 128) | fn db_path(workspace_dir: &Path) -> PathBuf { function with_connection (line 132) | fn with_connection(workspace_dir: &Path, f: impl FnOnce(&Connection) ... function truncate_output (line 166) | fn truncate_output(output: &str) -> String { function parse_rfc3339 (line 185) | fn parse_rfc3339(raw: &str) -> Result> { function sql_err (line 191) | fn sql_err(err: anyhow::Error) -> rusqlite::Error { function record_and_list_runs (line 202) | fn record_and_list_runs() { function prunes_old_runs (line 230) | fn prunes_old_runs() { function run_stats_counts_correctly (line 256) | fn run_stats_counts_correctly() { function truncates_large_output (line 282) | fn truncates_large_output() { FILE: src/hooks/builtin/command_logger.rs type CommandLoggerHook (line 9) | pub struct CommandLoggerHook { method new (line 14) | pub fn new() -> Self { method entries (line 21) | pub fn entries(&self) -> Vec { method name (line 28) | fn name(&self) -> &str { method priority (line 32) | fn priority(&self) -> i32 { method on_after_tool_call (line 36) | async fn on_after_tool_call(&self, tool: &str, result: &ToolResult, dura... function logs_tool_calls (line 54) | async fn logs_tool_calls() { FILE: src/hooks/builtin/webhook_audit.rs function validate_webhook_url (line 19) | fn validate_webhook_url(url: &str) -> Result<(), String> { function reject_private_ip (line 55) | fn reject_private_ip(addr: IpAddr) -> Result<(), String> { type WebhookAuditHook (line 108) | pub struct WebhookAuditHook { method new (line 115) | pub fn new(config: WebhookAuditConfig) -> Self { function glob_matches (line 145) | fn glob_matches(pattern: &str, text: &str) -> bool { function matches_any_pattern (line 211) | fn matches_any_pattern(patterns: &[String], tool: &str) -> bool { function truncate_args (line 220) | fn truncate_args(args: Value, max_bytes: u64) -> Value { method name (line 241) | fn name(&self) -> &str { method priority (line 245) | fn priority(&self) -> i32 { method before_tool_call (line 249) | async fn before_tool_call(&self, name: String, args: Value) -> HookResul... method on_after_tool_call (line 262) | async fn on_after_tool_call(&self, tool: &str, result: &ToolResult, dura... function glob_exact_match (line 347) | fn glob_exact_match() { function glob_wildcard_suffix (line 353) | fn glob_wildcard_suffix() { function glob_wildcard_prefix (line 360) | fn glob_wildcard_prefix() { function glob_wildcard_middle (line 367) | fn glob_wildcard_middle() { function glob_star_matches_everything (line 374) | fn glob_star_matches_everything() { function glob_empty_pattern (line 380) | fn glob_empty_pattern() { function matches_any_pattern_works (line 388) | fn matches_any_pattern_works() { function empty_patterns_matches_nothing (line 396) | fn empty_patterns_matches_nothing() { function make_hook (line 403) | fn make_hook(patterns: Vec<&str>, include_args: bool) -> WebhookAuditHook { function before_tool_call_captures_args_when_enabled (line 416) | async fn before_tool_call_captures_args_when_enabled() { function before_tool_call_concurrent_same_tool_no_data_loss (line 427) | async fn before_tool_call_concurrent_same_tool_no_data_loss() { function before_tool_call_skips_non_matching_tools (line 442) | async fn before_tool_call_skips_non_matching_tools() { function before_tool_call_skips_when_include_args_false (line 453) | async fn before_tool_call_skips_when_include_args_false() { function truncate_args_within_limit (line 466) | fn truncate_args_within_limit() { function truncate_args_over_limit (line 473) | fn truncate_args_over_limit() { function truncate_args_zero_means_no_limit (line 482) | fn truncate_args_zero_means_no_limit() { function on_after_tool_call_skips_non_matching (line 491) | async fn on_after_tool_call_skips_non_matching() { function on_after_tool_call_skips_empty_url (line 507) | async fn on_after_tool_call_skips_empty_url() { function validate_url_rejects_loopback_ipv4 (line 529) | fn validate_url_rejects_loopback_ipv4() { function validate_url_rejects_loopback_ipv6 (line 535) | fn validate_url_rejects_loopback_ipv6() { function validate_url_rejects_private_rfc1918 (line 540) | fn validate_url_rejects_private_rfc1918() { function validate_url_rejects_link_local (line 547) | fn validate_url_rejects_link_local() { function validate_url_rejects_http_non_localhost (line 553) | fn validate_url_rejects_http_non_localhost() { function validate_url_accepts_https_public (line 558) | fn validate_url_accepts_https_public() { function validate_url_rejects_non_http_scheme (line 564) | fn validate_url_rejects_non_http_scheme() { FILE: src/hooks/runner.rs type HookRunner (line 19) | pub struct HookRunner { method new (line 25) | pub fn new() -> Self { method register (line 32) | pub fn register(&mut self, handler: Box) { method fire_gateway_start (line 42) | pub async fn fire_gateway_start(&self, host: &str, port: u16) { method fire_gateway_stop (line 51) | pub async fn fire_gateway_stop(&self) { method fire_session_start (line 56) | pub async fn fire_session_start(&self, session_id: &str, channel: &str) { method fire_session_end (line 65) | pub async fn fire_session_end(&self, session_id: &str, channel: &str) { method fire_llm_input (line 74) | pub async fn fire_llm_input(&self, messages: &[ChatMessage], model: &s... method fire_llm_output (line 83) | pub async fn fire_llm_output(&self, response: &ChatResponse) { method fire_after_tool_call (line 92) | pub async fn fire_after_tool_call(&self, tool: &str, result: &ToolResu... method fire_message_sent (line 101) | pub async fn fire_message_sent(&self, channel: &str, recipient: &str, ... method fire_heartbeat_tick (line 110) | pub async fn fire_heartbeat_tick(&self) { method run_before_model_resolve (line 123) | pub async fn run_before_model_resolve( method run_before_prompt_build (line 156) | pub async fn run_before_prompt_build(&self, mut prompt: String) -> Hoo... method run_before_llm_call (line 182) | pub async fn run_before_llm_call( method run_before_tool_call (line 215) | pub async fn run_before_tool_call( method run_on_message_received (line 248) | pub async fn run_on_message_received( method run_on_message_sending (line 277) | pub async fn run_on_message_sending( type CountingHook (line 325) | struct CountingHook { method new (line 332) | fn new(name: &str, priority: i32) -> (Self, Arc) { method name (line 347) | fn name(&self) -> &str { method priority (line 350) | fn priority(&self) -> i32 { method on_heartbeat_tick (line 353) | async fn on_heartbeat_tick(&self) { type UppercasePromptHook (line 359) | struct UppercasePromptHook { method name (line 366) | fn name(&self) -> &str { method priority (line 369) | fn priority(&self) -> i32 { method before_prompt_build (line 372) | async fn before_prompt_build(&self, prompt: String) -> HookResult { type CancelPromptHook (line 378) | struct CancelPromptHook { method name (line 385) | fn name(&self) -> &str { method priority (line 388) | fn priority(&self) -> i32 { method before_prompt_build (line 391) | async fn before_prompt_build(&self, _prompt: String) -> HookResult &str { method priority (line 408) | fn priority(&self) -> i32 { method before_prompt_build (line 411) | async fn before_prompt_build(&self, prompt: String) -> HookResult { function register_and_sort_by_priority (line 417) | fn register_and_sort_by_priority() { function void_hooks_fire_all_handlers (line 432) | async fn void_hooks_fire_all_handlers() { function modifying_hook_can_cancel (line 447) | async fn modifying_hook_can_cancel() { function modifying_hook_pipelines_data (line 463) | async fn modifying_hook_pipelines_data() { FILE: src/hooks/traits.rs type HookResult (line 11) | pub enum HookResult { function is_cancel (line 17) | pub fn is_cancel(&self) -> bool { type HookHandler (line 25) | pub trait HookHandler: Send + Sync { method name (line 26) | fn name(&self) -> &str; method priority (line 27) | fn priority(&self) -> i32 { method on_gateway_start (line 32) | async fn on_gateway_start(&self, _host: &str, _port: u16) {} method on_gateway_stop (line 33) | async fn on_gateway_stop(&self) {} method on_session_start (line 34) | async fn on_session_start(&self, _session_id: &str, _channel: &str) {} method on_session_end (line 35) | async fn on_session_end(&self, _session_id: &str, _channel: &str) {} method on_llm_input (line 36) | async fn on_llm_input(&self, _messages: &[ChatMessage], _model: &str) {} method on_llm_output (line 37) | async fn on_llm_output(&self, _response: &ChatResponse) {} method on_after_tool_call (line 38) | async fn on_after_tool_call(&self, _tool: &str, _result: &ToolResult, ... method on_message_sent (line 39) | async fn on_message_sent(&self, _channel: &str, _recipient: &str, _con... method on_heartbeat_tick (line 40) | async fn on_heartbeat_tick(&self) {} method before_model_resolve (line 43) | async fn before_model_resolve( method before_prompt_build (line 51) | async fn before_prompt_build(&self, prompt: String) -> HookResult HookRes... method on_message_received (line 67) | async fn on_message_received(&self, message: ChannelMessage) -> HookRe... method on_message_sending (line 71) | async fn on_message_sending( method name (line 101) | fn name(&self) -> &str { method priority (line 104) | fn priority(&self) -> i32 { type TestHook (line 85) | struct TestHook { method new (line 91) | fn new(name: &str, priority: i32) -> Self { function hook_result_is_cancel (line 110) | fn hook_result_is_cancel() { function default_priority_is_zero (line 118) | fn default_priority_is_zero() { function default_modifying_hooks_pass_through (line 130) | async fn default_modifying_hooks_pass_through() { FILE: src/i18n.rs type ToolDescriptions (line 14) | pub struct ToolDescriptions { method load (line 40) | pub fn load(locale: &str, search_dirs: &[PathBuf]) -> Self { method get (line 67) | pub fn get(&self, tool_name: &str) -> Option<&str> { method locale (line 75) | pub fn locale(&self) -> &str { method empty (line 80) | pub fn empty() -> Self { type DescriptionFile (line 25) | struct DescriptionFile { function detect_locale (line 93) | pub fn detect_locale() -> String { function normalize_locale (line 113) | fn normalize_locale(raw: &str) -> String { function default_search_dirs (line 125) | pub fn default_search_dirs(workspace_dir: &Path) -> Vec { function load_locale_file (line 144) | fn load_locale_file(locale: &str, search_dirs: &[PathBuf]) -> HashMap Result { function normalize_aieos_identity (line 218) | fn normalize_aieos_identity(payload: &Value) -> AieosIdentity { function normalize_identity_section (line 231) | fn normalize_identity_section(section: Option<&Value>) -> Option) -> Option { function normalize_psychology_section (line 278) | fn normalize_psychology_section(section: Option<&Value>) -> Option Option { function normalize_moral_compass (line 326) | fn normalize_moral_compass(value: &Value) -> Vec { function normalize_linguistics_section (line 352) | fn normalize_linguistics_section(section: Option<&Value>) -> Option) -> Option) -> Option) -> Option) -> Option) -> Option(value: &'a Value, path: &[&str]) -> Option<&'a Valu... function scalar_to_string (line 540) | fn scalar_to_string(value: &Value) -> Option { function value_to_text (line 556) | fn value_to_text(value: &Value) -> Option { function summarize_object (line 572) | fn summarize_object(map: &Map) -> Option { function summarize_object_into_parts (line 582) | fn summarize_object_into_parts(prefix: &str, map: &Map, p... function list_from_value (line 612) | fn list_from_value(value: &Value) -> Vec { function dedupe_non_empty (line 640) | fn dedupe_non_empty(values: Vec) -> Vec { function numeric_map_from_value (line 657) | fn numeric_map_from_value(value: &Value) -> Option> { function numeric_from_value (line 677) | fn numeric_from_value(value: &Value) -> Option { function favorites_map (line 685) | fn favorites_map(value: &Value) -> Option> { function non_empty_list_at (line 705) | fn non_empty_list_at(value: &Value, path: &[&str]) -> Option> { function aieos_to_system_prompt (line 718) | pub fn aieos_to_system_prompt(identity: &AieosIdentity) -> String { function is_aieos_configured (line 980) | pub fn is_aieos_configured(config: &IdentityConfig) -> bool { function test_workspace_dir (line 988) | fn test_workspace_dir() -> PathBuf { function aieos_identity_parse_minimal (line 993) | fn aieos_identity_parse_minimal() { function aieos_identity_parse_full (line 1004) | fn aieos_identity_parse_full() { function aieos_to_system_prompt_minimal (line 1064) | fn aieos_to_system_prompt_minimal() { function aieos_to_system_prompt_full (line 1082) | fn aieos_to_system_prompt_full() { function aieos_to_system_prompt_empty_identity (line 1205) | fn aieos_to_system_prompt_empty_identity() { function aieos_to_system_prompt_no_sections (line 1219) | fn aieos_to_system_prompt_no_sections() { function is_aieos_configured_true_with_path (line 1237) | fn is_aieos_configured_true_with_path() { function is_aieos_configured_true_with_inline (line 1247) | fn is_aieos_configured_true_with_inline() { function is_aieos_configured_false_openclaw_format (line 1257) | fn is_aieos_configured_false_openclaw_format() { function is_aieos_configured_false_no_config (line 1267) | fn is_aieos_configured_false_no_config() { function aieos_identity_parse_empty_object (line 1277) | fn aieos_identity_parse_empty_object() { function aieos_identity_parse_null_values (line 1286) | fn aieos_identity_parse_null_values() { function parse_aieos_identity_supports_official_generator_shape (line 1294) | fn parse_aieos_identity_supports_official_generator_shape() { function load_aieos_identity_from_file_supports_generator_shape (line 1426) | fn load_aieos_identity_from_file_supports_generator_shape() { function aieos_to_system_prompt_sorts_hashmap_sections_for_determinism (line 1457) | fn aieos_to_system_prompt_sorts_hashmap_sections_for_determinism() { FILE: src/integrations/mod.rs type IntegrationStatus (line 8) | pub enum IntegrationStatus { type IntegrationCategory (line 19) | pub enum IntegrationCategory { method label (line 32) | pub fn label(self) -> &'static str { method all (line 46) | pub fn all() -> &'static [Self] { type IntegrationEntry (line 62) | pub struct IntegrationEntry { function handle_command (line 70) | pub fn handle_command(command: crate::IntegrationCommands, config: &Conf... function show_integration_info (line 76) | fn show_integration_info(config: &Config, name: &str) -> Result<()> { function integration_category_all_includes_every_variant_once (line 180) | fn integration_category_all_includes_every_variant_once() { function handle_command_info_is_case_insensitive_for_known_integrations (line 197) | fn handle_command_info_is_case_insensitive_for_known_integrations() { function handle_command_info_returns_error_for_unknown_integration (line 214) | fn handle_command_info_returns_error_for_unknown_integration() { FILE: src/integrations/registry.rs function all_integrations (line 9) | pub fn all_integrations() -> Vec { function registry_has_entries (line 780) | fn registry_has_entries() { function all_categories_represented (line 790) | fn all_categories_represented() { function status_functions_dont_panic (line 799) | fn status_functions_dont_panic() { function no_duplicate_names (line 808) | fn no_duplicate_names() { function no_empty_names_or_descriptions (line 821) | fn no_empty_names_or_descriptions() { function telegram_active_when_configured (line 834) | fn telegram_active_when_configured() { function telegram_available_when_not_configured (line 851) | fn telegram_available_when_not_configured() { function imessage_active_when_configured (line 862) | fn imessage_active_when_configured() { function imessage_available_when_not_configured (line 873) | fn imessage_available_when_not_configured() { function matrix_active_when_configured (line 884) | fn matrix_active_when_configured() { function matrix_available_when_not_configured (line 900) | fn matrix_available_when_not_configured() { function coming_soon_integrations_stay_coming_soon (line 911) | fn coming_soon_integrations_stay_coming_soon() { function whatsapp_available_when_not_configured (line 924) | fn whatsapp_available_when_not_configured() { function email_available_when_not_configured (line 935) | fn email_available_when_not_configured() { function cron_active_when_enabled (line 946) | fn cron_active_when_enabled() { function cron_available_when_disabled (line 958) | fn cron_available_when_disabled() { function browser_active_when_enabled (line 970) | fn browser_active_when_enabled() { function browser_available_when_disabled (line 982) | fn browser_available_when_disabled() { function shell_and_filesystem_always_active (line 994) | fn shell_and_filesystem_always_active() { function macos_active_on_macos (line 1007) | fn macos_active_on_macos() { function category_counts_reasonable (line 1020) | fn category_counts_reasonable() { function regional_provider_aliases_activate_expected_ai_integrations (line 1041) | fn regional_provider_aliases_activate_expected_ai_integrations() { FILE: src/lib.rs type GatewayCommands (line 84) | pub enum GatewayCommands { type ServiceCommands (line 150) | pub enum ServiceCommands { type ChannelCommands (line 167) | pub enum ChannelCommands { type SkillCommands (line 241) | pub enum SkillCommands { type MigrateCommands (line 263) | pub enum MigrateCommands { type CronCommands (line 278) | pub enum CronCommands { type MemoryCommands (line 421) | pub enum MemoryCommands { type IntegrationCommands (line 460) | pub enum IntegrationCommands { type HardwareCommands (line 470) | pub enum HardwareCommands { type PeripheralCommands (line 514) | pub enum PeripheralCommands { FILE: src/main.rs function parse_temperature (line 45) | fn parse_temperature(s: &str) -> std::result::Result { function print_no_command_help (line 50) | fn print_no_command_help() -> Result<()> { function pause_after_no_command_help (line 66) | fn pause_after_no_command_help() { type CompletionShell (line 122) | enum CompletionShell { type EstopLevelArg (line 136) | enum EstopLevelArg { type Cli (line 153) | struct Cli { type Commands (line 162) | enum Commands { type PluginCommands (line 545) | enum PluginCommands { type ConfigCommands (line 566) | enum ConfigCommands { type EstopSubcommands (line 572) | enum EstopSubcommands { type AuthCommands (line 593) | enum AuthCommands { type ModelCommands (line 676) | enum ModelCommands { type DoctorCommands (line 707) | enum DoctorCommands { type MemoryCommands (line 736) | enum MemoryCommands { function main (line 767) | async fn main() -> Result<()> { function handle_estop_command (line 1413) | fn handle_estop_command( function build_engage_level (line 1484) | fn build_engage_level( function build_resume_selector (line 1524) | fn build_resume_selector( function print_estop_status (line 1546) | fn print_estop_status(state: &security::EstopState) { function write_shell_completion (line 1579) | fn write_shell_completion(shell: CompletionShell, writer: &mut... function resolve_gateway_addr (line 1603) | fn resolve_gateway_addr(config: &Config, port: Option, host: Option... function log_gateway_start (line 1610) | fn log_gateway_start(host: &str, port: u16) { function shutdown_gateway (line 1619) | async fn shutdown_gateway(host: &str, port: u16) -> Result<()> { function fetch_paircode (line 1640) | async fn fetch_paircode(host: &str, port: u16, new: bool) -> Result std::pat... function pending_oauth_secret_store (line 1715) | fn pending_oauth_secret_store(config: &Config) -> security::secrets::Sec... function set_owner_only_permissions (line 1723) | fn set_owner_only_permissions(path: &std::path::Path) -> Result<()> { function set_owner_only_permissions (line 1730) | fn set_owner_only_permissions(_path: &std::path::Path) -> Result<()> { function save_pending_oauth_login (line 1734) | fn save_pending_oauth_login(config: &Config, pending: &PendingOAuthLogin... function load_pending_oauth_login (line 1762) | fn load_pending_oauth_login(config: &Config, provider: &str) -> Result Result { function read_plain_input (line 1806) | fn read_plain_input(prompt: &str) -> Result { function extract_openai_account_id_for_profile (line 1811) | fn extract_openai_account_id_for_profile(access_token: &str) -> Option String { function handle_auth_command (line 1842) | async fn handle_auth_command(auth_command: AuthCommands, config: &Config... function cli_definition_has_no_flag_conflicts (line 2309) | fn cli_definition_has_no_flag_conflicts() { function onboard_help_includes_model_flag (line 2314) | fn onboard_help_includes_model_flag() { function onboard_cli_accepts_model_provider_and_api_key_in_quick_mode (line 2332) | fn onboard_cli_accepts_model_provider_and_api_key_in_quick_mode() { function completions_cli_parses_supported_shells (line 2365) | fn completions_cli_parses_supported_shells() { function completion_generation_mentions_binary_name (line 2377) | fn completion_generation_mentions_binary_name() { function onboard_cli_accepts_force_flag (line 2389) | fn onboard_cli_accepts_force_flag() { function onboard_cli_rejects_removed_interactive_flag (line 2400) | fn onboard_cli_rejects_removed_interactive_flag() { function onboard_cli_bare_parses (line 2406) | fn onboard_cli_bare_parses() { function cli_parses_estop_default_engage (line 2416) | fn cli_parses_estop_default_engage() { function cli_parses_estop_resume_domain (line 2436) | fn cli_parses_estop_resume_domain() { function agent_command_parses_with_temperature (line 2450) | fn agent_command_parses_with_temperature() { function agent_command_parses_without_temperature (line 2463) | fn agent_command_parses_without_temperature() { function agent_command_parses_session_state_file (line 2476) | fn agent_command_parses_session_state_file() { function agent_fallback_uses_config_default_temperature (line 2492) | fn agent_fallback_uses_config_default_temperature() { function agent_fallback_uses_hardcoded_when_config_uses_default (line 2506) | fn agent_fallback_uses_hardcoded_when_config_uses_default() { FILE: src/memory/backend.rs type MemoryBackendKind (line 2) | pub enum MemoryBackendKind { type MemoryBackendProfile (line 14) | pub struct MemoryBackendProfile { constant SQLITE_PROFILE (line 23) | const SQLITE_PROFILE: MemoryBackendProfile = MemoryBackendProfile { constant LUCID_PROFILE (line 32) | const LUCID_PROFILE: MemoryBackendProfile = MemoryBackendProfile { constant MARKDOWN_PROFILE (line 41) | const MARKDOWN_PROFILE: MemoryBackendProfile = MemoryBackendProfile { constant POSTGRES_PROFILE (line 50) | const POSTGRES_PROFILE: MemoryBackendProfile = MemoryBackendProfile { constant QDRANT_PROFILE (line 59) | const QDRANT_PROFILE: MemoryBackendProfile = MemoryBackendProfile { constant NONE_PROFILE (line 68) | const NONE_PROFILE: MemoryBackendProfile = MemoryBackendProfile { constant CUSTOM_PROFILE (line 77) | const CUSTOM_PROFILE: MemoryBackendProfile = MemoryBackendProfile { constant SELECTABLE_MEMORY_BACKENDS (line 86) | const SELECTABLE_MEMORY_BACKENDS: [MemoryBackendProfile; 4] = [ function selectable_memory_backends (line 93) | pub fn selectable_memory_backends() -> &'static [MemoryBackendProfile] { function default_memory_backend_key (line 97) | pub fn default_memory_backend_key() -> &'static str { function classify_memory_backend (line 101) | pub fn classify_memory_backend(backend: &str) -> MemoryBackendKind { function memory_backend_profile (line 113) | pub fn memory_backend_profile(backend: &str) -> MemoryBackendProfile { function classify_known_backends (line 130) | fn classify_known_backends() { function classify_unknown_backend (line 145) | fn classify_unknown_backend() { function selectable_backends_are_ordered_for_onboarding (line 150) | fn selectable_backends_are_ordered_for_onboarding() { function lucid_profile_is_sqlite_based_optional_backend (line 160) | fn lucid_profile_is_sqlite_based_optional_backend() { function unknown_profile_preserves_extensibility_defaults (line 168) | fn unknown_profile_preserves_extensibility_defaults() { FILE: src/memory/chunker.rs type Chunk (line 10) | pub struct Chunk { function chunk_markdown (line 24) | pub fn chunk_markdown(text: &str, max_tokens: usize) -> Vec { function split_on_headings (line 113) | fn split_on_headings(text: &str) -> Vec<(Option, String)> { function split_on_blank_lines (line 138) | fn split_on_blank_lines(text: &str) -> Vec { function split_on_lines (line 161) | fn split_on_lines(text: &str, max_chars: usize) -> Vec { function empty_text (line 185) | fn empty_text() { function single_short_paragraph (line 191) | fn single_short_paragraph() { function heading_sections (line 199) | fn heading_sections() { function respects_max_tokens (line 207) | fn respects_max_tokens() { function preserves_heading_in_split_sections (line 234) | fn preserves_heading_in_split_sections() { function indexes_are_sequential (line 251) | fn indexes_are_sequential() { function chunk_count_reasonable (line 260) | fn chunk_count_reasonable() { function headings_only_no_body (line 269) | fn headings_only_no_body() { function deeply_nested_headings_ignored (line 277) | fn deeply_nested_headings_ignored() { function very_long_single_line_no_newlines (line 289) | fn very_long_single_line_no_newlines() { function only_newlines_and_whitespace (line 298) | fn only_newlines_and_whitespace() { function max_tokens_zero (line 303) | fn max_tokens_zero() { function max_tokens_one (line 311) | fn max_tokens_one() { function unicode_content (line 319) | fn unicode_content() { function fts5_special_chars_in_content (line 329) | fn fts5_special_chars_in_content() { function multiple_blank_lines_between_paragraphs (line 337) | fn multiple_blank_lines_between_paragraphs() { function heading_at_end_of_text (line 346) | fn heading_at_end_of_text() { function single_heading_no_content (line 353) | fn single_heading_no_content() { function no_content_loss (line 361) | fn no_content_loss() { FILE: src/memory/cli.rs function handle_command (line 13) | pub async fn handle_command(command: crate::MemoryCommands, config: &Con... function create_cli_memory (line 34) | fn create_cli_memory(config: &Config) -> Result> { function handle_list (line 78) | async fn handle_list( function handle_get (line 124) | async fn handle_get(config: &Config, key: &str) -> Result<()> { function print_entry (line 156) | fn print_entry(entry: &super::traits::MemoryEntry) { function handle_stats (line 166) | async fn handle_stats(config: &Config) -> Result<()> { function handle_clear (line 201) | async fn handle_clear( function handle_clear_key (line 254) | async fn handle_clear_key(mem: &dyn Memory, key: &str, yes: bool) -> Res... function parse_category (line 300) | fn parse_category(s: &str) -> MemoryCategory { function truncate_content (line 309) | fn truncate_content(s: &str, max_len: usize) -> String { function parse_category_known_variants (line 323) | fn parse_category_known_variants() { function parse_category_custom_fallback (line 332) | fn parse_category_custom_fallback() { function truncate_content_short_text_unchanged (line 340) | fn truncate_content_short_text_unchanged() { function truncate_content_long_text_truncated (line 345) | fn truncate_content_long_text_truncated() { function truncate_content_multiline_uses_first_line (line 352) | fn truncate_content_multiline_uses_first_line() { function truncate_content_empty_string (line 357) | fn truncate_content_empty_string() { FILE: src/memory/consolidation.rs type ConsolidationResult (line 16) | pub struct ConsolidationResult { constant CONSOLIDATION_SYSTEM_PROMPT (line 23) | const CONSOLIDATION_SYSTEM_PROMPT: &str = r#"You are a memory consolidat... function consolidate_turn (line 36) | pub async fn consolidate_turn( function parse_consolidation_response (line 91) | fn parse_consolidation_response(raw: &str, fallback_text: &str) -> Conso... function parse_valid_json_response (line 126) | fn parse_valid_json_response() { function parse_json_with_null_memory (line 137) | fn parse_json_with_null_memory() { function parse_json_wrapped_in_code_block (line 145) | fn parse_json_wrapped_in_code_block() { function fallback_on_malformed_response (line 153) | fn fallback_on_malformed_response() { function fallback_truncates_long_text (line 161) | fn fallback_truncates_long_text() { function fallback_truncates_cjk_text_without_panic (line 169) | fn fallback_truncates_cjk_text_without_panic() { FILE: src/memory/embeddings.rs type EmbeddingProvider (line 5) | pub trait EmbeddingProvider: Send + Sync { method name (line 7) | fn name(&self) -> &str; method dimensions (line 10) | fn dimensions(&self) -> usize; method embed (line 13) | async fn embed(&self, texts: &[&str]) -> anyhow::Result>>; method embed_one (line 16) | async fn embed_one(&self, text: &str) -> anyhow::Result> { method name (line 30) | fn name(&self) -> &str { method dimensions (line 34) | fn dimensions(&self) -> usize { method embed (line 38) | async fn embed(&self, _texts: &[&str]) -> anyhow::Result>> { method name (line 98) | fn name(&self) -> &str { method dimensions (line 102) | fn dimensions(&self) -> usize { method embed (line 106) | async fn embed(&self, texts: &[&str]) -> anyhow::Result>> { type NoopEmbedding (line 26) | pub struct NoopEmbedding; type OpenAiEmbedding (line 45) | pub struct OpenAiEmbedding { method new (line 53) | pub fn new(base_url: &str, api_key: &str, model: &str, dims: usize) ->... method http_client (line 62) | fn http_client(&self) -> reqwest::Client { method has_explicit_api_path (line 66) | fn has_explicit_api_path(&self) -> bool { method has_embeddings_endpoint (line 75) | fn has_embeddings_endpoint(&self) -> bool { method embeddings_url (line 83) | fn embeddings_url(&self) -> String { function create_embedding_provider (line 159) | pub fn create_embedding_provider( function noop_name (line 198) | fn noop_name() { function noop_embed_returns_empty (line 205) | async fn noop_embed_returns_empty() { function factory_none (line 212) | fn factory_none() { function factory_openai (line 218) | fn factory_openai() { function factory_openrouter (line 225) | fn factory_openrouter() { function factory_custom_url (line 237) | fn factory_custom_url() { function noop_embed_one_returns_error (line 246) | async fn noop_embed_one_returns_error() { function noop_embed_empty_batch (line 254) | async fn noop_embed_empty_batch() { function noop_embed_multiple_texts (line 261) | async fn noop_embed_multiple_texts() { function factory_empty_string_returns_noop (line 268) | fn factory_empty_string_returns_noop() { function factory_unknown_provider_returns_noop (line 274) | fn factory_unknown_provider_returns_noop() { function factory_custom_empty_url (line 280) | fn factory_custom_empty_url() { function factory_openai_no_api_key (line 287) | fn factory_openai_no_api_key() { function openai_trailing_slash_stripped (line 294) | fn openai_trailing_slash_stripped() { function openai_dimensions_custom (line 300) | fn openai_dimensions_custom() { function embeddings_url_openrouter (line 306) | fn embeddings_url_openrouter() { function embeddings_url_standard_openai (line 320) | fn embeddings_url_standard_openai() { function embeddings_url_base_with_v1_no_duplicate (line 326) | fn embeddings_url_base_with_v1_no_duplicate() { function embeddings_url_non_v1_api_path_uses_raw_suffix (line 332) | fn embeddings_url_non_v1_api_path_uses_raw_suffix() { function embeddings_url_custom_full_endpoint (line 346) | fn embeddings_url_custom_full_endpoint() { FILE: src/memory/hygiene.rs constant HYGIENE_INTERVAL_HOURS (line 10) | const HYGIENE_INTERVAL_HOURS: i64 = 12; constant STATE_FILE (line 11) | const STATE_FILE: &str = "memory_hygiene_state.json"; type HygieneReport (line 14) | struct HygieneReport { method total_actions (line 23) | fn total_actions(&self) -> u64 { type HygieneState (line 33) | struct HygieneState { function run_if_due (line 41) | pub fn run_if_due(config: &MemoryConfig, workspace_dir: &Path) -> Result... function should_run_now (line 80) | fn should_run_now(workspace_dir: &Path) -> Result { function write_state (line 104) | fn write_state(workspace_dir: &Path, report: &HygieneReport) -> Result<(... function state_path (line 119) | fn state_path(workspace_dir: &Path) -> PathBuf { function archive_daily_memory_files (line 123) | fn archive_daily_memory_files(workspace_dir: &Path, archive_after_days: ... function archive_session_files (line 167) | fn archive_session_files(workspace_dir: &Path, archive_after_days: u32) ... function purge_memory_archives (line 215) | fn purge_memory_archives(workspace_dir: &Path, purge_after_days: u32) ->... function purge_session_archives (line 253) | fn purge_session_archives(workspace_dir: &Path, purge_after_days: u32) -... function prune_conversation_rows (line 298) | fn prune_conversation_rows(workspace_dir: &Path, retention_days: u32) ->... function memory_date_from_filename (line 321) | fn memory_date_from_filename(filename: &str) -> Option { function date_prefix (line 327) | fn date_prefix(filename: &str) -> Option { function is_older_than (line 341) | fn is_older_than(path: &Path, cutoff: SystemTime) -> bool { function move_to_archive (line 348) | fn move_to_archive(src: &Path, archive_dir: &Path) -> Result<()> { function unique_archive_target (line 358) | fn unique_archive_target(archive_dir: &Path, filename: &str) -> PathBuf { function split_name (line 379) | fn split_name(filename: &str) -> (&str, &str) { function default_cfg (line 392) | fn default_cfg() -> MemoryConfig { function archives_old_daily_memory_files (line 397) | fn archives_old_daily_memory_files() { function archives_old_session_files (line 427) | fn archives_old_session_files() { function skips_second_run_within_cadence_window (line 453) | fn skips_second_run_within_cadence_window() { function purges_old_memory_archives (line 482) | fn purges_old_memory_archives() { function prunes_old_conversation_rows_in_sqlite_backend (line 507) | async fn prunes_old_conversation_rows_in_sqlite_backend() { FILE: src/memory/knowledge_graph.rs type NodeType (line 22) | pub enum NodeType { method as_str (line 31) | pub fn as_str(&self) -> &'static str { method parse (line 41) | pub fn parse(s: &str) -> anyhow::Result { type Relation (line 56) | pub enum Relation { method as_str (line 65) | pub fn as_str(&self) -> &'static str { method parse (line 75) | pub fn parse(s: &str) -> anyhow::Result { type KnowledgeNode (line 89) | pub struct KnowledgeNode { type KnowledgeEdge (line 102) | pub struct KnowledgeEdge { type SearchResult (line 110) | pub struct SearchResult { type GraphStats (line 117) | pub struct GraphStats { type KnowledgeGraph (line 127) | pub struct KnowledgeGraph { method new (line 136) | pub fn new(db_path: &Path, max_nodes: usize) -> anyhow::Result { method add_node (line 205) | pub fn add_node( method add_edge (line 258) | pub fn add_edge(&self, from_id: &str, to_id: &str, relation: Relation)... method get_node (line 287) | pub fn get_node(&self, id: &str) -> anyhow::Result anyhow::Result anyhow::Result anyhow::Result anyhow::Result { function row_to_node (line 521) | fn row_to_node(row: &rusqlite::Row<'_>) -> anyhow::Result { function test_graph (line 561) | fn test_graph() -> (TempDir, KnowledgeGraph) { function add_node_returns_unique_id (line 569) | fn add_node_returns_unique_id() { function get_node_returns_stored_data (line 587) | fn get_node_returns_stored_data() { function get_node_missing_returns_none (line 607) | fn get_node_missing_returns_none() { function add_edge_creates_relationship (line 613) | fn add_edge_creates_relationship() { function add_edge_rejects_missing_node (line 631) | fn add_edge_rejects_missing_node() { function query_by_tags_filters_correctly (line 643) | fn query_by_tags_filters_correctly() { function query_by_similarity_returns_ranked_results (line 672) | fn query_by_similarity_returns_ranked_results() { function subgraph_traversal_collects_connected_nodes (line 699) | fn subgraph_traversal_collects_connected_nodes() { function expert_ranking_by_authored_contributions (line 719) | fn expert_ranking_by_authored_contributions() { function max_nodes_limit_enforced (line 759) | fn max_nodes_limit_enforced() { function stats_reports_correct_counts (line 777) | fn stats_reports_correct_counts() { function node_type_roundtrip (line 800) | fn node_type_roundtrip() { function relation_roundtrip (line 813) | fn relation_roundtrip() { FILE: src/memory/lucid.rs type LucidMemory (line 12) | pub struct LucidMemory { constant DEFAULT_LUCID_CMD (line 25) | const DEFAULT_LUCID_CMD: &'static str = "lucid"; constant DEFAULT_TOKEN_BUDGET (line 26) | const DEFAULT_TOKEN_BUDGET: usize = 200; constant DEFAULT_RECALL_TIMEOUT_MS (line 29) | const DEFAULT_RECALL_TIMEOUT_MS: u64 = 500; constant DEFAULT_STORE_TIMEOUT_MS (line 30) | const DEFAULT_STORE_TIMEOUT_MS: u64 = 800; constant DEFAULT_LOCAL_HIT_THRESHOLD (line 31) | const DEFAULT_LOCAL_HIT_THRESHOLD: usize = 3; constant DEFAULT_FAILURE_COOLDOWN_MS (line 32) | const DEFAULT_FAILURE_COOLDOWN_MS: u64 = 15_000; method new (line 34) | pub fn new(workspace_dir: &Path, local: SqliteMemory) -> Self { method with_options (line 80) | fn with_options( method read_env_usize (line 103) | fn read_env_usize(name: &str, default: usize, min: usize) -> usize { method read_env_duration_ms (line 110) | fn read_env_duration_ms(name: &str, default_ms: u64, min_ms: u64) -> D... method in_failure_cooldown (line 118) | fn in_failure_cooldown(&self) -> bool { method mark_failure_now (line 125) | fn mark_failure_now(&self) { method clear_failure (line 130) | fn clear_failure(&self) { method to_lucid_type (line 135) | fn to_lucid_type(category: &MemoryCategory) -> &'static str { method to_memory_category (line 144) | fn to_memory_category(label: &str) -> MemoryCategory { method merge_results (line 158) | fn merge_results( method parse_lucid_context (line 188) | fn parse_lucid_context(raw: &str) -> Vec { method run_lucid_command_raw (line 235) | async fn run_lucid_command_raw( method run_lucid_command (line 258) | async fn run_lucid_command( method build_store_args (line 266) | fn build_store_args(&self, key: &str, content: &str, category: &Memory... method build_recall_args (line 276) | fn build_recall_args(&self, query: &str) -> Vec { method sync_to_lucid_async (line 285) | async fn sync_to_lucid_async(&self, key: &str, content: &str, category... method recall_from_lucid (line 296) | async fn recall_from_lucid(&self, query: &str) -> anyhow::Result &str { method store (line 309) | async fn store( method recall (line 323) | async fn recall( method get (line 362) | async fn get(&self, key: &str) -> anyhow::Result> { method list (line 366) | async fn list( method forget (line 374) | async fn forget(&self, key: &str) -> anyhow::Result { method count (line 378) | async fn count(&self) -> anyhow::Result { method health_check (line 382) | async fn health_check(&self) -> bool { function write_fake_lucid_script (line 394) | fn write_fake_lucid_script(dir: &Path) -> String { function write_delayed_lucid_script (line 426) | fn write_delayed_lucid_script(dir: &Path) -> String { function write_probe_lucid_script (line 458) | fn write_probe_lucid_script(dir: &Path, marker_path: &Path) -> String { function test_memory (line 492) | fn test_memory(workspace: &Path, cmd: String) -> LucidMemory { function lucid_name (line 507) | async fn lucid_name() { function store_succeeds_when_lucid_missing (line 514) | async fn store_succeeds_when_lucid_missing() { function recall_merges_lucid_and_local_results (line 529) | async fn recall_merges_lucid_and_local_results() { function recall_handles_lucid_cold_start_delay_within_timeout (line 553) | async fn recall_handles_lucid_cold_start_delay_within_timeout() { function recall_skips_lucid_when_local_hits_are_enough (line 579) | async fn recall_skips_lucid_when_local_hits_are_enough() { function write_failing_lucid_script (line 618) | fn write_failing_lucid_script(dir: &Path, marker_path: &Path) -> String { function failure_cooldown_avoids_repeated_lucid_calls (line 649) | async fn failure_cooldown_avoids_repeated_lucid_calls() { FILE: src/memory/markdown.rs type MarkdownMemory (line 12) | pub struct MarkdownMemory { method new (line 17) | pub fn new(workspace_dir: &Path) -> Self { method memory_dir (line 23) | fn memory_dir(&self) -> PathBuf { method core_path (line 27) | fn core_path(&self) -> PathBuf { method daily_path (line 31) | fn daily_path(&self) -> PathBuf { method ensure_dirs (line 36) | async fn ensure_dirs(&self) -> anyhow::Result<()> { method append_to_file (line 41) | async fn append_to_file(&self, path: &Path, content: &str) -> anyhow::... method parse_entries_from_file (line 66) | fn parse_entries_from_file( method read_all_entries (line 99) | async fn read_all_entries(&self) -> anyhow::Result> { method name (line 137) | fn name(&self) -> &str { method store (line 141) | async fn store( method recall (line 156) | async fn recall( method get (line 194) | async fn get(&self, key: &str) -> anyhow::Result> { method list (line 201) | async fn list( method forget (line 213) | async fn forget(&self, _key: &str) -> anyhow::Result { method count (line 219) | async fn count(&self) -> anyhow::Result { method health_check (line 224) | async fn health_check(&self) -> bool { function temp_workspace (line 234) | fn temp_workspace() -> (TempDir, MarkdownMemory) { function markdown_name (line 241) | async fn markdown_name() { function markdown_health_check (line 247) | async fn markdown_health_check() { function markdown_store_core (line 253) | async fn markdown_store_core() { function markdown_store_daily (line 263) | async fn markdown_store_daily() { function markdown_recall_keyword (line 274) | async fn markdown_recall_keyword() { function markdown_recall_no_match (line 294) | async fn markdown_recall_no_match() { function markdown_count (line 304) | async fn markdown_count() { function markdown_list_by_category (line 317) | async fn markdown_list_by_category() { function markdown_forget_is_noop (line 334) | async fn markdown_forget_is_noop() { function markdown_empty_recall (line 344) | async fn markdown_empty_recall() { function markdown_empty_count (line 351) | async fn markdown_empty_count() { FILE: src/memory/mod.rs function create_memory_with_builders (line 42) | fn create_memory_with_builders( function effective_memory_backend_name (line 73) | pub fn effective_memory_backend_name( function is_assistant_autosave_key (line 89) | pub fn is_assistant_autosave_key(key: &str) -> bool { function should_skip_autosave_content (line 96) | pub fn should_skip_autosave_content(content: &str) -> bool { type ResolvedEmbeddingConfig (line 110) | struct ResolvedEmbeddingConfig { method fmt (line 118) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { function embedding_provider_env_key (line 130) | fn embedding_provider_env_key(provider: &str) -> Option { function resolve_embedding_config (line 143) | fn resolve_embedding_config( function create_memory (line 211) | pub fn create_memory( function create_memory_with_storage (line 220) | pub fn create_memory_with_storage( function create_memory_with_storage_and_routes (line 230) | pub fn create_memory_with_storage_and_routes( function create_memory_for_migration (line 389) | pub fn create_memory_for_migration( function create_response_cache (line 418) | pub fn create_response_cache(config: &MemoryConfig, workspace_dir: &Path... function factory_sqlite (line 450) | fn factory_sqlite() { function assistant_autosave_key_detection_matches_legacy_patterns (line 461) | fn assistant_autosave_key_detection_matches_legacy_patterns() { function autosave_content_filter_drops_cron_and_distilled_noise (line 470) | fn autosave_content_filter_drops_cron_and_distilled_noise() { function factory_markdown (line 487) | fn factory_markdown() { function factory_lucid (line 498) | fn factory_lucid() { function factory_none_uses_noop_memory (line 509) | fn factory_none_uses_noop_memory() { function factory_unknown_falls_back_to_markdown (line 520) | fn factory_unknown_falls_back_to_markdown() { function migration_factory_lucid (line 531) | fn migration_factory_lucid() { function migration_factory_none_is_rejected (line 538) | fn migration_factory_none_is_rejected() { function effective_backend_name_prefers_storage_override (line 547) | fn effective_backend_name_prefers_storage_override() { function factory_postgres_without_db_url_is_rejected (line 560) | fn factory_postgres_without_db_url_is_rejected() { function resolve_embedding_config_uses_base_config_when_model_is_not_hint (line 584) | fn resolve_embedding_config_uses_base_config_when_model_is_not_hint() { function resolve_embedding_config_uses_matching_route_with_api_key_override (line 605) | fn resolve_embedding_config_uses_matching_route_with_api_key_override() { function resolve_embedding_config_falls_back_when_hint_is_missing (line 633) | fn resolve_embedding_config_falls_back_when_hint_is_missing() { function resolve_embedding_config_falls_back_when_route_is_invalid (line 654) | fn resolve_embedding_config_falls_back_when_route_is_invalid() { function resolve_embedding_config_uses_embedding_provider_env_key_not_default_provider_key (line 689) | fn resolve_embedding_config_uses_embedding_provider_env_key_not_default_... FILE: src/memory/none.rs type NoneMemory (line 9) | pub struct NoneMemory; method new (line 12) | pub fn new() -> Self { method name (line 19) | fn name(&self) -> &str { method store (line 23) | async fn store( method recall (line 33) | async fn recall( method get (line 42) | async fn get(&self, _key: &str) -> anyhow::Result> { method list (line 46) | async fn list( method forget (line 54) | async fn forget(&self, _key: &str) -> anyhow::Result { method count (line 58) | async fn count(&self) -> anyhow::Result { method health_check (line 62) | async fn health_check(&self) -> bool { function none_memory_is_noop (line 72) | async fn none_memory_is_noop() { FILE: src/memory/postgres.rs constant POSTGRES_CONNECT_TIMEOUT_CAP_SECS (line 12) | const POSTGRES_CONNECT_TIMEOUT_CAP_SECS: u64 = 300; type PostgresMemory (line 18) | pub struct PostgresMemory { method new (line 24) | pub fn new( method initialize_client (line 50) | fn initialize_client( method init_schema (line 84) | fn init_schema(client: &mut Client, schema_ident: &str, qualified_tabl... method category_to_str (line 108) | fn category_to_str(category: &MemoryCategory) -> String { method parse_category (line 117) | fn parse_category(value: &str) -> MemoryCategory { method row_to_entry (line 126) | fn row_to_entry(row: &Row) -> Result { function validate_identifier (line 141) | fn validate_identifier(value: &str, field_name: &str) -> Result<()> { function quote_identifier (line 164) | fn quote_identifier(value: &str) -> String { method name (line 170) | fn name(&self) -> &str { method store (line 174) | async fn store( method recall (line 212) | async fn recall( method get (line 251) | async fn get(&self, key: &str) -> Result> { method list (line 273) | async fn list( method forget (line 305) | async fn forget(&self, key: &str) -> Result { method count (line 319) | async fn count(&self) -> Result { method health_check (line 334) | async fn health_check(&self) -> bool { function valid_identifiers_pass_validation (line 347) | fn valid_identifiers_pass_validation() { function invalid_identifiers_are_rejected (line 353) | fn invalid_identifiers_are_rejected() { function parse_category_maps_known_and_custom_values (line 360) | fn parse_category_maps_known_and_custom_values() { function new_does_not_panic_inside_tokio_runtime (line 377) | async fn new_does_not_panic_inside_tokio_runtime() { FILE: src/memory/qdrant.rs type QdrantMemory (line 15) | pub struct QdrantMemory { method new (line 33) | pub async fn new( method new_lazy (line 52) | pub fn new_lazy( method ensure_initialized (line 72) | async fn ensure_initialized(&self) -> Result<()> { method request (line 82) | fn request(&self, method: reqwest::Method, path: &str) -> reqwest::Req... method ensure_collection (line 93) | async fn ensure_collection(&self) -> Result<()> { method category_to_str (line 163) | fn category_to_str(category: &MemoryCategory) -> String { method parse_category (line 172) | fn parse_category(value: &str) -> MemoryCategory { type MemoryPayload (line 184) | struct MemoryPayload { type QdrantSearchResult (line 195) | struct QdrantSearchResult { type QdrantScoredPoint (line 200) | struct QdrantScoredPoint { type QdrantScrollResult (line 208) | struct QdrantScrollResult { type QdrantScrollPoints (line 213) | struct QdrantScrollPoints { type QdrantPoint (line 218) | struct QdrantPoint { method name (line 225) | fn name(&self) -> &str { method store (line 229) | async fn store( method recall (line 289) | async fn recall( method get (line 373) | async fn get(&self, key: &str) -> Result> { method list (line 428) | async fn list( method forget (line 506) | async fn forget(&self, key: &str) -> Result { method count (line 540) | async fn count(&self) -> Result { method health_check (line 571) | async fn health_check(&self) -> bool { function category_to_str_maps_known_categories (line 583) | fn category_to_str_maps_known_categories() { function parse_category_maps_known_and_custom_values (line 600) | fn parse_category_maps_known_and_custom_values() { function memory_payload_serializes_correctly (line 614) | fn memory_payload_serializes_correctly() { function memory_payload_skips_none_session_id (line 630) | fn memory_payload_skips_none_session_id() { FILE: src/memory/response_cache.rs type InMemoryEntry (line 17) | struct InMemoryEntry { type ResponseCache (line 29) | pub struct ResponseCache { method new (line 41) | pub fn new(workspace_dir: &Path, ttl_minutes: u32, max_entries: usize)... method with_hot_cache (line 46) | pub fn with_hot_cache( method cache_key (line 89) | pub fn cache_key(model: &str, system_prompt: Option<&str>, user_prompt... method get (line 107) | pub fn get(&self, key: &str) -> Result> { method put (line 169) | pub fn put(&self, key: &str, model: &str, response: &str, token_count:... method promote_to_hot (line 208) | fn promote_to_hot(&self, key: &str, response: &str, token_count: u32) { method stats (line 245) | pub fn stats(&self) -> Result<(usize, u64, u64)> { method clear (line 268) | pub fn clear(&self) -> Result { function temp_cache (line 281) | fn temp_cache(ttl_minutes: u32) -> (TempDir, ResponseCache) { function cache_key_deterministic (line 288) | fn cache_key_deterministic() { function cache_key_varies_by_model (line 296) | fn cache_key_varies_by_model() { function cache_key_varies_by_system_prompt (line 303) | fn cache_key_varies_by_system_prompt() { function cache_key_varies_by_prompt (line 310) | fn cache_key_varies_by_prompt() { function put_and_get (line 317) | fn put_and_get() { function miss_returns_none (line 333) | fn miss_returns_none() { function expired_entry_returns_none (line 340) | fn expired_entry_returns_none() { function hit_count_incremented (line 353) | fn hit_count_incremented() { function tokens_saved_calculated (line 369) | fn tokens_saved_calculated() { function lru_eviction (line 385) | fn lru_eviction() { function clear_wipes_all (line 401) | fn clear_wipes_all() { function stats_empty_cache (line 419) | fn stats_empty_cache() { function overwrite_same_key (line 428) | fn overwrite_same_key() { function unicode_prompt_handling (line 443) | fn unicode_prompt_handling() { function lru_eviction_keeps_most_recent (line 458) | fn lru_eviction_keeps_most_recent() { function cache_handles_zero_max_entries (line 490) | fn cache_handles_zero_max_entries() { function cache_concurrent_reads_no_panic (line 503) | fn cache_concurrent_reads_no_panic() { FILE: src/memory/snapshot.rs constant SNAPSHOT_FILENAME (line 17) | pub const SNAPSHOT_FILENAME: &str = "MEMORY_SNAPSHOT.md"; constant SNAPSHOT_HEADER (line 20) | const SNAPSHOT_HEADER: &str = "# 🧠 ZeroClaw Memory Snapshot\n\n\ function export_snapshot (line 28) | pub fn export_snapshot(workspace_dir: &Path) -> Result { function hydrate_from_snapshot (line 96) | pub fn hydrate_from_snapshot(workspace_dir: &Path) -> Result { function should_hydrate (line 185) | pub fn should_hydrate(workspace_dir: &Path) -> bool { function snapshot_path (line 202) | fn snapshot_path(workspace_dir: &Path) -> PathBuf { function parse_snapshot (line 207) | fn parse_snapshot(input: &str) -> Vec<(String, String)> { function parse_snapshot_basic (line 268) | fn parse_snapshot_basic() { function parse_snapshot_empty (line 305) | fn parse_snapshot_empty() { function parse_snapshot_multiline_content (line 312) | fn parse_snapshot_multiline_content() { function export_no_db_returns_zero (line 331) | fn export_no_db_returns_zero() { function export_and_hydrate_roundtrip (line 338) | fn export_and_hydrate_roundtrip() { function should_hydrate_only_when_needed (line 430) | fn should_hydrate_only_when_needed() { function hydrate_no_snapshot_returns_zero (line 465) | fn hydrate_no_snapshot_returns_zero() { FILE: src/memory/sqlite.rs constant SQLITE_OPEN_TIMEOUT_CAP_SECS (line 18) | const SQLITE_OPEN_TIMEOUT_CAP_SECS: u64 = 300; type SqliteMemory (line 28) | pub struct SqliteMemory { method new (line 38) | pub fn new(workspace_dir: &Path) -> anyhow::Result { method with_embedder (line 54) | pub fn with_embedder( method open_connection (line 97) | fn open_connection( method init_schema (line 128) | fn init_schema(conn: &Connection) -> anyhow::Result<()> { method category_to_str (line 189) | fn category_to_str(cat: &MemoryCategory) -> String { method str_to_category (line 198) | fn str_to_category(s: &str) -> MemoryCategory { method content_hash (line 210) | fn content_hash(text: &str) -> String { method get_or_compute_embedding (line 225) | async fn get_or_compute_embedding(&self, text: &str) -> anyhow::Result... method fts5_search (line 288) | fn fts5_search( method vector_search (line 334) | fn vector_search( method reindex (line 381) | pub async fn reindex(&self) -> anyhow::Result { method name (line 435) | fn name(&self) -> &str { method store (line 439) | async fn store( method recall (line 479) | async fn recall( method get (line 655) | async fn get(&self, key: &str) -> anyhow::Result> { method list (line 685) | async fn list( method forget (line 751) | async fn forget(&self, key: &str) -> anyhow::Result { method count (line 763) | async fn count(&self) -> anyhow::Result { method health_check (line 776) | async fn health_check(&self) -> bool { function temp_sqlite (line 789) | fn temp_sqlite() -> (TempDir, SqliteMemory) { function sqlite_name (line 796) | async fn sqlite_name() { function sqlite_health (line 802) | async fn sqlite_health() { function sqlite_store_and_get (line 808) | async fn sqlite_store_and_get() { function sqlite_store_upsert (line 823) | async fn sqlite_store_upsert() { function sqlite_recall_keyword (line 838) | async fn sqlite_recall_keyword() { function sqlite_recall_multi_keyword (line 863) | async fn sqlite_recall_multi_keyword() { function sqlite_recall_no_match (line 879) | async fn sqlite_recall_no_match() { function sqlite_forget (line 889) | async fn sqlite_forget() { function sqlite_forget_nonexistent (line 902) | async fn sqlite_forget_nonexistent() { function sqlite_list_all (line 909) | async fn sqlite_list_all() { function sqlite_list_by_category (line 926) | async fn sqlite_list_by_category() { function sqlite_count_empty (line 946) | async fn sqlite_count_empty() { function sqlite_get_nonexistent (line 952) | async fn sqlite_get_nonexistent() { function sqlite_db_persists (line 958) | async fn sqlite_db_persists() { function sqlite_category_roundtrip (line 976) | async fn sqlite_category_roundtrip() { function fts5_bm25_ranking (line 1000) | async fn fts5_bm25_ranking() { function fts5_multi_word_query (line 1040) | async fn fts5_multi_word_query() { function recall_empty_query_returns_empty (line 1059) | async fn recall_empty_query_returns_empty() { function recall_whitespace_query_returns_empty (line 1069) | async fn recall_whitespace_query_returns_empty() { function content_hash_deterministic (line 1081) | fn content_hash_deterministic() { function content_hash_different_inputs (line 1088) | fn content_hash_different_inputs() { function schema_has_fts5_table (line 1097) | async fn schema_has_fts5_table() { function schema_has_embedding_cache (line 1112) | async fn schema_has_embedding_cache() { function schema_memories_has_embedding_column (line 1126) | async fn schema_memories_has_embedding_column() { function fts5_syncs_on_insert (line 1137) | async fn fts5_syncs_on_insert() { function fts5_syncs_on_delete (line 1160) | async fn fts5_syncs_on_delete() { function fts5_syncs_on_update (line 1184) | async fn fts5_syncs_on_update() { function open_with_timeout_succeeds_when_fast (line 1223) | fn open_with_timeout_succeeds_when_fast() { function open_with_timeout_store_recall_unchanged (line 1235) | async fn open_with_timeout_store_recall_unchanged() { function with_embedder_noop (line 1261) | fn with_embedder_noop() { function reindex_rebuilds_fts (line 1272) | async fn reindex_rebuilds_fts() { function recall_respects_limit (line 1293) | async fn recall_respects_limit() { function recall_results_have_scores (line 1313) | async fn recall_results_have_scores() { function recall_with_quotes_in_query (line 1329) | async fn recall_with_quotes_in_query() { function recall_with_asterisk_in_query (line 1341) | async fn recall_with_asterisk_in_query() { function recall_with_parentheses_in_query (line 1351) | async fn recall_with_parentheses_in_query() { function recall_with_sql_injection_attempt (line 1361) | async fn recall_with_sql_injection_attempt() { function store_empty_content (line 1379) | async fn store_empty_content() { function store_empty_key (line 1389) | async fn store_empty_key() { function store_very_long_content (line 1399) | async fn store_very_long_content() { function store_unicode_and_emoji (line 1410) | async fn store_unicode_and_emoji() { function store_content_with_newlines_and_tabs (line 1425) | async fn store_content_with_newlines_and_tabs() { function recall_single_character_query (line 1438) | async fn recall_single_character_query() { function recall_limit_zero (line 1450) | async fn recall_limit_zero() { function recall_limit_one (line 1460) | async fn recall_limit_one() { function recall_matches_by_key_not_just_content (line 1473) | async fn recall_matches_by_key_not_just_content() { function recall_unicode_query (line 1489) | async fn recall_unicode_query() { function schema_idempotent_reopen (line 1501) | async fn schema_idempotent_reopen() { function schema_triple_open (line 1522) | async fn schema_triple_open() { function forget_then_recall_no_ghost_results (line 1533) | async fn forget_then_recall_no_ghost_results() { function forget_and_re_store_same_key (line 1552) | async fn forget_and_re_store_same_key() { function reindex_empty_db (line 1569) | async fn reindex_empty_db() { function reindex_twice_is_safe (line 1576) | async fn reindex_twice_is_safe() { function content_hash_empty_string (line 1592) | fn content_hash_empty_string() { function content_hash_unicode (line 1599) | fn content_hash_unicode() { function content_hash_long_input (line 1608) | fn content_hash_long_input() { function category_roundtrip_custom_with_spaces (line 1617) | fn category_roundtrip_custom_with_spaces() { function category_roundtrip_empty_custom (line 1626) | fn category_roundtrip_empty_custom() { function list_custom_category (line 1637) | async fn list_custom_category() { function list_empty_db (line 1667) | async fn list_empty_db() { function store_and_recall_with_session_id (line 1676) | async fn store_and_recall_with_session_id() { function recall_no_session_filter_returns_all (line 1696) | async fn recall_no_session_filter_returns_all() { function cross_session_recall_isolation (line 1714) | async fn cross_session_recall_isolation() { function list_with_session_filter (line 1735) | async fn list_with_session_filter() { function schema_migration_idempotent_on_reopen (line 1767) | async fn schema_migration_idempotent_on_reopen() { function sqlite_concurrent_writes_no_data_loss (line 1791) | async fn sqlite_concurrent_writes_no_data_loss() { function sqlite_concurrent_read_write_no_panic (line 1822) | async fn sqlite_concurrent_read_write_no_panic() { function sqlite_reindex_preserves_data (line 1867) | async fn sqlite_reindex_preserves_data() { function sqlite_reindex_idempotent (line 1887) | async fn sqlite_reindex_idempotent() { FILE: src/memory/traits.rs type MemoryEntry (line 6) | pub struct MemoryEntry { method fmt (line 17) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { type MemoryCategory (line 31) | pub enum MemoryCategory { method serialize (line 43) | fn serialize(&self, serializer: S) -> Result>(deserializer: D) -> Result... method fmt (line 61) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { type Memory (line 73) | pub trait Memory: Send + Sync { method name (line 75) | fn name(&self) -> &str; method store (line 78) | async fn store( method recall (line 87) | async fn recall( method get (line 95) | async fn get(&self, key: &str) -> anyhow::Result>; method list (line 98) | async fn list( method forget (line 105) | async fn forget(&self, key: &str) -> anyhow::Result; method count (line 108) | async fn count(&self) -> anyhow::Result; method health_check (line 111) | async fn health_check(&self) -> bool; function memory_category_display_outputs_expected_values (line 119) | fn memory_category_display_outputs_expected_values() { function memory_category_serde_uses_snake_case (line 130) | fn memory_category_serde_uses_snake_case() { function memory_category_custom_roundtrip (line 141) | fn memory_category_custom_roundtrip() { function memory_entry_roundtrip_preserves_optional_fields (line 150) | fn memory_entry_roundtrip_preserves_optional_fields() { FILE: src/memory/vector.rs function cosine_similarity (line 4) | pub fn cosine_similarity(a: &[f32], b: &[f32]) -> f32 { function vec_to_bytes (line 38) | pub fn vec_to_bytes(v: &[f32]) -> Vec { function bytes_to_vec (line 47) | pub fn bytes_to_vec(bytes: &[u8]) -> Vec { type ScoredResult (line 59) | pub struct ScoredResult { function hybrid_merge (line 72) | pub fn hybrid_merge( function cosine_identical_vectors (line 145) | fn cosine_identical_vectors() { function cosine_orthogonal_vectors (line 152) | fn cosine_orthogonal_vectors() { function cosine_similar_vectors (line 160) | fn cosine_similar_vectors() { function cosine_empty_returns_zero (line 168) | fn cosine_empty_returns_zero() { function cosine_mismatched_lengths (line 173) | fn cosine_mismatched_lengths() { function cosine_zero_vector (line 178) | fn cosine_zero_vector() { function vec_bytes_roundtrip (line 185) | fn vec_bytes_roundtrip() { function vec_bytes_empty (line 193) | fn vec_bytes_empty() { function hybrid_merge_vector_only (line 201) | fn hybrid_merge_vector_only() { function hybrid_merge_keyword_only (line 210) | fn hybrid_merge_keyword_only() { function hybrid_merge_deduplicates (line 218) | fn hybrid_merge_deduplicates() { function hybrid_merge_respects_limit (line 232) | fn hybrid_merge_respects_limit() { function hybrid_merge_empty_inputs (line 241) | fn hybrid_merge_empty_inputs() { function cosine_nan_returns_zero (line 249) | fn cosine_nan_returns_zero() { function cosine_infinity_returns_zero_or_finite (line 258) | fn cosine_infinity_returns_zero_or_finite() { function cosine_negative_values (line 266) | fn cosine_negative_values() { function cosine_opposite_vectors_clamped (line 275) | fn cosine_opposite_vectors_clamped() { function cosine_high_dimensional (line 284) | fn cosine_high_dimensional() { function cosine_single_element (line 297) | fn cosine_single_element() { function cosine_both_zero_vectors (line 303) | fn cosine_both_zero_vectors() { function bytes_to_vec_non_aligned_truncates (line 312) | fn bytes_to_vec_non_aligned_truncates() { function bytes_to_vec_three_bytes_returns_empty (line 321) | fn bytes_to_vec_three_bytes_returns_empty() { function vec_bytes_roundtrip_special_values (line 328) | fn vec_bytes_roundtrip_special_values() { function vec_bytes_roundtrip_nan_preserves_bits (line 339) | fn vec_bytes_roundtrip_nan_preserves_bits() { function hybrid_merge_limit_zero (line 349) | fn hybrid_merge_limit_zero() { function hybrid_merge_zero_weights (line 356) | fn hybrid_merge_zero_weights() { function hybrid_merge_negative_keyword_scores (line 367) | fn hybrid_merge_negative_keyword_scores() { function hybrid_merge_duplicate_ids_in_same_source (line 379) | fn hybrid_merge_duplicate_ids_in_same_source() { function hybrid_merge_large_bm25_normalization (line 387) | fn hybrid_merge_large_bm25_normalization() { function hybrid_merge_single_item (line 397) | fn hybrid_merge_single_item() { FILE: src/migration.rs type SourceEntry (line 11) | struct SourceEntry { type MigrationStats (line 18) | struct MigrationStats { function handle_command (line 26) | pub async fn handle_command(command: crate::MigrateCommands, config: &Co... function migrate_openclaw_memory (line 34) | async fn migrate_openclaw_memory( function target_memory_backend (line 116) | fn target_memory_backend(config: &Config) -> Result> { function collect_source_entries (line 120) | fn collect_source_entries( function read_openclaw_sqlite_entries (line 145) | fn read_openclaw_sqlite_entries(db_path: &Path) -> Result Result Option<(&str, &str)> { function parse_category (line 301) | fn parse_category(raw: &str) -> MemoryCategory { function normalize_key (line 310) | fn normalize_key(key: &str, fallback_idx: usize) -> String { function next_available_key (line 318) | async fn next_available_key(memory: &dyn Memory, base: &str) -> Result Result> { function pick_optional_column_expr (line 342) | fn pick_optional_column_expr(columns: &[String], candidates: &[&str]) ->... function pick_column_expr (line 349) | fn pick_column_expr(columns: &[String], candidates: &[&str], fallback: &... function resolve_openclaw_workspace (line 353) | fn resolve_openclaw_workspace(source: Option) -> Result { function paths_equal (line 365) | fn paths_equal(a: &Path, b: &Path) -> bool { function backup_target_memory (line 372) | fn backup_target_memory(workspace_dir: &Path) -> Result> { function test_config (line 431) | fn test_config(workspace: &Path) -> Config { function parse_structured_markdown_line (line 444) | fn parse_structured_markdown_line() { function parse_unstructured_markdown_generates_key (line 452) | fn parse_unstructured_markdown_generates_key() { function sqlite_reader_supports_legacy_value_column (line 465) | fn sqlite_reader_supports_legacy_value_column() { function migration_renames_conflicting_key (line 486) | async fn migration_renames_conflicting_key() { function dry_run_does_not_write (line 523) | async fn dry_run_does_not_write() { function migration_target_rejects_none_backend (line 549) | fn migration_target_rejects_none_backend() { function parse_category_handles_all_variants (line 563) | fn parse_category_handles_all_variants() { function parse_category_case_insensitive (line 575) | fn parse_category_case_insensitive() { function normalize_key_handles_empty_string (line 582) | fn normalize_key_handles_empty_string() { function normalize_key_trims_whitespace (line 588) | fn normalize_key_trims_whitespace() { function parse_structured_markdown_rejects_empty_key (line 594) | fn parse_structured_markdown_rejects_empty_key() { function parse_structured_markdown_rejects_empty_value (line 599) | fn parse_structured_markdown_rejects_empty_value() { function parse_structured_markdown_rejects_no_stars (line 604) | fn parse_structured_markdown_rejects_no_stars() { function migration_skips_empty_content (line 609) | async fn migration_skips_empty_content() { function backup_creates_timestamped_directory (line 631) | fn backup_creates_timestamped_directory() { function backup_returns_none_when_no_files (line 655) | fn backup_returns_none_when_no_files() { FILE: src/multimodal.rs constant IMAGE_MARKER_PREFIX (line 7) | const IMAGE_MARKER_PREFIX: &str = "[IMAGE:"; constant ALLOWED_IMAGE_MIME_TYPES (line 8) | const ALLOWED_IMAGE_MIME_TYPES: &[&str] = &[ type PreparedMessages (line 17) | pub struct PreparedMessages { type MultimodalError (line 23) | pub enum MultimodalError { function parse_image_markers (line 53) | pub fn parse_image_markers(content: &str) -> (String, Vec) { function count_image_markers (line 88) | pub fn count_image_markers(messages: &[ChatMessage]) -> usize { function contains_image_markers (line 96) | pub fn contains_image_markers(messages: &[ChatMessage]) -> bool { function extract_ollama_image_payload (line 100) | pub fn extract_ollama_image_payload(image_ref: &str) -> Option { function prepare_messages_for_provider (line 115) | pub async fn prepare_messages_for_provider( function compose_multimodal_message (line 173) | fn compose_multimodal_message(text: &str, data_uris: &[String]) -> String { function normalize_image_reference (line 194) | async fn normalize_image_reference( function normalize_data_uri (line 218) | fn normalize_data_uri(source: &str, max_bytes: usize) -> anyhow::Result<... function normalize_remote_image (line 260) | async fn normalize_remote_image( function normalize_local_image (line 314) | async fn normalize_local_image(source: &str, max_bytes: usize) -> anyhow... function validate_size (line 357) | fn validate_size(source: &str, size_bytes: usize, max_bytes: usize) -> a... function validate_mime (line 370) | fn validate_mime(source: &str, mime: &str) -> anyhow::Result<()> { function detect_mime (line 382) | fn detect_mime( function normalize_content_type (line 402) | fn normalize_content_type(content_type: &str) -> Option { function mime_from_extension (line 411) | fn mime_from_extension(ext: &str) -> Option<&'static str> { function mime_from_magic (line 422) | fn mime_from_magic(bytes: &[u8]) -> Option<&'static str> { function parse_image_markers_extracts_multiple_markers (line 451) | fn parse_image_markers_extracts_multiple_markers() { function parse_image_markers_keeps_invalid_empty_marker (line 462) | fn parse_image_markers_keeps_invalid_empty_marker() { function prepare_messages_normalizes_local_image_to_data_uri (line 471) | async fn prepare_messages_normalizes_local_image_to_data_uri() { function prepare_messages_rejects_too_many_images (line 501) | async fn prepare_messages_rejects_too_many_images() { function prepare_messages_rejects_remote_url_when_disabled (line 522) | async fn prepare_messages_rejects_remote_url_when_disabled() { function prepare_messages_rejects_oversized_local_image (line 537) | async fn prepare_messages_rejects_oversized_local_image() { function extract_ollama_image_payload_supports_data_uris (line 564) | fn extract_ollama_image_payload_supports_data_uris() { function parse_image_markers_strips_markers_leaving_caption (line 573) | fn parse_image_markers_strips_markers_leaving_caption() { function parse_image_markers_image_only_message_becomes_empty (line 584) | fn parse_image_markers_image_only_message_becomes_empty() { FILE: src/nodes/transport.rs type HmacSha256 (line 12) | type HmacSha256 = Hmac; function sign_request (line 17) | pub fn sign_request( function verify_request (line 32) | pub fn verify_request( function constant_time_eq (line 50) | fn constant_time_eq(a: &[u8], b: &[u8]) -> bool { type NodeTransport (line 70) | pub struct NodeTransport { method new (line 77) | pub fn new(shared_secret: String) -> Self { method send (line 89) | pub async fn send( method verify_incoming (line 124) | pub fn verify_incoming( constant TEST_SECRET (line 149) | const TEST_SECRET: &str = "test-shared-secret-key"; function sign_request_deterministic (line 152) | fn sign_request_deterministic() { function verify_request_accepts_valid_signature (line 159) | fn verify_request_accepts_valid_signature() { function verify_request_rejects_tampered_payload (line 167) | fn verify_request_rejects_tampered_payload() { function verify_request_rejects_expired_timestamp (line 175) | fn verify_request_rejects_expired_timestamp() { function verify_request_rejects_wrong_secret (line 183) | fn verify_request_rejects_wrong_secret() { function constant_time_eq_correctness (line 191) | fn constant_time_eq_correctness() { function node_transport_construction (line 200) | fn node_transport_construction() { function node_transport_verify_incoming_valid (line 206) | fn node_transport_verify_incoming_valid() { function node_transport_verify_incoming_bad_timestamp_header (line 220) | fn node_transport_verify_incoming_bad_timestamp_header() { function sign_request_different_nonce_different_signature (line 227) | fn sign_request_different_nonce_different_signature() { FILE: src/observability/log.rs type LogObserver (line 6) | pub struct LogObserver; method new (line 9) | pub fn new() -> Self { method record_event (line 15) | fn record_event(&self, event: &ObserverEvent) { method record_metric (line 115) | fn record_metric(&self, metric: &ObserverMetric) { method name (line 146) | fn name(&self) -> &str { method as_any (line 150) | fn as_any(&self) -> &dyn Any { function log_observer_name (line 161) | fn log_observer_name() { function log_observer_all_events_no_panic (line 166) | fn log_observer_all_events_no_panic() { function log_observer_all_metrics_no_panic (line 221) | fn log_observer_all_metrics_no_panic() { function log_observer_hand_events_no_panic (line 231) | fn log_observer_hand_events_no_panic() { function log_observer_hand_metrics_no_panic (line 249) | fn log_observer_hand_metrics_no_panic() { FILE: src/observability/mod.rs function create_observer (line 28) | pub fn create_observer(config: &ObservabilityConfig) -> Box { function factory_none_returns_noop (line 90) | fn factory_none_returns_noop() { function factory_noop_returns_noop (line 99) | fn factory_noop_returns_noop() { function factory_log_returns_log (line 108) | fn factory_log_returns_log() { function factory_verbose_returns_verbose (line 117) | fn factory_verbose_returns_verbose() { function factory_prometheus_returns_prometheus (line 126) | fn factory_prometheus_returns_prometheus() { function factory_otel_returns_otel (line 140) | fn factory_otel_returns_otel() { function factory_opentelemetry_alias (line 156) | fn factory_opentelemetry_alias() { function factory_otlp_alias (line 172) | fn factory_otlp_alias() { function factory_unknown_falls_back_to_noop (line 188) | fn factory_unknown_falls_back_to_noop() { function factory_empty_string_falls_back_to_noop (line 197) | fn factory_empty_string_falls_back_to_noop() { function factory_garbage_falls_back_to_noop (line 206) | fn factory_garbage_falls_back_to_noop() { FILE: src/observability/multi.rs type MultiObserver (line 5) | pub struct MultiObserver { method new (line 10) | pub fn new(observers: Vec>) -> Self { method record_event (line 16) | fn record_event(&self, event: &ObserverEvent) { method record_metric (line 22) | fn record_metric(&self, metric: &ObserverMetric) { method flush (line 28) | fn flush(&self) { method name (line 34) | fn name(&self) -> &str { method as_any (line 38) | fn as_any(&self) -> &dyn Any { type CountingObserver (line 51) | struct CountingObserver { method new (line 58) | fn new( method record_event (line 72) | fn record_event(&self, _event: &ObserverEvent) { method record_metric (line 75) | fn record_metric(&self, _metric: &ObserverMetric) { method flush (line 78) | fn flush(&self) { method name (line 81) | fn name(&self) -> &str { method as_any (line 85) | fn as_any(&self) -> &dyn Any { function multi_name (line 91) | fn multi_name() { function multi_empty_no_panic (line 97) | fn multi_empty_no_panic() { function multi_fans_out_events (line 105) | fn multi_fans_out_events() { function multi_fans_out_metrics (line 127) | fn multi_fans_out_metrics() { function multi_fans_out_flush (line 148) | fn multi_fans_out_flush() { FILE: src/observability/noop.rs type NoopObserver (line 5) | pub struct NoopObserver; method record_event (line 9) | fn record_event(&self, _event: &ObserverEvent) {} method record_metric (line 12) | fn record_metric(&self, _metric: &ObserverMetric) {} method name (line 14) | fn name(&self) -> &str { method as_any (line 18) | fn as_any(&self) -> &dyn Any { function noop_name (line 29) | fn noop_name() { function noop_record_event_does_not_panic (line 34) | fn noop_record_event_does_not_panic() { function noop_record_metric_does_not_panic (line 71) | fn noop_record_metric_does_not_panic() { function noop_flush_does_not_panic (line 80) | fn noop_flush_does_not_panic() { function noop_hand_events_do_not_panic (line 85) | fn noop_hand_events_do_not_panic() { function noop_hand_metrics_do_not_panic (line 103) | fn noop_hand_metrics_do_not_panic() { FILE: src/observability/otel.rs type OtelObserver (line 12) | pub struct OtelObserver { method new (line 40) | pub fn new(endpoint: Option<&str>, service_name: Option<&str>) -> Resu... method record_event (line 198) | fn record_event(&self, event: &ObserverEvent) { method record_metric (line 436) | fn record_metric(&self, metric: &ObserverMetric) { method flush (line 476) | fn flush(&self) { method name (line 485) | fn name(&self) -> &str { method as_any (line 489) | fn as_any(&self) -> &dyn Any { function test_observer (line 505) | fn test_observer() -> OtelObserver { function otel_observer_name (line 513) | fn otel_observer_name() { function records_all_events_without_panic (line 519) | fn records_all_events_without_panic() { function records_all_metrics_without_panic (line 580) | fn records_all_metrics_without_panic() { function flush_does_not_panic (line 590) | fn flush_does_not_panic() { function otel_records_error_event_without_panic (line 599) | fn otel_records_error_event_without_panic() { function otel_records_llm_failure_without_panic (line 609) | fn otel_records_llm_failure_without_panic() { function otel_flush_idempotent_with_unreachable_endpoint (line 623) | fn otel_flush_idempotent_with_unreachable_endpoint() { function otel_records_zero_duration_metrics (line 632) | fn otel_records_zero_duration_metrics() { function otel_hand_events_do_not_panic (line 641) | fn otel_hand_events_do_not_panic() { function otel_hand_metrics_do_not_panic (line 659) | fn otel_hand_metrics_do_not_panic() { function otel_observer_creation_with_valid_endpoint_succeeds (line 676) | fn otel_observer_creation_with_valid_endpoint_succeeds() { FILE: src/observability/prometheus.rs type PrometheusObserver (line 7) | pub struct PrometheusObserver { method new (line 40) | pub fn new() -> Self { method encode (line 235) | pub fn encode(&self) -> String { method record_event (line 245) | fn record_event(&self, event: &ObserverEvent) { method record_metric (line 367) | fn record_metric(&self, metric: &ObserverMetric) { method name (line 407) | fn name(&self) -> &str { method as_any (line 411) | fn as_any(&self) -> &dyn std::any::Any { function prometheus_observer_name (line 422) | fn prometheus_observer_name() { function records_all_events_without_panic (line 427) | fn records_all_events_without_panic() { function records_all_metrics_without_panic (line 469) | fn records_all_metrics_without_panic() { function encode_produces_prometheus_text_format (line 479) | fn encode_produces_prometheus_text_format() { function counters_increment_correctly (line 501) | fn counters_increment_correctly() { function tool_calls_track_success_and_failure_separately (line 513) | fn tool_calls_track_success_and_failure_separately() { function errors_track_by_component (line 538) | fn errors_track_by_component() { function gauge_reflects_latest_value (line 559) | fn gauge_reflects_latest_value() { function llm_response_tracks_request_count_and_tokens (line 569) | fn llm_response_tracks_request_count_and_tokens() { function hand_events_track_runs_and_duration (line 604) | fn hand_events_track_runs_and_duration() { function hand_metrics_record_duration_and_findings (line 631) | fn hand_metrics_record_duration_and_findings() { function llm_response_without_tokens_increments_request_only (line 659) | fn llm_response_without_tokens_increments_request_only() { FILE: src/observability/runtime_trace.rs constant DEFAULT_TRACE_REL_PATH (line 12) | const DEFAULT_TRACE_REL_PATH: &str = "state/runtime-trace.jsonl"; type RuntimeTraceStorageMode (line 16) | pub enum RuntimeTraceStorageMode { method from_raw (line 23) | fn from_raw(raw: &str) -> Self { type RuntimeTraceEvent (line 34) | pub struct RuntimeTraceEvent { type RuntimeTraceLogger (line 54) | struct RuntimeTraceLogger { method new (line 62) | fn new(mode: RuntimeTraceStorageMode, max_entries: usize, path: PathBu... method append (line 71) | fn append(&self, event: &RuntimeTraceEvent) -> Result<()> { method trim_to_last_entries (line 109) | fn trim_to_last_entries(&self) -> Result<()> { function storage_mode_from_config (line 148) | pub fn storage_mode_from_config(config: &ObservabilityConfig) -> Runtime... function resolve_trace_path (line 163) | pub fn resolve_trace_path(config: &ObservabilityConfig, workspace_dir: &... function init_from_config (line 179) | pub fn init_from_config(config: &ObservabilityConfig, workspace_dir: &Pa... function record_event (line 196) | pub fn record_event( function load_events (line 233) | pub fn load_events( function find_event_by_id (line 295) | pub fn find_event_by_id(path: &Path, id: &str) -> Result ObservabilityConfig { function resolve_trace_path_relative_joins_workspace (line 332) | fn resolve_trace_path_relative_joins_workspace() { function storage_mode_parses_known_values (line 340) | fn storage_mode_parses_known_values() { function rolling_mode_keeps_latest_entries (line 362) | fn rolling_mode_keeps_latest_entries() { function find_event_by_id_returns_match (line 390) | fn find_event_by_id_returns_match() { FILE: src/observability/traits.rs type ObserverEvent (line 10) | pub enum ObserverEvent { type ObserverMetric (line 104) | pub enum ObserverMetric { type Observer (line 133) | pub trait Observer: Send + Sync + 'static { method record_event (line 139) | fn record_event(&self, event: &ObserverEvent); method record_metric (line 145) | fn record_metric(&self, metric: &ObserverMetric); method flush (line 152) | fn flush(&self) {} method name (line 158) | fn name(&self) -> &str; method as_any (line 164) | fn as_any(&self) -> &dyn std::any::Any; method record_event (line 180) | fn record_event(&self, _event: &ObserverEvent) { method record_metric (line 185) | fn record_metric(&self, _metric: &ObserverMetric) { method name (line 190) | fn name(&self) -> &str { method as_any (line 194) | fn as_any(&self) -> &dyn std::any::Any { type DummyObserver (line 174) | struct DummyObserver { function observer_records_events_and_metrics (line 200) | fn observer_records_events_and_metrics() { function observer_default_flush_and_as_any_work (line 215) | fn observer_default_flush_and_as_any_work() { function observer_event_and_metric_are_cloneable (line 224) | fn observer_event_and_metric_are_cloneable() { function hand_events_recordable (line 240) | fn hand_events_recordable() { function hand_metrics_recordable (line 261) | fn hand_metrics_recordable() { function hand_event_and_metric_are_cloneable (line 281) | fn hand_event_and_metric_are_cloneable() { FILE: src/observability/verbose.rs type VerboseObserver (line 8) | pub struct VerboseObserver; method new (line 11) | pub fn new() -> Self { method record_event (line 17) | fn record_event(&self, event: &ObserverEvent) { method record_metric (line 55) | fn record_metric(&self, _metric: &ObserverMetric) {} method name (line 57) | fn name(&self) -> &str { method as_any (line 61) | fn as_any(&self) -> &dyn Any { function verbose_name (line 72) | fn verbose_name() { function verbose_events_do_not_panic (line 77) | fn verbose_events_do_not_panic() { function verbose_hand_events_do_not_panic (line 106) | fn verbose_hand_events_do_not_panic() { FILE: src/onboard/mod.rs function assert_reexport_exists (line 14) | fn assert_reexport_exists(_value: F) {} function wizard_functions_are_reexported (line 17) | fn wizard_functions_are_reexported() { FILE: src/onboard/wizard.rs type ProjectContext (line 36) | pub struct ProjectContext { constant BANNER (line 45) | const BANNER: &str = r" constant LIVE_MODEL_MAX_OPTIONS (line 60) | const LIVE_MODEL_MAX_OPTIONS: usize = 120; constant MODEL_PREVIEW_LIMIT (line 61) | const MODEL_PREVIEW_LIMIT: usize = 20; constant MODEL_CACHE_FILE (line 62) | const MODEL_CACHE_FILE: &str = "models_cache.json"; constant MODEL_CACHE_TTL_SECS (line 63) | const MODEL_CACHE_TTL_SECS: u64 = 12 * 60 * 60; constant CUSTOM_MODEL_SENTINEL (line 64) | const CUSTOM_MODEL_SENTINEL: &str = "__custom_model__"; function has_launchable_channels (line 66) | fn has_launchable_channels(channels: &ChannelsConfig) -> bool { type InteractiveOnboardingMode (line 73) | enum InteractiveOnboardingMode { function run_wizard (line 78) | pub async fn run_wizard(force: bool) -> Result { function run_channels_repair_wizard (line 249) | pub async fn run_channels_repair_wizard() -> Result { function run_provider_update_wizard (line 301) | async fn run_provider_update_wizard(workspace_dir: &Path, config_path: &... function apply_provider_update (line 362) | fn apply_provider_update( function backend_key_from_choice (line 383) | fn backend_key_from_choice(choice: usize) -> &'static str { function memory_config_defaults_for_backend (line 389) | fn memory_config_defaults_for_backend(backend: &str) -> MemoryConfig { function run_quick_setup (line 424) | pub async fn run_quick_setup( function resolve_quick_setup_dirs_with_home (line 446) | fn resolve_quick_setup_dirs_with_home(home: &Path) -> (PathBuf, PathBuf) { function homebrew_prefix_for_exe (line 469) | fn homebrew_prefix_for_exe(exe: &Path) -> Option<&'static str> { function quick_setup_homebrew_service_note (line 488) | fn quick_setup_homebrew_service_note( function run_quick_setup_with_home (line 511) | async fn run_quick_setup_with_home( function canonical_provider_name (line 749) | fn canonical_provider_name(provider_name: &str) -> &str { function allows_unauthenticated_model_fetch (line 772) | fn allows_unauthenticated_model_fetch(provider_name: &str) -> bool { constant MINIMAX_ONBOARD_MODELS (line 788) | const MINIMAX_ONBOARD_MODELS: [(&str, &str); 7] = [ function default_model_for_provider (line 801) | fn default_model_for_provider(provider: &str) -> String { function curated_models_for_provider (line 832) | fn curated_models_for_provider(provider_name: &str) -> Vec<(String, Stri... function supports_live_model_fetch (line 1257) | fn supports_live_model_fetch(provider_name: &str) -> bool { function models_endpoint_for_provider (line 1293) | fn models_endpoint_for_provider(provider_name: &str) -> Option<&'static ... function build_model_fetch_client (line 1327) | fn build_model_fetch_client() -> Result { function normalize_model_ids (line 1335) | fn normalize_model_ids(ids: Vec) -> Vec { function parse_openai_compatible_model_ids (line 1348) | fn parse_openai_compatible_model_ids(payload: &Value) -> Vec { function parse_gemini_model_ids (line 1368) | fn parse_gemini_model_ids(payload: &Value) -> Vec { function parse_ollama_model_ids (line 1396) | fn parse_ollama_model_ids(payload: &Value) -> Vec { function fetch_openai_compatible_models (line 1411) | fn fetch_openai_compatible_models( function fetch_openrouter_models (line 1435) | fn fetch_openrouter_models(api_key: Option<&str>) -> Result> { function fetch_anthropic_models (line 1452) | fn fetch_anthropic_models(api_key: Option<&str>) -> Result> { function fetch_gemini_models (line 1487) | fn fetch_gemini_models(api_key: Option<&str>) -> Result> { function fetch_ollama_models (line 1505) | fn fetch_ollama_models() -> Result> { function normalize_ollama_endpoint_url (line 1518) | fn normalize_ollama_endpoint_url(raw_url: &str) -> String { function ollama_endpoint_is_local (line 1530) | fn ollama_endpoint_is_local(endpoint_url: &str) -> bool { function ollama_uses_remote_endpoint (line 1537) | fn ollama_uses_remote_endpoint(provider_api_url: Option<&str>) -> bool { function resolve_live_models_endpoint (line 1550) | fn resolve_live_models_endpoint( function fetch_live_models_for_provider (line 1597) | fn fetch_live_models_for_provider( type ModelCacheEntry (line 1677) | struct ModelCacheEntry { type ModelCacheState (line 1684) | struct ModelCacheState { type CachedModels (line 1689) | struct CachedModels { function model_cache_path (line 1694) | fn model_cache_path(workspace_dir: &Path) -> PathBuf { function now_unix_secs (line 1698) | fn now_unix_secs() -> u64 { function load_model_cache_state (line 1704) | async fn load_model_cache_state(workspace_dir: &Path) -> Result String { function build_model_options (line 1826) | fn build_model_options(model_ids: Vec, source: &str) -> Vec<(Str... function print_model_preview (line 1836) | fn print_model_preview(models: &[String]) { function run_models_refresh (line 1850) | pub async fn run_models_refresh( function run_models_list (line 1938) | pub async fn run_models_list(config: &Config, provider_override: Option<... function run_models_set (line 1974) | pub async fn run_models_set(config: &Config, model: &str) -> Result<()> { function run_models_status (line 1990) | pub async fn run_models_status(config: &Config) -> Result<()> { function cached_model_catalog_stats (line 2025) | pub async fn cached_model_catalog_stats( function run_models_refresh_all (line 2037) | pub async fn run_models_refresh_all(config: &Config, force: bool) -> Res... function print_step (line 2085) | fn print_step(current: u8, total: u8, title: &str) { function print_bullet (line 2095) | fn print_bullet(text: &str) { function resolve_interactive_onboarding_mode (line 2099) | fn resolve_interactive_onboarding_mode( function ensure_onboard_overwrite_allowed (line 2145) | fn ensure_onboard_overwrite_allowed(config_path: &Path, force: bool) -> ... function persist_workspace_selection (line 2192) | async fn persist_workspace_selection(config_path: &Path) -> Result<()> { function setup_workspace (line 2208) | async fn setup_workspace() -> Result<(PathBuf, PathBuf)> { function setup_provider (line 2250) | async fn setup_provider(workspace_dir: &Path) -> Result<(String, String,... function local_provider_choices (line 2966) | fn local_provider_choices() -> Vec<(&'static str, &'static str)> { function provider_env_var (line 2986) | fn provider_env_var(name: &str) -> &'static str { function provider_supports_keyless_local_usage (line 3030) | fn provider_supports_keyless_local_usage(provider_name: &str) -> bool { function provider_supports_device_flow (line 3037) | fn provider_supports_device_flow(provider_name: &str) -> bool { function setup_tool_mode (line 3046) | fn setup_tool_mode() -> Result<(ComposioConfig, SecretsConfig)> { function setup_hardware (line 3136) | fn setup_hardware() -> Result { function setup_project_context (line 3324) | fn setup_project_context() -> Result { function setup_memory (line 3422) | fn setup_memory() -> Result { type ChannelMenuChoice (line 3462) | enum ChannelMenuChoice { constant CHANNEL_MENU_CHOICES (line 3483) | const CHANNEL_MENU_CHOICES: &[ChannelMenuChoice] = &[ function channel_menu_choices (line 3504) | fn channel_menu_choices() -> &'static [ChannelMenuChoice] { function setup_channels (line 3509) | fn setup_channels() -> Result { function setup_tunnel (line 5229) | fn setup_tunnel() -> Result { function scaffold_workspace (line 5384) | async fn scaffold_workspace(workspace_dir: &Path, ctx: &ProjectContext) ... function print_summary (line 5662) | fn print_summary(config: &Config) { function env_lock (line 5905) | fn env_lock() -> &'static Mutex<()> { type EnvVarGuard (line 5910) | struct EnvVarGuard { method set (line 5916) | fn set(key: &'static str, value: &str) -> Self { method unset (line 5922) | fn unset(key: &'static str) -> Self { method drop (line 5930) | fn drop(&mut self) { function project_context_default_is_empty (line 5942) | fn project_context_default_is_empty() { function apply_provider_update_preserves_non_provider_settings (line 5951) | fn apply_provider_update_preserves_non_provider_settings() { function apply_provider_update_clears_api_key_when_empty (line 5980) | fn apply_provider_update_clears_api_key_when_empty() { function quick_setup_model_override_persists_to_config_toml (line 6002) | async fn quick_setup_model_override_persists_to_config_toml() { function quick_setup_without_model_uses_provider_default_model (line 6029) | async fn quick_setup_without_model_uses_provider_default_model() { function quick_setup_existing_config_requires_force_when_non_interactive (line 6052) | async fn quick_setup_existing_config_requires_force_when_non_interactive... function quick_setup_existing_config_overwrites_with_force (line 6082) | async fn quick_setup_existing_config_overwrites_with_force() { function quick_setup_respects_zero_claw_workspace_env_layout (line 6119) | async fn quick_setup_respects_zero_claw_workspace_env_layout() { function homebrew_prefix_for_exe_detects_supported_layouts (line 6148) | fn homebrew_prefix_for_exe_detects_supported_layouts() { function quick_setup_homebrew_service_note_mentions_service_workspace (line 6167) | fn quick_setup_homebrew_service_note_mentions_service_workspace() { function quick_setup_homebrew_service_note_skips_matching_service_layout (line 6181) | fn quick_setup_homebrew_service_note_skips_matching_service_layout() { function scaffold_creates_all_md_files (line 6196) | async fn scaffold_creates_all_md_files() { function scaffold_creates_all_subdirectories (line 6217) | async fn scaffold_creates_all_subdirectories() { function scaffold_bakes_user_name_into_files (line 6230) | async fn scaffold_bakes_user_name_into_files() { function scaffold_bakes_timezone_into_files (line 6256) | async fn scaffold_bakes_timezone_into_files() { function scaffold_bakes_agent_name_into_files (line 6282) | async fn scaffold_bakes_agent_name_into_files() { function scaffold_bakes_communication_style (line 6332) | async fn scaffold_bakes_communication_style() { function scaffold_uses_defaults_for_empty_context (line 6368) | async fn scaffold_uses_defaults_for_empty_context() { function scaffold_does_not_overwrite_existing_files (line 6405) | async fn scaffold_does_not_overwrite_existing_files() { function scaffold_is_idempotent (line 6441) | async fn scaffold_is_idempotent() { function scaffold_files_are_non_empty (line 6466) | async fn scaffold_files_are_non_empty() { function agents_md_references_on_demand_memory (line 6489) | async fn agents_md_references_on_demand_memory() { function memory_md_warns_about_token_cost (line 6510) | async fn memory_md_warns_about_token_cost() { function tools_md_lists_all_builtin_tools (line 6531) | async fn tools_md_lists_all_builtin_tools() { function soul_md_includes_emoji_awareness_guidance (line 6563) | async fn soul_md_includes_emoji_awareness_guidance() { function scaffold_handles_special_characters_in_names (line 6584) | async fn scaffold_handles_special_characters_in_names() { function scaffold_full_personalization (line 6608) | async fn scaffold_full_personalization() { function default_model_for_provider_uses_latest_defaults (line 6660) | fn default_model_for_provider_uses_latest_defaults() { function canonical_provider_name_normalizes_regional_aliases (line 6711) | fn canonical_provider_name_normalizes_regional_aliases() { function curated_models_for_openai_include_latest_choices (line 6734) | fn curated_models_for_openai_include_latest_choices() { function curated_models_for_glm_removes_deprecated_flash_plus_aliases (line 6745) | fn curated_models_for_glm_removes_deprecated_flash_plus_aliases() { function curated_models_for_openai_codex_include_codex_family (line 6759) | fn curated_models_for_openai_codex_include_codex_family() { function curated_models_for_openrouter_use_valid_anthropic_id (line 6770) | fn curated_models_for_openrouter_use_valid_anthropic_id() { function curated_models_for_bedrock_include_verified_model_ids (line 6780) | fn curated_models_for_bedrock_include_verified_model_ids() { function curated_models_for_moonshot_drop_deprecated_aliases (line 6793) | fn curated_models_for_moonshot_drop_deprecated_aliases() { function allows_unauthenticated_model_fetch_for_public_catalogs (line 6806) | fn allows_unauthenticated_model_fetch_for_public_catalogs() { function curated_models_for_kimi_code_include_official_agent_model (line 6823) | fn curated_models_for_kimi_code_include_official_agent_model() { function curated_models_for_qwen_code_include_coding_plan_models (line 6834) | fn curated_models_for_qwen_code_include_coding_plan_models() { function supports_live_model_fetch_for_supported_and_unsupported_providers (line 6846) | fn supports_live_model_fetch_for_supported_and_unsupported_providers() { function curated_models_provider_aliases_share_same_catalog (line 6870) | fn curated_models_provider_aliases_share_same_catalog() { function curated_models_for_nvidia_include_nim_catalog_entries (line 6922) | fn curated_models_for_nvidia_include_nim_catalog_entries() { function models_endpoint_for_provider_handles_region_aliases (line 6934) | fn models_endpoint_for_provider_handles_region_aliases() { function models_endpoint_for_provider_supports_additional_openai_compatible_providers (line 6950) | fn models_endpoint_for_provider_supports_additional_openai_compatible_pr... function resolve_live_models_endpoint_prefers_llamacpp_custom_url (line 6988) | fn resolve_live_models_endpoint_prefers_llamacpp_custom_url() { function resolve_live_models_endpoint_falls_back_to_provider_defaults (line 7004) | fn resolve_live_models_endpoint_falls_back_to_provider_defaults() { function resolve_live_models_endpoint_supports_custom_provider_urls (line 7025) | fn resolve_live_models_endpoint_supports_custom_provider_urls() { function normalize_ollama_endpoint_url_strips_api_suffix_and_trailing_slash (line 7037) | fn normalize_ollama_endpoint_url_strips_api_suffix_and_trailing_slash() { function ollama_uses_remote_endpoint_distinguishes_local_and_remote_urls (line 7050) | fn ollama_uses_remote_endpoint_distinguishes_local_and_remote_urls() { function resolve_live_models_endpoint_prefers_vllm_custom_url (line 7061) | fn resolve_live_models_endpoint_prefers_vllm_custom_url() { function parse_openai_model_ids_supports_data_array_payload (line 7073) | fn parse_openai_model_ids_supports_data_array_payload() { function parse_openai_model_ids_supports_root_array_payload (line 7088) | fn parse_openai_model_ids_supports_root_array_payload() { function normalize_model_ids_deduplicates_case_insensitively (line 7100) | fn normalize_model_ids_deduplicates_case_insensitively() { function parse_gemini_model_ids_filters_for_generate_content (line 7111) | fn parse_gemini_model_ids_filters_for_generate_content() { function parse_ollama_model_ids_extracts_and_deduplicates_names (line 7137) | fn parse_ollama_model_ids_extracts_and_deduplicates_names() { function model_cache_round_trip_returns_fresh_entry (line 7154) | async fn model_cache_round_trip_returns_fresh_entry() { function model_cache_ttl_filters_stale_entries (line 7173) | async fn model_cache_ttl_filters_stale_entries() { function run_models_refresh_uses_fresh_cache_without_network (line 7197) | async fn run_models_refresh_uses_fresh_cache_without_network() { function run_models_refresh_rejects_unsupported_provider (line 7214) | async fn run_models_refresh_rejects_unsupported_provider() { function provider_env_var_known_providers (line 7233) | fn provider_env_var_known_providers() { function provider_supports_keyless_local_usage_for_local_providers (line 7272) | fn provider_supports_keyless_local_usage_for_local_providers() { function provider_supports_device_flow_copilot (line 7282) | fn provider_supports_device_flow_copilot() { function local_provider_choices_include_sglang (line 7292) | fn local_provider_choices_include_sglang() { function provider_env_var_unknown_falls_back (line 7298) | fn provider_env_var_unknown_falls_back() { function backend_key_from_choice_maps_supported_backends (line 7303) | fn backend_key_from_choice_maps_supported_backends() { function memory_backend_profile_marks_lucid_as_optional_sqlite_backed (line 7312) | fn memory_backend_profile_marks_lucid_as_optional_sqlite_backed() { function memory_config_defaults_for_lucid_enable_sqlite_hygiene (line 7333) | fn memory_config_defaults_for_lucid_enable_sqlite_hygiene() { function memory_config_defaults_for_none_disable_sqlite_hygiene (line 7344) | fn memory_config_defaults_for_none_disable_sqlite_hygiene() { function channel_menu_choices_include_signal_nextcloud_lark_and_feishu (line 7355) | fn channel_menu_choices_include_signal_nextcloud_lark_and_feishu() { function launchable_channels_include_signal_mattermost_qq_nextcloud_and_feishu (line 7363) | fn launchable_channels_include_signal_mattermost_qq_nextcloud_and_feishu... FILE: src/peripherals/arduino_flash.rs constant FIRMWARE_INO (line 10) | const FIRMWARE_INO: &str = include_str!("../../firmware/arduino/arduino.... constant FQBN (line 12) | const FQBN: &str = "arduino:avr:uno"; constant SKETCH_NAME (line 13) | const SKETCH_NAME: &str = "arduino"; function arduino_cli_available (line 16) | pub fn arduino_cli_available() -> bool { function ensure_arduino_cli (line 25) | pub fn ensure_arduino_cli() -> Result<()> { function ensure_avr_core (line 66) | fn ensure_avr_core() -> Result<()> { function flash_arduino_firmware (line 89) | pub fn flash_arduino_firmware(port: &str) -> Result<()> { function resolve_port (line 135) | pub fn resolve_port(config: &crate::config::Config, path_override: Optio... FILE: src/peripherals/arduino_upload.rs type ArduinoUploadTool (line 13) | pub struct ArduinoUploadTool { method new (line 19) | pub fn new(port: String) -> Self { method name (line 26) | fn name(&self) -> &str { method description (line 30) | fn description(&self) -> &str { method parameters_schema (line 34) | fn parameters_schema(&self) -> Value { method execute (line 47) | async fn execute(&self, args: Value) -> anyhow::Result { FILE: src/peripherals/capabilities_tool.rs type HardwareCapabilitiesTool (line 10) | pub struct HardwareCapabilitiesTool { method new (line 16) | pub(crate) fn new(boards: Vec<(String, Arc)>) -> Self { method name (line 23) | fn name(&self) -> &str { method description (line 27) | fn description(&self) -> &str { method parameters_schema (line 31) | fn parameters_schema(&self) -> serde_json::Value { method execute (line 43) | async fn execute(&self, args: serde_json::Value) -> anyhow::Result Vec<&Periph... function handle_command (line 46) | pub async fn handle_command(cmd: crate::PeripheralCommands, config: &Con... function create_peripheral_tools (line 141) | pub async fn create_peripheral_tools(config: &PeripheralsConfig) -> Resu... function create_peripheral_tools (line 233) | pub async fn create_peripheral_tools(_config: &PeripheralsConfig) -> Res... function list_configured_boards_when_disabled_returns_empty (line 243) | fn list_configured_boards_when_disabled_returns_empty() { function list_configured_boards_when_enabled_with_boards (line 262) | fn list_configured_boards_when_enabled_with_boards() { function list_configured_boards_when_enabled_but_no_boards (line 288) | fn list_configured_boards_when_enabled_but_no_boards() { function create_peripheral_tools_returns_empty_when_disabled (line 302) | async fn create_peripheral_tools_returns_empty_when_disabled() { FILE: src/peripherals/nucleo_flash.rs constant CHIP (line 10) | const CHIP: &str = "STM32F401RETx"; constant TARGET (line 11) | const TARGET: &str = "thumbv7em-none-eabihf"; function probe_rs_available (line 14) | pub fn probe_rs_available() -> bool { function flash_nucleo_firmware (line 23) | pub fn flash_nucleo_firmware() -> Result<()> { FILE: src/peripherals/rpi.rs type RpiGpioPeripheral (line 13) | pub struct RpiGpioPeripheral { method new (line 19) | pub fn new(board: PeripheralBoardConfig) -> Self { method connect_from_config (line 24) | pub async fn connect_from_config(board: &PeripheralBoardConfig) -> any... method name (line 33) | fn name(&self) -> &str { method board_type (line 37) | fn board_type(&self) -> &str { method connect (line 41) | async fn connect(&mut self) -> anyhow::Result<()> { method disconnect (line 48) | async fn disconnect(&mut self) -> anyhow::Result<()> { method health_check (line 52) | async fn health_check(&self) -> bool { method tools (line 58) | fn tools(&self) -> Vec> { type RpiGpioReadTool (line 64) | struct RpiGpioReadTool; method name (line 68) | fn name(&self) -> &str { method description (line 72) | fn description(&self) -> &str { method parameters_schema (line 76) | fn parameters_schema(&self) -> Value { method execute (line 89) | async fn execute(&self, args: Value) -> anyhow::Result { type RpiGpioWriteTool (line 115) | struct RpiGpioWriteTool; method name (line 119) | fn name(&self) -> &str { method description (line 123) | fn description(&self) -> &str { method parameters_schema (line 127) | fn parameters_schema(&self) -> Value { method execute (line 144) | async fn execute(&self, args: Value) -> anyhow::Result { FILE: src/peripherals/serial.rs constant ALLOWED_PATH_PREFIXES (line 19) | const ALLOWED_PATH_PREFIXES: &[&str] = &[ function is_path_allowed (line 29) | fn is_path_allowed(path: &str) -> bool { function send_request (line 34) | async fn send_request(port: &mut SerialStream, cmd: &str, args: Value) -... type SerialTransport (line 67) | pub(crate) struct SerialTransport { method request (line 75) | async fn request(&self, cmd: &str, args: Value) -> anyhow::Result anyhow::Result { constant SERIAL_TIMEOUT_SECS (line 72) | const SERIAL_TIMEOUT_SECS: u64 = 5; type SerialPeripheral (line 107) | pub struct SerialPeripheral { method connect (line 116) | pub async fn connect(config: &PeripheralBoardConfig) -> anyhow::Result... method transport (line 186) | pub(crate) fn transport(&self) -> Arc { method name (line 148) | fn name(&self) -> &str { method board_type (line 152) | fn board_type(&self) -> &str { method connect (line 156) | async fn connect(&mut self) -> anyhow::Result<()> { method disconnect (line 160) | async fn disconnect(&mut self) -> anyhow::Result<()> { method health_check (line 164) | async fn health_check(&self) -> bool { method tools (line 172) | fn tools(&self) -> Vec> { type GpioReadTool (line 192) | struct GpioReadTool { method name (line 198) | fn name(&self) -> &str { method description (line 202) | fn description(&self) -> &str { method parameters_schema (line 206) | fn parameters_schema(&self) -> Value { method execute (line 219) | async fn execute(&self, args: Value) -> anyhow::Result { type GpioWriteTool (line 231) | struct GpioWriteTool { method name (line 237) | fn name(&self) -> &str { method description (line 241) | fn description(&self) -> &str { method parameters_schema (line 245) | fn parameters_schema(&self) -> Value { method execute (line 262) | async fn execute(&self, args: Value) -> anyhow::Result { FILE: src/peripherals/traits.rs type Peripheral (line 24) | pub trait Peripheral: Send + Sync { method name (line 30) | fn name(&self) -> &str; method board_type (line 37) | fn board_type(&self) -> &str; method connect (line 48) | async fn connect(&mut self) -> anyhow::Result<()>; method disconnect (line 59) | async fn disconnect(&mut self) -> anyhow::Result<()>; method health_check (line 66) | async fn health_check(&self) -> bool; method tools (line 74) | fn tools(&self) -> Vec>; FILE: src/peripherals/uno_q_bridge.rs constant BRIDGE_HOST (line 13) | const BRIDGE_HOST: &str = "127.0.0.1"; constant BRIDGE_PORT (line 14) | const BRIDGE_PORT: u16 = 9999; function bridge_request (line 16) | async fn bridge_request(cmd: &str, args: &[String]) -> anyhow::Result &str { method description (line 42) | fn description(&self) -> &str { method parameters_schema (line 46) | fn parameters_schema(&self) -> Value { method execute (line 59) | async fn execute(&self, args: Value) -> anyhow::Result { type UnoQGpioWriteTool (line 90) | pub struct UnoQGpioWriteTool; method name (line 94) | fn name(&self) -> &str { method description (line 98) | fn description(&self) -> &str { method parameters_schema (line 102) | fn parameters_schema(&self) -> Value { method execute (line 119) | async fn execute(&self, args: Value) -> anyhow::Result { FILE: src/peripherals/uno_q_setup.rs constant BRIDGE_APP_NAME (line 6) | const BRIDGE_APP_NAME: &str = "uno-q-bridge"; function setup_uno_q_bridge (line 10) | pub fn setup_uno_q_bridge(host: Option<&str>) -> Result<()> { function deploy_remote (line 34) | fn deploy_remote(host: &str, bridge_dir: &std::path::Path) -> Result<()> { function deploy_local (line 84) | fn deploy_local(bridge_dir: Option<&std::path::Path>) -> Result<()> { function write_embedded_bridge (line 112) | fn write_embedded_bridge(dest: &std::path::Path) -> Result<()> { function copy_dir (line 129) | fn copy_dir(src: &std::path::Path, dst: &std::path::Path) -> Result<()> { FILE: src/plugins/error.rs type PluginError (line 6) | pub enum PluginError { FILE: src/plugins/host.rs type PluginHost (line 9) | pub struct PluginHost { method new (line 21) | pub fn new(workspace_dir: &Path) -> Result { method discover (line 37) | fn discover(&mut self) -> Result<(), PluginError> { method load_manifest (line 65) | fn load_manifest(&self, path: &Path) -> Result Vec { method get_plugin (line 88) | pub fn get_plugin(&self, name: &str) -> Option { method install (line 101) | pub fn install(&mut self, source: &str) -> Result<(), PluginError> { method remove (line 159) | pub fn remove(&mut self, name: &str) -> Result<(), PluginError> { method tool_plugins (line 173) | pub fn tool_plugins(&self) -> Vec<&PluginManifest> { method channel_plugins (line 182) | pub fn channel_plugins(&self) -> Vec<&PluginManifest> { method plugins_dir (line 191) | pub fn plugins_dir(&self) -> &Path { type LoadedPlugin (line 14) | struct LoadedPlugin { function test_empty_plugin_dir (line 202) | fn test_empty_plugin_dir() { function test_discover_with_manifest (line 209) | fn test_discover_with_manifest() { function test_tool_plugins_filter (line 234) | fn test_tool_plugins_filter() { function test_get_plugin (line 274) | fn test_get_plugin() { function test_remove_plugin (line 296) | fn test_remove_plugin() { function test_remove_nonexistent_returns_error (line 320) | fn test_remove_nonexistent_returns_error() { FILE: src/plugins/mod.rs type PluginManifest (line 16) | pub struct PluginManifest { type PluginCapability (line 37) | pub enum PluginCapability { type PluginPermission (line 51) | pub enum PluginPermission { type PluginInfo (line 68) | pub struct PluginInfo { FILE: src/plugins/wasm_channel.rs type WasmChannel (line 7) | pub struct WasmChannel { method new (line 13) | pub fn new(name: String, plugin_name: String) -> Self { method name (line 20) | fn name(&self) -> &str { method send (line 24) | async fn send(&self, message: &SendMessage) -> anyhow::Result<()> { method listen (line 35) | async fn listen(&self, _tx: tokio::sync::mpsc::Sender) -... FILE: src/plugins/wasm_tool.rs type WasmTool (line 8) | pub struct WasmTool { method new (line 17) | pub fn new( method name (line 36) | fn name(&self) -> &str { method description (line 40) | fn description(&self) -> &str { method parameters_schema (line 44) | fn parameters_schema(&self) -> Value { method execute (line 48) | async fn execute(&self, args: Value) -> anyhow::Result { FILE: src/providers/anthropic.rs type AnthropicProvider (line 11) | pub struct AnthropicProvider { method new (line 173) | pub fn new(credential: Option<&str>) -> Self { method with_base_url (line 177) | pub fn with_base_url(credential: Option<&str>, base_url: Option<&str>)... method is_setup_token (line 191) | fn is_setup_token(token: &str) -> bool { method apply_auth (line 195) | fn apply_auth( method should_cache_system (line 210) | fn should_cache_system(text: &str) -> bool { method should_cache_conversation (line 215) | fn should_cache_conversation(messages: &[ChatMessage]) -> bool { method apply_cache_to_last_message (line 220) | fn apply_cache_to_last_message(messages: &mut [NativeMessage]) { method convert_tools (line 234) | fn convert_tools<'a>(tools: Option<&'a [ToolSpec]>) -> Option Option Option { method convert_messages (line 309) | fn convert_messages(messages: &[ChatMessage]) -> (Option... method parse_text_response (line 462) | fn parse_text_response(response: ChatResponse) -> anyhow::Result ProviderChat... method http_client (line 520) | fn http_client(&self) -> Client { type ChatRequest (line 17) | struct ChatRequest { type Message (line 27) | struct Message { type ChatResponse (line 33) | struct ChatResponse { type ContentBlock (line 38) | struct ContentBlock { type NativeChatRequest (line 46) | struct NativeChatRequest<'a> { type NativeMessage (line 58) | struct NativeMessage { type ImageSource (line 64) | struct ImageSource { type NativeContentOut (line 73) | enum NativeContentOut { type NativeToolSpec (line 100) | struct NativeToolSpec<'a> { type CacheControl (line 109) | struct CacheControl { method ephemeral (line 115) | fn ephemeral() -> Self { type SystemPrompt (line 124) | enum SystemPrompt { type SystemBlock (line 130) | struct SystemBlock { type NativeChatResponse (line 139) | struct NativeChatResponse { type AnthropicUsage (line 147) | struct AnthropicUsage { type NativeContentIn (line 159) | struct NativeContentIn { method chat_with_system (line 527) | async fn chat_with_system( method chat (line 570) | async fn chat( method capabilities (line 614) | fn capabilities(&self) -> ProviderCapabilities { method supports_native_tools (line 622) | fn supports_native_tools(&self) -> bool { method chat_with_tools (line 626) | async fn chat_with_tools( method warmup (line 673) | async fn warmup(&self) -> anyhow::Result<()> { function creates_with_key (line 694) | fn creates_with_key() { function creates_without_key (line 702) | fn creates_without_key() { function creates_with_empty_key (line 709) | fn creates_with_empty_key() { function creates_with_whitespace_key (line 715) | fn creates_with_whitespace_key() { function creates_with_custom_base_url (line 722) | fn creates_with_custom_base_url() { function custom_base_url_trims_trailing_slash (line 732) | fn custom_base_url_trims_trailing_slash() { function default_base_url_when_none_provided (line 738) | fn default_base_url_when_none_provided() { function chat_fails_without_key (line 744) | async fn chat_fails_without_key() { function setup_token_detection_works (line 758) | fn setup_token_detection_works() { function apply_auth_uses_bearer_and_beta_for_setup_tokens (line 764) | fn apply_auth_uses_bearer_and_beta_for_setup_tokens() { function apply_auth_uses_x_api_key_for_regular_tokens (line 794) | fn apply_auth_uses_x_api_key_for_regular_tokens() { function chat_with_system_fails_without_key (line 818) | async fn chat_with_system_fails_without_key() { function chat_request_serializes_without_system (line 827) | fn chat_request_serializes_without_system() { function chat_request_serializes_with_system (line 848) | fn chat_request_serializes_with_system() { function chat_response_deserializes (line 864) | fn chat_response_deserializes() { function chat_response_empty_content (line 873) | fn chat_response_empty_content() { function chat_response_multiple_blocks (line 880) | fn chat_response_multiple_blocks() { function temperature_range_serializes (line 890) | fn temperature_range_serializes() { function detects_auth_from_jwt_shape (line 905) | fn detects_auth_from_jwt_shape() { function cache_control_serializes_correctly (line 911) | fn cache_control_serializes_correctly() { function system_prompt_string_variant_serializes (line 918) | fn system_prompt_string_variant_serializes() { function system_prompt_blocks_variant_serializes (line 925) | fn system_prompt_blocks_variant_serializes() { function system_prompt_blocks_without_cache_control (line 938) | fn system_prompt_blocks_without_cache_control() { function native_content_text_without_cache_control (line 950) | fn native_content_text_without_cache_control() { function native_content_text_with_cache_control (line 962) | fn native_content_text_with_cache_control() { function native_content_tool_use_without_cache_control (line 974) | fn native_content_tool_use_without_cache_control() { function native_content_tool_result_with_cache_control (line 989) | fn native_content_tool_result_with_cache_control() { function native_tool_spec_without_cache_control (line 1003) | fn native_tool_spec_without_cache_control() { function native_tool_spec_with_cache_control (line 1017) | fn native_tool_spec_with_cache_control() { function should_cache_system_small_prompt (line 1031) | fn should_cache_system_small_prompt() { function should_cache_system_large_prompt (line 1037) | fn should_cache_system_large_prompt() { function should_cache_system_boundary (line 1043) | fn should_cache_system_boundary() { function should_cache_conversation_short (line 1052) | fn should_cache_conversation_short() { function should_cache_conversation_long (line 1068) | fn should_cache_conversation_long() { function should_cache_conversation_boundary (line 1084) | fn should_cache_conversation_boundary() { function apply_cache_to_last_message_text (line 1107) | fn apply_cache_to_last_message_text() { function apply_cache_to_last_message_tool_result (line 1127) | fn apply_cache_to_last_message_tool_result() { function apply_cache_to_last_message_does_not_affect_tool_use (line 1148) | fn apply_cache_to_last_message_does_not_affect_tool_use() { function apply_cache_empty_messages (line 1171) | fn apply_cache_empty_messages() { function convert_tools_adds_cache_to_last_tool (line 1179) | fn convert_tools_adds_cache_to_last_tool() { function convert_tools_single_tool_gets_cache (line 1201) | fn convert_tools_single_tool_gets_cache() { function convert_messages_small_system_prompt_uses_blocks_with_cache (line 1215) | fn convert_messages_small_system_prompt_uses_blocks_with_cache() { function convert_messages_large_system_prompt (line 1239) | fn convert_messages_large_system_prompt() { function native_chat_request_with_blocks_system (line 1259) | fn native_chat_request_with_blocks_system() { function warmup_without_key_is_noop (line 1289) | async fn warmup_without_key_is_noop() { function convert_messages_preserves_multi_turn_history (line 1296) | fn convert_messages_preserves_multi_turn_history() { function chat_with_tools_sends_full_history_and_native_tools (line 1331) | async fn chat_with_tools_sends_full_history_and_native_tools() { function native_response_parses_usage (line 1459) | fn native_response_parses_usage() { function native_response_parses_without_usage (line 1472) | fn native_response_parses_without_usage() { function capabilities_returns_vision_and_native_tools (line 1480) | fn capabilities_returns_vision_and_native_tools() { function convert_messages_with_image_marker_data_uri (line 1491) | fn convert_messages_with_image_marker_data_uri() { function convert_messages_with_only_image_marker (line 1530) | fn convert_messages_with_only_image_marker() { function convert_messages_without_image_marker (line 1559) | fn convert_messages_without_image_marker() { function image_content_serializes_correctly (line 1579) | fn image_content_serializes_correctly() { function convert_messages_merges_consecutive_tool_results (line 1600) | fn convert_messages_merges_consecutive_tool_results() { function convert_messages_no_adjacent_same_role (line 1665) | fn convert_messages_no_adjacent_same_role() { FILE: src/providers/azure_openai.rs constant DEFAULT_API_VERSION (line 10) | const DEFAULT_API_VERSION: &str = "2024-08-01-preview"; type AzureOpenAiProvider (line 12) | pub struct AzureOpenAiProvider { method new (line 165) | pub fn new( method chat_completions_url (line 185) | fn chat_completions_url(&self) -> String { method convert_tools (line 192) | fn convert_tools(tools: Option<&[ToolSpec]>) -> Option Vec { method parse_native_response (line 282) | fn parse_native_response(message: NativeResponseMessage) -> ProviderCh... method http_client (line 304) | fn http_client(&self) -> Client { type ChatRequest (line 21) | struct ChatRequest { type Message (line 27) | struct Message { type ChatResponse (line 33) | struct ChatResponse { type Choice (line 38) | struct Choice { type ResponseMessage (line 43) | struct ResponseMessage { method effective_content (line 51) | fn effective_content(&self) -> String { type NativeChatRequest (line 60) | struct NativeChatRequest { type NativeMessage (line 70) | struct NativeMessage { type NativeToolSpec (line 83) | struct NativeToolSpec { type NativeToolFunctionSpec (line 90) | struct NativeToolFunctionSpec { function parse_native_tool_spec (line 96) | fn parse_native_tool_spec(value: serde_json::Value) -> anyhow::Result Option { method capabilities (line 311) | fn capabilities(&self) -> ProviderCapabilities { method convert_tools (line 319) | fn convert_tools(&self, tools: &[ToolSpec]) -> ToolsPayload { method supports_native_tools (line 337) | fn supports_native_tools(&self) -> bool { method supports_vision (line 341) | fn supports_vision(&self) -> bool { method chat_with_system (line 345) | async fn chat_with_system( method chat (line 399) | async fn chat( method chat_with_tools (line 448) | async fn chat_with_tools( method warmup (line 509) | async fn warmup(&self) -> anyhow::Result<()> { function url_construction_default_version (line 521) | fn url_construction_default_version() { function url_construction_custom_version (line 530) | fn url_construction_custom_version() { function url_construction_preserves_resource_and_deployment (line 544) | fn url_construction_preserves_resource_and_deployment() { function auth_header_uses_api_key_not_bearer (line 553) | fn auth_header_uses_api_key_not_bearer() { function creates_with_credential (line 562) | fn creates_with_credential() { function creates_without_credential (line 576) | fn creates_without_credential() { function chat_fails_without_key (line 582) | async fn chat_fails_without_key() { function chat_with_system_fails_without_key (line 590) | async fn chat_with_system_fails_without_key() { function request_serializes_with_system_message (line 599) | fn request_serializes_with_system_message() { function request_serializes_without_system (line 621) | fn request_serializes_without_system() { function response_deserializes_single_choice (line 635) | fn response_deserializes_single_choice() { function response_deserializes_empty_choices (line 643) | fn response_deserializes_empty_choices() { function response_deserializes_multiple_choices (line 650) | fn response_deserializes_multiple_choices() { function tool_call_response_parsing (line 658) | fn tool_call_response_parsing() { function tool_call_response_without_id_generates_uuid (line 678) | fn tool_call_response_without_id_generates_uuid() { function chat_with_tools_fails_without_key (line 693) | async fn chat_with_tools_fails_without_key() { function native_response_parses_usage (line 716) | fn native_response_parses_usage() { function capabilities_reports_native_tools_and_vision (line 728) | fn capabilities_reports_native_tools_and_vision() { function supports_native_tools_returns_true (line 736) | fn supports_native_tools_returns_true() { function supports_vision_returns_true (line 742) | fn supports_vision_returns_true() { function warmup_is_noop (line 748) | async fn warmup_is_noop() { function custom_api_version_stored (line 755) | fn custom_api_version_stored() { FILE: src/providers/bedrock.rs constant ENDPOINT_PREFIX (line 19) | const ENDPOINT_PREFIX: &str = "bedrock-runtime"; constant SIGNING_SERVICE (line 21) | const SIGNING_SERVICE: &str = "bedrock"; constant DEFAULT_REGION (line 22) | const DEFAULT_REGION: &str = "us-east-1"; constant DEFAULT_MAX_TOKENS (line 23) | const DEFAULT_MAX_TOKENS: u32 = 4096; type AwsCredentials (line 28) | struct AwsCredentials { method from_env (line 37) | fn from_env() -> anyhow::Result { method from_imds (line 56) | async fn from_imds() -> anyhow::Result { method resolve (line 136) | async fn resolve() -> anyhow::Result { method host (line 143) | fn host(&self) -> String { function env_required (line 148) | fn env_required(name: &str) -> anyhow::Result { function env_optional (line 156) | fn env_optional(name: &str) -> Option { function sha256_hex (line 165) | fn sha256_hex(data: &[u8]) -> String { function hmac_sha256 (line 171) | fn hmac_sha256(key: &[u8], data: &[u8]) -> Vec { function derive_signing_key (line 178) | fn derive_signing_key(secret: &str, date: &str, region: &str, service: &... function build_authorization_header (line 188) | fn build_authorization_header( type ConverseRequest (line 249) | struct ConverseRequest { type ConverseMessage (line 260) | struct ConverseMessage { type ContentBlock (line 273) | enum ContentBlock { type ImageWrapper (line 282) | struct ImageWrapper { type ImageBlock (line 287) | struct ImageBlock { type ImageSource (line 294) | struct ImageSource { type TextBlock (line 299) | struct TextBlock { type ToolUseWrapper (line 305) | struct ToolUseWrapper { type ToolUseBlock (line 311) | struct ToolUseBlock { type ToolResultWrapper (line 319) | struct ToolResultWrapper { type ToolResultBlock (line 325) | struct ToolResultBlock { type CachePointWrapper (line 333) | struct CachePointWrapper { type ToolResultContent (line 338) | struct ToolResultContent { type CachePoint (line 343) | struct CachePoint { method default_cache (line 349) | fn default_cache() -> Self { type SystemBlock (line 359) | enum SystemBlock { type InferenceConfig (line 366) | struct InferenceConfig { type ToolConfig (line 373) | struct ToolConfig { type ToolDefinition (line 379) | struct ToolDefinition { type ToolSpecDef (line 385) | struct ToolSpecDef { type InputSchema (line 392) | struct InputSchema { type ConverseResponse (line 400) | struct ConverseResponse { type BedrockUsage (line 412) | struct BedrockUsage { type ConverseOutput (line 420) | struct ConverseOutput { type ConverseOutputMessage (line 426) | struct ConverseOutputMessage { type ResponseContentBlock (line 440) | enum ResponseContentBlock { type ResponseToolUseWrapper (line 448) | struct ResponseToolUseWrapper { type BedrockProvider (line 454) | pub struct BedrockProvider { method new (line 459) | pub fn new() -> Self { method new_async (line 465) | pub async fn new_async() -> Self { method http_client (line 470) | fn http_client(&self) -> Client { method encode_model_path (line 477) | fn encode_model_path(model_id: &str) -> String { method endpoint_url (line 482) | fn endpoint_url(region: &str, model_id: &str) -> String { method canonical_uri (line 489) | fn canonical_uri(model_id: &str) -> String { method require_credentials (line 494) | fn require_credentials(&self) -> anyhow::Result<&AwsCredentials> { method resolve_credentials (line 505) | async fn resolve_credentials(&self) -> anyhow::Result { method should_cache_system (line 515) | fn should_cache_system(text: &str) -> bool { method should_cache_conversation (line 520) | fn should_cache_conversation(messages: &[ChatMessage]) -> bool { method convert_messages (line 526) | fn convert_messages( method extract_tool_call_id (line 621) | fn extract_tool_call_id(content: &str) -> Option { method last_pending_tool_use_id (line 636) | fn last_pending_tool_use_id(converse_messages: &[ConverseMessage]) -> ... method parse_user_content_blocks (line 669) | fn parse_user_content_blocks(content: &str) -> Vec { method parse_assistant_tool_call_message (line 747) | fn parse_assistant_tool_call_message(content: &str) -> Option Option { method convert_tools_to_converse (line 806) | fn convert_tools_to_converse(tools: Option<&[ToolSpec]>) -> Option ProviderChat... method send_converse_request (line 877) | async fn send_converse_request( method capabilities (line 967) | fn capabilities(&self) -> ProviderCapabilities { method supports_native_tools (line 975) | fn supports_native_tools(&self) -> bool { method convert_tools (line 979) | fn convert_tools(&self, tools: &[ToolSpec]) -> ToolsPayload { method chat_with_system (line 995) | async fn chat_with_system( method chat (line 1038) | async fn chat( method warmup (line 1091) | async fn warmup(&self) -> anyhow::Result<()> { function sha256_hex_empty_string (line 1110) | fn sha256_hex_empty_string() { function sha256_hex_known_input (line 1119) | fn sha256_hex_known_input() { constant TEST_VECTOR_SECRET (line 1128) | const TEST_VECTOR_SECRET: &str = "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEK... function hmac_sha256_known_input (line 1131) | fn hmac_sha256_known_input() { function derive_signing_key_structure (line 1141) | fn derive_signing_key_structure() { function derive_signing_key_known_test_vector (line 1148) | fn derive_signing_key_known_test_vector() { function build_authorization_header_format (line 1158) | fn build_authorization_header_format() { function build_authorization_header_includes_security_token_in_signed_headers (line 1197) | fn build_authorization_header_includes_security_token_in_signed_headers() { function credentials_host_formats_correctly (line 1238) | fn credentials_host_formats_correctly() { function creates_without_credentials (line 1251) | fn creates_without_credentials() { function chat_fails_without_credentials (line 1257) | async fn chat_fails_without_credentials() { function endpoint_url_formats_correctly (line 1276) | fn endpoint_url_formats_correctly() { function endpoint_url_keeps_raw_colon (line 1285) | fn endpoint_url_keeps_raw_colon() { function canonical_uri_encodes_colon (line 1293) | fn canonical_uri_encodes_colon() { function canonical_uri_no_colon_unchanged (line 1303) | fn canonical_uri_no_colon_unchanged() { function convert_messages_system_extracted (line 1311) | fn convert_messages_system_extracted() { function convert_messages_user_and_assistant (line 1325) | fn convert_messages_user_and_assistant() { function convert_messages_tool_role_to_tool_result (line 1338) | fn convert_messages_tool_role_to_tool_result() { function convert_messages_assistant_tool_calls_parsed (line 1348) | fn convert_messages_assistant_tool_calls_parsed() { function convert_messages_plain_assistant_text (line 1360) | fn convert_messages_plain_assistant_text() { function should_cache_system_small_prompt (line 1370) | fn should_cache_system_small_prompt() { function should_cache_system_large_prompt (line 1375) | fn should_cache_system_large_prompt() { function should_cache_system_boundary (line 1381) | fn should_cache_system_boundary() { function should_cache_conversation_short (line 1387) | fn should_cache_conversation_short() { function should_cache_conversation_long (line 1397) | fn should_cache_conversation_long() { function convert_tools_to_converse_formats_correctly (line 1411) | fn convert_tools_to_converse_formats_correctly() { function convert_tools_to_converse_empty_returns_none (line 1425) | fn convert_tools_to_converse_empty_returns_none() { function converse_request_serializes_without_system (line 1433) | fn converse_request_serializes_without_system() { function converse_response_deserializes_text (line 1455) | fn converse_response_deserializes_text() { function converse_response_deserializes_tool_use (line 1472) | fn converse_response_deserializes_tool_use() { function converse_response_empty_output (line 1493) | fn converse_response_empty_output() { function content_block_text_serializes_as_flat_string (line 1502) | fn content_block_text_serializes_as_flat_string() { function content_block_tool_use_serializes_with_nested_object (line 1512) | fn content_block_tool_use_serializes_with_nested_object() { function content_block_cache_point_serializes (line 1526) | fn content_block_cache_point_serializes() { function content_block_text_round_trips (line 1535) | fn content_block_text_round_trips() { function cache_point_serializes (line 1545) | fn cache_point_serializes() { function warmup_without_credentials_is_noop (line 1552) | async fn warmup_without_credentials_is_noop() { function capabilities_reports_native_tool_calling (line 1559) | fn capabilities_reports_native_tool_calling() { function converse_response_parses_usage (line 1566) | fn converse_response_parses_usage() { function converse_response_parses_without_usage (line 1578) | fn converse_response_parses_without_usage() { function fallback_tool_result_emits_tool_result_block_not_text (line 1587) | fn fallback_tool_result_emits_tool_result_block_not_text() { function fallback_recovers_tool_use_id_from_assistant (line 1611) | fn fallback_recovers_tool_use_id_from_assistant() { function consecutive_tool_results_merged_into_single_message (line 1632) | fn consecutive_tool_results_merged_into_single_message() { function extract_tool_call_id_tries_multiple_field_names (line 1655) | fn extract_tool_call_id_tries_multiple_field_names() { function parse_tool_result_accepts_alternate_id_fields (line 1675) | fn parse_tool_result_accepts_alternate_id_fields() { FILE: src/providers/claude_code.rs constant CLAUDE_CODE_PATH_ENV (line 42) | pub const CLAUDE_CODE_PATH_ENV: &str = "CLAUDE_CODE_PATH"; constant DEFAULT_CLAUDE_CODE_BINARY (line 45) | const DEFAULT_CLAUDE_CODE_BINARY: &str = "claude"; constant DEFAULT_MODEL_MARKER (line 48) | const DEFAULT_MODEL_MARKER: &str = "default"; constant CLAUDE_CODE_REQUEST_TIMEOUT (line 50) | const CLAUDE_CODE_REQUEST_TIMEOUT: Duration = Duration::from_secs(120); constant MAX_CLAUDE_CODE_STDERR_CHARS (line 52) | const MAX_CLAUDE_CODE_STDERR_CHARS: usize = 512; constant CLAUDE_CODE_SUPPORTED_TEMPERATURES (line 54) | const CLAUDE_CODE_SUPPORTED_TEMPERATURES: [f64; 2] = [0.7, 1.0]; constant TEMP_EPSILON (line 55) | const TEMP_EPSILON: f64 = 1e-9; type ClaudeCodeProvider (line 61) | pub struct ClaudeCodeProvider { method new (line 71) | pub fn new() -> Self { method should_forward_model (line 82) | fn should_forward_model(model: &str) -> bool { method supports_temperature (line 87) | fn supports_temperature(temperature: f64) -> bool { method validate_temperature (line 93) | fn validate_temperature(temperature: f64) -> anyhow::Result<()> { method redact_stderr (line 106) | fn redact_stderr(stderr: &[u8]) -> String { method invoke_cli (line 121) | async fn invoke_cli(&self, message: &str, model: &str) -> anyhow::Resu... method default (line 186) | fn default() -> Self { method chat_with_system (line 193) | async fn chat_with_system( method chat_with_history (line 212) | async fn chat_with_history( method chat (line 260) | async fn chat( function env_lock (line 285) | fn env_lock() -> std::sync::MutexGuard<'static, ()> { function new_uses_env_override (line 293) | fn new_uses_env_override() { function new_defaults_to_claude (line 306) | fn new_defaults_to_claude() { function new_ignores_blank_env_override (line 318) | fn new_ignores_blank_env_override() { function should_forward_model_standard (line 331) | fn should_forward_model_standard() { function should_not_forward_default_model (line 341) | fn should_not_forward_default_model() { function validate_temperature_allows_defaults (line 350) | fn validate_temperature_allows_defaults() { function validate_temperature_rejects_custom_value (line 356) | fn validate_temperature_rejects_custom_value() { function invoke_missing_binary_returns_error (line 364) | async fn invoke_missing_binary_returns_error() { function echo_provider (line 379) | fn echo_provider() -> ClaudeCodeProvider { function echo_provider_uses_unique_script_paths (line 404) | fn echo_provider_uses_unique_script_paths() { function chat_with_history_single_user_message (line 411) | async fn chat_with_history_single_user_message() { function chat_with_history_single_user_with_system (line 422) | async fn chat_with_history_single_user_with_system() { function chat_with_history_multi_turn_includes_all_messages (line 436) | async fn chat_with_history_multi_turn_includes_all_messages() { function chat_with_history_multi_turn_without_system (line 456) | async fn chat_with_history_multi_turn_without_system() { function chat_with_history_rejects_bad_temperature (line 474) | async fn chat_with_history_rejects_bad_temperature() { FILE: src/providers/compatible.rs type OpenAiCompatibleProvider (line 23) | pub struct OpenAiCompatibleProvider { method new (line 63) | pub fn new( method new_with_vision (line 74) | pub fn new_with_vision( method new_no_responses_fallback (line 95) | pub fn new_no_responses_fallback( method new_with_user_agent (line 110) | pub fn new_with_user_agent( method new_with_user_agent_and_vision (line 129) | pub fn new_with_user_agent_and_vision( method new_merge_system_into_user (line 151) | pub fn new_merge_system_into_user( method new_with_options (line 162) | fn new_with_options( method without_native_tools (line 190) | pub fn without_native_tools(mut self) -> Self { method with_timeout_secs (line 196) | pub fn with_timeout_secs(mut self, timeout_secs: u64) -> Self { method with_extra_headers (line 202) | pub fn with_extra_headers( method with_reasoning_effort (line 211) | pub fn with_reasoning_effort(mut self, reasoning_effort: Option) -> Self { method flatten_system_messages (line 226) | fn flatten_system_messages(messages: &[ChatMessage]) -> Vec Client { method chat_completions_url (line 301) | fn chat_completions_url(&self) -> String { method path_ends_with (line 327) | fn path_ends_with(&self, suffix: &str) -> bool { method has_explicit_api_path (line 335) | fn has_explicit_api_path(&self) -> bool { method requires_tool_stream (line 344) | fn requires_tool_stream(&self) -> bool { method tool_stream_for_tools (line 353) | fn tool_stream_for_tools(&self, has_tools: bool) -> Option { method responses_url (line 362) | fn responses_url(&self) -> String { method tool_specs_to_openai_format (line 383) | fn tool_specs_to_openai_format(tools: &[crate::tools::ToolSpec]) -> Ve... method reasoning_effort_for_model (line 399) | fn reasoning_effort_for_model(&self, model: &str) -> Option { method apply_auth_header (line 959) | fn apply_auth_header( method chat_via_responses (line 971) | async fn chat_via_responses( method convert_tool_specs (line 1011) | fn convert_tool_specs( method to_message_content (line 1031) | fn to_message_content( method convert_messages_for_native (line 1062) | fn convert_messages_for_native( method with_prompt_guided_tool_instructions (line 1152) | fn with_prompt_guided_tool_instructions( method parse_native_response (line 1179) | fn parse_native_response(message: ResponseMessage) -> ProviderChatResp... method is_native_tool_schema_unsupported (line 1216) | fn is_native_tool_schema_unsupported(status: reqwest::StatusCode, erro... type AuthStyle (line 53) | pub enum AuthStyle { type ApiChatRequest (line 409) | struct ApiChatRequest { type Message (line 426) | struct Message { type MessageContent (line 433) | enum MessageContent { type MessagePart (line 440) | enum MessagePart { type ImageUrlPart (line 446) | struct ImageUrlPart { type ApiChatResponse (line 451) | struct ApiChatResponse { type UsageInfo (line 458) | struct UsageInfo { type Choice (line 466) | struct Choice { function strip_think_tags (line 474) | fn strip_think_tags(s: &str) -> String { type ResponseMessage (line 495) | struct ResponseMessage { method effective_content (line 512) | fn effective_content(&self) -> String { method effective_content_optional (line 527) | fn effective_content_optional(&self) -> Option { type ToolCall (line 543) | struct ToolCall { method function_name (line 569) | fn function_name(&self) -> Option { method function_arguments (line 581) | fn function_arguments(&self) -> Option { type Function (line 601) | struct Function { type NativeChatRequest (line 609) | struct NativeChatRequest { type NativeMessage (line 626) | struct NativeMessage { type ResponsesRequest (line 641) | struct ResponsesRequest { type ResponsesInput (line 651) | struct ResponsesInput { method user_text (line 673) | fn user_text(content: String) -> Self { method assistant_output_text (line 681) | fn assistant_output_text(content: String) -> Self { type ResponsesInputContent (line 660) | enum ResponsesInputContent { type ResponsesInputPart (line 666) | struct ResponsesInputPart { type ResponsesResponse (line 694) | struct ResponsesResponse { type ResponsesOutput (line 702) | struct ResponsesOutput { type ResponsesContent (line 708) | struct ResponsesContent { type StreamChunkResponse (line 720) | struct StreamChunkResponse { type StreamChoice (line 725) | struct StreamChoice { type StreamDelta (line 731) | struct StreamDelta { function parse_sse_line (line 741) | fn parse_sse_line(line: &str) -> StreamResult> { function sse_bytes_to_chunks (line 779) | fn sse_bytes_to_chunks( function first_nonempty (line 861) | fn first_nonempty(text: Option<&str>) -> Option { function build_responses_prompt (line 872) | fn build_responses_prompt(messages: &[ChatMessage]) -> (Option, ... function extract_responses_text (line 904) | fn extract_responses_text(response: ResponsesResponse) -> Option { function compact_sanitized_body_snippet (line 930) | fn compact_sanitized_body_snippet(body: &str) -> String { function parse_chat_response_body (line 937) | fn parse_chat_response_body(provider_name: &str, body: &str) -> anyhow::... function parse_responses_response_body (line 946) | fn parse_responses_response_body( method capabilities (line 1242) | fn capabilities(&self) -> crate::providers::traits::ProviderCapabilities { method chat_with_system (line 1250) | async fn chat_with_system( method chat_with_history (line 1382) | async fn chat_with_history( method chat_with_tools (line 1493) | async fn chat_with_tools( method chat (line 1609) | async fn chat( method supports_native_tools (line 1735) | fn supports_native_tools(&self) -> bool { method supports_streaming (line 1739) | fn supports_streaming(&self) -> bool { method stream_chat_with_system (line 1743) | fn stream_chat_with_system( method warmup (line 1849) | async fn warmup(&self) -> anyhow::Result<()> { function make_provider (line 1868) | fn make_provider(name: &str, url: &str, key: Option<&str>) -> OpenAiComp... function creates_with_key (line 1873) | fn creates_with_key() { function creates_without_key (line 1885) | fn creates_without_key() { function strips_trailing_slash (line 1891) | fn strips_trailing_slash() { function chat_fails_without_key (line 1897) | async fn chat_fails_without_key() { function request_serializes_correctly (line 1910) | fn request_serializes_correctly() { function response_deserializes (line 1940) | fn response_deserializes() { function response_empty_choices (line 1950) | fn response_empty_choices() { function parse_chat_response_body_reports_sanitized_snippet (line 1957) | fn parse_chat_response_body_reports_sanitized_snippet() { function parse_responses_response_body_reports_sanitized_snippet (line 1969) | fn parse_responses_response_body_reports_sanitized_snippet() { function x_api_key_auth_style (line 1981) | fn x_api_key_auth_style() { function custom_auth_style (line 1992) | fn custom_auth_style() { function all_compatible_providers_fail_without_key (line 2003) | async fn all_compatible_providers_fail_without_key() { function responses_extracts_top_level_output_text (line 2027) | fn responses_extracts_top_level_output_text() { function responses_extracts_nested_output_text (line 2037) | fn responses_extracts_nested_output_text() { function responses_extracts_any_text_as_fallback (line 2048) | fn responses_extracts_any_text_as_fallback() { function build_responses_prompt_preserves_multi_turn_history (line 2058) | fn build_responses_prompt_preserves_multi_turn_history() { function chat_via_responses_requires_non_system_message (line 2115) | async fn chat_via_responses_requires_non_system_message() { function tool_call_function_name_falls_back_to_top_level_name (line 2128) | fn tool_call_function_name_falls_back_to_top_level_name() { function tool_call_function_arguments_falls_back_to_parameters_object (line 2139) | fn tool_call_function_arguments_falls_back_to_parameters_object() { function tool_call_function_arguments_prefers_nested_function_field (line 2153) | fn tool_call_function_arguments_prefers_nested_function_field() { function chat_completions_url_standard_openai (line 2176) | fn chat_completions_url_standard_openai() { function chat_completions_url_trailing_slash (line 2186) | fn chat_completions_url_trailing_slash() { function chat_completions_url_volcengine_ark (line 2196) | fn chat_completions_url_volcengine_ark() { function chat_completions_url_custom_full_endpoint (line 2210) | fn chat_completions_url_custom_full_endpoint() { function chat_completions_url_requires_exact_suffix_match (line 2224) | fn chat_completions_url_requires_exact_suffix_match() { function responses_url_standard (line 2237) | fn responses_url_standard() { function responses_url_custom_full_endpoint (line 2244) | fn responses_url_custom_full_endpoint() { function responses_url_requires_exact_suffix_match (line 2258) | fn responses_url_requires_exact_suffix_match() { function responses_url_derives_from_chat_endpoint (line 2271) | fn responses_url_derives_from_chat_endpoint() { function responses_url_base_with_v1_no_duplicate (line 2284) | fn responses_url_base_with_v1_no_duplicate() { function responses_url_non_v1_api_path_uses_raw_suffix (line 2290) | fn responses_url_non_v1_api_path_uses_raw_suffix() { function chat_completions_url_without_v1 (line 2299) | fn chat_completions_url_without_v1() { function chat_completions_url_base_with_v1 (line 2309) | fn chat_completions_url_base_with_v1() { function chat_completions_url_zai (line 2323) | fn chat_completions_url_zai() { function chat_completions_url_minimax (line 2333) | fn chat_completions_url_minimax() { function chat_completions_url_glm (line 2343) | fn chat_completions_url_glm() { function chat_completions_url_opencode (line 2353) | fn chat_completions_url_opencode() { function chat_completions_url_opencode_go (line 2363) | fn chat_completions_url_opencode_go() { function parse_native_response_preserves_tool_call_id (line 2373) | fn parse_native_response_preserves_tool_call_id() { function convert_messages_for_native_maps_tool_result_payload (line 2397) | fn convert_messages_for_native_maps_tool_result_payload() { function convert_messages_for_native_keeps_user_image_markers_as_text_when_disabled (line 2413) | fn convert_messages_for_native_keeps_user_image_markers_as_text_when_dis... function flatten_system_messages_merges_into_first_user (line 2429) | fn flatten_system_messages_merges_into_first_user() { function flatten_system_messages_inserts_user_when_missing (line 2450) | fn flatten_system_messages_inserts_user_when_missing() { function strip_think_tags_drops_unclosed_block_suffix (line 2465) | fn strip_think_tags_drops_unclosed_block_suffix() { function native_tool_schema_unsupported_detection_is_precise (line 2471) | fn native_tool_schema_unsupported_detection_is_precise() { function native_tool_schema_unsupported_detects_groq_tool_validation_error (line 2485) | fn native_tool_schema_unsupported_detects_groq_tool_validation_error() { function prompt_guided_tool_fallback_injects_system_instruction (line 2493) | fn prompt_guided_tool_fallback_injects_system_instruction() { function reasoning_effort_only_applies_to_gpt5_and_codex_models (line 2516) | fn reasoning_effort_only_applies_to_gpt5_and_codex_models() { function warmup_without_key_is_noop (line 2532) | async fn warmup_without_key_is_noop() { function capabilities_reports_native_tool_calling (line 2543) | fn capabilities_reports_native_tool_calling() { function capabilities_reports_vision_for_qwen_compatible_provider (line 2551) | fn capabilities_reports_vision_for_qwen_compatible_provider() { function minimax_provider_disables_native_tool_calling (line 2565) | fn minimax_provider_disables_native_tool_calling() { function user_agent_constructor_keeps_native_tool_calling_enabled (line 2581) | fn user_agent_constructor_keeps_native_tool_calling_enabled() { function user_agent_and_vision_constructor_preserves_capability_flags (line 2596) | fn user_agent_and_vision_constructor_preserves_capability_flags() { function no_responses_fallback_constructor_keeps_native_tool_calling_enabled (line 2612) | fn no_responses_fallback_constructor_keeps_native_tool_calling_enabled() { function to_message_content_converts_image_markers_to_openai_parts (line 2626) | fn to_message_content_converts_image_markers_to_openai_parts() { function to_message_content_keeps_markers_as_text_when_user_image_parts_disabled (line 2643) | fn to_message_content_keeps_markers_as_text_when_user_image_parts_disabl... function to_message_content_keeps_plain_text_for_non_user_roles (line 2653) | fn to_message_content_keeps_plain_text_for_non_user_roles() { function tool_specs_convert_to_openai_format (line 2664) | fn tool_specs_convert_to_openai_format() { function request_serializes_with_tools (line 2684) | fn request_serializes_with_tools() { function zai_tool_requests_enable_tool_stream (line 2719) | fn zai_tool_requests_enable_tool_stream() { function non_zai_tool_requests_omit_tool_stream (line 2752) | fn non_zai_tool_requests_omit_tool_stream() { function z_ai_host_enables_tool_stream_for_custom_profiles (line 2785) | fn z_ai_host_enables_tool_stream_for_custom_profiles() { function response_with_tool_calls_deserializes (line 2791) | fn response_with_tool_calls_deserializes() { function response_with_multiple_tool_calls (line 2828) | fn response_with_multiple_tool_calls() { function chat_with_tools_fails_without_key (line 2869) | async fn chat_with_tools_fails_without_key() { function response_with_no_tool_calls_has_empty_vec (line 2893) | fn response_with_no_tool_calls_has_empty_vec() { function flatten_system_messages_merges_into_first_user_and_removes_system_roles (line 2902) | fn flatten_system_messages_merges_into_first_user_and_removes_system_rol... function flatten_system_messages_inserts_synthetic_user_when_no_user_exists (line 2924) | fn flatten_system_messages_inserts_synthetic_user_when_no_user_exists() { function strip_think_tags_removes_multiple_blocks_with_surrounding_text (line 2938) | fn strip_think_tags_removes_multiple_blocks_with_surrounding_text() { function strip_think_tags_drops_tail_for_unclosed_block (line 2945) | fn strip_think_tags_drops_tail_for_unclosed_block() { function reasoning_content_fallback_when_content_empty (line 2956) | fn reasoning_content_fallback_when_content_empty() { function reasoning_content_fallback_when_content_null (line 2965) | fn reasoning_content_fallback_when_content_null() { function reasoning_content_fallback_when_content_missing (line 2975) | fn reasoning_content_fallback_when_content_missing() { function reasoning_content_not_used_when_content_present (line 2984) | fn reasoning_content_not_used_when_content_present() { function reasoning_content_used_when_content_only_think_tags (line 2993) | fn reasoning_content_used_when_content_only_think_tags() { function reasoning_content_both_absent_returns_empty (line 3005) | fn reasoning_content_both_absent_returns_empty() { function reasoning_content_ignored_by_normal_models (line 3014) | fn reasoning_content_ignored_by_normal_models() { function parse_sse_line_with_content (line 3028) | fn parse_sse_line_with_content() { function parse_sse_line_with_reasoning_content (line 3035) | fn parse_sse_line_with_reasoning_content() { function parse_sse_line_with_both_prefers_content (line 3042) | fn parse_sse_line_with_both_prefers_content() { function parse_sse_line_with_empty_content_falls_back_to_reasoning_content (line 3049) | fn parse_sse_line_with_empty_content_falls_back_to_reasoning_content() { function parse_sse_line_done_sentinel (line 3057) | fn parse_sse_line_done_sentinel() { function api_response_parses_usage (line 3064) | fn api_response_parses_usage() { function api_response_parses_without_usage (line 3076) | fn api_response_parses_without_usage() { function parse_native_response_captures_reasoning_content (line 3087) | fn parse_native_response_captures_reasoning_content() { function parse_native_response_none_reasoning_content_for_normal_model (line 3111) | fn parse_native_response_none_reasoning_content_for_normal_model() { function convert_messages_for_native_round_trips_reasoning_content (line 3124) | fn convert_messages_for_native_round_trips_reasoning_content() { function convert_messages_for_native_no_reasoning_content_when_absent (line 3148) | fn convert_messages_for_native_no_reasoning_content_when_absent() { function convert_messages_for_native_reasoning_content_serialized_only_when_present (line 3166) | fn convert_messages_for_native_reasoning_content_serialized_only_when_pr... function default_timeout_is_120s (line 3197) | fn default_timeout_is_120s() { function with_timeout_secs_overrides_default (line 3203) | fn with_timeout_secs_overrides_default() { function extra_headers_default_empty (line 3209) | fn extra_headers_default_empty() { function with_extra_headers_sets_headers (line 3215) | fn with_extra_headers_sets_headers() { function http_client_with_extra_headers_builds_successfully (line 3232) | fn http_client_with_extra_headers_builds_successfully() { function http_client_without_extra_headers_or_user_agent (line 3242) | fn http_client_without_extra_headers_or_user_agent() { function extra_headers_combined_with_user_agent (line 3249) | fn extra_headers_combined_with_user_agent() { function tool_call_none_fields_omitted_from_json (line 3267) | fn tool_call_none_fields_omitted_from_json() { function tool_call_with_compat_fields_serializes_them (line 3292) | fn tool_call_with_compat_fields_serializes_them() { FILE: src/providers/copilot.rs constant GITHUB_CLIENT_ID (line 29) | const GITHUB_CLIENT_ID: &str = "Iv1.b507a08c87ecfe98"; constant GITHUB_DEVICE_CODE_URL (line 30) | const GITHUB_DEVICE_CODE_URL: &str = "https://github.com/login/device/co... constant GITHUB_ACCESS_TOKEN_URL (line 31) | const GITHUB_ACCESS_TOKEN_URL: &str = "https://github.com/login/oauth/ac... constant GITHUB_API_KEY_URL (line 32) | const GITHUB_API_KEY_URL: &str = "https://api.github.com/copilot_interna... constant DEFAULT_API (line 33) | const DEFAULT_API: &str = "https://api.githubcopilot.com"; type DeviceCodeResponse (line 38) | struct DeviceCodeResponse { function default_interval (line 48) | fn default_interval() -> u64 { function default_expires_in (line 52) | fn default_expires_in() -> u64 { type AccessTokenResponse (line 57) | struct AccessTokenResponse { type ApiKeyInfo (line 63) | struct ApiKeyInfo { type ApiEndpoints (line 71) | struct ApiEndpoints { type CachedApiKey (line 75) | struct CachedApiKey { type ApiChatRequest (line 84) | struct ApiChatRequest<'a> { type ApiMessage (line 95) | struct ApiMessage { type NativeToolSpec (line 106) | struct NativeToolSpec<'a> { type NativeToolFunctionSpec (line 113) | struct NativeToolFunctionSpec<'a> { type NativeToolCall (line 120) | struct NativeToolCall { type NativeFunctionCall (line 129) | struct NativeFunctionCall { type ApiContent (line 137) | enum ApiContent { type ContentPart (line 144) | enum ContentPart { type ImageUrlDetail (line 152) | struct ImageUrlDetail { type ApiChatResponse (line 157) | struct ApiChatResponse { type UsageInfo (line 164) | struct UsageInfo { type Choice (line 172) | struct Choice { type ResponseMessage (line 177) | struct ResponseMessage { type CopilotProvider (line 191) | pub struct CopilotProvider { method new (line 200) | pub fn new(github_token: Option<&str>) -> Self { method http_client (line 242) | fn http_client(&self) -> Client { constant COPILOT_HEADERS (line 247) | const COPILOT_HEADERS: [(&str, &str); 4] = [ method convert_tools (line 254) | fn convert_tools(tools: Option<&[ToolSpec]>) -> Option Option { method convert_messages (line 298) | fn convert_messages(messages: &[ChatMessage]) -> Vec { method send_chat_request (line 367) | async fn send_chat_request( method get_api_key (line 438) | async fn get_api_key(&self) -> anyhow::Result<(String, String)> { method get_github_access_token (line 485) | async fn get_github_access_token(&self) -> anyhow::Result { method device_code_login (line 504) | async fn device_code_login(&self) -> anyhow::Result { method exchange_for_api_key (line 569) | async fn exchange_for_api_key(&self, access_token: &str) -> anyhow::Re... method load_api_key_from_disk (line 598) | async fn load_api_key_from_disk(&self) -> Option { method save_api_key_to_disk (line 604) | async fn save_api_key_to_disk(&self, info: &ApiKeyInfo) { function write_file_secure (line 614) | async fn write_file_secure(path: &Path, content: &str) { method chat_with_system (line 652) | async fn chat_with_system( method chat_with_history (line 681) | async fn chat_with_history( method chat (line 693) | async fn chat( method supports_native_tools (line 708) | fn supports_native_tools(&self) -> bool { method warmup (line 712) | async fn warmup(&self) -> anyhow::Result<()> { function new_without_token (line 723) | fn new_without_token() { function new_with_token (line 729) | fn new_with_token() { function empty_token_treated_as_none (line 735) | fn empty_token_treated_as_none() { function cache_starts_empty (line 741) | async fn cache_starts_empty() { function copilot_headers_include_required_fields (line 748) | fn copilot_headers_include_required_fields() { function default_interval_and_expiry (line 760) | fn default_interval_and_expiry() { function supports_native_tools (line 766) | fn supports_native_tools() { function api_response_parses_usage (line 772) | fn api_response_parses_usage() { function api_response_parses_without_usage (line 784) | fn api_response_parses_without_usage() { function to_api_content_user_with_image_returns_parts (line 791) | fn to_api_content_user_with_image_returns_parts() { function to_api_content_user_plain_returns_text (line 809) | fn to_api_content_user_plain_returns_text() { function to_api_content_non_user_returns_text (line 815) | fn to_api_content_non_user_returns_text() { FILE: src/providers/gemini.rs type GeminiProvider (line 18) | pub struct GeminiProvider { method new (line 433) | pub fn new(api_key: Option<&str>) -> Self { method new_with_auth (line 463) | pub fn new_with_auth( method normalize_non_empty (line 528) | fn normalize_non_empty(value: &str) -> Option { method load_non_empty_env (line 537) | fn load_non_empty_env(name: &str) -> Option { method load_gemini_cli_creds (line 543) | fn load_gemini_cli_creds(creds_path: &PathBuf) -> Option Vec { method try_load_gemini_cli_token (line 593) | fn try_load_gemini_cli_token(path: Option<&PathBuf>) -> Option Option { method has_cli_credentials (line 644) | pub fn has_cli_credentials() -> bool { method has_any_auth (line 658) | pub fn has_any_auth() -> bool { method auth_source (line 666) | pub fn auth_source(&self) -> &'static str { method get_valid_oauth_token (line 679) | async fn get_valid_oauth_token( method rotate_oauth_credential (line 718) | async fn rotate_oauth_credential( method format_model_name (line 757) | fn format_model_name(model: &str) -> String { method format_internal_model_name (line 765) | fn format_internal_model_name(model: &str) -> String { method build_generate_content_url (line 778) | fn build_generate_content_url(model: &str, auth: &GeminiAuth) -> String { method http_client (line 798) | fn http_client(&self) -> Client { method resolve_oauth_project (line 804) | async fn resolve_oauth_project(&self, token: &str) -> anyhow::Result bool { method is_oauth (line 66) | fn is_oauth(&self) -> bool { method api_key_credential (line 71) | fn api_key_credential(&self) -> &str { type GenerateContentRequest (line 86) | struct GenerateContentRequest { type InternalGenerateContentEnvelope (line 111) | struct InternalGenerateContentEnvelope { type InternalGenerateContentRequest (line 122) | struct InternalGenerateContentRequest { type Content (line 131) | struct Content { type Part (line 138) | struct Part { type GenerationConfig (line 143) | struct GenerationConfig { type GenerateContentResponse (line 150) | struct GenerateContentResponse { method into_effective_response (line 236) | fn into_effective_response(self) -> Self { type GeminiUsageMetadata (line 160) | struct GeminiUsageMetadata { type InternalGenerateContentResponse (line 170) | struct InternalGenerateContentResponse { type Candidate (line 175) | struct Candidate { type CandidateContent (line 181) | struct CandidateContent { method effective_text (line 204) | fn effective_text(self) -> Option { type ResponsePart (line 186) | struct ResponsePart { type ApiError (line 230) | struct ApiError { type GeminiCliOAuthCreds (line 253) | struct GeminiCliOAuthCreds { constant GOOGLE_TOKEN_ENDPOINT (line 274) | const GOOGLE_TOKEN_ENDPOINT: &str = "https://oauth2.googleapis.com/token"; constant CLOUDCODE_PA_ENDPOINT (line 278) | const CLOUDCODE_PA_ENDPOINT: &str = "https://cloudcode-pa.googleapis.com... constant LOAD_CODE_ASSIST_ENDPOINT (line 281) | const LOAD_CODE_ASSIST_ENDPOINT: &str = constant PUBLIC_API_ENDPOINT (line 285) | const PUBLIC_API_ENDPOINT: &str = "https://generativelanguage.googleapis... type RefreshedToken (line 292) | struct RefreshedToken { function refresh_gemini_cli_token (line 303) | fn refresh_gemini_cli_token( function build_oauth_refresh_form (line 361) | fn build_oauth_refresh_form( function extract_client_id_from_id_token (line 379) | fn extract_client_id_from_id_token(id_token: &str) -> Option { function refresh_gemini_cli_token_async (line 406) | async fn refresh_gemini_cli_token_async( method chat_with_system (line 1147) | async fn chat_with_system( method chat_with_history (line 1174) | async fn chat_with_history( method chat (line 1226) | async fn chat( method warmup (line 1277) | async fn warmup(&self) -> anyhow::Result<()> { function test_oauth_auth (line 1334) | fn test_oauth_auth(token: &str) -> GeminiAuth { function test_provider (line 1344) | fn test_provider(auth: Option) -> GeminiProvider { function normalize_non_empty_trims_and_filters (line 1356) | fn normalize_non_empty_trims_and_filters() { function oauth_refresh_form_uses_provided_client_credentials (line 1366) | fn oauth_refresh_form_uses_provided_client_credentials() { function oauth_refresh_form_omits_client_credentials_when_missing (line 1376) | fn oauth_refresh_form_omits_client_credentials_when_missing() { function extract_client_id_from_id_token_prefers_aud_claim (line 1384) | fn extract_client_id_from_id_token_prefers_aud_claim() { function extract_client_id_from_id_token_uses_azp_when_aud_missing (line 1400) | fn extract_client_id_from_id_token_uses_azp_when_aud_missing() { function extract_client_id_from_id_token_returns_none_for_invalid_tokens (line 1415) | fn extract_client_id_from_id_token_returns_none_for_invalid_tokens() { function try_load_cli_token_derives_client_id_from_id_token_when_missing (line 1421) | fn try_load_cli_token_derives_client_id_from_id_token_when_missing() { function provider_creates_without_key (line 1444) | fn provider_creates_without_key() { function provider_creates_with_key (line 1451) | fn provider_creates_with_key() { function provider_rejects_empty_key (line 1460) | fn provider_rejects_empty_key() { function gemini_cli_dir_returns_path (line 1466) | fn gemini_cli_dir_returns_path() { function auth_source_explicit_key (line 1476) | fn auth_source_explicit_key() { function auth_source_none_without_credentials (line 1482) | fn auth_source_none_without_credentials() { function auth_source_oauth (line 1488) | fn auth_source_oauth() { function model_name_formatting (line 1494) | fn model_name_formatting() { function api_key_url_includes_key_query_param (line 1514) | fn api_key_url_includes_key_query_param() { function oauth_url_uses_internal_endpoint (line 1521) | fn oauth_url_uses_internal_endpoint() { function api_key_url_uses_public_endpoint (line 1531) | fn api_key_url_uses_public_endpoint() { function oauth_request_uses_bearer_auth_header (line 1539) | fn oauth_request_uses_bearer_auth_header() { function oauth_request_wraps_payload_in_request_envelope (line 1580) | fn oauth_request_wraps_payload_in_request_envelope() { function api_key_request_does_not_set_bearer_header (line 1624) | fn api_key_request_does_not_set_bearer_header() { function request_serialization (line 1659) | fn request_serialization() { function internal_request_includes_model (line 1689) | fn internal_request_includes_model() { function internal_request_omits_generation_config_when_none (line 1721) | fn internal_request_omits_generation_config_when_none() { function internal_request_includes_project (line 1744) | fn internal_request_includes_project() { function internal_response_deserialize_nested (line 1766) | fn internal_response_deserialize_nested() { function creds_deserialize_with_expiry_date (line 1796) | fn creds_deserialize_with_expiry_date() { function creds_deserialize_accepts_camel_case_fields (line 1811) | fn creds_deserialize_accepts_camel_case_fields() { function oauth_retry_detection_for_generation_config_rejection (line 1829) | fn oauth_retry_detection_for_generation_config_rejection() { function response_deserialization (line 1862) | fn response_deserialization() { function error_response_deserialization (line 1890) | fn error_response_deserialization() { function internal_response_deserialization (line 1903) | fn internal_response_deserialization() { function thinking_response_extracts_non_thinking_text (line 1935) | fn thinking_response_extracts_non_thinking_text() { function non_thinking_response_unaffected (line 1955) | fn non_thinking_response_unaffected() { function thinking_only_response_falls_back_to_thinking_text (line 1971) | fn thinking_only_response_falls_back_to_thinking_text() { function empty_parts_returns_none (line 1990) | fn empty_parts_returns_none() { function multiple_text_parts_concatenated (line 2006) | fn multiple_text_parts_concatenated() { function thought_signature_only_parts_skipped (line 2025) | fn thought_signature_only_parts_skipped() { function internal_response_thinking_model (line 2043) | fn internal_response_thinking_model() { function warmup_without_key_is_noop (line 2065) | async fn warmup_without_key_is_noop() { function warmup_oauth_is_noop (line 2072) | async fn warmup_oauth_is_noop() { function discover_oauth_cred_paths_does_not_panic (line 2079) | fn discover_oauth_cred_paths_does_not_panic() { function rotate_oauth_without_alternatives_returns_false (line 2084) | async fn rotate_oauth_without_alternatives_returns_false() { function response_parses_usage_metadata (line 2097) | fn response_parses_usage_metadata() { function response_parses_without_usage_metadata (line 2109) | fn response_parses_without_usage_metadata() { function warmup_managed_oauth_requires_auth_service (line 2117) | async fn warmup_managed_oauth_requires_auth_service() { function warmup_cli_oauth_skips_validation (line 2137) | async fn warmup_cli_oauth_skips_validation() { FILE: src/providers/gemini_cli.rs constant GEMINI_CLI_PATH_ENV (line 45) | pub const GEMINI_CLI_PATH_ENV: &str = "GEMINI_CLI_PATH"; constant DEFAULT_GEMINI_CLI_BINARY (line 48) | const DEFAULT_GEMINI_CLI_BINARY: &str = "gemini"; constant DEFAULT_MODEL_MARKER (line 51) | const DEFAULT_MODEL_MARKER: &str = "default"; constant GEMINI_CLI_REQUEST_TIMEOUT (line 53) | const GEMINI_CLI_REQUEST_TIMEOUT: Duration = Duration::from_secs(120); constant MAX_GEMINI_CLI_STDERR_CHARS (line 55) | const MAX_GEMINI_CLI_STDERR_CHARS: usize = 512; constant GEMINI_CLI_SUPPORTED_TEMPERATURES (line 57) | const GEMINI_CLI_SUPPORTED_TEMPERATURES: [f64; 2] = [0.7, 1.0]; constant TEMP_EPSILON (line 58) | const TEMP_EPSILON: f64 = 1e-9; type GeminiCliProvider (line 64) | pub struct GeminiCliProvider { method new (line 74) | pub fn new() -> Self { method should_forward_model (line 85) | fn should_forward_model(model: &str) -> bool { method supports_temperature (line 90) | fn supports_temperature(temperature: f64) -> bool { method validate_temperature (line 96) | fn validate_temperature(temperature: f64) -> anyhow::Result<()> { method redact_stderr (line 109) | fn redact_stderr(stderr: &[u8]) -> String { method invoke_cli (line 124) | async fn invoke_cli(&self, message: &str, model: &str) -> anyhow::Resu... method default (line 189) | fn default() -> Self { method chat_with_system (line 196) | async fn chat_with_system( method chat (line 215) | async fn chat( function env_lock (line 239) | fn env_lock() -> std::sync::MutexGuard<'static, ()> { function new_uses_env_override (line 247) | fn new_uses_env_override() { function new_defaults_to_gemini (line 260) | fn new_defaults_to_gemini() { function new_ignores_blank_env_override (line 272) | fn new_ignores_blank_env_override() { function should_forward_model_standard (line 285) | fn should_forward_model_standard() { function should_not_forward_default_model (line 291) | fn should_not_forward_default_model() { function validate_temperature_allows_defaults (line 300) | fn validate_temperature_allows_defaults() { function validate_temperature_rejects_custom_value (line 306) | fn validate_temperature_rejects_custom_value() { function invoke_missing_binary_returns_error (line 314) | async fn invoke_missing_binary_returns_error() { FILE: src/providers/glm.rs type GlmProvider (line 13) | pub struct GlmProvider { method new (line 82) | pub fn new(api_key: Option<&str>) -> Self { method generate_token (line 96) | fn generate_token(&self) -> anyhow::Result { method http_client (line 147) | fn http_client(&self) -> Client { type ChatRequest (line 22) | struct ChatRequest { type Message (line 29) | struct Message { type ChatResponse (line 35) | struct ChatResponse { type Choice (line 40) | struct Choice { type ResponseMessage (line 45) | struct ResponseMessage { function base64url_encode_bytes (line 50) | fn base64url_encode_bytes(data: &[u8]) -> String { function base64url_encode_str (line 77) | fn base64url_encode_str(s: &str) -> String { method chat_with_system (line 154) | async fn chat_with_system( method chat_with_history (line 208) | async fn chat_with_history( method warmup (line 255) | async fn warmup(&self) -> anyhow::Result<()> { function parses_api_key (line 279) | fn parses_api_key() { function handles_no_key (line 286) | fn handles_no_key() { function handles_invalid_key_format (line 293) | fn handles_invalid_key_format() { function generates_jwt_token (line 300) | fn generates_jwt_token() { function caches_token (line 310) | fn caches_token() { function fails_without_key (line 318) | fn fails_without_key() { function chat_fails_without_key (line 326) | async fn chat_fails_without_key() { function chat_with_history_fails_without_key (line 335) | async fn chat_with_history_fails_without_key() { function base64url_no_padding (line 348) | fn base64url_no_padding() { function warmup_without_key_is_noop (line 356) | async fn warmup_without_key_is_noop() { FILE: src/providers/kilocli.rs constant KILO_CLI_PATH_ENV (line 45) | pub const KILO_CLI_PATH_ENV: &str = "KILO_CLI_PATH"; constant DEFAULT_KILO_CLI_BINARY (line 48) | const DEFAULT_KILO_CLI_BINARY: &str = "kilo"; constant DEFAULT_MODEL_MARKER (line 51) | const DEFAULT_MODEL_MARKER: &str = "default"; constant KILO_CLI_REQUEST_TIMEOUT (line 53) | const KILO_CLI_REQUEST_TIMEOUT: Duration = Duration::from_secs(120); constant MAX_KILO_CLI_STDERR_CHARS (line 55) | const MAX_KILO_CLI_STDERR_CHARS: usize = 512; constant KILO_CLI_SUPPORTED_TEMPERATURES (line 57) | const KILO_CLI_SUPPORTED_TEMPERATURES: [f64; 2] = [0.7, 1.0]; constant TEMP_EPSILON (line 58) | const TEMP_EPSILON: f64 = 1e-9; type KiloCliProvider (line 64) | pub struct KiloCliProvider { method new (line 74) | pub fn new() -> Self { method should_forward_model (line 85) | fn should_forward_model(model: &str) -> bool { method supports_temperature (line 90) | fn supports_temperature(temperature: f64) -> bool { method validate_temperature (line 96) | fn validate_temperature(temperature: f64) -> anyhow::Result<()> { method redact_stderr (line 109) | fn redact_stderr(stderr: &[u8]) -> String { method invoke_cli (line 124) | async fn invoke_cli(&self, message: &str, model: &str) -> anyhow::Resu... method default (line 191) | fn default() -> Self { method chat_with_system (line 198) | async fn chat_with_system( method chat (line 217) | async fn chat( function env_lock (line 241) | fn env_lock() -> std::sync::MutexGuard<'static, ()> { function new_uses_env_override (line 249) | fn new_uses_env_override() { function new_defaults_to_kilo (line 262) | fn new_defaults_to_kilo() { function new_ignores_blank_env_override (line 274) | fn new_ignores_blank_env_override() { function should_forward_model_standard (line 287) | fn should_forward_model_standard() { function should_not_forward_default_model (line 293) | fn should_not_forward_default_model() { function validate_temperature_allows_defaults (line 300) | fn validate_temperature_allows_defaults() { function validate_temperature_rejects_custom_value (line 306) | fn validate_temperature_rejects_custom_value() { function invoke_missing_binary_returns_error (line 314) | async fn invoke_missing_binary_returns_error() { FILE: src/providers/mod.rs constant MAX_API_ERROR_CHARS (line 49) | const MAX_API_ERROR_CHARS: usize = 200; constant MINIMAX_INTL_BASE_URL (line 50) | const MINIMAX_INTL_BASE_URL: &str = "https://api.minimax.io/v1"; constant MINIMAX_CN_BASE_URL (line 51) | const MINIMAX_CN_BASE_URL: &str = "https://api.minimaxi.com/v1"; constant MINIMAX_OAUTH_GLOBAL_TOKEN_ENDPOINT (line 52) | const MINIMAX_OAUTH_GLOBAL_TOKEN_ENDPOINT: &str = "https://api.minimax.i... constant MINIMAX_OAUTH_CN_TOKEN_ENDPOINT (line 53) | const MINIMAX_OAUTH_CN_TOKEN_ENDPOINT: &str = "https://api.minimaxi.com/... constant MINIMAX_OAUTH_PLACEHOLDER (line 54) | const MINIMAX_OAUTH_PLACEHOLDER: &str = "minimax-oauth"; constant MINIMAX_OAUTH_CN_PLACEHOLDER (line 55) | const MINIMAX_OAUTH_CN_PLACEHOLDER: &str = "minimax-oauth-cn"; constant MINIMAX_OAUTH_TOKEN_ENV (line 56) | const MINIMAX_OAUTH_TOKEN_ENV: &str = "MINIMAX_OAUTH_TOKEN"; constant MINIMAX_API_KEY_ENV (line 57) | const MINIMAX_API_KEY_ENV: &str = "MINIMAX_API_KEY"; constant MINIMAX_OAUTH_REFRESH_TOKEN_ENV (line 58) | const MINIMAX_OAUTH_REFRESH_TOKEN_ENV: &str = "MINIMAX_OAUTH_REFRESH_TOK... constant MINIMAX_OAUTH_REGION_ENV (line 59) | const MINIMAX_OAUTH_REGION_ENV: &str = "MINIMAX_OAUTH_REGION"; constant MINIMAX_OAUTH_CLIENT_ID_ENV (line 60) | const MINIMAX_OAUTH_CLIENT_ID_ENV: &str = "MINIMAX_OAUTH_CLIENT_ID"; constant MINIMAX_OAUTH_DEFAULT_CLIENT_ID (line 61) | const MINIMAX_OAUTH_DEFAULT_CLIENT_ID: &str = "78257093-7e40-4613-99e0-5... constant GLM_GLOBAL_BASE_URL (line 62) | const GLM_GLOBAL_BASE_URL: &str = "https://api.z.ai/api/paas/v4"; constant GLM_CN_BASE_URL (line 63) | const GLM_CN_BASE_URL: &str = "https://open.bigmodel.cn/api/paas/v4"; constant MOONSHOT_INTL_BASE_URL (line 64) | const MOONSHOT_INTL_BASE_URL: &str = "https://api.moonshot.ai/v1"; constant MOONSHOT_CN_BASE_URL (line 65) | const MOONSHOT_CN_BASE_URL: &str = "https://api.moonshot.cn/v1"; constant QWEN_CN_BASE_URL (line 66) | const QWEN_CN_BASE_URL: &str = "https://dashscope.aliyuncs.com/compatibl... constant QWEN_INTL_BASE_URL (line 67) | const QWEN_INTL_BASE_URL: &str = "https://dashscope-intl.aliyuncs.com/co... constant QWEN_US_BASE_URL (line 68) | const QWEN_US_BASE_URL: &str = "https://dashscope-us.aliyuncs.com/compat... constant QWEN_OAUTH_BASE_FALLBACK_URL (line 69) | const QWEN_OAUTH_BASE_FALLBACK_URL: &str = QWEN_CN_BASE_URL; constant BAILIAN_BASE_URL (line 70) | const BAILIAN_BASE_URL: &str = "https://coding.dashscope.aliyuncs.com/v1"; constant QWEN_OAUTH_TOKEN_ENDPOINT (line 71) | const QWEN_OAUTH_TOKEN_ENDPOINT: &str = "https://chat.qwen.ai/api/v1/oau... constant QWEN_OAUTH_PLACEHOLDER (line 72) | const QWEN_OAUTH_PLACEHOLDER: &str = "qwen-oauth"; constant QWEN_OAUTH_TOKEN_ENV (line 73) | const QWEN_OAUTH_TOKEN_ENV: &str = "QWEN_OAUTH_TOKEN"; constant QWEN_OAUTH_REFRESH_TOKEN_ENV (line 74) | const QWEN_OAUTH_REFRESH_TOKEN_ENV: &str = "QWEN_OAUTH_REFRESH_TOKEN"; constant QWEN_OAUTH_RESOURCE_URL_ENV (line 75) | const QWEN_OAUTH_RESOURCE_URL_ENV: &str = "QWEN_OAUTH_RESOURCE_URL"; constant QWEN_OAUTH_CLIENT_ID_ENV (line 76) | const QWEN_OAUTH_CLIENT_ID_ENV: &str = "QWEN_OAUTH_CLIENT_ID"; constant QWEN_OAUTH_DEFAULT_CLIENT_ID (line 77) | const QWEN_OAUTH_DEFAULT_CLIENT_ID: &str = "f0304373b74a44d2b584a3fb70ca... constant QWEN_OAUTH_CREDENTIAL_FILE (line 78) | const QWEN_OAUTH_CREDENTIAL_FILE: &str = ".qwen/oauth_creds.json"; constant ZAI_GLOBAL_BASE_URL (line 79) | const ZAI_GLOBAL_BASE_URL: &str = "https://api.z.ai/api/coding/paas/v4"; constant ZAI_CN_BASE_URL (line 80) | const ZAI_CN_BASE_URL: &str = "https://open.bigmodel.cn/api/coding/paas/... constant VERCEL_AI_GATEWAY_BASE_URL (line 81) | const VERCEL_AI_GATEWAY_BASE_URL: &str = "https://ai-gateway.vercel.sh/v1"; function is_minimax_intl_alias (line 83) | pub(crate) fn is_minimax_intl_alias(name: &str) -> bool { function is_minimax_cn_alias (line 97) | pub(crate) fn is_minimax_cn_alias(name: &str) -> bool { function is_minimax_alias (line 104) | pub(crate) fn is_minimax_alias(name: &str) -> bool { function is_glm_global_alias (line 108) | pub(crate) fn is_glm_global_alias(name: &str) -> bool { function is_glm_cn_alias (line 112) | pub(crate) fn is_glm_cn_alias(name: &str) -> bool { function is_glm_alias (line 116) | pub(crate) fn is_glm_alias(name: &str) -> bool { function is_moonshot_intl_alias (line 120) | pub(crate) fn is_moonshot_intl_alias(name: &str) -> bool { function is_moonshot_cn_alias (line 127) | pub(crate) fn is_moonshot_cn_alias(name: &str) -> bool { function is_moonshot_alias (line 131) | pub(crate) fn is_moonshot_alias(name: &str) -> bool { function is_qwen_cn_alias (line 135) | pub(crate) fn is_qwen_cn_alias(name: &str) -> bool { function is_qwen_intl_alias (line 139) | pub(crate) fn is_qwen_intl_alias(name: &str) -> bool { function is_qwen_us_alias (line 146) | pub(crate) fn is_qwen_us_alias(name: &str) -> bool { function is_qwen_oauth_alias (line 150) | pub(crate) fn is_qwen_oauth_alias(name: &str) -> bool { function is_bailian_alias (line 154) | pub(crate) fn is_bailian_alias(name: &str) -> bool { function is_qwen_alias (line 158) | pub(crate) fn is_qwen_alias(name: &str) -> bool { function is_zai_global_alias (line 165) | pub(crate) fn is_zai_global_alias(name: &str) -> bool { function is_zai_cn_alias (line 169) | pub(crate) fn is_zai_cn_alias(name: &str) -> bool { function is_zai_alias (line 173) | pub(crate) fn is_zai_alias(name: &str) -> bool { function is_qianfan_alias (line 177) | pub(crate) fn is_qianfan_alias(name: &str) -> bool { function is_doubao_alias (line 181) | pub(crate) fn is_doubao_alias(name: &str) -> bool { type MinimaxOauthRegion (line 186) | enum MinimaxOauthRegion { method token_endpoint (line 192) | fn token_endpoint(self) -> &'static str { type MinimaxOauthRefreshResponse (line 201) | struct MinimaxOauthRefreshResponse { type MinimaxOauthBaseResponse (line 211) | struct MinimaxOauthBaseResponse { type QwenOauthCredentials (line 217) | struct QwenOauthCredentials { method fmt (line 229) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { type QwenOauthTokenResponse (line 238) | struct QwenOauthTokenResponse { type QwenOauthProviderContext (line 254) | struct QwenOauthProviderContext { method fmt (line 260) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { function read_non_empty_env (line 267) | fn read_non_empty_env(name: &str) -> Option { function is_minimax_oauth_placeholder (line 274) | fn is_minimax_oauth_placeholder(value: &str) -> bool { function minimax_oauth_region (line 279) | fn minimax_oauth_region(name: &str) -> MinimaxOauthRegion { function minimax_oauth_client_id (line 297) | fn minimax_oauth_client_id() -> String { function qwen_oauth_client_id (line 302) | fn qwen_oauth_client_id() -> String { function qwen_oauth_credentials_file_path (line 307) | fn qwen_oauth_credentials_file_path() -> Option { function normalize_qwen_oauth_base_url (line 314) | fn normalize_qwen_oauth_base_url(raw: &str) -> Option { function read_qwen_oauth_cached_credentials (line 334) | fn read_qwen_oauth_cached_credentials() -> Option { function normalized_qwen_expiry_millis (line 340) | fn normalized_qwen_expiry_millis(raw: i64) -> i64 { function qwen_oauth_token_expired (line 348) | fn qwen_oauth_token_expired(credentials: &QwenOauthCredentials) -> bool { function refresh_qwen_oauth_access_token (line 363) | fn refresh_qwen_oauth_access_token(refresh_token: &str) -> anyhow::Resul... function resolve_qwen_oauth_context (line 448) | fn resolve_qwen_oauth_context(credential_override: Option<&str>) -> Qwen... function resolve_minimax_static_credential (line 529) | fn resolve_minimax_static_credential() -> Option { function refresh_minimax_oauth_access_token (line 533) | fn refresh_minimax_oauth_access_token(name: &str, refresh_token: &str) -... function resolve_minimax_oauth_refresh_token (line 597) | fn resolve_minimax_oauth_refresh_token(name: &str) -> Option { function canonical_china_provider_name (line 609) | pub(crate) fn canonical_china_provider_name(name: &str) -> Option<&'stat... function minimax_base_url (line 631) | fn minimax_base_url(name: &str) -> Option<&'static str> { function glm_base_url (line 641) | fn glm_base_url(name: &str) -> Option<&'static str> { function moonshot_base_url (line 651) | fn moonshot_base_url(name: &str) -> Option<&'static str> { function qwen_base_url (line 661) | fn qwen_base_url(name: &str) -> Option<&'static str> { function zai_base_url (line 673) | fn zai_base_url(name: &str) -> Option<&'static str> { type ProviderRuntimeOptions (line 684) | pub struct ProviderRuntimeOptions { method default (line 703) | fn default() -> Self { function provider_runtime_options_from_config (line 718) | pub fn provider_runtime_options_from_config( function is_secret_char (line 734) | fn is_secret_char(c: char) -> bool { function token_end (line 738) | fn token_end(input: &str, from: usize) -> usize { function scrub_secret_patterns (line 754) | pub fn scrub_secret_patterns(input: &str) -> String { function sanitize_api_error (line 793) | pub fn sanitize_api_error(input: &str) -> String { function api_error (line 809) | pub async fn api_error(provider: &str, response: reqwest::Response) -> a... function resolve_provider_credential (line 832) | fn resolve_provider_credential(name: &str, credential_override: Option<&... function check_api_key_prefix (line 958) | fn check_api_key_prefix(provider_name: &str, key: &str) -> Option<&'stat... function parse_custom_provider_url (line 1002) | fn parse_custom_provider_url( function create_provider (line 1026) | pub fn create_provider(name: &str, api_key: Option<&str>) -> anyhow::Res... function create_provider_with_options (line 1031) | pub fn create_provider_with_options( function create_provider_with_url (line 1045) | pub fn create_provider_with_url( function create_provider_with_url_and_options (line 1055) | fn create_provider_with_url_and_options( function parse_provider_profile (line 1550) | fn parse_provider_profile(s: &str) -> (&str, Option<&str>) { function create_resilient_provider (line 1561) | pub fn create_resilient_provider( function create_resilient_provider_with_options (line 1577) | pub fn create_resilient_provider_with_options( function create_routed_provider (line 1644) | pub fn create_routed_provider( function create_routed_provider_with_options (line 1664) | pub fn create_routed_provider_with_options( type ProviderInfo (line 1742) | pub struct ProviderInfo { function list_providers (line 1757) | pub fn list_providers() -> Vec { type EnvGuard (line 2176) | struct EnvGuard { method set (line 2182) | fn set(key: &'static str, value: Option<&str>) -> Self { method drop (line 2194) | fn drop(&mut self) { function env_lock (line 2203) | fn env_lock() -> std::sync::MutexGuard<'static, ()> { function resolve_provider_credential_prefers_explicit_argument (line 2211) | fn resolve_provider_credential_prefers_explicit_argument() { function resolve_provider_credential_uses_minimax_oauth_env_for_placeholder (line 2217) | fn resolve_provider_credential_uses_minimax_oauth_env_for_placeholder() { function resolve_provider_credential_falls_back_to_minimax_api_key_for_placeholder (line 2229) | fn resolve_provider_credential_falls_back_to_minimax_api_key_for_placeho... function resolve_provider_credential_placeholder_ignores_generic_api_key_fallback (line 2241) | fn resolve_provider_credential_placeholder_ignores_generic_api_key_fallb... function resolve_provider_credential_bedrock_uses_internal_credential_path (line 2254) | fn resolve_provider_credential_bedrock_uses_internal_credential_path() { function resolve_qwen_oauth_context_prefers_explicit_override (line 2267) | fn resolve_qwen_oauth_context_prefers_explicit_override() { function resolve_qwen_oauth_context_uses_env_token_and_resource_url (line 2284) | fn resolve_qwen_oauth_context_uses_env_token_and_resource_url() { function resolve_qwen_oauth_context_reads_cached_credentials_file (line 2306) | fn resolve_qwen_oauth_context_reads_cached_credentials_file() { function resolve_qwen_oauth_context_placeholder_does_not_use_dashscope_fallback (line 2334) | fn resolve_qwen_oauth_context_placeholder_does_not_use_dashscope_fallbac... function regional_alias_predicates_cover_expected_variants (line 2352) | fn regional_alias_predicates_cover_expected_variants() { function canonical_china_provider_name_maps_regional_aliases (line 2384) | fn canonical_china_provider_name_maps_regional_aliases() { function regional_endpoint_aliases_map_to_expected_urls (line 2410) | fn regional_endpoint_aliases_map_to_expected_urls() { function factory_openrouter (line 2445) | fn factory_openrouter() { function factory_anthropic (line 2451) | fn factory_anthropic() { function factory_openai (line 2456) | fn factory_openai() { function factory_openai_codex (line 2461) | fn factory_openai_codex() { function factory_ollama (line 2467) | fn factory_ollama() { function factory_gemini (line 2475) | fn factory_gemini() { function factory_telnyx (line 2484) | fn factory_telnyx() { function factory_venice (line 2492) | fn factory_venice() { function factory_vercel (line 2501) | fn factory_vercel() { function vercel_gateway_base_url_matches_public_gateway_endpoint (line 2507) | fn vercel_gateway_base_url_matches_public_gateway_endpoint() { function factory_cloudflare (line 2515) | fn factory_cloudflare() { function factory_moonshot (line 2521) | fn factory_moonshot() { function factory_kimi_code (line 2531) | fn factory_kimi_code() { function factory_synthetic (line 2538) | fn factory_synthetic() { function factory_opencode (line 2543) | fn factory_opencode() { function factory_opencode_go (line 2549) | fn factory_opencode_go() { function resolve_provider_credential_opencode_go_env (line 2554) | fn resolve_provider_credential_opencode_go_env() { function factory_zai (line 2565) | fn factory_zai() { function factory_glm (line 2575) | fn factory_glm() { function factory_minimax (line 2585) | fn factory_minimax() { function factory_minimax_disables_native_tool_calling (line 2599) | fn factory_minimax_disables_native_tool_calling() { function factory_bedrock (line 2609) | fn factory_bedrock() { function factory_qianfan (line 2618) | fn factory_qianfan() { function factory_doubao (line 2624) | fn factory_doubao() { function factory_qwen (line 2632) | fn factory_qwen() { function qwen_provider_supports_vision (line 2648) | fn qwen_provider_supports_vision() { function factory_lmstudio (line 2658) | fn factory_lmstudio() { function factory_llamacpp (line 2665) | fn factory_llamacpp() { function factory_sglang (line 2672) | fn factory_sglang() { function factory_vllm (line 2678) | fn factory_vllm() { function factory_osaurus (line 2684) | fn factory_osaurus() { function factory_osaurus_uses_default_key_when_none (line 2692) | fn factory_osaurus_uses_default_key_when_none() { function factory_osaurus_custom_url (line 2701) | fn factory_osaurus_custom_url() { function resolve_provider_credential_osaurus_env (line 2714) | fn resolve_provider_credential_osaurus_env() { function resolve_provider_credential_volcengine_env (line 2722) | fn resolve_provider_credential_volcengine_env() { function resolve_provider_credential_aihubmix_env (line 2730) | fn resolve_provider_credential_aihubmix_env() { function resolve_provider_credential_siliconflow_env (line 2738) | fn resolve_provider_credential_siliconflow_env() { function factory_aihubmix (line 2746) | fn factory_aihubmix() { function factory_siliconflow (line 2751) | fn factory_siliconflow() { function factory_codex_oauth_aliases (line 2757) | fn factory_codex_oauth_aliases() { function factory_groq (line 2770) | fn factory_groq() { function factory_mistral (line 2775) | fn factory_mistral() { function factory_xai (line 2780) | fn factory_xai() { function factory_deepseek (line 2786) | fn factory_deepseek() { function deepseek_provider_keeps_vision_disabled (line 2791) | fn deepseek_provider_keeps_vision_disabled() { function factory_together (line 2798) | fn factory_together() { function factory_fireworks (line 2804) | fn factory_fireworks() { function factory_novita (line 2810) | fn factory_novita() { function factory_perplexity (line 2815) | fn factory_perplexity() { function factory_cohere (line 2820) | fn factory_cohere() { function factory_copilot (line 2825) | fn factory_copilot() { function factory_claude_code (line 2831) | fn factory_claude_code() { function factory_gemini_cli (line 2836) | fn factory_gemini_cli() { function factory_kilocli (line 2841) | fn factory_kilocli() { function factory_nvidia (line 2847) | fn factory_nvidia() { function factory_astrai (line 2856) | fn factory_astrai() { function factory_custom_url (line 2863) | fn factory_custom_url() { function factory_custom_localhost (line 2869) | fn factory_custom_localhost() { function factory_custom_no_key (line 2875) | fn factory_custom_no_key() { function factory_custom_empty_url_errors (line 2881) | fn factory_custom_empty_url_errors() { function factory_custom_invalid_url_errors (line 2892) | fn factory_custom_invalid_url_errors() { function factory_custom_unsupported_scheme_errors (line 2903) | fn factory_custom_unsupported_scheme_errors() { function factory_custom_trims_whitespace (line 2914) | fn factory_custom_trims_whitespace() { function factory_anthropic_custom_url (line 2922) | fn factory_anthropic_custom_url() { function factory_anthropic_custom_trailing_slash (line 2928) | fn factory_anthropic_custom_trailing_slash() { function factory_anthropic_custom_no_key (line 2934) | fn factory_anthropic_custom_no_key() { function factory_anthropic_custom_empty_url_errors (line 2940) | fn factory_anthropic_custom_empty_url_errors() { function factory_anthropic_custom_invalid_url_errors (line 2951) | fn factory_anthropic_custom_invalid_url_errors() { function factory_anthropic_custom_unsupported_scheme_errors (line 2962) | fn factory_anthropic_custom_unsupported_scheme_errors() { function factory_unknown_provider_errors (line 2975) | fn factory_unknown_provider_errors() { function factory_empty_name_errors (line 2984) | fn factory_empty_name_errors() { function resilient_provider_ignores_duplicate_and_invalid_fallbacks (line 2989) | fn resilient_provider_ignores_duplicate_and_invalid_fallbacks() { function resilient_provider_errors_for_invalid_primary (line 3017) | fn resilient_provider_errors_for_invalid_primary() { function resilient_fallback_resolves_own_credential (line 3033) | fn resilient_fallback_resolves_own_credential() { function resilient_fallback_supports_custom_url (line 3055) | fn resilient_fallback_supports_custom_url() { function resilient_fallback_mixed_chain (line 3076) | fn resilient_fallback_mixed_chain() { function ollama_with_custom_url (line 3099) | fn ollama_with_custom_url() { function ollama_cloud_with_custom_url (line 3105) | fn ollama_cloud_with_custom_url() { function resilient_fallback_includes_osaurus (line 3113) | fn resilient_fallback_includes_osaurus() { function factory_all_providers_create_successfully (line 3131) | fn factory_all_providers_create_successfully() { function listed_providers_have_unique_ids_and_aliases (line 3195) | fn listed_providers_have_unique_ids_and_aliases() { function listed_providers_and_aliases_are_constructible (line 3224) | fn listed_providers_and_aliases_are_constructible() { function sanitize_scrubs_sk_prefix (line 3246) | fn sanitize_scrubs_sk_prefix() { function sanitize_scrubs_multiple_prefixes (line 3254) | fn sanitize_scrubs_multiple_prefixes() { function sanitize_short_prefix_then_real_key (line 3263) | fn sanitize_short_prefix_then_real_key() { function sanitize_sk_proj_comment_then_real_key (line 3271) | fn sanitize_sk_proj_comment_then_real_key() { function sanitize_keeps_bare_prefix (line 3279) | fn sanitize_keeps_bare_prefix() { function sanitize_handles_json_wrapped_key (line 3286) | fn sanitize_handles_json_wrapped_key() { function sanitize_handles_delimiter_boundaries (line 3293) | fn sanitize_handles_delimiter_boundaries() { function sanitize_truncates_long_error (line 3301) | fn sanitize_truncates_long_error() { function sanitize_truncates_after_scrub (line 3309) | fn sanitize_truncates_after_scrub() { function sanitize_preserves_unicode_boundaries (line 3317) | fn sanitize_preserves_unicode_boundaries() { function sanitize_no_secret_no_change (line 3325) | fn sanitize_no_secret_no_change() { function scrub_github_personal_access_token (line 3332) | fn scrub_github_personal_access_token() { function scrub_github_oauth_token (line 3339) | fn scrub_github_oauth_token() { function scrub_github_user_token (line 3346) | fn scrub_github_user_token() { function scrub_github_fine_grained_pat (line 3353) | fn scrub_github_fine_grained_pat() { function parse_provider_profile_plain_name (line 3362) | fn parse_provider_profile_plain_name() { function parse_provider_profile_with_profile (line 3369) | fn parse_provider_profile_with_profile() { function parse_provider_profile_custom_url_not_split (line 3376) | fn parse_provider_profile_custom_url_not_split() { function parse_provider_profile_anthropic_custom_not_split (line 3384) | fn parse_provider_profile_anthropic_custom_not_split() { function parse_provider_profile_empty_profile_ignored (line 3392) | fn parse_provider_profile_empty_profile_ignored() { function parse_provider_profile_extra_colons_kept (line 3399) | fn parse_provider_profile_extra_colons_kept() { function resilient_fallback_with_profile_syntax (line 3408) | fn resilient_fallback_with_profile_syntax() { function resilient_fallback_mixed_profiles_and_custom (line 3432) | fn resilient_fallback_mixed_profiles_and_custom() { function api_key_prefix_cross_provider_mismatch (line 3459) | fn api_key_prefix_cross_provider_mismatch() { function api_key_prefix_correct_match (line 3480) | fn api_key_prefix_correct_match() { function api_key_prefix_unknown_provider_skips (line 3488) | fn api_key_prefix_unknown_provider_skips() { function api_key_prefix_unknown_key_format_skips (line 3495) | fn api_key_prefix_unknown_key_format_skips() { function provider_runtime_options_default_has_empty_extra_headers (line 3502) | fn provider_runtime_options_default_has_empty_extra_headers() { function provider_runtime_options_extra_headers_passed_through (line 3508) | fn provider_runtime_options_extra_headers_passed_through() { function env_provider_url_overrides_api_url (line 3520) | fn env_provider_url_overrides_api_url() { FILE: src/providers/ollama.rs type OllamaProvider (line 10) | pub struct OllamaProvider { method normalize_base_url (line 115) | fn normalize_base_url(raw_url: &str) -> String { method new (line 128) | pub fn new(base_url: Option<&str>, api_key: Option<&str>) -> Self { method new_with_reasoning (line 132) | pub fn new_with_reasoning( method is_local_endpoint (line 149) | fn is_local_endpoint(&self) -> bool { method http_client (line 156) | fn http_client(&self) -> Client { method resolve_request_details (line 160) | fn resolve_request_details(&self, model: &str) -> anyhow::Result<(Stri... method parse_tool_arguments (line 183) | fn parse_tool_arguments(arguments: &str) -> serde_json::Value { method normalize_response_text (line 187) | fn normalize_response_text(content: String) -> Option { method strip_think_tags (line 200) | fn strip_think_tags(s: &str) -> String { method effective_content (line 224) | fn effective_content(content: &str, thinking: Option<&str>) -> Option<... method fallback_text_for_empty_content (line 248) | fn fallback_text_for_empty_content(model: &str, thinking: Option<&str>... method build_chat_request (line 271) | fn build_chat_request( method build_chat_request_with_think (line 288) | fn build_chat_request_with_think( method convert_user_message_content (line 306) | fn convert_user_message_content(&self, content: &str) -> (Option Vec { method send_request_inner (line 434) | async fn send_request_inner( method send_request (line 511) | async fn send_request( method format_tool_calls_for_loop (line 562) | fn format_tool_calls_for_loop(&self, tool_calls: &[OllamaToolCall]) ->... method extract_tool_name_and_args (line 591) | fn extract_tool_name_and_args(&self, tc: &OllamaToolCall) -> (String, ... type ChatRequest (line 19) | struct ChatRequest { type Message (line 31) | struct Message { type OutgoingToolCall (line 44) | struct OutgoingToolCall { type OutgoingFunction (line 51) | struct OutgoingFunction { type Options (line 57) | struct Options { type ApiChatResponse (line 64) | struct ApiChatResponse { type ResponseMessage (line 73) | struct ResponseMessage { type OllamaToolCall (line 84) | struct OllamaToolCall { type OllamaFunction (line 90) | struct OllamaFunction { function deserialize_args (line 97) | fn deserialize_args<'de, D>(deserializer: D) -> Result ProviderCapabilities { method chat_with_system (line 639) | async fn chat_with_system( method chat_with_history (line 696) | async fn chat_with_history( method chat_with_tools (line 739) | async fn chat_with_tools( method supports_native_tools (line 826) | fn supports_native_tools(&self) -> bool { method chat (line 836) | async fn chat( function default_url (line 884) | fn default_url() { function custom_url_trailing_slash (line 890) | fn custom_url_trailing_slash() { function custom_url_no_trailing_slash (line 896) | fn custom_url_no_trailing_slash() { function custom_url_strips_api_suffix (line 902) | fn custom_url_strips_api_suffix() { function empty_url_uses_empty (line 908) | fn empty_url_uses_empty() { function cloud_suffix_strips_model_name (line 914) | fn cloud_suffix_strips_model_name() { function cloud_suffix_with_local_endpoint_errors (line 922) | fn cloud_suffix_with_local_endpoint_errors() { function cloud_suffix_without_api_key_errors (line 933) | fn cloud_suffix_without_api_key_errors() { function remote_endpoint_auth_enabled_when_key_present (line 944) | fn remote_endpoint_auth_enabled_when_key_present() { function remote_endpoint_with_api_suffix_still_allows_cloud_models (line 951) | fn remote_endpoint_with_api_suffix_still_allows_cloud_models() { function local_endpoint_auth_disabled_even_with_key (line 959) | fn local_endpoint_auth_disabled_even_with_key() { function request_omits_think_when_reasoning_not_configured (line 966) | fn request_omits_think_when_reasoning_not_configured() { function request_includes_think_when_reasoning_configured (line 986) | fn request_includes_think_when_reasoning_configured() { function response_deserializes (line 1006) | fn response_deserializes() { function response_with_empty_content (line 1013) | fn response_with_empty_content() { function normalize_response_text_rejects_whitespace_only_content (line 1020) | fn normalize_response_text_rejects_whitespace_only_content() { function normalize_response_text_strips_think_tags (line 1032) | fn normalize_response_text_strips_think_tags() { function normalize_response_text_rejects_think_only_content (line 1040) | fn normalize_response_text_rejects_think_only_content() { function fallback_text_for_empty_content_without_thinking_is_generic (line 1050) | fn fallback_text_for_empty_content_without_thinking_is_generic() { function response_with_missing_content_defaults_to_empty (line 1056) | fn response_with_missing_content_defaults_to_empty() { function response_with_thinking_field_extracts_content (line 1063) | fn response_with_thinking_field_extracts_content() { function response_with_tool_calls_parses_correctly (line 1071) | fn response_with_tool_calls_parses_correctly() { function extract_tool_name_handles_nested_tool_call (line 1080) | fn extract_tool_name_handles_nested_tool_call() { function extract_tool_name_handles_prefixed_name (line 1098) | fn extract_tool_name_handles_prefixed_name() { function extract_tool_name_handles_normal_call (line 1113) | fn extract_tool_name_handles_normal_call() { function format_tool_calls_produces_valid_json (line 1128) | fn format_tool_calls_produces_valid_json() { function convert_messages_parses_native_assistant_tool_calls (line 1152) | fn convert_messages_parses_native_assistant_tool_calls() { function convert_messages_maps_tool_result_call_id_to_tool_name (line 1175) | fn convert_messages_maps_tool_result_call_id_to_tool_name() { function convert_messages_extracts_images_from_user_marker (line 1198) | fn convert_messages_extracts_images_from_user_marker() { function capabilities_disable_native_tools_and_enable_vision (line 1220) | fn capabilities_disable_native_tools_and_enable_vision() { function api_response_parses_eval_counts (line 1231) | fn api_response_parses_eval_counts() { function api_response_parses_without_eval_counts (line 1243) | fn api_response_parses_without_eval_counts() { function strip_think_tags_removes_single_block (line 1255) | fn strip_think_tags_removes_single_block() { function strip_think_tags_removes_multiple_blocks (line 1261) | fn strip_think_tags_removes_multiple_blocks() { function strip_think_tags_handles_unclosed_block (line 1267) | fn strip_think_tags_handles_unclosed_block() { function strip_think_tags_preserves_text_without_tags (line 1273) | fn strip_think_tags_preserves_text_without_tags() { function strip_think_tags_returns_empty_for_think_only (line 1282) | fn strip_think_tags_returns_empty_for_think_only() { function effective_content_strips_think_and_returns_rest (line 1292) | fn effective_content_strips_think_and_returns_rest() { function effective_content_falls_back_to_thinking_field (line 1304) | fn effective_content_falls_back_to_thinking_field() { function effective_content_returns_none_when_both_empty (line 1316) | fn effective_content_returns_none_when_both_empty() { function effective_content_prefers_content_over_thinking (line 1327) | fn effective_content_prefers_content_over_thinking() { function effective_content_uses_thinking_when_content_is_think_only (line 1333) | fn effective_content_uses_thinking_when_content_is_think_only() { function qwen_think_with_tool_call_in_content_preserved (line 1349) | fn qwen_think_with_tool_call_in_content_preserved() { function qwen_thinking_field_with_tool_call_xml_extracted (line 1363) | fn qwen_thinking_field_with_tool_call_xml_extracted() { FILE: src/providers/openai.rs type OpenAiProvider (line 10) | pub struct OpenAiProvider { method new (line 174) | pub fn new(credential: Option<&str>) -> Self { method with_base_url (line 180) | pub fn with_base_url(base_url: Option<&str>, credential: Option<&str>)... method adjust_temperature_for_model (line 191) | fn adjust_temperature_for_model(model: &str, requested_temperature: f6... method convert_tools (line 221) | fn convert_tools(tools: Option<&[ToolSpec]>) -> Option Vec { method parse_native_response (line 311) | fn parse_native_response(message: NativeResponseMessage) -> ProviderCh... method http_client (line 333) | fn http_client(&self) -> Client { type ChatRequest (line 16) | struct ChatRequest { type Message (line 23) | struct Message { type ChatResponse (line 29) | struct ChatResponse { type Choice (line 34) | struct Choice { type ResponseMessage (line 39) | struct ResponseMessage { method effective_content (line 48) | fn effective_content(&self) -> String { type NativeChatRequest (line 57) | struct NativeChatRequest { type NativeMessage (line 68) | struct NativeMessage { type NativeToolSpec (line 83) | struct NativeToolSpec { type NativeToolFunctionSpec (line 90) | struct NativeToolFunctionSpec { function parse_native_tool_spec (line 96) | fn parse_native_tool_spec(value: serde_json::Value) -> anyhow::Result Option { method chat_with_system (line 340) | async fn chat_with_system( method chat (line 395) | async fn chat( method supports_native_tools (line 445) | fn supports_native_tools(&self) -> bool { method chat_with_tools (line 449) | async fn chat_with_tools( method warmup (line 511) | async fn warmup(&self) -> anyhow::Result<()> { function creates_with_key (line 529) | fn creates_with_key() { function creates_without_key (line 535) | fn creates_without_key() { function creates_with_empty_key (line 541) | fn creates_with_empty_key() { function chat_fails_without_key (line 547) | async fn chat_fails_without_key() { function chat_with_system_fails_without_key (line 555) | async fn chat_with_system_fails_without_key() { function request_serializes_with_system_message (line 564) | fn request_serializes_with_system_message() { function request_serializes_without_system (line 586) | fn request_serializes_without_system() { function response_deserializes_single_choice (line 601) | fn response_deserializes_single_choice() { function response_deserializes_empty_choices (line 609) | fn response_deserializes_empty_choices() { function response_deserializes_multiple_choices (line 616) | fn response_deserializes_multiple_choices() { function response_with_unicode (line 624) | fn response_with_unicode() { function response_with_long_content (line 634) | fn response_with_long_content() { function warmup_without_key_is_noop (line 645) | async fn warmup_without_key_is_noop() { function reasoning_content_fallback_empty_content (line 656) | fn reasoning_content_fallback_empty_content() { function reasoning_content_fallback_null_content (line 663) | fn reasoning_content_fallback_null_content() { function reasoning_content_not_used_when_content_present (line 671) | fn reasoning_content_not_used_when_content_present() { function native_response_reasoning_content_fallback (line 678) | fn native_response_reasoning_content_fallback() { function native_response_reasoning_content_ignored_when_content_present (line 687) | fn native_response_reasoning_content_ignored_when_content_present() { function chat_with_tools_fails_without_key (line 696) | async fn chat_with_tools_fails_without_key() { function chat_with_tools_rejects_invalid_tool_shape (line 719) | async fn chat_with_tools_rejects_invalid_tool_shape() { function native_tool_spec_deserializes_from_openai_format (line 745) | fn native_tool_spec_deserializes_from_openai_format() { function native_response_parses_usage (line 766) | fn native_response_parses_usage() { function native_response_parses_without_usage (line 778) | fn native_response_parses_without_usage() { function parse_native_response_captures_reasoning_content (line 789) | fn parse_native_response_captures_reasoning_content() { function parse_native_response_none_reasoning_content_for_normal_model (line 803) | fn parse_native_response_none_reasoning_content_for_normal_model() { function convert_messages_round_trips_reasoning_content (line 812) | fn convert_messages_round_trips_reasoning_content() { function convert_messages_no_reasoning_content_when_absent (line 835) | fn convert_messages_no_reasoning_content_when_absent() { function native_message_omits_reasoning_content_when_none (line 854) | fn native_message_omits_reasoning_content_when_none() { function native_message_includes_reasoning_content_when_some (line 867) | fn native_message_includes_reasoning_content_when_some() { function adjust_temperature_for_o1_models (line 885) | fn adjust_temperature_for_o1_models() { function adjust_temperature_for_o3_models (line 894) | fn adjust_temperature_for_o3_models() { function adjust_temperature_for_o4_models (line 911) | fn adjust_temperature_for_o4_models() { function adjust_temperature_for_gpt5_models (line 923) | fn adjust_temperature_for_gpt5_models() { function adjust_temperature_for_gpt5_chat_latest_models (line 951) | fn adjust_temperature_for_gpt5_chat_latest_models() { function adjust_temperature_preserves_for_standard_models (line 967) | fn adjust_temperature_preserves_for_standard_models() { function adjust_temperature_handles_edge_cases (line 987) | fn adjust_temperature_handles_edge_cases() { FILE: src/providers/openai_codex.rs constant DEFAULT_CODEX_RESPONSES_URL (line 13) | const DEFAULT_CODEX_RESPONSES_URL: &str = "https://chatgpt.com/backend-a... constant CODEX_RESPONSES_URL_ENV (line 14) | const CODEX_RESPONSES_URL_ENV: &str = "ZEROCLAW_CODEX_RESPONSES_URL"; constant CODEX_BASE_URL_ENV (line 15) | const CODEX_BASE_URL_ENV: &str = "ZEROCLAW_CODEX_BASE_URL"; constant DEFAULT_CODEX_INSTRUCTIONS (line 16) | const DEFAULT_CODEX_INSTRUCTIONS: &str = type OpenAiCodexProvider (line 19) | pub struct OpenAiCodexProvider { method new (line 92) | pub fn new( method send_responses_request (line 596) | async fn send_responses_request( type ResponsesRequest (line 30) | struct ResponsesRequest { type ResponsesInput (line 44) | struct ResponsesInput { type ResponsesInputContent (line 50) | struct ResponsesInputContent { type ResponsesTextOptions (line 60) | struct ResponsesTextOptions { type ResponsesReasoningOptions (line 65) | struct ResponsesReasoningOptions { type ResponsesResponse (line 71) | struct ResponsesResponse { type ResponsesOutput (line 79) | struct ResponsesOutput { type ResponsesContent (line 85) | struct ResponsesContent { function default_zeroclaw_dir (line 119) | fn default_zeroclaw_dir() -> PathBuf { function build_responses_url (line 126) | fn build_responses_url(base_or_endpoint: &str) -> anyhow::Result { function resolve_responses_url (line 156) | fn resolve_responses_url(options: &ProviderRuntimeOptions) -> anyhow::Re... function canonical_endpoint (line 182) | fn canonical_endpoint(url: &str) -> Option<(String, String, u16, String)> { function is_default_responses_url (line 190) | fn is_default_responses_url(url: &str) -> bool { function first_nonempty (line 194) | fn first_nonempty(text: Option<&str>) -> Option { function resolve_instructions (line 205) | fn resolve_instructions(system_prompt: Option<&str>) -> String { function normalize_model_id (line 209) | fn normalize_model_id(model: &str) -> &str { function build_responses_input (line 213) | fn build_responses_input(messages: &[ChatMessage]) -> (String, Vec String { function resolve_reasoning_effort (line 309) | fn resolve_reasoning_effort(model_id: &str, configured: Option<&str>) ->... function nonempty_preserve (line 319) | fn nonempty_preserve(text: Option<&str>) -> Option { function extract_responses_text (line 329) | fn extract_responses_text(response: &ResponsesResponse) -> Option { function extract_stream_event_text (line 355) | fn extract_stream_event_text(event: &Value, saw_delta: bool) -> Option anyhow::Result> { function extract_stream_error_message (line 448) | fn extract_stream_error_message(event: &Value) -> Option { function append_utf8_stream_chunk (line 479) | fn append_utf8_stream_chunk( function decode_utf8_stream_chunks (line 527) | fn decode_utf8_stream_chunks<'a, I>(chunks: I) -> anyhow::Result function decode_responses_body (line 554) | async fn decode_responses_body(response: reqwest::Response) -> anyhow::R... method capabilities (line 720) | fn capabilities(&self) -> ProviderCapabilities { method chat_with_system (line 728) | async fn chat_with_system( method chat_with_history (line 751) | async fn chat_with_history( type EnvGuard (line 771) | struct EnvGuard { method set (line 777) | fn set(key: &'static str, value: Option<&str>) -> Self { method drop (line 788) | fn drop(&mut self) { function extracts_output_text_first (line 798) | fn extracts_output_text_first() { function extracts_nested_output_text (line 807) | fn extracts_nested_output_text() { function default_state_dir_is_non_empty (line 821) | fn default_state_dir_is_non_empty() { function build_responses_url_appends_suffix_for_base_url (line 827) | fn build_responses_url_appends_suffix_for_base_url() { function build_responses_url_keeps_existing_responses_endpoint (line 835) | fn build_responses_url_keeps_existing_responses_endpoint() { function resolve_responses_url_prefers_explicit_endpoint_env (line 843) | fn resolve_responses_url_prefers_explicit_endpoint_env() { function resolve_responses_url_uses_provider_api_url_override (line 858) | fn resolve_responses_url_uses_provider_api_url_override() { function default_responses_url_detector_handles_equivalent_urls (line 874) | fn default_responses_url_detector_handles_equivalent_urls() { function constructor_enables_custom_endpoint_key_mode (line 885) | fn constructor_enables_custom_endpoint_key_mode() { function resolve_instructions_uses_default_when_missing (line 897) | fn resolve_instructions_uses_default_when_missing() { function resolve_instructions_uses_default_when_blank (line 905) | fn resolve_instructions_uses_default_when_blank() { function resolve_instructions_uses_system_prompt_when_present (line 913) | fn resolve_instructions_uses_system_prompt_when_present() { function clamp_reasoning_effort_adjusts_known_models (line 921) | fn clamp_reasoning_effort_adjusts_known_models() { function resolve_reasoning_effort_prefers_configured_override (line 961) | fn resolve_reasoning_effort_prefers_configured_override() { function resolve_reasoning_effort_uses_legacy_env_when_unconfigured (line 970) | fn resolve_reasoning_effort_uses_legacy_env_when_unconfigured() { function parse_sse_text_reads_output_text_delta (line 979) | fn parse_sse_text_reads_output_text_delta() { function parse_sse_text_falls_back_to_completed_response (line 995) | fn parse_sse_text_falls_back_to_completed_response() { function decode_utf8_stream_chunks_handles_multibyte_split_across_chunks (line 1004) | fn decode_utf8_stream_chunks_handles_multibyte_split_across_chunks() { function build_responses_input_maps_content_types_by_role (line 1019) | fn build_responses_input_maps_content_types_by_role() { function build_responses_input_uses_default_instructions_without_system (line 1055) | fn build_responses_input_uses_default_instructions_without_system() { function build_responses_input_ignores_unknown_roles (line 1066) | fn build_responses_input_ignores_unknown_roles() { function build_responses_input_handles_image_markers (line 1085) | fn build_responses_input_handles_image_markers() { function build_responses_input_preserves_text_only_messages (line 1111) | fn build_responses_input_preserves_text_only_messages() { function build_responses_input_handles_multiple_images (line 1124) | fn build_responses_input_handles_multiple_images() { function capabilities_includes_vision (line 1145) | fn capabilities_includes_vision() { FILE: src/providers/openrouter.rs type OpenRouterProvider (line 12) | pub struct OpenRouterProvider { method new (line 154) | pub fn new(credential: Option<&str>, timeout_secs: Option) -> Self { method with_timeout_secs (line 164) | pub fn with_timeout_secs(mut self, secs: u64) -> Self { method convert_tools (line 169) | fn convert_tools(tools: Option<&[ToolSpec]>) -> Option Vec { method to_message_content (line 264) | fn to_message_content(role: &str, content: &str) -> MessageContent { method parse_native_response (line 291) | fn parse_native_response(message: NativeResponseMessage) -> ProviderCh... method compact_sanitized_body_snippet (line 312) | fn compact_sanitized_body_snippet(body: &str) -> String { method read_response_body (line 319) | async fn read_response_body( method parse_response_body (line 331) | fn parse_response_body( method http_client (line 344) | fn http_client(&self) -> Client { constant DEFAULT_OPENROUTER_TIMEOUT_SECS (line 17) | const DEFAULT_OPENROUTER_TIMEOUT_SECS: u64 = 120; constant OPENROUTER_CONNECT_TIMEOUT_SECS (line 18) | const OPENROUTER_CONNECT_TIMEOUT_SECS: u64 = 10; type ChatRequest (line 21) | struct ChatRequest { type Message (line 28) | struct Message { type MessageContent (line 35) | enum MessageContent { type MessagePart (line 42) | enum MessagePart { type ImageUrlPart (line 48) | struct ImageUrlPart { type ApiChatResponse (line 53) | struct ApiChatResponse { type Choice (line 58) | struct Choice { type ResponseMessage (line 63) | struct ResponseMessage { type NativeChatRequest (line 68) | struct NativeChatRequest { type NativeMessage (line 79) | struct NativeMessage { type NativeToolSpec (line 94) | struct NativeToolSpec { type NativeToolFunctionSpec (line 101) | struct NativeToolFunctionSpec { type NativeToolCall (line 108) | struct NativeToolCall { type NativeFunctionCall (line 117) | struct NativeFunctionCall { type NativeChatResponse (line 123) | struct NativeChatResponse { type UsageInfo (line 130) | struct UsageInfo { type NativeChoice (line 138) | struct NativeChoice { type NativeResponseMessage (line 143) | struct NativeResponseMessage { method capabilities (line 355) | fn capabilities(&self) -> ProviderCapabilities { method warmup (line 363) | async fn warmup(&self) -> anyhow::Result<()> { method chat_with_system (line 377) | async fn chat_with_system( method chat_with_history (line 433) | async fn chat_with_history( method chat (line 482) | async fn chat( method supports_native_tools (line 536) | fn supports_native_tools(&self) -> bool { method chat_with_tools (line 540) | async fn chat_with_tools( function capabilities_report_vision_support (line 637) | fn capabilities_report_vision_support() { function creates_with_key (line 645) | fn creates_with_key() { function creates_without_key (line 654) | fn creates_without_key() { function uses_configured_timeout_when_provided (line 660) | fn uses_configured_timeout_when_provided() { function falls_back_to_default_timeout_for_zero (line 666) | fn falls_back_to_default_timeout_for_zero() { function warmup_without_key_is_noop (line 672) | async fn warmup_without_key_is_noop() { function chat_with_system_fails_without_key (line 679) | async fn chat_with_system_fails_without_key() { function chat_with_history_fails_without_key (line 690) | async fn chat_with_history_fails_without_key() { function chat_request_serializes_with_system_and_user (line 712) | fn chat_request_serializes_with_system_and_user() { function chat_request_serializes_history_messages (line 737) | fn chat_request_serializes_history_messages() { function response_deserializes_single_choice (line 768) | fn response_deserializes_single_choice() { function response_deserializes_empty_choices (line 778) | fn response_deserializes_empty_choices() { function parse_chat_response_body_reports_sanitized_snippet (line 787) | fn parse_chat_response_body_reports_sanitized_snippet() { function parse_native_response_body_reports_sanitized_snippet (line 804) | fn parse_native_response_body_reports_sanitized_snippet() { function chat_with_tools_fails_without_key (line 821) | async fn chat_with_tools_fails_without_key() { function native_response_deserializes_with_tool_calls (line 845) | fn native_response_deserializes_with_tool_calls() { function native_response_deserializes_with_text_and_tool_calls (line 870) | fn native_response_deserializes_with_text_and_tool_calls() { function parse_native_response_converts_to_chat_response (line 893) | fn parse_native_response_converts_to_chat_response() { function convert_messages_parses_assistant_tool_call_payload (line 916) | fn convert_messages_parses_assistant_tool_call_payload() { function convert_messages_parses_tool_result_payload (line 945) | fn convert_messages_parses_tool_result_payload() { function to_message_content_converts_image_markers_to_openai_parts (line 969) | fn to_message_content_converts_image_markers_to_openai_parts() { function native_response_parses_usage (line 984) | fn native_response_parses_usage() { function native_response_parses_without_usage (line 996) | fn native_response_parses_without_usage() { function parse_native_response_captures_reasoning_content (line 1007) | fn parse_native_response_captures_reasoning_content() { function parse_native_response_none_reasoning_content_for_normal_model (line 1026) | fn parse_native_response_none_reasoning_content_for_normal_model() { function native_response_deserializes_reasoning_content (line 1037) | fn native_response_deserializes_reasoning_content() { function convert_messages_round_trips_reasoning_content (line 1055) | fn convert_messages_round_trips_reasoning_content() { function convert_messages_no_reasoning_content_when_absent (line 1079) | fn convert_messages_no_reasoning_content_when_absent() { function native_message_omits_reasoning_content_when_none (line 1099) | fn native_message_omits_reasoning_content_when_none() { function native_message_includes_reasoning_content_when_some (line 1112) | fn native_message_includes_reasoning_content_when_some() { function default_timeout_is_120 (line 1130) | fn default_timeout_is_120() { function with_timeout_secs_overrides_default (line 1136) | fn with_timeout_secs_overrides_default() { FILE: src/providers/reliable.rs function is_non_retryable (line 18) | pub fn is_non_retryable(err: &anyhow::Error) -> bool { function is_tool_schema_error (line 88) | pub fn is_tool_schema_error(err: &anyhow::Error) -> bool { function is_context_window_exceeded (line 99) | fn is_context_window_exceeded(err: &anyhow::Error) -> bool { function is_rate_limited (line 117) | fn is_rate_limited(err: &anyhow::Error) -> bool { function is_non_retryable_rate_limit (line 134) | fn is_non_retryable_rate_limit(err: &anyhow::Error) -> bool { function parse_retry_after_ms (line 176) | fn parse_retry_after_ms(err: &anyhow::Error) -> Option { function failure_reason (line 207) | fn failure_reason(rate_limited: bool, non_retryable: bool) -> &'static s... function compact_error_detail (line 219) | fn compact_error_detail(err: &anyhow::Error) -> String { function truncate_for_context (line 229) | fn truncate_for_context(messages: &mut Vec) -> usize { function push_failure (line 255) | fn push_failure( type ReliableProvider (line 280) | pub struct ReliableProvider { method new (line 292) | pub fn new( method with_api_keys (line 308) | pub fn with_api_keys(mut self, keys: Vec) -> Self { method with_model_fallbacks (line 314) | pub fn with_model_fallbacks(mut self, fallbacks: HashMap(&'a self, model: &'a str) -> Vec<&'a str> { method rotate_key (line 329) | fn rotate_key(&self) -> Option<&str> { method compute_backoff (line 338) | fn compute_backoff(&self, base: u64, err: &anyhow::Error) -> u64 { method warmup (line 350) | async fn warmup(&self) -> anyhow::Result<()> { method chat_with_system (line 360) | async fn chat_with_system( method chat_with_history (line 496) | async fn chat_with_history( method supports_native_tools (line 617) | fn supports_native_tools(&self) -> bool { method supports_vision (line 624) | fn supports_vision(&self) -> bool { method chat_with_tools (line 630) | async fn chat_with_tools( method chat (line 752) | async fn chat( method supports_streaming (line 882) | fn supports_streaming(&self) -> bool { method stream_chat_with_system (line 886) | fn stream_chat_with_system( type MockProvider (line 961) | struct MockProvider { method chat_with_system (line 970) | async fn chat_with_system( method chat_with_history (line 984) | async fn chat_with_history( type ModelAwareMock (line 999) | struct ModelAwareMock { method chat_with_system (line 1008) | async fn chat_with_system( function succeeds_without_retry (line 1027) | async fn succeeds_without_retry() { function retries_then_recovers (line 1049) | async fn retries_then_recovers() { function falls_back_after_retries_exhausted (line 1071) | async fn falls_back_after_retries_exhausted() { function returns_aggregated_error_when_all_providers_fail (line 1107) | async fn returns_aggregated_error_when_all_providers_fail() { function non_retryable_detects_common_patterns (line 1147) | fn non_retryable_detects_common_patterns() { function context_window_error_aborts_retries_and_model_fallbacks (line 1180) | async fn context_window_error_aborts_retries_and_model_fallbacks() { function aggregated_error_marks_non_retryable_model_mismatch_with_details (line 1215) | async fn aggregated_error_marks_non_retryable_model_mismatch_with_detail... function skips_retries_on_non_retryable_error (line 1244) | async fn skips_retries_on_non_retryable_error() { function chat_with_history_retries_then_recovers (line 1281) | async fn chat_with_history_retries_then_recovers() { function chat_with_history_falls_back (line 1307) | async fn chat_with_history_falls_back() { function model_failover_tries_fallback_model (line 1349) | async fn model_failover_tries_fallback_model() { function model_failover_all_models_fail (line 1384) | async fn model_failover_all_models_fail() { function no_model_fallbacks_behaves_like_before (line 1417) | async fn no_model_fallbacks_behaves_like_before() { function auth_rotation_cycles_keys (line 1441) | async fn auth_rotation_cycles_keys() { function auth_rotation_returns_none_when_empty (line 1463) | async fn auth_rotation_returns_none_when_empty() { function parse_retry_after_integer (line 1471) | fn parse_retry_after_integer() { function parse_retry_after_float (line 1477) | fn parse_retry_after_float() { function parse_retry_after_missing (line 1483) | fn parse_retry_after_missing() { function rate_limited_detection (line 1489) | fn rate_limited_detection() { function non_retryable_rate_limit_detects_plan_restricted_model (line 1501) | fn non_retryable_rate_limit_detects_plan_restricted_model() { function non_retryable_rate_limit_detects_insufficient_balance (line 1513) | fn non_retryable_rate_limit_detects_insufficient_balance() { function non_retryable_rate_limit_does_not_flag_generic_429 (line 1525) | fn non_retryable_rate_limit_does_not_flag_generic_429() { function compute_backoff_uses_retry_after (line 1534) | fn compute_backoff_uses_retry_after() { function compute_backoff_caps_at_30s (line 1541) | fn compute_backoff_caps_at_30s() { function compute_backoff_falls_back_to_base (line 1548) | fn compute_backoff_falls_back_to_base() { function non_retryable_detects_401 (line 1557) | fn non_retryable_detects_401() { function non_retryable_detects_403 (line 1566) | fn non_retryable_detects_403() { function non_retryable_detects_404 (line 1575) | fn non_retryable_detects_404() { function non_retryable_does_not_flag_429 (line 1584) | fn non_retryable_does_not_flag_429() { function non_retryable_does_not_flag_408 (line 1593) | fn non_retryable_does_not_flag_408() { function non_retryable_does_not_flag_500 (line 1602) | fn non_retryable_does_not_flag_500() { function non_retryable_does_not_flag_502 (line 1611) | fn non_retryable_does_not_flag_502() { function parse_retry_after_zero (line 1622) | fn parse_retry_after_zero() { function parse_retry_after_with_underscore_separator (line 1632) | fn parse_retry_after_with_underscore_separator() { function parse_retry_after_space_separator (line 1642) | fn parse_retry_after_space_separator() { function rate_limited_false_for_generic_error (line 1652) | fn rate_limited_false_for_generic_error() { function non_retryable_skips_retries_for_401 (line 1663) | async fn non_retryable_skips_retries_for_401() { function non_retryable_rate_limit_skips_retries_for_plan_errors (line 1689) | async fn non_retryable_rate_limit_skips_retries_for_plan_errors() { method chat_with_system (line 1721) | async fn chat_with_system( type NativeToolMock (line 1735) | struct NativeToolMock { method chat_with_system (line 1745) | async fn chat_with_system( method supports_native_tools (line 1755) | fn supports_native_tools(&self) -> bool { method chat (line 1759) | async fn chat( function chat_delegates_to_inner_provider (line 1779) | async fn chat_delegates_to_inner_provider() { function chat_retries_and_recovers (line 1815) | async fn chat_retries_and_recovers() { function chat_preserves_native_tools_support (line 1852) | async fn chat_preserves_native_tools_support() { function chat_returns_aggregated_error_when_all_providers_fail (line 1880) | async fn chat_returns_aggregated_error_when_all_providers_fail() { type NativeModelAwareMock (line 1928) | struct NativeModelAwareMock { method chat_with_system (line 1937) | async fn chat_with_system( method supports_native_tools (line 1947) | fn supports_native_tools(&self) -> bool { method chat (line 1951) | async fn chat( method chat_with_system (line 1973) | async fn chat_with_system( method supports_native_tools (line 1985) | fn supports_native_tools(&self) -> bool { method chat (line 1989) | async fn chat( function chat_tries_model_failover_on_failure (line 2002) | async fn chat_tries_model_failover_on_failure() { function chat_skips_non_retryable_errors (line 2041) | async fn chat_skips_non_retryable_errors() { function context_window_error_is_not_non_retryable (line 2087) | fn context_window_error_is_not_non_retryable() { function is_context_window_exceeded_detects_llamacpp (line 2102) | fn is_context_window_exceeded_detects_llamacpp() { function truncate_for_context_drops_oldest_non_system (line 2109) | fn truncate_for_context_drops_oldest_non_system() { function truncate_for_context_preserves_system_and_last_message (line 2132) | fn truncate_for_context_preserves_system_and_last_message() { type ContextOverflowMock (line 2148) | struct ContextOverflowMock { method chat_with_system (line 2156) | async fn chat_with_system( method chat_with_history (line 2166) | async fn chat_with_history( function chat_with_history_truncates_on_context_overflow (line 2184) | async fn chat_with_history_truncates_on_context_overflow() { function tool_schema_error_detects_groq_validation_failure (line 2219) | fn tool_schema_error_detects_groq_validation_failure() { function tool_schema_error_detects_not_in_request (line 2226) | fn tool_schema_error_detects_not_in_request() { function tool_schema_error_detects_not_found_in_tool_list (line 2232) | fn tool_schema_error_detects_not_found_in_tool_list() { function tool_schema_error_detects_invalid_tool_call (line 2238) | fn tool_schema_error_detects_invalid_tool_call() { function tool_schema_error_ignores_unrelated_errors (line 2244) | fn tool_schema_error_ignores_unrelated_errors() { function non_retryable_returns_false_for_tool_schema_400 (line 2253) | fn non_retryable_returns_false_for_tool_schema_400() { function non_retryable_returns_true_for_other_400_errors (line 2261) | fn non_retryable_returns_true_for_other_400_errors() { FILE: src/providers/router.rs type Route (line 8) | pub struct Route { type RouterProvider (line 21) | pub struct RouterProvider { method new (line 33) | pub fn new( method resolve (line 77) | fn resolve(&self, model: &str) -> (usize, String) { method chat_with_system (line 95) | async fn chat_with_system( method chat_with_history (line 116) | async fn chat_with_history( method chat (line 129) | async fn chat( method chat_with_tools (line 140) | async fn chat_with_tools( method supports_native_tools (line 154) | fn supports_native_tools(&self) -> bool { method supports_vision (line 161) | fn supports_vision(&self) -> bool { method warmup (line 167) | async fn warmup(&self) -> anyhow::Result<()> { type MockProvider (line 184) | struct MockProvider { method new (line 191) | fn new(response: &'static str) -> Self { method call_count (line 199) | fn call_count(&self) -> usize { method last_model (line 203) | fn last_model(&self) -> String { method chat_with_system (line 210) | async fn chat_with_system( function make_router (line 223) | fn make_router( method chat_with_system (line 264) | async fn chat_with_system( function routes_hint_to_correct_provider (line 278) | async fn routes_hint_to_correct_provider() { function routes_fast_hint (line 298) | async fn routes_fast_hint() { function unknown_hint_falls_back_to_default (line 311) | async fn unknown_hint_falls_back_to_default() { function non_hint_model_uses_default_provider (line 328) | async fn non_hint_model_uses_default_provider() { function resolve_preserves_model_for_non_hints (line 347) | fn resolve_preserves_model_for_non_hints() { function resolve_strips_hint_prefix (line 356) | fn resolve_strips_hint_prefix() { function skips_routes_with_unknown_provider (line 368) | fn skips_routes_with_unknown_provider() { function warmup_calls_all_providers (line 379) | async fn warmup_calls_all_providers() { function chat_with_system_passes_system_prompt (line 387) | async fn chat_with_system_passes_system_prompt() { function chat_with_tools_delegates_to_resolved_provider (line 407) | async fn chat_with_tools_delegates_to_resolved_provider() { function chat_with_tools_routes_hint_correctly (line 443) | async fn chat_with_tools_routes_hint_correctly() { FILE: src/providers/telnyx.rs type TelnyxProvider (line 36) | pub struct TelnyxProvider { constant BASE_URL (line 45) | const BASE_URL: &'static str = "https://api.telnyx.com/v2/ai"; method new (line 52) | pub fn new(api_key: Option<&str>) -> Self { method with_base_url (line 65) | pub fn with_base_url(api_key: Option<&str>, _base_url: &str) -> Self { method list_models (line 73) | pub async fn list_models(&self) -> anyhow::Result> { method chat_url (line 95) | fn chat_url(&self) -> String { function resolve_telnyx_api_key (line 101) | fn resolve_telnyx_api_key(api_key: Option<&str>) -> Option { type ModelsResponse (line 129) | struct ModelsResponse { type ModelInfo (line 134) | struct ModelInfo { type ChatRequest (line 140) | struct ChatRequest { type Message (line 147) | struct Message { type ChatResponse (line 154) | struct ChatResponse { type Choice (line 159) | struct Choice { type ResponseMessage (line 164) | struct ResponseMessage { method chat_with_system (line 170) | async fn chat_with_system( method chat_with_history (line 229) | async fn chat_with_history( method warmup (line 281) | async fn warmup(&self) -> anyhow::Result<()> { constant GPT_4O (line 295) | pub const GPT_4O: &str = "openai/gpt-4o"; constant GPT_4O_MINI (line 297) | pub const GPT_4O_MINI: &str = "openai/gpt-4o-mini"; constant GPT_4_TURBO (line 299) | pub const GPT_4_TURBO: &str = "openai/gpt-4-turbo"; constant CLAUDE_3_5_SONNET (line 301) | pub const CLAUDE_3_5_SONNET: &str = "anthropic/claude-3.5-sonnet"; constant LLAMA_3_1_70B (line 303) | pub const LLAMA_3_1_70B: &str = "meta-llama/llama-3.1-70b-instruct"; constant LLAMA_3_1_8B (line 305) | pub const LLAMA_3_1_8B: &str = "meta-llama/llama-3.1-8b-instruct"; constant MISTRAL_LARGE (line 307) | pub const MISTRAL_LARGE: &str = "mistralai/mistral-large"; constant MISTRAL_SMALL (line 309) | pub const MISTRAL_SMALL: &str = "mistralai/mistral-small"; function creates_provider_with_key (line 317) | fn creates_provider_with_key() { function creates_provider_without_key (line 323) | fn creates_provider_without_key() { function model_constants_are_valid (line 329) | fn model_constants_are_valid() { function resolve_key_from_parameter (line 337) | fn resolve_key_from_parameter() { function resolve_key_trims_whitespace (line 343) | fn resolve_key_trims_whitespace() { function models_response_deserializes (line 349) | fn models_response_deserializes() { function chat_request_serializes (line 363) | fn chat_request_serializes() { function chat_response_deserializes (line 386) | fn chat_response_deserializes() { FILE: src/providers/traits.rs type ChatMessage (line 9) | pub struct ChatMessage { method system (line 15) | pub fn system(content: impl Into) -> Self { method user (line 22) | pub fn user(content: impl Into) -> Self { method assistant (line 29) | pub fn assistant(content: impl Into) -> Self { method tool (line 36) | pub fn tool(content: impl Into) -> Self { type ToolCall (line 46) | pub struct ToolCall { type TokenUsage (line 54) | pub struct TokenUsage { type ChatResponse (line 64) | pub struct ChatResponse { method has_tool_calls (line 80) | pub fn has_tool_calls(&self) -> bool { method text_or_empty (line 85) | pub fn text_or_empty(&self) -> &str { type ChatRequest (line 92) | pub struct ChatRequest<'a> { type ToolResultMessage (line 99) | pub struct ToolResultMessage { type ConversationMessage (line 107) | pub enum ConversationMessage { type StreamChunk (line 124) | pub struct StreamChunk { method delta (line 135) | pub fn delta(text: impl Into) -> Self { method final_chunk (line 144) | pub fn final_chunk() -> Self { method error (line 153) | pub fn error(message: impl Into) -> Self { method with_token_estimate (line 162) | pub fn with_token_estimate(mut self) -> Self { type StreamOptions (line 170) | pub struct StreamOptions { method new (line 179) | pub fn new(enabled: bool) -> Self { method with_token_count (line 187) | pub fn with_token_count(mut self) -> Self { type StreamResult (line 194) | pub type StreamResult = std::result::Result; type StreamError (line 198) | pub enum StreamError { type ProviderCapabilityError (line 218) | pub struct ProviderCapabilityError { type ProviderCapabilities (line 229) | pub struct ProviderCapabilities { type ToolsPayload (line 250) | pub enum ToolsPayload { type Provider (line 264) | pub trait Provider: Send + Sync { method capabilities (line 269) | fn capabilities(&self) -> ProviderCapabilities { method convert_tools (line 279) | fn convert_tools(&self, tools: &[ToolSpec]) -> ToolsPayload { method simple_chat (line 288) | async fn simple_chat( method chat_with_system (line 301) | async fn chat_with_system( method chat_with_history (line 311) | async fn chat_with_history( method chat (line 331) | async fn chat( method supports_native_tools (line 388) | fn supports_native_tools(&self) -> bool { method supports_vision (line 393) | fn supports_vision(&self) -> bool { method warmup (line 399) | async fn warmup(&self) -> anyhow::Result<()> { method chat_with_tools (line 406) | async fn chat_with_tools( method supports_streaming (line 424) | fn supports_streaming(&self) -> bool { method stream_chat_with_system (line 431) | fn stream_chat_with_system( method stream_chat_with_history (line 445) | fn stream_chat_with_history( method capabilities (line 503) | fn capabilities(&self) -> ProviderCapabilities { method chat_with_system (line 511) | async fn chat_with_system( method supports_native_tools (line 741) | fn supports_native_tools(&self) -> bool { method chat_with_system (line 745) | async fn chat_with_system( method supports_native_tools (line 826) | fn supports_native_tools(&self) -> bool { method chat_with_system (line 830) | async fn chat_with_system( method supports_native_tools (line 846) | fn supports_native_tools(&self) -> bool { method convert_tools (line 850) | fn convert_tools(&self, _tools: &[ToolSpec]) -> ToolsPayload { method chat_with_system (line 856) | async fn chat_with_system( method supports_native_tools (line 872) | fn supports_native_tools(&self) -> bool { method convert_tools (line 876) | fn convert_tools(&self, _tools: &[ToolSpec]) -> ToolsPayload { method chat_with_system (line 882) | async fn chat_with_system( function build_tool_instructions_text (line 467) | pub fn build_tool_instructions_text(tools: &[ToolSpec]) -> String { type CapabilityMockProvider (line 499) | struct CapabilityMockProvider; function chat_message_constructors (line 523) | fn chat_message_constructors() { function chat_response_helpers (line 539) | fn chat_response_helpers() { function token_usage_default_is_none (line 564) | fn token_usage_default_is_none() { function chat_response_with_usage (line 571) | fn chat_response_with_usage() { function tool_call_serialization (line 587) | fn tool_call_serialization() { function conversation_message_variants (line 599) | fn conversation_message_variants() { function provider_capabilities_default (line 613) | fn provider_capabilities_default() { function provider_capabilities_equality (line 620) | fn provider_capabilities_equality() { function supports_native_tools_reflects_capabilities_default_mapping (line 642) | fn supports_native_tools_reflects_capabilities_default_mapping() { function supports_vision_reflects_capabilities_default_mapping (line 648) | fn supports_vision_reflects_capabilities_default_mapping() { function tools_payload_variants (line 654) | fn tools_payload_variants() { function build_tool_instructions_text_format (line 681) | fn build_tool_instructions_text_format() { function build_tool_instructions_text_empty (line 724) | fn build_tool_instructions_text_empty() { type MockProvider (line 735) | struct MockProvider { function provider_convert_tools_default (line 757) | fn provider_convert_tools_default() { function provider_chat_prompt_guided_fallback (line 780) | async fn provider_chat_prompt_guided_fallback() { function provider_chat_without_tools (line 803) | async fn provider_chat_without_tools() { type EchoSystemProvider (line 820) | struct EchoSystemProvider { type CustomConvertProvider (line 842) | struct CustomConvertProvider; type InvalidConvertProvider (line 868) | struct InvalidConvertProvider; function provider_chat_prompt_guided_preserves_existing_system_not_first (line 894) | async fn provider_chat_prompt_guided_preserves_existing_system_not_first... function provider_chat_prompt_guided_uses_convert_tools_override (line 921) | async fn provider_chat_prompt_guided_uses_convert_tools_override() { function provider_chat_prompt_guided_rejects_non_prompt_payload (line 943) | async fn provider_chat_prompt_guided_rejects_non_prompt_payload() { FILE: src/rag/mod.rs type DatasheetChunk (line 15) | pub struct DatasheetChunk { type PinAliases (line 25) | pub type PinAliases = HashMap; function parse_pin_aliases (line 30) | fn parse_pin_aliases(content: &str) -> PinAliases { function collect_md_txt_paths (line 101) | fn collect_md_txt_paths(dir: &Path, out: &mut Vec) { function collect_pdf_paths (line 119) | fn collect_pdf_paths(dir: &Path, out: &mut Vec) { function extract_pdf_text (line 136) | fn extract_pdf_text(path: &Path) -> Option { type HardwareRag (line 142) | pub struct HardwareRag { method load (line 152) | pub fn load(workspace_dir: &Path, datasheet_dir: &str) -> anyhow::Resu... method pin_aliases_for_board (line 219) | pub fn pin_aliases_for_board(&self, board: &str) -> Option<&PinAliases> { method pin_alias_context (line 224) | pub fn pin_alias_context(&self, query: &str, boards: &[String]) -> Str... method retrieve (line 252) | pub fn retrieve(&self, query: &str, boards: &[String], limit: usize) -... method len (line 289) | pub fn len(&self) -> usize { method is_empty (line 294) | pub fn is_empty(&self) -> bool { function infer_board_from_path (line 300) | fn infer_board_from_path(path: &Path, base: &Path) -> Option { function parse_pin_aliases_key_value (line 319) | fn parse_pin_aliases_key_value() { function parse_pin_aliases_table (line 331) | fn parse_pin_aliases_table() { function parse_pin_aliases_empty (line 343) | fn parse_pin_aliases_empty() { function infer_board_from_path_nucleo (line 349) | fn infer_board_from_path_nucleo() { function infer_board_generic_none (line 359) | fn infer_board_generic_none() { function hardware_rag_load_and_retrieve (line 366) | fn hardware_rag_load_and_retrieve() { function hardware_rag_load_empty_dir (line 388) | fn hardware_rag_load_empty_dir() { FILE: src/runtime/docker.rs type DockerRuntime (line 8) | pub struct DockerRuntime { method new (line 13) | pub fn new(config: DockerRuntimeConfig) -> Self { method workspace_mount_path (line 17) | fn workspace_mount_path(&self, workspace_dir: &Path) -> Result { method name (line 56) | fn name(&self) -> &str { method has_shell_access (line 60) | fn has_shell_access(&self) -> bool { method has_filesystem_access (line 64) | fn has_filesystem_access(&self) -> bool { method storage_path (line 68) | fn storage_path(&self) -> PathBuf { method supports_long_running (line 76) | fn supports_long_running(&self) -> bool { method memory_budget (line 80) | fn memory_budget(&self) -> u64 { method build_shell_command (line 86) | fn build_shell_command( function docker_runtime_name (line 145) | fn docker_runtime_name() { function docker_runtime_memory_budget (line 151) | fn docker_runtime_memory_budget() { function docker_build_shell_command_includes_runtime_flags (line 159) | fn docker_build_shell_command_includes_runtime_flags() { function docker_workspace_allowlist_blocks_outside_paths (line 187) | fn docker_workspace_allowlist_blocks_outside_paths() { function docker_build_shell_command_includes_network_flag (line 203) | fn docker_build_shell_command_includes_network_flag() { function docker_build_shell_command_includes_read_only_flag (line 221) | fn docker_build_shell_command_includes_read_only_flag() { function docker_refuses_root_mount (line 240) | fn docker_refuses_root_mount() { function docker_no_memory_flag_when_not_configured (line 259) | fn docker_no_memory_flag_when_not_configured() { FILE: src/runtime/mod.rs function create_runtime (line 12) | pub fn create_runtime(config: &RuntimeConfig) -> anyhow::Result Self { method name (line 14) | fn name(&self) -> &str { method has_shell_access (line 18) | fn has_shell_access(&self) -> bool { method has_filesystem_access (line 22) | fn has_filesystem_access(&self) -> bool { method storage_path (line 26) | fn storage_path(&self) -> PathBuf { method supports_long_running (line 33) | fn supports_long_running(&self) -> bool { method build_shell_command (line 37) | fn build_shell_command( function native_name (line 63) | fn native_name() { function native_has_shell_access (line 68) | fn native_has_shell_access() { function native_has_filesystem_access (line 73) | fn native_has_filesystem_access() { function native_supports_long_running (line 78) | fn native_supports_long_running() { function native_memory_budget_unlimited (line 83) | fn native_memory_budget_unlimited() { function native_storage_path_contains_zeroclaw (line 88) | fn native_storage_path_contains_zeroclaw() { function native_builds_shell_command (line 94) | fn native_builds_shell_command() { FILE: src/runtime/traits.rs type RuntimeAdapter (line 14) | pub trait RuntimeAdapter: Send + Sync { method name (line 19) | fn name(&self) -> &str; method has_shell_access (line 25) | fn has_shell_access(&self) -> bool; method has_filesystem_access (line 31) | fn has_filesystem_access(&self) -> bool; method storage_path (line 37) | fn storage_path(&self) -> PathBuf; method supports_long_running (line 44) | fn supports_long_running(&self) -> bool; method memory_budget (line 51) | fn memory_budget(&self) -> u64 { method build_shell_command (line 66) | fn build_shell_command( method name (line 80) | fn name(&self) -> &str { method has_shell_access (line 84) | fn has_shell_access(&self) -> bool { method has_filesystem_access (line 88) | fn has_filesystem_access(&self) -> bool { method storage_path (line 92) | fn storage_path(&self) -> PathBuf { method supports_long_running (line 96) | fn supports_long_running(&self) -> bool { method build_shell_command (line 100) | fn build_shell_command( type DummyRuntime (line 77) | struct DummyRuntime; function default_memory_budget_is_zero (line 113) | fn default_memory_budget_is_zero() { function runtime_reports_capabilities (line 119) | fn runtime_reports_capabilities() { function build_shell_command_executes (line 130) | async fn build_shell_command_executes() { FILE: src/runtime/wasm.rs type WasmRuntime (line 21) | pub struct WasmRuntime { method new (line 56) | pub fn new(config: WasmRuntimeConfig) -> Self { method with_workspace (line 64) | pub fn with_workspace(config: WasmRuntimeConfig, workspace_dir: PathBu... method is_available (line 72) | pub fn is_available() -> bool { method validate_config (line 77) | pub fn validate_config(&self) -> Result<()> { method tools_dir (line 98) | pub fn tools_dir(&self, workspace_dir: &Path) -> PathBuf { method default_capabilities (line 103) | pub fn default_capabilities(&self) -> WasmCapabilities { method effective_fuel (line 114) | pub fn effective_fuel(&self, caps: &WasmCapabilities) -> u64 { method effective_memory_bytes (line 123) | pub fn effective_memory_bytes(&self, caps: &WasmCapabilities) -> u64 { method execute_module (line 138) | pub fn execute_module( method execute_module (line 241) | pub fn execute_module( method list_modules (line 255) | pub fn list_modules(&self, workspace_dir: &Path) -> Result> { type WasmExecutionResult (line 28) | pub struct WasmExecutionResult { type WasmCapabilities (line 41) | pub struct WasmCapabilities { method name (line 279) | fn name(&self) -> &str { method has_shell_access (line 283) | fn has_shell_access(&self) -> bool { method has_filesystem_access (line 288) | fn has_filesystem_access(&self) -> bool { method storage_path (line 292) | fn storage_path(&self) -> PathBuf { method supports_long_running (line 298) | fn supports_long_running(&self) -> bool { method memory_budget (line 303) | fn memory_budget(&self) -> u64 { method build_shell_command (line 307) | fn build_shell_command( function default_config (line 325) | fn default_config() -> WasmRuntimeConfig { function wasm_runtime_name (line 332) | fn wasm_runtime_name() { function wasm_no_shell_access (line 338) | fn wasm_no_shell_access() { function wasm_no_filesystem_by_default (line 344) | fn wasm_no_filesystem_by_default() { function wasm_filesystem_when_read_enabled (line 350) | fn wasm_filesystem_when_read_enabled() { function wasm_filesystem_when_write_enabled (line 358) | fn wasm_filesystem_when_write_enabled() { function wasm_no_long_running (line 366) | fn wasm_no_long_running() { function wasm_memory_budget (line 372) | fn wasm_memory_budget() { function wasm_shell_command_errors (line 378) | fn wasm_shell_command_errors() { function wasm_storage_path_default (line 386) | fn wasm_storage_path_default() { function wasm_storage_path_with_workspace (line 392) | fn wasm_storage_path_with_workspace() { function validate_rejects_zero_memory (line 400) | fn validate_rejects_zero_memory() { function validate_rejects_excessive_memory (line 409) | fn validate_rejects_excessive_memory() { function validate_rejects_empty_tools_dir (line 418) | fn validate_rejects_empty_tools_dir() { function validate_rejects_path_traversal (line 427) | fn validate_rejects_path_traversal() { function validate_accepts_valid_config (line 436) | fn validate_accepts_valid_config() { function validate_accepts_max_memory (line 442) | fn validate_accepts_max_memory() { function effective_fuel_uses_config_default (line 452) | fn effective_fuel_uses_config_default() { function effective_fuel_respects_override (line 459) | fn effective_fuel_respects_override() { function effective_memory_uses_config_default (line 469) | fn effective_memory_uses_config_default() { function effective_memory_respects_override (line 476) | fn effective_memory_respects_override() { function default_capabilities_match_config (line 486) | fn default_capabilities_match_config() { function tools_dir_resolves_relative_to_workspace (line 500) | fn tools_dir_resolves_relative_to_workspace() { function list_modules_empty_when_dir_missing (line 507) | fn list_modules_empty_when_dir_missing() { function list_modules_finds_wasm_files (line 514) | fn list_modules_finds_wasm_files() { function execute_module_missing_file (line 532) | fn execute_module_missing_file() { function execute_module_invalid_wasm (line 548) | fn execute_module_invalid_wasm() { function execute_module_oversized_file (line 563) | fn execute_module_oversized_file() { function is_available_matches_feature_flag (line 582) | fn is_available_matches_feature_flag() { function memory_budget_no_overflow (line 591) | fn memory_budget_no_overflow() { function effective_memory_saturating (line 599) | fn effective_memory_saturating() { function capabilities_default_is_locked_down (line 612) | fn capabilities_default_is_locked_down() { function wasm_fuel_limit_enforced_in_config (line 624) | fn wasm_fuel_limit_enforced_in_config() { function wasm_memory_limit_enforced_in_config (line 635) | fn wasm_memory_limit_enforced_in_config() { function wasm_zero_fuel_override_uses_default (line 650) | fn wasm_zero_fuel_override_uses_default() { function validate_rejects_memory_just_above_limit (line 664) | fn validate_rejects_memory_just_above_limit() { function execute_module_stub_returns_error_without_feature (line 673) | fn execute_module_stub_returns_error_without_feature() { FILE: src/security/audit.rs constant GENESIS_PREV_HASH (line 18) | const GENESIS_PREV_HASH: &str = "000000000000000000000000000000000000000... type AuditEventType (line 23) | pub enum AuditEventType { type Actor (line 35) | pub struct Actor { type Action (line 43) | pub struct Action { type ExecutionResult (line 52) | pub struct ExecutionResult { type SecurityContext (line 61) | pub struct SecurityContext { type AuditEvent (line 69) | pub struct AuditEvent { method new (line 91) | pub fn new(event_type: AuditEventType) -> Self { method with_actor (line 111) | pub fn with_actor( method with_action (line 126) | pub fn with_action( method with_result (line 143) | pub fn with_result( method with_security (line 160) | pub fn with_security(mut self, sandbox_backend: Option) -> Self { function compute_entry_hash (line 170) | fn compute_entry_hash(prev_hash: &str, event: &AuditEvent) -> String { type ChainState (line 191) | struct ChainState { type AuditLogger (line 197) | pub struct AuditLogger { method new (line 221) | pub fn new(config: AuditConfig, zeroclaw_dir: PathBuf) -> Result { method log (line 233) | pub fn log(&self, event: &AuditEvent) -> Result<()> { method log_command_event (line 266) | pub fn log_command_event(&self, entry: CommandExecutionLog<'_>) -> Res... method log_command (line 282) | pub fn log_command( method rotate_if_needed (line 304) | fn rotate_if_needed(&self) -> Result<()> { method rotate (line 315) | fn rotate(&self) -> Result<()> { type CommandExecutionLog (line 206) | pub struct CommandExecutionLog<'a> { function recover_chain_state (line 331) | fn recover_chain_state(log_path: &Path) -> ChainState { function verify_chain (line 370) | pub fn verify_chain(log_path: &Path) -> Result { function audit_event_new_creates_unique_id (line 430) | fn audit_event_new_creates_unique_id() { function audit_event_with_actor (line 437) | fn audit_event_with_actor() { function audit_event_with_action (line 452) | fn audit_event_with_action() { function audit_event_serializes_to_json (line 467) | fn audit_event_serializes_to_json() { function audit_logger_disabled_does_not_create_file (line 483) | fn audit_logger_disabled_does_not_create_file() -> Result<()> { function audit_logger_writes_event_when_enabled (line 502) | async fn audit_logger_writes_event_when_enabled() -> Result<()> { function audit_log_command_event_writes_structured_entry (line 528) | async fn audit_log_command_event_writes_structured_entry() -> Result<()> { function audit_rotation_creates_numbered_backup (line 563) | fn audit_rotation_creates_numbered_backup() -> Result<()> { function merkle_chain_genesis_uses_well_known_seed (line 590) | fn merkle_chain_genesis_uses_well_known_seed() -> Result<()> { function merkle_chain_multiple_entries_verify (line 613) | fn merkle_chain_multiple_entries_verify() -> Result<()> { function merkle_chain_detects_tampered_entry (line 640) | fn merkle_chain_detects_tampered_entry() -> Result<()> { function merkle_chain_detects_sequence_gap (line 685) | fn merkle_chain_detects_sequence_gap() -> Result<()> { function merkle_chain_recovery_continues_after_restart (line 723) | fn merkle_chain_recovery_continues_after_restart() -> Result<()> { FILE: src/security/bubblewrap.rs type BubblewrapSandbox (line 8) | pub struct BubblewrapSandbox; method new (line 11) | pub fn new() -> std::io::Result { method probe (line 22) | pub fn probe() -> std::io::Result { method is_installed (line 26) | fn is_installed() -> bool { method wrap_command (line 36) | fn wrap_command(&self, cmd: &mut Command) -> std::io::Result<()> { method is_available (line 65) | fn is_available(&self) -> bool { method name (line 69) | fn name(&self) -> &str { method description (line 73) | fn description(&self) -> &str { function bubblewrap_sandbox_name (line 83) | fn bubblewrap_sandbox_name() { function bubblewrap_is_available_only_if_installed (line 89) | fn bubblewrap_is_available_only_if_installed() { function bubblewrap_wrap_command_includes_isolation_flags (line 101) | fn bubblewrap_wrap_command_includes_isolation_flags() { function bubblewrap_wrap_command_preserves_original_command (line 133) | fn bubblewrap_wrap_command_preserves_original_command() { function bubblewrap_wrap_command_binds_required_paths (line 160) | fn bubblewrap_wrap_command_binds_required_paths() { FILE: src/security/detect.rs function create_sandbox (line 8) | pub fn create_sandbox(config: &SecurityConfig) -> Arc { function detect_best_sandbox (line 75) | fn detect_best_sandbox() -> Arc { function detect_best_sandbox_returns_something (line 123) | fn detect_best_sandbox_returns_something() { function explicit_none_returns_noop (line 130) | fn explicit_none_returns_noop() { function auto_mode_detects_something (line 144) | fn auto_mode_detects_something() { FILE: src/security/docker.rs type DockerSandbox (line 8) | pub struct DockerSandbox { method new (line 21) | pub fn new() -> std::io::Result { method with_image (line 32) | pub fn with_image(image: String) -> std::io::Result { method probe (line 43) | pub fn probe() -> std::io::Result { method is_installed (line 47) | fn is_installed() -> bool { method default (line 13) | fn default() -> Self { method wrap_command (line 57) | fn wrap_command(&self, cmd: &mut Command) -> std::io::Result<()> { method is_available (line 83) | fn is_available(&self) -> bool { method name (line 87) | fn name(&self) -> &str { method description (line 91) | fn description(&self) -> &str { function docker_sandbox_name (line 101) | fn docker_sandbox_name() { function docker_sandbox_default_image (line 107) | fn docker_sandbox_default_image() { function docker_with_custom_image (line 113) | fn docker_with_custom_image() { function docker_wrap_command_includes_isolation_flags (line 124) | fn docker_wrap_command_includes_isolation_flags() { function docker_wrap_command_preserves_original_command (line 173) | fn docker_wrap_command_preserves_original_command() { function docker_wrap_command_uses_custom_image (line 199) | fn docker_wrap_command_uses_custom_image() { FILE: src/security/domain_matcher.rs constant BANKING_DOMAINS (line 4) | const BANKING_DOMAINS: &[&str] = &[ constant MEDICAL_DOMAINS (line 16) | const MEDICAL_DOMAINS: &[&str] = &[ constant GOVERNMENT_DOMAINS (line 23) | const GOVERNMENT_DOMAINS: &[&str] = &["*.ssa.gov", "*.irs.gov", "*.login... constant IDENTITY_PROVIDER_DOMAINS (line 25) | const IDENTITY_PROVIDER_DOMAINS: &[&str] = &[ constant DOMAIN_CATEGORIES (line 31) | const DOMAIN_CATEGORIES: &[(&str, &[&str])] = &[ type DomainMatcher (line 39) | pub struct DomainMatcher { method new (line 44) | pub fn new(gated_domains: &[String], categories: &[String]) -> Result<... method patterns (line 60) | pub fn patterns(&self) -> &[String] { method is_gated (line 64) | pub fn is_gated(&self, domain: &str) -> bool { method expand_categories (line 74) | pub fn expand_categories(categories: &[String]) -> Result> { method validate_pattern (line 94) | pub fn validate_pattern(pattern: &str) -> Result<()> { function normalize_domain (line 100) | fn normalize_domain(raw: &str) -> Option { function normalize_pattern (line 130) | fn normalize_pattern(raw: &str) -> Result { function domain_matches_pattern (line 164) | fn domain_matches_pattern(pattern: &str, domain: &str) -> bool { function wildcard_match (line 174) | fn wildcard_match(pattern: &[u8], value: &[u8]) -> bool { function exact_match_works (line 215) | fn exact_match_works() { function wildcard_match_works (line 224) | fn wildcard_match_works() { function category_preset_expands_and_matches (line 232) | fn category_preset_expands_and_matches() { function non_matching_domain_returns_false (line 240) | fn non_matching_domain_returns_false() { function malformed_domain_pattern_is_rejected (line 247) | fn malformed_domain_pattern_is_rejected() { function unknown_category_is_rejected (line 254) | fn unknown_category_is_rejected() { FILE: src/security/estop.rs type EstopLevel (line 11) | pub enum EstopLevel { type ResumeSelector (line 19) | pub enum ResumeSelector { type EstopState (line 27) | pub struct EstopState { method fail_closed (line 41) | pub fn fail_closed() -> Self { method is_engaged (line 51) | pub fn is_engaged(&self) -> bool { method normalize (line 58) | fn normalize(&mut self) { type EstopManager (line 65) | pub struct EstopManager { method load (line 72) | pub fn load(config: &EstopConfig, config_dir: &Path) -> Result { method state_path (line 119) | pub fn state_path(&self) -> &Path { method status (line 123) | pub fn status(&self) -> EstopState { method engage (line 127) | pub fn engage(&mut self, level: EstopLevel) -> Result<()> { method resume (line 155) | pub fn resume( method ensure_resume_is_authorized (line 195) | fn ensure_resume_is_authorized( method persist_state (line 217) | fn persist_state(&mut self) -> Result<()> { function resolve_state_file_path (line 254) | pub fn resolve_state_file_path(config_dir: &Path, state_file: &str) -> P... function normalize_tool_name (line 264) | fn normalize_tool_name(raw: &str) -> Result { function dedup_sort (line 278) | fn dedup_sort(values: &[String]) -> Vec { function now_rfc3339 (line 290) | fn now_rfc3339() -> String { function estop_config (line 308) | fn estop_config(path: &Path) -> EstopConfig { function estop_levels_compose_and_resume (line 317) | fn estop_levels_compose_and_resume() { function estop_state_survives_reload (line 351) | fn estop_state_survives_reload() { function corrupted_state_defaults_to_fail_closed_kill_all (line 371) | fn corrupted_state_defaults_to_fail_closed_kill_all() { function resume_requires_valid_otp_when_enabled (line 381) | fn resume_requires_valid_otp_when_enabled() { function resume_accepts_valid_otp_code (line 397) | fn resume_accepts_valid_otp_code() { FILE: src/security/firejail.rs type FirejailSandbox (line 10) | pub struct FirejailSandbox; method new (line 14) | pub fn new() -> std::io::Result { method probe (line 26) | pub fn probe() -> std::io::Result { method is_installed (line 31) | fn is_installed() -> bool { method wrap_command (line 41) | fn wrap_command(&self, cmd: &mut Command) -> std::io::Result<()> { method is_available (line 72) | fn is_available(&self) -> bool { method name (line 76) | fn name(&self) -> &str { method description (line 80) | fn description(&self) -> &str { function firejail_sandbox_name (line 90) | fn firejail_sandbox_name() { function firejail_description_mentions_dependency (line 95) | fn firejail_description_mentions_dependency() { function firejail_new_fails_if_not_installed (line 101) | fn firejail_new_fails_if_not_installed() { function firejail_wrap_command_prepends_firejail (line 114) | fn firejail_wrap_command_prepends_firejail() { function firejail_wrap_command_includes_all_security_flags (line 132) | fn firejail_wrap_command_includes_all_security_flags() { function firejail_wrap_command_preserves_original_command (line 170) | fn firejail_wrap_command_preserves_original_command() { FILE: src/security/iam_policy.rs type RoleMapping (line 13) | pub struct RoleMapping { type PolicyDecision (line 25) | pub enum PolicyDecision { method is_allowed (line 33) | pub fn is_allowed(&self) -> bool { type IamPolicy (line 42) | pub struct IamPolicy { method from_mappings (line 64) | pub fn from_mappings(mappings: &[RoleMapping]) -> Result { method evaluate_tool_access (line 122) | pub fn evaluate_tool_access( method evaluate_workspace_access (line 165) | pub fn evaluate_workspace_access( method is_empty (line 208) | pub fn is_empty(&self) -> bool { type CompiledRole (line 48) | struct CompiledRole { function test_mappings (line 217) | fn test_mappings() -> Vec { function identity_with_roles (line 242) | fn identity_with_roles(roles: Vec<&str>) -> NevisIdentity { function admin_gets_all_tools (line 253) | fn admin_gets_all_tools() { function admin_gets_all_workspaces (line 267) | fn admin_gets_all_workspaces() { function operator_gets_subset_of_tools (line 280) | fn operator_gets_subset_of_tools() { function operator_workspace_access_is_scoped (line 294) | fn operator_workspace_access_is_scoped() { function viewer_is_read_only (line 310) | fn viewer_is_read_only() { function deny_by_default_for_unknown_role (line 327) | fn deny_by_default_for_unknown_role() { function deny_by_default_for_no_roles (line 338) | fn deny_by_default_for_no_roles() { function multiple_roles_union_permissions (line 348) | fn multiple_roles_union_permissions() { function role_matching_is_case_insensitive (line 360) | fn role_matching_is_case_insensitive() { function tool_matching_is_case_insensitive (line 368) | fn tool_matching_is_case_insensitive() { function empty_tool_name_is_denied (line 379) | fn empty_tool_name_is_denied() { function empty_workspace_name_is_denied (line 388) | fn empty_workspace_name_is_denied() { function empty_mappings_deny_everything (line 396) | fn empty_mappings_deny_everything() { function policy_decision_deny_contains_reason (line 405) | fn policy_decision_deny_contains_reason() { function duplicate_normalized_roles_are_rejected (line 419) | fn duplicate_normalized_roles_are_rejected() { function empty_role_name_in_mapping_is_skipped (line 440) | fn empty_role_name_in_mapping_is_skipped() { FILE: src/security/landlock.rs type LandlockSandbox (line 15) | pub struct LandlockSandbox { method new (line 22) | pub fn new() -> std::io::Result { method with_workspace (line 27) | pub fn with_workspace(workspace_dir: Option) -> st... method probe (line 46) | pub fn probe() -> std::io::Result { method apply_restrictions (line 51) | fn apply_restrictions(&self) -> std::io::Result<()> { method new (line 158) | pub fn new() -> std::io::Result { method with_workspace (line 165) | pub fn with_workspace(_workspace_dir: Option) -> s... method probe (line 172) | pub fn probe() -> std::io::Result { method wrap_command (line 128) | fn wrap_command(&self, _cmd: &mut std::process::Command) -> std::io::Res... method is_available (line 135) | fn is_available(&self) -> bool { method name (line 143) | fn name(&self) -> &str { method description (line 147) | fn description(&self) -> &str { type LandlockSandbox (line 154) | pub struct LandlockSandbox; method new (line 22) | pub fn new() -> std::io::Result { method with_workspace (line 27) | pub fn with_workspace(workspace_dir: Option) -> st... method probe (line 46) | pub fn probe() -> std::io::Result { method apply_restrictions (line 51) | fn apply_restrictions(&self) -> std::io::Result<()> { method new (line 158) | pub fn new() -> std::io::Result { method with_workspace (line 165) | pub fn with_workspace(_workspace_dir: Option) -> s... method probe (line 172) | pub fn probe() -> std::io::Result { method wrap_command (line 182) | fn wrap_command(&self, _cmd: &mut std::process::Command) -> std::io::Res... method is_available (line 189) | fn is_available(&self) -> bool { method name (line 193) | fn name(&self) -> &str { method description (line 197) | fn description(&self) -> &str { function landlock_sandbox_name (line 208) | fn landlock_sandbox_name() { function landlock_not_available_on_non_linux (line 216) | fn landlock_not_available_on_non_linux() { function landlock_with_none_workspace (line 222) | fn landlock_with_none_workspace() { function landlock_stub_wrap_command_returns_unsupported (line 239) | fn landlock_stub_wrap_command_returns_unsupported() { function landlock_stub_new_returns_unsupported (line 249) | fn landlock_stub_new_returns_unsupported() { function landlock_stub_probe_returns_unsupported (line 257) | fn landlock_stub_probe_returns_unsupported() { FILE: src/security/leak_detector.rs constant ENTROPY_TOKEN_MIN_LEN (line 14) | const ENTROPY_TOKEN_MIN_LEN: usize = 24; type LeakResult (line 18) | pub enum LeakResult { type LeakDetector (line 32) | pub struct LeakDetector { method new (line 45) | pub fn new() -> Self { method with_sensitivity (line 50) | pub fn with_sensitivity(sensitivity: f64) -> Self { method scan (line 57) | pub fn scan(&self, content: &str) -> LeakResult { method check_api_keys (line 78) | fn check_api_keys(&self, content: &str, patterns: &mut Vec, re... method check_aws_credentials (line 138) | fn check_aws_credentials( method check_generic_secrets (line 172) | fn check_generic_secrets( method check_private_keys (line 205) | fn check_private_keys(&self, content: &str, patterns: &mut Vec... method check_jwt_tokens (line 245) | fn check_jwt_tokens(&self, content: &str, patterns: &mut Vec, ... method check_database_urls (line 259) | fn check_database_urls( method check_high_entropy_tokens (line 302) | fn check_high_entropy_tokens( method default (line 38) | fn default() -> Self { function extract_candidate_tokens (line 334) | fn extract_candidate_tokens(content: &str) -> Vec<&str> { function shannon_entropy (line 342) | fn shannon_entropy(s: &str) -> f64 { function has_mixed_alpha_digit (line 358) | fn has_mixed_alpha_digit(s: &str) -> bool { function clean_content_passes (line 369) | fn clean_content_passes() { function detects_stripe_keys (line 376) | fn detects_stripe_keys() { function detects_aws_credentials (line 390) | fn detects_aws_credentials() { function detects_private_keys (line 403) | fn detects_private_keys() { function detects_jwt_tokens (line 421) | fn detects_jwt_tokens() { function detects_database_urls (line 435) | fn detects_database_urls() { function low_sensitivity_skips_generic (line 448) | fn low_sensitivity_skips_generic() { function url_path_segments_not_flagged (line 457) | fn url_path_segments_not_flagged() { function url_with_long_path_not_redacted (line 471) | fn url_with_long_path_not_redacted() { function detects_high_entropy_token_outside_url (line 482) | fn detects_high_entropy_token_outside_url() { function low_sensitivity_raises_entropy_threshold (line 497) | fn low_sensitivity_raises_entropy_threshold() { function extract_candidate_tokens_splits_correctly (line 510) | fn extract_candidate_tokens_splits_correctly() { function shannon_entropy_empty_string (line 522) | fn shannon_entropy_empty_string() { function shannon_entropy_single_char (line 527) | fn shannon_entropy_single_char() { function shannon_entropy_two_equal_chars (line 533) | fn shannon_entropy_two_equal_chars() { FILE: src/security/mod.rs function redact (line 79) | pub fn redact(value: &str) -> String { function reexported_policy_and_pairing_types_are_usable (line 94) | fn reexported_policy_and_pairing_types_are_usable() { function reexported_secret_store_encrypt_decrypt_roundtrip (line 103) | fn reexported_secret_store_encrypt_decrypt_roundtrip() { function redact_hides_most_of_value (line 114) | fn redact_hides_most_of_value() { function redact_handles_multibyte_utf8_without_panic (line 122) | fn redact_handles_multibyte_utf8_without_panic() { FILE: src/security/nevis.rs type NevisIdentity (line 13) | pub struct NevisIdentity { type TokenValidationMode (line 28) | pub enum TokenValidationMode { method from_str_config (line 36) | pub fn from_str_config(s: &str) -> Result { type NevisAuthProvider (line 49) | pub struct NevisAuthProvider { method fmt (line 71) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { method new (line 102) | pub fn new( method validate_token (line 143) | pub async fn validate_token(&self, token: &str) -> Result Result Result Result Result<()> { method instance_url (line 356) | pub fn instance_url(&self) -> &str { method realm (line 361) | pub fn realm(&self) -> &str { constant _ (line 91) | const _: () = { type IntrospectionResponse (line 369) | struct IntrospectionResponse { type RealmAccess (line 383) | struct RealmAccess { type UserInfoResponse (line 389) | struct UserInfoResponse { function token_validation_mode_from_str (line 406) | fn token_validation_mode_from_str() { function local_mode_requires_jwks_url (line 419) | fn local_mode_requires_jwks_url() { function remote_mode_works_without_jwks_url (line 435) | fn remote_mode_works_without_jwks_url() { function provider_stores_config_correctly (line 450) | fn provider_stores_config_correctly() { function debug_redacts_client_secret (line 470) | fn debug_redacts_client_secret() { function validate_token_rejects_empty (line 495) | async fn validate_token_rejects_empty() { function validate_session_rejects_empty (line 513) | async fn validate_session_rejects_empty() { function nevis_identity_serde_roundtrip (line 531) | fn nevis_identity_serde_roundtrip() { function local_validation_rejects_malformed_jwt (line 548) | async fn local_validation_rejects_malformed_jwt() { function local_validation_errors_instead_of_silent_fallback (line 566) | async fn local_validation_errors_instead_of_silent_fallback() { FILE: src/security/otp.rs constant OTP_SECRET_FILE (line 11) | const OTP_SECRET_FILE: &str = "otp-secret"; constant OTP_DIGITS (line 12) | const OTP_DIGITS: u32 = 6; constant OTP_ISSUER (line 13) | const OTP_ISSUER: &str = "ZeroClaw"; type OtpValidator (line 16) | pub struct OtpValidator { method from_config (line 23) | pub fn from_config( method validate (line 60) | pub fn validate(&self, code: &str) -> Result { method validate_at (line 64) | fn validate_at(&self, code: &str, now_secs: u64) -> Result { method otpauth_uri (line 107) | pub fn otpauth_uri(&self) -> String { method code_for_timestamp (line 118) | pub(crate) fn code_for_timestamp(&self, timestamp: u64) -> String { function secret_file_path (line 124) | pub fn secret_file_path(zeroclaw_dir: &Path) -> PathBuf { function write_secret_file (line 128) | fn write_secret_file(path: &Path, value: &str) -> Result<()> { function unix_timestamp_now (line 157) | fn unix_timestamp_now() -> u64 { function compute_totp_code (line 164) | fn compute_totp_code(secret: &[u8], counter: u64) -> String { function encode_base32_secret (line 180) | fn encode_base32_secret(input: &[u8]) -> String { function decode_base32_secret (line 209) | fn decode_base32_secret(raw: &str) -> Result> { function test_config (line 258) | fn test_config() -> OtpConfig { function valid_totp_code_is_accepted (line 268) | fn valid_totp_code_is_accepted() { function expired_totp_code_is_rejected (line 279) | fn expired_totp_code_is_rejected() { function wrong_totp_code_is_rejected (line 291) | fn wrong_totp_code_is_rejected() { function secret_is_generated_and_reused (line 299) | fn secret_is_generated_and_reused() { FILE: src/security/pairing.rs constant MAX_PAIR_ATTEMPTS (line 18) | const MAX_PAIR_ATTEMPTS: u32 = 5; constant PAIR_LOCKOUT_SECS (line 20) | const PAIR_LOCKOUT_SECS: u64 = 300; constant MAX_TRACKED_CLIENTS (line 22) | const MAX_TRACKED_CLIENTS: usize = 10_000; constant FAILED_ATTEMPT_RETENTION_SECS (line 24) | const FAILED_ATTEMPT_RETENTION_SECS: u64 = 900; constant FAILED_ATTEMPT_SWEEP_INTERVAL_SECS (line 26) | const FAILED_ATTEMPT_SWEEP_INTERVAL_SECS: u64 = 300; type FailedAttemptState (line 30) | struct FailedAttemptState { type PairingGuard (line 43) | pub struct PairingGuard { method new (line 65) | pub fn new(require_pairing: bool, existing_tokens: &[String]) -> Self { method pairing_code (line 90) | pub fn pairing_code(&self) -> Option { method require_pairing (line 95) | pub fn require_pairing(&self) -> bool { method try_pair_blocking (line 99) | fn try_pair_blocking(&self, code: &str, client_id: &str) -> Result Result bool { method is_paired (line 211) | pub fn is_paired(&self) -> bool { method tokens (line 217) | pub fn tokens(&self) -> Vec { method generate_new_pairing_code (line 226) | pub fn generate_new_pairing_code(&self) -> Option { method token_hash (line 236) | pub fn token_hash(token: &str) -> String { method authenticate_and_hash (line 242) | pub fn authenticate_and_hash(&self, token: &str) -> Option { function normalize_client_key (line 252) | fn normalize_client_key(key: &str) -> String { function prune_failed_attempts (line 262) | fn prune_failed_attempts(map: &mut HashMap, ... function generate_code (line 269) | fn generate_code() -> String { function generate_token (line 298) | fn generate_token() -> String { function hash_token (line 304) | fn hash_token(token: &str) -> String { function is_token_hash (line 310) | fn is_token_hash(value: &str) -> bool { function constant_time_eq (line 331) | pub fn constant_time_eq(a: &str, b: &str) -> bool { function is_public_bind (line 353) | pub fn is_public_bind(host: &str) -> bool { function new_guard_generates_code_when_no_tokens (line 368) | async fn new_guard_generates_code_when_no_tokens() { function new_guard_no_code_when_tokens_exist (line 375) | async fn new_guard_no_code_when_tokens_exist() { function new_guard_no_code_when_pairing_disabled (line 382) | async fn new_guard_no_code_when_pairing_disabled() { function try_pair_correct_code (line 388) | async fn try_pair_correct_code() { function try_pair_wrong_code (line 398) | async fn try_pair_wrong_code() { function try_pair_empty_code (line 407) | async fn try_pair_empty_code() { function is_authenticated_with_valid_token (line 413) | async fn is_authenticated_with_valid_token() { function is_authenticated_with_prehashed_token (line 420) | async fn is_authenticated_with_prehashed_token() { function is_authenticated_with_invalid_token (line 428) | async fn is_authenticated_with_invalid_token() { function is_authenticated_when_pairing_disabled (line 434) | async fn is_authenticated_when_pairing_disabled() { function tokens_returns_hashes (line 441) | async fn tokens_returns_hashes() { function pair_then_authenticate (line 454) | async fn pair_then_authenticate() { function hash_token_produces_64_hex_chars (line 465) | async fn hash_token_produces_64_hex_chars() { function hash_token_is_deterministic (line 472) | async fn hash_token_is_deterministic() { function hash_token_differs_for_different_inputs (line 477) | async fn hash_token_differs_for_different_inputs() { function is_token_hash_detects_hash_vs_plaintext (line 482) | async fn is_token_hash_detects_hash_vs_plaintext() { function localhost_variants_not_public (line 492) | async fn localhost_variants_not_public() { function zero_zero_is_public (line 500) | async fn zero_zero_is_public() { function real_ip_is_public (line 505) | async fn real_ip_is_public() { function constant_time_eq_same (line 513) | async fn constant_time_eq_same() { function constant_time_eq_different (line 519) | async fn constant_time_eq_different() { function generate_code_is_6_digits (line 528) | async fn generate_code_is_6_digits() { function generate_code_is_not_deterministic (line 535) | async fn generate_code_is_not_deterministic() { function generate_token_has_prefix_and_hex_payload (line 548) | async fn generate_token_has_prefix_and_hex_payload() { function brute_force_lockout_after_max_attempts (line 566) | async fn brute_force_lockout_after_max_attempts() { function correct_code_resets_failed_attempts (line 589) | async fn correct_code_resets_failed_attempts() { function lockout_returns_remaining_seconds (line 603) | async fn lockout_returns_remaining_seconds() { function successful_pair_resets_only_requesting_client_state (line 618) | async fn successful_pair_resets_only_requesting_client_state() { function failed_attempt_state_is_bounded_by_max_clients (line 652) | async fn failed_attempt_state_is_bounded_by_max_clients() { function failed_attempt_sweep_prunes_expired_clients (line 692) | async fn failed_attempt_sweep_prunes_expired_clients() { function lockout_is_per_client (line 734) | async fn lockout_is_per_client() { FILE: src/security/playbook.rs type PlaybookStep (line 12) | pub struct PlaybookStep { function default_timeout_secs (line 25) | fn default_timeout_secs() -> u64 { type Playbook (line 31) | pub struct Playbook { function default_severity_filter (line 46) | fn default_severity_filter() -> String { type StepExecutionResult (line 52) | pub struct StepExecutionResult { type StepStatus (line 61) | pub enum StepStatus { method fmt (line 73) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { function load_playbooks (line 84) | pub fn load_playbooks(dir: &Path) -> Vec { function severity_level (line 121) | pub fn severity_level(severity: &str) -> u8 { function can_auto_approve (line 134) | pub fn can_auto_approve( function evaluate_step (line 153) | pub fn evaluate_step( function builtin_playbooks (line 201) | pub fn builtin_playbooks() -> Vec { function builtin_playbooks_are_valid (line 333) | fn builtin_playbooks_are_valid() { function severity_level_ordering (line 350) | fn severity_level_ordering() { function auto_approve_respects_severity_cap (line 358) | fn auto_approve_respects_severity_cap() { function evaluate_step_requires_approval (line 374) | fn evaluate_step_requires_approval() { function evaluate_step_out_of_range (line 388) | fn evaluate_step_out_of_range() { function playbook_json_roundtrip (line 395) | fn playbook_json_roundtrip() { function load_playbooks_from_nonexistent_dir_returns_builtins (line 403) | fn load_playbooks_from_nonexistent_dir_returns_builtins() { function load_playbooks_merges_custom_and_builtin (line 409) | fn load_playbooks_merges_custom_and_builtin() { function load_playbooks_custom_overrides_builtin (line 433) | fn load_playbooks_custom_overrides_builtin() { FILE: src/security/policy.rs type AutonomyLevel (line 10) | pub enum AutonomyLevel { type CommandRiskLevel (line 22) | pub enum CommandRiskLevel { type ToolOperation (line 30) | pub enum ToolOperation { type ActionTracker (line 37) | pub struct ActionTracker { method new (line 43) | pub fn new() -> Self { method record (line 50) | pub fn record(&self) -> usize { method count (line 61) | pub fn count(&self) -> usize { method clone (line 72) | fn clone(&self) -> Self { type SecurityPolicy (line 82) | pub struct SecurityPolicy { method command_risk_level (line 688) | pub fn command_risk_level(&self, command: &str) -> CommandRiskLevel { method validate_command_execution (line 823) | pub fn validate_command_execution( method is_command_explicitly_allowed (line 867) | fn is_command_explicitly_allowed(&self, command: &str) -> bool { method is_command_allowed (line 915) | pub fn is_command_allowed(&self, command: &str) -> bool { method is_args_safe (line 995) | fn is_args_safe(&self, base: &str, args: &[String]) -> bool { method forbidden_path_argument (line 1021) | pub fn forbidden_path_argument(&self, command: &str) -> Option { method is_path_allowed (line 1091) | pub fn is_path_allowed(&self, path: &str) -> bool { method is_resolved_path_allowed (line 1157) | pub fn is_resolved_path_allowed(&self, resolved: &Path) -> bool { method runtime_config_dir (line 1196) | fn runtime_config_dir(&self) -> Option { method is_runtime_config_path (line 1205) | pub fn is_runtime_config_path(&self, resolved: &Path) -> bool { method runtime_config_violation_message (line 1227) | pub fn runtime_config_violation_message(&self, resolved: &Path) -> Str... method resolved_path_violation_message (line 1234) | pub fn resolved_path_violation_message(&self, resolved: &Path) -> Stri... method can_act (line 1249) | pub fn can_act(&self) -> bool { method enforce_tool_operation (line 1262) | pub fn enforce_tool_operation( method record_action (line 1287) | pub fn record_action(&self) -> bool { method is_rate_limited (line 1293) | pub fn is_rate_limited(&self) -> bool { method resolve_tool_path (line 1302) | pub fn resolve_tool_path(&self, path: &str) -> PathBuf { method is_under_allowed_root (line 1325) | pub fn is_under_allowed_root(&self, path: &str) -> bool { method from_config (line 1337) | pub fn from_config( method prompt_summary (line 1374) | pub fn prompt_summary(&self) -> String { function default_allowed_commands (line 99) | fn default_allowed_commands() -> Vec { function default_allowed_commands (line 122) | fn default_allowed_commands() -> Vec { function default_forbidden_paths (line 150) | fn default_forbidden_paths() -> Vec { function default_forbidden_paths (line 175) | fn default_forbidden_paths() -> Vec { method default (line 190) | fn default() -> Self { function home_dir (line 208) | fn home_dir() -> Option { function expand_user_path (line 221) | fn expand_user_path(path: &str) -> PathBuf { function rootless_path (line 237) | fn rootless_path(path: &Path) -> Option { function skip_env_assignments (line 265) | fn skip_env_assignments(s: &str) -> &str { type QuoteState (line 287) | enum QuoteState { function split_unquoted_segments (line 302) | fn split_unquoted_segments(command: &str) -> Vec { function contains_unquoted_single_ampersand (line 395) | fn contains_unquoted_single_ampersand(command: &str) -> bool { function contains_unquoted_char (line 447) | fn contains_unquoted_char(command: &str, target: char) -> bool { function contains_unquoted_shell_variable_expansion (line 497) | fn contains_unquoted_shell_variable_expansion(command: &str) -> bool { function strip_wrapping_quotes (line 566) | fn strip_wrapping_quotes(token: &str) -> &str { function looks_like_path (line 570) | fn looks_like_path(candidate: &str) -> bool { function attached_short_option_value (line 586) | fn attached_short_option_value(token: &str) -> Option<&str> { function redirection_target (line 603) | fn redirection_target(token: &str) -> Option<&str> { function command_basename (line 619) | fn command_basename(raw: &str) -> &str { function strip_windows_exe_suffix (line 627) | fn strip_windows_exe_suffix(name: &str) -> &str { function is_allowlist_entry_match (line 638) | fn is_allowlist_entry_match(allowed: &str, executable: &str, executable_... function default_policy (line 1460) | fn default_policy() -> SecurityPolicy { function readonly_policy (line 1464) | fn readonly_policy() -> SecurityPolicy { function full_policy (line 1471) | fn full_policy() -> SecurityPolicy { function autonomy_default_is_supervised (line 1481) | fn autonomy_default_is_supervised() { function autonomy_serde_roundtrip (line 1486) | fn autonomy_serde_roundtrip() { function can_act_readonly_false (line 1496) | fn can_act_readonly_false() { function can_act_supervised_true (line 1501) | fn can_act_supervised_true() { function can_act_full_true (line 1506) | fn can_act_full_true() { function enforce_tool_operation_read_allowed_in_readonly_mode (line 1511) | fn enforce_tool_operation_read_allowed_in_readonly_mode() { function enforce_tool_operation_act_blocked_in_readonly_mode (line 1519) | fn enforce_tool_operation_act_blocked_in_readonly_mode() { function enforce_tool_operation_act_uses_rate_budget (line 1528) | fn enforce_tool_operation_act_uses_rate_budget() { function allowed_commands_basic (line 1542) | fn allowed_commands_basic() { function blocked_commands_basic (line 1553) | fn blocked_commands_basic() { function readonly_blocks_all_commands (line 1564) | fn readonly_blocks_all_commands() { function full_autonomy_still_uses_allowlist (line 1572) | fn full_autonomy_still_uses_allowlist() { function command_with_absolute_path_extracts_basename (line 1579) | fn command_with_absolute_path_extracts_basename() { function allowlist_supports_explicit_executable_paths (line 1586) | fn allowlist_supports_explicit_executable_paths() { function allowlist_supports_wildcard_entry (line 1597) | fn allowlist_supports_wildcard_entry() { function empty_command_blocked (line 1613) | fn empty_command_blocked() { function command_with_pipes_validates_all_segments (line 1620) | fn command_with_pipes_validates_all_segments() { function custom_allowlist (line 1631) | fn custom_allowlist() { function empty_allowlist_blocks_everything (line 1643) | fn empty_allowlist_blocks_everything() { function command_risk_low_for_read_commands (line 1653) | fn command_risk_low_for_read_commands() { function command_risk_medium_for_mutating_commands (line 1660) | fn command_risk_medium_for_mutating_commands() { function command_risk_high_for_dangerous_commands (line 1676) | fn command_risk_high_for_dangerous_commands() { function validate_command_requires_approval_for_medium_risk (line 1688) | fn validate_command_requires_approval_for_medium_risk() { function validate_command_blocks_high_risk_via_wildcard (line 1705) | fn validate_command_blocks_high_risk_via_wildcard() { function validate_command_allows_explicitly_listed_high_risk (line 1721) | fn validate_command_allows_explicitly_listed_high_risk() { function validate_command_allows_wget_when_explicitly_listed (line 1737) | fn validate_command_allows_wget_when_explicitly_listed() { function validate_command_blocks_non_listed_high_risk_when_another_is_allowed (line 1751) | fn validate_command_blocks_non_listed_high_risk_when_another_is_allowed() { function validate_command_explicit_rm_bypasses_high_risk_block (line 1766) | fn validate_command_explicit_rm_bypasses_high_risk_block() { function validate_command_high_risk_still_needs_approval_in_supervised (line 1780) | fn validate_command_high_risk_still_needs_approval_in_supervised() { function validate_command_pipe_needs_all_segments_explicitly_allowed (line 1800) | fn validate_command_pipe_needs_all_segments_explicitly_allowed() { function validate_command_full_mode_skips_medium_risk_approval_gate (line 1815) | fn validate_command_full_mode_skips_medium_risk_approval_gate() { function validate_command_rejects_background_chain_bypass (line 1828) | fn validate_command_rejects_background_chain_bypass() { function relative_paths_allowed (line 1838) | fn relative_paths_allowed() { function path_traversal_blocked (line 1846) | fn path_traversal_blocked() { function absolute_paths_blocked_when_workspace_only (line 1855) | fn absolute_paths_blocked_when_workspace_only() { function absolute_path_inside_workspace_allowed_when_workspace_only (line 1863) | fn absolute_path_inside_workspace_allowed_when_workspace_only() { function absolute_path_in_allowed_root_permitted_when_workspace_only (line 1878) | fn absolute_path_in_allowed_root_permitted_when_workspace_only() { function absolute_paths_allowed_when_not_workspace_only (line 1894) | fn absolute_paths_allowed_when_not_workspace_only() { function forbidden_paths_blocked (line 1904) | fn forbidden_paths_blocked() { function empty_path_allowed (line 1916) | fn empty_path_allowed() { function dotfile_in_workspace_allowed (line 1922) | fn dotfile_in_workspace_allowed() { function from_config_maps_all_fields (line 1931) | fn from_config_maps_all_fields() { function from_config_normalizes_allowed_roots (line 1960) | fn from_config_normalizes_allowed_roots() { function resolved_path_violation_message_includes_allowed_roots_guidance (line 1979) | fn resolved_path_violation_message_includes_allowed_roots_guidance() { function default_policy_has_sane_values (line 1989) | fn default_policy_has_sane_values() { function action_tracker_starts_at_zero (line 2005) | fn action_tracker_starts_at_zero() { function action_tracker_records_actions (line 2011) | fn action_tracker_records_actions() { function record_action_allows_within_limit (line 2020) | fn record_action_allows_within_limit() { function record_action_blocks_over_limit (line 2031) | fn record_action_blocks_over_limit() { function is_rate_limited_reflects_count (line 2043) | fn is_rate_limited_reflects_count() { function action_tracker_clone_is_independent (line 2056) | fn action_tracker_clone_is_independent() { function command_injection_semicolon_blocked (line 2070) | fn command_injection_semicolon_blocked() { function command_injection_semicolon_no_space (line 2078) | fn command_injection_semicolon_no_space() { function quoted_semicolons_do_not_split_sqlite_command (line 2084) | fn quoted_semicolons_do_not_split_sqlite_command() { function unquoted_semicolon_after_quoted_sql_still_splits_commands (line 2101) | fn unquoted_semicolon_after_quoted_sql_still_splits_commands() { function command_injection_backtick_blocked (line 2110) | fn command_injection_backtick_blocked() { function command_injection_dollar_paren_blocked (line 2117) | fn command_injection_dollar_paren_blocked() { function command_injection_dollar_paren_literal_inside_single_quotes_allowed (line 2124) | fn command_injection_dollar_paren_literal_inside_single_quotes_allowed() { function command_injection_dollar_brace_literal_inside_single_quotes_allowed (line 2130) | fn command_injection_dollar_brace_literal_inside_single_quotes_allowed() { function command_injection_dollar_brace_unquoted_blocked (line 2136) | fn command_injection_dollar_brace_unquoted_blocked() { function command_with_env_var_prefix (line 2142) | fn command_with_env_var_prefix() { function command_newline_injection_blocked (line 2149) | fn command_newline_injection_blocked() { function command_injection_and_chain_blocked (line 2158) | fn command_injection_and_chain_blocked() { function command_injection_or_chain_blocked (line 2167) | fn command_injection_or_chain_blocked() { function command_injection_background_chain_blocked (line 2175) | fn command_injection_background_chain_blocked() { function command_injection_redirect_blocked (line 2183) | fn command_injection_redirect_blocked() { function quoted_ampersand_and_redirect_literals_are_not_treated_as_operators (line 2192) | fn quoted_ampersand_and_redirect_literals_are_not_treated_as_operators() { function command_argument_injection_blocked (line 2200) | fn command_argument_injection_blocked() { function command_injection_dollar_brace_blocked (line 2216) | fn command_injection_dollar_brace_blocked() { function command_injection_plain_dollar_var_blocked (line 2222) | fn command_injection_plain_dollar_var_blocked() { function command_injection_tee_blocked (line 2229) | fn command_injection_tee_blocked() { function command_injection_process_substitution_blocked (line 2237) | fn command_injection_process_substitution_blocked() { function command_env_var_prefix_with_allowed_cmd (line 2244) | fn command_env_var_prefix_with_allowed_cmd() { function forbidden_path_argument_detects_absolute_path (line 2254) | fn forbidden_path_argument_detects_absolute_path() { function forbidden_path_argument_detects_parent_dir_reference (line 2263) | fn forbidden_path_argument_detects_parent_dir_reference() { function forbidden_path_argument_allows_workspace_relative_paths (line 2276) | fn forbidden_path_argument_allows_workspace_relative_paths() { function forbidden_path_argument_detects_option_assignment_paths (line 2283) | fn forbidden_path_argument_detects_option_assignment_paths() { function forbidden_path_argument_allows_safe_option_assignment_paths (line 2296) | fn forbidden_path_argument_allows_safe_option_assignment_paths() { function forbidden_path_argument_detects_short_option_attached_paths (line 2305) | fn forbidden_path_argument_detects_short_option_attached_paths() { function forbidden_path_argument_allows_safe_short_option_attached_paths (line 2318) | fn forbidden_path_argument_allows_safe_short_option_attached_paths() { function forbidden_path_argument_detects_tilde_user_paths (line 2328) | fn forbidden_path_argument_detects_tilde_user_paths() { function forbidden_path_argument_detects_input_redirection_paths (line 2341) | fn forbidden_path_argument_detects_input_redirection_paths() { function path_traversal_encoded_dots (line 2356) | fn path_traversal_encoded_dots() { function path_traversal_double_dot_in_filename (line 2363) | fn path_traversal_double_dot_in_filename() { function path_with_null_byte_blocked (line 2373) | fn path_with_null_byte_blocked() { function path_symlink_style_absolute (line 2379) | fn path_symlink_style_absolute() { function path_home_tilde_ssh (line 2385) | fn path_home_tilde_ssh() { function path_var_run_blocked (line 2397) | fn path_var_run_blocked() { function rate_limit_exactly_at_boundary (line 2408) | fn rate_limit_exactly_at_boundary() { function rate_limit_zero_blocks_everything (line 2419) | fn rate_limit_zero_blocks_everything() { function rate_limit_high_allows_many (line 2428) | fn rate_limit_high_allows_many() { function readonly_blocks_even_safe_commands (line 2441) | fn readonly_blocks_even_safe_commands() { function supervised_allows_listed_commands (line 2453) | fn supervised_allows_listed_commands() { function full_autonomy_still_respects_forbidden_paths (line 2464) | fn full_autonomy_still_respects_forbidden_paths() { function workspace_only_false_allows_resolved_outside_workspace (line 2475) | fn workspace_only_false_allows_resolved_outside_workspace() { function workspace_only_true_blocks_resolved_outside_workspace (line 2513) | fn workspace_only_true_blocks_resolved_outside_workspace() { function from_config_creates_fresh_tracker (line 2549) | fn from_config_creates_fresh_tracker() { function checklist_root_path_blocked (line 2576) | fn checklist_root_path_blocked() { function checklist_all_system_dirs_blocked (line 2583) | fn checklist_all_system_dirs_blocked() { function checklist_sensitive_dotfiles_blocked (line 2604) | fn checklist_sensitive_dotfiles_blocked() { function checklist_null_byte_injection_blocked (line 2623) | fn checklist_null_byte_injection_blocked() { function checklist_workspace_only_blocks_absolute_outside_workspace (line 2631) | fn checklist_workspace_only_blocks_absolute_outside_workspace() { function checklist_resolved_path_must_be_in_workspace (line 2641) | fn checklist_resolved_path_must_be_in_workspace() { function checklist_default_policy_is_workspace_only (line 2656) | fn checklist_default_policy_is_workspace_only() { function checklist_default_forbidden_paths_comprehensive (line 2665) | fn checklist_default_forbidden_paths_comprehensive() { function resolved_path_blocks_outside_workspace (line 2686) | fn resolved_path_blocks_outside_workspace() { function resolved_path_blocks_root_escape (line 2721) | fn resolved_path_blocks_root_escape() { function resolved_path_blocks_symlink_escape (line 2739) | fn resolved_path_blocks_symlink_escape() { function allowed_roots_permits_paths_outside_workspace (line 2771) | fn allowed_roots_permits_paths_outside_workspace() { function is_path_allowed_blocks_null_bytes (line 2824) | fn is_path_allowed_blocks_null_bytes() { function is_path_allowed_blocks_url_encoded_traversal (line 2833) | fn is_path_allowed_blocks_url_encoded_traversal() { function resolve_tool_path_expands_tilde (line 2846) | fn resolve_tool_path_expands_tilde() { function resolve_tool_path_keeps_absolute (line 2859) | fn resolve_tool_path_keeps_absolute() { function resolve_tool_path_joins_relative (line 2869) | fn resolve_tool_path_joins_relative() { function resolve_tool_path_normalizes_workspace_prefixed_relative_paths (line 2879) | fn resolve_tool_path_normalizes_workspace_prefixed_relative_paths() { function is_under_allowed_root_matches_allowed_roots (line 2892) | fn is_under_allowed_root_matches_allowed_roots() { function is_under_allowed_root_returns_false_for_empty_roots (line 2906) | fn is_under_allowed_root_returns_false_for_empty_roots() { function runtime_config_paths_are_protected (line 2917) | fn runtime_config_paths_are_protected() { function workspace_files_are_not_runtime_config_paths (line 2933) | fn workspace_files_are_not_runtime_config_paths() { function prompt_summary_includes_autonomy_level (line 2948) | fn prompt_summary_includes_autonomy_level() { function prompt_summary_includes_workspace_boundary_when_workspace_only (line 2958) | fn prompt_summary_includes_workspace_boundary_when_workspace_only() { function prompt_summary_omits_workspace_boundary_when_not_workspace_only (line 2976) | fn prompt_summary_omits_workspace_boundary_when_not_workspace_only() { function prompt_summary_includes_allowed_commands (line 2989) | fn prompt_summary_includes_allowed_commands() { function prompt_summary_includes_forbidden_paths (line 3004) | fn prompt_summary_includes_forbidden_paths() { function prompt_summary_includes_rate_limit (line 3016) | fn prompt_summary_includes_rate_limit() { function prompt_summary_includes_risk_controls (line 3030) | fn prompt_summary_includes_risk_controls() { function prompt_summary_includes_allowed_roots (line 3048) | fn prompt_summary_includes_allowed_roots() { FILE: src/security/prompt_guard.rs type GuardResult (line 19) | pub enum GuardResult { type GuardAction (line 31) | pub enum GuardAction { method from_str (line 42) | pub fn from_str(s: &str) -> Self { type PromptGuard (line 53) | pub struct PromptGuard { method new (line 68) | pub fn new() -> Self { method with_config (line 76) | pub fn with_config(action: GuardAction, sensitivity: f64) -> Self { method scan (line 84) | pub fn scan(&self, content: &str) -> GuardResult { method check_system_override (line 134) | fn check_system_override(&self, content: &str, patterns: &mut Vec Self { function safe_messages_pass (line 296) | fn safe_messages_pass() { function detects_system_override (line 313) | fn detects_system_override() { function detects_role_confusion (line 320) | fn detects_role_confusion() { function detects_secret_extraction (line 327) | fn detects_secret_extraction() { function detects_jailbreak_attempts (line 334) | fn detects_jailbreak_attempts() { function blocking_mode_works (line 341) | fn blocking_mode_works() { function high_sensitivity_catches_more (line 348) | fn high_sensitivity_catches_more() { FILE: src/security/secrets.rs constant KEY_LEN (line 30) | const KEY_LEN: usize = 32; constant NONCE_LEN (line 33) | const NONCE_LEN: usize = 12; type SecretStore (line 37) | pub struct SecretStore { method new (line 46) | pub fn new(zeroclaw_dir: &Path, enabled: bool) -> Self { method encrypt (line 56) | pub fn encrypt(&self, plaintext: &str) -> Result { method decrypt (line 85) | pub fn decrypt(&self, value: &str) -> Result { method decrypt_and_migrate (line 101) | pub fn decrypt_and_migrate(&self, value: &str) -> Result<(String, Opti... method needs_migration (line 123) | pub fn needs_migration(value: &str) -> bool { method decrypt_chacha20 (line 128) | fn decrypt_chacha20(&self, hex_str: &str) -> Result { method decrypt_legacy_xor (line 151) | fn decrypt_legacy_xor(&self, hex_str: &str) -> Result { method is_encrypted (line 161) | pub fn is_encrypted(value: &str) -> bool { method is_secure_encrypted (line 166) | pub fn is_secure_encrypted(value: &str) -> bool { method load_or_create_key (line 171) | fn load_or_create_key(&self) -> Result> { function xor_cipher (line 230) | fn xor_cipher(data: &[u8], key: &[u8]) -> Vec { function generate_random_key (line 244) | fn generate_random_key() -> Vec { function hex_encode (line 249) | fn hex_encode(data: &[u8]) -> String { function build_windows_icacls_grant_arg (line 260) | fn build_windows_icacls_grant_arg(username: &str) -> Option { function hex_decode (line 270) | fn hex_decode(hex: &str) -> Result> { function encrypt_decrypt_roundtrip (line 291) | fn encrypt_decrypt_roundtrip() { function encrypt_empty_returns_empty (line 305) | fn encrypt_empty_returns_empty() { function decrypt_plaintext_passthrough (line 313) | fn decrypt_plaintext_passthrough() { function disabled_store_returns_plaintext (line 322) | fn disabled_store_returns_plaintext() { function is_encrypted_detects_prefix (line 330) | fn is_encrypted_detects_prefix() { function key_file_created_on_first_encrypt (line 338) | async fn key_file_created_on_first_encrypt() { function encrypting_same_value_produces_different_ciphertext (line 355) | fn encrypting_same_value_produces_different_ciphertext() { function different_stores_same_dir_interop (line 372) | fn different_stores_same_dir_interop() { function unicode_secret_roundtrip (line 383) | fn unicode_secret_roundtrip() { function long_secret_roundtrip (line 394) | fn long_secret_roundtrip() { function corrupt_hex_returns_error (line 405) | fn corrupt_hex_returns_error() { function tampered_ciphertext_detected (line 413) | fn tampered_ciphertext_detected() { function wrong_key_detected (line 432) | fn wrong_key_detected() { function truncated_ciphertext_returns_error (line 444) | fn truncated_ciphertext_returns_error() { function legacy_xor_decrypt_still_works (line 455) | fn legacy_xor_decrypt_still_works() { function needs_migration_detects_legacy_prefix (line 476) | fn needs_migration_detects_legacy_prefix() { function is_secure_encrypted_detects_enc2_only (line 484) | fn is_secure_encrypted_detects_enc2_only() { function decrypt_and_migrate_returns_none_for_enc2 (line 492) | fn decrypt_and_migrate_returns_none_for_enc2() { function decrypt_and_migrate_returns_none_for_plaintext (line 508) | fn decrypt_and_migrate_returns_none_for_plaintext() { function decrypt_and_migrate_upgrades_legacy_xor (line 521) | fn decrypt_and_migrate_upgrades_legacy_xor() { function decrypt_and_migrate_handles_unicode (line 565) | fn decrypt_and_migrate_handles_unicode() { function decrypt_and_migrate_handles_empty_secret (line 587) | fn decrypt_and_migrate_handles_empty_secret() { function decrypt_and_migrate_handles_long_secret (line 607) | fn decrypt_and_migrate_handles_long_secret() { function decrypt_and_migrate_fails_on_corrupt_legacy_hex (line 628) | fn decrypt_and_migrate_fails_on_corrupt_legacy_hex() { function decrypt_and_migrate_wrong_key_produces_garbage_or_fails (line 638) | fn decrypt_and_migrate_wrong_key_produces_garbage_or_fails() { function migration_produces_different_ciphertext_each_time (line 675) | fn migration_produces_different_ciphertext_each_time() { function migrated_value_is_tamper_resistant (line 699) | fn migrated_value_is_tamper_resistant() { function xor_cipher_roundtrip (line 728) | fn xor_cipher_roundtrip() { function xor_cipher_empty_key (line 737) | fn xor_cipher_empty_key() { function hex_roundtrip (line 744) | fn hex_roundtrip() { function hex_decode_odd_length_fails (line 753) | fn hex_decode_odd_length_fails() { function hex_decode_invalid_chars_fails (line 758) | fn hex_decode_invalid_chars_fails() { function windows_icacls_grant_arg_rejects_empty_username (line 763) | fn windows_icacls_grant_arg_rejects_empty_username() { function windows_icacls_grant_arg_trims_username (line 769) | fn windows_icacls_grant_arg_trims_username() { function windows_icacls_grant_arg_preserves_valid_characters (line 777) | fn windows_icacls_grant_arg_preserves_valid_characters() { function generate_random_key_correct_length (line 785) | fn generate_random_key_correct_length() { function generate_random_key_not_all_zeros (line 791) | fn generate_random_key_not_all_zeros() { function two_random_keys_differ (line 797) | fn two_random_keys_differ() { function generate_random_key_has_no_uuid_fixed_bits (line 804) | fn generate_random_key_has_no_uuid_fixed_bits() { function key_file_has_restricted_permissions (line 838) | fn key_file_has_restricted_permissions() { FILE: src/security/traits.rs type Sandbox (line 22) | pub trait Sandbox: Send + Sync { method wrap_command (line 32) | fn wrap_command(&self, cmd: &mut Command) -> std::io::Result<()>; method is_available (line 39) | fn is_available(&self) -> bool; method name (line 45) | fn name(&self) -> &str; method description (line 51) | fn description(&self) -> &str; method wrap_command (line 64) | fn wrap_command(&self, _cmd: &mut Command) -> std::io::Result<()> { method is_available (line 69) | fn is_available(&self) -> bool { method name (line 73) | fn name(&self) -> &str { method description (line 77) | fn description(&self) -> &str { type NoopSandbox (line 61) | pub struct NoopSandbox; function noop_sandbox_name (line 87) | fn noop_sandbox_name() { function noop_sandbox_is_always_available (line 92) | fn noop_sandbox_is_always_available() { function noop_sandbox_wrap_command_is_noop (line 97) | fn noop_sandbox_wrap_command_is_noop() { FILE: src/security/vulnerability.rs type Finding (line 12) | pub struct Finding { function default_true (line 35) | fn default_true() -> bool { type VulnerabilityReport (line 41) | pub struct VulnerabilityReport { function effective_priority (line 55) | pub fn effective_priority(finding: &Finding) -> f64 { function cvss_to_severity (line 67) | pub fn cvss_to_severity(cvss: f64) -> &'static str { function parse_vulnerability_json (line 83) | pub fn parse_vulnerability_json(json_str: &str) -> anyhow::Result String { function sample_findings (line 227) | fn sample_findings() -> Vec { function effective_priority_adds_context_bonuses (line 263) | fn effective_priority_adds_context_bonuses() { function cvss_to_severity_classification (line 289) | fn cvss_to_severity_classification() { function parse_vulnerability_json_roundtrip (line 302) | fn parse_vulnerability_json_roundtrip() { function parse_vulnerability_json_rejects_invalid (line 318) | fn parse_vulnerability_json_rejects_invalid() { function generate_summary_includes_key_sections (line 324) | fn generate_summary_includes_key_sections() { function parse_vulnerability_json_rejects_out_of_range_cvss (line 343) | fn parse_vulnerability_json_rejects_out_of_range_cvss() { function parse_vulnerability_json_rejects_negative_cvss (line 366) | fn parse_vulnerability_json_rejects_negative_cvss() { function generate_summary_empty_findings (line 387) | fn generate_summary_empty_findings() { FILE: src/security/workspace_boundary.rs type BoundaryVerdict (line 11) | pub enum BoundaryVerdict { type WorkspaceBoundary (line 20) | pub struct WorkspaceBoundary { method new (line 29) | pub fn new(profile: Option, cross_workspace_search: ... method inactive (line 37) | pub fn inactive() -> Self { method check_tool_access (line 45) | pub fn check_tool_access(&self, tool_name: &str) -> BoundaryVerdict { method check_domain_access (line 58) | pub fn check_domain_access(&self, domain: &str) -> BoundaryVerdict { method check_path_access (line 74) | pub fn check_path_access(&self, path: &Path, workspaces_base: &Path) -... method is_active (line 105) | pub fn is_active(&self) -> bool { method active_workspace_name (line 110) | pub fn active_workspace_name(&self) -> Option<&str> { function test_profile (line 120) | fn test_profile() -> WorkspaceProfile { function boundary_inactive_allows_everything (line 132) | fn boundary_inactive_allows_everything() { function boundary_denies_restricted_tool (line 143) | fn boundary_denies_restricted_tool() { function boundary_denies_unlisted_domain (line 156) | fn boundary_denies_unlisted_domain() { function boundary_denies_cross_workspace_path_access (line 169) | fn boundary_denies_cross_workspace_path_access() { function boundary_allows_cross_workspace_when_enabled (line 189) | fn boundary_allows_cross_workspace_when_enabled() { function boundary_allows_paths_outside_workspaces_dir (line 201) | fn boundary_allows_paths_outside_workspaces_dir() { FILE: src/service/mod.rs constant SERVICE_LABEL (line 8) | const SERVICE_LABEL: &str = "com.zeroclaw.daemon"; constant WINDOWS_TASK_NAME (line 9) | const WINDOWS_TASK_NAME: &str = "ZeroClaw Daemon"; type InitSystem (line 13) | pub enum InitSystem { method resolve (line 47) | pub fn resolve(self) -> Result { method resolve (line 55) | pub fn resolve(self) -> Result { type Err (line 24) | type Err = anyhow::Error; method from_str (line 26) | fn from_str(s: &str) -> Result { function detect_init_system (line 68) | fn detect_init_system() -> Result { function windows_task_name (line 88) | fn windows_task_name() -> &'static str { function handle_command (line 92) | pub fn handle_command( function install (line 107) | fn install(config: &Config, init_system: InitSystem) -> Result<()> { function start (line 120) | fn start(config: &Config, init_system: InitSystem) -> Result<()> { function start_linux (line 149) | fn start_linux(init_system: InitSystem) -> Result<()> { function stop (line 164) | fn stop(config: &Config, init_system: InitSystem) -> Result<()> { function stop_linux (line 191) | fn stop_linux(init_system: InitSystem) -> Result<()> { function restart (line 206) | fn restart(config: &Config, init_system: InitSystem) -> Result<()> { function restart_linux (line 229) | fn restart_linux(init_system: InitSystem) -> Result<()> { function status (line 244) | fn status(config: &Config, init_system: InitSystem) -> Result<()> { function status_linux (line 293) | fn status_linux(config: &Config, init_system: InitSystem) -> Result<()> { function uninstall (line 316) | fn uninstall(config: &Config, init_system: InitSystem) -> Result<()> { function uninstall_linux (line 354) | fn uninstall_linux(config: &Config, init_system: InitSystem) -> Result<(... function detect_homebrew_var_dir (line 391) | fn detect_homebrew_var_dir(exe: &Path) -> Option { function install_macos (line 425) | fn install_macos(config: &Config) -> Result<()> { function install_linux (line 517) | fn install_linux(config: &Config, init_system: InitSystem) -> Result<()> { function install_linux_systemd (line 525) | fn install_linux_systemd(config: &Config) -> Result<()> { function is_root (line 563) | fn is_root() -> bool { function is_root (line 571) | fn is_root() -> bool { function check_zeroclaw_user (line 578) | fn check_zeroclaw_user() -> Result<()> { function ensure_zeroclaw_user (line 634) | fn ensure_zeroclaw_user() -> Result<()> { function chown_to_zeroclaw (line 697) | fn chown_to_zeroclaw(path: &Path) -> Result<()> { function chown_to_zeroclaw (line 715) | fn chown_to_zeroclaw(_path: &Path) -> Result<()> { function chown_recursive_to_zeroclaw (line 720) | fn chown_recursive_to_zeroclaw(path: &Path) -> Result<()> { function chown_recursive_to_zeroclaw (line 739) | fn chown_recursive_to_zeroclaw(_path: &Path) -> Result<()> { function copy_dir_recursive (line 743) | fn copy_dir_recursive(source: &Path, target: &Path) -> Result<()> { function resolve_invoking_user_config_dir (line 776) | fn resolve_invoking_user_config_dir() -> Option { function migrate_openrc_runtime_state_if_needed (line 800) | fn migrate_openrc_runtime_state_if_needed(config_dir: &Path) -> Result<(... function shell_single_quote (line 829) | fn shell_single_quote(raw: &str) -> String { function build_openrc_writability_probe_command (line 834) | fn build_openrc_writability_probe_command(path: &Path, has_runuser: bool... function ensure_openrc_runtime_path_writable (line 863) | fn ensure_openrc_runtime_path_writable(path: &Path) -> Result<()> { function ensure_openrc_runtime_dirs_writable (line 894) | fn ensure_openrc_runtime_dirs_writable( function ensure_openrc_runtime_dirs_writable (line 906) | fn ensure_openrc_runtime_dirs_writable( function warn_if_binary_in_home (line 915) | fn warn_if_binary_in_home(exe_path: &Path) { function generate_openrc_script (line 929) | fn generate_openrc_script(exe_path: &Path, config_dir: &Path) -> String { function resolve_openrc_executable (line 963) | fn resolve_openrc_executable() -> Result { function install_linux_openrc (line 973) | fn install_linux_openrc(config: &Config) -> Result<()> { function install_windows (line 1093) | fn install_windows(config: &Config) -> Result<()> { function macos_service_file (line 1142) | fn macos_service_file() -> Result { function linux_service_file (line 1152) | fn linux_service_file(config: &Config) -> Result { function run_checked (line 1164) | fn run_checked(command: &mut Command) -> Result<()> { function run_capture (line 1173) | fn run_capture(command: &mut Command) -> Result { function xml_escape (line 1182) | fn xml_escape(raw: &str) -> String { function xml_escape_escapes_reserved_chars (line 1195) | fn xml_escape_escapes_reserved_chars() { function run_capture_reads_stdout (line 1202) | fn run_capture_reads_stdout() { function run_capture_falls_back_to_stderr (line 1210) | fn run_capture_falls_back_to_stderr() { function run_checked_errors_on_non_zero_status (line 1218) | fn run_checked_errors_on_non_zero_status() { function linux_service_file_has_expected_suffix (line 1226) | fn linux_service_file_has_expected_suffix() { function windows_task_name_is_constant (line 1233) | fn windows_task_name_is_constant() { function run_capture_reads_stdout_windows (line 1239) | fn run_capture_reads_stdout_windows() { function run_checked_errors_on_non_zero_status_windows (line 1247) | fn run_checked_errors_on_non_zero_status_windows() { function init_system_from_str_parses_valid_values (line 1254) | fn init_system_from_str_parses_valid_values() { function init_system_from_str_rejects_unknown (line 1270) | fn init_system_from_str_rejects_unknown() { function init_system_default_is_auto (line 1279) | fn init_system_default_is_auto() { function is_root_matches_system_uid (line 1285) | fn is_root_matches_system_uid() { function generate_openrc_script_contains_required_directives (line 1293) | fn generate_openrc_script_contains_required_directives() { function generate_openrc_script_sets_home_for_browser (line 1318) | fn generate_openrc_script_sets_home_for_browser() { function generate_openrc_script_creates_home_directory (line 1331) | fn generate_openrc_script_creates_home_directory() { function systemd_unit_contains_home_and_pass_environment (line 1348) | fn systemd_unit_contains_home_and_pass_environment() { function warn_if_binary_in_home_detects_home_path (line 1379) | fn warn_if_binary_in_home_detects_home_path() { function shell_single_quote_escapes_single_quotes (line 1396) | fn shell_single_quote_escapes_single_quotes() { function openrc_writability_probe_prefers_runuser_when_available (line 1405) | fn openrc_writability_probe_prefers_runuser_when_available() { function detect_homebrew_var_dir_from_cellar_path (line 1423) | fn detect_homebrew_var_dir_from_cellar_path() { function detect_homebrew_var_dir_intel_cellar_path (line 1430) | fn detect_homebrew_var_dir_intel_cellar_path() { function detect_homebrew_var_dir_non_homebrew_path (line 1437) | fn detect_homebrew_var_dir_non_homebrew_path() { function openrc_writability_probe_falls_back_to_su (line 1445) | fn openrc_writability_probe_falls_back_to_su() { FILE: src/skillforge/evaluate.rs type Scores (line 12) | pub struct Scores { method total (line 23) | pub fn total(&self) -> f64 { type Recommendation (line 33) | pub enum Recommendation { type EvalResult (line 47) | pub struct EvalResult { type Evaluator (line 58) | pub struct Evaluator { method new (line 89) | pub fn new(min_score: f64) -> Self { method evaluate (line 93) | pub fn evaluate(&self, candidate: ScoutResult) -> EvalResult { method score_compatibility (line 124) | fn score_compatibility(&self, c: &ScoutResult) -> f64 { method score_quality (line 134) | fn score_quality(&self, c: &ScoutResult) -> f64 { method score_security (line 141) | fn score_security(&self, c: &ScoutResult) -> f64 { constant BAD_PATTERNS (line 64) | const BAD_PATTERNS: &[&str] = &[ function contains_word (line 75) | fn contains_word(haystack: &str, word: &str) -> bool { function make_candidate (line 180) | fn make_candidate(stars: u64, lang: Option<&str>, has_license: bool) -> ... function high_quality_rust_repo_gets_auto (line 195) | fn high_quality_rust_repo_gets_auto() { function low_star_no_license_gets_manual_or_skip (line 204) | fn low_star_no_license_gets_manual_or_skip() { function bad_pattern_tanks_security (line 213) | fn bad_pattern_tanks_security() { function scores_total_weighted (line 227) | fn scores_total_weighted() { function hackathon_not_flagged_as_bad (line 244) | fn hackathon_not_flagged_as_bad() { function exact_hack_is_flagged (line 259) | fn exact_hack_is_flagged() { FILE: src/skillforge/integrate.rs type Integrator (line 16) | pub struct Integrator { method new (line 21) | pub fn new(output_dir: String) -> Self { method integrate (line 28) | pub fn integrate(&self, candidate: &ScoutResult) -> Result { method generate_toml (line 56) | fn generate_toml(&self, c: &ScoutResult) -> String { method generate_md (line 96) | fn generate_md(&self, c: &ScoutResult) -> String { function escape_toml (line 140) | fn escape_toml(s: &str) -> String { function sanitize_path_component (line 152) | fn sanitize_path_component(name: &str) -> Result { function sample_candidate (line 180) | fn sample_candidate() -> ScoutResult { function integrate_creates_files (line 195) | async fn integrate_creates_files() { function escape_toml_handles_quotes_and_control_chars (line 222) | fn escape_toml_handles_quotes_and_control_chars() { function sanitize_rejects_traversal (line 231) | fn sanitize_rejects_traversal() { function sanitize_replaces_separators (line 239) | fn sanitize_replaces_separators() { function sanitize_trims_dots (line 248) | fn sanitize_trims_dots() { FILE: src/skillforge/mod.rs type SkillForgeConfig (line 24) | pub struct SkillForgeConfig { method fmt (line 74) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { function default_auto_integrate (line 43) | fn default_auto_integrate() -> bool { function default_sources (line 46) | fn default_sources() -> Vec { function default_scan_interval (line 49) | fn default_scan_interval() -> u64 { function default_min_score (line 52) | fn default_min_score() -> f64 { function default_output_dir (line 55) | fn default_output_dir() -> String { method default (line 60) | fn default() -> Self { type ForgeReport (line 92) | pub struct ForgeReport { type SkillForge (line 105) | pub struct SkillForge { method new (line 112) | pub fn new(config: SkillForgeConfig) -> Self { method forge (line 123) | pub async fn forge(&self) -> Result { function disabled_forge_returns_empty_report (line 235) | async fn disabled_forge_returns_empty_report() { function default_config_values (line 247) | fn default_config_values() { FILE: src/skillforge/scout.rs type ScoutSource (line 14) | pub enum ScoutSource { type Err (line 21) | type Err = std::convert::Infallible; method from_str (line 23) | fn from_str(s: &str) -> std::result::Result { type ScoutResult (line 41) | pub struct ScoutResult { type Scout (line 60) | pub trait Scout: Send + Sync { method discover (line 62) | async fn discover(&self) -> Result>; method discover (line 161) | async fn discover(&self) -> Result> { type GitHubScout (line 70) | pub struct GitHubScout { method new (line 76) | pub fn new(token: Option) -> Self { method parse_items (line 107) | fn parse_items(body: &serde_json::Value) -> Vec { function urlencoding (line 219) | fn urlencoding(s: &str) -> String { function dedup (line 224) | pub fn dedup(results: &mut Vec) { function scout_source_from_str (line 238) | fn scout_source_from_str() { function dedup_removes_duplicates (line 267) | fn dedup_removes_duplicates() { function parse_github_items (line 310) | fn parse_github_items() { function urlencoding_works (line 335) | fn urlencoding_works() { FILE: src/skills/audit.rs constant MAX_TEXT_FILE_BYTES (line 7) | const MAX_TEXT_FILE_BYTES: u64 = 512 * 1024; type SkillAuditOptions (line 10) | pub struct SkillAuditOptions { type SkillAuditReport (line 15) | pub struct SkillAuditReport { method is_clean (line 21) | pub fn is_clean(&self) -> bool { method summary (line 25) | pub fn summary(&self) -> String { function audit_skill_directory (line 30) | pub fn audit_skill_directory(skill_dir: &Path) -> Result Resul... function collect_paths_depth_first (line 92) | fn collect_paths_depth_first(root: &Path) -> Result> { function audit_path (line 120) | fn audit_path( function audit_markdown_file (line 163) | fn audit_markdown_file(root: &Path, path: &Path, report: &mut SkillAudit... function audit_manifest_file (line 181) | fn audit_manifest_file(root: &Path, path: &Path, report: &mut SkillAudit... function audit_markdown_link_target (line 245) | fn audit_markdown_link_target( function is_cross_skill_reference (line 354) | fn is_cross_skill_reference(target: &str) -> bool { function skills_root_for (line 378) | fn skills_root_for(root: &Path) -> Option { function relative_display (line 388) | fn relative_display(root: &Path, path: &Path) -> String { function is_markdown_file (line 398) | fn is_markdown_file(path: &Path) -> bool { function is_toml_file (line 404) | fn is_toml_file(path: &Path) -> bool { function is_unsupported_script_file (line 410) | fn is_unsupported_script_file(path: &Path) -> bool { function has_script_suffix (line 414) | fn has_script_suffix(raw: &str) -> bool { function has_shell_shebang (line 424) | fn has_shell_shebang(path: &Path) -> bool { function shebang_interpreter (line 445) | fn shebang_interpreter(line: &str) -> Option<&str> { function extract_markdown_links (line 468) | fn extract_markdown_links(content: &str) -> Vec { function normalize_markdown_target (line 481) | fn normalize_markdown_target(raw_target: &str) -> &str { function strip_query_and_fragment (line 488) | fn strip_query_and_fragment(input: &str) -> &str { function url_scheme (line 499) | fn url_scheme(target: &str) -> Option<&str> { function looks_like_absolute_path (line 513) | fn looks_like_absolute_path(target: &str) -> bool { function has_markdown_suffix (line 543) | fn has_markdown_suffix(target: &str) -> bool { function contains_shell_chaining (line 548) | fn contains_shell_chaining(command: &str) -> bool { function detect_high_risk_snippet (line 554) | fn detect_high_risk_snippet(content: &str) -> Option<&'static str> { function audit_accepts_safe_skill (line 603) | fn audit_accepts_safe_skill() { function audit_rejects_shell_script_files (line 618) | fn audit_rejects_shell_script_files() { function audit_allows_python_shebang_file_when_early_text_contains_sh (line 637) | fn audit_allows_python_shebang_file_when_early_text_contains_sh() { function audit_allows_shell_script_files_when_enabled (line 661) | fn audit_allows_shell_script_files_when_enabled() { function audit_rejects_markdown_escape_links (line 686) | fn audit_rejects_markdown_escape_links() { function audit_rejects_high_risk_patterns (line 708) | fn audit_rejects_high_risk_patterns() { function audit_rejects_chained_commands_in_manifest (line 730) | fn audit_rejects_chained_commands_in_manifest() { function audit_allows_missing_cross_skill_reference_with_parent_dir (line 762) | fn audit_allows_missing_cross_skill_reference_with_parent_dir() { function audit_allows_missing_cross_skill_reference_with_bare_filename (line 780) | fn audit_allows_missing_cross_skill_reference_with_bare_filename() { function audit_allows_missing_cross_skill_reference_with_dot_slash (line 797) | fn audit_allows_missing_cross_skill_reference_with_dot_slash() { function audit_rejects_missing_local_markdown_file (line 814) | fn audit_rejects_missing_local_markdown_file() { function audit_allows_existing_cross_skill_reference (line 839) | fn audit_allows_existing_cross_skill_reference() { function is_cross_skill_reference_detection (line 862) | fn is_cross_skill_reference_detection() { FILE: src/skills/creator.rs type ToolCallRecord (line 15) | pub struct ToolCallRecord { type SkillCreator (line 21) | pub struct SkillCreator { method new (line 27) | pub fn new(workspace_dir: PathBuf, config: SkillCreationConfig) -> Self { method create_from_execution (line 37) | pub async fn create_from_execution( method generate_slug (line 84) | fn generate_slug(description: &str) -> String { method validate_slug (line 118) | fn validate_slug(slug: &str) -> bool { method generate_skill_toml (line 127) | fn generate_skill_toml(slug: &str, description: &str, tool_calls: &[To... method is_duplicate (line 165) | async fn is_duplicate( method enforce_lru_limit (line 206) | async fn enforce_lru_limit(&self) -> Result<()> { method skills_dir (line 249) | fn skills_dir(&self) -> PathBuf { function toml_escape (line 255) | fn toml_escape(s: &str) -> String { function extract_description_from_toml (line 266) | fn extract_description_from_toml(content: &str) -> Option { function extract_tool_calls_from_history (line 284) | pub fn extract_tool_calls_from_history( function slug_basic (line 374) | fn slug_basic() { function slug_special_characters (line 382) | fn slug_special_characters() { function slug_max_length (line 390) | fn slug_max_length() { function slug_leading_trailing_hyphens (line 397) | fn slug_leading_trailing_hyphens() { function slug_consecutive_spaces (line 404) | fn slug_consecutive_spaces() { function slug_empty_input (line 409) | fn slug_empty_input() { function slug_only_symbols (line 415) | fn slug_only_symbols() { function slug_unicode (line 421) | fn slug_unicode() { function validate_slug_valid (line 429) | fn validate_slug_valid() { function validate_slug_invalid (line 436) | fn validate_slug_invalid() { function toml_generation_valid_format (line 448) | fn toml_generation_valid_format() { function toml_generation_escapes_quotes (line 491) | fn toml_generation_escapes_quotes() { function toml_generation_no_command_arg (line 509) | fn toml_generation_no_command_arg() { function extract_description_from_valid_toml (line 527) | fn extract_description_from_valid_toml() { function extract_description_from_invalid_toml (line 541) | fn extract_description_from_invalid_toml() { type MockEmbeddingProvider (line 552) | struct MockEmbeddingProvider { method new (line 558) | fn new(similarity: f32) -> Self { method name (line 568) | fn name(&self) -> &str { method dimensions (line 571) | fn dimensions(&self) -> usize { method embed (line 574) | async fn embed(&self, texts: &[&str]) -> anyhow::Result>> { function dedup_skips_similar_descriptions (line 599) | async fn dedup_skips_similar_descriptions() { function lru_eviction_removes_oldest (line 643) | async fn lru_eviction_removes_oldest() { function create_from_execution_disabled (line 686) | async fn create_from_execution_disabled() { function create_from_execution_insufficient_steps (line 711) | async fn create_from_execution_insufficient_steps() { function create_from_execution_success (line 730) | async fn create_from_execution_success() { function create_from_execution_with_dedup (line 768) | async fn create_from_execution_with_dedup() { function extract_from_empty_history (line 815) | fn extract_from_empty_history() { function extract_from_user_messages_only (line 822) | fn extract_from_user_messages_only() { function slug_fuzz_various_inputs (line 832) | fn slug_fuzz_various_inputs() { function toml_fuzz_various_inputs (line 863) | fn toml_fuzz_various_inputs() { FILE: src/skills/mod.rs constant OPEN_SKILLS_REPO_URL (line 13) | const OPEN_SKILLS_REPO_URL: &str = "https://github.com/besoeasy/open-ski... constant OPEN_SKILLS_SYNC_MARKER (line 14) | const OPEN_SKILLS_SYNC_MARKER: &str = ".zeroclaw-open-skills-sync"; constant OPEN_SKILLS_SYNC_INTERVAL_SECS (line 15) | const OPEN_SKILLS_SYNC_INTERVAL_SECS: u64 = 60 * 60 * 24 * 7; type Skill (line 21) | pub struct Skill { type SkillTool (line 39) | pub struct SkillTool { type SkillManifest (line 52) | struct SkillManifest { type SkillMeta (line 61) | struct SkillMeta { type SkillMarkdownMeta (line 73) | struct SkillMarkdownMeta { function default_version (line 82) | fn default_version() -> String { function load_skills (line 87) | pub fn load_skills(workspace_dir: &Path) -> Vec { function load_skills_with_config (line 92) | pub fn load_skills_with_config(workspace_dir: &Path, config: &crate::con... function load_skills_with_open_skills_settings (line 102) | pub fn load_skills_with_open_skills_settings( function load_skills_with_open_skills_config (line 115) | fn load_skills_with_open_skills_config( function load_workspace_skills (line 134) | fn load_workspace_skills(workspace_dir: &Path, allow_scripts: bool) -> V... function load_skills_from_directory (line 139) | fn load_skills_from_directory(skills_dir: &Path, allow_scripts: bool) ->... function finalize_open_skill (line 196) | fn finalize_open_skill(mut skill: Skill) -> Skill { function load_open_skills_from_directory (line 206) | fn load_open_skills_from_directory(skills_dir: &Path, allow_scripts: boo... function load_open_skills (line 262) | fn load_open_skills(repo_dir: &Path, allow_scripts: bool) -> Vec { function parse_open_skills_enabled (line 326) | fn parse_open_skills_enabled(raw: &str) -> Option { function open_skills_enabled_from_sources (line 334) | fn open_skills_enabled_from_sources( function open_skills_enabled (line 352) | fn open_skills_enabled(config_open_skills_enabled: Option) -> bool { function resolve_open_skills_dir_from_sources (line 357) | fn resolve_open_skills_dir_from_sources( function resolve_open_skills_dir (line 380) | fn resolve_open_skills_dir(config_open_skills_dir: Option<&str>) -> Opti... function ensure_open_skills_repo (line 390) | fn ensure_open_skills_repo( function clone_open_skills_repo (line 422) | fn clone_open_skills_repo(repo_dir: &Path) -> bool { function pull_open_skills_repo (line 455) | fn pull_open_skills_repo(repo_dir: &Path) -> bool { function should_sync_open_skills (line 481) | fn should_sync_open_skills(repo_dir: &Path) -> bool { function mark_open_skills_synced (line 496) | fn mark_open_skills_synced(repo_dir: &Path) -> Result<()> { function load_skill_toml (line 502) | fn load_skill_toml(path: &Path) -> Result { function load_skill_md (line 519) | fn load_skill_md(path: &Path, dir: &Path) -> Result { function load_open_skill_md (line 544) | fn load_open_skill_md(path: &Path) -> Result { type ParsedSkillMarkdown (line 583) | struct ParsedSkillMarkdown { function parse_skill_markdown (line 588) | fn parse_skill_markdown(content: &str) -> ParsedSkillMarkdown { function split_skill_frontmatter (line 601) | fn split_skill_frontmatter(content: &str) -> Option<(String, String)> { function extract_description (line 615) | fn extract_description(content: &str) -> String { function append_xml_escaped (line 624) | fn append_xml_escaped(out: &mut String, text: &str) { function write_xml_text_element (line 637) | fn write_xml_text_element(out: &mut String, indent: usize, tag: &str, va... function resolve_skill_location (line 650) | fn resolve_skill_location(skill: &Skill, workspace_dir: &Path) -> PathBuf { function render_skill_location (line 659) | fn render_skill_location(skill: &Skill, workspace_dir: &Path, prefer_rel... function skills_to_prompt (line 670) | pub fn skills_to_prompt(skills: &[Skill], workspace_dir: &Path) -> String { function skills_to_prompt_with_mode (line 679) | pub fn skills_to_prompt_with_mode( function skills_dir (line 750) | pub fn skills_dir(workspace_dir: &Path) -> PathBuf { function init_skills_dir (line 755) | pub fn init_skills_dir(workspace_dir: &Path) -> Result<()> { function is_git_source (line 794) | fn is_git_source(source: &str) -> bool { function is_git_scheme_source (line 802) | fn is_git_scheme_source(source: &str, scheme: &str) -> bool { function is_git_scp_source (line 814) | fn is_git_scp_source(source: &str) -> bool { function snapshot_skill_children (line 838) | fn snapshot_skill_children(skills_path: &Path) -> Result Result<()> { function copy_dir_recursive_secure (line 895) | fn copy_dir_recursive_secure(src: &Path, dest: &Path) -> Result<()> { function install_local_skill_source (line 940) | fn install_local_skill_source( function install_git_skill_source (line 977) | fn install_git_skill_source( function handle_command (line 1005) | pub fn handle_command(command: crate::SkillCommands, config: &crate::con... function open_skills_env_lock (line 1157) | fn open_skills_env_lock() -> &'static Mutex<()> { type EnvVarGuard (line 1162) | struct EnvVarGuard { method unset (line 1168) | fn unset(key: &'static str) -> Self { method drop (line 1176) | fn drop(&mut self) { function load_empty_skills_dir (line 1186) | fn load_empty_skills_dir() { function load_skill_from_toml (line 1193) | fn load_skill_from_toml() { function load_skill_from_md (line 1225) | fn load_skill_from_md() { function load_skill_from_md_frontmatter_uses_metadata_and_body (line 1244) | fn load_skill_from_md_frontmatter_uses_metadata_and_body() { function skills_to_prompt_empty (line 1268) | fn skills_to_prompt_empty() { function skills_to_prompt_with_skills (line 1274) | fn skills_to_prompt_with_skills() { function skills_to_prompt_compact_mode_omits_instructions_but_keeps_tools (line 1292) | fn skills_to_prompt_compact_mode_omits_instructions_but_keeps_tools() { function init_skills_creates_readme (line 1329) | fn init_skills_creates_readme() { function init_skills_idempotent (line 1336) | fn init_skills_idempotent() { function load_nonexistent_dir (line 1344) | fn load_nonexistent_dir() { function load_ignores_files_in_skills_dir (line 1352) | fn load_ignores_files_in_skills_dir() { function load_ignores_dir_without_manifest (line 1363) | fn load_ignores_dir_without_manifest() { function load_multiple_skills (line 1374) | fn load_multiple_skills() { function toml_skill_with_multiple_tools (line 1393) | fn toml_skill_with_multiple_tools() { function toml_skill_minimal (line 1444) | fn toml_skill_minimal() { function toml_skill_invalid_syntax_skipped (line 1469) | fn toml_skill_invalid_syntax_skipped() { function md_skill_heading_only (line 1482) | fn md_skill_heading_only() { function skills_to_prompt_includes_tools (line 1496) | fn skills_to_prompt_includes_tools() { function skills_to_prompt_escapes_xml_content (line 1521) | fn skills_to_prompt_escapes_xml_content() { function git_source_detection_accepts_remote_protocols_and_scp_style (line 1542) | fn git_source_detection_accepts_remote_protocols_and_scp_style() { function git_source_detection_rejects_local_paths_and_invalid_inputs (line 1561) | fn git_source_detection_rejects_local_paths_and_invalid_inputs() { function skills_dir_path (line 1581) | fn skills_dir_path() { function toml_prefers_over_md (line 1588) | fn toml_prefers_over_md() { function open_skills_enabled_resolution_prefers_env_then_config_then_default_false (line 1607) | fn open_skills_enabled_resolution_prefers_env_then_config_then_default_f... function resolve_open_skills_dir_resolution_prefers_env_then_config_then_home (line 1624) | fn resolve_open_skills_dir_resolution_prefers_env_then_config_then_home() { function load_skills_with_config_reads_open_skills_dir_without_network (line 1650) | fn load_skills_with_config_reads_open_skills_dir_without_network() { function load_open_skill_md_frontmatter_uses_metadata_and_strips_block (line 1685) | fn load_open_skill_md_frontmatter_uses_metadata_and_strips_block() { FILE: src/skills/symlink_tests.rs function test_skills_symlink_unix_edge_cases (line 8) | async fn test_skills_symlink_unix_edge_cases() { function test_skills_symlink_permissions_and_safety (line 86) | async fn test_skills_symlink_permissions_and_safety() { FILE: src/sop/audit.rs constant SOP_CATEGORY (line 9) | const SOP_CATEGORY: &str = "sop"; type SopAuditLogger (line 16) | pub struct SopAuditLogger { method new (line 21) | pub fn new(memory: Arc) -> Self { method log_run_start (line 26) | pub async fn log_run_start(&self, run: &SopRun) -> Result<()> { method log_step_result (line 38) | pub async fn log_step_result(&self, run_id: &str, result: &SopStepResu... method log_run_complete (line 46) | pub async fn log_run_complete(&self, run: &SopRun) -> Result<()> { method log_approval (line 58) | pub async fn log_approval(&self, run: &SopRun, step_number: u32) -> Re... method log_timeout_auto_approve (line 70) | pub async fn log_timeout_auto_approve(&self, run: &SopRun, step_number... method log_gate_decision (line 83) | pub async fn log_gate_decision( method log_phase_state (line 101) | pub async fn log_phase_state(&self, state: &ersona_core::state::Pha... method get_run (line 109) | pub async fn get_run(&self, run_id: &str) -> Result> { method list_runs (line 124) | pub async fn list_runs(&self) -> Result> { function run_key (line 135) | fn run_key(run_id: &str) -> String { function step_key (line 139) | fn step_key(run_id: &str, step_number: u32) -> String { function category (line 143) | fn category() -> MemoryCategory { function test_run (line 152) | fn test_run() -> SopRun { function test_step_result (line 172) | fn test_step_result(n: u32) -> SopStepResult { function audit_roundtrip (line 183) | async fn audit_roundtrip() { function log_approval_persists_entry (line 221) | async fn log_approval_persists_entry() { function log_timeout_auto_approve_persists_entry (line 244) | async fn log_timeout_auto_approve_persists_entry() { function get_nonexistent_run_returns_none (line 267) | async fn get_nonexistent_run_returns_none() { FILE: src/sop/condition.rs function evaluate_condition (line 16) | pub fn evaluate_condition(condition: &str, payload: Option<&str>) -> bool { function evaluate_json_path_condition (line 37) | fn evaluate_json_path_condition(path_and_op: &str, payload: &str) -> bool { function evaluate_direct_condition (line 59) | fn evaluate_direct_condition(condition: &str, payload: &str) -> bool { constant OPERATORS (line 82) | const OPERATORS: &[&str] = &[">=", "<=", "!=", "==", ">", "<"]; function parse_path_op_value (line 85) | fn parse_path_op_value(input: &str) -> Option<(Vec<&str>, Op, String)> { function parse_op_value (line 111) | fn parse_op_value(input: &str) -> Option<(Op, String)> { function resolve_json_path (line 127) | fn resolve_json_path<'a>(value: &'a Value, segments: &[&str]) -> Option<... type Op (line 150) | enum Op { method from_str (line 160) | fn from_str(s: &str) -> Option { function compare_values (line 174) | fn compare_values(extracted: &Value, op: Op, comparand: &str) -> bool { function value_as_f64 (line 200) | fn value_as_f64(v: &Value) -> Option { function value_as_string (line 208) | fn value_as_string(v: &Value) -> String { function apply_op_f64 (line 217) | fn apply_op_f64(lhs: f64, op: Op, rhs: f64) -> bool { function empty_condition_matches (line 235) | fn empty_condition_matches() { function missing_payload_fails_closed (line 241) | fn missing_payload_fails_closed() { function json_path_gt (line 249) | fn json_path_gt() { function json_path_gte (line 256) | fn json_path_gte() { function json_path_lt (line 263) | fn json_path_lt() { function json_path_lte (line 270) | fn json_path_lte() { function json_path_eq (line 277) | fn json_path_eq() { function json_path_neq (line 290) | fn json_path_neq() { function json_path_numeric_eq (line 297) | fn json_path_numeric_eq() { function json_nested_path (line 304) | fn json_nested_path() { function json_path_missing_key (line 317) | fn json_path_missing_key() { function json_invalid_payload (line 323) | fn json_invalid_payload() { function json_path_array_index (line 328) | fn json_path_array_index() { function json_path_bool_value (line 334) | fn json_path_bool_value() { function direct_gt (line 342) | fn direct_gt() { function direct_gte (line 349) | fn direct_gte() { function direct_lt (line 356) | fn direct_lt() { function direct_eq (line 362) | fn direct_eq() { function direct_neq (line 368) | fn direct_neq() { function direct_non_numeric_payload (line 374) | fn direct_non_numeric_payload() { function direct_float_comparison (line 379) | fn direct_float_comparison() { function parse_op_value_basic (line 387) | fn parse_op_value_basic() { function parse_op_value_gte_not_gt (line 394) | fn parse_op_value_gte_not_gt() { function parse_op_value_no_value (line 401) | fn parse_op_value_no_value() { function parse_path_op_value_basic (line 407) | fn parse_path_op_value_basic() { function parse_path_op_value_nested (line 415) | fn parse_path_op_value_nested() { function parse_path_op_value_string_comparand (line 423) | fn parse_path_op_value_string_comparand() { function resolve_path_simple (line 433) | fn resolve_path_simple() { function resolve_path_nested (line 440) | fn resolve_path_nested() { function resolve_path_missing (line 447) | fn resolve_path_missing() { FILE: src/sop/dispatch.rs type DispatchResult (line 19) | pub enum DispatchResult { function extract_run_id_from_action (line 38) | fn extract_run_id_from_action(action: &SopRunAction) -> &str { function action_label (line 48) | fn action_label(action: &SopRunAction) -> &'static str { function dispatch_sop_event (line 66) | pub async fn dispatch_sop_event( function process_headless_results (line 161) | pub async fn process_headless_results(results: &[DispatchResult]) { function dispatch_peripheral_signal (line 206) | pub async fn dispatch_peripheral_signal( type SopCronCache (line 229) | pub struct SopCronCache { method from_engine (line 239) | pub fn from_engine(engine: &Arc>) -> Self { method schedules (line 284) | pub fn schedules(&self) -> &[(String, String, cron::Schedule)] { function check_sop_cron_triggers (line 293) | pub async fn check_sop_cron_triggers( function test_sop (line 338) | fn test_sop(name: &str, triggers: Vec) -> Sop { function test_engine (line 359) | fn test_engine(sops: Vec) -> Arc> { function test_audit (line 365) | fn test_audit() -> SopAuditLogger { function dispatch_starts_matching_sop (line 379) | async fn dispatch_starts_matching_sop() { function dispatch_skips_when_cooldown_active (line 404) | async fn dispatch_skips_when_cooldown_active() { function dispatch_returns_no_match_for_unknown_event (line 455) | async fn dispatch_returns_no_match_for_unknown_event() { function dispatch_batch_lock_starts_multiple_sops (line 472) | async fn dispatch_batch_lock_starts_multiple_sops() { function dispatch_captures_action_for_wait_approval (line 506) | async fn dispatch_captures_action_for_wait_approval() { function dispatch_captures_action_for_execute_step (line 548) | async fn dispatch_captures_action_for_execute_step() { function peripheral_signal_dispatches_to_matching_sop (line 574) | async fn peripheral_signal_dispatches_to_matching_sop() { function peripheral_signal_no_match_returns_empty (line 594) | async fn peripheral_signal_no_match_returns_empty() { function cron_cache_skips_invalid_expression (line 611) | fn cron_cache_skips_invalid_expression() { function cron_cache_parses_valid_expression (line 624) | fn cron_cache_parses_valid_expression() { function cron_sop_trigger_fires_on_schedule (line 639) | async fn cron_sop_trigger_fires_on_schedule() { function cron_sop_only_matching_expression_fires (line 662) | async fn cron_sop_only_matching_expression_fires() { function cron_sop_window_check_does_not_miss_tick (line 697) | async fn cron_sop_window_check_does_not_miss_tick() { FILE: src/sop/engine.rs type SopEngine (line 17) | pub struct SopEngine { method new (line 28) | pub fn new(config: SopConfig) -> Self { method reload (line 39) | pub fn reload(&mut self, workspace_dir: &Path) { method sops (line 49) | pub fn sops(&self) -> &[Sop] { method active_runs (line 54) | pub fn active_runs(&self) -> &HashMap { method get_run (line 59) | pub fn get_run(&self, run_id: &str) -> Option<&SopRun> { method get_sop (line 66) | pub fn get_sop(&self, name: &str) -> Option<&Sop> { method match_trigger (line 74) | pub fn match_trigger(&self, event: &SopEvent) -> Vec<&Sop> { method can_start (line 85) | pub fn can_start(&self, sop_name: &str) -> bool { method start_run (line 121) | pub fn start_run(&mut self, sop_name: &str, event: SopEvent) -> Result... method advance_step (line 181) | pub fn advance_step(&mut self, run_id: &str, result: SopStepResult) ->... method cancel_run (line 234) | pub fn cancel_run(&mut self, run_id: &str) -> Result<()> { method approve_step (line 244) | pub fn approve_step(&mut self, run_id: &str) -> Result { method finished_runs (line 279) | pub fn finished_runs(&self, sop_name: Option<&str>) -> Vec<&SopRun> { method check_approval_timeouts (line 291) | pub fn check_approval_timeouts(&mut self) -> Vec { method set_sops_for_test (line 343) | pub(crate) fn set_sops_for_test(&mut self, sops: Vec) { method last_finished_run (line 349) | fn last_finished_run(&self, sop_name: &str) -> Option<&SopRun> { method finish_run (line 356) | fn finish_run( function trigger_matches (line 393) | fn trigger_matches(trigger: &SopTrigger, event: &SopEvent) -> bool { function mqtt_topic_matches (line 447) | fn mqtt_topic_matches(pattern: &str, topic: &str) -> bool { function resolve_step_action (line 479) | fn resolve_step_action(sop: &Sop, step: &SopStep, run_id: String, contex... function format_step_context (line 525) | fn format_step_context(sop: &Sop, run: &SopRun, step: &SopStep) -> String { function now_iso8601 (line 568) | pub(crate) fn now_iso8601() -> String { function days_to_ymd (line 587) | fn days_to_ymd(mut days: u64) -> (u64, u64, u64) { function cooldown_elapsed (line 603) | fn cooldown_elapsed(completed_at: &str, cooldown_secs: u64) -> bool { function parse_iso8601_secs (line 618) | fn parse_iso8601_secs(input: &str) -> Option { function manual_event (line 650) | fn manual_event() -> SopEvent { function mqtt_event (line 659) | fn mqtt_event(topic: &str, payload: &str) -> SopEvent { function test_sop (line 668) | fn test_sop(name: &str, mode: SopExecutionMode, priority: SopPriority) -... function engine_with_sops (line 698) | fn engine_with_sops(sops: Vec) -> SopEngine { function extract_run_id (line 705) | fn extract_run_id(action: &SopRunAction) -> &str { function first_active_run_id (line 715) | fn first_active_run_id(engine: &SopEngine) -> String { function match_manual_trigger (line 727) | fn match_manual_trigger() { function no_match_for_wrong_source (line 739) | fn no_match_for_wrong_source() { function match_mqtt_trigger_exact (line 751) | fn match_mqtt_trigger_exact() { function match_mqtt_wildcard_plus (line 769) | fn match_mqtt_wildcard_plus() { function match_mqtt_wildcard_hash (line 790) | fn match_mqtt_wildcard_hash() { function mqtt_topic_matching_edge_cases (line 814) | fn mqtt_topic_matching_edge_cases() { function webhook_trigger_matches_exact_path (line 829) | fn webhook_trigger_matches_exact_path() { function webhook_trigger_rejects_different_path (line 849) | fn webhook_trigger_rejects_different_path() { function cron_trigger_matches_only_matching_expression (line 880) | fn cron_trigger_matches_only_matching_expression() { function mqtt_condition_filters_by_payload (line 920) | fn mqtt_condition_filters_by_payload() { function mqtt_no_condition_matches_any_payload (line 940) | fn mqtt_no_condition_matches_any_payload() { function mqtt_condition_no_payload_fails_closed (line 955) | fn mqtt_condition_no_payload_fails_closed() { function peripheral_condition_filters_by_payload (line 976) | fn peripheral_condition_filters_by_payload() { function peripheral_no_condition_matches_any (line 1007) | fn peripheral_no_condition_matches_any() { function start_run_returns_first_step (line 1030) | fn start_run_returns_first_step() { function start_run_unknown_sop_fails (line 1044) | fn start_run_unknown_sop_fails() { function advance_step_to_completion (line 1050) | fn advance_step_to_completion() { function step_failure_ends_run (line 1096) | fn step_failure_ends_run() { function cancel_run (line 1125) | fn cancel_run() { function cancel_unknown_run_fails (line 1140) | fn cancel_unknown_run_fails() { function per_sop_concurrency_limit (line 1148) | fn per_sop_concurrency_limit() { function global_concurrency_limit (line 1161) | fn global_concurrency_limit() { function cooldown_blocks_immediate_restart (line 1179) | fn cooldown_blocks_immediate_restart() { function auto_mode_executes_immediately (line 1219) | fn auto_mode_executes_immediately() { function supervised_mode_waits_on_first_step (line 1230) | fn supervised_mode_waits_on_first_step() { function step_by_step_waits_on_every_step (line 1241) | fn step_by_step_waits_on_every_step() { function priority_based_critical_auto (line 1274) | fn priority_based_critical_auto() { function priority_based_normal_supervised (line 1285) | fn priority_based_normal_supervised() { function requires_confirmation_overrides_auto (line 1297) | fn requires_confirmation_overrides_auto() { function approve_transitions_to_execute (line 1309) | fn approve_transitions_to_execute() { function approve_non_waiting_fails (line 1331) | fn approve_non_waiting_fails() { function step_context_includes_sop_name_and_step (line 1345) | fn step_context_includes_sop_name_and_step() { function get_run_finds_active_and_finished (line 1372) | fn get_run_finds_active_and_finished() { function iso8601_roundtrip (line 1428) | fn iso8601_roundtrip() { function parse_known_timestamp (line 1441) | fn parse_known_timestamp() { function timeout_auto_approves_critical (line 1451) | fn timeout_auto_approves_critical() { function timeout_does_not_auto_approve_normal (line 1475) | fn timeout_does_not_auto_approve_normal() { function timeout_zero_disables_check (line 1504) | fn timeout_zero_disables_check() { function waiting_since_set_on_wait_approval (line 1525) | fn waiting_since_set_on_wait_approval() { function max_finished_runs_evicts_oldest (line 1542) | fn max_finished_runs_evicts_oldest() { function max_finished_runs_zero_means_unlimited (line 1586) | fn max_finished_runs_zero_means_unlimited() { function waiting_since_cleared_on_approve (line 1617) | fn waiting_since_cleared_on_approve() { FILE: src/sop/gates.rs constant PHASE_STATE_KEY (line 25) | const PHASE_STATE_KEY: &str = "sop_phase_state"; function sop_category (line 27) | fn sop_category() -> MemoryCategory { type GateEvalInner (line 33) | struct GateEvalInner { type GateEvalState (line 44) | pub struct GateEvalState { method new (line 53) | pub fn new( method with_state (line 71) | pub fn with_state( method load_gates_from_file (line 92) | pub fn load_gates_from_file(path: &Path) -> Vec { method rebuild_from_memory (line 117) | pub async fn rebuild_from_memory( method tick (line 151) | pub fn tick(&self, metrics: &dyn MetricsProvider) -> Option Result<()> { method phase_state_snapshot (line 211) | pub fn phase_state_snapshot(&self) -> Option { method gate_count (line 216) | pub fn gate_count(&self) -> usize { function apply_decision (line 223) | fn apply_decision(state: &mut PhaseState, record: &GateDecisionRecord) { type MockMetrics (line 281) | struct MockMetrics { method new (line 286) | fn new(values: Vec<(&str, serde_json::Value)>) -> Self { method get_metric (line 297) | fn get_metric(&self, query: &MetricQuery) -> Result Arc { function tick_no_gates_returns_none (line 351) | fn tick_no_gates_returns_none() { function tick_with_passing_gate_returns_decision (line 364) | fn tick_with_passing_gate_returns_decision() { function tick_transition_advances_phase (line 387) | fn tick_transition_advances_phase() { function tick_observed_no_state_change (line 411) | fn tick_observed_no_state_change() { function tick_pending_human_sets_pending (line 437) | fn tick_pending_human_sets_pending() { function load_gates_missing_file_returns_empty (line 463) | fn load_gates_missing_file_returns_empty() { function load_gates_valid_persona (line 469) | fn load_gates_valid_persona() { function load_gates_no_gates_key_returns_empty (line 490) | fn load_gates_no_gates_key_returns_empty() { function load_gates_invalid_json_returns_empty (line 499) | fn load_gates_invalid_json_returns_empty() { function warm_start_roundtrip (line 508) | async fn warm_start_roundtrip() { function warm_start_empty_memory (line 554) | async fn warm_start_empty_memory() { function demote_priority_over_promote (line 566) | fn demote_priority_over_promote() { function idempotent_tick_after_apply (line 605) | fn idempotent_tick_after_apply() { function gate_tick_with_real_collector (line 636) | fn gate_tick_with_real_collector() { function tick_respects_interval (line 689) | fn tick_respects_interval() { function ampersona_decision_strings_stable (line 711) | fn ampersona_decision_strings_stable() { FILE: src/sop/metrics.rs constant MAX_RECENT_RUNS (line 15) | const MAX_RECENT_RUNS: usize = 1000; constant PENDING_EVICT_SECS (line 18) | const PENDING_EVICT_SECS: u64 = 3600; type MetricCounters (line 26) | struct MetricCounters { type RunSnapshot (line 45) | struct RunSnapshot { type SopCounters (line 60) | struct SopCounters { type CollectorState (line 68) | struct CollectorState { type SopMetricsCollector (line 83) | pub struct SopMetricsCollector { method new (line 89) | pub fn new() -> Self { method record_run_complete (line 100) | pub fn record_run_complete(&self, run: &SopRun) { method record_approval (line 135) | pub fn record_approval(&self, sop_name: &str, run_id: &str) { method record_timeout_auto_approve (line 158) | pub fn record_timeout_auto_approve(&self, sop_name: &str, run_id: &str) { method rebuild_from_memory (line 189) | pub async fn rebuild_from_memory(memory: &dyn Memory) -> anyhow::Resul... method get_metric_value (line 296) | pub fn get_metric_value(&self, name: &str) -> Option { method get_metric_value_windowed (line 341) | pub fn get_metric_value_windowed( method snapshot (line 390) | pub fn snapshot(&self) -> serde_json::Value { method get_metric (line 420) | fn get_metric( method default (line 411) | fn default() -> Self { function build_snapshot (line 446) | fn build_snapshot(run: &SopRun, human_count: u64, timeout_count: u64) ->... function apply_run (line 477) | fn apply_run(sop: &mut SopCounters, snap: &RunSnapshot) { function parse_completed_at (line 496) | fn parse_completed_at(ts: &str) -> Option> { function aggregate_windowed (line 511) | fn aggregate_windowed( function resolve_metric (line 536) | fn resolve_metric(sop: &SopCounters, suffix: &str) -> Option Option serde_json::Value { function make_event (line 624) | fn make_event() -> SopEvent { function make_run (line 633) | fn make_run( function make_step (line 654) | fn make_step(number: u32, status: SopStepStatus) -> SopStepResult { function zero_state_baseline (line 665) | fn zero_state_baseline() { function counter_arithmetic (line 675) | fn counter_arithmetic() { function windowed_filtering (line 697) | fn windowed_filtering() { function deviation_rate_zero_steps (line 726) | fn deviation_rate_zero_steps() { function protocol_adherence_rate_partial_run (line 734) | fn protocol_adherence_rate_partial_run() { function protocol_adherence_rate_full_run (line 758) | fn protocol_adherence_rate_full_run() { function protocol_adherence_rate_failed_run (line 781) | fn protocol_adherence_rate_failed_run() { function derived_rate_metrics (line 806) | fn derived_rate_metrics() { function per_sop_lookup (line 848) | fn per_sop_lookup() { function longest_match_disambiguation (line 873) | fn longest_match_disambiguation() { function not_found_for_unknown_metric (line 906) | fn not_found_for_unknown_metric() { function approval_flag_propagation (line 914) | fn approval_flag_propagation() { function pending_approval_stale_eviction (line 941) | fn pending_approval_stale_eviction() { function snapshot_diagnostic_output (line 967) | fn snapshot_diagnostic_output() { function runs_cancelled_tracking (line 987) | fn runs_cancelled_tracking() { function multiple_approvals_per_run_consistent (line 1010) | fn multiple_approvals_per_run_consistent() { function ring_buffer_overflow_cap (line 1052) | fn ring_buffer_overflow_cap() { function windowed_excludes_old_runs (line 1085) | fn windowed_excludes_old_runs() { function sop_name_matching_metric_suffix_resolves_global (line 1123) | fn sop_name_matching_metric_suffix_resolves_global() { function metrics_provider_get_metric (line 1148) | fn metrics_provider_get_metric() { function warm_start_roundtrip (line 1184) | async fn warm_start_roundtrip() { function warm_start_skips_running_runs (line 1227) | async fn warm_start_skips_running_runs() { function warm_start_empty_memory (line 1262) | async fn warm_start_empty_memory() { function warm_start_approval_matching (line 1282) | async fn warm_start_approval_matching() { function warm_start_preserves_pending_for_nonterminal_runs (line 1322) | async fn warm_start_preserves_pending_for_nonterminal_runs() { function get_metric_windowed_7d_matches_suffix (line 1391) | fn get_metric_windowed_7d_matches_suffix() { function get_metric_windowed_custom_duration (line 1414) | fn get_metric_windowed_custom_duration() { function get_metric_provider_window_propagation (line 1467) | fn get_metric_provider_window_propagation() { FILE: src/sop/mod.rs function sops_dir (line 30) | fn sops_dir(workspace_dir: &Path) -> PathBuf { function resolve_sops_dir (line 35) | pub fn resolve_sops_dir(workspace_dir: &Path, config_dir: Option<&str>) ... function load_sops (line 48) | pub fn load_sops( function load_sops_from_directory (line 59) | fn load_sops_from_directory(sops_dir: &Path, default_execution_mode: Sop... function load_sop (line 94) | fn load_sop(sop_dir: &Path, default_execution_mode: SopExecutionMode) ->... function parse_steps (line 138) | pub fn parse_steps(md: &str) -> Vec { function flush_step (line 253) | fn flush_step( function parse_numbered_item (line 275) | fn parse_numbered_item(line: &str) -> Option<&str> { function extract_bold_title (line 286) | fn extract_bold_title(text: &str) -> Option<(String, String)> { function validate_sop (line 308) | pub fn validate_sop(sop: &Sop) -> Vec { function handle_command (line 344) | pub fn handle_command(command: crate::SopCommands, config: &crate::confi... function parse_steps_basic (line 510) | fn parse_steps_basic() { function parse_steps_empty_md (line 548) | fn parse_steps_empty_md() { function parse_steps_no_bold_title (line 554) | fn parse_steps_no_bold_title() { function parse_steps_multiline_body (line 562) | fn parse_steps_multiline_body() { function load_sop_from_directory (line 578) | fn load_sop_from_directory() { function load_sops_empty_dir (line 634) | fn load_sops_empty_dir() { function load_sops_nonexistent_dir (line 641) | fn load_sops_nonexistent_dir() { function load_sop_toml_only_no_md (line 648) | fn load_sop_toml_only_no_md() { function load_sop_uses_config_default_execution_mode_when_omitted (line 672) | fn load_sop_uses_config_default_execution_mode_when_omitted() { function validate_sop_warnings (line 696) | fn validate_sop_warnings() { function validate_sop_clean (line 718) | fn validate_sop_clean() { function resolve_sops_dir_default (line 743) | fn resolve_sops_dir_default() { function resolve_sops_dir_override (line 750) | fn resolve_sops_dir_override() { function extract_bold_title_with_dash (line 757) | fn extract_bold_title_with_dash() { function extract_bold_title_no_separator (line 764) | fn extract_bold_title_no_separator() { function extract_bold_title_none (line 771) | fn extract_bold_title_none() { function parse_all_trigger_types (line 776) | fn parse_all_trigger_types() { FILE: src/sop/types.rs type SopPriority (line 11) | pub enum SopPriority { method fmt (line 20) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { type SopExecutionMode (line 35) | pub enum SopExecutionMode { method fmt (line 48) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { type SopTrigger (line 63) | pub enum SopTrigger { method fmt (line 85) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { type SopStep (line 100) | pub struct SopStep { type Sop (line 114) | pub struct Sop { function default_cooldown_secs (line 130) | fn default_cooldown_secs() -> u64 { function default_max_concurrent (line 134) | fn default_max_concurrent() -> u32 { type SopManifest (line 142) | pub(crate) struct SopManifest { type SopMeta (line 150) | pub(crate) struct SopMeta { function default_sop_version (line 165) | fn default_sop_version() -> String { type SopTriggerSource (line 174) | pub enum SopTriggerSource { method fmt (line 183) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { type SopEvent (line 196) | pub struct SopEvent { type SopRunStatus (line 213) | pub enum SopRunStatus { method fmt (line 223) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { type SopStepStatus (line 238) | pub enum SopStepStatus { method fmt (line 245) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { type SopStepResult (line 256) | pub struct SopStepResult { type SopRun (line 266) | pub struct SopRun { type SopRunAction (line 283) | pub enum SopRunAction { function priority_display (line 311) | fn priority_display() { function execution_mode_display (line 317) | fn execution_mode_display() { function trigger_display (line 326) | fn trigger_display() { function priority_serde_roundtrip (line 338) | fn priority_serde_roundtrip() { function execution_mode_serde_roundtrip (line 346) | fn execution_mode_serde_roundtrip() { function trigger_toml_roundtrip (line 354) | fn trigger_toml_roundtrip() { function trigger_manual_toml (line 367) | fn trigger_manual_toml() { function run_status_display (line 374) | fn run_status_display() { function step_defaults (line 382) | fn step_defaults() { function manifest_parse (line 391) | fn manifest_parse() { function trigger_source_display (line 412) | fn trigger_source_display() { function step_status_display (line 418) | fn step_status_display() { function sop_event_serde_roundtrip (line 425) | fn sop_event_serde_roundtrip() { function sop_run_serde_roundtrip (line 439) | fn sop_run_serde_roundtrip() { FILE: src/tools/backup_tool.rs type BackupTool (line 11) | pub struct BackupTool { method new (line 18) | pub fn new(workspace_dir: PathBuf, include_dirs: Vec, max_keep... method backups_dir (line 26) | fn backups_dir(&self) -> PathBuf { method cmd_create (line 30) | async fn cmd_create(&self) -> anyhow::Result { method enforce_max_keep (line 63) | async fn enforce_max_keep(&self) -> anyhow::Result<()> { method list_backup_dirs (line 74) | async fn list_backup_dirs(&self) -> anyhow::Result> { method cmd_list (line 92) | async fn cmd_list(&self) -> anyhow::Result { method cmd_verify (line 127) | async fn cmd_verify(&self, backup_name: &str) -> anyhow::Result anyho... method name (line 229) | fn name(&self) -> &str { method description (line 233) | fn description(&self) -> &str { method parameters_schema (line 237) | fn parameters_schema(&self) -> serde_json::Value { method execute (line 259) | async fn execute(&self, args: serde_json::Value) -> anyhow::Result anyhow::Result<()> { function compute_checksums (line 318) | async fn compute_checksums(dir: &Path) -> anyhow::Result BackupTool { function create_backup_produces_manifest (line 366) | async fn create_backup_produces_manifest() { function verify_backup_detects_corruption (line 391) | async fn verify_backup_detects_corruption() { function restore_requires_confirmation (line 416) | async fn restore_requires_confirmation() { function list_backups_sorted_newest_first (line 447) | async fn list_backups_sorted_newest_first() { FILE: src/tools/browser.rs type ComputerUseConfig (line 23) | pub struct ComputerUseConfig { method fmt (line 34) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { method default (line 47) | fn default() -> Self { type BrowserTool (line 61) | pub struct BrowserTool { method new (line 200) | pub fn new( method new_with_backend (line 218) | pub fn new_with_backend( method is_agent_browser_available (line 243) | pub async fn is_agent_browser_available() -> bool { method is_available (line 255) | pub async fn is_available() -> bool { method configured_backend (line 259) | fn configured_backend(&self) -> anyhow::Result { method rust_native_compiled (line 263) | fn rust_native_compiled() -> bool { method rust_native_available (line 267) | fn rust_native_available(&self) -> bool { method computer_use_endpoint_url (line 282) | fn computer_use_endpoint_url(&self) -> anyhow::Result { method computer_use_available (line 323) | fn computer_use_available(&self) -> anyhow::Result { method resolve_backend (line 328) | async fn resolve_backend(&self) -> anyhow::Result { method validate_url (line 402) | fn validate_url(&self, url: &str) -> anyhow::Result<()> { method run_command (line 440) | async fn run_command(&self, args: &[&str]) -> anyhow::Result)... method read_required_i64 (line 702) | fn read_required_i64( method validate_computer_use_action (line 713) | fn validate_computer_use_action( method execute_computer_use_action (line 747) | async fn execute_computer_use_action( method execute_action (line 860) | async fn execute_action( method to_result (line 875) | fn to_result(&self, resp: AgentBrowserResponse) -> anyhow::Result anyhow::Result { method as_str (line 103) | fn as_str(self) -> &'static str { type ResolvedBackend (line 83) | enum ResolvedBackend { type AgentBrowserResponse (line 115) | struct AgentBrowserResponse { type ComputerUseResponse (line 123) | struct ComputerUseResponse { type BrowserAction (line 135) | pub enum BrowserAction { method name (line 898) | fn name(&self) -> &str { method description (line 902) | fn description(&self) -> &str { method parameters_schema (line 911) | fn parameters_schema(&self) -> Value { method execute (line 1025) | async fn execute(&self, args: Value) -> anyhow::Result { type NativeBrowserState (line 1108) | pub struct NativeBrowserState { method is_available (line 1113) | pub fn is_available( method execute_action (line 1122) | pub async fn execute_action( method reset_session (line 1445) | pub async fn reset_session(&mut self) { method ensure_session (line 1451) | async fn ensure_session( method active_client (line 1515) | fn active_client(&self) -> Result<&Client> { function webdriver_endpoint_reachable (line 1522) | fn webdriver_endpoint_reachable(webdriver_url: &str, timeout: Duration) ... function selector_for_find (line 1551) | fn selector_for_find(by: &str, value: &str) -> String { function wait_for_selector (line 1562) | async fn wait_for_selector(client: &Client, selector: &str) -> Result<()> { function find_element (line 1582) | async fn find_element( function hover_element (line 1599) | async fn hover_element(client: &Client, element: &fantoccini::elements::... function element_checked (line 1615) | async fn element_checked(element: &fantoccini::elements::Element) -> Res... type SelectorKind (line 1625) | enum SelectorKind { function parse_selector (line 1630) | fn parse_selector(selector: &str) -> SelectorKind { function css_attr_escape (line 1651) | fn css_attr_escape(input: &str) -> String { function xpath_contains_text (line 1658) | fn xpath_contains_text(text: &str) -> String { function xpath_literal (line 1662) | fn xpath_literal(input: &str) -> String { function webdriver_key (line 1688) | fn webdriver_key(key: &str) -> String { function snapshot_script (line 1709) | fn snapshot_script(interactive_only: bool, compact: bool, depth: Option<... function parse_browser_action (line 1784) | fn parse_browser_action(action_str: &str, args: &Value) -> anyhow::Resul... function is_supported_browser_action (line 1938) | fn is_supported_browser_action(action: &str) -> bool { function is_computer_use_only_action (line 1966) | fn is_computer_use_only_action(action: &str) -> bool { function backend_name (line 1973) | fn backend_name(backend: ResolvedBackend) -> &'static str { function unavailable_action_for_backend_error (line 1981) | fn unavailable_action_for_backend_error(action: &str, backend: ResolvedB... function is_recoverable_rust_native_error (line 1988) | fn is_recoverable_rust_native_error(err: &anyhow::Error) -> bool { function normalize_domains (line 2003) | fn normalize_domains(domains: Vec) -> Vec { function endpoint_reachable (line 2011) | fn endpoint_reachable(endpoint: &reqwest::Url, timeout: Duration) -> bool { function extract_host (line 2035) | fn extract_host(url_str: &str) -> anyhow::Result { function is_private_host (line 2062) | fn is_private_host(host: &str) -> bool { function is_non_global_v4 (line 2094) | fn is_non_global_v4(v4: std::net::Ipv4Addr) -> bool { function is_non_global_v6 (line 2115) | fn is_non_global_v6(v6: std::net::Ipv6Addr) -> bool { function is_service_environment (line 2131) | fn is_service_environment() -> bool { function ensure_browser_env (line 2151) | fn ensure_browser_env(cmd: &mut Command) { function host_matches_allowlist (line 2166) | fn host_matches_allowlist(host: &str, allowed: &[String]) -> bool { function normalize_domains_works (line 2187) | fn normalize_domains_works() { function extract_host_works (line 2198) | fn extract_host_works() { function extract_host_handles_ipv6 (line 2210) | fn extract_host_handles_ipv6() { function is_private_host_detects_local (line 2223) | fn is_private_host_detects_local() { function is_private_host_blocks_multicast_and_reserved (line 2235) | fn is_private_host_blocks_multicast_and_reserved() { function is_private_host_catches_ipv6 (line 2247) | fn is_private_host_catches_ipv6() { function is_private_host_catches_mapped_ipv4 (line 2254) | fn is_private_host_catches_mapped_ipv4() { function is_private_host_catches_ipv6_private_ranges (line 2262) | fn is_private_host_catches_ipv6_private_ranges() { function validate_url_blocks_ipv6_ssrf (line 2273) | fn validate_url_blocks_ipv6_ssrf() { function host_matches_allowlist_exact (line 2284) | fn host_matches_allowlist_exact() { function host_matches_allowlist_wildcard (line 2292) | fn host_matches_allowlist_wildcard() { function host_matches_allowlist_star (line 2300) | fn host_matches_allowlist_star() { function browser_backend_parser_accepts_supported_values (line 2307) | fn browser_backend_parser_accepts_supported_values() { function browser_backend_parser_rejects_unknown_values (line 2327) | fn browser_backend_parser_rejects_unknown_values() { function browser_tool_default_backend_is_agent_browser (line 2332) | fn browser_tool_default_backend_is_agent_browser() { function browser_tool_accepts_auto_backend_config (line 2342) | fn browser_tool_accepts_auto_backend_config() { function browser_tool_accepts_computer_use_backend_config (line 2358) | fn browser_tool_accepts_computer_use_backend_config() { function computer_use_endpoint_rejects_public_http_by_default (line 2377) | fn computer_use_endpoint_rejects_public_http_by_default() { function computer_use_endpoint_requires_https_for_public_remote (line 2397) | fn computer_use_endpoint_requires_https_for_public_remote() { function computer_use_coordinate_validation_applies_limits (line 2418) | fn computer_use_coordinate_validation_applies_limits() { function browser_tool_name (line 2447) | fn browser_tool_name() { function browser_tool_validates_url (line 2454) | fn browser_tool_validates_url() { function browser_tool_empty_allowlist_blocks (line 2477) | fn browser_tool_empty_allowlist_blocks() { function computer_use_only_action_detection_is_correct (line 2484) | fn computer_use_only_action_detection_is_correct() { function unavailable_action_error_preserves_backend_context (line 2496) | fn unavailable_action_error_preserves_backend_context() { function recoverable_error_detection_matches_session_patterns (line 2508) | fn recoverable_error_detection_matches_session_patterns() { function non_recoverable_error_detection_rejects_policy_errors (line 2527) | fn non_recoverable_error_detection_rejects_policy_errors() { function reset_session_is_idempotent_without_client (line 2540) | fn reset_session_is_idempotent_without_client() { function ensure_browser_env_sets_home_when_missing (line 2549) | fn ensure_browser_env_sets_home_when_missing() { function ensure_browser_env_sets_chromium_flags (line 2563) | fn ensure_browser_env_sets_chromium_flags() { function is_service_environment_detects_invocation_id (line 2576) | fn is_service_environment_detects_invocation_id() { function is_service_environment_detects_journal_stream (line 2590) | fn is_service_environment_detects_journal_stream() { function is_service_environment_false_in_normal_context (line 2604) | fn is_service_environment_false_in_normal_context() { FILE: src/tools/browser_delegate.rs type BrowserDelegateConfig (line 24) | pub struct BrowserDelegateConfig { function default_browser_cli (line 46) | fn default_browser_cli() -> String { function default_browser_task_timeout (line 51) | fn default_browser_task_timeout() -> u64 { method default (line 56) | fn default() -> Self { type BrowserDelegateTool (line 69) | pub struct BrowserDelegateTool { method new (line 76) | pub fn new(security: Arc, config: BrowserDelegateConfi... method build_command (line 84) | fn build_command(&self, task: &str, url: Option<&str>) -> tokio::proce... method validate_task_urls (line 119) | fn validate_task_urls(&self, task: &str) -> anyhow::Result<()> { method validate_url (line 131) | fn validate_url(&self, url: &str) -> anyhow::Result<()> { function domain_matches (line 175) | fn domain_matches(domain: &str, pattern: &str) -> bool { constant MAX_STDERR_CHARS (line 182) | const MAX_STDERR_CHARS: usize = 512; constant VALID_EXTRACT_FORMATS (line 185) | const VALID_EXTRACT_FORMATS: &[&str] = &["text", "json", "summary"]; method name (line 189) | fn name(&self) -> &str { method description (line 193) | fn description(&self) -> &str { method parameters_schema (line 197) | fn parameters_schema(&self) -> serde_json::Value { method execute (line 219) | async fn execute(&self, args: serde_json::Value) -> anyhow::Result String { method read_outlook_inbox (line 368) | pub fn read_outlook_inbox(count: usize) -> String { method read_jira_board (line 378) | pub fn read_jira_board(project: &str) -> String { method read_confluence_page (line 387) | pub fn read_confluence_page(url: &str) -> String { function default_test_config (line 400) | fn default_test_config() -> BrowserDelegateConfig { function config_with_domains (line 404) | fn config_with_domains(allowed: Vec, blocked: Vec) -> Br... function test_tool (line 413) | fn test_tool(config: BrowserDelegateConfig) -> BrowserDelegateTool { function config_defaults_are_sensible (line 420) | fn config_defaults_are_sensible() { function config_serde_roundtrip (line 431) | fn config_serde_roundtrip() { function validate_url_allows_when_no_restrictions (line 453) | fn validate_url_allows_when_no_restrictions() { function validate_url_rejects_blocked_domain (line 459) | fn validate_url_rejects_blocked_domain() { function validate_url_rejects_blocked_subdomain (line 467) | fn validate_url_rejects_blocked_subdomain() { function validate_url_allows_listed_domain (line 473) | fn validate_url_allows_listed_domain() { function validate_url_rejects_unlisted_domain_with_allowlist (line 479) | fn validate_url_rejects_unlisted_domain_with_allowlist() { function validate_url_blocked_takes_precedence_over_allowed (line 487) | fn validate_url_blocked_takes_precedence_over_allowed() { function validate_url_rejects_invalid_url (line 498) | fn validate_url_rejects_invalid_url() { function build_command_uses_configured_binary (line 506) | fn build_command_uses_configured_binary() { function build_command_includes_print_flag (line 517) | fn build_command_includes_print_flag() { function build_command_includes_url_in_prompt (line 525) | fn build_command_includes_url_in_prompt() { function build_command_sets_chrome_profile_env (line 539) | fn build_command_sets_chrome_profile_env() { function template_teams_includes_channel_and_count (line 560) | fn template_teams_includes_channel_and_count() { function template_outlook_includes_count (line 568) | fn template_outlook_includes_count() { function template_jira_includes_project (line 575) | fn template_jira_includes_project() { function template_confluence_includes_url (line 582) | fn template_confluence_includes_url() { function domain_matches_exact (line 591) | fn domain_matches_exact() { function domain_matches_subdomain (line 596) | fn domain_matches_subdomain() { function domain_matches_case_insensitive (line 601) | fn domain_matches_case_insensitive() { function domain_does_not_match_partial (line 606) | fn domain_does_not_match_partial() { function execute_rejects_empty_task (line 613) | async fn execute_rejects_empty_task() { function execute_rejects_blocked_url (line 624) | async fn execute_rejects_blocked_url() { function validate_url_rejects_ftp_scheme (line 640) | fn validate_url_rejects_ftp_scheme() { function validate_url_rejects_file_scheme (line 651) | fn validate_url_rejects_file_scheme() { function validate_url_rejects_javascript_scheme (line 662) | fn validate_url_rejects_javascript_scheme() { function validate_url_rejects_data_scheme (line 673) | fn validate_url_rejects_data_scheme() { function validate_url_allows_http_scheme (line 684) | fn validate_url_allows_http_scheme() { function validate_task_urls_blocks_embedded_blocked_url (line 692) | fn validate_task_urls_blocks_embedded_blocked_url() { function validate_task_urls_blocks_embedded_url_not_in_allowlist (line 700) | fn validate_task_urls_blocks_embedded_url_not_in_allowlist() { function validate_task_urls_allows_permitted_embedded_url (line 709) | fn validate_task_urls_allows_permitted_embedded_url() { function validate_task_urls_allows_text_without_urls (line 717) | fn validate_task_urls_allows_text_without_urls() { function execute_rejects_blocked_url_in_task_text (line 725) | async fn execute_rejects_blocked_url_in_task_text() { function execute_rejects_invalid_extract_format (line 740) | async fn execute_rejects_invalid_extract_format() { FILE: src/tools/browser_open.rs type BrowserOpenTool (line 8) | pub struct BrowserOpenTool { method new (line 14) | pub fn new(security: Arc, allowed_domains: Vec... method validate_url (line 21) | fn validate_url(&self, raw_url: &str) -> anyhow::Result { method name (line 58) | fn name(&self) -> &str { method description (line 62) | fn description(&self) -> &str { method parameters_schema (line 66) | fn parameters_schema(&self) -> serde_json::Value { method execute (line 79) | async fn execute(&self, args: serde_json::Value) -> anyhow::Result anyhow::Result<()> { function normalize_allowed_domains (line 234) | fn normalize_allowed_domains(domains: Vec) -> Vec { function normalize_domain (line 244) | fn normalize_domain(raw: &str) -> Option { function extract_host (line 273) | fn extract_host(url: &str) -> anyhow::Result { function host_matches_allowlist (line 310) | fn host_matches_allowlist(host: &str, allowed_domains: &[String]) -> bool { function is_private_or_local_host (line 323) | fn is_private_or_local_host(host: &str) -> bool { function parse_ipv4 (line 346) | fn parse_ipv4(host: &str) -> Option<[u8; 4]> { function test_tool (line 364) | fn test_tool(allowed_domains: Vec<&str>) -> BrowserOpenTool { function normalize_domain_strips_scheme_path_and_case (line 376) | fn normalize_domain_strips_scheme_path_and_case() { function normalize_allowed_domains_deduplicates (line 382) | fn normalize_allowed_domains_deduplicates() { function validate_accepts_exact_domain (line 392) | fn validate_accepts_exact_domain() { function validate_accepts_subdomain (line 399) | fn validate_accepts_subdomain() { function validate_accepts_wildcard_allowlist_for_public_host (line 405) | fn validate_accepts_wildcard_allowlist_for_public_host() { function validate_wildcard_allowlist_still_rejects_private_host (line 411) | fn validate_wildcard_allowlist_still_rejects_private_host() { function validate_rejects_http (line 421) | fn validate_rejects_http() { function validate_rejects_localhost (line 431) | fn validate_rejects_localhost() { function validate_rejects_private_ipv4 (line 441) | fn validate_rejects_private_ipv4() { function validate_rejects_allowlist_miss (line 451) | fn validate_rejects_allowlist_miss() { function validate_rejects_whitespace (line 461) | fn validate_rejects_whitespace() { function validate_rejects_userinfo (line 471) | fn validate_rejects_userinfo() { function validate_requires_allowlist (line 481) | fn validate_requires_allowlist() { function parse_ipv4_valid (line 492) | fn parse_ipv4_valid() { function parse_ipv4_invalid (line 497) | fn parse_ipv4_invalid() { function execute_blocks_readonly_mode (line 504) | async fn execute_blocks_readonly_mode() { function execute_blocks_when_rate_limited (line 519) | async fn execute_blocks_when_rate_limited() { FILE: src/tools/calculator.rs type CalculatorTool (line 5) | pub struct CalculatorTool; method new (line 8) | pub fn new() -> Self { method default (line 14) | fn default() -> Self { method name (line 21) | fn name(&self) -> &str { method description (line 25) | fn description(&self) -> &str { method parameters_schema (line 33) | fn parameters_schema(&self) -> serde_json::Value { method execute (line 95) | async fn execute(&self, args: serde_json::Value) -> anyhow::Result Resul... function extract_i64 (line 158) | fn extract_i64(args: &serde_json::Value, key: &str, name: &str) -> Resul... function extract_values (line 164) | fn extract_values(args: &serde_json::Value, min_len: usize) -> Result String { function calc_add (line 195) | fn calc_add(args: &serde_json::Value) -> Result { function calc_subtract (line 200) | fn calc_subtract(args: &serde_json::Value) -> Result { function calc_divide (line 210) | fn calc_divide(args: &serde_json::Value) -> Result { function calc_multiply (line 223) | fn calc_multiply(args: &serde_json::Value) -> Result { function calc_pow (line 232) | fn calc_pow(args: &serde_json::Value) -> Result { function calc_sqrt (line 238) | fn calc_sqrt(args: &serde_json::Value) -> Result { function calc_abs (line 246) | fn calc_abs(args: &serde_json::Value) -> Result { function calc_modulo (line 251) | fn calc_modulo(args: &serde_json::Value) -> Result { function calc_round (line 260) | fn calc_round(args: &serde_json::Value) -> Result { function calc_log (line 270) | fn calc_log(args: &serde_json::Value) -> Result { function calc_ln (line 282) | fn calc_ln(args: &serde_json::Value) -> Result { function calc_exp (line 290) | fn calc_exp(args: &serde_json::Value) -> Result { function calc_factorial (line 295) | fn calc_factorial(args: &serde_json::Value) -> Result { function calc_sum (line 312) | fn calc_sum(args: &serde_json::Value) -> Result { function calc_average (line 317) | fn calc_average(args: &serde_json::Value) -> Result { function calc_median (line 325) | fn calc_median(args: &serde_json::Value) -> Result { function calc_mode (line 342) | fn calc_mode(args: &serde_json::Value) -> Result { function calc_min (line 369) | fn calc_min(args: &serde_json::Value) -> Result { function calc_max (line 377) | fn calc_max(args: &serde_json::Value) -> Result { function calc_range (line 385) | fn calc_range(args: &serde_json::Value) -> Result { function calc_variance (line 395) | fn calc_variance(args: &serde_json::Value) -> Result { function calc_stdev (line 405) | fn calc_stdev(args: &serde_json::Value) -> Result { function calc_percentile (line 415) | fn calc_percentile(args: &serde_json::Value) -> Result { function calc_count (line 432) | fn calc_count(args: &serde_json::Value) -> Result { function calc_percentage_change (line 437) | fn calc_percentage_change(args: &serde_json::Value) -> Result Result { function test_add (line 461) | async fn test_add() { function test_subtract (line 472) | async fn test_subtract() { function test_divide (line 483) | async fn test_divide() { function test_divide_by_zero (line 494) | async fn test_divide_by_zero() { function test_multiply (line 505) | async fn test_multiply() { function test_pow (line 516) | async fn test_pow() { function test_sqrt (line 527) | async fn test_sqrt() { function test_sqrt_negative (line 538) | async fn test_sqrt_negative() { function test_abs (line 548) | async fn test_abs() { function test_modulo (line 559) | async fn test_modulo() { function test_round (line 570) | async fn test_round() { function test_log_base10 (line 581) | async fn test_log_base10() { function test_log_custom_base (line 592) | async fn test_log_custom_base() { function test_ln (line 603) | async fn test_ln() { function test_exp (line 614) | async fn test_exp() { function test_factorial (line 625) | async fn test_factorial() { function test_average (line 636) | async fn test_average() { function test_median_odd (line 647) | async fn test_median_odd() { function test_median_even (line 658) | async fn test_median_even() { function test_mode (line 669) | async fn test_mode() { function test_min (line 680) | async fn test_min() { function test_max (line 691) | async fn test_max() { function test_range (line 702) | async fn test_range() { function test_variance (line 713) | async fn test_variance() { function test_stdev (line 726) | async fn test_stdev() { function test_percentile_50 (line 739) | async fn test_percentile_50() { function test_count (line 752) | async fn test_count() { function test_percentage_change (line 763) | async fn test_percentage_change() { function test_clamp_within_range (line 774) | async fn test_clamp_within_range() { function test_clamp_below_min (line 785) | async fn test_clamp_below_min() { function test_clamp_above_max (line 796) | async fn test_clamp_above_max() { function test_unknown_function (line 807) | async fn test_unknown_function() { function test_sum (line 815) | async fn test_sum() { FILE: src/tools/cli_discovery.rs type CliCategory (line 8) | pub enum CliCategory { method fmt (line 20) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { type DiscoveredCli (line 36) | pub struct DiscoveredCli { type KnownCli (line 44) | struct KnownCli { constant KNOWN_CLIS (line 50) | const KNOWN_CLIS: &[KnownCli] = &[ function discover_cli_tools (line 135) | pub fn discover_cli_tools(additional: &[String], excluded: &[String]) ->... function probe_cli (line 165) | fn probe_cli(name: &str, version_args: &[&str], category: CliCategory) -... function find_executable (line 181) | fn find_executable(name: &str) -> Option { function get_version (line 207) | fn get_version(name: &str, args: &[&str]) -> Option { function discover_returns_vec (line 239) | fn discover_returns_vec() { function excluded_tools_are_skipped (line 249) | fn excluded_tools_are_skipped() { function category_display (line 255) | fn category_display() { FILE: src/tools/cloud_ops.rs type CloudOpsTool (line 16) | pub struct CloudOpsTool { method new (line 21) | pub fn new(config: CloudOpsConfig) -> Self { method review_iac (line 124) | async fn review_iac(&self, input: &str, cloud: &str) -> anyhow::Result... method assess_migration (line 160) | async fn assess_migration(&self, input: &str, cloud: &str) -> anyhow::... method cost_analysis (line 176) | async fn cost_analysis(&self, input: &str, cloud: &str) -> anyhow::Res... method architecture_review (line 194) | async fn architecture_review(&self, input: &str, cloud: &str) -> anyho... method name (line 28) | fn name(&self) -> &str { method description (line 32) | fn description(&self) -> &str { method parameters_schema (line 38) | fn parameters_schema(&self) -> serde_json::Value { method execute (line 60) | async fn execute(&self, args: serde_json::Value) -> anyhow::Result &'static str { function scan_iac_security (line 231) | fn scan_iac_security(input: &str) -> Vec { function scan_iac_best_practices (line 297) | fn scan_iac_best_practices(input: &str, cloud: &str) -> Vec Vec Vec Vec Vec { function review_pillar_reliability (line 523) | fn review_pillar_reliability(input: &str, _cloud: &str) -> Vec { function review_pillar_performance (line 544) | fn review_pillar_performance(input: &str, _cloud: &str) -> Vec { function review_pillar_cost (line 562) | fn review_pillar_cost(input: &str, _cloud: &str) -> Vec { function review_pillar_operations (line 579) | fn review_pillar_operations(input: &str, _cloud: &str) -> Vec { function test_config (line 604) | fn test_config() -> CloudOpsConfig { function review_iac_detects_security_findings (line 609) | async fn review_iac_detects_security_findings() { function review_iac_detects_terraform_type (line 625) | async fn review_iac_detects_terraform_type() { function review_iac_detects_encrypted_false (line 640) | async fn review_iac_detects_encrypted_false() { function cost_analysis_detects_on_demand (line 655) | async fn cost_analysis_detects_on_demand() { function architecture_review_returns_all_pillars (line 671) | async fn architecture_review_returns_all_pillars() { function assess_migration_detects_monolith (line 690) | async fn assess_migration_detects_monolith() { function empty_input_returns_error (line 706) | async fn empty_input_returns_error() { function unsupported_cloud_returns_error (line 721) | async fn unsupported_cloud_returns_error() { function unknown_action_returns_error (line 737) | async fn unknown_action_returns_error() { function detect_iac_type_identifies_cloudformation (line 752) | fn detect_iac_type_identifies_cloudformation() { function detect_iac_type_identifies_pulumi (line 757) | fn detect_iac_type_identifies_pulumi() { function scan_iac_security_finds_wildcard_permission (line 762) | fn scan_iac_security_finds_wildcard_permission() { function scan_iac_cost_gates_aws_patterns_for_non_aws (line 770) | fn scan_iac_cost_gates_aws_patterns_for_non_aws() { function scan_iac_cost_respects_threshold (line 792) | fn scan_iac_cost_respects_threshold() { function non_string_action_returns_error (line 807) | async fn non_string_action_returns_error() { function non_string_input_returns_error (line 822) | async fn non_string_input_returns_error() { function non_string_cloud_returns_error (line 837) | async fn non_string_cloud_returns_error() { FILE: src/tools/cloud_patterns.rs type CloudPattern (line 14) | pub struct CloudPattern { type CloudPatternsTool (line 25) | pub struct CloudPatternsTool { method new (line 30) | pub fn new() -> Self { method filter_by_cloud (line 140) | fn filter_by_cloud(&self, cloud: Option<&str>) -> Vec<&CloudPattern> { method match_patterns (line 151) | fn match_patterns(&self, workload: &str, cloud: Option<&str>) -> Vec &str { method description (line 43) | fn description(&self) -> &str { method parameters_schema (line 48) | fn parameters_schema(&self) -> serde_json::Value { method execute (line 70) | async fn execute(&self, args: serde_json::Value) -> anyhow::Result Vec { function built_in_patterns_are_populated (line 288) | fn built_in_patterns_are_populated() { function match_returns_containerization_for_monolith (line 300) | async fn match_returns_containerization_for_monolith() { function match_returns_serverless_for_batch_workload (line 315) | async fn match_returns_serverless_for_batch_workload() { function match_filters_by_cloud_provider (line 330) | async fn match_filters_by_cloud_provider() { function list_returns_all_patterns (line 346) | async fn list_returns_all_patterns() { function match_with_empty_workload_returns_error (line 360) | async fn match_with_empty_workload_returns_error() { function match_database_workload_finds_db_modernization (line 375) | async fn match_database_workload_finds_db_modernization() { function pattern_matching_scores_correctly (line 390) | fn pattern_matching_scores_correctly() { function unknown_action_returns_error (line 400) | async fn unknown_action_returns_error() { FILE: src/tools/composio.rs constant COMPOSIO_API_BASE_V3 (line 22) | const COMPOSIO_API_BASE_V3: &str = "https://backend.composio.dev/api/v3"; constant COMPOSIO_API_BASE_V2 (line 23) | const COMPOSIO_API_BASE_V2: &str = "https://backend.composio.dev/api"; constant COMPOSIO_TOOL_VERSION_LATEST (line 24) | const COMPOSIO_TOOL_VERSION_LATEST: &str = "latest"; function ensure_https (line 26) | fn ensure_https(url: &str) -> anyhow::Result<()> { type ComposioTool (line 36) | pub struct ComposioTool { method new (line 45) | pub fn new( method client (line 59) | fn client(&self) -> Client { method list_actions (line 66) | pub async fn list_actions( method list_actions_v3 (line 73) | async fn list_actions_v3(&self, app_name: Option<&str>) -> anyhow::Res... method update_action_slug_cache_from_v3_items (line 95) | fn update_action_slug_cache_from_v3_items(&self, items: &[ComposioV3To... method list_connected_accounts (line 108) | async fn list_connected_accounts( method cache_connected_account (line 149) | fn cache_connected_account(&self, app_name: &str, entity_id: &str, con... method get_cached_connected_account (line 156) | fn get_cached_connected_account(&self, app_name: &str, entity_id: &str... method resolve_connected_account_ref (line 161) | async fn resolve_connected_account_ref( method execute_action (line 197) | pub async fn execute_action( method build_v3_slug_candidates (line 299) | fn build_v3_slug_candidates(&self, action_name: &str) -> Vec { method cache_action_slug (line 318) | fn cache_action_slug(&self, alias: &str, slug: &str) { method lookup_cached_action_slug (line 331) | fn lookup_cached_action_slug(&self, action_name: &str) -> Option) -> Vec<(String,... method build_execute_action_v3_request (line 353) | fn build_execute_action_v3_request( method execute_action_v3 (line 391) | async fn execute_action_v3( method get_connection_url (line 432) | pub async fn get_connection_url( method get_connection_url_v3 (line 442) | async fn get_connection_url_v3( method get_connection_url_v2 (line 489) | async fn get_connection_url_v2( method get_tool_schema (line 530) | async fn get_tool_schema(&self, tool_slug: &str) -> anyhow::Result anyhow::Resu... method name (line 599) | fn name(&self) -> &str { method description (line 603) | fn description(&self) -> &str { method parameters_schema (line 614) | fn parameters_schema(&self) -> serde_json::Value { method execute (line 660) | async fn execute(&self, args: serde_json::Value) -> anyhow::Result String { function normalize_tool_slug (line 900) | fn normalize_tool_slug(action_name: &str) -> String { function build_tool_slug_candidates (line 904) | fn build_tool_slug_candidates(action_name: &str) -> Vec { function normalize_app_slug (line 939) | fn normalize_app_slug(app_name: &str) -> String { function infer_app_slug_from_action_name (line 950) | fn infer_app_slug_from_action_name(action_name: &str) -> Option { function connected_account_cache_key (line 968) | fn connected_account_cache_key(app_name: &str, entity_id: &str) -> String { function normalize_action_cache_key (line 976) | fn normalize_action_cache_key(alias: &str) -> Option { function build_connected_account_hint (line 993) | fn build_connected_account_hint( function map_v3_tools_to_actions (line 1017) | fn map_v3_tools_to_actions(items: Vec) -> Vec Option { function extract_connected_account_id (line 1053) | fn extract_connected_account_id(result: &serde_json::Value) -> Option String { function sanitize_error_message (line 1091) | fn sanitize_error_message(message: &str) -> String { function extract_api_error_message (line 1116) | fn extract_api_error_message(body: &str) -> Option { function format_input_params_hint (line 1135) | fn format_input_params_hint(schema: Option<&serde_json::Value>) -> String { function floor_char_boundary_compat (line 1165) | fn floor_char_boundary_compat(text: &str, index: usize) -> usize { function format_schema_hint (line 1177) | fn format_schema_hint(schema: &serde_json::Value) -> Option { type ComposioToolsResponse (line 1227) | struct ComposioToolsResponse { type ComposioConnectedAccountsResponse (line 1233) | struct ComposioConnectedAccountsResponse { type ComposioConnectedAccount (line 1239) | struct ComposioConnectedAccount { method is_usable (line 1248) | fn is_usable(&self) -> bool { method toolkit_slug (line 1254) | fn toolkit_slug(&self) -> Option<&str> { type ComposioV3Tool (line 1262) | struct ComposioV3Tool { type ComposioToolkitRef (line 1279) | struct ComposioToolkitRef { type ComposioAuthConfigsResponse (line 1287) | struct ComposioAuthConfigsResponse { type ComposioConnectionLink (line 1293) | pub struct ComposioConnectionLink { type ComposioAuthConfig (line 1299) | struct ComposioAuthConfig { method is_enabled (line 1308) | fn is_enabled(&self) -> bool { type ComposioAction (line 1318) | pub struct ComposioAction { function test_security (line 1335) | fn test_security() -> Arc { function composio_tool_has_correct_name (line 1342) | fn composio_tool_has_correct_name() { function composio_tool_has_description (line 1348) | fn composio_tool_has_description() { function composio_tool_schema_has_required_fields (line 1359) | fn composio_tool_schema_has_required_fields() { function composio_tool_spec_roundtrip (line 1381) | fn composio_tool_spec_roundtrip() { function execute_missing_action_returns_error (line 1391) | async fn execute_missing_action_returns_error() { function execute_unknown_action_returns_error (line 1398) | async fn execute_unknown_action_returns_error() { function execute_without_action_name_returns_error (line 1406) | async fn execute_without_action_name_returns_error() { function connect_without_target_returns_error (line 1413) | async fn connect_without_target_returns_error() { function execute_blocked_in_readonly_mode (line 1420) | async fn execute_blocked_in_readonly_mode() { function execute_blocked_when_rate_limited (line 1442) | async fn execute_blocked_when_rate_limited() { function composio_action_deserializes (line 1466) | fn composio_action_deserializes() { function composio_tools_response_deserializes (line 1475) | fn composio_tools_response_deserializes() { function composio_tools_response_empty (line 1483) | fn composio_tools_response_empty() { function composio_tools_response_missing_items_defaults (line 1490) | fn composio_tools_response_missing_items_defaults() { function composio_v3_tools_response_maps_to_actions (line 1497) | fn composio_v3_tools_response_maps_to_actions() { function normalize_entity_id_falls_back_to_default_when_blank (line 1520) | fn normalize_entity_id_falls_back_to_default_when_blank() { function normalize_tool_slug_supports_legacy_action_name (line 1526) | fn normalize_tool_slug_supports_legacy_action_name() { function build_tool_slug_candidates_cover_common_variants (line 1538) | fn build_tool_slug_candidates_cover_common_variants() { function floor_char_boundary_compat_handles_multibyte_offsets (line 1557) | fn floor_char_boundary_compat_handles_multibyte_offsets() { function normalize_action_cache_key_merges_underscore_and_hyphen_variants (line 1565) | fn normalize_action_cache_key_merges_underscore_and_hyphen_variants() { function normalize_app_slug_removes_spaces_and_normalizes_case (line 1578) | fn normalize_app_slug_removes_spaces_and_normalizes_case() { function infer_app_slug_from_action_name_handles_v2_and_v3_formats (line 1584) | fn infer_app_slug_from_action_name_handles_v2_and_v3_formats() { function connected_account_cache_key_is_stable (line 1597) | fn connected_account_cache_key_is_stable() { function build_connected_account_hint_returns_guidance_when_missing_ref (line 1605) | fn build_connected_account_hint_returns_guidance_when_missing_ref() { function build_connected_account_hint_without_app_is_still_actionable (line 1613) | fn build_connected_account_hint_without_app_is_still_actionable() { function connected_account_is_usable_for_initializing_active_and_initiated (line 1621) | fn connected_account_is_usable_for_initializing_active_and_initiated() { function extract_connected_account_id_supports_common_shapes (line 1633) | fn extract_connected_account_id_supports_common_shapes() { function extract_redirect_url_supports_v2_and_v3_shapes (line 1653) | fn extract_redirect_url_supports_v2_and_v3_shapes() { function auth_config_prefers_enabled_status (line 1673) | fn auth_config_prefers_enabled_status() { function extract_api_error_message_from_common_shapes (line 1690) | fn extract_api_error_message_from_common_shapes() { function composio_action_with_null_fields (line 1706) | fn composio_action_with_null_fields() { function composio_action_with_special_characters (line 1717) | fn composio_action_with_special_characters() { function composio_action_with_unicode (line 1726) | fn composio_action_with_unicode() { function composio_malformed_json_returns_error (line 1734) | fn composio_malformed_json_returns_error() { function composio_empty_json_string_returns_error (line 1741) | fn composio_empty_json_string_returns_error() { function composio_large_actions_list (line 1748) | fn composio_large_actions_list() { function composio_api_base_url_is_v3 (line 1764) | fn composio_api_base_url_is_v3() { function build_execute_action_v3_request_uses_fixed_endpoint_and_body_account_id (line 1769) | fn build_execute_action_v3_request_uses_fixed_endpoint_and_body_account_... function build_list_actions_v3_query_requests_latest_versions (line 1789) | fn build_list_actions_v3_query_requests_latest_versions() { function build_list_actions_v3_query_adds_app_filters_when_present (line 1803) | fn build_list_actions_v3_query_adds_app_filters_when_present() { function resolve_picks_first_usable_when_multiple_accounts_exist (line 1818) | fn resolve_picks_first_usable_when_multiple_accounts_exist() { function resolve_picks_first_usable_skipping_unusable_head (line 1839) | fn resolve_picks_first_usable_skipping_unusable_head() { function resolve_returns_none_when_no_usable_accounts (line 1857) | fn resolve_returns_none_when_no_usable_accounts() { function resolve_returns_none_for_empty_accounts (line 1868) | fn resolve_returns_none_for_empty_accounts() { function connected_accounts_alias_dispatches_same_as_list_accounts (line 1877) | async fn connected_accounts_alias_dispatches_same_as_list_accounts() { function schema_enum_includes_connected_accounts_alias (line 1899) | fn schema_enum_includes_connected_accounts_alias() { function description_mentions_connected_accounts (line 1913) | fn description_mentions_connected_accounts() { function build_execute_action_v3_request_drops_blank_optional_fields (line 1919) | fn build_execute_action_v3_request_drops_blank_optional_fields() { FILE: src/tools/content_search.rs constant MAX_RESULTS (line 8) | const MAX_RESULTS: usize = 1000; constant MAX_OUTPUT_BYTES (line 9) | const MAX_OUTPUT_BYTES: usize = 1_048_576; constant TIMEOUT_SECS (line 10) | const TIMEOUT_SECS: u64 = 30; type ContentSearchTool (line 16) | pub struct ContentSearchTool { method new (line 22) | pub fn new(security: Arc) -> Self { method new_with_backend (line 28) | fn new_with_backend(security: Arc, has_rg: bool) -> Se... method name (line 35) | fn name(&self) -> &str { method description (line 39) | fn description(&self) -> &str { method parameters_schema (line 47) | fn parameters_schema(&self) -> serde_json::Value { method execute (line 100) | async fn execute(&self, args: serde_json::Value) -> anyhow::Result String { function parse_content_line (line 612) | fn parse_content_line(line: &str) -> Option<(&str, bool)> { function parse_count_line (line 634) | fn parse_count_line(line: &str) -> Option<(&str, usize)> { function truncate_utf8 (line 646) | fn truncate_utf8(input: &str, max_bytes: usize) -> &str { function test_security (line 664) | fn test_security(workspace: PathBuf) -> Arc { function test_security_with (line 672) | fn test_security_with( function create_test_files (line 685) | fn create_test_files(dir: &TempDir) { function content_search_name_and_schema (line 700) | fn content_search_name_and_schema() { function content_search_basic_match (line 715) | async fn content_search_basic_match() { function content_search_files_with_matches_mode (line 728) | async fn content_search_files_with_matches_mode() { function content_search_count_mode (line 746) | async fn content_search_count_mode() { function content_search_case_insensitive (line 763) | async fn content_search_case_insensitive() { function content_search_include_filter (line 779) | async fn content_search_include_filter() { function content_search_context_lines (line 795) | async fn content_search_context_lines() { function content_search_no_matches (line 816) | async fn content_search_no_matches() { function content_search_empty_pattern_rejected (line 831) | async fn content_search_empty_pattern_rejected() { function content_search_missing_pattern (line 840) | async fn content_search_missing_pattern() { function content_search_invalid_output_mode_rejected (line 847) | async fn content_search_invalid_output_mode_rejected() { function content_search_subdirectory (line 866) | async fn content_search_subdirectory() { function content_search_rejects_absolute_path (line 886) | async fn content_search_rejects_absolute_path() { function content_search_rejects_path_traversal (line 898) | async fn content_search_rejects_path_traversal() { function content_search_rate_limited (line 910) | async fn content_search_rate_limited() { function content_search_symlink_escape_blocked (line 927) | async fn content_search_symlink_escape_blocked() { function content_search_multiline_without_rg (line 954) | async fn content_search_multiline_without_rg() { function relativize_path_strips_prefix (line 972) | fn relativize_path_strips_prefix() { function relativize_path_no_prefix (line 978) | fn relativize_path_no_prefix() { function format_line_output_content_counts_match_lines_only (line 984) | fn format_line_output_content_counts_match_lines_only() { function parse_count_line_supports_colons_in_path (line 991) | fn parse_count_line_supports_colons_in_path() { function truncate_utf8_keeps_char_boundary (line 997) | fn truncate_utf8_keeps_char_boundary() { FILE: src/tools/cron_add.rs type CronAddTool (line 11) | pub struct CronAddTool { method new (line 17) | pub fn new(config: Arc, security: Arc) -> Self { method enforce_mutation_allowed (line 21) | fn enforce_mutation_allowed(&self, action: &str) -> Option { method name (line 54) | fn name(&self) -> &str { method description (line 58) | fn description(&self) -> &str { method parameters_schema (line 66) | fn parameters_schema(&self) -> serde_json::Value { method execute (line 176) | async fn execute(&self, args: serde_json::Value) -> anyhow::Result Arc { function test_security (line 384) | fn test_security(cfg: &Config) -> Arc { function adds_shell_job (line 392) | async fn adds_shell_job() { function blocks_disallowed_shell_command (line 410) | async fn blocks_disallowed_shell_command() { function blocks_mutation_in_read_only_mode (line 439) | async fn blocks_mutation_in_read_only_mode() { function blocks_add_when_rate_limited (line 466) | async fn blocks_add_when_rate_limited() { function medium_risk_shell_command_requires_approval (line 497) | async fn medium_risk_shell_command_requires_approval() { function accepts_schedule_passed_as_json_string (line 537) | async fn accepts_schedule_passed_as_json_string() { function accepts_stringified_interval_schedule (line 558) | async fn accepts_stringified_interval_schedule() { function accepts_stringified_schedule_with_timezone (line 576) | async fn accepts_stringified_schedule_with_timezone() { function rejects_invalid_schedule (line 594) | async fn rejects_invalid_schedule() { function agent_job_requires_prompt (line 616) | async fn agent_job_requires_prompt() { function agent_job_persists_allowed_tools (line 636) | async fn agent_job_persists_allowed_tools() { function delivery_schema_includes_matrix_channel (line 662) | async fn delivery_schema_includes_matrix_channel() { function schedule_schema_is_oneof_with_cron_at_every_variants (line 677) | fn schedule_schema_is_oneof_with_cron_at_every_variants() { FILE: src/tools/cron_list.rs type CronListTool (line 8) | pub struct CronListTool { method new (line 13) | pub fn new(config: Arc) -> Self { method name (line 20) | fn name(&self) -> &str { method description (line 24) | fn description(&self) -> &str { method parameters_schema (line 28) | fn parameters_schema(&self) -> serde_json::Value { method execute (line 36) | async fn execute(&self, _args: serde_json::Value) -> anyhow::Result Arc { function returns_empty_list_when_no_jobs (line 79) | async fn returns_empty_list_when_no_jobs() { function errors_when_cron_disabled (line 90) | async fn errors_when_cron_disabled() { FILE: src/tools/cron_remove.rs type CronRemoveTool (line 9) | pub struct CronRemoveTool { method new (line 15) | pub fn new(config: Arc, security: Arc) -> Self { method enforce_mutation_allowed (line 19) | fn enforce_mutation_allowed(&self, action: &str) -> Option { method name (line 52) | fn name(&self) -> &str { method description (line 56) | fn description(&self) -> &str { method parameters_schema (line 60) | fn parameters_schema(&self) -> serde_json::Value { method execute (line 70) | async fn execute(&self, args: serde_json::Value) -> anyhow::Result Arc { function test_security (line 128) | fn test_security(cfg: &Config) -> Arc { function removes_existing_job (line 136) | async fn removes_existing_job() { function errors_when_job_id_missing (line 148) | async fn errors_when_job_id_missing() { function blocks_remove_in_read_only_mode (line 162) | async fn blocks_remove_in_read_only_mode() { function blocks_remove_when_rate_limited (line 181) | async fn blocks_remove_when_rate_limited() { FILE: src/tools/cron_run.rs type CronRunTool (line 10) | pub struct CronRunTool { method new (line 16) | pub fn new(config: Arc, security: Arc) -> Self { method name (line 23) | fn name(&self) -> &str { method description (line 27) | fn description(&self) -> &str { method parameters_schema (line 31) | fn parameters_schema(&self) -> serde_json::Value { method execute (line 46) | async fn execute(&self, args: serde_json::Value) -> anyhow::Result Arc { function test_security (line 172) | fn test_security(cfg: &Config) -> Arc { function force_runs_job_and_records_history (line 180) | async fn force_runs_job_and_records_history() { function errors_for_missing_job (line 194) | async fn errors_for_missing_job() { function blocks_run_in_read_only_mode (line 208) | async fn blocks_run_in_read_only_mode() { function shell_run_requires_approval_for_medium_risk (line 227) | async fn shell_run_requires_approval_for_medium_risk() { function blocks_run_when_rate_limited (line 262) | async fn blocks_run_when_rate_limited() { FILE: src/tools/cron_runs.rs constant MAX_RUN_OUTPUT_CHARS (line 9) | const MAX_RUN_OUTPUT_CHARS: usize = 500; type CronRunsTool (line 11) | pub struct CronRunsTool { method new (line 16) | pub fn new(config: Arc) -> Self { type RunView (line 22) | struct RunView { method name (line 34) | fn name(&self) -> &str { method description (line 38) | fn description(&self) -> &str { method parameters_schema (line 42) | fn parameters_schema(&self) -> serde_json::Value { method execute (line 53) | async fn execute(&self, args: serde_json::Value) -> anyhow::Result String { function test_config (line 124) | async fn test_config(tmp: &TempDir) -> Arc { function lists_runs_with_truncation (line 137) | async fn lists_runs_with_truncation() { function errors_when_job_id_missing (line 166) | async fn errors_when_job_id_missing() { FILE: src/tools/cron_update.rs type CronUpdateTool (line 9) | pub struct CronUpdateTool { method new (line 15) | pub fn new(config: Arc, security: Arc) -> Self { method enforce_mutation_allowed (line 19) | fn enforce_mutation_allowed(&self, action: &str) -> Option { method name (line 52) | fn name(&self) -> &str { method description (line 56) | fn description(&self) -> &str { method parameters_schema (line 60) | fn parameters_schema(&self) -> serde_json::Value { method execute (line 179) | async fn execute(&self, args: serde_json::Value) -> anyhow::Result Arc { function test_security (line 263) | fn test_security(cfg: &Config) -> Arc { function updates_enabled_flag (line 271) | async fn updates_enabled_flag() { function blocks_disallowed_command_updates (line 290) | async fn blocks_disallowed_command_updates() { function blocks_mutation_in_read_only_mode (line 317) | async fn blocks_mutation_in_read_only_mode() { function medium_risk_shell_update_requires_approval (line 342) | async fn medium_risk_shell_update_requires_approval() { function patch_schema_covers_all_cronjobpatch_fields_and_schedule_is_oneof (line 381) | fn patch_schema_covers_all_cronjobpatch_fields_and_schedule_is_oneof() { function blocks_update_when_rate_limited (line 482) | async fn blocks_update_when_rate_limited() { function updates_agent_allowed_tools (line 512) | async fn updates_agent_allowed_tools() { FILE: src/tools/data_management.rs type DataManagementTool (line 9) | pub struct DataManagementTool { method new (line 15) | pub fn new(workspace_dir: PathBuf, retention_days: u64) -> Self { method cmd_retention_status (line 22) | async fn cmd_retention_status(&self) -> anyhow::Result { method cmd_purge (line 40) | async fn cmd_purge(&self, dry_run: bool) -> anyhow::Result { method cmd_stats (line 59) | async fn cmd_stats(&self) -> anyhow::Result { method name (line 77) | fn name(&self) -> &str { method description (line 81) | fn description(&self) -> &str { method parameters_schema (line 85) | fn parameters_schema(&self) -> serde_json::Value { method execute (line 103) | async fn execute(&self, args: serde_json::Value) -> anyhow::Result String { function count_files_older_than (line 151) | async fn count_files_older_than(dir: &Path, cutoff_epoch: u64) -> anyhow... function purge_old_files (line 175) | async fn purge_old_files( function dir_stats (line 210) | async fn dir_stats(root: &Path) -> anyhow::Result<(usize, u64, serde_jso... function count_dir_contents (line 243) | async fn count_dir_contents(dir: &Path) -> anyhow::Result<(usize, u64)> { function make_tool (line 266) | fn make_tool(tmp: &TempDir) -> DataManagementTool { function retention_status_reports_correct_cutoff (line 271) | async fn retention_status_reports_correct_cutoff() { function purge_dry_run_does_not_delete (line 285) | async fn purge_dry_run_does_not_delete() { function stats_counts_files_correctly (line 306) | async fn stats_counts_files_correctly() { FILE: src/tools/delegate.rs type DelegateTool (line 19) | pub struct DelegateTool { method new (line 37) | pub fn new( method new_with_options (line 50) | pub fn new_with_options( method with_depth (line 71) | pub fn with_depth( method with_depth_and_options (line 86) | pub fn with_depth_and_options( method with_parent_tools (line 106) | pub fn with_parent_tools(mut self, parent_tools: Arc S... method parent_tools_handle (line 125) | pub fn parent_tools_handle(&self) -> Arc>>> { method execute_agentic (line 358) | async fn execute_agentic( method name (line 132) | fn name(&self) -> &str { method description (line 136) | fn description(&self) -> &str { method parameters_schema (line 142) | fn parameters_schema(&self) -> serde_json::Value { method execute (line 174) | async fn execute(&self, args: serde_json::Value) -> anyhow::Result) -> Self { method name (line 488) | fn name(&self) -> &str { method description (line 492) | fn description(&self) -> &str { method parameters_schema (line 496) | fn parameters_schema(&self) -> serde_json::Value { method execute (line 500) | async fn execute(&self, args: serde_json::Value) -> anyhow::Result &str { method as_any (line 516) | fn as_any(&self) -> &dyn std::any::Any { function test_security (line 531) | fn test_security() -> Arc { function sample_agents (line 535) | fn sample_agents() -> HashMap { type EchoTool (line 573) | struct EchoTool; method name (line 577) | fn name(&self) -> &str { method description (line 581) | fn description(&self) -> &str { method parameters_schema (line 585) | fn parameters_schema(&self) -> serde_json::Value { method execute (line 595) | async fn execute(&self, args: serde_json::Value) -> anyhow::Result, max_iterations: usize) -> ... function name_and_schema (line 726) | fn name_and_schema() { function description_not_empty (line 742) | fn description_not_empty() { function schema_lists_agent_names (line 748) | fn schema_lists_agent_names() { function missing_agent_param (line 758) | async fn missing_agent_param() { function missing_prompt_param (line 765) | async fn missing_prompt_param() { function unknown_agent_returns_error (line 772) | async fn unknown_agent_returns_error() { function depth_limit_enforced (line 783) | async fn depth_limit_enforced() { function depth_limit_per_agent (line 794) | async fn depth_limit_per_agent() { function empty_agents_schema (line 806) | fn empty_agents_schema() { function invalid_provider_returns_error (line 816) | async fn invalid_provider_returns_error() { function blank_agent_rejected (line 844) | async fn blank_agent_rejected() { function blank_prompt_rejected (line 855) | async fn blank_prompt_rejected() { function whitespace_agent_name_trimmed_and_found (line 866) | async fn whitespace_agent_name_trimmed_and_found() { function delegation_blocked_in_readonly_mode (line 886) | async fn delegation_blocked_in_readonly_mode() { function delegation_blocked_when_rate_limited (line 905) | async fn delegation_blocked_when_rate_limited() { function delegate_context_is_prepended_to_prompt (line 924) | async fn delegate_context_is_prepended_to_prompt() { function delegate_empty_context_omits_prefix (line 961) | async fn delegate_empty_context_omits_prefix() { function delegate_depth_construction (line 998) | fn delegate_depth_construction() { function delegate_no_agents_configured (line 1004) | async fn delegate_no_agents_configured() { function agentic_mode_rejects_empty_allowed_tools (line 1015) | async fn agentic_mode_rejects_empty_allowed_tools() { function agentic_mode_rejects_unmatched_allowed_tools (line 1034) | async fn agentic_mode_rejects_unmatched_allowed_tools() { function execute_agentic_runs_tool_call_loop_with_filtered_tools (line 1057) | async fn execute_agentic_runs_tool_call_loop_with_filtered_tools() { function execute_agentic_excludes_delegate_even_if_allowlisted (line 1078) | async fn execute_agentic_excludes_delegate_even_if_allowlisted() { function execute_agentic_respects_max_iterations (line 1103) | async fn execute_agentic_respects_max_iterations() { function execute_agentic_propagates_provider_errors (line 1123) | async fn execute_agentic_propagates_provider_errors() { type FakeMcpTool (line 1145) | struct FakeMcpTool; method name (line 1149) | fn name(&self) -> &str { method description (line 1153) | fn description(&self) -> &str { method parameters_schema (line 1157) | fn parameters_schema(&self) -> serde_json::Value { method execute (line 1161) | async fn execute(&self, _args: serde_json::Value) -> anyhow::Result) -> Self { method name (line 25) | fn name(&self) -> &str { method description (line 29) | fn description(&self) -> &str { method parameters_schema (line 33) | fn parameters_schema(&self) -> serde_json::Value { method execute (line 54) | async fn execute(&self, args: serde_json::Value) -> anyhow::Result Arc { function test_security_with (line 249) | fn test_security_with( function file_edit_name (line 263) | fn file_edit_name() { function file_edit_schema_has_required_params (line 269) | fn file_edit_schema_has_required_params() { function file_edit_replaces_single_match (line 282) | async fn file_edit_replaces_single_match() { function file_edit_not_found (line 312) | async fn file_edit_not_found() { function file_edit_multiple_matches (line 343) | async fn file_edit_multiple_matches() { function file_edit_delete_via_empty_new_string (line 378) | async fn file_edit_delete_via_empty_new_string() { function file_edit_missing_path_param (line 411) | async fn file_edit_missing_path_param() { function file_edit_missing_old_string_param (line 420) | async fn file_edit_missing_old_string_param() { function file_edit_missing_new_string_param (line 429) | async fn file_edit_missing_new_string_param() { function file_edit_rejects_empty_old_string (line 438) | async fn file_edit_rejects_empty_old_string() { function file_edit_blocks_path_traversal (line 472) | async fn file_edit_blocks_path_traversal() { function file_edit_blocks_absolute_path (line 494) | async fn file_edit_blocks_absolute_path() { function file_edit_normalizes_workspace_prefixed_relative_path (line 510) | async fn file_edit_normalizes_workspace_prefixed_relative_path() { function file_edit_blocks_symlink_escape (line 547) | async fn file_edit_blocks_symlink_escape() { function file_edit_blocks_symlink_target_file (line 582) | async fn file_edit_blocks_symlink_target_file() { function file_edit_blocks_readonly_mode (line 623) | async fn file_edit_blocks_readonly_mode() { function file_edit_blocks_when_rate_limited (line 653) | async fn file_edit_blocks_when_rate_limited() { function file_edit_nonexistent_file (line 691) | async fn file_edit_nonexistent_file() { function file_edit_absolute_path_in_workspace (line 717) | async fn file_edit_absolute_path_in_workspace() { function file_edit_blocks_null_byte_in_path (line 757) | async fn file_edit_blocks_null_byte_in_path() { function file_edit_blocks_runtime_config_path (line 778) | async fn file_edit_blocks_runtime_config_path() { FILE: src/tools/file_read.rs constant MAX_FILE_SIZE_BYTES (line 7) | const MAX_FILE_SIZE_BYTES: u64 = 10 * 1024 * 1024; type FileReadTool (line 10) | pub struct FileReadTool { method new (line 15) | pub fn new(security: Arc) -> Self { method name (line 22) | fn name(&self) -> &str { method description (line 26) | fn description(&self) -> &str { method parameters_schema (line 30) | fn parameters_schema(&self) -> serde_json::Value { method execute (line 51) | async fn execute(&self, args: serde_json::Value) -> anyhow::Result Option { function try_extract_pdf_text (line 232) | fn try_extract_pdf_text(_bytes: &[u8]) -> Option { function test_security (line 241) | fn test_security(workspace: std::path::PathBuf) -> Arc { function test_security_with (line 249) | fn test_security_with( function file_read_name (line 263) | fn file_read_name() { function file_read_schema_has_path (line 269) | fn file_read_schema_has_path() { function file_read_existing_file (line 287) | async fn file_read_existing_file() { function file_read_nonexistent_file (line 306) | async fn file_read_nonexistent_file() { function file_read_blocks_path_traversal (line 320) | async fn file_read_blocks_path_traversal() { function file_read_blocks_absolute_path (line 337) | async fn file_read_blocks_absolute_path() { function file_read_blocks_when_rate_limited (line 345) | async fn file_read_blocks_when_rate_limited() { function file_read_allows_readonly_mode (line 371) | async fn file_read_allows_readonly_mode() { function file_read_missing_path_param (line 389) | async fn file_read_missing_path_param() { function file_read_empty_file (line 396) | async fn file_read_empty_file() { function file_read_nested_path (line 411) | async fn file_read_nested_path() { function file_read_blocks_symlink_escape (line 434) | async fn file_read_blocks_symlink_escape() { function file_read_outside_workspace_allowed_when_workspace_only_disabled (line 465) | async fn file_read_outside_workspace_allowed_when_workspace_only_disable... function file_read_nonexistent_consumes_rate_limit_budget (line 498) | async fn file_read_nonexistent_consumes_rate_limit_budget() { function file_read_with_offset_and_limit (line 532) | async fn file_read_with_offset_and_limit() { function file_read_offset_beyond_end (line 586) | async fn file_read_offset_beyond_end() { function file_read_rejects_oversized_file (line 608) | async fn file_read_rejects_oversized_file() { function file_read_extracts_pdf_text (line 627) | async fn file_read_extracts_pdf_text() { function file_read_lossy_reads_binary_file (line 657) | async fn file_read_lossy_reads_binary_file() { type SharedRequests (line 699) | pub type SharedRequests = Arc>>>; type RecordingProvider (line 701) | pub struct RecordingProvider { method new (line 707) | pub fn new(responses: Vec) -> (Self, SharedRequests) { method chat_with_system (line 719) | async fn chat_with_system( method chat (line 729) | async fn chat( function make_memory (line 753) | pub fn make_memory() -> Arc { function make_observer (line 761) | pub fn make_observer() -> Arc { function e2e_agent_file_read_pdf_extraction (line 770) | async fn e2e_agent_file_read_pdf_extraction() { function e2e_agent_file_read_lossy_binary (line 867) | async fn e2e_agent_file_read_lossy_binary() { function e2e_live_file_read_pdf (line 962) | async fn e2e_live_file_read_pdf() { function file_read_blocks_null_byte_in_path (line 1022) | async fn file_read_blocks_null_byte_in_path() { function file_read_allowed_root_with_workspace_only (line 1039) | async fn file_read_allowed_root_with_workspace_only() { FILE: src/tools/file_write.rs type FileWriteTool (line 8) | pub struct FileWriteTool { method new (line 13) | pub fn new(security: Arc) -> Self { method name (line 20) | fn name(&self) -> &str { method description (line 24) | fn description(&self) -> &str { method parameters_schema (line 28) | fn parameters_schema(&self) -> serde_json::Value { method execute (line 45) | async fn execute(&self, args: serde_json::Value) -> anyhow::Result Arc { function test_security_with (line 188) | fn test_security_with( function file_write_name (line 202) | fn file_write_name() { function file_write_schema_has_path_and_content (line 208) | fn file_write_schema_has_path_and_content() { function file_write_creates_file (line 219) | async fn file_write_creates_file() { function file_write_creates_parent_dirs (line 241) | async fn file_write_creates_parent_dirs() { function file_write_normalizes_workspace_prefixed_relative_path (line 262) | async fn file_write_normalizes_workspace_prefixed_relative_path() { function file_write_overwrites_existing (line 292) | async fn file_write_overwrites_existing() { function file_write_blocks_path_traversal (line 316) | async fn file_write_blocks_path_traversal() { function file_write_blocks_absolute_path (line 333) | async fn file_write_blocks_absolute_path() { function file_write_missing_path_param (line 344) | async fn file_write_missing_path_param() { function file_write_missing_content_param (line 351) | async fn file_write_missing_content_param() { function file_write_empty_content (line 358) | async fn file_write_empty_content() { function file_write_blocks_symlink_escape (line 376) | async fn file_write_blocks_symlink_escape() { function file_write_blocks_readonly_mode (line 407) | async fn file_write_blocks_readonly_mode() { function file_write_blocks_when_rate_limited (line 426) | async fn file_write_blocks_when_rate_limited() { function file_write_blocks_symlink_target_file (line 456) | async fn file_write_blocks_symlink_target_file() { function file_write_absolute_path_in_workspace (line 495) | async fn file_write_absolute_path_in_workspace() { function file_write_blocks_null_byte_in_path (line 529) | async fn file_write_blocks_null_byte_in_path() { function file_write_blocks_runtime_config_path (line 545) | async fn file_write_blocks_runtime_config_path() { FILE: src/tools/git_operations.rs type GitOperationsTool (line 9) | pub struct GitOperationsTool { method new (line 15) | pub fn new(security: Arc, workspace_dir: std::path::Pa... method sanitize_git_args (line 23) | fn sanitize_git_args(&self, args: &str) -> anyhow::Result> { method requires_write_access (line 53) | fn requires_write_access(&self, operation: &str) -> bool { method is_read_only (line 61) | fn is_read_only(&self, operation: &str) -> bool { method run_git_command (line 68) | async fn run_git_command(&self, args: &[&str]) -> anyhow::Result anyhow::Result... method git_diff (line 134) | async fn git_diff(&self, args: serde_json::Value) -> anyhow::Result anyhow::Result anyhow::Result... method truncate_commit_message (line 282) | fn truncate_commit_message(message: &str) -> String { method git_commit (line 290) | async fn git_commit(&self, args: serde_json::Value) -> anyhow::Result<... method git_add (line 327) | async fn git_add(&self, args: serde_json::Value) -> anyhow::Result anyhow::Resul... method git_stash (line 388) | async fn git_stash(&self, args: serde_json::Value) -> anyhow::Result &str { method description (line 432) | fn description(&self) -> &str { method parameters_schema (line 436) | fn parameters_schema(&self) -> serde_json::Value { method execute (line 483) | async fn execute(&self, args: serde_json::Value) -> anyhow::Result GitOperationsTool { function sanitize_git_blocks_injection (line 584) | fn sanitize_git_blocks_injection() { function sanitize_git_blocks_pager_editor_injection (line 597) | fn sanitize_git_blocks_pager_editor_injection() { function sanitize_git_blocks_config_injection (line 606) | fn sanitize_git_blocks_config_injection() { function sanitize_git_blocks_no_verify (line 616) | fn sanitize_git_blocks_no_verify() { function sanitize_git_blocks_redirect_in_args (line 624) | fn sanitize_git_blocks_redirect_in_args() { function sanitize_git_cached_not_blocked (line 632) | fn sanitize_git_cached_not_blocked() { function sanitize_git_allows_safe (line 643) | fn sanitize_git_allows_safe() { function requires_write_detection (line 656) | fn requires_write_detection() { function branch_is_not_write_gated (line 670) | fn branch_is_not_write_gated() { function is_read_only_detection (line 680) | fn is_read_only_detection() { function blocks_readonly_mode_for_write_ops (line 694) | async fn blocks_readonly_mode_for_write_ops() { function allows_branch_listing_in_readonly_mode (line 723) | async fn allows_branch_listing_in_readonly_mode() { function allows_readonly_ops_in_readonly_mode (line 748) | async fn allows_readonly_ops_in_readonly_mode() { function rejects_missing_operation (line 772) | async fn rejects_missing_operation() { function rejects_unknown_operation (line 786) | async fn rejects_unknown_operation() { function truncates_multibyte_commit_message_without_panicking (line 807) | fn truncates_multibyte_commit_message_without_panicking() { FILE: src/tools/glob_search.rs constant MAX_RESULTS (line 7) | const MAX_RESULTS: usize = 1000; type GlobSearchTool (line 10) | pub struct GlobSearchTool { method new (line 15) | pub fn new(security: Arc) -> Self { method name (line 22) | fn name(&self) -> &str { method description (line 26) | fn description(&self) -> &str { method parameters_schema (line 32) | fn parameters_schema(&self) -> serde_json::Value { method execute (line 45) | async fn execute(&self, args: serde_json::Value) -> anyhow::Result Arc { function test_security_with (line 195) | fn test_security_with( function glob_search_name_and_schema (line 209) | fn glob_search_name_and_schema() { function glob_search_single_file (line 222) | async fn glob_search_single_file() { function glob_search_multiple_files (line 234) | async fn glob_search_multiple_files() { function glob_search_recursive (line 250) | async fn glob_search_recursive() { function glob_search_no_matches (line 267) | async fn glob_search_no_matches() { function glob_search_missing_param (line 281) | async fn glob_search_missing_param() { function glob_search_rejects_absolute_path (line 288) | async fn glob_search_rejects_absolute_path() { function glob_search_rejects_path_traversal (line 297) | async fn glob_search_rejects_path_traversal() { function glob_search_rejects_dotdot_only (line 309) | async fn glob_search_rejects_dotdot_only() { function glob_search_filters_symlink_escape (line 319) | async fn glob_search_filters_symlink_escape() { function glob_search_readonly_mode (line 345) | async fn glob_search_readonly_mode() { function glob_search_rate_limited (line 361) | async fn glob_search_rate_limited() { function glob_search_results_sorted (line 377) | async fn glob_search_results_sorted() { function glob_search_excludes_directories (line 396) | async fn glob_search_excludes_directories() { function glob_search_invalid_pattern (line 410) | async fn glob_search_invalid_pattern() { FILE: src/tools/google_workspace.rs constant DEFAULT_GWS_TIMEOUT_SECS (line 9) | const DEFAULT_GWS_TIMEOUT_SECS: u64 = 30; constant MAX_OUTPUT_BYTES (line 11) | const MAX_OUTPUT_BYTES: usize = 1_048_576; constant DEFAULT_ALLOWED_SERVICES (line 14) | const DEFAULT_ALLOWED_SERVICES: &[&str] = &[ type GoogleWorkspaceTool (line 36) | pub struct GoogleWorkspaceTool { method new (line 50) | pub fn new( method name (line 81) | fn name(&self) -> &str { method description (line 85) | fn description(&self) -> &str { method parameters_schema (line 90) | fn parameters_schema(&self) -> serde_json::Value { method execute (line 137) | async fn execute(&self, args: serde_json::Value) -> anyhow::Result Arc { function tool_name (line 439) | fn tool_name() { function tool_description_non_empty (line 445) | fn tool_description_non_empty() { function tool_schema_has_required_fields (line 451) | fn tool_schema_has_required_fields() { function default_allowed_services_populated (line 466) | fn default_allowed_services_populated() { function custom_allowed_services_override_defaults (line 475) | fn custom_allowed_services_override_defaults() { function rejects_disallowed_service (line 492) | async fn rejects_disallowed_service() { function rejects_shell_injection_in_service (line 519) | async fn rejects_shell_injection_in_service() { function rejects_shell_injection_in_resource (line 546) | async fn rejects_shell_injection_in_resource() { function rejects_invalid_format (line 565) | async fn rejects_invalid_format() { function rejects_wrong_type_params (line 585) | async fn rejects_wrong_type_params() { function rejects_wrong_type_body (line 605) | async fn rejects_wrong_type_body() { function rejects_wrong_type_page_all (line 625) | async fn rejects_wrong_type_page_all() { function rejects_wrong_type_page_limit (line 645) | async fn rejects_wrong_type_page_limit() { function rejects_wrong_type_sub_resource (line 665) | async fn rejects_wrong_type_sub_resource() { function missing_required_param_returns_error (line 685) | async fn missing_required_param_returns_error() { function rate_limited_returns_error (line 692) | async fn rate_limited_returns_error() { function gws_timeout_is_reasonable (line 713) | fn gws_timeout_is_reasonable() { FILE: src/tools/hardware_board_info.rs constant BOARD_INFO (line 11) | const BOARD_INFO: &[(&str, &str, &str)] = &[ type HardwareBoardInfoTool (line 45) | pub struct HardwareBoardInfoTool { method new (line 50) | pub fn new(boards: Vec) -> Self { method static_info_for_board (line 54) | fn static_info_for_board(&self, board: &str) -> Option { method name (line 69) | fn name(&self) -> &str { method description (line 73) | fn description(&self) -> &str { method parameters_schema (line 77) | fn parameters_schema(&self) -> serde_json::Value { method execute (line 89) | async fn execute(&self, args: serde_json::Value) -> anyhow::Result anyhow::Result { function memory_map_static (line 199) | fn memory_map_static(board: &str) -> Option<&'static str> { FILE: src/tools/hardware_memory_map.rs constant MEMORY_MAPS (line 12) | const MEMORY_MAPS: &[(&str, &str)] = &[ type HardwareMemoryMapTool (line 36) | pub struct HardwareMemoryMapTool { method new (line 41) | pub fn new(boards: Vec) -> Self { method static_map_for_board (line 45) | fn static_map_for_board(&self, board: &str) -> Option<&'static str> { method name (line 55) | fn name(&self) -> &str { method description (line 59) | fn description(&self) -> &str { method parameters_schema (line 63) | fn parameters_schema(&self) -> serde_json::Value { method execute (line 75) | async fn execute(&self, args: serde_json::Value) -> anyhow::Result anyhow::Result { function static_map_nucleo (line 193) | fn static_map_nucleo() { function static_map_arduino (line 203) | fn static_map_arduino() { FILE: src/tools/hardware_memory_read.rs constant NUCLEO_RAM_BASE (line 11) | const NUCLEO_RAM_BASE: u64 = 0x2000_0000; type HardwareMemoryReadTool (line 14) | pub struct HardwareMemoryReadTool { method new (line 19) | pub fn new(boards: Vec) -> Self { method chip_for_board (line 23) | fn chip_for_board(board: &str) -> Option<&'static str> { method name (line 34) | fn name(&self) -> &str { method description (line 38) | fn description(&self) -> &str { method parameters_schema (line 42) | fn parameters_schema(&self) -> serde_json::Value { method execute (line 62) | async fn execute(&self, args: serde_json::Value) -> anyhow::Result Option { function probe_read_memory (line 147) | fn probe_read_memory(chip: &str, address: u64, length: usize) -> anyhow:... FILE: src/tools/http_request.rs type HttpRequestTool (line 10) | pub struct HttpRequestTool { method new (line 19) | pub fn new( method validate_url (line 35) | fn validate_url(&self, raw_url: &str) -> anyhow::Result { method validate_method (line 69) | fn validate_method(&self, method: &str) -> anyhow::Result Vec<(String, S... method redact_headers_for_display (line 94) | fn redact_headers_for_display(headers: &[(String, String)]) -> Vec<(St... method execute_request (line 113) | async fn execute_request( method truncate_response (line 146) | fn truncate_response(&self, text: &str) -> String { method name (line 166) | fn name(&self) -> &str { method description (line 170) | fn description(&self) -> &str { method parameters_schema (line 175) | fn parameters_schema(&self) -> serde_json::Value { method execute (line 202) | async fn execute(&self, args: serde_json::Value) -> anyhow::Result) -> Vec { function normalize_domain (line 319) | fn normalize_domain(raw: &str) -> Option { function extract_host (line 348) | fn extract_host(url: &str) -> anyhow::Result { function host_matches_allowlist (line 386) | fn host_matches_allowlist(host: &str, allowed_domains: &[String]) -> bool { function is_private_or_local_host (line 399) | fn is_private_or_local_host(host: &str) -> bool { function is_non_global_v4 (line 426) | fn is_non_global_v4(v4: std::net::Ipv4Addr) -> bool { function is_non_global_v6 (line 443) | fn is_non_global_v6(v6: std::net::Ipv6Addr) -> bool { function test_tool (line 459) | fn test_tool(allowed_domains: Vec<&str>) -> HttpRequestTool { function test_tool_with_private (line 463) | fn test_tool_with_private( function normalize_domain_strips_scheme_path_and_case (line 481) | fn normalize_domain_strips_scheme_path_and_case() { function normalize_allowed_domains_deduplicates (line 487) | fn normalize_allowed_domains_deduplicates() { function validate_accepts_exact_domain (line 497) | fn validate_accepts_exact_domain() { function validate_accepts_http (line 504) | fn validate_accepts_http() { function validate_accepts_subdomain (line 510) | fn validate_accepts_subdomain() { function validate_accepts_wildcard_allowlist_for_public_host (line 516) | fn validate_accepts_wildcard_allowlist_for_public_host() { function validate_wildcard_allowlist_still_rejects_private_host (line 522) | fn validate_wildcard_allowlist_still_rejects_private_host() { function validate_rejects_allowlist_miss (line 532) | fn validate_rejects_allowlist_miss() { function validate_rejects_localhost (line 542) | fn validate_rejects_localhost() { function validate_rejects_private_ipv4 (line 552) | fn validate_rejects_private_ipv4() { function validate_rejects_whitespace (line 562) | fn validate_rejects_whitespace() { function validate_rejects_userinfo (line 572) | fn validate_rejects_userinfo() { function validate_requires_allowlist (line 582) | fn validate_requires_allowlist() { function validate_accepts_valid_methods (line 593) | fn validate_accepts_valid_methods() { function validate_rejects_invalid_method (line 605) | fn validate_rejects_invalid_method() { function blocks_multicast_ipv4 (line 612) | fn blocks_multicast_ipv4() { function blocks_broadcast (line 618) | fn blocks_broadcast() { function blocks_reserved_ipv4 (line 623) | fn blocks_reserved_ipv4() { function blocks_documentation_ranges (line 629) | fn blocks_documentation_ranges() { function blocks_benchmarking_range (line 636) | fn blocks_benchmarking_range() { function blocks_ipv6_localhost (line 642) | fn blocks_ipv6_localhost() { function blocks_ipv6_multicast (line 648) | fn blocks_ipv6_multicast() { function blocks_ipv6_link_local (line 653) | fn blocks_ipv6_link_local() { function blocks_ipv6_unique_local (line 658) | fn blocks_ipv6_unique_local() { function blocks_ipv4_mapped_ipv6 (line 663) | fn blocks_ipv4_mapped_ipv6() { function allows_public_ipv4 (line 670) | fn allows_public_ipv4() { function blocks_ipv6_documentation_range (line 677) | fn blocks_ipv6_documentation_range() { function allows_public_ipv6 (line 682) | fn allows_public_ipv6() { function blocks_shared_address_space (line 687) | fn blocks_shared_address_space() { function execute_blocks_readonly_mode (line 695) | async fn execute_blocks_readonly_mode() { function execute_blocks_when_rate_limited (line 710) | async fn execute_blocks_when_rate_limited() { function truncate_response_within_limit (line 725) | fn truncate_response_within_limit() { function truncate_response_over_limit (line 732) | fn truncate_response_over_limit() { function truncate_response_zero_means_unlimited (line 747) | fn truncate_response_zero_means_unlimited() { function truncate_response_nonzero_still_truncates (line 760) | fn truncate_response_nonzero_still_truncates() { function parse_headers_preserves_original_values (line 775) | fn parse_headers_preserves_original_values() { function redact_headers_for_display_redacts_sensitive (line 796) | fn redact_headers_for_display_redacts_sensitive() { function redact_headers_does_not_alter_original (line 820) | fn redact_headers_does_not_alter_original() { function ssrf_octal_loopback_not_parsed_as_ip (line 833) | fn ssrf_octal_loopback_not_parsed_as_ip() { function ssrf_hex_loopback_not_parsed_as_ip (line 840) | fn ssrf_hex_loopback_not_parsed_as_ip() { function ssrf_decimal_loopback_not_parsed_as_ip (line 846) | fn ssrf_decimal_loopback_not_parsed_as_ip() { function ssrf_zero_padded_loopback_not_parsed_as_ip (line 852) | fn ssrf_zero_padded_loopback_not_parsed_as_ip() { function ssrf_alternate_notations_rejected_by_validate_url (line 858) | fn ssrf_alternate_notations_rejected_by_validate_url() { function redirect_policy_is_none (line 877) | fn redirect_policy_is_none() { function ssrf_blocks_loopback_127_range (line 887) | fn ssrf_blocks_loopback_127_range() { function ssrf_blocks_rfc1918_10_range (line 894) | fn ssrf_blocks_rfc1918_10_range() { function ssrf_blocks_rfc1918_172_range (line 900) | fn ssrf_blocks_rfc1918_172_range() { function ssrf_blocks_unspecified_address (line 906) | fn ssrf_blocks_unspecified_address() { function ssrf_blocks_dot_localhost_subdomain (line 911) | fn ssrf_blocks_dot_localhost_subdomain() { function ssrf_blocks_dot_local_tld (line 917) | fn ssrf_blocks_dot_local_tld() { function ssrf_ipv6_unspecified (line 922) | fn ssrf_ipv6_unspecified() { function validate_rejects_ftp_scheme (line 927) | fn validate_rejects_ftp_scheme() { function validate_rejects_empty_url (line 937) | fn validate_rejects_empty_url() { function validate_rejects_ipv6_host (line 944) | fn validate_rejects_ipv6_host() { function default_blocks_private_hosts (line 956) | fn default_blocks_private_hosts() { function allow_private_hosts_permits_localhost (line 976) | fn allow_private_hosts_permits_localhost() { function allow_private_hosts_permits_private_ipv4 (line 982) | fn allow_private_hosts_permits_private_ipv4() { function allow_private_hosts_permits_rfc1918_with_wildcard (line 988) | fn allow_private_hosts_permits_rfc1918_with_wildcard() { function allow_private_hosts_still_requires_allowlist (line 997) | fn allow_private_hosts_still_requires_allowlist() { function allow_private_hosts_false_still_blocks (line 1010) | fn allow_private_hosts_false_still_blocks() { FILE: src/tools/image_info.rs constant MAX_IMAGE_BYTES (line 10) | const MAX_IMAGE_BYTES: u64 = 5_242_880; type ImageInfoTool (line 17) | pub struct ImageInfoTool { method new (line 22) | pub fn new(security: Arc) -> Self { method detect_format (line 27) | fn detect_format(bytes: &[u8]) -> &'static str { method extract_dimensions (line 48) | fn extract_dimensions(bytes: &[u8], format: &str) -> Option<(u32, u32)> { method jpeg_dimensions (line 87) | fn jpeg_dimensions(bytes: &[u8]) -> Option<(u32, u32)> { method name (line 123) | fn name(&self) -> &str { method description (line 127) | fn description(&self) -> &str { method parameters_schema (line 131) | fn parameters_schema(&self) -> serde_json::Value { method execute (line 148) | async fn execute(&self, args: serde_json::Value) -> anyhow::Result Arc { function image_info_tool_name (line 247) | fn image_info_tool_name() { function image_info_tool_description (line 253) | fn image_info_tool_description() { function image_info_tool_schema (line 260) | fn image_info_tool_schema() { function image_info_tool_spec (line 270) | fn image_info_tool_spec() { function detect_png (line 280) | fn detect_png() { function detect_jpeg (line 286) | fn detect_jpeg() { function detect_gif (line 292) | fn detect_gif() { function detect_webp (line 298) | fn detect_webp() { function detect_bmp (line 304) | fn detect_bmp() { function detect_unknown_short (line 310) | fn detect_unknown_short() { function detect_unknown_garbage (line 316) | fn detect_unknown_garbage() { function png_dimensions (line 324) | fn png_dimensions() { function gif_dimensions (line 339) | fn gif_dimensions() { function bmp_dimensions (line 350) | fn bmp_dimensions() { function jpeg_dimensions (line 369) | fn jpeg_dimensions() { function jpeg_malformed_zero_length_segment (line 389) | fn jpeg_malformed_zero_length_segment() { function unknown_format_no_dimensions (line 401) | fn unknown_format_no_dimensions() { function execute_missing_path (line 410) | async fn execute_missing_path() { function execute_nonexistent_file (line 417) | async fn execute_nonexistent_file() { function execute_real_file (line 428) | async fn execute_real_file() { function execute_with_base64 (line 468) | async fn execute_with_base64() { FILE: src/tools/jira_tool.rs constant JIRA_SEARCH_PAGE_SIZE (line 9) | const JIRA_SEARCH_PAGE_SIZE: u32 = 100; constant MAX_ERROR_BODY_CHARS (line 10) | const MAX_ERROR_BODY_CHARS: usize = 500; type LevelOfDetails (line 14) | enum LevelOfDetails { type JiraTool (line 28) | pub struct JiraTool { method new (line 39) | pub fn new( method is_action_allowed (line 58) | fn is_action_allowed(&self, action: &str) -> bool { method get_ticket (line 62) | async fn get_ticket( method search_tickets (line 133) | async fn search_tickets( method comment_ticket (line 206) | async fn comment_ticket( method resolve_email (line 256) | async fn resolve_email(&self, email: &str) -> Option<(String, String)> { method name (line 287) | fn name(&self) -> &str { method description (line 291) | fn description(&self) -> &str { method parameters_schema (line 295) | fn parameters_schema(&self) -> serde_json::Value { method execute (line 331) | async fn execute(&self, args: serde_json::Value) -> anyhow::Result anyhow::Result<()> { function date_prefix (line 483) | fn date_prefix(s: &str) -> &str { function shape_basic (line 487) | fn shape_basic(raw: &Value) -> Value { function shape_basic_search (line 531) | fn shape_basic_search(raw: &Value) -> Value { function shape_full (line 544) | fn shape_full(raw: &Value) -> Value { function shape_changelog (line 567) | fn shape_changelog(raw: &Value) -> Value { function shape_comment_response (line 576) | fn shape_comment_response(raw: &Value) -> Value { function clean_email (line 589) | fn clean_email(s: &str) -> &str { function extract_emails (line 594) | fn extract_emails(text: &str) -> Vec { function parse_inline (line 609) | fn parse_inline(text: &str, mentions: &HashMap... function build_adf (line 695) | fn build_adf(text: &str, mentions: &HashMap) -... function test_tool (line 747) | fn test_tool(allowed_actions: Vec<&str>) -> JiraTool { function tool_name_is_jira (line 763) | fn tool_name_is_jira() { function parameters_schema_has_required_action (line 768) | fn parameters_schema_has_required_action() { function parameters_schema_defines_all_actions (line 775) | fn parameters_schema_defines_all_actions() { function execute_missing_action_returns_error (line 785) | async fn execute_missing_action_returns_error() { function execute_unknown_action_returns_error (line 795) | async fn execute_unknown_action_returns_error() { function execute_disallowed_action_returns_error (line 805) | async fn execute_disallowed_action_returns_error() { function execute_get_ticket_missing_key_returns_error (line 817) | async fn execute_get_ticket_missing_key_returns_error() { function execute_search_tickets_missing_jql_returns_error (line 827) | async fn execute_search_tickets_missing_jql_returns_error() { function execute_comment_ticket_missing_key_returns_error (line 837) | async fn execute_comment_ticket_missing_key_returns_error() { function execute_comment_ticket_missing_comment_returns_error (line 847) | async fn execute_comment_ticket_missing_comment_returns_error() { function execute_comment_ticket_empty_comment_returns_error (line 857) | async fn execute_comment_ticket_empty_comment_returns_error() { function execute_comment_blocked_in_readonly_mode (line 867) | async fn execute_comment_blocked_in_readonly_mode() { function validate_issue_key_accepts_valid_keys (line 895) | fn validate_issue_key_accepts_valid_keys() { function validate_issue_key_rejects_path_traversal (line 905) | fn validate_issue_key_rejects_path_traversal() { function validate_issue_key_rejects_malformed (line 911) | fn validate_issue_key_rejects_malformed() { function build_adf_plain_text (line 921) | fn build_adf_plain_text() { function build_adf_bold (line 931) | fn build_adf_bold() { function build_adf_unmatched_bold_is_literal (line 939) | fn build_adf_unmatched_bold_is_literal() { function build_adf_bullet_list (line 946) | fn build_adf_bullet_list() { function build_adf_mention_resolved (line 955) | fn build_adf_mention_resolved() { function build_adf_unresolved_mention_rendered_as_plain_text (line 974) | fn build_adf_unresolved_mention_rendered_as_plain_text() { function extract_emails_finds_at_prefixed_emails (line 981) | fn extract_emails_finds_at_prefixed_emails() { function extract_emails_deduplicates (line 987) | fn extract_emails_deduplicates() { function extract_emails_deduplicates_non_adjacent (line 993) | fn extract_emails_deduplicates_non_adjacent() { function extract_emails_strips_trailing_punctuation (line 999) | fn extract_emails_strips_trailing_punctuation() { function extract_emails_strips_leading_punctuation (line 1005) | fn extract_emails_strips_leading_punctuation() { function shape_basic_search_extracts_expected_fields (line 1011) | fn shape_basic_search_extracts_expected_fields() { function shape_changelog_extracts_key_and_changelog (line 1034) | fn shape_changelog_extracts_key_and_changelog() { function shape_comment_response_extracts_id_author_created (line 1047) | fn shape_comment_response_extracts_id_author_created() { function date_prefix_normal_date_string (line 1066) | fn date_prefix_normal_date_string() { function date_prefix_empty_string (line 1071) | fn date_prefix_empty_string() { function date_prefix_short_string (line 1076) | fn date_prefix_short_string() { function date_prefix_exactly_ten_chars (line 1081) | fn date_prefix_exactly_ten_chars() { function shape_basic_uses_o1_comment_lookup (line 1086) | fn shape_basic_uses_o1_comment_lookup() { FILE: src/tools/knowledge_tool.rs type KnowledgeTool (line 13) | pub struct KnowledgeTool { method new (line 18) | pub fn new(graph: Arc) -> Self { method handle_capture (line 119) | fn handle_capture(&self, args: &serde_json::Value) -> anyhow::Result anyhow::Result anyhow::Result anyhow::Result anyhow::Resu... method handle_lessons_extract (line 341) | fn handle_lessons_extract(&self, args: &serde_json::Value) -> anyhow::... method handle_graph_stats (line 399) | fn handle_graph_stats(&self) -> anyhow::Result { method name (line 25) | fn name(&self) -> &str { method description (line 29) | fn description(&self) -> &str { method parameters_schema (line 33) | fn parameters_schema(&self) -> serde_json::Value { method execute (line 95) | async fn execute(&self, args: serde_json::Value) -> anyhow::Result String { function test_tool (line 430) | fn test_tool() -> (TempDir, KnowledgeTool) { function capture_returns_node_id (line 438) | async fn capture_returns_node_id() { function search_returns_results (line 457) | async fn search_returns_results() { function relate_creates_edge (line 483) | async fn relate_creates_edge() { function graph_stats_reports_counts (line 522) | async fn graph_stats_reports_counts() { function lessons_extract_finds_signal_sentences (line 544) | async fn lessons_extract_finds_signal_sentences() { function unknown_action_returns_error (line 560) | async fn unknown_action_returns_error() { function name_and_schema_are_valid (line 571) | fn name_and_schema_are_valid() { FILE: src/tools/linkedin.rs type LinkedInTool (line 10) | pub struct LinkedInTool { method new (line 19) | pub fn new( method is_write_action (line 35) | fn is_write_action(action: &str) -> bool { method build_content_strategy_summary (line 39) | fn build_content_strategy_summary(&self) -> String { method name (line 88) | fn name(&self) -> &str { method description (line 92) | fn description(&self) -> &str { method parameters_schema (line 96) | fn parameters_schema(&self) -> serde_json::Value { method execute (line 161) | async fn execute(&self, args: serde_json::Value) -> anyhow::Result Arc... function make_tool (line 458) | fn make_tool(level: AutonomyLevel, max_actions: u32) -> LinkedInTool { function tool_name (line 469) | fn tool_name() { function tool_description (line 475) | fn tool_description() { function parameters_schema_has_required_action (line 482) | fn parameters_schema_has_required_action() { function parameters_schema_has_all_properties (line 491) | fn parameters_schema_has_all_properties() { function write_actions_blocked_in_readonly_mode (line 508) | async fn write_actions_blocked_in_readonly_mode() { function write_actions_blocked_by_rate_limit (line 533) | async fn write_actions_blocked_by_rate_limit() { function read_actions_not_blocked_in_readonly_mode (line 558) | async fn read_actions_not_blocked_in_readonly_mode() { function read_actions_blocked_by_rate_limit (line 595) | async fn read_actions_blocked_by_rate_limit() { function create_post_requires_text (line 618) | async fn create_post_requires_text() { function create_post_rejects_empty_text (line 630) | async fn create_post_rejects_empty_text() { function article_title_without_url_rejected (line 642) | async fn article_title_without_url_rejected() { function comment_requires_post_id (line 658) | async fn comment_requires_post_id() { function comment_requires_text (line 670) | async fn comment_requires_text() { function react_requires_post_id (line 682) | async fn react_requires_post_id() { function react_requires_reaction_type (line 694) | async fn react_requires_reaction_type() { function delete_post_requires_post_id (line 706) | async fn delete_post_requires_post_id() { function get_engagement_requires_post_id (line 718) | async fn get_engagement_requires_post_id() { function unknown_action_returns_error (line 730) | async fn unknown_action_returns_error() { function get_content_strategy_returns_config (line 743) | async fn get_content_strategy_returns_config() { function get_content_strategy_empty_config_shows_hint (line 774) | async fn get_content_strategy_empty_config_shows_hint() { function get_content_strategy_not_rate_limited_as_write (line 786) | async fn get_content_strategy_not_rate_limited_as_write() { function parameters_schema_includes_get_content_strategy (line 798) | fn parameters_schema_includes_get_content_strategy() { FILE: src/tools/linkedin_client.rs constant LINKEDIN_API_BASE (line 8) | const LINKEDIN_API_BASE: &str = "https://api.linkedin.com"; constant LINKEDIN_OAUTH_TOKEN_URL (line 9) | const LINKEDIN_OAUTH_TOKEN_URL: &str = "https://www.linkedin.com/oauth/v... constant LINKEDIN_REQUEST_TIMEOUT_SECS (line 10) | const LINKEDIN_REQUEST_TIMEOUT_SECS: u64 = 30; constant LINKEDIN_CONNECT_TIMEOUT_SECS (line 11) | const LINKEDIN_CONNECT_TIMEOUT_SECS: u64 = 10; type LinkedInClient (line 13) | pub struct LinkedInClient { method new (line 50) | pub fn new(workspace_dir: PathBuf, api_version: String) -> Self { method parse_env_value (line 57) | fn parse_env_value(raw: &str) -> String { method get_credentials (line 76) | pub async fn get_credentials(&self) -> anyhow::Result reqwest::Client { method api_headers (line 139) | fn api_headers(&self, token: &str) -> HeaderMap { method api_request (line 157) | async fn api_request( method create_post (line 197) | pub async fn create_post( method list_posts (line 281) | pub async fn list_posts(&self, count: usize) -> anyhow::Result anyhow::... method add_reaction (line 378) | pub async fn add_reaction(&self, post_id: &str, reaction_type: &str) -... method delete_post (line 401) | pub async fn delete_post(&self, post_id: &str) -> anyhow::Result<()> { method get_engagement (line 418) | pub async fn get_engagement(&self, post_id: &str) -> anyhow::Result anyhow::Result { method refresh_token (line 508) | async fn refresh_token(&self, creds: &LinkedInCredentials) -> anyhow::... method upload_image (line 554) | pub async fn upload_image( method create_post_with_image (line 623) | pub async fn create_post_with_image( method update_env_token (line 687) | async fn update_env_token(&self, new_token: &str) -> anyhow::Result<()> { type LinkedInCredentials (line 19) | pub struct LinkedInCredentials { type PostSummary (line 28) | pub struct PostSummary { type ProfileInfo (line 36) | pub struct ProfileInfo { type EngagementSummary (line 43) | pub struct EngagementSummary { type ImageGenerator (line 766) | pub struct ImageGenerator { method new (line 772) | pub fn new(config: LinkedInImageConfig, workspace_dir: PathBuf) -> Self { method generate (line 780) | pub async fn generate(&self, prompt: &str) -> anyhow::Result { method read_env_var (line 827) | async fn read_env_var(workspace_dir: &Path, var_name: &str) -> anyhow:... method http_client (line 852) | fn http_client() -> reqwest::Client { method try_stability (line 862) | async fn try_stability( method try_imagen (line 916) | async fn try_imagen( method try_dalle (line 970) | async fn try_dalle( method try_flux (line 1019) | async fn try_flux( method generate_fallback_card (line 1072) | pub fn generate_fallback_card(title: &str, accent_color: &str) -> Stri... method cleanup (line 1126) | pub async fn cleanup(path: &Path) -> anyhow::Result<()> { function base64_decode (line 1135) | fn base64_decode(input: &str) -> anyhow::Result> { function word_wrap (line 1143) | fn word_wrap(text: &str, max_width: usize, max_lines: usize) -> Vec String { function credentials_parsed_plain_values (line 1185) | async fn credentials_parsed_plain_values() { function credentials_parsed_with_double_quotes (line 1208) | async fn credentials_parsed_with_double_quotes() { function credentials_parsed_with_single_quotes (line 1230) | async fn credentials_parsed_with_single_quotes() { function credentials_parsed_with_export_prefix (line 1250) | async fn credentials_parsed_with_export_prefix() { function credentials_ignore_comments_and_blanks (line 1272) | async fn credentials_ignore_comments_and_blanks() { function credentials_with_refresh_token (line 1297) | async fn credentials_with_refresh_token() { function credentials_empty_refresh_token_becomes_none (line 1317) | async fn credentials_empty_refresh_token_becomes_none() { function credentials_fail_missing_client_id (line 1337) | async fn credentials_fail_missing_client_id() { function credentials_fail_missing_access_token (line 1354) | async fn credentials_fail_missing_access_token() { function credentials_fail_missing_person_id (line 1371) | async fn credentials_fail_missing_person_id() { function credentials_fail_no_env_file (line 1388) | async fn credentials_fail_no_env_file() { function update_env_token_preserves_other_keys (line 1396) | async fn update_env_token_preserves_other_keys() { function update_env_token_preserves_export_prefix (line 1424) | async fn update_env_token_preserves_export_prefix() { function update_env_token_preserves_single_quote_style (line 1445) | async fn update_env_token_preserves_single_quote_style() { function update_env_token_fails_if_key_missing (line 1465) | async fn update_env_token_fails_if_key_missing() { function parse_env_value_strips_double_quotes (line 1481) | fn parse_env_value_strips_double_quotes() { function parse_env_value_strips_single_quotes (line 1486) | fn parse_env_value_strips_single_quotes() { function parse_env_value_strips_inline_comment (line 1491) | fn parse_env_value_strips_inline_comment() { function parse_env_value_trims_whitespace (line 1496) | fn parse_env_value_trims_whitespace() { function parse_env_value_plain (line 1501) | fn parse_env_value_plain() { function api_headers_contains_required_headers (line 1506) | fn api_headers_contains_required_headers() { function fallback_card_contains_svg_structure (line 1531) | fn fallback_card_contains_svg_structure() { function fallback_card_escapes_xml_characters (line 1541) | fn fallback_card_escapes_xml_characters() { function fallback_card_truncates_long_titles (line 1552) | fn fallback_card_truncates_long_titles() { function fallback_card_uses_custom_accent_color (line 1561) | fn fallback_card_uses_custom_accent_color() { function word_wrap_basic (line 1568) | fn word_wrap_basic() { function word_wrap_respects_max_lines (line 1576) | fn word_wrap_respects_max_lines() { function word_wrap_single_word (line 1582) | fn word_wrap_single_word() { function word_wrap_empty (line 1589) | fn word_wrap_empty() { function xml_escape_handles_all_special_chars (line 1595) | fn xml_escape_handles_all_special_chars() { function xml_escape_preserves_normal_text (line 1602) | fn xml_escape_preserves_normal_text() { function image_generator_fallback_creates_svg_file (line 1607) | async fn image_generator_fallback_creates_svg_file() { function image_generator_fails_when_no_providers_and_no_fallback (line 1629) | async fn image_generator_fails_when_no_providers_and_no_fallback() { function image_generator_skips_provider_without_key (line 1648) | async fn image_generator_skips_provider_without_key() { function image_generator_cleanup_removes_file (line 1669) | async fn image_generator_cleanup_removes_file() { function image_generator_cleanup_noop_for_missing_file (line 1680) | async fn image_generator_cleanup_noop_for_missing_file() { function read_env_var_reads_value (line 1688) | async fn read_env_var_reads_value() { function read_env_var_fails_for_missing_key (line 1703) | async fn read_env_var_fails_for_missing_key() { function image_config_default_has_all_providers (line 1716) | fn image_config_default_has_all_providers() { FILE: src/tools/mcp_client.rs constant RECV_TIMEOUT_SECS (line 26) | const RECV_TIMEOUT_SECS: u64 = 30; constant DEFAULT_TOOL_TIMEOUT_SECS (line 29) | const DEFAULT_TOOL_TIMEOUT_SECS: u64 = 180; constant MAX_TOOL_TIMEOUT_SECS (line 32) | const MAX_TOOL_TIMEOUT_SECS: u64 = 600; type McpServerInner (line 36) | struct McpServerInner { type McpServer (line 50) | pub struct McpServer { method connect (line 56) | pub async fn connect(config: McpServerConfig) -> Result { method tools (line 152) | pub async fn tools(&self) -> Vec { method name (line 157) | pub async fn name(&self) -> String { method call_tool (line 162) | pub async fn call_tool( type McpRegistry (line 212) | pub struct McpRegistry { method connect_all (line 220) | pub async fn connect_all(configs: &[McpServerConfig]) -> Result { method tool_names (line 251) | pub fn tool_names(&self) -> Vec { method get_tool_def (line 256) | pub async fn get_tool_def(&self, prefixed_name: &str) -> Option bool { method server_count (line 287) | pub fn server_count(&self) -> usize { method tool_count (line 291) | pub fn tool_count(&self) -> usize { function tool_name_prefix_format (line 302) | fn tool_name_prefix_format() { function connect_nonexistent_command_fails_cleanly (line 308) | async fn connect_nonexistent_command_fails_cleanly() { function connect_all_nonfatal_on_single_failure (line 327) | async fn connect_all_nonfatal_on_single_failure() { function http_transport_requires_url (line 347) | fn http_transport_requires_url() { function sse_transport_requires_url (line 358) | fn sse_transport_requires_url() { function empty_registry_is_empty (line 371) | async fn empty_registry_is_empty() { function empty_registry_tool_names_is_empty (line 381) | async fn empty_registry_tool_names_is_empty() { function empty_registry_get_tool_def_returns_none (line 389) | async fn empty_registry_get_tool_def_returns_none() { function empty_registry_call_tool_unknown_name_returns_error (line 398) | async fn empty_registry_call_tool_unknown_name_returns_error() { function connect_all_empty_gives_zero_servers (line 410) | async fn connect_all_empty_gives_zero_servers() { FILE: src/tools/mcp_deferred.rs type DeferredMcpToolStub (line 23) | pub struct DeferredMcpToolStub { method new (line 33) | pub fn new(prefixed_name: String, def: McpToolDef) -> Self { method activate (line 46) | pub fn activate(&self, registry: Arc) -> McpToolWrapper { type DeferredMcpToolSet (line 56) | pub struct DeferredMcpToolSet { method from_registry (line 65) | pub async fn from_registry(registry: Arc) -> Self { method stub_names (line 77) | pub fn stub_names(&self) -> Vec<&str> { method len (line 85) | pub fn len(&self) -> usize { method is_empty (line 90) | pub fn is_empty(&self) -> bool { method get_by_name (line 95) | pub fn get_by_name(&self, name: &str) -> Option<&DeferredMcpToolStub> { method search (line 102) | pub fn search(&self, query: &str, max_results: usize) -> Vec<&Deferred... method activate (line 141) | pub fn activate(&self, name: &str) -> Option> { method tool_spec (line 149) | pub fn tool_spec(&self, name: &str) -> Option { type ActivatedToolSet (line 163) | pub struct ActivatedToolSet { method new (line 168) | pub fn new() -> Self { method activate (line 174) | pub fn activate(&mut self, name: String, tool: Arc) { method is_activated (line 178) | pub fn is_activated(&self, name: &str) -> bool { method get (line 183) | pub fn get(&self, name: &str) -> Option> { method get_resolved (line 192) | pub fn get_resolved(&self, name: &str) -> Option> { method tool_specs (line 217) | pub fn tool_specs(&self) -> Vec { method tool_names (line 221) | pub fn tool_names(&self) -> Vec<&str> { method default (line 227) | fn default() -> Self { function build_deferred_tools_section (line 238) | pub fn build_deferred_tools_section(deferred: &DeferredMcpToolSet) -> St... function make_stub (line 266) | fn make_stub(name: &str, desc: &str) -> DeferredMcpToolStub { function stub_uses_description_from_def (line 276) | fn stub_uses_description_from_def() { function stub_defaults_description_when_none (line 282) | fn stub_defaults_description_when_none() { function activated_set_tracks_activation (line 293) | fn activated_set_tracks_activation() { function activated_set_resolves_unique_suffix (line 327) | fn activated_set_resolves_unique_suffix() { function activated_set_rejects_ambiguous_suffix (line 358) | fn activated_set_rejects_ambiguous_suffix() { function build_deferred_section_empty_when_no_stubs (line 396) | fn build_deferred_section_empty_when_no_stubs() { function build_deferred_section_lists_names (line 410) | fn build_deferred_section_lists_names() { function build_deferred_section_includes_tool_search_instruction (line 432) | fn build_deferred_section_includes_tool_search_instruction() { function build_deferred_section_multiple_servers (line 455) | fn build_deferred_section_multiple_servers() { function keyword_search_ranks_by_hits (line 481) | fn keyword_search_ranks_by_hits() { function get_by_name_returns_correct_stub (line 504) | fn get_by_name_returns_correct_stub() { function search_across_multiple_servers (line 523) | fn search_across_multiple_servers() { FILE: src/tools/mcp_protocol.rs constant JSONRPC_VERSION (line 9) | pub const JSONRPC_VERSION: &str = "2.0"; constant MCP_PROTOCOL_VERSION (line 10) | pub const MCP_PROTOCOL_VERSION: &str = "2024-11-05"; constant PARSE_ERROR (line 13) | pub const PARSE_ERROR: i32 = -32700; constant INVALID_REQUEST (line 14) | pub const INVALID_REQUEST: i32 = -32600; constant METHOD_NOT_FOUND (line 15) | pub const METHOD_NOT_FOUND: i32 = -32601; constant INVALID_PARAMS (line 16) | pub const INVALID_PARAMS: i32 = -32602; constant INTERNAL_ERROR (line 17) | pub const INTERNAL_ERROR: i32 = -32603; type JsonRpcRequest (line 22) | pub struct JsonRpcRequest { method new (line 33) | pub fn new(id: u64, method: impl Into, params: serde_json::Val... method notification (line 43) | pub fn notification(method: impl Into, params: serde_json::Val... type JsonRpcResponse (line 55) | pub struct JsonRpcResponse { type JsonRpcError (line 67) | pub struct JsonRpcError { type McpToolDef (line 76) | pub struct McpToolDef { type McpToolsListResult (line 86) | pub struct McpToolsListResult { function request_serializes_with_id (line 95) | fn request_serializes_with_id() { function notification_omits_id (line 104) | fn notification_omits_id() { function response_deserializes (line 112) | fn response_deserializes() { function tool_def_deserializes_input_schema (line 120) | fn tool_def_deserializes_input_schema() { function request_params_included_when_present (line 130) | fn request_params_included_when_present() { function notification_has_no_id_field_in_serialized_json (line 140) | fn notification_has_no_id_field_in_serialized_json() { function error_response_deserializes_with_code_and_message (line 148) | fn error_response_deserializes_with_code_and_message() { function error_response_with_data_field (line 160) | fn error_response_with_data_field() { function jsonrpc_error_codes_match_spec (line 169) | fn jsonrpc_error_codes_match_spec() { function mcp_protocol_version_constant_is_correct (line 178) | fn mcp_protocol_version_constant_is_correct() { function tool_def_description_is_optional (line 183) | fn tool_def_description_is_optional() { function tools_list_result_deserializes_multiple_tools (line 191) | fn tools_list_result_deserializes_multiple_tools() { function response_round_trip_via_serde (line 201) | fn response_round_trip_via_serde() { function request_new_produces_numeric_id (line 216) | fn request_new_produces_numeric_id() { function tools_list_result_with_empty_tools_array (line 226) | fn tools_list_result_with_empty_tools_array() { FILE: src/tools/mcp_tool.rs type McpToolWrapper (line 16) | pub struct McpToolWrapper { method new (line 29) | pub fn new(prefixed_name: String, def: McpToolDef, registry: Arc &str { method description (line 46) | fn description(&self) -> &str { method parameters_schema (line 50) | fn parameters_schema(&self) -> serde_json::Value { method execute (line 54) | async fn execute(&self, args: serde_json::Value) -> anyhow::Result, schema: serde_json::V... function empty_registry (line 95) | async fn empty_registry() -> Arc { function name_returns_prefixed_name (line 106) | async fn name_returns_prefixed_name() { function description_returns_def_description (line 114) | async fn description_returns_def_description() { function description_falls_back_to_mcp_tool_when_none (line 122) | async fn description_falls_back_to_mcp_tool_when_none() { function parameters_schema_returns_input_schema (line 130) | async fn parameters_schema_returns_input_schema() { function spec_returns_all_three_fields (line 143) | async fn spec_returns_all_three_fields() { function execute_returns_non_fatal_error_for_unknown_tool (line 157) | async fn execute_returns_non_fatal_error_for_unknown_tool() { function execute_success_sets_success_true_and_output (line 177) | async fn execute_success_sets_success_true_and_output() { function execute_strips_approved_field_from_object_args (line 193) | async fn execute_strips_approved_field_from_object_args() { function execute_handles_non_object_args_without_panic (line 216) | async fn execute_handles_non_object_args_without_panic() { FILE: src/tools/mcp_transport.rs constant MAX_LINE_BYTES (line 16) | const MAX_LINE_BYTES: usize = 4 * 1024 * 1024; constant RECV_TIMEOUT_SECS (line 19) | const RECV_TIMEOUT_SECS: u64 = 30; constant MCP_STREAMABLE_ACCEPT (line 22) | const MCP_STREAMABLE_ACCEPT: &str = "application/json, text/event-stream"; constant MCP_JSON_CONTENT_TYPE (line 25) | const MCP_JSON_CONTENT_TYPE: &str = "application/json"; constant MCP_SESSION_ID_HEADER (line 27) | const MCP_SESSION_ID_HEADER: &str = "Mcp-Session-Id"; type McpTransportConn (line 33) | pub trait McpTransportConn: Send + Sync { method send_and_recv (line 35) | async fn send_and_recv(&mut self, request: &JsonRpcRequest) -> Result<... method close (line 38) | async fn close(&mut self) -> Result<()>; method send_and_recv (line 107) | async fn send_and_recv(&mut self, request: &JsonRpcRequest) -> Result<... method close (line 141) | async fn close(&mut self) -> Result<()> { method send_and_recv (line 200) | async fn send_and_recv(&mut self, request: &JsonRpcRequest) -> Result<... method close (line 264) | async fn close(&mut self) -> Result<()> { method send_and_recv (line 712) | async fn send_and_recv(&mut self, request: &JsonRpcRequest) -> Result<... method close (line 898) | async fn close(&mut self) -> Result<()> { type StdioTransport (line 44) | pub struct StdioTransport { method new (line 51) | pub fn new(config: &McpServerConfig) -> Result { method send_raw (line 79) | async fn send_raw(&mut self, line: &str) -> Result<()> { method recv_raw (line 92) | async fn recv_raw(&mut self) -> Result { type HttpTransport (line 150) | pub struct HttpTransport { method new (line 158) | pub fn new(config: &McpServerConfig) -> Result { method apply_session_header (line 178) | fn apply_session_header(&self, req: reqwest::RequestBuilder) -> reqwes... method update_session_id_from_headers (line 186) | fn update_session_id_from_headers(&mut self, headers: &reqwest::header... type SseStreamState (line 273) | enum SseStreamState { type SseTransport (line 279) | pub struct SseTransport { method new (line 292) | pub fn new(config: &McpServerConfig) -> Result { method ensure_connected (line 316) | async fn ensure_connected(&mut self) -> Result<()> { method get_message_url (line 445) | async fn get_message_url(&self) -> Result<(String, bool)> { method maybe_try_alternate_message_url (line 463) | fn maybe_try_alternate_message_url( type SseSharedState (line 484) | struct SseSharedState { function derive_message_url (line 490) | fn derive_message_url(sse_url: &str, message_path: &str) -> Option Option { function extract_json_from_sse_text (line 586) | fn extract_json_from_sse_text(resp_text: &str) -> Cow<'_, str> { function parse_jsonrpc_response_text (line 626) | fn parse_jsonrpc_response_text(resp_text: &str) -> Result bool { function read_first_jsonrpc_from_sse_response (line 650) | async fn read_first_jsonrpc_from_sse_response( function create_transport (line 912) | pub fn create_transport(config: &McpServerConfig) -> Result, security: Arc) -> ... method name (line 23) | fn name(&self) -> &str { method description (line 27) | fn description(&self) -> &str { method parameters_schema (line 31) | fn parameters_schema(&self) -> serde_json::Value { method execute (line 44) | async fn execute(&self, args: serde_json::Value) -> anyhow::Result Arc { function test_mem (line 92) | fn test_mem() -> (TempDir, Arc) { function name_and_schema (line 99) | fn name_and_schema() { function forget_existing (line 107) | async fn forget_existing() { function forget_nonexistent (line 122) | async fn forget_nonexistent() { function forget_missing_key (line 131) | async fn forget_missing_key() { function forget_blocked_in_readonly_mode (line 139) | async fn forget_blocked_in_readonly_mode() { function forget_blocked_when_rate_limited (line 160) | async fn forget_blocked_when_rate_limited() { FILE: src/tools/memory_recall.rs type MemoryRecallTool (line 9) | pub struct MemoryRecallTool { method new (line 14) | pub fn new(memory: Arc) -> Self { method name (line 21) | fn name(&self) -> &str { method description (line 25) | fn description(&self) -> &str { method parameters_schema (line 29) | fn parameters_schema(&self) -> serde_json::Value { method execute (line 46) | async fn execute(&self, args: serde_json::Value) -> anyhow::Result (TempDir, Arc) { function recall_empty (line 104) | async fn recall_empty() { function recall_finds_match (line 113) | async fn recall_finds_match() { function recall_respects_limit (line 130) | async fn recall_respects_limit() { function recall_missing_query (line 153) | async fn recall_missing_query() { function name_and_schema (line 161) | fn name_and_schema() { FILE: src/tools/memory_store.rs type MemoryStoreTool (line 10) | pub struct MemoryStoreTool { method new (line 16) | pub fn new(memory: Arc, security: Arc) -> ... method name (line 23) | fn name(&self) -> &str { method description (line 27) | fn description(&self) -> &str { method parameters_schema (line 31) | fn parameters_schema(&self) -> serde_json::Value { method execute (line 52) | async fn execute(&self, args: serde_json::Value) -> anyhow::Result Arc { function test_mem (line 107) | fn test_mem() -> (TempDir, Arc) { function name_and_schema (line 114) | fn name_and_schema() { function store_core (line 124) | async fn store_core() { function store_with_category (line 140) | async fn store_with_category() { function store_with_custom_category (line 151) | async fn store_with_custom_category() { function store_missing_key (line 168) | async fn store_missing_key() { function store_missing_content (line 176) | async fn store_missing_content() { function store_blocked_in_readonly_mode (line 184) | async fn store_blocked_in_readonly_mode() { function store_blocked_when_rate_limited (line 205) | async fn store_blocked_when_rate_limited() { FILE: src/tools/microsoft365/auth.rs type CachedTokenState (line 11) | pub struct CachedTokenState { method is_expired (line 20) | pub fn is_expired(&self) -> bool { type TokenCache (line 27) | pub struct TokenCache { method new (line 37) | pub fn new( method get_token (line 68) | pub async fn get_token(&self, client: &reqwest::Client) -> anyhow::Res... method acquire_token (line 101) | async fn acquire_token(&self, client: &reqwest::Client) -> anyhow::Res... method client_credentials_flow (line 128) | async fn client_credentials_flow( method device_code_flow (line 176) | async fn device_code_flow(&self, client: &reqwest::Client) -> anyhow::... method refresh_token (line 266) | async fn refresh_token( method load_from_disk (line 316) | fn load_from_disk(path: &std::path::Path) -> Option { method persist_to_disk (line 321) | fn persist_to_disk(&self, state: &CachedTokenState) { type TokenResponse (line 331) | struct TokenResponse { function default_expires_in (line 339) | fn default_expires_in() -> i64 { type DeviceCodeResponse (line 344) | struct DeviceCodeResponse { function default_device_interval (line 353) | fn default_device_interval() -> u64 { function default_device_expires_in (line 357) | fn default_device_expires_in() -> i64 { function token_is_expired_when_past_deadline (line 366) | fn token_is_expired_when_past_deadline() { function token_is_expired_within_buffer (line 376) | fn token_is_expired_within_buffer() { function token_is_valid_when_far_from_expiry (line 386) | fn token_is_valid_when_far_from_expiry() { function load_from_disk_returns_none_for_missing_file (line 396) | fn load_from_disk_returns_none_for_missing_file() { FILE: src/tools/microsoft365/graph_client.rs constant GRAPH_BASE (line 3) | const GRAPH_BASE: &str = "https://graph.microsoft.com/v1.0"; function user_path (line 7) | fn user_path(user_id: &str) -> String { function encode_path_segment (line 16) | fn encode_path_segment(segment: &str) -> String { function mail_list (line 21) | pub async fn mail_list( function mail_send (line 49) | pub async fn mail_send( function teams_message_list (line 100) | pub async fn teams_message_list( function teams_message_send (line 125) | pub async fn teams_message_send( function calendar_events_list (line 164) | pub async fn calendar_events_list( function calendar_event_create (line 191) | pub async fn calendar_event_create( function calendar_event_delete (line 248) | pub async fn calendar_event_delete( function onedrive_list (line 279) | pub async fn onedrive_list( function onedrive_download (line 305) | pub async fn onedrive_download( function sharepoint_search (line 348) | pub async fn sharepoint_search( function extract_graph_error_code (line 380) | fn extract_graph_error_code(body: &str) -> Option { function handle_json_response (line 394) | async fn handle_json_response( function user_path_me (line 416) | fn user_path_me() { function user_path_specific_user (line 421) | fn user_path_specific_user() { function mail_list_url_no_folder (line 426) | fn mail_list_url_no_folder() { function mail_list_url_with_folder (line 433) | fn mail_list_url_with_folder() { function calendar_view_url (line 447) | fn calendar_view_url() { function teams_message_url (line 457) | fn teams_message_url() { function onedrive_root_url (line 470) | fn onedrive_root_url() { function onedrive_path_url (line 480) | fn onedrive_path_url() { function sharepoint_search_url (line 491) | fn sharepoint_search_url() { FILE: src/tools/microsoft365/mod.rs constant MAX_ONEDRIVE_DOWNLOAD_SIZE (line 19) | const MAX_ONEDRIVE_DOWNLOAD_SIZE: usize = 10 * 1024 * 1024; constant DEFAULT_TOP (line 22) | const DEFAULT_TOP: u32 = 25; type Microsoft365Tool (line 24) | pub struct Microsoft365Tool { method new (line 32) | pub fn new( method get_token (line 48) | async fn get_token(&self) -> anyhow::Result { method user_id (line 52) | fn user_id(&self) -> &str { method dispatch (line 56) | async fn dispatch(&self, action: &str, args: &serde_json::Value) -> an... method handle_mail_list (line 78) | async fn handle_mail_list(&self, args: &serde_json::Value) -> anyhow::... method handle_teams_message_list (line 98) | async fn handle_teams_message_list( method handle_calendar_events_list (line 127) | async fn handle_calendar_events_list( method handle_onedrive_list (line 162) | async fn handle_onedrive_list(&self, args: &serde_json::Value) -> anyh... method handle_onedrive_download (line 180) | async fn handle_onedrive_download( method handle_sharepoint_search (line 221) | async fn handle_sharepoint_search( method handle_mail_send (line 247) | async fn handle_mail_send(&self, args: &serde_json::Value) -> anyhow::... method handle_teams_message_send (line 288) | async fn handle_teams_message_send( method handle_calendar_event_create (line 317) | async fn handle_calendar_event_create( method handle_calendar_event_delete (line 364) | async fn handle_calendar_event_delete( method name (line 390) | fn name(&self) -> &str { method description (line 394) | fn description(&self) -> &str { method parameters_schema (line 399) | fn parameters_schema(&self) -> serde_json::Value { method execute (line 486) | async fn execute(&self, args: serde_json::Value) -> anyhow::Result) -> std::fmt::Result { function resolved_config_serialization_roundtrip (line 34) | fn resolved_config_serialization_roundtrip() { FILE: src/tools/mod.rs type DelegateParentToolsHandle (line 165) | pub type DelegateParentToolsHandle = Arc>>>; type ArcToolRef (line 168) | pub struct ArcToolRef(pub Arc); method name (line 172) | fn name(&self) -> &str { method description (line 176) | fn description(&self) -> &str { method parameters_schema (line 180) | fn parameters_schema(&self) -> serde_json::Value { method execute (line 184) | async fn execute(&self, args: serde_json::Value) -> anyhow::Result) -> Box { method name (line 202) | fn name(&self) -> &str { method description (line 206) | fn description(&self) -> &str { method parameters_schema (line 210) | fn parameters_schema(&self) -> serde_json::Value { method execute (line 214) | async fn execute(&self, args: serde_json::Value) -> anyhow::Result>) -> Vec) -> Vec> { function default_tools_with_runtime (line 229) | pub fn default_tools_with_runtime( function all_tools (line 245) | pub fn all_tools( function all_tools_with_runtime (line 278) | pub fn all_tools_with_runtime( function test_config (line 758) | fn test_config(tmp: &TempDir) -> Config { function default_tools_has_expected_count (line 767) | fn default_tools_has_expected_count() { function all_tools_excludes_browser_when_disabled (line 774) | fn all_tools_excludes_browser_when_disabled() { function all_tools_includes_browser_when_enabled (line 816) | fn all_tools_includes_browser_when_enabled() { function default_tools_names (line 858) | fn default_tools_names() { function default_tools_all_have_descriptions (line 871) | fn default_tools_all_have_descriptions() { function default_tools_all_have_schemas (line 884) | fn default_tools_all_have_schemas() { function tool_spec_generation (line 903) | fn tool_spec_generation() { function tool_result_serde (line 915) | fn tool_result_serde() { function tool_result_with_error_serde (line 929) | fn tool_result_with_error_serde() { function tool_spec_serde (line 942) | fn tool_spec_serde() { function all_tools_includes_delegate_when_agents_configured (line 955) | fn all_tools_includes_delegate_when_agents_configured() { function all_tools_excludes_delegate_when_no_agents (line 1006) | fn all_tools_excludes_delegate_when_no_agents() { function all_tools_includes_read_skill_in_compact_mode (line 1039) | fn all_tools_includes_read_skill_in_compact_mode() { function all_tools_excludes_read_skill_in_full_mode (line 1073) | fn all_tools_excludes_read_skill_in_full_mode() { FILE: src/tools/model_routing_config.rs constant DEFAULT_AGENT_MAX_DEPTH (line 11) | const DEFAULT_AGENT_MAX_DEPTH: u32 = 3; constant DEFAULT_AGENT_MAX_ITERATIONS (line 12) | const DEFAULT_AGENT_MAX_ITERATIONS: usize = 10; type ModelRoutingConfigTool (line 14) | pub struct ModelRoutingConfigTool { method new (line 20) | pub fn new(config: Arc, security: Arc) -> Self { method load_config_without_env (line 24) | fn load_config_without_env(&self) -> anyhow::Result { method require_write_access (line 43) | fn require_write_access(&self) -> Option { method parse_string_list (line 63) | fn parse_string_list(raw: &Value, field: &str) -> anyhow::Result anyhow::Result... method parse_optional_string_update (line 104) | fn parse_optional_string_update(args: &Value, field: &str) -> anyhow::... method parse_optional_f64_update (line 127) | fn parse_optional_f64_update(args: &Value, field: &str) -> anyhow::Res... method parse_optional_usize_update (line 142) | fn parse_optional_usize_update(args: &Value, field: &str) -> anyhow::R... method parse_optional_u32_update (line 159) | fn parse_optional_u32_update(args: &Value, field: &str) -> anyhow::Res... method parse_optional_i32_update (line 176) | fn parse_optional_i32_update(args: &Value, field: &str) -> anyhow::Res... method parse_optional_bool (line 193) | fn parse_optional_bool(args: &Value, field: &str) -> anyhow::Result Value { method normalize_and_sort_routes (line 296) | fn normalize_and_sort_routes(routes: &mut Vec) { method normalize_and_sort_rules (line 301) | fn normalize_and_sort_rules(rules: &mut Vec) { method has_rule_matcher (line 310) | fn has_rule_matcher(rule: &ClassificationRule) -> bool { method ensure_rule_defaults (line 317) | fn ensure_rule_defaults(rule: &mut ClassificationRule, hint: &str) { method handle_get (line 323) | fn handle_get(&self) -> anyhow::Result { method handle_list_hints (line 332) | fn handle_list_hints(&self) -> anyhow::Result { method handle_set_default (line 377) | async fn handle_set_default(&self, args: &Value) -> anyhow::Result anyho... method handle_upsert_scenario (line 496) | async fn handle_upsert_scenario(&self, args: &Value) -> anyhow::Result... method handle_remove_scenario (line 629) | async fn handle_remove_scenario(&self, args: &Value) -> anyhow::Result... method handle_upsert_agent (line 674) | async fn handle_upsert_agent(&self, args: &Value) -> anyhow::Result anyhow::Result &str { method description (line 814) | fn description(&self) -> &str { method parameters_schema (line 818) | fn parameters_schema(&self) -> Value { method execute (line 925) | async fn execute(&self, args: Value) -> anyhow::Result { function test_security (line 975) | fn test_security() -> Arc { function readonly_security (line 983) | fn readonly_security() -> Arc { function test_config (line 991) | async fn test_config(tmp: &TempDir) -> Arc { function set_default_updates_provider_model_and_temperature (line 1002) | async fn set_default_updates_provider_model_and_temperature() { function upsert_scenario_creates_route_and_rule (line 1033) | async fn upsert_scenario_creates_route_and_rule() { function remove_scenario_also_removes_rule (line 1068) | async fn remove_scenario_also_removes_rule() { function upsert_and_remove_delegate_agent (line 1100) | async fn upsert_and_remove_delegate_agent() { function read_only_mode_blocks_mutating_actions (line 1139) | async fn read_only_mode_blocks_mutating_actions() { function set_default_skips_probe_without_api_key (line 1157) | async fn set_default_skips_probe_without_api_key() { function set_default_temperature_only_skips_probe (line 1182) | async fn set_default_temperature_only_skips_probe() { FILE: src/tools/model_switch.rs type ModelSwitchTool (line 10) | pub struct ModelSwitchTool { method new (line 15) | pub fn new(security: Arc) -> Self { method handle_get (line 84) | fn handle_get(&self) -> anyhow::Result { method handle_set (line 98) | fn handle_set(&self, args: &serde_json::Value) -> anyhow::Result anyhow::Result { method handle_list_models (line 187) | fn handle_list_models(&self, args: &serde_json::Value) -> anyhow::Resu... method name (line 22) | fn name(&self) -> &str { method description (line 26) | fn description(&self) -> &str { method parameters_schema (line 30) | fn parameters_schema(&self) -> serde_json::Value { method execute (line 52) | async fn execute(&self, args: serde_json::Value) -> anyhow::Result String { method name (line 64) | fn name(&self) -> &str { method description (line 68) | fn description(&self) -> &str { method parameters_schema (line 72) | fn parameters_schema(&self) -> serde_json::Value { method execute (line 76) | async fn execute(&self, args: serde_json::Value) -> anyhow::Result) -> Self { method headers (line 33) | fn headers(&self) -> anyhow::Result { method query_database (line 47) | async fn query_database( method read_page (line 75) | async fn read_page(&self, page_id: &str) -> anyhow::Result anyhow::Result &str { method description (line 174) | fn description(&self) -> &str { method parameters_schema (line 178) | fn parameters_schema(&self) -> serde_json::Value { method execute (line 212) | async fn execute(&self, args: serde_json::Value) -> anyhow::Result NotionTool { function tool_name_is_notion (line 345) | fn tool_name_is_notion() { function parameters_schema_has_required_action (line 351) | fn parameters_schema_has_required_action() { function parameters_schema_defines_all_actions (line 359) | fn parameters_schema_defines_all_actions() { function execute_missing_action_returns_error (line 372) | async fn execute_missing_action_returns_error() { function execute_unknown_action_returns_error (line 380) | async fn execute_unknown_action_returns_error() { function execute_query_database_missing_id_returns_error (line 388) | async fn execute_query_database_missing_id_returns_error() { function execute_read_page_missing_id_returns_error (line 399) | async fn execute_read_page_missing_id_returns_error() { function execute_create_page_missing_properties_returns_error (line 407) | async fn execute_create_page_missing_properties_returns_error() { function execute_update_page_missing_page_id_returns_error (line 418) | async fn execute_update_page_missing_page_id_returns_error() { function execute_update_page_missing_properties_returns_error (line 429) | async fn execute_update_page_missing_properties_returns_error() { FILE: src/tools/pdf_read.rs constant MAX_PDF_BYTES (line 8) | const MAX_PDF_BYTES: u64 = 50 * 1024 * 1024; constant DEFAULT_MAX_CHARS (line 10) | const DEFAULT_MAX_CHARS: usize = 50_000; constant MAX_OUTPUT_CHARS (line 12) | const MAX_OUTPUT_CHARS: usize = 200_000; type PdfReadTool (line 21) | pub struct PdfReadTool { method new (line 26) | pub fn new(security: Arc) -> Self { method name (line 33) | fn name(&self) -> &str { method description (line 37) | fn description(&self) -> &str { method parameters_schema (line 43) | fn parameters_schema(&self) -> serde_json::Value { method execute (line 62) | async fn execute(&self, args: serde_json::Value) -> anyhow::Result Arc { function test_security_with_limit (line 245) | fn test_security_with_limit( function name_is_pdf_read (line 258) | fn name_is_pdf_read() { function description_not_empty (line 264) | fn description_not_empty() { function schema_has_path_required (line 270) | fn schema_has_path_required() { function spec_matches_metadata (line 280) | fn spec_matches_metadata() { function missing_path_param_returns_error (line 288) | async fn missing_path_param_returns_error() { function absolute_path_is_blocked (line 296) | async fn absolute_path_is_blocked() { function path_traversal_is_blocked (line 308) | async fn path_traversal_is_blocked() { function nonexistent_file_returns_error (line 324) | async fn nonexistent_file_returns_error() { function rate_limit_blocks_request (line 340) | async fn rate_limit_blocks_request() { function probing_nonexistent_consumes_rate_limit_budget (line 349) | async fn probing_nonexistent_consumes_rate_limit_budget() { function symlink_escape_is_blocked (line 382) | async fn symlink_escape_is_blocked() { function minimal_pdf_bytes (line 412) | fn minimal_pdf_bytes() -> Vec { function extracts_text_from_valid_pdf (line 444) | async fn extracts_text_from_valid_pdf() { function max_chars_truncates_output (line 467) | async fn max_chars_truncates_output() { function image_only_pdf_returns_empty_text_warning (line 494) | async fn image_only_pdf_returns_empty_text_warning() { function without_feature_returns_clear_error (line 537) | async fn without_feature_returns_clear_error() { FILE: src/tools/project_intel.rs type ProjectIntelTool (line 17) | pub struct ProjectIntelTool { method new (line 50) | pub fn new(default_language: String, risk_sensitivity: String) -> Self { method execute_status_report (line 57) | fn execute_status_report(&self, args: &serde_json::Value) -> anyhow::R... method execute_risk_scan (line 99) | fn execute_risk_scan(&self, args: &serde_json::Value) -> anyhow::Resul... method execute_draft_update (line 206) | fn execute_draft_update(&self, args: &serde_json::Value) -> anyhow::Re... method execute_sprint_summary (line 259) | fn execute_sprint_summary(&self, args: &serde_json::Value) -> anyhow::... method execute_effort_estimate (line 300) | fn execute_effort_estimate(&self, args: &serde_json::Value) -> anyhow:... type RiskSensitivity (line 24) | pub enum RiskSensitivity { method from_str (line 31) | fn from_str(s: &str) -> Self { method threshold_factor (line 40) | fn threshold_factor(self) -> f64 { type RiskItem (line 334) | struct RiskItem { function estimate_task_effort (line 342) | fn estimate_task_effort(description: &str) -> (&'static str, &'static st... method name (line 403) | fn name(&self) -> &str { method description (line 407) | fn description(&self) -> &str { method parameters_schema (line 411) | fn parameters_schema(&self) -> serde_json::Value { method execute (line 499) | async fn execute(&self, args: serde_json::Value) -> anyhow::Result ProjectIntelTool { function tool_name_and_description (line 531) | fn tool_name_and_description() { function parameters_schema_has_action (line 538) | fn parameters_schema_has_action() { function status_report_renders (line 547) | async fn status_report_renders() { function risk_scan_detects_blockers (line 564) | async fn risk_scan_detects_blockers() { function risk_scan_detects_deadline_risk (line 578) | async fn risk_scan_detects_deadline_risk() { function risk_scan_no_signals_returns_low_risk (line 592) | async fn risk_scan_no_signals_returns_low_risk() { function draft_update_formal_client (line 600) | async fn draft_update_formal_client() { function draft_update_casual_internal (line 619) | async fn draft_update_casual_internal() { function sprint_summary_renders (line 637) | async fn sprint_summary_renders() { function effort_estimate_basic (line 655) | async fn effort_estimate_basic() { function effort_estimate_empty_tasks_fails (line 670) | async fn effort_estimate_empty_tasks_fails() { function unknown_action_returns_error (line 681) | async fn unknown_action_returns_error() { function missing_action_returns_error (line 692) | async fn missing_action_returns_error() { function effort_estimate_heuristics_coverage (line 699) | fn effort_estimate_heuristics_coverage() { function risk_sensitivity_threshold_ordering (line 717) | fn risk_sensitivity_threshold_ordering() { function risk_sensitivity_from_str_variants (line 727) | fn risk_sensitivity_from_str_variants() { function high_sensitivity_detects_single_blocker_as_high (line 738) | async fn high_sensitivity_detects_single_blocker_as_high() { FILE: src/tools/proxy_config.rs type ProxyConfigTool (line 12) | pub struct ProxyConfigTool { method new (line 18) | pub fn new(config: Arc, security: Arc) -> Self { method load_config_without_env (line 22) | fn load_config_without_env(&self) -> anyhow::Result { method require_write_access (line 41) | fn require_write_access(&self) -> Option { method parse_scope (line 61) | fn parse_scope(raw: &str) -> Option { method parse_string_list (line 70) | fn parse_string_list(raw: &Value, field: &str) -> anyhow::Result anyhow::... method env_snapshot (line 120) | fn env_snapshot() -> Value { method proxy_json (line 129) | fn proxy_json(proxy: &ProxyConfig) -> Value { method handle_get (line 141) | fn handle_get(&self) -> anyhow::Result { method handle_list_services (line 155) | fn handle_list_services(&self) -> anyhow::Result { method handle_set (line 171) | async fn handle_set(&self, args: &Value) -> anyhow::Result { method handle_disable (line 268) | async fn handle_disable(&self, args: &Value) -> anyhow::Result anyhow::Result { method handle_clear_env (line 325) | fn handle_clear_env(&self) -> anyhow::Result { method name (line 340) | fn name(&self) -> &str { method description (line 344) | fn description(&self) -> &str { method parameters_schema (line 348) | fn parameters_schema(&self) -> Value { method execute (line 399) | async fn execute(&self, args: Value) -> anyhow::Result { function test_security (line 444) | fn test_security() -> Arc { function test_config (line 452) | async fn test_config(tmp: &TempDir) -> Arc { function list_services_action_returns_known_keys (line 463) | async fn list_services_action_returns_known_keys() { function set_scope_services_requires_services_entries (line 477) | async fn set_scope_services_requires_services_entries() { function set_and_get_round_trip_proxy_scope (line 500) | async fn set_and_get_round_trip_proxy_scope() { function set_null_proxy_url_clears_existing_value (line 522) | async fn set_null_proxy_url_clears_existing_value() { FILE: src/tools/pushover.rs constant PUSHOVER_API_URL (line 8) | const PUSHOVER_API_URL: &str = "https://api.pushover.net/1/messages.json"; constant PUSHOVER_REQUEST_TIMEOUT_SECS (line 9) | const PUSHOVER_REQUEST_TIMEOUT_SECS: u64 = 15; type PushoverTool (line 11) | pub struct PushoverTool { method new (line 17) | pub fn new(security: Arc, workspace_dir: PathBuf) -> S... method parse_env_value (line 24) | fn parse_env_value(raw: &str) -> String { method get_credentials (line 44) | async fn get_credentials(&self) -> anyhow::Result<(String, String)> { method name (line 81) | fn name(&self) -> &str { method description (line 85) | fn description(&self) -> &str { method parameters_schema (line 89) | fn parameters_schema(&self) -> serde_json::Value { method execute (line 114) | async fn execute(&self, args: serde_json::Value) -> anyhow::Result Arc... function pushover_tool_name (line 234) | fn pushover_tool_name() { function pushover_tool_description (line 243) | fn pushover_tool_description() { function pushover_tool_has_parameters_schema (line 252) | fn pushover_tool_has_parameters_schema() { function pushover_tool_requires_message (line 263) | fn pushover_tool_requires_message() { function credentials_parsed_from_env_file (line 274) | async fn credentials_parsed_from_env_file() { function credentials_fail_without_env_file (line 296) | async fn credentials_fail_without_env_file() { function credentials_fail_without_token (line 308) | async fn credentials_fail_without_token() { function credentials_fail_without_user_key (line 323) | async fn credentials_fail_without_user_key() { function credentials_ignore_comments (line 338) | async fn credentials_ignore_comments() { function pushover_tool_supports_priority (line 356) | fn pushover_tool_supports_priority() { function pushover_tool_supports_sound (line 366) | fn pushover_tool_supports_sound() { function credentials_support_export_and_quoted_values (line 376) | async fn credentials_support_export_and_quoted_values() { function execute_blocks_readonly_mode (line 398) | async fn execute_blocks_readonly_mode() { function execute_blocks_rate_limit (line 410) | async fn execute_blocks_rate_limit() { function execute_rejects_priority_out_of_range (line 419) | async fn execute_rejects_priority_out_of_range() { FILE: src/tools/read_skill.rs type ReadSkillTool (line 7) | pub struct ReadSkillTool { method new (line 14) | pub fn new( method name (line 29) | fn name(&self) -> &str { method description (line 33) | fn description(&self) -> &str { method parameters_schema (line 37) | fn parameters_schema(&self) -> serde_json::Value { method execute (line 50) | async fn execute(&self, args: serde_json::Value) -> anyhow::Result ReadSkillTool { function reads_markdown_skill_by_name (line 125) | async fn reads_markdown_skill_by_name() { function reads_toml_skill_manifest_by_name (line 146) | async fn reads_toml_skill_manifest_by_name() { function unknown_skill_lists_available_names (line 170) | async fn unknown_skill_lists_available_names() { FILE: src/tools/report_templates.rs type ReportFormat (line 11) | pub enum ReportFormat { type TemplateSection (line 18) | pub struct TemplateSection { type ReportTemplate (line 25) | pub struct ReportTemplate { method render (line 42) | pub fn render(&self, vars: &HashMap) -> String { function escape_html (line 32) | fn escape_html(s: &str) -> String { function substitute (line 68) | fn substitute(template: &str, vars: &HashMap) -> String { function weekly_status_template (line 99) | pub fn weekly_status_template(lang: &str) -> ReportTemplate { function sprint_review_template (line 210) | pub fn sprint_review_template(lang: &str) -> ReportTemplate { function risk_register_template (line 321) | pub fn risk_register_template(lang: &str) -> ReportTemplate { function milestone_report_template (line 400) | pub fn milestone_report_template(lang: &str) -> ReportTemplate { function weekly_status_renders_with_variables (line 483) | fn weekly_status_renders_with_variables() { function weekly_status_de_renders_german_headings (line 501) | fn weekly_status_de_renders_german_headings() { function weekly_status_fr_renders_french_headings (line 510) | fn weekly_status_fr_renders_french_headings() { function weekly_status_it_renders_italian_headings (line 519) | fn weekly_status_it_renders_italian_headings() { function html_format_renders_tags (line 528) | fn html_format_renders_tags() { function sprint_review_template_has_velocity_section (line 545) | fn sprint_review_template_has_velocity_section() { function risk_register_template_has_risk_sections (line 552) | fn risk_register_template_has_risk_sections() { function milestone_template_all_languages (line 560) | fn milestone_template_all_languages() { function substitute_leaves_unknown_placeholders (line 569) | fn substitute_leaves_unknown_placeholders() { function substitute_replaces_all_occurrences (line 576) | fn substitute_replaces_all_occurrences() { FILE: src/tools/schedule.rs type ScheduleTool (line 12) | pub struct ScheduleTool { method new (line 18) | pub fn new(security: Arc, config: Config) -> Self { method enforce_mutation_allowed (line 139) | fn enforce_mutation_allowed(&self, action: &str) -> Option { method handle_list (line 171) | fn handle_list(&self) -> Result { method handle_get (line 214) | fn handle_get(&self, id: &str) -> Result { method handle_create_like (line 241) | fn handle_create_like( method handle_cancel (line 393) | fn handle_cancel(&self, id: &str) -> ToolResult { method handle_pause_resume (line 408) | fn handle_pause_resume(&self, id: &str, pause: bool) -> ToolResult { method name (line 25) | fn name(&self) -> &str { method description (line 29) | fn description(&self) -> &str { method parameters_schema (line 36) | fn parameters_schema(&self) -> serde_json::Value { method execute (line 75) | async fn execute(&self, args: serde_json::Value) -> Result { function test_setup (line 440) | async fn test_setup() -> (TempDir, Config, Arc) { function tool_name_and_schema (line 458) | async fn tool_name_and_schema() { function list_empty (line 467) | async fn list_empty() { function create_get_and_cancel_roundtrip (line 477) | async fn create_get_and_cancel_roundtrip() { function once_and_pause_resume_aliases_work (line 513) | async fn once_and_pause_resume_aliases_work() { function readonly_blocks_mutating_actions (line 552) | async fn readonly_blocks_mutating_actions() { function rate_limit_blocks_create_action (line 589) | async fn rate_limit_blocks_create_action() { function rate_limit_blocks_cancel_and_keeps_job (line 631) | async fn rate_limit_blocks_cancel_and_keeps_job() { function unknown_action_returns_failure (line 683) | async fn unknown_action_returns_failure() { function mutating_actions_fail_when_cron_disabled (line 693) | async fn mutating_actions_fail_when_cron_disabled() { function create_blocks_disallowed_command (line 726) | async fn create_blocks_disallowed_command() { function medium_risk_create_requires_approval (line 760) | async fn medium_risk_create_requires_approval() { FILE: src/tools/schema.rs constant GEMINI_UNSUPPORTED_KEYWORDS (line 58) | pub const GEMINI_UNSUPPORTED_KEYWORDS: &[&str] = &[ constant SCHEMA_META_KEYS (line 89) | const SCHEMA_META_KEYS: &[&str] = &["description", "title", "default"]; type CleaningStrategy (line 93) | pub enum CleaningStrategy { method unsupported_keywords (line 106) | pub fn unsupported_keywords(self) -> &'static [&'static str] { type SchemaCleanr (line 117) | pub struct SchemaCleanr; method clean_for_gemini (line 124) | pub fn clean_for_gemini(schema: Value) -> Value { method clean_for_anthropic (line 129) | pub fn clean_for_anthropic(schema: Value) -> Value { method clean_for_openai (line 134) | pub fn clean_for_openai(schema: Value) -> Value { method clean (line 139) | pub fn clean(schema: Value, strategy: CleaningStrategy) -> Value { method validate (line 153) | pub fn validate(schema: &Value) -> anyhow::Result<()> { method extract_defs (line 178) | fn extract_defs(obj: &Map) -> HashMap { method clean_with_defs (line 199) | fn clean_with_defs( method clean_object (line 217) | fn clean_object( method resolve_ref (line 291) | fn resolve_ref( method parse_local_ref (line 320) | fn parse_local_ref(ref_value: &str) -> Option { method decode_json_pointer (line 328) | fn decode_json_pointer(segment: &str) -> String { method try_simplify_union (line 358) | fn try_simplify_union( method is_null_schema (line 400) | fn is_null_schema(value: &Value) -> bool { method try_flatten_literal_union (line 425) | fn try_flatten_literal_union(variants: &[Value]) -> Option { method clean_type_array (line 469) | fn clean_type_array(value: Value) -> Value { method clean_properties (line 490) | fn clean_properties( method clean_union (line 508) | fn clean_union( method preserve_meta (line 526) | fn preserve_meta(source: &Map, mut target: Value) -> Va... function test_remove_unsupported_keywords (line 543) | fn test_remove_unsupported_keywords() { function test_resolve_ref (line 562) | fn test_resolve_ref() { function test_flatten_literal_union (line 586) | fn test_flatten_literal_union() { function test_strip_null_from_union (line 607) | fn test_strip_null_from_union() { function test_const_to_enum (line 623) | fn test_const_to_enum() { function test_preserve_metadata (line 637) | fn test_preserve_metadata() { function test_circular_ref_prevention (line 659) | fn test_circular_ref_prevention() { function test_validate_schema (line 687) | fn test_validate_schema() { function test_strategy_differences (line 707) | fn test_strategy_differences() { function test_nested_properties (line 727) | fn test_nested_properties() { function test_type_array_null_removal (line 755) | fn test_type_array_null_removal() { function test_type_array_only_null_preserved (line 767) | fn test_type_array_only_null_preserved() { function test_ref_with_json_pointer_escape (line 778) | fn test_ref_with_json_pointer_escape() { function test_skip_type_when_non_simplifiable_union_exists (line 794) | fn test_skip_type_when_non_simplifiable_union_exists() { function test_clean_nested_unknown_schema_keyword (line 820) | fn test_clean_nested_unknown_schema_keyword() { FILE: src/tools/screenshot.rs constant SCREENSHOT_TIMEOUT_SECS (line 11) | const SCREENSHOT_TIMEOUT_SECS: u64 = 15; constant MAX_BASE64_BYTES (line 13) | const MAX_BASE64_BYTES: usize = 2_097_152; type ScreenshotTool (line 19) | pub struct ScreenshotTool { method new (line 24) | pub fn new(security: Arc) -> Self { method screenshot_command (line 29) | fn screenshot_command(output_path: &str) -> Option> { method capture (line 58) | async fn capture(&self, args: serde_json::Value) -> anyhow::Result anyhow::Res... method name (line 220) | fn name(&self) -> &str { method description (line 224) | fn description(&self) -> &str { method parameters_schema (line 228) | fn parameters_schema(&self) -> serde_json::Value { method execute (line 244) | async fn execute(&self, args: serde_json::Value) -> anyhow::Result Arc { function screenshot_tool_name (line 270) | fn screenshot_tool_name() { function screenshot_tool_description (line 276) | fn screenshot_tool_description() { function screenshot_tool_schema (line 283) | fn screenshot_tool_schema() { function screenshot_tool_spec (line 291) | fn screenshot_tool_spec() { function screenshot_command_exists (line 300) | fn screenshot_command_exists() { function screenshot_rejects_shell_injection_filename (line 308) | async fn screenshot_rejects_shell_injection_filename() { function screenshot_command_contains_output_path (line 319) | fn screenshot_command_contains_output_path() { FILE: src/tools/security_ops.rs type SecurityOpsTool (line 19) | pub struct SecurityOpsTool { method new (line 25) | pub fn new(config: SecurityOpsConfig) -> Self { method triage_alert (line 32) | fn triage_alert(&self, args: &serde_json::Value) -> anyhow::Result anyhow::Result anyhow::Res... method generate_report (line 184) | fn generate_report(&self, args: &serde_json::Value) -> anyhow::Result<... method list_playbooks (line 236) | fn list_playbooks(&self) -> anyhow::Result { method alert_stats (line 267) | fn alert_stats(&self, args: &serde_json::Value) -> anyhow::Result String { function expand_tilde (line 336) | fn expand_tilde(path: &str) -> PathBuf { method name (line 347) | fn name(&self) -> &str { method description (line 351) | fn description(&self) -> &str { method parameters_schema (line 358) | fn parameters_schema(&self) -> serde_json::Value { method execute (line 411) | async fn execute(&self, args: serde_json::Value) -> anyhow::Result SecurityOpsConfig { function test_tool (line 452) | fn test_tool() -> SecurityOpsTool { function tool_name_and_schema (line 457) | fn tool_name_and_schema() { function triage_alert_classifies_severity (line 469) | async fn triage_alert_classifies_severity() { function triage_alert_missing_alert_param (line 494) | async fn triage_alert_missing_alert_param() { function run_playbook_requires_approval (line 501) | async fn run_playbook_requires_approval() { function run_playbook_executes_safe_step (line 520) | async fn run_playbook_executes_safe_step() { function run_playbook_not_found (line 538) | async fn run_playbook_not_found() { function parse_vulnerability_valid_report (line 552) | async fn parse_vulnerability_valid_report() { function generate_report_produces_markdown (line 586) | async fn generate_report_produces_markdown() { function list_playbooks_returns_builtins (line 604) | async fn list_playbooks_returns_builtins() { function alert_stats_computes_summary (line 620) | async fn alert_stats_computes_summary() { function unknown_action_returns_error (line 645) | async fn unknown_action_returns_error() { function format_duration_secs_readable (line 654) | fn format_duration_secs_readable() { FILE: src/tools/shell.rs constant SHELL_TIMEOUT_SECS (line 12) | const SHELL_TIMEOUT_SECS: u64 = 60; constant MAX_OUTPUT_BYTES (line 14) | const MAX_OUTPUT_BYTES: usize = 1_048_576; constant SAFE_ENV_VARS (line 19) | const SAFE_ENV_VARS: &[&str] = &[ constant SAFE_ENV_VARS (line 26) | const SAFE_ENV_VARS: &[&str] = &[ type ShellTool (line 45) | pub struct ShellTool { method new (line 52) | pub fn new(security: Arc, runtime: Arc bool { function collect_allowed_shell_env_vars (line 82) | fn collect_allowed_shell_env_vars(security: &SecurityPolicy) -> Vec &str { method description (line 107) | fn description(&self) -> &str { method parameters_schema (line 111) | fn parameters_schema(&self) -> serde_json::Value { method execute (line 129) | async fn execute(&self, args: serde_json::Value) -> anyhow::Result Arc { function test_runtime (line 272) | fn test_runtime() -> Arc { function shell_tool_name (line 277) | fn shell_tool_name() { function shell_tool_description (line 283) | fn shell_tool_description() { function shell_tool_schema_has_command (line 289) | fn shell_tool_schema_has_command() { function shell_executes_allowed_command (line 301) | async fn shell_executes_allowed_command() { function shell_blocks_disallowed_command (line 313) | async fn shell_blocks_disallowed_command() { function shell_blocks_readonly (line 325) | async fn shell_blocks_readonly() { function shell_missing_command_param (line 340) | async fn shell_missing_command_param() { function shell_wrong_type_param (line 348) | async fn shell_wrong_type_param() { function shell_captures_exit_code (line 355) | async fn shell_captures_exit_code() { function shell_blocks_absolute_path_argument (line 365) | async fn shell_blocks_absolute_path_argument() { function shell_blocks_option_assignment_path_argument (line 380) | async fn shell_blocks_option_assignment_path_argument() { function shell_blocks_short_option_attached_path_argument (line 395) | async fn shell_blocks_short_option_attached_path_argument() { function shell_blocks_tilde_user_path_argument (line 410) | async fn shell_blocks_tilde_user_path_argument() { function shell_blocks_input_redirection_path_bypass (line 425) | async fn shell_blocks_input_redirection_path_bypass() { function test_security_with_env_cmd (line 439) | fn test_security_with_env_cmd() -> Arc { function test_security_with_env_passthrough (line 448) | fn test_security_with_env_passthrough(vars: &[&str]) -> Arc Self { method drop (line 474) | fn drop(&mut self) { function shell_does_not_leak_api_key (line 483) | async fn shell_does_not_leak_api_key() { function shell_preserves_path_and_home_for_env_command (line 504) | async fn shell_preserves_path_and_home_for_env_command() { function shell_blocks_plain_variable_expansion (line 523) | async fn shell_blocks_plain_variable_expansion() { function shell_allows_configured_env_passthrough (line 538) | async fn shell_allows_configured_env_passthrough() { function invalid_shell_env_passthrough_names_are_filtered (line 556) | fn invalid_shell_env_passthrough_names_are_filtered() { function shell_requires_approval_for_medium_risk_command (line 574) | async fn shell_requires_approval_for_medium_risk_command() { function shell_timeout_constant_is_reasonable (line 610) | fn shell_timeout_constant_is_reasonable() { function shell_output_limit_is_1mb (line 615) | fn shell_output_limit_is_1mb() { function shell_safe_env_vars_excludes_secrets (line 625) | fn shell_safe_env_vars_excludes_secrets() { function shell_safe_env_vars_includes_essentials (line 636) | fn shell_safe_env_vars_includes_essentials() { function shell_blocks_rate_limited (line 652) | async fn shell_blocks_rate_limited() { function shell_handles_nonexistent_command (line 669) | async fn shell_handles_nonexistent_command() { function shell_captures_stderr_output (line 684) | async fn shell_captures_stderr_output() { function shell_record_action_budget_exhaustion (line 694) | async fn shell_record_action_budget_exhaustion() { function shell_tool_can_be_constructed_with_sandbox (line 723) | fn shell_tool_can_be_constructed_with_sandbox() { function noop_sandbox_does_not_modify_command (line 736) | fn noop_sandbox_does_not_modify_command() { function shell_executes_with_sandbox (line 758) | async fn shell_executes_with_sandbox() { FILE: src/tools/sop_advance.rs type SopAdvanceTool (line 12) | pub struct SopAdvanceTool { method new (line 19) | pub fn new(engine: Arc>) -> Self { method with_audit (line 27) | pub fn with_audit(mut self, audit: Arc) -> Self { method with_collector (line 32) | pub fn with_collector(mut self, collector: Arc) -... method name (line 40) | fn name(&self) -> &str { method description (line 44) | fn description(&self) -> &str { method parameters_schema (line 48) | fn parameters_schema(&self) -> serde_json::Value { method execute (line 70) | async fn execute(&self, args: serde_json::Value) -> anyhow::Result Sop { function engine_with_active_run (line 240) | fn engine_with_active_run() -> (Arc>, String) { function advance_to_next_step (line 260) | async fn advance_to_next_step() { function advance_to_completion (line 277) | async fn advance_to_completion() { function advance_with_failure (line 304) | async fn advance_with_failure() { function advance_invalid_status (line 321) | async fn advance_invalid_status() { function advance_unknown_run (line 337) | async fn advance_unknown_run() { function name_and_schema (line 351) | fn name_and_schema() { function advance_error_does_not_write_step_audit (line 361) | async fn advance_error_does_not_write_step_audit() { function advance_success_writes_step_audit (line 393) | async fn advance_success_writes_step_audit() { FILE: src/tools/sop_approve.rs type SopApproveTool (line 12) | pub struct SopApproveTool { method new (line 19) | pub fn new(engine: Arc>) -> Self { method with_audit (line 27) | pub fn with_audit(mut self, audit: Arc) -> Self { method with_collector (line 32) | pub fn with_collector(mut self, collector: Arc) -... method name (line 40) | fn name(&self) -> &str { method description (line 44) | fn description(&self) -> &str { method parameters_schema (line 48) | fn parameters_schema(&self) -> serde_json::Value { method execute (line 61) | async fn execute(&self, args: serde_json::Value) -> anyhow::Result Sop { function engine_with_run (line 153) | fn engine_with_run() -> (Arc>, String) { function approve_waiting_run (line 174) | async fn approve_waiting_run() { function approve_nonexistent_run (line 184) | async fn approve_nonexistent_run() { function approve_missing_run_id (line 196) | async fn approve_missing_run_id() { function name_and_schema (line 204) | fn name_and_schema() { function approve_writes_audit (line 212) | async fn approve_writes_audit() { function approve_failure_does_not_write_audit (line 246) | async fn approve_failure_does_not_write_audit() { FILE: src/tools/sop_execute.rs type SopExecuteTool (line 12) | pub struct SopExecuteTool { method new (line 18) | pub fn new(engine: Arc>) -> Self { method with_audit (line 25) | pub fn with_audit(mut self, audit: Arc) -> Self { method name (line 33) | fn name(&self) -> &str { method description (line 37) | fn description(&self) -> &str { method parameters_schema (line 41) | fn parameters_schema(&self) -> serde_json::Value { method execute (line 58) | async fn execute(&self, args: serde_json::Value) -> anyhow::Result Option<&str> { function test_sop (line 156) | fn test_sop(name: &str, mode: SopExecutionMode) -> Sop { function engine_with_sops (line 186) | fn engine_with_sops(sops: Vec) -> Arc> { function execute_auto_sop (line 193) | async fn execute_auto_sop() { function execute_supervised_sop (line 203) | async fn execute_supervised_sop() { function execute_unknown_sop (line 212) | async fn execute_unknown_sop() { function execute_missing_name (line 221) | async fn execute_missing_name() { function execute_with_payload (line 229) | async fn execute_with_payload() { function name_and_schema (line 241) | fn name_and_schema() { FILE: src/tools/sop_list.rs type SopListTool (line 11) | pub struct SopListTool { method new (line 16) | pub fn new(engine: std::sync::Arc>) -> Self { method name (line 23) | fn name(&self) -> &str { method description (line 27) | fn description(&self) -> &str { method parameters_schema (line 31) | fn parameters_schema(&self) -> serde_json::Value { method execute (line 43) | async fn execute(&self, args: serde_json::Value) -> anyhow::Result Sop { function engine_with_sops (line 147) | fn engine_with_sops(sops: Vec) -> Arc> { function list_all_sops (line 154) | async fn list_all_sops() { function list_empty (line 168) | async fn list_empty() { function filter_by_name (line 177) | async fn filter_by_name() { function filter_by_priority (line 190) | async fn filter_by_priority() { function filter_no_match (line 203) | async fn filter_no_match() { function name_and_schema (line 215) | fn name_and_schema() { FILE: src/tools/sop_status.rs type SopStatusTool (line 11) | pub struct SopStatusTool { method new (line 19) | pub fn new(engine: Arc>) -> Self { method with_collector (line 28) | pub fn with_collector(mut self, collector: Arc) -... method with_gate_eval (line 34) | pub fn with_gate_eval(mut self, gate_eval: Arc &str { method description (line 99) | fn description(&self) -> &str { method parameters_schema (line 103) | fn parameters_schema(&self) -> serde_json::Value { method execute (line 127) | async fn execute(&self, args: serde_json::Value) -> anyhow::Result String { function test_sop (line 298) | fn test_sop(name: &str) -> Sop { function engine_with_sops (line 319) | fn engine_with_sops(sops: Vec) -> Arc> { function manual_event (line 325) | fn manual_event() -> SopEvent { function status_no_runs (line 335) | async fn status_no_runs() { function status_with_active_run (line 344) | async fn status_with_active_run() { function status_specific_run (line 359) | async fn status_specific_run() { function status_unknown_run (line 374) | async fn status_unknown_run() { function status_filter_by_sop_name (line 386) | async fn status_filter_by_sop_name() { function name_and_schema (line 402) | fn name_and_schema() { function status_with_metrics_global (line 413) | async fn status_with_metrics_global() { function status_with_metrics_per_sop (line 449) | async fn status_with_metrics_per_sop() { function status_metrics_without_collector (line 484) | async fn status_metrics_without_collector() { function status_metrics_not_shown_by_default (line 496) | async fn status_metrics_not_shown_by_default() { FILE: src/tools/swarm.rs constant SWARM_AGENT_TIMEOUT_SECS (line 13) | const SWARM_AGENT_TIMEOUT_SECS: u64 = 120; type SwarmTool (line 17) | pub struct SwarmTool { method new (line 26) | pub fn new( method create_provider_for_agent (line 42) | fn create_provider_for_agent( method call_agent (line 67) | async fn call_agent( method execute_sequential (line 106) | async fn execute_sequential( method execute_parallel (line 171) | async fn execute_parallel( method execute_router (line 278) | async fn execute_router( method name (line 422) | fn name(&self) -> &str { method description (line 426) | fn description(&self) -> &str { method parameters_schema (line 431) | fn parameters_schema(&self) -> serde_json::Value { method execute (line 463) | async fn execute(&self, args: serde_json::Value) -> anyhow::Result Arc { function sample_agents (line 555) | fn sample_agents() -> HashMap { function sample_swarms (line 592) | fn sample_swarms() -> HashMap { function name_and_schema (line 628) | fn name_and_schema() { function description_not_empty (line 648) | fn description_not_empty() { function schema_lists_swarm_names (line 660) | fn schema_lists_swarm_names() { function empty_swarms_schema (line 676) | fn empty_swarms_schema() { function unknown_swarm_returns_error (line 692) | async fn unknown_swarm_returns_error() { function missing_swarm_param (line 709) | async fn missing_swarm_param() { function missing_prompt_param (line 722) | async fn missing_prompt_param() { function blank_swarm_rejected (line 735) | async fn blank_swarm_rejected() { function blank_prompt_rejected (line 752) | async fn blank_prompt_rejected() { function swarm_with_missing_agent_returns_error (line 769) | async fn swarm_with_missing_agent_returns_error() { function swarm_with_empty_agents_returns_error (line 797) | async fn swarm_with_empty_agents_returns_error() { function swarm_blocked_in_readonly_mode (line 825) | async fn swarm_blocked_in_readonly_mode() { function swarm_blocked_when_rate_limited (line 850) | async fn swarm_blocked_when_rate_limited() { function sequential_invalid_provider_returns_error (line 875) | async fn sequential_invalid_provider_returns_error() { function parallel_invalid_provider_returns_error (line 904) | async fn parallel_invalid_provider_returns_error() { function router_invalid_provider_returns_error (line 932) | async fn router_invalid_provider_returns_error() { FILE: src/tools/text_browser.rs type TextBrowserTool (line 11) | pub struct TextBrowserTool { method new (line 22) | pub fn new( method validate_url (line 35) | fn validate_url(url: &str) -> anyhow::Result { method truncate_response (line 53) | fn truncate_response(&self, text: &str) -> String { method detect_browser (line 67) | async fn detect_browser() -> Option { method resolve_browser (line 83) | async fn resolve_browser(&self, requested: Option<&str>) -> anyhow::Re... method build_dump_args (line 135) | fn build_dump_args(_browser: &str, url: &str) -> Vec { constant SUPPORTED_BROWSERS (line 19) | const SUPPORTED_BROWSERS: &[&str] = &["lynx", "links", "w3m"]; method name (line 143) | fn name(&self) -> &str { method description (line 147) | fn description(&self) -> &str { method parameters_schema (line 153) | fn parameters_schema(&self) -> serde_json::Value { method execute (line 171) | async fn execute(&self, args: serde_json::Value) -> anyhow::Result TextBrowserTool { function name_is_text_browser (line 288) | fn name_is_text_browser() { function parameters_schema_requires_url (line 294) | fn parameters_schema_requires_url() { function parameters_schema_has_optional_browser (line 303) | fn parameters_schema_has_optional_browser() { function validate_url_accepts_http (line 312) | fn validate_url_accepts_http() { function validate_url_accepts_https (line 318) | fn validate_url_accepts_https() { function validate_url_rejects_empty (line 324) | fn validate_url_rejects_empty() { function validate_url_rejects_ftp (line 330) | fn validate_url_rejects_ftp() { function validate_url_rejects_whitespace (line 338) | fn validate_url_rejects_whitespace() { function truncate_within_limit (line 346) | fn truncate_within_limit() { function truncate_over_limit (line 353) | fn truncate_over_limit() { function build_dump_args_lynx (line 363) | fn build_dump_args_lynx() { function build_dump_args_links (line 369) | fn build_dump_args_links() { function build_dump_args_w3m (line 375) | fn build_dump_args_w3m() { function blocks_readonly_mode (line 381) | async fn blocks_readonly_mode() { function blocks_rate_limited (line 396) | async fn blocks_rate_limited() { FILE: src/tools/tool_search.rs constant DEFAULT_MAX_RESULTS (line 17) | const DEFAULT_MAX_RESULTS: usize = 5; type ToolSearchTool (line 20) | pub struct ToolSearchTool { method new (line 26) | pub fn new(deferred: DeferredMcpToolSet, activated: Arc anyhow::Result { method name (line 36) | fn name(&self) -> &str { method description (line 40) | fn description(&self) -> &str { method parameters_schema (line 45) | fn parameters_schema(&self) -> serde_json::Value { method execute (line 63) | async fn execute(&self, args: serde_json::Value) -> anyhow::Result) -> DeferredM... function make_stub (line 206) | fn make_stub(name: &str, desc: &str) -> DeferredMcpToolStub { function tool_metadata (line 216) | async fn tool_metadata() { function empty_query_returns_error (line 227) | async fn empty_query_returns_error() { function select_nonexistent_tool_reports_not_found (line 240) | async fn select_nonexistent_tool_reports_not_found() { function keyword_search_no_matches (line 254) | async fn keyword_search_no_matches() { function keyword_search_finds_match (line 268) | async fn keyword_search_finds_match() { function multiple_servers_stubs_all_searchable (line 288) | async fn multiple_servers_stubs_all_searchable() { function select_activates_and_persists_across_calls (line 319) | async fn select_activates_and_persists_across_calls() { function reactivation_is_idempotent (line 352) | async fn reactivation_is_idempotent() { FILE: src/tools/traits.rs type ToolResult (line 6) | pub struct ToolResult { type ToolSpec (line 14) | pub struct ToolSpec { type Tool (line 22) | pub trait Tool: Send + Sync { method name (line 24) | fn name(&self) -> &str; method description (line 27) | fn description(&self) -> &str; method parameters_schema (line 30) | fn parameters_schema(&self) -> serde_json::Value; method execute (line 33) | async fn execute(&self, args: serde_json::Value) -> anyhow::Result ToolSpec { method name (line 53) | fn name(&self) -> &str { method description (line 57) | fn description(&self) -> &str { method parameters_schema (line 61) | fn parameters_schema(&self) -> serde_json::Value { method execute (line 70) | async fn execute(&self, args: serde_json::Value) -> anyhow::Result anyhow::Result { method truncate_response (line 51) | fn truncate_response(&self, text: &str) -> String { method read_response_text_limited (line 64) | async fn read_response_text_limited( method name (line 85) | fn name(&self) -> &str { method description (line 89) | fn description(&self) -> &str { method parameters_schema (line 97) | fn parameters_schema(&self) -> serde_json::Value { method execute (line 110) | async fn execute(&self, args: serde_json::Value) -> anyhow::Result, chunk: &[u8], hard_cap: u... function normalize_allowed_domains (line 330) | fn normalize_allowed_domains(domains: Vec) -> Vec { function normalize_domain (line 340) | fn normalize_domain(raw: &str) -> Option { function extract_host (line 369) | fn extract_host(url: &str) -> anyhow::Result { function host_matches_allowlist (line 407) | fn host_matches_allowlist(host: &str, allowed_domains: &[String]) -> bool { function is_private_or_local_host (line 420) | fn is_private_or_local_host(host: &str) -> bool { function validate_resolved_host_is_public (line 446) | fn validate_resolved_host_is_public(host: &str) -> anyhow::Result<()> { function validate_resolved_host_is_public (line 459) | fn validate_resolved_host_is_public(_host: &str) -> anyhow::Result<()> { function validate_resolved_ips_are_public (line 464) | fn validate_resolved_ips_are_public(host: &str, ips: &[std::net::IpAddr]... function is_non_global_v4 (line 482) | fn is_non_global_v4(v4: std::net::Ipv4Addr) -> bool { function is_non_global_v6 (line 498) | fn is_non_global_v6(v6: std::net::Ipv6Addr) -> bool { function test_tool (line 514) | fn test_tool(allowed_domains: Vec<&str>) -> WebFetchTool { function test_tool_with_blocklist (line 518) | fn test_tool_with_blocklist( function name_is_web_fetch (line 538) | fn name_is_web_fetch() { function parameters_schema_requires_url (line 544) | fn parameters_schema_requires_url() { function html_to_text_conversion (line 555) | fn html_to_text_conversion() { function validate_accepts_exact_domain (line 568) | fn validate_accepts_exact_domain() { function validate_accepts_subdomain (line 575) | fn validate_accepts_subdomain() { function validate_accepts_wildcard (line 581) | fn validate_accepts_wildcard() { function validate_rejects_empty_url (line 587) | fn validate_rejects_empty_url() { function validate_rejects_missing_url (line 594) | fn validate_rejects_missing_url() { function validate_rejects_ftp_scheme (line 601) | fn validate_rejects_ftp_scheme() { function validate_rejects_allowlist_miss (line 611) | fn validate_rejects_allowlist_miss() { function validate_requires_allowlist (line 621) | fn validate_requires_allowlist() { function ssrf_blocks_localhost (line 634) | fn ssrf_blocks_localhost() { function ssrf_blocks_private_ipv4 (line 644) | fn ssrf_blocks_private_ipv4() { function ssrf_blocks_loopback (line 654) | fn ssrf_blocks_loopback() { function ssrf_blocks_rfc1918 (line 660) | fn ssrf_blocks_rfc1918() { function ssrf_wildcard_still_blocks_private (line 667) | fn ssrf_wildcard_still_blocks_private() { function redirect_target_validation_allows_permitted_host (line 677) | fn redirect_target_validation_allows_permitted_host() { function redirect_target_validation_blocks_private_host (line 690) | fn redirect_target_validation_blocks_private_host() { function redirect_target_validation_blocks_blocklisted_host (line 700) | fn redirect_target_validation_blocks_blocklisted_host() { function blocks_readonly_mode (line 712) | async fn blocks_readonly_mode() { function blocks_rate_limited (line 727) | async fn blocks_rate_limited() { function truncate_within_limit (line 744) | fn truncate_within_limit() { function truncate_over_limit (line 751) | fn truncate_over_limit() { function normalize_domain_strips_scheme_and_case (line 767) | fn normalize_domain_strips_scheme_and_case() { function normalize_deduplicates (line 773) | fn normalize_deduplicates() { function blocklist_rejects_exact_match (line 785) | fn blocklist_rejects_exact_match() { function blocklist_rejects_subdomain (line 795) | fn blocklist_rejects_subdomain() { function blocklist_wins_over_allowlist (line 805) | fn blocklist_wins_over_allowlist() { function blocklist_allows_non_blocked (line 815) | fn blocklist_allows_non_blocked() { function append_chunk_with_cap_truncates_and_stops (line 821) | fn append_chunk_with_cap_truncates_and_stops() { function resolved_private_ip_is_rejected (line 829) | fn resolved_private_ip_is_rejected() { function resolved_mixed_ips_are_rejected (line 838) | fn resolved_mixed_ips_are_rejected() { function resolved_public_ips_are_allowed (line 850) | fn resolved_public_ips_are_allowed() { FILE: src/tools/web_search_tool.rs type WebSearchTool (line 15) | pub struct WebSearchTool { method new (line 28) | pub fn new( method new_with_config (line 49) | pub fn new_with_config( method resolve_brave_api_key (line 70) | fn resolve_brave_api_key(&self) -> anyhow::Result { method reload_brave_api_key (line 83) | fn reload_brave_api_key(&self) -> anyhow::Result { method search_duckduckgo (line 118) | async fn search_duckduckgo(&self, query: &str) -> anyhow::Result anyhow:... method search_brave (line 188) | async fn search_brave(&self, query: &str) -> anyhow::Result { method parse_brave_results (line 216) | fn parse_brave_results(&self, json: &serde_json::Value, query: &str) -... function decode_ddg_redirect_url (line 251) | fn decode_ddg_redirect_url(raw_url: &str) -> String { function strip_tags (line 263) | fn strip_tags(content: &str) -> String { method name (line 270) | fn name(&self) -> &str { method description (line 274) | fn description(&self) -> &str { method parameters_schema (line 278) | fn parameters_schema(&self) -> serde_json::Value { method execute (line 291) | async fn execute(&self, args: serde_json::Value) -> anyhow::Result>, security: Arc &str { method description (line 33) | fn description(&self) -> &str { method parameters_schema (line 37) | fn parameters_schema(&self) -> serde_json::Value { method execute (line 55) | async fn execute(&self, args: serde_json::Value) -> anyhow::Result WorkspaceTool { function workspace_tool_list_empty (line 272) | async fn workspace_tool_list_empty() { function workspace_tool_create_and_list (line 281) | async fn workspace_tool_create_and_list() { function workspace_tool_switch_and_info (line 298) | async fn workspace_tool_switch_and_info() { function workspace_tool_export_redacts (line 320) | async fn workspace_tool_export_redacts() { function workspace_tool_unknown_action (line 337) | async fn workspace_tool_unknown_action() { function workspace_tool_switch_nonexistent (line 346) | async fn workspace_tool_switch_nonexistent() { FILE: src/tunnel/cloudflare.rs function extract_tunnel_url (line 11) | fn extract_tunnel_url(line: &str) -> Option { type CloudflareTunnel (line 38) | pub struct CloudflareTunnel { method new (line 44) | pub fn new(token: String) -> Self { method name (line 54) | fn name(&self) -> &str { method start (line 58) | async fn start(&self, _local_host: &str, local_port: u16) -> Result Result<()> { method health_check (line 122) | async fn health_check(&self) -> bool { method public_url (line 127) | fn public_url(&self) -> Option { function constructor_stores_token (line 141) | fn constructor_stores_token() { function public_url_is_none_before_start (line 147) | fn public_url_is_none_before_start() { function stop_without_started_process_is_ok (line 153) | async fn stop_without_started_process_is_ok() { function health_check_is_false_before_start (line 160) | async fn health_check_is_false_before_start() { function extract_skips_quic_go_github_url (line 166) | fn extract_skips_quic_go_github_url() { function extract_skips_cloudflare_docs_url (line 172) | fn extract_skips_cloudflare_docs_url() { function extract_skips_developers_cloudflare_url (line 178) | fn extract_skips_developers_cloudflare_url() { function extract_captures_trycloudflare_url (line 184) | fn extract_captures_trycloudflare_url() { function extract_captures_url_on_visit_it_at_line (line 193) | fn extract_captures_url_on_visit_it_at_line() { function extract_captures_url_on_route_at_line (line 202) | fn extract_captures_url_on_route_at_line() { function extract_returns_none_for_line_without_url (line 211) | fn extract_returns_none_for_line_without_url() { FILE: src/tunnel/custom.rs type CustomTunnel (line 16) | pub struct CustomTunnel { method new (line 24) | pub fn new( method name (line 40) | fn name(&self) -> &str { method start (line 44) | async fn start(&self, local_host: &str, local_port: u16) -> Result Result<()> { method health_check (line 123) | async fn health_check(&self) -> bool { method public_url (line 139) | fn public_url(&self) -> Option { function start_with_empty_command_returns_error (line 152) | async fn start_with_empty_command_returns_error() { function start_without_pattern_returns_local_url (line 164) | async fn start_without_pattern_returns_local_url() { function start_with_pattern_extracts_url (line 178) | async fn start_with_pattern_extracts_url() { function start_replaces_host_and_port_placeholders (line 197) | async fn start_replaces_host_and_port_placeholders() { function health_check_with_unreachable_health_url_returns_false (line 211) | async fn health_check_with_unreachable_health_url_returns_false() { FILE: src/tunnel/mod.rs type Tunnel (line 29) | pub trait Tunnel: Send + Sync { method name (line 31) | fn name(&self) -> &str; method start (line 35) | async fn start(&self, local_host: &str, local_port: u16) -> Result Result<()>; method health_check (line 41) | async fn health_check(&self) -> bool; method public_url (line 44) | fn public_url(&self) -> Option; type TunnelProcess (line 50) | pub(crate) struct TunnelProcess { type SharedProcess (line 55) | pub(crate) type SharedProcess = Arc>>; function new_shared_process (line 57) | pub(crate) fn new_shared_process() -> SharedProcess { function kill_shared (line 62) | pub(crate) async fn kill_shared(proc: &SharedProcess) -> Result<()> { function create_tunnel (line 75) | pub fn create_tunnel(config: &TunnelConfig) -> Result) -> Self { method name (line 28) | fn name(&self) -> &str { method start (line 32) | async fn start(&self, _local_host: &str, local_port: u16) -> Result Result<()> { method health_check (line 110) | async fn health_check(&self) -> bool { method public_url (line 115) | fn public_url(&self) -> Option { function constructor_stores_domain (line 128) | fn constructor_stores_domain() { function public_url_is_none_before_start (line 134) | fn public_url_is_none_before_start() { function stop_without_started_process_is_ok (line 140) | async fn stop_without_started_process_is_ok() { function health_check_is_false_before_start (line 147) | async fn health_check_is_false_before_start() { FILE: src/tunnel/none.rs type NoneTunnel (line 5) | pub struct NoneTunnel; method name (line 9) | fn name(&self) -> &str { method start (line 13) | async fn start(&self, local_host: &str, local_port: u16) -> Result Result<()> { method health_check (line 21) | async fn health_check(&self) -> bool { method public_url (line 25) | fn public_url(&self) -> Option { function name_is_none (line 35) | fn name_is_none() { function start_returns_local_url (line 41) | async fn start_returns_local_url() { function stop_is_noop_success (line 48) | async fn stop_is_noop_success() { function health_check_is_always_true (line 54) | async fn health_check_is_always_true() { function public_url_is_always_none (line 60) | fn public_url_is_always_none() { FILE: src/tunnel/openvpn.rs type OpenVpnTunnel (line 13) | pub struct OpenVpnTunnel { method new (line 30) | pub fn new( method build_args (line 48) | fn build_args(&self) -> Vec { method name (line 63) | fn name(&self) -> &str { method start (line 69) | async fn start(&self, local_host: &str, local_port: u16) -> Result Result<()> { method health_check (line 155) | async fn health_check(&self) -> bool { method public_url (line 161) | fn public_url(&self) -> Option { function constructor_stores_fields (line 174) | fn constructor_stores_fields() { function build_args_basic (line 190) | fn build_args_basic() { function build_args_with_auth_and_extras (line 197) | fn build_args_with_auth_and_extras() { function public_url_is_none_before_start (line 220) | fn public_url_is_none_before_start() { function health_check_is_false_before_start (line 226) | async fn health_check_is_false_before_start() { function stop_without_started_process_is_ok (line 232) | async fn stop_without_started_process_is_ok() { function start_with_missing_config_file_errors (line 239) | async fn start_with_missing_config_file_errors() { FILE: src/tunnel/tailscale.rs type TailscaleTunnel (line 9) | pub struct TailscaleTunnel { method new (line 16) | pub fn new(funnel: bool, hostname: Option) -> Self { method name (line 27) | fn name(&self) -> &str { method start (line 31) | async fn start(&self, _local_host: &str, local_port: u16) -> Result Result<()> { method health_check (line 91) | async fn health_check(&self) -> bool { method public_url (line 96) | fn public_url(&self) -> Option { function constructor_stores_hostname_and_mode (line 109) | fn constructor_stores_hostname_and_mode() { function public_url_is_none_before_start (line 116) | fn public_url_is_none_before_start() { function health_check_is_false_before_start (line 122) | async fn health_check_is_false_before_start() { function stop_without_started_process_is_ok (line 128) | async fn stop_without_started_process_is_ok() { FILE: src/util.rs function truncate_with_ellipsis (line 35) | pub fn truncate_with_ellipsis(s: &str, max_chars: usize) -> String { type MaybeSet (line 47) | pub enum MaybeSet { function test_truncate_ascii_no_truncation (line 58) | fn test_truncate_ascii_no_truncation() { function test_truncate_ascii_with_truncation (line 65) | fn test_truncate_ascii_with_truncation() { function test_truncate_empty_string (line 75) | fn test_truncate_empty_string() { function test_truncate_at_exact_boundary (line 80) | fn test_truncate_at_exact_boundary() { function test_truncate_emoji_single (line 86) | fn test_truncate_emoji_single() { function test_truncate_emoji_multiple (line 94) | fn test_truncate_emoji_multiple() { function test_truncate_mixed_ascii_emoji (line 102) | fn test_truncate_mixed_ascii_emoji() { function test_truncate_cjk_characters (line 109) | fn test_truncate_cjk_characters() { function test_truncate_accented_characters (line 118) | fn test_truncate_accented_characters() { function test_truncate_unicode_edge_case (line 125) | fn test_truncate_unicode_edge_case() { function test_truncate_long_string (line 132) | fn test_truncate_long_string() { function test_truncate_zero_max_chars (line 141) | fn test_truncate_zero_max_chars() { FILE: tests/component/config_persistence.rs function config_default_has_expected_provider (line 17) | fn config_default_has_expected_provider() { function config_default_has_expected_model (line 26) | fn config_default_has_expected_model() { function config_default_temperature_positive (line 35) | fn config_default_temperature_positive() { function agent_config_default_max_tool_iterations (line 48) | fn agent_config_default_max_tool_iterations() { function agent_config_default_max_history_messages (line 57) | fn agent_config_default_max_history_messages() { function agent_config_default_tool_dispatcher (line 66) | fn agent_config_default_tool_dispatcher() { function agent_config_default_compact_context_on (line 75) | fn agent_config_default_compact_context_on() { function memory_config_default_backend (line 88) | fn memory_config_default_backend() { function memory_config_default_embedding_provider (line 97) | fn memory_config_default_embedding_provider() { function memory_config_default_vector_keyword_weights_sum_to_one (line 107) | fn memory_config_default_vector_keyword_weights_sum_to_one() { function config_toml_roundtrip_preserves_provider (line 121) | fn config_toml_roundtrip_preserves_provider() { function config_toml_roundtrip_preserves_agent_config (line 138) | fn config_toml_roundtrip_preserves_agent_config() { function config_toml_roundtrip_preserves_memory_config (line 153) | fn config_toml_roundtrip_preserves_memory_config() { function config_file_write_read_roundtrip (line 174) | fn config_file_write_read_roundtrip() { function config_file_with_missing_optional_fields_uses_defaults (line 197) | fn config_file_with_missing_optional_fields_uses_defaults() { function config_file_with_custom_agent_section (line 211) | fn config_file_with_custom_agent_section() { function workspace_dir_creation_in_tempdir (line 233) | fn workspace_dir_creation_in_tempdir() { function nested_workspace_dir_creation (line 246) | fn nested_workspace_dir_creation() { FILE: tests/component/config_schema.rs function config_unknown_keys_parse_without_error (line 13) | fn config_unknown_keys_parse_without_error() { function config_wrong_type_for_port_fails (line 24) | fn config_wrong_type_for_port_fails() { function config_wrong_type_for_temperature_fails (line 34) | fn config_wrong_type_for_temperature_fails() { function config_out_of_range_temperature_fails (line 46) | fn config_out_of_range_temperature_fails() { function config_negative_temperature_fails (line 56) | fn config_negative_temperature_fails() { function config_negative_port_fails (line 66) | fn config_negative_port_fails() { function config_overflow_port_fails (line 76) | fn config_overflow_port_fails() { function gateway_config_defaults_are_secure (line 90) | fn gateway_config_defaults_are_secure() { function gateway_config_rate_limit_defaults (line 106) | fn gateway_config_rate_limit_defaults() { function gateway_config_idempotency_defaults (line 114) | fn gateway_config_idempotency_defaults() { function gateway_config_toml_roundtrip (line 121) | fn gateway_config_toml_roundtrip() { function gateway_config_missing_section_uses_defaults (line 140) | fn gateway_config_missing_section_uses_defaults() { function gateway_config_partial_section_fills_defaults (line 152) | fn gateway_config_partial_section_fills_defaults() { function security_config_defaults (line 171) | fn security_config_defaults() { function security_config_toml_roundtrip (line 181) | fn security_config_toml_roundtrip() { function autonomy_config_default_is_supervised (line 198) | fn autonomy_config_default_is_supervised() { function autonomy_config_default_max_actions_per_hour (line 208) | fn autonomy_config_default_max_actions_per_hour() { function autonomy_config_default_workspace_only (line 217) | fn autonomy_config_default_workspace_only() { function autonomy_config_toml_roundtrip (line 226) | fn autonomy_config_toml_roundtrip() { function config_empty_toml_uses_default_temperature (line 243) | fn config_empty_toml_uses_default_temperature() { function config_minimal_toml_with_temperature_uses_defaults (line 254) | fn config_minimal_toml_with_temperature_uses_defaults() { function config_only_temperature_parses (line 262) | fn config_only_temperature_parses() { function config_extra_unknown_keys_ignored (line 270) | fn config_extra_unknown_keys_ignored() { function config_multiple_channels_coexist (line 287) | fn config_multiple_channels_coexist() { function config_nested_optional_sections_default_when_absent (line 305) | fn config_nested_optional_sections_default_when_absent() { function config_channels_default_cli_enabled (line 315) | fn config_channels_default_cli_enabled() { function config_channels_all_optional_channels_none_by_default (line 321) | fn config_channels_all_optional_channels_none_by_default() { function config_memory_defaults_when_section_absent (line 333) | fn config_memory_defaults_when_section_absent() { function config_channels_without_cli_field (line 347) | fn config_channels_without_cli_field() { FILE: tests/component/dockerignore_test.rs constant MUST_EXCLUDE (line 12) | const MUST_EXCLUDE: &[&str] = &[ constant MUST_INCLUDE (line 32) | const MUST_INCLUDE: &[&str] = &["Cargo.toml", "Cargo.lock", "src/"]; function parse_dockerignore (line 35) | fn parse_dockerignore(content: &str) -> Vec { function pattern_matches (line 45) | fn pattern_matches(pattern: &str, path: &str) -> bool { function is_excluded (line 83) | fn is_excluded(patterns: &[String], path: &str) -> bool { function dockerignore_file_exists (line 99) | async fn dockerignore_file_exists() { function dockerignore_excludes_security_critical_paths (line 108) | async fn dockerignore_excludes_security_critical_paths() { function dockerignore_does_not_exclude_build_essentials (line 134) | async fn dockerignore_does_not_exclude_build_essentials() { function dockerignore_excludes_git_directory (line 151) | async fn dockerignore_excludes_git_directory() { function dockerignore_excludes_target_directory (line 171) | async fn dockerignore_excludes_target_directory() { function dockerignore_excludes_database_files (line 190) | async fn dockerignore_excludes_database_files() { function dockerignore_excludes_markdown_files (line 212) | async fn dockerignore_excludes_markdown_files() { function dockerignore_excludes_image_files (line 234) | async fn dockerignore_excludes_image_files() { function dockerignore_excludes_env_files (line 252) | async fn dockerignore_excludes_env_files() { function dockerignore_excludes_ci_configs (line 266) | async fn dockerignore_excludes_ci_configs() { function dockerignore_has_valid_syntax (line 284) | async fn dockerignore_has_valid_syntax() { function dockerignore_pattern_matching_edge_cases (line 317) | async fn dockerignore_pattern_matching_edge_cases() { FILE: tests/component/gateway.rs function gateway_whatsapp_valid_signature_accepted (line 17) | fn gateway_whatsapp_valid_signature_accepted() { function gateway_whatsapp_wrong_signature_rejected (line 40) | fn gateway_whatsapp_wrong_signature_rejected() { function gateway_whatsapp_missing_prefix_rejected (line 53) | fn gateway_whatsapp_missing_prefix_rejected() { function gateway_whatsapp_empty_signature_rejected (line 66) | fn gateway_whatsapp_empty_signature_rejected() { function gateway_whatsapp_tampered_body_rejected (line 78) | fn gateway_whatsapp_tampered_body_rejected() { function gateway_whatsapp_different_secrets_differ (line 101) | fn gateway_whatsapp_different_secrets_differ() { function gateway_body_limit_is_reasonable (line 132) | fn gateway_body_limit_is_reasonable() { function gateway_timeout_is_reasonable (line 142) | fn gateway_timeout_is_reasonable() { function gateway_rate_limit_window_is_60s (line 152) | fn gateway_rate_limit_window_is_60s() { FILE: tests/component/otel_dependency_feature_regression.rs function opentelemetry_otlp_uses_blocking_reqwest_client (line 2) | fn opentelemetry_otlp_uses_blocking_reqwest_client() { FILE: tests/component/provider_resolution.rs function assert_provider_ok (line 16) | fn assert_provider_ok(name: &str, key: Option<&str>, url: Option<&str>) { function factory_resolves_openai_provider (line 30) | fn factory_resolves_openai_provider() { function factory_resolves_anthropic_provider (line 35) | fn factory_resolves_anthropic_provider() { function factory_resolves_deepseek_provider (line 40) | fn factory_resolves_deepseek_provider() { function factory_resolves_mistral_provider (line 45) | fn factory_resolves_mistral_provider() { function factory_resolves_ollama_provider (line 50) | fn factory_resolves_ollama_provider() { function factory_resolves_groq_provider (line 55) | fn factory_resolves_groq_provider() { function factory_resolves_xai_provider (line 60) | fn factory_resolves_xai_provider() { function factory_resolves_together_provider (line 65) | fn factory_resolves_together_provider() { function factory_resolves_fireworks_provider (line 70) | fn factory_resolves_fireworks_provider() { function factory_resolves_perplexity_provider (line 75) | fn factory_resolves_perplexity_provider() { function factory_grok_alias_resolves_to_xai (line 84) | fn factory_grok_alias_resolves_to_xai() { function factory_kimi_alias_resolves_to_moonshot (line 89) | fn factory_kimi_alias_resolves_to_moonshot() { function factory_zhipu_alias_resolves_to_glm (line 94) | fn factory_zhipu_alias_resolves_to_glm() { function factory_custom_http_url_resolves (line 103) | fn factory_custom_http_url_resolves() { function factory_custom_https_url_resolves (line 108) | fn factory_custom_https_url_resolves() { function factory_custom_ftp_url_rejected (line 113) | fn factory_custom_ftp_url_rejected() { function factory_custom_empty_url_rejected (line 124) | fn factory_custom_empty_url_rejected() { function factory_unknown_provider_rejected (line 130) | fn factory_unknown_provider_rejected() { function compatible_provider_bearer_auth_style (line 140) | fn compatible_provider_bearer_auth_style() { function compatible_provider_xapikey_auth_style (line 151) | fn compatible_provider_xapikey_auth_style() { function compatible_provider_custom_auth_header (line 162) | fn compatible_provider_custom_auth_header() { function compatible_provider_no_credential (line 173) | fn compatible_provider_no_credential() { function compatible_provider_base_url_trailing_slash_normalized (line 184) | fn compatible_provider_base_url_trailing_slash_normalized() { function factory_ollama_with_custom_api_url (line 199) | fn factory_ollama_with_custom_api_url() { function factory_openai_with_custom_api_url (line 204) | fn factory_openai_with_custom_api_url() { function convenience_factory_resolves_major_providers (line 217) | fn convenience_factory_resolves_major_providers() { function convenience_factory_ollama_no_key (line 239) | fn convenience_factory_ollama_no_key() { function factory_resolves_openrouter_provider (line 253) | fn factory_resolves_openrouter_provider() { function factory_resolves_gemini_provider (line 258) | fn factory_resolves_gemini_provider() { function factory_resolves_bedrock_provider (line 263) | fn factory_resolves_bedrock_provider() { function factory_resolves_copilot_provider (line 268) | fn factory_resolves_copilot_provider() { function factory_resolves_synthetic_provider (line 273) | fn factory_resolves_synthetic_provider() { function factory_resolves_openai_codex_provider (line 278) | fn factory_resolves_openai_codex_provider() { function factory_resolves_venice_provider (line 293) | fn factory_resolves_venice_provider() { function factory_resolves_cohere_provider (line 298) | fn factory_resolves_cohere_provider() { function factory_resolves_opencode_provider (line 303) | fn factory_resolves_opencode_provider() { function factory_resolves_opencode_go_provider (line 308) | fn factory_resolves_opencode_go_provider() { function factory_resolves_astrai_provider (line 313) | fn factory_resolves_astrai_provider() { function factory_resolves_moonshot_provider (line 322) | fn factory_resolves_moonshot_provider() { function factory_resolves_glm_provider (line 327) | fn factory_resolves_glm_provider() { function factory_resolves_qwen_provider (line 332) | fn factory_resolves_qwen_provider() { function factory_resolves_doubao_provider (line 337) | fn factory_resolves_doubao_provider() { function factory_resolves_qianfan_provider (line 342) | fn factory_resolves_qianfan_provider() { function factory_resolves_minimax_provider (line 347) | fn factory_resolves_minimax_provider() { function factory_resolves_kimi_code_provider (line 352) | fn factory_resolves_kimi_code_provider() { function factory_resolves_zai_provider (line 357) | fn factory_resolves_zai_provider() { function factory_resolves_lmstudio_provider (line 366) | fn factory_resolves_lmstudio_provider() { function factory_resolves_llamacpp_provider (line 371) | fn factory_resolves_llamacpp_provider() { function factory_resolves_vllm_provider (line 376) | fn factory_resolves_vllm_provider() { function factory_resolves_vercel_provider (line 385) | fn factory_resolves_vercel_provider() { function factory_resolves_cloudflare_provider (line 390) | fn factory_resolves_cloudflare_provider() { function factory_resolves_nvidia_provider (line 395) | fn factory_resolves_nvidia_provider() { function factory_resolves_ovhcloud_provider (line 400) | fn factory_resolves_ovhcloud_provider() { function factory_google_alias_resolves_to_gemini (line 409) | fn factory_google_alias_resolves_to_gemini() { function factory_google_gemini_alias_resolves_to_gemini (line 414) | fn factory_google_gemini_alias_resolves_to_gemini() { function factory_aws_bedrock_alias_resolves_to_bedrock (line 419) | fn factory_aws_bedrock_alias_resolves_to_bedrock() { function factory_github_copilot_alias_resolves_to_copilot (line 424) | fn factory_github_copilot_alias_resolves_to_copilot() { function factory_vercel_ai_alias_resolves_to_vercel (line 429) | fn factory_vercel_ai_alias_resolves_to_vercel() { function factory_cloudflare_ai_alias_resolves_to_cloudflare (line 434) | fn factory_cloudflare_ai_alias_resolves_to_cloudflare() { function factory_opencode_zen_alias_resolves_to_opencode (line 439) | fn factory_opencode_zen_alias_resolves_to_opencode() { function factory_lm_studio_alias_resolves_to_lmstudio (line 444) | fn factory_lm_studio_alias_resolves_to_lmstudio() { function factory_llama_cpp_alias_resolves_to_llamacpp (line 449) | fn factory_llama_cpp_alias_resolves_to_llamacpp() { function factory_nvidia_nim_alias_resolves_to_nvidia (line 454) | fn factory_nvidia_nim_alias_resolves_to_nvidia() { function factory_build_nvidia_com_alias_resolves_to_nvidia (line 459) | fn factory_build_nvidia_com_alias_resolves_to_nvidia() { function factory_ovh_alias_resolves_to_ovhcloud (line 464) | fn factory_ovh_alias_resolves_to_ovhcloud() { function factory_anthropic_custom_endpoint_resolves (line 473) | fn factory_anthropic_custom_endpoint_resolves() { FILE: tests/component/provider_schema.rs function chat_message_system_role_correct (line 18) | fn chat_message_system_role_correct() { function chat_message_user_role_correct (line 25) | fn chat_message_user_role_correct() { function chat_message_assistant_role_correct (line 32) | fn chat_message_assistant_role_correct() { function chat_message_tool_role_correct (line 39) | fn chat_message_tool_role_correct() { function chat_message_serializes_to_json_with_required_fields (line 46) | fn chat_message_serializes_to_json_with_required_fields() { function chat_message_json_roundtrip (line 60) | fn chat_message_json_roundtrip() { function tool_call_has_required_fields (line 74) | fn tool_call_has_required_fields() { function tool_call_id_preserved_in_serialization (line 94) | fn tool_call_id_preserved_in_serialization() { function tool_call_arguments_contain_valid_json (line 112) | fn tool_call_arguments_contain_valid_json() { function tool_response_message_can_embed_tool_call_id (line 131) | fn tool_response_message_can_embed_tool_call_id() { function chat_response_text_only (line 152) | fn chat_response_text_only() { function chat_response_with_tool_calls (line 165) | fn chat_response_with_tool_calls() { function chat_response_text_or_empty_handles_none (line 183) | fn chat_response_text_or_empty_handles_none() { function chat_response_multiple_tool_calls (line 195) | fn chat_response_multiple_tool_calls() { function auth_style_bearer_is_constructible (line 225) | fn auth_style_bearer_is_constructible() { function auth_style_xapikey_is_constructible (line 231) | fn auth_style_xapikey_is_constructible() { function auth_style_custom_header (line 237) | fn auth_style_custom_header() { function provider_construction_with_different_names (line 251) | fn provider_construction_with_different_names() { function provider_construction_with_different_auth_styles (line 266) | fn provider_construction_with_different_auth_styles() { function chat_messages_maintain_role_sequence (line 294) | fn chat_messages_maintain_role_sequence() { function chat_messages_with_tool_calls_maintain_sequence (line 311) | fn chat_messages_with_tool_calls_maintain_sequence() { FILE: tests/component/reply_target_field_regression.rs constant SCAN_PATHS (line 9) | const SCAN_PATHS: &[&str] = &["src"]; constant FORBIDDEN_PATTERNS (line 10) | const FORBIDDEN_PATTERNS: &[&str] = &[".reply_to", "reply_to:"]; function collect_rs_files (line 12) | fn collect_rs_files(dir: &Path, out: &mut Vec) { function source_does_not_use_legacy_reply_to_field (line 30) | fn source_does_not_use_legacy_reply_to_field() { FILE: tests/component/security.rs function security_default_autonomy_is_supervised (line 16) | fn security_default_autonomy_is_supervised() { function security_default_workspace_only (line 27) | fn security_default_workspace_only() { function security_default_max_actions_per_hour (line 37) | fn security_default_max_actions_per_hour() { function security_default_require_approval_for_medium_risk (line 51) | fn security_default_require_approval_for_medium_risk() { function security_default_block_high_risk_commands (line 61) | fn security_default_block_high_risk_commands() { function security_secrets_encryption_default (line 75) | fn security_secrets_encryption_default() { function security_full_config_has_autonomy (line 85) | fn security_full_config_has_autonomy() { function security_autonomy_config_toml_roundtrip (line 100) | fn security_autonomy_config_toml_roundtrip() { function security_readonly_autonomy_parses (line 118) | fn security_readonly_autonomy_parses() { function security_full_autonomy_parses (line 129) | fn security_full_autonomy_parses() { function security_config_debug_does_not_leak_api_key (line 146) | fn security_config_debug_does_not_leak_api_key() { FILE: tests/component/whatsapp_webhook_security.rs function compute_signature (line 13) | fn compute_signature(app_secret: &str, body: &[u8]) -> String { function whatsapp_signature_rejects_missing_sha256_prefix (line 21) | fn whatsapp_signature_rejects_missing_sha256_prefix() { function whatsapp_signature_rejects_invalid_hex (line 32) | fn whatsapp_signature_rejects_invalid_hex() { function whatsapp_signature_rejects_wrong_signature (line 43) | fn whatsapp_signature_rejects_wrong_signature() { function whatsapp_signature_accepts_valid_signature (line 54) | fn whatsapp_signature_accepts_valid_signature() { function whatsapp_signature_rejects_tampered_body (line 65) | fn whatsapp_signature_rejects_tampered_body() { function whatsapp_signature_rejects_wrong_secret (line 82) | fn whatsapp_signature_rejects_wrong_secret() { function whatsapp_signature_rejects_empty_signature (line 99) | fn whatsapp_signature_rejects_empty_signature() { function whatsapp_signature_different_secrets_produce_different_sigs (line 109) | fn whatsapp_signature_different_secrets_produce_different_sigs() { FILE: tests/integration/agent.rs function e2e_simple_text_response (line 24) | async fn e2e_simple_text_response() { function e2e_single_tool_call_cycle (line 36) | async fn e2e_single_tool_call_cycle() { function e2e_multi_step_tool_chain (line 56) | async fn e2e_multi_step_tool_chain() { function e2e_xml_dispatcher_tool_call (line 84) | async fn e2e_xml_dispatcher_tool_call() { function e2e_multi_turn_conversation (line 110) | async fn e2e_multi_turn_conversation() { function e2e_unknown_tool_recovery (line 133) | async fn e2e_unknown_tool_recovery() { function e2e_parallel_tool_dispatch (line 153) | async fn e2e_parallel_tool_dispatch() { function e2e_multi_turn_history_fidelity (line 188) | async fn e2e_multi_turn_history_fidelity() { function e2e_memory_enrichment_injects_context (line 260) | async fn e2e_memory_enrichment_injects_context() { function e2e_multi_turn_with_memory_enrichment (line 305) | async fn e2e_multi_turn_with_memory_enrichment() { function e2e_empty_memory_context_passthrough (line 356) | async fn e2e_empty_memory_context_passthrough() { FILE: tests/integration/agent_robustness.rs function agent_recovers_from_text_with_xml_residue (line 20) | async fn agent_recovers_from_text_with_xml_residue() { function agent_handles_tool_call_with_empty_arguments (line 35) | async fn agent_handles_tool_call_with_empty_arguments() { function agent_handles_nonexistent_tool_gracefully (line 52) | async fn agent_handles_nonexistent_tool_gracefully() { function agent_handles_failing_tool (line 76) | async fn agent_handles_failing_tool() { function agent_handles_mixed_tool_success_and_failure (line 96) | async fn agent_handles_mixed_tool_success_and_failure() { function agent_respects_max_tool_iterations (line 125) | async fn agent_respects_max_tool_iterations() { function agent_handles_empty_provider_response (line 162) | async fn agent_handles_empty_provider_response() { function agent_handles_none_text_response (line 177) | async fn agent_handles_none_text_response() { function agent_handles_whitespace_only_response (line 191) | async fn agent_handles_whitespace_only_response() { function agent_handles_unicode_tool_arguments (line 204) | async fn agent_handles_unicode_tool_arguments() { function agent_handles_nested_json_tool_arguments (line 221) | async fn agent_handles_nested_json_tool_arguments() { function agent_handles_sequential_tool_then_text (line 238) | async fn agent_handles_sequential_tool_then_text() { FILE: tests/integration/channel_matrix.rs type ChannelEvent (line 20) | enum ChannelEvent { type MatrixTestChannel (line 66) | struct MatrixTestChannel { method new (line 75) | fn new(name: &str) -> Self { method with_drafts (line 85) | fn with_drafts(mut self) -> Self { method unhealthy (line 90) | fn unhealthy(mut self) -> Self { method events (line 95) | fn events(&self) -> Vec { method event_count (line 99) | fn event_count(&self) -> usize { method name (line 106) | fn name(&self) -> &str { method send (line 110) | async fn send(&self, message: &SendMessage) -> anyhow::Result<()> { method listen (line 118) | async fn listen(&self, tx: tokio::sync::mpsc::Sender) ->... method health_check (line 133) | async fn health_check(&self) -> bool { method start_typing (line 137) | async fn start_typing(&self, recipient: &str) -> anyhow::Result<()> { method stop_typing (line 145) | async fn stop_typing(&self, recipient: &str) -> anyhow::Result<()> { method supports_draft_updates (line 153) | fn supports_draft_updates(&self) -> bool { method send_draft (line 157) | async fn send_draft(&self, message: &SendMessage) -> anyhow::Result anyho... method add_reaction (line 210) | async fn add_reaction( method remove_reaction (line 224) | async fn remove_reaction( method pin_message (line 241) | async fn pin_message(&self, channel_id: &str, message_id: &str) -> anyho... method unpin_message (line 249) | async fn unpin_message(&self, channel_id: &str, message_id: &str) -> any... function trait_send_records_content_and_recipient (line 266) | async fn trait_send_records_content_and_recipient() { function trait_listen_produces_well_formed_message (line 282) | async fn trait_listen_produces_well_formed_message() { function trait_health_check_configurable (line 299) | async fn trait_health_check_configurable() { function trait_name_returns_configured_name (line 308) | async fn trait_name_returns_configured_name() { function typing_start_stop_cycle (line 321) | async fn typing_start_stop_cycle() { function typing_multiple_recipients_interleaved (line 333) | async fn typing_multiple_recipients_interleaved() { function typing_empty_recipient_does_not_panic (line 349) | async fn typing_empty_recipient_does_not_panic() { function draft_channel_reports_support (line 360) | async fn draft_channel_reports_support() { function non_draft_channel_reports_no_support (line 366) | async fn non_draft_channel_reports_no_support() { function draft_full_lifecycle_send_update_finalize (line 372) | async fn draft_full_lifecycle_send_update_finalize() { function draft_cancel_lifecycle (line 403) | async fn draft_cancel_lifecycle() { function draft_non_supporting_channel_returns_none (line 422) | async fn draft_non_supporting_channel_returns_none() { function draft_multiple_sequential_drafts_get_unique_ids (line 432) | async fn draft_multiple_sequential_drafts_get_unique_ids() { function reaction_add_remove_lifecycle (line 454) | async fn reaction_add_remove_lifecycle() { function reaction_multiple_emojis_on_same_message (line 473) | async fn reaction_multiple_emojis_on_same_message() { function reaction_across_different_channels_and_messages (line 490) | async fn reaction_across_different_channels_and_messages() { function reaction_unicode_emoji_preserved (line 510) | async fn reaction_unicode_emoji_preserved() { function pin_unpin_lifecycle (line 531) | async fn pin_unpin_lifecycle() { function pin_multiple_messages_in_same_channel (line 544) | async fn pin_multiple_messages_in_same_channel() { function channel_message_thread_ts_preserved_on_clone (line 559) | fn channel_message_thread_ts_preserved_on_clone() { function channel_message_none_thread_ts_preserved (line 576) | fn channel_message_none_thread_ts_preserved() { function send_message_in_thread_builder (line 592) | fn send_message_in_thread_builder() { function send_message_in_thread_none_clears_thread (line 601) | fn send_message_in_thread_none_clears_thread() { function send_message_with_subject_preserves_thread (line 610) | fn send_message_with_subject_preserves_thread() { function make_platform_message (line 629) | fn make_platform_message(platform: &str) -> ChannelMessage { constant ALL_PLATFORMS (line 795) | const ALL_PLATFORMS: &[&str] = &[ function all_platforms_have_non_empty_fields (line 815) | fn all_platforms_have_non_empty_fields() { function all_platforms_channel_field_matches_platform_name (line 840) | fn all_platforms_channel_field_matches_platform_name() { function channel_platforms_have_distinct_sender_and_reply_target (line 853) | fn channel_platforms_have_distinct_sender_and_reply_target() { function dm_platforms_have_same_sender_and_reply_target (line 876) | fn dm_platforms_have_same_sender_and_reply_target() { function threaded_platforms_have_thread_ts (line 892) | fn threaded_platforms_have_thread_ts() { function reply_uses_reply_target_not_sender (line 909) | async fn reply_uses_reply_target_not_sender() { function threaded_reply_preserves_thread_ts (line 929) | async fn threaded_reply_preserves_thread_ts() { function concurrent_sends_all_recorded (line 951) | async fn concurrent_sends_all_recorded() { function concurrent_typing_events_all_recorded (line 972) | async fn concurrent_typing_events_all_recorded() { function concurrent_reactions_all_recorded (line 992) | async fn concurrent_reactions_all_recorded() { function send_empty_content (line 1025) | async fn send_empty_content() { function send_very_long_content (line 1031) | async fn send_very_long_content() { function send_unicode_content (line 1049) | async fn send_unicode_content() { function send_content_with_newlines_and_special_chars (line 1066) | async fn send_content_with_newlines_and_special_chars() { function channel_message_zero_timestamp (line 1081) | fn channel_message_zero_timestamp() { function channel_message_max_timestamp (line 1096) | fn channel_message_max_timestamp() { function send_message_subject_none_by_default (line 1111) | fn send_message_subject_none_by_default() { function send_message_empty_subject (line 1118) | fn send_message_empty_subject() { function messages_routed_to_correct_channel (line 1128) | async fn messages_routed_to_correct_channel() { function multi_channel_listen_produces_channel_tagged_messages (line 1165) | async fn multi_channel_listen_produces_channel_tagged_messages() { function capability_matrix_spec (line 1193) | async fn capability_matrix_spec() { type MinimalChannel (line 1230) | struct MinimalChannel; method name (line 1234) | fn name(&self) -> &str { method send (line 1238) | async fn send(&self, _message: &SendMessage) -> anyhow::Result<()> { method listen (line 1242) | async fn listen(&self, _tx: tokio::sync::mpsc::Sender) -... function minimal_channel_all_defaults_succeed (line 1248) | async fn minimal_channel_all_defaults_succeed() { function dyn_channel_dispatch_works (line 1271) | async fn dyn_channel_dispatch_works() { function full_conversation_lifecycle (line 1293) | async fn full_conversation_lifecycle() { function rapid_send_burst (line 1338) | async fn rapid_send_burst() { function alternating_channels_preserve_isolation (line 1351) | async fn alternating_channels_preserve_isolation() { FILE: tests/integration/channel_routing.rs function channel_message_sender_field_holds_platform_user_id (line 18) | fn channel_message_sender_field_holds_platform_user_id() { function channel_message_reply_target_distinct_from_sender (line 41) | fn channel_message_reply_target_distinct_from_sender() { function channel_message_fields_not_swapped (line 62) | fn channel_message_fields_not_swapped() { function channel_message_preserves_all_fields_on_clone (line 90) | fn channel_message_preserves_all_fields_on_clone() { function send_message_new_sets_content_and_recipient (line 117) | fn send_message_new_sets_content_and_recipient() { function send_message_with_subject_sets_all_fields (line 126) | fn send_message_with_subject_sets_all_fields() { function send_message_recipient_carries_platform_target (line 135) | fn send_message_recipient_carries_platform_target() { type CapturingChannel (line 157) | struct CapturingChannel { method new (line 162) | fn new() -> Self { method sent_messages (line 168) | fn sent_messages(&self) -> Vec { method name (line 175) | fn name(&self) -> &str { method send (line 179) | async fn send(&self, message: &SendMessage) -> anyhow::Result<()> { method listen (line 184) | async fn listen(&self, tx: tokio::sync::mpsc::Sender) ->... function channel_send_preserves_recipient (line 201) | async fn channel_send_preserves_recipient() { function channel_listen_produces_correct_identity_fields (line 214) | async fn channel_listen_produces_correct_identity_fields() { function channel_send_reply_uses_sender_from_listen (line 230) | async fn channel_send_reply_uses_sender_from_listen() { function channel_health_check_default_returns_true (line 255) | async fn channel_health_check_default_returns_true() { function channel_typing_defaults_succeed (line 264) | async fn channel_typing_defaults_succeed() { function channel_draft_defaults (line 271) | async fn channel_draft_defaults() { function channel_multiple_sends_preserve_order_and_recipients (line 299) | async fn channel_multiple_sends_preserve_order_and_recipients() { FILE: tests/integration/hooks.rs type CounterHook (line 9) | struct CounterHook { method name (line 16) | fn name(&self) -> &str { method on_gateway_start (line 20) | async fn on_gateway_start(&self, _host: &str, _port: u16) { method on_after_tool_call (line 24) | async fn on_after_tool_call(&self, _tool: &str, _result: &ToolResult, _d... type ToolBlocker (line 29) | struct ToolBlocker { method name (line 35) | fn name(&self) -> &str { method priority (line 39) | fn priority(&self) -> i32 { method before_tool_call (line 43) | async fn before_tool_call( function hook_runner_full_pipeline (line 57) | async fn hook_runner_full_pipeline() { FILE: tests/integration/memory_comparison.rs function sqlite_backend (line 13) | fn sqlite_backend(dir: &std::path::Path) -> SqliteMemory { function markdown_backend (line 17) | fn markdown_backend(dir: &std::path::Path) -> MarkdownMemory { function compare_store_speed (line 24) | async fn compare_store_speed() { function compare_recall_quality (line 75) | async fn compare_recall_quality() { function compare_recall_speed (line 179) | async fn compare_recall_speed() { function compare_persistence (line 225) | async fn compare_persistence() { function compare_upsert (line 290) | async fn compare_upsert() { function compare_forget (line 337) | async fn compare_forget() { function compare_category_filter (line 380) | async fn compare_category_filter() { FILE: tests/integration/memory_restart.rs function sqlite_memory_store_same_key_deduplicates (line 18) | async fn sqlite_memory_store_same_key_deduplicates() { function sqlite_memory_store_different_keys_creates_separate_entries (line 47) | async fn sqlite_memory_store_different_keys_creates_separate_entries() { function sqlite_memory_persists_across_reinitialization (line 67) | async fn sqlite_memory_persists_across_reinitialization() { function sqlite_memory_restart_does_not_duplicate_on_rewrite (line 96) | async fn sqlite_memory_restart_does_not_duplicate_on_rewrite() { function sqlite_memory_session_scoped_store_and_recall (line 133) | async fn sqlite_memory_session_scoped_store_and_recall() { function sqlite_memory_global_recall_includes_all_sessions (line 169) | async fn sqlite_memory_global_recall_includes_all_sessions() { function sqlite_memory_recall_returns_relevant_results (line 198) | async fn sqlite_memory_recall_returns_relevant_results() { function sqlite_memory_recall_respects_limit (line 229) | async fn sqlite_memory_recall_respects_limit() { function sqlite_memory_recall_empty_query_returns_empty (line 253) | async fn sqlite_memory_recall_empty_query_returns_empty() { function sqlite_memory_forget_removes_entry (line 270) | async fn sqlite_memory_forget_removes_entry() { function sqlite_memory_forget_nonexistent_returns_false (line 285) | async fn sqlite_memory_forget_nonexistent_returns_false() { function sqlite_memory_health_check_returns_true (line 294) | async fn sqlite_memory_health_check_returns_true() { function sqlite_memory_concurrent_stores_no_data_loss (line 306) | async fn sqlite_memory_concurrent_stores_no_data_loss() { function sqlite_memory_list_by_category (line 342) | async fn sqlite_memory_list_by_category() { FILE: tests/integration/telegram_attachment_fallback.rs function test_channel (line 17) | fn test_channel(mock_url: &str) -> TelegramChannel { function mock_send_message_ok (line 23) | async fn mock_send_message_ok(server: &MockServer) { function document_url_failure_falls_back_to_text_link (line 42) | async fn document_url_failure_falls_back_to_text_link() { function photo_url_failure_falls_back_to_text_link (line 76) | async fn photo_url_failure_falls_back_to_text_link() { function text_portion_delivered_before_attachment_failure (line 108) | async fn text_portion_delivered_before_attachment_failure() { function multiple_attachments_independent_fallback (line 153) | async fn multiple_attachments_independent_fallback() { function successful_attachment_no_fallback (line 210) | async fn successful_attachment_no_fallback() { function document_only_message_falls_back_to_text (line 260) | async fn document_only_message_falls_back_to_text() { FILE: tests/integration/telegram_finalize_draft.rs function test_channel (line 7) | fn test_channel(mock_url: &str) -> TelegramChannel { function telegram_ok_response (line 12) | fn telegram_ok_response(message_id: i64) -> serde_json::Value { function telegram_error_response (line 23) | fn telegram_error_response(description: &str) -> serde_json::Value { function finalize_draft_treats_not_modified_as_success (line 32) | async fn finalize_draft_treats_not_modified_as_success() { function finalize_draft_plain_retry_treats_not_modified_as_success (line 62) | async fn finalize_draft_plain_retry_treats_not_modified_as_success() { function finalize_draft_skips_send_message_when_delete_fails (line 112) | async fn finalize_draft_skips_send_message_when_delete_fails() { function finalize_draft_sends_fresh_message_after_successful_delete (line 160) | async fn finalize_draft_sends_fresh_message_after_successful_delete() { FILE: tests/live/gemini_fallback_oauth_refresh.rs function gemini_warmup_refreshes_expired_oauth_token (line 35) | async fn gemini_warmup_refreshes_expired_oauth_token() -> Result<()> { function gemini_warmup_with_valid_credentials (line 223) | async fn gemini_warmup_with_valid_credentials() -> Result<()> { FILE: tests/live/openai_codex_vision_e2e.rs function provider_vision_support (line 26) | async fn provider_vision_support() -> Result<()> { function openai_codex_second_vision_support (line 144) | async fn openai_codex_second_vision_support() -> Result<()> { FILE: tests/live/providers.rs function e2e_live_openai_codex_multi_turn (line 16) | async fn e2e_live_openai_codex_multi_turn() { FILE: tests/manual/telegram/generate_test_messages.py function generate_short_message (line 9) | def generate_short_message(): function generate_medium_message (line 13) | def generate_medium_message(): function generate_long_message (line 17) | def generate_long_message(): function generate_exact_limit_message (line 21) | def generate_exact_limit_message(): function generate_over_limit_message (line 26) | def generate_over_limit_message(): function generate_multi_chunk_message (line 30) | def generate_multi_chunk_message(): function generate_newline_message (line 34) | def generate_newline_message(): function generate_word_boundary_message (line 38) | def generate_word_boundary_message(): function print_message_info (line 42) | def print_message_info(message, name): function main (line 56) | def main(): FILE: tests/support/assertions.rs function verify_expects (line 11) | pub fn verify_expects( FILE: tests/support/helpers.rs function make_memory (line 17) | pub fn make_memory() -> Arc { function make_observer (line 26) | pub fn make_observer() -> Arc { function text_response (line 31) | pub fn text_response(text: &str) -> ChatResponse { function tool_response (line 41) | pub fn tool_response(calls: Vec) -> ChatResponse { function build_agent (line 51) | pub fn build_agent(provider: Box, tools: Vec... function build_agent_xml (line 64) | pub fn build_agent_xml(provider: Box, tools: Vec Self { method load_context (line 134) | async fn load_context( FILE: tests/support/mock_channel.rs type TestChannel (line 11) | pub struct TestChannel { method new (line 24) | pub fn new(name: &str) -> Self { method sent_messages (line 33) | pub fn sent_messages(&self) -> Vec { method typing_events (line 38) | pub fn typing_events(&self) -> Vec { method clear (line 43) | pub fn clear(&self) { type TypingEvent (line 18) | pub enum TypingEvent { method name (line 51) | fn name(&self) -> &str { method send (line 55) | async fn send(&self, message: &SendMessage) -> anyhow::Result<()> { method listen (line 60) | async fn listen(&self, _tx: tokio::sync::mpsc::Sender) -... method health_check (line 67) | async fn health_check(&self) -> bool { method start_typing (line 71) | async fn start_typing(&self, recipient: &str) -> anyhow::Result<()> { method stop_typing (line 79) | async fn stop_typing(&self, recipient: &str) -> anyhow::Result<()> { FILE: tests/support/mock_provider.rs type MockProvider (line 12) | pub struct MockProvider { method new (line 17) | pub fn new(responses: Vec) -> Self { method chat_with_system (line 26) | async fn chat_with_system( method chat (line 36) | async fn chat( type RecordingProvider (line 56) | pub struct RecordingProvider { method new (line 62) | pub fn new(responses: Vec) -> (Self, Arc Self { method chat_with_system (line 134) | async fn chat_with_system( method chat (line 144) | async fn chat( FILE: tests/support/mock_tools.rs type EchoTool (line 10) | pub struct EchoTool; method name (line 14) | fn name(&self) -> &str { method description (line 17) | fn description(&self) -> &str { method parameters_schema (line 20) | fn parameters_schema(&self) -> serde_json::Value { method execute (line 28) | async fn execute(&self, args: serde_json::Value) -> Result { type CountingTool (line 43) | pub struct CountingTool { method new (line 48) | pub fn new() -> (Self, Arc>) { method name (line 61) | fn name(&self) -> &str { method description (line 64) | fn description(&self) -> &str { method parameters_schema (line 67) | fn parameters_schema(&self) -> serde_json::Value { method execute (line 70) | async fn execute(&self, _args: serde_json::Value) -> Result { type FailingTool (line 82) | pub struct FailingTool; method name (line 86) | fn name(&self) -> &str { method description (line 89) | fn description(&self) -> &str { method parameters_schema (line 92) | fn parameters_schema(&self) -> serde_json::Value { method execute (line 95) | async fn execute(&self, _args: serde_json::Value) -> Result { type RecordingTool (line 105) | pub struct RecordingTool { method new (line 111) | pub fn new(name: &str) -> (Self, Arc>>) { method name (line 125) | fn name(&self) -> &str { method description (line 128) | fn description(&self) -> &str { method parameters_schema (line 131) | fn parameters_schema(&self) -> serde_json::Value { method execute (line 139) | async fn execute(&self, args: serde_json::Value) -> Result { FILE: tests/support/trace.rs type LlmTrace (line 8) | pub struct LlmTrace { method from_file (line 79) | pub fn from_file(path: &Path) -> anyhow::Result { type TraceTurn (line 17) | pub struct TraceTurn { type TraceStep (line 24) | pub struct TraceStep { type TraceResponse (line 31) | pub enum TraceResponse { type TraceToolCall (line 52) | pub struct TraceToolCall { type TraceExpects (line 60) | pub struct TraceExpects { FILE: tests/system/full_stack.rs function system_simple_text_response (line 19) | async fn system_simple_text_response() { function system_tool_execution_flow (line 35) | async fn system_tool_execution_flow() { function system_multi_turn_conversation (line 58) | async fn system_multi_turn_conversation() { function system_tool_arguments_passed_correctly (line 86) | async fn system_tool_arguments_passed_correctly() { function system_parallel_tool_execution (line 120) | async fn system_parallel_tool_execution() { FILE: web/src/App.tsx type LocaleContextType (line 22) | interface LocaleContextType { type ErrorBoundaryState (line 39) | interface ErrorBoundaryState { class ErrorBoundary (line 43) | class ErrorBoundary extends Component< method constructor (line 47) | constructor(props: { children: ReactNode }) { method getDerivedStateFromError (line 52) | static getDerivedStateFromError(error: Error): ErrorBoundaryState { method componentDidCatch (line 56) | componentDidCatch(error: Error, info: ErrorInfo) { method render (line 60) | render() { function PairingDialog (line 89) | function PairingDialog({ onPair }: { onPair: (code: string) => Promise { function useApiCall (line 37) | function useApiCall( function useStatus (line 87) | function useStatus(): UseApiResult { function useTools (line 92) | function useTools(): UseApiResult { function useCronJobs (line 97) | function useCronJobs(): UseApiResult { function useIntegrations (line 102) | function useIntegrations(): UseApiResult { function useMemory (line 107) | function useMemory( function useCost (line 119) | function useCost(): UseApiResult { function useCliTools (line 124) | function useCliTools(): UseApiResult { function useHealth (line 129) | function useHealth(): UseApiResult { function useDoctor (line 134) | function useDoctor(): UseApiResult & { FILE: web/src/hooks/useAuth.ts type AuthState (line 22) | interface AuthState { type AuthProviderProps (line 43) | interface AuthProviderProps { function AuthProvider (line 47) | function AuthProvider({ children }: AuthProviderProps) { function useAuth (line 122) | function useAuth(): AuthState { FILE: web/src/hooks/useDevices.ts type Device (line 3) | interface Device { function useDevices (line 12) | function useDevices() { FILE: web/src/hooks/useDraft.ts type DraftContextType (line 8) | interface DraftContextType { function useDraftStore (line 20) | function useDraftStore(): DraftContextType { function useDraft (line 38) | function useDraft(key: string) { FILE: web/src/hooks/useSSE.ts type SSEConnectionStatus (line 5) | type SSEConnectionStatus = 'disconnected' | 'connecting' | 'connected'; type UseSSEResult (line 7) | interface UseSSEResult { type UseSSEOptions (line 20) | interface UseSSEOptions extends SSEClientOptions { function useSSE (line 35) | function useSSE(options: UseSSEOptions = {}): UseSSEResult { FILE: web/src/hooks/useWebSocket.ts type ConnectionStatus (line 5) | type ConnectionStatus = 'disconnected' | 'connecting' | 'connected'; type UseWebSocketResult (line 7) | interface UseWebSocketResult { type UseWebSocketOptions (line 22) | interface UseWebSocketOptions extends WebSocketClientOptions { function useWebSocket (line 33) | function useWebSocket( FILE: web/src/lib/api.ts class UnauthorizedError (line 19) | class UnauthorizedError extends Error { method constructor (line 20) | constructor() { function apiFetch (line 26) | async function apiFetch( function unwrapField (line 66) | function unwrapField(value: T | Record, key: string): T { function pair (line 80) | async function pair(code: string): Promise<{ token: string }> { function getAdminPairCode (line 96) | async function getAdminPairCode(): Promise<{ pairing_code: string | null... function getPublicHealth (line 108) | async function getPublicHealth(): Promise<{ require_pairing: boolean; pa... function getStatus (line 120) | function getStatus(): Promise { function getHealth (line 124) | function getHealth(): Promise { function getConfig (line 134) | function getConfig(): Promise { function putConfig (line 140) | function putConfig(toml: string): Promise { function getTools (line 152) | function getTools(): Promise { function getCronJobs (line 162) | function getCronJobs(): Promise { function addCronJob (line 168) | function addCronJob(body: { function deleteCronJob (line 180) | function deleteCronJob(id: string): Promise { function getCronRuns (line 186) | function getCronRuns( type CronSettings (line 196) | interface CronSettings { function getCronSettings (line 202) | function getCronSettings(): Promise { function patchCronSettings (line 206) | function patchCronSettings( function getIntegrations (line 219) | function getIntegrations(): Promise { function runDoctor (line 229) | function runDoctor(): Promise { function getMemory (line 240) | function getMemory( function storeMemory (line 253) | function storeMemory( function deleteMemory (line 264) | function deleteMemory(key: string): Promise { function getCost (line 274) | function getCost(): Promise { function getCliTools (line 284) | function getCliTools(): Promise { FILE: web/src/lib/auth.ts constant TOKEN_KEY (line 1) | const TOKEN_KEY = 'zeroclaw_token'; function getToken (line 6) | function getToken(): string | null { function setToken (line 17) | function setToken(token: string): void { function clearToken (line 28) | function clearToken(): void { function isAuthenticated (line 39) | function isAuthenticated(): boolean { FILE: web/src/lib/i18n.ts type Locale (line 8) | type Locale = 'en' | 'zh' | 'tr'; function getLocale (line 924) | function getLocale(): Locale { function setLocale (line 928) | function setLocale(locale: Locale): void { function t (line 940) | function t(key: string): string { function tLocale (line 948) | function tLocale(key: string, locale: Locale): string { function useLocale (line 960) | function useLocale(): { locale: Locale; t: (key: string) => string } { FILE: web/src/lib/sse.ts type SSEEventHandler (line 4) | type SSEEventHandler = (event: SSEEvent) => void; type SSEErrorHandler (line 5) | type SSEErrorHandler = (error: Event | Error) => void; type SSEClientOptions (line 7) | interface SSEClientOptions { constant DEFAULT_RECONNECT_DELAY (line 18) | const DEFAULT_RECONNECT_DELAY = 1000; constant MAX_RECONNECT_DELAY (line 19) | const MAX_RECONNECT_DELAY = 30000; class SSEClient (line 28) | class SSEClient { method constructor (line 43) | constructor(options: SSEClientOptions = {}) { method connect (line 52) | connect(): void { method disconnect (line 92) | disconnect(): void { method consumeStream (line 105) | private async consumeStream(body: ReadableStream): Promise... method parseEvent (line 138) | private parseEvent(raw: string): void { method scheduleReconnect (line 170) | private scheduleReconnect(): void { method clearReconnectTimer (line 179) | private clearReconnectTimer(): void { FILE: web/src/lib/uuid.ts function generateUUID (line 10) | function generateUUID(): string { FILE: web/src/lib/ws.ts type WsMessageHandler (line 5) | type WsMessageHandler = (msg: WsMessage) => void; type WsOpenHandler (line 6) | type WsOpenHandler = () => void; type WsCloseHandler (line 7) | type WsCloseHandler = (ev: CloseEvent) => void; type WsErrorHandler (line 8) | type WsErrorHandler = (ev: Event) => void; type WebSocketClientOptions (line 10) | interface WebSocketClientOptions { constant DEFAULT_RECONNECT_DELAY (line 21) | const DEFAULT_RECONNECT_DELAY = 1000; constant MAX_RECONNECT_DELAY (line 22) | const MAX_RECONNECT_DELAY = 30000; constant SESSION_STORAGE_KEY (line 24) | const SESSION_STORAGE_KEY = 'zeroclaw_session_id'; function getOrCreateSessionId (line 27) | function getOrCreateSessionId(): string { class WebSocketClient (line 36) | class WebSocketClient { method constructor (line 52) | constructor(options: WebSocketClientOptions = {}) { method connect (line 63) | connect(): void { method sendMessage (line 103) | sendMessage(content: string): void { method disconnect (line 111) | disconnect(): void { method connected (line 121) | get connected(): boolean { method scheduleReconnect (line 129) | private scheduleReconnect(): void { method clearReconnectTimer (line 138) | private clearReconnectTimer(): void { FILE: web/src/pages/AgentChat.tsx type ChatMessage (line 9) | interface ChatMessage { constant DRAFT_KEY (line 16) | const DRAFT_KEY = 'agent-chat'; function AgentChat (line 18) | function AgentChat() { FILE: web/src/pages/Config.tsx function Config (line 12) | function Config() { FILE: web/src/pages/Cost.tsx function formatUSD (line 12) | function formatUSD(value: number): string { function Cost (line 16) | function Cost() { FILE: web/src/pages/Cron.tsx function formatDate (line 26) | function formatDate(iso: string | null): string { function formatDuration (line 32) | function formatDuration(ms: number | null): string { function RunHistoryPanel (line 40) | function RunHistoryPanel({ jobId }: { jobId: string }) { function Cron (line 147) | function Cron() { FILE: web/src/pages/Dashboard.tsx function formatUptime (line 15) | function formatUptime(seconds: number): string { function formatUSD (line 24) | function formatUSD(value: number): string { function healthColor (line 28) | function healthColor(status: string): string { function healthBorder (line 42) | function healthBorder(status: string): string { function Dashboard (line 56) | function Dashboard() { FILE: web/src/pages/Doctor.tsx function severityIcon (line 14) | function severityIcon(severity: DiagResult['severity']) { function severityBorder (line 25) | function severityBorder(severity: DiagResult['severity']): string { function severityBg (line 36) | function severityBg(severity: DiagResult['severity']): string { function Doctor (line 47) | function Doctor() { FILE: web/src/pages/Integrations.tsx function statusBadge (line 7) | function statusBadge(status: Integration['status']) { function Integrations (line 33) | function Integrations() { FILE: web/src/pages/Logs.tsx function formatTimestamp (line 13) | function formatTimestamp(ts?: string): string { function eventTypeBadgeColor (line 18) | function eventTypeBadgeColor(type: string): { classes: string; bg: strin... type LogEntry (line 39) | interface LogEntry { function Logs (line 44) | function Logs() { FILE: web/src/pages/Memory.tsx function truncate (line 14) | function truncate(text: string, max: number): string { function formatDate (line 19) | function formatDate(iso: string): string { function Memory (line 24) | function Memory() { FILE: web/src/pages/Pairing.tsx type Device (line 4) | interface Device { function Pairing (line 13) | function Pairing() { FILE: web/src/pages/Tools.tsx function Tools (line 14) | function Tools() { FILE: web/src/types/api.ts type StatusResponse (line 1) | interface StatusResponse { type HealthSnapshot (line 14) | interface HealthSnapshot { type ComponentHealth (line 21) | interface ComponentHealth { type ToolSpec (line 29) | interface ToolSpec { type CronJob (line 35) | interface CronJob { type CronRun (line 45) | interface CronRun { type Integration (line 55) | interface Integration { type DiagResult (line 62) | interface DiagResult { type MemoryEntry (line 68) | interface MemoryEntry { type CostSummary (line 78) | interface CostSummary { type ModelStats (line 87) | interface ModelStats { type CliTool (line 94) | interface CliTool { type SSEEvent (line 101) | interface SSEEvent { type WsMessage (line 107) | interface WsMessage {