SYMBOL INDEX (7097 symbols across 272 files) FILE: crates/openfang-api/src/channel_bridge.rs type KernelBridgeAdapter (line 64) | pub struct KernelBridgeAdapter { method send_message (line 71) | async fn send_message(&self, agent_id: AgentId, message: &str) -> Result... method send_message_with_blocks (line 84) | async fn send_message_with_blocks( method find_agent_by_name (line 111) | async fn find_agent_by_name(&self, name: &str) -> Result... method list_agents (line 115) | async fn list_agents(&self) -> Result, String> { method spawn_agent_by_name (line 125) | async fn spawn_agent_by_name(&self, manifest_name: &str) -> Result String { method list_models_text (line 175) | async fn list_models_text(&self) -> String { method list_providers_text (line 217) | async fn list_providers_text(&self) -> String { method list_skills_text (line 238) | async fn list_skills_text(&self) -> String { method list_hands_text (line 265) | async fn list_hands_text(&self) -> String { method list_workflows_text (line 299) | async fn list_workflows_text(&self) -> String { method run_workflow_text (line 317) | async fn run_workflow_text(&self, name: &str, input: &str) -> String { method list_triggers_text (line 375) | async fn list_triggers_text(&self) -> String { method create_trigger_text (line 404) | async fn create_trigger_text( method delete_trigger_text (line 434) | async fn delete_trigger_text(&self, id_prefix: &str) -> String { method list_schedules_text (line 455) | async fn list_schedules_text(&self) -> String { method manage_schedule_text (line 493) | async fn manage_schedule_text(&self, action: &str, args: &[String]) -> S... method list_approvals_text (line 618) | async fn list_approvals_text(&self) -> String { method resolve_approval_text (line 645) | async fn resolve_approval_text(&self, id_prefix: &str, approve: bool) ->... method reset_session (line 683) | async fn reset_session(&self, agent_id: AgentId) -> Result Result Result Result { method session_usage (line 737) | async fn session_usage(&self, agent_id: AgentId) -> Result Result Op... method budget_text (line 898) | async fn budget_text(&self) -> String { method peers_text (line 938) | async fn peers_text(&self) -> String { method a2a_agents_text (line 963) | async fn a2a_agents_text(&self) -> String { function parse_trigger_pattern (line 986) | fn parse_trigger_pattern(s: &str) -> Option Option) -> Option... function start_channel_bridge_with_config (line 1069) | pub async fn start_channel_bridge_with_config( function reload_channels_from_disk (line 1765) | pub async fn reload_channels_from_disk( function test_bridge_skips_when_no_config (line 1832) | async fn test_bridge_skips_when_no_config() { FILE: crates/openfang-api/src/middleware.rs constant REQUEST_ID_HEADER (line 15) | pub const REQUEST_ID_HEADER: &str = "x-request-id"; function request_logging (line 18) | pub async fn request_logging(request: Request, next: Next) -> Resp... type AuthState (line 48) | pub struct AuthState { function auth (line 62) | pub async fn auth( function extract_session_cookie (line 218) | fn extract_session_cookie(request: &Request) -> Option { function security_headers (line 233) | pub async fn security_headers(request: Request, next: Next) -> Res... function test_request_id_header_constant (line 266) | fn test_request_id_header_constant() { FILE: crates/openfang-api/src/openai_compat.rs type ChatCompletionRequest (line 27) | pub struct ChatCompletionRequest { type OaiMessage (line 37) | pub struct OaiMessage { type OaiContent (line 45) | pub enum OaiContent { type OaiContentPart (line 54) | pub enum OaiContentPart { type OaiImageUrlRef (line 62) | pub struct OaiImageUrlRef { type ChatCompletionResponse (line 69) | struct ChatCompletionResponse { type Choice (line 79) | struct Choice { type ChoiceMessage (line 86) | struct ChoiceMessage { type UsageInfo (line 95) | struct UsageInfo { type ChatCompletionChunk (line 102) | struct ChatCompletionChunk { type ChunkChoice (line 111) | struct ChunkChoice { type ChunkDelta (line 118) | struct ChunkDelta { type OaiToolCall (line 128) | struct OaiToolCall { type OaiToolCallFunction (line 139) | struct OaiToolCallFunction { type ModelObject (line 147) | struct ModelObject { type ModelListResponse (line 155) | struct ModelListResponse { function resolve_agent (line 162) | fn resolve_agent(state: &AppState, model: &str) -> Option<(AgentId, Stri... function convert_messages (line 188) | fn convert_messages(oai_messages: &[OaiMessage]) -> Vec { function chat_completions (line 246) | pub async fn chat_completions( function stream_response (line 370) | async fn stream_response( function list_models (line 535) | pub async fn list_models(State(state): State>) -> impl Int... function test_oai_content_deserialize_string (line 566) | fn test_oai_content_deserialize_string() { function test_oai_content_deserialize_parts (line 573) | fn test_oai_content_deserialize_parts() { function test_convert_messages_text (line 580) | fn test_convert_messages_text() { function test_convert_messages_with_image (line 598) | fn test_convert_messages_with_image() { function test_response_serialization (line 625) | fn test_response_serialization() { function test_chunk_serialization (line 655) | fn test_chunk_serialization() { function test_tool_call_serialization (line 680) | fn test_tool_call_serialization() { function test_chunk_delta_with_tool_calls (line 699) | fn test_chunk_delta_with_tool_calls() { function test_tool_input_delta_chunk (line 734) | fn test_tool_input_delta_chunk() { function test_backward_compat_no_tool_calls (line 755) | fn test_backward_compat_no_tool_calls() { FILE: crates/openfang-api/src/rate_limiter.rs function operation_cost (line 14) | pub fn operation_cost(method: &str, path: &str) -> NonZeroU32 { type KeyedRateLimiter (line 38) | pub type KeyedRateLimiter = RateLimiter Arc { function gcra_rate_limit (line 52) | pub async fn gcra_rate_limit( function test_costs (line 86) | fn test_costs() { FILE: crates/openfang-api/src/routes.rs type AppState (line 25) | pub struct AppState { function spawn_agent (line 46) | pub async fn spawn_agent( function list_agents (line 171) | pub async fn list_agents(State(state): State>) -> impl Int... function resolve_attachments (line 244) | pub fn resolve_attachments( function inject_attachments_into_session (line 295) | pub fn inject_attachments_into_session( function send_message (line 329) | pub async fn send_message( function get_agent_session (line 431) | pub async fn get_agent_session( function kill_agent (line 622) | pub async fn kill_agent( function restart_agent (line 655) | pub async fn restart_agent( function status (line 713) | pub async fn status(State(state): State>) -> impl IntoResp... function shutdown (line 752) | pub async fn shutdown(State(state): State>) -> impl IntoRe... function create_workflow (line 772) | pub async fn create_workflow( function list_workflows (line 874) | pub async fn list_workflows(State(state): State>) -> impl ... function run_workflow (line 892) | pub async fn run_workflow( function list_workflow_runs (line 929) | pub async fn list_workflow_runs( function get_workflow (line 951) | pub async fn get_workflow( function update_workflow (line 984) | pub async fn update_workflow( function delete_workflow (line 1089) | pub async fn delete_workflow( function create_trigger (line 1121) | pub async fn create_trigger( function list_triggers (line 1194) | pub async fn list_triggers( function delete_trigger (line 1222) | pub async fn delete_trigger( function list_profiles (line 1254) | pub async fn list_profiles() -> impl IntoResponse { function set_agent_mode (line 1280) | pub async fn set_agent_mode( function version (line 1316) | pub async fn version() -> impl IntoResponse { function get_agent (line 1333) | pub async fn get_agent( function send_message_stream (line 1392) | pub async fn send_message_stream( type FieldType (line 1502) | enum FieldType { method as_str (line 1510) | fn as_str(self) -> &'static str { type ChannelField (line 1522) | struct ChannelField { type ChannelMeta (line 1534) | struct ChannelMeta { constant CHANNEL_REGISTRY (line 1551) | const CHANNEL_REGISTRY: &[ChannelMeta] = &[ function is_channel_configured (line 2206) | fn is_channel_configured(config: &openfang_types::config::ChannelsConfig... function build_field_json (line 2256) | fn build_field_json( function find_channel_meta (line 2309) | fn find_channel_meta(name: &str) -> Option<&'static ChannelMeta> { function channel_config_values (line 2314) | fn channel_config_values( function list_channels (line 2492) | pub async fn list_channels(State(state): State>) -> impl I... function configure_channel (line 2549) | pub async fn configure_channel( function remove_channel (line 2658) | pub async fn remove_channel( function test_channel (line 2725) | pub async fn test_channel( function send_channel_test_message (line 2806) | async fn send_channel_test_message(channel_name: &str, target_id: &str) ... function reload_channels (line 2868) | pub async fn reload_channels(State(state): State>) -> impl... function whatsapp_qr_start (line 2896) | pub async fn whatsapp_qr_start() -> impl IntoResponse { function whatsapp_qr_status (line 2949) | pub async fn whatsapp_qr_status( function gateway_http_post (line 2993) | async fn gateway_http_post(url_with_path: &str) -> Result Result impl IntoResponse { function get_template (line 3129) | pub async fn get_template(Path(name): Path) -> impl IntoResponse { function get_agent_kv (line 3189) | pub async fn get_agent_kv( function get_agent_kv_key (line 3214) | pub async fn get_agent_kv_key( function set_agent_kv_key (line 3240) | pub async fn set_agent_kv_key( function delete_agent_kv_key (line 3265) | pub async fn delete_agent_kv_key( function health (line 3289) | pub async fn health(State(state): State>) -> impl IntoResp... function health_detail (line 3313) | pub async fn health_detail(State(state): State>) -> impl I... function prometheus_metrics (line 3354) | pub async fn prometheus_metrics(State(state): State>) -> i... function list_skills (line 3431) | pub async fn list_skills(State(state): State>) -> impl Int... function install_skill (line 3473) | pub async fn install_skill( function uninstall_skill (line 3505) | pub async fn uninstall_skill( function marketplace_search (line 3530) | pub async fn marketplace_search( function clawhub_search (line 3572) | pub async fn clawhub_search( function clawhub_browse (line 3650) | pub async fn clawhub_browse( function clawhub_skill_detail (line 3719) | pub async fn clawhub_skill_detail( function clawhub_skill_code (line 3783) | pub async fn clawhub_skill_code( function clawhub_install (line 3826) | pub async fn clawhub_install( function is_clawhub_rate_limit (line 3895) | fn is_clawhub_rate_limit(err: &openfang_skills::SkillError) -> bool { function clawhub_browse_entry_to_json (line 3900) | fn clawhub_browse_entry_to_json( function server_platform (line 3920) | fn server_platform() -> &'static str { function list_hands (line 3931) | pub async fn list_hands(State(state): State>) -> impl Into... function list_active_hands (line 3975) | pub async fn list_active_hands(State(state): State>) -> im... function get_hand (line 3996) | pub async fn get_hand( function check_hand_deps (line 4076) | pub async fn check_hand_deps( function install_hand_deps (line 4130) | pub async fn install_hand_deps( function install_hand (line 4368) | pub async fn install_hand( function upsert_hand (line 4408) | pub async fn upsert_hand( function activate_hand (line 4444) | pub async fn activate_hand( function pause_hand (line 4495) | pub async fn pause_hand( function resume_hand (line 4512) | pub async fn resume_hand( function deactivate_hand (line 4529) | pub async fn deactivate_hand( function get_hand_settings (line 4546) | pub async fn get_hand_settings( function update_hand_settings (line 4585) | pub async fn update_hand_settings( function hand_stats (line 4625) | pub async fn hand_stats( function hand_instance_browser (line 4705) | pub async fn hand_instance_browser( function list_mcp_servers (line 4806) | pub async fn list_mcp_servers(State(state): State>) -> imp... function audit_recent (line 4875) | pub async fn audit_recent( function audit_verify (line 4911) | pub async fn audit_verify(State(state): State>) -> impl In... function logs_stream (line 4951) | pub async fn logs_stream( function classify_audit_level (line 5037) | fn classify_audit_level(action: &str) -> &'static str { function list_peers (line 5053) | pub async fn list_peers(State(state): State>) -> impl Into... function network_status (line 5083) | pub async fn network_status(State(state): State>) -> impl ... function list_tools (line 5114) | pub async fn list_tools(State(state): State>) -> impl Into... function get_config (line 5146) | pub async fn get_config(State(state): State>) -> impl Into... function usage_stats (line 5169) | pub async fn usage_stats(State(state): State>) -> impl Int... function usage_summary (line 5194) | pub async fn usage_summary(State(state): State>) -> impl I... function usage_by_model (line 5214) | pub async fn usage_by_model(State(state): State>) -> impl ... function usage_daily (line 5236) | pub async fn usage_daily(State(state): State>) -> impl Int... function budget_status (line 5268) | pub async fn budget_status(State(state): State>) -> impl I... function update_budget (line 5277) | pub async fn update_budget( function agent_budget_status (line 5313) | pub async fn agent_budget_status( function agent_budget_ranking (line 5377) | pub async fn agent_budget_ranking(State(state): State>) ->... function update_agent_budget (line 5406) | pub async fn update_agent_budget( function list_sessions (line 5462) | pub async fn list_sessions(State(state): State>) -> impl I... function delete_session (line 5470) | pub async fn delete_session( function set_session_label (line 5497) | pub async fn set_session_label( function find_session_by_label (line 5541) | pub async fn find_session_by_label( function update_trigger (line 5587) | pub async fn update_trigger( function update_agent (line 5629) | pub async fn update_agent( function patch_agent (line 5674) | pub async fn patch_agent( function security_status (line 5772) | pub async fn security_status(State(state): State>) -> impl... function migrate_detect (line 5842) | pub async fn migrate_detect() -> impl IntoResponse { function migrate_scan (line 5867) | pub async fn migrate_scan(Json(req): Json) -> impl I... function run_migrate (line 5880) | pub async fn run_migrate(Json(req): Json) -> impl IntoRe... function list_models (line 5957) | pub async fn list_models( function list_aliases (line 6034) | pub async fn list_aliases(State(state): State>) -> impl In... function get_model (line 6062) | pub async fn get_model( function list_providers (line 6111) | pub async fn list_providers(State(state): State>) -> impl ... function add_custom_model (line 6196) | pub async fn add_custom_model( function remove_custom_model (line 6294) | pub async fn remove_custom_model( function a2a_agent_card (line 6325) | pub async fn a2a_agent_card(State(state): State>) -> impl ... function a2a_list_agents (line 6351) | pub async fn a2a_list_agents(State(state): State>) -> impl... function a2a_send_task (line 6374) | pub async fn a2a_send_task( function a2a_get_task (line 6467) | pub async fn a2a_get_task( function a2a_cancel_task (line 6484) | pub async fn a2a_cancel_task( function a2a_list_external_agents (line 6510) | pub async fn a2a_list_external_agents(State(state): State>... function a2a_discover_external (line 6532) | pub async fn a2a_discover_external( function a2a_send_external (line 6580) | pub async fn a2a_send_external( function a2a_external_task_status (line 6618) | pub async fn a2a_external_task_status( function mcp_http (line 6652) | pub async fn mcp_http( function list_agent_sessions (line 6752) | pub async fn list_agent_sessions( function create_agent_session (line 6778) | pub async fn create_agent_session( function switch_agent_session (line 6803) | pub async fn switch_agent_session( function reset_session (line 6840) | pub async fn reset_session( function clear_agent_history (line 6866) | pub async fn clear_agent_history( function compact_session (line 6898) | pub async fn compact_session( function stop_agent (line 6924) | pub async fn stop_agent( function set_model (line 6954) | pub async fn set_model( function get_agent_tools (line 7012) | pub async fn get_agent_tools( function set_agent_tools (line 7044) | pub async fn set_agent_tools( function get_agent_skills (line 7097) | pub async fn get_agent_skills( function set_agent_skills (line 7141) | pub async fn set_agent_skills( function get_agent_mcp_servers (line 7176) | pub async fn get_agent_mcp_servers( function set_agent_mcp_servers (line 7226) | pub async fn set_agent_mcp_servers( function set_provider_key (line 7269) | pub async fn set_provider_key( function delete_provider_key (line 7445) | pub async fn delete_provider_key( function test_provider (line 7501) | pub async fn test_provider( function set_provider_url (line 7601) | pub async fn set_provider_url( function upsert_provider_url (line 7669) | fn upsert_provider_url( function create_skill (line 7710) | pub async fn create_skill( function write_secret_env (line 7796) | fn write_secret_env(path: &std::path::Path, key: &str, value: &str) -> R... function remove_secret_env (line 7830) | fn remove_secret_env(path: &std::path::Path, key: &str) -> Result<(), st... function upsert_channel_config (line 7849) | fn upsert_channel_config( function remove_channel_config (line 7919) | fn remove_channel_config( function list_integrations (line 7951) | pub async fn list_integrations(State(state): State>) -> im... function list_available_integrations (line 7989) | pub async fn list_available_integrations(State(state): State>) -> ... function reload_integrations (line 8199) | pub async fn reload_integrations(State(state): State>) -> ... function schedule_shared_agent_id (line 8221) | fn schedule_shared_agent_id() -> AgentId { constant SCHEDULES_KEY (line 8228) | const SCHEDULES_KEY: &str = "__openfang_schedules"; function list_schedules (line 8231) | pub async fn list_schedules(State(state): State>) -> impl ... function create_schedule (line 8247) | pub async fn create_schedule( function update_schedule (line 8346) | pub async fn update_schedule( function delete_schedule (line 8413) | pub async fn delete_schedule( function run_schedule (line 8452) | pub async fn run_schedule( type UpdateIdentityRequest (line 8570) | pub struct UpdateIdentityRequest { function update_agent_identity (line 8583) | pub async fn update_agent_identity( type PatchAgentConfigRequest (line 8655) | pub struct PatchAgentConfigRequest { function patch_agent_config (line 8673) | pub async fn patch_agent_config( type CloneAgentRequest (line 8906) | pub struct CloneAgentRequest { function clone_agent (line 8911) | pub async fn clone_agent( constant KNOWN_IDENTITY_FILES (line 9008) | const KNOWN_IDENTITY_FILES: &[&str] = &[ function list_agent_files (line 9020) | pub async fn list_agent_files( function get_agent_file (line 9074) | pub async fn get_agent_file( type SetAgentFileRequest (line 9166) | pub struct SetAgentFileRequest { function set_agent_file (line 9171) | pub async fn set_agent_file( type UploadResponse (line 9288) | struct UploadResponse { type UploadMeta (line 9299) | struct UploadMeta { constant MAX_UPLOAD_SIZE (line 9309) | const MAX_UPLOAD_SIZE: usize = 10 * 1024 * 1024; constant ALLOWED_CONTENT_TYPES (line 9312) | const ALLOWED_CONTENT_TYPES: &[&str] = &["image/", "text/", "application... function is_allowed_content_type (line 9314) | fn is_allowed_content_type(ct: &str) -> bool { function upload_file (line 9325) | pub async fn upload_file( function serve_upload (line 9453) | pub async fn serve_upload(Path(file_id): Path) -> impl IntoRespo... function list_approvals (line 9513) | pub async fn list_approvals(State(state): State>) -> impl ... type CreateApprovalRequest (line 9593) | pub struct CreateApprovalRequest { function create_approval (line 9602) | pub async fn create_approval( function approve_request (line 9642) | pub async fn approve_request( function reject_request (line 9672) | pub async fn reject_request( function config_reload (line 9710) | pub async fn config_reload(State(state): State>) -> impl I... function config_schema (line 9751) | pub async fn config_schema(State(state): State>) -> impl I... function config_set (line 9861) | pub async fn config_set( function json_to_toml_value (line 9981) | fn json_to_toml_value(value: &serde_json::Value) -> toml::Value { function get_agent_deliveries (line 10005) | pub async fn get_agent_deliveries( function list_cron_jobs (line 10048) | pub async fn list_cron_jobs( function create_cron_job (line 10080) | pub async fn create_cron_job( function delete_cron_job (line 10098) | pub async fn delete_cron_job( function toggle_cron_job (line 10127) | pub async fn toggle_cron_job( function cron_job_status (line 10158) | pub async fn cron_job_status( function webhook_wake (line 10191) | pub async fn webhook_wake( function webhook_agent (line 10250) | pub async fn webhook_agent( function list_bindings (line 10339) | pub async fn list_bindings(State(state): State>) -> impl I... function add_binding (line 10348) | pub async fn add_binding( function remove_binding (line 10368) | pub async fn remove_binding( function pairing_request (line 10387) | pub async fn pairing_request(State(state): State>) -> impl... function pairing_complete (line 10414) | pub async fn pairing_complete( function pairing_devices (line 10463) | pub async fn pairing_devices(State(state): State>) -> impl... function pairing_remove_device (line 10490) | pub async fn pairing_remove_device( function pairing_notify (line 10508) | pub async fn pairing_notify( function list_commands (line 10537) | pub async fn list_commands(State(state): State>) -> impl I... function validate_webhook_token (line 10570) | fn validate_webhook_token(headers: &axum::http::HeaderMap, token_env: &s... type CopilotFlowState (line 10596) | struct CopilotFlowState { function copilot_oauth_start (line 10609) | pub async fn copilot_oauth_start() -> impl IntoResponse { function copilot_oauth_poll (line 10649) | pub async fn copilot_oauth_poll( function comms_topology (line 10750) | pub async fn comms_topology(State(state): State>) -> impl ... function filter_to_comms_event (line 10809) | fn filter_to_comms_event( function audit_to_comms_event (line 10869) | fn audit_to_comms_event( function comms_events (line 10967) | pub async fn comms_events( function comms_events_stream (line 11009) | pub async fn comms_events_stream(State(state): State>) -> ... function comms_send (line 11057) | pub async fn comms_send( function comms_task (line 11121) | pub async fn comms_task( function auth_login (line 11160) | pub async fn auth_login( function auth_logout (line 11247) | pub async fn auth_logout() -> impl IntoResponse { function auth_check (line 11257) | pub async fn auth_check( function backup_config (line 11307) | fn backup_config(config_path: &std::path::Path) { function remove_toml_section (line 11312) | fn remove_toml_section(content: &str, section: &str) -> String { function test_is_channel_configured_wecom_none (line 11338) | fn test_is_channel_configured_wecom_none() { function test_is_channel_configured_wecom_some (line 11344) | fn test_is_channel_configured_wecom_some() { function test_wecom_in_channel_registry (line 11360) | fn test_wecom_in_channel_registry() { FILE: crates/openfang-api/src/server.rs type DaemonInfo (line 22) | pub struct DaemonInfo { function build_router (line 37) | pub async fn build_router( function run_daemon (line 727) | pub async fn run_daemon( function restrict_permissions (line 857) | fn restrict_permissions(path: &Path) { function restrict_permissions (line 863) | fn restrict_permissions(_path: &Path) {} function read_daemon_info (line 866) | pub fn read_daemon_info(home_dir: &Path) -> Option { function shutdown_signal (line 876) | async fn shutdown_signal(api_shutdown: Arc) { function is_process_alive (line 910) | fn is_process_alive(pid: u32) -> bool { function is_daemon_responding (line 948) | fn is_daemon_responding(addr: &str) -> bool { FILE: crates/openfang-api/src/session_auth.rs type HmacSha256 (line 7) | type HmacSha256 = Hmac; function create_session_token (line 10) | pub fn create_session_token(username: &str, secret: &str, ttl_hours: u64... function verify_session_token (line 21) | pub fn verify_session_token(token: &str, secret: &str) -> Option { function hash_password (line 59) | pub fn hash_password(password: &str) -> String { function verify_password (line 65) | pub fn verify_password(password: &str, stored_hash: &str) -> bool { function test_hash_and_verify_password (line 79) | fn test_hash_and_verify_password() { function test_create_and_verify_token (line 86) | fn test_create_and_verify_token() { function test_token_wrong_secret (line 93) | fn test_token_wrong_secret() { function test_token_invalid_base64 (line 100) | fn test_token_invalid_base64() { function test_password_hash_length_mismatch (line 106) | fn test_password_hash_length_mismatch() { FILE: crates/openfang-api/src/stream_chunker.rs type StreamChunker (line 11) | pub struct StreamChunker { method new (line 21) | pub fn new(min_chunk_chars: usize, max_chunk_chars: usize) -> Self { method push (line 32) | pub fn push(&mut self, text: &str) { method try_flush (line 56) | pub fn try_flush(&mut self) -> Option { method flush_remaining (line 123) | pub fn flush_remaining(&mut self) -> Option { method buffered_len (line 132) | pub fn buffered_len(&self) -> usize { method is_in_code_fence (line 137) | pub fn is_in_code_fence(&self) -> bool { function find_last_in_range (line 146) | fn find_last_in_range(text: &str, pattern: &str, range: &std::ops::Range... function test_basic_chunking (line 167) | fn test_basic_chunking() { function test_code_fence_not_split (line 179) | fn test_code_fence_not_split() { function test_code_fence_force_close_at_max (line 195) | fn test_code_fence_force_close_at_max() { function test_paragraph_break_priority (line 207) | fn test_paragraph_break_priority() { function test_flush_remaining (line 218) | fn test_flush_remaining() { function test_sentence_break (line 234) | fn test_sentence_break() { FILE: crates/openfang-api/src/stream_dedup.rs constant MIN_DEDUP_LENGTH (line 7) | const MIN_DEDUP_LENGTH: usize = 10; constant DEDUP_WINDOW (line 10) | const DEDUP_WINDOW: usize = 50; type StreamDedup (line 13) | pub struct StreamDedup { method new (line 22) | pub fn new() -> Self { method is_duplicate (line 33) | pub fn is_duplicate(&self, text: &str) -> bool { method record_sent (line 49) | pub fn record_sent(&mut self, text: &str) { method clear (line 65) | pub fn clear(&mut self) { method default (line 72) | fn default() -> Self { function normalize (line 78) | fn normalize(text: &str) -> String { function test_exact_match_detected (line 102) | fn test_exact_match_detected() { function test_normalized_match_detected (line 109) | fn test_normalized_match_detected() { function test_short_text_skipped (line 117) | fn test_short_text_skipped() { function test_window_rollover (line 124) | fn test_window_rollover() { function test_no_false_positives (line 139) | fn test_no_false_positives() { function test_clear (line 146) | fn test_clear() { function test_normalize (line 155) | fn test_normalize() { FILE: crates/openfang-api/src/types.rs type SpawnRequest (line 7) | pub struct SpawnRequest { type SpawnResponse (line 23) | pub struct SpawnResponse { type AttachmentRef (line 30) | pub struct AttachmentRef { type MessageRequest (line 40) | pub struct MessageRequest { type MessageResponse (line 55) | pub struct MessageResponse { type SkillInstallRequest (line 66) | pub struct SkillInstallRequest { type SkillUninstallRequest (line 72) | pub struct SkillUninstallRequest { type AgentUpdateRequest (line 78) | pub struct AgentUpdateRequest { type SetModeRequest (line 84) | pub struct SetModeRequest { type MigrateRequest (line 90) | pub struct MigrateRequest { type MigrateScanRequest (line 100) | pub struct MigrateScanRequest { type ClawHubInstallRequest (line 106) | pub struct ClawHubInstallRequest { FILE: crates/openfang-api/src/webchat.rs constant ETAG (line 19) | const ETAG: &str = concat!("\"openfang-", env!("CARGO_PKG_VERSION"), "\""); constant LOGO_PNG (line 22) | const LOGO_PNG: &[u8] = include_bytes!("../static/logo.png"); constant FAVICON_ICO (line 25) | const FAVICON_ICO: &[u8] = include_bytes!("../static/favicon.ico"); function logo_png (line 28) | pub async fn logo_png() -> impl IntoResponse { function favicon_ico (line 39) | pub async fn favicon_ico() -> impl IntoResponse { constant MANIFEST_JSON (line 50) | const MANIFEST_JSON: &str = include_str!("../static/manifest.json"); constant SW_JS (line 53) | const SW_JS: &str = include_str!("../static/sw.js"); function manifest_json (line 56) | pub async fn manifest_json() -> impl IntoResponse { function sw_js (line 67) | pub async fn sw_js() -> impl IntoResponse { function webchat_page (line 80) | pub async fn webchat_page() -> impl IntoResponse { constant WEBCHAT_HTML (line 100) | const WEBCHAT_HTML: &str = concat!( FILE: crates/openfang-api/src/ws.rs constant MAX_WS_PER_IP (line 37) | const MAX_WS_PER_IP: usize = 5; constant WS_IDLE_TIMEOUT (line 40) | const WS_IDLE_TIMEOUT: Duration = Duration::from_secs(30 * 60); constant DEBOUNCE_MS (line 43) | const DEBOUNCE_MS: u64 = 100; constant DEBOUNCE_CHARS (line 46) | const DEBOUNCE_CHARS: usize = 200; type VerboseLevel (line 55) | enum VerboseLevel { method from_u8 (line 65) | fn from_u8(v: u8) -> Self { method next (line 73) | fn next(self) -> Self { method label (line 81) | fn label(self) -> &'static str { function ws_tracker (line 95) | fn ws_tracker() -> &'static DashMap { type WsConnectionGuard (line 101) | struct WsConnectionGuard { method drop (line 106) | fn drop(&mut self) { function try_acquire_ws_slot (line 119) | fn try_acquire_ws_slot(ip: IpAddr) -> Option { function agent_ws (line 140) | pub async fn agent_ws( function handle_agent_ws (line 217) | async fn handle_agent_ws( function handle_text_message (line 391) | async fn handle_text_message( function handle_command (line 811) | async fn handle_command( function map_stream_event (line 998) | fn map_stream_event(event: &StreamEvent, verbose: VerboseLevel) -> Optio... function flush_text_buffer (line 1085) | async fn flush_text_buffer( function send_json (line 1105) | async fn send_json( function sanitize_user_input (line 1121) | fn sanitize_user_input(content: &str) -> String { function sanitize_text (line 1134) | fn sanitize_text(s: &str) -> String { function classify_streaming_error (line 1146) | fn classify_streaming_error(err: &openfang_kernel::error::KernelError) -... function extract_status_code (line 1207) | fn extract_status_code(s: &str) -> Option { function strip_think_tags (line 1247) | pub fn strip_think_tags(text: &str) -> String { function test_ws_module_loads (line 1273) | fn test_ws_module_loads() { function test_verbose_level_cycle (line 1279) | fn test_verbose_level_cycle() { function test_verbose_level_roundtrip (line 1286) | fn test_verbose_level_roundtrip() { function test_verbose_level_labels (line 1293) | fn test_verbose_level_labels() { function test_sanitize_user_input_plain_text (line 1300) | fn test_sanitize_user_input_plain_text() { function test_sanitize_user_input_strips_control_chars (line 1305) | fn test_sanitize_user_input_strips_control_chars() { function test_sanitize_user_input_extracts_json_content (line 1313) | fn test_sanitize_user_input_extracts_json_content() { function test_sanitize_user_input_leaves_non_envelope_json (line 1319) | fn test_sanitize_user_input_leaves_non_envelope_json() { function test_extract_status_code (line 1326) | fn test_extract_status_code() { function test_sanitize_trims_whitespace (line 1346) | fn test_sanitize_trims_whitespace() { function test_strip_think_tags (line 1351) | fn test_strip_think_tags() { FILE: crates/openfang-api/static/js/api.js function getContainer (line 9) | function getContainer() { function toast (line 22) | function toast(message, type, duration) { function dismissToast (line 51) | function dismissToast(el) { function success (line 57) | function success(msg, duration) { return toast(msg, 'success', duration); } function error (line 58) | function error(msg, duration) { return toast(msg, 'error', duration || 6... function warn (line 59) | function warn(msg, duration) { return toast(msg, 'warn', duration || 500... function info (line 60) | function info(msg, duration) { return toast(msg, 'info', duration); } function confirm (line 63) | function confirm(title, message, onConfirm) { function friendlyError (line 119) | function friendlyError(status, serverMsg) { function setAuthToken (line 142) | function setAuthToken(token) { _authToken = token; } function headers (line 144) | function headers() { function setConnectionState (line 150) | function setConnectionState(state) { function onConnectionChange (line 156) | function onConnectionChange(fn) { _connectionListeners.push(fn); } function request (line 158) | function request(method, path, body) { function get (line 200) | function get(path) { return request('GET', path); } function post (line 201) | function post(path, body) { return request('POST', path, body); } function put (line 202) | function put(path, body) { return request('PUT', path, body); } function patch (line 203) | function patch(path, body) { return request('PATCH', path, body); } function del (line 204) | function del(path) { return request('DELETE', path); } function wsConnect (line 215) | function wsConnect(agentId, callbacks) { function _doConnect (line 223) | function _doConnect(agentId) { function wsDisconnect (line 277) | function wsDisconnect() { function wsSend (line 285) | function wsSend(data) { function isWsConnected (line 293) | function isWsConnected() { return _wsConnected; } function getConnectionState (line 295) | function getConnectionState() { return _connectionState; } function getToken (line 297) | function getToken() { return _authToken; } function upload (line 299) | function upload(agentId, file) { FILE: crates/openfang-api/static/js/app.js function escapeHtml (line 18) | function escapeHtml(text) { function renderMarkdown (line 24) | function renderMarkdown(text) { function copyCode (line 69) | function copyCode(btn) { function toolIcon (line 81) | function toolIcon(toolName) { method toggleFocusMode (line 146) | toggleFocusMode() { method refreshAgents (line 151) | async refreshAgents() { method refreshApprovals (line 159) | async refreshApprovals() { method checkStatus (line 176) | async checkStatus() { method checkOnboarding (line 191) | async checkOnboarding() { method dismissOnboarding (line 206) | dismissOnboarding() { method checkAuth (line 211) | async checkAuth() { method submitApiKey (line 248) | submitApiKey(key) { method sessionLogin (line 256) | async sessionLogin(username, password) { method sessionLogout (line 271) | async sessionLogout() { method clearApiKey (line 279) | clearApiKey() { function app (line 287) | function app() { FILE: crates/openfang-api/static/js/katex.js function hasLatexDelimiters (line 10) | function hasLatexDelimiters(text) { function loadScript (line 15) | function loadScript(url) { function ensureKatexLoaded (line 30) | function ensureKatexLoaded() { function renderLatex (line 62) | function renderLatex(el) { FILE: crates/openfang-api/static/js/pages/agents.js function tomlMultilineEscape (line 8) | function tomlMultilineEscape(s) { function tomlBasicEscape (line 15) | function tomlBasicEscape(s) { function agentsPage (line 19) | function agentsPage() { FILE: crates/openfang-api/static/js/pages/approvals.js function approvalsPage (line 4) | function approvalsPage() { FILE: crates/openfang-api/static/js/pages/channels.js function channelsPage (line 4) | function channelsPage() { FILE: crates/openfang-api/static/js/pages/chat.js function chatPage (line 4) | function chatPage() { FILE: crates/openfang-api/static/js/pages/comms.js function commsPage (line 4) | function commsPage() { FILE: crates/openfang-api/static/js/pages/hands.js function handsPage (line 4) | function handsPage() { FILE: crates/openfang-api/static/js/pages/logs.js function logsPage (line 4) | function logsPage() { FILE: crates/openfang-api/static/js/pages/overview.js function overviewPage (line 4) | function overviewPage() { FILE: crates/openfang-api/static/js/pages/runtime.js method loadData (line 18) | async loadData() { FILE: crates/openfang-api/static/js/pages/scheduler.js function schedulerPage (line 4) | function schedulerPage() { FILE: crates/openfang-api/static/js/pages/sessions.js function sessionsPage (line 4) | function sessionsPage() { FILE: crates/openfang-api/static/js/pages/settings.js function settingsPage (line 4) | function settingsPage() { FILE: crates/openfang-api/static/js/pages/skills.js function skillsPage (line 4) | function skillsPage() { FILE: crates/openfang-api/static/js/pages/usage.js function analyticsPage (line 5) | function analyticsPage() { FILE: crates/openfang-api/static/js/pages/wizard.js function wizardTomlMultilineEscape (line 5) | function wizardTomlMultilineEscape(s) { function wizardTomlBasicEscape (line 10) | function wizardTomlBasicEscape(s) { function wizardPage (line 14) | function wizardPage() { FILE: crates/openfang-api/static/js/pages/workflow-builder.js function workflowBuilder (line 4) | function workflowBuilder() { FILE: crates/openfang-api/static/js/pages/workflows.js function workflowsPage (line 4) | function workflowsPage() { FILE: crates/openfang-api/tests/api_integration_test.rs type TestServer (line 25) | struct TestServer { method drop (line 32) | fn drop(&mut self) { function start_test_server (line 40) | async fn start_test_server() -> TestServer { function start_test_server_with_llm (line 45) | async fn start_test_server_with_llm() -> TestServer { function start_test_server_with_provider (line 49) | async fn start_test_server_with_provider( constant TEST_MANIFEST (line 146) | const TEST_MANIFEST: &str = r#" constant LLM_MANIFEST (line 165) | const LLM_MANIFEST: &str = r#" function test_health_endpoint (line 188) | async fn test_health_endpoint() { function test_status_endpoint (line 213) | async fn test_status_endpoint() { function test_spawn_list_kill_agent (line 233) | async fn test_spawn_list_kill_agent() { function test_agent_session_empty (line 287) | async fn test_agent_session_empty() { function test_send_message_with_llm (line 317) | async fn test_send_message_with_llm() { function test_workflow_crud (line 370) | async fn test_workflow_crud() { function test_trigger_crud (line 422) | async fn test_trigger_crud() { function test_invalid_agent_id_returns_400 (line 499) | async fn test_invalid_agent_id_returns_400() { function test_kill_nonexistent_agent_returns_404 (line 532) | async fn test_kill_nonexistent_agent_returns_404() { function test_spawn_invalid_manifest_returns_400 (line 546) | async fn test_spawn_invalid_manifest_returns_400() { function test_request_id_header_is_uuid (line 562) | async fn test_request_id_header_is_uuid() { function test_multiple_agents_lifecycle (line 585) | async fn test_multiple_agents_lifecycle() { function start_test_server_with_auth (line 681) | async fn start_test_server_with_auth(api_key: &str) -> TestServer { function test_auth_health_is_public (line 792) | async fn test_auth_health_is_public() { function test_auth_rejects_no_token (line 806) | async fn test_auth_rejects_no_token() { function test_auth_rejects_wrong_token (line 823) | async fn test_auth_rejects_wrong_token() { function test_auth_accepts_correct_token (line 841) | async fn test_auth_accepts_correct_token() { function test_auth_disabled_when_no_key (line 858) | async fn test_auth_disabled_when_no_key() { FILE: crates/openfang-api/tests/daemon_lifecycle_test.rs function test_daemon_info_serde_roundtrip (line 23) | fn test_daemon_info_serde_roundtrip() { function test_read_daemon_info_from_file (line 43) | fn test_read_daemon_info_from_file() { function test_read_daemon_info_missing_file (line 67) | fn test_read_daemon_info_missing_file() { function test_read_daemon_info_corrupt_json (line 75) | fn test_read_daemon_info_corrupt_json() { function test_full_daemon_lifecycle (line 89) | async fn test_full_daemon_lifecycle() { function test_stale_daemon_info_detection (line 193) | fn test_stale_daemon_info_detection() { function test_server_immediate_responsiveness (line 217) | async fn test_server_immediate_responsiveness() { FILE: crates/openfang-api/tests/load_test.rs type TestServer (line 22) | struct TestServer { method drop (line 29) | fn drop(&mut self) { function start_test_server (line 34) | async fn start_test_server() -> TestServer { constant TEST_MANIFEST (line 126) | const TEST_MANIFEST: &str = r#" function load_concurrent_agent_spawns (line 150) | async fn load_concurrent_agent_spawns() { function load_endpoint_latency (line 205) | async fn load_endpoint_latency() { function load_concurrent_reads (line 269) | async fn load_concurrent_reads() { function load_session_management (line 327) | async fn load_session_management() { function load_workflow_operations (line 428) | async fn load_workflow_operations() { function load_spawn_kill_cycle (line 494) | async fn load_spawn_kill_cycle() { function load_metrics_sustained (line 550) | async fn load_metrics_sustained() { FILE: crates/openfang-channels/src/bluesky.rs constant DEFAULT_SERVICE_URL (line 23) | const DEFAULT_SERVICE_URL: &str = "https://bsky.social"; constant MAX_MESSAGE_LEN (line 26) | const MAX_MESSAGE_LEN: usize = 300; constant POLL_INTERVAL_SECS (line 29) | const POLL_INTERVAL_SECS: u64 = 5; constant SESSION_REFRESH_BUFFER_SECS (line 32) | const SESSION_REFRESH_BUFFER_SECS: u64 = 300; type BlueskyAdapter (line 40) | pub struct BlueskyAdapter { method new (line 74) | pub fn new(identifier: String, app_password: String) -> Self { method with_service_url (line 79) | pub fn with_service_url(identifier: String, app_password: String, serv... method create_session (line 94) | async fn create_session(&self) -> Result Result<(String, String), Box Result> { method api_create_post (line 207) | async fn api_create_post( type BlueskySession (line 57) | struct BlueskySession { function parse_bluesky_notification (line 256) | fn parse_bluesky_notification( method name (line 340) | fn name(&self) -> &str { method channel_type (line 344) | fn channel_type(&self) -> ChannelType { method start (line 348) | async fn start( method send (line 518) | async fn send( method send_typing (line 535) | async fn send_typing(&self, _user: &ChannelUser) -> Result<(), Box Result<(), Box> { function test_bluesky_adapter_creation (line 551) | fn test_bluesky_adapter_creation() { function test_bluesky_default_service_url (line 564) | fn test_bluesky_default_service_url() { function test_bluesky_custom_service_url (line 570) | fn test_bluesky_custom_service_url() { function test_bluesky_identifier_stored (line 580) | fn test_bluesky_identifier_stored() { function test_parse_bluesky_notification_mention (line 586) | fn test_parse_bluesky_notification_mention() { function test_parse_bluesky_notification_reply (line 611) | fn test_parse_bluesky_notification_reply() { function test_parse_bluesky_notification_skips_own (line 637) | fn test_parse_bluesky_notification_skips_own() { function test_parse_bluesky_notification_skips_like (line 656) | fn test_parse_bluesky_notification_skips_like() { function test_parse_bluesky_notification_command (line 673) | fn test_parse_bluesky_notification_command() { FILE: crates/openfang-channels/src/bridge.rs type ChannelBridgeHandle (line 28) | pub trait ChannelBridgeHandle: Send + Sync { method send_message (line 30) | async fn send_message(&self, agent_id: AgentId, message: &str) -> Resu... method send_message_with_blocks (line 35) | async fn send_message_with_blocks( method find_agent_by_name (line 53) | async fn find_agent_by_name(&self, name: &str) -> Result Result, String>; method spawn_agent_by_name (line 59) | async fn spawn_agent_by_name(&self, manifest_name: &str) -> Result String { method list_models_text (line 68) | async fn list_models_text(&self) -> String { method list_providers_text (line 73) | async fn list_providers_text(&self) -> String { method reset_session (line 78) | async fn reset_session(&self, _agent_id: AgentId) -> Result Result Result<... method stop_run (line 93) | async fn stop_run(&self, _agent_id: AgentId) -> Result { method session_usage (line 98) | async fn session_usage(&self, _agent_id: AgentId) -> Result Result<... method list_skills_text (line 108) | async fn list_skills_text(&self) -> String { method list_hands_text (line 113) | async fn list_hands_text(&self) -> String { method authorize_channel_user (line 121) | async fn authorize_channel_user( method channel_overrides (line 133) | async fn channel_overrides(&self, _channel_type: &str) -> Option String { method run_workflow_text (line 167) | async fn run_workflow_text(&self, _name: &str, _input: &str) -> String { method list_triggers_text (line 172) | async fn list_triggers_text(&self) -> String { method create_trigger_text (line 177) | async fn create_trigger_text( method delete_trigger_text (line 187) | async fn delete_trigger_text(&self, _id_prefix: &str) -> String { method list_schedules_text (line 192) | async fn list_schedules_text(&self) -> String { method manage_schedule_text (line 197) | async fn manage_schedule_text(&self, _action: &str, _args: &[String]) ... method list_approvals_text (line 202) | async fn list_approvals_text(&self) -> String { method resolve_approval_text (line 207) | async fn resolve_approval_text(&self, _id_prefix: &str, _approve: bool... method budget_text (line 214) | async fn budget_text(&self) -> String { method peers_text (line 219) | async fn peers_text(&self) -> String { method a2a_agents_text (line 224) | async fn a2a_agents_text(&self) -> String { method send_message (line 1696) | async fn send_message(&self, _agent_id: AgentId, message: &str) -> Res... method find_agent_by_name (line 1699) | async fn find_agent_by_name(&self, name: &str) -> Result Result, String> { method spawn_agent_by_name (line 1706) | async fn spawn_agent_by_name(&self, _manifest_name: &str) -> Result, router: Arc &Arc { method start_adapter (line 309) | pub async fn start_adapter( method stop (line 376) | pub async fn stop(&mut self) { function channel_type_str (line 385) | fn channel_type_str(channel: &crate::types::ChannelType) -> &str { function send_response (line 403) | async fn send_response( function default_output_format_for_channel (line 428) | fn default_output_format_for_channel(channel_type: &str) -> OutputFormat { function send_lifecycle_reaction (line 442) | async fn send_lifecycle_reaction( function spawn_typing_loop (line 462) | fn spawn_typing_loop( function sender_user_id (line 479) | fn sender_user_id(message: &ChannelMessage) -> &str { function try_reresolution (line 489) | async fn try_reresolution( function dispatch_message (line 529) | async fn dispatch_message( function sanitize_agent_error (line 1012) | fn sanitize_agent_error(raw: &str) -> String { function detect_image_magic (line 1085) | fn detect_image_magic(bytes: &[u8]) -> Option { function media_type_from_url (line 1105) | fn media_type_from_url(url: &str) -> String { function download_image_to_blocks (line 1123) | async fn download_image_to_blocks(url: &str, caption: Option<&str>) -> V... function dispatch_with_blocks (line 1209) | async fn dispatch_with_blocks( function handle_command (line 1410) | async fn handle_command( type MockHandle (line 1690) | struct MockHandle { function test_command_parsing (line 1712) | fn test_command_parsing() { function test_dispatch_routes_to_correct_agent (line 1728) | async fn test_dispatch_routes_to_correct_agent() { function test_handle_command_agents (line 1749) | async fn test_handle_command_agents() { function test_handle_command_agent_select (line 1769) | async fn test_handle_command_agent_select() { function test_rate_limiter_allows_within_limit (line 1792) | fn test_rate_limiter_allows_within_limit() { function test_rate_limiter_blocks_over_limit (line 1800) | fn test_rate_limiter_blocks_over_limit() { function test_rate_limiter_zero_means_unlimited (line 1812) | fn test_rate_limiter_zero_means_unlimited() { function test_rate_limiter_separate_users (line 1820) | fn test_rate_limiter_separate_users() { function test_dm_policy_filtering (line 1832) | fn test_dm_policy_filtering() { function test_channel_type_str (line 1839) | fn test_channel_type_str() { function test_default_output_format_for_channel (line 1850) | fn test_default_output_format_for_channel() { function test_send_message_with_blocks_default_fallback (line 1870) | async fn test_send_message_with_blocks_default_fallback() { function test_send_message_with_blocks_image_only (line 1898) | async fn test_send_message_with_blocks_image_only() { function test_detect_image_magic_jpeg (line 1919) | fn test_detect_image_magic_jpeg() { function test_detect_image_magic_png (line 1925) | fn test_detect_image_magic_png() { function test_detect_image_magic_gif (line 1931) | fn test_detect_image_magic_gif() { function test_detect_image_magic_webp (line 1937) | fn test_detect_image_magic_webp() { function test_detect_image_magic_unknown (line 1947) | fn test_detect_image_magic_unknown() { function test_detect_image_magic_empty (line 1953) | fn test_detect_image_magic_empty() { function test_media_type_from_url (line 1958) | fn test_media_type_from_url() { FILE: crates/openfang-channels/src/dingtalk.rs constant MAX_MESSAGE_LEN (line 21) | const MAX_MESSAGE_LEN: usize = 20000; constant DINGTALK_SEND_URL (line 22) | const DINGTALK_SEND_URL: &str = "https://oapi.dingtalk.com/robot/send"; type DingTalkAdapter (line 28) | pub struct DingTalkAdapter { method new (line 49) | pub fn new(access_token: String, secret: String, webhook_port: u16) ->... method compute_signature (line 64) | fn compute_signature(secret: &str, timestamp: i64) -> String { method verify_signature (line 78) | fn verify_signature(secret: &str, timestamp: i64, signature: &str) -> ... method build_send_url (line 92) | fn build_send_url(&self) -> String { method parse_callback (line 108) | fn parse_callback(body: &serde_json::Value) -> Option<(String, String,... method name (line 129) | fn name(&self) -> &str { method channel_type (line 133) | fn channel_type(&self) -> ChannelType { method start (line 137) | async fn start( method send (line 270) | async fn send( method send_typing (line 319) | async fn send_typing(&self, _user: &ChannelUser) -> Result<(), Box Result<(), Box> { function test_dingtalk_adapter_creation (line 335) | fn test_dingtalk_adapter_creation() { function test_dingtalk_signature_computation (line 346) | fn test_dingtalk_signature_computation() { function test_dingtalk_signature_verification (line 357) | fn test_dingtalk_signature_verification() { function test_dingtalk_parse_callback_text (line 373) | fn test_dingtalk_parse_callback_text() { function test_dingtalk_parse_callback_unsupported_type (line 393) | fn test_dingtalk_parse_callback_unsupported_type() { function test_dingtalk_parse_callback_dm (line 402) | fn test_dingtalk_parse_callback_dm() { function test_dingtalk_send_url_contains_token_and_sign (line 418) | fn test_dingtalk_send_url_contains_token_and_sign() { FILE: crates/openfang-channels/src/dingtalk_stream.rs constant API_BASE (line 28) | const API_BASE: &str = "https://api.dingtalk.com"; constant MAX_MESSAGE_LEN (line 29) | const MAX_MESSAGE_LEN: usize = 20000; type DingTalkStreamAdapter (line 33) | pub struct DingTalkStreamAdapter { method new (line 44) | pub fn new(app_key: String, app_secret: String, robot_code: String) ->... method get_token (line 57) | async fn get_token(&self) -> Result &str { method channel_type (line 159) | fn channel_type(&self) -> ChannelType { method start (line 163) | async fn start( method send (line 263) | async fn send( method send_typing (line 275) | async fn send_typing(&self, _user: &ChannelUser) -> Result<(), Box Result<(), Box> { type TokenCache (line 288) | struct TokenCache { function get_access_token (line 293) | async fn get_access_token( type OpenConnectionRequest (line 334) | struct OpenConnectionRequest<'a> { type SubItem (line 346) | struct SubItem { type OpenConnectionResponse (line 353) | struct OpenConnectionResponse { function get_ws_endpoint (line 358) | async fn get_ws_endpoint( type ProtoFrame (line 394) | struct ProtoFrame { type ProtoHeaders (line 403) | struct ProtoHeaders { type AckReply (line 411) | struct AckReply { type AckHeaders (line 419) | struct AckHeaders { function make_ack (line 427) | fn make_ack(message_id: &str, topic: &str) -> String { type CallbackPayload (line 442) | struct CallbackPayload { type TextContent (line 462) | struct TextContent { function handle_frame (line 466) | async fn handle_frame(text: &str, sink: &mut S, tx: &mpsc::Sender Duration { function adapter_creation (line 571) | fn adapter_creation() { function backoff_doubles (line 581) | fn backoff_doubles() { function backoff_capped (line 588) | fn backoff_capped() { function make_ack_valid_json (line 594) | fn make_ack_valid_json() { FILE: crates/openfang-channels/src/discord.rs constant DISCORD_API_BASE (line 19) | const DISCORD_API_BASE: &str = "https://discord.com/api/v10"; constant MAX_BACKOFF (line 20) | const MAX_BACKOFF: Duration = Duration::from_secs(60); constant INITIAL_BACKOFF (line 21) | const INITIAL_BACKOFF: Duration = Duration::from_secs(1); constant DISCORD_MSG_LIMIT (line 22) | const DISCORD_MSG_LIMIT: usize = 2000; constant DISPATCH (line 26) | pub const DISPATCH: u64 = 0; constant HEARTBEAT (line 27) | pub const HEARTBEAT: u64 = 1; constant IDENTIFY (line 28) | pub const IDENTIFY: u64 = 2; constant RESUME (line 29) | pub const RESUME: u64 = 6; constant RECONNECT (line 30) | pub const RECONNECT: u64 = 7; constant INVALID_SESSION (line 31) | pub const INVALID_SESSION: u64 = 9; constant HELLO (line 32) | pub const HELLO: u64 = 10; constant HEARTBEAT_ACK (line 33) | pub const HEARTBEAT_ACK: u64 = 11; type DiscordAdapter (line 37) | pub struct DiscordAdapter { method new (line 56) | pub fn new( method get_gateway_url (line 80) | async fn get_gateway_url(&self) -> Result Result<(), Box &str { method channel_type (line 144) | fn channel_type(&self) -> ChannelType { method start (line 148) | async fn start( method send (line 409) | async fn send( method send_typing (line 428) | async fn send_typing(&self, user: &ChannelUser) -> Result<(), Box Result<(), Box> { function parse_discord_message (line 439) | async fn parse_discord_message( function test_parse_discord_message_basic (line 559) | async fn test_parse_discord_message_basic() { function test_parse_discord_message_filters_bot (line 584) | async fn test_parse_discord_message_filters_bot() { function test_parse_discord_message_filters_other_bots (line 603) | async fn test_parse_discord_message_filters_other_bots() { function test_parse_discord_ignore_bots_false_allows_other_bots (line 623) | async fn test_parse_discord_ignore_bots_false_allows_other_bots() { function test_parse_discord_ignore_bots_false_still_filters_self (line 647) | async fn test_parse_discord_ignore_bots_false_still_filters_self() { function test_parse_discord_message_guild_filter (line 668) | async fn test_parse_discord_message_guild_filter() { function test_parse_discord_command (line 694) | async fn test_parse_discord_command() { function test_parse_discord_empty_content (line 721) | async fn test_parse_discord_empty_content() { function test_parse_discord_discriminator (line 740) | async fn test_parse_discord_discriminator() { function test_parse_discord_message_update (line 761) | async fn test_parse_discord_message_update() { function test_parse_discord_allowed_users_filter (line 788) | async fn test_parse_discord_allowed_users_filter() { function test_parse_discord_mention_detection (line 823) | async fn test_parse_discord_mention_detection() { function test_parse_discord_dm_not_group (line 872) | async fn test_parse_discord_dm_not_group() { function test_discord_adapter_creation (line 893) | fn test_discord_adapter_creation() { FILE: crates/openfang-channels/src/discourse.rs constant POLL_INTERVAL_SECS (line 21) | const POLL_INTERVAL_SECS: u64 = 10; constant MAX_MESSAGE_LEN (line 22) | const MAX_MESSAGE_LEN: usize = 32000; type DiscourseAdapter (line 28) | pub struct DiscourseAdapter { method new (line 54) | pub fn new( method auth_headers (line 75) | fn auth_headers(&self, builder: reqwest::RequestBuilder) -> reqwest::R... method validate (line 82) | async fn validate(&self) -> Result> { method fetch_latest_posts (line 99) | async fn fetch_latest_posts( method create_post (line 129) | async fn create_post( method matches_category (line 161) | fn matches_category(&self, category_slug: &str) -> bool { method name (line 168) | fn name(&self) -> &str { method channel_type (line 172) | fn channel_type(&self) -> ChannelType { method start (line 176) | async fn start( method send (line 348) | async fn send( method send_in_thread (line 369) | async fn send_in_thread( method send_typing (line 390) | async fn send_typing(&self, _user: &ChannelUser) -> Result<(), Box Result<(), Box> { function test_discourse_adapter_creation (line 406) | fn test_discourse_adapter_creation() { function test_discourse_url_normalization (line 421) | fn test_discourse_url_normalization() { function test_discourse_category_filter (line 432) | fn test_discourse_category_filter() { function test_discourse_category_filter_empty_allows_all (line 445) | fn test_discourse_category_filter_empty_allows_all() { function test_discourse_auth_headers (line 456) | fn test_discourse_auth_headers() { FILE: crates/openfang-channels/src/email.rs type PlainAuthenticator (line 25) | struct PlainAuthenticator { type Response (line 31) | type Response = String; method process (line 32) | fn process(&self, _data: &[u8]) -> Self::Response { type ReplyCtx (line 40) | struct ReplyCtx { type EmailAdapter (line 46) | pub struct EmailAdapter { method new (line 75) | pub fn new( method is_allowed_sender (line 109) | fn is_allowed_sender(&self, sender: &str) -> bool { method extract_agent_from_subject (line 114) | fn extract_agent_from_subject(subject: &str) -> Option { method strip_agent_tag (line 128) | fn strip_agent_tag(subject: &str) -> String { method build_smtp_transport (line 139) | async fn build_smtp_transport( function extract_email_addr (line 163) | fn extract_email_addr(raw: &str) -> String { function get_header (line 176) | fn get_header(parsed: &mailparse::ParsedMail<'_>, name: &str) -> Option<... function extract_text_body (line 185) | fn extract_text_body(parsed: &mailparse::ParsedMail<'_>) -> String { function fetch_unseen_emails (line 206) | fn fetch_unseen_emails( method name (line 309) | fn name(&self) -> &str { method channel_type (line 313) | fn channel_type(&self) -> ChannelType { method start (line 317) | async fn start( method send (line 429) | async fn send( method stop (line 506) | async fn stop(&self) -> Result<(), Box> { function test_email_adapter_creation (line 517) | fn test_email_adapter_creation() { function test_allowed_senders (line 534) | fn test_allowed_senders() { function test_extract_agent_from_subject (line 564) | fn test_extract_agent_from_subject() { function test_strip_agent_tag (line 584) | fn test_strip_agent_tag() { function test_extract_email_addr (line 593) | fn test_extract_email_addr() { function test_subject_extraction_from_body (line 603) | fn test_subject_extraction_from_body() { function test_reply_ctx_threading (line 614) | fn test_reply_ctx_threading() { FILE: crates/openfang-channels/src/feishu.rs constant FEISHU_DOMAIN (line 32) | const FEISHU_DOMAIN: &str = "https://open.feishu.cn"; constant LARK_DOMAIN (line 33) | const LARK_DOMAIN: &str = "https://open.larksuite.com"; constant MAX_MESSAGE_LEN (line 36) | const MAX_MESSAGE_LEN: usize = 4000; constant TOKEN_REFRESH_BUFFER_SECS (line 39) | const TOKEN_REFRESH_BUFFER_SECS: u64 = 300; constant DEDUP_CACHE_SIZE (line 42) | const DEDUP_CACHE_SIZE: usize = 1000; type FeishuRegion (line 48) | pub enum FeishuRegion { method parse_region (line 56) | pub fn parse_region(s: &str) -> Self { method domain (line 63) | fn domain(&self) -> &'static str { method label (line 70) | fn label(&self) -> &'static str { method channel_name (line 77) | fn channel_name(&self) -> &'static str { type DedupCache (line 88) | struct DedupCache { method new (line 94) | fn new(max_size: usize) -> Self { method check_and_insert (line 102) | fn check_and_insert(&self, id: &str) -> bool { type FeishuAdapter (line 123) | pub struct FeishuAdapter { method new (line 155) | pub fn new(app_id: String, app_secret: String, webhook_port: u16) -> S... method with_config (line 177) | pub fn with_config( method api_url (line 199) | fn api_url(&self, path: &str) -> String { method get_token (line 204) | async fn get_token(&self) -> Result> { method validate (line 253) | async fn validate(&self) -> Result> { method api_send_message (line 284) | async fn api_send_message( method api_reply_message (line 338) | async fn api_reply_message( function extract_text_from_post (line 377) | fn extract_text_from_post(content: &serde_json::Value) -> Option { function should_respond_in_group (line 435) | fn should_respond_in_group(text: &str, mentions: &serde_json::Value, bot... function strip_mention_placeholders (line 457) | fn strip_mention_placeholders(text: &str) -> String { function decrypt_event (line 463) | fn decrypt_event( function parse_event (line 494) | fn parse_event( method name (line 620) | fn name(&self) -> &str { method channel_type (line 624) | fn channel_type(&self) -> ChannelType { method start (line 628) | async fn start( method send (line 861) | async fn send( method send_typing (line 879) | async fn send_typing(&self, _user: &ChannelUser) -> Result<(), Box Result<(), Box> { function test_feishu_adapter_creation (line 894) | fn test_feishu_adapter_creation() { function test_lark_region_adapter (line 907) | fn test_lark_region_adapter() { function test_region_from_str (line 928) | fn test_region_from_str() { function test_region_domains (line 940) | fn test_region_domains() { function test_with_verification (line 946) | fn test_with_verification() { function test_dedup_cache_basic (line 965) | fn test_dedup_cache_basic() { function test_dedup_cache_eviction (line 973) | fn test_dedup_cache_eviction() { function test_should_respond_when_mentioned (line 988) | fn test_should_respond_when_mentioned() { function test_should_respond_with_question_mark (line 994) | fn test_should_respond_with_question_mark() { function test_should_respond_with_fullwidth_question (line 1000) | fn test_should_respond_with_fullwidth_question() { function test_should_respond_with_bot_name (line 1010) | fn test_should_respond_with_bot_name() { function test_should_not_respond_plain_group_msg (line 1021) | fn test_should_not_respond_plain_group_msg() { function test_extract_text_from_post_en (line 1029) | fn test_extract_text_from_post_en() { function test_extract_text_from_post_with_link (line 1045) | fn test_extract_text_from_post_with_link() { function test_extract_text_from_post_empty (line 1062) | fn test_extract_text_from_post_empty() { function test_strip_mention_placeholders (line 1070) | fn test_strip_mention_placeholders() { function test_parse_event_v2_text (line 1082) | fn test_parse_event_v2_text() { function test_parse_event_group_filters (line 1117) | fn test_parse_event_group_filters() { function test_parse_event_group_with_question (line 1144) | fn test_parse_event_group_with_question() { function test_parse_event_command (line 1171) | fn test_parse_event_command() { function test_parse_event_skips_bot (line 1204) | fn test_parse_event_skips_bot() { function test_parse_event_post_message (line 1230) | fn test_parse_event_post_message() { function test_parse_event_thread_id (line 1269) | fn test_parse_event_thread_id() { FILE: crates/openfang-channels/src/flock.rs constant FLOCK_API_BASE (line 22) | const FLOCK_API_BASE: &str = "https://api.flock.com/v2"; constant MAX_MESSAGE_LEN (line 25) | const MAX_MESSAGE_LEN: usize = 4096; type FlockAdapter (line 32) | pub struct FlockAdapter { method new (line 50) | pub fn new(bot_token: String, webhook_port: u16) -> Self { method validate (line 62) | async fn validate(&self) -> Result> { method api_send_message (line 84) | async fn api_send_message( method api_send_rich_message (line 123) | async fn api_send_rich_message( function parse_flock_event (line 158) | fn parse_flock_event(event: &serde_json::Value, own_user_id: &str) -> Op... method name (line 235) | fn name(&self) -> &str { method channel_type (line 239) | fn channel_type(&self) -> ChannelType { method start (line 243) | async fn start( method send (line 312) | async fn send( method send_typing (line 329) | async fn send_typing(&self, _user: &ChannelUser) -> Result<(), Box Result<(), Box> { function test_flock_adapter_creation (line 345) | fn test_flock_adapter_creation() { function test_flock_token_zeroized (line 355) | fn test_flock_token_zeroized() { function test_flock_webhook_port (line 361) | fn test_flock_webhook_port() { function test_parse_flock_event_message (line 367) | fn test_parse_flock_event_message() { function test_parse_flock_event_command (line 387) | fn test_parse_flock_event_command() { function test_parse_flock_event_skip_bot (line 409) | fn test_parse_flock_event_skip_bot() { function test_parse_flock_event_dm (line 424) | fn test_parse_flock_event_dm() { function test_parse_flock_event_unknown_type (line 441) | fn test_parse_flock_event_unknown_type() { function test_parse_flock_event_empty_text (line 452) | fn test_parse_flock_event_empty_text() { FILE: crates/openfang-channels/src/formatter.rs function format_for_channel (line 11) | pub fn format_for_channel(text: &str, format: OutputFormat) -> String { function format_for_wecom (line 22) | pub fn format_for_wecom(text: &str, format: OutputFormat) -> String { function markdown_to_telegram_html (line 32) | fn markdown_to_telegram_html(text: &str) -> String { function render_inline_markdown (line 161) | fn render_inline_markdown(text: &str) -> String { function escape_html (line 239) | fn escape_html(text: &str) -> String { function fence_delimiter (line 245) | fn fence_delimiter(line: &str) -> Option<&'static str> { function heading_text (line 255) | fn heading_text(line: &str) -> Option<&str> { function unordered_list_item (line 264) | fn unordered_list_item(line: &str) -> Option<&str> { function ordered_list_item (line 273) | fn ordered_list_item(line: &str) -> Option<&str> { function markdown_to_slack_mrkdwn (line 289) | fn markdown_to_slack_mrkdwn(text: &str) -> String { function strip_atx_heading (line 329) | fn strip_atx_heading(line: &str) -> String { function strip_blockquote_prefix (line 347) | fn strip_blockquote_prefix(line: &str) -> String { function strip_task_list_prefix (line 355) | fn strip_task_list_prefix(line: &str) -> String { function is_fenced_code_marker (line 367) | fn is_fenced_code_marker(line: &str) -> bool { function is_setext_heading_underline (line 379) | fn is_setext_heading_underline(line: &str) -> bool { function is_table_divider (line 387) | fn is_table_divider(line: &str) -> bool { function strip_inline_markdown (line 392) | fn strip_inline_markdown(mut text: String) -> String { function markdown_to_wecom_plain (line 461) | fn markdown_to_wecom_plain(text: &str) -> String { function markdown_to_plain (line 516) | fn markdown_to_plain(text: &str) -> String { function test_format_markdown_passthrough (line 571) | fn test_format_markdown_passthrough() { function test_telegram_html_bold (line 577) | fn test_telegram_html_bold() { function test_telegram_html_italic (line 583) | fn test_telegram_html_italic() { function test_telegram_html_code (line 589) | fn test_telegram_html_code() { function test_telegram_html_link (line 595) | fn test_telegram_html_link() { function test_telegram_html_heading (line 601) | fn test_telegram_html_heading() { function test_telegram_html_unordered_list (line 607) | fn test_telegram_html_unordered_list() { function test_telegram_html_ordered_list (line 613) | fn test_telegram_html_ordered_list() { function test_telegram_html_fenced_code_block (line 619) | fn test_telegram_html_fenced_code_block() { function test_telegram_html_blockquote (line 625) | fn test_telegram_html_blockquote() { function test_slack_mrkdwn_bold (line 631) | fn test_slack_mrkdwn_bold() { function test_slack_mrkdwn_link (line 637) | fn test_slack_mrkdwn_link() { function test_plain_text_strips_formatting (line 643) | fn test_plain_text_strips_formatting() { function test_plain_text_converts_links (line 649) | fn test_plain_text_converts_links() { function test_wecom_plain_text_strips_common_markdown_blocks (line 655) | fn test_wecom_plain_text_strips_common_markdown_blocks() { FILE: crates/openfang-channels/src/gitter.rs constant MAX_MESSAGE_LEN (line 21) | const MAX_MESSAGE_LEN: usize = 4096; constant GITTER_STREAM_URL (line 22) | const GITTER_STREAM_URL: &str = "https://stream.gitter.im/v1/rooms"; constant GITTER_API_URL (line 23) | const GITTER_API_URL: &str = "https://api.gitter.im/v1/rooms"; type GitterAdapter (line 29) | pub struct GitterAdapter { method new (line 47) | pub fn new(token: String, room_id: String) -> Self { method validate (line 59) | async fn validate(&self) -> Result> { method get_room_name (line 84) | async fn get_room_name(&self) -> Result Result<(), Box Option<(String, String, String,... method name (line 151) | fn name(&self) -> &str { method channel_type (line 155) | fn channel_type(&self) -> ChannelType { method start (line 159) | async fn start( method send (line 330) | async fn send( method send_typing (line 342) | async fn send_typing(&self, _user: &ChannelUser) -> Result<(), Box Result<(), Box> { function test_gitter_adapter_creation (line 358) | fn test_gitter_adapter_creation() { function test_gitter_room_id (line 368) | fn test_gitter_room_id() { function test_gitter_parse_stream_message (line 374) | fn test_gitter_parse_stream_message() { function test_gitter_parse_stream_message_missing_fields (line 386) | fn test_gitter_parse_stream_message_missing_fields() { function test_gitter_parse_stream_message_empty_text (line 392) | fn test_gitter_parse_stream_message_empty_text() { function test_gitter_parse_stream_message_no_display_name (line 399) | fn test_gitter_parse_stream_message_no_display_name() { function test_gitter_parse_invalid_json (line 409) | fn test_gitter_parse_invalid_json() { FILE: crates/openfang-channels/src/google_chat.rs constant MAX_MESSAGE_LEN (line 21) | const MAX_MESSAGE_LEN: usize = 4096; constant TOKEN_REFRESH_MARGIN_SECS (line 22) | const TOKEN_REFRESH_MARGIN_SECS: u64 = 300; type GoogleChatAdapter (line 29) | pub struct GoogleChatAdapter { method new (line 52) | pub fn new(service_account_key: String, space_ids: Vec, webhoo... method get_access_token (line 71) | async fn get_access_token(&self) -> Result bool { method name (line 143) | fn name(&self) -> &str { method channel_type (line 147) | fn channel_type(&self) -> ChannelType { method start (line 151) | async fn start( method send (line 334) | async fn send( method stop (line 351) | async fn stop(&self) -> Result<(), Box> { function test_google_chat_adapter_creation (line 362) | fn test_google_chat_adapter_creation() { function test_google_chat_allowed_spaces (line 376) | fn test_google_chat_allowed_spaces() { function test_google_chat_token_caching (line 390) | async fn test_google_chat_token_caching() { function test_google_chat_invalid_key (line 407) | fn test_google_chat_invalid_key() { FILE: crates/openfang-channels/src/gotify.rs constant MAX_MESSAGE_LEN (line 21) | const MAX_MESSAGE_LEN: usize = 65535; type GotifyAdapter (line 28) | pub struct GotifyAdapter { method new (line 49) | pub fn new(server_url: String, app_token: String, client_token: String... method validate (line 63) | async fn validate(&self) -> Result> { method build_ws_url (line 81) | fn build_ws_url(&self) -> String { method api_send_message (line 90) | async fn api_send_message( method parse_ws_message (line 129) | fn parse_ws_message(text: &str) -> Option<(u64, String, String, u8, u6... method name (line 147) | fn name(&self) -> &str { method channel_type (line 151) | fn channel_type(&self) -> ChannelType { method start (line 155) | async fn start( method send (line 308) | async fn send( method send_typing (line 320) | async fn send_typing(&self, _user: &ChannelUser) -> Result<(), Box Result<(), Box> { function test_gotify_adapter_creation (line 336) | fn test_gotify_adapter_creation() { function test_gotify_url_normalization (line 350) | fn test_gotify_url_normalization() { function test_gotify_ws_url_https (line 360) | fn test_gotify_ws_url_https() { function test_gotify_ws_url_http (line 372) | fn test_gotify_ws_url_http() { function test_gotify_parse_ws_message (line 384) | fn test_gotify_parse_ws_message() { function test_gotify_parse_ws_message_empty (line 397) | fn test_gotify_parse_ws_message_empty() { function test_gotify_parse_ws_message_minimal (line 403) | fn test_gotify_parse_ws_message_minimal() { function test_gotify_parse_invalid_json (line 415) | fn test_gotify_parse_invalid_json() { FILE: crates/openfang-channels/src/guilded.rs constant GUILDED_API_BASE (line 23) | const GUILDED_API_BASE: &str = "https://www.guilded.gg/api/v1"; constant GUILDED_WS_URL (line 26) | const GUILDED_WS_URL: &str = "wss://www.guilded.gg/websocket/v1"; constant MAX_MESSAGE_LEN (line 29) | const MAX_MESSAGE_LEN: usize = 4000; type GuildedAdapter (line 35) | pub struct GuildedAdapter { method new (line 53) | pub fn new(bot_token: String, server_ids: Vec) -> Self { method validate (line 65) | async fn validate(&self) -> Result> { method api_send_message (line 84) | async fn api_send_message( method is_allowed_server (line 117) | fn is_allowed_server(&self, server_id: &str) -> bool { method name (line 124) | fn name(&self) -> &str { method channel_type (line 128) | fn channel_type(&self) -> ChannelType { method start (line 132) | async fn start( method send (line 322) | async fn send( method send_typing (line 339) | async fn send_typing(&self, _user: &ChannelUser) -> Result<(), Box Result<(), Box> { function test_guilded_adapter_creation (line 355) | fn test_guilded_adapter_creation() { function test_guilded_allowed_servers (line 366) | fn test_guilded_allowed_servers() { function test_guilded_token_zeroized (line 380) | fn test_guilded_token_zeroized() { function test_guilded_constants (line 386) | fn test_guilded_constants() { FILE: crates/openfang-channels/src/irc.rs constant MAX_MESSAGE_LEN (line 26) | const MAX_MESSAGE_LEN: usize = 510; constant MAX_PRIVMSG_PAYLOAD (line 30) | const MAX_PRIVMSG_PAYLOAD: usize = 400; constant MAX_BACKOFF (line 32) | const MAX_BACKOFF: Duration = Duration::from_secs(60); constant INITIAL_BACKOFF (line 33) | const INITIAL_BACKOFF: Duration = Duration::from_secs(1); type IrcAdapter (line 39) | pub struct IrcAdapter { method new (line 70) | pub fn new( method addr (line 93) | fn addr(&self) -> String { type IrcLine (line 100) | struct IrcLine { function parse_irc_line (line 114) | fn parse_irc_line(line: &str) -> Option { function nick_from_prefix (line 151) | fn nick_from_prefix(prefix: &str) -> &str { function parse_privmsg (line 156) | fn parse_privmsg(line: &IrcLine, bot_nick: &str) -> Option &str { method channel_type (line 226) | fn channel_type(&self) -> ChannelType { method start (line 230) | async fn start( method send (line 418) | async fn send( method stop (line 449) | async fn stop(&self) -> Result<(), Box> { function test_irc_adapter_creation (line 460) | fn test_irc_adapter_creation() { function test_irc_addr (line 477) | fn test_irc_addr() { function test_irc_addr_custom_port (line 490) | fn test_irc_addr_custom_port() { function test_parse_irc_line_ping (line 503) | fn test_parse_irc_line_ping() { function test_parse_irc_line_privmsg (line 511) | fn test_parse_irc_line_privmsg() { function test_parse_irc_line_numeric (line 520) | fn test_parse_irc_line_numeric() { function test_parse_irc_line_no_trailing (line 529) | fn test_parse_irc_line_no_trailing() { function test_parse_irc_line_empty (line 537) | fn test_parse_irc_line_empty() { function test_nick_from_prefix_full (line 543) | fn test_nick_from_prefix_full() { function test_nick_from_prefix_nick_only (line 548) | fn test_nick_from_prefix_nick_only() { function test_parse_privmsg_channel (line 553) | fn test_parse_privmsg_channel() { function test_parse_privmsg_dm (line 570) | fn test_parse_privmsg_dm() { function test_parse_privmsg_skips_self (line 584) | fn test_parse_privmsg_skips_self() { function test_parse_privmsg_command (line 597) | fn test_parse_privmsg_command() { function test_parse_privmsg_empty_text (line 616) | fn test_parse_privmsg_empty_text() { function test_parse_privmsg_no_trailing (line 629) | fn test_parse_privmsg_no_trailing() { function test_parse_privmsg_not_privmsg (line 642) | fn test_parse_privmsg_not_privmsg() { FILE: crates/openfang-channels/src/keybase.rs constant MAX_MESSAGE_LEN (line 23) | const MAX_MESSAGE_LEN: usize = 10000; constant POLL_INTERVAL_SECS (line 26) | const POLL_INTERVAL_SECS: u64 = 3; constant KEYBASE_API_URL (line 29) | const KEYBASE_API_URL: &str = "http://127.0.0.1:5222/api"; type KeybaseAdapter (line 35) | pub struct KeybaseAdapter { method new (line 59) | pub fn new(username: String, paperkey: String, allowed_teams: Vec serde_json::Value { method list_conversations (line 83) | async fn list_conversations( method read_messages (line 114) | async fn read_messages( method api_send_message (line 150) | async fn api_send_message( method is_allowed_team (line 189) | fn is_allowed_team(&self, team_name: &str) -> bool { method name (line 196) | fn name(&self) -> &str { method channel_type (line 200) | fn channel_type(&self) -> ChannelType { method start (line 204) | async fn start( method send (line 416) | async fn send( method send_typing (line 444) | async fn send_typing(&self, _user: &ChannelUser) -> Result<(), Box Result<(), Box> { function test_keybase_adapter_creation (line 460) | fn test_keybase_adapter_creation() { function test_keybase_allowed_teams (line 474) | fn test_keybase_allowed_teams() { function test_keybase_paperkey_zeroized (line 489) | fn test_keybase_paperkey_zeroized() { function test_keybase_auth_payload (line 499) | fn test_keybase_auth_payload() { function test_keybase_username_stored (line 507) | fn test_keybase_username_stored() { FILE: crates/openfang-channels/src/line.rs constant LINE_PUSH_URL (line 22) | const LINE_PUSH_URL: &str = "https://api.line.me/v2/bot/message/push"; constant LINE_REPLY_URL (line 25) | const LINE_REPLY_URL: &str = "https://api.line.me/v2/bot/message/reply"; constant LINE_PROFILE_URL (line 29) | const LINE_PROFILE_URL: &str = "https://api.line.me/v2/bot/profile"; constant MAX_MESSAGE_LEN (line 32) | const MAX_MESSAGE_LEN: usize = 5000; type LineAdapter (line 41) | pub struct LineAdapter { method new (line 62) | pub fn new(channel_secret: String, access_token: String, webhook_port:... method verify_signature (line 77) | fn verify_signature(&self, body: &[u8], signature: &str) -> bool { method validate (line 109) | async fn validate(&self) -> Result> { method get_user_display_name (line 134) | async fn get_user_display_name(&self, user_id: &str) -> String { method api_push_message (line 155) | async fn api_push_message( method api_reply_message (line 193) | async fn api_reply_message( function parse_line_event (line 238) | fn parse_line_event(event: &serde_json::Value) -> Option { method name (line 331) | fn name(&self) -> &str { method channel_type (line 335) | fn channel_type(&self) -> ChannelType { method start (line 339) | async fn start( method send (line 434) | async fn send( method send_typing (line 485) | async fn send_typing(&self, _user: &ChannelUser) -> Result<(), Box Result<(), Box> { function test_line_adapter_creation (line 501) | fn test_line_adapter_creation() { function test_line_adapter_both_tokens (line 516) | fn test_line_adapter_both_tokens() { function test_parse_line_event_text_message (line 524) | fn test_parse_line_event_text_message() { function test_parse_line_event_group_message (line 548) | fn test_parse_line_event_group_message() { function test_parse_line_event_command (line 570) | fn test_parse_line_event_command() { function test_parse_line_event_non_message (line 596) | fn test_parse_line_event_non_message() { function test_parse_line_event_non_text (line 610) | fn test_parse_line_event_non_text() { function test_parse_line_event_room_source (line 630) | fn test_parse_line_event_room_source() { FILE: crates/openfang-channels/src/linkedin.rs constant POLL_INTERVAL_SECS (line 21) | const POLL_INTERVAL_SECS: u64 = 10; constant MAX_MESSAGE_LEN (line 22) | const MAX_MESSAGE_LEN: usize = 3000; constant LINKEDIN_API_BASE (line 23) | const LINKEDIN_API_BASE: &str = "https://api.linkedin.com/v2"; type LinkedInAdapter (line 30) | pub struct LinkedInAdapter { method new (line 50) | pub fn new(access_token: String, organization_id: String) -> Self { method auth_request (line 69) | fn auth_request(&self, builder: reqwest::RequestBuilder) -> reqwest::R... method validate (line 77) | async fn validate(&self) -> Result> { method fetch_messages (line 100) | async fn fetch_messages( method api_send_message (line 145) | async fn api_send_message( method parse_message_element (line 187) | fn parse_message_element( method org_numeric_id (line 208) | pub fn org_numeric_id(&self) -> &str { method name (line 217) | fn name(&self) -> &str { method channel_type (line 221) | fn channel_type(&self) -> ChannelType { method start (line 225) | async fn start( method send (line 365) | async fn send( method send_typing (line 379) | async fn send_typing(&self, _user: &ChannelUser) -> Result<(), Box Result<(), Box> { function test_linkedin_adapter_creation (line 395) | fn test_linkedin_adapter_creation() { function test_linkedin_organization_id_normalization (line 405) | fn test_linkedin_organization_id_normalization() { function test_linkedin_org_numeric_id (line 415) | fn test_linkedin_org_numeric_id() { function test_linkedin_auth_headers (line 421) | fn test_linkedin_auth_headers() { function test_linkedin_parse_message_element (line 435) | fn test_linkedin_parse_message_element() { function test_linkedin_parse_message_empty_body (line 454) | fn test_linkedin_parse_message_empty_body() { function test_linkedin_parse_message_missing_body (line 464) | fn test_linkedin_parse_message_missing_body() { function test_linkedin_parse_message_defaults (line 473) | fn test_linkedin_parse_message_defaults() { FILE: crates/openfang-channels/src/mastodon.rs constant MAX_MESSAGE_LEN (line 23) | const MAX_MESSAGE_LEN: usize = 500; constant SSE_RECONNECT_DELAY_SECS (line 26) | const SSE_RECONNECT_DELAY_SECS: u64 = 5; constant MAX_BACKOFF_SECS (line 29) | const MAX_BACKOFF_SECS: u64 = 60; type MastodonAdapter (line 36) | pub struct MastodonAdapter { method new (line 56) | pub fn new(instance_url: String, access_token: String) -> Self { method validate (line 70) | async fn validate(&self) -> Result<(String, String), Box String { method name (line 308) | fn name(&self) -> &str { method channel_type (line 312) | fn channel_type(&self) -> ChannelType { method start (line 316) | async fn start( method send (line 487) | async fn send( method send_in_thread (line 505) | async fn send_in_thread( method send_typing (line 524) | async fn send_typing(&self, _user: &ChannelUser) -> Result<(), Box bool { method stop (line 533) | async fn stop(&self) -> Result<(), Box> { function test_mastodon_adapter_creation (line 544) | fn test_mastodon_adapter_creation() { function test_mastodon_url_normalization (line 557) | fn test_mastodon_url_normalization() { function test_mastodon_custom_instance (line 564) | fn test_mastodon_custom_instance() { function test_strip_html_tags_basic (line 571) | fn test_strip_html_tags_basic() { function test_strip_html_tags_entities (line 579) | fn test_strip_html_tags_entities() { function test_strip_html_tags_empty (line 584) | fn test_strip_html_tags_empty() { function test_strip_html_tags_no_tags (line 589) | fn test_strip_html_tags_no_tags() { function test_strip_html_tags_emoji (line 594) | fn test_strip_html_tags_emoji() { function test_strip_html_tags_cjk (line 602) | fn test_strip_html_tags_cjk() { function test_strip_html_tags_numeric_entities (line 610) | fn test_strip_html_tags_numeric_entities() { function test_strip_html_tags_div_newline (line 615) | fn test_strip_html_tags_div_newline() { function test_parse_mastodon_notification_mention (line 623) | fn test_parse_mastodon_notification_mention() { function test_parse_mastodon_notification_non_mention (line 648) | fn test_parse_mastodon_notification_non_mention() { function test_parse_mastodon_notification_own_mention (line 666) | fn test_parse_mastodon_notification_own_mention() { function test_parse_mastodon_notification_visibility (line 685) | fn test_parse_mastodon_notification_visibility() { FILE: crates/openfang-channels/src/matrix.rs constant SYNC_TIMEOUT_MS (line 18) | const SYNC_TIMEOUT_MS: u64 = 30000; constant MAX_MESSAGE_LEN (line 19) | const MAX_MESSAGE_LEN: usize = 4096; type MatrixAdapter (line 22) | pub struct MatrixAdapter { method new (line 44) | pub fn new( method api_send_message (line 66) | async fn api_send_message( method validate (line 103) | async fn validate(&self) -> Result> { method is_allowed_room (line 124) | fn is_allowed_room(&self, room_id: &str) -> bool { function accept_invite (line 130) | async fn accept_invite( function get_room_member_count (line 158) | async fn get_room_member_count( function initial_sync (line 180) | async fn initial_sync( method name (line 203) | fn name(&self) -> &str { method channel_type (line 207) | fn channel_type(&self) -> ChannelType { method start (line 211) | async fn start( method send (line 409) | async fn send( method send_typing (line 426) | async fn send_typing(&self, user: &ChannelUser) -> Result<(), Box Result<(), Box> { function test_matrix_adapter_creation (line 459) | fn test_matrix_adapter_creation() { function test_matrix_allowed_rooms (line 471) | fn test_matrix_allowed_rooms() { FILE: crates/openfang-channels/src/mattermost.rs constant MAX_MESSAGE_LEN (line 22) | const MAX_MESSAGE_LEN: usize = 16383; constant MAX_BACKOFF (line 23) | const MAX_BACKOFF: Duration = Duration::from_secs(60); constant INITIAL_BACKOFF (line 24) | const INITIAL_BACKOFF: Duration = Duration::from_secs(1); type MattermostAdapter (line 30) | pub struct MattermostAdapter { method new (line 52) | pub fn new(server_url: String, token: String, allowed_channels: Vec Result String { method api_send_message (line 102) | async fn api_send_message( method is_allowed_channel (line 136) | fn is_allowed_channel(&self, channel_id: &str) -> bool { function parse_mattermost_event (line 145) | fn parse_mattermost_event( method name (line 231) | fn name(&self) -> &str { method channel_type (line 235) | fn channel_type(&self) -> ChannelType { method start (line 239) | async fn start( method send (line 388) | async fn send( method send_typing (line 406) | async fn send_typing(&self, user: &ChannelUser) -> Result<(), Box Result<(), Box> { function test_mattermost_adapter_creation (line 477) | fn test_mattermost_adapter_creation() { function test_mattermost_ws_url_https (line 488) | fn test_mattermost_ws_url_https() { function test_mattermost_ws_url_http (line 498) | fn test_mattermost_ws_url_http() { function test_mattermost_ws_url_trailing_slash (line 508) | fn test_mattermost_ws_url_trailing_slash() { function test_mattermost_allowed_channels (line 519) | fn test_mattermost_allowed_channels() { function test_parse_mattermost_event_basic (line 538) | fn test_parse_mattermost_event_basic() { function test_parse_mattermost_event_dm (line 569) | fn test_parse_mattermost_event_dm() { function test_parse_mattermost_event_threaded (line 592) | fn test_parse_mattermost_event_threaded() { function test_parse_mattermost_event_skips_bot (line 615) | fn test_parse_mattermost_event_skips_bot() { function test_parse_mattermost_event_channel_filter (line 639) | fn test_parse_mattermost_event_channel_filter() { function test_parse_mattermost_event_command (line 668) | fn test_parse_mattermost_event_command() { function test_parse_mattermost_event_non_posted (line 697) | fn test_parse_mattermost_event_non_posted() { function test_parse_mattermost_event_empty_message (line 708) | fn test_parse_mattermost_event_empty_message() { FILE: crates/openfang-channels/src/messenger.rs constant GRAPH_API_BASE (line 22) | const GRAPH_API_BASE: &str = "https://graph.facebook.com/v18.0"; constant MAX_MESSAGE_LEN (line 25) | const MAX_MESSAGE_LEN: usize = 2000; type MessengerAdapter (line 35) | pub struct MessengerAdapter { method new (line 56) | pub fn new(page_token: String, verify_token: String, webhook_port: u16... method validate (line 69) | async fn validate(&self) -> Result> { method api_send_message (line 90) | async fn api_send_message( method api_send_action (line 127) | async fn api_send_action( method mark_seen (line 151) | async fn mark_seen(&self, recipient_id: &str) -> Result<(), Box Vec &str { method channel_type (line 263) | fn channel_type(&self) -> ChannelType { method start (line 267) | async fn start( method send (line 363) | async fn send( method send_typing (line 418) | async fn send_typing(&self, user: &ChannelUser) -> Result<(), Box Result<(), Box> { function test_messenger_adapter_creation (line 433) | fn test_messenger_adapter_creation() { function test_messenger_both_tokens (line 448) | fn test_messenger_both_tokens() { function test_parse_messenger_entry_text_message (line 455) | fn test_parse_messenger_entry_text_message() { function test_parse_messenger_entry_command (line 485) | fn test_parse_messenger_entry_command() { function test_parse_messenger_entry_skips_echo (line 513) | fn test_parse_messenger_entry_skips_echo() { function test_parse_messenger_entry_skips_delivery (line 536) | fn test_parse_messenger_entry_skips_delivery() { function test_parse_messenger_entry_quick_reply (line 557) | fn test_parse_messenger_entry_quick_reply() { function test_parse_messenger_entry_empty_text (line 582) | fn test_parse_messenger_entry_empty_text() { function test_parse_messenger_entry_multiple_messages (line 603) | fn test_parse_messenger_entry_multiple_messages() { FILE: crates/openfang-channels/src/mumble.rs constant MAX_MESSAGE_LEN (line 23) | const MAX_MESSAGE_LEN: usize = 5000; constant DEFAULT_PORT (line 24) | const DEFAULT_PORT: u16 = 64738; constant MSG_TYPE_VERSION (line 27) | const MSG_TYPE_VERSION: u16 = 0; constant MSG_TYPE_AUTHENTICATE (line 28) | const MSG_TYPE_AUTHENTICATE: u16 = 2; constant MSG_TYPE_PING (line 29) | const MSG_TYPE_PING: u16 = 3; constant MSG_TYPE_TEXT_MESSAGE (line 30) | const MSG_TYPE_TEXT_MESSAGE: u16 = 11; type MumbleAdapter (line 37) | pub struct MumbleAdapter { method new (line 64) | pub fn new( method encode_packet (line 86) | fn encode_packet(msg_type: u16, payload: &[u8]) -> Vec { method build_version_packet (line 99) | fn build_version_packet() -> Vec { method build_authenticate_packet (line 121) | fn build_authenticate_packet(username: &str, password: &str) -> Vec { method build_text_message_packet (line 143) | fn build_text_message_packet(channel_id: u32, message: &str) -> Vec { method build_ping_packet (line 157) | fn build_ping_packet() -> Vec { method encode_varint (line 167) | fn encode_varint(mut value: u64, buf: &mut Vec) { method decode_varint (line 181) | fn decode_varint(data: &[u8]) -> (u64, usize) { method parse_text_message (line 199) | fn parse_text_message(payload: &[u8]) -> (u32, Vec, Vec, Vec... method name (line 275) | fn name(&self) -> &str { method channel_type (line 279) | fn channel_type(&self) -> ChannelType { method start (line 283) | async fn start( method send (line 472) | async fn send( method send_typing (line 501) | async fn send_typing(&self, _user: &ChannelUser) -> Result<(), Box Result<(), Box> { function test_mumble_adapter_creation (line 520) | fn test_mumble_adapter_creation() { function test_mumble_custom_port (line 537) | fn test_mumble_custom_port() { function test_mumble_packet_encoding (line 549) | fn test_mumble_packet_encoding() { function test_mumble_varint_encode_decode (line 558) | fn test_mumble_varint_encode_decode() { function test_mumble_text_message_roundtrip (line 567) | fn test_mumble_text_message_roundtrip() { function test_mumble_version_packet (line 578) | fn test_mumble_version_packet() { function test_mumble_authenticate_packet (line 586) | fn test_mumble_authenticate_packet() { function test_mumble_authenticate_packet_no_password (line 593) | fn test_mumble_authenticate_packet_no_password() { FILE: crates/openfang-channels/src/nextcloud.rs constant MAX_MESSAGE_LEN (line 23) | const MAX_MESSAGE_LEN: usize = 32000; constant POLL_INTERVAL_SECS (line 26) | const POLL_INTERVAL_SECS: u64 = 3; type NextcloudAdapter (line 33) | pub struct NextcloudAdapter { method new (line 56) | pub fn new(server_url: String, token: String, allowed_rooms: Vec reqwest::Re... method validate (line 79) | async fn validate(&self) -> Result> { method fetch_rooms (line 97) | async fn fetch_rooms(&self) -> Result, Box bool { method name (line 163) | fn name(&self) -> &str { method channel_type (line 167) | fn channel_type(&self) -> ChannelType { method start (line 171) | async fn start( method send (line 408) | async fn send( method send_typing (line 425) | async fn send_typing(&self, _user: &ChannelUser) -> Result<(), Box Result<(), Box> { function test_nextcloud_adapter_creation (line 441) | fn test_nextcloud_adapter_creation() { function test_nextcloud_server_url_normalization (line 455) | fn test_nextcloud_server_url_normalization() { function test_nextcloud_allowed_rooms (line 465) | fn test_nextcloud_allowed_rooms() { function test_nextcloud_ocs_headers (line 484) | fn test_nextcloud_ocs_headers() { function test_nextcloud_token_zeroized (line 501) | fn test_nextcloud_token_zeroized() { FILE: crates/openfang-channels/src/nostr.rs constant MAX_MESSAGE_LEN (line 23) | const MAX_MESSAGE_LEN: usize = 4096; type NostrAdapter (line 31) | pub struct NostrAdapter { method new (line 49) | pub fn new(private_key: String, relays: Vec) -> Self { method derive_pubkey (line 63) | fn derive_pubkey(&self) -> String { method build_subscription (line 73) | fn build_subscription(&self, pubkey: &str) -> String { method build_event (line 87) | fn build_event(&self, recipient_pubkey: &str, content: &str) -> String { method api_send_message (line 116) | async fn api_send_message( method name (line 155) | fn name(&self) -> &str { method channel_type (line 159) | fn channel_type(&self) -> ChannelType { method start (line 163) | async fn start( method send (line 398) | async fn send( method send_typing (line 415) | async fn send_typing(&self, _user: &ChannelUser) -> Result<(), Box Result<(), Box> { function test_nostr_adapter_creation (line 431) | fn test_nostr_adapter_creation() { function test_nostr_private_key_zeroized (line 444) | fn test_nostr_private_key_zeroized() { function test_nostr_derive_pubkey (line 451) | fn test_nostr_derive_pubkey() { function test_nostr_build_subscription (line 458) | fn test_nostr_build_subscription() { function test_nostr_build_event (line 468) | fn test_nostr_build_event() { function test_nostr_multiple_relays (line 477) | fn test_nostr_multiple_relays() { FILE: crates/openfang-channels/src/ntfy.rs constant MAX_MESSAGE_LEN (line 21) | const MAX_MESSAGE_LEN: usize = 4096; constant DEFAULT_SERVER_URL (line 22) | const DEFAULT_SERVER_URL: &str = "https://ntfy.sh"; type NtfyAdapter (line 28) | pub struct NtfyAdapter { method new (line 49) | pub fn new(server_url: String, topic: String, token: String) -> Self { method auth_request (line 67) | fn auth_request(&self, builder: reqwest::RequestBuilder) -> reqwest::R... method parse_sse_data (line 82) | fn parse_sse_data(data: &str) -> Option<(String, String, String, Optio... method publish (line 106) | async fn publish( method name (line 142) | fn name(&self) -> &str { method channel_type (line 146) | fn channel_type(&self) -> ChannelType { method start (line 150) | async fn start( method send (line 323) | async fn send( method send_typing (line 335) | async fn send_typing(&self, _user: &ChannelUser) -> Result<(), Box Result<(), Box> { function test_ntfy_adapter_creation (line 351) | fn test_ntfy_adapter_creation() { function test_ntfy_custom_server_url (line 362) | fn test_ntfy_custom_server_url() { function test_ntfy_auth_request_with_token (line 373) | fn test_ntfy_auth_request_with_token() { function test_ntfy_auth_request_without_token (line 386) | fn test_ntfy_auth_request_without_token() { function test_ntfy_parse_sse_message_event (line 395) | fn test_ntfy_parse_sse_message_event() { function test_ntfy_parse_sse_keepalive_event (line 407) | fn test_ntfy_parse_sse_keepalive_event() { function test_ntfy_parse_sse_open_event (line 413) | fn test_ntfy_parse_sse_open_event() { function test_ntfy_parse_sse_empty_message (line 419) | fn test_ntfy_parse_sse_empty_message() { function test_ntfy_parse_sse_no_title (line 425) | fn test_ntfy_parse_sse_no_title() { function test_ntfy_parse_invalid_json (line 435) | fn test_ntfy_parse_invalid_json() { FILE: crates/openfang-channels/src/pumble.rs constant PUMBLE_API_BASE (line 22) | const PUMBLE_API_BASE: &str = "https://api.pumble.com/v1"; constant MAX_MESSAGE_LEN (line 25) | const MAX_MESSAGE_LEN: usize = 4000; type PumbleAdapter (line 32) | pub struct PumbleAdapter { method new (line 50) | pub fn new(bot_token: String, webhook_port: u16) -> Self { method validate (line 62) | async fn validate(&self) -> Result> { method api_send_message (line 85) | async fn api_send_message( function parse_pumble_event (line 122) | fn parse_pumble_event(event: &serde_json::Value, own_bot_id: &str) -> Op... method name (line 211) | fn name(&self) -> &str { method channel_type (line 215) | fn channel_type(&self) -> ChannelType { method start (line 219) | async fn start( method send (line 297) | async fn send( method send_in_thread (line 314) | async fn send_in_thread( method send_typing (line 353) | async fn send_typing(&self, _user: &ChannelUser) -> Result<(), Box Result<(), Box> { function test_pumble_adapter_creation (line 369) | fn test_pumble_adapter_creation() { function test_pumble_token_zeroized (line 379) | fn test_pumble_token_zeroized() { function test_pumble_webhook_port (line 385) | fn test_pumble_webhook_port() { function test_parse_pumble_event_message (line 391) | fn test_parse_pumble_event_message() { function test_parse_pumble_event_command (line 410) | fn test_parse_pumble_event_command() { function test_parse_pumble_event_skip_bot (line 431) | fn test_parse_pumble_event_skip_bot() { function test_parse_pumble_event_url_verification (line 445) | fn test_parse_pumble_event_url_verification() { function test_parse_pumble_event_dm (line 456) | fn test_parse_pumble_event_dm() { function test_parse_pumble_event_with_thread (line 472) | fn test_parse_pumble_event_with_thread() { FILE: crates/openfang-channels/src/reddit.rs constant REDDIT_TOKEN_URL (line 24) | const REDDIT_TOKEN_URL: &str = "https://www.reddit.com/api/v1/access_tok... constant REDDIT_API_BASE (line 27) | const REDDIT_API_BASE: &str = "https://oauth.reddit.com"; constant POLL_INTERVAL_SECS (line 30) | const POLL_INTERVAL_SECS: u64 = 5; constant MAX_MESSAGE_LEN (line 33) | const MAX_MESSAGE_LEN: usize = 10000; constant TOKEN_REFRESH_BUFFER_SECS (line 36) | const TOKEN_REFRESH_BUFFER_SECS: u64 = 300; constant USER_AGENT (line 39) | const USER_AGENT: &str = "openfang:v1.0.0 (by /u/openfang-bot)"; type RedditAdapter (line 46) | pub struct RedditAdapter { method new (line 77) | pub fn new( method get_token (line 108) | async fn get_token(&self) -> Result> { method validate (line 156) | async fn validate(&self) -> Result> { method api_comment (line 174) | async fn api_comment( method is_monitored_subreddit (line 219) | fn is_monitored_subreddit(&self, subreddit: &str) -> bool { function parse_reddit_comment (line 228) | fn parse_reddit_comment(comment: &serde_json::Value, own_username: &str)... method name (line 311) | fn name(&self) -> &str { method channel_type (line 315) | fn channel_type(&self) -> ChannelType { method start (line 319) | async fn start( method send (line 494) | async fn send( method send_typing (line 516) | async fn send_typing(&self, _user: &ChannelUser) -> Result<(), Box Result<(), Box> { function test_reddit_adapter_creation (line 532) | fn test_reddit_adapter_creation() { function test_reddit_subreddit_list (line 548) | fn test_reddit_subreddit_list() { function test_reddit_secrets_zeroized (line 568) | fn test_reddit_secrets_zeroized() { function test_parse_reddit_comment_basic (line 581) | fn test_parse_reddit_comment_basic() { function test_parse_reddit_comment_skips_self (line 605) | fn test_parse_reddit_comment_skips_self() { function test_parse_reddit_comment_skips_deleted (line 623) | fn test_parse_reddit_comment_skips_deleted() { function test_parse_reddit_comment_command (line 641) | fn test_parse_reddit_comment_command() { function test_parse_reddit_comment_skips_posts (line 666) | fn test_parse_reddit_comment_skips_posts() { function test_parse_reddit_comment_metadata (line 682) | fn test_parse_reddit_comment_metadata() { FILE: crates/openfang-channels/src/revolt.rs constant DEFAULT_API_URL (line 23) | const DEFAULT_API_URL: &str = "https://api.revolt.chat"; constant DEFAULT_WS_URL (line 26) | const DEFAULT_WS_URL: &str = "wss://ws.revolt.chat"; constant MAX_MESSAGE_LEN (line 29) | const MAX_MESSAGE_LEN: usize = 2000; constant MAX_BACKOFF_SECS (line 32) | const MAX_BACKOFF_SECS: u64 = 60; constant HEARTBEAT_INTERVAL_SECS (line 35) | const HEARTBEAT_INTERVAL_SECS: u64 = 20; type RevoltAdapter (line 42) | pub struct RevoltAdapter { method new (line 65) | pub fn new(bot_token: String) -> Self { method with_urls (line 74) | pub fn with_urls(bot_token: String, api_url: String, ws_url: String) -... method with_channels (line 91) | pub fn with_channels(bot_token: String, allowed_channels: Vec)... method auth_header (line 98) | fn auth_header(&self, builder: reqwest::RequestBuilder) -> reqwest::Re... method validate (line 103) | async fn validate(&self) -> Result> { method api_send_message (line 123) | async fn api_send_message( method api_reply_message (line 154) | async fn api_reply_message( method is_allowed_channel (line 194) | fn is_allowed_channel(&self, channel_id: &str) -> bool { function parse_revolt_message (line 200) | fn parse_revolt_message( method name (line 296) | fn name(&self) -> &str { method channel_type (line 300) | fn channel_type(&self) -> ChannelType { method start (line 304) | async fn start( method send (line 469) | async fn send( method send_typing (line 495) | async fn send_typing(&self, user: &ChannelUser) -> Result<(), Box Result<(), Box> { function test_revolt_adapter_creation (line 515) | fn test_revolt_adapter_creation() { function test_revolt_default_urls (line 525) | fn test_revolt_default_urls() { function test_revolt_custom_urls (line 532) | fn test_revolt_custom_urls() { function test_revolt_with_channels (line 543) | fn test_revolt_with_channels() { function test_revolt_empty_channels_allows_all (line 554) | fn test_revolt_empty_channels_allows_all() { function test_revolt_auth_header (line 560) | fn test_revolt_auth_header() { function test_parse_revolt_message_basic (line 572) | fn test_parse_revolt_message_basic() { function test_parse_revolt_message_skips_bot (line 591) | fn test_parse_revolt_message_skips_bot() { function test_parse_revolt_message_skips_system (line 604) | fn test_parse_revolt_message_skips_system() { function test_parse_revolt_message_channel_filter (line 617) | fn test_parse_revolt_message_channel_filter() { function test_parse_revolt_message_command (line 641) | fn test_parse_revolt_message_command() { function test_parse_revolt_message_non_message_type (line 661) | fn test_parse_revolt_message_non_message_type() { function test_parse_revolt_message_empty_content (line 672) | fn test_parse_revolt_message_empty_content() { function test_parse_revolt_message_metadata (line 685) | fn test_parse_revolt_message_metadata() { FILE: crates/openfang-channels/src/rocketchat.rs constant POLL_INTERVAL_SECS (line 21) | const POLL_INTERVAL_SECS: u64 = 2; constant MAX_MESSAGE_LEN (line 22) | const MAX_MESSAGE_LEN: usize = 4096; type RocketChatAdapter (line 25) | pub struct RocketChatAdapter { method new (line 51) | pub fn new( method auth_headers (line 72) | fn auth_headers(&self, builder: reqwest::RequestBuilder) -> reqwest::R... method validate (line 79) | async fn validate(&self) -> Result> { method api_send_message (line 93) | async fn api_send_message( method is_allowed_channel (line 127) | fn is_allowed_channel(&self, channel_id: &str) -> bool { method name (line 134) | fn name(&self) -> &str { method channel_type (line 138) | fn channel_type(&self) -> ChannelType { method start (line 142) | async fn start( method send (line 352) | async fn send( method send_typing (line 369) | async fn send_typing(&self, user: &ChannelUser) -> Result<(), Box Result<(), Box> { function test_rocketchat_adapter_creation (line 390) | fn test_rocketchat_adapter_creation() { function test_rocketchat_server_url_normalization (line 405) | fn test_rocketchat_server_url_normalization() { function test_rocketchat_allowed_channels (line 416) | fn test_rocketchat_allowed_channels() { function test_rocketchat_auth_headers (line 436) | fn test_rocketchat_auth_headers() { FILE: crates/openfang-channels/src/router.rs type BindingContext (line 12) | pub struct BindingContext { type AgentRouter (line 28) | pub struct AgentRouter { method new (line 49) | pub fn new() -> Self { method set_default (line 63) | pub fn set_default(&mut self, agent_id: AgentId) { method set_channel_default (line 68) | pub fn set_channel_default(&self, channel_key: String, agent_id: Agent... method set_channel_default_with_name (line 74) | pub fn set_channel_default_with_name( method channel_default_name (line 85) | pub fn channel_default_name(&self, channel_key: &str) -> Option { method update_channel_default (line 92) | pub fn update_channel_default(&self, channel_key: &str, new_agent_id: ... method set_user_default (line 98) | pub fn set_user_default(&self, user_key: String, agent_id: AgentId) { method set_direct_route (line 103) | pub fn set_direct_route( method load_bindings (line 114) | pub fn load_bindings(&self, bindings: &[AgentBinding]) { method load_broadcast (line 129) | pub fn load_broadcast(&self, broadcast: BroadcastConfig) { method register_agent (line 134) | pub fn register_agent(&self, name: String, id: AgentId) { method resolve (line 141) | pub fn resolve( method resolve_with_context (line 190) | pub fn resolve_with_context( method resolve_broadcast (line 224) | pub fn resolve_broadcast(&self, peer_id: &str) -> Vec<(String, Option<... method broadcast_strategy (line 240) | pub fn broadcast_strategy(&self) -> BroadcastStrategy { method has_broadcast (line 248) | pub fn has_broadcast(&self, peer_id: &str) -> bool { method bindings (line 257) | pub fn bindings(&self) -> Vec { method add_binding (line 267) | pub fn add_binding(&self, binding: AgentBinding) { method remove_binding (line 280) | pub fn remove_binding(&self, index: usize) -> Option { method resolve_binding (line 290) | fn resolve_binding(&self, ctx: &BindingContext) -> Option { method binding_matches (line 308) | fn binding_matches(&self, binding: &AgentBinding, ctx: &BindingContext... function channel_type_to_str (line 344) | fn channel_type_to_str(ct: &ChannelType) -> &str { method default (line 362) | fn default() -> Self { function test_routing_priority (line 372) | fn test_routing_priority() { function test_no_route (line 396) | fn test_no_route() { function test_binding_channel_match (line 403) | fn test_binding_channel_match() { function test_binding_peer_id_match (line 425) | fn test_binding_peer_id_match() { function test_binding_guild_and_role_match (line 445) | fn test_binding_guild_and_role_match() { function test_binding_specificity_ordering (line 481) | fn test_binding_specificity_ordering() { function test_broadcast_routing (line 520) | fn test_broadcast_routing() { function test_channel_default_routing (line 549) | fn test_channel_default_routing() { function test_empty_bindings_legacy_behavior (line 573) | fn test_empty_bindings_legacy_behavior() { function test_binding_nonexistent_agent_warning (line 585) | fn test_binding_nonexistent_agent_warning() { function test_add_remove_binding (line 601) | fn test_add_remove_binding() { function test_binding_specificity_scores (line 623) | fn test_binding_specificity_scores() { FILE: crates/openfang-channels/src/signal.rs constant POLL_INTERVAL (line 17) | const POLL_INTERVAL: Duration = Duration::from_secs(2); type SignalAdapter (line 20) | pub struct SignalAdapter { method new (line 36) | pub fn new(api_url: String, phone_number: String, allowed_users: Vec Result, Box... method is_allowed (line 89) | fn is_allowed(&self, phone: &str) -> bool { method name (line 96) | fn name(&self) -> &str { method channel_type (line 100) | fn channel_type(&self) -> ChannelType { method start (line 104) | async fn start( method send (line 218) | async fn send( method stop (line 235) | async fn stop(&self) -> Result<(), Box> { function test_signal_adapter_creation (line 246) | fn test_signal_adapter_creation() { function test_signal_allowed_check (line 257) | fn test_signal_allowed_check() { FILE: crates/openfang-channels/src/slack.rs constant SLACK_API_BASE (line 20) | const SLACK_API_BASE: &str = "https://slack.com/api"; constant MAX_BACKOFF (line 21) | const MAX_BACKOFF: Duration = Duration::from_secs(60); constant INITIAL_BACKOFF (line 22) | const INITIAL_BACKOFF: Duration = Duration::from_secs(1); constant SLACK_MSG_LIMIT (line 23) | const SLACK_MSG_LIMIT: usize = 3000; type SlackAdapter (line 26) | pub struct SlackAdapter { method new (line 47) | pub fn new( method validate_bot_token (line 72) | async fn validate_bot_token(&self) -> Result &str { method channel_type (line 142) | fn channel_type(&self) -> ChannelType { method start (line 146) | async fn start( method send (line 340) | async fn send( method send_in_thread (line 358) | async fn send_in_thread( method stop (line 378) | async fn stop(&self) -> Result<(), Box> { function get_socket_mode_url (line 385) | async fn get_socket_mode_url( function parse_slack_event (line 410) | async fn parse_slack_event( function test_parse_slack_event_basic (line 560) | async fn test_parse_slack_event_basic() { function test_parse_slack_event_filters_bot (line 579) | async fn test_parse_slack_event_filters_bot() { function test_parse_slack_event_filters_own_user (line 595) | async fn test_parse_slack_event_filters_own_user() { function test_parse_slack_event_channel_filter (line 610) | async fn test_parse_slack_event_channel_filter() { function test_parse_slack_event_skips_other_subtypes (line 644) | async fn test_parse_slack_event_skips_other_subtypes() { function test_parse_slack_command (line 661) | async fn test_parse_slack_command() { function test_parse_slack_event_message_changed (line 684) | async fn test_parse_slack_event_message_changed() { function test_slack_adapter_creation (line 707) | fn test_slack_adapter_creation() { function test_slack_adapter_unfurl_links_enabled (line 721) | fn test_slack_adapter_unfurl_links_enabled() { function test_slack_adapter_unfurl_links_disabled (line 734) | fn test_slack_adapter_unfurl_links_disabled() { FILE: crates/openfang-channels/src/teams.rs constant OAUTH_TOKEN_URL (line 22) | const OAUTH_TOKEN_URL: &str = constant MAX_MESSAGE_LEN (line 26) | const MAX_MESSAGE_LEN: usize = 4096; constant TOKEN_REFRESH_BUFFER_SECS (line 29) | const TOKEN_REFRESH_BUFFER_SECS: u64 = 300; type TeamsAdapter (line 36) | pub struct TeamsAdapter { method new (line 61) | pub fn new( method get_token (line 81) | async fn get_token(&self) -> Result> { method api_send_message (line 133) | async fn api_send_message( method is_allowed_tenant (line 173) | fn is_allowed_tenant(&self, tenant_id: &str) -> bool { function parse_teams_activity (line 182) | fn parse_teams_activity( method name (line 274) | fn name(&self) -> &str { method channel_type (line 278) | fn channel_type(&self) -> ChannelType { method start (line 282) | async fn start( method send (line 350) | async fn send( method send_typing (line 376) | async fn send_typing(&self, user: &ChannelUser) -> Result<(), Box Result<(), Box> { function test_teams_adapter_creation (line 411) | fn test_teams_adapter_creation() { function test_teams_allowed_tenants (line 423) | fn test_teams_allowed_tenants() { function test_parse_teams_activity_basic (line 438) | fn test_parse_teams_activity_basic() { function test_parse_teams_activity_skips_bot_self (line 469) | fn test_parse_teams_activity_skips_bot_self() { function test_parse_teams_activity_tenant_filter (line 489) | fn test_parse_teams_activity_tenant_filter() { function test_parse_teams_activity_command (line 519) | fn test_parse_teams_activity_command() { function test_parse_teams_activity_non_message (line 545) | fn test_parse_teams_activity_non_message() { function test_parse_teams_activity_empty_text (line 559) | fn test_parse_teams_activity_empty_text() { function test_parse_teams_activity_group (line 574) | fn test_parse_teams_activity_group() { FILE: crates/openfang-channels/src/telegram.rs constant MAX_BACKOFF (line 21) | const MAX_BACKOFF: Duration = Duration::from_secs(60); constant INITIAL_BACKOFF (line 23) | const INITIAL_BACKOFF: Duration = Duration::from_secs(1); constant LONG_POLL_TIMEOUT (line 25) | const LONG_POLL_TIMEOUT: u64 = 30; constant DEFAULT_API_URL (line 28) | const DEFAULT_API_URL: &str = "https://api.telegram.org"; type TelegramAdapter (line 31) | pub struct TelegramAdapter { method new (line 52) | pub fn new( method validate_token (line 76) | pub async fn validate_token(&self) -> Result &str { method channel_type (line 404) | fn channel_type(&self) -> ChannelType { method start (line 408) | async fn start( method send (line 598) | async fn send( method send_typing (line 606) | async fn send_typing(&self, user: &ChannelUser) -> Result<(), Box Result<(), Box> { function telegram_get_file_url (line 650) | async fn telegram_get_file_url( function parse_telegram_update (line 671) | async fn parse_telegram_update( function check_mention_entities (line 901) | fn check_mention_entities(message: &serde_json::Value, bot_username: &st... function calculate_backoff (line 933) | pub fn calculate_backoff(current: Duration) -> Duration { function sanitize_telegram_html (line 942) | fn sanitize_telegram_html(text: &str) -> String { function test_client (line 1008) | fn test_client() -> reqwest::Client { function test_parse_telegram_update (line 1013) | async fn test_parse_telegram_update() { function test_parse_telegram_command (line 1043) | async fn test_parse_telegram_command() { function test_allowed_users_filter (line 1080) | async fn test_allowed_users_filter() { function test_parse_telegram_edited_message (line 1133) | async fn test_parse_telegram_edited_message() { function test_backoff_calculation (line 1163) | fn test_backoff_calculation() { function test_parse_command_with_botname (line 1178) | async fn test_parse_command_with_botname() { function test_parse_telegram_location (line 1205) | async fn test_parse_telegram_location() { function test_parse_telegram_photo_fallback (line 1225) | async fn test_parse_telegram_photo_fallback() { function test_parse_telegram_document_fallback (line 1263) | async fn test_parse_telegram_document_fallback() { function test_parse_telegram_voice_fallback (line 1297) | async fn test_parse_telegram_voice_fallback() { function test_parse_telegram_forum_topic_thread_id (line 1332) | async fn test_parse_telegram_forum_topic_thread_id() { function test_parse_telegram_no_thread_id_in_private_chat (line 1355) | async fn test_parse_telegram_no_thread_id_in_private_chat() { function test_parse_telegram_edited_message_in_forum (line 1377) | async fn test_parse_telegram_edited_message_in_forum() { function test_parse_sender_chat_fallback (line 1400) | async fn test_parse_sender_chat_fallback() { function test_parse_no_from_no_sender_chat_drops (line 1429) | async fn test_parse_no_from_no_sender_chat_drops() { function test_was_mentioned_in_group (line 1448) | async fn test_was_mentioned_in_group() { function test_not_mentioned_in_group (line 1485) | async fn test_not_mentioned_in_group() { function test_mentioned_different_bot_not_set (line 1514) | async fn test_mentioned_different_bot_not_set() { function test_mention_in_caption_entities (line 1548) | async fn test_mention_in_caption_entities() { function test_mention_case_insensitive (line 1588) | async fn test_mention_case_insensitive() { function test_private_chat_no_mention_check (line 1624) | async fn test_private_chat_no_mention_check() { function test_check_mention_entities_direct (line 1659) | fn test_check_mention_entities_direct() { function test_sanitize_telegram_html_basic (line 1673) | fn test_sanitize_telegram_html_basic() { function test_reply_to_message_text_prepended (line 1682) | async fn test_reply_to_message_text_prepended() { function test_reply_to_message_with_caption (line 1723) | async fn test_reply_to_message_with_caption() { function test_reply_to_message_no_text_no_prepend (line 1764) | async fn test_reply_to_message_no_text_no_prepend() { function test_reply_to_message_unknown_sender (line 1804) | async fn test_reply_to_message_unknown_sender() { function test_no_reply_to_message_unchanged (line 1837) | async fn test_no_reply_to_message_unchanged() { FILE: crates/openfang-channels/src/threema.rs constant THREEMA_API_URL (line 22) | const THREEMA_API_URL: &str = "https://msgapi.threema.ch"; constant MAX_MESSAGE_LEN (line 25) | const MAX_MESSAGE_LEN: usize = 3500; type ThreemaAdapter (line 31) | pub struct ThreemaAdapter { method new (line 52) | pub fn new(threema_id: String, secret: String, webhook_port: u16) -> S... method validate (line 65) | async fn validate(&self) -> Result> { method api_send_message (line 83) | async fn api_send_message( function parse_threema_webhook (line 117) | fn parse_threema_webhook( method name (line 179) | fn name(&self) -> &str { method channel_type (line 183) | fn channel_type(&self) -> ChannelType { method start (line 187) | async fn start( method send (line 313) | async fn send( method send_typing (line 330) | async fn send_typing(&self, _user: &ChannelUser) -> Result<(), Box Result<(), Box> { function test_threema_adapter_creation (line 346) | fn test_threema_adapter_creation() { function test_threema_secret_zeroized (line 356) | fn test_threema_secret_zeroized() { function test_threema_webhook_port (line 363) | fn test_threema_webhook_port() { function test_parse_threema_webhook_basic (line 369) | fn test_parse_threema_webhook_basic() { function test_parse_threema_webhook_command (line 383) | fn test_parse_threema_webhook_command() { function test_parse_threema_webhook_skip_self (line 399) | fn test_parse_threema_webhook_skip_self() { function test_parse_threema_webhook_empty_text (line 409) | fn test_parse_threema_webhook_empty_text() { function test_parse_threema_webhook_with_nonce_and_mac (line 419) | fn test_parse_threema_webhook_with_nonce_and_mac() { FILE: crates/openfang-channels/src/twist.rs constant TWIST_API_BASE (line 22) | const TWIST_API_BASE: &str = "https://api.twist.com/api/v3"; constant MAX_MESSAGE_LEN (line 25) | const MAX_MESSAGE_LEN: usize = 10000; constant POLL_INTERVAL_SECS (line 28) | const POLL_INTERVAL_SECS: u64 = 5; type TwistAdapter (line 35) | pub struct TwistAdapter { method new (line 58) | pub fn new(token: String, workspace_id: String, allowed_channels: Vec<... method validate (line 72) | async fn validate(&self) -> Result<(String, String), Box Result, Box bool { method name (line 259) | fn name(&self) -> &str { method channel_type (line 263) | fn channel_type(&self) -> ChannelType { method start (line 267) | async fn start( method send (line 505) | async fn send( method send_in_thread (line 520) | async fn send_in_thread( method send_typing (line 535) | async fn send_typing(&self, _user: &ChannelUser) -> Result<(), Box Result<(), Box> { function test_twist_adapter_creation (line 551) | fn test_twist_adapter_creation() { function test_twist_token_zeroized (line 565) | fn test_twist_token_zeroized() { function test_twist_workspace_id (line 572) | fn test_twist_workspace_id() { function test_twist_allowed_channels (line 578) | fn test_twist_allowed_channels() { function test_twist_constants (line 593) | fn test_twist_constants() { function test_twist_poll_interval (line 600) | fn test_twist_poll_interval() { FILE: crates/openfang-channels/src/twitch.rs constant TWITCH_IRC_HOST (line 23) | const TWITCH_IRC_HOST: &str = "irc.chat.twitch.tv"; constant TWITCH_IRC_PORT (line 24) | const TWITCH_IRC_PORT: u16 = 6667; constant MAX_MESSAGE_LEN (line 25) | const MAX_MESSAGE_LEN: usize = 500; type TwitchAdapter (line 31) | pub struct TwitchAdapter { method new (line 50) | pub fn new(oauth_token: String, channels: Vec, nick: String) -... method pass_string (line 62) | fn pass_string(&self) -> String { function parse_privmsg (line 76) | fn parse_privmsg(line: &str) -> Option<(String, String, String)> { method name (line 107) | fn name(&self) -> &str { method channel_type (line 111) | fn channel_type(&self) -> ChannelType { method start (line 115) | async fn start( method send (line 279) | async fn send( method stop (line 313) | async fn stop(&self) -> Result<(), Box> { function test_twitch_adapter_creation (line 324) | fn test_twitch_adapter_creation() { function test_twitch_pass_string_with_prefix (line 338) | fn test_twitch_pass_string_with_prefix() { function test_twitch_pass_string_without_prefix (line 344) | fn test_twitch_pass_string_without_prefix() { function test_parse_privmsg_valid (line 350) | fn test_parse_privmsg_valid() { function test_parse_privmsg_no_message (line 359) | fn test_parse_privmsg_no_message() { function test_parse_privmsg_not_privmsg (line 366) | fn test_parse_privmsg_not_privmsg() { function test_parse_privmsg_command (line 372) | fn test_parse_privmsg_command() { function test_parse_privmsg_empty_prefix (line 381) | fn test_parse_privmsg_empty_prefix() { FILE: crates/openfang-channels/src/types.rs type ChannelType (line 14) | pub enum ChannelType { type ChannelUser (line 31) | pub struct ChannelUser { type ChannelContent (line 42) | pub enum ChannelContent { type ChannelMessage (line 75) | pub struct ChannelMessage { type AgentPhase (line 101) | pub enum AgentPhase { method tool_use (line 121) | pub fn tool_use(name: &str) -> Self { type LifecycleReaction (line 131) | pub struct LifecycleReaction { constant ALLOWED_REACTION_EMOJI (line 141) | pub const ALLOWED_REACTION_EMOJI: &[&str] = &[ function default_phase_emoji (line 153) | pub fn default_phase_emoji(phase: &AgentPhase) -> &'static str { type DeliveryStatus (line 167) | pub enum DeliveryStatus { type DeliveryReceipt (line 180) | pub struct DeliveryReceipt { type ChannelStatus (line 197) | pub struct ChannelStatus { type ChannelAdapter (line 220) | pub trait ChannelAdapter: Send + Sync { method name (line 222) | fn name(&self) -> &str; method channel_type (line 225) | fn channel_type(&self) -> ChannelType; method start (line 228) | async fn start( method send (line 233) | async fn send( method send_typing (line 240) | async fn send_typing(&self, _user: &ChannelUser) -> Result<(), Box Result<(), Box>; method status (line 258) | fn status(&self) -> ChannelStatus { method send_in_thread (line 263) | async fn send_in_thread( method suppress_error_responses (line 277) | fn suppress_error_responses(&self) -> bool { function split_message (line 286) | pub fn split_message(text: &str, max_len: usize) -> Vec<&str> { function test_channel_message_serialization (line 316) | fn test_channel_message_serialization() { function test_split_message_short (line 339) | fn test_split_message_short() { function test_split_message_at_newlines (line 344) | fn test_split_message_at_newlines() { function test_channel_type_matrix_serde (line 351) | fn test_channel_type_matrix_serde() { function test_channel_type_email_serde (line 359) | fn test_channel_type_email_serde() { function test_channel_content_variants (line 367) | fn test_channel_content_variants() { function test_agent_phase_serde_roundtrip (line 387) | fn test_agent_phase_serde_roundtrip() { function test_agent_phase_tool_use_sanitizes (line 404) | fn test_agent_phase_tool_use_sanitizes() { function test_agent_phase_tool_use_truncates_long_name (line 416) | fn test_agent_phase_tool_use_truncates_long_name() { function test_default_phase_emoji (line 425) | fn test_default_phase_emoji() { function test_delivery_status_serde (line 434) | fn test_delivery_status_serde() { function test_delivery_receipt_serde (line 449) | fn test_delivery_receipt_serde() { function test_delivery_receipt_with_error (line 465) | fn test_delivery_receipt_with_error() { FILE: crates/openfang-channels/src/viber.rs constant VIBER_SET_WEBHOOK_URL (line 22) | const VIBER_SET_WEBHOOK_URL: &str = "https://chatapi.viber.com/pa/set_we... constant VIBER_SEND_MESSAGE_URL (line 25) | const VIBER_SEND_MESSAGE_URL: &str = "https://chatapi.viber.com/pa/send_... constant VIBER_ACCOUNT_INFO_URL (line 28) | const VIBER_ACCOUNT_INFO_URL: &str = "https://chatapi.viber.com/pa/get_a... constant MAX_MESSAGE_LEN (line 31) | const MAX_MESSAGE_LEN: usize = 7000; constant DEFAULT_SENDER_NAME (line 34) | const DEFAULT_SENDER_NAME: &str = "OpenFang"; type ViberAdapter (line 41) | pub struct ViberAdapter { method new (line 66) | pub fn new(auth_token: String, webhook_url: String, webhook_port: u16)... method with_sender (line 82) | pub fn with_sender( method auth_header (line 96) | fn auth_header(&self, builder: reqwest::RequestBuilder) -> reqwest::Re... method validate (line 101) | async fn validate(&self) -> Result> { method register_webhook (line 125) | async fn register_webhook(&self) -> Result<(), Box Option { method name (line 302) | fn name(&self) -> &str { method channel_type (line 306) | fn channel_type(&self) -> ChannelType { method start (line 310) | async fn start( method send (line 372) | async fn send( method send_typing (line 418) | async fn send_typing(&self, _user: &ChannelUser) -> Result<(), Box Result<(), Box> { function test_viber_adapter_creation (line 434) | fn test_viber_adapter_creation() { function test_viber_url_normalization (line 449) | fn test_viber_url_normalization() { function test_viber_with_sender (line 459) | fn test_viber_with_sender() { function test_viber_auth_header (line 475) | fn test_viber_auth_header() { function test_parse_viber_event_text_message (line 491) | fn test_parse_viber_event_text_message() { function test_parse_viber_event_command (line 516) | fn test_parse_viber_event_command() { function test_parse_viber_event_non_message (line 541) | fn test_parse_viber_event_non_message() { function test_parse_viber_event_non_text (line 553) | fn test_parse_viber_event_non_text() { function test_parse_viber_event_empty_text (line 571) | fn test_parse_viber_event_empty_text() { FILE: crates/openfang-channels/src/webex.rs constant WEBEX_API_BASE (line 23) | const WEBEX_API_BASE: &str = "https://webexapis.com/v1"; constant WEBEX_WS_URL (line 26) | const WEBEX_WS_URL: &str = "wss://mercury-connection-a.wbx2.com/v1/apps/... constant MAX_MESSAGE_LEN (line 29) | const MAX_MESSAGE_LEN: usize = 7439; type WebexAdapter (line 36) | pub struct WebexAdapter { method new (line 56) | pub fn new(bot_token: String, allowed_rooms: Vec) -> Self { method validate (line 69) | async fn validate(&self) -> Result<(String, String), Box bool { method name (line 233) | fn name(&self) -> &str { method channel_type (line 237) | fn channel_type(&self) -> ChannelType { method start (line 241) | async fn start( method send (line 450) | async fn send( method send_typing (line 467) | async fn send_typing(&self, _user: &ChannelUser) -> Result<(), Box Result<(), Box> { function test_webex_adapter_creation (line 483) | fn test_webex_adapter_creation() { function test_webex_allowed_rooms (line 493) | fn test_webex_allowed_rooms() { function test_webex_token_zeroized (line 507) | fn test_webex_token_zeroized() { function test_webex_message_length_limit (line 513) | fn test_webex_message_length_limit() { function test_webex_constants (line 518) | fn test_webex_constants() { FILE: crates/openfang-channels/src/webhook.rs constant MAX_MESSAGE_LEN (line 22) | const MAX_MESSAGE_LEN: usize = 65535; type WebhookAdapter (line 52) | pub struct WebhookAdapter { method new (line 73) | pub fn new(secret: String, listen_port: u16, callback_url: Option String { method verify_signature (line 101) | fn verify_signature(secret: &str, body: &[u8], signature: &str) -> bool { method parse_webhook_body (line 116) | fn parse_webhook_body( method has_callback (line 162) | pub fn has_callback(&self) -> bool { method name (line 169) | fn name(&self) -> &str { method channel_type (line 173) | fn channel_type(&self) -> ChannelType { method start (line 177) | async fn start( method send (line 304) | async fn send( method send_typing (line 359) | async fn send_typing(&self, _user: &ChannelUser) -> Result<(), Box Result<(), Box> { function test_webhook_adapter_creation (line 375) | fn test_webhook_adapter_creation() { function test_webhook_no_callback (line 390) | fn test_webhook_no_callback() { function test_webhook_signature_computation (line 396) | fn test_webhook_signature_computation() { function test_webhook_signature_verification (line 405) | fn test_webhook_signature_verification() { function test_webhook_signature_different_data (line 419) | fn test_webhook_signature_different_data() { function test_webhook_parse_body_full (line 427) | fn test_webhook_parse_body_full() { function test_webhook_parse_body_minimal (line 453) | fn test_webhook_parse_body_minimal() { function test_webhook_parse_body_empty_message (line 468) | fn test_webhook_parse_body_empty_message() { function test_webhook_parse_body_no_message (line 474) | fn test_webhook_parse_body_no_message() { FILE: crates/openfang-channels/src/wecom.rs constant WECOM_TOKEN_URL (line 25) | const WECOM_TOKEN_URL: &str = "https://qyapi.weixin.qq.com/cgi-bin/getto... constant WECOM_SEND_URL (line 28) | const WECOM_SEND_URL: &str = "https://qyapi.weixin.qq.com/cgi-bin/messag... constant MAX_MESSAGE_LEN (line 31) | const MAX_MESSAGE_LEN: usize = 2048; constant TOKEN_REFRESH_BUFFER_SECS (line 34) | const TOKEN_REFRESH_BUFFER_SECS: u64 = 300; function decrypt_aes_cbc (line 36) | fn decrypt_aes_cbc(key: &[u8], encrypted_base64: &str) -> Result... function is_valid_wecom_signature (line 73) | fn is_valid_wecom_signature( function decode_wecom_payload (line 88) | fn decode_wecom_payload(encoding_aes_key: &str, encrypted_payload: &str)... function parse_wecom_xml_fields (line 121) | fn parse_wecom_xml_fields(xml: &str) -> Result, ... function decode_wecom_post_body (line 142) | fn decode_wecom_post_body( function wecom_success_response (line 176) | fn wecom_success_response() -> axum::response::Response { type WeComAdapter (line 189) | pub struct WeComAdapter { method new (line 213) | pub fn new(corp_id: String, agent_id: String, secret: String, webhook_... method with_verification (line 230) | pub fn with_verification( method get_token (line 245) | async fn get_token(&self) -> Result> { method send_text (line 294) | async fn send_text( method validate (line 331) | async fn validate(&self) -> Result> { method name (line 340) | fn name(&self) -> &str { method channel_type (line 344) | fn channel_type(&self) -> ChannelType { method start (line 348) | async fn start( method send (line 555) | async fn send( method stop (line 581) | async fn stop(&self) -> Result<(), Box> { function test_adapter_name (line 592) | fn test_adapter_name() { function test_adapter_channel_type (line 603) | fn test_adapter_channel_type() { function test_adapter_with_verification (line 617) | fn test_adapter_with_verification() { function test_max_message_length (line 630) | fn test_max_message_length() { function test_token_refresh_buffer (line 636) | fn test_token_refresh_buffer() { function test_wecom_signature_validation (line 642) | fn test_wecom_signature_validation() { function test_decode_wecom_payload (line 660) | fn test_decode_wecom_payload() { function test_parse_wecom_xml_fields (line 671) | fn test_parse_wecom_xml_fields() { FILE: crates/openfang-channels/src/whatsapp.rs constant MAX_MESSAGE_LEN (line 15) | const MAX_MESSAGE_LEN: usize = 4096; type WhatsAppAdapter (line 25) | pub struct WhatsAppAdapter { method new (line 47) | pub fn new( method with_gateway (line 72) | pub fn with_gateway(mut self, gateway_url: Option) -> Self { method api_send_message (line 78) | async fn api_send_message( method api_mark_read (line 119) | async fn api_mark_read(&self, message_id: &str) -> Result<(), Box bool { method is_gateway_mode (line 172) | pub fn is_gateway_mode(&self) -> bool { method name (line 179) | fn name(&self) -> &str { method channel_type (line 183) | fn channel_type(&self) -> ChannelType { method start (line 187) | async fn start( method send (line 216) | async fn send( method stop (line 333) | async fn stop(&self) -> Result<(), Box> { function test_whatsapp_adapter_creation (line 344) | fn test_whatsapp_adapter_creation() { function test_allowed_users_check (line 357) | fn test_allowed_users_check() { FILE: crates/openfang-channels/src/xmpp.rs type XmppAdapter (line 25) | pub struct XmppAdapter { method new (line 52) | pub fn new( method bare_jid (line 73) | pub fn bare_jid(&self) -> &str { method endpoint (line 79) | pub fn endpoint(&self) -> String { method rooms (line 85) | pub fn rooms(&self) -> &[String] { method name (line 92) | fn name(&self) -> &str { method channel_type (line 96) | fn channel_type(&self) -> ChannelType { method start (line 100) | async fn start( method send (line 123) | async fn send( method stop (line 131) | async fn stop(&self) -> Result<(), Box> { function test_xmpp_adapter_creation (line 142) | fn test_xmpp_adapter_creation() { function test_xmpp_bare_jid (line 158) | fn test_xmpp_bare_jid() { function test_xmpp_endpoint (line 179) | fn test_xmpp_endpoint() { function test_xmpp_rooms (line 191) | fn test_xmpp_rooms() { function test_xmpp_start_returns_error (line 207) | async fn test_xmpp_start_returns_error() { function test_xmpp_send_returns_error (line 222) | async fn test_xmpp_send_returns_error() { function test_xmpp_password_zeroized (line 242) | fn test_xmpp_password_zeroized() { function test_xmpp_custom_port (line 255) | fn test_xmpp_custom_port() { FILE: crates/openfang-channels/src/zulip.rs constant MAX_MESSAGE_LEN (line 21) | const MAX_MESSAGE_LEN: usize = 10000; constant POLL_TIMEOUT_SECS (line 22) | const POLL_TIMEOUT_SECS: u64 = 60; type ZulipAdapter (line 25) | pub struct ZulipAdapter { method new (line 51) | pub fn new( method register_queue (line 72) | async fn register_queue(&self) -> Result<(String, i64), Box Result> { method api_send_message (line 134) | async fn api_send_message( method is_allowed_stream (line 175) | fn is_allowed_stream(&self, stream: &str) -> bool { method name (line 182) | fn name(&self) -> &str { method channel_type (line 186) | fn channel_type(&self) -> ChannelType { method start (line 190) | async fn start( method send (line 427) | async fn send( method send_in_thread (line 452) | async fn send_in_thread( method stop (line 469) | async fn stop(&self) -> Result<(), Box> { function test_zulip_adapter_creation (line 480) | fn test_zulip_adapter_creation() { function test_zulip_server_url_normalization (line 495) | fn test_zulip_server_url_normalization() { function test_zulip_allowed_streams (line 506) | fn test_zulip_allowed_streams() { function test_zulip_bot_email_stored (line 527) | fn test_zulip_bot_email_stored() { function test_zulip_api_key_zeroized (line 538) | fn test_zulip_api_key_zeroized() { FILE: crates/openfang-channels/tests/bridge_integration_test.rs type MockAdapter (line 27) | struct MockAdapter { method new (line 40) | fn new(name: &str, channel_type: ChannelType) -> (Arc, mpsc::Sen... method get_sent (line 55) | fn get_sent(&self) -> Vec<(String, String)> { method name (line 62) | fn name(&self) -> &str { method channel_type (line 66) | fn channel_type(&self) -> ChannelType { method start (line 70) | async fn start( method send (line 84) | async fn send( method stop (line 98) | async fn stop(&self) -> Result<(), Box> { type MockHandle (line 108) | struct MockHandle { method new (line 115) | fn new(agents: Vec<(AgentId, String)>) -> Self { method send_message (line 125) | async fn send_message(&self, agent_id: AgentId, message: &str) -> Result... method find_agent_by_name (line 133) | async fn find_agent_by_name(&self, name: &str) -> Result... method list_agents (line 138) | async fn list_agents(&self) -> Result, String> { method spawn_agent_by_name (line 142) | async fn spawn_agent_by_name(&self, _manifest_name: &str) -> Result Cha... function make_command_msg (line 169) | fn make_command_msg( function test_bridge_dispatch_text_message (line 202) | async fn test_bridge_dispatch_text_message() { function test_bridge_dispatch_agents_command (line 247) | async fn test_bridge_dispatch_agents_command() { function test_bridge_dispatch_help_command (line 291) | async fn test_bridge_dispatch_help_command() { function test_bridge_dispatch_agent_select_command (line 322) | async fn test_bridge_dispatch_agent_select_command() { function test_bridge_dispatch_no_agent_assigned (line 362) | async fn test_bridge_dispatch_no_agent_assigned() { function test_bridge_dispatch_slash_command_in_text (line 392) | async fn test_bridge_dispatch_slash_command_in_text() { function test_bridge_dispatch_status_command (line 423) | async fn test_bridge_dispatch_status_command() { function test_bridge_manager_lifecycle (line 460) | async fn test_bridge_manager_lifecycle() { function test_bridge_multiple_adapters (line 498) | async fn test_bridge_multiple_adapters() { FILE: crates/openfang-cli/src/bundled_agents.rs function bundled_agents (line 8) | pub fn bundled_agents() -> Vec<(&'static str, &'static str)> { function install_bundled_agents (line 123) | pub fn install_bundled_agents(agents_dir: &std::path::Path) { FILE: crates/openfang-cli/src/dotenv.rs function dotenv_openfang_home (line 10) | fn dotenv_openfang_home() -> Option { function env_file_path (line 18) | pub fn env_file_path() -> Option { function load_dotenv (line 28) | pub fn load_dotenv() { function secrets_env_path (line 35) | pub fn secrets_env_path() -> Option { function load_env_file (line 39) | fn load_env_file(path: Option) { function save_env_key (line 68) | pub fn save_env_key(key: &str, value: &str) -> Result<(), String> { function remove_env_key (line 89) | pub fn remove_env_key(key: &str) -> Result<(), String> { function list_env_keys (line 103) | pub fn list_env_keys() -> Vec { function env_file_exists (line 114) | pub fn env_file_exists() -> bool { function parse_env_line (line 123) | fn parse_env_line(line: &str) -> Option<(String, String)> { function read_env_file (line 144) | fn read_env_file(path: &PathBuf) -> BTreeMap { function write_env_file (line 166) | fn write_env_file(path: &PathBuf, entries: &BTreeMap) ->... function test_parse_env_line_simple (line 197) | fn test_parse_env_line_simple() { function test_parse_env_line_quoted (line 204) | fn test_parse_env_line_quoted() { function test_parse_env_line_single_quoted (line 211) | fn test_parse_env_line_single_quoted() { function test_parse_env_line_spaces (line 218) | fn test_parse_env_line_spaces() { function test_parse_env_line_no_value (line 225) | fn test_parse_env_line_no_value() { function test_parse_env_line_comment (line 232) | fn test_parse_env_line_comment() { function test_parse_env_line_no_equals (line 241) | fn test_parse_env_line_no_equals() { function test_parse_env_line_empty_key (line 246) | fn test_parse_env_line_empty_key() { FILE: crates/openfang-cli/src/launcher.rs constant PROVIDER_ENV_VARS (line 19) | const PROVIDER_ENV_VARS: &[(&str, &str)] = &[ function detect_provider (line 32) | fn detect_provider() -> Option<(&'static str, &'static str)> { function is_first_run (line 41) | fn is_first_run() -> bool { function has_openclaw (line 53) | fn has_openclaw() -> bool { type LauncherChoice (line 63) | pub enum LauncherChoice { type MenuItem (line 73) | struct MenuItem { constant MENU_FIRST_RUN (line 80) | const MENU_FIRST_RUN: &[MenuItem] = &[ constant MENU_RETURNING (line 114) | const MENU_RETURNING: &[MenuItem] = &[ type LauncherState (line 149) | struct LauncherState { method new (line 160) | fn new() -> Self { method menu (line 176) | fn menu(&self) -> &'static [MenuItem] { function run (line 187) | pub fn run(_config: Option) -> LauncherChoice { constant MARGIN_LEFT (line 286) | const MARGIN_LEFT: u16 = 3; function content_area (line 289) | fn content_area(area: Rect) -> Rect { function draw (line 304) | fn draw(frame: &mut ratatui::Frame, state: &mut LauncherState) { function render_separator (line 535) | fn render_separator(frame: &mut ratatui::Frame, area: Rect) { function launch_desktop_app (line 546) | pub fn launch_desktop_app() { function which_lookup (line 594) | fn which_lookup(name: &str) -> Option { FILE: crates/openfang-cli/src/main.rs function install_ctrlc_handler (line 33) | fn install_ctrlc_handler() { constant AFTER_HELP (line 62) | const AFTER_HELP: &str = "\ type Cli (line 98) | struct Cli { type Commands (line 108) | enum Commands { type VaultCommands (line 299) | enum VaultCommands { type ScaffoldKind (line 317) | enum ScaffoldKind { type MigrateArgs (line 323) | struct MigrateArgs { type MigrateSourceArg (line 336) | enum MigrateSourceArg { type SkillCommands (line 343) | enum SkillCommands { type ChannelCommands (line 366) | enum ChannelCommands { type HandCommands (line 392) | enum HandCommands { type ConfigCommands (line 440) | enum ConfigCommands { type AgentCommands (line 480) | enum AgentCommands { type WorkflowCommands (line 519) | enum WorkflowCommands { type TriggerCommands (line 554) | enum TriggerCommands { type ModelsCommands (line 582) | enum ModelsCommands { type GatewayCommands (line 612) | enum GatewayCommands { type ApprovalsCommands (line 626) | enum ApprovalsCommands { type CronCommands (line 646) | enum CronCommands { type SecurityCommands (line 683) | enum SecurityCommands { type MemoryCommands (line 704) | enum MemoryCommands { type DevicesCommands (line 742) | enum DevicesCommands { type WebhooksCommands (line 759) | enum WebhooksCommands { type SystemCommands (line 786) | enum SystemCommands { function config_log_level (line 801) | fn config_log_level() -> String { function init_tracing_stderr (line 826) | fn init_tracing_stderr() { function cli_openfang_home (line 836) | fn cli_openfang_home() -> std::path::PathBuf { function init_tracing_file (line 846) | fn init_tracing_file() { function main (line 872) | fn main() { function restrict_file_permissions (line 1089) | pub(crate) fn restrict_file_permissions(path: &std::path::Path) { function restrict_file_permissions (line 1095) | pub(crate) fn restrict_file_permissions(_path: &std::path::Path) {} function restrict_dir_permissions (line 1099) | pub(crate) fn restrict_dir_permissions(path: &std::path::Path) { function restrict_dir_permissions (line 1105) | pub(crate) fn restrict_dir_permissions(_path: &std::path::Path) {} function find_daemon (line 1107) | pub(crate) fn find_daemon() -> Option { function daemon_client (line 1134) | pub(crate) fn daemon_client() -> reqwest::blocking::Client { function daemon_json (line 1151) | pub(crate) fn daemon_json( function cmd_init (line 1193) | fn cmd_init(quick: bool) { function cmd_init_quick (line 1244) | fn cmd_init_quick(openfang_dir: &std::path::Path) { function cmd_init_interactive (line 1264) | fn cmd_init_interactive(openfang_dir: &std::path::Path) { function launch_desktop_app (line 1319) | fn launch_desktop_app(_openfang_dir: &std::path::Path) { function detect_best_provider (line 1376) | fn detect_best_provider() -> (&'static str, &'static str, &'static str) { function provider_list (line 1402) | fn provider_list() -> Vec<(&'static str, &'static str, &'static str, &'s... function check_ollama_available (line 1424) | fn check_ollama_available() -> bool { function write_config_if_missing (line 1433) | fn write_config_if_missing( function cmd_start (line 1468) | fn cmd_start(config: Option, yolo: bool) { function read_api_key (line 1541) | fn read_api_key() -> Option { function cmd_stop (line 1564) | fn cmd_stop() { function force_kill_pid (line 1605) | fn force_kill_pid(pid: u32) { function boot_kernel_error (line 1621) | fn boot_kernel_error(e: &openfang_kernel::error::KernelError) { function cmd_agent_spawn (line 1646) | fn cmd_agent_spawn(config: Option, manifest_path: PathBuf) { function cmd_agent_list (line 1700) | fn cmd_agent_list(config: Option, json: bool) { function cmd_agent_chat (line 1778) | fn cmd_agent_chat(config: Option, agent_id_str: &str) { function cmd_agent_kill (line 1782) | fn cmd_agent_kill(config: Option, agent_id_str: &str) { function cmd_agent_set (line 1815) | fn cmd_agent_set(agent_id_str: &str, field: &str, value: &str) { function cmd_agent_new (line 1847) | fn cmd_agent_new(config: Option, template_name: Option) { function spawn_template_agent (line 1905) | fn spawn_template_agent(config: Option, template: &templates::A... function cmd_status (line 1958) | fn cmd_status(config: Option, json: bool) { function cmd_doctor (line 2044) | fn cmd_doctor(json: bool, repair: bool) { function cmd_dashboard (line 2940) | fn cmd_dashboard() { function copy_to_clipboard (line 2972) | fn copy_to_clipboard(text: &str) -> bool { function open_in_browser (line 3043) | pub(crate) fn open_in_browser(url: &str) -> bool { function cmd_completion (line 3094) | fn cmd_completion(shell: clap_complete::Shell) { function cmd_workflow_list (line 3104) | fn cmd_workflow_list() { function cmd_workflow_create (line 3128) | fn cmd_workflow_create(file: PathBuf) { function cmd_workflow_run (line 3163) | fn cmd_workflow_run(workflow_id: &str, input: &str) { function cmd_workflow_get (line 3186) | fn cmd_workflow_get(workflow_id: &str) { function cmd_workflow_update (line 3228) | fn cmd_workflow_update(workflow_id: &str, file: PathBuf) { function cmd_workflow_delete (line 3263) | fn cmd_workflow_delete(workflow_id: &str) { function cmd_trigger_list (line 3288) | fn cmd_trigger_list(agent_id: Option<&str>) { function cmd_trigger_create (line 3321) | fn cmd_trigger_create(agent_id: &str, pattern_json: &str, prompt: &str, ... function cmd_trigger_delete (line 3359) | fn cmd_trigger_delete(trigger_id: &str) { function require_daemon (line 3380) | fn require_daemon(command: &str) -> String { function boot_kernel (line 3391) | fn boot_kernel(config: Option) -> OpenFangKernel { function cmd_migrate (line 3405) | fn cmd_migrate(args: MigrateArgs) { function cmd_skill_install (line 3463) | fn cmd_skill_install(source: &str) { function cmd_skill_list (line 3537) | fn cmd_skill_list() { function cmd_skill_remove (line 3568) | fn cmd_skill_remove(name: &str) { function cmd_skill_search (line 3583) | fn cmd_skill_search(query: &str) { function cmd_skill_create (line 3608) | fn cmd_skill_create() { function cmd_channel_list (line 3701) | fn cmd_channel_list() { function cmd_channel_setup (line 3752) | fn cmd_channel_setup(channel: Option<&str>) { function maybe_write_channel_config (line 4027) | fn maybe_write_channel_config(channel: &str, config_block: &str) { function notify_daemon_restart (line 4057) | fn notify_daemon_restart() { function cmd_channel_test (line 4065) | fn cmd_channel_test(channel: &str) { function cmd_channel_toggle (line 4087) | fn cmd_channel_toggle(channel: &str, enable: bool) { function cmd_hand_install (line 4115) | fn cmd_hand_install(path: &str) { function cmd_hand_list (line 4164) | fn cmd_hand_list() { function cmd_hand_active (line 4206) | fn cmd_hand_active() { function cmd_hand_activate (line 4234) | fn cmd_hand_activate(id: &str) { function cmd_hand_deactivate (line 4261) | fn cmd_hand_deactivate(id: &str) { function cmd_hand_info (line 4304) | fn cmd_hand_info(id: &str) { function cmd_hand_check_deps (line 4318) | fn cmd_hand_check_deps(id: &str) { function cmd_hand_install_deps (line 4339) | fn cmd_hand_install_deps(id: &str) { function cmd_hand_pause (line 4363) | fn cmd_hand_pause(id: &str) { function cmd_hand_resume (line 4381) | fn cmd_hand_resume(id: &str) { function provider_to_env_var (line 4404) | fn provider_to_env_var(provider: &str) -> String { function test_api_key (line 4429) | pub(crate) fn test_api_key(provider: &str, env_var: &str) -> bool { function start_daemon_background (line 4489) | pub(crate) fn start_daemon_background() -> Result { function cmd_config_show (line 4533) | fn cmd_config_show() { function cmd_config_edit (line 4552) | fn cmd_config_edit() { function cmd_config_get (line 4582) | fn cmd_config_get(key: &str) { function cmd_config_set (line 4626) | fn cmd_config_set(key: &str, value: &str) { function cmd_config_unset (line 4749) | fn cmd_config_unset(key: &str) { function cmd_config_set_key (line 4817) | fn cmd_config_set_key(provider: &str) { function cmd_config_delete_key (line 4849) | fn cmd_config_delete_key(provider: &str) { function cmd_config_test_key (line 4873) | fn cmd_config_test_key(provider: &str) { function save_credential_prefer_vault (line 4896) | fn save_credential_prefer_vault(env_var: &str, value: &str) { function cmd_quick_chat (line 4917) | fn cmd_quick_chat(config: Option, agent: Option) { function openfang_home (line 4925) | pub(crate) fn openfang_home() -> PathBuf { function prompt_input (line 4937) | fn prompt_input(prompt: &str) -> String { function copy_dir_recursive (line 4945) | pub(crate) fn copy_dir_recursive(src: &PathBuf, dst: &PathBuf) { function cmd_integration_add (line 4964) | fn cmd_integration_add(name: &str, key: Option<&str>) { function cmd_integration_remove (line 5050) | fn cmd_integration_remove(name: &str) { function cmd_integrations_list (line 5074) | fn cmd_integrations_list(query: Option<&str>) { function cmd_vault_init (line 5153) | fn cmd_vault_init() { function cmd_vault_set (line 5167) | fn cmd_vault_set(key: &str) { function cmd_vault_list (line 5199) | fn cmd_vault_list() { function cmd_vault_remove (line 5225) | fn cmd_vault_remove(key: &str) { function cmd_scaffold (line 5253) | fn cmd_scaffold(kind: ScaffoldKind) { function cmd_models_list (line 5276) | fn cmd_models_list(provider_filter: Option<&str>, json: bool) { function cmd_models_aliases (line 5356) | fn cmd_models_aliases(json: bool) { function cmd_models_providers (line 5398) | fn cmd_models_providers(json: bool) { function cmd_models_set (line 5465) | fn cmd_models_set(model: Option) { function pick_model (line 5490) | fn pick_model() -> String { function cmd_approvals_list (line 5549) | fn cmd_approvals_list(json: bool) { function cmd_approvals_respond (line 5584) | fn cmd_approvals_respond(id: &str, approve: bool) { function cmd_cron_list (line 5603) | fn cmd_cron_list(json: bool) { function cmd_cron_create (line 5651) | fn cmd_cron_create(agent: &str, spec: &str, prompt: &str, explicit_name:... function cmd_cron_delete (line 5706) | fn cmd_cron_delete(id: &str) { function cmd_cron_toggle (line 5720) | fn cmd_cron_toggle(id: &str, enable: bool) { function cmd_sessions (line 5739) | fn cmd_sessions(agent: Option<&str>, json: bool) { function cmd_logs (line 5778) | fn cmd_logs(lines: usize, follow: bool) { function cmd_health (line 5829) | fn cmd_health(json: bool) { function cmd_security_status (line 5863) | fn cmd_security_status(json: bool) { function cmd_security_audit (line 5896) | fn cmd_security_audit(limit: usize, json: bool) { function cmd_security_verify (line 5935) | fn cmd_security_verify() { function cmd_memory_list (line 5950) | fn cmd_memory_list(agent: &str, json: bool) { function cmd_memory_get (line 5992) | fn cmd_memory_get(agent: &str, key: &str, json: bool) { function cmd_memory_set (line 6017) | fn cmd_memory_set(agent: &str, key: &str, value: &str) { function cmd_memory_delete (line 6036) | fn cmd_memory_delete(agent: &str, key: &str) { function cmd_devices_list (line 6054) | fn cmd_devices_list(json: bool) { function cmd_devices_pair (line 6088) | fn cmd_devices_pair() { function cmd_devices_remove (line 6114) | fn cmd_devices_remove(id: &str) { function cmd_webhooks_list (line 6132) | fn cmd_webhooks_list(json: bool) { function cmd_webhooks_create (line 6166) | fn cmd_webhooks_create(agent: &str, url: &str) { function cmd_webhooks_delete (line 6189) | fn cmd_webhooks_delete(id: &str) { function cmd_webhooks_test (line 6203) | fn cmd_webhooks_test(id: &str) { function cmd_message (line 6217) | fn cmd_message(agent: &str, text: &str, json: bool) { function cmd_system_info (line 6243) | fn cmd_system_info(json: bool) { function cmd_system_version (line 6297) | fn cmd_system_version(json: bool) { function cmd_reset (line 6308) | fn cmd_reset(confirm: bool) { function cmd_uninstall (line 6343) | fn cmd_uninstall(confirm: bool, keep_config: bool) { function remove_autostart_entries (line 6454) | fn remove_autostart_entries(home: &std::path::Path) { function clean_path_entries (line 6521) | fn clean_path_entries(home: &std::path::Path, openfang_dir: &str) { function is_openfang_path_line (line 6603) | fn is_openfang_path_line(line: &str, openfang_dir: &str) -> bool { function remove_dir_except_config (line 6618) | fn remove_dir_except_config(openfang_dir: &std::path::Path) { function remove_self_binary (line 6639) | fn remove_self_binary(exe_path: &std::path::Path) { function test_doctor_skill_registry_loads_bundled (line 6692) | fn test_doctor_skill_registry_loads_bundled() { function test_doctor_extension_registry_loads_bundled (line 6701) | fn test_doctor_extension_registry_loads_bundled() { function test_doctor_config_deser_default (line 6711) | fn test_doctor_config_deser_default() { function test_doctor_config_include_field (line 6720) | fn test_doctor_config_include_field() { function test_doctor_exec_policy_field (line 6737) | fn test_doctor_exec_policy_field() { function test_doctor_mcp_transport_validation (line 6761) | fn test_doctor_mcp_transport_validation() { function test_doctor_skill_injection_scan_clean (line 6792) | fn test_doctor_skill_injection_scan_clean() { function test_doctor_hook_event_variants (line 6799) | fn test_doctor_hook_event_variants() { function test_uninstall_path_line_filter (line 6814) | fn test_uninstall_path_line_filter() { FILE: crates/openfang-cli/src/mcp.rs type McpBackend (line 14) | enum McpBackend { method list_agents (line 26) | fn list_agents(&self) -> Vec<(String, String, String)> { method send_message (line 64) | fn send_message(&self, agent_id: &str, message: &str) -> Result Option { function run_mcp_server (line 115) | pub fn run_mcp_server(config: Option) { function create_backend (line 137) | fn create_backend(config: Option) -> McpBackend { function read_message (line 163) | fn read_message(reader: &mut impl BufRead) -> io::Result> { function write_message (line 217) | fn write_message(writer: &mut impl Write, msg: &Value) { function handle_message (line 229) | fn handle_message(backend: &McpBackend, msg: &Value) -> Option { function jsonrpc_response (line 341) | fn jsonrpc_response(id: Value, result: Value) -> Value { function jsonrpc_error (line 349) | fn jsonrpc_error(id: Value, code: i32, message: &str) -> Value { function test_handle_initialize (line 365) | fn test_handle_initialize() { function test_handle_notifications_initialized (line 385) | fn test_handle_notifications_initialized() { function test_handle_unknown_method (line 399) | fn test_handle_unknown_method() { function test_jsonrpc_response (line 414) | fn test_jsonrpc_response() { function test_jsonrpc_error (line 422) | fn test_jsonrpc_error() { function test_read_message (line 431) | fn test_read_message() { FILE: crates/openfang-cli/src/progress.rs constant DEFAULT_BAR_WIDTH (line 13) | const DEFAULT_BAR_WIDTH: usize = 30; constant DELAY_SUPPRESS_MS (line 17) | const DELAY_SUPPRESS_MS: u64 = 200; constant FILLED (line 20) | const FILLED: char = '\u{2588}'; constant EMPTY (line 21) | const EMPTY: char = '\u{2591}'; constant SPINNER_FRAMES (line 24) | const SPINNER_FRAMES: &[char] = &[ function osc_progress (line 35) | fn osc_progress(state: u8, percent: u8) { function osc_progress_clear (line 43) | fn osc_progress_clear() { type ProgressBar (line 56) | pub struct ProgressBar { method new (line 72) | pub fn new(label: &str, total: u64) -> Self { method width (line 86) | pub fn width(mut self, w: usize) -> Self { method no_delay (line 92) | pub fn no_delay(mut self) -> Self { method no_osc (line 98) | pub fn no_osc(mut self) -> Self { method set (line 104) | pub fn set(&mut self, n: u64) { method inc (line 110) | pub fn inc(&mut self, delta: u64) { method finish (line 116) | pub fn finish(&mut self) { method finish_with_message (line 129) | pub fn finish_with_message(&mut self, msg: &str) { method draw (line 142) | fn draw(&mut self) { method drop (line 171) | fn drop(&mut self) { type Spinner (line 187) | pub struct Spinner { method new (line 198) | pub fn new(label: &str) -> Self { method no_delay (line 210) | pub fn no_delay(mut self) -> Self { method no_osc (line 216) | pub fn no_osc(mut self) -> Self { method tick (line 222) | pub fn tick(&mut self) { method set_label (line 240) | pub fn set_label(&mut self, label: &str) { method finish (line 245) | pub fn finish(&self) { method finish_with_message (line 256) | pub fn finish_with_message(&self, msg: &str) { method drop (line 268) | fn drop(&mut self) { function progress_bar_percentage (line 284) | fn progress_bar_percentage() { function progress_bar_zero_total_no_panic (line 296) | fn progress_bar_zero_total_no_panic() { function spinner_frame_advance (line 305) | fn spinner_frame_advance() { function delay_suppression (line 315) | fn delay_suppression() { FILE: crates/openfang-cli/src/table.rs type Align (line 10) | pub enum Align { type Table (line 18) | pub struct Table { method new (line 27) | pub fn new(headers: &[&str]) -> Self { method align (line 39) | pub fn align(mut self, col: usize, alignment: Align) -> Self { method add_row (line 47) | pub fn add_row(&mut self, cells: &[&str]) { method column_widths (line 55) | fn column_widths(&self) -> Vec { method pad (line 68) | fn pad(text: &str, width: usize, alignment: Align) -> String { method border (line 87) | fn border(widths: &[usize], left: &str, mid: &str, right: &str) -> Str... method render (line 102) | pub fn render(&self) -> String { method print (line 143) | pub fn print(&self) { function basic_table (line 157) | fn basic_table() { function right_alignment (line 191) | fn right_alignment() { function center_alignment (line 206) | fn center_alignment() { function empty_table (line 215) | fn empty_table() { function missing_cells_filled (line 224) | fn missing_cells_filled() { function wide_cells_auto_width (line 237) | fn wide_cells_auto_width() { FILE: crates/openfang-cli/src/templates.rs type AgentTemplate (line 6) | pub struct AgentTemplate { function discover_template_dirs (line 19) | pub fn discover_template_dirs() -> Vec { function load_all_templates (line 65) | pub fn load_all_templates() -> Vec { function extract_description (line 114) | fn extract_description(toml_str: &str) -> String { function template_display_hint (line 128) | pub fn template_display_hint(t: &AgentTemplate) -> String { FILE: crates/openfang-cli/src/tui/chat_runner.rs type Backend (line 23) | enum Backend { type StandaloneChat (line 29) | struct StandaloneChat { method new (line 43) | fn new(event_tx: mpsc::Sender) -> Self { method handle_event (line 60) | fn handle_event(&mut self, ev: AppEvent) { method handle_key (line 76) | fn handle_key(&mut self, key: ratatui::crossterm::event::KeyEvent) { method handle_tick (line 102) | fn handle_tick(&mut self) { method handle_stream (line 109) | fn handle_stream(&mut self, ev: StreamEvent) { method handle_stream_done (line 162) | fn handle_stream_done( method handle_kernel_ready (line 192) | fn handle_kernel_ready(&mut self, kernel: Arc) { method handle_kernel_error (line 200) | fn handle_kernel_error(&mut self, err: String) { method handle_agent_spawned (line 205) | fn handle_agent_spawned(&mut self, id: String, name: String) { method handle_agent_spawn_error (line 209) | fn handle_agent_spawn_error(&mut self, err: String) { method handle_chat_action (line 215) | fn handle_chat_action(&mut self, action: ChatAction) { method send_message (line 228) | fn send_message(&mut self, message: String) { method handle_slash_command (line 262) | fn handle_slash_command(&mut self, cmd: &str) { method open_model_picker (line 378) | fn open_model_picker(&mut self) { method switch_model (line 436) | fn switch_model(&mut self, model_id: &str) { method enter_chat_daemon (line 522) | fn enter_chat_daemon(&mut self, id: String, name: String) { method enter_chat_inprocess (line 546) | fn enter_chat_inprocess(&mut self, id: AgentId, name: String) { method resolve_daemon_agent (line 568) | fn resolve_daemon_agent(&mut self, base_url: &str, agent_name: Option<... method resolve_inprocess_agent (line 621) | fn resolve_inprocess_agent(&mut self) { method backend_is_none (line 678) | fn backend_is_none(&self) -> bool { method draw (line 684) | fn draw(&mut self, frame: &mut ratatui::Frame) { method draw_booting (line 696) | fn draw_booting(&self, frame: &mut ratatui::Frame, area: Rect) { method draw_error (line 725) | fn draw_error(&self, frame: &mut ratatui::Frame, area: Rect, err: &str) { function run_chat_tui (line 761) | pub fn run_chat_tui(config: Option, agent_name: Option) { FILE: crates/openfang-cli/src/tui/event.rs type BackendRef (line 34) | pub enum BackendRef { type AppEvent (line 42) | pub enum AppEvent { function spawn_event_thread (line 206) | pub fn spawn_event_thread( function spawn_daemon_detect (line 243) | pub fn spawn_daemon_detect(tx: mpsc::Sender) { function spawn_kernel_boot (line 266) | pub fn spawn_kernel_boot(config: Option, tx: mpsc::S... function spawn_inprocess_stream (line 287) | pub fn spawn_inprocess_stream( function spawn_daemon_stream (line 329) | pub fn spawn_daemon_stream( function daemon_fallback (line 447) | fn daemon_fallback( function spawn_daemon_agent (line 488) | pub fn spawn_daemon_agent(base_url: String, toml_content: String, tx: mp... function spawn_fetch_dashboard (line 528) | pub fn spawn_fetch_dashboard(backend: BackendRef, tx: mpsc::Sender reqwest::blocking::Client { function spawn_fetch_sessions (line 1227) | pub fn spawn_fetch_sessions(backend: BackendRef, tx: mpsc::Sender Vec { function spawn_install_skill (line 1517) | pub fn spawn_install_skill(backend: BackendRef, slug: String, tx: mpsc::... function spawn_uninstall_skill (line 1543) | pub fn spawn_uninstall_skill(backend: BackendRef, name: String, tx: mpsc... function spawn_fetch_mcp_servers (line 1569) | pub fn spawn_fetch_mcp_servers(backend: BackendRef, tx: mpsc::Sender) { function spawn_fetch_usage (line 1740) | pub fn spawn_fetch_usage(backend: BackendRef, tx: mpsc::Sender) { function spawn_fetch_providers (line 1805) | pub fn spawn_fetch_providers(backend: BackendRef, tx: mpsc::Sender) { function spawn_save_provider_key (line 1919) | pub fn spawn_save_provider_key( function spawn_delete_provider_key (line 1952) | pub fn spawn_delete_provider_key(backend: BackendRef, name: String, tx: ... function spawn_test_provider (line 1979) | pub fn spawn_test_provider(backend: BackendRef, name: String, tx: mpsc::... function spawn_fetch_peers (line 2032) | pub fn spawn_fetch_peers(backend: BackendRef, tx: mpsc::Sender) { function spawn_fetch_logs (line 2067) | pub fn spawn_fetch_logs(backend: BackendRef, tx: mpsc::Sender) { function spawn_fetch_hands (line 2112) | pub fn spawn_fetch_hands(backend: BackendRef, tx: mpsc::Sender) { function spawn_fetch_active_hands (line 2168) | pub fn spawn_fetch_active_hands(backend: BackendRef, tx: mpsc::Sender) { function spawn_comms_send (line 2693) | pub fn spawn_comms_send( function spawn_comms_task (line 2739) | pub fn spawn_comms_task( FILE: crates/openfang-cli/src/tui/mod.rs type Phase (line 30) | enum Phase { type BootScreen (line 36) | enum BootScreen { type Tab (line 42) | enum Tab { method label (line 87) | fn label(self) -> &'static str { method index (line 111) | fn index(self) -> usize { constant TABS (line 64) | const TABS: &[Tab] = &[ type Backend (line 116) | enum Backend { method to_ref (line 123) | fn to_ref(&self) -> Option { type ChatTarget (line 132) | struct ChatTarget { type App (line 138) | struct App { method new (line 185) | fn new(config_path: Option, event_tx: mpsc::Sender)... method handle_event (line 226) | fn handle_event(&mut self, ev: AppEvent) { method handle_key (line 612) | fn handle_key(&mut self, key: ratatui::crossterm::event::KeyEvent) { method handle_tick (line 884) | fn handle_tick(&mut self) { method next_tab (line 923) | fn next_tab(&mut self) { method prev_tab (line 929) | fn prev_tab(&mut self) { method switch_tab (line 935) | fn switch_tab(&mut self, tab: Tab) { method on_tab_enter (line 947) | fn on_tab_enter(&mut self, tab: Tab) { method enter_main_phase (line 972) | fn enter_main_phase(&mut self) { method refresh_dashboard (line 983) | fn refresh_dashboard(&mut self) { method refresh_agents (line 990) | fn refresh_agents(&mut self) { method refresh_channels (line 1002) | fn refresh_channels(&mut self) { method refresh_workflows (line 1013) | fn refresh_workflows(&mut self) { method refresh_triggers (line 1020) | fn refresh_triggers(&mut self) { method refresh_sessions (line 1027) | fn refresh_sessions(&mut self) { method refresh_memory (line 1034) | fn refresh_memory(&mut self) { method refresh_skills (line 1041) | fn refresh_skills(&mut self) { method refresh_hands (line 1048) | fn refresh_hands(&mut self) { method refresh_extensions (line 1056) | fn refresh_extensions(&mut self) { method refresh_extension_health (line 1063) | fn refresh_extension_health(&mut self) { method refresh_templates (line 1069) | fn refresh_templates(&mut self) { method refresh_security (line 1075) | fn refresh_security(&mut self) { method refresh_audit (line 1082) | fn refresh_audit(&mut self) { method refresh_usage (line 1089) | fn refresh_usage(&mut self) { method refresh_settings_providers (line 1096) | fn refresh_settings_providers(&mut self) { method refresh_settings_models (line 1103) | fn refresh_settings_models(&mut self) { method refresh_settings_tools (line 1110) | fn refresh_settings_tools(&mut self) { method refresh_peers (line 1116) | fn refresh_peers(&mut self) { method refresh_comms (line 1123) | fn refresh_comms(&mut self) { method refresh_logs (line 1130) | fn refresh_logs(&mut self) { method handle_stream (line 1139) | fn handle_stream(&mut self, ev: StreamEvent) { method handle_stream_done (line 1192) | fn handle_stream_done( method handle_kernel_ready (line 1222) | fn handle_kernel_ready(&mut self, kernel: Arc) { method handle_kernel_error (line 1229) | fn handle_kernel_error(&mut self, err: String) { method handle_agent_spawned (line 1241) | fn handle_agent_spawned(&mut self, id: String, name: String) { method handle_agent_spawn_error (line 1246) | fn handle_agent_spawn_error(&mut self, err: String) { method start_daemon_detect (line 1253) | fn start_daemon_detect(&mut self) { method handle_welcome_action (line 1258) | fn handle_welcome_action(&mut self, action: welcome::WelcomeAction) { method handle_dashboard_action (line 1287) | fn handle_dashboard_action(&mut self, action: dashboard::DashboardActi... method handle_agent_action (line 1297) | fn handle_agent_action(&mut self, action: agents::AgentAction) { method handle_chat_action (line 1355) | fn handle_chat_action(&mut self, action: chat::ChatAction) { method handle_channel_action (line 1371) | fn handle_channel_action(&mut self, action: channels::ChannelAction) { method handle_workflow_action (line 1416) | fn handle_workflow_action(&mut self, action: workflows::WorkflowAction) { method handle_trigger_action (line 1450) | fn handle_trigger_action(&mut self, action: triggers::TriggerAction) { method handle_sessions_action (line 1481) | fn handle_sessions_action(&mut self, action: sessions::SessionsAction) { method handle_memory_action (line 1499) | fn handle_memory_action(&mut self, action: memory::MemoryAction) { method handle_skills_action (line 1532) | fn handle_skills_action(&mut self, action: skills::SkillsAction) { method handle_extensions_action (line 1567) | fn handle_extensions_action(&mut self, action: extensions::ExtensionsA... method handle_hands_action (line 1590) | fn handle_hands_action(&mut self, action: hands::HandsAction) { method handle_templates_action (line 1623) | fn handle_templates_action(&mut self, action: templates::TemplatesActi... method handle_security_action (line 1640) | fn handle_security_action(&mut self, action: security::SecurityAction) { method handle_audit_action (line 1653) | fn handle_audit_action(&mut self, action: audit::AuditAction) { method handle_usage_action (line 1665) | fn handle_usage_action(&mut self, action: usage::UsageAction) { method handle_settings_action (line 1672) | fn handle_settings_action(&mut self, action: settings::SettingsAction) { method handle_peers_action (line 1696) | fn handle_peers_action(&mut self, action: peers::PeersAction) { method handle_comms_action (line 1703) | fn handle_comms_action(&mut self, action: comms::CommsAction) { method handle_logs_action (line 1724) | fn handle_logs_action(&mut self, action: logs::LogsAction) { method enter_chat_daemon (line 1733) | fn enter_chat_daemon(&mut self, id: String, name: String) { method enter_chat_inprocess (line 1761) | fn enter_chat_inprocess(&mut self, id: AgentId, name: String) { method send_message (line 1787) | fn send_message(&mut self, message: String) { method spawn_agent (line 1820) | fn spawn_agent(&mut self, toml_content: String) { method open_model_picker (line 1854) | fn open_model_picker(&mut self) { method switch_model (line 1910) | fn switch_model(&mut self, model_id: &str) { method handle_slash_command (line 1998) | fn handle_slash_command(&mut self, cmd: &str) { method draw (line 2192) | fn draw(&mut self, frame: &mut ratatui::Frame) { method draw_tab_bar (line 2247) | fn draw_tab_bar(&mut self, frame: &mut ratatui::Frame, area: Rect) { function render_toast (line 2366) | fn render_toast(frame: &mut ratatui::Frame, area: Rect, msg: &str, color... function run (line 2381) | pub fn run(config: Option) { FILE: crates/openfang-cli/src/tui/screens/agents.rs constant TOOL_OPTIONS (line 14) | const TOOL_OPTIONS: &[(&str, &str)] = &[ constant DEFAULT_TOOLS (line 26) | const DEFAULT_TOOLS: &[bool] = &[true, false, true, true, true, true, fa... type AgentSubScreen (line 29) | pub enum AgentSubScreen { type AgentSelectState (line 58) | pub struct AgentSelectState { method new (line 161) | pub fn new() -> Self { method reset (line 188) | pub fn reset(&mut self) { method load_daemon_agents (line 211) | pub fn load_daemon_agents(&mut self, base_url: &str) { method load_inprocess_agents (line 234) | pub fn load_inprocess_agents(&mut self, kernel: &openfang_kernel::Open... method total_agents (line 249) | fn total_agents(&self) -> usize { method visible_count (line 254) | fn visible_count(&self) -> usize { method rebuild_filter (line 262) | fn rebuild_filter(&mut self) { method agent_info_at (line 281) | fn agent_info_at(&self, combined_idx: usize) -> (String, String, Strin... method visible_to_combined (line 306) | fn visible_to_combined(&self, visible_idx: usize) -> Option { method load_templates (line 320) | fn load_templates(&mut self) { method build_detail_daemon (line 328) | fn build_detail_daemon(&self, idx: usize) -> AgentDetail { method build_detail_inprocess (line 341) | fn build_detail_inprocess(&self, idx: usize) -> AgentDetail { method handle_key (line 353) | pub fn handle_key(&mut self, key: KeyEvent) -> AgentAction { method handle_agent_list (line 375) | fn handle_agent_list(&mut self, key: KeyEvent) -> AgentAction { method handle_detail (line 457) | fn handle_detail(&mut self, key: KeyEvent) -> AgentAction { method handle_create_method (line 498) | fn handle_create_method(&mut self, key: KeyEvent) -> AgentAction { method handle_template_picker (line 541) | fn handle_template_picker(&mut self, key: KeyEvent) -> AgentAction { method handle_custom_name (line 574) | fn handle_custom_name(&mut self, key: KeyEvent) -> AgentAction { method handle_custom_desc (line 598) | fn handle_custom_desc(&mut self, key: KeyEvent) -> AgentAction { method handle_custom_prompt (line 620) | fn handle_custom_prompt(&mut self, key: KeyEvent) -> AgentAction { method handle_custom_tools (line 639) | fn handle_custom_tools(&mut self, key: KeyEvent) -> AgentAction { method handle_custom_skills (line 671) | fn handle_custom_skills(&mut self, key: KeyEvent) -> AgentAction { method handle_custom_mcp_servers (line 703) | fn handle_custom_mcp_servers(&mut self, key: KeyEvent) -> AgentAction { method handle_edit_skills (line 734) | fn handle_edit_skills(&mut self, key: KeyEvent) -> AgentAction { method handle_edit_mcp_servers (line 777) | fn handle_edit_mcp_servers(&mut self, key: KeyEvent) -> AgentAction { method build_custom_toml (line 820) | fn build_custom_toml(&self) -> String { type DaemonAgent (line 102) | pub struct DaemonAgent { type InProcessAgent (line 111) | pub struct InProcessAgent { type AgentDetail (line 120) | pub struct AgentDetail { type AgentAction (line 139) | pub enum AgentAction { function draw (line 879) | pub fn draw(f: &mut Frame, area: Rect, state: &mut AgentSelectState) { function draw_agent_list_full (line 973) | fn draw_agent_list_full(f: &mut Frame, area: Rect, state: &mut AgentSele... function draw_detail (line 1124) | fn draw_detail(f: &mut Frame, area: Rect, state: &AgentSelectState) { function draw_create_method (line 1265) | fn draw_create_method(f: &mut Frame, area: Rect, state: &mut AgentSelect... function draw_template_picker (line 1300) | fn draw_template_picker(f: &mut Frame, area: Rect, state: &mut AgentSele... function draw_text_input (line 1331) | fn draw_text_input(f: &mut Frame, area: Rect, label: &str, value: &str, ... function draw_tool_select (line 1378) | fn draw_tool_select(f: &mut Frame, area: Rect, state: &AgentSelectState) { function draw_skill_select (line 1419) | fn draw_skill_select(f: &mut Frame, area: Rect, state: &AgentSelectState) { function draw_mcp_select (line 1430) | fn draw_mcp_select(f: &mut Frame, area: Rect, state: &AgentSelectState) { function draw_edit_allowlist (line 1441) | fn draw_edit_allowlist(f: &mut Frame, area: Rect, state: &AgentSelectSta... function draw_checkbox_list (line 1471) | fn draw_checkbox_list( function truncate (line 1523) | fn truncate(s: &str, max: usize) -> String { FILE: crates/openfang-cli/src/tui/screens/audit.rs type AuditEntry (line 14) | pub struct AuditEntry { type AuditFilter (line 23) | pub enum AuditFilter { method label (line 33) | fn label(self) -> &'static str { method next (line 43) | fn next(self) -> Self { method matches (line 53) | fn matches(self, action: &str) -> bool { function friendly_action (line 95) | fn friendly_action(action: &str) -> &str { type AuditState (line 110) | pub struct AuditState { method new (line 128) | pub fn new() -> Self { method tick (line 141) | pub fn tick(&mut self) { method refilter (line 145) | pub fn refilter(&mut self) { method handle_key (line 160) | pub fn handle_key(&mut self, key: KeyEvent) -> AuditAction { type AuditAction (line 121) | pub enum AuditAction { function draw (line 195) | pub fn draw(f: &mut Frame, area: Rect, state: &mut AuditState) { function truncate (line 340) | fn truncate(s: &str, max: usize) -> String { FILE: crates/openfang-cli/src/tui/screens/channels.rs type ChannelInfo (line 14) | pub struct ChannelInfo { type ChannelStatus (line 24) | pub enum ChannelStatus { type ChannelDef (line 32) | struct ChannelDef { constant CHANNEL_DEFS (line 40) | const CHANNEL_DEFS: &[ChannelDef] = &[ constant CATEGORIES (line 339) | const CATEGORIES: &[&str] = &[ type ChannelSubScreen (line 351) | pub enum ChannelSubScreen { type ChannelState (line 357) | pub struct ChannelState { method new (line 384) | pub fn new() -> Self { method tick (line 401) | pub fn tick(&mut self) { method current_category (line 405) | fn current_category(&self) -> &str { method filtered_channels (line 409) | fn filtered_channels(&self) -> Vec<&ChannelInfo> { method ready_count (line 417) | fn ready_count(&self) -> usize { method build_default_channels (line 425) | pub fn build_default_channels(&mut self) { method handle_key (line 454) | pub fn handle_key(&mut self, key: KeyEvent) -> ChannelAction { method handle_list (line 465) | fn handle_list(&mut self, key: KeyEvent) -> ChannelAction { method handle_setup (line 567) | fn handle_setup(&mut self, key: KeyEvent) -> ChannelAction { method handle_testing (line 615) | fn handle_testing(&mut self, key: KeyEvent) -> ChannelAction { type ChannelAction (line 375) | pub enum ChannelAction { function draw (line 628) | pub fn draw(f: &mut Frame, area: Rect, state: &mut ChannelState) { function draw_list (line 649) | fn draw_list(f: &mut Frame, area: Rect, state: &mut ChannelState) { function draw_setup (line 746) | fn draw_setup(f: &mut Frame, area: Rect, state: &ChannelState) { function draw_testing (line 869) | fn draw_testing(f: &mut Frame, area: Rect, state: &ChannelState) { FILE: crates/openfang-cli/src/tui/screens/chat.rs type ModelEntry (line 13) | pub struct ModelEntry { type ToolInfo (line 22) | pub struct ToolInfo { type ChatMessage (line 31) | pub struct ChatMessage { type Role (line 38) | pub enum Role { type ChatState (line 45) | pub struct ChatState { method new (line 102) | pub fn new() -> Self { method reset (line 128) | pub fn reset(&mut self) { method push_message (line 149) | pub fn push_message(&mut self, role: Role, text: String) { method append_stream (line 159) | pub fn append_stream(&mut self, text: &str) { method take_staged (line 167) | pub fn take_staged(&mut self) -> Option { method finalize_stream (line 176) | pub fn finalize_stream(&mut self) { method tool_start (line 189) | pub fn tool_start(&mut self, name: &str) { method tool_use_end (line 196) | pub fn tool_use_end(&mut self, name: &str, input: &str) { method tool_result (line 212) | pub fn tool_result(&mut self, name: &str, result: &str, is_error: bool) { method tick (line 230) | pub fn tick(&mut self) { method filtered_models (line 237) | pub fn filtered_models(&self) -> Vec<&ModelEntry> { method handle_key (line 252) | pub fn handle_key(&mut self, key: KeyEvent) -> ChatAction { type ChatAction (line 90) | pub enum ChatAction { function draw (line 390) | pub fn draw(f: &mut Frame, area: Rect, state: &mut ChatState) { function draw_model_picker (line 478) | fn draw_model_picker(f: &mut Frame, area: Rect, state: &ChatState) { function draw_messages (line 598) | fn draw_messages(f: &mut Frame, area: Rect, state: &ChatState) { function wrap_text (line 831) | fn wrap_text(text: &str, max_width: usize) -> Vec { function sanitize_function_tags (line 868) | fn sanitize_function_tags(text: &str) -> String { function truncate_line (line 885) | fn truncate_line(s: &str, max_len: usize) -> String { FILE: crates/openfang-cli/src/tui/screens/comms.rs type CommsNode (line 14) | pub struct CommsNode { type CommsEdge (line 22) | pub struct CommsEdge { type CommsEventItem (line 29) | pub struct CommsEventItem { type CommsFocus (line 43) | pub enum CommsFocus { type CommsState (line 48) | pub struct CommsState { method new (line 89) | pub fn new() -> Self { method tick (line 113) | pub fn tick(&mut self) { method should_poll (line 119) | pub fn should_poll(&self) -> bool { method handle_key (line 123) | pub fn handle_key(&mut self, key: KeyEvent) -> CommsAction { method handle_send_modal_key (line 177) | fn handle_send_modal_key(&mut self, key: KeyEvent) -> CommsAction { method handle_task_modal_key (line 226) | fn handle_task_modal_key(&mut self, key: KeyEvent) -> CommsAction { method root_nodes (line 274) | fn root_nodes(&self) -> Vec<&CommsNode> { method children_of (line 287) | fn children_of(&self, id: &str) -> Vec<&CommsNode> { method peers_of (line 300) | fn peers_of(&self, id: &str) -> Vec<&CommsNode> { type CommsAction (line 73) | pub enum CommsAction { function draw (line 324) | pub fn draw(f: &mut Frame, area: Rect, state: &mut CommsState) { function draw_topology (line 425) | fn draw_topology(f: &mut Frame, area: Rect, state: &CommsState) { function draw_event_list (line 499) | fn draw_event_list(f: &mut Frame, area: Rect, state: &mut CommsState) { function draw_send_modal (line 547) | fn draw_send_modal(f: &mut Frame, area: Rect, state: &CommsState) { function draw_task_modal (line 622) | fn draw_task_modal(f: &mut Frame, area: Rect, state: &CommsState) { function state_color (line 702) | fn state_color(state: &str) -> Style { function kind_color (line 711) | fn kind_color(kind: &str) -> Style { function kind_short (line 723) | fn kind_short(kind: &str) -> &str { function short_time (line 735) | fn short_time(ts: &str) -> String { function truncate (line 746) | fn truncate(s: &str, max: usize) -> String { function centered_rect (line 757) | fn centered_rect(percent_x: u16, height: u16, area: Rect) -> Rect { FILE: crates/openfang-cli/src/tui/screens/dashboard.rs type AuditRow (line 14) | pub struct AuditRow { type DashboardState (line 23) | pub struct DashboardState { method new (line 42) | pub fn new() -> Self { method tick (line 56) | pub fn tick(&mut self) { method handle_key (line 60) | pub fn handle_key(&mut self, key: KeyEvent) -> DashboardAction { type DashboardAction (line 35) | pub enum DashboardAction { function draw (line 90) | pub fn draw(f: &mut Frame, area: Rect, state: &mut DashboardState) { function draw_stat_cards (line 132) | fn draw_stat_cards(f: &mut Frame, area: Rect, state: &DashboardState) { function draw_audit_trail (line 200) | fn draw_audit_trail(f: &mut Frame, area: Rect, state: &DashboardState) { function format_uptime (line 260) | fn format_uptime(secs: u64) -> String { function truncate (line 272) | fn truncate(s: &str, max: usize) -> String { FILE: crates/openfang-cli/src/tui/screens/extensions.rs type ExtensionInfo (line 14) | pub struct ExtensionInfo { type ExtensionHealthInfo (line 28) | pub struct ExtensionHealthInfo { type ExtSub (line 43) | pub enum ExtSub { type ExtensionsState (line 49) | pub struct ExtensionsState { method new (line 74) | pub fn new() -> Self { method tick (line 91) | pub fn tick(&mut self) { method filtered (line 95) | fn filtered(&self) -> Vec<&ExtensionInfo> { method installed_list_data (line 111) | fn installed_list_data(&self) -> Vec<&ExtensionInfo> { method handle_key (line 115) | pub fn handle_key(&mut self, key: KeyEvent) -> ExtensionsAction { method handle_browse (line 172) | fn handle_browse(&mut self, key: KeyEvent) -> ExtensionsAction { method handle_installed (line 206) | fn handle_installed(&mut self, key: KeyEvent) -> ExtensionsAction { method handle_health (line 250) | fn handle_health(&mut self, key: KeyEvent) -> ExtensionsAction { type ExtensionsAction (line 64) | pub enum ExtensionsAction { function draw (line 282) | pub fn draw(f: &mut Frame, area: Rect, state: &mut ExtensionsState) { function draw_sub_tabs (line 317) | fn draw_sub_tabs(f: &mut Frame, area: Rect, state: &ExtensionsState) { function status_badge (line 347) | fn status_badge(status: &str) -> (String, Style) { function draw_browse (line 362) | fn draw_browse(f: &mut Frame, area: Rect, state: &mut ExtensionsState) { function draw_installed (line 438) | fn draw_installed(f: &mut Frame, area: Rect, state: &mut ExtensionsState) { function draw_health (line 502) | fn draw_health(f: &mut Frame, area: Rect, state: &mut ExtensionsState) { FILE: crates/openfang-cli/src/tui/screens/hands.rs type HandInfo (line 14) | pub struct HandInfo { type HandInstanceInfo (line 25) | pub struct HandInstanceInfo { type HandsSub (line 37) | pub enum HandsSub { type HandsState (line 42) | pub struct HandsState { method new (line 65) | pub fn new() -> Self { method tick (line 79) | pub fn tick(&mut self) { method handle_key (line 83) | pub fn handle_key(&mut self, key: KeyEvent) -> HandsAction { method handle_marketplace (line 107) | fn handle_marketplace(&mut self, key: KeyEvent) -> HandsAction { method handle_active (line 137) | fn handle_active(&mut self, key: KeyEvent) -> HandsAction { type HandsAction (line 54) | pub enum HandsAction { function draw (line 197) | pub fn draw(f: &mut Frame, area: Rect, state: &mut HandsState) { function draw_sub_tabs (line 232) | fn draw_sub_tabs(f: &mut Frame, area: Rect, active: HandsSub) { function draw_marketplace (line 250) | fn draw_marketplace(f: &mut Frame, area: Rect, state: &mut HandsState) { function draw_active (line 341) | fn draw_active(f: &mut Frame, area: Rect, state: &mut HandsState) { function truncate (line 438) | fn truncate(s: &str, max: usize) -> &str { FILE: crates/openfang-cli/src/tui/screens/init_wizard.rs type ProviderInfo (line 21) | struct ProviderInfo { constant PROVIDERS (line 30) | const PROVIDERS: &[ProviderInfo] = &[ type LaunchChoice (line 229) | pub enum LaunchChoice { type InitResult (line 235) | pub enum InitResult { type Step (line 248) | enum Step { type MigrationPhase (line 259) | enum MigrationPhase { type RoutingPhase (line 268) | enum RoutingPhase { type KeyTestState (line 276) | enum KeyTestState { type ModelEntry (line 284) | struct ModelEntry { constant ROUTING_TIER_NAMES (line 291) | const ROUTING_TIER_NAMES: [&str; 3] = ["Fast", "Balanced", "Frontier"]; constant ROUTING_TIER_DESC (line 292) | const ROUTING_TIER_DESC: [&str; 3] = [ type State (line 298) | struct State { method new (line 347) | fn new() -> Self { method build_provider_order (line 390) | fn build_provider_order(&mut self) { method provider (line 417) | fn provider(&self) -> Option<&'static ProviderInfo> { method step_label (line 421) | fn step_label(&self) -> &'static str { method advance_to_provider (line 434) | fn advance_to_provider(&mut self) { method is_provider_detected (line 447) | fn is_provider_detected(&self, prov_idx: usize) -> bool { method load_models_for_provider (line 457) | fn load_models_for_provider(&mut self) { method selected_model_id (line 499) | fn selected_model_id(&self) -> String { method auto_select_routing_models (line 511) | fn auto_select_routing_models(&mut self) { method select_routing_tier_model (line 561) | fn select_routing_tier_model(&mut self, tier: usize) { function tier_label (line 572) | fn tier_label(tier: ModelTier) -> &'static str { function run (line 585) | pub fn run() -> InitResult { function handle_migration_key (line 922) | fn handle_migration_key( function handle_routing_key (line 986) | fn handle_routing_key(state: &mut State, code: KeyCode) { function save_config (line 1066) | fn save_config(state: &mut State) { function find_desktop_binary (line 1163) | fn find_desktop_binary() -> Option { function draw (line 1182) | fn draw(f: &mut Frame, area: Rect, state: &mut State) { function draw_welcome (line 1244) | fn draw_welcome(f: &mut Frame, area: Rect) { function draw_migration (line 1342) | fn draw_migration(f: &mut Frame, area: Rect, state: &mut State) { function draw_migration_detecting (line 1351) | fn draw_migration_detecting(f: &mut Frame, area: Rect, state: &State) { function draw_migration_offer (line 1370) | fn draw_migration_offer(f: &mut Frame, area: Rect, state: &mut State) { function draw_migration_running (line 1540) | fn draw_migration_running(f: &mut Frame, area: Rect, state: &State) { function draw_migration_done (line 1559) | fn draw_migration_done(f: &mut Frame, area: Rect, state: &State) { function draw_provider (line 1707) | fn draw_provider(f: &mut Frame, area: Rect, state: &mut State) { function draw_api_key (line 1767) | fn draw_api_key(f: &mut Frame, area: Rect, state: &mut State) { function draw_model (line 1861) | fn draw_model(f: &mut Frame, area: Rect, state: &mut State) { function draw_routing (line 1897) | fn draw_routing(f: &mut Frame, area: Rect, state: &mut State) { function draw_routing_choice (line 1904) | fn draw_routing_choice(f: &mut Frame, area: Rect, state: &mut State) { function draw_routing_pick (line 2000) | fn draw_routing_pick(f: &mut Frame, area: Rect, state: &mut State, tier:... function build_model_list_items (line 2087) | fn build_model_list_items<'a>( function draw_complete (line 2126) | fn draw_complete(f: &mut Frame, area: Rect, state: &mut State) { FILE: crates/openfang-cli/src/tui/screens/logs.rs type LogEntry (line 14) | pub struct LogEntry { type LogLevel (line 23) | pub enum LogLevel { method label (line 31) | fn label(self) -> &'static str { method style (line 39) | fn style(self) -> Style { function classify_level (line 51) | pub fn classify_level(action: &str, detail: &str) -> LogLevel { type LevelFilter (line 74) | pub enum LevelFilter { method label (line 82) | fn label(self) -> &'static str { method next (line 90) | fn next(self) -> Self { method matches (line 98) | fn matches(self, level: LogLevel) -> bool { type LogsState (line 110) | pub struct LogsState { method new (line 129) | pub fn new() -> Self { method tick (line 144) | pub fn tick(&mut self) { method should_poll (line 150) | pub fn should_poll(&self) -> bool { method refilter (line 154) | pub fn refilter(&mut self) { method handle_key (line 183) | pub fn handle_key(&mut self, key: KeyEvent) -> LogsAction { type LogsAction (line 123) | pub enum LogsAction { function draw (line 258) | pub fn draw(f: &mut Frame, area: Rect, state: &mut LogsState) { function truncate (line 404) | fn truncate(s: &str, max: usize) -> String { FILE: crates/openfang-cli/src/tui/screens/memory.rs type KvPair (line 14) | pub struct KvPair { type AgentEntry (line 20) | pub struct AgentEntry { type MemorySub (line 28) | pub enum MemorySub { type EditField (line 36) | pub enum EditField { type MemoryState (line 41) | pub struct MemoryState { method new (line 73) | pub fn new() -> Self { method tick (line 91) | pub fn tick(&mut self) { method handle_key (line 95) | pub fn handle_key(&mut self, key: KeyEvent) -> MemoryAction { method handle_agent_select (line 106) | fn handle_agent_select(&mut self, key: KeyEvent) -> MemoryAction { method handle_kv_browser (line 141) | fn handle_kv_browser(&mut self, key: KeyEvent) -> MemoryAction { method handle_edit (line 215) | fn handle_edit(&mut self, key: KeyEvent) -> MemoryAction { type MemoryAction (line 57) | pub enum MemoryAction { function draw (line 262) | pub fn draw(f: &mut Frame, area: Rect, state: &mut MemoryState) { function draw_agent_select (line 282) | fn draw_agent_select(f: &mut Frame, area: Rect, state: &mut MemoryState) { function draw_kv_browser (line 349) | fn draw_kv_browser(f: &mut Frame, area: Rect, state: &mut MemoryState) { function draw_edit (line 447) | fn draw_edit(f: &mut Frame, area: Rect, state: &MemoryState) { function truncate (line 548) | fn truncate(s: &str, max: usize) -> String { FILE: crates/openfang-cli/src/tui/screens/peers.rs type PeerInfo (line 14) | pub struct PeerInfo { type PeersState (line 25) | pub struct PeersState { method new (line 39) | pub fn new() -> Self { method tick (line 49) | pub fn tick(&mut self) { method should_poll (line 55) | pub fn should_poll(&self) -> bool { method handle_key (line 59) | pub fn handle_key(&mut self, key: KeyEvent) -> PeersAction { type PeersAction (line 33) | pub enum PeersAction { function draw (line 88) | pub fn draw(f: &mut Frame, area: Rect, state: &mut PeersState) { function truncate (line 207) | fn truncate(s: &str, max: usize) -> String { FILE: crates/openfang-cli/src/tui/screens/security.rs type SecurityFeature (line 14) | pub struct SecurityFeature { type SecuritySection (line 22) | pub enum SecuritySection { method label (line 29) | fn label(self) -> &'static str { function builtin_features (line 40) | fn builtin_features() -> Vec { type SecurityState (line 140) | pub struct SecurityState { method new (line 156) | pub fn new() -> Self { method tick (line 167) | pub fn tick(&mut self) { method handle_key (line 171) | pub fn handle_key(&mut self, key: KeyEvent) -> SecurityAction { type SecurityAction (line 149) | pub enum SecurityAction { function draw (line 198) | pub fn draw(f: &mut Frame, area: Rect, state: &mut SecurityState) { FILE: crates/openfang-cli/src/tui/screens/sessions.rs type SessionInfo (line 14) | pub struct SessionInfo { type SessionsState (line 24) | pub struct SessionsState { method new (line 47) | pub fn new() -> Self { method tick (line 61) | pub fn tick(&mut self) { method refilter (line 65) | pub fn refilter(&mut self) { method handle_key (line 85) | pub fn handle_key(&mut self, key: KeyEvent) -> SessionsAction { type SessionsAction (line 36) | pub enum SessionsAction { function draw (line 176) | pub fn draw(f: &mut Frame, area: Rect, state: &mut SessionsState) { function truncate (line 307) | fn truncate(s: &str, max: usize) -> String { FILE: crates/openfang-cli/src/tui/screens/settings.rs type ProviderInfo (line 14) | pub struct ProviderInfo { type ModelInfo (line 27) | pub struct ModelInfo { type ToolInfo (line 37) | pub struct ToolInfo { type TestResult (line 43) | pub struct TestResult { type SettingsSub (line 53) | pub enum SettingsSub { type SettingsState (line 59) | pub struct SettingsState { method new (line 87) | pub fn new() -> Self { method tick (line 106) | pub fn tick(&mut self) { method handle_key (line 110) | pub fn handle_key(&mut self, key: KeyEvent) -> SettingsAction { method handle_input (line 145) | fn handle_input(&mut self, key: KeyEvent) -> SettingsAction { method handle_providers (line 174) | fn handle_providers(&mut self, key: KeyEvent) -> SettingsAction { method handle_models (line 223) | fn handle_models(&mut self, key: KeyEvent) -> SettingsAction { method handle_tools (line 246) | fn handle_tools(&mut self, key: KeyEvent) -> SettingsAction { type SettingsAction (line 76) | pub enum SettingsAction { function draw (line 272) | pub fn draw(f: &mut Frame, area: Rect, state: &mut SettingsState) { function draw_sub_tabs (line 325) | fn draw_sub_tabs(f: &mut Frame, area: Rect, active: SettingsSub) { function draw_providers (line 344) | fn draw_providers(f: &mut Frame, area: Rect, state: &mut SettingsState) { function draw_models (line 481) | fn draw_models(f: &mut Frame, area: Rect, state: &mut SettingsState) { function draw_tools (line 558) | fn draw_tools(f: &mut Frame, area: Rect, state: &mut SettingsState) { function truncate (line 603) | fn truncate(s: &str, max: usize) -> String { function format_context (line 614) | fn format_context(n: u64) -> String { FILE: crates/openfang-cli/src/tui/screens/skills.rs type SkillInfo (line 14) | pub struct SkillInfo { type ClawHubResult (line 22) | pub struct ClawHubResult { type McpServerInfo (line 31) | pub struct McpServerInfo { type SkillsSub (line 40) | pub enum SkillsSub { type ClawHubSort (line 47) | pub enum ClawHubSort { method label (line 54) | fn label(self) -> &'static str { method next (line 61) | fn next(self) -> Self { type SkillsState (line 70) | pub struct SkillsState { method new (line 98) | pub fn new() -> Self { method tick (line 117) | pub fn tick(&mut self) { method handle_key (line 121) | pub fn handle_key(&mut self, key: KeyEvent) -> SkillsAction { method handle_installed (line 152) | fn handle_installed(&mut self, key: KeyEvent) -> SkillsAction { method handle_clawhub (line 195) | fn handle_clawhub(&mut self, key: KeyEvent) -> SkillsAction { method handle_mcp (line 257) | fn handle_mcp(&mut self, key: KeyEvent) -> SkillsAction { type SkillsAction (line 87) | pub enum SkillsAction { function draw (line 283) | pub fn draw(f: &mut Frame, area: Rect, state: &mut SkillsState) { function draw_sub_tabs (line 319) | fn draw_sub_tabs(f: &mut Frame, area: Rect, active: SkillsSub) { function draw_installed (line 338) | fn draw_installed(f: &mut Frame, area: Rect, state: &mut SkillsState) { function draw_clawhub (line 445) | fn draw_clawhub(f: &mut Frame, area: Rect, state: &mut SkillsState) { function draw_mcp (line 542) | fn draw_mcp(f: &mut Frame, area: Rect, state: &mut SkillsState) { function truncate (line 611) | fn truncate(s: &str, max: usize) -> String { function format_count (line 622) | fn format_count(n: u64) -> String { FILE: crates/openfang-cli/src/tui/screens/templates.rs type TemplateInfo (line 14) | pub struct TemplateInfo { type ProviderAuth (line 23) | pub struct ProviderAuth { constant BUILTIN_TEMPLATES (line 30) | const BUILTIN_TEMPLATES: &[(&str, &str, &str, &str, &str)] = &[ constant CATEGORIES (line 105) | const CATEGORIES: &[&str] = &[ type TemplatesState (line 116) | pub struct TemplatesState { method new (line 134) | pub fn new() -> Self { method tick (line 160) | pub fn tick(&mut self) { method refilter (line 164) | fn refilter(&mut self) { method provider_configured (line 184) | fn provider_configured(&self, provider: &str) -> bool { method handle_key (line 190) | pub fn handle_key(&mut self, key: KeyEvent) -> TemplatesAction { type TemplatesAction (line 127) | pub enum TemplatesAction { function draw (line 239) | pub fn draw(f: &mut Frame, area: Rect, state: &mut TemplatesState) { function truncate (line 398) | fn truncate(s: &str, max: usize) -> String { FILE: crates/openfang-cli/src/tui/screens/triggers.rs type TriggerInfo (line 14) | pub struct TriggerInfo { constant PATTERN_TYPES (line 22) | const PATTERN_TYPES: &[(&str, &str)] = &[ type TriggerSubScreen (line 34) | pub enum TriggerSubScreen { type TriggerState (line 39) | pub struct TriggerState { method new (line 70) | pub fn new() -> Self { method tick (line 88) | pub fn tick(&mut self) { method handle_key (line 92) | pub fn handle_key(&mut self, key: KeyEvent) -> TriggerAction { method handle_list (line 102) | fn handle_list(&mut self, key: KeyEvent) -> TriggerAction { method handle_create (line 144) | fn handle_create(&mut self, key: KeyEvent) -> TriggerAction { method handle_pattern_picker (line 195) | fn handle_pattern_picker(&mut self, key: KeyEvent) -> TriggerAction { method handle_review (line 225) | fn handle_review(&mut self, key: KeyEvent) -> TriggerAction { type TriggerAction (line 56) | pub enum TriggerAction { function draw (line 253) | pub fn draw(f: &mut Frame, area: Rect, state: &mut TriggerState) { function draw_list (line 272) | fn draw_list(f: &mut Frame, area: Rect, state: &mut TriggerState) { function draw_create (line 363) | fn draw_create(f: &mut Frame, area: Rect, state: &mut TriggerState) { function draw_text_field (line 452) | fn draw_text_field(f: &mut Frame, area: Rect, label: &str, value: &str, ... function draw_pattern_picker (line 486) | fn draw_pattern_picker(f: &mut Frame, area: Rect, state: &mut TriggerSta... function draw_trigger_review (line 510) | fn draw_trigger_review(f: &mut Frame, area: Rect, state: &TriggerState) { function truncate (line 548) | fn truncate(s: &str, max: usize) -> String { FILE: crates/openfang-cli/src/tui/screens/usage.rs type UsageSummary (line 14) | pub struct UsageSummary { type ModelUsage (line 22) | pub struct ModelUsage { type AgentUsage (line 32) | pub struct AgentUsage { type UsageSub (line 43) | pub enum UsageSub { type UsageState (line 49) | pub struct UsageState { method new (line 66) | pub fn new() -> Self { method tick (line 79) | pub fn tick(&mut self) { method handle_key (line 83) | pub fn handle_key(&mut self, key: KeyEvent) -> UsageAction { type UsageAction (line 60) | pub enum UsageAction { function draw (line 160) | pub fn draw(f: &mut Frame, area: Rect, state: &mut UsageState) { function draw_sub_tabs (line 205) | fn draw_sub_tabs(f: &mut Frame, area: Rect, active: UsageSub) { function draw_summary (line 224) | fn draw_summary(f: &mut Frame, area: Rect, state: &UsageState) { function draw_stat_card (line 275) | fn draw_stat_card( function draw_by_model (line 300) | fn draw_by_model(f: &mut Frame, area: Rect, state: &mut UsageState) { function draw_by_agent (line 366) | fn draw_by_agent(f: &mut Frame, area: Rect, state: &mut UsageState) { function format_tokens (line 428) | fn format_tokens(n: u64) -> String { function truncate (line 438) | fn truncate(s: &str, max: usize) -> String { FILE: crates/openfang-cli/src/tui/screens/welcome.rs constant LOGO (line 14) | const LOGO: &str = "\ constant LOGO_HEIGHT (line 22) | const LOGO_HEIGHT: u16 = 6; constant LOGO_MIN_WIDTH (line 24) | const LOGO_MIN_WIDTH: u16 = 75; constant COMPACT_LOGO (line 26) | const COMPACT_LOGO: &str = "O P E N F A N G"; constant PROVIDER_ENV_VARS (line 31) | const PROVIDER_ENV_VARS: &[(&str, &str)] = &[ function detect_provider (line 48) | fn detect_provider() -> Option<(&'static str, &'static str)> { type WelcomeState (line 60) | pub struct WelcomeState { constant CTRL_C_TIMEOUT (line 93) | const CTRL_C_TIMEOUT: usize = 40; method new (line 95) | pub fn new() -> Self { method on_daemon_detected (line 110) | pub fn on_daemon_detected(&mut self, url: Option, agent_count:... method rebuild_menu (line 117) | fn rebuild_menu(&mut self) { method tick (line 144) | pub fn tick(&mut self) { method handle_key (line 153) | pub fn handle_key(&mut self, key: KeyEvent) -> Option { type MenuItem (line 77) | pub struct MenuItem { type WelcomeAction (line 84) | pub enum WelcomeAction { function draw (line 217) | pub fn draw(f: &mut Frame, area: Rect, state: &mut WelcomeState) { FILE: crates/openfang-cli/src/tui/screens/wizard.rs type ProviderInfo (line 14) | struct ProviderInfo { constant PROVIDERS (line 21) | const PROVIDERS: &[ProviderInfo] = &[ function needs_setup (line 157) | pub fn needs_setup() -> bool { type WizardStep (line 170) | pub enum WizardStep { type WizardState (line 178) | pub struct WizardState { method new (line 191) | pub fn new() -> Self { method reset (line 208) | pub fn reset(&mut self) { method build_provider_order (line 220) | fn build_provider_order(&mut self) { method selected_provider_info (line 246) | fn selected_provider_info(&self) -> Option<&'static ProviderInfo> { method handle_key (line 252) | pub fn handle_key(&mut self, key: KeyEvent) -> WizardResult { method handle_provider (line 265) | fn handle_provider(&mut self, key: KeyEvent) -> WizardResult { method handle_api_key (line 314) | fn handle_api_key(&mut self, key: KeyEvent) -> WizardResult { method handle_model (line 338) | fn handle_model(&mut self, key: KeyEvent) -> WizardResult { method save_config (line 367) | fn save_config(&mut self) { type WizardResult (line 440) | pub enum WizardResult { function draw (line 446) | pub fn draw(f: &mut Frame, area: Rect, state: &mut WizardState) { function draw_provider (line 511) | fn draw_provider(f: &mut Frame, area: Rect, state: &mut WizardState) { function draw_api_key (line 565) | fn draw_api_key(f: &mut Frame, area: Rect, state: &mut WizardState) { function draw_model (line 613) | fn draw_model(f: &mut Frame, area: Rect, state: &mut WizardState) { function draw_done (line 661) | fn draw_done(f: &mut Frame, area: Rect, state: &WizardState) { FILE: crates/openfang-cli/src/tui/screens/workflows.rs type WorkflowInfo (line 14) | pub struct WorkflowInfo { type WorkflowRun (line 22) | pub struct WorkflowRun { type WorkflowSubScreen (line 32) | pub enum WorkflowSubScreen { type WorkflowState (line 40) | pub struct WorkflowState { method new (line 77) | pub fn new() -> Self { method tick (line 97) | pub fn tick(&mut self) { method handle_key (line 101) | pub fn handle_key(&mut self, key: KeyEvent) -> WorkflowAction { method handle_list (line 114) | fn handle_list(&mut self, key: KeyEvent) -> WorkflowAction { method handle_runs (line 161) | fn handle_runs(&mut self, key: KeyEvent) -> WorkflowAction { method handle_create (line 194) | fn handle_create(&mut self, key: KeyEvent) -> WorkflowAction { method handle_run_input (line 240) | fn handle_run_input(&mut self, key: KeyEvent) -> WorkflowAction { method handle_run_result (line 267) | fn handle_run_result(&mut self, key: KeyEvent) -> WorkflowAction { type WorkflowAction (line 61) | pub enum WorkflowAction { function draw (line 281) | pub fn draw(f: &mut Frame, area: Rect, state: &mut WorkflowState) { function draw_list (line 303) | fn draw_list(f: &mut Frame, area: Rect, state: &mut WorkflowState) { function draw_runs (line 371) | fn draw_runs(f: &mut Frame, area: Rect, state: &mut WorkflowState) { function draw_create (line 452) | fn draw_create(f: &mut Frame, area: Rect, state: &WorkflowState) { function draw_run_input (line 567) | fn draw_run_input(f: &mut Frame, area: Rect, state: &WorkflowState) { function draw_run_result (line 638) | fn draw_run_result(f: &mut Frame, area: Rect, state: &WorkflowState) { function truncate (line 696) | fn truncate(s: &str, max: usize) -> String { FILE: crates/openfang-cli/src/tui/theme.rs constant ACCENT (line 11) | pub const ACCENT: Color = Color::Rgb(255, 92, 0); constant ACCENT_DIM (line 12) | pub const ACCENT_DIM: Color = Color::Rgb(224, 82, 0); constant BG_PRIMARY (line 14) | pub const BG_PRIMARY: Color = Color::Rgb(15, 14, 14); constant BG_CARD (line 15) | pub const BG_CARD: Color = Color::Rgb(31, 29, 28); constant BG_HOVER (line 16) | pub const BG_HOVER: Color = Color::Rgb(42, 39, 37); constant BG_CODE (line 17) | pub const BG_CODE: Color = Color::Rgb(24, 22, 21); constant TEXT_PRIMARY (line 19) | pub const TEXT_PRIMARY: Color = Color::Rgb(240, 239, 238); constant TEXT_SECONDARY (line 20) | pub const TEXT_SECONDARY: Color = Color::Rgb(168, 162, 158); constant TEXT_TERTIARY (line 21) | pub const TEXT_TERTIARY: Color = Color::Rgb(120, 113, 108); constant BORDER (line 23) | pub const BORDER: Color = Color::Rgb(63, 59, 56); constant GREEN (line 27) | pub const GREEN: Color = Color::Rgb(34, 197, 94); constant BLUE (line 28) | pub const BLUE: Color = Color::Rgb(59, 130, 246); constant YELLOW (line 29) | pub const YELLOW: Color = Color::Rgb(234, 179, 8); constant RED (line 30) | pub const RED: Color = Color::Rgb(239, 68, 68); constant PURPLE (line 31) | pub const PURPLE: Color = Color::Rgb(168, 85, 247); constant CYAN (line 35) | pub const CYAN: Color = BLUE; constant DIM (line 36) | pub const DIM: Color = TEXT_SECONDARY; constant TEXT (line 37) | pub const TEXT: Color = TEXT_PRIMARY; function title_style (line 41) | pub fn title_style() -> Style { function selected_style (line 45) | pub fn selected_style() -> Style { function dim_style (line 49) | pub fn dim_style() -> Style { function input_style (line 53) | pub fn input_style() -> Style { function hint_style (line 57) | pub fn hint_style() -> Style { function tab_active (line 63) | pub fn tab_active() -> Style { function tab_inactive (line 70) | pub fn tab_inactive() -> Style { function badge_running (line 76) | pub fn badge_running() -> Style { function badge_created (line 80) | pub fn badge_created() -> Style { function badge_suspended (line 84) | pub fn badge_suspended() -> Style { function badge_terminated (line 88) | pub fn badge_terminated() -> Style { function badge_crashed (line 92) | pub fn badge_crashed() -> Style { function state_badge (line 97) | pub fn state_badge(state: &str) -> (&'static str, Style) { function table_header (line 116) | pub fn table_header() -> Style { function channel_ready (line 122) | pub fn channel_ready() -> Style { function channel_missing (line 126) | pub fn channel_missing() -> Style { function channel_off (line 130) | pub fn channel_off() -> Style { constant SPINNER_FRAMES (line 136) | pub const SPINNER_FRAMES: &[&str] = &[ FILE: crates/openfang-cli/src/ui.rs function check_ok (line 12) | pub fn check_ok(msg: &str) { function check_warn (line 17) | pub fn check_warn(msg: &str) { function check_fail (line 22) | pub fn check_fail(msg: &str) { function step (line 27) | pub fn step(msg: &str) { function success (line 32) | pub fn success(msg: &str) { function error (line 37) | pub fn error(msg: &str) { function banner (line 46) | pub fn banner() { function section (line 56) | pub fn section(title: &str) { function kv (line 61) | pub fn kv(label: &str, value: &str) { function kv_ok (line 66) | pub fn kv_ok(label: &str, value: &str) { function kv_warn (line 71) | pub fn kv_warn(label: &str, value: &str) { function hint (line 76) | pub fn hint(msg: &str) { function next_steps (line 81) | pub fn next_steps(steps: &[&str]) { function suggest_cmd (line 89) | pub fn suggest_cmd(label: &str, cmd: &str) { function error_with_fix (line 94) | pub fn error_with_fix(msg: &str, fix: &str) { function warn_with_fix (line 100) | pub fn warn_with_fix(msg: &str, fix: &str) { function provider_status (line 106) | pub fn provider_status(name: &str, env_var: &str, configured: bool) { function blank (line 120) | pub fn blank() { FILE: crates/openfang-desktop/build.rs function main (line 1) | fn main() { FILE: crates/openfang-desktop/src/commands.rs function get_port (line 11) | pub fn get_port(port: tauri::State<'_, PortState>) -> u16 { function get_status (line 17) | pub fn get_status( function get_agent_count (line 34) | pub fn get_agent_count(kernel_state: tauri::State<'_, KernelState>) -> u... function import_agent_toml (line 43) | pub fn import_agent_toml( function import_skill_file (line 87) | pub fn import_skill_file( function get_autostart (line 125) | pub fn get_autostart(app: tauri::AppHandle) -> Result { function set_autostart (line 131) | pub fn set_autostart(app: tauri::AppHandle, enabled: bool) -> Result Result<(), String> { function open_config_dir (line 159) | pub fn open_config_dir() -> Result<(), String> { function open_logs_dir (line 167) | pub fn open_logs_dir() -> Result<(), String> { FILE: crates/openfang-desktop/src/lib.rs type PortState (line 22) | pub struct PortState(pub u16); type KernelState (line 25) | pub struct KernelState { function run (line 32) | pub fn run() { FILE: crates/openfang-desktop/src/main.rs function main (line 4) | fn main() { FILE: crates/openfang-desktop/src/server.rs type ServerHandle (line 15) | pub struct ServerHandle { method shutdown (line 30) | pub fn shutdown(mut self) { method drop (line 48) | fn drop(&mut self) { function start_server (line 66) | pub fn start_server() -> Result> { function run_embedded_server (line 115) | async fn run_embedded_server( function load_dotenv_files (line 156) | fn load_dotenv_files() { FILE: crates/openfang-desktop/src/shortcuts.rs function build_shortcut_plugin (line 14) | pub fn build_shortcut_plugin( FILE: crates/openfang-desktop/src/tray.rs function format_uptime (line 14) | fn format_uptime(secs: u64) -> String { function setup_tray (line 29) | pub fn setup_tray(app: &tauri::App) -> Result<(), Box Result Result Vec<(&'static str, &'static str)> { function bundled_count (line 73) | fn bundled_count() { function all_bundled_parse (line 78) | fn all_bundled_parse() { function category_counts (line 89) | fn category_counts() { function no_duplicate_ids (line 127) | fn no_duplicate_ids() { function all_have_transport (line 136) | fn all_have_transport() { function oauth_integrations (line 154) | fn oauth_integrations() { FILE: crates/openfang-extensions/src/credentials.rs type CredentialResolver (line 17) | pub struct CredentialResolver { method new (line 28) | pub fn new(vault: Option, dotenv_path: Option<&Path>)... method with_interactive (line 42) | pub fn with_interactive(mut self, interactive: bool) -> Self { method resolve (line 48) | pub fn resolve(&self, key: &str) -> Option> { method has_credential (line 83) | pub fn has_credential(&self, key: &str) -> bool { method resolve_all (line 100) | pub fn resolve_all(&self, keys: &[&str]) -> HashMap Vec { method store_in_vault (line 119) | pub fn store_in_vault(&mut self, key: &str, value: Zeroizing) ... method clear_dotenv_cache (line 133) | pub fn clear_dotenv_cache(&mut self, key: &str) { method remove_from_vault (line 138) | pub fn remove_from_vault(&mut self, key: &str) -> ExtensionResult { function load_dotenv (line 150) | fn load_dotenv(path: &Path) -> Result, std::io::... function prompt_secret (line 177) | fn prompt_secret(key: &str) -> Option> { function load_dotenv_basic (line 198) | fn load_dotenv_basic() { function load_dotenv_nonexistent (line 221) | fn load_dotenv_nonexistent() { function resolver_env_var (line 227) | fn resolver_env_var() { function resolver_dotenv_overrides_env (line 237) | fn resolver_dotenv_overrides_env() { function resolver_missing_credentials (line 252) | fn resolver_missing_credentials() { function resolver_resolve_all (line 259) | fn resolver_resolve_all() { FILE: crates/openfang-extensions/src/health.rs type IntegrationHealth (line 15) | pub struct IntegrationHealth { method new (line 38) | pub fn new(id: String) -> Self { method mark_ok (line 53) | pub fn mark_ok(&mut self, tool_count: usize) { method mark_error (line 67) | pub fn mark_error(&mut self, error: String) { method mark_reconnecting (line 75) | pub fn mark_reconnecting(&mut self) { type HealthMonitorConfig (line 83) | pub struct HealthMonitorConfig { method default (line 95) | fn default() -> Self { type HealthMonitor (line 106) | pub struct HealthMonitor { method new (line 115) | pub fn new(config: HealthMonitorConfig) -> Self { method register (line 123) | pub fn register(&self, id: &str) { method unregister (line 130) | pub fn unregister(&self, id: &str) { method report_ok (line 135) | pub fn report_ok(&self, id: &str, tool_count: usize) { method report_error (line 142) | pub fn report_error(&self, id: &str, error: String) { method get_health (line 149) | pub fn get_health(&self, id: &str) -> Option { method all_health (line 154) | pub fn all_health(&self) -> Vec { method backoff_duration (line 159) | pub fn backoff_duration(&self, attempt: u32) -> Duration { method should_reconnect (line 166) | pub fn should_reconnect(&self, id: &str) -> bool { method mark_reconnecting (line 179) | pub fn mark_reconnecting(&self, id: &str) { method health_map (line 186) | pub fn health_map(&self) -> Arc> { method config (line 191) | pub fn config(&self) -> &HealthMonitorConfig { function health_monitor_register_report (line 201) | fn health_monitor_register_report() { function health_monitor_error_tracking (line 218) | fn health_monitor_error_tracking() { function backoff_exponential (line 239) | fn backoff_exponential() { function should_reconnect_logic (line 251) | fn should_reconnect_logic() { function health_unregister (line 274) | fn health_unregister() { function all_health (line 283) | fn all_health() { function auto_reconnect_disabled (line 293) | fn auto_reconnect_disabled() { FILE: crates/openfang-extensions/src/installer.rs type InstallResult (line 16) | pub struct InstallResult { function install_integration (line 36) | pub fn install_integration( function remove_integration (line 133) | pub fn remove_integration(registry: &mut IntegrationRegistry, id: &str) ... function list_integrations (line 146) | pub fn list_integrations( type IntegrationListEntry (line 185) | pub struct IntegrationListEntry { function search_integrations (line 195) | pub fn search_integrations( function scaffold_integration (line 222) | pub fn scaffold_integration(dir: &std::path::Path) -> ExtensionResult ExtensionResult { function install_and_remove (line 298) | fn install_and_remove() { function install_with_key (line 321) | fn install_with_key() { function install_already_installed (line 337) | fn install_already_installed() { function remove_not_installed (line 351) | fn remove_not_installed() { function list_integrations_all (line 360) | fn list_integrations_all() { function search_integrations_query (line 374) | fn search_integrations_query() { function scaffold_integration_creates_files (line 385) | fn scaffold_integration_creates_files() { function scaffold_skill_creates_files (line 394) | fn scaffold_skill_creates_files() { FILE: crates/openfang-extensions/src/lib.rs type ExtensionError (line 25) | pub enum ExtensionError { type ExtensionResult (line 50) | pub type ExtensionResult = Result; type IntegrationCategory (line 57) | pub enum IntegrationCategory { method fmt (line 67) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { type McpTransportTemplate (line 82) | pub enum McpTransportTemplate { type RequiredEnvVar (line 95) | pub struct RequiredEnvVar { function default_true (line 110) | fn default_true() -> bool { type OAuthTemplate (line 116) | pub struct OAuthTemplate { type HealthCheckConfig (line 130) | pub struct HealthCheckConfig { method default (line 138) | fn default() -> Self { type IntegrationTemplate (line 148) | pub struct IntegrationTemplate { type IntegrationStatus (line 182) | pub enum IntegrationStatus { method fmt (line 196) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { type InstalledIntegration (line 209) | pub struct InstalledIntegration { type IntegrationsFile (line 227) | pub struct IntegrationsFile { type IntegrationInfo (line 234) | pub struct IntegrationInfo { function category_display (line 246) | fn category_display() { function status_display (line 256) | fn status_display() { function integration_template_roundtrip (line 266) | fn integration_template_roundtrip() { function installed_integration_roundtrip (line 301) | fn installed_integration_roundtrip() { function error_display (line 322) | fn error_display() { FILE: crates/openfang-extensions/src/oauth.rs function default_client_ids (line 19) | pub fn default_client_ids() -> HashMap<&'static str, &'static str> { function resolve_client_ids (line 30) | pub fn resolve_client_ids(config: &openfang_types::config::OAuthConfig) ... type OAuthTokens (line 55) | pub struct OAuthTokens { method access_token_zeroizing (line 74) | pub fn access_token_zeroizing(&self) -> Zeroizing { method refresh_token_zeroizing (line 79) | pub fn refresh_token_zeroizing(&self) -> Option> { type PkcePair (line 87) | struct PkcePair { function generate_pkce (line 93) | fn generate_pkce() -> PkcePair { function base64_url_encode (line 110) | fn base64_url_encode(data: &[u8]) -> String { function generate_state (line 115) | fn generate_state() -> String { function run_pkce_flow (line 128) | pub async fn run_pkce_flow(oauth: &OAuthTemplate, client_id: &str) -> Ex... type CallbackParams (line 262) | struct CallbackParams { function urlencoding_encode (line 272) | fn urlencoding_encode(s: &str) -> String { function open_browser (line 289) | fn open_browser(url: &str) -> Result<(), String> { function pkce_generation (line 319) | fn pkce_generation() { function pkce_challenge_is_sha256 (line 328) | fn pkce_challenge_is_sha256() { function state_randomness (line 339) | fn state_randomness() { function urlencoding_basic (line 346) | fn urlencoding_basic() { function default_client_ids_populated (line 353) | fn default_client_ids_populated() { function resolve_client_ids_uses_defaults (line 362) | fn resolve_client_ids_uses_defaults() { function resolve_client_ids_applies_overrides (line 370) | fn resolve_client_ids_applies_overrides() { FILE: crates/openfang-extensions/src/registry.rs type IntegrationRegistry (line 17) | pub struct IntegrationRegistry { method new (line 28) | pub fn new(home_dir: &Path) -> Self { method load_bundled (line 37) | pub fn load_bundled(&mut self) -> usize { method load_installed (line 55) | pub fn load_installed(&mut self) -> ExtensionResult { method save_installed (line 71) | pub fn save_installed(&self) -> ExtensionResult<()> { method get_template (line 85) | pub fn get_template(&self, id: &str) -> Option<&IntegrationTemplate> { method get_installed (line 90) | pub fn get_installed(&self, id: &str) -> Option<&InstalledIntegration> { method is_installed (line 95) | pub fn is_installed(&self, id: &str) -> bool { method install (line 100) | pub fn install(&mut self, entry: InstalledIntegration) -> ExtensionRes... method uninstall (line 109) | pub fn uninstall(&mut self, id: &str) -> ExtensionResult<()> { method set_enabled (line 117) | pub fn set_enabled(&mut self, id: &str, enabled: bool) -> ExtensionRes... method list_templates (line 127) | pub fn list_templates(&self) -> Vec<&IntegrationTemplate> { method list_by_category (line 134) | pub fn list_by_category(&self, category: &IntegrationCategory) -> Vec<... method search (line 142) | pub fn search(&self, query: &str) -> Vec<&IntegrationTemplate> { method list_all_info (line 156) | pub fn list_all_info(&self) -> Vec { method to_mcp_configs (line 178) | pub fn to_mcp_configs(&self) -> Vec { method integrations_path (line 211) | pub fn integrations_path(&self) -> &Path { method template_count (line 216) | pub fn template_count(&self) -> usize { method installed_count (line 221) | pub fn installed_count(&self) -> usize { function registry_load_bundled (line 231) | fn registry_load_bundled() { function registry_get_template (line 240) | fn registry_get_template() { function registry_search (line 250) | fn registry_search() { function registry_install_uninstall (line 259) | fn registry_install_uninstall() { function registry_to_mcp_configs (line 290) | fn registry_to_mcp_configs() { function registry_save_load_roundtrip (line 310) | fn registry_save_load_roundtrip() { function registry_list_by_category (line 333) | fn registry_list_by_category() { function registry_set_enabled (line 342) | fn registry_set_enabled() { FILE: crates/openfang-extensions/src/vault.rs constant KEYRING_SERVICE (line 23) | const KEYRING_SERVICE: &str = "openfang-vault"; constant KEYRING_USER (line 26) | const KEYRING_USER: &str = "master-key"; constant VAULT_KEY_ENV (line 28) | const VAULT_KEY_ENV: &str = "OPENFANG_VAULT_KEY"; constant SALT_LEN (line 30) | const SALT_LEN: usize = 16; constant NONCE_LEN (line 32) | const NONCE_LEN: usize = 12; constant VAULT_MAGIC (line 34) | const VAULT_MAGIC: &[u8; 4] = b"OFV1"; type VaultFile (line 38) | struct VaultFile { type VaultEntries (line 51) | struct VaultEntries { type CredentialVault (line 56) | pub struct CredentialVault { method new (line 69) | pub fn new(vault_path: PathBuf) -> Self { method init (line 79) | pub fn init(&mut self) -> ExtensionResult<()> { method unlock (line 133) | pub fn unlock(&mut self) -> ExtensionResult<()> { method get (line 152) | pub fn get(&self, key: &str) -> Option> { method set (line 157) | pub fn set(&mut self, key: String, value: Zeroizing) -> Extens... method remove (line 167) | pub fn remove(&mut self, key: &str) -> ExtensionResult { method list_keys (line 180) | pub fn list_keys(&self) -> Vec<&str> { method exists (line 185) | pub fn exists(&self) -> bool { method is_unlocked (line 190) | pub fn is_unlocked(&self) -> bool { method init_with_key (line 195) | pub fn init_with_key(&mut self, master_key: Zeroizing<[u8; 32]>) -> Ex... method unlock_with_key (line 213) | pub fn unlock_with_key(&mut self, master_key: Zeroizing<[u8; 32]>) -> ... method len (line 233) | pub fn len(&self) -> usize { method is_empty (line 238) | pub fn is_empty(&self) -> bool { method resolve_master_key (line 245) | fn resolve_master_key(&self) -> ExtensionResult> { method save (line 266) | fn save(&self, master_key: &[u8; 32]) -> ExtensionResult<()> { method load (line 324) | fn load(&mut self, master_key: &[u8; 32]) -> ExtensionResult<()> { method drop (line 391) | fn drop(&mut self) { function derive_key (line 401) | fn derive_key(master_key: &[u8; 32], salt: &[u8]) -> ExtensionResult ExtensionResult Result<(), String> { function load_keyring_key (line 466) | fn load_keyring_key() -> Result, String> { function machine_fingerprint (line 503) | fn machine_fingerprint() -> Vec { function test_vault (line 521) | fn test_vault() -> (tempfile::TempDir, CredentialVault) { function random_key (line 529) | fn random_key() -> Zeroizing<[u8; 32]> { function vault_init_and_roundtrip (line 536) | fn vault_init_and_roundtrip() { function vault_list_keys (line 571) | fn vault_list_keys() { function vault_wrong_key_fails (line 589) | fn vault_wrong_key_fails() { function derive_key_deterministic (line 605) | fn derive_key_deterministic() { function vault_file_has_magic_header (line 614) | fn vault_file_has_magic_header() { function vault_legacy_json_compat (line 624) | fn vault_legacy_json_compat() { function vault_rejects_bad_magic (line 644) | fn vault_rejects_bad_magic() { FILE: crates/openfang-hands/src/bundled.rs function bundled_hands (line 6) | pub fn bundled_hands() -> Vec<(&'static str, &'static str, &'static str)> { function parse_bundled (line 52) | pub fn parse_bundled( function bundled_hands_not_empty (line 70) | fn bundled_hands_not_empty() { function bundled_hands_count (line 77) | fn bundled_hands_count() { function parse_clip_hand (line 83) | fn parse_clip_hand() { function parse_lead_hand (line 98) | fn parse_lead_hand() { function parse_collector_hand (line 116) | fn parse_collector_hand() { function parse_predictor_hand (line 133) | fn parse_predictor_hand() { function parse_researcher_hand (line 150) | fn parse_researcher_hand() { function parse_twitter_hand (line 168) | fn parse_twitter_hand() { function parse_browser_hand (line 185) | fn parse_browser_hand() { function parse_trader_hand (line 210) | fn parse_trader_hand() { function all_bundled_hands_parse (line 230) | fn all_bundled_hands_parse() { function all_einstein_hands_have_schedules (line 243) | fn all_einstein_hands_have_schedules() { function all_einstein_hands_have_memory (line 275) | fn all_einstein_hands_have_memory() { function all_einstein_hands_have_knowledge_graph (line 302) | fn all_einstein_hands_have_knowledge_graph() { FILE: crates/openfang-hands/src/lib.rs type HandError (line 19) | pub enum HandError { type HandResult (line 36) | pub type HandResult = Result; type HandCategory (line 43) | pub enum HandCategory { method fmt (line 56) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { type RequirementType (line 73) | pub enum RequirementType { type HandInstallInfo (line 84) | pub struct HandInstallInfo { type HandRequirement (line 113) | pub struct HandRequirement { type HandMetric (line 139) | pub struct HandMetric { function default_format (line 149) | fn default_format() -> String { type HandSettingType (line 158) | pub enum HandSettingType { type HandSettingOption (line 166) | pub struct HandSettingOption { type HandSetting (line 179) | pub struct HandSetting { type ResolvedSettings (line 196) | pub struct ResolvedSettings { function resolve_settings (line 209) | pub fn resolve_settings( type HandDashboard (line 270) | pub struct HandDashboard { type HandAgentConfig (line 276) | pub struct HandAgentConfig { function default_module (line 298) | fn default_module() -> String { function default_provider (line 301) | fn default_provider() -> String { function default_model (line 304) | fn default_model() -> String { function default_max_tokens (line 307) | fn default_max_tokens() -> u32 { function default_temperature (line 310) | fn default_temperature() -> f32 { type HandTomlWrapper (line 315) | struct HandTomlWrapper { function parse_hand_toml (line 320) | pub fn parse_hand_toml(content: &str) -> Result) -> std::fmt::Result { type HandInstance (line 389) | pub struct HandInstance { method new (line 410) | pub fn new( type ActivateHandRequest (line 431) | pub struct ActivateHandRequest { function hand_category_display (line 442) | fn hand_category_display() { function hand_status_display (line 449) | fn hand_status_display() { function hand_instance_new (line 459) | fn hand_instance_new() { function hand_error_display (line 468) | fn hand_error_display() { function hand_definition_roundtrip (line 477) | fn hand_definition_roundtrip() { function hand_definition_with_settings (line 508) | fn hand_definition_with_settings() { function resolve_settings_with_config (line 561) | fn resolve_settings_with_config() { function resolve_settings_defaults (line 601) | fn resolve_settings_defaults() { function resolve_settings_toggle_and_text (line 635) | fn resolve_settings_toggle_and_text() { function hand_requirement_with_install_info (line 666) | fn hand_requirement_with_install_info() { function hand_requirement_without_install_info_backward_compat (line 734) | fn hand_requirement_without_install_info_backward_compat() { function api_key_requirement_with_steps (line 763) | fn api_key_requirement_with_steps() { function parse_hand_toml_flat_format (line 822) | fn parse_hand_toml_flat_format() { function parse_hand_toml_wrapped_format (line 844) | fn parse_hand_toml_wrapped_format() { FILE: crates/openfang-hands/src/registry.rs type SettingOptionStatus (line 19) | pub struct SettingOptionStatus { type SettingStatus (line 29) | pub struct SettingStatus { type HandRegistry (line 39) | pub struct HandRegistry { method new (line 48) | pub fn new() -> Self { method persist_state (line 56) | pub fn persist_state(&self, path: &std::path::Path) -> HandResult<()> { method load_state (line 80) | pub fn load_state( method load_bundled (line 109) | pub fn load_bundled(&self) -> usize { method install_from_path (line 128) | pub fn install_from_path(&self, path: &std::path::Path) -> HandResult<... method install_from_content (line 152) | pub fn install_from_content( method upsert_from_content (line 176) | pub fn upsert_from_content( method list_definitions (line 190) | pub fn list_definitions(&self) -> Vec { method get_definition (line 198) | pub fn get_definition(&self, hand_id: &str) -> Option { method activate (line 203) | pub fn activate( method deactivate (line 228) | pub fn deactivate(&self, instance_id: Uuid) -> HandResult { method pause (line 238) | pub fn pause(&self, instance_id: Uuid) -> HandResult<()> { method resume (line 249) | pub fn resume(&self, instance_id: Uuid) -> HandResult<()> { method set_agent (line 260) | pub fn set_agent(&self, instance_id: Uuid, agent_id: AgentId) -> HandR... method find_by_agent (line 271) | pub fn find_by_agent(&self, agent_id: AgentId) -> Option { method list_instances (line 281) | pub fn list_instances(&self) -> Vec { method get_instance (line 286) | pub fn get_instance(&self, instance_id: Uuid) -> Option { method check_requirements (line 291) | pub fn check_requirements(&self, hand_id: &str) -> HandResult HandResult... method update_config (line 350) | pub fn update_config( method set_error (line 365) | pub fn set_error(&self, instance_id: Uuid, message: String) -> HandRes... method readiness (line 379) | pub fn readiness(&self, hand_id: &str) -> Option { type HandReadiness (line 406) | pub struct HandReadiness { method default (line 418) | fn default() -> Self { function check_requirement (line 424) | fn check_requirement(req: &HandRequirement) -> bool { function check_python3_available (line 455) | fn check_python3_available() -> bool { function run_returns_python3 (line 468) | fn run_returns_python3(cmd: &str) -> bool { function check_chromium_available (line 496) | fn check_chromium_available() -> bool { function which_binary (line 579) | fn which_binary(name: &str) -> bool { function check_option_available (line 604) | fn check_option_available(provider_env: Option<&str>, binary: Option<&st... function new_registry_is_empty (line 635) | fn new_registry_is_empty() { function load_bundled_hands (line 642) | fn load_bundled_hands() { function activate_and_deactivate (line 666) | fn activate_and_deactivate() { function pause_and_resume (line 688) | fn pause_and_resume() { function set_agent (line 707) | fn set_agent() { function check_requirements (line 725) | fn check_requirements() { function not_found_errors (line 739) | fn not_found_errors() { function set_error_status (line 750) | fn set_error_status() { function which_binary_finds_common (line 768) | fn which_binary_finds_common() { function env_var_requirement_check (line 777) | fn env_var_requirement_check() { function readiness_nonexistent_hand (line 804) | fn readiness_nonexistent_hand() { function readiness_inactive_hand (line 810) | fn readiness_inactive_hand() { function readiness_active_hand_all_met (line 822) | fn readiness_active_hand_all_met() { function readiness_active_hand_degraded (line 837) | fn readiness_active_hand_degraded() { function readiness_paused_hand_not_active (line 858) | fn readiness_paused_hand_not_active() { function optional_field_defaults_false (line 873) | fn optional_field_defaults_false() { FILE: crates/openfang-kernel/src/approval.rs constant MAX_PENDING_PER_AGENT (line 13) | const MAX_PENDING_PER_AGENT: usize = 5; constant MAX_RECENT_APPROVALS (line 15) | const MAX_RECENT_APPROVALS: usize = 100; type ApprovalManager (line 18) | pub struct ApprovalManager { method new (line 38) | pub fn new(policy: ApprovalPolicy) -> Self { method requires_approval (line 47) | pub fn requires_approval(&self, tool_name: &str) -> bool { method request_approval (line 53) | pub async fn request_approval(&self, req: ApprovalRequest) -> Approval... method resolve (line 99) | pub fn resolve( method list_pending (line 129) | pub fn list_pending(&self) -> Vec { method list_recent (line 137) | pub fn list_recent(&self, limit: usize) -> Vec { method pending_count (line 143) | pub fn pending_count(&self) -> usize { method update_policy (line 148) | pub fn update_policy(&self, policy: ApprovalPolicy) { method policy (line 153) | pub fn policy(&self) -> ApprovalPolicy { method classify_risk (line 161) | pub fn classify_risk(tool_name: &str) -> RiskLevel { method push_recent (line 170) | fn push_recent( type PendingRequest (line 24) | struct PendingRequest { type ApprovalRecord (line 30) | pub struct ApprovalRecord { function default_manager (line 200) | fn default_manager() -> ApprovalManager { function make_request (line 204) | fn make_request(agent_id: &str, tool_name: &str, timeout_secs: u64) -> A... function test_requires_approval_default (line 222) | fn test_requires_approval_default() { function test_requires_approval_custom_policy (line 229) | fn test_requires_approval_custom_policy() { function test_classify_risk (line 248) | fn test_classify_risk() { function test_resolve_nonexistent (line 281) | fn test_resolve_nonexistent() { function test_list_pending_empty (line 293) | fn test_list_pending_empty() { function test_update_policy (line 304) | fn test_update_policy() { function test_pending_count (line 330) | fn test_pending_count() { function test_request_approval_timeout (line 340) | async fn test_request_approval_timeout() { function test_request_approval_approve (line 358) | async fn test_request_approval_approve() { function test_request_approval_deny (line 391) | async fn test_request_approval_deny() { function test_max_pending_per_agent (line 415) | async fn test_max_pending_per_agent() { function test_policy_defaults (line 460) | fn test_policy_defaults() { FILE: crates/openfang-kernel/src/auth.rs type UserRole (line 15) | pub enum UserRole { method fmt (line 27) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { method from_str_role (line 39) | pub fn from_str_role(s: &str) -> Self { type Action (line 51) | pub enum Action { method required_role (line 72) | fn required_role(&self) -> UserRole { type UserIdentity (line 88) | pub struct UserIdentity { type AuthManager (line 98) | pub struct AuthManager { method new (line 107) | pub fn new(user_configs: &[UserConfig]) -> Self { method identify (line 145) | pub fn identify(&self, channel_type: &str, platform_id: &str) -> Optio... method get_user (line 151) | pub fn get_user(&self, user_id: UserId) -> Option { method authorize (line 158) | pub fn authorize(&self, user_id: UserId, action: &Action) -> OpenFangR... method is_enabled (line 176) | pub fn is_enabled(&self) -> bool { method user_count (line 181) | pub fn user_count(&self) -> usize { method list_users (line 186) | pub fn list_users(&self) -> Vec { function test_configs (line 196) | fn test_configs() -> Vec { function test_user_registration (line 229) | fn test_user_registration() { function test_identify_from_channel (line 236) | fn test_identify_from_channel() { function test_owner_can_do_everything (line 255) | fn test_owner_can_do_everything() { function test_user_limited_access (line 267) | fn test_user_limited_access() { function test_viewer_read_only (line 282) | fn test_viewer_read_only() { function test_unknown_user_denied (line 294) | fn test_unknown_user_denied() { function test_no_users_means_disabled (line 301) | fn test_no_users_means_disabled() { function test_role_parsing (line 308) | fn test_role_parsing() { FILE: crates/openfang-kernel/src/auto_reply.rs type AutoReplyChannel (line 11) | pub struct AutoReplyChannel { type AutoReplyEngine (line 21) | pub struct AutoReplyEngine { method new (line 28) | pub fn new(config: AutoReplyConfig) -> Self { method should_reply (line 38) | pub fn should_reply( method execute_reply (line 64) | pub async fn execute_reply( method is_enabled (line 124) | pub fn is_enabled(&self) -> bool { method config (line 129) | pub fn config(&self) -> &AutoReplyConfig { method available_permits (line 134) | pub fn available_permits(&self) -> usize { function test_config (line 143) | fn test_config(enabled: bool) -> AutoReplyConfig { function test_disabled_engine (line 153) | fn test_disabled_engine() { function test_enabled_engine_allows (line 160) | fn test_enabled_engine_allows() { function test_suppression_patterns (line 168) | fn test_suppression_patterns() { function test_concurrency_limit (line 183) | fn test_concurrency_limit() { function test_is_enabled (line 195) | fn test_is_enabled() { function test_default_config (line 204) | fn test_default_config() { FILE: crates/openfang-kernel/src/background.rs constant MAX_CONCURRENT_BG_LLM (line 18) | const MAX_CONCURRENT_BG_LLM: usize = 5; type BackgroundExecutor (line 21) | pub struct BackgroundExecutor { method new (line 32) | pub fn new(shutdown_rx: watch::Receiver) -> Self { method start_agent (line 48) | pub fn start_agent( method stop_agent (line 189) | pub fn stop_agent(&self, agent_id: AgentId) { method active_count (line 197) | pub fn active_count(&self) -> usize { function parse_condition (line 211) | pub fn parse_condition(condition: &str) -> Option { function parse_cron_to_secs (line 254) | pub fn parse_cron_to_secs(cron: &str) -> u64 { function test_parse_cron_seconds (line 291) | fn test_parse_cron_seconds() { function test_parse_cron_minutes (line 297) | fn test_parse_cron_minutes() { function test_parse_cron_hours (line 303) | fn test_parse_cron_hours() { function test_parse_cron_days (line 309) | fn test_parse_cron_days() { function test_parse_cron_fallback (line 314) | fn test_parse_cron_fallback() { function test_parse_condition_events (line 321) | fn test_parse_condition_events() { function test_parse_condition_memory (line 345) | fn test_parse_condition_memory() { function test_parse_condition_all (line 355) | fn test_parse_condition_all() { function test_parse_condition_unknown (line 360) | fn test_parse_condition_unknown() { function test_continuous_shutdown (line 366) | async fn test_continuous_shutdown() { function test_skip_if_busy (line 402) | async fn test_skip_if_busy() { function test_executor_active_count (line 433) | fn test_executor_active_count() { FILE: crates/openfang-kernel/src/capabilities.rs type CapabilityManager (line 9) | pub struct CapabilityManager { method new (line 16) | pub fn new() -> Self { method grant (line 23) | pub fn grant(&self, agent_id: AgentId, capabilities: Vec) { method check (line 28) | pub fn check(&self, agent_id: AgentId, required: &Capability) -> Capab... method list (line 51) | pub fn list(&self, agent_id: AgentId) -> Vec { method revoke_all (line 59) | pub fn revoke_all(&self, agent_id: AgentId) { method default (line 65) | fn default() -> Self { function test_grant_and_check (line 75) | fn test_grant_and_check() { function test_no_grants (line 88) | fn test_no_grants() { FILE: crates/openfang-kernel/src/config.rs constant MAX_INCLUDE_DEPTH (line 12) | const MAX_INCLUDE_DEPTH: u32 = 10; function load_config (line 18) | pub fn load_config(path: Option<&Path>) -> KernelConfig { function resolve_config_includes (line 116) | fn resolve_config_includes( function deep_merge_toml (line 228) | pub fn deep_merge_toml(base: &mut toml::Value, overlay: &toml::Value) { function default_config_path (line 248) | pub fn default_config_path() -> PathBuf { function openfang_home (line 255) | pub fn openfang_home() -> PathBuf { function test_load_config_defaults (line 270) | fn test_load_config_defaults() { function test_load_config_missing_file (line 276) | fn test_load_config_missing_file() { function test_deep_merge_simple (line 282) | fn test_deep_merge_simple() { function test_deep_merge_nested_tables (line 304) | fn test_deep_merge_nested_tables() { function test_basic_include (line 327) | fn test_basic_include() { function test_nested_include (line 350) | fn test_nested_include() { function test_circular_include_detected (line 375) | fn test_circular_include_detected() { function test_path_traversal_blocked (line 396) | fn test_path_traversal_blocked() { function test_max_depth_exceeded (line 410) | fn test_max_depth_exceeded() { function test_absolute_path_rejected (line 433) | fn test_absolute_path_rejected() { function test_no_includes_works (line 446) | fn test_no_includes_works() { FILE: crates/openfang-kernel/src/config_reload.rs type HotAction (line 19) | pub enum HotAction { type ReloadPlan (line 60) | pub struct ReloadPlan { method has_changes (line 73) | pub fn has_changes(&self) -> bool { method is_hot_reloadable (line 78) | pub fn is_hot_reloadable(&self) -> bool { method log_summary (line 83) | pub fn log_summary(&self) { function field_changed (line 109) | fn field_changed(old: &T, new: &T) -> bool { function build_reload_plan (line 123) | pub fn build_reload_plan(old: &KernelConfig, new: &KernelConfig) -> Relo... function validate_config_for_reload (line 277) | pub fn validate_config_for_reload(config: &KernelConfig) -> Result<(), V... function should_apply_hot (line 313) | pub fn should_apply_hot(mode: ReloadMode, plan: &ReloadPlan) -> bool { function default_cfg (line 332) | fn default_cfg() -> KernelConfig { function test_no_changes_detected (line 341) | fn test_no_changes_detected() { function test_api_listen_requires_restart (line 352) | fn test_api_listen_requires_restart() { function test_api_key_requires_restart (line 365) | fn test_api_key_requires_restart() { function test_network_requires_restart (line 375) | fn test_network_requires_restart() { function test_network_config_requires_restart (line 388) | fn test_network_config_requires_restart() { function test_memory_config_requires_restart (line 401) | fn test_memory_config_requires_restart() { function test_default_model_hot_reloadable (line 414) | fn test_default_model_hot_reloadable() { function test_channels_hot_reload (line 431) | fn test_channels_hot_reload() { function test_usage_footer_hot_reload (line 445) | fn test_usage_footer_hot_reload() { function test_max_cron_jobs_hot_reload (line 456) | fn test_max_cron_jobs_hot_reload() { function test_extensions_hot_reload (line 466) | fn test_extensions_hot_reload() { function test_provider_urls_hot_reload (line 476) | fn test_provider_urls_hot_reload() { function test_mixed_changes (line 491) | fn test_mixed_changes() { function test_noop_changes (line 518) | fn test_noop_changes() { function test_has_changes (line 540) | fn test_has_changes() { function test_is_hot_reloadable (line 579) | fn test_is_hot_reloadable() { function test_validate_config_for_reload_valid (line 602) | fn test_validate_config_for_reload_valid() { function test_validate_config_for_reload_invalid (line 608) | fn test_validate_config_for_reload_invalid() { function test_validate_network_enabled_no_secret (line 623) | fn test_validate_network_enabled_no_secret() { function test_should_apply_hot_off (line 636) | fn test_should_apply_hot_off() { function test_should_apply_hot_restart_mode (line 647) | fn test_should_apply_hot_restart_mode() { function test_should_apply_hot_hybrid (line 658) | fn test_should_apply_hot_hybrid() { function test_should_apply_hot_empty (line 670) | fn test_should_apply_hot_empty() { FILE: crates/openfang-kernel/src/cron.rs constant MAX_CONSECUTIVE_ERRORS (line 21) | const MAX_CONSECUTIVE_ERRORS: u32 = 5; type JobMeta (line 33) | pub struct JobMeta { method new (line 46) | pub fn new(job: CronJob, one_shot: bool) -> Self { type CronScheduler (line 66) | pub struct CronScheduler { method new (line 81) | pub fn new(home_dir: &Path, max_total_jobs: usize) -> Self { method set_max_total_jobs (line 90) | pub fn set_max_total_jobs(&self, new_max: usize) { method load (line 100) | pub fn load(&self) -> OpenFangResult { method persist (line 117) | pub fn persist(&self) -> OpenFangResult<()> { method add_job (line 139) | pub fn add_job(&self, mut job: CronJob, one_shot: bool) -> OpenFangRes... method remove_job (line 169) | pub fn remove_job(&self, id: CronJobId) -> OpenFangResult { method set_enabled (line 178) | pub fn set_enabled(&self, id: CronJobId, enabled: bool) -> OpenFangRes... method get_job (line 195) | pub fn get_job(&self, id: CronJobId) -> Option { method get_meta (line 201) | pub fn get_meta(&self, id: CronJobId) -> Option { method list_jobs (line 206) | pub fn list_jobs(&self, agent_id: AgentId) -> Vec { method list_all_jobs (line 215) | pub fn list_all_jobs(&self) -> Vec { method reassign_agent_jobs (line 226) | pub fn reassign_agent_jobs(&self, old_agent_id: AgentId, new_agent_id:... method remove_agent_jobs (line 266) | pub fn remove_agent_jobs(&self, agent_id: AgentId) -> usize { method total_jobs (line 284) | pub fn total_jobs(&self) -> usize { method due_jobs (line 293) | pub fn due_jobs(&self) -> Vec { method record_success (line 315) | pub fn record_success(&self, id: CronJobId) { method record_failure (line 338) | pub fn record_failure(&self, id: CronJobId, error_msg: &str) { function compute_next_run (line 372) | pub fn compute_next_run(schedule: &CronSchedule) -> chrono::DateTime { function compute_next_run_after (line 383) | pub fn compute_next_run_after( function make_job (line 454) | fn make_job(agent_id: AgentId) -> CronJob { function make_scheduler (line 472) | fn make_scheduler(max_total: usize) -> (CronScheduler, tempfile::TempDir) { function test_add_job_and_list (line 481) | fn test_add_job_and_list() { function test_remove_job (line 510) | fn test_remove_job() { function test_add_job_global_limit (line 527) | fn test_add_job_global_limit() { function test_add_job_per_agent_limit (line 550) | fn test_add_job_per_agent_limit() { function test_record_success_removes_one_shot (line 575) | fn test_record_success_removes_one_shot() { function test_record_success_keeps_recurring (line 591) | fn test_record_success_keeps_recurring() { function test_record_failure_auto_disable (line 610) | fn test_record_failure_auto_disable() { function test_due_jobs_only_enabled (line 645) | fn test_due_jobs_only_enabled() { function test_due_jobs_future_not_included (line 676) | fn test_due_jobs_future_not_included() { function test_set_enabled (line 692) | fn test_set_enabled() { function test_persist_and_load (line 722) | fn test_persist_and_load() { function test_load_no_file_returns_zero (line 762) | fn test_load_no_file_returns_zero() { function test_compute_next_run_at (line 771) | fn test_compute_next_run_at() { function test_compute_next_run_every (line 779) | fn test_compute_next_run_every() { function test_compute_next_run_cron_daily (line 791) | fn test_compute_next_run_cron_daily() { function test_compute_next_run_cron_with_dow (line 807) | fn test_compute_next_run_cron_with_dow() { function test_compute_next_run_cron_invalid_expr (line 822) | fn test_compute_next_run_cron_invalid_expr() { function test_compute_next_run_after_skips_current_second (line 837) | fn test_compute_next_run_after_skips_current_second() { function test_record_failure_truncates_long_error (line 858) | fn test_record_failure_truncates_long_error() { function test_cron_tz_shifts_next_run (line 880) | fn test_cron_tz_shifts_next_run() { function test_cron_tz_none_defaults_to_utc (line 916) | fn test_cron_tz_none_defaults_to_utc() { function test_cron_tz_empty_string_defaults_to_utc (line 933) | fn test_cron_tz_empty_string_defaults_to_utc() { function test_cron_tz_invalid_falls_back_to_utc (line 950) | fn test_cron_tz_invalid_falls_back_to_utc() { function test_cron_tz_asia_shanghai (line 968) | fn test_cron_tz_asia_shanghai() { function test_reassign_agent_jobs_basic (line 989) | fn test_reassign_agent_jobs_basic() { function test_reassign_agent_jobs_does_not_touch_other_agents (line 1018) | fn test_reassign_agent_jobs_does_not_touch_other_agents() { function test_reassign_agent_jobs_no_match_returns_zero (line 1042) | fn test_reassign_agent_jobs_no_match_returns_zero() { function test_reassign_agent_jobs_resets_consecutive_errors (line 1056) | fn test_reassign_agent_jobs_resets_consecutive_errors() { function test_reassign_agent_jobs_reenables_disabled_stale_jobs (line 1080) | fn test_reassign_agent_jobs_reenables_disabled_stale_jobs() { function test_reassign_agent_jobs_persists_after_roundtrip (line 1108) | fn test_reassign_agent_jobs_persists_after_roundtrip() { function test_remove_agent_jobs_basic (line 1138) | fn test_remove_agent_jobs_basic() { function test_remove_agent_jobs_no_match (line 1167) | fn test_remove_agent_jobs_no_match() { function test_remove_agent_jobs_persists (line 1181) | fn test_remove_agent_jobs_persists() { FILE: crates/openfang-kernel/src/error.rs type KernelError (line 8) | pub enum KernelError { type KernelResult (line 19) | pub type KernelResult = Result; FILE: crates/openfang-kernel/src/event_bus.rs constant HISTORY_SIZE (line 12) | const HISTORY_SIZE: usize = 1000; type EventBus (line 15) | pub struct EventBus { method new (line 26) | pub fn new() -> Self { method publish (line 36) | pub async fn publish(&self, event: Event) { method subscribe_agent (line 76) | pub fn subscribe_agent(&self, agent_id: AgentId) -> broadcast::Receive... method subscribe_all (line 85) | pub fn subscribe_all(&self) -> broadcast::Receiver { method history (line 90) | pub async fn history(&self, limit: usize) -> Vec { method unsubscribe_agent (line 96) | pub fn unsubscribe_agent(&self, agent_id: AgentId) { method default (line 102) | fn default() -> Self { function test_publish_and_history (line 113) | async fn test_publish_and_history() { function test_agent_subscribe (line 127) | async fn test_agent_subscribe() { FILE: crates/openfang-kernel/src/heartbeat.rs constant DEFAULT_CHECK_INTERVAL_SECS (line 19) | const DEFAULT_CHECK_INTERVAL_SECS: u64 = 30; constant UNRESPONSIVE_MULTIPLIER (line 23) | const UNRESPONSIVE_MULTIPLIER: u64 = 2; constant DEFAULT_MAX_RECOVERY_ATTEMPTS (line 26) | const DEFAULT_MAX_RECOVERY_ATTEMPTS: u32 = 3; constant DEFAULT_RECOVERY_COOLDOWN_SECS (line 29) | const DEFAULT_RECOVERY_COOLDOWN_SECS: u64 = 60; type HeartbeatStatus (line 33) | pub struct HeartbeatStatus { type HeartbeatConfig (line 48) | pub struct HeartbeatConfig { method default (line 61) | fn default() -> Self { type RecoveryTracker (line 74) | pub struct RecoveryTracker { method new (line 81) | pub fn new() -> Self { method record_attempt (line 89) | pub fn record_attempt(&self, agent_id: AgentId) -> u32 { method can_attempt (line 101) | pub fn can_attempt(&self, agent_id: AgentId, cooldown_secs: u64) -> bo... method failure_count (line 113) | pub fn failure_count(&self, agent_id: AgentId) -> u32 { method reset (line 118) | pub fn reset(&self, agent_id: AgentId) { method default (line 124) | fn default() -> Self { function check_agents (line 133) | pub fn check_agents(registry: &AgentRegistry, config: &HeartbeatConfig) ... function is_quiet_hours (line 194) | pub fn is_quiet_hours(quiet_hours: &str) -> bool { type HeartbeatSummary (line 238) | pub struct HeartbeatSummary { function summarize (line 250) | pub fn summarize(statuses: &[HeartbeatStatus]) -> HeartbeatSummary { function test_quiet_hours_parsing (line 270) | fn test_quiet_hours_parsing() { function test_quiet_hours_format_valid (line 278) | fn test_quiet_hours_format_valid() { function test_heartbeat_config_default (line 287) | fn test_heartbeat_config_default() { function test_summarize_empty (line 294) | fn test_summarize_empty() { function test_summarize_mixed (line 302) | fn test_summarize_mixed() { function test_recovery_tracker (line 336) | fn test_recovery_tracker() { FILE: crates/openfang-kernel/src/kernel.rs type StubDriver (line 46) | struct StubDriver; method complete (line 50) | async fn complete(&self, _request: CompletionRequest) -> Result) -> KernelResult { method boot_with_config (line 513) | pub fn boot_with_config(mut config: KernelConfig) -> KernelResult { method spawn_agent (line 1248) | pub fn spawn_agent(&self, manifest: AgentManifest) -> KernelResult KernelResul... method send_message (line 1461) | pub async fn send_message( method send_message_with_blocks (line 1479) | pub async fn send_message_with_blocks( method send_message_with_handle (line 1502) | pub async fn send_message_with_handle( method send_message_with_handle_and_blocks (line 1530) | pub async fn send_message_with_handle_and_blocks( method send_message_streaming (line 1625) | pub fn send_message_streaming( method execute_wasm_agent (line 2091) | async fn execute_wasm_agent( method execute_python_agent (line 2172) | async fn execute_python_agent( method execute_llm_agent (line 2231) | async fn execute_llm_agent( method resolve_module_path (line 2608) | fn resolve_module_path(&self, path: &str) -> PathBuf { method reset_session (line 2619) | pub fn reset_session(&self, agent_id: AgentId) -> KernelResult<()> { method clear_agent_history (line 2655) | pub fn clear_agent_history(&self, agent_id: AgentId) -> KernelResult<(... method list_agent_sessions (line 2682) | pub fn list_agent_sessions(&self, agent_id: AgentId) -> KernelResult)... method set_agent_mcp_servers (line 2963) | pub fn set_agent_mcp_servers( method set_agent_tool_filters (line 3002) | pub fn set_agent_tool_filters( method session_usage_cost (line 3026) | pub fn session_usage_cost(&self, agent_id: AgentId) -> KernelResult<(u... method stop_agent_run (line 3066) | pub fn stop_agent_run(&self, agent_id: AgentId) -> KernelResult { method compact_agent_session (line 3080) | pub async fn compact_agent_session(&self, agent_id: AgentId) -> Kernel... method context_report (line 3159) | pub fn context_report( method kill_agent (line 3200) | pub fn kill_agent(&self, agent_id: AgentId) -> KernelResult<()> { method activate_hand (line 3237) | pub fn activate_hand( method deactivate_hand (line 3442) | pub fn deactivate_hand(&self, instance_id: uuid::Uuid) -> KernelResult... method persist_hand_state (line 3471) | fn persist_hand_state(&self) { method pause_hand (line 3479) | pub fn pause_hand(&self, instance_id: uuid::Uuid) -> KernelResult<()> { method resume_hand (line 3486) | pub fn resume_hand(&self, instance_id: uuid::Uuid) -> KernelResult<()> { method set_self_handle (line 3495) | pub fn set_self_handle(self: &Arc) { method list_bindings (line 3502) | pub fn list_bindings(&self) -> Vec Option Result Vec<(AgentId, Strin... method register_trigger (line 3644) | pub fn register_trigger( method remove_trigger (line 3663) | pub fn remove_trigger(&self, trigger_id: TriggerId) -> bool { method set_trigger_enabled (line 3668) | pub fn set_trigger_enabled(&self, trigger_id: TriggerId, enabled: bool... method list_triggers (line 3673) | pub fn list_triggers(&self, agent_id: Option) -> Vec WorkflowId { method run_workflow (line 3686) | pub async fn run_workflow( method load_workflows_from_dir (line 3752) | pub async fn load_workflows_from_dir(&self, dir: &std::path::Path) -> ... method start_background_agents (line 3796) | pub fn start_background_agents(self: &Arc) { method start_ofp_node (line 4256) | async fn start_ofp_node(self: &Arc) { method self_arc (line 4342) | fn self_arc(self: &Arc) -> Arc { method start_heartbeat_monitor (line 4349) | fn start_heartbeat_monitor(self: &Arc) { method start_background_for_agent (line 4495) | pub fn start_background_for_agent( method shutdown (line 4537) | pub fn shutdown(&self) { method resolve_credential (line 4593) | pub fn resolve_credential(&self, key: &str) -> Option { method store_credential (line 4602) | pub fn store_credential(&self, key: &str, value: &str) { method remove_credential (line 4613) | pub fn remove_credential(&self, key: &str) { method lookup_provider_url (line 4626) | fn lookup_provider_url(&self, provider: &str) -> Option { method resolve_driver (line 4642) | fn resolve_driver(&self, manifest: &AgentManifest) -> KernelResult) { method reload_extension_mcps (line 4849) | pub async fn reload_extension_mcps(self: &Arc) -> Result, id: &str) -> Re... method run_extension_health_loop (line 5057) | async fn run_extension_health_loop(self: &Arc) { method available_tools (line 5101) | fn available_tools(&self, agent_id: AgentId) -> Vec { method reload_skills (line 5255) | pub fn reload_skills(&self) { method build_skill_summary (line 5274) | fn build_skill_summary(&self, skill_allowlist: &[String]) -> String { method build_mcp_summary (line 5314) | fn build_mcp_summary(&self, mcp_allowlist: &[String]) -> String { method collect_prompt_context (line 5383) | pub fn collect_prompt_context(&self, skill_allowlist: &[String]) -> St... method local_agents (line 6396) | fn local_agents(&self) -> Vec { method handle_agent_message (line 6411) | async fn handle_agent_message( method discover_agents (line 6436) | fn discover_agents(&self, query: &str) -> Vec u64 { type DeliveryTracker (line 168) | pub struct DeliveryTracker { constant MAX_RECEIPTS (line 179) | const MAX_RECEIPTS: usize = 10_000; constant MAX_PER_AGENT (line 180) | const MAX_PER_AGENT: usize = 500; method new (line 183) | pub fn new() -> Self { method record (line 190) | pub fn record(&self, agent_id: AgentId, receipt: openfang_channels::ty... method get_receipts (line 212) | pub fn get_receipts( method sent_receipt (line 224) | pub fn sent_receipt( method failed_receipt (line 239) | pub fn failed_receipt( method sanitize_recipient (line 262) | fn sanitize_recipient(recipient: &str) -> String { method default (line 173) | fn default() -> Self { function ensure_workspace (line 273) | fn ensure_workspace(workspace: &Path) -> KernelResult<()> { function generate_identity_files (line 296) | fn generate_identity_files(workspace: &Path, manifest: &AgentManifest) { function append_daily_memory_log (line 432) | fn append_daily_memory_log(workspace: &Path, response: &str) { function read_identity_file (line 460) | fn read_identity_file(workspace: &Path, filename: &str) -> Option { function gethostname (line 486) | fn gethostname() -> Option { function manifest_to_capabilities (line 5434) | fn manifest_to_capabilities(manifest: &AgentManifest) -> Vec { function apply_budget_defaults (line 5508) | fn apply_budget_defaults( function default_embedding_model_for_provider (line 5534) | fn default_embedding_model_for_provider(provider: &str) -> &'static str { function infer_provider_from_model (line 5550) | fn infer_provider_from_model(model: &str) -> Option { function shared_memory_agent_id (line 5632) | pub fn shared_memory_agent_id() -> AgentId { function cron_deliver_response (line 5640) | async fn cron_deliver_response( method spawn_agent (line 5725) | async fn spawn_agent( method send_to_agent (line 5744) | async fn send_to_agent(&self, agent_id: &str, message: &str) -> Result Vec { method kill_agent (line 5778) | fn kill_agent(&self, agent_id: &str) -> Result<(), String> { method memory_store (line 5785) | fn memory_store(&self, key: &str, value: serde_json::Value) -> Result<()... method memory_recall (line 5792) | fn memory_recall(&self, key: &str) -> Result, ... method find_agents (line 5799) | fn find_agents(&self, query: &str) -> Vec { method task_post (line 5829) | async fn task_post( method task_claim (line 5842) | async fn task_claim(&self, agent_id: &str) -> Result Result<(),... method task_list (line 5856) | async fn task_list(&self, status: Option<&str>) -> Result Result Result<(), String> { method hand_list (line 6001) | async fn hand_list(&self) -> Result, String> { method hand_install (line 6038) | async fn hand_install( method hand_activate (line 6056) | async fn hand_activate( method hand_status (line 6074) | async fn hand_status(&self, hand_id: &str) -> Result Result<(), String> { method requires_approval (line 6104) | fn requires_approval(&self, tool_name: &str) -> bool { method request_approval (line 6108) | async fn request_approval( method list_a2a_agents (line 6143) | fn list_a2a_agents(&self) -> Vec<(String, String)> { method get_a2a_agent_url (line 6154) | fn get_a2a_agent_url(&self, name: &str) -> Option { method get_channel_default_recipient (line 6166) | async fn get_channel_default_recipient(&self, channel: &str) -> Option) -> Ag... function test_send_to_agent_by_name_resolution (line 6540) | fn test_send_to_agent_by_name_resolution() { function test_find_agents_by_tag (line 6574) | fn test_find_agents_by_tag() { function test_manifest_to_capabilities_with_profile (line 6642) | fn test_manifest_to_capabilities_with_profile() { function test_manifest_to_capabilities_profile_overridden_by_explicit_tools (line 6661) | fn test_manifest_to_capabilities_profile_overridden_by_explicit_tools() { function test_hand_activation_does_not_seed_runtime_tool_filters (line 6680) | fn test_hand_activation_does_not_seed_runtime_tool_filters() { FILE: crates/openfang-kernel/src/metering.rs type MeteringEngine (line 9) | pub struct MeteringEngine { method new (line 16) | pub fn new(store: Arc) -> Self { method record (line 21) | pub fn record(&self, record: &UsageRecord) -> OpenFangResult<()> { method check_quota (line 27) | pub fn check_quota(&self, agent_id: AgentId, quota: &ResourceQuota) ->... method check_global_budget (line 65) | pub fn check_global_budget( method budget_status (line 103) | pub fn budget_status(&self, budget: &openfang_types::config::BudgetCon... method get_summary (line 136) | pub fn get_summary(&self, agent_id: Option) -> OpenFangResult... method get_by_model (line 141) | pub fn get_by_model(&self) -> OpenFangResult> { method estimate_cost (line 184) | pub fn estimate_cost(model: &str, input_tokens: u64, output_tokens: u6... method estimate_cost_with_catalog (line 197) | pub fn estimate_cost_with_catalog( method cleanup (line 210) | pub fn cleanup(&self, days: u32) -> OpenFangResult { type BudgetStatus (line 217) | pub struct BudgetStatus { function estimate_cost_rates (line 236) | fn estimate_cost_rates(model: &str) -> (f64, f64) { function setup (line 516) | fn setup() -> MeteringEngine { function test_record_and_check_quota_under (line 523) | fn test_record_and_check_quota_under() { function test_check_quota_exceeded (line 546) | fn test_check_quota_exceeded() { function test_check_quota_zero_limit_skipped (line 572) | fn test_check_quota_zero_limit_skipped() { function test_estimate_cost_haiku (line 596) | fn test_estimate_cost_haiku() { function test_estimate_cost_sonnet (line 602) | fn test_estimate_cost_sonnet() { function test_estimate_cost_opus (line 608) | fn test_estimate_cost_opus() { function test_estimate_cost_gpt4o (line 614) | fn test_estimate_cost_gpt4o() { function test_estimate_cost_gpt4o_mini (line 620) | fn test_estimate_cost_gpt4o_mini() { function test_estimate_cost_gpt41 (line 626) | fn test_estimate_cost_gpt41() { function test_estimate_cost_gpt41_mini (line 632) | fn test_estimate_cost_gpt41_mini() { function test_estimate_cost_gpt41_nano (line 638) | fn test_estimate_cost_gpt41_nano() { function test_estimate_cost_o3_mini (line 644) | fn test_estimate_cost_o3_mini() { function test_estimate_cost_gemini_20_flash (line 650) | fn test_estimate_cost_gemini_20_flash() { function test_estimate_cost_gemini_25_pro (line 656) | fn test_estimate_cost_gemini_25_pro() { function test_estimate_cost_gemini_25_flash (line 662) | fn test_estimate_cost_gemini_25_flash() { function test_estimate_cost_deepseek_chat (line 668) | fn test_estimate_cost_deepseek_chat() { function test_estimate_cost_deepseek_reasoner (line 674) | fn test_estimate_cost_deepseek_reasoner() { function test_estimate_cost_llama (line 680) | fn test_estimate_cost_llama() { function test_estimate_cost_mixtral (line 686) | fn test_estimate_cost_mixtral() { function test_estimate_cost_qwen (line 692) | fn test_estimate_cost_qwen() { function test_estimate_cost_mistral_large (line 698) | fn test_estimate_cost_mistral_large() { function test_estimate_cost_mistral_small (line 704) | fn test_estimate_cost_mistral_small() { function test_estimate_cost_command_r_plus (line 710) | fn test_estimate_cost_command_r_plus() { function test_estimate_cost_unknown (line 716) | fn test_estimate_cost_unknown() { function test_estimate_cost_grok (line 722) | fn test_estimate_cost_grok() { function test_estimate_cost_grok_mini (line 728) | fn test_estimate_cost_grok_mini() { function test_estimate_cost_sonar_pro (line 734) | fn test_estimate_cost_sonar_pro() { function test_estimate_cost_jamba (line 740) | fn test_estimate_cost_jamba() { function test_estimate_cost_cerebras (line 746) | fn test_estimate_cost_cerebras() { function test_estimate_cost_with_catalog (line 752) | fn test_estimate_cost_with_catalog() { function test_estimate_cost_with_catalog_alias (line 765) | fn test_estimate_cost_with_catalog_alias() { function test_estimate_cost_with_catalog_unknown_uses_default (line 774) | fn test_estimate_cost_with_catalog_unknown_uses_default() { function test_get_summary (line 787) | fn test_get_summary() { FILE: crates/openfang-kernel/src/pairing.rs constant MAX_PENDING_REQUESTS (line 12) | const MAX_PENDING_REQUESTS: usize = 5; type PairedDevice (line 16) | pub struct PairedDevice { type PairingRequest (line 28) | pub struct PairingRequest { type PersistFn (line 36) | pub type PersistFn = Box; type PersistOp (line 40) | pub enum PersistOp { type PairingManager (line 46) | pub struct PairingManager { method new (line 54) | pub fn new(config: PairingConfig) -> Self { method set_persist (line 64) | pub fn set_persist(&mut self, f: PersistFn) { method load_devices (line 69) | pub fn load_devices(&self, devices: Vec) { method create_pairing_request (line 80) | pub fn create_pairing_request(&self) -> Result { method complete_pairing (line 115) | pub fn complete_pairing( method list_devices (line 168) | pub fn list_devices(&self) -> Vec { method remove_device (line 173) | pub fn remove_device(&self, device_id: &str) -> Result<(), String> { method notify_devices (line 188) | pub async fn notify_devices( method clean_expired (line 305) | pub fn clean_expired(&self) { function default_config (line 315) | fn default_config() -> PairingConfig { function enabled_config (line 319) | fn enabled_config() -> PairingConfig { function test_manager_creation (line 327) | fn test_manager_creation() { function test_create_request_disabled (line 334) | fn test_create_request_disabled() { function test_create_request_success (line 342) | fn test_create_request_success() { function test_max_pending_requests (line 350) | fn test_max_pending_requests() { function test_complete_pairing_invalid_token (line 361) | fn test_complete_pairing_invalid_token() { function test_complete_pairing_success (line 377) | fn test_complete_pairing_success() { function test_max_devices_enforced (line 397) | fn test_max_devices_enforced() { function test_list_devices (line 433) | fn test_list_devices() { function test_remove_device (line 452) | fn test_remove_device() { function test_remove_nonexistent_device (line 470) | fn test_remove_nonexistent_device() { function test_clean_expired (line 476) | fn test_clean_expired() { function test_token_length (line 493) | fn test_token_length() { function test_config_defaults (line 501) | fn test_config_defaults() { FILE: crates/openfang-kernel/src/registry.rs type AgentRegistry (line 8) | pub struct AgentRegistry { method new (line 19) | pub fn new() -> Self { method register (line 28) | pub fn register(&self, entry: AgentEntry) -> OpenFangResult<()> { method get (line 42) | pub fn get(&self, id: AgentId) -> Option { method find_by_name (line 47) | pub fn find_by_name(&self, name: &str) -> Option { method set_state (line 54) | pub fn set_state(&self, id: AgentId, state: AgentState) -> OpenFangRes... method set_mode (line 65) | pub fn set_mode(&self, id: AgentId, mode: AgentMode) -> OpenFangResult... method remove (line 76) | pub fn remove(&self, id: AgentId) -> OpenFangResult { method list (line 91) | pub fn list(&self) -> Vec { method add_child (line 96) | pub fn add_child(&self, parent_id: AgentId, child_id: AgentId) { method count (line 103) | pub fn count(&self) -> usize { method update_session_id (line 108) | pub fn update_session_id( method update_workspace (line 123) | pub fn update_workspace( method update_identity (line 138) | pub fn update_identity( method update_model (line 153) | pub fn update_model(&self, id: AgentId, new_model: String) -> OpenFang... method update_model_and_provider (line 164) | pub fn update_model_and_provider( method update_model_provider_config (line 181) | pub fn update_model_provider_config( method update_fallback_models (line 202) | pub fn update_fallback_models( method update_skills (line 217) | pub fn update_skills(&self, id: AgentId, skills: Vec) -> OpenF... method update_mcp_servers (line 228) | pub fn update_mcp_servers(&self, id: AgentId, servers: Vec) ->... method update_tool_filters (line 239) | pub fn update_tool_filters( method update_system_prompt (line 260) | pub fn update_system_prompt(&self, id: AgentId, new_prompt: String) ->... method update_name (line 271) | pub fn update_name(&self, id: AgentId, new_name: String) -> OpenFangRe... method update_description (line 295) | pub fn update_description(&self, id: AgentId, new_desc: String) -> Ope... method update_resources (line 306) | pub fn update_resources( method mark_onboarding_complete (line 335) | pub fn mark_onboarding_complete(&self, id: AgentId) -> OpenFangResult<... method default (line 348) | fn default() -> Self { function test_entry (line 360) | fn test_entry(name: &str) -> AgentEntry { function test_register_and_get (line 406) | fn test_register_and_get() { function test_find_by_name (line 415) | fn test_find_by_name() { function test_duplicate_name (line 423) | fn test_duplicate_name() { function test_remove (line 430) | fn test_remove() { FILE: crates/openfang-kernel/src/scheduler.rs type UsageTracker (line 13) | pub struct UsageTracker { method reset_if_expired (line 34) | fn reset_if_expired(&mut self) { method default (line 23) | fn default() -> Self { type AgentScheduler (line 44) | pub struct AgentScheduler { method new (line 55) | pub fn new() -> Self { method register (line 64) | pub fn register(&self, agent_id: AgentId, quota: ResourceQuota) { method record_usage (line 70) | pub fn record_usage(&self, agent_id: AgentId, usage: &TokenUsage) { method check_quota (line 78) | pub fn check_quota(&self, agent_id: AgentId) -> OpenFangResult<()> { method reset_usage (line 103) | pub fn reset_usage(&self, agent_id: AgentId) { method abort_task (line 112) | pub fn abort_task(&self, agent_id: AgentId) { method unregister (line 120) | pub fn unregister(&self, agent_id: AgentId) { method get_usage (line 127) | pub fn get_usage(&self, agent_id: AgentId) -> Option<(u64, u64)> { method token_headroom (line 135) | pub fn token_headroom(&self, agent_id: AgentId) -> Option { method default (line 148) | fn default() -> Self { function test_record_usage (line 158) | fn test_record_usage() { function test_quota_check (line 174) | fn test_quota_check() { FILE: crates/openfang-kernel/src/supervisor.rs type Supervisor (line 10) | pub struct Supervisor { method new (line 25) | pub fn new() -> Self { method subscribe (line 37) | pub fn subscribe(&self) -> watch::Receiver { method shutdown (line 42) | pub fn shutdown(&self) { method is_shutting_down (line 48) | pub fn is_shutting_down(&self) -> bool { method record_panic (line 53) | pub fn record_panic(&self) { method record_restart (line 62) | pub fn record_restart(&self) { method panic_count (line 67) | pub fn panic_count(&self) -> u64 { method restart_count (line 72) | pub fn restart_count(&self) -> u64 { method record_agent_restart (line 79) | pub fn record_agent_restart(&self, agent_id: AgentId, max_restarts: u3... method agent_restart_count (line 98) | pub fn agent_restart_count(&self, agent_id: AgentId) -> u32 { method reset_agent_restarts (line 103) | pub fn reset_agent_restarts(&self, agent_id: AgentId) { method health (line 108) | pub fn health(&self) -> SupervisorHealth { method default (line 118) | fn default() -> Self { type SupervisorHealth (line 125) | pub struct SupervisorHealth { function test_shutdown (line 136) | fn test_shutdown() { function test_subscribe (line 144) | fn test_subscribe() { function test_panic_tracking (line 153) | fn test_panic_tracking() { function test_restart_tracking (line 162) | fn test_restart_tracking() { function test_health (line 170) | fn test_health() { function test_agent_restart_within_limit (line 179) | fn test_agent_restart_within_limit() { function test_agent_restart_exceeds_limit (line 192) | fn test_agent_restart_exceeds_limit() { function test_agent_restart_zero_limit_unlimited (line 205) | fn test_agent_restart_zero_limit_unlimited() { function test_reset_agent_restarts (line 216) | fn test_reset_agent_restarts() { FILE: crates/openfang-kernel/src/triggers.rs type TriggerId (line 17) | pub struct TriggerId(pub Uuid); method new (line 20) | pub fn new() -> Self { method fmt (line 32) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { method default (line 26) | fn default() -> Self { type TriggerPattern (line 40) | pub enum TriggerPattern { type Trigger (line 63) | pub struct Trigger { type TriggerEngine (line 83) | pub struct TriggerEngine { method new (line 92) | pub fn new() -> Self { method register (line 100) | pub fn register( method remove (line 126) | pub fn remove(&self, trigger_id: TriggerId) -> bool { method remove_agent_triggers (line 138) | pub fn remove_agent_triggers(&self, agent_id: AgentId) { method take_agent_triggers (line 152) | pub fn take_agent_triggers(&self, agent_id: AgentId) -> Vec { method restore_triggers (line 181) | pub fn restore_triggers(&self, new_agent_id: AgentId, triggers: Vec bool { method list_agent_triggers (line 256) | pub fn list_agent_triggers(&self, agent_id: AgentId) -> Vec { method list_all (line 268) | pub fn list_all(&self) -> Vec { method evaluate (line 274) | pub fn evaluate(&self, event: &Event) -> Vec<(AgentId, String)> { method get (line 311) | pub fn get(&self, trigger_id: TriggerId) -> Option { method default (line 317) | fn default() -> Self { function matches_pattern (line 323) | fn matches_pattern(pattern: &TriggerPattern, event: &Event, description:... function describe_event (line 369) | fn describe_event(event: &Event) -> String { function test_register_trigger (line 465) | fn test_register_trigger() { function test_evaluate_lifecycle (line 478) | fn test_evaluate_lifecycle() { function test_evaluate_agent_spawned_pattern (line 504) | fn test_evaluate_agent_spawned_pattern() { function test_max_fires (line 540) | fn test_max_fires() { function test_remove_trigger (line 566) | fn test_remove_trigger() { function test_remove_agent_triggers (line 575) | fn test_remove_agent_triggers() { function test_content_match (line 587) | fn test_content_match() { function test_reassign_agent_triggers_basic (line 614) | fn test_reassign_agent_triggers_basic() { function test_reassign_agent_triggers_no_match_returns_zero (line 640) | fn test_reassign_agent_triggers_no_match_returns_zero() { function test_reassign_does_not_touch_other_agents (line 652) | fn test_reassign_does_not_touch_other_agents() { function test_take_and_restore_triggers (line 670) | fn test_take_and_restore_triggers() { function test_take_empty_returns_empty (line 708) | fn test_take_empty_returns_empty() { function test_restore_preserves_enabled_state (line 715) | fn test_restore_preserves_enabled_state() { FILE: crates/openfang-kernel/src/whatsapp_gateway.rs constant GATEWAY_INDEX_JS (line 13) | const GATEWAY_INDEX_JS: &str = include_str!("../../../packages/whatsapp-... constant GATEWAY_PACKAGE_JSON (line 14) | const GATEWAY_PACKAGE_JSON: &str = include_str!("../../../packages/whats... constant DEFAULT_GATEWAY_PORT (line 17) | const DEFAULT_GATEWAY_PORT: u16 = 3009; constant MAX_RESTARTS (line 20) | const MAX_RESTARTS: u32 = 3; constant RESTART_DELAYS (line 23) | const RESTART_DELAYS: [u64; 3] = [5, 10, 20]; function gateway_dir (line 26) | fn gateway_dir() -> PathBuf { function content_hash (line 31) | fn content_hash(content: &str) -> String { function write_if_changed (line 43) | fn write_if_changed(path: &std::path::Path, content: &str) -> std::io::R... function ensure_gateway_installed (line 62) | async fn ensure_gateway_installed() -> Result { function node_available (line 108) | async fn node_available() -> bool { function start_whatsapp_gateway (line 130) | pub async fn start_whatsapp_gateway(kernel: &Arc SetupPlan { method tool_hints_for (line 221) | fn tool_hints_for(tools: &[String]) -> String { method manifest_to_toml (line 256) | pub fn manifest_to_toml(manifest: &AgentManifest) -> Result Result AgentIntent { function test_build_plan_basic (line 284) | fn test_build_plan_basic() { function test_build_plan_complex_tier (line 299) | fn test_build_plan_complex_tier() { function test_build_plan_scheduled (line 309) | fn test_build_plan_scheduled() { function test_parse_intent_json (line 324) | fn test_parse_intent_json() { function test_manifest_to_toml (line 342) | fn test_manifest_to_toml() { function test_web_tools_auto_added (line 352) | fn test_web_tools_auto_added() { function test_memory_tools_auto_added (line 377) | fn test_memory_tools_auto_added() { function test_browser_tools_auto_added (line 402) | fn test_browser_tools_auto_added() { function test_wizard_system_prompt_has_task (line 432) | fn test_wizard_system_prompt_has_task() { FILE: crates/openfang-kernel/src/workflow.rs type WorkflowId (line 24) | pub struct WorkflowId(pub Uuid); method new (line 27) | pub fn new() -> Self { method fmt (line 39) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { method default (line 33) | fn default() -> Self { type WorkflowRunId (line 46) | pub struct WorkflowRunId(pub Uuid); method new (line 49) | pub fn new() -> Self { method fmt (line 61) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { method default (line 55) | fn default() -> Self { type Workflow (line 68) | pub struct Workflow { type WorkflowStep (line 83) | pub struct WorkflowStep { function default_timeout (line 103) | fn default_timeout() -> u64 { type StepAgent (line 110) | pub enum StepAgent { type StepMode (line 120) | pub enum StepMode { type ErrorMode (line 137) | pub enum ErrorMode { type WorkflowRunState (line 150) | pub enum WorkflowRunState { type WorkflowRun (line 159) | pub struct WorkflowRun { type StepResult (line 184) | pub struct StepResult { type WorkflowEngine (line 201) | pub struct WorkflowEngine { method new (line 210) | pub fn new() -> Self { method register (line 218) | pub async fn register(&self, workflow: Workflow) -> WorkflowId { method list_workflows (line 226) | pub async fn list_workflows(&self) -> Vec { method get_workflow (line 231) | pub async fn get_workflow(&self, id: WorkflowId) -> Option { method remove_workflow (line 236) | pub async fn remove_workflow(&self, id: WorkflowId) -> bool { method update_workflow (line 245) | pub async fn update_workflow(&self, id: WorkflowId, updated: Workflow)... constant MAX_RETAINED_RUNS (line 260) | const MAX_RETAINED_RUNS: usize = 200; method create_run (line 266) | pub async fn create_run( method get_run (line 317) | pub async fn get_run(&self, run_id: WorkflowRunId) -> Option) -> Vec( method execute_run (line 434) | pub async fn execute_run( method default (line 801) | fn default() -> Self { function test_workflow (line 810) | fn test_workflow() -> Workflow { function mock_resolver (line 843) | fn mock_resolver(agent: &StepAgent) -> Option<(AgentId, String)> { function test_register_workflow (line 849) | async fn test_register_workflow() { function test_create_run (line 861) | async fn test_create_run() { function test_list_workflows (line 875) | async fn test_list_workflows() { function test_remove_workflow (line 885) | async fn test_remove_workflow() { function test_execute_pipeline (line 895) | async fn test_execute_pipeline() { function test_conditional_skip (line 921) | async fn test_conditional_skip() { function test_conditional_executes (line 973) | async fn test_conditional_executes() { function test_loop_until_condition (line 1024) | async fn test_loop_until_condition() { function test_loop_max_iterations (line 1070) | async fn test_loop_max_iterations() { function test_error_mode_skip (line 1107) | async fn test_error_mode_skip() { function test_error_mode_retry (line 1166) | async fn test_error_mode_retry() { function test_output_variables (line 1209) | async fn test_output_variables() { function test_fan_out_parallel (line 1279) | async fn test_fan_out_parallel() { function test_expand_variables (line 1339) | async fn test_expand_variables() { function test_error_mode_serialization (line 1353) | async fn test_error_mode_serialization() { function test_step_mode_conditional_serialization (line 1366) | async fn test_step_mode_conditional_serialization() { function test_step_mode_loop_serialization (line 1376) | async fn test_step_mode_loop_serialization() { FILE: crates/openfang-kernel/tests/integration_test.rs function test_config (line 9) | fn test_config() -> KernelConfig { function test_full_pipeline_with_groq (line 28) | async fn test_full_pipeline_with_groq() { function test_multiple_agents_different_models (line 87) | async fn test_multiple_agents_different_models() { FILE: crates/openfang-kernel/tests/multi_agent_test.rs function test_config (line 9) | fn test_config() -> KernelConfig { function load_manifest (line 27) | fn load_manifest(toml_str: &str) -> AgentManifest { function test_six_agent_fleet (line 32) | async fn test_six_agent_fleet() { FILE: crates/openfang-kernel/tests/wasm_agent_integration_test.rs constant ECHO_WAT (line 18) | const ECHO_WAT: &str = r#" constant HELLO_WAT (line 45) | const HELLO_WAT: &str = r#" constant INFINITE_LOOP_WAT (line 68) | const INFINITE_LOOP_WAT: &str = r#" constant HOST_CALL_PROXY_WAT (line 90) | const HOST_CALL_PROXY_WAT: &str = r#" function test_config (line 109) | fn test_config(tmp: &tempfile::TempDir) -> KernelConfig { function wasm_manifest (line 123) | fn wasm_manifest(name: &str, module: &str) -> AgentManifest { function test_wasm_agent_hello_response (line 151) | async fn test_wasm_agent_hello_response() { function test_wasm_agent_echo (line 174) | async fn test_wasm_agent_echo() { function test_wasm_agent_fuel_exhaustion (line 201) | async fn test_wasm_agent_fuel_exhaustion() { function test_wasm_agent_missing_module (line 227) | async fn test_wasm_agent_missing_module() { function test_wasm_agent_host_call_time (line 250) | async fn test_wasm_agent_host_call_time() { function test_wasm_agent_streaming_fallback (line 294) | async fn test_wasm_agent_streaming_fallback() { function test_multiple_wasm_agents (line 330) | async fn test_multiple_wasm_agents() { function test_mixed_wasm_and_llm_agents (line 361) | async fn test_mixed_wasm_and_llm_agents() { FILE: crates/openfang-kernel/tests/workflow_integration_test.rs function test_config (line 17) | fn test_config(provider: &str, model: &str, api_key_env: &str) -> Kernel... function spawn_test_agent (line 32) | fn spawn_test_agent( function test_workflow_register_and_resolve (line 65) | async fn test_workflow_register_and_resolve() { function test_workflow_agent_by_id (line 176) | async fn test_workflow_agent_by_id() { function test_trigger_registration_with_kernel (line 233) | async fn test_trigger_registration_with_kernel() { function test_workflow_e2e_with_groq (line 305) | async fn test_workflow_e2e_with_groq() { FILE: crates/openfang-memory/src/consolidation.rs type ConsolidationEngine (line 14) | pub struct ConsolidationEngine { method new (line 22) | pub fn new(conn: Arc>, decay_rate: f32) -> Self { method consolidate (line 27) | pub fn consolidate(&self) -> OpenFangResult { function setup (line 61) | fn setup() -> ConsolidationEngine { function test_consolidation_empty (line 68) | fn test_consolidation_empty() { function test_consolidation_decays_old_memories (line 75) | fn test_consolidation_decays_old_memories() { FILE: crates/openfang-memory/src/knowledge.rs type KnowledgeStore (line 17) | pub struct KnowledgeStore { method new (line 23) | pub fn new(conn: Arc>) -> Self { method add_entity (line 28) | pub fn add_entity(&self, entity: Entity) -> OpenFangResult { method add_relation (line 54) | pub fn add_relation(&self, relation: Relation) -> OpenFangResult OpenFangResult &str { function parse_entity (line 230) | fn parse_entity( function parse_relation (line 258) | fn parse_relation( function setup (line 287) | fn setup() -> KnowledgeStore { function test_add_and_query_entity (line 294) | fn test_add_and_query_entity() { function test_add_relation_and_query (line 310) | fn test_add_relation_and_query() { FILE: crates/openfang-memory/src/migration.rs constant SCHEMA_VERSION (line 8) | const SCHEMA_VERSION: u32 = 8; function run_migrations (line 11) | pub fn run_migrations(conn: &Connection) -> Result<(), rusqlite::Error> { function get_schema_version (line 51) | fn get_schema_version(conn: &Connection) -> u32 { function column_exists (line 57) | fn column_exists(conn: &Connection, table: &str, column: &str) -> bool { function set_schema_version (line 70) | fn set_schema_version(conn: &Connection, version: u32) -> Result<(), rus... function migrate_v1 (line 75) | fn migrate_v1(conn: &Connection) -> Result<(), rusqlite::Error> { function migrate_v2 (line 189) | fn migrate_v2(conn: &Connection) -> Result<(), rusqlite::Error> { function migrate_v3 (line 216) | fn migrate_v3(conn: &Connection) -> Result<(), rusqlite::Error> { function migrate_v4 (line 231) | fn migrate_v4(conn: &Connection) -> Result<(), rusqlite::Error> { function migrate_v5 (line 255) | fn migrate_v5(conn: &Connection) -> Result<(), rusqlite::Error> { function migrate_v6 (line 274) | fn migrate_v6(conn: &Connection) -> Result<(), rusqlite::Error> { function migrate_v7 (line 287) | fn migrate_v7(conn: &Connection) -> Result<(), rusqlite::Error> { function migrate_v8 (line 307) | fn migrate_v8(conn: &Connection) -> Result<(), rusqlite::Error> { function test_migration_creates_tables (line 336) | fn test_migration_creates_tables() { function test_migration_idempotent (line 358) | fn test_migration_idempotent() { FILE: crates/openfang-memory/src/semantic.rs type SemanticStore (line 21) | pub struct SemanticStore { method new (line 27) | pub fn new(conn: Arc>) -> Self { method remember (line 32) | pub fn remember( method remember_with_embedding (line 44) | pub fn remember_with_embedding( method recall (line 84) | pub fn recall( method recall_with_embedding (line 95) | pub fn recall_with_embedding( method forget (line 280) | pub fn forget(&self, id: MemoryId) -> OpenFangResult<()> { method update_embedding (line 294) | pub fn update_embedding(&self, id: MemoryId, embedding: &[f32]) -> Ope... function cosine_similarity (line 310) | fn cosine_similarity(a: &[f32], b: &[f32]) -> f32 { function embedding_to_bytes (line 331) | fn embedding_to_bytes(embedding: &[f32]) -> Vec { function embedding_from_bytes (line 340) | fn embedding_from_bytes(bytes: &[u8]) -> Vec { function setup (line 352) | fn setup() -> SemanticStore { function test_remember_and_recall (line 359) | fn test_remember_and_recall() { function test_recall_with_filter (line 377) | fn test_recall_with_filter() { function test_forget (line 405) | fn test_forget() { function test_remember_with_embedding (line 423) | fn test_remember_with_embedding() { function test_vector_recall_ranking (line 441) | fn test_vector_recall_ranking() { function test_update_embedding (line 495) | fn test_update_embedding() { function test_mixed_embedded_and_non_embedded (line 523) | fn test_mixed_embedded_and_non_embedded() { FILE: crates/openfang-memory/src/session.rs type Session (line 14) | pub struct Session { type SessionStore (line 29) | pub struct SessionStore { method new (line 35) | pub fn new(conn: Arc>) -> Self { method get_session (line 40) | pub fn get_session(&self, session_id: SessionId) -> OpenFangResult OpenFangResult<()> { method delete_session (line 104) | pub fn delete_session(&self, session_id: SessionId) -> OpenFangResult<... method delete_agent_sessions (line 118) | pub fn delete_agent_sessions(&self, agent_id: AgentId) -> OpenFangResu... method delete_canonical_session (line 132) | pub fn delete_canonical_session(&self, agent_id: AgentId) -> OpenFangR... method list_sessions (line 146) | pub fn list_sessions(&self) -> OpenFangResult> { method create_session (line 186) | pub fn create_session(&self, agent_id: AgentId) -> OpenFangResult OpenFangResult... method create_session_with_label (line 301) | pub fn create_session_with_label( method store_llm_summary (line 322) | pub fn store_llm_summary( method load_canonical (line 364) | pub fn load_canonical(&self, agent_id: AgentId) -> OpenFangResult OpenFangResu... method write_jsonl_mirror (line 533) | pub fn write_jsonl_mirror( constant DEFAULT_CANONICAL_WINDOW (line 338) | const DEFAULT_CANONICAL_WINDOW: usize = 50; constant DEFAULT_COMPACTION_THRESHOLD (line 341) | const DEFAULT_COMPACTION_THRESHOLD: usize = 100; type CanonicalSession (line 349) | pub struct CanonicalSession { type JsonlLine (line 520) | struct JsonlLine { function setup (line 625) | fn setup() -> SessionStore { function test_create_and_load_session (line 632) | fn test_create_and_load_session() { function test_save_and_load_with_messages (line 643) | fn test_save_and_load_with_messages() { function test_get_missing_session (line 656) | fn test_get_missing_session() { function test_delete_session (line 663) | fn test_delete_session() { function test_delete_agent_sessions (line 674) | fn test_delete_agent_sessions() { function test_canonical_load_creates_empty (line 687) | fn test_canonical_load_creates_empty() { function test_canonical_append_and_load (line 698) | fn test_canonical_append_and_load() { function test_canonical_context_window (line 721) | fn test_canonical_context_window() { function test_canonical_compaction (line 738) | fn test_canonical_compaction() { function test_canonical_cross_channel_roundtrip (line 754) | fn test_canonical_cross_channel_roundtrip() { function test_jsonl_mirror_write (line 779) | fn test_jsonl_mirror_write() { FILE: crates/openfang-memory/src/structured.rs type StructuredStore (line 11) | pub struct StructuredStore { method new (line 17) | pub fn new(conn: Arc>) -> Self { method get (line 22) | pub fn get(&self, agent_id: AgentId, key: &str) -> OpenFangResult OpenFangResult<(... method list_kv (line 83) | pub fn list_kv(&self, agent_id: AgentId) -> OpenFangResult OpenFangResult<()> { method load_agent (line 161) | pub fn load_agent(&self, agent_id: AgentId) -> OpenFangResult OpenFangResult<()> { method load_all_agents (line 262) | pub fn load_all_agents(&self) -> OpenFangResult> { method list_agents (line 417) | pub fn list_agents(&self) -> OpenFangResult StructuredStore { function test_kv_set_get (line 454) | fn test_kv_set_get() { function test_kv_get_missing (line 465) | fn test_kv_get_missing() { function test_kv_delete (line 473) | fn test_kv_delete() { function test_kv_update (line 485) | fn test_kv_update() { FILE: crates/openfang-memory/src/substrate.rs type MemorySubstrate (line 28) | pub struct MemorySubstrate { method open (line 40) | pub fn open(db_path: &Path, decay_rate: f32) -> OpenFangResult { method open_in_memory (line 59) | pub fn open_in_memory(decay_rate: f32) -> OpenFangResult { method usage (line 77) | pub fn usage(&self) -> &UsageStore { method usage_conn (line 82) | pub fn usage_conn(&self) -> Arc> { method save_agent (line 87) | pub fn save_agent(&self, entry: &AgentEntry) -> OpenFangResult<()> { method load_agent (line 92) | pub fn load_agent(&self, agent_id: AgentId) -> OpenFangResult OpenFangResult<()> { method load_all_agents (line 104) | pub fn load_all_agents(&self) -> OpenFangResult> { method list_agents (line 109) | pub fn list_agents(&self) -> OpenFangResult OpenFangResult OpenF... method structured_set (line 133) | pub fn structured_set( method get_session (line 143) | pub fn get_session(&self, session_id: SessionId) -> OpenFangResult OpenFangResult<()> { method save_session_async (line 154) | pub async fn save_session_async(&self, session: &Session) -> OpenFangR... method create_session (line 163) | pub fn create_session(&self, agent_id: AgentId) -> OpenFangResult OpenFangResult> { method delete_session (line 173) | pub fn delete_session(&self, session_id: SessionId) -> OpenFangResult<... method delete_agent_sessions (line 178) | pub fn delete_agent_sessions(&self, agent_id: AgentId) -> OpenFangResu... method delete_canonical_session (line 183) | pub fn delete_canonical_session(&self, agent_id: AgentId) -> OpenFangR... method set_session_label (line 188) | pub fn set_session_label( method find_session_by_label (line 197) | pub fn find_session_by_label( method list_agent_sessions (line 206) | pub fn list_agent_sessions(&self, agent_id: AgentId) -> OpenFangResult... method create_session_with_label (line 211) | pub fn create_session_with_label( method canonical_context (line 223) | pub fn canonical_context( method store_llm_summary (line 235) | pub fn store_llm_summary( method write_jsonl_mirror (line 249) | pub fn write_jsonl_mirror( method append_canonical (line 258) | pub fn append_canonical( method load_paired_devices (line 274) | pub fn load_paired_devices(&self) -> OpenFangResult OpenFangResult<... method remember_with_embedding (line 341) | pub fn remember_with_embedding( method recall_with_embedding (line 355) | pub fn recall_with_embedding( method update_embedding (line 367) | pub fn update_embedding(&self, id: MemoryId, embedding: &[f32]) -> Ope... method recall_with_embedding_async (line 372) | pub async fn recall_with_embedding_async( method remember_with_embedding_async (line 390) | pub async fn remember_with_embedding_async( method task_post (line 422) | pub async fn task_post( method task_claim (line 452) | pub async fn task_claim(&self, agent_id: &str) -> OpenFangResult Open... method task_list (line 527) | pub async fn task_list(&self, status: Option<&str>) -> OpenFangResult<... method get (line 573) | async fn get(&self, agent_id: AgentId, key: &str) -> OpenFangResult OpenFangResult<(... method remember (line 602) | async fn remember( method recall (line 620) | async fn recall( method forget (line 633) | async fn forget(&self, id: MemoryId) -> OpenFangResult<()> { method add_entity (line 640) | async fn add_entity(&self, entity: Entity) -> OpenFangResult { method add_relation (line 647) | async fn add_relation(&self, relation: Relation) -> OpenFangResult OpenFangResult OpenFangResult { method export (line 668) | async fn export(&self, format: ExportFormat) -> OpenFangResult> { method import (line 673) | async fn import(&self, _data: &[u8], _format: ExportFormat) -> OpenFangR... function test_substrate_kv (line 688) | async fn test_substrate_kv() { function test_substrate_remember_recall (line 700) | async fn test_substrate_remember_recall() { function test_task_post_and_list (line 718) | async fn test_task_post_and_list() { function test_task_claim_and_complete (line 739) | async fn test_task_claim_and_complete() { function test_task_claim_empty (line 771) | async fn test_task_claim_empty() { FILE: crates/openfang-memory/src/usage.rs type UsageRecord (line 12) | pub struct UsageRecord { type UsageSummary (line 29) | pub struct UsageSummary { type ModelUsage (line 44) | pub struct ModelUsage { type DailyBreakdown (line 59) | pub struct DailyBreakdown { type UsageStore (line 72) | pub struct UsageStore { method new (line 78) | pub fn new(conn: Arc>) -> Self { method record (line 83) | pub fn record(&self, record: &UsageRecord) -> OpenFangResult<()> { method query_hourly (line 109) | pub fn query_hourly(&self, agent_id: AgentId) -> OpenFangResult { method query_daily (line 126) | pub fn query_daily(&self, agent_id: AgentId) -> OpenFangResult { method query_monthly (line 143) | pub fn query_monthly(&self, agent_id: AgentId) -> OpenFangResult { method query_global_hourly (line 160) | pub fn query_global_hourly(&self) -> OpenFangResult { method query_global_monthly (line 177) | pub fn query_global_monthly(&self) -> OpenFangResult { method query_summary (line 194) | pub fn query_summary(&self, agent_id: Option) -> OpenFangResu... method query_by_model (line 234) | pub fn query_by_model(&self) -> OpenFangResult> { method query_daily_breakdown (line 268) | pub fn query_daily_breakdown(&self, days: u32) -> OpenFangResult OpenFangResult> { method query_today_cost (line 320) | pub fn query_today_cost(&self) -> OpenFangResult { method cleanup_old (line 337) | pub fn cleanup_old(&self, days: u32) -> OpenFangResult { function setup (line 359) | fn setup() -> UsageStore { function test_record_and_query_summary (line 366) | fn test_record_and_query_summary() { function test_query_summary_all_agents (line 401) | fn test_query_summary_all_agents() { function test_query_by_model (line 434) | fn test_query_by_model() { function test_query_hourly (line 471) | fn test_query_hourly() { function test_query_daily (line 491) | fn test_query_daily() { function test_cleanup_old (line 511) | fn test_cleanup_old() { function test_empty_summary (line 535) | fn test_empty_summary() { FILE: crates/openfang-migrate/src/lib.rs type MigrateSource (line 13) | pub enum MigrateSource { method fmt (line 23) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { type MigrateOptions (line 34) | pub struct MigrateOptions { function run_migration (line 46) | pub fn run_migration(options: &MigrateOptions) -> Result Option { function extract_string_list (line 136) | fn extract_string_list(val: &serde_json::Value) -> Vec { type OpenClawChannels (line 151) | struct OpenClawChannels { type OpenClawTelegramConfig (line 173) | struct OpenClawTelegramConfig { type OpenClawDiscordConfig (line 183) | struct OpenClawDiscordConfig { type OpenClawSlackConfig (line 194) | struct OpenClawSlackConfig { type OpenClawWhatsAppConfig (line 205) | struct OpenClawWhatsAppConfig { type OpenClawSignalConfig (line 215) | struct OpenClawSignalConfig { type OpenClawMatrixConfig (line 227) | struct OpenClawMatrixConfig { type OpenClawGoogleChatConfig (line 239) | struct OpenClawGoogleChatConfig { type OpenClawTeamsConfig (line 249) | struct OpenClawTeamsConfig { type OpenClawIrcConfig (line 260) | struct OpenClawIrcConfig { type OpenClawMattermostConfig (line 274) | struct OpenClawMattermostConfig { type OpenClawFeishuConfig (line 284) | struct OpenClawFeishuConfig { type OpenClawIMessageConfig (line 294) | struct OpenClawIMessageConfig { type OpenClawBlueBubblesConfig (line 304) | struct OpenClawBlueBubblesConfig { type OpenClawSkills (line 314) | struct OpenClawSkills { type LegacyYamlConfig (line 326) | struct LegacyYamlConfig { method default (line 339) | fn default() -> Self { type LegacyYamlMemoryConfig (line 354) | struct LegacyYamlMemoryConfig { type LegacyYamlAgent (line 361) | struct LegacyYamlAgent { method default (line 375) | fn default() -> Self { type LegacyYamlChannelConfig (line 394) | struct LegacyYamlChannelConfig { type OpenFangConfig (line 418) | struct OpenFangConfig { type OpenFangModelConfig (line 427) | struct OpenFangModelConfig { type OpenFangMemorySection (line 436) | struct OpenFangMemorySection { type OpenFangNetworkSection (line 441) | struct OpenFangNetworkSection { function write_secret_env (line 455) | fn write_secret_env(path: &Path, key: &str, value: &str) -> Result<(), s... function map_dm_policy (line 490) | fn map_dm_policy(oc: &str) -> &'static str { function map_group_policy (line 500) | fn map_group_policy(oc: &str) -> &'static str { function build_channel_table (line 510) | fn build_channel_table( type ResolvedModelRef (line 556) | struct ResolvedModelRef { function split_model_ref (line 565) | fn split_model_ref(model_ref: &str) -> (String, String) { function split_model_ref_with_context (line 572) | fn split_model_ref_with_context( function extract_primary_model (line 596) | fn extract_primary_model( function extract_fallback_models (line 624) | fn extract_fallback_models( function find_config_file (line 646) | fn find_config_file(dir: &Path) -> Option { function tools_for_profile (line 672) | fn tools_for_profile(profile: &str) -> Vec { function map_provider (line 686) | fn map_provider(openclaw_provider: &str) -> String { function default_api_key_env (line 723) | fn default_api_key_env(provider: &str) -> String { function is_known_openfang_provider_id (line 757) | fn is_known_openfang_provider_id(provider: &str) -> bool { function json_get_string_case_insensitive (line 800) | fn json_get_string_case_insensitive( function lookup_json5_provider_entry (line 809) | fn lookup_json5_provider_entry<'a>( function resolve_provider_with_models_context (line 831) | fn resolve_provider_with_models_context( function derive_capabilities (line 885) | fn derive_capabilities(tools: &[String]) -> AgentCapabilities { type AgentCapabilities (line 918) | struct AgentCapabilities { function detect_openclaw_home (line 930) | pub fn detect_openclaw_home() -> Option { function scan_openclaw_workspace (line 975) | pub fn scan_openclaw_workspace(path: &Path) -> ScanResult { function scan_from_json5 (line 999) | fn scan_from_json5(base: &Path, config_path: &Path, result: &mut ScanRes... function scan_from_legacy_yaml (line 1131) | fn scan_from_legacy_yaml(path: &Path, result: &mut ScanResult) { type ScanResult (line 1243) | pub struct ScanResult { type ScannedAgent (line 1254) | pub struct ScannedAgent { function migrate (line 1270) | pub fn migrate(options: &MigrateOptions) -> Result) -> Ve... function migrate_memory_files (line 2176) | fn migrate_memory_files( function migrate_workspace_dirs (line 2300) | fn migrate_workspace_dirs( function migrate_sessions (line 2404) | fn migrate_sessions( function report_skipped_features (line 2460) | fn report_skipped_features(root: &OpenClawRoot, source: &Path, report: &... function migrate_from_legacy_yaml (line 2558) | fn migrate_from_legacy_yaml( function migrate_legacy_config (line 2586) | fn migrate_legacy_config( function parse_legacy_channels (line 2656) | fn parse_legacy_channels( function migrate_legacy_agents (line 2915) | fn migrate_legacy_agents( function convert_legacy_agent (line 2985) | fn convert_legacy_agent( function migrate_legacy_memory (line 3107) | fn migrate_legacy_memory( function migrate_legacy_workspaces (line 3159) | fn migrate_legacy_workspaces( function scan_legacy_skills (line 3214) | fn scan_legacy_skills(source: &Path, report: &mut MigrationReport) { function copy_dir_recursive (line 3262) | fn copy_dir_recursive(src: &Path, dst: &Path) -> Result<(), std::io::Err... function create_legacy_yaml_workspace (line 3289) | fn create_legacy_yaml_workspace(dir: &Path) { function create_json5_workspace (line 3324) | fn create_json5_workspace(dir: &Path) { function test_json5_full_migration (line 3473) | fn test_json5_full_migration() { function test_json5_agent_model_parsing (line 3606) | fn test_json5_agent_model_parsing() { function test_json5_channel_extraction (line 3646) | fn test_json5_channel_extraction() { function test_json5_fallback_models (line 3701) | fn test_json5_fallback_models() { function test_json5_tool_profile_resolution (line 3732) | fn test_json5_tool_profile_resolution() { function test_json5_legacy_yaml_fallback (line 3756) | fn test_json5_legacy_yaml_fallback() { function test_json5_detect_home (line 3779) | fn test_json5_detect_home() { function test_json5_session_migration (line 3807) | fn test_json5_session_migration() { function test_json5_memory_both_layouts (line 3833) | fn test_json5_memory_both_layouts() { function test_json5_skipped_features (line 3893) | fn test_json5_skipped_features() { function test_json5_dry_run (line 3946) | fn test_json5_dry_run() { function test_json5_empty_config (line 3970) | fn test_json5_empty_config() { function test_model_ref_split (line 3994) | fn test_model_ref_split() { function test_model_ref_split_with_catalog_preserves_custom_openai_provider (line 4023) | fn test_model_ref_split_with_catalog_preserves_custom_openai_provider() { function test_model_ref_split_with_catalog_uses_api_hint_for_driver (line 4043) | fn test_model_ref_split_with_catalog_uses_api_hint_for_driver() { function test_model_ref_split_with_catalog_unknown_openai_without_base_url_falls_back_to_openai (line 4063) | fn test_model_ref_split_with_catalog_unknown_openai_without_base_url_fal... function test_model_ref_split_with_catalog_alias_gpt_maps_to_openai (line 4079) | fn test_model_ref_split_with_catalog_alias_gpt_maps_to_openai() { function test_model_ref_split_with_catalog_alias_key_mismatch_uses_catalog_metadata (line 4099) | fn test_model_ref_split_with_catalog_alias_key_mismatch_uses_catalog_met... function test_json5_unknown_provider_passthrough (line 4119) | fn test_json5_unknown_provider_passthrough() { function test_full_migration (line 4154) | fn test_full_migration() { function test_dry_run (line 4200) | fn test_dry_run() { function test_source_not_found (line 4221) | fn test_source_not_found() { function test_tool_mapping (line 4234) | fn test_tool_mapping() { function test_provider_mapping (line 4254) | fn test_provider_mapping() { function test_default_api_key_env_mapping (line 4280) | fn test_default_api_key_env_mapping() { function test_tools_for_profile (line 4299) | fn test_tools_for_profile() { function test_convert_agent (line 4317) | fn test_convert_agent() { function test_capability_derivation (line 4338) | fn test_capability_derivation() { function test_unmapped_tools_reported (line 4348) | fn test_unmapped_tools_reported() { function test_scan_workspace (line 4366) | fn test_scan_workspace() { function test_scan_json5_workspace (line 4380) | fn test_scan_json5_workspace() { function test_is_known_openfang_tool (line 4412) | fn test_is_known_openfang_tool() { function test_secrets_migration (line 4421) | fn test_secrets_migration() { function test_policy_migration (line 4484) | fn test_policy_migration() { function test_idempotent_migration (line 4523) | fn test_idempotent_migration() { function test_google_chat_channel_alias (line 4559) | fn test_google_chat_channel_alias() { function test_signal_url_construction (line 4583) | fn test_signal_url_construction() { FILE: crates/openfang-migrate/src/report.rs type MigrationReport (line 7) | pub struct MigrationReport { method to_markdown (line 70) | pub fn to_markdown(&self) -> String { method print_summary (line 136) | pub fn print_summary(&self) { type MigrateItem (line 22) | pub struct MigrateItem { type SkippedItem (line 33) | pub struct SkippedItem { type ItemKind (line 44) | pub enum ItemKind { method fmt (line 55) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { function test_empty_report (line 177) | fn test_empty_report() { function test_report_with_items (line 189) | fn test_report_with_items() { FILE: crates/openfang-migrate/tests/provider_json5_agents.rs function migrate_with_json5 (line 4) | fn migrate_with_json5(json5_content: &str) -> (TempDir, TempDir) { function json5_agent_provider_and_fallback_api_key_env_mapping (line 23) | fn json5_agent_provider_and_fallback_api_key_env_mapping() { function json5_lmstudio_provider_api_key_env_mapping (line 99) | fn json5_lmstudio_provider_api_key_env_mapping() { FILE: crates/openfang-migrate/tests/provider_json5_default_model.rs function assert_default_model_mapping (line 4) | fn assert_default_model_mapping( function json5_default_model_qwencode_maps_to_qwen_and_dashscope_key (line 52) | fn json5_default_model_qwencode_maps_to_qwen_and_dashscope_key() { function json5_default_model_kimicode_maps_to_moonshot_and_moonshot_key (line 57) | fn json5_default_model_kimicode_maps_to_moonshot_and_moonshot_key() { function json5_default_model_copilot_maps_to_github_copilot_and_github_token (line 62) | fn json5_default_model_copilot_maps_to_github_copilot_and_github_token() { FILE: crates/openfang-migrate/tests/provider_json5_provider_catalog.rs function json5_catalog_preserves_custom_openai_provider_and_base_url (line 5) | fn json5_catalog_preserves_custom_openai_provider_and_base_url() { function json5_catalog_api_hint_maps_custom_provider_to_anthropic_driver (line 78) | fn json5_catalog_api_hint_maps_custom_provider_to_anthropic_driver() { function json5_catalog_unknown_openai_without_base_url_falls_back_to_openai (line 155) | fn json5_catalog_unknown_openai_without_base_url_falls_back_to_openai() { function json5_catalog_alias_key_mismatch_still_uses_catalog_metadata (line 224) | fn json5_catalog_alias_key_mismatch_still_uses_catalog_metadata() { FILE: crates/openfang-migrate/tests/provider_legacy_yaml.rs function create_legacy_workspace (line 7) | fn create_legacy_workspace( function migrate_legacy_workspace (line 35) | fn migrate_legacy_workspace(source_dir: &Path, target_dir: &Path) { function assert_config_model_mapping (line 45) | fn assert_config_model_mapping( function assert_agent_model_mapping (line 66) | fn assert_agent_model_mapping( function legacy_yaml_provider_alias_mapping_kimicode_and_copilot (line 89) | fn legacy_yaml_provider_alias_mapping_kimicode_and_copilot() { function legacy_yaml_provider_alias_mapping_qwencode_and_lmstudio (line 109) | fn legacy_yaml_provider_alias_mapping_qwencode_and_lmstudio() { FILE: crates/openfang-runtime/src/a2a.rs type AgentCard (line 27) | pub struct AgentCard { type AgentCapabilities (line 51) | pub struct AgentCapabilities { type AgentSkill (line 62) | pub struct AgentSkill { type A2aTask (line 84) | pub struct A2aTask { type A2aTaskStatus (line 103) | pub enum A2aTaskStatus { type A2aTaskStatusWrapper (line 123) | pub enum A2aTaskStatusWrapper { method state (line 136) | pub fn state(&self) -> &A2aTaskStatus { method from (line 145) | fn from(status: A2aTaskStatus) -> Self { method eq (line 151) | fn eq(&self, other: &A2aTaskStatus) -> bool { type A2aMessage (line 158) | pub struct A2aMessage { type A2aPart (line 168) | pub enum A2aPart { type A2aArtifact (line 187) | pub struct A2aArtifact { type A2aTaskStore (line 216) | pub struct A2aTaskStore { method new (line 224) | pub fn new(max_tasks: usize) -> Self { method insert (line 232) | pub fn insert(&self, task: A2aTask) { method get (line 254) | pub fn get(&self, task_id: &str) -> Option { method update_status (line 263) | pub fn update_status(&self, task_id: &str, status: A2aTaskStatus) -> b... method complete (line 274) | pub fn complete(&self, task_id: &str, response: A2aMessage, artifacts:... method fail (line 284) | pub fn fail(&self, task_id: &str, error_message: A2aMessage) { method cancel (line 293) | pub fn cancel(&self, task_id: &str) -> bool { method len (line 298) | pub fn len(&self) -> usize { method is_empty (line 303) | pub fn is_empty(&self) -> bool { method default (line 309) | fn default() -> Self { function discover_external_agents (line 321) | pub async fn discover_external_agents( function build_agent_card (line 361) | pub fn build_agent_card(manifest: &AgentManifest, base_url: &str) -> Age... type A2aClient (line 397) | pub struct A2aClient { method new (line 403) | pub fn new() -> Self { method discover (line 413) | pub async fn discover(&self, url: &str) -> Result { method send_task (line 440) | pub async fn send_task( method get_task (line 483) | pub async fn get_task(&self, url: &str, task_id: &str) -> Result Self { function test_agent_card_from_manifest (line 525) | fn test_agent_card_from_manifest() { function test_a2a_task_status_transitions (line 541) | fn test_a2a_task_status_transitions() { function test_a2a_task_status_wrapper_object_form (line 578) | fn test_a2a_task_status_wrapper_object_form() { function test_a2a_artifact_optional_fields (line 597) | fn test_a2a_artifact_optional_fields() { function test_a2a_message_serde (line 618) | fn test_a2a_message_serde() { function test_task_store_insert_and_get (line 644) | fn test_task_store_insert_and_get() { function test_task_store_complete_and_fail (line 661) | fn test_task_store_complete_and_fail() { function test_task_store_cancel (line 689) | fn test_task_store_cancel() { function test_task_store_eviction (line 706) | fn test_task_store_eviction() { function test_a2a_config_serde (line 735) | fn test_a2a_config_serde() { FILE: crates/openfang-runtime/src/agent_loop.rs constant MAX_ITERATIONS (line 35) | const MAX_ITERATIONS: u32 = 50; constant MAX_RETRIES (line 38) | const MAX_RETRIES: u32 = 3; constant BASE_RETRY_DELAY_MS (line 41) | const BASE_RETRY_DELAY_MS: u64 = 1000; constant TOOL_TIMEOUT_SECS (line 45) | const TOOL_TIMEOUT_SECS: u64 = 120; constant MAX_CONTINUATIONS (line 49) | const MAX_CONTINUATIONS: u32 = 5; constant MAX_HISTORY_MESSAGES (line 52) | const MAX_HISTORY_MESSAGES: usize = 20; function phantom_action_detected (line 56) | fn phantom_action_detected(text: &str) -> bool { constant TOOL_ERROR_GUIDANCE (line 69) | const TOOL_ERROR_GUIDANCE: &str = function append_tool_error_guidance (line 72) | fn append_tool_error_guidance(tool_result_blocks: &mut Vec) { function strip_provider_prefix (line 88) | pub fn strip_provider_prefix(model: &str, provider: &str) -> String { constant DEFAULT_CONTEXT_WINDOW (line 101) | const DEFAULT_CONTEXT_WINDOW: usize = 200_000; type LoopPhase (line 106) | pub enum LoopPhase { type PhaseCallback (line 121) | pub type PhaseCallback = Arc; type AgentLoopResult (line 125) | pub struct AgentLoopResult { function run_agent_loop (line 145) | pub async fn run_agent_loop( function call_with_retry (line 923) | async fn call_with_retry( function stream_with_retry (line 1035) | async fn stream_with_retry( function run_agent_loop_streaming (line 1151) | pub async fn run_agent_loop_streaming( function recover_text_tool_calls (line 1946) | fn recover_text_tool_calls(text: &str, available_tools: &[ToolDefinition... function parse_json_tool_call_object (line 2518) | fn parse_json_tool_call_object( function parse_arrow_syntax_tool_call (line 2557) | fn parse_arrow_syntax_tool_call( function parse_dash_dash_args (line 2612) | fn parse_dash_dash_args(text: &str) -> serde_json::Value { function try_parse_bare_json_tool_call (line 2708) | fn try_parse_bare_json_tool_call( function test_max_iterations_constant (line 2744) | fn test_max_iterations_constant() { function test_retry_constants (line 2749) | fn test_retry_constants() { function test_dynamic_truncate_short_unchanged (line 2755) | fn test_dynamic_truncate_short_unchanged() { function test_dynamic_truncate_over_limit (line 2763) | fn test_dynamic_truncate_over_limit() { function test_dynamic_truncate_newline_boundary (line 2773) | fn test_dynamic_truncate_newline_boundary() { function test_max_continuations_constant (line 2789) | fn test_max_continuations_constant() { function test_tool_timeout_constant (line 2794) | fn test_tool_timeout_constant() { function test_max_history_messages (line 2799) | fn test_max_history_messages() { function test_manifest (line 2805) | fn test_manifest() -> AgentManifest { type EmptyAfterToolUseDriver (line 2819) | struct EmptyAfterToolUseDriver { method new (line 2824) | fn new() -> Self { method complete (line 2833) | async fn complete( type EmptyMaxTokensDriver (line 2875) | struct EmptyMaxTokensDriver; method complete (line 2879) | async fn complete( type NormalDriver (line 2896) | struct NormalDriver; method complete (line 2900) | async fn complete( function test_empty_response_after_tool_use_returns_fallback (line 2920) | async fn test_empty_response_after_tool_use_returns_fallback() { function test_tool_error_injects_no_fabrication_guidance (line 2973) | async fn test_tool_error_injects_no_fabrication_guidance() { function test_empty_response_max_tokens_returns_fallback (line 3028) | async fn test_empty_response_max_tokens_returns_fallback() { function test_normal_response_not_replaced_by_fallback (line 3081) | async fn test_normal_response_not_replaced_by_fallback() { function test_streaming_empty_response_after_tool_use_returns_fallback (line 3125) | async fn test_streaming_empty_response_after_tool_use_returns_fallback() { type EmptyThenNormalDriver (line 3180) | struct EmptyThenNormalDriver { method new (line 3185) | fn new() -> Self { method complete (line 3194) | async fn complete( type AlwaysEmptyDriver (line 3230) | struct AlwaysEmptyDriver; method complete (line 3234) | async fn complete( function test_empty_first_response_retries_and_recovers (line 3251) | async fn test_empty_first_response_retries_and_recovers() { function test_empty_first_response_fallback_when_retry_also_empty (line 3298) | async fn test_empty_first_response_fallback_when_retry_also_empty() { function test_max_history_messages_constant (line 3346) | async fn test_max_history_messages_constant() { function test_streaming_empty_response_max_tokens_returns_fallback (line 3351) | async fn test_streaming_empty_response_max_tokens_returns_fallback() { function test_recover_text_tool_calls_basic (line 3405) | fn test_recover_text_tool_calls_basic() { function test_recover_text_tool_calls_unknown_tool (line 3421) | fn test_recover_text_tool_calls_unknown_tool() { function test_recover_text_tool_calls_invalid_json (line 3433) | fn test_recover_text_tool_calls_invalid_json() { function test_recover_text_tool_calls_multiple (line 3445) | fn test_recover_text_tool_calls_multiple() { function test_recover_text_tool_calls_no_pattern (line 3466) | fn test_recover_text_tool_calls_no_pattern() { function test_recover_text_tool_calls_empty_tools (line 3478) | fn test_recover_text_tool_calls_empty_tools() { function test_recover_text_tool_calls_nested_json (line 3487) | fn test_recover_text_tool_calls_nested_json() { function test_recover_text_tool_calls_with_surrounding_text (line 3500) | fn test_recover_text_tool_calls_with_surrounding_text() { function test_recover_text_tool_calls_whitespace_in_json (line 3513) | fn test_recover_text_tool_calls_whitespace_in_json() { function test_recover_text_tool_calls_unclosed_tag (line 3527) | fn test_recover_text_tool_calls_unclosed_tag() { function test_recover_text_tool_calls_missing_closing_bracket (line 3540) | fn test_recover_text_tool_calls_missing_closing_bracket() { function test_recover_text_tool_calls_empty_json_object (line 3556) | fn test_recover_text_tool_calls_empty_json_object() { function test_recover_text_tool_calls_mixed_valid_invalid (line 3570) | fn test_recover_text_tool_calls_mixed_valid_invalid() { function test_recover_variant2_basic (line 3594) | fn test_recover_variant2_basic() { function test_recover_variant2_unknown_tool (line 3608) | fn test_recover_variant2_unknown_tool() { function test_recover_variant2_with_surrounding_text (line 3620) | fn test_recover_variant2_with_surrounding_text() { function test_recover_both_variants_mixed (line 3633) | fn test_recover_both_variants_mixed() { function test_recover_tool_tag_variant (line 3655) | fn test_recover_tool_tag_variant() { function test_recover_markdown_code_block (line 3669) | fn test_recover_markdown_code_block() { function test_recover_markdown_code_block_with_lang (line 3683) | fn test_recover_markdown_code_block_with_lang() { function test_recover_backtick_wrapped (line 3696) | fn test_recover_backtick_wrapped() { function test_recover_backtick_ignores_unknown_tool (line 3710) | fn test_recover_backtick_ignores_unknown_tool() { function test_recover_no_duplicates_across_patterns (line 3722) | fn test_recover_no_duplicates_across_patterns() { function test_recover_tool_call_block_json (line 3738) | fn test_recover_tool_call_block_json() { function test_recover_tool_call_block_arrow_syntax (line 3752) | fn test_recover_tool_call_block_arrow_syntax() { function test_recover_tool_call_block_unknown_tool (line 3767) | fn test_recover_tool_call_block_unknown_tool() { function test_recover_tool_call_block_multiple (line 3779) | fn test_recover_tool_call_block_multiple() { function test_recover_tool_call_block_unclosed (line 3800) | fn test_recover_tool_call_block_unclosed() { function test_recover_tool_call_xml_basic (line 3817) | fn test_recover_tool_call_xml_basic() { function test_recover_tool_call_xml_with_surrounding_text (line 3831) | fn test_recover_tool_call_xml_with_surrounding_text() { function test_recover_tool_call_xml_function_field (line 3845) | fn test_recover_tool_call_xml_function_field() { function test_recover_tool_call_xml_parameters_field (line 3858) | fn test_recover_tool_call_xml_parameters_field() { function test_recover_tool_call_xml_stringified_args (line 3872) | fn test_recover_tool_call_xml_stringified_args() { function test_recover_tool_call_xml_unknown_tool (line 3886) | fn test_recover_tool_call_xml_unknown_tool() { function test_recover_tool_call_xml_multiple (line 3898) | fn test_recover_tool_call_xml_multiple() { function test_recover_bare_json_tool_call (line 3921) | fn test_recover_bare_json_tool_call() { function test_recover_bare_json_no_false_positive (line 3936) | fn test_recover_bare_json_no_false_positive() { function test_recover_bare_json_skipped_when_tags_found (line 3948) | fn test_recover_bare_json_skipped_when_tags_found() { function test_recover_xml_attribute_basic (line 3963) | fn test_recover_xml_attribute_basic() { function test_recover_xml_attribute_unknown_tool (line 3977) | fn test_recover_xml_attribute_unknown_tool() { function test_recover_xml_attribute_non_selfclosing (line 3989) | fn test_recover_xml_attribute_non_selfclosing() { function test_recover_plugin_block (line 4004) | fn test_recover_plugin_block() { function test_recover_plugin_block_unknown_tool (line 4018) | fn test_recover_plugin_block_unknown_tool() { function test_recover_action_input (line 4033) | fn test_recover_action_input() { function test_recover_action_input_unknown_tool (line 4047) | fn test_recover_action_input_unknown_tool() { function test_recover_name_json_nextline (line 4061) | fn test_recover_name_json_nextline() { function test_recover_name_json_nextline_unknown (line 4075) | fn test_recover_name_json_nextline_unknown() { function test_recover_tool_use_block (line 4089) | fn test_recover_tool_use_block() { function test_recover_tool_use_block_unknown (line 4103) | fn test_recover_tool_use_block_unknown() { function test_parse_dash_dash_args_basic (line 4117) | fn test_parse_dash_dash_args_basic() { function test_parse_dash_dash_args_multiple (line 4123) | fn test_parse_dash_dash_args_multiple() { function test_parse_dash_dash_args_unquoted_value (line 4130) | fn test_parse_dash_dash_args_unquoted_value() { function test_parse_json_tool_call_object_standard (line 4136) | fn test_parse_json_tool_call_object_standard() { function test_parse_json_tool_call_object_function_field (line 4149) | fn test_parse_json_tool_call_object_function_field() { function test_parse_json_tool_call_object_unknown_tool (line 4162) | fn test_parse_json_tool_call_object_unknown_tool() { type TextToolCallDriver (line 4174) | struct TextToolCallDriver { method new (line 4179) | fn new() -> Self { method complete (line 4188) | async fn complete( function test_text_tool_call_recovery_e2e (line 4226) | async fn test_text_tool_call_recovery_e2e() { function test_normal_flow_unaffected_by_recovery (line 4302) | async fn test_normal_flow_unaffected_by_recovery() { function test_text_tool_call_recovery_streaming_e2e (line 4357) | async fn test_text_tool_call_recovery_streaming_e2e() { FILE: crates/openfang-runtime/src/apply_patch.rs type PatchOp (line 28) | pub enum PatchOp { type Hunk (line 43) | pub struct Hunk { type PatchResult (line 56) | pub struct PatchResult { method is_ok (line 71) | pub fn is_ok(&self) -> bool { method summary (line 76) | pub fn summary(&self) -> String { function parse_patch (line 106) | pub fn parse_patch(input: &str) -> Result, String> { function resolve_patch_path (line 275) | fn resolve_patch_path(raw: &str, workspace_root: &Path) -> Result Patc... function apply_hunks (line 387) | fn apply_hunks(content: &str, hunks: &[Hunk]) -> Result { function find_anchor (line 433) | fn find_anchor(file_lines: &[String], anchor: &[&str]) -> Option { function find_anchor_fuzzy (line 453) | fn find_anchor_fuzzy(file_lines: &[String], anchor: &[&str]) -> Option) -> std::fmt::Result { type AuditEntry (line 41) | pub struct AuditEntry { function compute_entry_hash (line 61) | fn compute_entry_hash( type AuditLog (line 85) | pub struct AuditLog { method new (line 96) | pub fn new() -> Self { method with_db (line 109) | pub fn with_db(conn: Arc>) -> Self { method record (line 180) | pub fn record( method verify_integrity (line 241) | pub fn verify_integrity(&self) -> Result<(), String> { method tip_hash (line 278) | pub fn tip_hash(&self) -> String { method len (line 283) | pub fn len(&self) -> usize { method is_empty (line 288) | pub fn is_empty(&self) -> bool { method recent (line 296) | pub fn recent(&self, n: usize) -> Vec { method default (line 304) | fn default() -> Self { function test_audit_chain_integrity (line 314) | fn test_audit_chain_integrity() { function test_audit_tamper_detection (line 343) | fn test_audit_tamper_detection() { function test_audit_tip_changes (line 361) | fn test_audit_tip_changes() { function test_audit_persists_to_db (line 376) | fn test_audit_persists_to_db() { FILE: crates/openfang-runtime/src/auth_cooldown.rs type CooldownConfig (line 19) | pub struct CooldownConfig { method default (line 43) | fn default() -> Self { type CircuitState (line 65) | pub enum CircuitState { type ProviderState (line 80) | struct ProviderState { method new (line 98) | fn new() -> Self { type CooldownVerdict (line 117) | pub enum CooldownVerdict { type ProviderSnapshot (line 135) | pub struct ProviderSnapshot { function calculate_cooldown (line 148) | fn calculate_cooldown(config: &CooldownConfig, error_count: u32, is_bill... type ProviderCooldown (line 167) | pub struct ProviderCooldown { method new (line 174) | pub fn new(config: CooldownConfig) -> Self { method check (line 182) | pub fn check(&self, provider: &str) -> CooldownVerdict { method record_success (line 231) | pub fn record_success(&self, provider: &str) { method record_failure (line 250) | pub fn record_failure(&self, provider: &str, is_billing: bool) { method record_probe_result (line 294) | pub fn record_probe_result(&self, provider: &str, success: bool) { method get_state (line 314) | pub fn get_state(&self, provider: &str) -> CircuitState { method snapshot (line 336) | pub fn snapshot(&self) -> Vec { method clear_expired (line 375) | pub fn clear_expired(&self) { method force_reset (line 393) | pub fn force_reset(&self, provider: &str) { method select_profile (line 404) | pub fn select_profile( method advance_profile (line 443) | pub fn advance_profile(&self, provider: &str, failed_profile: &str, is... function fast_config (line 475) | fn fast_config() -> CooldownConfig { function test_cooldown_config_defaults (line 491) | fn test_cooldown_config_defaults() { function test_new_provider_allows (line 506) | fn test_new_provider_allows() { function test_single_failure_opens_circuit (line 513) | fn test_single_failure_opens_circuit() { function test_cooldown_duration_escalates (line 520) | fn test_cooldown_duration_escalates() { function test_billing_longer_cooldown (line 544) | fn test_billing_longer_cooldown() { function test_billing_max_cap (line 553) | fn test_billing_max_cap() { function test_success_resets_circuit (line 561) | fn test_success_resets_circuit() { function test_probe_allowed_after_cooldown (line 572) | fn test_probe_allowed_after_cooldown() { function test_probe_interval_throttled (line 587) | fn test_probe_interval_throttled() { function test_probe_success_closes_circuit (line 611) | fn test_probe_success_closes_circuit() { function test_probe_failure_extends_cooldown (line 621) | fn test_probe_failure_extends_cooldown() { function test_clear_expired (line 638) | fn test_clear_expired() { function test_force_reset (line 657) | fn test_force_reset() { function test_snapshot (line 669) | fn test_snapshot() { function test_failure_window_reset (line 689) | fn test_failure_window_reset() { function test_multiple_providers_independent (line 705) | fn test_multiple_providers_independent() { FILE: crates/openfang-runtime/src/browser.rs type WsStream (line 27) | type WsStream = constant CDP_CONNECT_TIMEOUT_SECS (line 32) | const CDP_CONNECT_TIMEOUT_SECS: u64 = 15; constant CDP_COMMAND_TIMEOUT_SECS (line 33) | const CDP_COMMAND_TIMEOUT_SECS: u64 = 30; constant PAGE_LOAD_POLL_INTERVAL_MS (line 34) | const PAGE_LOAD_POLL_INTERVAL_MS: u64 = 200; constant PAGE_LOAD_MAX_POLLS (line 35) | const PAGE_LOAD_MAX_POLLS: u32 = 150; constant MAX_CONTENT_CHARS (line 37) | const MAX_CONTENT_CHARS: usize = 50_000; type BrowserCommand (line 44) | pub enum BrowserCommand { type BrowserResponse (line 59) | pub struct BrowserResponse { method ok (line 66) | fn ok(data: serde_json::Value) -> Self { method err (line 73) | fn err(msg: impl Into) -> Self { type CdpConnection (line 85) | struct CdpConnection { method connect (line 94) | async fn connect(ws_url: &str) -> Result { method reader_loop (line 120) | async fn reader_loop( method send (line 161) | async fn send( method run_js (line 189) | async fn run_js(&self, expression: &str) -> Result Result { method read_devtools_url (line 334) | async fn read_devtools_url(stderr: tokio::process::ChildStderr) -> Res... method find_page_ws (line 370) | async fn find_page_ws(list_url: &str) -> Result { method execute (line 395) | async fn execute(&mut self, cmd: BrowserCommand) -> BrowserResponse { method cmd_navigate (line 418) | async fn cmd_navigate(&self, url: &str) -> BrowserResponse { method cmd_click (line 437) | async fn cmd_click(&self, selector: &str) -> BrowserResponse { method cmd_type (line 483) | async fn cmd_type(&self, selector: &str, text: &str) -> BrowserResponse { method cmd_screenshot (line 516) | async fn cmd_screenshot(&self) -> BrowserResponse { method cmd_read_page (line 542) | async fn cmd_read_page(&self) -> BrowserResponse { method cmd_scroll (line 555) | async fn cmd_scroll(&self, direction: &str, amount: i32) -> BrowserRes... method cmd_wait (line 576) | async fn cmd_wait(&self, selector: &str, timeout_ms: u64) -> BrowserRe... method cmd_run_js (line 598) | async fn cmd_run_js(&self, expression: &str) -> BrowserResponse { method cmd_back (line 605) | async fn cmd_back(&self) -> BrowserResponse { method wait_for_load (line 624) | async fn wait_for_load(&self) { method page_info (line 637) | async fn page_info(&self) -> Result { method drop (line 667) | fn drop(&mut self) { function find_chromium (line 675) | fn find_chromium(config: &BrowserConfig) -> Result { function chromium_candidates (line 745) | fn chromium_candidates() -> Vec { type BrowserManager (line 799) | pub struct BrowserManager { method new (line 806) | pub fn new(config: BrowserConfig) -> Self { method has_session (line 814) | pub fn has_session(&self, agent_id: &str) -> bool { method send_command (line 819) | pub async fn send_command( method close_session (line 838) | pub async fn close_session(&self, agent_id: &str) { method cleanup_agent (line 846) | pub async fn cleanup_agent(&self, agent_id: &str) { method get_or_create (line 851) | async fn get_or_create(&self, agent_id: &str) -> Result { function is_running_as_root (line 1178) | fn is_running_as_root() -> bool { function test_browser_config_defaults (line 1208) | fn test_browser_config_defaults() { function test_browser_command_serialize_navigate (line 1220) | fn test_browser_command_serialize_navigate() { function test_browser_command_serialize_click (line 1230) | fn test_browser_command_serialize_click() { function test_browser_command_serialize_type (line 1240) | fn test_browser_command_serialize_type() { function test_browser_command_serialize_screenshot (line 1251) | fn test_browser_command_serialize_screenshot() { function test_browser_command_serialize_read_page (line 1258) | fn test_browser_command_serialize_read_page() { function test_browser_command_serialize_close (line 1265) | fn test_browser_command_serialize_close() { function test_browser_command_serialize_scroll (line 1272) | fn test_browser_command_serialize_scroll() { function test_browser_command_serialize_run_js (line 1283) | fn test_browser_command_serialize_run_js() { function test_browser_command_serialize_back (line 1292) | fn test_browser_command_serialize_back() { function test_browser_command_serialize_wait (line 1299) | fn test_browser_command_serialize_wait() { function test_browser_response_deserialize (line 1310) | fn test_browser_response_deserialize() { function test_browser_response_error_deserialize (line 1322) | fn test_browser_response_error_deserialize() { function test_browser_manager_new (line 1331) | fn test_browser_manager_new() { function test_is_running_as_root_returns_bool (line 1338) | fn test_is_running_as_root_returns_bool() { function test_chromium_candidates_not_empty (line 1344) | fn test_chromium_candidates_not_empty() { function test_response_helpers (line 1353) | fn test_response_helpers() { FILE: crates/openfang-runtime/src/command_lane.rs type Lane (line 14) | pub enum Lane { method fmt (line 24) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { type LaneOccupancy (line 35) | pub struct LaneOccupancy { type CommandQueue (line 46) | pub struct CommandQueue { method new (line 57) | pub fn new() -> Self { method with_capacities (line 69) | pub fn with_capacities(main: u32, cron: u32, subagent: u32) -> Self { method submit (line 83) | pub async fn submit(&self, lane: Lane, work: F) -> Result(&self, lane: Lane, work: F) -> Option method occupancy (line 109) | pub fn occupancy(&self) -> Vec { method semaphore_for (line 129) | fn semaphore_for(&self, lane: Lane) -> &Arc { method default (line 139) | fn default() -> Self { function test_main_lane_serialization (line 150) | async fn test_main_lane_serialization() { function test_cron_lane_parallel (line 168) | async fn test_cron_lane_parallel() { function test_occupancy (line 192) | async fn test_occupancy() { function test_try_submit_when_full (line 203) | async fn test_try_submit_when_full() { function test_custom_capacities (line 216) | async fn test_custom_capacities() { FILE: crates/openfang-runtime/src/compactor.rs type CompactionConfig (line 24) | pub struct CompactionConfig { method default (line 50) | fn default() -> Self { type CompactionResult (line 69) | pub struct CompactionResult { function needs_compaction (line 83) | pub fn needs_compaction(session: &Session, config: &CompactionConfig) ->... function estimate_token_count (line 90) | pub fn estimate_token_count( function needs_compaction_by_tokens (line 126) | pub fn needs_compaction_by_tokens(estimated_tokens: usize, config: &Comp... type ContextPressure (line 138) | pub enum ContextPressure { method from_percent (line 150) | fn from_percent(pct: f64) -> Self { method color (line 163) | pub fn color(&self) -> &'static str { type ContextBreakdown (line 175) | pub struct ContextBreakdown { type ContextReport (line 183) | pub struct ContextReport { function generate_context_report (line 194) | pub fn generate_context_report( function format_context_report (line 256) | pub fn format_context_report(report: &ContextReport) -> String { function compute_adaptive_chunk_ratio (line 292) | fn compute_adaptive_chunk_ratio(messages: &[Message], config: &Compactio... function is_oversized (line 319) | fn is_oversized(message: &Message, config: &CompactionConfig) -> bool { function build_conversation_text (line 327) | fn build_conversation_text(messages: &[Message], config: &CompactionConf... function summarize_messages (line 421) | async fn summarize_messages( function summarize_in_chunks (line 503) | async fn summarize_in_chunks( function compact_session (line 620) | pub async fn compact_session( function test_needs_compaction_below_threshold (line 727) | fn test_needs_compaction_below_threshold() { function test_needs_compaction_above_threshold (line 740) | fn test_needs_compaction_above_threshold() { function test_compaction_config_defaults (line 756) | fn test_compaction_config_defaults() { function test_compact_session_few_messages (line 766) | async fn test_compact_session_few_messages() { function test_compact_includes_tool_calls (line 818) | async fn test_compact_includes_tool_calls() { function test_compact_truncates_large_tool_input (line 904) | fn test_compact_truncates_large_tool_input() { function test_compact_session_many_messages (line 921) | async fn test_compact_session_many_messages() { function test_adaptive_chunk_ratio_short_messages (line 978) | fn test_adaptive_chunk_ratio_short_messages() { function test_adaptive_chunk_ratio_long_messages (line 990) | fn test_adaptive_chunk_ratio_long_messages() { function test_adaptive_chunk_ratio_medium_messages (line 1002) | fn test_adaptive_chunk_ratio_medium_messages() { function test_adaptive_chunk_ratio_empty (line 1014) | fn test_adaptive_chunk_ratio_empty() { function test_oversized_message_detection (line 1025) | fn test_oversized_message_detection() { function test_compaction_config_new_defaults (line 1043) | fn test_compaction_config_new_defaults() { function test_fallback_on_llm_failure (line 1059) | async fn test_fallback_on_llm_failure() { function test_chunked_summarization_splits_correctly (line 1113) | async fn test_chunked_summarization_splits_correctly() { function test_compaction_result_new_fields (line 1167) | fn test_compaction_result_new_fields() { function test_build_conversation_text_handles_all_blocks (line 1190) | fn test_build_conversation_text_handles_all_blocks() { function test_build_conversation_text_truncates_oversized (line 1236) | fn test_build_conversation_text_truncates_oversized() { function test_estimate_token_count_basic (line 1254) | fn test_estimate_token_count_basic() { function test_estimate_token_count_with_system_prompt (line 1266) | fn test_estimate_token_count_with_system_prompt() { function test_estimate_token_count_with_tools (line 1275) | fn test_estimate_token_count_with_tools() { function test_needs_compaction_by_tokens_below (line 1289) | fn test_needs_compaction_by_tokens_below() { function test_needs_compaction_by_tokens_above (line 1296) | fn test_needs_compaction_by_tokens_above() { function test_context_pressure_from_percent (line 1303) | fn test_context_pressure_from_percent() { function test_generate_context_report_basic (line 1314) | fn test_generate_context_report_basic() { function test_generate_context_report_critical (line 1326) | fn test_generate_context_report_critical() { function test_format_context_report (line 1336) | fn test_format_context_report() { function test_compaction_strips_base64_blobs (line 1346) | fn test_compaction_strips_base64_blobs() { function test_compaction_applies_2k_cap (line 1366) | fn test_compaction_applies_2k_cap() { function test_compaction_short_results_unchanged (line 1391) | fn test_compaction_short_results_unchanged() { FILE: crates/openfang-runtime/src/context_budget.rs type ContextBudget (line 14) | pub struct ContextBudget { method new (line 25) | pub fn new(context_window_tokens: usize) -> Self { method per_result_cap (line 34) | pub fn per_result_cap(&self) -> usize { method single_result_max (line 40) | pub fn single_result_max(&self) -> usize { method total_tool_headroom_chars (line 46) | pub fn total_tool_headroom_chars(&self) -> usize { method default (line 53) | fn default() -> Self { function truncate_tool_result_dynamic (line 61) | pub fn truncate_tool_result_dynamic(content: &str, budget: &ContextBudge... function apply_context_guard (line 100) | pub fn apply_context_guard( function truncate_to (line 201) | fn truncate_to(content: &str, max_chars: usize) -> String { function test_budget_defaults (line 233) | fn test_budget_defaults() { function test_small_model_budget (line 241) | fn test_small_model_budget() { function test_truncate_within_limit (line 248) | fn test_truncate_within_limit() { function test_truncate_breaks_at_newline (line 255) | fn test_truncate_breaks_at_newline() { function test_context_guard_no_compaction_needed (line 268) | fn test_context_guard_no_compaction_needed() { function test_context_guard_compacts_oldest (line 276) | fn test_context_guard_compacts_oldest() { function test_truncate_tool_result_multibyte_chinese (line 313) | fn test_truncate_tool_result_multibyte_chinese() { function test_truncate_to_multibyte_emoji (line 327) | fn test_truncate_to_multibyte_emoji() { function test_context_guard_multibyte_tool_results (line 337) | fn test_context_guard_multibyte_tool_results() { FILE: crates/openfang-runtime/src/context_overflow.rs type RecoveryStage (line 17) | pub enum RecoveryStage { function estimate_tokens (line 31) | fn estimate_tokens(messages: &[Message], system_prompt: &str, tools: &[T... function recover_from_overflow (line 38) | pub fn recover_from_overflow( function make_messages (line 144) | fn make_messages(count: usize, size_each: usize) -> Vec { function test_no_recovery_needed (line 161) | fn test_no_recovery_needed() { function test_stage1_moderate_trim (line 168) | fn test_stage1_moderate_trim() { function test_stage2_aggressive_trim (line 187) | fn test_stage2_aggressive_trim() { function test_stage3_tool_truncation (line 201) | fn test_stage3_tool_truncation() { function test_cascading_stages (line 237) | fn test_cascading_stages() { function test_stage3_multibyte_tool_truncation (line 247) | fn test_stage3_multibyte_tool_truncation() { FILE: crates/openfang-runtime/src/copilot_oauth.rs constant GITHUB_DEVICE_CODE_URL (line 11) | const GITHUB_DEVICE_CODE_URL: &str = "https://github.com/login/device/co... constant GITHUB_TOKEN_URL (line 14) | const GITHUB_TOKEN_URL: &str = "https://github.com/login/oauth/access_to... constant COPILOT_CLIENT_ID (line 17) | const COPILOT_CLIENT_ID: &str = "Iv1.b507a08c87ecfe98"; type DeviceCodeResponse (line 21) | pub struct DeviceCodeResponse { type DeviceFlowStatus (line 30) | pub enum DeviceFlowStatus { function start_device_flow (line 49) | pub async fn start_device_flow() -> Result { function poll_device_flow (line 78) | pub async fn poll_device_flow(device_code: &str) -> DeviceFlowStatus { function test_constants (line 144) | fn test_constants() { FILE: crates/openfang-runtime/src/docker_sandbox.rs type SandboxContainer (line 13) | pub struct SandboxContainer { type ExecResult (line 21) | pub struct ExecResult { function sanitize_container_name (line 28) | fn sanitize_container_name(name: &str) -> Result { function validate_image_name (line 49) | fn validate_image_name(image: &str) -> Result<(), String> { function validate_command (line 65) | fn validate_command(command: &str) -> Result<(), String> { function is_docker_available (line 78) | pub async fn is_docker_available() -> bool { function create_sandbox (line 94) | pub async fn create_sandbox( function exec_in_sandbox (line 176) | pub async fn exec_in_sandbox( function destroy_sandbox (line 227) | pub async fn destroy_sandbox(container: &SandboxContainer) -> Result<(),... type PoolEntry (line 257) | struct PoolEntry { type ContainerPool (line 265) | pub struct ContainerPool { method new (line 271) | pub fn new() -> Self { method acquire (line 278) | pub fn acquire(&self, config_hash: u64, cool_secs: u64) -> Option usize { method is_empty (line 332) | pub fn is_empty(&self) -> bool { method default (line 338) | fn default() -> Self { constant BLOCKED_MOUNT_PATHS (line 348) | const BLOCKED_MOUNT_PATHS: &[&str] = &[ function validate_bind_mount (line 365) | pub fn validate_bind_mount(path: &str, blocked: &[String]) -> Result<(),... function config_hash (line 421) | pub fn config_hash(config: &DockerSandboxConfig) -> u64 { function test_sanitize_container_name_valid (line 436) | fn test_sanitize_container_name_valid() { function test_sanitize_container_name_special_chars (line 442) | fn test_sanitize_container_name_special_chars() { function test_sanitize_container_name_empty (line 449) | fn test_sanitize_container_name_empty() { function test_sanitize_container_name_too_long (line 454) | fn test_sanitize_container_name_too_long() { function test_validate_image_name_valid (line 460) | fn test_validate_image_name_valid() { function test_validate_image_name_empty (line 467) | fn test_validate_image_name_empty() { function test_validate_image_name_invalid (line 472) | fn test_validate_image_name_invalid() { function test_validate_command_valid (line 479) | fn test_validate_command_valid() { function test_validate_command_pipe_blocked (line 485) | fn test_validate_command_pipe_blocked() { function test_validate_command_empty (line 491) | fn test_validate_command_empty() { function test_validate_command_backticks (line 496) | fn test_validate_command_backticks() { function test_validate_command_dollar_paren (line 501) | fn test_validate_command_dollar_paren() { function test_validate_command_dollar_brace (line 506) | fn test_validate_command_dollar_brace() { function test_docker_available (line 511) | async fn test_docker_available() { function test_config_defaults (line 517) | fn test_config_defaults() { function test_exec_result_fields (line 534) | fn test_exec_result_fields() { function test_container_pool_empty (line 547) | fn test_container_pool_empty() { function test_container_pool_release_acquire (line 554) | fn test_container_pool_release_acquire() { function test_container_pool_hash_mismatch (line 572) | fn test_container_pool_hash_mismatch() { function test_validate_bind_mount_valid (line 589) | fn test_validate_bind_mount_valid() { function test_validate_bind_mount_non_absolute (line 595) | fn test_validate_bind_mount_non_absolute() { function test_validate_bind_mount_blocked_paths (line 600) | fn test_validate_bind_mount_blocked_paths() { function test_validate_bind_mount_traversal (line 608) | fn test_validate_bind_mount_traversal() { function test_validate_bind_mount_custom_blocked (line 613) | fn test_validate_bind_mount_custom_blocked() { function test_config_hash_deterministic (line 620) | fn test_config_hash_deterministic() { function test_config_hash_different_images (line 627) | fn test_config_hash_different_images() { FILE: crates/openfang-runtime/src/drivers/anthropic.rs type AnthropicDriver (line 18) | pub struct AnthropicDriver { method new (line 26) | pub fn new(api_key: String, base_url: String) -> Self { type ApiRequest (line 40) | struct ApiRequest { type ApiMessage (line 55) | struct ApiMessage { type ApiContent (line 62) | enum ApiContent { type ApiContentBlock (line 69) | enum ApiContentBlock { type ApiImageSource (line 90) | struct ApiImageSource { type ApiTool (line 98) | struct ApiTool { type ApiResponse (line 106) | struct ApiResponse { type ResponseContentBlock (line 114) | enum ResponseContentBlock { type ApiUsage (line 128) | struct ApiUsage { type ApiErrorResponse (line 135) | struct ApiErrorResponse { type ApiErrorDetail (line 140) | struct ApiErrorDetail { type ContentBlockAccum (line 145) | enum ContentBlockAccum { method complete (line 157) | async fn complete(&self, request: CompletionRequest) -> Result ApiMessage { function convert_response (line 612) | fn convert_response(api: ApiResponse) -> CompletionResponse { function test_convert_message_text (line 663) | fn test_convert_message_text() { function test_convert_response (line 670) | fn test_convert_response() { FILE: crates/openfang-runtime/src/drivers/claude_code.rs constant SENSITIVE_ENV_EXACT (line 24) | const SENSITIVE_ENV_EXACT: &[&str] = &[ constant SENSITIVE_SUFFIXES (line 50) | const SENSITIVE_SUFFIXES: &[&str] = &["_SECRET", "_TOKEN", "_PASSWORD"]; constant DEFAULT_MESSAGE_TIMEOUT_SECS (line 53) | const DEFAULT_MESSAGE_TIMEOUT_SECS: u64 = 300; type ClaudeCodeDriver (line 56) | pub struct ClaudeCodeDriver { method new (line 72) | pub fn new(cli_path: Option, skip_permissions: bool) -> Self { method with_timeout (line 92) | pub fn with_timeout( method active_pids (line 104) | pub fn active_pids(&self) -> Vec<(String, u32)> { method pid_map (line 112) | pub fn pid_map(&self) -> Arc> { method detect (line 117) | pub fn detect() -> Option { method build_prompt (line 133) | fn build_prompt(request: &CompletionRequest) -> String { method model_flag (line 156) | fn model_flag(model: &str) -> Option { method apply_env_filter (line 171) | fn apply_env_filter(cmd: &mut tokio::process::Command) { type ClaudeJsonOutput (line 196) | struct ClaudeJsonOutput { type ClaudeUsage (line 211) | struct ClaudeUsage { type ClaudeStreamEvent (line 220) | struct ClaudeStreamEvent { method complete (line 233) | async fn complete(&self, request: CompletionRequest) -> Result bool { function claude_credentials_exist (line 602) | fn claude_credentials_exist() -> bool { function home_dir (line 613) | fn home_dir() -> Option { function test_build_prompt_simple (line 631) | fn test_build_prompt_simple() { function test_model_flag_mapping (line 655) | fn test_model_flag_mapping() { function test_new_defaults_to_claude (line 675) | fn test_new_defaults_to_claude() { function test_new_with_custom_path (line 683) | fn test_new_with_custom_path() { function test_new_with_empty_path (line 689) | fn test_new_with_empty_path() { function test_with_timeout (line 695) | fn test_with_timeout() { function test_pid_map_shared (line 702) | fn test_pid_map_shared() { function test_sensitive_env_list_coverage (line 711) | fn test_sensitive_env_list_coverage() { FILE: crates/openfang-runtime/src/drivers/copilot.rs constant COPILOT_TOKEN_URL (line 12) | const COPILOT_TOKEN_URL: &str = "https://api.github.com/copilot_internal... constant TOKEN_EXCHANGE_TIMEOUT (line 15) | const TOKEN_EXCHANGE_TIMEOUT: Duration = Duration::from_secs(10); constant REFRESH_BUFFER_SECS (line 18) | const REFRESH_BUFFER_SECS: u64 = 300; constant GITHUB_COPILOT_BASE_URL (line 21) | pub const GITHUB_COPILOT_BASE_URL: &str = "https://api.githubcopilot.com"; type CachedToken (line 25) | pub struct CachedToken { method is_valid (line 36) | pub fn is_valid(&self) -> bool { type CopilotTokenCache (line 42) | pub struct CopilotTokenCache { method new (line 47) | pub fn new() -> Self { method get (line 54) | pub fn get(&self) -> Option { method set (line 60) | pub fn set(&self, token: CachedToken) { method default (line 67) | fn default() -> Self { function exchange_copilot_token (line 78) | pub async fn exchange_copilot_token(github_token: &str) -> Result (String, Option) { function copilot_auth_available (line 158) | pub fn copilot_auth_available() -> bool { type CopilotDriver (line 166) | pub struct CopilotDriver { method new (line 172) | pub fn new(github_token: String, _base_url: String) -> Self { method ensure_token (line 180) | async fn ensure_token(&self) -> Result super::openai::Ope... method complete (line 225) | async fn complete( method stream (line 234) | async fn stream( function test_parse_copilot_token_with_proxy (line 250) | fn test_parse_copilot_token_with_proxy() { function test_parse_copilot_token_without_proxy (line 258) | fn test_parse_copilot_token_without_proxy() { function test_parse_copilot_token_simple (line 266) | fn test_parse_copilot_token_simple() { function test_token_cache_empty (line 274) | fn test_token_cache_empty() { function test_token_cache_set_get (line 280) | fn test_token_cache_set_get() { function test_token_validity_check (line 294) | fn test_token_validity_check() { function test_copilot_base_url (line 313) | fn test_copilot_base_url() { FILE: crates/openfang-runtime/src/drivers/fallback.rs type FallbackDriver (line 16) | pub struct FallbackDriver { method new (line 24) | pub fn new(drivers: Vec>) -> Self { method with_models (line 31) | pub fn with_models(drivers: Vec<(Arc, String)>) -> Self { method complete (line 38) | async fn complete(&self, request: CompletionRequest) -> Result Result Result CompletionRequest { function test_fallback_primary_succeeds (line 168) | async fn test_fallback_primary_succeeds() { function test_fallback_primary_fails_secondary_succeeds (line 179) | async fn test_fallback_primary_fails_secondary_succeeds() { function test_fallback_all_fail (line 189) | async fn test_fallback_all_fail() { function test_rate_limit_falls_through (line 199) | async fn test_rate_limit_falls_through() { function test_rate_limit_all_fail (line 225) | async fn test_rate_limit_all_fail() { FILE: crates/openfang-runtime/src/drivers/gemini.rs type GeminiDriver (line 23) | pub struct GeminiDriver { method new (line 31) | pub fn new(api_key: String, base_url: String) -> Self { type GeminiRequest (line 48) | struct GeminiRequest { type GeminiContent (line 60) | struct GeminiContent { type GeminiPart (line 75) | enum GeminiPart { type GeminiInlineData (line 123) | struct GeminiInlineData { type GeminiFunctionCallData (line 130) | struct GeminiFunctionCallData { type GeminiFunctionResponseData (line 136) | struct GeminiFunctionResponseData { type GeminiToolConfig (line 144) | struct GeminiToolConfig { type GeminiFunctionDeclaration (line 150) | struct GeminiFunctionDeclaration { type GenerationConfig (line 159) | struct GenerationConfig { type GeminiResponse (line 171) | struct GeminiResponse { type GeminiCandidate (line 180) | struct GeminiCandidate { type GeminiUsageMetadata (line 188) | struct GeminiUsageMetadata { type GeminiErrorResponse (line 197) | struct GeminiErrorResponse { type GeminiErrorDetail (line 203) | struct GeminiErrorDetail { function parse_gemini_error (line 212) | fn parse_gemini_error(body: &str) -> String { function convert_messages (line 231) | fn convert_messages( function extract_system (line 343) | fn extract_system(messages: &[Message], system: &Option) -> Opti... function convert_tools (line 367) | fn convert_tools(request: &CompletionRequest) -> Vec { function convert_response (line 393) | fn convert_response(resp: GeminiResponse) -> Result Result Option { function create_driver (line 257) | pub fn create_driver(config: &DriverConfig) -> Result... function detect_available_provider (line 462) | pub fn detect_available_provider() -> Option<(&'static str, &'static str... function known_providers (line 515) | pub fn known_providers() -> &'static [&'static str] { function test_provider_defaults_groq (line 562) | fn test_provider_defaults_groq() { function test_provider_defaults_openrouter (line 570) | fn test_provider_defaults_openrouter() { function test_provider_defaults_ollama (line 577) | fn test_provider_defaults_ollama() { function test_unknown_provider_returns_none (line 583) | fn test_unknown_provider_returns_none() { function test_custom_provider_with_base_url (line 588) | fn test_custom_provider_with_base_url() { function test_unknown_provider_no_url_errors (line 600) | fn test_unknown_provider_no_url_errors() { function test_provider_defaults_gemini (line 612) | fn test_provider_defaults_gemini() { function test_provider_defaults_google_alias (line 620) | fn test_provider_defaults_google_alias() { function test_known_providers_list (line 627) | fn test_known_providers_list() { function test_provider_defaults_perplexity (line 662) | fn test_provider_defaults_perplexity() { function test_provider_defaults_xai (line 670) | fn test_provider_defaults_xai() { function test_provider_defaults_cohere (line 678) | fn test_provider_defaults_cohere() { function test_provider_defaults_cerebras (line 685) | fn test_provider_defaults_cerebras() { function test_provider_defaults_huggingface (line 692) | fn test_provider_defaults_huggingface() { function test_nvidia_provider_with_env_key (line 700) | fn test_nvidia_provider_with_env_key() { function test_nvidia_provider_no_key_errors (line 719) | fn test_nvidia_provider_no_key_errors() { function test_custom_provider_key_no_url_helpful_error (line 732) | fn test_custom_provider_key_no_url_helpful_error() { function test_provider_defaults_kimi_coding (line 754) | fn test_provider_defaults_kimi_coding() { function test_custom_provider_explicit_key_with_url (line 762) | fn test_custom_provider_explicit_key_with_url() { function test_provider_defaults_azure (line 775) | fn test_provider_defaults_azure() { function test_provider_defaults_azure_openai_alias (line 783) | fn test_provider_defaults_azure_openai_alias() { function test_azure_driver_creation_with_key_and_url (line 790) | fn test_azure_driver_creation_with_key_and_url() { function test_azure_driver_no_key_errors (line 804) | fn test_azure_driver_no_key_errors() { function test_azure_driver_no_url_errors (line 824) | fn test_azure_driver_no_url_errors() { function test_azure_openai_alias_driver_creation (line 842) | fn test_azure_openai_alias_driver_creation() { FILE: crates/openfang-runtime/src/drivers/openai.rs constant AZURE_API_VERSION (line 16) | const AZURE_API_VERSION: &str = "2024-10-21"; type OpenAIDriver (line 19) | pub struct OpenAIDriver { method new (line 30) | pub fn new(api_key: String, base_url: String) -> Self { method new_azure (line 48) | pub fn new_azure(api_key: String, base_url: String) -> Self { method needs_reasoning_content (line 62) | fn needs_reasoning_content(&self, model: &str) -> bool { method with_extra_headers (line 69) | pub fn with_extra_headers(mut self, headers: Vec<(String, String)>) ->... method chat_url (line 78) | fn chat_url(&self, model: &str) -> String { method apply_auth (line 95) | fn apply_auth(&self, mut builder: reqwest::RequestBuilder) -> reqwest:... type OaiRequest (line 110) | struct OaiRequest { function uses_completion_tokens (line 136) | fn uses_completion_tokens(model: &str) -> bool { function rejects_temperature (line 150) | fn rejects_temperature(model: &str) -> bool { function temperature_must_be_one (line 169) | fn temperature_must_be_one(model: &str) -> bool { type OaiMessage (line 175) | struct OaiMessage { type OaiMessageContent (line 191) | enum OaiMessageContent { type OaiContentPart (line 199) | enum OaiContentPart { type OaiImageUrl (line 207) | struct OaiImageUrl { type OaiToolCall (line 212) | struct OaiToolCall { type OaiFunction (line 220) | struct OaiFunction { type OaiTool (line 226) | struct OaiTool { type OaiToolDef (line 233) | struct OaiToolDef { type OaiResponse (line 240) | struct OaiResponse { type OaiChoice (line 246) | struct OaiChoice { type OaiResponseMessage (line 252) | struct OaiResponseMessage { type OaiUsage (line 261) | struct OaiUsage { method complete (line 268) | async fn complete(&self, request: CompletionRequest) -> Result (String, Option) { function extract_thinking_summary (line 1431) | fn extract_thinking_summary(thinking: &str) -> String { function extract_max_tokens_limit (line 1462) | fn extract_max_tokens_limit(body: &str) -> Option { function parse_groq_failed_tool_call (line 1488) | fn parse_groq_failed_tool_call(body: &str) -> Option { function test_openai_driver_creation (line 1567) | fn test_openai_driver_creation() { function test_parse_groq_failed_tool_call (line 1573) | fn test_parse_groq_failed_tool_call() { function test_parse_groq_failed_tool_call_with_space (line 1587) | fn test_parse_groq_failed_tool_call_with_space() { function test_rejects_temperature_o1_models (line 1598) | fn test_rejects_temperature_o1_models() { function test_rejects_temperature_o3_models (line 1607) | fn test_rejects_temperature_o3_models() { function test_rejects_temperature_o4_models (line 1615) | fn test_rejects_temperature_o4_models() { function test_rejects_temperature_gpt5_mini (line 1621) | fn test_rejects_temperature_gpt5_mini() { function test_rejects_temperature_reasoning_suffix (line 1629) | fn test_rejects_temperature_reasoning_suffix() { function test_does_not_reject_temperature_normal_models (line 1635) | fn test_does_not_reject_temperature_normal_models() { function test_uses_completion_tokens_gpt5 (line 1648) | fn test_uses_completion_tokens_gpt5() { function test_uses_completion_tokens_o_series (line 1656) | fn test_uses_completion_tokens_o_series() { function test_does_not_use_completion_tokens_normal_models (line 1666) | fn test_does_not_use_completion_tokens_normal_models() { function test_extract_max_tokens_limit (line 1675) | fn test_extract_max_tokens_limit() { function test_extract_max_tokens_limit_no_match (line 1681) | fn test_extract_max_tokens_limit_no_match() { function test_extract_think_tags_no_tags (line 1688) | fn test_extract_think_tags_no_tags() { function test_extract_think_tags_with_thinking (line 1695) | fn test_extract_think_tags_with_thinking() { function test_extract_think_tags_only_thinking (line 1703) | fn test_extract_think_tags_only_thinking() { function test_extract_think_tags_multiple_blocks (line 1712) | fn test_extract_think_tags_multiple_blocks() { function test_extract_think_tags_unclosed (line 1723) | fn test_extract_think_tags_unclosed() { function test_extract_thinking_summary_empty (line 1733) | fn test_extract_thinking_summary_empty() { function test_extract_thinking_summary_single_paragraph (line 1739) | fn test_extract_thinking_summary_single_paragraph() { function test_extract_thinking_summary_multiple_paragraphs (line 1745) | fn test_extract_thinking_summary_multiple_paragraphs() { function test_oai_response_message_with_reasoning_content (line 1754) | fn test_oai_response_message_with_reasoning_content() { function test_oai_response_message_without_reasoning_content (line 1763) | fn test_oai_response_message_without_reasoning_content() { function test_oai_response_message_null_content_null_reasoning (line 1771) | fn test_oai_response_message_null_content_null_reasoning() { function test_azure_driver_creation (line 1781) | fn test_azure_driver_creation() { function test_standard_driver_not_azure (line 1790) | fn test_standard_driver_not_azure() { function test_azure_chat_url (line 1799) | fn test_azure_chat_url() { function test_azure_chat_url_trailing_slash (line 1812) | fn test_azure_chat_url_trailing_slash() { function test_standard_chat_url (line 1825) | fn test_standard_chat_url() { FILE: crates/openfang-runtime/src/drivers/qwen_code.rs constant SENSITIVE_ENV_EXACT (line 17) | const SENSITIVE_ENV_EXACT: &[&str] = &[ constant SENSITIVE_SUFFIXES (line 43) | const SENSITIVE_SUFFIXES: &[&str] = &["_SECRET", "_TOKEN", "_PASSWORD"]; type QwenCodeDriver (line 46) | pub struct QwenCodeDriver { method new (line 57) | pub fn new(cli_path: Option, skip_permissions: bool) -> Self { method detect (line 75) | pub fn detect() -> Option { method build_args (line 91) | pub fn build_args(&self, prompt: &str, model: &str, streaming: bool) -... method build_prompt (line 116) | fn build_prompt(request: &CompletionRequest) -> String { method model_flag (line 139) | fn model_flag(model: &str) -> Option { method apply_env_filter (line 150) | fn apply_env_filter(cmd: &mut tokio::process::Command) { type QwenJsonOutput (line 171) | struct QwenJsonOutput { type QwenUsage (line 186) | struct QwenUsage { type QwenStreamEvent (line 195) | struct QwenStreamEvent { method complete (line 208) | async fn complete(&self, request: CompletionRequest) -> Result bool { function qwen_credentials_exist (line 422) | fn qwen_credentials_exist() -> bool { function home_dir (line 434) | fn home_dir() -> Option { function test_build_prompt_simple (line 452) | fn test_build_prompt_simple() { function test_model_flag_mapping (line 476) | fn test_model_flag_mapping() { function test_new_defaults_to_qwen (line 500) | fn test_new_defaults_to_qwen() { function test_new_with_custom_path (line 507) | fn test_new_with_custom_path() { function test_new_with_empty_path (line 513) | fn test_new_with_empty_path() { function test_skip_permissions_disabled (line 519) | fn test_skip_permissions_disabled() { function test_sensitive_env_list_coverage (line 525) | fn test_sensitive_env_list_coverage() { function test_build_args_with_yolo (line 534) | fn test_build_args_with_yolo() { function test_build_args_without_yolo (line 543) | fn test_build_args_without_yolo() { function test_build_args_streaming (line 550) | fn test_build_args_streaming() { function test_json_output_deserialization (line 558) | fn test_json_output_deserialization() { function test_json_output_content_field (line 566) | fn test_json_output_content_field() { function test_stream_event_deserialization (line 574) | fn test_stream_event_deserialization() { function test_stream_event_result (line 582) | fn test_stream_event_result() { FILE: crates/openfang-runtime/src/embedding.rs type EmbeddingError (line 18) | pub enum EmbeddingError { type EmbeddingConfig (line 31) | pub struct EmbeddingConfig { type EmbeddingDriver (line 44) | pub trait EmbeddingDriver: Send + Sync { method embed (line 46) | async fn embed(&self, texts: &[&str]) -> Result>, Embeddi... method embed_one (line 49) | async fn embed_one(&self, text: &str) -> Result, EmbeddingErr... method dimensions (line 58) | fn dimensions(&self) -> usize; method embed (line 125) | async fn embed(&self, texts: &[&str]) -> Result>, Embeddi... method dimensions (line 172) | fn dimensions(&self) -> usize { type OpenAIEmbeddingDriver (line 65) | pub struct OpenAIEmbeddingDriver { method new (line 91) | pub fn new(config: EmbeddingConfig) -> Result { type EmbedRequest (line 74) | struct EmbedRequest<'a> { type EmbedResponse (line 80) | struct EmbedResponse { type EmbedData (line 85) | struct EmbedData { function infer_dimensions (line 106) | fn infer_dimensions(model: &str) -> usize { function create_embedding_driver (line 178) | pub fn create_embedding_driver( function cosine_similarity (line 255) | pub fn cosine_similarity(a: &[f32], b: &[f32]) -> f32 { function embedding_to_bytes (line 279) | pub fn embedding_to_bytes(embedding: &[f32]) -> Vec { function embedding_from_bytes (line 288) | pub fn embedding_from_bytes(bytes: &[u8]) -> Vec { function test_cosine_similarity_identical (line 300) | fn test_cosine_similarity_identical() { function test_cosine_similarity_orthogonal (line 308) | fn test_cosine_similarity_orthogonal() { function test_cosine_similarity_opposite (line 316) | fn test_cosine_similarity_opposite() { function test_cosine_similarity_real_vectors (line 324) | fn test_cosine_similarity_real_vectors() { function test_cosine_similarity_empty (line 336) | fn test_cosine_similarity_empty() { function test_cosine_similarity_length_mismatch (line 342) | fn test_cosine_similarity_length_mismatch() { function test_embedding_roundtrip (line 350) | fn test_embedding_roundtrip() { function test_embedding_bytes_empty (line 361) | fn test_embedding_bytes_empty() { function test_infer_dimensions (line 369) | fn test_infer_dimensions() { function test_create_embedding_driver_ollama (line 377) | fn test_create_embedding_driver_ollama() { function test_create_embedding_driver_custom_url_with_v1 (line 385) | fn test_create_embedding_driver_custom_url_with_v1() { function test_create_embedding_driver_custom_url_without_v1 (line 397) | fn test_create_embedding_driver_custom_url_without_v1() { function test_create_embedding_driver_custom_url_trailing_slash (line 409) | fn test_create_embedding_driver_custom_url_trailing_slash() { FILE: crates/openfang-runtime/src/graceful_shutdown.rs type ShutdownPhase (line 26) | pub enum ShutdownPhase { method fmt (line 40) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { type ShutdownConfig (line 58) | pub struct ShutdownConfig { method default (line 72) | fn default() -> Self { type ShutdownCoordinator (line 84) | pub struct ShutdownCoordinator { method new (line 118) | pub fn new(config: ShutdownConfig) -> Self { method is_shutting_down (line 129) | pub fn is_shutting_down(&self) -> bool { method initiate (line 134) | pub fn initiate(&self) -> bool { method current_phase (line 144) | pub fn current_phase(&self) -> ShutdownPhase { method advance_phase (line 161) | pub fn advance_phase(&self, next: ShutdownPhase, success: bool, messag... method status (line 191) | pub fn status(&self) -> ShutdownStatus { method is_timeout_exceeded (line 213) | pub fn is_timeout_exceeded(&self) -> bool { method drain_timeout (line 222) | pub fn drain_timeout(&self) -> Duration { method agent_timeout (line 227) | pub fn agent_timeout(&self) -> Duration { method should_broadcast (line 232) | pub fn should_broadcast(&self) -> bool { method shutdown_reason (line 237) | pub fn shutdown_reason(&self) -> &str { method ws_shutdown_message (line 242) | pub fn ws_shutdown_message(&self) -> String { type PhaseLog (line 99) | pub struct PhaseLog { type ShutdownStatus (line 108) | pub struct ShutdownStatus { function test_shutdown_config_defaults (line 258) | fn test_shutdown_config_defaults() { function test_coordinator_not_shutting_down_initially (line 268) | fn test_coordinator_not_shutting_down_initially() { function test_initiate_shutdown (line 275) | fn test_initiate_shutdown() { function test_double_initiate_returns_false (line 282) | fn test_double_initiate_returns_false() { function test_phase_advancement (line 290) | fn test_phase_advancement() { function test_phase_display_names (line 309) | fn test_phase_display_names() { function test_status_snapshot (line 338) | fn test_status_snapshot() { function test_timeout_check (line 349) | fn test_timeout_check() { function test_ws_shutdown_message (line 366) | fn test_ws_shutdown_message() { function test_shutdown_reason (line 378) | fn test_shutdown_reason() { function test_phase_log_recording (line 388) | fn test_phase_log_recording() { function test_all_phases_ordered (line 415) | fn test_all_phases_ordered() { FILE: crates/openfang-runtime/src/hooks.rs type HookContext (line 15) | pub struct HookContext<'a> { type HookHandler (line 27) | pub trait HookHandler: Send + Sync { method on_event (line 32) | fn on_event(&self, ctx: &HookContext) -> Result<(), String>; method on_event (line 101) | fn on_event(&self, _ctx: &HookContext) -> Result<(), String> { method on_event (line 111) | fn on_event(&self, _ctx: &HookContext) -> Result<(), String> { method on_event (line 131) | fn on_event(&self, ctx: &HookContext) -> Result<(), String> { type HookRegistry (line 38) | pub struct HookRegistry { method new (line 44) | pub fn new() -> Self { method register (line 51) | pub fn register(&self, event: HookEvent, handler: Arc) { method fire (line 59) | pub fn fire(&self, ctx: &HookContext) -> Result<(), String> { method has_handlers (line 80) | pub fn has_handlers(&self, event: HookEvent) -> bool { method default (line 89) | fn default() -> Self { type OkHandler (line 99) | struct OkHandler; type BlockHandler (line 107) | struct BlockHandler { type RecordHandler (line 117) | struct RecordHandler { method new (line 121) | fn new() -> Self { method call_count (line 126) | fn call_count(&self) -> usize { function make_ctx (line 137) | fn make_ctx(event: HookEvent) -> HookContext<'static> { function test_empty_registry_is_noop (line 147) | fn test_empty_registry_is_noop() { function test_before_tool_call_can_block (line 154) | fn test_before_tool_call_can_block() { function test_after_tool_call_receives_result (line 169) | fn test_after_tool_call_receives_result() { function test_multiple_handlers_all_fire (line 185) | fn test_multiple_handlers_all_fire() { function test_hook_errors_dont_crash_non_blocking (line 199) | fn test_hook_errors_dont_crash_non_blocking() { function test_all_four_events_fire (line 214) | fn test_all_four_events_fire() { function test_has_handlers (line 235) | fn test_has_handlers() { FILE: crates/openfang-runtime/src/host_functions.rs function dispatch (line 19) | pub fn dispatch(state: &GuestState, method: &str, params: &serde_json::V... function check_capability (line 57) | fn check_capability( function safe_resolve_path (line 75) | fn safe_resolve_path(path: &str) -> Result Result Result<(), serde_json::Value> { function is_private_ip (line 162) | fn is_private_ip(ip: &std::net::IpAddr) -> bool { function host_time_now (line 182) | fn host_time_now() -> serde_json::Value { function host_fs_read (line 194) | fn host_fs_read(state: &GuestState, params: &serde_json::Value) -> serde... function host_fs_write (line 214) | fn host_fs_write(state: &GuestState, params: &serde_json::Value) -> serd... function host_fs_list (line 241) | fn host_fs_list(state: &GuestState, params: &serde_json::Value) -> serde... function host_net_fetch (line 271) | fn host_net_fetch(state: &GuestState, params: &serde_json::Value) -> ser... function extract_host_from_url (line 315) | fn extract_host_from_url(url: &str) -> String { function host_shell_exec (line 334) | fn host_shell_exec(state: &GuestState, params: &serde_json::Value) -> se... function host_env_read (line 374) | fn host_env_read(state: &GuestState, params: &serde_json::Value) -> serd... function host_kv_get (line 392) | fn host_kv_get(state: &GuestState, params: &serde_json::Value) -> serde_... function host_kv_set (line 414) | fn host_kv_set(state: &GuestState, params: &serde_json::Value) -> serde_... function host_agent_send (line 443) | fn host_agent_send(state: &GuestState, params: &serde_json::Value) -> se... function host_agent_spawn (line 471) | fn host_agent_spawn(state: &GuestState, params: &serde_json::Value) -> s... function test_state (line 498) | fn test_state(capabilities: Vec) -> GuestState { function test_time_now_always_allowed (line 508) | async fn test_time_now_always_allowed() { function test_fs_read_denied_no_capability (line 516) | async fn test_fs_read_denied_no_capability() { function test_fs_write_denied_no_capability (line 524) | async fn test_fs_write_denied_no_capability() { function test_fs_read_granted_wildcard (line 532) | async fn test_fs_read_granted_wildcard() { function test_shell_exec_denied (line 546) | async fn test_shell_exec_denied() { function test_env_read_denied (line 554) | async fn test_env_read_denied() { function test_env_read_granted (line 562) | async fn test_env_read_granted() { function test_kv_get_no_kernel (line 569) | async fn test_kv_get_no_kernel() { function test_agent_send_denied (line 577) | async fn test_agent_send_denied() { function test_agent_spawn_denied (line 585) | async fn test_agent_spawn_denied() { function test_dispatch_unknown_method (line 593) | async fn test_dispatch_unknown_method() { function test_missing_params (line 601) | async fn test_missing_params() { function test_safe_resolve_path_traversal (line 609) | fn test_safe_resolve_path_traversal() { function test_safe_resolve_parent_traversal (line 616) | fn test_safe_resolve_parent_traversal() { function test_ssrf_private_ips_blocked (line 622) | fn test_ssrf_private_ips_blocked() { function test_ssrf_public_ips_allowed (line 630) | fn test_ssrf_public_ips_allowed() { function test_ssrf_scheme_validation (line 636) | fn test_ssrf_scheme_validation() { function test_is_private_ip (line 643) | fn test_is_private_ip() { function test_extract_host_from_url (line 654) | fn test_extract_host_from_url() { FILE: crates/openfang-runtime/src/image_gen.rs function generate_image (line 10) | pub async fn generate_image(request: &ImageGenRequest) -> Result Result... method list_agents (line 41) | fn list_agents(&self) -> Vec; method kill_agent (line 44) | fn kill_agent(&self, agent_id: &str) -> Result<(), String>; method memory_store (line 47) | fn memory_store(&self, key: &str, value: serde_json::Value) -> Result<... method memory_recall (line 50) | fn memory_recall(&self, key: &str) -> Result... method find_agents (line 53) | fn find_agents(&self, query: &str) -> Vec; method task_post (line 56) | async fn task_post( method task_claim (line 65) | async fn task_claim(&self, agent_id: &str) -> Result Result<(... method task_list (line 71) | async fn task_list(&self, status: Option<&str>) -> Result Result Result<(), String> { method requires_approval (line 121) | fn requires_approval(&self, tool_name: &str) -> bool { method request_approval (line 128) | async fn request_approval( method hand_list (line 139) | async fn hand_list(&self) -> Result, String> { method hand_install (line 144) | async fn hand_install( method hand_activate (line 154) | async fn hand_activate( method hand_status (line 164) | async fn hand_status(&self, hand_id: &str) -> Result Result<(), Strin... method list_a2a_agents (line 176) | fn list_a2a_agents(&self) -> Vec<(String, String)> { method get_a2a_agent_url (line 181) | fn get_a2a_agent_url(&self, name: &str) -> Option { method get_channel_default_recipient (line 190) | async fn get_channel_default_recipient(&self, channel: &str) -> Option... method send_channel_message (line 195) | async fn send_channel_message( method send_channel_media (line 209) | async fn send_channel_media( method send_channel_file_data (line 228) | async fn send_channel_file_data( method spawn_agent_checked (line 244) | async fn spawn_agent_checked( FILE: crates/openfang-runtime/src/lib.rs constant USER_AGENT (line 8) | pub const USER_AGENT: &str = "openfang/0.3.48"; FILE: crates/openfang-runtime/src/link_understanding.rs type LinkSummary (line 10) | pub struct LinkSummary { function extract_urls (line 21) | pub fn extract_urls(text: &str, max: usize) -> Vec { function is_private_url (line 55) | fn is_private_url(url: &str) -> bool { function build_link_context (line 109) | pub fn build_link_context(text: &str, config: &LinkConfig) -> Option String { method has_any_content (line 99) | pub fn has_any_content(&self) -> bool { type StreamEvent (line 111) | pub enum StreamEvent { type LlmDriver (line 146) | pub trait LlmDriver: Send + Sync { method complete (line 148) | async fn complete(&self, request: CompletionRequest) -> Result) -> std::fmt::Result { function default_skip_permissions (line 192) | fn default_skip_permissions() -> bool { function test_completion_response_text (line 213) | fn test_completion_response_text() { function test_stream_event_clone (line 233) | fn test_stream_event_clone() { function test_stream_event_variants (line 242) | fn test_stream_event_variants() { function test_default_stream_sends_events (line 271) | async fn test_default_stream_sends_events() { FILE: crates/openfang-runtime/src/llm_errors.rs type LlmErrorCategory (line 20) | pub enum LlmErrorCategory { type ClassifiedError (line 41) | pub struct ClassifiedError { constant CONTEXT_OVERFLOW_PATTERNS (line 61) | const CONTEXT_OVERFLOW_PATTERNS: &[&str] = &[ constant BILLING_PATTERNS (line 77) | const BILLING_PATTERNS: &[&str] = &[ constant AUTH_PATTERNS (line 93) | const AUTH_PATTERNS: &[&str] = &[ constant FORBIDDEN_NON_AUTH_PATTERNS (line 112) | const FORBIDDEN_NON_AUTH_PATTERNS: &[&str] = &[ constant RATE_LIMIT_PATTERNS (line 135) | const RATE_LIMIT_PATTERNS: &[&str] = &[ constant MODEL_NOT_FOUND_PATTERNS (line 151) | const MODEL_NOT_FOUND_PATTERNS: &[&str] = &[ constant FORMAT_PATTERNS (line 165) | const FORMAT_PATTERNS: &[&str] = &[ constant EMPTY_RESPONSE_PATTERNS (line 183) | const EMPTY_RESPONSE_PATTERNS: &[&str] = &[ constant OVERLOADED_PATTERNS (line 193) | const OVERLOADED_PATTERNS: &[&str] = &[ constant TIMEOUT_PATTERNS (line 206) | const TIMEOUT_PATTERNS: &[&str] = &[ function matches_any (line 228) | fn matches_any(haystack: &str, patterns: &[&str]) -> bool { function classify_error (line 241) | pub fn classify_error(message: &str, status: Option) -> ClassifiedE... function sanitize_for_user (line 404) | pub fn sanitize_for_user(category: LlmErrorCategory, raw: &str) -> String { function sanitize_raw_excerpt (line 450) | fn sanitize_raw_excerpt(raw: &str) -> String { function extract_json_message (line 475) | fn extract_json_message(raw: &str) -> Option { function redact_secrets (line 493) | fn redact_secrets(s: &str) -> String { function strip_llm_wrapper (line 514) | fn strip_llm_wrapper(s: &str) -> String { function cap_message (line 528) | fn cap_message(msg: &str, max: usize) -> String { function extract_retry_delay (line 554) | pub fn extract_retry_delay(message: &str) -> Option { function is_transient (line 590) | pub fn is_transient(message: &str) -> bool { function is_html_error_page (line 606) | pub fn is_html_error_page(body: &str) -> bool { function test_classify_rate_limit (line 643) | fn test_classify_rate_limit() { function test_classify_overloaded (line 667) | fn test_classify_overloaded() { function test_classify_timeout (line 685) | fn test_classify_timeout() { function test_classify_billing (line 704) | fn test_classify_billing() { function test_classify_auth (line 718) | fn test_classify_auth() { function test_classify_context_overflow (line 734) | fn test_classify_context_overflow() { function test_classify_format (line 749) | fn test_classify_format() { function test_classify_model_not_found (line 765) | fn test_classify_model_not_found() { function test_status_code_override (line 777) | fn test_status_code_override() { function test_retryable_categories (line 792) | fn test_retryable_categories() { function test_billing_flag (line 806) | fn test_billing_flag() { function test_sanitize_messages (line 818) | fn test_sanitize_messages() { function test_sanitize_redacts_secrets (line 866) | fn test_sanitize_redacts_secrets() { function test_sanitize_extracts_json_message (line 876) | fn test_sanitize_extracts_json_message() { function test_sanitize_html_page (line 884) | fn test_sanitize_html_page() { function test_strip_llm_wrapper (line 891) | fn test_strip_llm_wrapper() { function test_extract_retry_delay (line 904) | fn test_extract_retry_delay() { function test_extract_retry_delay_none (line 918) | fn test_extract_retry_delay_none() { function test_is_transient (line 925) | fn test_is_transient() { function test_is_html_error_page (line 939) | fn test_is_html_error_page() { function test_cloudflare_detection (line 949) | fn test_cloudflare_detection() { function test_unknown_error_defaults (line 959) | fn test_unknown_error_defaults() { function test_gemini_specific_errors (line 971) | fn test_gemini_specific_errors() { function test_403_non_auth_classification (line 989) | fn test_403_non_auth_classification() { function test_anthropic_specific_errors (line 1025) | fn test_anthropic_specific_errors() { FILE: crates/openfang-runtime/src/loop_guard.rs constant POLL_TOOLS (line 25) | const POLL_TOOLS: &[&str] = &[ constant HISTORY_SIZE (line 30) | const HISTORY_SIZE: usize = 30; constant BACKOFF_SCHEDULE_MS (line 33) | const BACKOFF_SCHEDULE_MS: &[u64] = &[5000, 10000, 30000, 60000]; type LoopGuardConfig (line 37) | pub struct LoopGuardConfig { method default (line 57) | fn default() -> Self { type LoopGuardVerdict (line 73) | pub enum LoopGuardVerdict { type LoopGuardStats (line 86) | pub struct LoopGuardStats { type LoopGuard (line 102) | pub struct LoopGuard { method new (line 126) | pub fn new(config: LoopGuardConfig) -> Self { method check (line 146) | pub fn check(&mut self, tool_name: &str, params: &serde_json::Value) -... method record_outcome (line 251) | pub fn record_outcome( method get_poll_backoff (line 287) | pub fn get_poll_backoff(&mut self, tool_name: &str, params: &serde_jso... method stats (line 307) | pub fn stats(&self) -> LoopGuardStats { method is_poll_call (line 334) | fn is_poll_call(tool_name: &str, params: &serde_json::Value) -> bool { method detect_ping_pong (line 366) | fn detect_ping_pong(&self) -> Option { method detect_ping_pong_pure (line 371) | fn detect_ping_pong_pure(&self) -> bool { method detect_ping_pong_impl (line 376) | fn detect_ping_pong_impl(&self) -> Option { method count_ping_pong_repeats (line 448) | fn count_ping_pong_repeats(&self) -> u32 { method compute_hash (line 501) | fn compute_hash(tool_name: &str, params: &serde_json::Value) -> String { method compute_outcome_hash (line 515) | fn compute_outcome_hash(tool_name: &str, params: &serde_json::Value, r... function allow_below_threshold (line 537) | fn allow_below_threshold() { function warn_at_threshold (line 547) | fn warn_at_threshold() { function block_at_threshold (line 559) | fn block_at_threshold() { function different_params_no_collision (line 571) | fn different_params_no_collision() { function global_circuit_breaker (line 581) | fn global_circuit_breaker() { function default_config (line 600) | fn default_config() { function test_outcome_aware_warning (line 612) | fn test_outcome_aware_warning() { function test_outcome_aware_blocks_next_call (line 628) | fn test_outcome_aware_blocks_next_call() { function test_ping_pong_ab_detection (line 652) | fn test_ping_pong_ab_detection() { function test_ping_pong_abc_detection (line 681) | fn test_ping_pong_abc_detection() { function test_no_false_ping_pong (line 705) | fn test_no_false_ping_pong() { function test_poll_tool_relaxed_thresholds (line 723) | fn test_poll_tool_relaxed_thresholds() { function test_is_poll_call_detection (line 750) | fn test_is_poll_call_detection() { function test_poll_backoff_schedule (line 805) | fn test_poll_backoff_schedule() { function test_warning_bucket_limits (line 844) | fn test_warning_bucket_limits() { function test_warning_upgrade_to_block (line 875) | fn test_warning_upgrade_to_block() { function test_stats_snapshot (line 902) | fn test_stats_snapshot() { function test_history_ring_buffer_limit (line 926) | fn test_history_ring_buffer_limit() { FILE: crates/openfang-runtime/src/mcp.rs type McpServerConfig (line 22) | pub struct McpServerConfig { function default_timeout (line 35) | fn default_timeout() -> u64 { type McpTransport (line 42) | pub enum McpTransport { type McpConnection (line 58) | pub struct McpConnection { method connect (line 128) | pub async fn connect(config: McpServerConfig) -> Result { method initialize (line 163) | async fn initialize(&mut self) -> Result<(), String> { method discover_tools (line 191) | async fn discover_tools(&mut self) -> Result<(), String> { method call_tool (line 240) | pub async fn call_tool( method tools (line 284) | pub fn tools(&self) -> &[ToolDefinition] { method name (line 289) | pub fn name(&self) -> &str { method send_request (line 295) | async fn send_request( method send_notification (line 380) | async fn send_notification( method connect_stdio (line 414) | async fn connect_stdio( method connect_sse (line 515) | async fn connect_sse(url: &str) -> Result { type McpTransportHandle (line 74) | enum McpTransportHandle { type JsonRpcRequest (line 88) | struct JsonRpcRequest { type JsonRpcResponse (line 98) | struct JsonRpcResponse { type JsonRpcError (line 109) | pub struct JsonRpcError { method fmt (line 117) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { method drop (line 535) | fn drop(&mut self) { function format_mcp_tool_name (line 548) | pub fn format_mcp_tool_name(server: &str, tool: &str) -> String { function is_mcp_tool (line 553) | pub fn is_mcp_tool(name: &str) -> bool { function extract_mcp_server (line 562) | pub fn extract_mcp_server(tool_name: &str) -> Option<&str> { function extract_mcp_server_from_known (line 575) | pub fn extract_mcp_server_from_known<'a>( function strip_mcp_prefix (line 595) | fn strip_mcp_prefix<'a>(server: &str, tool_name: &'a str) -> Option<&'a ... function normalize_name (line 601) | pub fn normalize_name(name: &str) -> String { function test_mcp_tool_namespacing (line 610) | fn test_mcp_tool_namespacing() { function test_is_mcp_tool (line 622) | fn test_is_mcp_tool() { function test_hyphenated_tool_name_preserved (line 629) | fn test_hyphenated_tool_name_preserved() { function test_extract_mcp_server (line 648) | fn test_extract_mcp_server() { function test_extract_mcp_server_from_known_with_hyphens (line 657) | fn test_extract_mcp_server_from_known_with_hyphens() { function test_extract_mcp_server_from_known_longest_match (line 675) | fn test_extract_mcp_server_from_known_longest_match() { function test_mcp_jsonrpc_initialize (line 689) | fn test_mcp_jsonrpc_initialize() { function test_mcp_jsonrpc_tools_list (line 711) | fn test_mcp_jsonrpc_tools_list() { function test_mcp_transport_config_serde (line 743) | fn test_mcp_transport_config_serde() { FILE: crates/openfang-runtime/src/mcp_server.rs constant PROTOCOL_VERSION (line 13) | const PROTOCOL_VERSION: &str = "2024-11-05"; function handle_mcp_request (line 19) | pub async fn handle_mcp_request( function make_response (line 88) | fn make_response(id: Option, result: serde_json::Valu... function make_error (line 97) | fn make_error(id: Option, code: i64, message: &str) -... function test_tools (line 112) | fn test_tools() -> Vec { function test_mcp_server_tools_list (line 128) | async fn test_mcp_server_tools_list() { function test_mcp_server_unknown_method (line 147) | async fn test_mcp_server_unknown_method() { function test_mcp_server_initialize (line 166) | async fn test_mcp_server_initialize() { FILE: crates/openfang-runtime/src/media_understanding.rs type MediaEngine (line 13) | pub struct MediaEngine { method new (line 19) | pub fn new(config: MediaConfig) -> Self { method describe_image (line 29) | pub async fn describe_image( method transcribe_audio (line 58) | pub async fn transcribe_audio( method describe_video (line 184) | pub async fn describe_video( method process_attachments (line 210) | pub async fn process_attachments( function detect_vision_provider (line 246) | fn detect_vision_provider() -> Option<&'static str> { function transcribe_with_parakeet_mlx (line 260) | async fn transcribe_with_parakeet_mlx( function detect_audio_provider (line 358) | fn detect_audio_provider() -> Option<&'static str> { function default_vision_model (line 373) | fn default_vision_model(provider: &str) -> &str { function default_audio_model (line 383) | fn default_audio_model(provider: &str) -> &str { function test_engine_creation (line 398) | fn test_engine_creation() { function test_engine_max_concurrency_clamped (line 405) | fn test_engine_max_concurrency_clamped() { function test_describe_image_wrong_type (line 416) | async fn test_describe_image_wrong_type() { function test_describe_image_invalid_mime (line 432) | async fn test_describe_image_invalid_mime() { function test_describe_image_too_large (line 447) | async fn test_describe_image_too_large() { function test_transcribe_audio_wrong_type (line 462) | async fn test_transcribe_audio_wrong_type() { function test_video_disabled (line 477) | async fn test_video_disabled() { function test_detect_vision_provider_none (line 497) | fn test_detect_vision_provider_none() { function test_default_vision_models (line 504) | fn test_default_vision_models() { function test_default_audio_models (line 515) | fn test_default_audio_models() { function test_transcribe_audio_rejects_image_type (line 521) | async fn test_transcribe_audio_rejects_image_type() { function test_transcribe_audio_no_provider (line 537) | async fn test_transcribe_audio_no_provider() { function test_transcribe_audio_url_source_rejected (line 554) | async fn test_transcribe_audio_url_source_rejected() { function test_transcribe_audio_file_not_found (line 577) | async fn test_transcribe_audio_file_not_found() { FILE: crates/openfang-runtime/src/model_catalog.rs type ModelCatalog (line 21) | pub struct ModelCatalog { method new (line 29) | pub fn new() -> Self { method detect_auth (line 58) | pub fn detect_auth(&mut self) { method list_models (line 106) | pub fn list_models(&self) -> &[ModelCatalogEntry] { method find_model (line 111) | pub fn find_model(&self, id_or_alias: &str) -> Option<&ModelCatalogEnt... method resolve_alias (line 133) | pub fn resolve_alias(&self, alias: &str) -> Option<&str> { method list_providers (line 138) | pub fn list_providers(&self) -> &[ProviderInfo] { method get_provider (line 143) | pub fn get_provider(&self, provider_id: &str) -> Option<&ProviderInfo> { method models_by_provider (line 148) | pub fn models_by_provider(&self, provider: &str) -> Vec<&ModelCatalogE... method default_model_for_provider (line 156) | pub fn default_model_for_provider(&self, provider: &str) -> Option Vec<&ModelCatalogEntry> { method pricing (line 183) | pub fn pricing(&self, model_id: &str) -> Option<(f64, f64)> { method list_aliases (line 189) | pub fn list_aliases(&self) -> &HashMap { method set_provider_url (line 196) | pub fn set_provider_url(&mut self, provider: &str, url: &str) -> bool { method apply_url_overrides (line 224) | pub fn apply_url_overrides(&mut self, overrides: &HashMap Vec<&ModelCatalogEntr... method merge_discovered_models (line 246) | pub fn merge_discovered_models(&mut self, provider: &str, model_ids: &... method add_custom_model (line 294) | pub fn add_custom_model(&mut self, entry: ModelCatalogEntry) -> bool { method remove_custom_model (line 322) | pub fn remove_custom_model(&mut self, model_id: &str) -> bool { method load_custom_models (line 333) | pub fn load_custom_models(&mut self, path: &std::path::Path) { method save_custom_models (line 349) | pub fn save_custom_models(&self, path: &std::path::Path) -> Result<(),... method default (line 364) | fn default() -> Self { function read_codex_credential (line 374) | pub fn read_codex_credential() -> Option { function builtin_providers (line 421) | fn builtin_providers() -> Vec { function builtin_aliases (line 807) | fn builtin_aliases() -> HashMap { function builtin_models (line 899) | fn builtin_models() -> Vec { function test_catalog_has_models (line 3812) | fn test_catalog_has_models() { function test_catalog_has_providers (line 3818) | fn test_catalog_has_providers() { function test_find_model_by_id (line 3824) | fn test_find_model_by_id() { function test_find_model_by_alias (line 3833) | fn test_find_model_by_alias() { function test_find_model_case_insensitive (line 3840) | fn test_find_model_case_insensitive() { function test_find_model_not_found (line 3847) | fn test_find_model_not_found() { function test_resolve_alias (line 3853) | fn test_resolve_alias() { function test_models_by_provider (line 3864) | fn test_models_by_provider() { function test_models_by_tier (line 3872) | fn test_models_by_tier() { function test_pricing_lookup (line 3880) | fn test_pricing_lookup() { function test_pricing_via_alias (line 3888) | fn test_pricing_via_alias() { function test_pricing_not_found (line 3896) | fn test_pricing_not_found() { function test_detect_auth_local_providers (line 3902) | fn test_detect_auth_local_providers() { function test_available_models_includes_local (line 3913) | fn test_available_models_includes_local() { function test_provider_model_counts (line 3922) | fn test_provider_model_counts() { function test_list_aliases (line 3931) | fn test_list_aliases() { function test_find_grok_by_alias (line 3942) | fn test_find_grok_by_alias() { function test_find_model_by_display_name (line 3950) | fn test_find_model_by_display_name() { function test_new_providers_in_catalog (line 3958) | fn test_new_providers_in_catalog() { function test_xai_models (line 3971) | fn test_xai_models() { function test_perplexity_models (line 3987) | fn test_perplexity_models() { function test_cohere_models (line 3994) | fn test_cohere_models() { function test_default_creates_valid_catalog (line 4001) | fn test_default_creates_valid_catalog() { function test_merge_adds_new_models (line 4008) | fn test_merge_adds_new_models() { function test_merge_skips_existing (line 4024) | fn test_merge_skips_existing() { function test_merge_updates_model_count (line 4034) | fn test_merge_updates_model_count() { function test_chinese_providers_in_catalog (line 4043) | fn test_chinese_providers_in_catalog() { function test_chinese_model_aliases (line 4055) | fn test_chinese_model_aliases() { function test_bedrock_models (line 4085) | fn test_bedrock_models() { function test_set_provider_url (line 4092) | fn test_set_provider_url() { function test_set_provider_url_unknown (line 4106) | fn test_set_provider_url_unknown() { function test_apply_url_overrides (line 4120) | fn test_apply_url_overrides() { function test_codex_provider (line 4145) | fn test_codex_provider() { function test_codex_models (line 4154) | fn test_codex_models() { function test_codex_aliases (line 4164) | fn test_codex_aliases() { function test_claude_code_provider (line 4171) | fn test_claude_code_provider() { function test_claude_code_models (line 4179) | fn test_claude_code_models() { function test_claude_code_aliases (line 4189) | fn test_claude_code_aliases() { function test_qwen_code_provider (line 4196) | fn test_qwen_code_provider() { function test_qwen_code_models (line 4204) | fn test_qwen_code_models() { function test_qwen_code_aliases (line 4214) | fn test_qwen_code_aliases() { function test_azure_provider_in_catalog (line 4221) | fn test_azure_provider_in_catalog() { function test_azure_models (line 4231) | fn test_azure_models() { function test_azure_model_lookup (line 4242) | fn test_azure_model_lookup() { FILE: crates/openfang-runtime/src/process_manager.rs type ProcessId (line 14) | pub type ProcessId = String; type ManagedProcess (line 17) | struct ManagedProcess { type ProcessInfo (line 36) | pub struct ProcessInfo { type ProcessManager (line 50) | pub struct ProcessManager { method new (line 58) | pub fn new(max_per_agent: usize) -> Self { method start (line 67) | pub async fn start( method write (line 165) | pub async fn write(&self, process_id: &str, data: &str) -> Result<(), ... method read (line 188) | pub async fn read(&self, process_id: &str) -> Result<(Vec, Vec... method kill (line 204) | pub async fn kill(&self, process_id: &str) -> Result<(), String> { method list (line 219) | pub fn list(&self, agent_id: &str) -> Vec { method cleanup (line 237) | pub async fn cleanup(&self, max_age_secs: u64) { method count (line 252) | pub fn count(&self) -> usize { method default (line 258) | fn default() -> Self { function test_start_and_list (line 268) | async fn test_start_and_list() { function test_per_agent_limit (line 290) | async fn test_per_agent_limit() { function test_kill_nonexistent (line 314) | async fn test_kill_nonexistent() { function test_read_nonexistent (line 321) | async fn test_read_nonexistent() { function test_default_process_manager (line 328) | fn test_default_process_manager() { FILE: crates/openfang-runtime/src/prompt_builder.rs type PromptContext (line 9) | pub struct PromptContext { function build_system_prompt (line 69) | pub fn build_system_prompt(ctx: &PromptContext) -> String { function build_identity_section (line 212) | fn build_identity_section(ctx: &PromptContext) -> String { constant TOOL_CALL_BEHAVIOR (line 224) | const TOOL_CALL_BEHAVIOR: &str = "\ function build_tools_section (line 240) | pub fn build_tools_section(granted_tools: &[String]) -> String { function build_canonical_context_message (line 277) | pub fn build_canonical_context_message(ctx: &PromptContext) -> Option String { function build_skills_section (line 316) | fn build_skills_section(skill_summary: &str, prompt_context: &str) -> St... function build_mcp_section (line 331) | fn build_mcp_section(mcp_summary: &str) -> String { function build_persona_section (line 335) | fn build_persona_section( function build_user_section (line 380) | fn build_user_section(user_name: Option<&str>) -> String { function build_channel_section (line 399) | fn build_channel_section(channel: &str) -> String { function build_sender_section (line 435) | fn build_sender_section(sender_name: Option<&str>, sender_id: Option<&st... function build_peer_agents_section (line 444) | fn build_peer_agents_section(self_name: &str, peers: &[(String, String, ... constant SAFETY_SECTION (line 463) | const SAFETY_SECTION: &str = "\ constant OPERATIONAL_GUIDELINES (line 472) | const OPERATIONAL_GUIDELINES: &str = "\ function tool_category (line 487) | pub fn tool_category(name: &str) -> &'static str { function tool_hint (line 521) | pub fn tool_hint(name: &str) -> &'static str { function strip_code_blocks (line 601) | fn strip_code_blocks(content: &str) -> String { function cap_str (line 621) | fn cap_str(s: &str, max_chars: usize) -> String { function capitalize (line 635) | fn capitalize(s: &str) -> String { function basic_ctx (line 651) | fn basic_ctx() -> PromptContext { function test_full_prompt_has_all_sections (line 669) | fn test_full_prompt_has_all_sections() { function test_section_ordering (line 681) | fn test_section_ordering() { function test_subagent_omits_sections (line 696) | fn test_subagent_omits_sections() { function test_empty_tools_no_section (line 712) | fn test_empty_tools_no_section() { function test_tool_grouping (line 722) | fn test_tool_grouping() { function test_tool_categories (line 736) | fn test_tool_categories() { function test_tool_hints (line 748) | fn test_tool_hints() { function test_memory_section_empty (line 756) | fn test_memory_section_empty() { function test_memory_section_with_items (line 764) | fn test_memory_section_with_items() { function test_memory_cap_at_5 (line 778) | fn test_memory_cap_at_5() { function test_memory_content_capped (line 789) | fn test_memory_content_capped() { function test_skills_section_omitted_when_empty (line 799) | fn test_skills_section_omitted_when_empty() { function test_skills_section_present (line 806) | fn test_skills_section_present() { function test_mcp_section_omitted_when_empty (line 815) | fn test_mcp_section_omitted_when_empty() { function test_mcp_section_present (line 822) | fn test_mcp_section_present() { function test_persona_section_with_soul (line 831) | fn test_persona_section_with_soul() { function test_persona_soul_capped_at_1000 (line 840) | fn test_persona_soul_capped_at_1000() { function test_channel_telegram (line 849) | fn test_channel_telegram() { function test_channel_discord (line 856) | fn test_channel_discord() { function test_channel_irc (line 863) | fn test_channel_irc() { function test_channel_unknown_gets_default (line 870) | fn test_channel_unknown_gets_default() { function test_user_name_known (line 877) | fn test_user_name_known() { function test_user_name_unknown (line 886) | fn test_user_name_unknown() { function test_canonical_context_not_in_system_prompt (line 893) | fn test_canonical_context_not_in_system_prompt() { function test_canonical_context_omitted_for_subagent (line 908) | fn test_canonical_context_omitted_for_subagent() { function test_empty_base_prompt_generates_default_identity (line 919) | fn test_empty_base_prompt_generates_default_identity() { function test_workspace_in_persona (line 931) | fn test_workspace_in_persona() { function test_cap_str_short (line 940) | fn test_cap_str_short() { function test_cap_str_long (line 945) | fn test_cap_str_long() { function test_cap_str_multibyte_utf8 (line 951) | fn test_cap_str_multibyte_utf8() { function test_cap_str_emoji (line 961) | fn test_cap_str_emoji() { function test_capitalize (line 968) | fn test_capitalize() { FILE: crates/openfang-runtime/src/provider_health.rs type ProbeResult (line 15) | pub struct ProbeResult { function is_local_provider (line 29) | pub fn is_local_provider(provider: &str) -> bool { constant PROBE_TIMEOUT_SECS (line 37) | const PROBE_TIMEOUT_SECS: u64 = 2; constant PROBE_CONNECT_TIMEOUT_SECS (line 40) | const PROBE_CONNECT_TIMEOUT_SECS: u64 = 1; constant PROBE_CACHE_TTL_SECS (line 43) | const PROBE_CACHE_TTL_SECS: u64 = 60; type ProbeCache (line 51) | pub struct ProbeCache { method new (line 58) | pub fn new() -> Self { method get (line 66) | pub fn get(&self, provider_id: &str) -> Option { method insert (line 80) | pub fn insert(&self, provider_id: &str, result: ProbeResult) { method default (line 87) | fn default() -> Self { function probe_provider (line 99) | pub async fn probe_provider(provider: &str, base_url: &str) -> ProbeResu... function probe_provider_cached (line 204) | pub async fn probe_provider_cached( function probe_model (line 224) | pub async fn probe_model( function test_is_local_provider_true_for_ollama (line 277) | fn test_is_local_provider_true_for_ollama() { function test_is_local_provider_false_for_openai (line 286) | fn test_is_local_provider_false_for_openai() { function test_probe_result_default (line 294) | fn test_probe_result_default() { function test_probe_unreachable_returns_error (line 303) | async fn test_probe_unreachable_returns_error() { function test_probe_timeout_value (line 311) | fn test_probe_timeout_value() { function test_probe_model_url_construction (line 317) | fn test_probe_model_url_construction() { function test_probe_model_unreachable (line 333) | async fn test_probe_model_unreachable() { function test_probe_cache_miss_returns_none (line 339) | fn test_probe_cache_miss_returns_none() { function test_probe_cache_hit_returns_result (line 345) | fn test_probe_cache_hit_returns_result() { function test_probe_cache_default (line 361) | fn test_probe_cache_default() { FILE: crates/openfang-runtime/src/python_runtime.rs type PythonError (line 29) | pub enum PythonError { type PythonResult (line 48) | pub struct PythonResult { type PythonConfig (line 57) | pub struct PythonConfig { method default (line 69) | fn default() -> Self { function validate_script_path (line 80) | pub fn validate_script_path(path: &str) -> Result<(), PythonError> { function find_python_interpreter (line 98) | fn find_python_interpreter() -> String { function parse_python_module (line 115) | pub fn parse_python_module(module: &str) -> Option<&str> { function run_python_agent (line 122) | pub async fn run_python_agent( function parse_python_output (line 319) | fn parse_python_output(lines: &[String]) -> Result { function is_python_module (line 342) | pub fn is_python_module(module: &str) -> bool { function test_parse_python_module (line 351) | fn test_parse_python_module() { function test_is_python_module (line 365) | fn test_is_python_module() { function test_parse_python_output_json (line 372) | fn test_parse_python_output_json() { function test_parse_python_output_plain (line 382) | fn test_parse_python_output_plain() { function test_parse_python_output_empty (line 389) | fn test_parse_python_output_empty() { function test_python_config_default (line 396) | fn test_python_config_default() { function test_validate_script_path (line 404) | fn test_validate_script_path() { function test_run_python_missing_script (line 413) | async fn test_run_python_missing_script() { FILE: crates/openfang-runtime/src/reply_directives.rs type DirectiveSet (line 16) | pub struct DirectiveSet { type StreamingDirectiveAccumulator (line 29) | pub struct StreamingDirectiveAccumulator { method new (line 41) | pub fn new() -> Self { method consume (line 53) | pub fn consume(&mut self, chunk: &str, is_final: bool) -> String { method parse_tag (line 107) | fn parse_tag(&mut self, content: &str) { constant MAX_PARTIAL_LEN (line 37) | const MAX_PARTIAL_LEN: usize = 30; method default (line 124) | fn default() -> Self { function parse_directives (line 133) | pub fn parse_directives(text: &str) -> (String, DirectiveSet) { function test_parse_reply_directive (line 144) | fn test_parse_reply_directive() { function test_parse_current_thread (line 151) | fn test_parse_current_thread() { function test_parse_silent (line 158) | fn test_parse_silent() { function test_parse_multiple_directives (line 165) | fn test_parse_multiple_directives() { function test_no_directives (line 174) | fn test_no_directives() { function test_directive_in_middle (line 181) | fn test_directive_in_middle() { function test_streaming_split_directive (line 188) | fn test_streaming_split_directive() { function test_streaming_no_split (line 202) | fn test_streaming_no_split() { function test_streaming_sticky_directives (line 213) | fn test_streaming_sticky_directives() { function test_partial_buffer_flush_on_final (line 224) | fn test_partial_buffer_flush_on_final() { function test_backward_compat_no_reply (line 236) | fn test_backward_compat_no_reply() { function test_unknown_directive_stripped (line 244) | fn test_unknown_directive_stripped() { FILE: crates/openfang-runtime/src/retry.rs type RetryConfig (line 18) | pub struct RetryConfig { method default (line 33) | fn default() -> Self { type RetryOutcome (line 45) | pub enum RetryOutcome { function compute_backoff (line 72) | pub fn compute_backoff(config: &RetryConfig, attempt: u32) -> u64 { function pseudo_random_fraction (line 94) | fn pseudo_random_fraction() -> f64 { function retry_async (line 123) | pub async fn retry_async( function llm_retry_config (line 211) | pub fn llm_retry_config() -> RetryConfig { function network_retry_config (line 223) | pub fn network_retry_config() -> RetryConfig { function channel_retry_config (line 235) | pub fn channel_retry_config() -> RetryConfig { function test_retry_config_defaults (line 255) | fn test_retry_config_defaults() { function test_compute_backoff_exponential (line 264) | fn test_compute_backoff_exponential() { function test_compute_backoff_capped (line 283) | fn test_compute_backoff_capped() { function test_retry_success_first_try (line 304) | async fn test_retry_success_first_try() { function test_retry_success_after_failures (line 330) | async fn test_retry_success_after_failures() { function test_retry_exhausted (line 369) | async fn test_retry_exhausted() { function test_retry_non_retryable_error (line 398) | async fn test_retry_non_retryable_error() { function test_retry_with_hint_delay (line 438) | async fn test_retry_with_hint_delay() { function test_llm_retry_config (line 488) | fn test_llm_retry_config() { function test_channel_retry_config (line 497) | fn test_channel_retry_config() { function test_network_retry_config (line 506) | fn test_network_retry_config() { FILE: crates/openfang-runtime/src/routing.rs type TaskComplexity (line 12) | pub enum TaskComplexity { method fmt (line 22) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { type ModelRouter (line 33) | pub struct ModelRouter { method new (line 39) | pub fn new(config: ModelRoutingConfig) -> Self { method score (line 51) | pub fn score(&self, request: &CompletionRequest) -> TaskComplexity { method model_for_complexity (line 118) | pub fn model_for_complexity(&self, complexity: TaskComplexity) -> &str { method select_model (line 127) | pub fn select_model(&self, request: &CompletionRequest) -> (TaskComple... method validate_models (line 136) | pub fn validate_models(&self, catalog: &crate::model_catalog::ModelCat... method resolve_aliases (line 153) | pub fn resolve_aliases(&mut self, catalog: &crate::model_catalog::Mode... function default_config (line 172) | fn default_config() -> ModelRoutingConfig { function make_request (line 182) | fn make_request(messages: Vec, tools: Vec) -> C... function test_simple_greeting_routes_to_simple (line 195) | fn test_simple_greeting_routes_to_simple() { function test_code_markers_increase_complexity (line 210) | fn test_code_markers_increase_complexity() { function test_tools_increase_complexity (line 228) | fn test_tools_increase_complexity() { function test_long_conversation_routes_higher (line 250) | fn test_long_conversation_routes_higher() { function test_model_for_complexity (line 269) | fn test_model_for_complexity() { function test_complexity_display (line 286) | fn test_complexity_display() { function test_validate_models_all_found (line 293) | fn test_validate_models_all_found() { function test_validate_models_unknown (line 308) | fn test_validate_models_unknown() { function test_resolve_aliases (line 324) | fn test_resolve_aliases() { function test_system_prompt_adds_complexity (line 350) | fn test_system_prompt_adds_complexity() { FILE: crates/openfang-runtime/src/sandbox.rs type SandboxConfig (line 35) | pub struct SandboxConfig { method default (line 48) | fn default() -> Self { type GuestState (line 59) | pub struct GuestState { type ExecutionResult (line 72) | pub struct ExecutionResult { type SandboxError (line 81) | pub enum SandboxError { type WasmSandbox (line 98) | pub struct WasmSandbox { method new (line 104) | pub fn new() -> Result { method execute (line 117) | pub async fn execute( method execute_sync (line 146) | fn execute_sync( method register_host_functions (line 278) | fn register_host_functions(linker: &mut Linker) -> Result<... constant ECHO_WAT (line 395) | const ECHO_WAT: &str = r#" constant INFINITE_LOOP_WAT (line 421) | const INFINITE_LOOP_WAT: &str = r#" constant HOST_CALL_PROXY_WAT (line 443) | const HOST_CALL_PROXY_WAT: &str = r#" function test_sandbox_config_default (line 463) | fn test_sandbox_config_default() { function test_sandbox_engine_creation (line 471) | fn test_sandbox_engine_creation() { function test_echo_module (line 478) | async fn test_echo_module() { function test_fuel_exhaustion (line 499) | async fn test_fuel_exhaustion() { function test_host_call_time_now (line 525) | async fn test_host_call_time_now() { function test_host_call_capability_denied (line 553) | async fn test_host_call_capability_denied() { function test_host_call_unknown_method (line 585) | async fn test_host_call_unknown_method() { FILE: crates/openfang-runtime/src/session_repair.rs type RepairStats (line 20) | pub struct RepairStats { function validate_and_repair (line 44) | pub fn validate_and_repair(messages: &[Message]) -> Vec { function validate_and_repair_with_stats (line 49) | pub fn validate_and_repair_with_stats(messages: &[Message]) -> (Vec) -> usize { function insert_synthetic_results (line 327) | fn insert_synthetic_results(messages: &mut Vec) -> usize { function deduplicate_tool_results (line 416) | fn deduplicate_tool_results(messages: &mut Vec) -> usize { function remove_aborted_assistant_messages (line 450) | fn remove_aborted_assistant_messages(messages: Vec) -> Vec bool { function strip_tool_result_details (line 509) | pub fn strip_tool_result_details(content: &str) -> String { function strip_base64_blobs (line 534) | fn strip_base64_blobs(content: &str) -> String { function is_base64_char (line 566) | fn is_base64_char(c: char) -> bool { function strip_injection_markers (line 571) | fn strip_injection_markers(content: &str) -> String { function prune_heartbeat_turns (line 617) | pub fn prune_heartbeat_turns(messages: &mut Vec, keep_recent: u... function merge_content (line 666) | fn merge_content(dst: &mut MessageContent, src: MessageContent) { function content_to_blocks (line 676) | fn content_to_blocks(content: MessageContent) -> Vec { function valid_history_unchanged (line 691) | fn valid_history_unchanged() { function drops_orphaned_tool_result (line 702) | fn drops_orphaned_tool_result() { function merges_consecutive_user_messages (line 724) | fn merges_consecutive_user_messages() { function drops_empty_messages (line 741) | fn drops_empty_messages() { function preserves_tool_use_result_pairs (line 755) | fn preserves_tool_use_result_pairs() { function test_reorder_misplaced_tool_result (line 785) | fn test_reorder_misplaced_tool_result() { function test_synthetic_result_for_orphaned_use (line 840) | fn test_synthetic_result_for_orphaned_use() { function test_deduplicate_tool_results (line 879) | fn test_deduplicate_tool_results() { function test_strip_tool_result_details (line 932) | fn test_strip_tool_result_details() { function test_strip_large_base64 (line 944) | fn test_strip_large_base64() { function test_strip_injection_markers (line 972) | fn test_strip_injection_markers() { function test_repair_stats (line 987) | fn test_repair_stats() { function test_aborted_assistant_skip (line 1015) | fn test_aborted_assistant_skip() { function test_multiple_repairs_combined (line 1050) | fn test_multiple_repairs_combined() { function test_empty_blocks_after_filter (line 1127) | fn test_empty_blocks_after_filter() { function test_short_base64_preserved (line 1159) | fn test_short_base64_preserved() { function test_multiple_injection_markers (line 1170) | fn test_multiple_injection_markers() { function test_prune_heartbeat_turns_removes_no_reply (line 1187) | fn test_prune_heartbeat_turns_removes_no_reply() { function test_prune_heartbeat_preserves_recent (line 1204) | fn test_prune_heartbeat_preserves_recent() { function test_prune_heartbeat_empty_history (line 1217) | fn test_prune_heartbeat_empty_history() { function test_prune_heartbeat_no_no_reply (line 1224) | fn test_prune_heartbeat_no_no_reply() { FILE: crates/openfang-runtime/src/shell_bleed.rs type ShellBleedWarning (line 12) | pub struct ShellBleedWarning { constant SAFE_VARS (line 24) | const SAFE_VARS: &[&str] = &[ constant MAX_SCRIPT_SIZE (line 67) | const MAX_SCRIPT_SIZE: usize = 100 * 1024; constant SCRIPT_EXTENSIONS (line 70) | const SCRIPT_EXTENSIONS: &[&str] = &[".py", ".sh", ".bash", ".rb", ".pl"... function extract_script_path (line 78) | fn extract_script_path(command: &str) -> Option { function scan_script_for_shell_bleed (line 100) | pub fn scan_script_for_shell_bleed( function extract_env_var_refs (line 183) | fn extract_env_var_refs(line: &str) -> Vec { function format_warnings (line 255) | pub fn format_warnings(warnings: &[ShellBleedWarning]) -> String { function test_extract_env_var_refs_shell (line 279) | fn test_extract_env_var_refs_shell() { function test_extract_env_var_refs_python (line 286) | fn test_extract_env_var_refs_python() { function test_extract_env_var_refs_node (line 295) | fn test_extract_env_var_refs_node() { function test_safe_vars_excluded (line 301) | fn test_safe_vars_excluded() { function test_extract_script_path (line 308) | fn test_extract_script_path() { function test_scan_nonexistent_script (line 325) | fn test_scan_nonexistent_script() { function test_scan_non_script_command (line 331) | fn test_scan_non_script_command() { function test_format_warnings_empty (line 337) | fn test_format_warnings_empty() { function test_format_warnings_has_content (line 342) | fn test_format_warnings_has_content() { FILE: crates/openfang-runtime/src/str_utils.rs function safe_truncate_str (line 9) | pub fn safe_truncate_str(s: &str, max_bytes: usize) -> &str { function ascii_within_limit (line 26) | fn ascii_within_limit() { function ascii_exact_limit (line 32) | fn ascii_exact_limit() { function ascii_truncated (line 38) | fn ascii_truncated() { function multibyte_chinese (line 44) | fn multibyte_chinese() { function multibyte_emoji (line 54) | fn multibyte_emoji() { function zero_limit (line 61) | fn zero_limit() { function empty_string (line 67) | fn empty_string() { FILE: crates/openfang-runtime/src/subprocess_sandbox.rs constant SAFE_ENV_VARS (line 14) | pub const SAFE_ENV_VARS: &[&str] = &[ constant SAFE_ENV_VARS_WINDOWS (line 20) | pub const SAFE_ENV_VARS_WINDOWS: &[&str] = &[ function sandbox_command (line 40) | pub fn sandbox_command(cmd: &mut tokio::process::Command, allowed_env_va... function validate_executable_path (line 71) | pub fn validate_executable_path(path: &str) -> Result<(), String> { function contains_shell_metacharacters (line 96) | pub fn contains_shell_metacharacters(command: &str) -> Option { function extract_base_command (line 153) | fn extract_base_command(cmd: &str) -> &str { function extract_all_commands (line 169) | fn extract_all_commands(command: &str) -> Vec<&str> { function validate_command_allowlist (line 203) | pub fn validate_command_allowlist(command: &str, policy: &ExecPolicy) ->... constant DEFAULT_GRACE_MS (line 248) | pub const DEFAULT_GRACE_MS: u64 = 3000; constant MAX_GRACE_MS (line 251) | pub const MAX_GRACE_MS: u64 = 60_000; function kill_process_tree (line 261) | pub async fn kill_process_tree(pid: u32, grace_ms: u64) -> Result Result { function kill_tree_windows (line 335) | async fn kill_tree_windows(pid: u32, grace_ms: u64) -> Result Self { method is_inside_think (line 47) | pub fn is_inside_think(&self) -> bool { method process (line 52) | pub fn process(&mut self, delta: &str) -> Vec { method flush (line 123) | pub fn flush(&mut self) -> Vec { method default (line 138) | fn default() -> Self { function partial_suffix_match (line 147) | fn partial_suffix_match(haystack: &str, needle: &str) -> usize { function test_no_think_tags (line 165) | fn test_no_think_tags() { function test_complete_think_block_single_delta (line 173) | fn test_complete_think_block_single_delta() { function test_think_block_across_deltas (line 187) | fn test_think_block_across_deltas() { function test_partial_opening_tag (line 210) | fn test_partial_opening_tag() { function test_partial_closing_tag (line 226) | fn test_partial_closing_tag() { function test_false_partial_tag (line 241) | fn test_false_partial_tag() { function test_multiple_think_blocks (line 264) | fn test_multiple_think_blocks() { function test_flush_outside_think (line 279) | fn test_flush_outside_think() { function test_flush_inside_think (line 291) | fn test_flush_inside_think() { function test_flush_inside_think_with_pending (line 305) | fn test_flush_inside_think_with_pending() { function test_empty_think_block (line 317) | fn test_empty_think_block() { function test_only_think_block_no_visible_text (line 324) | fn test_only_think_block_no_visible_text() { function test_tag_split_across_many_deltas (line 336) | fn test_tag_split_across_many_deltas() { function test_angle_bracket_not_tag (line 374) | fn test_angle_bracket_not_tag() { function test_partial_suffix_match_fn (line 390) | fn test_partial_suffix_match_fn() { function test_close_tag_partial_suffix_match (line 404) | fn test_close_tag_partial_suffix_match() { function test_interleaved_text_and_think (line 411) | fn test_interleaved_text_and_think() { FILE: crates/openfang-runtime/src/tool_policy.rs type PolicyEffect (line 11) | pub enum PolicyEffect { type ToolPolicyRule (line 20) | pub struct ToolPolicyRule { type ToolGroup (line 29) | pub struct ToolGroup { type ToolPolicy (line 39) | pub struct ToolPolicy { method is_empty (line 54) | pub fn is_empty(&self) -> bool { type ToolAccessResult (line 61) | pub enum ToolAccessResult { function resolve_tool_access (line 76) | pub fn resolve_tool_access(tool_name: &str, policy: &ToolPolicy, depth: ... function is_subagent_tool (line 148) | fn is_subagent_tool(name: &str) -> bool { function expand_groups (line 153) | fn expand_groups(tool_name: &str, groups: &[ToolGroup]) -> Vec { function matches_pattern (line 167) | fn matches_pattern(pattern: &str, tool_name: &str, expanded: &[String]) ... function glob_match (line 183) | fn glob_match(pattern: &str, text: &str) -> bool { constant SUBAGENT_DENY_ALWAYS (line 236) | const SUBAGENT_DENY_ALWAYS: &[&str] = &[ constant SUBAGENT_DENY_LEAF (line 247) | const SUBAGENT_DENY_LEAF: &[&str] = &["agent_spawn", "agent_kill"]; function filter_tools_by_depth (line 254) | pub fn filter_tools_by_depth(tools: &[String], depth: u32, max_depth: u3... function test_glob_match_exact (line 282) | fn test_glob_match_exact() { function test_glob_match_wildcard (line 288) | fn test_glob_match_wildcard() { function test_glob_match_prefix_suffix (line 296) | fn test_glob_match_prefix_suffix() { function test_deny_wins (line 302) | fn test_deny_wins() { function test_agent_rules_override_global (line 326) | fn test_agent_rules_override_global() { function test_group_expansion (line 344) | fn test_group_expansion() { function test_depth_restriction (line 365) | fn test_depth_restriction() { function test_no_rules_allows_all (line 379) | fn test_no_rules_allows_all() { function test_implicit_deny_when_allow_rules_exist (line 386) | fn test_implicit_deny_when_allow_rules_exist() { function test_depth_0_allows_all (line 405) | fn test_depth_0_allows_all() { function test_depth_1_denies_always (line 415) | fn test_depth_1_denies_always() { function test_leaf_depth_denies_spawn (line 440) | fn test_leaf_depth_denies_spawn() { function test_preserves_non_denied (line 453) | fn test_preserves_non_denied() { function test_empty_list (line 463) | fn test_empty_list() { function test_unknown_tools_preserved (line 470) | fn test_unknown_tools_preserved() { FILE: crates/openfang-runtime/src/tool_runner.rs constant MAX_AGENT_CALL_DEPTH (line 19) | const MAX_AGENT_CALL_DEPTH: u32 = 5; function check_taint_shell_exec (line 27) | fn check_taint_shell_exec(command: &str) -> Option { function check_taint_net_fetch (line 54) | fn check_taint_net_fetch(url: &str) -> Option { function current_agent_depth (line 86) | pub fn current_agent_depth() -> u32 { function execute_tool (line 99) | pub async fn execute_tool( function builtin_tool_definitions (line 529) | pub fn builtin_tool_definitions() -> Vec { function validate_path (line 1257) | fn validate_path(path: &str) -> Result<&str, String> { function resolve_file_path (line 1267) | fn resolve_file_path(raw_path: &str, workspace_root: Option<&Path>) -> R... function tool_file_read (line 1276) | async fn tool_file_read( function tool_file_write (line 1287) | async fn tool_file_write( function tool_file_list (line 1311) | async fn tool_file_list( function tool_apply_patch (line 1342) | async fn tool_apply_patch( function tool_web_fetch_legacy (line 1366) | async fn tool_web_fetch_legacy(input: &serde_json::Value) -> Result Result>) -> Result openfang_types::memory::EntityType { function parse_relation_type (line 1816) | fn parse_relation_type(s: &str) -> openfang_types::memory::RelationType { function tool_knowledge_add_entity (line 1833) | async fn tool_knowledge_add_entity( function tool_knowledge_add_relation (line 1861) | async fn tool_knowledge_add_relation( function tool_knowledge_query (line 1897) | async fn tool_knowledge_query( function parse_schedule_to_cron (line 1939) | fn parse_schedule_to_cron(input: &str) -> Result { function parse_time_to_hour (line 2021) | fn parse_time_to_hour(s: &str) -> Result { constant SCHEDULES_KEY (line 2059) | const SCHEDULES_KEY: &str = "__openfang_schedules"; function tool_schedule_create (line 2061) | async fn tool_schedule_create( function tool_schedule_list (line 2101) | async fn tool_schedule_list(kernel: Option<&Arc>) -> R... function tool_schedule_delete (line 2130) | async fn tool_schedule_delete( function tool_cron_create (line 2157) | async fn tool_cron_create( function tool_cron_list (line 2167) | async fn tool_cron_list( function tool_cron_cancel (line 2177) | async fn tool_cron_cancel( function tool_channel_send (line 2193) | async fn tool_channel_send( function tool_hand_list (line 2341) | async fn tool_hand_list(kernel: Option<&Arc>) -> Resul... function tool_hand_activate (line 2378) | async fn tool_hand_activate( function tool_hand_status (line 2405) | async fn tool_hand_status( function tool_hand_deactivate (line 2429) | async fn tool_hand_deactivate( function tool_a2a_discover (line 2446) | async fn tool_a2a_discover(input: &serde_json::Value) -> Result Result String { function extract_image_dimensions (line 2574) | fn extract_image_dimensions(data: &[u8], format: &str) -> Option<(u32, u... function extract_jpeg_dimensions (line 2615) | fn extract_jpeg_dimensions(data: &[u8]) -> Option<(u32, u32)> { function format_file_size (line 2640) | fn format_file_size(bytes: usize) -> String { function tool_location_get (line 2654) | async fn tool_location_get() -> Result { function tool_system_time (line 2702) | fn tool_system_time() -> String { function tool_media_describe (line 2723) | async fn tool_media_describe( function tool_media_transcribe (line 2768) | async fn tool_media_transcribe( function tool_image_generate (line 2817) | async fn tool_image_generate( function tool_text_to_speech (line 2899) | async fn tool_text_to_speech( function tool_speech_to_text (line 2943) | async fn tool_speech_to_text( function tool_docker_exec (line 3003) | async fn tool_docker_exec( function tool_process_start (line 3058) | async fn tool_process_start( function tool_process_poll (line 3086) | async fn tool_process_poll( function tool_process_write (line 3103) | async fn tool_process_write( function tool_process_kill (line 3123) | async fn tool_process_kill( function tool_process_list (line 3136) | async fn tool_process_list( function sanitize_canvas_html (line 3168) | pub fn sanitize_canvas_html(html: &str, max_bytes: usize) -> Result Self { method detect_provider (line 30) | fn detect_provider() -> Option<&'static str> { method synthesize (line 43) | pub async fn synthesize( method synthesize_openai (line 83) | async fn synthesize_openai( method synthesize_elevenlabs (line 155) | async fn synthesize_elevenlabs( function default_config (line 231) | fn default_config() -> TtsConfig { function test_engine_creation (line 236) | fn test_engine_creation() { function test_config_defaults (line 242) | fn test_config_defaults() { function test_synthesize_disabled (line 256) | async fn test_synthesize_disabled() { function test_synthesize_empty_text (line 264) | async fn test_synthesize_empty_text() { function test_synthesize_text_too_long (line 274) | async fn test_synthesize_text_too_long() { function test_detect_provider_none (line 287) | fn test_detect_provider_none() { function test_synthesize_no_provider (line 293) | async fn test_synthesize_no_provider() { function test_max_audio_constant (line 306) | fn test_max_audio_constant() { FILE: crates/openfang-runtime/src/web_cache.rs type CacheEntry (line 11) | struct CacheEntry { type WebCache (line 17) | pub struct WebCache { method new (line 24) | pub fn new(ttl: Duration) -> Self { method get (line 33) | pub fn get(&self, key: &str) -> Option { method put (line 48) | pub fn put(&self, key: String, value: String) { method evict_expired (line 62) | pub fn evict_expired(&self) { method len (line 68) | pub fn len(&self) -> usize { method is_empty (line 73) | pub fn is_empty(&self) -> bool { function test_put_and_get (line 83) | fn test_put_and_get() { function test_cache_miss (line 90) | fn test_cache_miss() { function test_expired_entry (line 96) | fn test_expired_entry() { function test_evict_expired (line 104) | fn test_evict_expired() { function test_zero_ttl_disables_caching (line 114) | fn test_zero_ttl_disables_caching() { function test_overwrite (line 122) | fn test_overwrite() { function test_len (line 130) | fn test_len() { function test_is_empty (line 139) | fn test_is_empty() { FILE: crates/openfang-runtime/src/web_content.rs function find_ci (line 17) | fn find_ci(haystack: &str, needle: &str, from: usize) -> Option { function content_boundary (line 40) | pub fn content_boundary(source_url: &str) -> String { function wrap_external_content (line 49) | pub fn wrap_external_content(source_url: &str, content: &str) -> String { function html_to_markdown (line 70) | pub fn html_to_markdown(html: &str) -> String { function remove_non_content_blocks (line 85) | fn remove_non_content_blocks(html: &str) -> String { function remove_tag_blocks (line 105) | fn remove_tag_blocks(html: &str, tag: &str) -> String { function extract_main_content (line 135) | fn extract_main_content(html: &str) -> String { function convert_elements (line 154) | fn convert_elements(html: &str) -> String { function convert_inline_tag (line 210) | fn convert_inline_tag( function convert_links (line 251) | fn convert_links(html: &str) -> String { function extract_attribute (line 289) | fn extract_attribute(tag: &str, attr: &str) -> Option { function strip_all_tags (line 309) | fn strip_all_tags(s: &str) -> String { function decode_entities (line 324) | fn decode_entities(s: &str) -> String { function collapse_whitespace (line 341) | fn collapse_whitespace(s: &str) -> String { function test_boundary_deterministic (line 366) | fn test_boundary_deterministic() { function test_boundary_unique (line 375) | fn test_boundary_unique() { function test_wrap_external_content (line 382) | fn test_wrap_external_content() { function test_html_to_markdown_basic (line 392) | fn test_html_to_markdown_basic() { function test_remove_non_content_blocks (line 402) | fn test_remove_non_content_blocks() { function test_find_ci_basic (line 411) | fn test_find_ci_basic() { function test_unicode_no_panic (line 420) | fn test_unicode_no_panic() { function test_unicode_in_script_removal (line 434) | fn test_unicode_in_script_removal() { function test_mixed_case_tags (line 443) | fn test_mixed_case_tags() { FILE: crates/openfang-runtime/src/web_fetch.rs type WebFetchEngine (line 16) | pub struct WebFetchEngine { method new (line 24) | pub fn new(config: WebFetchConfig, cache: Arc) -> Self { method fetch (line 41) | pub async fn fetch(&self, url: &str) -> Result { method fetch_with_options (line 46) | pub async fn fetch_with_options( function is_html (line 170) | fn is_html(content_type: &str, body: &str) -> bool { function check_ssrf (line 188) | pub(crate) fn check_ssrf(url: &str) -> Result<(), String> { function is_private_ip (line 238) | fn is_private_ip(ip: &IpAddr) -> bool { function extract_host (line 255) | fn extract_host(url: &str) -> String { function test_truncate_multibyte_no_panic (line 289) | fn test_truncate_multibyte_no_panic() { function test_truncate_emoji_no_panic (line 302) | fn test_truncate_emoji_no_panic() { function test_ssrf_blocks_localhost (line 310) | fn test_ssrf_blocks_localhost() { function test_ssrf_blocks_private_ip (line 316) | fn test_ssrf_blocks_private_ip() { function test_ssrf_blocks_metadata (line 325) | fn test_ssrf_blocks_metadata() { function test_ssrf_allows_public (line 331) | fn test_ssrf_allows_public() { function test_ssrf_blocks_non_http (line 341) | fn test_ssrf_blocks_non_http() { function test_ssrf_blocks_cloud_metadata (line 348) | fn test_ssrf_blocks_cloud_metadata() { function test_ssrf_blocks_zero_ip (line 356) | fn test_ssrf_blocks_zero_ip() { function test_ssrf_blocks_ipv6_localhost (line 361) | fn test_ssrf_blocks_ipv6_localhost() { function test_extract_host_ipv6 (line 367) | fn test_extract_host_ipv6() { FILE: crates/openfang-runtime/src/web_search.rs type WebSearchEngine (line 18) | pub struct WebSearchEngine { method new (line 32) | pub fn new(config: WebConfig, cache: Arc) -> Self { method search (line 45) | pub async fn search(&self, query: &str, max_results: usize) -> Result<... method search_auto (line 71) | async fn search_auto(&self, query: &str, max_results: usize) -> Result... method search_brave (line 105) | async fn search_brave(&self, query: &str, max_results: usize) -> Resul... method search_tavily (line 166) | async fn search_tavily(&self, query: &str, max_results: usize) -> Resu... method search_perplexity (line 226) | async fn search_perplexity(&self, query: &str) -> Result ... type WebToolsContext (line 25) | pub struct WebToolsContext { function parse_ddg_results (line 323) | pub fn parse_ddg_results(html: &str, max: usize) -> Vec<(String, String,... function extract_between (line 371) | pub fn extract_between<'a>(text: &'a str, start: &str, end: &str) -> Opt... function strip_html_tags (line 379) | pub fn strip_html_tags(s: &str) -> String { function urldecode (line 401) | pub fn urldecode(s: &str) -> String { function resolve_api_key (line 424) | fn resolve_api_key(env_var: &str) -> Option> { function test_format_with_results (line 436) | fn test_format_with_results() { function test_format_empty (line 446) | fn test_format_empty() { function test_format_with_answer (line 452) | fn test_format_with_answer() { function test_ddg_parser_preserved (line 460) | fn test_ddg_parser_preserved() { FILE: crates/openfang-runtime/src/workspace_context.rs constant MAX_FILE_SIZE (line 14) | const MAX_FILE_SIZE: u64 = 32_768; constant CONTEXT_FILES (line 17) | const CONTEXT_FILES: &[&str] = &[ type ProjectType (line 27) | pub enum ProjectType { method label (line 39) | pub fn label(&self) -> &'static str { type CachedFile (line 54) | struct CachedFile { type WorkspaceContext (line 61) | pub struct WorkspaceContext { method detect (line 76) | pub fn detect(root: &Path) -> Self { method get_file (line 100) | pub fn get_file(&mut self, name: &str) -> Option<&str> { method build_context_section (line 127) | pub fn build_context_section(&mut self) -> String { function read_cached_file (line 162) | fn read_cached_file(path: &Path) -> Option { function detect_project_type (line 178) | fn detect_project_type(root: &Path) -> ProjectType { function has_extension_in_dir (line 205) | fn has_extension_in_dir(dir: &Path, ext: &str) -> bool { type WorkspaceState (line 220) | pub struct WorkspaceState { method load (line 236) | pub fn load(workspace_root: &Path) -> Self { method save (line 247) | pub fn save(&self, workspace_root: &Path) -> Result<(), String> { function default_version (line 230) | fn default_version() -> u32 { function test_detect_rust_project (line 263) | fn test_detect_rust_project() { function test_detect_node_project (line 273) | fn test_detect_node_project() { function test_detect_python_project (line 283) | fn test_detect_python_project() { function test_detect_go_project (line 293) | fn test_detect_go_project() { function test_detect_unknown_project (line 303) | fn test_detect_unknown_project() { function test_workspace_context_detect (line 312) | fn test_workspace_context_detect() { function test_get_file_cache_hit (line 329) | fn test_get_file_cache_hit() { function test_file_size_cap (line 345) | fn test_file_size_cap() { function test_build_context_section (line 361) | fn test_build_context_section() { function test_workspace_state_round_trip (line 380) | fn test_workspace_state_round_trip() { function test_workspace_state_missing_file (line 404) | fn test_workspace_state_missing_file() { FILE: crates/openfang-runtime/src/workspace_sandbox.rs function resolve_sandbox_path (line 15) | pub fn resolve_sandbox_path(user_path: &str, workspace_root: &Path) -> R... function test_relative_path_inside_workspace (line 77) | fn test_relative_path_inside_workspace() { function test_absolute_path_inside_workspace (line 90) | fn test_absolute_path_inside_workspace() { function test_absolute_path_outside_workspace_blocked (line 100) | fn test_absolute_path_outside_workspace_blocked() { function test_dotdot_component_blocked (line 113) | fn test_dotdot_component_blocked() { function test_nonexistent_file_with_valid_parent (line 121) | fn test_nonexistent_file_with_valid_parent() { function test_symlink_escape_blocked (line 135) | fn test_symlink_escape_blocked() { FILE: crates/openfang-skills/src/bundled.rs function bundled_skills (line 10) | pub fn bundled_skills() -> Vec<(&'static str, &'static str)> { function parse_bundled (line 186) | pub fn parse_bundled(name: &str, content: &str) -> Result &'static str { type ClawHubListResponse (line 214) | pub type ClawHubListResponse = ClawHubBrowseResponse; type ClawHubSearchResults (line 216) | pub type ClawHubSearchResults = ClawHubSearchResponse; type ClawHubEntry (line 218) | pub type ClawHubEntry = ClawHubBrowseEntry; type ClawHubInstallResult (line 222) | pub struct ClawHubInstallResult { type ClawHubClient (line 238) | pub struct ClawHubClient { method new (line 251) | pub fn new(cache_dir: PathBuf) -> Self { method with_url (line 256) | pub fn with_url(base_url: &str, cache_dir: PathBuf) -> Self { method get_with_retry (line 276) | async fn get_with_retry( method search (line 392) | pub async fn search( method browse (line 417) | pub async fn browse( method get_skill (line 448) | pub async fn get_skill(&self, slug: &str) -> Result &str { method get_file (line 474) | pub async fn get_file(&self, slug: &str, path: &str) -> Result bool { function urlencoded (line 668) | fn urlencoded(s: &str) -> String { function which_check (line 688) | fn which_check(name: &str) -> Option { function test_browse_entry_serde_real_format (line 710) | fn test_browse_entry_serde_real_format() { function test_browse_response_serde (line 745) | fn test_browse_response_serde() { function test_search_entry_serde_real_format (line 767) | fn test_search_entry_serde_real_format() { function test_search_response_serde (line 787) | fn test_search_response_serde() { function test_skill_detail_serde_real_format (line 806) | fn test_skill_detail_serde_real_format() { function test_clawhub_install_result (line 850) | fn test_clawhub_install_result() { function test_urlencoded (line 866) | fn test_urlencoded() { function test_clawhub_sort_str (line 878) | fn test_clawhub_sort_str() { function test_clawhub_client_url (line 885) | fn test_clawhub_client_url() { function test_entry_version_helper (line 891) | fn test_entry_version_helper() { FILE: crates/openfang-skills/src/lib.rs type SkillError (line 23) | pub enum SkillError { type SkillRuntime (line 51) | pub enum SkillRuntime { type SkillSource (line 71) | pub enum SkillSource { type SkillToolDef (line 84) | pub struct SkillToolDef { type SkillRequirements (line 96) | pub struct SkillRequirements { type SkillManifest (line 105) | pub struct SkillManifest { type SkillMeta (line 127) | pub struct SkillMeta { function default_version (line 147) | fn default_version() -> String { type SkillRuntimeConfig (line 153) | pub struct SkillRuntimeConfig { type SkillTools (line 165) | pub struct SkillTools { type InstalledSkill (line 172) | pub struct InstalledSkill { type SkillToolResult (line 183) | pub struct SkillToolResult { function test_skill_manifest_parse (line 195) | fn test_skill_manifest_parse() { function test_skill_runtime_serde (line 228) | fn test_skill_runtime_serde() { function test_skill_source_serde (line 240) | fn test_skill_source_serde() { FILE: crates/openfang-skills/src/loader.rs function execute_skill_tool (line 10) | pub async fn execute_skill_tool( function execute_python (line 54) | async fn execute_python( function execute_node (line 160) | async fn execute_node( function find_python (line 259) | fn find_python() -> Option { function find_node (line 275) | fn find_node() -> Option { function find_shell (line 289) | fn find_shell() -> Option { function execute_shell (line 306) | async fn execute_shell( function test_find_python (line 410) | fn test_find_python() { function test_find_node (line 416) | fn test_find_node() { function test_prompt_only_execution (line 421) | async fn test_prompt_only_execution() { FILE: crates/openfang-skills/src/marketplace.rs type MarketplaceConfig (line 12) | pub struct MarketplaceConfig { method default (line 20) | fn default() -> Self { type MarketplaceClient (line 29) | pub struct MarketplaceClient { method new (line 36) | pub fn new(config: MarketplaceConfig) -> Self { method search (line 47) | pub async fn search(&self, query: &str) -> Result Re... type SkillSearchResult (line 173) | pub struct SkillSearchResult { function test_default_config (line 189) | fn test_default_config() { function test_client_creation (line 196) | fn test_client_creation() { FILE: crates/openfang-skills/src/openclaw_compat.rs type SkillMdFrontmatter (line 25) | pub struct SkillMdFrontmatter { type SkillMdMetadata (line 37) | pub struct SkillMdMetadata { type OpenClawMeta (line 45) | pub struct OpenClawMeta { type OpenClawRequires (line 57) | pub struct OpenClawRequires { type OpenClawCommand (line 67) | pub struct OpenClawCommand { type OpenClawDispatch (line 79) | pub struct OpenClawDispatch { type ConvertedSkillMd (line 88) | pub struct ConvertedSkillMd { function detect_skillmd (line 106) | pub fn detect_skillmd(dir: &Path) -> bool { function parse_skillmd (line 124) | pub fn parse_skillmd(path: &Path) -> Result<(SkillMdFrontmatter, String)... function parse_skillmd_str (line 132) | pub fn parse_skillmd_str(content: &str) -> Result<(SkillMdFrontmatter, S... function convert_skillmd (line 164) | pub fn convert_skillmd(dir: &Path) -> Result Result bool { function convert_openclaw_skill (line 368) | pub fn convert_openclaw_skill(dir: &Path) -> Result Vec ... function write_prompt_context (line 470) | pub fn write_prompt_context(dir: &Path, content: &str) -> Result<(), Ski... function test_detect_openclaw_skill (line 483) | fn test_detect_openclaw_skill() { function test_convert_openclaw_skill (line 496) | fn test_convert_openclaw_skill() { function test_convert_with_openclaw_meta (line 519) | fn test_convert_with_openclaw_meta() { function test_detect_skillmd (line 548) | fn test_detect_skillmd() { function test_parse_skillmd_valid (line 557) | fn test_parse_skillmd_valid() { function test_parse_skillmd_missing_delimiters (line 588) | fn test_parse_skillmd_missing_delimiters() { function test_parse_skillmd_empty_body (line 598) | fn test_parse_skillmd_empty_body() { function test_convert_skillmd_prompt_only (line 609) | fn test_convert_skillmd_prompt_only() { function test_convert_skillmd_with_commands (line 636) | fn test_convert_skillmd_with_commands() { function test_parse_skillmd_str (line 679) | fn test_parse_skillmd_str() { function test_convert_skillmd_str (line 688) | fn test_convert_skillmd_str() { function test_convert_skillmd_str_uses_name_hint (line 702) | fn test_convert_skillmd_str_uses_name_hint() { FILE: crates/openfang-skills/src/registry.rs type SkillRegistry (line 13) | pub struct SkillRegistry { method new (line 24) | pub fn new(skills_dir: PathBuf) -> Self { method snapshot (line 36) | pub fn snapshot(&self) -> SkillRegistry { method freeze (line 46) | pub fn freeze(&mut self) { method is_frozen (line 52) | pub fn is_frozen(&self) -> bool { method load_bundled (line 61) | pub fn load_bundled(&mut self) -> usize { method load_all (line 106) | pub fn load_all(&mut self) -> Result { method load_skill (line 199) | pub fn load_skill(&mut self, skill_dir: &Path) -> Result Option<&InstalledSkill> { method list (line 230) | pub fn list(&self) -> Vec<&InstalledSkill> { method remove (line 235) | pub fn remove(&mut self, name: &str) -> Result<(), SkillError> { method all_tool_definitions (line 251) | pub fn all_tool_definitions(&self) -> Vec { method tool_definitions_for_skills (line 260) | pub fn tool_definitions_for_skills(&self, names: &[String]) -> Vec Vec { method find_tool_provider (line 274) | pub fn find_tool_provider(&self, tool_name: &str) -> Option<&Installed... method count (line 286) | pub fn count(&self) -> usize { method load_workspace_skills (line 296) | pub fn load_workspace_skills( function create_test_skill (line 392) | fn create_test_skill(dir: &Path, name: &str) { function test_load_all (line 419) | fn test_load_all() { function test_get_skill (line 431) | fn test_get_skill() { function test_tool_definitions (line 444) | fn test_tool_definitions() { function test_find_tool_provider (line 457) | fn test_find_tool_provider() { function test_remove_skill (line 469) | fn test_remove_skill() { function test_empty_dir (line 482) | fn test_empty_dir() { function test_frozen_blocks_load (line 489) | fn test_frozen_blocks_load() { function test_frozen_after_initial_load (line 503) | fn test_frozen_after_initial_load() { function test_registry_auto_convert_skillmd (line 525) | fn test_registry_auto_convert_skillmd() { FILE: crates/openfang-skills/src/verify.rs type SkillWarning (line 8) | pub struct SkillWarning { type WarningSeverity (line 17) | pub enum WarningSeverity { type SkillVerifier (line 27) | pub struct SkillVerifier; method sha256_hex (line 31) | pub fn sha256_hex(data: &[u8]) -> String { method verify_checksum (line 38) | pub fn verify_checksum(data: &[u8], expected_sha256: &str) -> bool { method security_scan (line 46) | pub fn security_scan(manifest: &SkillManifest) -> Vec { method scan_prompt_content (line 109) | pub fn scan_prompt_content(content: &str) -> Vec { function test_sha256_hex (line 187) | fn test_sha256_hex() { function test_verify_checksum_valid (line 196) | fn test_verify_checksum_valid() { function test_verify_checksum_invalid (line 203) | fn test_verify_checksum_invalid() { function test_verify_checksum_case_insensitive (line 211) | fn test_verify_checksum_case_insensitive() { function test_security_scan_safe_skill (line 218) | fn test_security_scan_safe_skill() { function test_security_scan_dangerous_skill (line 237) | fn test_security_scan_dangerous_skill() { function test_scan_prompt_clean (line 262) | fn test_scan_prompt_clean() { function test_scan_prompt_injection (line 272) | fn test_scan_prompt_injection() { function test_scan_prompt_exfiltration (line 285) | fn test_scan_prompt_exfiltration() { FILE: crates/openfang-types/src/agent.rs type UserId (line 12) | pub struct UserId(pub Uuid); method new (line 16) | pub fn new() -> Self { method fmt (line 28) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { type Err (line 34) | type Err = uuid::Error; method from_str (line 36) | fn from_str(s: &str) -> Result { method default (line 22) | fn default() -> Self { type ModelRoutingConfig (line 44) | pub struct ModelRoutingConfig { method default (line 58) | fn default() -> Self { type AutonomousConfig (line 72) | pub struct AutonomousConfig { method default (line 86) | fn default() -> Self { type HookEvent (line 100) | pub enum HookEvent { type AgentId (line 113) | pub struct AgentId(pub Uuid); method new (line 117) | pub fn new() -> Self { method from_string (line 123) | pub fn from_string(s: &str) -> Self { method fmt (line 136) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { type Err (line 142) | type Err = uuid::Error; method from_str (line 144) | fn from_str(s: &str) -> Result { method default (line 130) | fn default() -> Self { type SessionId (line 151) | pub struct SessionId(pub Uuid); method new (line 155) | pub fn new() -> Self { method fmt (line 167) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { method default (line 161) | fn default() -> Self { type AgentState (line 175) | pub enum AgentState { type AgentMode (line 191) | pub enum AgentMode { method filter_tools (line 203) | pub fn filter_tools(&self, tools: Vec) -> Vec u64 { type ResourceQuota (line 250) | pub struct ResourceQuota { method default (line 270) | fn default() -> Self { type Priority (line 286) | pub enum Priority { type ToolProfile (line 301) | pub enum ToolProfile { method tools (line 314) | pub fn tools(&self) -> Vec { method implied_capabilities (line 346) | pub fn implied_capabilities(&self) -> ManifestCapabilities { type ModelConfig (line 373) | pub struct ModelConfig { method default (line 392) | fn default() -> Self { type FallbackModel (line 407) | pub struct FallbackModel { type ToolConfig (line 418) | pub struct ToolConfig { type AgentManifest (line 426) | pub struct AgentManifest { function default_true (line 496) | fn default_true() -> bool { method default (line 501) | fn default() -> Self { type ManifestCapabilities (line 535) | pub struct ManifestCapabilities { type SessionLabel (line 566) | pub struct SessionLabel(String); method new (line 570) | pub fn new(label: &str) -> Result { method as_str (line 589) | pub fn as_str(&self) -> &str { method fmt (line 595) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { type AgentIdentity (line 603) | pub struct AgentIdentity { type AgentEntry (line 620) | pub struct AgentEntry { function test_agent_id_uniqueness (line 660) | fn test_agent_id_uniqueness() { function test_agent_id_display (line 667) | fn test_agent_id_display() { function test_agent_id_serialization (line 675) | fn test_agent_id_serialization() { function test_default_resource_quota (line 683) | fn test_default_resource_quota() { function test_user_id_uniqueness (line 690) | fn test_user_id_uniqueness() { function test_user_id_roundtrip (line 697) | fn test_user_id_roundtrip() { function test_model_routing_config_defaults (line 705) | fn test_model_routing_config_defaults() { function test_model_routing_config_serde (line 712) | fn test_model_routing_config_serde() { function test_autonomous_config_defaults (line 720) | fn test_autonomous_config_defaults() { function test_autonomous_config_serde (line 729) | fn test_autonomous_config_serde() { function test_manifest_with_routing_and_autonomous (line 740) | fn test_manifest_with_routing_and_autonomous() { function test_agent_manifest_serialization (line 758) | fn test_agent_manifest_serialization() { function test_tool_profile_minimal (line 795) | fn test_tool_profile_minimal() { function test_tool_profile_coding (line 801) | fn test_tool_profile_coding() { function test_tool_profile_research (line 810) | fn test_tool_profile_research() { function test_tool_profile_messaging (line 818) | fn test_tool_profile_messaging() { function test_tool_profile_automation (line 826) | fn test_tool_profile_automation() { function test_tool_profile_full (line 832) | fn test_tool_profile_full() { function test_tool_profile_implied_capabilities_coding (line 838) | fn test_tool_profile_implied_capabilities_coding() { function test_tool_profile_implied_capabilities_messaging (line 847) | fn test_tool_profile_implied_capabilities_messaging() { function test_tool_profile_implied_capabilities_minimal (line 857) | fn test_tool_profile_implied_capabilities_minimal() { function test_tool_profile_serde_roundtrip (line 866) | fn test_tool_profile_serde_roundtrip() { function test_agent_mode_default (line 877) | fn test_agent_mode_default() { function test_agent_mode_observe_filters_all (line 882) | fn test_agent_mode_observe_filters_all() { function test_agent_mode_assist_filters_write_tools (line 900) | fn test_agent_mode_assist_filters_write_tools() { function test_agent_mode_full_passes_all (line 939) | fn test_agent_mode_full_passes_all() { function test_agent_mode_serde_roundtrip (line 957) | fn test_agent_mode_serde_roundtrip() { function test_fallback_model_serde (line 968) | fn test_fallback_model_serde() { function test_manifest_with_new_fields (line 983) | fn test_manifest_with_new_fields() { function test_agent_entry_with_mode (line 1001) | fn test_agent_entry_with_mode() { function test_agent_identity_default (line 1024) | fn test_agent_identity_default() { function test_agent_identity_serde_roundtrip (line 1035) | fn test_agent_identity_serde_roundtrip() { function test_agent_identity_deserialize_missing_fields (line 1051) | fn test_agent_identity_deserialize_missing_fields() { function test_agent_entry_identity_in_serde (line 1058) | fn test_agent_entry_identity_in_serde() { function test_session_label_valid (line 1090) | fn test_session_label_valid() { function test_session_label_with_hyphens_underscores (line 1096) | fn test_session_label_with_hyphens_underscores() { function test_session_label_trims_whitespace (line 1102) | fn test_session_label_trims_whitespace() { function test_session_label_rejects_empty (line 1108) | fn test_session_label_rejects_empty() { function test_session_label_rejects_too_long (line 1114) | fn test_session_label_rejects_too_long() { function test_session_label_rejects_special_chars (line 1120) | fn test_session_label_rejects_special_chars() { function test_session_label_serde_roundtrip (line 1127) | fn test_session_label_serde_roundtrip() { function test_manifest_generate_identity_files_default_true (line 1137) | fn test_manifest_generate_identity_files_default_true() { function test_manifest_generate_identity_files_serde (line 1143) | fn test_manifest_generate_identity_files_serde() { function test_manifest_generate_identity_files_defaults_on_missing (line 1150) | fn test_manifest_generate_identity_files_defaults_on_missing() { function test_model_config_name_alias_toml (line 1159) | fn test_model_config_name_alias_toml() { function test_model_config_model_field_still_works (line 1170) | fn test_model_config_model_field_still_works() { function test_manifest_multiline_system_prompt_toml (line 1183) | fn test_manifest_multiline_system_prompt_toml() { function test_manifest_multiline_system_prompt_with_quotes (line 1216) | fn test_manifest_multiline_system_prompt_with_quotes() { function test_manifest_multiline_system_prompt_with_code_blocks (line 1235) | fn test_manifest_multiline_system_prompt_with_code_blocks() { function test_manifest_single_line_system_prompt_still_works (line 1261) | fn test_manifest_single_line_system_prompt_still_works() { function test_manifest_wizard_custom_profile_with_capabilities (line 1276) | fn test_manifest_wizard_custom_profile_with_capabilities() { FILE: crates/openfang-types/src/approval.rs constant MAX_TOOL_NAME_LEN (line 17) | const MAX_TOOL_NAME_LEN: usize = 64; constant MAX_DESCRIPTION_LEN (line 20) | const MAX_DESCRIPTION_LEN: usize = 1024; constant MAX_ACTION_SUMMARY_LEN (line 23) | const MAX_ACTION_SUMMARY_LEN: usize = 512; constant MIN_TIMEOUT_SECS (line 26) | const MIN_TIMEOUT_SECS: u64 = 10; constant MAX_TIMEOUT_SECS (line 29) | const MAX_TIMEOUT_SECS: u64 = 300; type RiskLevel (line 38) | pub enum RiskLevel { method emoji (line 47) | pub fn emoji(&self) -> &'static str { type ApprovalDecision (line 64) | pub enum ApprovalDecision { type ApprovalRequest (line 76) | pub struct ApprovalRequest { method validate (line 93) | pub fn validate(&self) -> Result<(), String> { type ApprovalResponse (line 154) | pub struct ApprovalResponse { type ApprovalPolicy (line 168) | pub struct ApprovalPolicy { method apply_shorthands (line 236) | pub fn apply_shorthands(&mut self) { method validate (line 245) | pub fn validate(&self) -> Result<(), String> { method default (line 186) | fn default() -> Self { function deserialize_require_approval (line 199) | fn deserialize_require_approval<'de, D>(deserializer: D) -> Result ApprovalRequest { function valid_policy (line 305) | fn valid_policy() -> ApprovalPolicy { function risk_level_emoji (line 314) | fn risk_level_emoji() { function risk_level_serde_roundtrip (line 322) | fn risk_level_serde_roundtrip() { function risk_level_rename_all (line 336) | fn risk_level_rename_all() { function decision_serde_roundtrip (line 348) | fn decision_serde_roundtrip() { function decision_rename_all (line 361) | fn decision_rename_all() { function valid_request_passes (line 371) | fn valid_request_passes() { function request_empty_tool_name (line 380) | fn request_empty_tool_name() { function request_tool_name_too_long (line 388) | fn request_tool_name_too_long() { function request_tool_name_64_chars_ok (line 396) | fn request_tool_name_64_chars_ok() { function request_tool_name_invalid_chars (line 403) | fn request_tool_name_invalid_chars() { function request_tool_name_with_underscore_ok (line 411) | fn request_tool_name_with_underscore_ok() { function request_description_too_long (line 422) | fn request_description_too_long() { function request_description_1024_ok (line 431) | fn request_description_1024_ok() { function request_description_empty_ok (line 438) | fn request_description_empty_ok() { function request_action_summary_too_long (line 449) | fn request_action_summary_too_long() { function request_action_summary_512_ok (line 458) | fn request_action_summary_512_ok() { function request_timeout_too_small (line 469) | fn request_timeout_too_small() { function request_timeout_too_large (line 477) | fn request_timeout_too_large() { function request_timeout_min_boundary_ok (line 485) | fn request_timeout_min_boundary_ok() { function request_timeout_max_boundary_ok (line 492) | fn request_timeout_max_boundary_ok() { function response_serde_roundtrip (line 503) | fn response_serde_roundtrip() { function response_decided_by_none (line 518) | fn response_decided_by_none() { function policy_default_valid (line 536) | fn policy_default_valid() { function policy_serde_default (line 546) | fn policy_serde_default() { function policy_require_approval_bool_false (line 555) | fn policy_require_approval_bool_false() { function policy_require_approval_bool_true (line 563) | fn policy_require_approval_bool_true() { function policy_auto_approve_clears_list (line 570) | fn policy_auto_approve_clears_list() { function policy_timeout_too_small (line 583) | fn policy_timeout_too_small() { function policy_timeout_too_large (line 591) | fn policy_timeout_too_large() { function policy_timeout_boundaries_ok (line 599) | fn policy_timeout_boundaries_ok() { function policy_empty_tool_name (line 612) | fn policy_empty_tool_name() { function policy_tool_name_too_long (line 621) | fn policy_tool_name_too_long() { function policy_tool_name_invalid_chars (line 629) | fn policy_tool_name_invalid_chars() { function policy_tool_name_with_spaces_rejected (line 637) | fn policy_tool_name_with_spaces_rejected() { function policy_multiple_valid_tools (line 645) | fn policy_multiple_valid_tools() { function policy_empty_require_approval_ok (line 656) | fn policy_empty_require_approval_ok() { function request_serde_roundtrip (line 667) | fn request_serde_roundtrip() { function policy_serde_roundtrip (line 685) | fn policy_serde_roundtrip() { FILE: crates/openfang-types/src/capability.rs type Capability (line 12) | pub enum Capability { type CapabilityCheck (line 76) | pub enum CapabilityCheck { method is_granted (line 85) | pub fn is_granted(&self) -> bool { method require (line 90) | pub fn require(&self) -> Result<(), crate::error::OpenFangError> { function capability_matches (line 106) | pub fn capability_matches(granted: &Capability, required: &Capability) -... function validate_capability_inheritance (line 171) | pub fn validate_capability_inheritance( function glob_matches (line 190) | fn glob_matches(pattern: &str, value: &str) -> bool { function test_exact_match (line 219) | fn test_exact_match() { function test_wildcard_match (line 227) | fn test_wildcard_match() { function test_star_matches_all (line 235) | fn test_star_matches_all() { function test_tool_all_grants_specific (line 243) | fn test_tool_all_grants_specific() { function test_different_variants_dont_match (line 251) | fn test_different_variants_dont_match() { function test_numeric_capability_bounds (line 259) | fn test_numeric_capability_bounds() { function test_capability_check_require (line 271) | fn test_capability_check_require() { function test_glob_matches_middle_wildcard (line 277) | fn test_glob_matches_middle_wildcard() { function test_agent_kill_capability (line 283) | fn test_agent_kill_capability() { function test_capability_inheritance_subset_ok (line 295) | fn test_capability_inheritance_subset_ok() { function test_capability_inheritance_escalation_denied (line 308) | fn test_capability_inheritance_escalation_denied() { FILE: crates/openfang-types/src/comms.rs type TopoNode (line 11) | pub struct TopoNode { type TopoEdge (line 24) | pub struct TopoEdge { type EdgeKind (line 36) | pub enum EdgeKind { type Topology (line 45) | pub struct Topology { type CommsEvent (line 52) | pub struct CommsEvent { type CommsEventKind (line 74) | pub enum CommsEventKind { type CommsSendRequest (line 91) | pub struct CommsSendRequest { type CommsTaskRequest (line 99) | pub struct CommsTaskRequest { function comms_event_kind_roundtrip (line 111) | fn comms_event_kind_roundtrip() { function edge_kind_roundtrip (line 120) | fn edge_kind_roundtrip() { function topology_serialization (line 129) | fn topology_serialization() { function comms_send_request_deser (line 149) | fn comms_send_request_deser() { function comms_task_request_deser (line 157) | fn comms_task_request_deser() { function comms_task_request_with_assign (line 165) | fn comms_task_request_with_assign() { FILE: crates/openfang-types/src/config.rs function deserialize_string_or_int_vec (line 12) | fn deserialize_string_or_int_vec<'de, D>(deserializer: D) -> Result Self { type UsageFooterMode (line 118) | pub enum UsageFooterMode { type KernelMode (line 133) | pub enum KernelMode { type UserConfig (line 145) | pub struct UserConfig { function default_role (line 160) | fn default_role() -> String { type SearchProvider (line 167) | pub enum SearchProvider { type WebConfig (line 184) | pub struct WebConfig { method default (line 200) | fn default() -> Self { type BraveSearchConfig (line 215) | pub struct BraveSearchConfig { method default (line 229) | fn default() -> Self { type TavilySearchConfig (line 243) | pub struct TavilySearchConfig { method default (line 255) | fn default() -> Self { type PerplexitySearchConfig (line 268) | pub struct PerplexitySearchConfig { method default (line 276) | fn default() -> Self { type WebFetchConfig (line 287) | pub struct WebFetchConfig { method default (line 299) | fn default() -> Self { type BrowserConfig (line 312) | pub struct BrowserConfig { method default (line 330) | fn default() -> Self { type ReloadMode (line 346) | pub enum ReloadMode { type ReloadConfig (line 361) | pub struct ReloadConfig { method default (line 369) | fn default() -> Self { type WebhookTriggerConfig (line 383) | pub struct WebhookTriggerConfig { method default (line 396) | fn default() -> Self { type FallbackProviderConfig (line 415) | pub struct FallbackProviderConfig { type TtsConfig (line 431) | pub struct TtsConfig { method default (line 447) | fn default() -> Self { type TtsOpenAiConfig (line 462) | pub struct TtsOpenAiConfig { method default (line 474) | fn default() -> Self { type TtsElevenLabsConfig (line 487) | pub struct TtsElevenLabsConfig { method default (line 499) | fn default() -> Self { type DockerSandboxConfig (line 512) | pub struct DockerSandboxConfig { function default_reuse_cool_secs (line 557) | fn default_reuse_cool_secs() -> u64 { function default_docker_idle_timeout (line 560) | fn default_docker_idle_timeout() -> u64 { function default_docker_max_age (line 563) | fn default_docker_max_age() -> u64 { method default (line 568) | fn default() -> Self { type PairingConfig (line 595) | pub struct PairingConfig { method default (line 611) | fn default() -> Self { type ExtensionsConfig (line 626) | pub struct ExtensionsConfig { method default (line 638) | fn default() -> Self { type VaultConfig (line 651) | pub struct VaultConfig { method default (line 659) | fn default() -> Self { type AgentBinding (line 669) | pub struct AgentBinding { type BindingMatchRule (line 678) | pub struct BindingMatchRule { method specificity (line 695) | pub fn specificity(&self) -> u32 { type BroadcastConfig (line 719) | pub struct BroadcastConfig { type BroadcastStrategy (line 729) | pub enum BroadcastStrategy { type AutoReplyConfig (line 740) | pub struct AutoReplyConfig { method default (line 752) | fn default() -> Self { type CanvasConfig (line 765) | pub struct CanvasConfig { method default (line 776) | fn default() -> Self { type ExecSecurityMode (line 788) | pub enum ExecSecurityMode { type ExecPolicy (line 804) | pub struct ExecPolicy { function default_no_output_timeout (line 822) | fn default_no_output_timeout() -> u64 { method default (line 827) | fn default() -> Self { type TerminationReason (line 851) | pub enum TerminationReason { type AuthProfile (line 869) | pub struct AuthProfile { method fmt (line 881) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { type DockerSandboxMode (line 897) | pub enum DockerSandboxMode { type DockerScope (line 910) | pub enum DockerScope { type TypingMode (line 927) | pub enum TypingMode { type ThinkingConfig (line 946) | pub struct ThinkingConfig { method default (line 954) | fn default() -> Self { type KernelConfig (line 965) | pub struct KernelConfig { method effective_workspaces_dir (line 1317) | pub fn effective_workspaces_dir(&self) -> PathBuf { method resolve_api_key_env (line 1327) | pub fn resolve_api_key_env(&self, provider: &str) -> String { method fmt (line 1347) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { method validate (line 3020) | pub fn validate(&self) -> Vec { method clamp_bounds (line 3481) | pub fn clamp_bounds(&mut self) { type AuthConfig (line 1107) | pub struct AuthConfig { method default (line 1120) | fn default() -> Self { type OAuthConfig (line 1140) | pub struct OAuthConfig { type BudgetConfig (line 1156) | pub struct BudgetConfig { method default (line 1172) | fn default() -> Self { function default_max_cron_jobs (line 1183) | fn default_max_cron_jobs() -> usize { type McpServerConfigEntry (line 1192) | pub struct McpServerConfigEntry { function default_mcp_timeout (line 1205) | fn default_mcp_timeout() -> u64 { type McpTransportEntry (line 1212) | pub enum McpTransportEntry { type A2aConfig (line 1226) | pub struct A2aConfig { function default_a2a_path (line 1237) | fn default_a2a_path() -> String { type ExternalAgent (line 1243) | pub struct ExternalAgent { function default_language (line 1250) | fn default_language() -> String { function default_true (line 1254) | fn default_true() -> bool { function default_thread_ttl (line 1258) | fn default_thread_ttl() -> u64 { method default (line 1263) | fn default() -> Self { function openfang_home_dir (line 1436) | fn openfang_home_dir() -> PathBuf { type DefaultModelConfig (line 1448) | pub struct DefaultModelConfig { method default (line 1460) | fn default() -> Self { type MemoryConfig (line 1473) | pub struct MemoryConfig { function default_consolidation_interval (line 1493) | fn default_consolidation_interval() -> u64 { method default (line 1498) | fn default() -> Self { type NetworkConfig (line 1514) | pub struct NetworkConfig { method fmt (line 1541) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { method default (line 1528) | fn default() -> Self { type ChannelsConfig (line 1562) | pub struct ChannelsConfig { type TelegramConfig (line 1655) | pub struct TelegramConfig { method default (line 1680) | fn default() -> Self { type DiscordConfig (line 1696) | pub struct DiscordConfig { method default (line 1723) | fn default() -> Self { type SlackConfig (line 1740) | pub struct SlackConfig { method default (line 1765) | fn default() -> Self { type WhatsAppConfig (line 1782) | pub struct WhatsAppConfig { method default (line 1805) | fn default() -> Self { type SignalConfig (line 1822) | pub struct SignalConfig { method default (line 1838) | fn default() -> Self { type MatrixConfig (line 1852) | pub struct MatrixConfig { method default (line 1873) | fn default() -> Self { type EmailConfig (line 1889) | pub struct EmailConfig { method default (line 1918) | fn default() -> Self { type TeamsConfig (line 1938) | pub struct TeamsConfig { method default (line 1956) | fn default() -> Self { type MattermostConfig (line 1971) | pub struct MattermostConfig { method default (line 1987) | fn default() -> Self { type IrcConfig (line 2001) | pub struct IrcConfig { method default (line 2023) | fn default() -> Self { type GoogleChatConfig (line 2040) | pub struct GoogleChatConfig { method default (line 2056) | fn default() -> Self { type TwitchConfig (line 2070) | pub struct TwitchConfig { method default (line 2086) | fn default() -> Self { type RocketChatConfig (line 2100) | pub struct RocketChatConfig { method default (line 2118) | fn default() -> Self { type ZulipConfig (line 2133) | pub struct ZulipConfig { method default (line 2151) | fn default() -> Self { type XmppConfig (line 2166) | pub struct XmppConfig { method default (line 2186) | fn default() -> Self { type LineConfig (line 2204) | pub struct LineConfig { method default (line 2219) | fn default() -> Self { type ViberConfig (line 2233) | pub struct ViberConfig { method default (line 2248) | fn default() -> Self { type MessengerConfig (line 2262) | pub struct MessengerConfig { method default (line 2277) | fn default() -> Self { type RedditConfig (line 2291) | pub struct RedditConfig { method default (line 2311) | fn default() -> Self { type MastodonConfig (line 2327) | pub struct MastodonConfig { method default (line 2340) | fn default() -> Self { type BlueskyConfig (line 2353) | pub struct BlueskyConfig { method default (line 2368) | fn default() -> Self { type FeishuConfig (line 2385) | pub struct FeishuConfig { method default (line 2411) | fn default() -> Self { type WeComConfig (line 2430) | pub struct WeComConfig { method default (line 2451) | fn default() -> Self { type RevoltConfig (line 2468) | pub struct RevoltConfig { method default (line 2481) | fn default() -> Self { type NextcloudConfig (line 2496) | pub struct NextcloudConfig { method default (line 2512) | fn default() -> Self { type GuildedConfig (line 2526) | pub struct GuildedConfig { method default (line 2540) | fn default() -> Self { type KeybaseConfig (line 2553) | pub struct KeybaseConfig { method default (line 2569) | fn default() -> Self { type ThreemaConfig (line 2583) | pub struct ThreemaConfig { method default (line 2598) | fn default() -> Self { type NostrConfig (line 2612) | pub struct NostrConfig { method default (line 2626) | fn default() -> Self { type WebexConfig (line 2639) | pub struct WebexConfig { method default (line 2653) | fn default() -> Self { type PumbleConfig (line 2666) | pub struct PumbleConfig { method default (line 2679) | fn default() -> Self { type FlockConfig (line 2692) | pub struct FlockConfig { method default (line 2705) | fn default() -> Self { type TwistConfig (line 2718) | pub struct TwistConfig { method default (line 2734) | fn default() -> Self { type MumbleConfig (line 2750) | pub struct MumbleConfig { method default (line 2769) | fn default() -> Self { type DingTalkConfig (line 2785) | pub struct DingTalkConfig { method default (line 2800) | fn default() -> Self { type DingTalkStreamConfig (line 2818) | pub struct DingTalkStreamConfig { method default (line 2833) | fn default() -> Self { type DiscourseConfig (line 2847) | pub struct DiscourseConfig { method default (line 2865) | fn default() -> Self { type GitterConfig (line 2880) | pub struct GitterConfig { method default (line 2893) | fn default() -> Self { type NtfyConfig (line 2906) | pub struct NtfyConfig { method default (line 2921) | fn default() -> Self { type GotifyConfig (line 2935) | pub struct GotifyConfig { method default (line 2950) | fn default() -> Self { type WebhookConfig (line 2964) | pub struct WebhookConfig { method default (line 2979) | fn default() -> Self { type LinkedInConfig (line 2993) | pub struct LinkedInConfig { method default (line 3006) | fn default() -> Self { function test_default_config (line 3517) | fn test_default_config() { function test_config_serialization (line 3525) | fn test_config_serialization() { function test_discord_config_defaults (line 3532) | fn test_discord_config_defaults() { function test_discord_config_ignore_bots_deserialization (line 3541) | fn test_discord_config_ignore_bots_deserialization() { function test_slack_config_defaults (line 3558) | fn test_slack_config_defaults() { function test_validate_no_channels (line 3566) | fn test_validate_no_channels() { function test_kernel_mode_default (line 3573) | fn test_kernel_mode_default() { function test_kernel_mode_serde (line 3579) | fn test_kernel_mode_serde() { function test_user_config_serde (line 3588) | fn test_user_config_serde() { function test_config_with_mode_and_language (line 3607) | fn test_config_with_mode_and_language() { function test_validate_missing_env_vars (line 3618) | fn test_validate_missing_env_vars() { function test_whatsapp_config_defaults (line 3630) | fn test_whatsapp_config_defaults() { function test_signal_config_defaults (line 3638) | fn test_signal_config_defaults() { function test_matrix_config_defaults (line 3645) | fn test_matrix_config_defaults() { function test_email_config_defaults (line 3653) | fn test_email_config_defaults() { function test_whatsapp_config_serde (line 3662) | fn test_whatsapp_config_serde() { function test_matrix_config_serde (line 3673) | fn test_matrix_config_serde() { function test_channels_config_with_new_channels (line 3684) | fn test_channels_config_with_new_channels() { function test_teams_config_defaults (line 3702) | fn test_teams_config_defaults() { function test_mattermost_config_defaults (line 3710) | fn test_mattermost_config_defaults() { function test_irc_config_defaults (line 3717) | fn test_irc_config_defaults() { function test_google_chat_config_defaults (line 3726) | fn test_google_chat_config_defaults() { function test_twitch_config_defaults (line 3733) | fn test_twitch_config_defaults() { function test_rocketchat_config_defaults (line 3740) | fn test_rocketchat_config_defaults() { function test_zulip_config_defaults (line 3747) | fn test_zulip_config_defaults() { function test_xmpp_config_defaults (line 3754) | fn test_xmpp_config_defaults() { function test_all_new_channel_configs_serde (line 3762) | fn test_all_new_channel_configs_serde() { function test_channel_overrides_defaults (line 3790) | fn test_channel_overrides_defaults() { function test_fallback_config_serde_roundtrip (line 3802) | fn test_fallback_config_serde_roundtrip() { function test_fallback_config_default_empty (line 3818) | fn test_fallback_config_default_empty() { function test_fallback_config_in_toml (line 3824) | fn test_fallback_config_in_toml() { function test_channel_overrides_serde (line 3842) | fn test_channel_overrides_serde() { function test_channel_overrides_lifecycle_reactions_disabled (line 3863) | fn test_channel_overrides_lifecycle_reactions_disabled() { function test_channel_overrides_lifecycle_reactions_missing_defaults_true (line 3873) | fn test_channel_overrides_lifecycle_reactions_missing_defaults_true() { function test_clamp_bounds_zero_browser_timeout (line 3880) | fn test_clamp_bounds_zero_browser_timeout() { function test_clamp_bounds_excessive_browser_sessions (line 3888) | fn test_clamp_bounds_excessive_browser_sessions() { function test_clamp_bounds_zero_fetch_bytes (line 3896) | fn test_clamp_bounds_zero_fetch_bytes() { function test_clamp_bounds_zero_fetch_timeout (line 3904) | fn test_clamp_bounds_zero_fetch_timeout() { function test_clamp_bounds_defaults_unchanged (line 3912) | fn test_clamp_bounds_defaults_unchanged() { function test_resolve_api_key_env_convention (line 3926) | fn test_resolve_api_key_env_convention() { function test_resolve_api_key_env_explicit_mapping (line 3934) | fn test_resolve_api_key_env_explicit_mapping() { function test_resolve_api_key_env_auth_profiles (line 3944) | fn test_resolve_api_key_env_auth_profiles() { function test_resolve_api_key_env_explicit_over_auth_profile (line 3959) | fn test_resolve_api_key_env_explicit_over_auth_profile() { function test_provider_api_keys_toml_roundtrip (line 3977) | fn test_provider_api_keys_toml_roundtrip() { function test_slack_config_unfurl_links_defaults_true (line 3996) | fn test_slack_config_unfurl_links_defaults_true() { function test_slack_config_unfurl_links_explicit_false (line 4002) | fn test_slack_config_unfurl_links_explicit_false() { function test_slack_config_unfurl_links_explicit_true (line 4008) | fn test_slack_config_unfurl_links_explicit_true() { FILE: crates/openfang-types/src/error.rs type OpenFangError (line 7) | pub enum OpenFangError { type OpenFangResult (line 104) | pub type OpenFangResult = Result; FILE: crates/openfang-types/src/event.rs function serialize (line 18) | pub fn serialize(dur: &Option, s: S) -> Result<... function deserialize (line 26) | pub fn deserialize<'de, D: Deserializer<'de>>(d: D) -> Result Self { method fmt (line 50) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { method default (line 44) | fn default() -> Self { type EventTarget (line 58) | pub enum EventTarget { type EventPayload (line 72) | pub enum EventPayload { type AgentMessage (line 91) | pub struct AgentMessage { type MessageRole (line 103) | pub enum MessageRole { type ToolOutput (line 116) | pub struct ToolOutput { type MemoryDelta (line 131) | pub struct MemoryDelta { type MemoryOperation (line 143) | pub enum MemoryOperation { type LifecycleEvent (line 155) | pub enum LifecycleEvent { type NetworkEvent (line 197) | pub enum NetworkEvent { type SystemEvent (line 227) | pub enum SystemEvent { type Event (line 284) | pub struct Event { method new (line 304) | pub fn new(source: AgentId, target: EventTarget, payload: EventPayload... method with_correlation (line 317) | pub fn with_correlation(mut self, correlation_id: EventId) -> Self { method with_ttl (line 323) | pub fn with_ttl(mut self, ttl: Duration) -> Self { function test_event_creation (line 334) | fn test_event_creation() { function test_event_with_correlation (line 347) | fn test_event_with_correlation() { function test_event_serialization (line 362) | fn test_event_serialization() { function test_event_with_ttl_serialization (line 379) | fn test_event_with_ttl_serialization() { FILE: crates/openfang-types/src/lib.rs function truncate_str (line 26) | pub fn truncate_str(s: &str, max_bytes: usize) -> &str { function truncate_str_ascii (line 42) | fn truncate_str_ascii() { function truncate_str_chinese (line 47) | fn truncate_str_chinese() { function truncate_str_emoji (line 56) | fn truncate_str_emoji() { function truncate_str_em_dash (line 63) | fn truncate_str_em_dash() { function truncate_str_no_truncation (line 73) | fn truncate_str_no_truncation() { function truncate_str_empty (line 78) | fn truncate_str_empty() { FILE: crates/openfang-types/src/manifest_signing.rs type SignedManifest (line 25) | pub struct SignedManifest { method sign (line 50) | pub fn sign( method verify (line 76) | pub fn verify(&self) -> Result<(), String> { function hash_manifest (line 39) | pub fn hash_manifest(manifest: &str) -> String { function test_sign_and_verify (line 116) | fn test_sign_and_verify() { function test_tampered_fails (line 135) | fn test_tampered_fails() { function test_wrong_key_fails (line 150) | fn test_wrong_key_fails() { FILE: crates/openfang-types/src/media.rs type MediaType (line 8) | pub enum MediaType { method fmt (line 15) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { type MediaSource (line 27) | pub enum MediaSource { type MediaAttachment (line 38) | pub struct MediaAttachment { method validate (line 150) | pub fn validate(&self) -> Result<(), String> { type MediaUnderstanding (line 51) | pub struct MediaUnderstanding { type MediaConfig (line 65) | pub struct MediaConfig { method default (line 81) | fn default() -> Self { type LinkConfig (line 96) | pub struct LinkConfig { method default (line 108) | fn default() -> Self { constant MAX_IMAGE_BYTES (line 123) | pub const MAX_IMAGE_BYTES: u64 = 10 * 1024 * 1024; constant MAX_AUDIO_BYTES (line 125) | pub const MAX_AUDIO_BYTES: u64 = 20 * 1024 * 1024; constant MAX_VIDEO_BYTES (line 127) | pub const MAX_VIDEO_BYTES: u64 = 50 * 1024 * 1024; constant MAX_BASE64_DECODED_BYTES (line 129) | pub const MAX_BASE64_DECODED_BYTES: u64 = 70 * 1024 * 1024; constant ALLOWED_IMAGE_TYPES (line 132) | pub const ALLOWED_IMAGE_TYPES: &[&str] = &["image/png", "image/jpeg", "i... constant ALLOWED_AUDIO_TYPES (line 135) | pub const ALLOWED_AUDIO_TYPES: &[&str] = &[ constant ALLOWED_VIDEO_TYPES (line 146) | pub const ALLOWED_VIDEO_TYPES: &[&str] = &["video/mp4", "video/quicktime... type ImageGenModel (line 184) | pub enum ImageGenModel { method fmt (line 193) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { type ImageGenRequest (line 204) | pub struct ImageGenRequest { constant MAX_PROMPT_LEN (line 240) | pub const MAX_PROMPT_LEN: usize = 4000; method validate (line 243) | pub fn validate(&self) -> Result<(), String> { function default_image_size (line 221) | fn default_image_size() -> String { function default_image_quality (line 225) | fn default_image_quality() -> String { function default_image_count (line 229) | fn default_image_count() -> u8 { constant DALLE3_SIZES (line 234) | pub const DALLE3_SIZES: &[&str] = &["1024x1024", "1792x1024", "1024x1792"]; constant DALLE2_SIZES (line 235) | pub const DALLE2_SIZES: &[&str] = &["256x256", "512x512", "1024x1024"]; constant GPT_IMAGE1_SIZES (line 236) | pub const GPT_IMAGE1_SIZES: &[&str] = &["1024x1024", "1536x1024", "1024x... type ImageGenResult (line 325) | pub struct ImageGenResult { type GeneratedImage (line 336) | pub struct GeneratedImage { function test_media_type_display (line 348) | fn test_media_type_display() { function test_media_config_default (line 355) | fn test_media_config_default() { function test_link_config_default (line 365) | fn test_link_config_default() { function test_attachment_validate_valid_image (line 374) | fn test_attachment_validate_valid_image() { function test_attachment_validate_bad_mime (line 387) | fn test_attachment_validate_bad_mime() { function test_attachment_validate_too_large (line 400) | fn test_attachment_validate_too_large() { function test_attachment_validate_audio (line 413) | fn test_attachment_validate_audio() { function test_attachment_validate_video_too_large (line 426) | fn test_attachment_validate_video_too_large() { function test_image_gen_model_display (line 439) | fn test_image_gen_model_display() { function test_image_gen_request_validate_valid (line 446) | fn test_image_gen_request_validate_valid() { function test_image_gen_request_validate_empty_prompt (line 458) | fn test_image_gen_request_validate_empty_prompt() { function test_image_gen_request_validate_bad_size (line 470) | fn test_image_gen_request_validate_bad_size() { function test_image_gen_request_validate_dalle3_count (line 482) | fn test_image_gen_request_validate_dalle3_count() { function test_image_gen_request_validate_dalle2_multi (line 494) | fn test_image_gen_request_validate_dalle2_multi() { function test_image_gen_request_validate_control_chars (line 506) | fn test_image_gen_request_validate_control_chars() { function test_media_type_serde_roundtrip (line 518) | fn test_media_type_serde_roundtrip() { function test_image_gen_model_serde_roundtrip (line 527) | fn test_image_gen_model_serde_roundtrip() { function test_media_config_serde_roundtrip (line 536) | fn test_media_config_serde_roundtrip() { FILE: crates/openfang-types/src/memory.rs type MemoryId (line 12) | pub struct MemoryId(pub Uuid); method new (line 16) | pub fn new() -> Self { method fmt (line 28) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { method default (line 22) | fn default() -> Self { type MemorySource (line 36) | pub enum MemorySource { type MemoryFragment (line 53) | pub struct MemoryFragment { type MemoryFilter (line 80) | pub struct MemoryFilter { method agent (line 99) | pub fn agent(agent_id: AgentId) -> Self { method scope (line 107) | pub fn scope(scope: impl Into) -> Self { type Entity (line 117) | pub struct Entity { type EntityType (line 135) | pub enum EntityType { type Relation (line 158) | pub struct Relation { type RelationType (line 176) | pub enum RelationType { type GraphPattern (line 203) | pub struct GraphPattern { type GraphMatch (line 216) | pub struct GraphMatch { type ConsolidationReport (line 227) | pub struct ConsolidationReport { type ExportFormat (line 238) | pub enum ExportFormat { type ImportReport (line 247) | pub struct ImportReport { type Memory (line 263) | pub trait Memory: Send + Sync { method get (line 267) | async fn get( method set (line 274) | async fn set( method delete (line 282) | async fn delete(&self, agent_id: AgentId, key: &str) -> crate::error::... method remember (line 287) | async fn remember( method recall (line 297) | async fn recall( method forget (line 305) | async fn forget(&self, id: MemoryId) -> crate::error::OpenFangResult<()>; method add_entity (line 310) | async fn add_entity(&self, entity: Entity) -> crate::error::OpenFangRe... method add_relation (line 313) | async fn add_relation(&self, relation: Relation) -> crate::error::Open... method query_graph (line 316) | async fn query_graph( method consolidate (line 324) | async fn consolidate(&self) -> crate::error::OpenFangResult crate::error::OpenFang... method import (line 330) | async fn import( function test_memory_filter_agent (line 342) | fn test_memory_filter_agent() { function test_memory_fragment_serialization (line 350) | fn test_memory_fragment_serialization() { FILE: crates/openfang-types/src/message.rs type Message (line 7) | pub struct Message { method system (line 171) | pub fn system(content: impl Into) -> Self { method user (line 179) | pub fn user(content: impl Into) -> Self { method user_with_blocks (line 187) | pub fn user_with_blocks(blocks: Vec) -> Self { method assistant (line 195) | pub fn assistant(content: impl Into) -> Self { type Role (line 17) | pub enum Role { type MessageContent (line 29) | pub enum MessageContent { method text (line 131) | pub fn text(content: impl Into) -> Self { method text_length (line 136) | pub fn text_length(&self) -> usize { method text_content (line 154) | pub fn text_content(&self) -> String { type ContentBlock (line 39) | pub enum ContentBlock { constant ALLOWED_IMAGE_TYPES (line 99) | const ALLOWED_IMAGE_TYPES: &[&str] = &["image/png", "image/jpeg", "image... constant MAX_IMAGE_BYTES (line 102) | const MAX_IMAGE_BYTES: usize = 5 * 1024 * 1024; function validate_image (line 108) | pub fn validate_image(media_type: &str, data: &str) -> Result<(), String> { type StopReason (line 206) | pub enum StopReason { type TokenUsage (line 219) | pub struct TokenUsage { method total (line 228) | pub fn total(&self) -> u64 { type ReplyDirectives (line 240) | pub struct ReplyDirectives { function test_message_creation (line 254) | fn test_message_creation() { function test_token_usage (line 264) | fn test_token_usage() { function test_validate_image_valid (line 273) | fn test_validate_image_valid() { function test_validate_image_bad_type (line 281) | fn test_validate_image_bad_type() { function test_validate_image_too_large (line 289) | fn test_validate_image_too_large() { function test_content_block_image_serde (line 296) | fn test_content_block_image_serde() { function test_content_block_unknown_deser (line 307) | fn test_content_block_unknown_deser() { function test_user_with_blocks (line 314) | fn test_user_with_blocks() { FILE: crates/openfang-types/src/model_catalog.rs constant ANTHROPIC_BASE_URL (line 11) | pub const ANTHROPIC_BASE_URL: &str = "https://api.anthropic.com"; constant OPENAI_BASE_URL (line 12) | pub const OPENAI_BASE_URL: &str = "https://api.openai.com/v1"; constant GEMINI_BASE_URL (line 13) | pub const GEMINI_BASE_URL: &str = "https://generativelanguage.googleapis... constant DEEPSEEK_BASE_URL (line 14) | pub const DEEPSEEK_BASE_URL: &str = "https://api.deepseek.com/v1"; constant GROQ_BASE_URL (line 15) | pub const GROQ_BASE_URL: &str = "https://api.groq.com/openai/v1"; constant OPENROUTER_BASE_URL (line 16) | pub const OPENROUTER_BASE_URL: &str = "https://openrouter.ai/api/v1"; constant MISTRAL_BASE_URL (line 17) | pub const MISTRAL_BASE_URL: &str = "https://api.mistral.ai/v1"; constant TOGETHER_BASE_URL (line 18) | pub const TOGETHER_BASE_URL: &str = "https://api.together.xyz/v1"; constant FIREWORKS_BASE_URL (line 19) | pub const FIREWORKS_BASE_URL: &str = "https://api.fireworks.ai/inference... constant OLLAMA_BASE_URL (line 20) | pub const OLLAMA_BASE_URL: &str = "http://localhost:11434/v1"; constant VLLM_BASE_URL (line 21) | pub const VLLM_BASE_URL: &str = "http://localhost:8000/v1"; constant LMSTUDIO_BASE_URL (line 22) | pub const LMSTUDIO_BASE_URL: &str = "http://localhost:1234/v1"; constant LEMONADE_BASE_URL (line 23) | pub const LEMONADE_BASE_URL: &str = "http://localhost:8888/api/v1"; constant PERPLEXITY_BASE_URL (line 24) | pub const PERPLEXITY_BASE_URL: &str = "https://api.perplexity.ai"; constant COHERE_BASE_URL (line 25) | pub const COHERE_BASE_URL: &str = "https://api.cohere.com/v2"; constant AI21_BASE_URL (line 26) | pub const AI21_BASE_URL: &str = "https://api.ai21.com/studio/v1"; constant CEREBRAS_BASE_URL (line 27) | pub const CEREBRAS_BASE_URL: &str = "https://api.cerebras.ai/v1"; constant SAMBANOVA_BASE_URL (line 28) | pub const SAMBANOVA_BASE_URL: &str = "https://api.sambanova.ai/v1"; constant HUGGINGFACE_BASE_URL (line 29) | pub const HUGGINGFACE_BASE_URL: &str = "https://api-inference.huggingfac... constant XAI_BASE_URL (line 30) | pub const XAI_BASE_URL: &str = "https://api.x.ai/v1"; constant REPLICATE_BASE_URL (line 31) | pub const REPLICATE_BASE_URL: &str = "https://api.replicate.com/v1"; constant VENICE_BASE_URL (line 32) | pub const VENICE_BASE_URL: &str = "https://api.venice.ai/api/v1"; constant NVIDIA_NIM_BASE_URL (line 33) | pub const NVIDIA_NIM_BASE_URL: &str = "https://integrate.api.nvidia.com/... constant GITHUB_COPILOT_BASE_URL (line 36) | pub const GITHUB_COPILOT_BASE_URL: &str = "https://api.githubcopilot.com"; constant QWEN_BASE_URL (line 39) | pub const QWEN_BASE_URL: &str = "https://dashscope.aliyuncs.com/compatib... constant MINIMAX_BASE_URL (line 41) | pub const MINIMAX_BASE_URL: &str = "https://api.minimax.io/v1"; constant ZHIPU_BASE_URL (line 42) | pub const ZHIPU_BASE_URL: &str = "https://open.bigmodel.cn/api/paas/v4"; constant ZHIPU_CODING_BASE_URL (line 43) | pub const ZHIPU_CODING_BASE_URL: &str = "https://open.bigmodel.cn/api/co... constant ZAI_BASE_URL (line 45) | pub const ZAI_BASE_URL: &str = "https://api.z.ai/api/paas/v4"; constant ZAI_CODING_BASE_URL (line 46) | pub const ZAI_CODING_BASE_URL: &str = "https://api.z.ai/api/coding/paas/... constant MOONSHOT_BASE_URL (line 47) | pub const MOONSHOT_BASE_URL: &str = "https://api.moonshot.ai/v1"; constant KIMI_CODING_BASE_URL (line 48) | pub const KIMI_CODING_BASE_URL: &str = "https://api.kimi.com/coding"; constant QIANFAN_BASE_URL (line 49) | pub const QIANFAN_BASE_URL: &str = "https://qianfan.baidubce.com/v2"; constant VOLCENGINE_BASE_URL (line 50) | pub const VOLCENGINE_BASE_URL: &str = "https://ark.cn-beijing.volces.com... constant VOLCENGINE_CODING_BASE_URL (line 51) | pub const VOLCENGINE_CODING_BASE_URL: &str = "https://ark.cn-beijing.vol... constant CHUTES_BASE_URL (line 54) | pub const CHUTES_BASE_URL: &str = "https://llm.chutes.ai/v1"; constant AZURE_OPENAI_BASE_URL (line 60) | pub const AZURE_OPENAI_BASE_URL: &str = ""; constant BEDROCK_BASE_URL (line 63) | pub const BEDROCK_BASE_URL: &str = "https://bedrock-runtime.us-east-1.am... type ModelTier (line 68) | pub enum ModelTier { method fmt (line 85) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { type AuthStatus (line 100) | pub enum AuthStatus { method fmt (line 111) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { type ModelCatalogEntry (line 122) | pub struct ModelCatalogEntry { method default (line 151) | fn default() -> Self { type ProviderInfo (line 171) | pub struct ProviderInfo { method default (line 189) | fn default() -> Self { function test_model_tier_display (line 207) | fn test_model_tier_display() { function test_auth_status_display (line 217) | fn test_auth_status_display() { function test_model_tier_default (line 224) | fn test_model_tier_default() { function test_auth_status_default (line 229) | fn test_auth_status_default() { function test_model_catalog_entry_default (line 234) | fn test_model_catalog_entry_default() { function test_provider_info_default (line 242) | fn test_provider_info_default() { function test_model_tier_serde_roundtrip (line 250) | fn test_model_tier_serde_roundtrip() { function test_auth_status_serde_roundtrip (line 259) | fn test_auth_status_serde_roundtrip() { function test_model_entry_serde_roundtrip (line 268) | fn test_model_entry_serde_roundtrip() { function test_provider_info_serde_roundtrip (line 291) | fn test_provider_info_serde_roundtrip() { function test_azure_openai_base_url_empty (line 309) | fn test_azure_openai_base_url_empty() { FILE: crates/openfang-types/src/scheduler.rs constant MAX_JOBS_PER_AGENT (line 12) | pub const MAX_JOBS_PER_AGENT: usize = 50; constant MAX_NAME_LEN (line 15) | const MAX_NAME_LEN: usize = 128; constant MIN_EVERY_SECS (line 18) | const MIN_EVERY_SECS: u64 = 60; constant MAX_EVERY_SECS (line 21) | const MAX_EVERY_SECS: u64 = 86_400; constant MAX_AT_HORIZON_SECS (line 24) | const MAX_AT_HORIZON_SECS: i64 = 365 * 24 * 3600; constant MAX_EVENT_TEXT_LEN (line 27) | const MAX_EVENT_TEXT_LEN: usize = 4096; constant MAX_TURN_MESSAGE_LEN (line 30) | const MAX_TURN_MESSAGE_LEN: usize = 16_384; constant MIN_TIMEOUT_SECS (line 33) | const MIN_TIMEOUT_SECS: u64 = 10; constant MAX_TIMEOUT_SECS (line 36) | const MAX_TIMEOUT_SECS: u64 = 600; constant MAX_WEBHOOK_URL_LEN (line 39) | const MAX_WEBHOOK_URL_LEN: usize = 2048; type CronJobId (line 47) | pub struct CronJobId(pub Uuid); method new (line 51) | pub fn new() -> Self { method fmt (line 63) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { type Err (line 69) | type Err = uuid::Error; method from_str (line 71) | fn from_str(s: &str) -> Result { method default (line 57) | fn default() -> Self { type CronSchedule (line 83) | pub enum CronSchedule { type CronAction (line 110) | pub enum CronAction { type CronDelivery (line 143) | pub enum CronDelivery { type CronJob (line 168) | pub struct CronJob { method validate (line 197) | pub fn validate(&self, existing_count: usize) -> Result<(), String> { method validate_schedule (line 238) | fn validate_schedule(&self) -> Result<(), String> { method validate_action (line 271) | fn validate_action(&self) -> Result<(), String> { method validate_delivery (line 343) | fn validate_delivery(&self) -> Result<(), String> { function validate_cron_expr (line 376) | fn validate_cron_expr(expr: &str) -> Result<(), String> { function valid_job (line 416) | fn valid_job() -> CronJob { function cron_job_id_display_roundtrip (line 436) | fn cron_job_id_display_roundtrip() { function cron_job_id_default (line 444) | fn cron_job_id_default() { function valid_job_passes (line 453) | fn valid_job_passes() { function empty_name_rejected (line 460) | fn empty_name_rejected() { function long_name_rejected (line 468) | fn long_name_rejected() { function name_128_chars_ok (line 476) | fn name_128_chars_ok() { function name_special_chars_rejected (line 483) | fn name_special_chars_rejected() { function name_with_spaces_hyphens_underscores_ok (line 491) | fn name_with_spaces_hyphens_underscores_ok() { function max_jobs_rejected (line 500) | fn max_jobs_rejected() { function under_max_jobs_ok (line 507) | fn under_max_jobs_ok() { function every_too_small (line 515) | fn every_too_small() { function every_too_large (line 523) | fn every_too_large() { function every_min_boundary_ok (line 531) | fn every_min_boundary_ok() { function every_max_boundary_ok (line 538) | fn every_max_boundary_ok() { function at_in_past_rejected (line 547) | fn at_in_past_rejected() { function at_too_far_future_rejected (line 557) | fn at_too_far_future_rejected() { function at_near_future_ok (line 567) | fn at_near_future_ok() { function cron_valid_expr (line 578) | fn cron_valid_expr() { function cron_empty_expr (line 588) | fn cron_empty_expr() { function cron_wrong_field_count (line 599) | fn cron_wrong_field_count() { function cron_invalid_chars (line 610) | fn cron_invalid_chars() { function system_event_empty_text (line 623) | fn system_event_empty_text() { function system_event_text_too_long (line 633) | fn system_event_text_too_long() { function system_event_max_text_ok (line 643) | fn system_event_max_text_ok() { function agent_turn_empty_message (line 654) | fn agent_turn_empty_message() { function agent_turn_message_too_long (line 666) | fn agent_turn_message_too_long() { function agent_turn_timeout_too_small (line 678) | fn agent_turn_timeout_too_small() { function agent_turn_timeout_too_large (line 690) | fn agent_turn_timeout_too_large() { function agent_turn_timeout_boundaries_ok (line 702) | fn agent_turn_timeout_boundaries_ok() { function agent_turn_no_timeout_ok (line 720) | fn agent_turn_no_timeout_ok() { function delivery_channel_empty_channel (line 733) | fn delivery_channel_empty_channel() { function delivery_channel_empty_to (line 744) | fn delivery_channel_empty_to() { function delivery_channel_ok (line 755) | fn delivery_channel_ok() { function webhook_bad_scheme (line 767) | fn webhook_bad_scheme() { function webhook_too_long (line 777) | fn webhook_too_long() { function webhook_http_ok (line 787) | fn webhook_http_ok() { function webhook_https_ok (line 796) | fn webhook_https_ok() { function delivery_none_ok (line 807) | fn delivery_none_ok() { function delivery_last_channel_ok (line 814) | fn delivery_last_channel_ok() { function serde_roundtrip_every (line 823) | fn serde_roundtrip_every() { function serde_roundtrip_cron_schedule (line 832) | fn serde_roundtrip_cron_schedule() { function serde_action_tags (line 849) | fn serde_action_tags() { function serde_delivery_tags (line 860) | fn serde_delivery_tags() { function cron_extra_whitespace_ok (line 875) | fn cron_extra_whitespace_ok() { function cron_six_fields_rejected (line 885) | fn cron_six_fields_rejected() { function cron_slash_and_comma_ok (line 896) | fn cron_slash_and_comma_ok() { function workflow_run_valid (line 908) | fn workflow_run_valid() { function workflow_run_empty_id (line 919) | fn workflow_run_empty_id() { function workflow_run_input_too_long (line 931) | fn workflow_run_input_too_long() { function workflow_run_timeout_too_small (line 943) | fn workflow_run_timeout_too_small() { function workflow_run_timeout_too_large (line 955) | fn workflow_run_timeout_too_large() { function workflow_run_max_timeout_ok (line 967) | fn workflow_run_max_timeout_ok() { function workflow_run_no_input_ok (line 978) | fn workflow_run_no_input_ok() { function serde_workflow_run_tag (line 989) | fn serde_workflow_run_tag() { FILE: crates/openfang-types/src/serde_compat.rs function vec_lenient (line 18) | pub fn vec_lenient<'de, D, T>(deserializer: D) -> Result, D::Error> function map_lenient (line 88) | pub fn map_lenient<'de, D, K, V>(deserializer: D) -> Result( type TestVec (line 237) | struct TestVec { type TestMap (line 243) | struct TestMap { function vec_lenient_accepts_sequence (line 251) | fn vec_lenient_accepts_sequence() { function vec_lenient_given_map_returns_empty (line 258) | fn vec_lenient_given_map_returns_empty() { function vec_lenient_given_integer_returns_empty (line 265) | fn vec_lenient_given_integer_returns_empty() { function vec_lenient_given_string_returns_empty (line 272) | fn vec_lenient_given_string_returns_empty() { function vec_lenient_given_bool_returns_empty (line 279) | fn vec_lenient_given_bool_returns_empty() { function vec_lenient_given_null_returns_empty (line 286) | fn vec_lenient_given_null_returns_empty() { function map_lenient_accepts_map (line 295) | fn map_lenient_accepts_map() { function map_lenient_given_sequence_returns_empty (line 304) | fn map_lenient_given_sequence_returns_empty() { function map_lenient_given_integer_returns_empty (line 311) | fn map_lenient_given_integer_returns_empty() { function map_lenient_given_string_returns_empty (line 318) | fn map_lenient_given_string_returns_empty() { function map_lenient_given_bool_returns_empty (line 325) | fn map_lenient_given_bool_returns_empty() { function map_lenient_given_null_returns_empty (line 332) | fn map_lenient_given_null_returns_empty() { type OldManifest (line 341) | struct OldManifest { type NewManifest (line 348) | struct NewManifest { function msgpack_old_format_deserializes_leniently (line 357) | fn msgpack_old_format_deserializes_leniently() { type TestExecPolicy (line 380) | struct TestExecPolicy { function exec_policy_string_allow (line 386) | fn exec_policy_string_allow() { function exec_policy_string_deny (line 397) | fn exec_policy_string_deny() { function exec_policy_string_full (line 405) | fn exec_policy_string_full() { function exec_policy_string_allowlist (line 413) | fn exec_policy_string_allowlist() { function exec_policy_table_form (line 421) | fn exec_policy_table_form() { function exec_policy_missing_is_none (line 434) | fn exec_policy_missing_is_none() { function exec_policy_string_invalid_errors (line 450) | fn exec_policy_string_invalid_errors() { FILE: crates/openfang-types/src/taint.rs type TaintLabel (line 14) | pub enum TaintLabel { method fmt (line 28) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { type TaintedValue (line 41) | pub struct TaintedValue { method new (line 52) | pub fn new( method clean (line 65) | pub fn clean(value: impl Into, source: impl Into) -> S... method merge_taint (line 77) | pub fn merge_taint(&mut self, other: &TaintedValue) { method check_sink (line 87) | pub fn check_sink(&self, sink: &TaintSink) -> Result<(), TaintViolatio... method declassify (line 104) | pub fn declassify(&mut self, label: &TaintLabel) { method is_tainted (line 109) | pub fn is_tainted(&self) -> bool { type TaintSink (line 116) | pub struct TaintSink { method shell_exec (line 126) | pub fn shell_exec() -> Self { method net_fetch (line 139) | pub fn net_fetch() -> Self { method agent_message (line 150) | pub fn agent_message() -> Self { type TaintViolation (line 163) | pub struct TaintViolation { method fmt (line 173) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { function test_taint_blocks_shell_injection (line 189) | fn test_taint_blocks_shell_injection() { function test_taint_blocks_exfiltration (line 203) | fn test_taint_blocks_exfiltration() { function test_clean_passes_all (line 217) | fn test_clean_passes_all() { function test_declassify_allows_flow (line 227) | fn test_declassify_allows_flow() { FILE: crates/openfang-types/src/tool.rs type ToolDefinition (line 7) | pub struct ToolDefinition { type ToolCall (line 18) | pub struct ToolCall { type ToolResult (line 29) | pub struct ToolResult { function normalize_schema_for_provider (line 45) | pub fn normalize_schema_for_provider( function normalize_schema_recursive (line 56) | fn normalize_schema_recursive(schema: &serde_json::Value) -> serde_json:... function resolve_refs (line 180) | fn resolve_refs(obj: &serde_json::Map) -> ser... function try_flatten_any_of (line 230) | fn try_flatten_any_of(any_of: &serde_json::Value) -> Option Option<&'static str> { function normalize_tool_name (line 45) | pub fn normalize_tool_name(name: &str) -> &str { function is_known_openfang_tool (line 53) | pub fn is_known_openfang_tool(name: &str) -> bool { function test_map_tool_name_all_mappings (line 88) | fn test_map_tool_name_all_mappings() { function test_normalize_tool_name (line 156) | fn test_normalize_tool_name() { function test_is_known_openfang_tool (line 177) | fn test_is_known_openfang_tool() { FILE: crates/openfang-types/src/webhook.rs type WakeMode (line 8) | pub enum WakeMode { type WakePayload (line 18) | pub struct WakePayload { method validate (line 74) | pub fn validate(&self) -> Result<(), String> { type AgentHookPayload (line 28) | pub struct AgentHookPayload { method validate (line 103) | pub fn validate(&self) -> Result<(), String> { function default_hook_timeout (line 48) | fn default_hook_timeout() -> u64 { constant MAX_WAKE_TEXT (line 53) | const MAX_WAKE_TEXT: usize = 4096; constant MAX_AGENT_MESSAGE (line 55) | const MAX_AGENT_MESSAGE: usize = 16384; constant MIN_TIMEOUT_SECS (line 57) | const MIN_TIMEOUT_SECS: u64 = 10; constant MAX_TIMEOUT_SECS (line 59) | const MAX_TIMEOUT_SECS: u64 = 600; constant MAX_CHANNEL_NAME (line 61) | const MAX_CHANNEL_NAME: usize = 64; function is_forbidden_control (line 64) | fn is_forbidden_control(c: char) -> bool { function wake_valid_simple (line 140) | fn wake_valid_simple() { function wake_valid_with_newlines (line 149) | fn wake_valid_with_newlines() { function wake_empty_text (line 158) | fn wake_empty_text() { function wake_text_too_long (line 168) | fn wake_text_too_long() { function wake_text_exactly_max (line 178) | fn wake_text_exactly_max() { function wake_control_char_rejected (line 187) | fn wake_control_char_rejected() { function wake_tab_rejected (line 197) | fn wake_tab_rejected() { function agent_hook_valid_minimal (line 209) | fn agent_hook_valid_minimal() { function agent_hook_valid_full (line 222) | fn agent_hook_valid_full() { function agent_hook_empty_message (line 235) | fn agent_hook_empty_message() { function agent_hook_message_too_long (line 249) | fn agent_hook_message_too_long() { function agent_hook_message_exactly_max (line 263) | fn agent_hook_message_exactly_max() { function agent_hook_timeout_too_low (line 276) | fn agent_hook_timeout_too_low() { function agent_hook_timeout_too_high (line 290) | fn agent_hook_timeout_too_high() { function agent_hook_timeout_boundary_min (line 304) | fn agent_hook_timeout_boundary_min() { function agent_hook_timeout_boundary_max (line 317) | fn agent_hook_timeout_boundary_max() { function agent_hook_channel_too_long (line 330) | fn agent_hook_channel_too_long() { function agent_hook_channel_exactly_max (line 344) | fn agent_hook_channel_exactly_max() { function wake_serde_roundtrip_now (line 359) | fn wake_serde_roundtrip_now() { function wake_serde_roundtrip_next_heartbeat (line 371) | fn wake_serde_roundtrip_next_heartbeat() { function wake_serde_default_mode (line 383) | fn wake_serde_default_mode() { function agent_hook_serde_roundtrip (line 390) | fn agent_hook_serde_roundtrip() { function agent_hook_serde_defaults (line 410) | fn agent_hook_serde_defaults() { function wake_mode_serde_variants (line 422) | fn wake_mode_serde_variants() { FILE: crates/openfang-wire/src/message.rs type WireMessage (line 10) | pub struct WireMessage { type WireMessageKind (line 21) | pub enum WireMessageKind { type WireRequest (line 36) | pub enum WireRequest { type WireResponse (line 79) | pub enum WireResponse { type WireNotification (line 122) | pub enum WireNotification { type RemoteAgentInfo (line 136) | pub struct RemoteAgentInfo { constant PROTOCOL_VERSION (line 152) | pub const PROTOCOL_VERSION: u32 = 1; function encode_message (line 155) | pub fn encode_message(msg: &WireMessage) -> Result, serde_json::... function decode_length (line 165) | pub fn decode_length(header: &[u8; 4]) -> u32 { function decode_message (line 170) | pub fn decode_message(body: &[u8]) -> Result; type NonceTracker (line 34) | pub struct NonceTracker { method new (line 41) | pub fn new() -> Self { method check_and_record (line 50) | pub fn check_and_record(&self, nonce: &str) -> Result<(), String> { method default (line 72) | fn default() -> Self { function hmac_sign (line 78) | fn hmac_sign(secret: &str, data: &[u8]) -> String { function hmac_verify (line 85) | fn hmac_verify(secret: &str, data: &[u8], signature: &str) -> bool { type WireError (line 92) | pub enum WireError { constant MAX_MESSAGE_SIZE (line 108) | pub const MAX_MESSAGE_SIZE: u32 = 16 * 1024 * 1024; type PeerConfig (line 112) | pub struct PeerConfig { method default (line 125) | fn default() -> Self { type PeerHandle (line 141) | pub trait PeerHandle: Send + Sync + 'static { method local_agents (line 143) | fn local_agents(&self) -> Vec; method handle_agent_message (line 146) | async fn handle_agent_message( method discover_agents (line 154) | fn discover_agents(&self, query: &str) -> Vec; method uptime_secs (line 157) | fn uptime_secs(&self) -> u64; method local_agents (line 999) | fn local_agents(&self) -> Vec { method handle_agent_message (line 1003) | async fn handle_agent_message( method discover_agents (line 1012) | fn discover_agents(&self, query: &str) -> Vec { method uptime_secs (line 1021) | fn uptime_secs(&self) -> u64 { type PeerNode (line 161) | pub struct PeerNode { method start (line 178) | pub async fn start( method local_addr (line 216) | pub fn local_addr(&self) -> SocketAddr { method node_id (line 221) | pub fn node_id(&self) -> &str { method registry (line 226) | pub fn registry(&self) -> &PeerRegistry { method connect_to_peer (line 231) | pub async fn connect_to_peer( method send_to_peer (line 358) | pub async fn send_to_peer( method accept_loop (line 461) | async fn accept_loop( method handle_inbound (line 491) | async fn handle_inbound( function handle_request (line 652) | async fn handle_request( function connection_loop (line 703) | async fn connection_loop( function handle_request_in_loop (line 748) | async fn handle_request_in_loop(msg: &WireMessage, handle: &dyn PeerHand... function handle_notification (line 786) | fn handle_notification(peer_node_id: &str, notif: &WireNotification, reg... function derive_session_key (line 811) | pub fn derive_session_key(shared_secret: &str, our_nonce: &str, their_no... function write_message (line 817) | pub async fn write_message( function write_message_authenticated (line 831) | pub async fn write_message_authenticated( function read_message (line 852) | pub async fn read_message( function read_message_authenticated (line 883) | pub async fn read_message_authenticated( function broadcast_notification (line 937) | pub async fn broadcast_notification( type TestHandle (line 976) | struct TestHandle { method new (line 982) | fn new() -> Self { function test_peer_start_and_connect (line 1027) | async fn test_peer_start_and_connect() { function test_unauthenticated_agent_message_rejected (line 1074) | async fn test_unauthenticated_agent_message_rejected() { function test_unauthenticated_ping_rejected (line 1118) | async fn test_unauthenticated_ping_rejected() { function test_unauthenticated_discover_rejected (line 1150) | async fn test_unauthenticated_discover_rejected() { function test_handshake_and_message_loop (line 1184) | async fn test_handshake_and_message_loop() { function test_peer_config_default (line 1228) | fn test_peer_config_default() { function test_nonce_tracker_fresh_nonce_accepted (line 1237) | fn test_nonce_tracker_fresh_nonce_accepted() { function test_nonce_tracker_replay_rejected (line 1245) | fn test_nonce_tracker_replay_rejected() { function test_nonce_tracker_different_nonces_ok (line 1255) | fn test_nonce_tracker_different_nonces_ok() { function test_derive_session_key_deterministic (line 1265) | fn test_derive_session_key_deterministic() { function test_derive_session_key_different_nonces (line 1272) | fn test_derive_session_key_different_nonces() { function test_derive_session_key_order_matters (line 1279) | fn test_derive_session_key_order_matters() { FILE: crates/openfang-wire/src/registry.rs type RemoteAgent (line 15) | pub struct RemoteAgent { type PeerState (line 24) | pub enum PeerState { type PeerEntry (line 33) | pub struct PeerEntry { type PeerRegistry (line 52) | pub struct PeerRegistry { method new (line 58) | pub fn new() -> Self { method add_peer (line 65) | pub fn add_peer(&self, entry: PeerEntry) { method remove_peer (line 71) | pub fn remove_peer(&self, node_id: &str) -> Option { method mark_disconnected (line 77) | pub fn mark_disconnected(&self, node_id: &str) { method mark_connected (line 85) | pub fn mark_connected(&self, node_id: &str) { method get_peer (line 93) | pub fn get_peer(&self, node_id: &str) -> Option { method connected_peers (line 99) | pub fn connected_peers(&self) -> Vec { method all_peers (line 109) | pub fn all_peers(&self) -> Vec { method update_agents (line 115) | pub fn update_agents(&self, node_id: &str, agents: Vec Vec { method all_remote_agents (line 173) | pub fn all_remote_agents(&self) -> Vec { method connected_count (line 193) | pub fn connected_count(&self) -> usize { method total_count (line 202) | pub fn total_count(&self) -> usize { method default (line 209) | fn default() -> Self { function make_peer (line 218) | fn make_peer(node_id: &str, agents: Vec) -> PeerEntry { function make_agent (line 230) | fn make_agent(id: &str, name: &str, tags: &[&str]) -> RemoteAgentInfo { function test_add_and_get_peer (line 242) | fn test_add_and_get_peer() { function test_remove_peer (line 254) | fn test_remove_peer() { function test_disconnect_reconnect (line 265) | fn test_disconnect_reconnect() { function test_find_agents_by_name (line 279) | fn test_find_agents_by_name() { function test_find_agents_by_tag (line 298) | fn test_find_agents_by_tag() { function test_find_agents_skips_disconnected (line 312) | fn test_find_agents_skips_disconnected() { function test_add_remove_agent (line 325) | fn test_add_remove_agent() { function test_all_remote_agents (line 337) | fn test_all_remote_agents() { FILE: packages/whatsapp-gateway/index.js constant PORT (line 18) | const PORT = parseInt(process.env.WHATSAPP_GATEWAY_PORT || '3009', 10); constant OPENFANG_URL (line 19) | const OPENFANG_URL = (process.env.OPENFANG_URL || 'http://127.0.0.1:4200... constant DEFAULT_AGENT (line 20) | const DEFAULT_AGENT = process.env.OPENFANG_DEFAULT_AGENT || 'assistant'; constant MAX_RECONNECT_DELAY (line 32) | const MAX_RECONNECT_DELAY = 60_000; function startConnection (line 37) | async function startConnection() { function forwardToOpenFang (line 183) | function forwardToOpenFang(text, phone, pushName, metadata) { function sendMessage (line 236) | async function sendMessage(to, text) { function parseBody (line 250) | function parseBody(req) { function jsonResponse (line 265) | function jsonResponse(res, status, data) { FILE: sdk/javascript/examples/basic.js function main (line 10) | async function main() { FILE: sdk/javascript/examples/streaming.js function main (line 10) | async function main() { FILE: sdk/javascript/index.d.ts class OpenFangError (line 1) | class OpenFangError extends Error { type AgentCreateOpts (line 7) | interface AgentCreateOpts { type MessageOpts (line 14) | interface MessageOpts { type StreamEvent (line 19) | interface StreamEvent { class OpenFang (line 26) | class OpenFang { class AgentResource (line 51) | class AgentResource { class SessionResource (line 76) | class SessionResource { class WorkflowResource (line 82) | class WorkflowResource { class SkillResource (line 89) | class SkillResource { class ChannelResource (line 96) | class ChannelResource { class ToolResource (line 103) | class ToolResource { class ModelResource (line 107) | class ModelResource { class ProviderResource (line 113) | class ProviderResource { class MemoryResource (line 120) | class MemoryResource { class TriggerResource (line 127) | class TriggerResource { class ScheduleResource (line 134) | class ScheduleResource { FILE: sdk/javascript/index.js class OpenFangError (line 20) | class OpenFangError extends Error { method constructor (line 21) | constructor(message, status, body) { class OpenFang (line 29) | class OpenFang { method constructor (line 35) | constructor(baseUrl, opts) { method _request (line 52) | async _request(method, path, body) { method _stream (line 71) | async *_stream(method, path, body) { method health (line 108) | async health() { method healthDetail (line 113) | async healthDetail() { method status (line 118) | async status() { method version (line 123) | async version() { method metrics (line 128) | async metrics() { method usage (line 133) | async usage() { method config (line 138) | async config() { class AgentResource (line 145) | class AgentResource { method constructor (line 146) | constructor(client) { this._c = client; } method list (line 149) | async list() { method get (line 154) | async get(id) { method create (line 161) | async create(opts) { method delete (line 166) | async delete(id) { method stop (line 171) | async stop(id) { method clone (line 176) | async clone(id) { method update (line 181) | async update(id, data) { method setMode (line 186) | async setMode(id, mode) { method setModel (line 191) | async setModel(id, model) { method message (line 196) | async message(id, text, opts) { method stream (line 207) | async *stream(id, text, opts) { method session (line 213) | async session(id) { method resetSession (line 218) | async resetSession(id) { method compactSession (line 223) | async compactSession(id) { method listSessions (line 228) | async listSessions(id) { method createSession (line 233) | async createSession(id, label) { method switchSession (line 238) | async switchSession(id, sessionId) { method getSkills (line 243) | async getSkills(id) { method setSkills (line 248) | async setSkills(id, skills) { method upload (line 253) | async upload(id, file, filename) { method setIdentity (line 263) | async setIdentity(id, identity) { method patchConfig (line 268) | async patchConfig(id, config) { class SessionResource (line 275) | class SessionResource { method constructor (line 276) | constructor(client) { this._c = client; } method list (line 278) | async list() { method delete (line 282) | async delete(id) { method setLabel (line 286) | async setLabel(id, label) { class WorkflowResource (line 293) | class WorkflowResource { method constructor (line 294) | constructor(client) { this._c = client; } method list (line 296) | async list() { method create (line 300) | async create(workflow) { method run (line 304) | async run(id, input) { method runs (line 308) | async runs(id) { class SkillResource (line 315) | class SkillResource { method constructor (line 316) | constructor(client) { this._c = client; } method list (line 318) | async list() { method install (line 322) | async install(skill) { method uninstall (line 326) | async uninstall(skill) { method search (line 330) | async search(query) { class ChannelResource (line 337) | class ChannelResource { method constructor (line 338) | constructor(client) { this._c = client; } method list (line 340) | async list() { method configure (line 344) | async configure(name, config) { method remove (line 348) | async remove(name) { method test (line 352) | async test(name) { class ToolResource (line 359) | class ToolResource { method constructor (line 360) | constructor(client) { this._c = client; } method list (line 362) | async list() { class ModelResource (line 369) | class ModelResource { method constructor (line 370) | constructor(client) { this._c = client; } method list (line 372) | async list() { method get (line 376) | async get(id) { method aliases (line 380) | async aliases() { class ProviderResource (line 387) | class ProviderResource { method constructor (line 388) | constructor(client) { this._c = client; } method list (line 390) | async list() { method setKey (line 394) | async setKey(name, key) { method deleteKey (line 398) | async deleteKey(name) { method test (line 402) | async test(name) { class MemoryResource (line 409) | class MemoryResource { method constructor (line 410) | constructor(client) { this._c = client; } method getAll (line 412) | async getAll(agentId) { method get (line 416) | async get(agentId, key) { method set (line 420) | async set(agentId, key, value) { method delete (line 424) | async delete(agentId, key) { class TriggerResource (line 431) | class TriggerResource { method constructor (line 432) | constructor(client) { this._c = client; } method list (line 434) | async list() { method create (line 438) | async create(trigger) { method update (line 442) | async update(id, trigger) { method delete (line 446) | async delete(id) { class ScheduleResource (line 453) | class ScheduleResource { method constructor (line 454) | constructor(client) { this._c = client; } method list (line 456) | async list() { method create (line 460) | async create(schedule) { method update (line 464) | async update(id, schedule) { method delete (line 468) | async delete(id) { method run (line 472) | async run(id) { FILE: sdk/python/examples/echo_agent.py function handle (line 15) | def handle(message: str, context: dict) -> str: FILE: sdk/python/openfang_client.py class OpenFangError (line 34) | class OpenFangError(Exception): method __init__ (line 35) | def __init__(self, message: str, status: int = 0, body: str = ""): class _Resource (line 41) | class _Resource: method __init__ (line 42) | def __init__(self, client: "OpenFang"): class OpenFang (line 46) | class OpenFang: method __init__ (line 49) | def __init__(self, base_url: str, headers: Optional[Dict[str, str]] = ... method _request (line 67) | def _request(self, method: str, path: str, body: Any = None) -> Any: method _stream (line 82) | def _stream(self, method: str, path: str, body: Any = None) -> Generat... method health (line 115) | def health(self) -> Any: method health_detail (line 118) | def health_detail(self) -> Any: method status (line 121) | def status(self) -> Any: method version (line 124) | def version(self) -> Any: method metrics (line 127) | def metrics(self) -> str: method usage (line 130) | def usage(self) -> Any: method config (line 133) | def config(self) -> Any: class _AgentResource (line 139) | class _AgentResource(_Resource): method list (line 141) | def list(self): method get (line 144) | def get(self, agent_id: str): method create (line 147) | def create(self, **kwargs): method delete (line 150) | def delete(self, agent_id: str): method stop (line 153) | def stop(self, agent_id: str): method clone (line 156) | def clone(self, agent_id: str): method update (line 159) | def update(self, agent_id: str, **data): method set_mode (line 162) | def set_mode(self, agent_id: str, mode: str): method set_model (line 165) | def set_model(self, agent_id: str, model: str): method message (line 168) | def message(self, agent_id: str, text: str, **opts): method stream (line 172) | def stream(self, agent_id: str, text: str, **opts) -> Generator[Dict, ... method session (line 181) | def session(self, agent_id: str): method reset_session (line 184) | def reset_session(self, agent_id: str): method compact_session (line 187) | def compact_session(self, agent_id: str): method list_sessions (line 190) | def list_sessions(self, agent_id: str): method create_session (line 193) | def create_session(self, agent_id: str, label: Optional[str] = None): method switch_session (line 196) | def switch_session(self, agent_id: str, session_id: str): method get_skills (line 199) | def get_skills(self, agent_id: str): method set_skills (line 202) | def set_skills(self, agent_id: str, skills): method set_identity (line 205) | def set_identity(self, agent_id: str, **identity): method patch_config (line 208) | def patch_config(self, agent_id: str, **config): class _SessionResource (line 214) | class _SessionResource(_Resource): method list (line 216) | def list(self): method delete (line 219) | def delete(self, session_id: str): method set_label (line 222) | def set_label(self, session_id: str, label: str): class _WorkflowResource (line 228) | class _WorkflowResource(_Resource): method list (line 230) | def list(self): method create (line 233) | def create(self, **workflow): method run (line 236) | def run(self, workflow_id: str, input_data=None): method runs (line 239) | def runs(self, workflow_id: str): class _SkillResource (line 245) | class _SkillResource(_Resource): method list (line 247) | def list(self): method install (line 250) | def install(self, **skill): method uninstall (line 253) | def uninstall(self, **skill): method search (line 256) | def search(self, query: str): class _ChannelResource (line 262) | class _ChannelResource(_Resource): method list (line 264) | def list(self): method configure (line 267) | def configure(self, name: str, **config): method remove (line 270) | def remove(self, name: str): method test (line 273) | def test(self, name: str): class _ToolResource (line 279) | class _ToolResource(_Resource): method list (line 281) | def list(self): class _ModelResource (line 287) | class _ModelResource(_Resource): method list (line 289) | def list(self): method get (line 292) | def get(self, model_id: str): method aliases (line 295) | def aliases(self): class _ProviderResource (line 301) | class _ProviderResource(_Resource): method list (line 303) | def list(self): method set_key (line 306) | def set_key(self, name: str, key: str): method delete_key (line 309) | def delete_key(self, name: str): method test (line 312) | def test(self, name: str): class _MemoryResource (line 318) | class _MemoryResource(_Resource): method get_all (line 320) | def get_all(self, agent_id: str): method get (line 323) | def get(self, agent_id: str, key: str): method set (line 326) | def set(self, agent_id: str, key: str, value): method delete (line 329) | def delete(self, agent_id: str, key: str): class _TriggerResource (line 335) | class _TriggerResource(_Resource): method list (line 337) | def list(self): method create (line 340) | def create(self, **trigger): method update (line 343) | def update(self, trigger_id: str, **trigger): method delete (line 346) | def delete(self, trigger_id: str): class _ScheduleResource (line 352) | class _ScheduleResource(_Resource): method list (line 354) | def list(self): method create (line 357) | def create(self, **schedule): method update (line 360) | def update(self, schedule_id: str, **schedule): method delete (line 363) | def delete(self, schedule_id: str): method run (line 366) | def run(self, schedule_id: str): FILE: sdk/python/openfang_sdk.py function read_input (line 31) | def read_input() -> Dict[str, Any]: function respond (line 47) | def respond(text: str, metadata: Optional[Dict[str, Any]] = None) -> None: function log (line 55) | def log(message: str, level: str = "info") -> None: class Agent (line 60) | class Agent: method __init__ (line 74) | def __init__(self): method on_message (line 79) | def on_message(self, func: Callable) -> Callable: method on_setup (line 87) | def on_setup(self, func: Callable) -> Callable: method on_teardown (line 92) | def on_teardown(self, func: Callable) -> Callable: method run (line 97) | def run(self) -> None: FILE: xtask/src/main.rs function main (line 2) | fn main() {