SYMBOL INDEX (2496 symbols across 370 files) FILE: backend/app/channels/base.py class Channel (line 14) | class Channel(ABC): method __init__ (line 24) | def __init__(self, name: str, bus: MessageBus, config: dict[str, Any])... method is_running (line 31) | def is_running(self) -> bool: method start (line 37) | async def start(self) -> None: method stop (line 41) | async def stop(self) -> None: method send (line 47) | async def send(self, msg: OutboundMessage) -> None: method send_file (line 54) | async def send_file(self, msg: OutboundMessage, attachment: ResolvedAt... method _make_inbound (line 64) | def _make_inbound( method _on_outbound (line 87) | async def _on_outbound(self, msg: OutboundMessage) -> None: FILE: backend/app/channels/feishu.py class FeishuChannel (line 17) | class FeishuChannel(Channel): method __init__ (line 35) | def __init__(self, bus: MessageBus, config: dict[str, Any]) -> None: method start (line 53) | async def start(self) -> None: method _run_ws (line 118) | def _run_ws(self, app_id: str, app_secret: str) -> None: method stop (line 154) | async def stop(self) -> None: method send (line 168) | async def send(self, msg: OutboundMessage, *, _max_retries: int = 3) -... method send_file (line 201) | async def send_file(self, msg: OutboundMessage, attachment: ResolvedAt... method _upload_image (line 236) | async def _upload_image(self, path) -> str: method _upload_file (line 245) | async def _upload_file(self, path, filename: str) -> str: method _build_card_content (line 269) | def _build_card_content(text: str) -> str: method _add_reaction (line 283) | async def _add_reaction(self, message_id: str, emoji_type: str = "THUM... method _reply_card (line 294) | async def _reply_card(self, message_id: str, text: str) -> str | None: method _create_card (line 305) | async def _create_card(self, chat_id: str, text: str) -> None: method _update_card (line 314) | async def _update_card(self, message_id: str, text: str) -> None: method _track_background_task (line 323) | def _track_background_task(self, task: asyncio.Task, *, name: str, msg... method _finalize_background_task (line 328) | def _finalize_background_task(self, task: asyncio.Task, name: str, msg... method _create_running_card (line 332) | async def _create_running_card(self, source_message_id: str, text: str... method _ensure_running_card_started (line 342) | def _ensure_running_card_started(self, source_message_id: str, text: s... method _finalize_running_card_task (line 357) | def _finalize_running_card_task(self, source_message_id: str, task: as... method _ensure_running_card (line 362) | async def _ensure_running_card(self, source_message_id: str, text: str... method _send_running_reply (line 373) | async def _send_running_reply(self, message_id: str) -> None: method _send_card_message (line 380) | async def _send_card_message(self, msg: OutboundMessage) -> None: method _log_future_error (line 426) | def _log_future_error(fut, name: str, msg_id: str) -> None: method _log_task_error (line 436) | def _log_task_error(task: asyncio.Task, name: str, msg_id: str) -> None: method _prepare_inbound (line 447) | async def _prepare_inbound(self, msg_id: str, inbound) -> None: method _on_message (line 454) | def _on_message(self, event) -> None: FILE: backend/app/channels/manager.py function _as_dict (line 36) | def _as_dict(value: Any) -> dict[str, Any]: function _merge_dicts (line 40) | def _merge_dicts(*layers: Any) -> dict[str, Any]: function _extract_response_text (line 48) | def _extract_response_text(result: dict | list) -> str: function _extract_text_content (line 103) | def _extract_text_content(content: Any) -> str: function _merge_stream_text (line 129) | def _merge_stream_text(existing: str, chunk: str) -> str: function _extract_stream_message_id (line 142) | def _extract_stream_message_id(payload: Any, metadata: Any) -> str | None: function _accumulate_stream_text (line 158) | def _accumulate_stream_text( function _extract_artifacts (line 195) | def _extract_artifacts(result: dict | list) -> list[str]: function _format_artifact_text (line 228) | def _format_artifact_text(artifacts: list[str]) -> str: function _resolve_attachments (line 241) | def _resolve_attachments(thread_id: str, artifacts: list[str]) -> list[R... function _prepare_artifact_delivery (line 290) | def _prepare_artifact_delivery( class ChannelManager (line 317) | class ChannelManager: method __init__ (line 325) | def __init__( method _channel_supports_streaming (line 351) | def _channel_supports_streaming(channel_name: str) -> bool: method _resolve_session_layer (line 354) | def _resolve_session_layer(self, msg: InboundMessage) -> tuple[dict[st... method _resolve_run_params (line 360) | def _resolve_run_params(self, msg: InboundMessage, thread_id: str) -> ... method _get_client (line 386) | def _get_client(self): method start (line 396) | async def start(self) -> None: method stop (line 405) | async def stop(self) -> None: method _dispatch_loop (line 419) | async def _dispatch_loop(self) -> None: method _log_task_error (line 440) | def _log_task_error(task: asyncio.Task) -> None: method _handle_message (line 448) | async def _handle_message(self, msg: InboundMessage) -> None: method _create_thread (line 465) | async def _create_thread(self, client, msg: InboundMessage) -> str: method _handle_chat (line 479) | async def _handle_chat(self, msg: InboundMessage, extra_context: dict[... method _handle_streaming_chat (line 546) | async def _handle_streaming_chat( method _handle_command (line 645) | async def _handle_command(self, msg: InboundMessage) -> None: method _fetch_gateway (line 700) | async def _fetch_gateway(self, path: str, kind: str) -> str: method _send_error (line 723) | async def _send_error(self, msg: InboundMessage, error_text: str) -> N... FILE: backend/app/channels/message_bus.py class InboundMessageType (line 22) | class InboundMessageType(StrEnum): class InboundMessage (line 30) | class InboundMessage: class ResolvedAttachment (line 62) | class ResolvedAttachment: class OutboundMessage (line 83) | class OutboundMessage: class MessageBus (line 117) | class MessageBus: method __init__ (line 125) | def __init__(self) -> None: method publish_inbound (line 131) | async def publish_inbound(self, msg: InboundMessage) -> None: method get_inbound (line 142) | async def get_inbound(self) -> InboundMessage: method inbound_queue (line 147) | def inbound_queue(self) -> asyncio.Queue[InboundMessage]: method subscribe_outbound (line 152) | def subscribe_outbound(self, callback: OutboundCallback) -> None: method unsubscribe_outbound (line 156) | def unsubscribe_outbound(self, callback: OutboundCallback) -> None: method publish_outbound (line 160) | async def publish_outbound(self, msg: OutboundMessage) -> None: FILE: backend/app/channels/service.py class ChannelService (line 22) | class ChannelService: method __init__ (line 29) | def __init__(self, channels_config: dict[str, Any] | None = None) -> N... method from_app_config (line 50) | def from_app_config(cls) -> ChannelService: method start (line 62) | async def start(self) -> None: method stop (line 81) | async def stop(self) -> None: method restart_channel (line 95) | async def restart_channel(self, name: str) -> bool: method _start_channel (line 111) | async def _start_channel(self, name: str, config: dict[str, Any]) -> b... method get_status (line 136) | def get_status(self) -> dict[str, Any]: function get_channel_service (line 158) | def get_channel_service() -> ChannelService | None: function start_channel_service (line 163) | async def start_channel_service() -> ChannelService: function stop_channel_service (line 173) | async def stop_channel_service() -> None: FILE: backend/app/channels/slack.py class SlackChannel (line 19) | class SlackChannel(Channel): method __init__ (line 28) | def __init__(self, bus: MessageBus, config: dict[str, Any]) -> None: method start (line 35) | async def start(self) -> None: method stop (line 72) | async def stop(self) -> None: method send (line 80) | async def send(self, msg: OutboundMessage, *, _max_retries: int = 3) -... method send_file (line 131) | async def send_file(self, msg: OutboundMessage, attachment: ResolvedAt... method _add_reaction (line 154) | def _add_reaction(self, channel_id: str, timestamp: str, emoji: str) -... method _send_running_reply (line 168) | def _send_running_reply(self, channel_id: str, thread_ts: str) -> None: method _on_socket_event (line 182) | def _on_socket_event(self, client, req) -> None: method _handle_message_event (line 203) | def _handle_message_event(self, event: dict) -> None: FILE: backend/app/channels/store.py class ChannelStore (line 16) | class ChannelStore: method __init__ (line 36) | def __init__(self, path: str | Path | None = None) -> None: method _load (line 48) | def _load(self) -> dict[str, dict[str, Any]]: method _save (line 56) | def _save(self) -> None: method _key (line 75) | def _key(channel_name: str, chat_id: str, topic_id: str | None = None)... method get_thread_id (line 82) | def get_thread_id(self, channel_name: str, chat_id: str, topic_id: str... method set_thread_id (line 87) | def set_thread_id( method remove (line 109) | def remove(self, channel_name: str, chat_id: str, topic_id: str | None... method list_entries (line 139) | def list_entries(self, channel_name: str | None = None) -> list[dict[s... FILE: backend/app/channels/telegram.py class TelegramChannel (line 16) | class TelegramChannel(Channel): method __init__ (line 24) | def __init__(self, bus: MessageBus, config: dict[str, Any]) -> None: method start (line 39) | async def start(self) -> None: method stop (line 79) | async def stop(self) -> None: method send (line 90) | async def send(self, msg: OutboundMessage, *, _max_retries: int = 3) -... method send_file (line 130) | async def send_file(self, msg: OutboundMessage, attachment: ResolvedAt... method _send_running_reply (line 174) | async def _send_running_reply(self, chat_id: str, reply_to_message_id:... method _log_future_error (line 191) | def _log_future_error(fut, name: str, msg_id: str): method _run_polling (line 199) | def _run_polling(self) -> None: method _check_user (line 224) | def _check_user(self, user_id: int) -> bool: method _cmd_start (line 229) | async def _cmd_start(self, update, context) -> None: method _process_incoming_with_reply (line 235) | async def _process_incoming_with_reply(self, chat_id: str, msg_id: int... method _cmd_generic (line 239) | async def _cmd_generic(self, update, context) -> None: method _on_text (line 275) | async def _on_text(self, update, context) -> None: FILE: backend/app/gateway/app.py function lifespan (line 32) | async def lifespan(app: FastAPI) -> AsyncGenerator[None, None]: function create_app (line 72) | def create_app() -> FastAPI: FILE: backend/app/gateway/config.py class GatewayConfig (line 6) | class GatewayConfig(BaseModel): function get_gateway_config (line 17) | def get_gateway_config() -> GatewayConfig: FILE: backend/app/gateway/path_utils.py function resolve_thread_virtual_path (line 10) | def resolve_thread_virtual_path(thread_id: str, virtual_path: str) -> Path: FILE: backend/app/gateway/routers/agents.py class AgentResponse (line 20) | class AgentResponse(BaseModel): class AgentsListResponse (line 30) | class AgentsListResponse(BaseModel): class AgentCreateRequest (line 36) | class AgentCreateRequest(BaseModel): class AgentUpdateRequest (line 46) | class AgentUpdateRequest(BaseModel): function _validate_agent_name (line 55) | def _validate_agent_name(name: str) -> None: function _normalize_agent_name (line 71) | def _normalize_agent_name(name: str) -> str: function _agent_config_to_response (line 76) | def _agent_config_to_response(agent_cfg: AgentConfig, include_soul: bool... function list_agents (line 97) | async def list_agents() -> AgentsListResponse: function check_agent_name (line 116) | async def check_agent_name(name: str) -> dict: function get_agent (line 140) | async def get_agent(name: str) -> AgentResponse: function create_agent_endpoint (line 172) | async def create_agent_endpoint(request: AgentCreateRequest) -> AgentRes... function update_agent (line 233) | async def update_agent(name: str, request: AgentUpdateRequest) -> AgentR... class UserProfileResponse (line 294) | class UserProfileResponse(BaseModel): class UserProfileUpdateRequest (line 300) | class UserProfileUpdateRequest(BaseModel): function get_user_profile (line 312) | async def get_user_profile() -> UserProfileResponse: function update_user_profile (line 335) | async def update_user_profile(request: UserProfileUpdateRequest) -> User... function delete_agent (line 361) | async def delete_agent(name: str) -> None: FILE: backend/app/gateway/routers/artifacts.py function is_text_file_by_content (line 17) | def is_text_file_by_content(path: Path, sample_size: int = 8192) -> bool: function _extract_file_from_skill_archive (line 28) | def _extract_file_from_skill_archive(zip_path: Path, internal_path: str)... function get_artifact (line 66) | async def get_artifact(thread_id: str, path: str, request: Request) -> R... FILE: backend/app/gateway/routers/channels.py class ChannelStatusResponse (line 15) | class ChannelStatusResponse(BaseModel): class ChannelRestartResponse (line 20) | class ChannelRestartResponse(BaseModel): function get_channels_status (line 26) | async def get_channels_status() -> ChannelStatusResponse: function restart_channel (line 38) | async def restart_channel(name: str) -> ChannelRestartResponse: FILE: backend/app/gateway/routers/mcp.py class McpOAuthConfigResponse (line 15) | class McpOAuthConfigResponse(BaseModel): class McpServerConfigResponse (line 34) | class McpServerConfigResponse(BaseModel): class McpConfigResponse (line 48) | class McpConfigResponse(BaseModel): class McpConfigUpdateRequest (line 57) | class McpConfigUpdateRequest(BaseModel): function get_mcp_configuration (line 72) | async def get_mcp_configuration() -> McpConfigResponse: function update_mcp_configuration (line 104) | async def update_mcp_configuration(request: McpConfigUpdateRequest) -> M... FILE: backend/app/gateway/routers/memory.py class ContextSection (line 12) | class ContextSection(BaseModel): class UserContext (line 19) | class UserContext(BaseModel): class HistoryContext (line 27) | class HistoryContext(BaseModel): class Fact (line 35) | class Fact(BaseModel): class MemoryResponse (line 46) | class MemoryResponse(BaseModel): class MemoryConfigResponse (line 56) | class MemoryConfigResponse(BaseModel): class MemoryStatusResponse (line 68) | class MemoryStatusResponse(BaseModel): function get_memory (line 81) | async def get_memory() -> MemoryResponse: function reload_memory (line 125) | async def reload_memory() -> MemoryResponse: function get_memory_config_endpoint (line 144) | async def get_memory_config_endpoint() -> MemoryConfigResponse: function get_memory_status (line 181) | async def get_memory_status() -> MemoryStatusResponse: FILE: backend/app/gateway/routers/models.py class ModelResponse (line 9) | class ModelResponse(BaseModel): class ModelsListResponse (line 20) | class ModelsListResponse(BaseModel): function list_models (line 32) | async def list_models() -> ModelsListResponse: function get_model (line 82) | async def get_model(model_name: str) -> ModelResponse: FILE: backend/app/gateway/routers/skills.py function _is_unsafe_zip_member (line 21) | def _is_unsafe_zip_member(info: zipfile.ZipInfo) -> bool: function _is_symlink_member (line 34) | def _is_symlink_member(info: zipfile.ZipInfo) -> bool: function _safe_extract_skill_archive (line 41) | def _safe_extract_skill_archive( class SkillResponse (line 92) | class SkillResponse(BaseModel): class SkillsListResponse (line 102) | class SkillsListResponse(BaseModel): class SkillUpdateRequest (line 108) | class SkillUpdateRequest(BaseModel): class SkillInstallRequest (line 114) | class SkillInstallRequest(BaseModel): class SkillInstallResponse (line 121) | class SkillInstallResponse(BaseModel): function _should_ignore_archive_entry (line 129) | def _should_ignore_archive_entry(path: Path) -> bool: function _resolve_skill_dir_from_archive_root (line 133) | def _resolve_skill_dir_from_archive_root(temp_path: Path) -> Path: function _skill_to_response (line 142) | def _skill_to_response(skill: Skill) -> SkillResponse: function list_skills (line 159) | async def list_skills() -> SkillsListResponse: function get_skill (line 204) | async def get_skill(skill_name: str) -> SkillResponse: function update_skill (line 248) | async def update_skill(skill_name: str, request: SkillUpdateRequest) -> ... function install_skill (line 341) | async def install_skill(request: SkillInstallRequest) -> SkillInstallRes... FILE: backend/app/gateway/routers/suggestions.py class SuggestionMessage (line 14) | class SuggestionMessage(BaseModel): class SuggestionsRequest (line 19) | class SuggestionsRequest(BaseModel): class SuggestionsResponse (line 25) | class SuggestionsResponse(BaseModel): function _strip_markdown_code_fence (line 29) | def _strip_markdown_code_fence(text: str) -> str: function _parse_json_string_list (line 39) | def _parse_json_string_list(text: str) -> list[str] | None: function _extract_response_text (line 63) | def _extract_response_text(content: object) -> str: function _format_conversation (line 81) | def _format_conversation(messages: list[SuggestionMessage]) -> str: function generate_suggestions (line 100) | async def generate_suggestions(thread_id: str, request: SuggestionsReque... FILE: backend/app/gateway/routers/uploads.py class UploadResponse (line 18) | class UploadResponse(BaseModel): function get_uploads_dir (line 26) | def get_uploads_dir(thread_id: str) -> Path: function upload_files (line 41) | async def upload_files( function list_uploaded_files (line 132) | async def list_uploaded_files(thread_id: str) -> dict: function delete_uploaded_file (line 167) | async def delete_uploaded_file(thread_id: str, filename: str) -> dict: FILE: backend/debug.py function main (line 35) | async def main(): FILE: backend/packages/harness/deerflow/agents/checkpointer/async_provider.py function _async_checkpointer (line 42) | async def _async_checkpointer(config) -> AsyncIterator[Checkpointer]: function make_checkpointer (line 90) | async def make_checkpointer() -> AsyncIterator[Checkpointer]: FILE: backend/packages/harness/deerflow/agents/checkpointer/provider.py function _resolve_sqlite_conn_str (line 47) | def _resolve_sqlite_conn_str(raw: str) -> str: function _sync_checkpointer_cm (line 60) | def _sync_checkpointer_cm(config: CheckpointerConfig) -> Iterator[Checkp... function get_checkpointer (line 114) | def get_checkpointer() -> Checkpointer: function reset_checkpointer (line 160) | def reset_checkpointer() -> None: function checkpointer_context (line 182) | def checkpointer_context() -> Iterator[Checkpointer]: FILE: backend/packages/harness/deerflow/agents/lead_agent/agent.py function _resolve_model_name (line 25) | def _resolve_model_name(requested_model_name: str | None = None) -> str: function _create_summarization_middleware (line 40) | def _create_summarization_middleware() -> SummarizationMiddleware | None: function _create_todo_list_middleware (line 82) | def _create_todo_list_middleware(is_plan_mode: bool) -> TodoMiddleware |... function _build_middlewares (line 207) | def _build_middlewares(config: RunnableConfig, model_name: str | None, a... function make_lead_agent (line 262) | def make_lead_agent(config: RunnableConfig): FILE: backend/packages/harness/deerflow/agents/lead_agent/prompt.py function _build_subagent_section (line 7) | def _build_subagent_section(max_concurrent: int) -> str: function _get_memory_context (line 338) | def _get_memory_context(agent_name: str | None = None) -> str: function get_skills_prompt_section (line 370) | def get_skills_prompt_section(available_skills: set[str] | None = None) ... function get_agent_soul (line 414) | def get_agent_soul(agent_name: str | None) -> str: function get_deferred_tools_prompt_section (line 422) | def get_deferred_tools_prompt_section() -> str: function apply_prompt_template (line 447) | def apply_prompt_template(subagent_enabled: bool = False, max_concurrent... FILE: backend/packages/harness/deerflow/agents/memory/prompt.py function _count_tokens (line 148) | def _count_tokens(text: str, encoding_name: str = "cl100k_base") -> int: function _coerce_confidence (line 170) | def _coerce_confidence(value: Any, default: float = 0.0) -> float: function format_memory_for_injection (line 186) | def format_memory_for_injection(memory_data: dict[str, Any], max_tokens:... function format_conversation_for_update (line 303) | def format_conversation_for_update(messages: list[Any]) -> str: FILE: backend/packages/harness/deerflow/agents/memory/queue.py class ConversationContext (line 13) | class ConversationContext: class MemoryUpdateQueue (line 22) | class MemoryUpdateQueue: method __init__ (line 30) | def __init__(self): method add (line 37) | def add(self, thread_id: str, messages: list[Any], agent_name: str | N... method _reset_timer (line 66) | def _reset_timer(self) -> None: method _process_queue (line 84) | def _process_queue(self) -> None: method flush (line 131) | def flush(self) -> None: method clear (line 143) | def clear(self) -> None: method pending_count (line 156) | def pending_count(self) -> int: method is_processing (line 162) | def is_processing(self) -> bool: function get_memory_queue (line 173) | def get_memory_queue() -> MemoryUpdateQueue: function reset_memory_queue (line 186) | def reset_memory_queue() -> None: FILE: backend/packages/harness/deerflow/agents/memory/updater.py function _get_memory_file_path (line 22) | def _get_memory_file_path(agent_name: str | None = None) -> Path: function _create_empty_memory (line 43) | def _create_empty_memory() -> dict[str, Any]: function get_memory_data (line 67) | def get_memory_data(agent_name: str | None = None) -> dict[str, Any]: function reload_memory_data (line 98) | def reload_memory_data(agent_name: str | None = None) -> dict[str, Any]: function _extract_text (line 119) | def _extract_text(content: Any) -> str: function _load_memory_from_file (line 156) | def _load_memory_from_file(agent_name: str | None = None) -> dict[str, A... function _strip_upload_mentions_from_memory (line 193) | def _strip_upload_mentions_from_memory(memory_data: dict[str, Any]) -> d... function _fact_content_key (line 216) | def _fact_content_key(content: Any) -> str | None: function _save_memory_to_file (line 225) | def _save_memory_to_file(memory_data: dict[str, Any], agent_name: str | ... class MemoryUpdater (line 267) | class MemoryUpdater: method __init__ (line 270) | def __init__(self, model_name: str | None = None): method _get_model (line 278) | def _get_model(self): method update_memory (line 284) | def update_memory(self, messages: list[Any], thread_id: str | None = N... method _apply_updates (line 350) | def _apply_updates( function update_memory_from_conversation (line 437) | def update_memory_from_conversation(messages: list[Any], thread_id: str ... FILE: backend/packages/harness/deerflow/agents/middlewares/clarification_middleware.py class ClarificationMiddlewareState (line 14) | class ClarificationMiddlewareState(AgentState): class ClarificationMiddleware (line 20) | class ClarificationMiddleware(AgentMiddleware[ClarificationMiddlewareSta... method _is_chinese (line 35) | def _is_chinese(self, text: str) -> bool: method _format_clarification_message (line 46) | def _format_clarification_message(self, args: dict) -> str: method _handle_clarification (line 91) | def _handle_clarification(self, request: ToolCallRequest) -> Command: method wrap_tool_call (line 132) | def wrap_tool_call( method awrap_tool_call (line 154) | async def awrap_tool_call( FILE: backend/packages/harness/deerflow/agents/middlewares/dangling_tool_call_middleware.py class DanglingToolCallMiddleware (line 28) | class DanglingToolCallMiddleware(AgentMiddleware[AgentState]): method _build_patched_messages (line 36) | def _build_patched_messages(self, messages: list) -> list | None: method wrap_model_call (line 91) | def wrap_model_call( method awrap_model_call (line 102) | async def awrap_model_call( FILE: backend/packages/harness/deerflow/agents/middlewares/deferred_tool_filter_middleware.py class DeferredToolFilterMiddleware (line 23) | class DeferredToolFilterMiddleware(AgentMiddleware[AgentState]): method _filter_tools (line 31) | def _filter_tools(self, request: ModelRequest) -> ModelRequest: method wrap_model_call (line 47) | def wrap_model_call( method awrap_model_call (line 55) | async def awrap_model_call( FILE: backend/packages/harness/deerflow/agents/middlewares/loop_detection_middleware.py function _hash_tool_calls (line 36) | def _hash_tool_calls(tool_calls: list[dict]) -> str: class LoopDetectionMiddleware (line 76) | class LoopDetectionMiddleware(AgentMiddleware[AgentState]): method __init__ (line 90) | def __init__( method _get_thread_id (line 107) | def _get_thread_id(self, runtime: Runtime) -> str: method _evict_if_needed (line 114) | def _evict_if_needed(self) -> None: method _track_and_check (line 124) | def _track_and_check(self, state: AgentState, runtime: Runtime) -> tup... method _apply (line 192) | def _apply(self, state: AgentState, runtime: Runtime) -> dict | None: method after_model (line 212) | def after_model(self, state: AgentState, runtime: Runtime) -> dict | N... method aafter_model (line 216) | async def aafter_model(self, state: AgentState, runtime: Runtime) -> d... method reset (line 219) | def reset(self, thread_id: str | None = None) -> None: FILE: backend/packages/harness/deerflow/agents/middlewares/memory_middleware.py class MemoryMiddlewareState (line 14) | class MemoryMiddlewareState(AgentState): function _filter_messages_for_memory (line 20) | def _filter_messages_for_memory(messages: list[Any]) -> list[Any]: class MemoryMiddleware (line 86) | class MemoryMiddleware(AgentMiddleware[MemoryMiddlewareState]): method __init__ (line 98) | def __init__(self, agent_name: str | None = None): method after_agent (line 108) | def after_agent(self, state: MemoryMiddlewareState, runtime: Runtime) ... FILE: backend/packages/harness/deerflow/agents/middlewares/subagent_limit_middleware.py function _clamp_subagent_limit (line 19) | def _clamp_subagent_limit(value: int) -> int: class SubagentLimitMiddleware (line 24) | class SubagentLimitMiddleware(AgentMiddleware[AgentState]): method __init__ (line 36) | def __init__(self, max_concurrent: int = MAX_CONCURRENT_SUBAGENTS): method _truncate_task_calls (line 40) | def _truncate_task_calls(self, state: AgentState) -> dict | None: method after_model (line 70) | def after_model(self, state: AgentState, runtime: Runtime) -> dict | N... method aafter_model (line 74) | async def aafter_model(self, state: AgentState, runtime: Runtime) -> d... FILE: backend/packages/harness/deerflow/agents/middlewares/thread_data_middleware.py class ThreadDataMiddlewareState (line 12) | class ThreadDataMiddlewareState(AgentState): class ThreadDataMiddleware (line 18) | class ThreadDataMiddleware(AgentMiddleware[ThreadDataMiddlewareState]): method __init__ (line 33) | def __init__(self, base_dir: str | None = None, lazy_init: bool = True): method _get_thread_paths (line 46) | def _get_thread_paths(self, thread_id: str) -> dict[str, str]: method _create_thread_directories (line 61) | def _create_thread_directories(self, thread_id: str) -> dict[str, str]: method before_agent (line 74) | def before_agent(self, state: ThreadDataMiddlewareState, runtime: Runt... FILE: backend/packages/harness/deerflow/agents/middlewares/title_middleware.py class TitleMiddlewareState (line 16) | class TitleMiddlewareState(AgentState): class TitleMiddleware (line 22) | class TitleMiddleware(AgentMiddleware[TitleMiddlewareState]): method _normalize_content (line 27) | def _normalize_content(self, content: object) -> str: method _should_generate_title (line 46) | def _should_generate_title(self, state: TitleMiddlewareState) -> bool: method _build_title_prompt (line 68) | def _build_title_prompt(self, state: TitleMiddlewareState) -> tuple[st... method _parse_title (line 89) | def _parse_title(self, content: object) -> str: method _fallback_title (line 96) | def _fallback_title(self, user_msg: str) -> str: method _generate_title_result (line 103) | def _generate_title_result(self, state: TitleMiddlewareState) -> dict ... method _agenerate_title_result (line 123) | async def _agenerate_title_result(self, state: TitleMiddlewareState) -... method after_model (line 144) | def after_model(self, state: TitleMiddlewareState, runtime: Runtime) -... method aafter_model (line 148) | async def aafter_model(self, state: TitleMiddlewareState, runtime: Run... FILE: backend/packages/harness/deerflow/agents/middlewares/todo_middleware.py function _todos_in_messages (line 19) | def _todos_in_messages(messages: list[Any]) -> bool: function _reminder_in_messages (line 29) | def _reminder_in_messages(messages: list[Any]) -> bool: function _format_todos (line 37) | def _format_todos(todos: list[Todo]) -> str: class TodoMiddleware (line 47) | class TodoMiddleware(TodoListMiddleware): method before_model (line 57) | def before_model( method abefore_model (line 94) | async def abefore_model( FILE: backend/packages/harness/deerflow/agents/middlewares/tool_error_handling_middleware.py class ToolErrorHandlingMiddleware (line 19) | class ToolErrorHandlingMiddleware(AgentMiddleware[AgentState]): method _build_error_message (line 22) | def _build_error_message(self, request: ToolCallRequest, exc: Exceptio... method wrap_tool_call (line 38) | def wrap_tool_call( method awrap_tool_call (line 53) | async def awrap_tool_call( function _build_runtime_middlewares (line 68) | def _build_runtime_middlewares( function build_lead_runtime_middlewares (line 97) | def build_lead_runtime_middlewares(*, lazy_init: bool = True) -> list[Ag... function build_subagent_runtime_middlewares (line 106) | def build_subagent_runtime_middlewares(*, lazy_init: bool = True) -> lis... FILE: backend/packages/harness/deerflow/agents/middlewares/uploads_middleware.py class UploadsMiddlewareState (line 17) | class UploadsMiddlewareState(AgentState): class UploadsMiddleware (line 23) | class UploadsMiddleware(AgentMiddleware[UploadsMiddlewareState]): method __init__ (line 33) | def __init__(self, base_dir: str | None = None): method _create_files_message (line 42) | def _create_files_message(self, new_files: list[dict], historical_file... method _files_from_kwargs (line 81) | def _files_from_kwargs(self, message: HumanMessage, uploads_dir: Path ... method before_agent (line 120) | def before_agent(self, state: UploadsMiddlewareState, runtime: Runtime... FILE: backend/packages/harness/deerflow/agents/middlewares/view_image_middleware.py class ViewImageMiddlewareState (line 13) | class ViewImageMiddlewareState(AgentState): class ViewImageMiddleware (line 19) | class ViewImageMiddleware(AgentMiddleware[ViewImageMiddlewareState]): method _get_last_assistant_message (line 35) | def _get_last_assistant_message(self, messages: list) -> AIMessage | N... method _has_view_image_tool (line 49) | def _has_view_image_tool(self, message: AIMessage) -> bool: method _all_tools_completed (line 63) | def _all_tools_completed(self, messages: list, assistant_msg: AIMessag... method _create_image_details_message (line 94) | def _create_image_details_message(self, state: ViewImageMiddlewareStat... method _should_inject_image_message (line 128) | def _should_inject_image_message(self, state: ViewImageMiddlewareState... method _inject_image_message (line 166) | def _inject_image_message(self, state: ViewImageMiddlewareState) -> di... method before_model (line 190) | def before_model(self, state: ViewImageMiddlewareState, runtime: Runti... method abefore_model (line 207) | async def abefore_model(self, state: ViewImageMiddlewareState, runtime... FILE: backend/packages/harness/deerflow/agents/thread_state.py class SandboxState (line 6) | class SandboxState(TypedDict): class ThreadDataState (line 10) | class ThreadDataState(TypedDict): class ViewedImageData (line 16) | class ViewedImageData(TypedDict): function merge_artifacts (line 21) | def merge_artifacts(existing: list[str] | None, new: list[str] | None) -... function merge_viewed_images (line 31) | def merge_viewed_images(existing: dict[str, ViewedImageData] | None, new... class ThreadState (line 48) | class ThreadState(AgentState): FILE: backend/packages/harness/deerflow/client.py class StreamEvent (line 50) | class StreamEvent: class DeerFlowClient (line 67) | class DeerFlowClient: method __init__ (line 101) | def __init__( method reset_agent (line 145) | def reset_agent(self) -> None: method _atomic_write_json (line 160) | def _atomic_write_json(path: Path, data: dict) -> None: method _get_runnable_config (line 177) | def _get_runnable_config(self, thread_id: str, **overrides) -> Runnabl... method _ensure_agent (line 191) | def _ensure_agent(self, config: RunnableConfig): method _get_tools (line 233) | def _get_tools(*, model_name: str | None, subagent_enabled: bool): method _serialize_message (line 240) | def _serialize_message(msg) -> dict: method _extract_text (line 264) | def _extract_text(content) -> str: method stream (line 309) | def stream( method chat (line 419) | def chat(self, message: str, *, thread_id: str | None = None, **kwargs... method list_models (line 447) | def list_models(self) -> dict: method list_skills (line 468) | def list_skills(self, enabled_only: bool = False) -> dict: method get_memory (line 493) | def get_memory(self) -> dict: method get_model (line 503) | def get_model(self, name: str) -> dict | None: method get_mcp_config (line 529) | def get_mcp_config(self) -> dict: method update_mcp_config (line 539) | def update_mcp_config(self, mcp_servers: dict[str, dict]) -> dict: method get_skill (line 576) | def get_skill(self, name: str) -> dict | None: method update_skill (line 598) | def update_skill(self, name: str, *, enabled: bool) -> dict: method install_skill (line 647) | def install_skill(self, skill_path: str | Path) -> dict: method reload_memory (line 715) | def reload_memory(self) -> dict: method get_memory_config (line 725) | def get_memory_config(self) -> dict: method get_memory_status (line 744) | def get_memory_status(self) -> dict: method _get_uploads_dir (line 760) | def _get_uploads_dir(thread_id: str) -> Path: method upload_files (line 766) | def upload_files(self, thread_id: str, files: list[str | Path]) -> dict: method list_uploads (line 861) | def list_uploads(self, thread_id: str) -> dict: method delete_upload (line 895) | def delete_upload(self, thread_id: str, filename: str) -> dict: method get_artifact (line 928) | def get_artifact(self, thread_id: str, path: str) -> tuple[bytes, str]: FILE: backend/packages/harness/deerflow/community/aio_sandbox/aio_sandbox.py class AioSandbox (line 11) | class AioSandbox(Sandbox): method __init__ (line 17) | def __init__(self, id: str, base_url: str, home_dir: str | None = None): method base_url (line 31) | def base_url(self) -> str: method home_dir (line 35) | def home_dir(self) -> str: method execute_command (line 42) | def execute_command(self, command: str) -> str: method read_file (line 59) | def read_file(self, path: str) -> str: method list_dir (line 75) | def list_dir(self, path: str, max_depth: int = 2) -> list[str]: method write_file (line 97) | def write_file(self, path: str, content: str, append: bool = False) ->... method update_file (line 116) | def update_file(self, path: str, content: bytes) -> None: FILE: backend/packages/harness/deerflow/community/aio_sandbox/aio_sandbox_provider.py class AioSandboxProvider (line 45) | class AioSandboxProvider(SandboxProvider): method __init__ (line 69) | def __init__(self): method _create_backend (line 98) | def _create_backend(self) -> SandboxBackend: method _load_config (line 123) | def _load_config(self) -> dict: method _resolve_env_vars (line 144) | def _resolve_env_vars(env_config: dict[str, str]) -> dict[str, str]: method _deterministic_sandbox_id (line 158) | def _deterministic_sandbox_id(thread_id: str) -> str: method _get_extra_mounts (line 168) | def _get_extra_mounts(self, thread_id: str | None) -> list[tuple[str, ... method _get_thread_mounts (line 184) | def _get_thread_mounts(thread_id: str) -> list[tuple[str, str, bool]]: method _get_skills_mount (line 205) | def _get_skills_mount() -> tuple[str, str, bool] | None: method _start_idle_checker (line 226) | def _start_idle_checker(self) -> None: method _idle_checker_loop (line 236) | def _idle_checker_loop(self) -> None: method _cleanup_idle_sandboxes (line 244) | def _cleanup_idle_sandboxes(self, idle_timeout: float) -> None: method _register_signal_handlers (line 296) | def _register_signal_handlers(self) -> None: method _get_thread_lock (line 318) | def _get_thread_lock(self, thread_id: str) -> threading.Lock: method acquire (line 327) | def acquire(self, thread_id: str | None = None) -> str: method _acquire_internal (line 349) | def _acquire_internal(self, thread_id: str | None) -> str: method _discover_or_create_with_lock (line 394) | def _discover_or_create_with_lock(self, thread_id: str, sandbox_id: st... method _evict_oldest_warm (line 442) | def _evict_oldest_warm(self) -> str | None: method _create_sandbox (line 462) | def _create_sandbox(self, thread_id: str | None, sandbox_id: str) -> str: method get (line 510) | def get(self, sandbox_id: str) -> Sandbox | None: method release (line 525) | def release(self, sandbox_id: str) -> None: method destroy (line 551) | def destroy(self, sandbox_id: str) -> None: method shutdown (line 580) | def shutdown(self) -> None: FILE: backend/packages/harness/deerflow/community/aio_sandbox/backend.py function wait_for_sandbox_ready (line 16) | def wait_for_sandbox_ready(sandbox_url: str, timeout: int = 30) -> bool: class SandboxBackend (line 38) | class SandboxBackend(ABC): method create (line 47) | def create(self, thread_id: str, sandbox_id: str, extra_mounts: list[t... method destroy (line 62) | def destroy(self, info: SandboxInfo) -> None: method is_alive (line 71) | def is_alive(self, info: SandboxInfo) -> bool: method discover (line 86) | def discover(self, sandbox_id: str) -> SandboxInfo | None: FILE: backend/packages/harness/deerflow/community/aio_sandbox/local_backend.py class LocalContainerBackend (line 21) | class LocalContainerBackend(SandboxBackend): method __init__ (line 34) | def __init__( method runtime (line 60) | def runtime(self) -> str: method _detect_runtime (line 64) | def _detect_runtime(self) -> str: method create (line 93) | def create(self, thread_id: str, sandbox_id: str, extra_mounts: list[t... method destroy (line 153) | def destroy(self, info: SandboxInfo) -> None: method is_alive (line 167) | def is_alive(self, info: SandboxInfo) -> bool: method discover (line 173) | def discover(self, sandbox_id: str) -> SandboxInfo | None: method _start_container (line 207) | def _start_container( method _stop_container (line 275) | def _stop_container(self, container_id: str) -> None: method _is_container_running (line 288) | def _is_container_running(self, container_name: str) -> bool: method _get_container_port (line 305) | def _get_container_port(self, container_name: str) -> int | None: FILE: backend/packages/harness/deerflow/community/aio_sandbox/remote_backend.py class RemoteSandboxBackend (line 30) | class RemoteSandboxBackend(SandboxBackend): method __init__ (line 43) | def __init__(self, provisioner_url: str): method provisioner_url (line 53) | def provisioner_url(self) -> str: method create (line 58) | def create( method destroy (line 71) | def destroy(self, info: SandboxInfo) -> None: method is_alive (line 75) | def is_alive(self, info: SandboxInfo) -> bool: method discover (line 79) | def discover(self, sandbox_id: str) -> SandboxInfo | None: method _provisioner_create (line 89) | def _provisioner_create(self, thread_id: str, sandbox_id: str, extra_m... method _provisioner_destroy (line 111) | def _provisioner_destroy(self, sandbox_id: str) -> None: method _provisioner_is_alive (line 125) | def _provisioner_is_alive(self, sandbox_id: str) -> bool: method _provisioner_discover (line 139) | def _provisioner_discover(self, sandbox_id: str) -> SandboxInfo | None: FILE: backend/packages/harness/deerflow/community/aio_sandbox/sandbox_info.py class SandboxInfo (line 10) | class SandboxInfo: method to_dict (line 24) | def to_dict(self) -> dict: method from_dict (line 34) | def from_dict(cls, data: dict) -> SandboxInfo: FILE: backend/packages/harness/deerflow/community/firecrawl/tools.py function _get_firecrawl_client (line 9) | def _get_firecrawl_client() -> FirecrawlApp: function web_search_tool (line 18) | def web_search_tool(query: str) -> str: function web_fetch_tool (line 50) | def web_fetch_tool(url: str) -> str: FILE: backend/packages/harness/deerflow/community/image_search/tools.py function _search_images (line 15) | def _search_images( function image_search_tool (line 78) | def image_search_tool( FILE: backend/packages/harness/deerflow/community/infoquest/infoquest_client.py class InfoQuestClient (line 17) | class InfoQuestClient: method __init__ (line 20) | def __init__(self, fetch_time: int = -1, fetch_timeout: int = -1, fetc... method fetch (line 45) | def fetch(self, url: str, return_format: str = "html") -> str: method _prepare_headers (line 110) | def _prepare_headers() -> dict[str, str]: method _prepare_crawl_request_data (line 125) | def _prepare_crawl_request_data(self, url: str, return_format: str) ->... method web_search_raw_results (line 151) | def web_search_raw_results( method clean_results (line 179) | def clean_results(raw_results: list[dict[str, dict[str, dict[str, Any]... method web_search (line 234) | def web_search( method clean_results_with_image_search (line 286) | def clean_results_with_image_search(raw_results: list[dict[str, dict[s... method image_search_raw_results (line 315) | def image_search_raw_results( method image_search (line 353) | def image_search( FILE: backend/packages/harness/deerflow/community/infoquest/tools.py function _get_infoquest_client (line 11) | def _get_infoquest_client() -> InfoQuestClient: function web_search_tool (line 49) | def web_search_tool(query: str) -> str: function web_fetch_tool (line 61) | def web_fetch_tool(url: str) -> str: function image_search_tool (line 80) | def image_search_tool(query: str) -> str: FILE: backend/packages/harness/deerflow/community/jina_ai/jina_client.py class JinaClient (line 9) | class JinaClient: method crawl (line 10) | def crawl(self, url: str, return_format: str = "html", timeout: int = ... FILE: backend/packages/harness/deerflow/community/jina_ai/tools.py function web_fetch_tool (line 11) | def web_fetch_tool(url: str) -> str: FILE: backend/packages/harness/deerflow/community/tavily/tools.py function _get_tavily_client (line 9) | def _get_tavily_client() -> TavilyClient: function web_search_tool (line 18) | def web_search_tool(query: str) -> str: function web_fetch_tool (line 44) | def web_fetch_tool(url: str) -> str: FILE: backend/packages/harness/deerflow/config/agents_config.py class AgentConfig (line 18) | class AgentConfig(BaseModel): function load_agent_config (line 27) | def load_agent_config(name: str | None) -> AgentConfig | None: function load_agent_soul (line 72) | def load_agent_soul(agent_name: str | None) -> str | None: function list_custom_agents (line 92) | def list_custom_agents() -> list[AgentConfig]: FILE: backend/packages/harness/deerflow/config/app_config.py class AppConfig (line 27) | class AppConfig(BaseModel): method resolve_config_path (line 41) | def resolve_config_path(cls, config_path: str | None = None) -> Path: method from_file (line 70) | def from_file(cls, config_path: str | None = None) -> Self: method _check_config_version (line 122) | def _check_config_version(cls, config_data: dict, config_path: Path) -... method resolve_env_variables (line 168) | def resolve_env_variables(cls, config: Any) -> Any: method get_model_config (line 192) | def get_model_config(self, name: str) -> ModelConfig | None: method get_tool_config (line 203) | def get_tool_config(self, name: str) -> ToolConfig | None: method get_tool_group_config (line 214) | def get_tool_group_config(self, name: str) -> ToolGroupConfig | None: function _get_config_mtime (line 232) | def _get_config_mtime(config_path: Path) -> float | None: function _load_and_cache_app_config (line 240) | def _load_and_cache_app_config(config_path: str | None = None) -> AppCon... function get_app_config (line 252) | def get_app_config() -> AppConfig: function reload_app_config (line 289) | def reload_app_config(config_path: str | None = None) -> AppConfig: function reset_app_config (line 305) | def reset_app_config() -> None: function set_app_config (line 319) | def set_app_config(config: AppConfig) -> None: FILE: backend/packages/harness/deerflow/config/checkpointer_config.py class CheckpointerConfig (line 10) | class CheckpointerConfig(BaseModel): function get_checkpointer_config (line 32) | def get_checkpointer_config() -> CheckpointerConfig | None: function set_checkpointer_config (line 37) | def set_checkpointer_config(config: CheckpointerConfig | None) -> None: function load_checkpointer_config_from_dict (line 43) | def load_checkpointer_config_from_dict(config_dict: dict) -> None: FILE: backend/packages/harness/deerflow/config/extensions_config.py class McpOAuthConfig (line 11) | class McpOAuthConfig(BaseModel): class McpServerConfig (line 34) | class McpServerConfig(BaseModel): class SkillStateConfig (line 49) | class SkillStateConfig(BaseModel): class ExtensionsConfig (line 55) | class ExtensionsConfig(BaseModel): method resolve_config_path (line 70) | def resolve_config_path(cls, config_path: str | None = None) -> Path |... method from_file (line 120) | def from_file(cls, config_path: str | None = None) -> "ExtensionsConfig": method resolve_env_variables (line 147) | def resolve_env_variables(cls, config: dict[str, Any]) -> dict[str, Any]: method get_enabled_mcp_servers (line 177) | def get_enabled_mcp_servers(self) -> dict[str, McpServerConfig]: method is_skill_enabled (line 185) | def is_skill_enabled(self, skill_name: str, skill_category: str) -> bool: function get_extensions_config (line 205) | def get_extensions_config() -> ExtensionsConfig: function reload_extensions_config (line 220) | def reload_extensions_config(config_path: str | None = None) -> Extensio... function reset_extensions_config (line 238) | def reset_extensions_config() -> None: function set_extensions_config (line 249) | def set_extensions_config(config: ExtensionsConfig) -> None: FILE: backend/packages/harness/deerflow/config/memory_config.py class MemoryConfig (line 6) | class MemoryConfig(BaseModel): function get_memory_config (line 64) | def get_memory_config() -> MemoryConfig: function set_memory_config (line 69) | def set_memory_config(config: MemoryConfig) -> None: function load_memory_config_from_dict (line 75) | def load_memory_config_from_dict(config_dict: dict) -> None: FILE: backend/packages/harness/deerflow/config/model_config.py class ModelConfig (line 4) | class ModelConfig(BaseModel): FILE: backend/packages/harness/deerflow/config/paths.py class Paths (line 11) | class Paths: method __init__ (line 38) | def __init__(self, base_dir: str | Path | None = None) -> None: method host_base_dir (line 42) | def host_base_dir(self) -> Path: method base_dir (line 57) | def base_dir(self) -> Path: method memory_file (line 72) | def memory_file(self) -> Path: method user_md_file (line 77) | def user_md_file(self) -> Path: method agents_dir (line 82) | def agents_dir(self) -> Path: method agent_dir (line 86) | def agent_dir(self, name: str) -> Path: method agent_memory_file (line 90) | def agent_memory_file(self, name: str) -> Path: method thread_dir (line 94) | def thread_dir(self, thread_id: str) -> Path: method sandbox_work_dir (line 109) | def sandbox_work_dir(self, thread_id: str) -> Path: method sandbox_uploads_dir (line 117) | def sandbox_uploads_dir(self, thread_id: str) -> Path: method sandbox_outputs_dir (line 125) | def sandbox_outputs_dir(self, thread_id: str) -> Path: method sandbox_user_data_dir (line 133) | def sandbox_user_data_dir(self, thread_id: str) -> Path: method ensure_thread_dirs (line 141) | def ensure_thread_dirs(self, thread_id: str) -> None: method resolve_virtual_path (line 158) | def resolve_virtual_path(self, thread_id: str, virtual_path: str) -> P... function get_paths (line 199) | def get_paths() -> Paths: function resolve_path (line 207) | def resolve_path(path: str) -> Path: FILE: backend/packages/harness/deerflow/config/sandbox_config.py class VolumeMountConfig (line 4) | class VolumeMountConfig(BaseModel): class SandboxConfig (line 12) | class SandboxConfig(BaseModel): FILE: backend/packages/harness/deerflow/config/skills_config.py class SkillsConfig (line 6) | class SkillsConfig(BaseModel): method get_skills_path (line 18) | def get_skills_path(self) -> Path: method get_skill_container_path (line 38) | def get_skill_container_path(self, skill_name: str, category: str = "p... FILE: backend/packages/harness/deerflow/config/subagents_config.py class SubagentOverrideConfig (line 10) | class SubagentOverrideConfig(BaseModel): class SubagentsAppConfig (line 20) | class SubagentsAppConfig(BaseModel): method get_timeout_for (line 33) | def get_timeout_for(self, agent_name: str) -> int: function get_subagents_app_config (line 51) | def get_subagents_app_config() -> SubagentsAppConfig: function load_subagents_config_from_dict (line 56) | def load_subagents_config_from_dict(config_dict: dict) -> None: FILE: backend/packages/harness/deerflow/config/summarization_config.py class ContextSize (line 10) | class ContextSize(BaseModel): method to_tuple (line 16) | def to_tuple(self) -> tuple[ContextSizeType, int | float]: class SummarizationConfig (line 21) | class SummarizationConfig(BaseModel): function get_summarization_config (line 60) | def get_summarization_config() -> SummarizationConfig: function set_summarization_config (line 65) | def set_summarization_config(config: SummarizationConfig) -> None: function load_summarization_config_from_dict (line 71) | def load_summarization_config_from_dict(config_dict: dict) -> None: FILE: backend/packages/harness/deerflow/config/title_config.py class TitleConfig (line 6) | class TitleConfig(BaseModel): function get_title_config (line 39) | def get_title_config() -> TitleConfig: function set_title_config (line 44) | def set_title_config(config: TitleConfig) -> None: function load_title_config_from_dict (line 50) | def load_title_config_from_dict(config_dict: dict) -> None: FILE: backend/packages/harness/deerflow/config/tool_config.py class ToolGroupConfig (line 4) | class ToolGroupConfig(BaseModel): class ToolConfig (line 11) | class ToolConfig(BaseModel): FILE: backend/packages/harness/deerflow/config/tool_search_config.py class ToolSearchConfig (line 6) | class ToolSearchConfig(BaseModel): function get_tool_search_config (line 23) | def get_tool_search_config() -> ToolSearchConfig: function load_tool_search_config_from_dict (line 31) | def load_tool_search_config_from_dict(data: dict) -> ToolSearchConfig: FILE: backend/packages/harness/deerflow/config/tracing_config.py class TracingConfig (line 11) | class TracingConfig(BaseModel): method is_configured (line 20) | def is_configured(self) -> bool: function _env_flag_preferred (line 31) | def _env_flag_preferred(*names: str) -> bool: function _first_env_value (line 45) | def _first_env_value(*names: str) -> str | None: function get_tracing_config (line 54) | def get_tracing_config() -> TracingConfig: function is_tracing_enabled (line 89) | def is_tracing_enabled() -> bool: FILE: backend/packages/harness/deerflow/mcp/cache.py function _get_config_mtime (line 17) | def _get_config_mtime() -> float | None: function _is_cache_stale (line 31) | def _is_cache_stale() -> bool: function initialize_mcp_tools (line 56) | async def initialize_mcp_tools() -> list[BaseTool]: function get_cached_mcp_tools (line 82) | def get_cached_mcp_tools() -> list[BaseTool]: function reset_mcp_tools_cache (line 129) | def reset_mcp_tools_cache() -> None: FILE: backend/packages/harness/deerflow/mcp/client.py function build_server_params (line 11) | def build_server_params(server_name: str, config: McpServerConfig) -> di... function build_servers_config (line 45) | def build_servers_config(extensions_config: ExtensionsConfig) -> dict[st... FILE: backend/packages/harness/deerflow/mcp/oauth.py class _OAuthToken (line 17) | class _OAuthToken: class OAuthTokenManager (line 25) | class OAuthTokenManager: method __init__ (line 28) | def __init__(self, oauth_by_server: dict[str, McpOAuthConfig]): method from_extensions_config (line 34) | def from_extensions_config(cls, extensions_config: ExtensionsConfig) -... method has_oauth_servers (line 41) | def has_oauth_servers(self) -> bool: method oauth_server_names (line 44) | def oauth_server_names(self) -> list[str]: method get_authorization_header (line 47) | async def get_authorization_header(self, server_name: str) -> str | None: method _is_expiring (line 68) | def _is_expiring(token: _OAuthToken, oauth: McpOAuthConfig) -> bool: method _fetch_token (line 72) | async def _fetch_token(self, oauth: McpOAuthConfig) -> _OAuthToken: function build_oauth_tool_interceptor (line 122) | def build_oauth_tool_interceptor(extensions_config: ExtensionsConfig) ->... function get_initial_oauth_headers (line 140) | async def get_initial_oauth_headers(extensions_config: ExtensionsConfig)... FILE: backend/packages/harness/deerflow/mcp/tools.py function get_mcp_tools (line 14) | async def get_mcp_tools() -> list[BaseTool]: FILE: backend/packages/harness/deerflow/models/claude_provider.py class ClaudeChatModel (line 31) | class ClaudeChatModel(ChatAnthropic): method _validate_retry_config (line 52) | def _validate_retry_config(self) -> None: method model_post_init (line 56) | def model_post_init(self, __context: Any) -> None: method _patch_client_oauth (line 115) | def _patch_client_oauth(self, client: Any) -> None: method _get_request_payload (line 121) | def _get_request_payload( method _apply_prompt_caching (line 139) | def _apply_prompt_caching(self, payload: dict) -> None: method _apply_thinking_budget (line 182) | def _apply_thinking_budget(self, payload: dict) -> None: method _generate (line 195) | def _generate(self, messages: list[BaseMessage], stop: list[str] | Non... method _agenerate (line 220) | async def _agenerate(self, messages: list[BaseMessage], stop: list[str... method _calc_backoff_ms (line 248) | def _calc_backoff_ms(attempt: int, error: Exception) -> int: FILE: backend/packages/harness/deerflow/models/credential_loader.py function is_oauth_token (line 29) | def is_oauth_token(token: str) -> bool: class ClaudeCodeCredential (line 35) | class ClaudeCodeCredential: method is_expired (line 44) | def is_expired(self) -> bool: class CodexCliCredential (line 51) | class CodexCliCredential: function _resolve_credential_path (line 59) | def _resolve_credential_path(env_var: str, default_relative_path: str) -... function _load_json_file (line 66) | def _load_json_file(path: Path, label: str) -> dict[str, Any] | None: function _read_secret_from_file_descriptor (line 81) | def _read_secret_from_file_descriptor(env_var: str) -> str | None: function _credential_from_direct_token (line 101) | def _credential_from_direct_token(access_token: str, source: str) -> Cla... function _iter_claude_code_credential_paths (line 108) | def _iter_claude_code_credential_paths() -> list[Path]: function _extract_claude_code_credential (line 121) | def _extract_claude_code_credential(data: dict[str, Any], source: str) -... function load_claude_code_credential (line 142) | def load_claude_code_credential() -> ClaudeCodeCredential | None: function load_codex_cli_credential (line 191) | def load_codex_cli_credential() -> CodexCliCredential | None: FILE: backend/packages/harness/deerflow/models/factory.py function create_chat_model (line 11) | def create_chat_model(name: str | None = None, thinking_enabled: bool = ... FILE: backend/packages/harness/deerflow/models/openai_codex_provider.py class CodexChatModel (line 33) | class CodexChatModel(BaseChatModel): method _llm_type (line 52) | def _llm_type(self) -> str: method _validate_retry_config (line 55) | def _validate_retry_config(self) -> None: method model_post_init (line 59) | def model_post_init(self, __context: Any) -> None: method _load_codex_auth (line 73) | def _load_codex_auth(self) -> CodexCliCredential | None: method _normalize_content (line 78) | def _normalize_content(cls, content: Any) -> str: method _convert_messages (line 105) | def _convert_messages(self, messages: list[BaseMessage]) -> tuple[str,... method _convert_tools (line 148) | def _convert_tools(self, tools: list[dict]) -> list[dict]: method _call_codex_api (line 173) | def _call_codex_api(self, messages: list[BaseMessage], tools: list[dic... method _stream_response (line 216) | def _stream_response(self, headers: dict, payload: dict) -> dict: method _parse_sse_data_line (line 234) | def _parse_sse_data_line(line: str) -> dict[str, Any] | None: method _parse_tool_call_arguments (line 251) | def _parse_tool_call_arguments(self, output_item: dict[str, Any]) -> t... method _parse_response (line 280) | def _parse_response(self, response: dict) -> ChatResult: method _generate (line 342) | def _generate( method bind_tools (line 354) | def bind_tools(self, tools: list, **kwargs: Any) -> Any: FILE: backend/packages/harness/deerflow/models/patched_deepseek.py class PatchedChatDeepSeek (line 17) | class PatchedChatDeepSeek(ChatDeepSeek): method _get_request_payload (line 26) | def _get_request_payload( FILE: backend/packages/harness/deerflow/models/patched_minimax.py function _extract_reasoning_text (line 31) | def _extract_reasoning_text( function _strip_inline_think_tags (line 52) | def _strip_inline_think_tags(content: str) -> tuple[str, str | None]: function _merge_reasoning (line 66) | def _merge_reasoning(*values: str | None) -> str | None: function _with_reasoning_content (line 77) | def _with_reasoning_content( class PatchedChatMiniMax (line 100) | class PatchedChatMiniMax(ChatOpenAI): method _get_request_payload (line 103) | def _get_request_payload( method _convert_chunk_to_generation_chunk (line 121) | def _convert_chunk_to_generation_chunk( method _create_chat_result (line 189) | def _create_chat_result( FILE: backend/packages/harness/deerflow/reflection/resolvers.py function _build_missing_dependency_hint (line 11) | def _build_missing_dependency_hint(module_path: str, err: ImportError) -... function resolve_variable (line 25) | def resolve_variable[T]( function resolve_class (line 73) | def resolve_class[T](class_path: str, base_class: type[T] | None = None)... FILE: backend/packages/harness/deerflow/sandbox/exceptions.py class SandboxError (line 4) | class SandboxError(Exception): method __init__ (line 7) | def __init__(self, message: str, details: dict | None = None): method __str__ (line 12) | def __str__(self) -> str: class SandboxNotFoundError (line 19) | class SandboxNotFoundError(SandboxError): method __init__ (line 22) | def __init__(self, message: str = "Sandbox not found", sandbox_id: str... class SandboxRuntimeError (line 28) | class SandboxRuntimeError(SandboxError): class SandboxCommandError (line 34) | class SandboxCommandError(SandboxError): method __init__ (line 37) | def __init__(self, message: str, command: str | None = None, exit_code... class SandboxFileError (line 48) | class SandboxFileError(SandboxError): method __init__ (line 51) | def __init__(self, message: str, path: str | None = None, operation: s... class SandboxPermissionError (line 62) | class SandboxPermissionError(SandboxFileError): class SandboxFileNotFoundError (line 68) | class SandboxFileNotFoundError(SandboxFileError): FILE: backend/packages/harness/deerflow/sandbox/local/list_dir.py function _should_ignore (line 64) | def _should_ignore(name: str) -> bool: function list_dir (line 72) | def list_dir(path: str, max_depth: int = 2) -> list[str]: FILE: backend/packages/harness/deerflow/sandbox/local/local_sandbox.py class LocalSandbox (line 9) | class LocalSandbox(Sandbox): method __init__ (line 10) | def __init__(self, id: str): method _get_shell (line 20) | def _get_shell() -> str: method execute_command (line 35) | def execute_command(self, command: str) -> str: method list_dir (line 52) | def list_dir(self, path: str, max_depth=2) -> list[str]: method read_file (line 55) | def read_file(self, path: str) -> str: method write_file (line 59) | def write_file(self, path: str, content: str, append: bool = False) ->... method update_file (line 67) | def update_file(self, path: str, content: bytes) -> None: FILE: backend/packages/harness/deerflow/sandbox/local/local_sandbox_provider.py class LocalSandboxProvider (line 8) | class LocalSandboxProvider(SandboxProvider): method acquire (line 9) | def acquire(self, thread_id: str | None = None) -> str: method get (line 15) | def get(self, sandbox_id: str) -> Sandbox | None: method release (line 22) | def release(self, sandbox_id: str) -> None: FILE: backend/packages/harness/deerflow/sandbox/middleware.py class SandboxMiddlewareState (line 14) | class SandboxMiddlewareState(AgentState): class SandboxMiddleware (line 21) | class SandboxMiddleware(AgentMiddleware[SandboxMiddlewareState]): method __init__ (line 34) | def __init__(self, lazy_init: bool = True): method _acquire_sandbox (line 45) | def _acquire_sandbox(self, thread_id: str) -> str: method before_agent (line 52) | def before_agent(self, state: SandboxMiddlewareState, runtime: Runtime... method after_agent (line 66) | def after_agent(self, state: SandboxMiddlewareState, runtime: Runtime)... FILE: backend/packages/harness/deerflow/sandbox/sandbox.py class Sandbox (line 4) | class Sandbox(ABC): method __init__ (line 9) | def __init__(self, id: str): method id (line 13) | def id(self) -> str: method execute_command (line 17) | def execute_command(self, command: str) -> str: method read_file (line 29) | def read_file(self, path: str) -> str: method list_dir (line 41) | def list_dir(self, path: str, max_depth=2) -> list[str]: method write_file (line 54) | def write_file(self, path: str, content: str, append: bool = False) ->... method update_file (line 65) | def update_file(self, path: str, content: bytes) -> None: FILE: backend/packages/harness/deerflow/sandbox/sandbox_provider.py class SandboxProvider (line 8) | class SandboxProvider(ABC): method acquire (line 12) | def acquire(self, thread_id: str | None = None) -> str: method get (line 21) | def get(self, sandbox_id: str) -> Sandbox | None: method release (line 30) | def release(self, sandbox_id: str) -> None: function get_sandbox_provider (line 42) | def get_sandbox_provider(**kwargs) -> SandboxProvider: function reset_sandbox_provider (line 59) | def reset_sandbox_provider() -> None: function shutdown_sandbox_provider (line 73) | def shutdown_sandbox_provider() -> None: function set_sandbox_provider (line 87) | def set_sandbox_provider(provider: SandboxProvider) -> None: FILE: backend/packages/harness/deerflow/sandbox/tools.py function _get_skills_container_path (line 30) | def _get_skills_container_path() -> str: function _get_skills_host_path (line 50) | def _get_skills_host_path() -> str | None: function _is_skills_path (line 75) | def _is_skills_path(path: str) -> bool: function _resolve_skills_path (line 81) | def _resolve_skills_path(path: str) -> str: function _path_variants (line 105) | def _path_variants(path: str) -> set[str]: function _sanitize_error (line 109) | def _sanitize_error(error: Exception, runtime: "ToolRuntime[ContextT, Th... function replace_virtual_path (line 123) | def replace_virtual_path(path: str, thread_data: ThreadDataState | None)... function _thread_virtual_to_actual_mappings (line 156) | def _thread_virtual_to_actual_mappings(thread_data: ThreadDataState) -> ... function _thread_actual_to_virtual_mappings (line 181) | def _thread_actual_to_virtual_mappings(thread_data: ThreadDataState) -> ... function mask_local_paths_in_output (line 186) | def mask_local_paths_in_output(output: str, thread_data: ThreadDataState... function _reject_path_traversal (line 239) | def _reject_path_traversal(path: str) -> None: function validate_local_tool_path (line 248) | def validate_local_tool_path(path: str, thread_data: ThreadDataState | N... function _validate_resolved_user_data_path (line 287) | def _validate_resolved_user_data_path(resolved: Path, thread_data: Threa... function _resolve_and_validate_user_data_path (line 315) | def _resolve_and_validate_user_data_path(path: str, thread_data: ThreadD... function validate_local_bash_command_paths (line 326) | def validate_local_bash_command_paths(command: str, thread_data: ThreadD... function replace_virtual_paths_in_command (line 362) | def replace_virtual_paths_in_command(command: str, thread_data: ThreadDa... function get_thread_data (line 397) | def get_thread_data(runtime: ToolRuntime[ContextT, ThreadState] | None) ... function is_local_sandbox (line 406) | def is_local_sandbox(runtime: ToolRuntime[ContextT, ThreadState] | None)... function sandbox_from_runtime (line 422) | def sandbox_from_runtime(runtime: ToolRuntime[ContextT, ThreadState] | N... function ensure_sandbox_initialized (line 450) | def ensure_sandbox_initialized(runtime: ToolRuntime[ContextT, ThreadStat... function ensure_thread_directories_exist (line 505) | def ensure_thread_directories_exist(runtime: ToolRuntime[ContextT, Threa... function bash_tool (line 543) | def bash_tool(runtime: ToolRuntime[ContextT, ThreadState], description: ... function ls_tool (line 574) | def ls_tool(runtime: ToolRuntime[ContextT, ThreadState], description: st... function read_file_tool (line 607) | def read_file_tool( function write_file_tool (line 652) | def write_file_tool( function str_replace_tool (line 689) | def str_replace_tool( FILE: backend/packages/harness/deerflow/skills/loader.py function get_skills_root_path (line 8) | def get_skills_root_path() -> Path: function load_skills (line 22) | def load_skills(skills_path: Path | None = None, use_config: bool = True... FILE: backend/packages/harness/deerflow/skills/parser.py function parse_skill_file (line 7) | def parse_skill_file(skill_file: Path, category: str, relative_path: Pat... FILE: backend/packages/harness/deerflow/skills/types.py class Skill (line 6) | class Skill: method skill_path (line 19) | def skill_path(self) -> str: method get_container_path (line 24) | def get_container_path(self, container_base_path: str = "/mnt/skills")... method get_container_file_path (line 40) | def get_container_file_path(self, container_base_path: str = "/mnt/ski... method __repr__ (line 52) | def __repr__(self) -> str: FILE: backend/packages/harness/deerflow/skills/validation.py function _validate_skill_frontmatter (line 15) | def _validate_skill_frontmatter(skill_dir: Path) -> tuple[bool, str, str... FILE: backend/packages/harness/deerflow/subagents/config.py class SubagentConfig (line 7) | class SubagentConfig: FILE: backend/packages/harness/deerflow/subagents/executor.py class SubagentStatus (line 26) | class SubagentStatus(Enum): class SubagentResult (line 37) | class SubagentResult: method __post_init__ (line 60) | def __post_init__(self): function _filter_tools (line 78) | def _filter_tools( function _get_model_name (line 108) | def _get_model_name(config: SubagentConfig, parent_model: str | None) ->... class SubagentExecutor (line 123) | class SubagentExecutor: method __init__ (line 126) | def __init__( method _create_agent (line 164) | def _create_agent(self): method _build_initial_state (line 182) | def _build_initial_state(self, task: str) -> dict[str, Any]: method _aexecute (line 203) | async def _aexecute(self, task: str, result_holder: SubagentResult | N... method execute (line 351) | def execute(self, task: str, result_holder: SubagentResult | None = No... method execute_async (line 391) | def execute_async(self, task: str, task_id: str | None = None) -> str: function get_background_task_result (line 459) | def get_background_task_result(task_id: str) -> SubagentResult | None: function list_background_tasks (line 472) | def list_background_tasks() -> list[SubagentResult]: function cleanup_background_task (line 482) | def cleanup_background_task(task_id: str) -> None: FILE: backend/packages/harness/deerflow/subagents/registry.py function get_subagent_config (line 12) | def get_subagent_config(name: str) -> SubagentConfig | None: function list_subagents (line 37) | def list_subagents() -> list[SubagentConfig]: function get_subagent_names (line 46) | def get_subagent_names() -> list[str]: FILE: backend/packages/harness/deerflow/tools/builtins/clarification_tool.py function ask_clarification_tool (line 7) | def ask_clarification_tool( FILE: backend/packages/harness/deerflow/tools/builtins/present_file_tool.py function _normalize_presented_filepath (line 15) | def _normalize_presented_filepath( function present_file_tool (line 63) | def present_file_tool( FILE: backend/packages/harness/deerflow/tools/builtins/setup_agent_tool.py function setup_agent (line 15) | def setup_agent( FILE: backend/packages/harness/deerflow/tools/builtins/task_tool.py function task_tool (line 22) | def task_tool( FILE: backend/packages/harness/deerflow/tools/builtins/tool_search.py class DeferredToolEntry (line 30) | class DeferredToolEntry: class DeferredToolRegistry (line 38) | class DeferredToolRegistry: method __init__ (line 41) | def __init__(self): method register (line 44) | def register(self, tool: BaseTool) -> None: method search (line 53) | def search(self, query: str) -> list[BaseTool]: method entries (line 96) | def entries(self) -> list[DeferredToolEntry]: method __len__ (line 99) | def __len__(self) -> int: function _regex_score (line 103) | def _regex_score(pattern: str, entry: DeferredToolEntry) -> int: function get_deferred_registry (line 116) | def get_deferred_registry() -> DeferredToolRegistry | None: function set_deferred_registry (line 120) | def set_deferred_registry(registry: DeferredToolRegistry) -> None: function reset_deferred_registry (line 125) | def reset_deferred_registry() -> None: function tool_search (line 135) | def tool_search(query: str) -> str: FILE: backend/packages/harness/deerflow/tools/builtins/view_image_tool.py function view_image_tool (line 16) | def view_image_tool( FILE: backend/packages/harness/deerflow/tools/tools.py function get_available_tools (line 23) | def get_available_tools( FILE: backend/packages/harness/deerflow/utils/file_conversion.py function convert_file_to_markdown (line 24) | async def convert_file_to_markdown(file_path: Path) -> Path | None: FILE: backend/packages/harness/deerflow/utils/network.py class PortAllocator (line 8) | class PortAllocator: method __init__ (line 31) | def __init__(self): method _is_port_available (line 35) | def _is_port_available(self, port: int) -> bool: method allocate (line 58) | def allocate(self, start_port: int = 8080, max_range: int = 100) -> int: method release (line 82) | def release(self, port: int) -> None: method allocate_context (line 92) | def allocate_context(self, start_port: int = 8080, max_range: int = 100): function get_free_port (line 113) | def get_free_port(start_port: int = 8080, max_range: int = 100) -> int: function release_port (line 133) | def release_port(port: int) -> None: FILE: backend/packages/harness/deerflow/utils/readability.py class Article (line 12) | class Article: method __init__ (line 15) | def __init__(self, title: str, html_content: str): method to_markdown (line 19) | def to_markdown(self, including_title: bool = True) -> str: method to_message (line 31) | def to_message(self) -> list[dict]: class ReadabilityExtractor (line 58) | class ReadabilityExtractor: method extract_article (line 59) | def extract_article(self, html: str) -> Article: FILE: backend/tests/test_app_config_reload.py function _write_config (line 12) | def _write_config(path: Path, *, model_name: str, supports_thinking: boo... function _write_extensions_config (line 31) | def _write_extensions_config(path: Path) -> None: function test_get_app_config_reloads_when_file_changes (line 35) | def test_get_app_config_reloads_when_file_changes(tmp_path, monkeypatch): function test_get_app_config_reloads_when_config_path_changes (line 60) | def test_get_app_config_reloads_when_config_path_changes(tmp_path, monke... FILE: backend/tests/test_artifacts_router.py function test_get_artifact_reads_utf8_text_file_on_windows_locale (line 9) | def test_get_artifact_reads_utf8_text_file_on_windows_locale(tmp_path, m... FILE: backend/tests/test_channel_file_attachments.py function _run (line 13) | def _run(coro): class TestResolvedAttachment (line 27) | class TestResolvedAttachment: method test_basic_construction (line 28) | def test_basic_construction(self, tmp_path): method test_image_detection (line 44) | def test_image_detection(self, tmp_path): class TestOutboundMessageAttachments (line 64) | class TestOutboundMessageAttachments: method test_default_empty_attachments (line 65) | def test_default_empty_attachments(self): method test_attachments_populated (line 74) | def test_attachments_populated(self, tmp_path): class TestResolveAttachments (line 102) | class TestResolveAttachments: method test_resolves_existing_file (line 103) | def test_resolves_existing_file(self, tmp_path): method test_resolves_image_file (line 127) | def test_resolves_image_file(self, tmp_path): method test_skips_missing_file (line 148) | def test_skips_missing_file(self, tmp_path): method test_skips_invalid_path (line 164) | def test_skips_invalid_path(self): method test_rejects_uploads_path (line 176) | def test_rejects_uploads_path(self): method test_rejects_workspace_path (line 188) | def test_rejects_workspace_path(self): method test_rejects_path_traversal_escape (line 200) | def test_rejects_path_traversal_escape(self, tmp_path): method test_multiple_artifacts_partial_resolution (line 221) | def test_multiple_artifacts_partial_resolution(self, tmp_path): class _DummyChannel (line 256) | class _DummyChannel(Channel): method __init__ (line 259) | def __init__(self, bus): method start (line 264) | async def start(self): method stop (line 267) | async def stop(self): method send (line 270) | async def send(self, msg: OutboundMessage) -> None: method send_file (line 273) | async def send_file(self, msg: OutboundMessage, attachment: ResolvedAt... class TestBaseChannelOnOutbound (line 278) | class TestBaseChannelOnOutbound: method test_send_file_called_for_each_attachment (line 279) | def test_send_file_called_for_each_attachment(self, tmp_path): method test_no_attachments_no_send_file (line 307) | def test_no_attachments_no_send_file(self): method test_send_file_failure_does_not_block_others (line 324) | def test_send_file_failure_does_not_block_others(self, tmp_path): method test_send_raises_skips_file_uploads (line 364) | def test_send_raises_skips_file_uploads(self, tmp_path): method test_default_send_file_returns_false (line 390) | def test_default_send_file_returns_false(self): class TestManagerArtifactResolution (line 417) | class TestManagerArtifactResolution: method test_handle_chat_populates_attachments (line 418) | def test_handle_chat_populates_attachments(self): method test_format_artifact_text_for_unresolved (line 428) | def test_format_artifact_text_for_unresolved(self): FILE: backend/tests/test_channels.py function _run (line 19) | def _run(coro): function _wait_for (line 28) | async def _wait_for(condition, *, timeout=5.0, interval=0.05): class TestMessageBus (line 45) | class TestMessageBus: method test_publish_and_get_inbound (line 46) | def test_publish_and_get_inbound(self): method test_inbound_queue_is_fifo (line 64) | def test_inbound_queue_is_fifo(self): method test_outbound_callback (line 76) | def test_outbound_callback(self): method test_unsubscribe_outbound (line 92) | def test_unsubscribe_outbound(self): method test_outbound_error_does_not_crash (line 108) | def test_outbound_error_does_not_crash(self): method test_inbound_message_defaults (line 128) | def test_inbound_message_defaults(self): method test_outbound_message_defaults (line 136) | def test_outbound_message_defaults(self): class TestChannelStore (line 149) | class TestChannelStore: method store (line 151) | def store(self, tmp_path): method test_set_and_get_thread_id (line 154) | def test_set_and_get_thread_id(self, store): method test_get_nonexistent_returns_none (line 158) | def test_get_nonexistent_returns_none(self, store): method test_remove (line 161) | def test_remove(self, store): method test_remove_nonexistent_returns_false (line 166) | def test_remove_nonexistent_returns_false(self, store): method test_list_entries_all (line 169) | def test_list_entries_all(self, store): method test_list_entries_filtered (line 175) | def test_list_entries_filtered(self, store): method test_persistence (line 182) | def test_persistence(self, tmp_path): method test_update_preserves_created_at (line 190) | def test_update_preserves_created_at(self, store): method test_corrupt_file_handled (line 201) | def test_corrupt_file_handled(self, tmp_path): class DummyChannel (line 213) | class DummyChannel(Channel): method __init__ (line 216) | def __init__(self, bus, config=None): method start (line 221) | async def start(self): method stop (line 225) | async def stop(self): method send (line 229) | async def send(self, msg: OutboundMessage): class TestChannelBase (line 233) | class TestChannelBase: method test_make_inbound (line 234) | def test_make_inbound(self): method test_on_outbound_routes_to_channel (line 248) | def test_on_outbound_routes_to_channel(self): method test_on_outbound_ignores_other_channels (line 260) | def test_on_outbound_ignores_other_channels(self): class TestExtractResponseText (line 278) | class TestExtractResponseText: method test_string_content (line 279) | def test_string_content(self): method test_list_content_blocks (line 285) | def test_list_content_blocks(self): method test_picks_last_ai_message (line 291) | def test_picks_last_ai_message(self): method test_empty_messages (line 303) | def test_empty_messages(self): method test_no_ai_messages (line 308) | def test_no_ai_messages(self): method test_list_result (line 314) | def test_list_result(self): method test_skips_empty_ai_content (line 320) | def test_skips_empty_ai_content(self): method test_clarification_tool_message (line 331) | def test_clarification_tool_message(self): method test_clarification_over_empty_ai (line 343) | def test_clarification_over_empty_ai(self): method test_does_not_leak_previous_turn_text (line 355) | def test_does_not_leak_previous_turn_text(self): function _make_mock_langgraph_client (line 381) | def _make_mock_langgraph_client(thread_id="test-thread-123", run_result=... function _make_stream_part (line 404) | def _make_stream_part(event: str, data): function _make_async_iterator (line 408) | def _make_async_iterator(items): class TestChannelManager (line 416) | class TestChannelManager: method test_handle_chat_creates_thread (line 417) | def test_handle_chat_creates_thread(self): method test_handle_chat_uses_channel_session_overrides (line 461) | def test_handle_chat_uses_channel_session_overrides(self): method test_handle_chat_uses_user_session_overrides (line 508) | def test_handle_chat_uses_user_session_overrides(self): method test_handle_feishu_chat_streams_multiple_outbound_updates (line 567) | def test_handle_feishu_chat_streams_multiple_outbound_updates(self, mo... method test_handle_feishu_stream_error_still_sends_final (line 635) | def test_handle_feishu_stream_error_still_sends_final(self, monkeypatch): method test_handle_command_help (line 687) | def test_handle_command_help(self): method test_handle_command_new (line 720) | def test_handle_command_new(self): method test_each_topic_creates_new_thread (line 762) | def test_each_topic_creates_new_thread(self): method test_same_topic_reuses_thread (line 814) | def test_same_topic_reuses_thread(self): method test_none_topic_reuses_thread (line 858) | def test_none_topic_reuses_thread(self): method test_different_topics_get_different_threads (line 902) | def test_different_topics_get_different_threads(self): method test_handle_command_bootstrap_with_text (line 946) | def test_handle_command_bootstrap_with_text(self): method test_handle_command_bootstrap_without_text (line 996) | def test_handle_command_bootstrap_without_text(self): method test_handle_command_bootstrap_feishu_uses_streaming (line 1037) | def test_handle_command_bootstrap_feishu_uses_streaming(self, monkeypa... method test_handle_command_bootstrap_creates_thread_if_needed (line 1100) | def test_handle_command_bootstrap_creates_thread_if_needed(self): method test_help_includes_bootstrap (line 1138) | def test_help_includes_bootstrap(self): class TestExtractArtifacts (line 1176) | class TestExtractArtifacts: method test_extracts_from_present_files_tool_call (line 1177) | def test_extracts_from_present_files_tool_call(self): method test_empty_when_no_present_files (line 1195) | def test_empty_when_no_present_files(self): method test_empty_for_list_result_no_tool_calls (line 1206) | def test_empty_for_list_result_no_tool_calls(self): method test_only_extracts_after_last_human_message (line 1212) | def test_only_extracts_after_last_human_message(self): method test_multiple_files_in_single_call (line 1241) | def test_multiple_files_in_single_call(self): class TestFormatArtifactText (line 1259) | class TestFormatArtifactText: method test_single_artifact (line 1260) | def test_single_artifact(self): method test_multiple_artifacts (line 1266) | def test_multiple_artifacts(self): class TestHandleChatWithArtifacts (line 1275) | class TestHandleChatWithArtifacts: method test_artifacts_appended_to_text (line 1276) | def test_artifacts_appended_to_text(self): method test_artifacts_only_no_text (line 1322) | def test_artifacts_only_no_text(self): method test_only_last_turn_artifacts_returned (line 1370) | def test_only_last_turn_artifacts_returned(self): class TestFeishuChannel (line 1453) | class TestFeishuChannel: method test_prepare_inbound_publishes_without_waiting_for_running_card (line 1454) | def test_prepare_inbound_publishes_without_waiting_for_running_card(se... method test_prepare_inbound_and_send_share_running_card_task (line 1496) | def test_prepare_inbound_and_send_share_running_card_task(self): method test_streaming_reuses_single_running_card (line 1555) | def test_streaming_reuses_single_running_card(self): class TestChannelService (line 1627) | class TestChannelService: method test_get_status_no_channels (line 1628) | def test_get_status_no_channels(self): method test_disabled_channels_are_skipped (line 1645) | def test_disabled_channels_are_skipped(self): method test_session_config_is_forwarded_to_manager (line 1660) | def test_session_config_is_forwarded_to_manager(self): class TestSlackSendRetry (line 1690) | class TestSlackSendRetry: method test_retries_on_failure_then_succeeds (line 1691) | def test_retries_on_failure_then_succeeds(self): method test_raises_after_all_retries_exhausted (line 1717) | def test_raises_after_all_retries_exhausted(self): class TestTelegramSendRetry (line 1742) | class TestTelegramSendRetry: method test_retries_on_failure_then_succeeds (line 1743) | def test_retries_on_failure_then_succeeds(self): method test_raises_after_all_retries_exhausted (line 1773) | def test_raises_after_all_retries_exhausted(self): function _make_telegram_update (line 1800) | def _make_telegram_update(chat_type: str, message_id: int, *, reply_to_m... class TestTelegramPrivateChatThread (line 1817) | class TestTelegramPrivateChatThread: method test_private_chat_no_reply_uses_none_topic (line 1820) | def test_private_chat_no_reply_uses_none_topic(self): method test_private_chat_with_reply_still_uses_none_topic (line 1836) | def test_private_chat_with_reply_still_uses_none_topic(self): method test_group_chat_no_reply_uses_msg_id_as_topic (line 1852) | def test_group_chat_no_reply_uses_msg_id_as_topic(self): method test_group_chat_reply_uses_reply_msg_id_as_topic (line 1868) | def test_group_chat_reply_uses_reply_msg_id_as_topic(self): method test_supergroup_chat_uses_msg_id_as_topic (line 1884) | def test_supergroup_chat_uses_msg_id_as_topic(self): method test_cmd_generic_private_chat_uses_none_topic (line 1900) | def test_cmd_generic_private_chat_uses_none_topic(self): method test_cmd_generic_group_chat_uses_msg_id_as_topic (line 1917) | def test_cmd_generic_group_chat_uses_msg_id_as_topic(self): method test_cmd_generic_group_chat_reply_uses_reply_msg_id_as_topic (line 1934) | def test_cmd_generic_group_chat_reply_uses_reply_msg_id_as_topic(self): class TestTelegramProcessingOrder (line 1952) | class TestTelegramProcessingOrder: method test_running_reply_sent_before_publish (line 1955) | def test_running_reply_sent_before_publish(self): class TestSlackMarkdownConversion (line 1987) | class TestSlackMarkdownConversion: method test_bold_converted (line 1990) | def test_bold_converted(self): method test_link_converted (line 1997) | def test_link_converted(self): method test_heading_converted (line 2003) | def test_heading_converted(self): FILE: backend/tests/test_checkpointer.py function reset_state (line 19) | def reset_state(): class TestCheckpointerConfig (line 35) | class TestCheckpointerConfig: method test_load_memory_config (line 36) | def test_load_memory_config(self): method test_load_sqlite_config (line 43) | def test_load_sqlite_config(self): method test_load_postgres_config (line 50) | def test_load_postgres_config(self): method test_default_connection_string_is_none (line 57) | def test_default_connection_string_is_none(self): method test_set_config_to_none (line 61) | def test_set_config_to_none(self): method test_invalid_type_raises (line 66) | def test_invalid_type_raises(self): class TestGetCheckpointer (line 76) | class TestGetCheckpointer: method test_returns_in_memory_saver_when_not_configured (line 77) | def test_returns_in_memory_saver_when_not_configured(self): method test_memory_returns_in_memory_saver (line 86) | def test_memory_returns_in_memory_saver(self): method test_memory_singleton (line 93) | def test_memory_singleton(self): method test_reset_clears_singleton (line 99) | def test_reset_clears_singleton(self): method test_sqlite_raises_when_package_missing (line 106) | def test_sqlite_raises_when_package_missing(self): method test_postgres_raises_when_package_missing (line 113) | def test_postgres_raises_when_package_missing(self): method test_postgres_raises_when_connection_string_missing (line 120) | def test_postgres_raises_when_connection_string_missing(self): method test_sqlite_creates_saver (line 130) | def test_sqlite_creates_saver(self): method test_postgres_creates_saver (line 153) | def test_postgres_creates_saver(self): class TestAppConfigLoadsCheckpointer (line 182) | class TestAppConfigLoadsCheckpointer: method test_load_checkpointer_section (line 183) | def test_load_checkpointer_section(self): class TestClientCheckpointerFallback (line 197) | class TestClientCheckpointerFallback: method test_client_uses_config_checkpointer_when_none_provided (line 198) | def test_client_uses_config_checkpointer_when_none_provided(self): method test_client_explicit_checkpointer_takes_precedence (line 233) | def test_client_explicit_checkpointer_takes_precedence(self): FILE: backend/tests/test_checkpointer_none_fix.py class TestCheckpointerNoneFix (line 9) | class TestCheckpointerNoneFix: method test_async_make_checkpointer_returns_in_memory_saver_when_not_configured (line 13) | async def test_async_make_checkpointer_returns_in_memory_saver_when_no... method test_sync_checkpointer_context_returns_in_memory_saver_when_not_configured (line 36) | def test_sync_checkpointer_context_returns_in_memory_saver_when_not_co... FILE: backend/tests/test_cli_auth_providers.py function test_codex_provider_rejects_non_positive_retry_attempts (line 13) | def test_codex_provider_rejects_non_positive_retry_attempts(): function test_codex_provider_requires_credentials (line 18) | def test_codex_provider_requires_credentials(monkeypatch): function test_codex_provider_concatenates_multiple_system_messages (line 25) | def test_codex_provider_concatenates_multiple_system_messages(monkeypatch): function test_codex_provider_flattens_structured_text_blocks (line 45) | def test_codex_provider_flattens_structured_text_blocks(monkeypatch): function test_claude_provider_rejects_non_positive_retry_attempts (line 63) | def test_claude_provider_rejects_non_positive_retry_attempts(): function test_codex_provider_skips_terminal_sse_markers (line 68) | def test_codex_provider_skips_terminal_sse_markers(monkeypatch): function test_codex_provider_skips_non_json_sse_frames (line 81) | def test_codex_provider_skips_non_json_sse_frames(monkeypatch): function test_codex_provider_marks_invalid_tool_call_arguments (line 93) | def test_codex_provider_marks_invalid_tool_call_arguments(monkeypatch): function test_codex_provider_parses_valid_tool_arguments (line 126) | def test_codex_provider_parses_valid_tool_arguments(monkeypatch): FILE: backend/tests/test_client.py function mock_app_config (line 27) | def mock_app_config(): function client (line 42) | def client(mock_app_config): class TestClientInit (line 53) | class TestClientInit: method test_default_params (line 54) | def test_default_params(self, client): method test_custom_params (line 63) | def test_custom_params(self, mock_app_config): method test_invalid_agent_name (line 78) | def test_invalid_agent_name(self, mock_app_config): method test_custom_config_path (line 85) | def test_custom_config_path(self, mock_app_config): method test_checkpointer_stored (line 93) | def test_checkpointer_stored(self, mock_app_config): class TestConfigQueries (line 105) | class TestConfigQueries: method test_list_models (line 106) | def test_list_models(self, client): method test_list_skills (line 116) | def test_list_skills(self, client): method test_list_skills_enabled_only (line 138) | def test_list_skills_enabled_only(self, client): method test_get_memory (line 143) | def test_get_memory(self, client): function _make_agent_mock (line 156) | def _make_agent_mock(chunks: list[dict]): function _ai_events (line 163) | def _ai_events(events): function _tool_call_events (line 168) | def _tool_call_events(events): function _tool_result_events (line 173) | def _tool_result_events(events): class TestStream (line 178) | class TestStream: method test_basic_message (line 179) | def test_basic_message(self, client): method test_context_propagation (line 201) | def test_context_propagation(self, client): method test_tool_call_and_result (line 218) | def test_tool_call_and_result(self, client): method test_values_event_with_title (line 242) | def test_values_event_with_title(self, client): method test_deduplication (line 261) | def test_deduplication(self, client): method test_auto_thread_id (line 279) | def test_auto_thread_id(self, client): method test_list_content_blocks (line 292) | def test_list_content_blocks(self, client): class TestChat (line 315) | class TestChat: method test_returns_last_message (line 316) | def test_returns_last_message(self, client): method test_empty_response (line 334) | def test_empty_response(self, client): class TestExtractText (line 353) | class TestExtractText: method test_string (line 354) | def test_string(self): method test_list_text_blocks (line 357) | def test_list_text_blocks(self): method test_list_plain_strings (line 365) | def test_list_plain_strings(self): method test_empty_list (line 368) | def test_empty_list(self): method test_other_type (line 371) | def test_other_type(self): class TestEnsureAgent (line 380) | class TestEnsureAgent: method test_creates_agent (line 381) | def test_creates_agent(self, client): method test_uses_default_checkpointer_when_available (line 403) | def test_uses_default_checkpointer_when_available(self, client): method test_skips_default_checkpointer_when_unconfigured (line 420) | def test_skips_default_checkpointer_when_unconfigured(self, client): method test_reuses_agent_same_config (line 436) | def test_reuses_agent_same_config(self, client): class TestGetModel (line 454) | class TestGetModel: method test_found (line 455) | def test_found(self, client): method test_not_found (line 475) | def test_not_found(self, client): class TestMcpConfig (line 485) | class TestMcpConfig: method test_get_mcp_config (line 486) | def test_get_mcp_config(self, client): method test_update_mcp_config (line 499) | def test_update_mcp_config(self, client): class TestSkillsManagement (line 541) | class TestSkillsManagement: method _make_skill (line 542) | def _make_skill(self, name="test-skill", enabled=True): method test_get_skill_found (line 551) | def test_get_skill_found(self, client): method test_get_skill_not_found (line 558) | def test_get_skill_not_found(self, client): method test_update_skill (line 563) | def test_update_skill(self, client): method test_update_skill_not_found (line 591) | def test_update_skill_not_found(self, client): method test_install_skill (line 596) | def test_install_skill(self, client): method test_install_skill_not_found (line 622) | def test_install_skill_not_found(self, client): method test_install_skill_bad_extension (line 626) | def test_install_skill_bad_extension(self, client): class TestMemoryManagement (line 641) | class TestMemoryManagement: method test_reload_memory (line 642) | def test_reload_memory(self, client): method test_get_memory_config (line 648) | def test_get_memory_config(self, client): method test_get_memory_status (line 664) | def test_get_memory_status(self, client): class TestUploads (line 691) | class TestUploads: method test_upload_files (line 692) | def test_upload_files(self, client): method test_upload_files_not_found (line 713) | def test_upload_files_not_found(self, client): method test_upload_files_rejects_directory_path (line 717) | def test_upload_files_rejects_directory_path(self, client): method test_upload_files_reuses_single_executor_inside_event_loop (line 722) | def test_upload_files_reuses_single_executor_inside_event_loop(self, c... method test_list_uploads (line 774) | def test_list_uploads(self, client): method test_delete_upload (line 791) | def test_delete_upload(self, client): method test_delete_upload_not_found (line 803) | def test_delete_upload_not_found(self, client): method test_delete_upload_path_traversal (line 809) | def test_delete_upload_path_traversal(self, client): class TestArtifacts (line 822) | class TestArtifacts: method test_get_artifact (line 823) | def test_get_artifact(self, client): method test_get_artifact_not_found (line 839) | def test_get_artifact_not_found(self, client): method test_get_artifact_bad_prefix (line 851) | def test_get_artifact_bad_prefix(self, client): method test_get_artifact_path_traversal (line 855) | def test_get_artifact_path_traversal(self, client): class TestScenarioMultiTurnConversation (line 875) | class TestScenarioMultiTurnConversation: method test_two_turn_conversation (line 878) | def test_two_turn_conversation(self, client): method test_stream_collects_all_event_types_across_turns (line 901) | def test_stream_collects_all_event_types_across_turns(self, client): class TestScenarioToolChain (line 952) | class TestScenarioToolChain: method test_multi_tool_chain (line 955) | def test_multi_tool_chain(self, client): class TestScenarioFileLifecycle (line 1002) | class TestScenarioFileLifecycle: method test_upload_list_delete_lifecycle (line 1005) | def test_upload_list_delete_lifecycle(self, client): method test_upload_then_read_artifact (line 1043) | def test_upload_then_read_artifact(self, client): class TestScenarioConfigManagement (line 1075) | class TestScenarioConfigManagement: method test_model_and_skill_discovery (line 1078) | def test_model_and_skill_discovery(self, client): method test_mcp_update_then_skill_toggle (line 1115) | def test_mcp_update_then_skill_toggle(self, client): class TestScenarioAgentRecreation (line 1171) | class TestScenarioAgentRecreation: method test_different_model_triggers_rebuild (line 1174) | def test_different_model_triggers_rebuild(self, client): method test_same_config_reuses_agent (line 1202) | def test_same_config_reuses_agent(self, client): method test_reset_agent_forces_rebuild (line 1226) | def test_reset_agent_forces_rebuild(self, client): method test_per_call_override_triggers_rebuild (line 1250) | def test_per_call_override_triggers_rebuild(self, client): class TestScenarioThreadIsolation (line 1271) | class TestScenarioThreadIsolation: method test_uploads_isolated_per_thread (line 1274) | def test_uploads_isolated_per_thread(self, client): method test_artifacts_isolated_per_thread (line 1298) | def test_artifacts_isolated_per_thread(self, client): class TestScenarioMemoryWorkflow (line 1320) | class TestScenarioMemoryWorkflow: method test_memory_full_lifecycle (line 1323) | def test_memory_full_lifecycle(self, client): class TestScenarioSkillInstallAndUse (line 1360) | class TestScenarioSkillInstallAndUse: method test_install_then_toggle (line 1363) | def test_install_then_toggle(self, client): class TestScenarioEdgeCases (line 1425) | class TestScenarioEdgeCases: method test_empty_stream_response (line 1428) | def test_empty_stream_response(self, client): method test_chat_on_empty_response (line 1443) | def test_chat_on_empty_response(self, client): method test_multiple_title_changes (line 1455) | def test_multiple_title_changes(self, client): method test_concurrent_tool_calls_in_single_message (line 1478) | def test_concurrent_tool_calls_in_single_message(self, client): method test_upload_convertible_file_conversion_failure (line 1504) | def test_upload_convertible_file_conversion_failure(self, client): class TestGatewayConformance (line 1533) | class TestGatewayConformance: method test_list_models (line 1541) | def test_list_models(self, mock_app_config): method test_get_model (line 1559) | def test_get_model(self, mock_app_config): method test_list_skills (line 1578) | def test_list_skills(self, client): method test_get_skill (line 1593) | def test_get_skill(self, client): method test_install_skill (line 1608) | def test_install_skill(self, client, tmp_path): method test_get_mcp_config (line 1626) | def test_get_mcp_config(self, client): method test_update_mcp_config (line 1647) | def test_update_mcp_config(self, client, tmp_path): method test_upload_files (line 1676) | def test_upload_files(self, client, tmp_path): method test_get_memory_config (line 1690) | def test_get_memory_config(self, client): method test_get_memory_status (line 1707) | def test_get_memory_status(self, client): FILE: backend/tests/test_client_live.py function client (line 33) | def client(): function thread_tmp (line 39) | def thread_tmp(tmp_path): class TestLiveBasicChat (line 52) | class TestLiveBasicChat: method test_chat_returns_nonempty_string (line 53) | def test_chat_returns_nonempty_string(self, client): method test_chat_follows_instruction (line 60) | def test_chat_follows_instruction(self, client): class TestLiveStreaming (line 72) | class TestLiveStreaming: method test_stream_yields_messages_tuple_and_end (line 73) | def test_stream_yields_messages_tuple_and_end(self, client): method test_stream_ai_content_nonempty (line 86) | def test_stream_ai_content_nonempty(self, client): class TestLiveToolUse (line 99) | class TestLiveToolUse: method test_agent_uses_bash_tool (line 100) | def test_agent_uses_bash_tool(self, client): method test_agent_uses_ls_tool (line 122) | def test_agent_uses_ls_tool(self, client): class TestLiveMultiToolChain (line 139) | class TestLiveMultiToolChain: method test_write_then_read (line 140) | def test_write_then_read(self, client): class TestLiveFileUpload (line 167) | class TestLiveFileUpload: method test_upload_list_delete (line 168) | def test_upload_list_delete(self, client, thread_tmp): method test_upload_nonexistent_file_raises (line 209) | def test_upload_nonexistent_file_raises(self, client): class TestLiveConfigQueries (line 219) | class TestLiveConfigQueries: method test_list_models_returns_configured_model (line 220) | def test_list_models_returns_configured_model(self, client): method test_get_model_found (line 232) | def test_get_model_found(self, client): method test_get_model_not_found (line 243) | def test_get_model_not_found(self, client): method test_list_skills (line 246) | def test_list_skills(self, client): class TestLiveArtifact (line 261) | class TestLiveArtifact: method test_get_artifact_after_write (line 262) | def test_get_artifact_after_write(self, client): method test_get_artifact_not_found (line 288) | def test_get_artifact_not_found(self, client): class TestLiveOverrides (line 298) | class TestLiveOverrides: method test_thinking_disabled_still_works (line 299) | def test_thinking_disabled_still_works(self, client): class TestLiveErrorResilience (line 314) | class TestLiveErrorResilience: method test_delete_nonexistent_upload (line 315) | def test_delete_nonexistent_upload(self, client): method test_bad_artifact_path (line 319) | def test_bad_artifact_path(self, client): method test_path_traversal_blocked (line 323) | def test_path_traversal_blocked(self, client): FILE: backend/tests/test_config_version.py function _make_config_files (line 14) | def _make_config_files(tmpdir: Path, user_config: dict, example_config: ... function test_missing_version_treated_as_zero (line 35) | def test_missing_version_treated_as_zero(caplog): function test_matching_version_no_warning (line 53) | def test_matching_version_no_warning(caplog): function test_outdated_version_emits_warning (line 69) | def test_outdated_version_emits_warning(caplog): function test_no_example_file_no_warning (line 87) | def test_no_example_file_no_warning(caplog): function test_string_config_version_does_not_raise_type_error (line 100) | def test_string_config_version_does_not_raise_type_error(caplog): function test_newer_user_version_no_warning (line 112) | def test_newer_user_version_no_warning(caplog): FILE: backend/tests/test_credential_loader.py function _clear_claude_code_env (line 10) | def _clear_claude_code_env(monkeypatch) -> None: function test_load_claude_code_credential_from_direct_env (line 20) | def test_load_claude_code_credential_from_direct_env(monkeypatch): function test_load_claude_code_credential_from_anthropic_auth_env (line 32) | def test_load_claude_code_credential_from_anthropic_auth_env(monkeypatch): function test_load_claude_code_credential_from_file_descriptor (line 43) | def test_load_claude_code_credential_from_file_descriptor(monkeypatch): function test_load_claude_code_credential_from_override_path (line 62) | def test_load_claude_code_credential_from_override_path(tmp_path, monkey... function test_load_claude_code_credential_ignores_directory_path (line 86) | def test_load_claude_code_credential_ignores_directory_path(tmp_path, mo... function test_load_claude_code_credential_falls_back_to_default_file_when_override_is_invalid (line 95) | def test_load_claude_code_credential_falls_back_to_default_file_when_ove... function test_load_codex_cli_credential_supports_nested_tokens_shape (line 125) | def test_load_codex_cli_credential_supports_nested_tokens_shape(tmp_path... function test_load_codex_cli_credential_supports_legacy_top_level_shape (line 147) | def test_load_codex_cli_credential_supports_legacy_top_level_shape(tmp_p... FILE: backend/tests/test_custom_agent.py function _make_paths (line 17) | def _make_paths(base_dir: Path): function _write_agent (line 24) | def _write_agent(base_dir: Path, name: str, config: dict, soul: str = "Y... class TestPaths (line 44) | class TestPaths: method test_agents_dir (line 45) | def test_agents_dir(self, tmp_path): method test_agent_dir (line 49) | def test_agent_dir(self, tmp_path): method test_agent_memory_file (line 53) | def test_agent_memory_file(self, tmp_path): method test_user_md_file (line 57) | def test_user_md_file(self, tmp_path): method test_paths_are_different_from_global (line 61) | def test_paths_are_different_from_global(self, tmp_path): class TestAgentConfig (line 73) | class TestAgentConfig: method test_minimal_config (line 74) | def test_minimal_config(self): method test_full_config (line 83) | def test_full_config(self): method test_config_from_dict (line 96) | def test_config_from_dict(self): class TestLoadAgentConfig (line 111) | class TestLoadAgentConfig: method test_load_valid_config (line 112) | def test_load_valid_config(self, tmp_path): method test_load_missing_agent_raises (line 125) | def test_load_missing_agent_raises(self, tmp_path): method test_load_missing_config_yaml_raises (line 132) | def test_load_missing_config_yaml_raises(self, tmp_path): method test_load_config_infers_name_from_dir (line 142) | def test_load_config_infers_name_from_dir(self, tmp_path): method test_load_config_with_tool_groups (line 156) | def test_load_config_with_tool_groups(self, tmp_path): method test_legacy_prompt_file_field_ignored (line 167) | def test_legacy_prompt_file_field_ignored(self, tmp_path): class TestLoadAgentSoul (line 187) | class TestLoadAgentSoul: method test_reads_soul_file (line 188) | def test_reads_soul_file(self, tmp_path): method test_missing_soul_file_returns_none (line 200) | def test_missing_soul_file_returns_none(self, tmp_path): method test_empty_soul_file_returns_none (line 214) | def test_empty_soul_file_returns_none(self, tmp_path): class TestListCustomAgents (line 234) | class TestListCustomAgents: method test_empty_when_no_agents_dir (line 235) | def test_empty_when_no_agents_dir(self, tmp_path): method test_discovers_multiple_agents (line 243) | def test_discovers_multiple_agents(self, tmp_path): method test_skips_dirs_without_config_yaml (line 256) | def test_skips_dirs_without_config_yaml(self, tmp_path): method test_skips_non_directory_entries (line 270) | def test_skips_non_directory_entries(self, tmp_path): method test_returns_sorted_by_name (line 285) | def test_returns_sorted_by_name(self, tmp_path): class TestMemoryFilePath (line 304) | class TestMemoryFilePath: method test_global_memory_path (line 305) | def test_global_memory_path(self, tmp_path): method test_agent_memory_path (line 317) | def test_agent_memory_path(self, tmp_path): method test_different_paths_for_different_agents (line 329) | def test_different_paths_for_different_agents(self, tmp_path): function _make_test_app (line 351) | def _make_test_app(tmp_path: Path): function agent_client (line 363) | def agent_client(tmp_path): class TestAgentsAPI (line 374) | class TestAgentsAPI: method test_list_agents_empty (line 375) | def test_list_agents_empty(self, agent_client): method test_create_agent (line 381) | def test_create_agent(self, agent_client): method test_create_agent_invalid_name (line 394) | def test_create_agent_invalid_name(self, agent_client): method test_create_duplicate_agent_409 (line 399) | def test_create_duplicate_agent_409(self, agent_client): method test_list_agents_after_create (line 407) | def test_list_agents_after_create(self, agent_client): method test_get_agent (line 417) | def test_get_agent(self, agent_client): method test_get_missing_agent_404 (line 426) | def test_get_missing_agent_404(self, agent_client): method test_update_agent_soul (line 430) | def test_update_agent_soul(self, agent_client): method test_update_agent_description (line 437) | def test_update_agent_description(self, agent_client): method test_update_missing_agent_404 (line 444) | def test_update_missing_agent_404(self, agent_client): method test_delete_agent (line 448) | def test_delete_agent(self, agent_client): method test_delete_missing_agent_404 (line 458) | def test_delete_missing_agent_404(self, agent_client): method test_create_agent_with_model_and_tool_groups (line 462) | def test_create_agent_with_model_and_tool_groups(self, agent_client): method test_create_persists_files_on_disk (line 476) | def test_create_persists_files_on_disk(self, agent_client, tmp_path): method test_delete_removes_files_from_disk (line 485) | def test_delete_removes_files_from_disk(self, agent_client, tmp_path): class TestUserProfileAPI (line 499) | class TestUserProfileAPI: method test_get_user_profile_empty (line 500) | def test_get_user_profile_empty(self, agent_client): method test_put_user_profile (line 505) | def test_put_user_profile(self, agent_client, tmp_path): method test_get_user_profile_after_put (line 516) | def test_get_user_profile_after_put(self, agent_client): method test_put_empty_user_profile_returns_none (line 524) | def test_put_empty_user_profile_returns_none(self, agent_client): FILE: backend/tests/test_docker_sandbox_mode_detection.py function _detect_mode_with_config (line 13) | def _detect_mode_with_config(config_content: str) -> str: function test_detect_mode_defaults_to_local_when_config_missing (line 29) | def test_detect_mode_defaults_to_local_when_config_missing(): function test_detect_mode_local_provider (line 38) | def test_detect_mode_local_provider(): function test_detect_mode_aio_without_provisioner_url (line 48) | def test_detect_mode_aio_without_provisioner_url(): function test_detect_mode_provisioner_with_url (line 58) | def test_detect_mode_provisioner_with_url(): function test_detect_mode_ignores_commented_provisioner_url (line 69) | def test_detect_mode_ignores_commented_provisioner_url(): function test_detect_mode_unknown_provider_falls_back_to_local (line 80) | def test_detect_mode_unknown_provider_falls_back_to_local(): FILE: backend/tests/test_feishu_parser.py function test_feishu_on_message_plain_text (line 10) | def test_feishu_on_message_plain_text(): function test_feishu_on_message_rich_text (line 40) | def test_feishu_on_message_rich_text(): FILE: backend/tests/test_harness_boundary.py function _collect_imports (line 18) | def _collect_imports(filepath: Path) -> list[tuple[int, str]]: function test_harness_does_not_import_app (line 37) | def test_harness_does_not_import_app(): FILE: backend/tests/test_infoquest_client.py class TestInfoQuestClient (line 10) | class TestInfoQuestClient: method test_infoquest_client_initialization (line 11) | def test_infoquest_client_initialization(self): method test_fetch_success (line 28) | def test_fetch_success(self, mock_post): method test_fetch_non_200_status (line 46) | def test_fetch_non_200_status(self, mock_post): method test_fetch_empty_response (line 59) | def test_fetch_empty_response(self, mock_post): method test_web_search_raw_results_success (line 72) | def test_web_search_raw_results_success(self, mock_post): method test_web_search_success (line 89) | def test_web_search_success(self, mock_post): method test_clean_results (line 105) | def test_clean_results(self): method test_web_search_tool (line 127) | def test_web_search_tool(self, mock_get_client): method test_web_fetch_tool (line 140) | def test_web_fetch_tool(self, mock_get_client): method test_get_infoquest_client (line 153) | def test_get_infoquest_client(self, mock_get_app_config): method test_web_search_api_error (line 174) | def test_web_search_api_error(self, mock_post): method test_clean_results_with_image_search (line 183) | def test_clean_results_with_image_search(self): method test_clean_results_with_image_search_empty (line 192) | def test_clean_results_with_image_search_empty(self): method test_clean_results_with_image_search_no_images (line 199) | def test_clean_results_with_image_search_no_images(self): class TestImageSearch (line 207) | class TestImageSearch: method test_image_search_raw_results_success (line 209) | def test_image_search_raw_results_success(self, mock_post): method test_image_search_raw_results_with_parameters (line 226) | def test_image_search_raw_results_with_parameters(self, mock_post): method test_image_search_raw_results_invalid_time_range (line 245) | def test_image_search_raw_results_invalid_time_range(self, mock_post): method test_image_search_success (line 267) | def test_image_search_success(self, mock_post): method test_image_search_with_all_parameters (line 288) | def test_image_search_with_all_parameters(self, mock_post): method test_image_search_api_error (line 308) | def test_image_search_api_error(self, mock_post): method test_image_search_tool (line 318) | def test_image_search_tool(self, mock_get_client): method test_image_search_tool_with_parameters (line 336) | def test_image_search_tool_with_parameters(self, mock_get_client): FILE: backend/tests/test_lead_agent_model_resolution.py function _make_app_config (line 13) | def _make_app_config(models: list[ModelConfig]) -> AppConfig: function _make_model (line 20) | def _make_model(name: str, *, supports_thinking: bool) -> ModelConfig: function test_resolve_model_name_falls_back_to_default (line 32) | def test_resolve_model_name_falls_back_to_default(monkeypatch, caplog): function test_resolve_model_name_uses_default_when_none (line 49) | def test_resolve_model_name_uses_default_when_none(monkeypatch): function test_resolve_model_name_raises_when_no_models_configured (line 64) | def test_resolve_model_name_raises_when_no_models_configured(monkeypatch): function test_make_lead_agent_disables_thinking_when_model_does_not_support_it (line 76) | def test_make_lead_agent_disables_thinking_when_model_does_not_support_i... function test_build_middlewares_uses_resolved_model_name_for_vision (line 112) | def test_build_middlewares_uses_resolved_model_name_for_vision(monkeypat... FILE: backend/tests/test_local_sandbox_encoding.py function _open (line 7) | def _open(base, file, mode="r", *args, **kwargs): function test_read_file_uses_utf8_on_windows_locale (line 13) | def test_read_file_uses_utf8_on_windows_locale(tmp_path, monkeypatch): function test_write_file_uses_utf8_on_windows_locale (line 24) | def test_write_file_uses_utf8_on_windows_locale(tmp_path, monkeypatch): FILE: backend/tests/test_loop_detection_middleware.py function _make_runtime (line 14) | def _make_runtime(thread_id="test-thread"): function _make_state (line 21) | def _make_state(tool_calls=None, content=""): function _bash_call (line 27) | def _bash_call(cmd="ls"): class TestHashToolCalls (line 31) | class TestHashToolCalls: method test_same_calls_same_hash (line 32) | def test_same_calls_same_hash(self): method test_different_calls_different_hash (line 37) | def test_different_calls_different_hash(self): method test_order_independent (line 42) | def test_order_independent(self): method test_empty_calls (line 47) | def test_empty_calls(self): class TestLoopDetection (line 53) | class TestLoopDetection: method test_no_tool_calls_returns_none (line 54) | def test_no_tool_calls_returns_none(self): method test_below_threshold_returns_none (line 61) | def test_below_threshold_returns_none(self): method test_warn_at_threshold (line 71) | def test_warn_at_threshold(self): method test_warn_only_injected_once (line 87) | def test_warn_only_injected_once(self): method test_hard_stop_at_limit (line 106) | def test_hard_stop_at_limit(self): method test_different_calls_dont_trigger (line 124) | def test_different_calls_dont_trigger(self): method test_window_sliding (line 133) | def test_window_sliding(self): method test_reset_clears_state (line 150) | def test_reset_clears_state(self): method test_non_ai_message_ignored (line 163) | def test_non_ai_message_ignored(self): method test_empty_messages_ignored (line 170) | def test_empty_messages_ignored(self): method test_thread_id_from_runtime_context (line 176) | def test_thread_id_from_runtime_context(self): method test_lru_eviction (line 198) | def test_lru_eviction(self): method test_thread_safe_mutations (line 216) | def test_thread_safe_mutations(self): method test_fallback_thread_id_when_missing (line 223) | def test_fallback_thread_id_when_missing(self): FILE: backend/tests/test_mcp_client_config.py function test_build_server_params_stdio_success (line 9) | def test_build_server_params_stdio_success(): function test_build_server_params_stdio_requires_command (line 27) | def test_build_server_params_stdio_requires_command(): function test_build_server_params_http_like_success (line 35) | def test_build_server_params_http_like_success(transport: str): function test_build_server_params_http_like_requires_url (line 52) | def test_build_server_params_http_like_requires_url(transport: str): function test_build_server_params_rejects_unsupported_transport (line 59) | def test_build_server_params_rejects_unsupported_transport(): function test_build_servers_config_returns_empty_when_no_enabled_servers (line 66) | def test_build_servers_config_returns_empty_when_no_enabled_servers(): function test_build_servers_config_skips_invalid_server_and_keeps_valid_ones (line 78) | def test_build_servers_config_skips_invalid_server_and_keeps_valid_ones(): FILE: backend/tests/test_mcp_oauth.py class _MockResponse (line 12) | class _MockResponse: method __init__ (line 13) | def __init__(self, payload: dict[str, Any]): method raise_for_status (line 16) | def raise_for_status(self) -> None: method json (line 19) | def json(self) -> dict[str, Any]: class _MockAsyncClient (line 23) | class _MockAsyncClient: method __init__ (line 24) | def __init__(self, payload: dict[str, Any], post_calls: list[dict[str,... method __aenter__ (line 28) | async def __aenter__(self): method __aexit__ (line 31) | async def __aexit__(self, exc_type, exc, tb): method post (line 34) | async def post(self, url: str, data: dict[str, Any]): function test_oauth_token_manager_fetches_and_caches_token (line 39) | def test_oauth_token_manager_fetches_and_caches_token(monkeypatch): function test_build_oauth_interceptor_injects_authorization_header (line 86) | def test_build_oauth_interceptor_injects_authorization_header(monkeypatch): function test_get_initial_oauth_headers (line 148) | def test_get_initial_oauth_headers(monkeypatch): FILE: backend/tests/test_memory_prompt_injection.py function test_format_memory_includes_facts_section (line 8) | def test_format_memory_includes_facts_section() -> None: function test_format_memory_sorts_facts_by_confidence_desc (line 25) | def test_format_memory_sorts_facts_by_confidence_desc() -> None: function test_format_memory_respects_budget_when_adding_facts (line 40) | def test_format_memory_respects_budget_when_adding_facts(monkeypatch) ->... function test_coerce_confidence_nan_falls_back_to_default (line 71) | def test_coerce_confidence_nan_falls_back_to_default() -> None: function test_coerce_confidence_inf_falls_back_to_default (line 77) | def test_coerce_confidence_inf_falls_back_to_default() -> None: function test_coerce_confidence_valid_values_are_clamped (line 83) | def test_coerce_confidence_valid_values_are_clamped() -> None: function test_format_memory_skips_none_content_facts (line 90) | def test_format_memory_skips_none_content_facts() -> None: function test_format_memory_skips_non_string_content_facts (line 105) | def test_format_memory_skips_non_string_content_facts() -> None: FILE: backend/tests/test_memory_updater.py function _make_memory (line 8) | def _make_memory(facts: list[dict[str, object]] | None = None) -> dict[s... function _memory_config (line 26) | def _memory_config(**overrides: object) -> MemoryConfig: function test_apply_updates_skips_existing_duplicate_and_preserves_removals (line 33) | def test_apply_updates_skips_existing_duplicate_and_preserves_removals()... function test_apply_updates_skips_same_batch_duplicates_and_keeps_source_metadata (line 72) | def test_apply_updates_skips_same_batch_duplicates_and_keeps_source_meta... function test_apply_updates_preserves_threshold_and_max_facts_trimming (line 97) | def test_apply_updates_preserves_threshold_and_max_facts_trimming() -> N... class TestExtractText (line 146) | class TestExtractText: method test_string_passthrough (line 149) | def test_string_passthrough(self): method test_list_single_text_block (line 152) | def test_list_single_text_block(self): method test_list_multiple_text_blocks_joined (line 155) | def test_list_multiple_text_blocks_joined(self): method test_list_plain_strings (line 162) | def test_list_plain_strings(self): method test_list_string_chunks_join_without_separator (line 165) | def test_list_string_chunks_join_without_separator(self): method test_list_mixed_strings_and_blocks (line 169) | def test_list_mixed_strings_and_blocks(self): method test_list_adjacent_string_chunks_then_block (line 176) | def test_list_adjacent_string_chunks_then_block(self): method test_list_skips_non_text_blocks (line 184) | def test_list_skips_non_text_blocks(self): method test_empty_list (line 191) | def test_empty_list(self): method test_list_no_text_blocks (line 194) | def test_list_no_text_blocks(self): method test_non_str_non_list (line 197) | def test_non_str_non_list(self): class TestFormatConversationForUpdate (line 206) | class TestFormatConversationForUpdate: method test_plain_string_messages (line 207) | def test_plain_string_messages(self): method test_list_content_with_plain_strings (line 220) | def test_list_content_with_plain_strings(self): class TestUpdateMemoryStructuredResponse (line 236) | class TestUpdateMemoryStructuredResponse: method _make_mock_model (line 239) | def _make_mock_model(self, content): method test_string_response_parses (line 246) | def test_string_response_parses(self): method test_list_content_response_parses (line 267) | def test_list_content_response_parses(self): FILE: backend/tests/test_memory_upload_filtering.py function _human (line 22) | def _human(text: str) -> HumanMessage: function _ai (line 26) | def _ai(text: str, tool_calls=None) -> AIMessage: class TestFilterMessagesForMemory (line 38) | class TestFilterMessagesForMemory: method test_upload_only_turn_is_excluded (line 41) | def test_upload_only_turn_is_excluded(self): method test_upload_with_real_question_preserves_question (line 51) | def test_upload_with_real_question_preserves_question(self): method test_plain_conversation_passes_through (line 69) | def test_plain_conversation_passes_through(self): method test_tool_messages_are_excluded (line 79) | def test_tool_messages_are_excluded(self): method test_multi_turn_with_upload_in_middle (line 94) | def test_multi_turn_with_upload_in_middle(self): method test_multimodal_content_list_handled (line 116) | def test_multimodal_content_list_handled(self): method test_file_path_not_in_filtered_content (line 127) | def test_file_path_not_in_filtered_content(self): class TestStripUploadMentionsFromMemory (line 142) | class TestStripUploadMentionsFromMemory: method _make_memory (line 143) | def _make_memory(self, summary: str, facts: list[dict] | None = None) ... method test_upload_event_sentence_removed_from_summary (line 152) | def test_upload_event_sentence_removed_from_summary(self): method test_upload_path_sentence_removed_from_summary (line 160) | def test_upload_path_sentence_removed_from_summary(self): method test_legitimate_csv_mention_is_preserved (line 167) | def test_legitimate_csv_mention_is_preserved(self): method test_pdf_export_preference_preserved (line 173) | def test_pdf_export_preference_preserved(self): method test_uploading_a_test_file_removed (line 179) | def test_uploading_a_test_file_removed(self): method test_upload_fact_removed_from_facts (line 189) | def test_upload_fact_removed_from_facts(self): method test_non_upload_facts_preserved (line 202) | def test_non_upload_facts_preserved(self): method test_empty_memory_handled_gracefully (line 211) | def test_empty_memory_handled_gracefully(self): FILE: backend/tests/test_model_config.py function _make_model (line 4) | def _make_model(**overrides) -> ModelConfig: function test_responses_api_fields_are_declared_in_model_schema (line 15) | def test_responses_api_fields_are_declared_in_model_schema(): function test_responses_api_fields_round_trip_in_model_dump (line 20) | def test_responses_api_fields_round_trip_in_model_dump(): FILE: backend/tests/test_model_factory.py function _make_app_config (line 19) | def _make_app_config(models: list[ModelConfig]) -> AppConfig: function _make_model (line 26) | def _make_model( class FakeChatModel (line 51) | class FakeChatModel(BaseChatModel): method __init__ (line 56) | def __init__(self, **kwargs): method _llm_type (line 62) | def _llm_type(self) -> str: method _generate (line 65) | def _generate(self, *args, **kwargs): # type: ignore[override] method _stream (line 68) | def _stream(self, *args, **kwargs): # type: ignore[override] function _patch_factory (line 72) | def _patch_factory(monkeypatch, app_config: AppConfig, model_class=FakeC... function test_uses_first_model_when_name_is_none (line 84) | def test_uses_first_model_when_name_is_none(monkeypatch): function test_raises_when_model_not_found (line 95) | def test_raises_when_model_not_found(monkeypatch): function test_thinking_enabled_raises_when_not_supported_but_when_thinking_enabled_is_set (line 109) | def test_thinking_enabled_raises_when_not_supported_but_when_thinking_en... function test_thinking_enabled_raises_for_empty_when_thinking_enabled_explicitly_set (line 120) | def test_thinking_enabled_raises_for_empty_when_thinking_enabled_explici... function test_thinking_enabled_merges_when_thinking_enabled_settings (line 131) | def test_thinking_enabled_merges_when_thinking_enabled_settings(monkeypa... function test_thinking_disabled_openai_gateway_format (line 148) | def test_thinking_disabled_openai_gateway_format(monkeypatch): function test_thinking_disabled_langchain_anthropic_format (line 180) | def test_thinking_disabled_langchain_anthropic_format(monkeypatch): function test_thinking_disabled_no_when_thinking_enabled_does_nothing (line 214) | def test_thinking_disabled_no_when_thinking_enabled_does_nothing(monkeyp... function test_reasoning_effort_cleared_when_not_supported (line 241) | def test_reasoning_effort_cleared_when_not_supported(monkeypatch): function test_reasoning_effort_preserved_when_supported (line 259) | def test_reasoning_effort_preserved_when_supported(monkeypatch): function test_thinking_shortcut_enables_thinking_when_thinking_enabled (line 294) | def test_thinking_shortcut_enables_thinking_when_thinking_enabled(monkey... function test_thinking_shortcut_disables_thinking_when_thinking_disabled (line 323) | def test_thinking_shortcut_disables_thinking_when_thinking_disabled(monk... function test_thinking_shortcut_merges_with_when_thinking_enabled (line 354) | def test_thinking_shortcut_merges_with_when_thinking_enabled(monkeypatch): function test_thinking_shortcut_not_leaked_into_model_when_disabled (line 387) | def test_thinking_shortcut_not_leaked_into_model_when_disabled(monkeypat... function test_openai_compatible_provider_passes_base_url (line 423) | def test_openai_compatible_provider_passes_base_url(monkeypatch): function test_openai_compatible_provider_multiple_models (line 459) | def test_openai_compatible_provider_multiple_models(monkeypatch): class FakeCodexChatModel (line 511) | class FakeCodexChatModel(FakeChatModel): function test_codex_provider_disables_reasoning_when_thinking_disabled (line 515) | def test_codex_provider_disables_reasoning_when_thinking_disabled(monkey... function test_codex_provider_preserves_explicit_reasoning_effort (line 535) | def test_codex_provider_preserves_explicit_reasoning_effort(monkeypatch): function test_codex_provider_defaults_reasoning_effort_to_medium (line 555) | def test_codex_provider_defaults_reasoning_effort_to_medium(monkeypatch): function test_codex_provider_strips_unsupported_max_tokens (line 575) | def test_codex_provider_strips_unsupported_max_tokens(monkeypatch): function test_openai_responses_api_settings_are_passed_to_chatopenai (line 596) | def test_openai_responses_api_settings_are_passed_to_chatopenai(monkeypa... FILE: backend/tests/test_patched_minimax.py function _make_model (line 6) | def _make_model(**kwargs) -> PatchedChatMiniMax: function test_get_request_payload_preserves_thinking_and_forces_reasoning_split (line 15) | def test_get_request_payload_preserves_thinking_and_forces_reasoning_spl... function test_create_chat_result_maps_reasoning_details_to_reasoning_content (line 24) | def test_create_chat_result_maps_reasoning_details_to_reasoning_content(): function test_create_chat_result_strips_inline_think_tags (line 56) | def test_create_chat_result_strips_inline_think_tags(): function test_convert_chunk_to_generation_chunk_preserves_reasoning_deltas (line 79) | def test_convert_chunk_to_generation_chunk_preserves_reasoning_deltas(): FILE: backend/tests/test_present_file_tool_core_logic.py function _make_runtime (line 9) | def _make_runtime(outputs_path: str) -> SimpleNamespace: function test_present_files_normalizes_host_outputs_path (line 16) | def test_present_files_normalizes_host_outputs_path(tmp_path): function test_present_files_keeps_virtual_outputs_path (line 32) | def test_present_files_keeps_virtual_outputs_path(tmp_path, monkeypatch): function test_present_files_rejects_paths_outside_outputs (line 53) | def test_present_files_rejects_paths_outside_outputs(tmp_path): FILE: backend/tests/test_provisioner_kubeconfig.py function _load_provisioner_module (line 9) | def _load_provisioner_module(): function test_wait_for_kubeconfig_rejects_directory (line 21) | def test_wait_for_kubeconfig_rejects_directory(tmp_path): function test_wait_for_kubeconfig_accepts_file (line 36) | def test_wait_for_kubeconfig_accepts_file(tmp_path): function test_init_k8s_client_rejects_directory_path (line 48) | def test_init_k8s_client_rejects_directory_path(tmp_path): function test_init_k8s_client_uses_file_kubeconfig (line 63) | def test_init_k8s_client_uses_file_kubeconfig(tmp_path, monkeypatch): function test_init_k8s_client_falls_back_to_incluster_when_missing (line 93) | def test_init_k8s_client_falls_back_to_incluster_when_missing(tmp_path, ... FILE: backend/tests/test_readability.py function test_extract_article_falls_back_when_readability_js_fails (line 10) | def test_extract_article_falls_back_when_readability_js_fails(monkeypatch): function test_extract_article_re_raises_unexpected_exception (line 37) | def test_extract_article_re_raises_unexpected_exception(monkeypatch): FILE: backend/tests/test_reflection_resolvers.py function test_resolve_variable_reports_install_hint_for_missing_google_provider (line 9) | def test_resolve_variable_reports_install_hint_for_missing_google_provid... function test_resolve_variable_reports_install_hint_for_missing_google_transitive_dependency (line 25) | def test_resolve_variable_reports_install_hint_for_missing_google_transi... function test_resolve_variable_invalid_path_format (line 44) | def test_resolve_variable_invalid_path_format(): FILE: backend/tests/test_sandbox_tools_security.py function test_replace_virtual_path_maps_virtual_root_and_subpaths (line 29) | def test_replace_virtual_path_maps_virtual_root_and_subpaths() -> None: function test_mask_local_paths_in_output_hides_host_paths (line 40) | def test_mask_local_paths_in_output_hides_host_paths() -> None: function test_mask_local_paths_in_output_hides_skills_host_paths (line 48) | def test_mask_local_paths_in_output_hides_skills_host_paths() -> None: function test_reject_path_traversal_blocks_dotdot (line 64) | def test_reject_path_traversal_blocks_dotdot() -> None: function test_reject_path_traversal_blocks_dotdot_at_start (line 69) | def test_reject_path_traversal_blocks_dotdot_at_start() -> None: function test_reject_path_traversal_blocks_backslash_dotdot (line 74) | def test_reject_path_traversal_blocks_backslash_dotdot() -> None: function test_reject_path_traversal_allows_normal_paths (line 79) | def test_reject_path_traversal_allows_normal_paths() -> None: function test_validate_local_tool_path_rejects_non_virtual_path (line 89) | def test_validate_local_tool_path_rejects_non_virtual_path() -> None: function test_validate_local_tool_path_rejects_bare_virtual_root (line 94) | def test_validate_local_tool_path_rejects_bare_virtual_root() -> None: function test_validate_local_tool_path_allows_user_data_paths (line 100) | def test_validate_local_tool_path_allows_user_data_paths() -> None: function test_validate_local_tool_path_allows_user_data_write (line 107) | def test_validate_local_tool_path_allows_user_data_write() -> None: function test_validate_local_tool_path_rejects_traversal_in_user_data (line 112) | def test_validate_local_tool_path_rejects_traversal_in_user_data() -> None: function test_validate_local_tool_path_rejects_traversal_in_skills (line 118) | def test_validate_local_tool_path_rejects_traversal_in_skills() -> None: function test_validate_local_tool_path_rejects_none_thread_data (line 125) | def test_validate_local_tool_path_rejects_none_thread_data() -> None: function test_resolve_skills_path_resolves_correctly (line 136) | def test_resolve_skills_path_resolves_correctly() -> None: function test_resolve_skills_path_resolves_root (line 146) | def test_resolve_skills_path_resolves_root() -> None: function test_resolve_skills_path_raises_when_not_configured (line 156) | def test_resolve_skills_path_raises_when_not_configured() -> None: function test_resolve_and_validate_user_data_path_resolves_correctly (line 169) | def test_resolve_and_validate_user_data_path_resolves_correctly(tmp_path... function test_resolve_and_validate_user_data_path_blocks_traversal (line 182) | def test_resolve_and_validate_user_data_path_blocks_traversal(tmp_path: ... function test_replace_virtual_paths_in_command_replaces_skills_paths (line 199) | def test_replace_virtual_paths_in_command_replaces_skills_paths() -> None: function test_replace_virtual_paths_in_command_replaces_both (line 211) | def test_replace_virtual_paths_in_command_replaces_both() -> None: function test_validate_local_bash_command_paths_blocks_host_paths (line 228) | def test_validate_local_bash_command_paths_blocks_host_paths() -> None: function test_validate_local_bash_command_paths_allows_virtual_and_system_paths (line 233) | def test_validate_local_bash_command_paths_allows_virtual_and_system_pat... function test_validate_local_bash_command_paths_blocks_traversal_in_user_data (line 240) | def test_validate_local_bash_command_paths_blocks_traversal_in_user_data... function test_validate_local_bash_command_paths_blocks_traversal_in_skills (line 249) | def test_validate_local_bash_command_paths_blocks_traversal_in_skills() ... function test_is_skills_path_recognises_default_prefix (line 262) | def test_is_skills_path_recognises_default_prefix() -> None: function test_validate_local_tool_path_allows_skills_read_only (line 270) | def test_validate_local_tool_path_allows_skills_read_only() -> None: function test_validate_local_tool_path_blocks_skills_write (line 281) | def test_validate_local_tool_path_blocks_skills_write() -> None: function test_validate_local_bash_command_paths_allows_skills_path (line 292) | def test_validate_local_bash_command_paths_allows_skills_path() -> None: function test_validate_local_bash_command_paths_still_blocks_other_paths (line 301) | def test_validate_local_bash_command_paths_still_blocks_other_paths() ->... function test_validate_local_tool_path_skills_custom_container_path (line 308) | def test_validate_local_tool_path_skills_custom_container_path() -> None: FILE: backend/tests/test_serialize_message_content.py class TestSerializeToolMessageContent (line 18) | class TestSerializeToolMessageContent: method test_string_content (line 21) | def test_string_content(self): method test_list_of_blocks_content (line 27) | def test_list_of_blocks_content(self): method test_multiple_text_blocks (line 40) | def test_multiple_text_blocks(self): method test_string_chunks_are_joined_without_newlines (line 53) | def test_string_chunks_are_joined_without_newlines(self): method test_mixed_string_chunks_and_blocks (line 63) | def test_mixed_string_chunks_and_blocks(self): method test_mixed_blocks_with_non_text (line 73) | def test_mixed_blocks_with_non_text(self): method test_empty_list_content (line 86) | def test_empty_list_content(self): method test_plain_string_in_list (line 91) | def test_plain_string_in_list(self): method test_unknown_content_type_falls_back (line 101) | def test_unknown_content_type_falls_back(self): class TestExtractText (line 114) | class TestExtractText: method test_string_passthrough (line 117) | def test_string_passthrough(self): method test_list_text_blocks (line 120) | def test_list_text_blocks(self): method test_empty_list (line 125) | def test_empty_list(self): method test_fallback_non_iterable (line 128) | def test_fallback_non_iterable(self): FILE: backend/tests/test_skills_archive_root.py function _write_skill (line 8) | def _write_skill(skill_dir: Path) -> None: function test_resolve_skill_dir_ignores_macosx_wrapper (line 22) | def test_resolve_skill_dir_ignores_macosx_wrapper(tmp_path: Path) -> None: function test_resolve_skill_dir_ignores_hidden_top_level_entries (line 29) | def test_resolve_skill_dir_ignores_hidden_top_level_entries(tmp_path: Pa... function test_resolve_skill_dir_rejects_archive_with_only_metadata (line 36) | def test_resolve_skill_dir_rejects_archive_with_only_metadata(tmp_path: ... FILE: backend/tests/test_skills_loader.py function _write_skill (line 8) | def _write_skill(skill_dir: Path, name: str, description: str) -> None: function test_get_skills_root_path_points_to_project_root_skills (line 15) | def test_get_skills_root_path_points_to_project_root_skills(): function test_load_skills_discovers_nested_skills_and_sets_container_paths (line 24) | def test_load_skills_discovers_nested_skills_and_sets_container_paths(tm... function test_load_skills_skips_hidden_directories (line 51) | def test_load_skills_skips_hidden_directories(tmp_path: Path): FILE: backend/tests/test_skills_router.py function _write_skill (line 13) | def _write_skill(skill_dir: Path, frontmatter: str) -> None: function test_validate_skill_frontmatter_allows_standard_optional_metadata (line 18) | def test_validate_skill_frontmatter_allows_standard_optional_metadata(tm... function test_validate_skill_frontmatter_still_rejects_unknown_keys (line 42) | def test_validate_skill_frontmatter_still_rejects_unknown_keys(tmp_path:... function test_validate_skill_frontmatter_reads_utf8_on_windows_locale (line 63) | def test_validate_skill_frontmatter_reads_utf8_on_windows_locale(tmp_pat... FILE: backend/tests/test_subagent_executor.py function _setup_executor_classes (line 35) | def _setup_executor_classes(): class MockHumanMessage (line 90) | class MockHumanMessage: method __init__ (line 93) | def __init__(self, content, _classes=None): method _get_real (line 97) | def _get_real(self): class MockAIMessage (line 101) | class MockAIMessage: method __init__ (line 104) | def __init__(self, content, msg_id=None, _classes=None): method _get_real (line 109) | def _get_real(self): function async_iterator (line 116) | async def async_iterator(items): function classes (line 128) | def classes(_setup_executor_classes): function base_config (line 134) | def base_config(classes): function mock_agent (line 146) | def mock_agent(): class _MsgHelper (line 154) | class _MsgHelper: method __init__ (line 157) | def __init__(self, classes): method human (line 160) | def human(self, content): method ai (line 163) | def ai(self, content, msg_id=None): function msg (line 171) | def msg(classes): class TestAsyncExecutionPath (line 181) | class TestAsyncExecutionPath: method test_aexecute_success (line 185) | async def test_aexecute_success(self, classes, base_config, mock_agent... method test_aexecute_collects_ai_messages (line 216) | async def test_aexecute_collects_ai_messages(self, classes, base_confi... method test_aexecute_handles_duplicate_messages (line 244) | async def test_aexecute_handles_duplicate_messages(self, classes, base... method test_aexecute_handles_list_content (line 268) | async def test_aexecute_handles_list_content(self, classes, base_confi... method test_aexecute_handles_agent_exception (line 296) | async def test_aexecute_handles_agent_exception(self, classes, base_co... method test_aexecute_no_final_state (line 317) | async def test_aexecute_no_final_state(self, classes, base_config, moc... method test_aexecute_no_ai_message_in_state (line 337) | async def test_aexecute_no_ai_message_in_state(self, classes, base_con... class TestSyncExecutionPath (line 364) | class TestSyncExecutionPath: method test_execute_runs_async_in_event_loop (line 367) | def test_execute_runs_async_in_event_loop(self, classes, base_config, ... method test_execute_in_thread_pool_context (line 393) | def test_execute_in_thread_pool_context(self, classes, base_config, msg): method test_execute_handles_asyncio_run_failure (line 433) | def test_execute_handles_asyncio_run_failure(self, classes, base_config): method test_execute_with_result_holder (line 453) | def test_execute_with_result_holder(self, classes, base_config, mock_a... class TestAsyncToolSupport (line 492) | class TestAsyncToolSupport: method test_async_tool_called_in_astream (line 496) | async def test_async_tool_called_in_astream(self, classes, base_config... method test_sync_execute_with_async_tools (line 538) | def test_sync_execute_with_async_tools(self, classes, base_config, msg): class TestThreadSafety (line 581) | class TestThreadSafety: method test_multiple_executors_in_parallel (line 584) | def test_multiple_executors_in_parallel(self, classes, base_config, msg): class TestCleanupBackgroundTask (line 635) | class TestCleanupBackgroundTask: method executor_module (line 639) | def executor_module(self, _setup_executor_classes): method test_cleanup_removes_terminal_completed_task (line 648) | def test_cleanup_removes_terminal_completed_task(self, executor_module... method test_cleanup_removes_terminal_failed_task (line 669) | def test_cleanup_removes_terminal_failed_task(self, executor_module, c... method test_cleanup_removes_terminal_timed_out_task (line 688) | def test_cleanup_removes_terminal_timed_out_task(self, executor_module... method test_cleanup_skips_running_task (line 707) | def test_cleanup_skips_running_task(self, executor_module, classes): method test_cleanup_skips_pending_task (line 730) | def test_cleanup_skips_pending_task(self, executor_module, classes): method test_cleanup_handles_unknown_task_gracefully (line 747) | def test_cleanup_handles_unknown_task_gracefully(self, executor_module): method test_cleanup_removes_task_with_completed_at_even_if_running (line 752) | def test_cleanup_removes_task_with_completed_at_even_if_running(self, ... FILE: backend/tests/test_subagent_timeout_config.py function _reset_subagents_config (line 27) | def _reset_subagents_config(timeout_seconds: int = 900, agents: dict | N... class TestSubagentOverrideConfig (line 37) | class TestSubagentOverrideConfig: method test_default_is_none (line 38) | def test_default_is_none(self): method test_explicit_value (line 42) | def test_explicit_value(self): method test_rejects_zero (line 46) | def test_rejects_zero(self): method test_rejects_negative (line 50) | def test_rejects_negative(self): method test_minimum_valid_value (line 54) | def test_minimum_valid_value(self): class TestSubagentsAppConfigDefaults (line 64) | class TestSubagentsAppConfigDefaults: method test_default_timeout (line 65) | def test_default_timeout(self): method test_default_agents_empty (line 69) | def test_default_agents_empty(self): method test_custom_global_timeout (line 73) | def test_custom_global_timeout(self): method test_rejects_zero_timeout (line 77) | def test_rejects_zero_timeout(self): method test_rejects_negative_timeout (line 81) | def test_rejects_negative_timeout(self): class TestGetTimeoutFor (line 91) | class TestGetTimeoutFor: method test_returns_global_default_when_no_override (line 92) | def test_returns_global_default_when_no_override(self): method test_returns_per_agent_override_when_set (line 98) | def test_returns_per_agent_override_when_set(self): method test_other_agents_still_use_global_default (line 105) | def test_other_agents_still_use_global_default(self): method test_agent_with_none_override_falls_back_to_global (line 112) | def test_agent_with_none_override_falls_back_to_global(self): method test_multiple_per_agent_overrides (line 119) | def test_multiple_per_agent_overrides(self): class TestLoadSubagentsConfig (line 136) | class TestLoadSubagentsConfig: method teardown_method (line 137) | def teardown_method(self): method test_load_global_timeout (line 141) | def test_load_global_timeout(self): method test_load_with_per_agent_overrides (line 145) | def test_load_with_per_agent_overrides(self): method test_load_partial_override (line 159) | def test_load_partial_override(self): method test_load_empty_dict_uses_defaults (line 170) | def test_load_empty_dict_uses_defaults(self): method test_load_replaces_previous_config (line 176) | def test_load_replaces_previous_config(self): method test_singleton_returns_same_instance_between_calls (line 183) | def test_singleton_returns_same_instance_between_calls(self): class TestRegistryGetSubagentConfig (line 193) | class TestRegistryGetSubagentConfig: method teardown_method (line 194) | def teardown_method(self): method test_returns_none_for_unknown_agent (line 197) | def test_returns_none_for_unknown_agent(self): method test_returns_config_for_builtin_agents (line 202) | def test_returns_config_for_builtin_agents(self): method test_default_timeout_preserved_when_no_config (line 208) | def test_default_timeout_preserved_when_no_config(self): method test_global_timeout_override_applied (line 215) | def test_global_timeout_override_applied(self): method test_per_agent_timeout_override_applied (line 222) | def test_per_agent_timeout_override_applied(self): method test_per_agent_override_does_not_affect_other_agents (line 234) | def test_per_agent_override_does_not_affect_other_agents(self): method test_builtin_config_object_is_not_mutated (line 246) | def test_builtin_config_object_is_not_mutated(self): method test_config_preserves_other_fields (line 258) | def test_config_preserves_other_fields(self): class TestRegistryListSubagents (line 280) | class TestRegistryListSubagents: method teardown_method (line 281) | def teardown_method(self): method test_lists_both_builtin_agents (line 284) | def test_lists_both_builtin_agents(self): method test_all_returned_configs_get_global_override (line 291) | def test_all_returned_configs_get_global_override(self): method test_per_agent_overrides_reflected_in_list (line 298) | def test_per_agent_overrides_reflected_in_list(self): class TestPollingTimeoutCalculation (line 320) | class TestPollingTimeoutCalculation: method test_polling_timeout_formula (line 333) | def test_polling_timeout_formula(self, timeout_seconds: int, expected_... method test_polling_timeout_exceeds_execution_timeout (line 343) | def test_polling_timeout_exceeds_execution_timeout(self): FILE: backend/tests/test_suggestions_router.py function test_strip_markdown_code_fence_removes_wrapping (line 7) | def test_strip_markdown_code_fence_removes_wrapping(): function test_strip_markdown_code_fence_no_fence_keeps_content (line 12) | def test_strip_markdown_code_fence_no_fence_keeps_content(): function test_parse_json_string_list_filters_invalid_items (line 17) | def test_parse_json_string_list_filters_invalid_items(): function test_parse_json_string_list_rejects_non_list (line 22) | def test_parse_json_string_list_rejects_non_list(): function test_format_conversation_formats_roles (line 27) | def test_format_conversation_formats_roles(): function test_generate_suggestions_parses_and_limits (line 36) | def test_generate_suggestions_parses_and_limits(monkeypatch): function test_generate_suggestions_parses_list_block_content (line 54) | def test_generate_suggestions_parses_list_block_content(monkeypatch): function test_generate_suggestions_parses_output_text_block_content (line 72) | def test_generate_suggestions_parses_output_text_block_content(monkeypat... function test_generate_suggestions_returns_empty_on_model_error (line 90) | def test_generate_suggestions_returns_empty_on_model_error(monkeypatch): FILE: backend/tests/test_task_tool_core_logic.py class FakeSubagentStatus (line 14) | class FakeSubagentStatus(Enum): function _make_runtime (line 23) | def _make_runtime() -> SimpleNamespace: function _make_subagent_config (line 39) | def _make_subagent_config() -> SubagentConfig: function _make_result (line 49) | def _make_result( function test_task_tool_returns_error_for_unknown_subagent (line 64) | def test_task_tool_returns_error_for_unknown_subagent(monkeypatch): function test_task_tool_emits_running_and_completed_events (line 78) | def test_task_tool_emits_running_and_completed_events(monkeypatch): function test_task_tool_returns_failed_message (line 140) | def test_task_tool_returns_failed_message(monkeypatch): function test_task_tool_returns_timed_out_message (line 174) | def test_task_tool_returns_timed_out_message(monkeypatch): function test_task_tool_polling_safety_timeout (line 208) | def test_task_tool_polling_safety_timeout(monkeypatch): function test_cleanup_called_on_completed (line 244) | def test_cleanup_called_on_completed(monkeypatch): function test_cleanup_called_on_failed (line 284) | def test_cleanup_called_on_failed(monkeypatch): function test_cleanup_called_on_timed_out (line 324) | def test_cleanup_called_on_timed_out(monkeypatch): function test_cleanup_not_called_on_polling_safety_timeout (line 364) | def test_cleanup_not_called_on_polling_safety_timeout(monkeypatch): FILE: backend/tests/test_thread_data_middleware.py class TestThreadDataMiddleware (line 7) | class TestThreadDataMiddleware: method test_before_agent_returns_paths_when_thread_id_present_in_context (line 8) | def test_before_agent_returns_paths_when_thread_id_present_in_context(... method test_before_agent_uses_thread_id_from_configurable_when_context_is_none (line 18) | def test_before_agent_uses_thread_id_from_configurable_when_context_is... method test_before_agent_uses_thread_id_from_configurable_when_context_missing_thread_id (line 32) | def test_before_agent_uses_thread_id_from_configurable_when_context_mi... method test_before_agent_raises_clear_error_when_thread_id_missing_everywhere (line 46) | def test_before_agent_raises_clear_error_when_thread_id_missing_everyw... FILE: backend/tests/test_title_generation.py class TestTitleConfig (line 9) | class TestTitleConfig: method test_default_config (line 12) | def test_default_config(self): method test_custom_config (line 20) | def test_custom_config(self): method test_config_validation (line 33) | def test_config_validation(self): method test_get_set_config (line 47) | def test_get_set_config(self): class TestTitleMiddleware (line 63) | class TestTitleMiddleware: method test_middleware_initialization (line 66) | def test_middleware_initialization(self): FILE: backend/tests/test_title_middleware_core_logic.py function _clone_title_config (line 12) | def _clone_title_config(config: TitleConfig) -> TitleConfig: function _set_test_title_config (line 17) | def _set_test_title_config(**overrides) -> TitleConfig: class TestTitleMiddlewareCoreLogic (line 25) | class TestTitleMiddlewareCoreLogic: method setup_method (line 26) | def setup_method(self): method teardown_method (line 30) | def teardown_method(self): method test_should_generate_title_for_first_complete_exchange (line 33) | def test_should_generate_title_for_first_complete_exchange(self): method test_should_not_generate_title_when_disabled_or_already_set (line 45) | def test_should_not_generate_title_when_disabled_or_already_set(self): method test_should_not_generate_title_after_second_user_turn (line 62) | def test_should_not_generate_title_after_second_user_turn(self): method test_generate_title_trims_quotes_and_respects_max_chars (line 76) | def test_generate_title_trims_quotes_and_respects_max_chars(self, monk... method test_generate_title_normalizes_structured_message_and_response_content (line 96) | def test_generate_title_normalizes_structured_message_and_response_con... method test_generate_title_fallback_when_model_fails (line 127) | def test_generate_title_fallback_when_model_fails(self, monkeypatch): method test_aafter_model_delegates_to_async_helper (line 147) | def test_aafter_model_delegates_to_async_helper(self, monkeypatch): method test_after_model_sync_delegates_to_sync_helper (line 157) | def test_after_model_sync_delegates_to_sync_helper(self, monkeypatch): method test_sync_generate_title_with_model (line 167) | def test_sync_generate_title_with_model(self, monkeypatch): method test_empty_title_falls_back (line 185) | def test_empty_title_falls_back(self, monkeypatch): FILE: backend/tests/test_token_usage.py class TestSerializeMessageUsageMetadata (line 16) | class TestSerializeMessageUsageMetadata: method test_ai_message_with_usage_metadata (line 19) | def test_ai_message_with_usage_metadata(self): method test_ai_message_without_usage_metadata (line 33) | def test_ai_message_without_usage_metadata(self): method test_tool_message_never_has_usage_metadata (line 39) | def test_tool_message_never_has_usage_metadata(self): method test_human_message_never_has_usage_metadata (line 45) | def test_human_message_never_has_usage_metadata(self): method test_ai_message_with_tool_calls_and_usage (line 51) | def test_ai_message_with_tool_calls_and_usage(self): method test_ai_message_with_zero_usage (line 63) | def test_ai_message_with_zero_usage(self): class TestCumulativeUsageTracking (line 83) | class TestCumulativeUsageTracking: method test_single_message_usage (line 86) | def test_single_message_usage(self): method test_multiple_messages_usage (line 95) | def test_multiple_messages_usage(self): method test_missing_usage_keys_treated_as_zero (line 109) | def test_missing_usage_keys_treated_as_zero(self): method test_empty_usage_metadata_stays_zero (line 118) | def test_empty_usage_metadata_stays_zero(self): function _make_agent_mock (line 133) | def _make_agent_mock(chunks): function _mock_app_config (line 140) | def _mock_app_config(): class TestStreamUsageIntegration (line 153) | class TestStreamUsageIntegration: method _make_client (line 156) | def _make_client(self): method test_stream_emits_usage_in_messages_tuple (line 160) | def test_stream_emits_usage_in_messages_tuple(self): method test_stream_cumulative_usage_in_end_event (line 195) | def test_stream_cumulative_usage_in_end_event(self): method test_stream_no_usage_metadata_no_usage_in_events (line 231) | def test_stream_no_usage_metadata_no_usage_in_events(self): method test_stream_usage_with_tool_calls (line 264) | def test_stream_usage_with_tool_calls(self): FILE: backend/tests/test_tool_error_handling_middleware.py function _request (line 10) | def _request(name: str = "web_search", tool_call_id: str | None = "tc-1"): function test_wrap_tool_call_passthrough_on_success (line 17) | def test_wrap_tool_call_passthrough_on_success(): function test_wrap_tool_call_returns_error_tool_message_on_exception (line 27) | def test_wrap_tool_call_returns_error_tool_message_on_exception(): function test_wrap_tool_call_uses_fallback_tool_call_id_when_missing (line 44) | def test_wrap_tool_call_uses_fallback_tool_call_id_when_missing(): function test_wrap_tool_call_reraises_graph_interrupt (line 59) | def test_wrap_tool_call_reraises_graph_interrupt(): function test_awrap_tool_call_returns_error_tool_message_on_exception (line 71) | async def test_awrap_tool_call_returns_error_tool_message_on_exception(): function test_awrap_tool_call_reraises_graph_interrupt (line 88) | async def test_awrap_tool_call_reraises_graph_interrupt(): FILE: backend/tests/test_tool_search.py function _make_mock_tool (line 20) | def _make_mock_tool(name: str, description: str): function registry (line 33) | def registry(): function _reset_singleton (line 46) | def _reset_singleton(): class TestToolSearchConfig (line 56) | class TestToolSearchConfig: method test_default_disabled (line 57) | def test_default_disabled(self): method test_enabled (line 61) | def test_enabled(self): method test_load_from_dict (line 65) | def test_load_from_dict(self): method test_load_from_empty_dict (line 69) | def test_load_from_empty_dict(self): class TestDeferredToolRegistry (line 77) | class TestDeferredToolRegistry: method test_register_and_len (line 78) | def test_register_and_len(self, registry): method test_entries (line 81) | def test_entries(self, registry): method test_search_select_single (line 86) | def test_search_select_single(self, registry): method test_search_select_multiple (line 91) | def test_search_select_multiple(self, registry): method test_search_select_nonexistent (line 96) | def test_search_select_nonexistent(self, registry): method test_search_plus_keyword (line 100) | def test_search_plus_keyword(self, registry): method test_search_plus_keyword_with_ranking (line 105) | def test_search_plus_keyword_with_ranking(self, registry): method test_search_regex_keyword (line 111) | def test_search_regex_keyword(self, registry): method test_search_regex_description (line 117) | def test_search_regex_description(self, registry): method test_search_regex_case_insensitive (line 122) | def test_search_regex_case_insensitive(self, registry): method test_search_invalid_regex_falls_back_to_literal (line 126) | def test_search_invalid_regex_falls_back_to_literal(self, registry): method test_search_name_match_ranks_higher (line 131) | def test_search_name_match_ranks_higher(self, registry): method test_search_max_results (line 139) | def test_search_max_results(self): method test_search_empty_registry (line 146) | def test_search_empty_registry(self): method test_empty_registry_len (line 150) | def test_empty_registry_len(self): class TestSingleton (line 158) | class TestSingleton: method test_default_none (line 159) | def test_default_none(self): method test_set_and_get (line 162) | def test_set_and_get(self, registry): method test_reset (line 166) | def test_reset(self, registry): class TestToolSearchTool (line 175) | class TestToolSearchTool: method test_no_registry (line 176) | def test_no_registry(self): method test_no_match (line 182) | def test_no_match(self, registry): method test_returns_valid_json (line 189) | def test_returns_valid_json(self, registry): method test_returns_openai_function_format (line 199) | def test_returns_openai_function_format(self, registry): method test_keyword_search_returns_json (line 211) | def test_keyword_search_returns_json(self, registry): class TestDeferredToolsPromptSection (line 225) | class TestDeferredToolsPromptSection: method _mock_app_config (line 227) | def _mock_app_config(self, monkeypatch): method test_empty_when_disabled (line 237) | def test_empty_when_disabled(self): method test_empty_when_enabled_but_no_registry (line 244) | def test_empty_when_enabled_but_no_registry(self, monkeypatch): method test_empty_when_enabled_but_empty_registry (line 252) | def test_empty_when_enabled_but_empty_registry(self, monkeypatch): method test_lists_tool_names (line 261) | def test_lists_tool_names(self, registry, monkeypatch): class TestDeferredToolFilterMiddleware (line 280) | class TestDeferredToolFilterMiddleware: method _ensure_middlewares_package (line 282) | def _ensure_middlewares_package(self): method test_filters_deferred_tools (line 300) | def test_filters_deferred_tools(self, registry): method test_no_op_when_no_registry (line 323) | def test_no_op_when_no_registry(self): method test_preserves_dict_tools (line 342) | def test_preserves_dict_tools(self, registry): FILE: backend/tests/test_tracing_config.py function _reset_tracing_cache (line 8) | def _reset_tracing_cache() -> None: function test_prefers_langsmith_env_names (line 12) | def test_prefers_langsmith_env_names(monkeypatch): function test_falls_back_to_langchain_env_names (line 28) | def test_falls_back_to_langchain_env_names(monkeypatch): function test_langsmith_tracing_false_overrides_langchain_tracing_v2_true (line 49) | def test_langsmith_tracing_false_overrides_langchain_tracing_v2_true(mon... function test_defaults_when_project_not_set (line 62) | def test_defaults_when_project_not_set(monkeypatch): FILE: backend/tests/test_uploads_middleware_core_logic.py function _middleware (line 26) | def _middleware(tmp_path: Path) -> UploadsMiddleware: function _runtime (line 30) | def _runtime(thread_id: str | None = THREAD_ID) -> MagicMock: function _uploads_dir (line 36) | def _uploads_dir(tmp_path: Path, thread_id: str = THREAD_ID) -> Path: function _human (line 42) | def _human(content, files=None, **extra_kwargs): class TestFilesFromKwargs (line 54) | class TestFilesFromKwargs: method test_returns_none_when_files_field_absent (line 55) | def test_returns_none_when_files_field_absent(self, tmp_path): method test_returns_none_for_empty_files_list (line 60) | def test_returns_none_for_empty_files_list(self, tmp_path): method test_returns_none_for_non_list_files (line 65) | def test_returns_none_for_non_list_files(self, tmp_path): method test_skips_non_dict_entries (line 70) | def test_skips_non_dict_entries(self, tmp_path): method test_skips_entries_with_empty_filename (line 75) | def test_skips_entries_with_empty_filename(self, tmp_path): method test_always_uses_virtual_path (line 80) | def test_always_uses_virtual_path(self, tmp_path): method test_skips_file_that_does_not_exist_on_disk (line 91) | def test_skips_file_that_does_not_exist_on_disk(self, tmp_path): method test_accepts_file_that_exists_on_disk (line 98) | def test_accepts_file_that_exists_on_disk(self, tmp_path): method test_skips_nonexistent_but_accepts_existing_in_mixed_list (line 109) | def test_skips_nonexistent_but_accepts_existing_in_mixed_list(self, tm... method test_no_existence_check_when_uploads_dir_is_none (line 124) | def test_no_existence_check_when_uploads_dir_is_none(self, tmp_path): method test_size_is_coerced_to_int (line 132) | def test_size_is_coerced_to_int(self, tmp_path): method test_missing_size_defaults_to_zero (line 139) | def test_missing_size_defaults_to_zero(self, tmp_path): class TestCreateFilesMessage (line 152) | class TestCreateFilesMessage: method _new_file (line 153) | def _new_file(self, filename="notes.txt", size=1024): method test_new_files_section_always_present (line 156) | def test_new_files_section_always_present(self, tmp_path): method test_historical_section_present_only_when_non_empty (line 165) | def test_historical_section_present_only_when_non_empty(self, tmp_path): method test_size_formatting_kb (line 176) | def test_size_formatting_kb(self, tmp_path): method test_size_formatting_mb (line 181) | def test_size_formatting_mb(self, tmp_path): method test_read_file_instruction_included (line 186) | def test_read_file_instruction_included(self, tmp_path): method test_empty_new_files_produces_empty_marker (line 191) | def test_empty_new_files_produces_empty_marker(self, tmp_path): class TestBeforeAgent (line 204) | class TestBeforeAgent: method _state (line 205) | def _state(self, *messages): method test_returns_none_when_messages_empty (line 208) | def test_returns_none_when_messages_empty(self, tmp_path): method test_returns_none_when_last_message_is_not_human (line 212) | def test_returns_none_when_last_message_is_not_human(self, tmp_path): method test_returns_none_when_no_files_in_kwargs (line 217) | def test_returns_none_when_no_files_in_kwargs(self, tmp_path): method test_returns_none_when_all_files_missing_from_disk (line 222) | def test_returns_none_when_all_files_missing_from_disk(self, tmp_path): method test_injects_uploaded_files_tag_into_string_content (line 229) | def test_injects_uploaded_files_tag_into_string_content(self, tmp_path): method test_injects_uploaded_files_tag_into_list_content (line 245) | def test_injects_uploaded_files_tag_into_list_content(self, tmp_path): method test_preserves_additional_kwargs_on_updated_message (line 262) | def test_preserves_additional_kwargs_on_updated_message(self, tmp_path): method test_uploaded_files_returned_in_state_update (line 277) | def test_uploaded_files_returned_in_state_update(self, tmp_path): method test_historical_files_from_uploads_dir_excluding_new (line 295) | def test_historical_files_from_uploads_dir_excluding_new(self, tmp_path): method test_no_historical_section_when_upload_dir_is_empty (line 311) | def test_no_historical_section_when_upload_dir_is_empty(self, tmp_path): method test_no_historical_scan_when_thread_id_is_none (line 322) | def test_no_historical_scan_when_thread_id_is_none(self, tmp_path): method test_message_id_preserved_on_updated_message (line 332) | def test_message_id_preserved_on_updated_message(self, tmp_path): FILE: backend/tests/test_uploads_router.py function test_upload_files_writes_thread_storage_and_skips_local_sandbox_sync (line 11) | def test_upload_files_writes_thread_storage_and_skips_local_sandbox_sync... function test_upload_files_syncs_non_local_sandbox_and_marks_markdown_file (line 35) | def test_upload_files_syncs_non_local_sandbox_and_marks_markdown_file(tm... function test_upload_files_rejects_dotdot_and_dot_filenames (line 70) | def test_upload_files_rejects_dotdot_and_dot_filenames(tmp_path): function test_delete_uploaded_file_removes_generated_markdown_companion (line 101) | def test_delete_uploaded_file_removes_generated_markdown_companion(tmp_p... FILE: docker/provisioner/app.py function _init_k8s_client (line 77) | def _init_k8s_client() -> k8s_client.CoreV1Api: function _wait_for_kubeconfig (line 122) | def _wait_for_kubeconfig(timeout: int = 30) -> None: function _ensure_namespace (line 146) | def _ensure_namespace() -> None: function lifespan (line 172) | async def lifespan(_app: FastAPI): class CreateSandboxRequest (line 187) | class CreateSandboxRequest(BaseModel): class SandboxResponse (line 192) | class SandboxResponse(BaseModel): function _pod_name (line 201) | def _pod_name(sandbox_id: str) -> str: function _svc_name (line 205) | def _svc_name(sandbox_id: str) -> str: function _sandbox_url (line 209) | def _sandbox_url(node_port: int) -> str: function _build_pod (line 214) | def _build_pod(sandbox_id: str, thread_id: str) -> k8s_client.V1Pod: function _build_service (line 311) | def _build_service(sandbox_id: str) -> k8s_client.V1Service: function _get_node_port (line 342) | def _get_node_port(sandbox_id: str) -> int | None: function _get_pod_phase (line 354) | def _get_pod_phase(sandbox_id: str) -> str: function health (line 367) | async def health(): function create_sandbox (line 373) | async def create_sandbox(req: CreateSandboxRequest): function destroy_sandbox (line 441) | async def destroy_sandbox(sandbox_id: str): function get_sandbox (line 470) | async def get_sandbox(sandbox_id: str): function list_sandboxes (line 484) | async def list_sandboxes(): FILE: frontend/public/demo/threads/5aa47db1-d0cb-4eb9-aea5-3dac1b371c5a/user-data/outputs/jiangsu-football/js/data.js function getTeamById (line 783) | function getTeamById(teamId) { function formatDate (line 788) | function formatDate(dateString) { function formatTime (line 795) | function formatTime(timeString) { FILE: frontend/public/demo/threads/5aa47db1-d0cb-4eb9-aea5-3dac1b371c5a/user-data/outputs/jiangsu-football/js/main.js function initLoader (line 39) | function initLoader() { function initThemeToggle (line 54) | function initThemeToggle() { function initNavigation (line 88) | function initNavigation() { function initScrollSpy (line 120) | function initScrollSpy() { function renderTeams (line 146) | function renderTeams() { function renderStandings (line 192) | function renderStandings() { function renderFixtures (line 236) | function renderFixtures() { function renderStats (line 317) | function renderStats() { function renderScorers (line 323) | function renderScorers() { function renderAssists (line 359) | function renderAssists() { function renderTeamStats (line 395) | function renderTeamStats() { function renderNews (line 451) | function renderNews() { function initTabs (line 494) | function initTabs() { function initMobileMenu (line 537) | function initMobileMenu() { function darkenColor (line 565) | function darkenColor(color, percent) { function formatDate (line 581) | function formatDate(dateString) { function getTeamById (line 589) | function getTeamById(teamId) { FILE: frontend/public/demo/threads/c02bb4d5-4202-490e-ae8f-ff4864fc0d2e/user-data/outputs/script.js function initNavigation (line 20) | function initNavigation() { function initQuotesSlider (line 41) | function initQuotesSlider() { function initScrollReveal (line 94) | function initScrollReveal() { function initSmoothScroll (line 135) | function initSmoothScroll() { FILE: frontend/scripts/save-demo.js function main (line 6) | async function main() { function copyFolder (line 51) | function copyFolder(relPath, rootPath, backendRootPath) { FILE: frontend/src/app/layout.tsx function RootLayout (line 15) | async function RootLayout({ FILE: frontend/src/app/mock/api/mcp/config/route.ts function GET (line 1) | function GET() { FILE: frontend/src/app/mock/api/models/route.ts function GET (line 1) | function GET() { FILE: frontend/src/app/mock/api/skills/route.ts function GET (line 1) | function GET() { FILE: frontend/src/app/mock/api/threads/[thread_id]/artifacts/[[...artifact_path]]/route.ts function GET (line 6) | async function GET( FILE: frontend/src/app/mock/api/threads/[thread_id]/history/route.ts function POST (line 6) | async function POST( FILE: frontend/src/app/mock/api/threads/search/route.ts type ThreadSearchRequest (line 4) | type ThreadSearchRequest = { type MockThreadSearchResult (line 11) | type MockThreadSearchResult = Record & { function POST (line 16) | async function POST(request: Request) { FILE: frontend/src/app/page.tsx function LandingPage (line 10) | function LandingPage() { FILE: frontend/src/app/workspace/agents/[agent_name]/chats/[thread_id]/layout.tsx function AgentChatLayout (line 7) | function AgentChatLayout({ FILE: frontend/src/app/workspace/agents/[agent_name]/chats/[thread_id]/page.tsx function AgentChatPage (line 28) | function AgentChatPage() { FILE: frontend/src/app/workspace/agents/new/page.tsx type Step (line 25) | type Step = "name" | "chat"; constant NAME_RE (line 27) | const NAME_RE = /^[A-Za-z0-9-]+$/; function NewAgentPage (line 29) | function NewAgentPage() { FILE: frontend/src/app/workspace/agents/page.tsx function AgentsPage (line 3) | function AgentsPage() { FILE: frontend/src/app/workspace/chats/[thread_id]/layout.tsx function ChatLayout (line 7) | function ChatLayout({ FILE: frontend/src/app/workspace/chats/[thread_id]/page.tsx function ChatPage (line 27) | function ChatPage() { FILE: frontend/src/app/workspace/chats/page.tsx function ChatsPage (line 18) | function ChatsPage() { FILE: frontend/src/app/workspace/layout.tsx function WorkspaceLayout (line 13) | function WorkspaceLayout({ FILE: frontend/src/app/workspace/page.tsx function WorkspacePage (line 8) | function WorkspacePage() { FILE: frontend/src/components/ai-elements/artifact.tsx type ArtifactProps (line 14) | type ArtifactProps = HTMLAttributes; type ArtifactHeaderProps (line 26) | type ArtifactHeaderProps = HTMLAttributes; type ArtifactCloseProps (line 41) | type ArtifactCloseProps = ComponentProps; type ArtifactTitleProps (line 65) | type ArtifactTitleProps = HTMLAttributes; type ArtifactDescriptionProps (line 74) | type ArtifactDescriptionProps = HTMLAttributes; type ArtifactActionsProps (line 83) | type ArtifactActionsProps = HTMLAttributes; type ArtifactActionProps (line 92) | type ArtifactActionProps = ComponentProps & { type ArtifactContentProps (line 140) | type ArtifactContentProps = HTMLAttributes; FILE: frontend/src/components/ai-elements/canvas.tsx type CanvasProps (line 5) | type CanvasProps = ReactFlowProps & { FILE: frontend/src/components/ai-elements/chain-of-thought.tsx type ChainOfThoughtContextValue (line 26) | type ChainOfThoughtContextValue = { type ChainOfThoughtProps (line 45) | type ChainOfThoughtProps = ComponentProps<"div"> & { type ChainOfThoughtHeaderProps (line 81) | type ChainOfThoughtHeaderProps = ComponentProps< type ChainOfThoughtStepProps (line 116) | type ChainOfThoughtStepProps = ComponentProps<"div"> & { type ChainOfThoughtSearchResultsProps (line 165) | type ChainOfThoughtSearchResultsProps = ComponentProps<"div">; type ChainOfThoughtSearchResultProps (line 179) | type ChainOfThoughtSearchResultProps = ComponentProps; type ChainOfThoughtContentProps (line 193) | type ChainOfThoughtContentProps = ComponentProps< type ChainOfThoughtImageProps (line 218) | type ChainOfThoughtImageProps = ComponentProps<"div"> & { FILE: frontend/src/components/ai-elements/checkpoint.tsx type CheckpointProps (line 14) | type CheckpointProps = HTMLAttributes; type CheckpointIconProps (line 30) | type CheckpointIconProps = LucideProps; type CheckpointTriggerProps (line 41) | type CheckpointTriggerProps = ComponentProps & { FILE: frontend/src/components/ai-elements/code-block.tsx type CodeBlockProps (line 17) | type CodeBlockProps = HTMLAttributes & { type CodeBlockContextType (line 23) | type CodeBlockContextType = { method line (line 33) | line(node, line) { function highlightCode (line 52) | async function highlightCode( type CodeBlockCopyButtonProps (line 132) | type CodeBlockCopyButtonProps = ComponentProps & { FILE: frontend/src/components/ai-elements/connection.tsx constant HALF (line 3) | const HALF = 0.5; FILE: frontend/src/components/ai-elements/context.tsx constant PERCENT_MAX (line 15) | const PERCENT_MAX = 100; constant ICON_RADIUS (line 16) | const ICON_RADIUS = 10; constant ICON_VIEWBOX (line 17) | const ICON_VIEWBOX = 24; constant ICON_CENTER (line 18) | const ICON_CENTER = 12; constant ICON_STROKE_WIDTH (line 19) | const ICON_STROKE_WIDTH = 2; type ModelId (line 21) | type ModelId = string; type ContextSchema (line 23) | type ContextSchema = { type ContextProps (line 42) | type ContextProps = ComponentProps & ContextSchema; type ContextTriggerProps (line 104) | type ContextTriggerProps = ComponentProps; type ContextContentProps (line 128) | type ContextContentProps = ComponentProps; type ContextContentHeaderProps (line 140) | type ContextContentHeaderProps = ComponentProps<"div">; type ContextContentBodyProps (line 179) | type ContextContentBodyProps = ComponentProps<"div">; type ContextContentFooterProps (line 191) | type ContextContentFooterProps = ComponentProps<"div">; type ContextInputUsageProps (line 231) | type ContextInputUsageProps = ComponentProps<"div">; type ContextOutputUsageProps (line 271) | type ContextOutputUsageProps = ComponentProps<"div">; type ContextReasoningUsageProps (line 311) | type ContextReasoningUsageProps = ComponentProps<"div">; type ContextCacheUsageProps (line 351) | type ContextCacheUsageProps = ComponentProps<"div">; FILE: frontend/src/components/ai-elements/controls.tsx type ControlsProps (line 7) | type ControlsProps = ComponentProps; FILE: frontend/src/components/ai-elements/conversation.tsx type ConversationProps (line 10) | type ConversationProps = ComponentProps; type ConversationContentProps (line 22) | type ConversationContentProps = ComponentProps< type ConversationEmptyStateProps (line 36) | type ConversationEmptyStateProps = ComponentProps<"div"> & { type ConversationScrollButtonProps (line 71) | type ConversationScrollButtonProps = ComponentProps; FILE: frontend/src/components/ai-elements/image.tsx type ImageProps (line 4) | type ImageProps = Experimental_GeneratedImage & { FILE: frontend/src/components/ai-elements/loader.tsx type LoaderIconProps (line 4) | type LoaderIconProps = { type LoaderProps (line 82) | type LoaderProps = HTMLAttributes & { FILE: frontend/src/components/ai-elements/message.tsx type MessageProps (line 23) | type MessageProps = HTMLAttributes & { type MessageContentProps (line 38) | type MessageContentProps = HTMLAttributes; type MessageActionsProps (line 59) | type MessageActionsProps = ComponentProps<"div">; type MessageActionProps (line 71) | type MessageActionProps = ComponentProps & { type MessageBranchContextType (line 107) | type MessageBranchContextType = { type MessageBranchProps (line 132) | type MessageBranchProps = HTMLAttributes & { type MessageBranchContentProps (line 182) | type MessageBranchContentProps = HTMLAttributes; type MessageBranchSelectorProps (line 212) | type MessageBranchSelectorProps = HTMLAttributes & { type MessageBranchPreviousProps (line 237) | type MessageBranchPreviousProps = ComponentProps; type MessageBranchNextProps (line 260) | type MessageBranchNextProps = ComponentProps; type MessageBranchPageProps (line 284) | type MessageBranchPageProps = HTMLAttributes; type MessageResponseProps (line 305) | type MessageResponseProps = ComponentProps; type MessageAttachmentProps (line 322) | type MessageAttachmentProps = HTMLAttributes & { function MessageAttachment (line 328) | function MessageAttachment({ type MessageAttachmentsProps (line 406) | type MessageAttachmentsProps = ComponentProps<"div">; function MessageAttachments (line 408) | function MessageAttachments({ type MessageToolbarProps (line 430) | type MessageToolbarProps = ComponentProps<"div">; FILE: frontend/src/components/ai-elements/model-selector.tsx type ModelSelectorProps (line 21) | type ModelSelectorProps = ComponentProps; type ModelSelectorTriggerProps (line 27) | type ModelSelectorTriggerProps = ComponentProps; type ModelSelectorContentProps (line 33) | type ModelSelectorContentProps = ComponentProps & { type ModelSelectorDialogProps (line 51) | type ModelSelectorDialogProps = ComponentProps; type ModelSelectorInputProps (line 57) | type ModelSelectorInputProps = ComponentProps; type ModelSelectorListProps (line 66) | type ModelSelectorListProps = ComponentProps; type ModelSelectorEmptyProps (line 72) | type ModelSelectorEmptyProps = ComponentProps; type ModelSelectorGroupProps (line 78) | type ModelSelectorGroupProps = ComponentProps; type ModelSelectorItemProps (line 84) | type ModelSelectorItemProps = ComponentProps; type ModelSelectorShortcutProps (line 90) | type ModelSelectorShortcutProps = ComponentProps; type ModelSelectorSeparatorProps (line 96) | type ModelSelectorSeparatorProps = ComponentProps< type ModelSelectorLogoProps (line 104) | type ModelSelectorLogoProps = Omit< type ModelSelectorLogoGroupProps (line 183) | type ModelSelectorLogoGroupProps = ComponentProps<"div">; type ModelSelectorNameProps (line 198) | type ModelSelectorNameProps = ComponentProps<"span">; FILE: frontend/src/components/ai-elements/node.tsx type NodeProps (line 14) | type NodeProps = ComponentProps & { type NodeHeaderProps (line 35) | type NodeHeaderProps = ComponentProps; type NodeTitleProps (line 44) | type NodeTitleProps = ComponentProps; type NodeDescriptionProps (line 48) | type NodeDescriptionProps = ComponentProps; type NodeActionProps (line 54) | type NodeActionProps = ComponentProps; type NodeContentProps (line 58) | type NodeContentProps = ComponentProps; type NodeFooterProps (line 64) | type NodeFooterProps = ComponentProps; FILE: frontend/src/components/ai-elements/open-in-chat.tsx type OpenInProps (line 196) | type OpenInProps = ComponentProps & { type OpenInContentProps (line 206) | type OpenInContentProps = ComponentProps; type OpenInItemProps (line 216) | type OpenInItemProps = ComponentProps; type OpenInLabelProps (line 222) | type OpenInLabelProps = ComponentProps; type OpenInSeparatorProps (line 228) | type OpenInSeparatorProps = ComponentProps; type OpenInTriggerProps (line 234) | type OpenInTriggerProps = ComponentProps; type OpenInChatGPTProps (line 247) | type OpenInChatGPTProps = ComponentProps; type OpenInClaudeProps (line 267) | type OpenInClaudeProps = ComponentProps; type OpenInT3Props (line 287) | type OpenInT3Props = ComponentProps; type OpenInSciraProps (line 307) | type OpenInSciraProps = ComponentProps; type OpenInv0Props (line 327) | type OpenInv0Props = ComponentProps; type OpenInCursorProps (line 347) | type OpenInCursorProps = ComponentProps; FILE: frontend/src/components/ai-elements/panel.tsx type PanelProps (line 5) | type PanelProps = ComponentProps; FILE: frontend/src/components/ai-elements/plan.tsx type PlanContextValue (line 24) | type PlanContextValue = { type PlanProps (line 38) | type PlanProps = ComponentProps & { type PlanHeaderProps (line 55) | type PlanHeaderProps = ComponentProps; type PlanTitleProps (line 65) | type PlanTitleProps = Omit< type PlanDescriptionProps (line 82) | type PlanDescriptionProps = Omit< type PlanActionProps (line 107) | type PlanActionProps = ComponentProps; type PlanContentProps (line 113) | type PlanContentProps = ComponentProps; type PlanFooterProps (line 121) | type PlanFooterProps = ComponentProps<"div">; type PlanTriggerProps (line 127) | type PlanTriggerProps = ComponentProps; FILE: frontend/src/components/ai-elements/prompt-input.tsx type AttachmentsContext (line 78) | type AttachmentsContext = { type TextInputContext (line 87) | type TextInputContext = { type PromptInputControllerProps (line 93) | type PromptInputControllerProps = { type PromptInputProviderProps (line 137) | type PromptInputProviderProps = PropsWithChildren<{ function PromptInputProvider (line 145) | function PromptInputProvider({ type PromptInputAttachmentProps (line 280) | type PromptInputAttachmentProps = HTMLAttributes & { function PromptInputAttachment (line 285) | function PromptInputAttachment({ type PromptInputAttachmentsProps (line 376) | type PromptInputAttachmentsProps = Omit< function PromptInputAttachments (line 383) | function PromptInputAttachments({ type PromptInputActionAddAttachmentsProps (line 408) | type PromptInputActionAddAttachmentsProps = ComponentProps< type PromptInputMessage (line 433) | type PromptInputMessage = { type PromptInputProps (line 438) | type PromptInputProps = Omit< type PromptInputBodyProps (line 811) | type PromptInputBodyProps = HTMLAttributes; type PromptInputTextareaProps (line 820) | type PromptInputTextareaProps = ComponentProps< type PromptInputHeaderProps (line 921) | type PromptInputHeaderProps = Omit< type PromptInputFooterProps (line 937) | type PromptInputFooterProps = Omit< type PromptInputToolsProps (line 953) | type PromptInputToolsProps = HTMLAttributes; type PromptInputButtonProps (line 962) | type PromptInputButtonProps = ComponentProps; type PromptInputActionMenuProps (line 981) | type PromptInputActionMenuProps = ComponentProps; type PromptInputActionMenuTriggerProps (line 986) | type PromptInputActionMenuTriggerProps = PromptInputButtonProps; type PromptInputActionMenuContentProps (line 1000) | type PromptInputActionMenuContentProps = ComponentProps< type PromptInputActionMenuItemProps (line 1010) | type PromptInputActionMenuItemProps = ComponentProps< type PromptInputSubmitProps (line 1023) | type PromptInputSubmitProps = ComponentProps & { type SpeechRecognition (line 1059) | interface SpeechRecognition extends EventTarget { type SpeechRecognitionEvent (line 1075) | interface SpeechRecognitionEvent extends Event { type SpeechRecognitionResultList (line 1080) | type SpeechRecognitionResultList = { type SpeechRecognitionResult (line 1086) | type SpeechRecognitionResult = { type SpeechRecognitionAlternative (line 1093) | type SpeechRecognitionAlternative = { type SpeechRecognitionErrorEvent (line 1098) | interface SpeechRecognitionErrorEvent extends Event { type Window (line 1103) | interface Window { type PromptInputSpeechButtonProps (line 1113) | type PromptInputSpeechButtonProps = ComponentProps< type PromptInputSelectProps (line 1219) | type PromptInputSelectProps = ComponentProps; type PromptInputSelectTriggerProps (line 1225) | type PromptInputSelectTriggerProps = ComponentProps< type PromptInputSelectContentProps (line 1243) | type PromptInputSelectContentProps = ComponentProps< type PromptInputSelectItemProps (line 1254) | type PromptInputSelectItemProps = ComponentProps; type PromptInputSelectValueProps (line 1263) | type PromptInputSelectValueProps = ComponentProps; type PromptInputHoverCardProps (line 1272) | type PromptInputHoverCardProps = ComponentProps; type PromptInputHoverCardTriggerProps (line 1282) | type PromptInputHoverCardTriggerProps = ComponentProps< type PromptInputHoverCardContentProps (line 1290) | type PromptInputHoverCardContentProps = ComponentProps< type PromptInputTabsListProps (line 1301) | type PromptInputTabsListProps = HTMLAttributes; type PromptInputTabProps (line 1308) | type PromptInputTabProps = HTMLAttributes; type PromptInputTabLabelProps (line 1315) | type PromptInputTabLabelProps = HTMLAttributes; type PromptInputTabBodyProps (line 1330) | type PromptInputTabBodyProps = HTMLAttributes; type PromptInputTabItemProps (line 1339) | type PromptInputTabItemProps = HTMLAttributes; type PromptInputCommandProps (line 1354) | type PromptInputCommandProps = ComponentProps; type PromptInputCommandInputProps (line 1361) | type PromptInputCommandInputProps = ComponentProps; type PromptInputCommandListProps (line 1370) | type PromptInputCommandListProps = ComponentProps; type PromptInputCommandEmptyProps (line 1379) | type PromptInputCommandEmptyProps = ComponentProps; type PromptInputCommandGroupProps (line 1388) | type PromptInputCommandGroupProps = ComponentProps; type PromptInputCommandItemProps (line 1397) | type PromptInputCommandItemProps = ComponentProps; type PromptInputCommandSeparatorProps (line 1406) | type PromptInputCommandSeparatorProps = ComponentProps< FILE: frontend/src/components/ai-elements/queue.tsx type QueueMessagePart (line 14) | type QueueMessagePart = { type QueueMessage (line 22) | type QueueMessage = { type QueueTodo (line 27) | type QueueTodo = { type QueueItemProps (line 34) | type QueueItemProps = ComponentProps<"li">; type QueueItemIndicatorProps (line 46) | type QueueItemIndicatorProps = ComponentProps<"span"> & { type QueueItemContentProps (line 67) | type QueueItemContentProps = ComponentProps<"span"> & { type QueueItemDescriptionProps (line 88) | type QueueItemDescriptionProps = ComponentProps<"div"> & { type QueueItemActionsProps (line 109) | type QueueItemActionsProps = ComponentProps<"div">; type QueueItemActionProps (line 118) | type QueueItemActionProps = Omit< type QueueItemAttachmentProps (line 139) | type QueueItemAttachmentProps = ComponentProps<"div">; type QueueItemImageProps (line 148) | type QueueItemImageProps = ComponentProps<"img">; type QueueItemFileProps (line 163) | type QueueItemFileProps = ComponentProps<"span">; type QueueListProps (line 182) | type QueueListProps = ComponentProps; type QueueSectionProps (line 197) | type QueueSectionProps = ComponentProps; type QueueSectionTriggerProps (line 208) | type QueueSectionTriggerProps = ComponentProps<"button">; type QueueSectionLabelProps (line 230) | type QueueSectionLabelProps = ComponentProps<"span"> & { type QueueSectionContentProps (line 253) | type QueueSectionContentProps = ComponentProps< type QueueProps (line 264) | type QueueProps = ComponentProps<"div">; FILE: frontend/src/components/ai-elements/reasoning.tsx type ReasoningContextValue (line 16) | type ReasoningContextValue = { type ReasoningProps (line 33) | type ReasoningProps = ComponentProps & { constant AUTO_CLOSE_DELAY (line 41) | const AUTO_CLOSE_DELAY = 1000; constant MS_IN_S (line 42) | const MS_IN_S = 1000; type ReasoningTriggerProps (line 114) | type ReasoningTriggerProps = ComponentProps & { type ReasoningContentProps (line 157) | type ReasoningContentProps = ComponentProps< FILE: frontend/src/components/ai-elements/shimmer.tsx type TextShimmerProps (line 13) | type TextShimmerProps = { FILE: frontend/src/components/ai-elements/sources.tsx type SourcesProps (line 12) | type SourcesProps = ComponentProps<"div">; type SourcesTriggerProps (line 21) | type SourcesTriggerProps = ComponentProps & { type SourcesContentProps (line 44) | type SourcesContentProps = ComponentProps; type SourceProps (line 60) | type SourceProps = ComponentProps<"a">; FILE: frontend/src/components/ai-elements/suggestion.tsx constant STAGGER_DELAY_MS (line 10) | const STAGGER_DELAY_MS = 60; constant STAGGER_DELAY_MS_OFFSET (line 11) | const STAGGER_DELAY_MS_OFFSET = 250; type SuggestionsProps (line 13) | type SuggestionsProps = ComponentProps; type SuggestionProps (line 41) | type SuggestionProps = Omit, "onClick"> & { FILE: frontend/src/components/ai-elements/task.tsx type TaskItemFileProps (line 12) | type TaskItemFileProps = ComponentProps<"div">; type TaskItemProps (line 30) | type TaskItemProps = ComponentProps<"div">; type TaskProps (line 38) | type TaskProps = ComponentProps; type TaskTriggerProps (line 48) | type TaskTriggerProps = ComponentProps & { type TaskContentProps (line 69) | type TaskContentProps = ComponentProps; FILE: frontend/src/components/ai-elements/toolbar.tsx type ToolbarProps (line 5) | type ToolbarProps = ComponentProps; FILE: frontend/src/components/ai-elements/web-preview.tsx type WebPreviewContextValue (line 21) | type WebPreviewContextValue = { type WebPreviewProps (line 38) | type WebPreviewProps = ComponentProps<"div"> & { type WebPreviewNavigationProps (line 80) | type WebPreviewNavigationProps = ComponentProps<"div">; type WebPreviewNavigationButtonProps (line 95) | type WebPreviewNavigationButtonProps = ComponentProps & { type WebPreviewUrlProps (line 127) | type WebPreviewUrlProps = ComponentProps; type WebPreviewBodyProps (line 168) | type WebPreviewBodyProps = ComponentProps<"iframe"> & { type WebPreviewConsoleProps (line 194) | type WebPreviewConsoleProps = ComponentProps<"div"> & { FILE: frontend/src/components/landing/footer.tsx function Footer (line 3) | function Footer() { FILE: frontend/src/components/landing/header.tsx function Header (line 7) | function Header() { function StarCounter (line 42) | async function StarCounter() { FILE: frontend/src/components/landing/hero.tsx function Hero (line 12) | function Hero({ className }: { className?: string }) { FILE: frontend/src/components/landing/progressive-skills-animation.tsx type AnimationPhase (line 19) | type AnimationPhase = type FileItem (line 32) | interface FileItem { constant ANIMATION_DELAYS (line 51) | const ANIMATION_DELAYS = { function ProgressiveSkillsAnimation (line 64) | function ProgressiveSkillsAnimation() { FILE: frontend/src/components/landing/section.tsx function Section (line 3) | function Section({ FILE: frontend/src/components/landing/sections/case-study-section.tsx function CaseStudySection (line 9) | function CaseStudySection({ className }: { className?: string }) { FILE: frontend/src/components/landing/sections/community-section.tsx function CommunitySection (line 11) | function CommunitySection() { FILE: frontend/src/components/landing/sections/sandbox-section.tsx function SandboxSection (line 11) | function SandboxSection({ className }: { className?: string }) { FILE: frontend/src/components/landing/sections/skills-section.tsx function SkillsSection (line 8) | function SkillsSection({ className }: { className?: string }) { FILE: frontend/src/components/landing/sections/whats-new-section.tsx constant COLOR (line 8) | const COLOR = "#0a0a0a"; function WhatsNewSection (line 51) | function WhatsNewSection({ className }: { className?: string }) { FILE: frontend/src/components/theme-provider.tsx function ThemeProvider (line 6) | function ThemeProvider({ FILE: frontend/src/components/ui/alert.tsx function Alert (line 22) | function Alert({ function AlertTitle (line 37) | function AlertTitle({ className, ...props }: React.ComponentProps<"div">) { function AlertDescription (line 50) | function AlertDescription({ FILE: frontend/src/components/ui/aurora-text.tsx type AuroraTextProps (line 5) | interface AuroraTextProps { FILE: frontend/src/components/ui/avatar.tsx function Avatar (line 8) | function Avatar({ function AvatarImage (line 24) | function AvatarImage({ function AvatarFallback (line 37) | function AvatarFallback({ FILE: frontend/src/components/ui/badge.tsx function Badge (line 28) | function Badge({ FILE: frontend/src/components/ui/breadcrumb.tsx function Breadcrumb (line 7) | function Breadcrumb({ ...props }: React.ComponentProps<"nav">) { function BreadcrumbList (line 11) | function BreadcrumbList({ className, ...props }: React.ComponentProps<"o... function BreadcrumbItem (line 24) | function BreadcrumbItem({ className, ...props }: React.ComponentProps<"l... function BreadcrumbLink (line 34) | function BreadcrumbLink({ function BreadcrumbPage (line 52) | function BreadcrumbPage({ className, ...props }: React.ComponentProps<"s... function BreadcrumbSeparator (line 65) | function BreadcrumbSeparator({ function BreadcrumbEllipsis (line 83) | function BreadcrumbEllipsis({ FILE: frontend/src/components/ui/button-group.tsx function ButtonGroup (line 24) | function ButtonGroup({ function ButtonGroupText (line 40) | function ButtonGroupText({ function ButtonGroupSeparator (line 60) | function ButtonGroupSeparator({ FILE: frontend/src/components/ui/button.tsx function Button (line 40) | function Button({ FILE: frontend/src/components/ui/card.tsx function Card (line 5) | function Card({ className, ...props }: React.ComponentProps<"div">) { function CardHeader (line 18) | function CardHeader({ className, ...props }: React.ComponentProps<"div">) { function CardTitle (line 31) | function CardTitle({ className, ...props }: React.ComponentProps<"div">) { function CardDescription (line 41) | function CardDescription({ className, ...props }: React.ComponentProps<"... function CardAction (line 51) | function CardAction({ className, ...props }: React.ComponentProps<"div">) { function CardContent (line 64) | function CardContent({ className, ...props }: React.ComponentProps<"div"... function CardFooter (line 74) | function CardFooter({ className, ...props }: React.ComponentProps<"div">) { FILE: frontend/src/components/ui/carousel.tsx type CarouselApi (line 12) | type CarouselApi = UseEmblaCarouselType[1] type UseCarouselParameters (line 13) | type UseCarouselParameters = Parameters type CarouselOptions (line 14) | type CarouselOptions = UseCarouselParameters[0] type CarouselPlugin (line 15) | type CarouselPlugin = UseCarouselParameters[1] type CarouselProps (line 17) | type CarouselProps = { type CarouselContextProps (line 24) | type CarouselContextProps = { function useCarousel (line 35) | function useCarousel() { function Carousel (line 45) | function Carousel({ function CarouselContent (line 135) | function CarouselContent({ className, ...props }: React.ComponentProps<"... function CarouselItem (line 156) | function CarouselItem({ className, ...props }: React.ComponentProps<"div... function CarouselPrevious (line 174) | function CarouselPrevious({ function CarouselNext (line 204) | function CarouselNext({ FILE: frontend/src/components/ui/collapsible.tsx function Collapsible (line 7) | function Collapsible({ function CollapsibleTrigger (line 13) | function CollapsibleTrigger({ function CollapsibleContent (line 26) | function CollapsibleContent({ FILE: frontend/src/components/ui/command.tsx function Command (line 16) | function Command({ function CommandDialog (line 32) | function CommandDialog({ function CommandInput (line 63) | function CommandInput({ function CommandList (line 85) | function CommandList({ function CommandEmpty (line 101) | function CommandEmpty({ function CommandGroup (line 113) | function CommandGroup({ function CommandSeparator (line 129) | function CommandSeparator({ function CommandItem (line 142) | function CommandItem({ function CommandShortcut (line 158) | function CommandShortcut({ FILE: frontend/src/components/ui/confetti-button.tsx type ConfettiButtonProps (line 8) | interface ConfettiButtonProps extends React.ComponentProps { function ConfettiButton (line 16) | function ConfettiButton({ FILE: frontend/src/components/ui/dialog.tsx function Dialog (line 9) | function Dialog({ function DialogTrigger (line 15) | function DialogTrigger({ function DialogPortal (line 21) | function DialogPortal({ function DialogClose (line 27) | function DialogClose({ function DialogOverlay (line 33) | function DialogOverlay({ function DialogContent (line 49) | function DialogContent({ function DialogHeader (line 83) | function DialogHeader({ className, ...props }: React.ComponentProps<"div... function DialogFooter (line 93) | function DialogFooter({ className, ...props }: React.ComponentProps<"div... function DialogTitle (line 106) | function DialogTitle({ function DialogDescription (line 119) | function DialogDescription({ FILE: frontend/src/components/ui/dropdown-menu.tsx function DropdownMenu (line 9) | function DropdownMenu({ function DropdownMenuPortal (line 15) | function DropdownMenuPortal({ function DropdownMenuTrigger (line 23) | function DropdownMenuTrigger({ function DropdownMenuContent (line 34) | function DropdownMenuContent({ function DropdownMenuGroup (line 54) | function DropdownMenuGroup({ function DropdownMenuItem (line 62) | function DropdownMenuItem({ function DropdownMenuCheckboxItem (line 85) | function DropdownMenuCheckboxItem({ function DropdownMenuRadioGroup (line 111) | function DropdownMenuRadioGroup({ function DropdownMenuRadioItem (line 122) | function DropdownMenuRadioItem({ function DropdownMenuLabel (line 146) | function DropdownMenuLabel({ function DropdownMenuSeparator (line 166) | function DropdownMenuSeparator({ function DropdownMenuShortcut (line 179) | function DropdownMenuShortcut({ function DropdownMenuSub (line 195) | function DropdownMenuSub({ function DropdownMenuSubTrigger (line 201) | function DropdownMenuSubTrigger({ function DropdownMenuSubContent (line 225) | function DropdownMenuSubContent({ FILE: frontend/src/components/ui/empty.tsx function Empty (line 5) | function Empty({ className, ...props }: React.ComponentProps<"div">) { function EmptyHeader (line 18) | function EmptyHeader({ className, ...props }: React.ComponentProps<"div"... function EmptyMedia (line 46) | function EmptyMedia({ function EmptyTitle (line 61) | function EmptyTitle({ className, ...props }: React.ComponentProps<"div">) { function EmptyDescription (line 71) | function EmptyDescription({ className, ...props }: React.ComponentProps<... function EmptyContent (line 84) | function EmptyContent({ className, ...props }: React.ComponentProps<"div... FILE: frontend/src/components/ui/flickering-grid.tsx type FlickeringGridProps (line 13) | interface FlickeringGridProps extends React.HTMLAttributes) { function InputGroupAddon (line 60) | function InputGroupAddon({ function InputGroupButton (line 100) | function InputGroupButton({ function InputGroupText (line 119) | function InputGroupText({ className, ...props }: React.ComponentProps<"s... function InputGroupInput (line 131) | function InputGroupInput({ function InputGroupTextarea (line 147) | function InputGroupTextarea({ FILE: frontend/src/components/ui/input.tsx function Input (line 5) | function Input({ className, type, ...props }: React.ComponentProps<"inpu... FILE: frontend/src/components/ui/item.tsx function ItemGroup (line 8) | function ItemGroup({ className, ...props }: React.ComponentProps<"div">) { function ItemSeparator (line 19) | function ItemSeparator({ function Item (line 54) | function Item({ function ItemMedia (line 91) | function ItemMedia({ function ItemContent (line 106) | function ItemContent({ className, ...props }: React.ComponentProps<"div"... function ItemTitle (line 119) | function ItemTitle({ className, ...props }: React.ComponentProps<"div">) { function ItemDescription (line 132) | function ItemDescription({ className, ...props }: React.ComponentProps<"... function ItemActions (line 146) | function ItemActions({ className, ...props }: React.ComponentProps<"div"... function ItemHeader (line 156) | function ItemHeader({ className, ...props }: React.ComponentProps<"div">) { function ItemFooter (line 169) | function ItemFooter({ className, ...props }: React.ComponentProps<"div">) { FILE: frontend/src/components/ui/magic-bento.tsx type BentoCardProps (line 5) | interface BentoCardProps { type BentoProps (line 14) | interface BentoProps { constant DEFAULT_PARTICLE_COUNT (line 29) | const DEFAULT_PARTICLE_COUNT = 12; constant DEFAULT_SPOTLIGHT_RADIUS (line 30) | const DEFAULT_SPOTLIGHT_RADIUS = 300; constant DEFAULT_GLOW_COLOR (line 31) | const DEFAULT_GLOW_COLOR = "132, 0, 255"; constant MOBILE_BREAKPOINT (line 32) | const MOBILE_BREAKPOINT = 768; FILE: frontend/src/components/ui/number-ticker.tsx type NumberTickerProps (line 8) | interface NumberTickerProps extends ComponentPropsWithoutRef<"span"> { function NumberTicker (line 16) | function NumberTicker({ FILE: frontend/src/components/ui/progress.tsx function Progress (line 8) | function Progress({ FILE: frontend/src/components/ui/resizable.tsx function ResizablePanelGroup (line 9) | function ResizablePanelGroup({ function ResizablePanel (line 25) | function ResizablePanel({ function ResizableHandle (line 31) | function ResizableHandle({ FILE: frontend/src/components/ui/scroll-area.tsx function ScrollArea (line 8) | function ScrollArea({ function ScrollBar (line 31) | function ScrollBar({ FILE: frontend/src/components/ui/select.tsx function Select (line 9) | function Select({ function SelectGroup (line 15) | function SelectGroup({ function SelectValue (line 21) | function SelectValue({ function SelectTrigger (line 27) | function SelectTrigger({ function SelectContent (line 53) | function SelectContent({ function SelectLabel (line 90) | function SelectLabel({ function SelectItem (line 103) | function SelectItem({ function SelectSeparator (line 130) | function SelectSeparator({ function SelectScrollUpButton (line 143) | function SelectScrollUpButton({ function SelectScrollDownButton (line 161) | function SelectScrollDownButton({ FILE: frontend/src/components/ui/separator.tsx function Separator (line 8) | function Separator({ FILE: frontend/src/components/ui/sheet.tsx function Sheet (line 9) | function Sheet({ ...props }: React.ComponentProps { function ShineBorder (line 30) | function ShineBorder({ FILE: frontend/src/components/ui/sidebar.tsx constant SIDEBAR_COOKIE_NAME (line 28) | const SIDEBAR_COOKIE_NAME = "sidebar_state"; constant SIDEBAR_COOKIE_MAX_AGE (line 29) | const SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7; constant SIDEBAR_WIDTH (line 30) | const SIDEBAR_WIDTH = "16rem"; constant SIDEBAR_WIDTH_MOBILE (line 31) | const SIDEBAR_WIDTH_MOBILE = "18rem"; constant SIDEBAR_WIDTH_ICON (line 32) | const SIDEBAR_WIDTH_ICON = "3rem"; constant SIDEBAR_KEYBOARD_SHORTCUT (line 33) | const SIDEBAR_KEYBOARD_SHORTCUT = "b"; type SidebarContextProps (line 35) | type SidebarContextProps = { function useSidebar (line 47) | function useSidebar() { function SidebarProvider (line 56) | function SidebarProvider({ function Sidebar (line 154) | function Sidebar({ function SidebarTrigger (line 256) | function SidebarTrigger({ function SidebarRail (line 282) | function SidebarRail({ className, ...props }: React.ComponentProps<"butt... function SidebarInset (line 307) | function SidebarInset({ className, ...props }: React.ComponentProps<"mai... function SidebarInput (line 321) | function SidebarInput({ function SidebarHeader (line 335) | function SidebarHeader({ className, ...props }: React.ComponentProps<"di... function SidebarFooter (line 346) | function SidebarFooter({ className, ...props }: React.ComponentProps<"di... function SidebarSeparator (line 357) | function SidebarSeparator({ function SidebarContent (line 371) | function SidebarContent({ className, ...props }: React.ComponentProps<"d... function SidebarGroup (line 385) | function SidebarGroup({ className, ...props }: React.ComponentProps<"div... function SidebarGroupLabel (line 396) | function SidebarGroupLabel({ function SidebarGroupAction (line 417) | function SidebarGroupAction({ function SidebarGroupContent (line 440) | function SidebarGroupContent({ function SidebarMenu (line 454) | function SidebarMenu({ className, ...props }: React.ComponentProps<"ul">) { function SidebarMenuItem (line 465) | function SidebarMenuItem({ className, ...props }: React.ComponentProps<"... function SidebarMenuButton (line 498) | function SidebarMenuButton({ function SidebarMenuAction (line 548) | function SidebarMenuAction({ function SidebarMenuBadge (line 580) | function SidebarMenuBadge({ function SidebarMenuSkeleton (line 602) | function SidebarMenuSkeleton({ function SidebarMenuSub (line 640) | function SidebarMenuSub({ className, ...props }: React.ComponentProps<"u... function SidebarMenuSubItem (line 655) | function SidebarMenuSubItem({ function SidebarMenuSubButton (line 669) | function SidebarMenuSubButton({ FILE: frontend/src/components/ui/skeleton.tsx function Skeleton (line 3) | function Skeleton({ className, ...props }: React.ComponentProps<"div">) { FILE: frontend/src/components/ui/spotlight-card.tsx type Position (line 6) | interface Position { type SpotlightCardProps (line 11) | interface SpotlightCardProps extends React.PropsWithChildren { FILE: frontend/src/components/ui/switch.tsx function Switch (line 8) | function Switch({ FILE: frontend/src/components/ui/tabs.tsx function Tabs (line 9) | function Tabs({ function TabsList (line 43) | function TabsList({ function TabsTrigger (line 59) | function TabsTrigger({ function TabsContent (line 78) | function TabsContent({ FILE: frontend/src/components/ui/terminal.tsx type SequenceContextValue (line 16) | interface SequenceContextValue { type AnimatedSpanProps (line 29) | interface AnimatedSpanProps extends MotionProps { type TypingAnimationProps (line 82) | interface TypingAnimationProps extends MotionProps { type TerminalProps (line 184) | interface TerminalProps { FILE: frontend/src/components/ui/textarea.tsx function Textarea (line 5) | function Textarea({ className, ...props }: React.ComponentProps<"textare... FILE: frontend/src/components/ui/toggle-group.tsx function ToggleGroup (line 20) | function ToggleGroup({ function ToggleGroupItem (line 51) | function ToggleGroupItem({ FILE: frontend/src/components/ui/toggle.tsx function Toggle (line 31) | function Toggle({ FILE: frontend/src/components/ui/tooltip.tsx function TooltipProvider (line 8) | function TooltipProvider({ function Tooltip (line 21) | function Tooltip({ function TooltipTrigger (line 31) | function TooltipTrigger({ function TooltipContent (line 37) | function TooltipContent({ FILE: frontend/src/components/ui/word-rotate.tsx type WordRotateProps (line 9) | interface WordRotateProps { function WordRotate (line 16) | function WordRotate({ FILE: frontend/src/components/workspace/agent-welcome.tsx function AgentWelcome (line 8) | function AgentWelcome({ FILE: frontend/src/components/workspace/agents/agent-card.tsx type AgentCardProps (line 30) | interface AgentCardProps { function AgentCard (line 34) | function AgentCard({ agent }: AgentCardProps) { FILE: frontend/src/components/workspace/agents/agent-gallery.tsx function AgentGallery (line 12) | function AgentGallery() { FILE: frontend/src/components/workspace/artifacts/artifact-file-detail.tsx function ArtifactFileDetail (line 47) | function ArtifactFileDetail({ function ArtifactFilePreview (line 264) | function ArtifactFilePreview({ FILE: frontend/src/components/workspace/artifacts/artifact-file-list.tsx function ArtifactFileList (line 25) | function ArtifactFileList({ FILE: frontend/src/components/workspace/artifacts/context.tsx type ArtifactsContextType (line 12) | interface ArtifactsContextType { type ArtifactsProviderProps (line 30) | interface ArtifactsProviderProps { function ArtifactsProvider (line 34) | function ArtifactsProvider({ children }: ArtifactsProviderProps) { function useArtifacts (line 90) | function useArtifacts() { FILE: frontend/src/components/workspace/chats/chat-box.tsx constant CLOSE_MODE (line 22) | const CLOSE_MODE = { chat: 100, artifacts: 0 }; constant OPEN_MODE (line 23) | const OPEN_MODE = { chat: 60, artifacts: 40 }; FILE: frontend/src/components/workspace/chats/use-chat-mode.ts function useSpecificChatMode (line 10) | function useSpecificChatMode() { FILE: frontend/src/components/workspace/chats/use-thread-chat.ts function useThreadChat (line 8) | function useThreadChat() { FILE: frontend/src/components/workspace/citations/artifact-link.tsx function isExternalUrl (line 7) | function isExternalUrl(href: string | undefined): boolean { function ArtifactLink (line 12) | function ArtifactLink(props: AnchorHTMLAttributes) { FILE: frontend/src/components/workspace/citations/citation-link.tsx function CitationLink (line 12) | function CitationLink({ function extractDomain (line 76) | function extractDomain(url: string): string { FILE: frontend/src/components/workspace/code-editor.tsx function CodeEditor (line 37) | function CodeEditor({ FILE: frontend/src/components/workspace/copy-button.tsx function CopyButton (line 9) | function CopyButton({ FILE: frontend/src/components/workspace/export-trigger.tsx function ExportTrigger (line 24) | function ExportTrigger({ threadId }: { threadId: string }) { FILE: frontend/src/components/workspace/flip-display.tsx function FlipDisplay (line 5) | function FlipDisplay({ FILE: frontend/src/components/workspace/github-icon.tsx function GithubIcon (line 1) | function GithubIcon(props: React.SVGProps) { FILE: frontend/src/components/workspace/input-box.tsx type InputMode (line 86) | type InputMode = "flash" | "thinking" | "pro" | "ultra"; function getResolvedMode (line 88) | function getResolvedMode( function InputBox (line 101) | function InputBox({ function SuggestionList (line 820) | function SuggestionList() { function AddAttachmentsButton (line 889) | function AddAttachmentsButton({ className }: { className?: string }) { FILE: frontend/src/components/workspace/messages/context.ts type ThreadContextType (line 6) | interface ThreadContextType { function useThread (line 15) | function useThread() { FILE: frontend/src/components/workspace/messages/markdown-content.tsx function isExternalUrl (line 15) | function isExternalUrl(href: string | undefined): boolean { type MarkdownContentProps (line 19) | type MarkdownContentProps = { function MarkdownContent (line 29) | function MarkdownContent({ FILE: frontend/src/components/workspace/messages/message-group.tsx function MessageGroup (line 42) | function MessageGroup({ function ToolCall (line 186) | function ToolCall({ type GenericCoTStep (line 425) | interface GenericCoTStep { type CoTReasoningStep (line 431) | interface CoTReasoningStep extends GenericCoTStep<"reasoning"> { type CoTToolCallStep (line 435) | interface CoTToolCallStep extends GenericCoTStep<"toolCall"> { type CoTStep (line 441) | type CoTStep = CoTReasoningStep | CoTToolCallStep; function convertToSteps (line 443) | function convertToSteps(messages: Message[]): CoTStep[] { FILE: frontend/src/components/workspace/messages/message-list-item.tsx function MessageListItem (line 38) | function MessageListItem({ function MessageImage (line 83) | function MessageImage({ function MessageContent_ (line 110) | function MessageContent_({ constant FILE_TYPE_MAP (line 228) | const FILE_TYPE_MAP: Record = { constant IMAGE_EXTENSIONS (line 254) | const IMAGE_EXTENSIONS = ["png", "jpg", "jpeg", "gif", "webp", "svg", "b... function getFileTypeLabel (line 256) | function getFileTypeLabel(filename: string): string { function isImageFile (line 261) | function isImageFile(filename: string): boolean { function formatBytes (line 268) | function formatBytes(bytes: number): string { function RichFilesList (line 278) | function RichFilesList({ function RichFileCard (line 302) | function RichFileCard({ FILE: frontend/src/components/workspace/messages/message-list.tsx function MessageList (line 32) | function MessageList({ FILE: frontend/src/components/workspace/messages/skeleton.tsx constant STAGGER_MS (line 3) | const STAGGER_MS = 60; function SkeletonBar (line 5) | function SkeletonBar({ function MessageListSkeleton (line 24) | function MessageListSkeleton() { FILE: frontend/src/components/workspace/messages/subtask-card.tsx function SubtaskCard (line 32) | function SubtaskCard({ FILE: frontend/src/components/workspace/mode-hover-guide.tsx type AgentMode (line 8) | type AgentMode = "flash" | "thinking" | "pro" | "ultra"; function getModeLabelKey (line 10) | function getModeLabelKey( function getModeDescriptionKey (line 28) | function getModeDescriptionKey( function ModeHoverGuide (line 46) | function ModeHoverGuide({ FILE: frontend/src/components/workspace/overscroll.tsx function Overscroll (line 5) | function Overscroll({ FILE: frontend/src/components/workspace/recent-chat-list.tsx function RecentChatList (line 60) | function RecentChatList() { FILE: frontend/src/components/workspace/settings/about-settings-page.tsx function AboutSettingsPage (line 7) | function AboutSettingsPage() { FILE: frontend/src/components/workspace/settings/appearance-settings-page.tsx function AppearanceSettingsPage (line 26) | function AppearanceSettingsPage() { function ThemePreviewCard (line 114) | function ThemePreviewCard({ FILE: frontend/src/components/workspace/settings/memory-settings-page.tsx function confidenceToLevelKey (line 14) | function confidenceToLevelKey(confidence: unknown): { function formatMemorySection (line 34) | function formatMemorySection( function memoryToMarkdown (line 54) | function memoryToMarkdown( function MemorySettingsPage (line 158) | function MemorySettingsPage() { function upperFirst (line 188) | function upperFirst(str: string) { FILE: frontend/src/components/workspace/settings/notification-settings-page.tsx function NotificationSettingsPage (line 13) | function NotificationSettingsPage() { FILE: frontend/src/components/workspace/settings/settings-dialog.tsx type SettingsSection (line 29) | type SettingsSection = type SettingsDialogProps (line 37) | type SettingsDialogProps = React.ComponentProps & { function SettingsDialog (line 41) | function SettingsDialog(props: SettingsDialogProps) { FILE: frontend/src/components/workspace/settings/settings-section.tsx function SettingsSection (line 3) | function SettingsSection({ FILE: frontend/src/components/workspace/settings/skill-settings-page.tsx function SkillSettingsPage (line 32) | function SkillSettingsPage({ onClose }: { onClose?: () => void } = {}) { function SkillSettingsList (line 51) | function SkillSettingsList({ function EmptySkill (line 117) | function EmptySkill({ onCreateSkill }: { onCreateSkill: () => void }) { FILE: frontend/src/components/workspace/settings/tool-settings-page.tsx function ToolSettingsPage (line 18) | function ToolSettingsPage() { function MCPServerList (line 37) | function MCPServerList({ FILE: frontend/src/components/workspace/streaming-indicator.tsx function StreamingIndicator (line 3) | function StreamingIndicator({ FILE: frontend/src/components/workspace/thread-title.tsx function ThreadTitle (line 10) | function ThreadTitle({ FILE: frontend/src/components/workspace/todo-list.tsx function TodoList (line 14) | function TodoList({ FILE: frontend/src/components/workspace/tooltip.tsx function Tooltip (line 9) | function Tooltip({ FILE: frontend/src/components/workspace/welcome.tsx function Welcome (line 13) | function Welcome({ FILE: frontend/src/components/workspace/workspace-container.tsx function WorkspaceContainer (line 21) | function WorkspaceContainer({ function WorkspaceHeader (line 33) | function WorkspaceHeader({ function WorkspaceBody (line 109) | function WorkspaceBody({ function nameOfSegment (line 127) | function nameOfSegment( FILE: frontend/src/components/workspace/workspace-header.tsx function WorkspaceHeader (line 18) | function WorkspaceHeader({ className }: { className?: string }) { FILE: frontend/src/components/workspace/workspace-nav-chat-list.tsx function WorkspaceNavChatList (line 15) | function WorkspaceNavChatList() { FILE: frontend/src/components/workspace/workspace-nav-menu.tsx function NavMenuButtonContent (line 33) | function NavMenuButtonContent({ function WorkspaceNavMenu (line 53) | function WorkspaceNavMenu() { FILE: frontend/src/components/workspace/workspace-sidebar.tsx function WorkspaceSidebar (line 17) | function WorkspaceSidebar({ FILE: frontend/src/core/agents/api.ts function listAgents (line 5) | async function listAgents(): Promise { function getAgent (line 12) | async function getAgent(name: string): Promise { function createAgent (line 18) | async function createAgent(request: CreateAgentRequest): Promise { function updateAgent (line 31) | async function updateAgent( function deleteAgent (line 47) | async function deleteAgent(name: string): Promise { function checkAgentName (line 54) | async function checkAgentName( FILE: frontend/src/core/agents/hooks.ts function useAgents (line 12) | function useAgents() { function useAgent (line 20) | function useAgent(name: string | null | undefined) { function useCreateAgent (line 29) | function useCreateAgent() { function useUpdateAgent (line 39) | function useUpdateAgent() { function useDeleteAgent (line 56) | function useDeleteAgent() { FILE: frontend/src/core/agents/types.ts type Agent (line 1) | interface Agent { type CreateAgentRequest (line 9) | interface CreateAgentRequest { type UpdateAgentRequest (line 17) | interface UpdateAgentRequest { FILE: frontend/src/core/api/api-client.ts function createCompatibleClient (line 9) | function createCompatibleClient(isMock?: boolean): LangGraphClient { function getAPIClient (line 34) | function getAPIClient(isMock?: boolean): LangGraphClient { FILE: frontend/src/core/api/stream-mode.ts constant SUPPORTED_RUN_STREAM_MODES (line 1) | const SUPPORTED_RUN_STREAM_MODES = new Set([ function warnUnsupportedStreamModes (line 15) | function warnUnsupportedStreamModes( function sanitizeRunStreamOptions (line 36) | function sanitizeRunStreamOptions(options: T): T { FILE: frontend/src/core/artifacts/hooks.ts function useArtifactContent (line 8) | function useArtifactContent({ FILE: frontend/src/core/artifacts/loader.ts function loadArtifactContent (line 7) | async function loadArtifactContent({ function loadArtifactContentFromToolCall (line 26) | function loadArtifactContentFromToolCall({ FILE: frontend/src/core/artifacts/utils.ts function urlOfArtifact (line 4) | function urlOfArtifact({ function extractArtifactsFromThread (line 21) | function extractArtifactsFromThread(thread: AgentThread) { function resolveArtifactURL (line 25) | function resolveArtifactURL(absolutePath: string, threadId: string) { FILE: frontend/src/core/config/index.ts function getBackendBaseURL (line 3) | function getBackendBaseURL() { function getLangGraphBaseURL (line 11) | function getLangGraphBaseURL(isMock?: boolean) { FILE: frontend/src/core/i18n/context.tsx type I18nContextType (line 7) | interface I18nContextType { function I18nProvider (line 14) | function I18nProvider({ function useI18nContext (line 35) | function useI18nContext() { FILE: frontend/src/core/i18n/cookies.ts constant LOCALE_COOKIE_NAME (line 6) | const LOCALE_COOKIE_NAME = "locale"; function getLocaleFromCookie (line 11) | function getLocaleFromCookie(): string | null { function setLocaleInCookie (line 29) | function setLocaleInCookie(locale: string): void { function getLocaleFromCookieServer (line 43) | async function getLocaleFromCookieServer(): Promise { FILE: frontend/src/core/i18n/hooks.ts function useI18n (line 23) | function useI18n() { FILE: frontend/src/core/i18n/locale.ts constant SUPPORTED_LOCALES (line 1) | const SUPPORTED_LOCALES = ["en-US", "zh-CN"] as const; type Locale (line 2) | type Locale = (typeof SUPPORTED_LOCALES)[number]; constant DEFAULT_LOCALE (line 3) | const DEFAULT_LOCALE: Locale = "en-US"; function isLocale (line 5) | function isLocale(value: string): value is Locale { function normalizeLocale (line 9) | function normalizeLocale(locale: string | null | undefined): Locale { function detectLocale (line 26) | function detectLocale(): Locale { FILE: frontend/src/core/i18n/locales/types.ts type Translations (line 3) | interface Translations { FILE: frontend/src/core/i18n/server.ts function detectLocaleServer (line 5) | async function detectLocaleServer(): Promise { FILE: frontend/src/core/mcp/api.ts function loadMCPConfig (line 5) | async function loadMCPConfig() { function updateMCPConfig (line 10) | async function updateMCPConfig(config: MCPConfig) { FILE: frontend/src/core/mcp/hooks.ts function useMCPConfig (line 5) | function useMCPConfig() { function useEnableMCPServer (line 13) | function useEnableMCPServer() { FILE: frontend/src/core/mcp/types.ts type MCPServerConfig (line 1) | interface MCPServerConfig extends Record { type MCPConfig (line 6) | interface MCPConfig { FILE: frontend/src/core/memory/api.ts function loadMemory (line 5) | async function loadMemory() { FILE: frontend/src/core/memory/hooks.ts function useMemory (line 5) | function useMemory() { FILE: frontend/src/core/memory/types.ts type UserMemory (line 1) | interface UserMemory { FILE: frontend/src/core/messages/utils.ts type GenericMessageGroup (line 3) | interface GenericMessageGroup { type HumanMessageGroup (line 9) | interface HumanMessageGroup extends GenericMessageGroup<"human"> {} type AssistantProcessingGroup (line 11) | interface AssistantProcessingGroup extends GenericMessageGroup<"assistan... type AssistantMessageGroup (line 13) | interface AssistantMessageGroup extends GenericMessageGroup<"assistant"> {} type AssistantPresentFilesGroup (line 15) | interface AssistantPresentFilesGroup extends GenericMessageGroup<"assist... type AssistantClarificationGroup (line 17) | interface AssistantClarificationGroup extends GenericMessageGroup<"assis... type AssistantSubagentGroup (line 19) | interface AssistantSubagentGroup extends GenericMessageGroup<"assistant:... type MessageGroup (line 21) | type MessageGroup = function groupMessages (line 29) | function groupMessages( function extractTextFromMessage (line 128) | function extractTextFromMessage(message: Message) { constant THINK_TAG_RE (line 141) | const THINK_TAG_RE = /\s*([\s\S]*?)\s*<\/think>/g; function splitInlineReasoning (line 143) | function splitInlineReasoning(content: string) { function splitInlineReasoningFromAIMessage (line 161) | function splitInlineReasoningFromAIMessage(message: Message) { function extractContentFromMessage (line 168) | function extractContentFromMessage(message: Message) { function extractReasoningContentFromMessage (line 191) | function extractReasoningContentFromMessage(message: Message) { function removeReasoningContentFromMessage (line 213) | function removeReasoningContentFromMessage(message: Message) { function extractURLFromImageURLContent (line 220) | function extractURLFromImageURLContent( function hasContent (line 233) | function hasContent(message: Message) { function hasReasoning (line 245) | function hasReasoning(message: Message) { function hasToolCalls (line 263) | function hasToolCalls(message: Message) { function hasPresentFiles (line 269) | function hasPresentFiles(message: Message) { function isClarificationToolMessage (line 276) | function isClarificationToolMessage(message: Message) { function extractPresentFilesFromMessage (line 280) | function extractPresentFilesFromMessage(message: Message) { function hasSubagent (line 296) | function hasSubagent(message: AIMessage) { function findToolCallResult (line 305) | function findToolCallResult(toolCallId: string, messages: Message[]) { type FileInMessage (line 321) | interface FileInMessage { function stripUploadedFilesTag (line 332) | function stripUploadedFilesTag(content: string): string { function parseUploadedFiles (line 338) | function parseUploadedFiles(content: string): FileInMessage[] { FILE: frontend/src/core/models/api.ts function loadModels (line 5) | async function loadModels() { FILE: frontend/src/core/models/hooks.ts function useModels (line 5) | function useModels({ enabled = true }: { enabled?: boolean } = {}) { FILE: frontend/src/core/models/types.ts type Model (line 1) | interface Model { FILE: frontend/src/core/notification/hooks.ts type NotificationOptions (line 5) | interface NotificationOptions { type UseNotificationReturn (line 15) | interface UseNotificationReturn { function useNotification (line 22) | function useNotification(): UseNotificationReturn { FILE: frontend/src/core/rehype/index.ts function rehypeSplitWordsIntoSpans (line 6) | function rehypeSplitWordsIntoSpans() { function useRehypeSplitWordsIntoSpans (line 43) | function useRehypeSplitWordsIntoSpans(enabled = true) { FILE: frontend/src/core/settings/hooks.ts function useLocalSettings (line 10) | function useLocalSettings(): [ FILE: frontend/src/core/settings/local.ts constant DEFAULT_LOCAL_SETTINGS (line 3) | const DEFAULT_LOCAL_SETTINGS: LocalSettings = { constant LOCAL_SETTINGS_KEY (line 17) | const LOCAL_SETTINGS_KEY = "deerflow.local-settings"; type LocalSettings (line 19) | interface LocalSettings { function getLocalSettings (line 35) | function getLocalSettings(): LocalSettings { function saveLocalSettings (line 64) | function saveLocalSettings(settings: LocalSettings) { FILE: frontend/src/core/skills/api.ts function loadSkills (line 5) | async function loadSkills() { function enableSkill (line 11) | async function enableSkill(skillName: string, enabled: boolean) { type InstallSkillRequest (line 27) | interface InstallSkillRequest { type InstallSkillResponse (line 32) | interface InstallSkillResponse { function installSkill (line 38) | async function installSkill( FILE: frontend/src/core/skills/hooks.ts function useSkills (line 7) | function useSkills() { function useEnableSkill (line 15) | function useEnableSkill() { FILE: frontend/src/core/skills/type.ts type Skill (line 1) | interface Skill { FILE: frontend/src/core/tasks/context.tsx type SubtaskContextValue (line 5) | interface SubtaskContextValue { function SubtasksProvider (line 17) | function SubtasksProvider({ children }: { children: React.ReactNode }) { function useSubtaskContext (line 26) | function useSubtaskContext() { function useSubtask (line 36) | function useSubtask(id: string) { function useUpdateSubtask (line 41) | function useUpdateSubtask() { FILE: frontend/src/core/tasks/types.ts type Subtask (line 3) | interface Subtask { FILE: frontend/src/core/threads/export.ts function formatMessageContent (line 14) | function formatMessageContent(message: Message): string { function formatToolCalls (line 20) | function formatToolCalls(message: Message): string { function formatThreadAsMarkdown (line 26) | function formatThreadAsMarkdown( function formatThreadAsJSON (line 86) | function formatThreadAsJSON( function sanitizeFilename (line 107) | function sanitizeFilename(name: string): string { function downloadAsFile (line 113) | function downloadAsFile( function exportThreadAsMarkdown (line 129) | function exportThreadAsMarkdown( function exportThreadAsJSON (line 138) | function exportThreadAsJSON(thread: AgentThread, messages: Message[]) { FILE: frontend/src/core/threads/hooks.ts type ToolEndEvent (line 20) | type ToolEndEvent = { type ThreadStreamOptions (line 25) | type ThreadStreamOptions = { function getStreamErrorMessage (line 34) | function getStreamErrorMessage(error: unknown): string { function useThreadStream (line 57) | function useThreadStream({ function useThreads (line 412) | function useThreads( function useDeleteThread (line 478) | function useDeleteThread() { function useRenameThread (line 499) | function useRenameThread() { FILE: frontend/src/core/threads/types.ts type AgentThreadState (line 5) | interface AgentThreadState extends Record { type AgentThread (line 12) | interface AgentThread extends Thread {} type AgentThreadContext (line 14) | interface AgentThreadContext extends Record { FILE: frontend/src/core/threads/utils.ts function pathOfThread (line 5) | function pathOfThread(threadId: string) { function textOfMessage (line 9) | function textOfMessage(message: Message) { function titleOfThread (line 22) | function titleOfThread(thread: AgentThread) { FILE: frontend/src/core/todos/types.ts type Todo (line 1) | interface Todo { FILE: frontend/src/core/tools/utils.ts function explainLastToolCall (line 7) | function explainLastToolCall(message: AIMessage, t: Translations) { function explainToolCall (line 15) | function explainToolCall(toolCall: ToolCall, t: Translations) { FILE: frontend/src/core/uploads/api.ts type UploadedFileInfo (line 7) | interface UploadedFileInfo { type UploadResponse (line 21) | interface UploadResponse { type ListFilesResponse (line 27) | interface ListFilesResponse { function readErrorDetail (line 32) | async function readErrorDetail( function uploadFiles (line 45) | async function uploadFiles( function listUploadedFiles (line 73) | async function listUploadedFiles( function deleteUploadedFile (line 92) | async function deleteUploadedFile( FILE: frontend/src/core/uploads/hooks.ts function useUploadFiles (line 19) | function useUploadFiles(threadId: string) { function useUploadedFiles (line 36) | function useUploadedFiles(threadId: string) { function useDeleteUploadedFile (line 47) | function useDeleteUploadedFile(threadId: string) { function useUploadFilesOnSubmit (line 65) | function useUploadFilesOnSubmit(threadId: string) { FILE: frontend/src/core/utils/datetime.ts function getDateFnsLocale (line 7) | function getDateFnsLocale(locale: Locale) { function formatTimeAgo (line 17) | function formatTimeAgo(date: Date | string | number, locale?: Locale) { FILE: frontend/src/core/utils/files.tsx function getFileName (line 146) | function getFileName(filepath: string) { function getFileExtension (line 150) | function getFileExtension(filepath: string) { function checkCodeFile (line 154) | function checkCodeFile( function getFileExtensionDisplayName (line 173) | function getFileExtensionDisplayName(filepath: string) { function getFileIcon (line 195) | function getFileIcon(filepath: string, className?: string) { FILE: frontend/src/core/utils/json.ts function tryParseJSON (line 3) | function tryParseJSON(json: string) { FILE: frontend/src/core/utils/markdown.ts function extractTitleFromMarkdown (line 1) | function extractTitleFromMarkdown(markdown: string) { FILE: frontend/src/hooks/use-mobile.ts constant MOBILE_BREAKPOINT (line 3) | const MOBILE_BREAKPOINT = 768 function useIsMobile (line 5) | function useIsMobile() { FILE: frontend/src/lib/utils.ts function cn (line 4) | function cn(...inputs: ClassValue[]) { FILE: frontend/src/server/better-auth/client.ts type Session (line 5) | type Session = typeof authClient.$Infer.Session; FILE: frontend/src/server/better-auth/config.ts type Session (line 9) | type Session = typeof auth.$Infer.Session; FILE: scripts/check.py function run_command (line 12) | def run_command(command: list[str]) -> Optional[str]: function parse_node_major (line 21) | def parse_node_major(version_text: str) -> Optional[int]: function main (line 31) | def main() -> int: FILE: scripts/configure.py function copy_if_missing (line 11) | def copy_if_missing(src: Path, dst: Path) -> None: function main (line 20) | def main() -> int: FILE: scripts/export_claude_code_oauth.py function claude_code_oauth_file_suffix (line 24) | def claude_code_oauth_file_suffix() -> str: function default_service_name (line 34) | def default_service_name() -> str: function default_account_name (line 43) | def default_account_name() -> str: function load_keychain_container (line 47) | def load_keychain_container(service: str, account: str) -> dict[str, Any]: function write_credentials_file (line 81) | def write_credentials_file(output_path: Path, data: dict[str, Any]) -> N... function parse_args (line 93) | def parse_args() -> argparse.Namespace: function main (line 130) | def main() -> int: FILE: skills/public/chart-visualization/scripts/generate.js constant CHART_TYPE_MAP (line 6) | const CHART_TYPE_MAP = { function getVisRequestServer (line 34) | function getVisRequestServer() { function getServiceIdentifier (line 41) | function getServiceIdentifier() { function httpPost (line 45) | async function httpPost(url, payload) { function generateChartUrl (line 62) | async function generateChartUrl(chartType, options) { function generateMap (line 79) | async function generateMap(tool, inputData) { function main (line 97) | async function main() { FILE: skills/public/data-analysis/scripts/analyze.py function compute_files_hash (line 37) | def compute_files_hash(files: list[str]) -> str: function get_cache_db_path (line 51) | def get_cache_db_path(files_hash: str) -> str: function get_table_map_path (line 57) | def get_table_map_path(files_hash: str) -> str: function save_table_map (line 62) | def save_table_map(files_hash: str, table_map: dict[str, str]) -> None: function load_table_map (line 69) | def load_table_map(files_hash: str) -> dict[str, str] | None: function sanitize_table_name (line 81) | def sanitize_table_name(name: str) -> str: function load_files (line 89) | def load_files(con: duckdb.DuckDBPyConnection, files: list[str]) -> dict... function _load_excel (line 115) | def _load_excel( function _load_csv (line 157) | def _load_csv( function action_inspect (line 187) | def action_inspect(con: duckdb.DuckDBPyConnection, table_map: dict[str, ... function action_query (line 240) | def action_query( function _format_table (line 281) | def _format_table(columns: list[str], rows: list[tuple]) -> str: function _export_results (line 316) | def _export_results(columns: list[str], rows: list[tuple], output_file: ... function action_summary (line 365) | def action_summary( function main (line 479) | def main(): FILE: skills/public/github-deep-research/scripts/github_api.py class RequestsFallback (line 18) | class RequestsFallback: class Response (line 21) | class Response: method __init__ (line 22) | def __init__(self, data: bytes, status: int): method json (line 27) | def json(self): method raise_for_status (line 30) | def raise_for_status(self): method get (line 35) | def get(url: str, headers: dict = None, params: dict = None, timeout: ... class GitHubAPI (line 50) | class GitHubAPI: method __init__ (line 55) | def __init__(self, token: Optional[str] = None): method _get (line 70) | def _get( method get_repo_info (line 86) | def get_repo_info(self, owner: str, repo: str) -> Dict: method get_readme (line 90) | def get_readme(self, owner: str, repo: str) -> str: method get_tree (line 99) | def get_tree( method get_file_content (line 112) | def get_file_content(self, owner: str, repo: str, path: str) -> str: method get_languages (line 122) | def get_languages(self, owner: str, repo: str) -> Dict[str, int]: method get_contributors (line 126) | def get_contributors(self, owner: str, repo: str, limit: int = 30) -> ... method get_recent_commits (line 132) | def get_recent_commits( method get_issues (line 149) | def get_issues( method get_pull_requests (line 169) | def get_pull_requests( method get_releases (line 178) | def get_releases(self, owner: str, repo: str, limit: int = 10) -> List... method get_tags (line 184) | def get_tags(self, owner: str, repo: str, limit: int = 20) -> List[Dict]: method search_issues (line 190) | def search_issues(self, owner: str, repo: str, query: str, limit: int ... method get_commit_activity (line 195) | def get_commit_activity(self, owner: str, repo: str) -> List[Dict]: method get_code_frequency (line 199) | def get_code_frequency(self, owner: str, repo: str) -> List[List[int]]: method format_tree (line 203) | def format_tree(self, tree_data: Dict, max_depth: int = 3) -> str: method summarize_repo (line 228) | def summarize_repo(self, owner: str, repo: str) -> Dict: function main (line 286) | def main(): FILE: skills/public/image-generation/scripts/generate.py function validate_image (line 8) | def validate_image(image_path: str) -> bool: function generate_image (line 30) | def generate_image( FILE: skills/public/podcast-generation/scripts/generate.py class ScriptLine (line 17) | class ScriptLine: method __init__ (line 18) | def __init__(self, speaker: Literal["male", "female"] = "male", paragr... class Script (line 23) | class Script: method __init__ (line 24) | def __init__(self, locale: Literal["en", "zh"] = "en", lines: Optional... method from_dict (line 29) | def from_dict(cls, data: dict) -> "Script": function text_to_speech (line 41) | def text_to_speech(text: str, voice_type: str) -> Optional[bytes]: function _process_line (line 102) | def _process_line(args: tuple[int, ScriptLine, int]) -> tuple[int, Optio... function tts_node (line 121) | def tts_node(script: Script, max_workers: int = 4) -> list[bytes]: function mix_audio (line 147) | def mix_audio(audio_chunks: list[bytes]) -> bytes: function generate_markdown (line 155) | def generate_markdown(script: Script, title: str = "Podcast Script") -> ... function generate_podcast (line 167) | def generate_podcast( FILE: skills/public/ppt-generation/scripts/generate.py function generate_ppt (line 10) | def generate_ppt( FILE: skills/public/skill-creator/eval-viewer/generate_review.py function get_mime_type (line 52) | def get_mime_type(path: Path) -> str: function find_runs (line 60) | def find_runs(workspace: Path) -> list[dict]: function _find_runs_recursive (line 68) | def _find_runs_recursive(root: Path, current: Path, runs: list[dict]) ->... function build_run (line 85) | def build_run(root: Path, run_dir: Path) -> dict | None: function embed_file (line 149) | def embed_file(path: Path) -> dict: function load_previous_iteration (line 213) | def load_previous_iteration(workspace: Path) -> dict[str, dict]: function generate_html (line 250) | def generate_html( function _kill_port (line 288) | def _kill_port(port: int) -> None: class ReviewHandler (line 308) | class ReviewHandler(BaseHTTPRequestHandler): method __init__ (line 315) | def __init__( method do_GET (line 332) | def do_GET(self) -> None: method do_POST (line 361) | def do_POST(self) -> None: method log_message (line 382) | def log_message(self, format: str, *args: object) -> None: function main (line 387) | def main() -> None: FILE: skills/public/skill-creator/scripts/aggregate_benchmark.py function calculate_stats (line 45) | def calculate_stats(values: list[float]) -> dict: function load_run_results (line 67) | def load_run_results(benchmark_dir: Path) -> dict: function aggregate_results (line 176) | def aggregate_results(results: dict) -> dict: function generate_benchmark (line 227) | def generate_benchmark(benchmark_dir: Path, skill_name: str = "", skill_... function generate_markdown (line 281) | def generate_markdown(benchmark: dict) -> str: function main (line 338) | def main(): FILE: skills/public/skill-creator/scripts/generate_report.py function generate_html (line 16) | def generate_html(data: dict, auto_refresh: bool = False, skill_name: st... function main (line 304) | def main(): FILE: skills/public/skill-creator/scripts/improve_description.py function _call_claude (line 20) | def _call_claude(prompt: str, model: str | None, timeout: int = 300) -> ... function improve_description (line 50) | def improve_description( function main (line 194) | def main(): FILE: skills/public/skill-creator/scripts/init_skill.py function title_case_skill_name (line 189) | def title_case_skill_name(skill_name): function init_skill (line 194) | def init_skill(skill_name, path): function main (line 273) | def main(): FILE: skills/public/skill-creator/scripts/package_skill.py function should_exclude (line 27) | def should_exclude(rel_path: Path) -> bool: function package_skill (line 42) | def package_skill(skill_path, output_dir=None): function main (line 111) | def main(): FILE: skills/public/skill-creator/scripts/quick_validate.py function validate_skill (line 12) | def validate_skill(skill_path): FILE: skills/public/skill-creator/scripts/run_eval.py function find_project_root (line 22) | def find_project_root() -> Path: function run_single_query (line 35) | def run_single_query( function run_eval (line 184) | def run_eval( function main (line 259) | def main(): FILE: skills/public/skill-creator/scripts/run_loop.py function split_eval_set (line 24) | def split_eval_set(eval_set: list[dict], holdout: float, seed: int = 42)... function run_loop (line 47) | def run_loop( function main (line 244) | def main(): FILE: skills/public/skill-creator/scripts/utils.py function parse_skill_md (line 7) | def parse_skill_md(skill_path: Path) -> tuple[str, str, str]: FILE: skills/public/video-generation/scripts/generate.py function generate_video (line 8) | def generate_video( function download (line 63) | def download(url: str, output_file: str):