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.
Files changed (306) hide show
  1. soothe_nano-0.9.0/.gitignore +37 -0
  2. soothe_nano-0.9.0/PKG-INFO +199 -0
  3. soothe_nano-0.9.0/README.md +125 -0
  4. soothe_nano-0.9.0/pyproject.toml +128 -0
  5. soothe_nano-0.9.0/src/soothe_nano/__init__.py +35 -0
  6. soothe_nano-0.9.0/src/soothe_nano/agent/__init__.py +12 -0
  7. soothe_nano-0.9.0/src/soothe_nano/agent/builder.py +431 -0
  8. soothe_nano-0.9.0/src/soothe_nano/agent/core_agent.py +326 -0
  9. soothe_nano-0.9.0/src/soothe_nano/agent/factory.py +5 -0
  10. soothe_nano-0.9.0/src/soothe_nano/agent/lazy.py +194 -0
  11. soothe_nano-0.9.0/src/soothe_nano/agent/subagent_catalog.py +19 -0
  12. soothe_nano-0.9.0/src/soothe_nano/backends/__init__.py +1 -0
  13. soothe_nano-0.9.0/src/soothe_nano/backends/durability/__init__.py +11 -0
  14. soothe_nano-0.9.0/src/soothe_nano/backends/durability/base.py +239 -0
  15. soothe_nano-0.9.0/src/soothe_nano/backends/durability/postgresql.py +23 -0
  16. soothe_nano-0.9.0/src/soothe_nano/backends/durability/sqlite.py +40 -0
  17. soothe_nano-0.9.0/src/soothe_nano/backends/memory/__init__.py +5 -0
  18. soothe_nano-0.9.0/src/soothe_nano/backends/memory/memu/LICENSE.txt +194 -0
  19. soothe_nano-0.9.0/src/soothe_nano/backends/memory/memu/__init__.py +22 -0
  20. soothe_nano-0.9.0/src/soothe_nano/backends/memory/memu/config/README.md +235 -0
  21. soothe_nano-0.9.0/src/soothe_nano/backends/memory/memu/config/__init__.py +24 -0
  22. soothe_nano-0.9.0/src/soothe_nano/backends/memory/memu/config/activity/__init__.py +5 -0
  23. soothe_nano-0.9.0/src/soothe_nano/backends/memory/memu/config/activity/config.py +48 -0
  24. soothe_nano-0.9.0/src/soothe_nano/backends/memory/memu/config/activity/prompt.txt +48 -0
  25. soothe_nano-0.9.0/src/soothe_nano/backends/memory/memu/config/event/__init__.py +5 -0
  26. soothe_nano-0.9.0/src/soothe_nano/backends/memory/memu/config/event/config.py +48 -0
  27. soothe_nano-0.9.0/src/soothe_nano/backends/memory/memu/config/event/prompt.txt +67 -0
  28. soothe_nano-0.9.0/src/soothe_nano/backends/memory/memu/config/markdown_config.py +249 -0
  29. soothe_nano-0.9.0/src/soothe_nano/backends/memory/memu/config/memory_cat_config.yaml +39 -0
  30. soothe_nano-0.9.0/src/soothe_nano/backends/memory/memu/config/profile/__init__.py +5 -0
  31. soothe_nano-0.9.0/src/soothe_nano/backends/memory/memu/config/profile/config.py +52 -0
  32. soothe_nano-0.9.0/src/soothe_nano/backends/memory/memu/config/profile/prompt.txt +73 -0
  33. soothe_nano-0.9.0/src/soothe_nano/backends/memory/memu/langchain_adapter.py +149 -0
  34. soothe_nano-0.9.0/src/soothe_nano/backends/memory/memu/llm_adapter.py +33 -0
  35. soothe_nano-0.9.0/src/soothe_nano/backends/memory/memu/llm_client.py +103 -0
  36. soothe_nano-0.9.0/src/soothe_nano/backends/memory/memu/memory/__init__.py +30 -0
  37. soothe_nano-0.9.0/src/soothe_nano/backends/memory/memu/memory/actions/__init__.py +35 -0
  38. soothe_nano-0.9.0/src/soothe_nano/backends/memory/memu/memory/actions/add_activity_memory.py +322 -0
  39. soothe_nano-0.9.0/src/soothe_nano/backends/memory/memu/memory/actions/base_action.py +347 -0
  40. soothe_nano-0.9.0/src/soothe_nano/backends/memory/memu/memory/actions/cluster_memories.py +292 -0
  41. soothe_nano-0.9.0/src/soothe_nano/backends/memory/memu/memory/actions/generate_suggestions.py +211 -0
  42. soothe_nano-0.9.0/src/soothe_nano/backends/memory/memu/memory/actions/get_available_categories.py +65 -0
  43. soothe_nano-0.9.0/src/soothe_nano/backends/memory/memu/memory/actions/link_related_memories.py +540 -0
  44. soothe_nano-0.9.0/src/soothe_nano/backends/memory/memu/memory/actions/run_theory_of_mind.py +271 -0
  45. soothe_nano-0.9.0/src/soothe_nano/backends/memory/memu/memory/actions/update_memory_with_suggestions.py +535 -0
  46. soothe_nano-0.9.0/src/soothe_nano/backends/memory/memu/memory/embeddings.py +125 -0
  47. soothe_nano-0.9.0/src/soothe_nano/backends/memory/memu/memory/file_manager.py +324 -0
  48. soothe_nano-0.9.0/src/soothe_nano/backends/memory/memu/memory/memory_agent.py +625 -0
  49. soothe_nano-0.9.0/src/soothe_nano/backends/memory/memu/memory/recall_agent.py +401 -0
  50. soothe_nano-0.9.0/src/soothe_nano/backends/memory/memu/memory_store.py +654 -0
  51. soothe_nano-0.9.0/src/soothe_nano/backends/memory/memu/models.py +105 -0
  52. soothe_nano-0.9.0/src/soothe_nano/backends/memory/memu_adapter.py +175 -0
  53. soothe_nano-0.9.0/src/soothe_nano/backends/persistence/__init__.py +71 -0
  54. soothe_nano-0.9.0/src/soothe_nano/backends/persistence/display_store.py +498 -0
  55. soothe_nano-0.9.0/src/soothe_nano/backends/persistence/display_store_postgres.py +431 -0
  56. soothe_nano-0.9.0/src/soothe_nano/backends/persistence/postgres_store.py +393 -0
  57. soothe_nano-0.9.0/src/soothe_nano/backends/persistence/sqlite_store.py +327 -0
  58. soothe_nano-0.9.0/src/soothe_nano/backends/vector_store/__init__.py +50 -0
  59. soothe_nano-0.9.0/src/soothe_nano/backends/vector_store/pgvector.py +361 -0
  60. soothe_nano-0.9.0/src/soothe_nano/backends/vector_store/sqlite_vec.py +599 -0
  61. soothe_nano-0.9.0/src/soothe_nano/backends/vector_store/weaviate.py +278 -0
  62. soothe_nano-0.9.0/src/soothe_nano/config/__init__.py +110 -0
  63. soothe_nano-0.9.0/src/soothe_nano/config/constants.py +30 -0
  64. soothe_nano-0.9.0/src/soothe_nano/config/env.py +96 -0
  65. soothe_nano-0.9.0/src/soothe_nano/config/middleware_access.py +16 -0
  66. soothe_nano-0.9.0/src/soothe_nano/config/models.py +1659 -0
  67. soothe_nano-0.9.0/src/soothe_nano/config/models_catalog.py +91 -0
  68. soothe_nano-0.9.0/src/soothe_nano/config/reload.py +830 -0
  69. soothe_nano-0.9.0/src/soothe_nano/config/settings.py +1008 -0
  70. soothe_nano-0.9.0/src/soothe_nano/events/__init__.py +54 -0
  71. soothe_nano-0.9.0/src/soothe_nano/events/catalog.py +257 -0
  72. soothe_nano-0.9.0/src/soothe_nano/events/constants.py +43 -0
  73. soothe_nano-0.9.0/src/soothe_nano/filesystem/README.md +286 -0
  74. soothe_nano-0.9.0/src/soothe_nano/filesystem/__init__.py +78 -0
  75. soothe_nano-0.9.0/src/soothe_nano/filesystem/_lock_registry.py +132 -0
  76. soothe_nano-0.9.0/src/soothe_nano/filesystem/discovery_hints.py +40 -0
  77. soothe_nano-0.9.0/src/soothe_nano/filesystem/exceptions.py +145 -0
  78. soothe_nano-0.9.0/src/soothe_nano/filesystem/factory.py +484 -0
  79. soothe_nano-0.9.0/src/soothe_nano/filesystem/grep_search.py +546 -0
  80. soothe_nano-0.9.0/src/soothe_nano/filesystem/langchain_adapter.py +981 -0
  81. soothe_nano-0.9.0/src/soothe_nano/filesystem/local.py +1592 -0
  82. soothe_nano-0.9.0/src/soothe_nano/filesystem/protocol.py +353 -0
  83. soothe_nano-0.9.0/src/soothe_nano/filesystem/unified.py +848 -0
  84. soothe_nano-0.9.0/src/soothe_nano/filesystem/workspace.py +759 -0
  85. soothe_nano-0.9.0/src/soothe_nano/logging/__init__.py +13 -0
  86. soothe_nano-0.9.0/src/soothe_nano/logging/context.py +28 -0
  87. soothe_nano-0.9.0/src/soothe_nano/logging/setup.py +221 -0
  88. soothe_nano-0.9.0/src/soothe_nano/logging/thread_logger.py +385 -0
  89. soothe_nano-0.9.0/src/soothe_nano/mcp/__init__.py +30 -0
  90. soothe_nano-0.9.0/src/soothe_nano/mcp/cleanup.py +196 -0
  91. soothe_nano-0.9.0/src/soothe_nano/mcp/mcp_config.py +173 -0
  92. soothe_nano-0.9.0/src/soothe_nano/mcp/mcp_events.py +313 -0
  93. soothe_nano-0.9.0/src/soothe_nano/mcp/mcp_progressive.py +168 -0
  94. soothe_nano-0.9.0/src/soothe_nano/mcp/mcp_registry.py +305 -0
  95. soothe_nano-0.9.0/src/soothe_nano/mcp/mcp_registry_support.py +191 -0
  96. soothe_nano-0.9.0/src/soothe_nano/mcp/mcp_resource_tools.py +103 -0
  97. soothe_nano-0.9.0/src/soothe_nano/mcp/mcp_utils.py +157 -0
  98. soothe_nano-0.9.0/src/soothe_nano/mcp/reconnect.py +182 -0
  99. soothe_nano-0.9.0/src/soothe_nano/middleware/__init__.py +158 -0
  100. soothe_nano-0.9.0/src/soothe_nano/middleware/_builder.py +350 -0
  101. soothe_nano-0.9.0/src/soothe_nano/middleware/_tool_context.py +182 -0
  102. soothe_nano-0.9.0/src/soothe_nano/middleware/code_interpreter.py +212 -0
  103. soothe_nano-0.9.0/src/soothe_nano/middleware/edit_coalescing.py +918 -0
  104. soothe_nano-0.9.0/src/soothe_nano/middleware/filesystem.py +285 -0
  105. soothe_nano-0.9.0/src/soothe_nano/middleware/mcp_activation.py +241 -0
  106. soothe_nano-0.9.0/src/soothe_nano/middleware/model_call_profiler.py +579 -0
  107. soothe_nano-0.9.0/src/soothe_nano/middleware/per_turn_model.py +61 -0
  108. soothe_nano-0.9.0/src/soothe_nano/middleware/policy.py +153 -0
  109. soothe_nano-0.9.0/src/soothe_nano/middleware/progressive_listing.py +279 -0
  110. soothe_nano-0.9.0/src/soothe_nano/middleware/progressive_tools.py +245 -0
  111. soothe_nano-0.9.0/src/soothe_nano/middleware/role_routing.py +141 -0
  112. soothe_nano-0.9.0/src/soothe_nano/middleware/skill_activation.py +464 -0
  113. soothe_nano-0.9.0/src/soothe_nano/middleware/system_prompt.py +734 -0
  114. soothe_nano-0.9.0/src/soothe_nano/middleware/tool_call_args_middleware.py +59 -0
  115. soothe_nano-0.9.0/src/soothe_nano/middleware/tool_call_args_registry.py +81 -0
  116. soothe_nano-0.9.0/src/soothe_nano/middleware/tool_enforcement.py +134 -0
  117. soothe_nano-0.9.0/src/soothe_nano/middleware/tool_name_hints.py +176 -0
  118. soothe_nano-0.9.0/src/soothe_nano/middleware/tool_optimization_middleware.py +275 -0
  119. soothe_nano-0.9.0/src/soothe_nano/middleware/workspace_context.py +125 -0
  120. soothe_nano-0.9.0/src/soothe_nano/paths/__init__.py +17 -0
  121. soothe_nano-0.9.0/src/soothe_nano/paths/sqlite_paths.py +25 -0
  122. soothe_nano-0.9.0/src/soothe_nano/paths/thread_paths.py +43 -0
  123. soothe_nano-0.9.0/src/soothe_nano/persistence/db_init/__init__.py +33 -0
  124. soothe_nano-0.9.0/src/soothe_nano/persistence/db_init/runner.py +471 -0
  125. soothe_nano-0.9.0/src/soothe_nano/persistence/persist_metrics.py +33 -0
  126. soothe_nano-0.9.0/src/soothe_nano/persistence/postgres_pool_lifecycle.py +134 -0
  127. soothe_nano-0.9.0/src/soothe_nano/persistence/postgres_pool_registry.py +236 -0
  128. soothe_nano-0.9.0/src/soothe_nano/persistence/postgres_provisioning.py +214 -0
  129. soothe_nano-0.9.0/src/soothe_nano/persistence/retry_utils.py +189 -0
  130. soothe_nano-0.9.0/src/soothe_nano/persistence/shared_metadata_pool.py +107 -0
  131. soothe_nano-0.9.0/src/soothe_nano/persistence/sql/soothe_checkpoints/init.sql +111 -0
  132. soothe_nano-0.9.0/src/soothe_nano/persistence/sql/soothe_metadata/init.sql +118 -0
  133. soothe_nano-0.9.0/src/soothe_nano/persistence/sql/soothe_vectors/init.sql +9 -0
  134. soothe_nano-0.9.0/src/soothe_nano/persistence/unified.py +71 -0
  135. soothe_nano-0.9.0/src/soothe_nano/plugin/__init__.py +85 -0
  136. soothe_nano-0.9.0/src/soothe_nano/plugin/cache.py +42 -0
  137. soothe_nano-0.9.0/src/soothe_nano/plugin/context.py +81 -0
  138. soothe_nano-0.9.0/src/soothe_nano/plugin/discovery.py +260 -0
  139. soothe_nano-0.9.0/src/soothe_nano/plugin/events.py +118 -0
  140. soothe_nano-0.9.0/src/soothe_nano/plugin/exceptions.py +107 -0
  141. soothe_nano-0.9.0/src/soothe_nano/plugin/global_registry.py +100 -0
  142. soothe_nano-0.9.0/src/soothe_nano/plugin/lazy.py +71 -0
  143. soothe_nano-0.9.0/src/soothe_nano/plugin/lifecycle.py +421 -0
  144. soothe_nano-0.9.0/src/soothe_nano/plugin/loader.py +323 -0
  145. soothe_nano-0.9.0/src/soothe_nano/plugin/manifest.py +12 -0
  146. soothe_nano-0.9.0/src/soothe_nano/plugin/registry.py +296 -0
  147. soothe_nano-0.9.0/src/soothe_nano/prompts/__init__.py +29 -0
  148. soothe_nano-0.9.0/src/soothe_nano/prompts/context_xml.py +229 -0
  149. soothe_nano-0.9.0/src/soothe_nano/prompts/fragments/__init__.py +32 -0
  150. soothe_nano-0.9.0/src/soothe_nano/prompts/fragments/system/prompts/assistant_identity.xml +6 -0
  151. soothe_nano-0.9.0/src/soothe_nano/prompts/fragments/system/prompts/default_system_body.xml +6 -0
  152. soothe_nano-0.9.0/src/soothe_nano/prompts/fragments/system/prompts/medium_system.xml +6 -0
  153. soothe_nano-0.9.0/src/soothe_nano/prompts/fragments/system/prompts/simple_system.xml +1 -0
  154. soothe_nano-0.9.0/src/soothe_nano/prompts/identity.py +50 -0
  155. soothe_nano-0.9.0/src/soothe_nano/prompts/project_instructions.py +195 -0
  156. soothe_nano-0.9.0/src/soothe_nano/prompts/system_templates.py +224 -0
  157. soothe_nano-0.9.0/src/soothe_nano/resolve/__init__.py +122 -0
  158. soothe_nano-0.9.0/src/soothe_nano/resolve/_lazy_subagent.py +145 -0
  159. soothe_nano-0.9.0/src/soothe_nano/resolve/_resolver_infra.py +228 -0
  160. soothe_nano-0.9.0/src/soothe_nano/resolve/_resolver_tools.py +655 -0
  161. soothe_nano-0.9.0/src/soothe_nano/resolve/_tool_cache.py +66 -0
  162. soothe_nano-0.9.0/src/soothe_nano/resolve/shared_checkpointer_pool.py +233 -0
  163. soothe_nano-0.9.0/src/soothe_nano/security/README.md +45 -0
  164. soothe_nano-0.9.0/src/soothe_nano/security/__init__.py +6 -0
  165. soothe_nano-0.9.0/src/soothe_nano/security/operation_guard.py +201 -0
  166. soothe_nano-0.9.0/src/soothe_nano/security/path_security.py +416 -0
  167. soothe_nano-0.9.0/src/soothe_nano/security/policy_models.py +406 -0
  168. soothe_nano-0.9.0/src/soothe_nano/security/policy_profiles.py +365 -0
  169. soothe_nano-0.9.0/src/soothe_nano/security/security_api.py +71 -0
  170. soothe_nano-0.9.0/src/soothe_nano/security/security_enforcer.py +400 -0
  171. soothe_nano-0.9.0/src/soothe_nano/skills/__init__.py +28 -0
  172. soothe_nano-0.9.0/src/soothe_nano/skills/budget.py +118 -0
  173. soothe_nano-0.9.0/src/soothe_nano/skills/builtin_skills/README.md +80 -0
  174. soothe_nano-0.9.0/src/soothe_nano/skills/builtin_skills/clawhub/SKILL.md +118 -0
  175. soothe_nano-0.9.0/src/soothe_nano/skills/builtin_skills/github/SKILL.md +49 -0
  176. soothe_nano-0.9.0/src/soothe_nano/skills/builtin_skills/skill-creator/SKILL.md +409 -0
  177. soothe_nano-0.9.0/src/soothe_nano/skills/builtin_skills/skill-creator/scripts/init_skill.py +383 -0
  178. soothe_nano-0.9.0/src/soothe_nano/skills/builtin_skills/skill-creator/scripts/package_skill.py +135 -0
  179. soothe_nano-0.9.0/src/soothe_nano/skills/builtin_skills/skill-creator/scripts/quick_validate.py +204 -0
  180. soothe_nano-0.9.0/src/soothe_nano/skills/builtin_skills/weather/SKILL.md +50 -0
  181. soothe_nano-0.9.0/src/soothe_nano/skills/builtins.py +66 -0
  182. soothe_nano-0.9.0/src/soothe_nano/skills/catalog.py +583 -0
  183. soothe_nano-0.9.0/src/soothe_nano/skills/corpus_match.py +135 -0
  184. soothe_nano-0.9.0/src/soothe_nano/skills/discovery_tools.py +60 -0
  185. soothe_nano-0.9.0/src/soothe_nano/skills/events.py +46 -0
  186. soothe_nano-0.9.0/src/soothe_nano/skills/index.py +278 -0
  187. soothe_nano-0.9.0/src/soothe_nano/skills/registry.py +317 -0
  188. soothe_nano-0.9.0/src/soothe_nano/skills/search.py +158 -0
  189. soothe_nano-0.9.0/src/soothe_nano/skills/workspace_sync.py +234 -0
  190. soothe_nano-0.9.0/src/soothe_nano/subagents/__init__.py +11 -0
  191. soothe_nano-0.9.0/src/soothe_nano/subagents/_research_json_util.py +55 -0
  192. soothe_nano-0.9.0/src/soothe_nano/subagents/_research_timeouts.py +32 -0
  193. soothe_nano-0.9.0/src/soothe_nano/subagents/_research_topic_util.py +91 -0
  194. soothe_nano-0.9.0/src/soothe_nano/subagents/academic_research/__init__.py +72 -0
  195. soothe_nano-0.9.0/src/soothe_nano/subagents/academic_research/display_summary.py +93 -0
  196. soothe_nano-0.9.0/src/soothe_nano/subagents/academic_research/effort.py +108 -0
  197. soothe_nano-0.9.0/src/soothe_nano/subagents/academic_research/engine.py +628 -0
  198. soothe_nano-0.9.0/src/soothe_nano/subagents/academic_research/events.py +118 -0
  199. soothe_nano-0.9.0/src/soothe_nano/subagents/academic_research/implementation.py +81 -0
  200. soothe_nano-0.9.0/src/soothe_nano/subagents/academic_research/json_util.py +17 -0
  201. soothe_nano-0.9.0/src/soothe_nano/subagents/academic_research/persistence.py +99 -0
  202. soothe_nano-0.9.0/src/soothe_nano/subagents/academic_research/protocol.py +97 -0
  203. soothe_nano-0.9.0/src/soothe_nano/subagents/academic_research/references.py +92 -0
  204. soothe_nano-0.9.0/src/soothe_nano/subagents/academic_research/report_classifier.py +168 -0
  205. soothe_nano-0.9.0/src/soothe_nano/subagents/academic_research/sources/__init__.py +5 -0
  206. soothe_nano-0.9.0/src/soothe_nano/subagents/academic_research/sources/academic_search.py +178 -0
  207. soothe_nano-0.9.0/src/soothe_nano/subagents/academic_research/termination.py +202 -0
  208. soothe_nano-0.9.0/src/soothe_nano/subagents/browser_use/__init__.py +122 -0
  209. soothe_nano-0.9.0/src/soothe_nano/subagents/browser_use/_preview.py +16 -0
  210. soothe_nano-0.9.0/src/soothe_nano/subagents/browser_use/_runtime.py +121 -0
  211. soothe_nano-0.9.0/src/soothe_nano/subagents/browser_use/action_format.py +122 -0
  212. soothe_nano-0.9.0/src/soothe_nano/subagents/browser_use/config_model.py +60 -0
  213. soothe_nano-0.9.0/src/soothe_nano/subagents/browser_use/display_summary.py +18 -0
  214. soothe_nano-0.9.0/src/soothe_nano/subagents/browser_use/events.py +80 -0
  215. soothe_nano-0.9.0/src/soothe_nano/subagents/browser_use/implementation.py +807 -0
  216. soothe_nano-0.9.0/src/soothe_nano/subagents/deep_research/__init__.py +71 -0
  217. soothe_nano-0.9.0/src/soothe_nano/subagents/deep_research/display_summary.py +92 -0
  218. soothe_nano-0.9.0/src/soothe_nano/subagents/deep_research/effort.py +108 -0
  219. soothe_nano-0.9.0/src/soothe_nano/subagents/deep_research/engine.py +626 -0
  220. soothe_nano-0.9.0/src/soothe_nano/subagents/deep_research/events.py +112 -0
  221. soothe_nano-0.9.0/src/soothe_nano/subagents/deep_research/implementation.py +81 -0
  222. soothe_nano-0.9.0/src/soothe_nano/subagents/deep_research/json_util.py +17 -0
  223. soothe_nano-0.9.0/src/soothe_nano/subagents/deep_research/persistence.py +99 -0
  224. soothe_nano-0.9.0/src/soothe_nano/subagents/deep_research/protocol.py +92 -0
  225. soothe_nano-0.9.0/src/soothe_nano/subagents/deep_research/references.py +92 -0
  226. soothe_nano-0.9.0/src/soothe_nano/subagents/deep_research/report_classifier.py +170 -0
  227. soothe_nano-0.9.0/src/soothe_nano/subagents/deep_research/sources/__init__.py +5 -0
  228. soothe_nano-0.9.0/src/soothe_nano/subagents/deep_research/sources/web_search.py +279 -0
  229. soothe_nano-0.9.0/src/soothe_nano/subagents/deep_research/termination.py +202 -0
  230. soothe_nano-0.9.0/src/soothe_nano/subagents/explore/__init__.py +80 -0
  231. soothe_nano-0.9.0/src/soothe_nano/subagents/explore/engine.py +76 -0
  232. soothe_nano-0.9.0/src/soothe_nano/subagents/explore/events.py +96 -0
  233. soothe_nano-0.9.0/src/soothe_nano/subagents/explore/findings.py +111 -0
  234. soothe_nano-0.9.0/src/soothe_nano/subagents/explore/implementation.py +80 -0
  235. soothe_nano-0.9.0/src/soothe_nano/subagents/explore/middleware.py +1183 -0
  236. soothe_nano-0.9.0/src/soothe_nano/subagents/explore/normalize.py +88 -0
  237. soothe_nano-0.9.0/src/soothe_nano/subagents/explore/partial.py +113 -0
  238. soothe_nano-0.9.0/src/soothe_nano/subagents/explore/prompts.py +73 -0
  239. soothe_nano-0.9.0/src/soothe_nano/subagents/explore/recovery.py +142 -0
  240. soothe_nano-0.9.0/src/soothe_nano/subagents/explore/schemas.py +247 -0
  241. soothe_nano-0.9.0/src/soothe_nano/subagents/explore/search_target.py +53 -0
  242. soothe_nano-0.9.0/src/soothe_nano/subagents/explore/tools.py +114 -0
  243. soothe_nano-0.9.0/src/soothe_nano/subagents/plan/__init__.py +57 -0
  244. soothe_nano-0.9.0/src/soothe_nano/subagents/plan/engine.py +148 -0
  245. soothe_nano-0.9.0/src/soothe_nano/subagents/plan/implementation.py +51 -0
  246. soothe_nano-0.9.0/src/soothe_nano/subagents/plan/schemas.py +31 -0
  247. soothe_nano-0.9.0/src/soothe_nano/subagents/research_wire.py +56 -0
  248. soothe_nano-0.9.0/src/soothe_nano/toolkits/__init__.py +1 -0
  249. soothe_nano-0.9.0/src/soothe_nano/toolkits/_internal/__init__.py +5 -0
  250. soothe_nano-0.9.0/src/soothe_nano/toolkits/_internal/backend_ops.py +237 -0
  251. soothe_nano-0.9.0/src/soothe_nano/toolkits/_internal/document.py +381 -0
  252. soothe_nano-0.9.0/src/soothe_nano/toolkits/_internal/local_path_resolution.py +43 -0
  253. soothe_nano-0.9.0/src/soothe_nano/toolkits/_internal/tabular.py +167 -0
  254. soothe_nano-0.9.0/src/soothe_nano/toolkits/_internal/wizsearch.py +632 -0
  255. soothe_nano-0.9.0/src/soothe_nano/toolkits/data.py +484 -0
  256. soothe_nano-0.9.0/src/soothe_nano/toolkits/datetime.py +88 -0
  257. soothe_nano-0.9.0/src/soothe_nano/toolkits/deepxiv.py +931 -0
  258. soothe_nano-0.9.0/src/soothe_nano/toolkits/execution.py +1095 -0
  259. soothe_nano-0.9.0/src/soothe_nano/toolkits/file_ops.py +85 -0
  260. soothe_nano-0.9.0/src/soothe_nano/toolkits/file_ops_catalog.py +89 -0
  261. soothe_nano-0.9.0/src/soothe_nano/toolkits/http_requests.py +97 -0
  262. soothe_nano-0.9.0/src/soothe_nano/toolkits/progressive/__init__.py +21 -0
  263. soothe_nano-0.9.0/src/soothe_nano/toolkits/progressive/budget.py +174 -0
  264. soothe_nano-0.9.0/src/soothe_nano/toolkits/progressive/registry.py +184 -0
  265. soothe_nano-0.9.0/src/soothe_nano/toolkits/progressive/search_tool.py +34 -0
  266. soothe_nano-0.9.0/src/soothe_nano/toolkits/shell_compat.py +33 -0
  267. soothe_nano-0.9.0/src/soothe_nano/toolkits/url_crawl/__init__.py +16 -0
  268. soothe_nano-0.9.0/src/soothe_nano/toolkits/url_crawl/crawler.py +118 -0
  269. soothe_nano-0.9.0/src/soothe_nano/toolkits/url_crawl/polite_http.py +473 -0
  270. soothe_nano-0.9.0/src/soothe_nano/toolkits/wizsearch.py +345 -0
  271. soothe_nano-0.9.0/src/soothe_nano/utils/__init__.py +15 -0
  272. soothe_nano-0.9.0/src/soothe_nano/utils/browser_cdp.py +220 -0
  273. soothe_nano-0.9.0/src/soothe_nano/utils/circuit_breaker.py +294 -0
  274. soothe_nano-0.9.0/src/soothe_nano/utils/embeddings_dashscope.py +158 -0
  275. soothe_nano-0.9.0/src/soothe_nano/utils/embeddings_dashscope_openai.py +235 -0
  276. soothe_nano-0.9.0/src/soothe_nano/utils/error_format.py +190 -0
  277. soothe_nano-0.9.0/src/soothe_nano/utils/json_parsing.py +270 -0
  278. soothe_nano-0.9.0/src/soothe_nano/utils/llm/__init__.py +86 -0
  279. soothe_nano-0.9.0/src/soothe_nano/utils/llm/factory.py +312 -0
  280. soothe_nano-0.9.0/src/soothe_nano/utils/llm/invoke_policy.py +103 -0
  281. soothe_nano-0.9.0/src/soothe_nano/utils/llm/observability.py +321 -0
  282. soothe_nano-0.9.0/src/soothe_nano/utils/llm/registry.py +161 -0
  283. soothe_nano-0.9.0/src/soothe_nano/utils/llm/response_text.py +80 -0
  284. soothe_nano-0.9.0/src/soothe_nano/utils/llm/schema_wire.py +59 -0
  285. soothe_nano-0.9.0/src/soothe_nano/utils/llm/structured.py +379 -0
  286. soothe_nano-0.9.0/src/soothe_nano/utils/llm/types.py +70 -0
  287. soothe_nano-0.9.0/src/soothe_nano/utils/llm/wrappers.py +482 -0
  288. soothe_nano-0.9.0/src/soothe_nano/utils/outcome_preview.py +10 -0
  289. soothe_nano-0.9.0/src/soothe_nano/utils/output_capture.py +190 -0
  290. soothe_nano-0.9.0/src/soothe_nano/utils/path.py +44 -0
  291. soothe_nano-0.9.0/src/soothe_nano/utils/progress.py +219 -0
  292. soothe_nano-0.9.0/src/soothe_nano/utils/prompt_clock.py +67 -0
  293. soothe_nano-0.9.0/src/soothe_nano/utils/runtime.py +218 -0
  294. soothe_nano-0.9.0/src/soothe_nano/utils/subagent_emit.py +39 -0
  295. soothe_nano-0.9.0/src/soothe_nano/utils/text_preview.py +381 -0
  296. soothe_nano-0.9.0/src/soothe_nano/utils/thread_id.py +10 -0
  297. soothe_nano-0.9.0/src/soothe_nano/utils/token_counting.py +68 -0
  298. soothe_nano-0.9.0/src/soothe_nano/utils/token_usage.py +161 -0
  299. soothe_nano-0.9.0/src/soothe_nano/utils/tool_error_handler.py +115 -0
  300. soothe_nano-0.9.0/src/soothe_nano/utils/url_validation.py +35 -0
  301. soothe_nano-0.9.0/src/soothe_nano/workspace/__init__.py +55 -0
  302. soothe_nano-0.9.0/src/soothe_nano/workspace/workspace_api.py +80 -0
  303. soothe_nano-0.9.0/src/soothe_nano/workspace/workspace_filesystem.py +664 -0
  304. soothe_nano-0.9.0/src/soothe_nano/workspace/workspace_paths.py +145 -0
  305. soothe_nano-0.9.0/src/soothe_nano/workspace/workspace_policy.py +199 -0
  306. 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
+ ]