deepagents-cli 0.0.35__tar.gz → 0.0.36__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 (189) hide show
  1. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/CHANGELOG.md +12 -0
  2. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/PKG-INFO +2 -2
  3. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/deepagents_cli/_version.py +1 -1
  4. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/deepagents_cli/app.py +35 -3
  5. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/deepagents_cli/command_registry.py +6 -0
  6. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/deepagents_cli/config.py +24 -3
  7. deepagents_cli-0.0.36/deepagents_cli/deploy/__init__.py +15 -0
  8. deepagents_cli-0.0.36/deepagents_cli/deploy/bundler.py +259 -0
  9. deepagents_cli-0.0.36/deepagents_cli/deploy/commands.py +403 -0
  10. deepagents_cli-0.0.36/deepagents_cli/deploy/config.py +381 -0
  11. deepagents_cli-0.0.36/deepagents_cli/deploy/templates.py +511 -0
  12. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/deepagents_cli/integrations/sandbox_factory.py +2 -1
  13. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/deepagents_cli/main.py +52 -6
  14. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/deepagents_cli/model_config.py +97 -16
  15. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/deepagents_cli/ui.py +9 -0
  16. deepagents_cli-0.0.36/deepagents_cli/widgets/notification_settings.py +156 -0
  17. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/pyproject.toml +14 -5
  18. deepagents_cli-0.0.36/scripts/debug_server.sh +67 -0
  19. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/tests/integration_tests/conftest.py +3 -2
  20. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/tests/integration_tests/test_acp_mode.py +6 -1
  21. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/tests/integration_tests/test_compact_resume.py +7 -0
  22. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/tests/integration_tests/test_sandbox_factory.py +22 -6
  23. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/tests/integration_tests/test_sandbox_operations.py +7 -2
  24. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/tests/unit_tests/test_config.py +30 -0
  25. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/tests/unit_tests/test_main.py +80 -7
  26. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/tests/unit_tests/test_model_config.py +87 -0
  27. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/uv.lock +60 -60
  28. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/.gitignore +0 -0
  29. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/DEV.md +0 -0
  30. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/Makefile +0 -0
  31. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/README.md +0 -0
  32. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/THREAT_MODEL.md +0 -0
  33. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/deepagents_cli/__init__.py +0 -0
  34. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/deepagents_cli/__main__.py +0 -0
  35. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/deepagents_cli/_ask_user_types.py +0 -0
  36. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/deepagents_cli/_cli_context.py +0 -0
  37. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/deepagents_cli/_debug.py +0 -0
  38. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/deepagents_cli/_env_vars.py +0 -0
  39. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/deepagents_cli/_server_config.py +0 -0
  40. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/deepagents_cli/_session_stats.py +0 -0
  41. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/deepagents_cli/_testing_models.py +0 -0
  42. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/deepagents_cli/agent.py +0 -0
  43. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/deepagents_cli/app.tcss +0 -0
  44. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/deepagents_cli/ask_user.py +0 -0
  45. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/deepagents_cli/built_in_skills/__init__.py +0 -0
  46. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/deepagents_cli/built_in_skills/remember/SKILL.md +0 -0
  47. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/deepagents_cli/built_in_skills/skill-creator/SKILL.md +0 -0
  48. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/deepagents_cli/built_in_skills/skill-creator/scripts/init_skill.py +0 -0
  49. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/deepagents_cli/built_in_skills/skill-creator/scripts/quick_validate.py +0 -0
  50. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/deepagents_cli/clipboard.py +0 -0
  51. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/deepagents_cli/configurable_model.py +0 -0
  52. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/deepagents_cli/default_agent_prompt.md +0 -0
  53. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/deepagents_cli/editor.py +0 -0
  54. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/deepagents_cli/file_ops.py +0 -0
  55. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/deepagents_cli/formatting.py +0 -0
  56. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/deepagents_cli/hooks.py +0 -0
  57. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/deepagents_cli/input.py +0 -0
  58. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/deepagents_cli/integrations/__init__.py +0 -0
  59. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/deepagents_cli/integrations/sandbox_provider.py +0 -0
  60. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/deepagents_cli/local_context.py +0 -0
  61. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/deepagents_cli/mcp_tools.py +0 -0
  62. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/deepagents_cli/mcp_trust.py +0 -0
  63. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/deepagents_cli/media_utils.py +0 -0
  64. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/deepagents_cli/non_interactive.py +0 -0
  65. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/deepagents_cli/offload.py +0 -0
  66. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/deepagents_cli/output.py +0 -0
  67. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/deepagents_cli/project_utils.py +0 -0
  68. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/deepagents_cli/py.typed +0 -0
  69. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/deepagents_cli/remote_client.py +0 -0
  70. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/deepagents_cli/server.py +0 -0
  71. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/deepagents_cli/server_graph.py +0 -0
  72. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/deepagents_cli/server_manager.py +0 -0
  73. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/deepagents_cli/sessions.py +0 -0
  74. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/deepagents_cli/skills/__init__.py +0 -0
  75. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/deepagents_cli/skills/commands.py +0 -0
  76. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/deepagents_cli/skills/invocation.py +0 -0
  77. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/deepagents_cli/skills/load.py +0 -0
  78. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/deepagents_cli/subagents.py +0 -0
  79. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/deepagents_cli/system_prompt.md +0 -0
  80. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/deepagents_cli/textual_adapter.py +0 -0
  81. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/deepagents_cli/theme.py +0 -0
  82. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/deepagents_cli/token_state.py +0 -0
  83. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/deepagents_cli/tool_display.py +0 -0
  84. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/deepagents_cli/tools.py +0 -0
  85. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/deepagents_cli/unicode_security.py +0 -0
  86. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/deepagents_cli/update_check.py +0 -0
  87. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/deepagents_cli/widgets/__init__.py +0 -0
  88. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/deepagents_cli/widgets/_links.py +0 -0
  89. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/deepagents_cli/widgets/approval.py +0 -0
  90. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/deepagents_cli/widgets/ask_user.py +0 -0
  91. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/deepagents_cli/widgets/autocomplete.py +0 -0
  92. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/deepagents_cli/widgets/chat_input.py +0 -0
  93. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/deepagents_cli/widgets/diff.py +0 -0
  94. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/deepagents_cli/widgets/history.py +0 -0
  95. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/deepagents_cli/widgets/loading.py +0 -0
  96. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/deepagents_cli/widgets/mcp_viewer.py +0 -0
  97. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/deepagents_cli/widgets/message_store.py +0 -0
  98. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/deepagents_cli/widgets/messages.py +0 -0
  99. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/deepagents_cli/widgets/model_selector.py +0 -0
  100. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/deepagents_cli/widgets/status.py +0 -0
  101. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/deepagents_cli/widgets/theme_selector.py +0 -0
  102. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/deepagents_cli/widgets/thread_selector.py +0 -0
  103. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/deepagents_cli/widgets/tool_renderers.py +0 -0
  104. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/deepagents_cli/widgets/tool_widgets.py +0 -0
  105. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/deepagents_cli/widgets/welcome.py +0 -0
  106. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/examples/skills/arxiv-search/SKILL.md +0 -0
  107. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/examples/skills/arxiv-search/arxiv_search.py +0 -0
  108. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/examples/skills/langgraph-docs/SKILL.md +0 -0
  109. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/examples/skills/skill-creator/SKILL.md +0 -0
  110. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/examples/skills/skill-creator/scripts/init_skill.py +0 -0
  111. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/examples/skills/skill-creator/scripts/quick_validate.py +0 -0
  112. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/examples/skills/web-research/SKILL.md +0 -0
  113. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/images/cli.png +0 -0
  114. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/scripts/check_imports.py +0 -0
  115. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/scripts/install.sh +0 -0
  116. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/tests/README.md +0 -0
  117. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/tests/integration_tests/__init__.py +0 -0
  118. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/tests/integration_tests/benchmarks/__init__.py +0 -0
  119. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/tests/integration_tests/benchmarks/test_codspeed_import_benchmarks.py +0 -0
  120. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/tests/integration_tests/benchmarks/test_startup_benchmarks.py +0 -0
  121. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/tests/unit_tests/__init__.py +0 -0
  122. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/tests/unit_tests/conftest.py +0 -0
  123. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/tests/unit_tests/skills/__init__.py +0 -0
  124. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/tests/unit_tests/skills/test_commands.py +0 -0
  125. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/tests/unit_tests/skills/test_load.py +0 -0
  126. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/tests/unit_tests/skills/test_skills_json.py +0 -0
  127. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/tests/unit_tests/test_agent.py +0 -0
  128. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/tests/unit_tests/test_agent_friendly.py +0 -0
  129. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/tests/unit_tests/test_app.py +0 -0
  130. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/tests/unit_tests/test_approval.py +0 -0
  131. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/tests/unit_tests/test_args.py +0 -0
  132. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/tests/unit_tests/test_ask_user.py +0 -0
  133. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/tests/unit_tests/test_ask_user_middleware.py +0 -0
  134. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/tests/unit_tests/test_autocomplete.py +0 -0
  135. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/tests/unit_tests/test_charset.py +0 -0
  136. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/tests/unit_tests/test_chat_input.py +0 -0
  137. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/tests/unit_tests/test_command_registry.py +0 -0
  138. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/tests/unit_tests/test_compact_tool.py +0 -0
  139. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/tests/unit_tests/test_configurable_model.py +0 -0
  140. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/tests/unit_tests/test_debug.py +0 -0
  141. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/tests/unit_tests/test_editor.py +0 -0
  142. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/tests/unit_tests/test_end_to_end.py +0 -0
  143. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/tests/unit_tests/test_env_vars.py +0 -0
  144. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/tests/unit_tests/test_exception_handling.py +0 -0
  145. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/tests/unit_tests/test_file_ops.py +0 -0
  146. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/tests/unit_tests/test_history.py +0 -0
  147. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/tests/unit_tests/test_hooks.py +0 -0
  148. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/tests/unit_tests/test_imports.py +0 -0
  149. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/tests/unit_tests/test_input_parsing.py +0 -0
  150. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/tests/unit_tests/test_links.py +0 -0
  151. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/tests/unit_tests/test_loading.py +0 -0
  152. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/tests/unit_tests/test_local_context.py +0 -0
  153. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/tests/unit_tests/test_main_acp_mode.py +0 -0
  154. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/tests/unit_tests/test_main_args.py +0 -0
  155. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/tests/unit_tests/test_mcp_tools.py +0 -0
  156. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/tests/unit_tests/test_mcp_trust.py +0 -0
  157. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/tests/unit_tests/test_mcp_viewer.py +0 -0
  158. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/tests/unit_tests/test_media_utils.py +0 -0
  159. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/tests/unit_tests/test_message_store.py +0 -0
  160. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/tests/unit_tests/test_messages.py +0 -0
  161. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/tests/unit_tests/test_model_selector.py +0 -0
  162. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/tests/unit_tests/test_model_switch.py +0 -0
  163. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/tests/unit_tests/test_non_interactive.py +0 -0
  164. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/tests/unit_tests/test_offload.py +0 -0
  165. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/tests/unit_tests/test_output.py +0 -0
  166. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/tests/unit_tests/test_reload.py +0 -0
  167. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/tests/unit_tests/test_remote_client.py +0 -0
  168. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/tests/unit_tests/test_sandbox_factory.py +0 -0
  169. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/tests/unit_tests/test_server.py +0 -0
  170. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/tests/unit_tests/test_server_config.py +0 -0
  171. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/tests/unit_tests/test_server_graph.py +0 -0
  172. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/tests/unit_tests/test_server_helpers.py +0 -0
  173. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/tests/unit_tests/test_server_manager.py +0 -0
  174. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/tests/unit_tests/test_sessions.py +0 -0
  175. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/tests/unit_tests/test_shell_allow_list.py +0 -0
  176. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/tests/unit_tests/test_skill_invocation.py +0 -0
  177. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/tests/unit_tests/test_status.py +0 -0
  178. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/tests/unit_tests/test_subagents.py +0 -0
  179. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/tests/unit_tests/test_textual_adapter.py +0 -0
  180. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/tests/unit_tests/test_theme.py +0 -0
  181. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/tests/unit_tests/test_thread_selector.py +0 -0
  182. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/tests/unit_tests/test_token_tracker.py +0 -0
  183. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/tests/unit_tests/test_ui.py +0 -0
  184. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/tests/unit_tests/test_unicode_security.py +0 -0
  185. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/tests/unit_tests/test_update_check.py +0 -0
  186. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/tests/unit_tests/test_version.py +0 -0
  187. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/tests/unit_tests/test_welcome.py +0 -0
  188. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/tests/unit_tests/tools/__init__.py +0 -0
  189. {deepagents_cli-0.0.35 → deepagents_cli-0.0.36}/tests/unit_tests/tools/test_fetch_url.py +0 -0
@@ -1,5 +1,17 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.0.36](https://github.com/langchain-ai/deepagents/compare/deepagents-cli==0.0.35...deepagents-cli==0.0.36) (2026-04-09)
4
+
5
+ ### Features
6
+
7
+ * `deepagents deploy` ([#2491](https://github.com/langchain-ai/deepagents/issues/2491)) ([01dc60e](https://github.com/langchain-ai/deepagents/commit/01dc60e394ecb56bd5336e447d32caeed8a67ec2))
8
+ * Warn on missing tavily key, add `/notifications` ([#2555](https://github.com/langchain-ai/deepagents/issues/2555)) ([3dff3ed](https://github.com/langchain-ai/deepagents/commit/3dff3ed6835eae9f8b420b8a73c054127faaf7d2))
9
+
10
+ ### Bug Fixes
11
+
12
+ * Fail fast on missing provider credentials ([#2554](https://github.com/langchain-ai/deepagents/issues/2554)) ([50fb8ae](https://github.com/langchain-ai/deepagents/commit/50fb8aefe7e3065024e10f1d5ecd11a54d736641))
13
+ * Fix mktemp template in debug script for macOS ([#2603](https://github.com/langchain-ai/deepagents/issues/2603)) ([63fa537](https://github.com/langchain-ai/deepagents/commit/63fa537e9995ca2ead492ee44902227567e9a130))
14
+
3
15
  ## [0.0.35](https://github.com/langchain-ai/deepagents/compare/deepagents-cli==0.0.34...deepagents-cli==0.0.35) (2026-04-07)
4
16
 
5
17
  ### Highlights
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: deepagents-cli
3
- Version: 0.0.35
3
+ Version: 0.0.36
4
4
  Summary: Terminal interface for Deep Agents - interactive AI agent with file operations, shell access, and sub-agent capabilities.
5
5
  Project-URL: Homepage, https://docs.langchain.com/oss/python/deepagents/overview
6
6
  Project-URL: Documentation, https://reference.langchain.com/python/deepagents/
@@ -27,7 +27,7 @@ Classifier: Topic :: Terminals
27
27
  Requires-Python: <4.0,>=3.11
28
28
  Requires-Dist: aiosqlite<1.0.0,>=0.19.0
29
29
  Requires-Dist: deepagents-acp>=0.0.4
30
- Requires-Dist: deepagents==0.5.0
30
+ Requires-Dist: deepagents==0.5.1
31
31
  Requires-Dist: httpx<1.0.0,>=0.28.1
32
32
  Requires-Dist: langchain-anthropic<2.0.0,>=1.4.0
33
33
  Requires-Dist: langchain-google-genai<5.0.0,>=4.2.1
@@ -1,6 +1,6 @@
1
1
  """Version information and lightweight constants for `deepagents-cli`."""
2
2
 
3
- __version__ = "0.0.35" # x-release-please-version
3
+ __version__ = "0.0.36" # x-release-please-version
4
4
 
5
5
  DOCS_URL = "https://docs.langchain.com/oss/python/deepagents/cli"
6
6
  """URL for `deepagents-cli` documentation."""
@@ -2626,9 +2626,9 @@ class DeepAgentsApp(App):
2626
2626
  await self._mount_message(UserMessage(command))
2627
2627
  help_body = (
2628
2628
  "Commands: /quit, /clear, /offload, /editor, /mcp, "
2629
- "/model [--model-params JSON] [--default], /reload, "
2630
- "/skill:<name>, /remember, /skill-creator, /theme, /tokens, "
2631
- "/threads, /trace, "
2629
+ "/model [--model-params JSON] [--default], /notifications, "
2630
+ "/reload, /skill:<name>, /remember, /skill-creator, /theme, "
2631
+ "/tokens, /threads, /trace, "
2632
2632
  "/update, /auto-update, /changelog, /docs, /feedback, /help\n\n"
2633
2633
  "Interactive Features:\n"
2634
2634
  " Enter Submit your message\n"
@@ -2774,6 +2774,8 @@ class DeepAgentsApp(App):
2774
2774
  await self._show_mcp_viewer()
2775
2775
  elif cmd == "/theme":
2776
2776
  await self._show_theme_selector()
2777
+ elif cmd == "/notifications":
2778
+ await self._show_notification_settings()
2777
2779
  elif cmd == "/model" or cmd.startswith("/model "):
2778
2780
  model_arg = None
2779
2781
  set_default = False
@@ -4552,6 +4554,36 @@ class DeepAgentsApp(App):
4552
4554
  screen = ThemeSelectorScreen(current_theme=self.theme)
4553
4555
  self.push_screen(screen, handle_result)
4554
4556
 
4557
+ async def _show_notification_settings(self) -> None:
4558
+ """Show notification settings modal."""
4559
+ from deepagents_cli.model_config import is_warning_suppressed
4560
+ from deepagents_cli.widgets.notification_settings import (
4561
+ WARNING_TOGGLES,
4562
+ NotificationSettingsScreen,
4563
+ )
4564
+
4565
+ suppressed: set[str] = set()
4566
+ try:
4567
+ for key, _ in WARNING_TOGGLES:
4568
+ if await asyncio.to_thread(is_warning_suppressed, key):
4569
+ suppressed.add(key)
4570
+ except Exception:
4571
+ logger.warning("Failed to read notification settings", exc_info=True)
4572
+ suppressed = set()
4573
+ self.notify(
4574
+ "Could not read notification preferences. Showing defaults.",
4575
+ severity="warning",
4576
+ timeout=6,
4577
+ markup=False,
4578
+ )
4579
+
4580
+ def handle_result(_result: None) -> None:
4581
+ if self._chat_input:
4582
+ self._chat_input.focus_input()
4583
+
4584
+ screen = NotificationSettingsScreen(suppressed=suppressed)
4585
+ self.push_screen(screen, handle_result)
4586
+
4555
4587
  async def _show_mcp_viewer(self) -> None:
4556
4588
  """Show read-only MCP server/tool viewer as a modal screen."""
4557
4589
  from deepagents_cli.widgets.mcp_viewer import MCPViewerScreen
@@ -77,6 +77,12 @@ COMMANDS: tuple[SlashCommand, ...] = (
77
77
  description="Switch or configure model (--model-params, --default)",
78
78
  bypass_tier=BypassTier.IMMEDIATE_UI,
79
79
  ),
80
+ SlashCommand(
81
+ name="/notifications",
82
+ description="Configure startup warning preferences",
83
+ bypass_tier=BypassTier.IMMEDIATE_UI,
84
+ hidden_keywords="warnings alerts suppress",
85
+ ),
80
86
  SlashCommand(
81
87
  name="/offload",
82
88
  description="Free up context window space by offloading older messages",
@@ -32,8 +32,8 @@ _bootstrap_done = False
32
32
  """Whether `_ensure_bootstrap()` has executed."""
33
33
 
34
34
  _bootstrap_lock = threading.Lock()
35
- """Guards `_ensure_bootstrap()` against concurrent access from the main
36
- thread and the prewarm worker thread."""
35
+ """Guards `_ensure_bootstrap()` against concurrent access from the main thread
36
+ and the prewarm worker thread."""
37
37
 
38
38
  _singleton_lock = threading.Lock()
39
39
  """Guards lazy singleton construction in `_get_console` / `_get_settings`."""
@@ -2195,7 +2195,14 @@ def create_model(
2195
2195
  >>> model = create_model("gpt-4o") # Auto-detects openai
2196
2196
  >>> model = create_model() # Uses environment defaults
2197
2197
  """
2198
- from deepagents_cli.model_config import ModelConfig, ModelConfigError, ModelSpec
2198
+ from deepagents_cli.model_config import (
2199
+ IMPLICIT_AUTH_PROVIDERS,
2200
+ ModelConfig,
2201
+ ModelConfigError,
2202
+ ModelSpec,
2203
+ get_credential_env_var,
2204
+ has_provider_credentials,
2205
+ )
2199
2206
 
2200
2207
  if not model_spec:
2201
2208
  model_spec = _get_default_model_spec()
@@ -2225,6 +2232,20 @@ def create_model(
2225
2232
  model_name = model_spec
2226
2233
  provider = detect_provider(model_spec) or ""
2227
2234
 
2235
+ # Early credential check — fail fast with an actionable message instead of
2236
+ # letting the provider SDK raise an opaque auth error on first invocation.
2237
+ # Providers that support implicit auth (e.g., Vertex AI ADC) are excluded
2238
+ # because their env-var mapping is not a reliable indicator.
2239
+ if provider and provider not in IMPLICIT_AUTH_PROVIDERS:
2240
+ cred_status = has_provider_credentials(provider)
2241
+ if cred_status is False:
2242
+ env_var = get_credential_env_var(provider) or f"<{provider} API key>"
2243
+ msg = (
2244
+ f"No credentials found for provider '{provider}'. "
2245
+ f"Please set the {env_var} environment variable."
2246
+ )
2247
+ raise ModelConfigError(msg)
2248
+
2228
2249
  # Provider-specific kwargs (with per-model overrides)
2229
2250
  kwargs = _get_provider_kwargs(provider, model_name=model_name)
2230
2251
 
@@ -0,0 +1,15 @@
1
+ """Deploy commands for bundling and shipping deep agents."""
2
+
3
+ from deepagents_cli.deploy.commands import (
4
+ execute_deploy_command,
5
+ execute_dev_command,
6
+ execute_init_command,
7
+ setup_deploy_parsers,
8
+ )
9
+
10
+ __all__ = [
11
+ "execute_deploy_command",
12
+ "execute_dev_command",
13
+ "execute_init_command",
14
+ "setup_deploy_parsers",
15
+ ]
@@ -0,0 +1,259 @@
1
+ """Bundle a deepagents project for deployment.
2
+
3
+ Reads the canonical project layout:
4
+
5
+ ```txt
6
+ src/
7
+ AGENTS.md # required — system prompt + seeded memory
8
+ skills/ # optional — auto-seeded into skills namespace
9
+ mcp.json # optional — HTTP/SSE MCP servers
10
+ deepagents.toml
11
+ ```
12
+
13
+ ...and writes everything `langgraph deploy` needs to a build directory.
14
+ """
15
+
16
+ from __future__ import annotations
17
+
18
+ import json
19
+ import logging
20
+ import shutil
21
+ from pathlib import Path
22
+
23
+ from deepagents_cli.deploy.config import (
24
+ AGENTS_MD_FILENAME,
25
+ MCP_FILENAME,
26
+ SKILLS_DIRNAME,
27
+ DeployConfig,
28
+ )
29
+ from deepagents_cli.deploy.templates import (
30
+ DEPLOY_GRAPH_TEMPLATE,
31
+ MCP_TOOLS_TEMPLATE,
32
+ PYPROJECT_TEMPLATE,
33
+ SANDBOX_BLOCKS,
34
+ )
35
+
36
+ logger = logging.getLogger(__name__)
37
+
38
+ _MODEL_PROVIDER_DEPS = {
39
+ "anthropic": "langchain-anthropic",
40
+ "openai": "langchain-openai",
41
+ "google_genai": "langchain-google-genai",
42
+ "google_vertexai": "langchain-google-vertexai",
43
+ "groq": "langchain-groq",
44
+ "mistralai": "langchain-mistralai",
45
+ }
46
+ """Dependencies inferred from a provider: prefix on the model string."""
47
+
48
+
49
+ def bundle(
50
+ config: DeployConfig,
51
+ project_root: Path,
52
+ build_dir: Path,
53
+ ) -> Path:
54
+ """Create the full deployment bundle in *build_dir*."""
55
+ build_dir.mkdir(parents=True, exist_ok=True)
56
+
57
+ # 1. Read AGENTS.md — the system prompt AND (optionally) seeded memory.
58
+ agents_md_path = project_root / AGENTS_MD_FILENAME
59
+ system_prompt = agents_md_path.read_text(encoding="utf-8")
60
+
61
+ # 2. Build and write the seed payload: memory (AGENTS.md) + skills/.
62
+ seed = _build_seed(config, project_root, system_prompt)
63
+ (build_dir / "_seed.json").write_text(
64
+ json.dumps(seed, indent=2, ensure_ascii=False),
65
+ encoding="utf-8",
66
+ )
67
+ logger.info(
68
+ "Wrote _seed.json (memories: %d, skills: %d)",
69
+ len(seed["memories"]),
70
+ len(seed["skills"]),
71
+ )
72
+
73
+ # 3. Copy mcp.json if present.
74
+ mcp_present = (project_root / MCP_FILENAME).is_file()
75
+ if mcp_present:
76
+ shutil.copy2(project_root / MCP_FILENAME, build_dir / "_mcp.json")
77
+ logger.info("Copied %s → _mcp.json", MCP_FILENAME)
78
+
79
+ # 3b. Copy .env from the project root if present (i.e. alongside
80
+ # deepagents.toml inside ``src/``). The bundler skips .env when
81
+ # building the seed payload so secrets never land in _seed.json.
82
+ env_src = project_root / ".env"
83
+ env_present = env_src.is_file()
84
+ if env_present:
85
+ shutil.copy2(env_src, build_dir / ".env")
86
+ logger.info("Copied %s → .env", env_src)
87
+
88
+ # 4. Render deploy_graph.py.
89
+ (build_dir / "deploy_graph.py").write_text(
90
+ _render_deploy_graph(config, system_prompt, mcp_present=mcp_present),
91
+ encoding="utf-8",
92
+ )
93
+ logger.info("Generated deploy_graph.py")
94
+
95
+ # 5. Render langgraph.json.
96
+ (build_dir / "langgraph.json").write_text(
97
+ _render_langgraph_json(env_present=env_present),
98
+ encoding="utf-8",
99
+ )
100
+
101
+ # 6. Render pyproject.toml.
102
+ (build_dir / "pyproject.toml").write_text(
103
+ _render_pyproject(config, mcp_present=mcp_present),
104
+ encoding="utf-8",
105
+ )
106
+
107
+ return build_dir
108
+
109
+
110
+ def _build_seed(
111
+ config: DeployConfig, # noqa: ARG001
112
+ project_root: Path,
113
+ system_prompt: str,
114
+ ) -> dict[str, dict[str, str]]:
115
+ """Build the `_seed.json` payload.
116
+
117
+ Layout:
118
+
119
+ ```txt
120
+ {
121
+ "memories": { "AGENTS.md": "..." },
122
+ "skills": { "<skill>/SKILL.md": "...", ... }
123
+ }
124
+ ```
125
+
126
+ `memories` always contains `AGENTS.md` — the agent reads it at runtime
127
+ via `/memories/AGENTS.md`. Writes and edits to that path are blocked
128
+ by `ReadOnlyStoreBackend` in the generated graph.
129
+
130
+ `skills` walks `src/skills/` if present. Keys are paths relative to the
131
+ skills dir; the runtime namespace handles the scoping.
132
+ """
133
+ # Keys must match what CompositeBackend passes to the mounted
134
+ # StoreBackend after stripping the route prefix: for a read of
135
+ # /memories/AGENTS.md it calls store.read("/AGENTS.md").
136
+ # Seed with the same leading-slash convention.
137
+ memories: dict[str, str] = {f"/{AGENTS_MD_FILENAME}": system_prompt}
138
+ skills: dict[str, str] = {}
139
+
140
+ skills_dir = project_root / SKILLS_DIRNAME
141
+ if skills_dir.is_dir():
142
+ for f in sorted(skills_dir.rglob("*")):
143
+ if f.is_file() and not f.name.startswith("."):
144
+ rel = f.relative_to(skills_dir).as_posix()
145
+ skills[f"/{rel}"] = f.read_text(encoding="utf-8")
146
+
147
+ return {"memories": memories, "skills": skills}
148
+
149
+
150
+ def _render_deploy_graph(
151
+ config: DeployConfig,
152
+ system_prompt: str,
153
+ *,
154
+ mcp_present: bool,
155
+ ) -> str:
156
+ """Render the generated `deploy_graph.py`."""
157
+ provider = config.sandbox.provider
158
+ if provider not in SANDBOX_BLOCKS:
159
+ msg = f"Unknown sandbox provider {provider!r}. Valid: {sorted(SANDBOX_BLOCKS)}"
160
+ raise ValueError(msg)
161
+ sandbox_block, _ = SANDBOX_BLOCKS[provider]
162
+
163
+ if mcp_present:
164
+ mcp_tools_block = MCP_TOOLS_TEMPLATE
165
+ mcp_tools_load_call = "tools.extend(await _load_mcp_tools())"
166
+ else:
167
+ mcp_tools_block = ""
168
+ mcp_tools_load_call = "pass # no MCP servers configured"
169
+
170
+ return DEPLOY_GRAPH_TEMPLATE.format(
171
+ model=config.agent.model,
172
+ system_prompt=system_prompt,
173
+ sandbox_template=config.sandbox.template,
174
+ sandbox_image=config.sandbox.image,
175
+ sandbox_scope=config.sandbox.scope,
176
+ sandbox_block=sandbox_block,
177
+ mcp_tools_block=mcp_tools_block,
178
+ mcp_tools_load_call=mcp_tools_load_call,
179
+ default_assistant_id=config.agent.name,
180
+ )
181
+
182
+
183
+ def _render_langgraph_json(*, env_present: bool) -> str:
184
+ """Render `langgraph.json` — adds `"env": ".env"` when a `.env` was copied."""
185
+ data: dict = {
186
+ "dependencies": ["."],
187
+ "graphs": {"agent": "./deploy_graph.py:make_graph"},
188
+ "python_version": "3.12",
189
+ }
190
+ if env_present:
191
+ data["env"] = ".env"
192
+ return json.dumps(data, indent=2) + "\n"
193
+
194
+
195
+ def _render_pyproject(config: DeployConfig, *, mcp_present: bool) -> str:
196
+ """Render the deployment package's `pyproject.toml`.
197
+
198
+ Deps are inferred — the user never writes them. We add:
199
+
200
+ - the LangChain partner package matching the model provider prefix
201
+ - `langchain-mcp-adapters` if `mcp.json` is present
202
+ - the sandbox partner package (daytona/modal/runloop)
203
+ """
204
+ deps: list[str] = []
205
+
206
+ provider_prefix = (
207
+ config.agent.model.split(":", 1)[0] if ":" in config.agent.model else ""
208
+ )
209
+ if provider_prefix and provider_prefix in _MODEL_PROVIDER_DEPS:
210
+ deps.append(_MODEL_PROVIDER_DEPS[provider_prefix])
211
+
212
+ if mcp_present:
213
+ deps.append("langchain-mcp-adapters")
214
+
215
+ _, partner_pkg = SANDBOX_BLOCKS.get(config.sandbox.provider, (None, None))
216
+ if partner_pkg:
217
+ deps.append(partner_pkg)
218
+
219
+ extra_deps_lines = "".join(f' "{dep}",\n' for dep in deps)
220
+
221
+ return PYPROJECT_TEMPLATE.format(
222
+ agent_name=config.agent.name,
223
+ extra_deps=extra_deps_lines,
224
+ )
225
+
226
+
227
+ def print_bundle_summary(config: DeployConfig, build_dir: Path) -> None:
228
+ """Print a human-readable summary of what was bundled."""
229
+ seed_path = build_dir / "_seed.json"
230
+ seed: dict[str, dict[str, str]] = {"memories": {}, "skills": {}}
231
+ if seed_path.exists():
232
+ try:
233
+ seed = json.loads(seed_path.read_text(encoding="utf-8"))
234
+ except Exception:
235
+ pass
236
+
237
+ print(f"\n Agent: {config.agent.name}")
238
+ print(f" Model: {config.agent.model}")
239
+
240
+ memory_files = sorted(seed.get("memories", {}).keys())
241
+ if memory_files:
242
+ print(f"\n Memory seed ({len(memory_files)} file(s)):")
243
+ for f in memory_files:
244
+ print(f" {f}")
245
+
246
+ skills_files = sorted(seed.get("skills", {}).keys())
247
+ if skills_files:
248
+ print(f"\n Skills seed ({len(skills_files)} file(s)):")
249
+ for f in skills_files:
250
+ print(f" {f}")
251
+
252
+ if (build_dir / "_mcp.json").exists():
253
+ print("\n MCP config: _mcp.json")
254
+
255
+ print(f"\n Sandbox: {config.sandbox.provider}")
256
+ print(f"\n Build directory: {build_dir}")
257
+ generated = sorted(f.name for f in build_dir.iterdir() if f.is_file())
258
+ print(f" Generated files: {', '.join(generated)}")
259
+ print()