soothe-nano 0.9.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- soothe_nano-0.9.0/.gitignore +37 -0
- soothe_nano-0.9.0/PKG-INFO +199 -0
- soothe_nano-0.9.0/README.md +125 -0
- soothe_nano-0.9.0/pyproject.toml +128 -0
- soothe_nano-0.9.0/src/soothe_nano/__init__.py +35 -0
- soothe_nano-0.9.0/src/soothe_nano/agent/__init__.py +12 -0
- soothe_nano-0.9.0/src/soothe_nano/agent/builder.py +431 -0
- soothe_nano-0.9.0/src/soothe_nano/agent/core_agent.py +326 -0
- soothe_nano-0.9.0/src/soothe_nano/agent/factory.py +5 -0
- soothe_nano-0.9.0/src/soothe_nano/agent/lazy.py +194 -0
- soothe_nano-0.9.0/src/soothe_nano/agent/subagent_catalog.py +19 -0
- soothe_nano-0.9.0/src/soothe_nano/backends/__init__.py +1 -0
- soothe_nano-0.9.0/src/soothe_nano/backends/durability/__init__.py +11 -0
- soothe_nano-0.9.0/src/soothe_nano/backends/durability/base.py +239 -0
- soothe_nano-0.9.0/src/soothe_nano/backends/durability/postgresql.py +23 -0
- soothe_nano-0.9.0/src/soothe_nano/backends/durability/sqlite.py +40 -0
- soothe_nano-0.9.0/src/soothe_nano/backends/memory/__init__.py +5 -0
- soothe_nano-0.9.0/src/soothe_nano/backends/memory/memu/LICENSE.txt +194 -0
- soothe_nano-0.9.0/src/soothe_nano/backends/memory/memu/__init__.py +22 -0
- soothe_nano-0.9.0/src/soothe_nano/backends/memory/memu/config/README.md +235 -0
- soothe_nano-0.9.0/src/soothe_nano/backends/memory/memu/config/__init__.py +24 -0
- soothe_nano-0.9.0/src/soothe_nano/backends/memory/memu/config/activity/__init__.py +5 -0
- soothe_nano-0.9.0/src/soothe_nano/backends/memory/memu/config/activity/config.py +48 -0
- soothe_nano-0.9.0/src/soothe_nano/backends/memory/memu/config/activity/prompt.txt +48 -0
- soothe_nano-0.9.0/src/soothe_nano/backends/memory/memu/config/event/__init__.py +5 -0
- soothe_nano-0.9.0/src/soothe_nano/backends/memory/memu/config/event/config.py +48 -0
- soothe_nano-0.9.0/src/soothe_nano/backends/memory/memu/config/event/prompt.txt +67 -0
- soothe_nano-0.9.0/src/soothe_nano/backends/memory/memu/config/markdown_config.py +249 -0
- soothe_nano-0.9.0/src/soothe_nano/backends/memory/memu/config/memory_cat_config.yaml +39 -0
- soothe_nano-0.9.0/src/soothe_nano/backends/memory/memu/config/profile/__init__.py +5 -0
- soothe_nano-0.9.0/src/soothe_nano/backends/memory/memu/config/profile/config.py +52 -0
- soothe_nano-0.9.0/src/soothe_nano/backends/memory/memu/config/profile/prompt.txt +73 -0
- soothe_nano-0.9.0/src/soothe_nano/backends/memory/memu/langchain_adapter.py +149 -0
- soothe_nano-0.9.0/src/soothe_nano/backends/memory/memu/llm_adapter.py +33 -0
- soothe_nano-0.9.0/src/soothe_nano/backends/memory/memu/llm_client.py +103 -0
- soothe_nano-0.9.0/src/soothe_nano/backends/memory/memu/memory/__init__.py +30 -0
- soothe_nano-0.9.0/src/soothe_nano/backends/memory/memu/memory/actions/__init__.py +35 -0
- soothe_nano-0.9.0/src/soothe_nano/backends/memory/memu/memory/actions/add_activity_memory.py +322 -0
- soothe_nano-0.9.0/src/soothe_nano/backends/memory/memu/memory/actions/base_action.py +347 -0
- soothe_nano-0.9.0/src/soothe_nano/backends/memory/memu/memory/actions/cluster_memories.py +292 -0
- soothe_nano-0.9.0/src/soothe_nano/backends/memory/memu/memory/actions/generate_suggestions.py +211 -0
- soothe_nano-0.9.0/src/soothe_nano/backends/memory/memu/memory/actions/get_available_categories.py +65 -0
- soothe_nano-0.9.0/src/soothe_nano/backends/memory/memu/memory/actions/link_related_memories.py +540 -0
- soothe_nano-0.9.0/src/soothe_nano/backends/memory/memu/memory/actions/run_theory_of_mind.py +271 -0
- soothe_nano-0.9.0/src/soothe_nano/backends/memory/memu/memory/actions/update_memory_with_suggestions.py +535 -0
- soothe_nano-0.9.0/src/soothe_nano/backends/memory/memu/memory/embeddings.py +125 -0
- soothe_nano-0.9.0/src/soothe_nano/backends/memory/memu/memory/file_manager.py +324 -0
- soothe_nano-0.9.0/src/soothe_nano/backends/memory/memu/memory/memory_agent.py +625 -0
- soothe_nano-0.9.0/src/soothe_nano/backends/memory/memu/memory/recall_agent.py +401 -0
- soothe_nano-0.9.0/src/soothe_nano/backends/memory/memu/memory_store.py +654 -0
- soothe_nano-0.9.0/src/soothe_nano/backends/memory/memu/models.py +105 -0
- soothe_nano-0.9.0/src/soothe_nano/backends/memory/memu_adapter.py +175 -0
- soothe_nano-0.9.0/src/soothe_nano/backends/persistence/__init__.py +71 -0
- soothe_nano-0.9.0/src/soothe_nano/backends/persistence/display_store.py +498 -0
- soothe_nano-0.9.0/src/soothe_nano/backends/persistence/display_store_postgres.py +431 -0
- soothe_nano-0.9.0/src/soothe_nano/backends/persistence/postgres_store.py +393 -0
- soothe_nano-0.9.0/src/soothe_nano/backends/persistence/sqlite_store.py +327 -0
- soothe_nano-0.9.0/src/soothe_nano/backends/vector_store/__init__.py +50 -0
- soothe_nano-0.9.0/src/soothe_nano/backends/vector_store/pgvector.py +361 -0
- soothe_nano-0.9.0/src/soothe_nano/backends/vector_store/sqlite_vec.py +599 -0
- soothe_nano-0.9.0/src/soothe_nano/backends/vector_store/weaviate.py +278 -0
- soothe_nano-0.9.0/src/soothe_nano/config/__init__.py +110 -0
- soothe_nano-0.9.0/src/soothe_nano/config/constants.py +30 -0
- soothe_nano-0.9.0/src/soothe_nano/config/env.py +96 -0
- soothe_nano-0.9.0/src/soothe_nano/config/middleware_access.py +16 -0
- soothe_nano-0.9.0/src/soothe_nano/config/models.py +1659 -0
- soothe_nano-0.9.0/src/soothe_nano/config/models_catalog.py +91 -0
- soothe_nano-0.9.0/src/soothe_nano/config/reload.py +830 -0
- soothe_nano-0.9.0/src/soothe_nano/config/settings.py +1008 -0
- soothe_nano-0.9.0/src/soothe_nano/events/__init__.py +54 -0
- soothe_nano-0.9.0/src/soothe_nano/events/catalog.py +257 -0
- soothe_nano-0.9.0/src/soothe_nano/events/constants.py +43 -0
- soothe_nano-0.9.0/src/soothe_nano/filesystem/README.md +286 -0
- soothe_nano-0.9.0/src/soothe_nano/filesystem/__init__.py +78 -0
- soothe_nano-0.9.0/src/soothe_nano/filesystem/_lock_registry.py +132 -0
- soothe_nano-0.9.0/src/soothe_nano/filesystem/discovery_hints.py +40 -0
- soothe_nano-0.9.0/src/soothe_nano/filesystem/exceptions.py +145 -0
- soothe_nano-0.9.0/src/soothe_nano/filesystem/factory.py +484 -0
- soothe_nano-0.9.0/src/soothe_nano/filesystem/grep_search.py +546 -0
- soothe_nano-0.9.0/src/soothe_nano/filesystem/langchain_adapter.py +981 -0
- soothe_nano-0.9.0/src/soothe_nano/filesystem/local.py +1592 -0
- soothe_nano-0.9.0/src/soothe_nano/filesystem/protocol.py +353 -0
- soothe_nano-0.9.0/src/soothe_nano/filesystem/unified.py +848 -0
- soothe_nano-0.9.0/src/soothe_nano/filesystem/workspace.py +759 -0
- soothe_nano-0.9.0/src/soothe_nano/logging/__init__.py +13 -0
- soothe_nano-0.9.0/src/soothe_nano/logging/context.py +28 -0
- soothe_nano-0.9.0/src/soothe_nano/logging/setup.py +221 -0
- soothe_nano-0.9.0/src/soothe_nano/logging/thread_logger.py +385 -0
- soothe_nano-0.9.0/src/soothe_nano/mcp/__init__.py +30 -0
- soothe_nano-0.9.0/src/soothe_nano/mcp/cleanup.py +196 -0
- soothe_nano-0.9.0/src/soothe_nano/mcp/mcp_config.py +173 -0
- soothe_nano-0.9.0/src/soothe_nano/mcp/mcp_events.py +313 -0
- soothe_nano-0.9.0/src/soothe_nano/mcp/mcp_progressive.py +168 -0
- soothe_nano-0.9.0/src/soothe_nano/mcp/mcp_registry.py +305 -0
- soothe_nano-0.9.0/src/soothe_nano/mcp/mcp_registry_support.py +191 -0
- soothe_nano-0.9.0/src/soothe_nano/mcp/mcp_resource_tools.py +103 -0
- soothe_nano-0.9.0/src/soothe_nano/mcp/mcp_utils.py +157 -0
- soothe_nano-0.9.0/src/soothe_nano/mcp/reconnect.py +182 -0
- soothe_nano-0.9.0/src/soothe_nano/middleware/__init__.py +158 -0
- soothe_nano-0.9.0/src/soothe_nano/middleware/_builder.py +350 -0
- soothe_nano-0.9.0/src/soothe_nano/middleware/_tool_context.py +182 -0
- soothe_nano-0.9.0/src/soothe_nano/middleware/code_interpreter.py +212 -0
- soothe_nano-0.9.0/src/soothe_nano/middleware/edit_coalescing.py +918 -0
- soothe_nano-0.9.0/src/soothe_nano/middleware/filesystem.py +285 -0
- soothe_nano-0.9.0/src/soothe_nano/middleware/mcp_activation.py +241 -0
- soothe_nano-0.9.0/src/soothe_nano/middleware/model_call_profiler.py +579 -0
- soothe_nano-0.9.0/src/soothe_nano/middleware/per_turn_model.py +61 -0
- soothe_nano-0.9.0/src/soothe_nano/middleware/policy.py +153 -0
- soothe_nano-0.9.0/src/soothe_nano/middleware/progressive_listing.py +279 -0
- soothe_nano-0.9.0/src/soothe_nano/middleware/progressive_tools.py +245 -0
- soothe_nano-0.9.0/src/soothe_nano/middleware/role_routing.py +141 -0
- soothe_nano-0.9.0/src/soothe_nano/middleware/skill_activation.py +464 -0
- soothe_nano-0.9.0/src/soothe_nano/middleware/system_prompt.py +734 -0
- soothe_nano-0.9.0/src/soothe_nano/middleware/tool_call_args_middleware.py +59 -0
- soothe_nano-0.9.0/src/soothe_nano/middleware/tool_call_args_registry.py +81 -0
- soothe_nano-0.9.0/src/soothe_nano/middleware/tool_enforcement.py +134 -0
- soothe_nano-0.9.0/src/soothe_nano/middleware/tool_name_hints.py +176 -0
- soothe_nano-0.9.0/src/soothe_nano/middleware/tool_optimization_middleware.py +275 -0
- soothe_nano-0.9.0/src/soothe_nano/middleware/workspace_context.py +125 -0
- soothe_nano-0.9.0/src/soothe_nano/paths/__init__.py +17 -0
- soothe_nano-0.9.0/src/soothe_nano/paths/sqlite_paths.py +25 -0
- soothe_nano-0.9.0/src/soothe_nano/paths/thread_paths.py +43 -0
- soothe_nano-0.9.0/src/soothe_nano/persistence/db_init/__init__.py +33 -0
- soothe_nano-0.9.0/src/soothe_nano/persistence/db_init/runner.py +471 -0
- soothe_nano-0.9.0/src/soothe_nano/persistence/persist_metrics.py +33 -0
- soothe_nano-0.9.0/src/soothe_nano/persistence/postgres_pool_lifecycle.py +134 -0
- soothe_nano-0.9.0/src/soothe_nano/persistence/postgres_pool_registry.py +236 -0
- soothe_nano-0.9.0/src/soothe_nano/persistence/postgres_provisioning.py +214 -0
- soothe_nano-0.9.0/src/soothe_nano/persistence/retry_utils.py +189 -0
- soothe_nano-0.9.0/src/soothe_nano/persistence/shared_metadata_pool.py +107 -0
- soothe_nano-0.9.0/src/soothe_nano/persistence/sql/soothe_checkpoints/init.sql +111 -0
- soothe_nano-0.9.0/src/soothe_nano/persistence/sql/soothe_metadata/init.sql +118 -0
- soothe_nano-0.9.0/src/soothe_nano/persistence/sql/soothe_vectors/init.sql +9 -0
- soothe_nano-0.9.0/src/soothe_nano/persistence/unified.py +71 -0
- soothe_nano-0.9.0/src/soothe_nano/plugin/__init__.py +85 -0
- soothe_nano-0.9.0/src/soothe_nano/plugin/cache.py +42 -0
- soothe_nano-0.9.0/src/soothe_nano/plugin/context.py +81 -0
- soothe_nano-0.9.0/src/soothe_nano/plugin/discovery.py +260 -0
- soothe_nano-0.9.0/src/soothe_nano/plugin/events.py +118 -0
- soothe_nano-0.9.0/src/soothe_nano/plugin/exceptions.py +107 -0
- soothe_nano-0.9.0/src/soothe_nano/plugin/global_registry.py +100 -0
- soothe_nano-0.9.0/src/soothe_nano/plugin/lazy.py +71 -0
- soothe_nano-0.9.0/src/soothe_nano/plugin/lifecycle.py +421 -0
- soothe_nano-0.9.0/src/soothe_nano/plugin/loader.py +323 -0
- soothe_nano-0.9.0/src/soothe_nano/plugin/manifest.py +12 -0
- soothe_nano-0.9.0/src/soothe_nano/plugin/registry.py +296 -0
- soothe_nano-0.9.0/src/soothe_nano/prompts/__init__.py +29 -0
- soothe_nano-0.9.0/src/soothe_nano/prompts/context_xml.py +229 -0
- soothe_nano-0.9.0/src/soothe_nano/prompts/fragments/__init__.py +32 -0
- soothe_nano-0.9.0/src/soothe_nano/prompts/fragments/system/prompts/assistant_identity.xml +6 -0
- soothe_nano-0.9.0/src/soothe_nano/prompts/fragments/system/prompts/default_system_body.xml +6 -0
- soothe_nano-0.9.0/src/soothe_nano/prompts/fragments/system/prompts/medium_system.xml +6 -0
- soothe_nano-0.9.0/src/soothe_nano/prompts/fragments/system/prompts/simple_system.xml +1 -0
- soothe_nano-0.9.0/src/soothe_nano/prompts/identity.py +50 -0
- soothe_nano-0.9.0/src/soothe_nano/prompts/project_instructions.py +195 -0
- soothe_nano-0.9.0/src/soothe_nano/prompts/system_templates.py +224 -0
- soothe_nano-0.9.0/src/soothe_nano/resolve/__init__.py +122 -0
- soothe_nano-0.9.0/src/soothe_nano/resolve/_lazy_subagent.py +145 -0
- soothe_nano-0.9.0/src/soothe_nano/resolve/_resolver_infra.py +228 -0
- soothe_nano-0.9.0/src/soothe_nano/resolve/_resolver_tools.py +655 -0
- soothe_nano-0.9.0/src/soothe_nano/resolve/_tool_cache.py +66 -0
- soothe_nano-0.9.0/src/soothe_nano/resolve/shared_checkpointer_pool.py +233 -0
- soothe_nano-0.9.0/src/soothe_nano/security/README.md +45 -0
- soothe_nano-0.9.0/src/soothe_nano/security/__init__.py +6 -0
- soothe_nano-0.9.0/src/soothe_nano/security/operation_guard.py +201 -0
- soothe_nano-0.9.0/src/soothe_nano/security/path_security.py +416 -0
- soothe_nano-0.9.0/src/soothe_nano/security/policy_models.py +406 -0
- soothe_nano-0.9.0/src/soothe_nano/security/policy_profiles.py +365 -0
- soothe_nano-0.9.0/src/soothe_nano/security/security_api.py +71 -0
- soothe_nano-0.9.0/src/soothe_nano/security/security_enforcer.py +400 -0
- soothe_nano-0.9.0/src/soothe_nano/skills/__init__.py +28 -0
- soothe_nano-0.9.0/src/soothe_nano/skills/budget.py +118 -0
- soothe_nano-0.9.0/src/soothe_nano/skills/builtin_skills/README.md +80 -0
- soothe_nano-0.9.0/src/soothe_nano/skills/builtin_skills/clawhub/SKILL.md +118 -0
- soothe_nano-0.9.0/src/soothe_nano/skills/builtin_skills/github/SKILL.md +49 -0
- soothe_nano-0.9.0/src/soothe_nano/skills/builtin_skills/skill-creator/SKILL.md +409 -0
- soothe_nano-0.9.0/src/soothe_nano/skills/builtin_skills/skill-creator/scripts/init_skill.py +383 -0
- soothe_nano-0.9.0/src/soothe_nano/skills/builtin_skills/skill-creator/scripts/package_skill.py +135 -0
- soothe_nano-0.9.0/src/soothe_nano/skills/builtin_skills/skill-creator/scripts/quick_validate.py +204 -0
- soothe_nano-0.9.0/src/soothe_nano/skills/builtin_skills/weather/SKILL.md +50 -0
- soothe_nano-0.9.0/src/soothe_nano/skills/builtins.py +66 -0
- soothe_nano-0.9.0/src/soothe_nano/skills/catalog.py +583 -0
- soothe_nano-0.9.0/src/soothe_nano/skills/corpus_match.py +135 -0
- soothe_nano-0.9.0/src/soothe_nano/skills/discovery_tools.py +60 -0
- soothe_nano-0.9.0/src/soothe_nano/skills/events.py +46 -0
- soothe_nano-0.9.0/src/soothe_nano/skills/index.py +278 -0
- soothe_nano-0.9.0/src/soothe_nano/skills/registry.py +317 -0
- soothe_nano-0.9.0/src/soothe_nano/skills/search.py +158 -0
- soothe_nano-0.9.0/src/soothe_nano/skills/workspace_sync.py +234 -0
- soothe_nano-0.9.0/src/soothe_nano/subagents/__init__.py +11 -0
- soothe_nano-0.9.0/src/soothe_nano/subagents/_research_json_util.py +55 -0
- soothe_nano-0.9.0/src/soothe_nano/subagents/_research_timeouts.py +32 -0
- soothe_nano-0.9.0/src/soothe_nano/subagents/_research_topic_util.py +91 -0
- soothe_nano-0.9.0/src/soothe_nano/subagents/academic_research/__init__.py +72 -0
- soothe_nano-0.9.0/src/soothe_nano/subagents/academic_research/display_summary.py +93 -0
- soothe_nano-0.9.0/src/soothe_nano/subagents/academic_research/effort.py +108 -0
- soothe_nano-0.9.0/src/soothe_nano/subagents/academic_research/engine.py +628 -0
- soothe_nano-0.9.0/src/soothe_nano/subagents/academic_research/events.py +118 -0
- soothe_nano-0.9.0/src/soothe_nano/subagents/academic_research/implementation.py +81 -0
- soothe_nano-0.9.0/src/soothe_nano/subagents/academic_research/json_util.py +17 -0
- soothe_nano-0.9.0/src/soothe_nano/subagents/academic_research/persistence.py +99 -0
- soothe_nano-0.9.0/src/soothe_nano/subagents/academic_research/protocol.py +97 -0
- soothe_nano-0.9.0/src/soothe_nano/subagents/academic_research/references.py +92 -0
- soothe_nano-0.9.0/src/soothe_nano/subagents/academic_research/report_classifier.py +168 -0
- soothe_nano-0.9.0/src/soothe_nano/subagents/academic_research/sources/__init__.py +5 -0
- soothe_nano-0.9.0/src/soothe_nano/subagents/academic_research/sources/academic_search.py +178 -0
- soothe_nano-0.9.0/src/soothe_nano/subagents/academic_research/termination.py +202 -0
- soothe_nano-0.9.0/src/soothe_nano/subagents/browser_use/__init__.py +122 -0
- soothe_nano-0.9.0/src/soothe_nano/subagents/browser_use/_preview.py +16 -0
- soothe_nano-0.9.0/src/soothe_nano/subagents/browser_use/_runtime.py +121 -0
- soothe_nano-0.9.0/src/soothe_nano/subagents/browser_use/action_format.py +122 -0
- soothe_nano-0.9.0/src/soothe_nano/subagents/browser_use/config_model.py +60 -0
- soothe_nano-0.9.0/src/soothe_nano/subagents/browser_use/display_summary.py +18 -0
- soothe_nano-0.9.0/src/soothe_nano/subagents/browser_use/events.py +80 -0
- soothe_nano-0.9.0/src/soothe_nano/subagents/browser_use/implementation.py +807 -0
- soothe_nano-0.9.0/src/soothe_nano/subagents/deep_research/__init__.py +71 -0
- soothe_nano-0.9.0/src/soothe_nano/subagents/deep_research/display_summary.py +92 -0
- soothe_nano-0.9.0/src/soothe_nano/subagents/deep_research/effort.py +108 -0
- soothe_nano-0.9.0/src/soothe_nano/subagents/deep_research/engine.py +626 -0
- soothe_nano-0.9.0/src/soothe_nano/subagents/deep_research/events.py +112 -0
- soothe_nano-0.9.0/src/soothe_nano/subagents/deep_research/implementation.py +81 -0
- soothe_nano-0.9.0/src/soothe_nano/subagents/deep_research/json_util.py +17 -0
- soothe_nano-0.9.0/src/soothe_nano/subagents/deep_research/persistence.py +99 -0
- soothe_nano-0.9.0/src/soothe_nano/subagents/deep_research/protocol.py +92 -0
- soothe_nano-0.9.0/src/soothe_nano/subagents/deep_research/references.py +92 -0
- soothe_nano-0.9.0/src/soothe_nano/subagents/deep_research/report_classifier.py +170 -0
- soothe_nano-0.9.0/src/soothe_nano/subagents/deep_research/sources/__init__.py +5 -0
- soothe_nano-0.9.0/src/soothe_nano/subagents/deep_research/sources/web_search.py +279 -0
- soothe_nano-0.9.0/src/soothe_nano/subagents/deep_research/termination.py +202 -0
- soothe_nano-0.9.0/src/soothe_nano/subagents/explore/__init__.py +80 -0
- soothe_nano-0.9.0/src/soothe_nano/subagents/explore/engine.py +76 -0
- soothe_nano-0.9.0/src/soothe_nano/subagents/explore/events.py +96 -0
- soothe_nano-0.9.0/src/soothe_nano/subagents/explore/findings.py +111 -0
- soothe_nano-0.9.0/src/soothe_nano/subagents/explore/implementation.py +80 -0
- soothe_nano-0.9.0/src/soothe_nano/subagents/explore/middleware.py +1183 -0
- soothe_nano-0.9.0/src/soothe_nano/subagents/explore/normalize.py +88 -0
- soothe_nano-0.9.0/src/soothe_nano/subagents/explore/partial.py +113 -0
- soothe_nano-0.9.0/src/soothe_nano/subagents/explore/prompts.py +73 -0
- soothe_nano-0.9.0/src/soothe_nano/subagents/explore/recovery.py +142 -0
- soothe_nano-0.9.0/src/soothe_nano/subagents/explore/schemas.py +247 -0
- soothe_nano-0.9.0/src/soothe_nano/subagents/explore/search_target.py +53 -0
- soothe_nano-0.9.0/src/soothe_nano/subagents/explore/tools.py +114 -0
- soothe_nano-0.9.0/src/soothe_nano/subagents/plan/__init__.py +57 -0
- soothe_nano-0.9.0/src/soothe_nano/subagents/plan/engine.py +148 -0
- soothe_nano-0.9.0/src/soothe_nano/subagents/plan/implementation.py +51 -0
- soothe_nano-0.9.0/src/soothe_nano/subagents/plan/schemas.py +31 -0
- soothe_nano-0.9.0/src/soothe_nano/subagents/research_wire.py +56 -0
- soothe_nano-0.9.0/src/soothe_nano/toolkits/__init__.py +1 -0
- soothe_nano-0.9.0/src/soothe_nano/toolkits/_internal/__init__.py +5 -0
- soothe_nano-0.9.0/src/soothe_nano/toolkits/_internal/backend_ops.py +237 -0
- soothe_nano-0.9.0/src/soothe_nano/toolkits/_internal/document.py +381 -0
- soothe_nano-0.9.0/src/soothe_nano/toolkits/_internal/local_path_resolution.py +43 -0
- soothe_nano-0.9.0/src/soothe_nano/toolkits/_internal/tabular.py +167 -0
- soothe_nano-0.9.0/src/soothe_nano/toolkits/_internal/wizsearch.py +632 -0
- soothe_nano-0.9.0/src/soothe_nano/toolkits/data.py +484 -0
- soothe_nano-0.9.0/src/soothe_nano/toolkits/datetime.py +88 -0
- soothe_nano-0.9.0/src/soothe_nano/toolkits/deepxiv.py +931 -0
- soothe_nano-0.9.0/src/soothe_nano/toolkits/execution.py +1095 -0
- soothe_nano-0.9.0/src/soothe_nano/toolkits/file_ops.py +85 -0
- soothe_nano-0.9.0/src/soothe_nano/toolkits/file_ops_catalog.py +89 -0
- soothe_nano-0.9.0/src/soothe_nano/toolkits/http_requests.py +97 -0
- soothe_nano-0.9.0/src/soothe_nano/toolkits/progressive/__init__.py +21 -0
- soothe_nano-0.9.0/src/soothe_nano/toolkits/progressive/budget.py +174 -0
- soothe_nano-0.9.0/src/soothe_nano/toolkits/progressive/registry.py +184 -0
- soothe_nano-0.9.0/src/soothe_nano/toolkits/progressive/search_tool.py +34 -0
- soothe_nano-0.9.0/src/soothe_nano/toolkits/shell_compat.py +33 -0
- soothe_nano-0.9.0/src/soothe_nano/toolkits/url_crawl/__init__.py +16 -0
- soothe_nano-0.9.0/src/soothe_nano/toolkits/url_crawl/crawler.py +118 -0
- soothe_nano-0.9.0/src/soothe_nano/toolkits/url_crawl/polite_http.py +473 -0
- soothe_nano-0.9.0/src/soothe_nano/toolkits/wizsearch.py +345 -0
- soothe_nano-0.9.0/src/soothe_nano/utils/__init__.py +15 -0
- soothe_nano-0.9.0/src/soothe_nano/utils/browser_cdp.py +220 -0
- soothe_nano-0.9.0/src/soothe_nano/utils/circuit_breaker.py +294 -0
- soothe_nano-0.9.0/src/soothe_nano/utils/embeddings_dashscope.py +158 -0
- soothe_nano-0.9.0/src/soothe_nano/utils/embeddings_dashscope_openai.py +235 -0
- soothe_nano-0.9.0/src/soothe_nano/utils/error_format.py +190 -0
- soothe_nano-0.9.0/src/soothe_nano/utils/json_parsing.py +270 -0
- soothe_nano-0.9.0/src/soothe_nano/utils/llm/__init__.py +86 -0
- soothe_nano-0.9.0/src/soothe_nano/utils/llm/factory.py +312 -0
- soothe_nano-0.9.0/src/soothe_nano/utils/llm/invoke_policy.py +103 -0
- soothe_nano-0.9.0/src/soothe_nano/utils/llm/observability.py +321 -0
- soothe_nano-0.9.0/src/soothe_nano/utils/llm/registry.py +161 -0
- soothe_nano-0.9.0/src/soothe_nano/utils/llm/response_text.py +80 -0
- soothe_nano-0.9.0/src/soothe_nano/utils/llm/schema_wire.py +59 -0
- soothe_nano-0.9.0/src/soothe_nano/utils/llm/structured.py +379 -0
- soothe_nano-0.9.0/src/soothe_nano/utils/llm/types.py +70 -0
- soothe_nano-0.9.0/src/soothe_nano/utils/llm/wrappers.py +482 -0
- soothe_nano-0.9.0/src/soothe_nano/utils/outcome_preview.py +10 -0
- soothe_nano-0.9.0/src/soothe_nano/utils/output_capture.py +190 -0
- soothe_nano-0.9.0/src/soothe_nano/utils/path.py +44 -0
- soothe_nano-0.9.0/src/soothe_nano/utils/progress.py +219 -0
- soothe_nano-0.9.0/src/soothe_nano/utils/prompt_clock.py +67 -0
- soothe_nano-0.9.0/src/soothe_nano/utils/runtime.py +218 -0
- soothe_nano-0.9.0/src/soothe_nano/utils/subagent_emit.py +39 -0
- soothe_nano-0.9.0/src/soothe_nano/utils/text_preview.py +381 -0
- soothe_nano-0.9.0/src/soothe_nano/utils/thread_id.py +10 -0
- soothe_nano-0.9.0/src/soothe_nano/utils/token_counting.py +68 -0
- soothe_nano-0.9.0/src/soothe_nano/utils/token_usage.py +161 -0
- soothe_nano-0.9.0/src/soothe_nano/utils/tool_error_handler.py +115 -0
- soothe_nano-0.9.0/src/soothe_nano/utils/url_validation.py +35 -0
- soothe_nano-0.9.0/src/soothe_nano/workspace/__init__.py +55 -0
- soothe_nano-0.9.0/src/soothe_nano/workspace/workspace_api.py +80 -0
- soothe_nano-0.9.0/src/soothe_nano/workspace/workspace_filesystem.py +664 -0
- soothe_nano-0.9.0/src/soothe_nano/workspace/workspace_paths.py +145 -0
- soothe_nano-0.9.0/src/soothe_nano/workspace/workspace_policy.py +199 -0
- soothe_nano-0.9.0/src/soothe_nano/workspace/workspace_runtime.py +151 -0
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
__pycache__/
|
|
2
|
+
*.py[cod]
|
|
3
|
+
*$py.class
|
|
4
|
+
*.so
|
|
5
|
+
.Python
|
|
6
|
+
build/
|
|
7
|
+
develop-eggs/
|
|
8
|
+
dist/
|
|
9
|
+
downloads/
|
|
10
|
+
eggs/
|
|
11
|
+
.eggs/
|
|
12
|
+
lib/
|
|
13
|
+
lib64/
|
|
14
|
+
parts/
|
|
15
|
+
sdist/
|
|
16
|
+
var/
|
|
17
|
+
wheels/
|
|
18
|
+
*.egg-info/
|
|
19
|
+
.installed.cfg
|
|
20
|
+
*.egg
|
|
21
|
+
.pytest_cache/
|
|
22
|
+
.coverage
|
|
23
|
+
.coverage.*
|
|
24
|
+
coverage.xml
|
|
25
|
+
htmlcov/
|
|
26
|
+
.ruff_cache/
|
|
27
|
+
.mypy_cache/
|
|
28
|
+
.vscode/
|
|
29
|
+
.idea/
|
|
30
|
+
*.swp
|
|
31
|
+
*.swo
|
|
32
|
+
.env
|
|
33
|
+
.venv
|
|
34
|
+
venv/
|
|
35
|
+
ENV/
|
|
36
|
+
env/
|
|
37
|
+
.DS_Store
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: soothe-nano
|
|
3
|
+
Version: 0.9.0
|
|
4
|
+
Summary: Soothe Nano — batteries-included Coding CoreAgent on deepagents
|
|
5
|
+
Project-URL: Homepage, https://github.com/mirasoth/soothe-nano
|
|
6
|
+
Project-URL: Documentation, https://soothe.readthedocs.io
|
|
7
|
+
Project-URL: Repository, https://github.com/mirasoth/soothe-nano
|
|
8
|
+
License: MIT
|
|
9
|
+
Keywords: agents,ai,coreagent,deepagents,langgraph,llm,nano,soothe
|
|
10
|
+
Classifier: Development Status :: 3 - Alpha
|
|
11
|
+
Classifier: Intended Audience :: Developers
|
|
12
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
13
|
+
Classifier: Programming Language :: Python :: 3
|
|
14
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
18
|
+
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
|
19
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
20
|
+
Requires-Python: <3.15,>=3.11
|
|
21
|
+
Requires-Dist: aiofiles>=24.1.0
|
|
22
|
+
Requires-Dist: aiohttp<4.0.0,>=3.9.0
|
|
23
|
+
Requires-Dist: aiosqlite<1.0.0,>=0.22.1
|
|
24
|
+
Requires-Dist: anthropic<1.0.0,>=0.96.0
|
|
25
|
+
Requires-Dist: anyio<5.0.0,>=3.0.0
|
|
26
|
+
Requires-Dist: arxiv>=2.1.0
|
|
27
|
+
Requires-Dist: asyncpg<1.0.0,>=0.30.0
|
|
28
|
+
Requires-Dist: bubus>=1.5.6
|
|
29
|
+
Requires-Dist: chardet<6
|
|
30
|
+
Requires-Dist: dashscope>=1.20.0
|
|
31
|
+
Requires-Dist: deepxiv-sdk>=0.2.5
|
|
32
|
+
Requires-Dist: docx2txt>=0.8.0
|
|
33
|
+
Requires-Dist: jinja2>=3.1.0
|
|
34
|
+
Requires-Dist: jsonschema<5.0.0,>=4.0.0
|
|
35
|
+
Requires-Dist: langchain-community<1.0.0,>=0.3.0
|
|
36
|
+
Requires-Dist: langchain-core<2.0.0,>=1.2.18
|
|
37
|
+
Requires-Dist: langchain-experimental<1.0.0,>=0.0.50
|
|
38
|
+
Requires-Dist: langchain-mcp-adapters<1.0.0,>=0.2.0
|
|
39
|
+
Requires-Dist: langchain-openai<1.0.0,>=0.3.0
|
|
40
|
+
Requires-Dist: langchain-quickjs>=0.1.0
|
|
41
|
+
Requires-Dist: langchain-tavily>=0.2.17
|
|
42
|
+
Requires-Dist: langchain<2.0.0,>=1.2.11
|
|
43
|
+
Requires-Dist: langgraph-checkpoint-postgres<4.0.0,>=3.1.0
|
|
44
|
+
Requires-Dist: langgraph-checkpoint-sqlite<4.0.0,>=3.0.0
|
|
45
|
+
Requires-Dist: langgraph-checkpoint<5.0.0,>=4.0.0
|
|
46
|
+
Requires-Dist: langgraph<2.0.0,>=1.1.1
|
|
47
|
+
Requires-Dist: openai<3.0.0,>=1.104.2
|
|
48
|
+
Requires-Dist: openpyxl>=3.1.0
|
|
49
|
+
Requires-Dist: pandas>=2.0.0
|
|
50
|
+
Requires-Dist: pathspec<2.0.0,>=0.12.0
|
|
51
|
+
Requires-Dist: pexpect<5.0.0,>=4.9.0
|
|
52
|
+
Requires-Dist: psycopg[binary,pool]<4.0.0,>=3.2.0
|
|
53
|
+
Requires-Dist: pydantic-settings<3.0.0,>=2.0.0
|
|
54
|
+
Requires-Dist: pydantic<3.0.0,>=2.0.0
|
|
55
|
+
Requires-Dist: pyjwt<3.0.0,>=2.8.0
|
|
56
|
+
Requires-Dist: pymupdf>=1.24.0
|
|
57
|
+
Requires-Dist: python-dotenv<2.0.0,>=1.0.0
|
|
58
|
+
Requires-Dist: pyyaml<7.0.0,>=6.0.0
|
|
59
|
+
Requires-Dist: requests<3.0.0,>=2.32.3
|
|
60
|
+
Requires-Dist: soothe-deepagents<1.0.0,>=0.7.22
|
|
61
|
+
Requires-Dist: soothe-sdk<2.0.0,>=1.0.2
|
|
62
|
+
Requires-Dist: sqlite-vec>=0.1.0
|
|
63
|
+
Requires-Dist: tavily-python>=0.5.0
|
|
64
|
+
Requires-Dist: watchdog<5.0.0,>=3.0.0
|
|
65
|
+
Requires-Dist: wizsearch<2.0.0,>=1.1.8
|
|
66
|
+
Provides-Extra: dev
|
|
67
|
+
Requires-Dist: mypy>=1.0.0; extra == 'dev'
|
|
68
|
+
Requires-Dist: pytest-asyncio>=1.3.0; extra == 'dev'
|
|
69
|
+
Requires-Dist: pytest-cov; extra == 'dev'
|
|
70
|
+
Requires-Dist: pytest>=8.0.0; extra == 'dev'
|
|
71
|
+
Requires-Dist: ruff>=0.12.0; extra == 'dev'
|
|
72
|
+
Requires-Dist: twine>=5.0.0; extra == 'dev'
|
|
73
|
+
Description-Content-Type: text/markdown
|
|
74
|
+
|
|
75
|
+
# soothe-nano
|
|
76
|
+
|
|
77
|
+
A **ready-to-run coding agent** you can drop into a script or app.
|
|
78
|
+
|
|
79
|
+
Built on [soothe-deepagents](https://github.com/mirasoth/soothe-deepagents) (filesystem, shell, subagents, skills, MCP). Nano adds the pieces you usually wire yourself: workspace safety, progressive tools/skills, research & explore subagents, and a config-driven factory.
|
|
80
|
+
|
|
81
|
+
## Vision
|
|
82
|
+
|
|
83
|
+
Give builders a production-shaped coding CoreAgent in a few lines of Python.
|
|
84
|
+
|
|
85
|
+
- **Start small** — chat, tools, or full composition
|
|
86
|
+
- **Stay portable** — embed in notebooks, CLIs, or your own service
|
|
87
|
+
- **Compose what you need** — tools, memory, subagents, skills, and MCP via config
|
|
88
|
+
|
|
89
|
+
## Architecture
|
|
90
|
+
|
|
91
|
+
```
|
|
92
|
+
soothe-deepagents agent harness (FS, shell, memory, skills base)
|
|
93
|
+
↓
|
|
94
|
+
soothe-sdk shared contracts (protocols, events)
|
|
95
|
+
↓
|
|
96
|
+
soothe-nano coding CoreAgent + toolkits + subagents + MCP
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
```text
|
|
100
|
+
create_nano_agent(config)
|
|
101
|
+
│
|
|
102
|
+
├─ model + middleware stack
|
|
103
|
+
├─ tools (builtin groups + yours)
|
|
104
|
+
├─ subagents (explorer, planner, research, browser, …)
|
|
105
|
+
├─ skills (progressive discovery)
|
|
106
|
+
└─ MCP (on-demand activation)
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
## Features
|
|
110
|
+
|
|
111
|
+
| Area | What nano provides |
|
|
112
|
+
|---|---|
|
|
113
|
+
| Tools | Builtin groups: shell, file ops, HTTP, search, data, … |
|
|
114
|
+
| Subagents | Ready: explore, plan, deep/academic research, browser |
|
|
115
|
+
| Skills / tools in context | Progressive loading — activate what the turn needs |
|
|
116
|
+
| Workspace | Scoped workspace + security defaults |
|
|
117
|
+
| Config | YAML / `SootheConfig` factory |
|
|
118
|
+
| Memory | Optional long-term memory via protocols |
|
|
119
|
+
| MCP | Registry and on-demand adapters |
|
|
120
|
+
|
|
121
|
+
## vs deepagents
|
|
122
|
+
|
|
123
|
+
| | deepagents | soothe-nano |
|
|
124
|
+
|---|---|---|
|
|
125
|
+
| What you get | Opinionated harness | Harness **plus** coding product defaults |
|
|
126
|
+
| Tools | Bring your own | Builtin groups out of the box |
|
|
127
|
+
| Subagents | You define them | Ready explore / plan / research / browser |
|
|
128
|
+
| Skills / tools in context | Base support | Progressive loading |
|
|
129
|
+
| Workspace | Pluggable backends | Scoped workspace + security defaults |
|
|
130
|
+
| Config | Code-first | YAML / `SootheConfig` factory |
|
|
131
|
+
|
|
132
|
+
Use **deepagents** when you want a minimal harness and full control.
|
|
133
|
+
Use **nano** when you want a coding agent that already knows how to work in a repo.
|
|
134
|
+
|
|
135
|
+
## When to use nano
|
|
136
|
+
|
|
137
|
+
| Scenario | Fit |
|
|
138
|
+
|---|---|
|
|
139
|
+
| Coding assistant in a repo | ✅ Files, shell, explore/plan out of the box |
|
|
140
|
+
| Research / browsing agent | ✅ Deep research, academic, browser subagents |
|
|
141
|
+
| Embed in your product | ✅ Library API, no daemon required |
|
|
142
|
+
| Plugin / toolkit author | ✅ Depends on nano only |
|
|
143
|
+
| Simple Q&A chat | ✅ Strip tools/subagents as needed |
|
|
144
|
+
|
|
145
|
+
## Install
|
|
146
|
+
|
|
147
|
+
```bash
|
|
148
|
+
uv add soothe-nano
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
## Quick start
|
|
152
|
+
|
|
153
|
+
```python
|
|
154
|
+
from soothe_nano import create_nano_agent
|
|
155
|
+
from soothe_nano.config import SootheConfig
|
|
156
|
+
|
|
157
|
+
agent = create_nano_agent(SootheConfig())
|
|
158
|
+
# agent.ainvoke / streaming — see examples/
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
Examples live in `examples/nano_agent/`:
|
|
162
|
+
|
|
163
|
+
1. Pure model (no tools)
|
|
164
|
+
2. With tools
|
|
165
|
+
3. With memory
|
|
166
|
+
4. With subagents
|
|
167
|
+
5. Full composition
|
|
168
|
+
|
|
169
|
+
```bash
|
|
170
|
+
python packages/soothe-nano/examples/nano_agent/01_pure_nano_example.py
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
## Package layout
|
|
174
|
+
|
|
175
|
+
```
|
|
176
|
+
soothe_nano/
|
|
177
|
+
agent/ CodingCoreAgent, create_nano_agent
|
|
178
|
+
config/ SootheConfig
|
|
179
|
+
toolkits/ Builtin tool groups
|
|
180
|
+
subagents/ explore, plan, research, browser, …
|
|
181
|
+
middleware/ Progressive tools/skills, workspace, policy
|
|
182
|
+
skills/ Catalog + progressive search
|
|
183
|
+
mcp/ MCP registry / adapters
|
|
184
|
+
backends/ Persistence helpers
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
## Development
|
|
188
|
+
|
|
189
|
+
From `packages/soothe-nano/`:
|
|
190
|
+
|
|
191
|
+
```bash
|
|
192
|
+
make help # list targets
|
|
193
|
+
make sync-dev # sync deps
|
|
194
|
+
make format lint # format + lint
|
|
195
|
+
make test-unit # unit tests
|
|
196
|
+
make test-integration # integration tests (--run-integration)
|
|
197
|
+
make examples # run nano_agent examples
|
|
198
|
+
make build # build dist/
|
|
199
|
+
```
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
# soothe-nano
|
|
2
|
+
|
|
3
|
+
A **ready-to-run coding agent** you can drop into a script or app.
|
|
4
|
+
|
|
5
|
+
Built on [soothe-deepagents](https://github.com/mirasoth/soothe-deepagents) (filesystem, shell, subagents, skills, MCP). Nano adds the pieces you usually wire yourself: workspace safety, progressive tools/skills, research & explore subagents, and a config-driven factory.
|
|
6
|
+
|
|
7
|
+
## Vision
|
|
8
|
+
|
|
9
|
+
Give builders a production-shaped coding CoreAgent in a few lines of Python.
|
|
10
|
+
|
|
11
|
+
- **Start small** — chat, tools, or full composition
|
|
12
|
+
- **Stay portable** — embed in notebooks, CLIs, or your own service
|
|
13
|
+
- **Compose what you need** — tools, memory, subagents, skills, and MCP via config
|
|
14
|
+
|
|
15
|
+
## Architecture
|
|
16
|
+
|
|
17
|
+
```
|
|
18
|
+
soothe-deepagents agent harness (FS, shell, memory, skills base)
|
|
19
|
+
↓
|
|
20
|
+
soothe-sdk shared contracts (protocols, events)
|
|
21
|
+
↓
|
|
22
|
+
soothe-nano coding CoreAgent + toolkits + subagents + MCP
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
```text
|
|
26
|
+
create_nano_agent(config)
|
|
27
|
+
│
|
|
28
|
+
├─ model + middleware stack
|
|
29
|
+
├─ tools (builtin groups + yours)
|
|
30
|
+
├─ subagents (explorer, planner, research, browser, …)
|
|
31
|
+
├─ skills (progressive discovery)
|
|
32
|
+
└─ MCP (on-demand activation)
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## Features
|
|
36
|
+
|
|
37
|
+
| Area | What nano provides |
|
|
38
|
+
|---|---|
|
|
39
|
+
| Tools | Builtin groups: shell, file ops, HTTP, search, data, … |
|
|
40
|
+
| Subagents | Ready: explore, plan, deep/academic research, browser |
|
|
41
|
+
| Skills / tools in context | Progressive loading — activate what the turn needs |
|
|
42
|
+
| Workspace | Scoped workspace + security defaults |
|
|
43
|
+
| Config | YAML / `SootheConfig` factory |
|
|
44
|
+
| Memory | Optional long-term memory via protocols |
|
|
45
|
+
| MCP | Registry and on-demand adapters |
|
|
46
|
+
|
|
47
|
+
## vs deepagents
|
|
48
|
+
|
|
49
|
+
| | deepagents | soothe-nano |
|
|
50
|
+
|---|---|---|
|
|
51
|
+
| What you get | Opinionated harness | Harness **plus** coding product defaults |
|
|
52
|
+
| Tools | Bring your own | Builtin groups out of the box |
|
|
53
|
+
| Subagents | You define them | Ready explore / plan / research / browser |
|
|
54
|
+
| Skills / tools in context | Base support | Progressive loading |
|
|
55
|
+
| Workspace | Pluggable backends | Scoped workspace + security defaults |
|
|
56
|
+
| Config | Code-first | YAML / `SootheConfig` factory |
|
|
57
|
+
|
|
58
|
+
Use **deepagents** when you want a minimal harness and full control.
|
|
59
|
+
Use **nano** when you want a coding agent that already knows how to work in a repo.
|
|
60
|
+
|
|
61
|
+
## When to use nano
|
|
62
|
+
|
|
63
|
+
| Scenario | Fit |
|
|
64
|
+
|---|---|
|
|
65
|
+
| Coding assistant in a repo | ✅ Files, shell, explore/plan out of the box |
|
|
66
|
+
| Research / browsing agent | ✅ Deep research, academic, browser subagents |
|
|
67
|
+
| Embed in your product | ✅ Library API, no daemon required |
|
|
68
|
+
| Plugin / toolkit author | ✅ Depends on nano only |
|
|
69
|
+
| Simple Q&A chat | ✅ Strip tools/subagents as needed |
|
|
70
|
+
|
|
71
|
+
## Install
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
uv add soothe-nano
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
## Quick start
|
|
78
|
+
|
|
79
|
+
```python
|
|
80
|
+
from soothe_nano import create_nano_agent
|
|
81
|
+
from soothe_nano.config import SootheConfig
|
|
82
|
+
|
|
83
|
+
agent = create_nano_agent(SootheConfig())
|
|
84
|
+
# agent.ainvoke / streaming — see examples/
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
Examples live in `examples/nano_agent/`:
|
|
88
|
+
|
|
89
|
+
1. Pure model (no tools)
|
|
90
|
+
2. With tools
|
|
91
|
+
3. With memory
|
|
92
|
+
4. With subagents
|
|
93
|
+
5. Full composition
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
python packages/soothe-nano/examples/nano_agent/01_pure_nano_example.py
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
## Package layout
|
|
100
|
+
|
|
101
|
+
```
|
|
102
|
+
soothe_nano/
|
|
103
|
+
agent/ CodingCoreAgent, create_nano_agent
|
|
104
|
+
config/ SootheConfig
|
|
105
|
+
toolkits/ Builtin tool groups
|
|
106
|
+
subagents/ explore, plan, research, browser, …
|
|
107
|
+
middleware/ Progressive tools/skills, workspace, policy
|
|
108
|
+
skills/ Catalog + progressive search
|
|
109
|
+
mcp/ MCP registry / adapters
|
|
110
|
+
backends/ Persistence helpers
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
## Development
|
|
114
|
+
|
|
115
|
+
From `packages/soothe-nano/`:
|
|
116
|
+
|
|
117
|
+
```bash
|
|
118
|
+
make help # list targets
|
|
119
|
+
make sync-dev # sync deps
|
|
120
|
+
make format lint # format + lint
|
|
121
|
+
make test-unit # unit tests
|
|
122
|
+
make test-integration # integration tests (--run-integration)
|
|
123
|
+
make examples # run nano_agent examples
|
|
124
|
+
make build # build dist/
|
|
125
|
+
```
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["hatchling"]
|
|
3
|
+
build-backend = "hatchling.build"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "soothe-nano"
|
|
7
|
+
version = "0.9.0"
|
|
8
|
+
description = "Soothe Nano — batteries-included Coding CoreAgent on deepagents"
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
license = { text = "MIT" }
|
|
11
|
+
requires-python = ">=3.11,<3.15"
|
|
12
|
+
keywords = ["soothe", "nano", "coreagent", "agents", "ai", "llm", "langgraph", "deepagents"]
|
|
13
|
+
classifiers = [
|
|
14
|
+
"Development Status :: 3 - Alpha",
|
|
15
|
+
"Intended Audience :: Developers",
|
|
16
|
+
"License :: OSI Approved :: MIT License",
|
|
17
|
+
"Programming Language :: Python :: 3",
|
|
18
|
+
"Programming Language :: Python :: 3.11",
|
|
19
|
+
"Programming Language :: Python :: 3.12",
|
|
20
|
+
"Programming Language :: Python :: 3.13",
|
|
21
|
+
"Programming Language :: Python :: 3.14",
|
|
22
|
+
"Topic :: Scientific/Engineering :: Artificial Intelligence",
|
|
23
|
+
"Topic :: Software Development :: Libraries :: Python Modules",
|
|
24
|
+
]
|
|
25
|
+
dependencies = [
|
|
26
|
+
"soothe-sdk>=1.0.2,<2.0.0",
|
|
27
|
+
"soothe-deepagents>=0.7.22,<1.0.0",
|
|
28
|
+
"aiohttp>=3.9.0,<4.0.0",
|
|
29
|
+
"aiosqlite>=0.22.1,<1.0.0",
|
|
30
|
+
"anyio>=3.0.0,<5.0.0",
|
|
31
|
+
"pexpect>=4.9.0,<5.0.0",
|
|
32
|
+
"pydantic-settings>=2.0.0,<3.0.0",
|
|
33
|
+
"pydantic>=2.0.0,<3.0.0",
|
|
34
|
+
"jsonschema>=4.0.0,<5.0.0",
|
|
35
|
+
"python-dotenv>=1.0.0,<2.0.0",
|
|
36
|
+
"pyyaml>=6.0.0,<7.0.0",
|
|
37
|
+
"pathspec>=0.12.0,<2.0.0",
|
|
38
|
+
"requests>=2.32.3,<3.0.0",
|
|
39
|
+
"bubus>=1.5.6",
|
|
40
|
+
"jinja2>=3.1.0",
|
|
41
|
+
"aiofiles>=24.1.0",
|
|
42
|
+
"openai>=1.104.2,<3.0.0",
|
|
43
|
+
"dashscope>=1.20.0",
|
|
44
|
+
"anthropic>=0.96.0,<1.0.0",
|
|
45
|
+
"langchain>=1.2.11,<2.0.0",
|
|
46
|
+
"langchain-community>=0.3.0,<1.0.0",
|
|
47
|
+
"langchain-experimental>=0.0.50,<1.0.0",
|
|
48
|
+
"langchain-core>=1.2.18,<2.0.0",
|
|
49
|
+
"langchain-mcp-adapters>=0.2.0,<1.0.0",
|
|
50
|
+
"pyjwt>=2.8.0,<3.0.0",
|
|
51
|
+
"langchain-openai>=0.3.0,<1.0.0",
|
|
52
|
+
"langchain-quickjs>=0.1.0",
|
|
53
|
+
"langgraph>=1.1.1,<2.0.0",
|
|
54
|
+
"langgraph-checkpoint>=4.0.0,<5.0.0",
|
|
55
|
+
"langgraph-checkpoint-sqlite>=3.0.0,<4.0.0",
|
|
56
|
+
"langgraph-checkpoint-postgres>=3.1.0,<4.0.0",
|
|
57
|
+
"sqlite-vec>=0.1.0",
|
|
58
|
+
"arxiv>=2.1.0",
|
|
59
|
+
"langchain-tavily>=0.2.17",
|
|
60
|
+
"tavily-python>=0.5.0",
|
|
61
|
+
"wizsearch>=1.1.8,<2.0.0",
|
|
62
|
+
"chardet<6",
|
|
63
|
+
"deepxiv-sdk>=0.2.5",
|
|
64
|
+
"psycopg[binary,pool]>=3.2.0,<4.0.0",
|
|
65
|
+
"asyncpg>=0.30.0,<1.0.0",
|
|
66
|
+
"watchdog>=3.0.0,<5.0.0",
|
|
67
|
+
"pandas>=2.0.0",
|
|
68
|
+
"openpyxl>=3.1.0",
|
|
69
|
+
"PyMuPDF>=1.24.0",
|
|
70
|
+
"docx2txt>=0.8.0",
|
|
71
|
+
]
|
|
72
|
+
|
|
73
|
+
[project.optional-dependencies]
|
|
74
|
+
dev = [
|
|
75
|
+
"pytest>=8.0.0",
|
|
76
|
+
"pytest-asyncio>=1.3.0",
|
|
77
|
+
"pytest-cov",
|
|
78
|
+
"ruff>=0.12.0",
|
|
79
|
+
"mypy>=1.0.0",
|
|
80
|
+
"twine>=5.0.0",
|
|
81
|
+
]
|
|
82
|
+
|
|
83
|
+
[project.urls]
|
|
84
|
+
Homepage = "https://github.com/mirasoth/soothe-nano"
|
|
85
|
+
Documentation = "https://soothe.readthedocs.io"
|
|
86
|
+
Repository = "https://github.com/mirasoth/soothe-nano"
|
|
87
|
+
|
|
88
|
+
[tool.hatch.build.targets.wheel]
|
|
89
|
+
packages = ["src/soothe_nano"]
|
|
90
|
+
|
|
91
|
+
[tool.hatch.build.targets.sdist]
|
|
92
|
+
include = ["src/soothe_nano/"]
|
|
93
|
+
exclude = [
|
|
94
|
+
"**/__pycache__",
|
|
95
|
+
"**/*.pyc",
|
|
96
|
+
"**/*.pyo",
|
|
97
|
+
]
|
|
98
|
+
|
|
99
|
+
[tool.ruff]
|
|
100
|
+
line-length = 100
|
|
101
|
+
target-version = "py311"
|
|
102
|
+
|
|
103
|
+
[tool.ruff.lint]
|
|
104
|
+
select = ["E", "F", "I", "N", "W", "UP"]
|
|
105
|
+
ignore = ["E501"]
|
|
106
|
+
per-file-ignores = { "examples/**/*.py" = ["N999", "E402"] }
|
|
107
|
+
|
|
108
|
+
[tool.ruff.format]
|
|
109
|
+
docstring-code-format = true
|
|
110
|
+
|
|
111
|
+
[tool.mypy]
|
|
112
|
+
python_version = "3.12"
|
|
113
|
+
warn_return_any = true
|
|
114
|
+
warn_unused_configs = true
|
|
115
|
+
disallow_untyped_defs = true
|
|
116
|
+
|
|
117
|
+
[tool.pytest.ini_options]
|
|
118
|
+
asyncio_mode = "auto"
|
|
119
|
+
asyncio_default_fixture_loop_scope = "function"
|
|
120
|
+
testpaths = ["tests"]
|
|
121
|
+
python_files = ["test_*.py"]
|
|
122
|
+
python_classes = ["Test*"]
|
|
123
|
+
python_functions = ["test_*"]
|
|
124
|
+
addopts = "-v --strict-markers"
|
|
125
|
+
markers = [
|
|
126
|
+
"asyncio: mark test as async",
|
|
127
|
+
"integration: mark test as integration test",
|
|
128
|
+
]
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"""soothe-nano — batteries-included Coding CoreAgent."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import importlib.metadata
|
|
6
|
+
|
|
7
|
+
from soothe_sdk.protocols.core_agent import CoreAgentCapabilities
|
|
8
|
+
|
|
9
|
+
from soothe_nano.agent import CodingCoreAgent, LazyCoreAgent
|
|
10
|
+
from soothe_nano.agent.core_agent import ephemeral_execute_stream_enabled
|
|
11
|
+
from soothe_nano.agent.factory import create_nano_agent
|
|
12
|
+
from soothe_nano.agent.subagent_catalog import spec_subagent_name
|
|
13
|
+
from soothe_nano.config import SootheConfig
|
|
14
|
+
|
|
15
|
+
try:
|
|
16
|
+
NanoConfig = SootheConfig
|
|
17
|
+
except Exception: # pragma: no cover
|
|
18
|
+
NanoConfig = None # type: ignore[misc, assignment]
|
|
19
|
+
|
|
20
|
+
try:
|
|
21
|
+
__version__ = importlib.metadata.version("soothe-nano")
|
|
22
|
+
except importlib.metadata.PackageNotFoundError:
|
|
23
|
+
__version__ = "0.0.0"
|
|
24
|
+
|
|
25
|
+
__all__ = [
|
|
26
|
+
"CodingCoreAgent",
|
|
27
|
+
"CoreAgentCapabilities",
|
|
28
|
+
"LazyCoreAgent",
|
|
29
|
+
"NanoConfig",
|
|
30
|
+
"SootheConfig",
|
|
31
|
+
"create_nano_agent",
|
|
32
|
+
"ephemeral_execute_stream_enabled",
|
|
33
|
+
"spec_subagent_name",
|
|
34
|
+
"__version__",
|
|
35
|
+
]
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"""Coding CoreAgent public surface."""
|
|
2
|
+
|
|
3
|
+
from soothe_nano.agent.core_agent import CodingCoreAgent, ephemeral_execute_stream_enabled
|
|
4
|
+
from soothe_nano.agent.lazy import LazyCoreAgent
|
|
5
|
+
from soothe_nano.agent.subagent_catalog import spec_subagent_name
|
|
6
|
+
|
|
7
|
+
__all__ = [
|
|
8
|
+
"CodingCoreAgent",
|
|
9
|
+
"LazyCoreAgent",
|
|
10
|
+
"ephemeral_execute_stream_enabled",
|
|
11
|
+
"spec_subagent_name",
|
|
12
|
+
]
|