deepagents-code 0.1.2__tar.gz → 0.1.4__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 (254) hide show
  1. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/.gitignore +2 -0
  2. deepagents_code-0.1.4/AGENTS.md +95 -0
  3. deepagents_code-0.1.4/CHANGELOG.md +62 -0
  4. deepagents_code-0.1.4/COMMANDS.md +44 -0
  5. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/Makefile +8 -1
  6. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/PKG-INFO +6 -11
  7. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/README.md +0 -7
  8. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/__init__.py +1 -1
  9. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/_server_config.py +55 -0
  10. deepagents_code-0.1.4/deepagents_code/_startup_error.py +45 -0
  11. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/_version.py +1 -1
  12. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/agent.py +178 -4
  13. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/app.py +1225 -176
  14. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/command_registry.py +15 -6
  15. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/config.py +345 -17
  16. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/extras_info.py +39 -0
  17. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/integrations/sandbox_factory.py +28 -5
  18. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/main.py +126 -8
  19. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/mcp_auth.py +321 -90
  20. deepagents_code-0.1.4/deepagents_code/mcp_commands.py +246 -0
  21. deepagents_code-0.1.4/deepagents_code/mcp_disabled.py +182 -0
  22. deepagents_code-0.1.4/deepagents_code/mcp_login_service.py +281 -0
  23. deepagents_code-0.1.4/deepagents_code/mcp_oauth_ui.py +199 -0
  24. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/mcp_providers/base.py +20 -2
  25. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/mcp_providers/github.py +14 -3
  26. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/mcp_providers/slack.py +63 -33
  27. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/mcp_tools.py +56 -19
  28. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/model_config.py +24 -0
  29. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/non_interactive.py +16 -0
  30. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/server_graph.py +21 -8
  31. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/server_manager.py +30 -0
  32. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/sessions.py +104 -7
  33. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/textual_adapter.py +52 -80
  34. deepagents_code-0.1.4/deepagents_code/token_state.py +88 -0
  35. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/tool_display.py +8 -0
  36. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/ui.py +37 -6
  37. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/widgets/chat_input.py +80 -59
  38. deepagents_code-0.1.4/deepagents_code/widgets/mcp_login.py +433 -0
  39. deepagents_code-0.1.4/deepagents_code/widgets/mcp_reconnect.py +208 -0
  40. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/widgets/mcp_viewer.py +463 -45
  41. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/widgets/messages.py +7 -0
  42. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/widgets/welcome.py +65 -7
  43. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/pyproject.toml +15 -3
  44. deepagents_code-0.1.4/scripts/generate_commands_catalog.py +133 -0
  45. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/scripts/install.sh +30 -19
  46. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_agent.py +351 -0
  47. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_app.py +1668 -16
  48. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_args.py +194 -11
  49. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_chat_input.py +221 -77
  50. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_command_registry.py +50 -2
  51. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_config.py +76 -2
  52. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_extras_info.py +36 -8
  53. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_mcp_auth.py +500 -36
  54. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_mcp_commands.py +15 -3
  55. deepagents_code-0.1.4/tests/unit_tests/test_mcp_disabled.py +125 -0
  56. deepagents_code-0.1.4/tests/unit_tests/test_mcp_login_modal.py +266 -0
  57. deepagents_code-0.1.4/tests/unit_tests/test_mcp_login_service.py +291 -0
  58. deepagents_code-0.1.4/tests/unit_tests/test_mcp_oauth_ui.py +422 -0
  59. deepagents_code-0.1.4/tests/unit_tests/test_mcp_reconnect.py +130 -0
  60. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_mcp_tools.py +112 -3
  61. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_mcp_viewer.py +648 -7
  62. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_non_interactive.py +45 -0
  63. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_offload.py +9 -6
  64. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_sandbox_factory.py +80 -0
  65. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_server_config.py +27 -0
  66. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_server_graph.py +58 -0
  67. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_server_manager.py +1 -0
  68. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_sessions.py +254 -8
  69. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_textual_adapter.py +200 -3
  70. deepagents_code-0.1.4/tests/unit_tests/test_token_tracker.py +217 -0
  71. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_welcome.py +20 -2
  72. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/uv.lock +83 -13
  73. deepagents_code-0.1.2/CHANGELOG.md +0 -32
  74. deepagents_code-0.1.2/deepagents_code/mcp_commands.py +0 -204
  75. deepagents_code-0.1.2/deepagents_code/token_state.py +0 -31
  76. deepagents_code-0.1.2/tests/unit_tests/test_token_tracker.py +0 -150
  77. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/DEV.md +0 -0
  78. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/THREAT_MODEL.md +0 -0
  79. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/__main__.py +0 -0
  80. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/_ask_user_types.py +0 -0
  81. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/_cli_context.py +0 -0
  82. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/_constants.py +0 -0
  83. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/_debug.py +0 -0
  84. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/_env_vars.py +0 -0
  85. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/_git.py +0 -0
  86. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/_session_stats.py +0 -0
  87. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/_testing_models.py +0 -0
  88. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/_textual_patches.py +0 -0
  89. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/app.tcss +0 -0
  90. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/ask_user.py +0 -0
  91. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/auth_store.py +0 -0
  92. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/built_in_skills/__init__.py +0 -0
  93. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/built_in_skills/remember/SKILL.md +0 -0
  94. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/built_in_skills/skill-creator/SKILL.md +0 -0
  95. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/built_in_skills/skill-creator/scripts/init_skill.py +0 -0
  96. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/built_in_skills/skill-creator/scripts/quick_validate.py +0 -0
  97. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/clipboard.py +0 -0
  98. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/configurable_model.py +0 -0
  99. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/default_agent_prompt.md +0 -0
  100. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/editor.py +0 -0
  101. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/event_bus.py +0 -0
  102. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/file_ops.py +0 -0
  103. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/formatting.py +0 -0
  104. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/hooks.py +0 -0
  105. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/input.py +0 -0
  106. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/integrations/__init__.py +0 -0
  107. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/integrations/sandbox_provider.py +0 -0
  108. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/iterm_cursor_guide.py +0 -0
  109. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/local_context.py +0 -0
  110. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/mcp_providers/__init__.py +0 -0
  111. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/mcp_providers/_registry.py +0 -0
  112. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/mcp_trust.py +0 -0
  113. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/media_utils.py +0 -0
  114. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/notifications.py +0 -0
  115. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/offload.py +0 -0
  116. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/onboarding.py +0 -0
  117. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/output.py +0 -0
  118. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/project_utils.py +0 -0
  119. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/py.typed +0 -0
  120. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/remote_client.py +0 -0
  121. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/server.py +0 -0
  122. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/skills/__init__.py +0 -0
  123. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/skills/commands.py +0 -0
  124. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/skills/invocation.py +0 -0
  125. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/skills/load.py +0 -0
  126. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/state_migration.py +0 -0
  127. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/subagents.py +0 -0
  128. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/system_prompt.md +0 -0
  129. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/terminal_capabilities.py +0 -0
  130. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/terminal_escape.py +0 -0
  131. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/theme.py +0 -0
  132. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/tools.py +0 -0
  133. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/unicode_security.py +0 -0
  134. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/update_check.py +0 -0
  135. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/widgets/__init__.py +0 -0
  136. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/widgets/_links.py +0 -0
  137. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/widgets/agent_selector.py +0 -0
  138. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/widgets/approval.py +0 -0
  139. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/widgets/ask_user.py +0 -0
  140. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/widgets/auth.py +0 -0
  141. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/widgets/autocomplete.py +0 -0
  142. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/widgets/diff.py +0 -0
  143. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/widgets/history.py +0 -0
  144. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/widgets/launch_init.py +0 -0
  145. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/widgets/loading.py +0 -0
  146. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/widgets/message_store.py +0 -0
  147. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/widgets/model_selector.py +0 -0
  148. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/widgets/notification_center.py +0 -0
  149. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/widgets/notification_detail.py +0 -0
  150. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/widgets/notification_settings.py +0 -0
  151. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/widgets/status.py +0 -0
  152. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/widgets/theme_selector.py +0 -0
  153. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/widgets/thread_selector.py +0 -0
  154. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/widgets/tool_renderers.py +0 -0
  155. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/widgets/tool_widgets.py +0 -0
  156. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/widgets/update_available.py +0 -0
  157. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/deepagents_code/widgets/update_progress.py +0 -0
  158. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/examples/skills/arxiv-search/SKILL.md +0 -0
  159. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/examples/skills/arxiv-search/arxiv_search.py +0 -0
  160. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/examples/skills/langgraph-docs/SKILL.md +0 -0
  161. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/examples/skills/skill-creator/SKILL.md +0 -0
  162. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/examples/skills/skill-creator/scripts/init_skill.py +0 -0
  163. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/examples/skills/skill-creator/scripts/quick_validate.py +0 -0
  164. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/examples/skills/web-research/SKILL.md +0 -0
  165. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/images/tui.png +0 -0
  166. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/scripts/check_imports.py +0 -0
  167. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/scripts/debug_server.sh +0 -0
  168. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/README.md +0 -0
  169. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/integration_tests/__init__.py +0 -0
  170. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/integration_tests/benchmarks/__init__.py +0 -0
  171. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/integration_tests/benchmarks/test_codspeed_import_benchmarks.py +0 -0
  172. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/integration_tests/benchmarks/test_startup_benchmarks.py +0 -0
  173. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/integration_tests/conftest.py +0 -0
  174. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/integration_tests/test_acp_mode.py +0 -0
  175. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/integration_tests/test_compact_resume.py +0 -0
  176. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/integration_tests/test_sandbox_factory.py +0 -0
  177. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/integration_tests/test_sandbox_operations.py +0 -0
  178. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/__init__.py +0 -0
  179. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/conftest.py +0 -0
  180. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/skills/__init__.py +0 -0
  181. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/skills/test_commands.py +0 -0
  182. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/skills/test_load.py +0 -0
  183. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/skills/test_skills_json.py +0 -0
  184. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_agent_friendly.py +0 -0
  185. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_agent_selector.py +0 -0
  186. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_approval.py +0 -0
  187. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_ask_user.py +0 -0
  188. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_ask_user_middleware.py +0 -0
  189. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_auth_store.py +0 -0
  190. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_auth_widgets.py +0 -0
  191. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_autocomplete.py +0 -0
  192. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_charset.py +0 -0
  193. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_clipboard.py +0 -0
  194. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_compact_tool.py +0 -0
  195. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_configurable_model.py +0 -0
  196. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_debug.py +0 -0
  197. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_editor.py +0 -0
  198. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_end_to_end.py +0 -0
  199. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_env_vars.py +0 -0
  200. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_event_bus.py +0 -0
  201. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_exception_handling.py +0 -0
  202. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_file_ops.py +0 -0
  203. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_formatting.py +0 -0
  204. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_git.py +0 -0
  205. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_history.py +0 -0
  206. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_hooks.py +0 -0
  207. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_imports.py +0 -0
  208. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_input_parsing.py +0 -0
  209. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_iterm_cursor_guide.py +0 -0
  210. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_launch_init.py +0 -0
  211. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_links.py +0 -0
  212. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_loading.py +0 -0
  213. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_local_context.py +0 -0
  214. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_main.py +0 -0
  215. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_main_acp_mode.py +0 -0
  216. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_main_args.py +0 -0
  217. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_mcp_trust.py +0 -0
  218. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_media_utils.py +0 -0
  219. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_message_store.py +0 -0
  220. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_messages.py +0 -0
  221. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_model_config.py +0 -0
  222. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_model_selector.py +0 -0
  223. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_model_switch.py +0 -0
  224. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_notification_center.py +0 -0
  225. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_notification_detail.py +0 -0
  226. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_notifications.py +0 -0
  227. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_offload_dict_messages.py +0 -0
  228. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_onboarding.py +0 -0
  229. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_output.py +0 -0
  230. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_reload.py +0 -0
  231. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_remote_client.py +0 -0
  232. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_server.py +0 -0
  233. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_server_helpers.py +0 -0
  234. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_session_stats.py +0 -0
  235. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_shell_allow_list.py +0 -0
  236. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_skill_invocation.py +0 -0
  237. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_startup_fast_paths.py +0 -0
  238. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_state_migration.py +0 -0
  239. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_status.py +0 -0
  240. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_subagents.py +0 -0
  241. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_terminal_capabilities.py +0 -0
  242. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_terminal_escape.py +0 -0
  243. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_textual_patches.py +0 -0
  244. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_theme.py +0 -0
  245. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_thread_selector.py +0 -0
  246. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_tool_display.py +0 -0
  247. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_ui.py +0 -0
  248. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_unicode_security.py +0 -0
  249. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_update_available.py +0 -0
  250. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_update_check.py +0 -0
  251. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_update_progress.py +0 -0
  252. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/test_version.py +0 -0
  253. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/tools/__init__.py +0 -0
  254. {deepagents_code-0.1.2 → deepagents_code-0.1.4}/tests/unit_tests/tools/test_fetch_url.py +0 -0
@@ -138,6 +138,8 @@ celerybeat.pid
138
138
  # Environments
139
139
  .env
140
140
  .envrc
141
+ env.local
142
+ *.env.local
141
143
  .venv
142
144
  env/
143
145
  venv/
@@ -0,0 +1,95 @@
1
+ # `libs/code` agent guide
2
+
3
+ `deepagents-code` is the interactive coding agent — the Textual REPL, headless `-x` mode, MCP integration, skills, sandbox bootstrap, and slash-command surface. Forked from `deepagents-cli` at the 0.1.0 split.
4
+
5
+ For monorepo-wide conventions (commit titles, lint, testing, docs, CI, benchmarks), see the root `AGENTS.md`.
6
+
7
+ ## Textual (terminal UI framework)
8
+
9
+ `deepagents-code` uses [Textual](https://textual.textualize.io/).
10
+
11
+ **Key Textual resources:**
12
+
13
+ - **Guide:** https://textual.textualize.io/guide/
14
+ - **Widget gallery:** https://textual.textualize.io/widget_gallery/
15
+ - **CSS reference:** https://textual.textualize.io/styles/
16
+ - **API reference:** https://textual.textualize.io/api/
17
+
18
+ ### Styled text in widgets
19
+
20
+ Prefer Textual's `Content` (`textual.content`) over Rich's `Text` for widget rendering. `Content` is immutable (like `str`) and integrates natively with Textual's rendering pipeline. Rich `Text` is still correct for code that renders via Rich's `Console.print()` (e.g., `non_interactive.py`, `main.py`).
21
+
22
+ IMPORTANT: `Content` requires **Textual's** `Style` (`textual.style.Style`) for rendering, not Rich's `Style` (`rich.style.Style`). Mixing Rich `Style` objects into `Content` spans will cause `TypeError` during widget rendering. String styles (`"bold cyan"`, `"dim"`) work for non-link styling. For links, use `TStyle(link=url)`.
23
+
24
+ **Never use f-string interpolation in Rich markup** (e.g., `f"[bold]{var}[/bold]"`). If `var` contains square brackets, the markup breaks or throws. Use `Content` methods instead:
25
+
26
+ - `Content.from_markup("[bold]$var[/bold]", var=value)` — for inline markup templates. `$var` substitution auto-escapes dynamic content. **Use when the variable is external/user-controlled** (tool args, file paths, user messages, diff content, error messages from exceptions).
27
+ - `Content.styled(text, "bold")` — single style applied to plain text. No markup parsing. Use for static strings or when the variable is internal/trusted (glyphs, ints, enum-like status values). Avoid `Content.styled(f"..{var}..", style)` when `var` is user-controlled — while `styled` doesn't parse markup, the f-string pattern is fragile and inconsistent with the `from_markup` convention.
28
+ - `Content.assemble("prefix: ", (text, "bold"), " ", other_content)` — for composing pre-built `Content` objects, `(text, style)` tuples, and plain strings. Plain strings are treated as plain text (no markup parsing). Use for structural composition, especially when parts use `TStyle(link=url)`.
29
+ - `content.join(parts)` — like `str.join()` for `Content` objects.
30
+
31
+ **Decision rule:** if the value could ever come from outside the codebase (user input, tool output, API responses, file contents), use `from_markup` with `$var`. If it's a hardcoded string, glyph, or computed int, `styled` is fine.
32
+
33
+ ### `App.notify()` defaults to `markup=True`
34
+
35
+ Textual's `App.notify(message)` parses the message string as Rich markup by default. Any dynamic content (exception messages, file paths, user input, command strings) containing brackets `[]`, ANSI escape codes, or `=` will cause a `MarkupError` crash in Textual's Toast renderer. Always pass `markup=False` when the message contains f-string interpolated variables. Hardcoded string literals are safe with the default.
36
+
37
+ ### Rich `console.print()` and number highlighting
38
+
39
+ `console.print()` defaults to `highlight=True`, which runs `ReprHighlighter` and auto-applies bold + cyan to any detected numbers. This visually overrides subtle styles like `dim` (bold cancels dim in most terminals). Pass `highlight=False` on any `console.print()` call where the content contains numbers and consistent dim/subtle styling matters.
40
+
41
+ ### Textual patterns used in this codebase
42
+
43
+ - **Workers** (`@work` decorator) for async operations - see [Workers guide](https://textual.textualize.io/guide/workers/)
44
+ - **Message passing** for widget communication - see [Events guide](https://textual.textualize.io/guide/events/)
45
+ - **Reactive attributes** for state management - see [Reactivity guide](https://textual.textualize.io/guide/reactivity/)
46
+
47
+ ### Testing Textual apps
48
+
49
+ - Use `textual.pilot` for async UI testing - see [Testing guide](https://textual.textualize.io/guide/testing/)
50
+ - Snapshot testing available for visual regression - see repo `notes/snapshot_testing.md`
51
+
52
+ ## SDK dependency pin
53
+
54
+ `deepagents-code` pins an exact `deepagents==X.Y.Z` version in `pyproject.toml`. When developing features that depend on new SDK functionality, bump this pin as part of the same PR. A CI check verifies the pin matches the current SDK version at release time (unless bypassed with `dangerous-skip-sdk-pin-check`).
55
+
56
+ ## Startup performance
57
+
58
+ `deepagents-code` must stay fast to launch. Never import heavy packages (e.g., `deepagents`, LangChain, LangGraph) at module level or in the argument-parsing path. These imports pull in large dependency trees and add seconds to every invocation, including trivial commands like `deepagents-code -v`.
59
+
60
+ - Keep top-level imports in `main.py` and other entry-point modules minimal.
61
+ - Defer heavy imports to the point where they are actually needed (inside functions/methods).
62
+ - To read another package's version without importing it, use `importlib.metadata.version("package-name")`.
63
+ - Feature-gate checks on the startup hot path (before background workers fire) must be lightweight — env var lookups, small file reads. Never pull in expensive modules just to decide whether to skip a feature.
64
+ - When adding logic that already exists elsewhere (e.g., editable-install detection), import the existing cached implementation rather than duplicating it.
65
+ - Features that run shell commands silently must be opt-in, never default-enabled. Gate behind an explicit env var or config key.
66
+ - Background workers that spawn subprocesses must set a timeout to avoid blocking indefinitely.
67
+
68
+ ## CLI help screen
69
+
70
+ The `deepagents-code --help` screen is hand-maintained in `ui.show_help()`, separate from the argparse definitions in `main.parse_args()`. When adding a new CLI flag, update **both** files. A drift-detection test (`test_args.TestHelpScreenDrift`) fails if a flag is registered in argparse but missing from the help screen.
71
+
72
+ ## Splash screen tips
73
+
74
+ When adding a user-facing CLI feature (new slash command, keybinding, workflow), add a corresponding tip to the `_TIPS` list in `deepagents_code/widgets/welcome.py`. Tips are shown randomly on startup to help users discover features. Keep tips short and action-oriented (e.g., `"Press ctrl+x to compose prompts in your external editor"`).
75
+
76
+ ## Slash commands
77
+
78
+ Slash commands are defined as `SlashCommand` entries in the `COMMANDS` tuple in `deepagents_code/command_registry.py`. Each entry declares the command name, description, `bypass_tier` (queue-bypass classification), optional `hidden_keywords` for fuzzy matching, and optional `aliases`. Bypass-tier frozensets and the `SLASH_COMMANDS` autocomplete list are derived automatically — no other file should hard-code command metadata.
79
+
80
+ To add a new slash command: (1) add a `SlashCommand` entry to `COMMANDS`, (2) set the appropriate `bypass_tier`, (3) add a handler branch in `_handle_command` in `app.py`, (4) run `make lint && make test` — the drift test will catch any mismatch.
81
+
82
+ ## Adding a new model provider
83
+
84
+ `deepagents-code` supports LangChain-based chat model providers as optional dependencies. To add a new provider, update these files (all entries alphabetically sorted):
85
+
86
+ 1. `deepagents_code/model_config.py` — add `"provider_name": "ENV_VAR_NAME"` to `PROVIDER_API_KEY_ENV`
87
+ 2. `pyproject.toml` — add `provider = ["langchain-provider>=X.Y.Z,<N.0.0"]` to `[project.optional-dependencies]` and include it in the `all-providers` composite extra
88
+ 3. `tests/unit_tests/test_model_config.py` — add `assert PROVIDER_API_KEY_ENV["provider_name"] == "ENV_VAR_NAME"` to `TestProviderApiKeyEnv.test_contains_major_providers`
89
+
90
+ **Not required** unless the provider's models have a distinctive name prefix (like `gpt-*`, `claude*`, `gemini*`):
91
+
92
+ - `detect_provider()` in `config.py` — only needed for auto-detection from bare model names
93
+ - `Settings.has_*` property in `config.py` — only needed if referenced by `detect_provider()` fallback logic
94
+
95
+ Model discovery, credential checking, and UI integration are automatic once `PROVIDER_API_KEY_ENV` is populated and the `langchain-*` package is installed.
@@ -0,0 +1,62 @@
1
+ # Deep Agents Code Changelog
2
+
3
+ ## [0.1.4](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.3...deepagents-code==0.1.4) (2026-05-23)
4
+
5
+ ### Features
6
+
7
+ * Add `--sandbox-snapshot-name` flag ([#3538](https://github.com/langchain-ai/deepagents/issues/3538)) ([b01392e](https://github.com/langchain-ai/deepagents/commit/b01392e7549798434f27f3784fa8c4e734053787))
8
+ * `dcode mcp config` and unify `--mcp-config` flag ([#3541](https://github.com/langchain-ai/deepagents/issues/3541)) ([f037b14](https://github.com/langchain-ai/deepagents/commit/f037b140f90a1ba3725b3ef23ab385b3cafe223b))
9
+ * Interpreter middleware via `langchain-quickjs` ([#3525](https://github.com/langchain-ai/deepagents/issues/3525)) ([f0ca89c](https://github.com/langchain-ai/deepagents/commit/f0ca89c962c22058194121526638bc2d29f546bd))
10
+
11
+ ### Bug Fixes
12
+
13
+ * Chat input history navigation and newline scrolling ([#3560](https://github.com/langchain-ai/deepagents/issues/3560)) ([3b51cbd](https://github.com/langchain-ai/deepagents/commit/3b51cbdc8c50d9990477e18a47de6a58e9165bab))
14
+ * Distinguish LangSmith failure modes in `/trace` ([#3558](https://github.com/langchain-ai/deepagents/issues/3558)) ([4d158a0](https://github.com/langchain-ai/deepagents/commit/4d158a031aecad8862e02e332f127573003938ec))
15
+ * Recover initial session prompts from writes table ([#3535](https://github.com/langchain-ai/deepagents/issues/3535)) ([46b6f3f](https://github.com/langchain-ai/deepagents/commit/46b6f3f3e6ce880cd5ec9cf59622bb745d6ac2eb))
16
+ * Install script binary checks reference `dcode` ([#3546](https://github.com/langchain-ai/deepagents/issues/3546)) ([f8977a6](https://github.com/langchain-ai/deepagents/commit/f8977a63769e3f2037619f32596cb9bb7bd1020b))
17
+ * Show tool call previews during batched HITL approvals ([#3530](https://github.com/langchain-ai/deepagents/issues/3530)) ([84daa1a](https://github.com/langchain-ai/deepagents/commit/84daa1a2e27963a6d7694dc9278de83782b4a7b7))
18
+
19
+ ## [0.1.3](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.2...deepagents-code==0.1.3) (2026-05-20)
20
+
21
+ ### Features
22
+
23
+ * In-TUI MCP OAuth login with auto-refresh ([#3469](https://github.com/langchain-ai/deepagents/issues/3469)) ([20e38b8](https://github.com/langchain-ai/deepagents/commit/20e38b8ebd8d9aa4697334432f7832a0a07aea3a))
24
+ * Float unauthorized MCP servers to top and prompt before reconnect ([#3493](https://github.com/langchain-ai/deepagents/issues/3493)) ([2d66580](https://github.com/langchain-ai/deepagents/commit/2d665804131961dfa7e2849248047deec818e4ef))
25
+ * Disable MCP servers from TUI ([#3501](https://github.com/langchain-ai/deepagents/issues/3501)) ([5725de8](https://github.com/langchain-ai/deepagents/commit/5725de857722dbca768a95bc6d97af5b838a11a9))
26
+ * `/restart` hidden slash command ([#3514](https://github.com/langchain-ai/deepagents/issues/3514)) ([74bdd36](https://github.com/langchain-ai/deepagents/commit/74bdd3688948d8369cdd978590f5a822eabeb12c))
27
+
28
+ ### Bug Fixes
29
+
30
+ * Persist `_context_tokens` via `after_model` middleware ([#3496](https://github.com/langchain-ai/deepagents/issues/3496)) ([e2bb284](https://github.com/langchain-ai/deepagents/commit/e2bb284e506e0e49a05169fc6de01bdf42350267))
31
+ * Refresh status bar model after recovering from failed startup ([#3511](https://github.com/langchain-ai/deepagents/issues/3511)) ([c96f822](https://github.com/langchain-ai/deepagents/commit/c96f822de187431404d093b852c4a855d3ab8d30))
32
+
33
+ ## [0.1.2](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.1...deepagents-code==0.1.2) (2026-05-19)
34
+
35
+ ### Features
36
+
37
+ * `/model` toggle for recommended-only list ([#3453](https://github.com/langchain-ai/deepagents/issues/3453)) ([c326b7e](https://github.com/langchain-ai/deepagents/commit/c326b7ec1b9940861175e0466ab4221f03e2bcba))
38
+ * `--timeout` flag for non-interactive ([#3351](https://github.com/langchain-ai/deepagents/issues/3351)) ([44e86ab](https://github.com/langchain-ai/deepagents/commit/44e86abbb1870f689dace8b1be6ed430d65e74c1))
39
+ * Browser loopback OAuth callback for MCP auth ([#3467](https://github.com/langchain-ai/deepagents/issues/3467)) ([d83aa07](https://github.com/langchain-ai/deepagents/commit/d83aa07c818af35800f81d062a147fa45a47ace7))
40
+ * MCP screen metadata ([#3349](https://github.com/langchain-ai/deepagents/issues/3349)) ([ce2f07e](https://github.com/langchain-ai/deepagents/commit/ce2f07e7211f22b3f44a1a232088b89a469a0a99))
41
+
42
+ ### Bug Fixes
43
+
44
+ * Drop sections from `system_prompt.md` already supplied by SDK middleware ([#3448](https://github.com/langchain-ai/deepagents/issues/3448)) ([9dbf2c2](https://github.com/langchain-ai/deepagents/commit/9dbf2c2f19e941e012d0c93418ef09fb56f30d6a))
45
+ * Rename stale usage commands ([#3460](https://github.com/langchain-ai/deepagents/issues/3460)) ([da43b7f](https://github.com/langchain-ai/deepagents/commit/da43b7f9d913e6190ff03c496a269faf08bbf182))
46
+ * Suppress interrupt-cleanup state writes from traces ([#3465](https://github.com/langchain-ai/deepagents/issues/3465)) ([319b24e](https://github.com/langchain-ai/deepagents/commit/319b24e6f179eaf56f105a6db683901c82fe95be))
47
+
48
+ ## [0.1.1](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.0...deepagents-code==0.1.1) (2026-05-16)
49
+
50
+ ### Bug Fixes
51
+
52
+ * Correct LangSmith sandbox working directory ([#3415](https://github.com/langchain-ai/deepagents/issues/3415)) ([b0e8d83](https://github.com/langchain-ai/deepagents/commit/b0e8d83f97a2a698268173a839000c84e8368324))
53
+ * Guard `fetch_url` against SSRF ([#3411](https://github.com/langchain-ai/deepagents/issues/3411)) ([54d8521](https://github.com/langchain-ai/deepagents/commit/54d8521976940dfe147ead4b56565360241335be))
54
+
55
+ ## [0.1.0](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.0.1...deepagents-code==0.1.0) (2026-05-12)
56
+
57
+ Hello world! Ported from `libs/cli`.
58
+
59
+ ---
60
+
61
+ `deepagents-code` was forked from `deepagents-cli` at v0.1.0 (2026-05-12).
62
+ For history prior to the fork, see [the `deepagents-cli` changelog](https://github.com/langchain-ai/deepagents/blob/main/libs/cli/CHANGELOG.md).
@@ -0,0 +1,44 @@
1
+ <!-- AUTO-GENERATED by scripts/generate_commands_catalog.py — do not edit manually. -->
2
+ # Slash command catalog
3
+
4
+ Canonical list of slash commands for `deepagents-code`, derived from
5
+ `deepagents_code/command_registry.py`. Run `make commands-catalog` to
6
+ regenerate after editing the registry.
7
+
8
+
9
+ ## Public (25)
10
+
11
+ | Command | Aliases | Description |
12
+ | --- | --- | --- |
13
+ | `/agents` | | Browse and switch between available agents |
14
+ | `/auth` | `/connect` | Manage stored API keys for model providers |
15
+ | `/auto-update` | | Toggle automatic updates on or off |
16
+ | `/changelog` | | Open changelog in browser |
17
+ | `/clear` | | Clear chat and start new thread |
18
+ | `/copy` | | Copy latest assistant message to clipboard |
19
+ | `/docs` | | Open documentation in browser |
20
+ | `/editor` | | Open prompt in external editor ($EDITOR) |
21
+ | `/feedback` | | Submit a bug report or feature request |
22
+ | `/force-clear` | | Interrupt active work, clear chat, and start new thread |
23
+ | `/help` | | Show help |
24
+ | `/mcp` | | Show MCP servers; `/mcp login <server>` to authenticate, `/mcp reconnect` to load deferred logins, F2 in the viewer to disable/enable a server |
25
+ | `/model` | | Switch or configure model (--model-params, --default) |
26
+ | `/notifications` | | Configure startup warning preferences |
27
+ | `/offload` | `/compact` | Free up context window space by offloading older messages |
28
+ | `/quit` | `/q` | Exit app |
29
+ | `/reload` | | Reload config from environment variables and .env |
30
+ | `/remember` | | Update memory and skills from conversation |
31
+ | `/skill-creator` | | Guide for creating effective agent skills |
32
+ | `/theme` | | Switch color theme |
33
+ | `/threads` | | Browse and resume previous threads |
34
+ | `/tokens` | | Token usage |
35
+ | `/trace` | | Open current thread in LangSmith |
36
+ | `/update` | | Check for and install updates |
37
+ | `/version` | `/about` | Show version |
38
+
39
+ ## Hidden (2)
40
+
41
+ Hidden commands not exposed in autocomplete or help. See the `HIDDEN_COMMANDS` docstring in the registry for context.
42
+
43
+ - `/debug-error`
44
+ - `/restart`
@@ -1,4 +1,4 @@
1
- .PHONY: format lint type typecheck test tests integration_test integration_tests test_watch benchmark bench bench-memory help run lint_package lint_tests check_imports coverage
1
+ .PHONY: format lint type typecheck test tests integration_test integration_tests test_watch benchmark bench bench-memory help run lint_package lint_tests check_imports coverage commands-catalog commands-catalog-check
2
2
 
3
3
  .DEFAULT_GOAL := help
4
4
 
@@ -66,6 +66,7 @@ lint lint_diff lint_package lint_tests:
66
66
  [ "$(PYTHON_FILES)" = "" ] || uv run --all-groups ruff check $(PYTHON_FILES)
67
67
  [ "$(PYTHON_FILES)" = "" ] || uv run --all-groups ruff format $(PYTHON_FILES) --diff
68
68
  $(MAKE) type PYTHON_FILES="$(PYTHON_FILES)"
69
+ uv run --all-groups python scripts/generate_commands_catalog.py --check
69
70
 
70
71
  type: ## Run type checker
71
72
  type typecheck:
@@ -80,6 +81,12 @@ check_imports: ## Check imports
80
81
  check_imports: $(shell find deepagents_code -name '*.py')
81
82
  uv run --all-groups python ./scripts/check_imports.py $^
82
83
 
84
+ commands-catalog: ## Regenerate COMMANDS.md from the slash-command registry
85
+ uv run --all-groups python scripts/generate_commands_catalog.py
86
+
87
+ commands-catalog-check: ## Verify COMMANDS.md matches the slash-command registry
88
+ uv run --all-groups python scripts/generate_commands_catalog.py --check
89
+
83
90
  ######################
84
91
  # HELP
85
92
  ######################
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: deepagents-code
3
- Version: 0.1.2
3
+ Version: 0.1.4
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.6.2
30
+ Requires-Dist: deepagents==0.6.3
31
31
  Requires-Dist: httpx<1.0.0,>=0.28.1
32
32
  Requires-Dist: langchain-anthropic<2.0.0,>=1.4.3
33
33
  Requires-Dist: langchain-google-genai<5.0.0,>=4.2.2
@@ -69,7 +69,7 @@ Requires-Dist: langchain-google-vertexai<4.0.0,>=3.2.3; extra == 'all-providers'
69
69
  Requires-Dist: langchain-groq<2.0.0,>=1.1.2; extra == 'all-providers'
70
70
  Requires-Dist: langchain-huggingface<2.0.0,>=1.2.2; extra == 'all-providers'
71
71
  Requires-Dist: langchain-ibm<2.0.0,>=1.0.7; extra == 'all-providers'
72
- Requires-Dist: langchain-litellm<2.0.0,>=0.6.4; extra == 'all-providers'
72
+ Requires-Dist: langchain-litellm<2.0.0,>=0.6.6; extra == 'all-providers'
73
73
  Requires-Dist: langchain-mistralai<2.0.0,>=1.1.4; extra == 'all-providers'
74
74
  Requires-Dist: langchain-nvidia-ai-endpoints<2.0.0,>=1.2.1; extra == 'all-providers'
75
75
  Requires-Dist: langchain-ollama<2.0.0,>=1.1.0; extra == 'all-providers'
@@ -106,7 +106,7 @@ Requires-Dist: langchain-huggingface<2.0.0,>=1.2.2; extra == 'huggingface'
106
106
  Provides-Extra: ibm
107
107
  Requires-Dist: langchain-ibm<2.0.0,>=1.0.7; extra == 'ibm'
108
108
  Provides-Extra: litellm
109
- Requires-Dist: langchain-litellm<2.0.0,>=0.6.4; extra == 'litellm'
109
+ Requires-Dist: langchain-litellm<2.0.0,>=0.6.6; extra == 'litellm'
110
110
  Provides-Extra: mistralai
111
111
  Requires-Dist: langchain-mistralai<2.0.0,>=1.1.4; extra == 'mistralai'
112
112
  Provides-Extra: modal
@@ -121,6 +121,8 @@ Provides-Extra: openrouter
121
121
  Requires-Dist: langchain-openrouter<2.0.0,>=0.2.3; extra == 'openrouter'
122
122
  Provides-Extra: perplexity
123
123
  Requires-Dist: langchain-perplexity<2.0.0,>=1.2.0; extra == 'perplexity'
124
+ Provides-Extra: quickjs
125
+ Requires-Dist: langchain-quickjs<0.2.0,>=0.1.2; extra == 'quickjs'
124
126
  Provides-Extra: runloop
125
127
  Requires-Dist: langchain-runloop>=0.0.4; extra == 'runloop'
126
128
  Provides-Extra: together
@@ -154,13 +156,6 @@ curl -LsSf https://langch.in/dcode | bash
154
156
  DEEPAGENTS_EXTRAS="nvidia,ollama" curl -LsSf https://langch.in/dcode | bash
155
157
  ```
156
158
 
157
- Or install directly with `uv`:
158
-
159
- ```bash
160
- # Install with chosen model providers
161
- uv tool install 'deepagents-code[nvidia,ollama]'
162
- ```
163
-
164
159
  Run:
165
160
 
166
161
  ```bash
@@ -21,13 +21,6 @@ curl -LsSf https://langch.in/dcode | bash
21
21
  DEEPAGENTS_EXTRAS="nvidia,ollama" curl -LsSf https://langch.in/dcode | bash
22
22
  ```
23
23
 
24
- Or install directly with `uv`:
25
-
26
- ```bash
27
- # Install with chosen model providers
28
- uv tool install 'deepagents-code[nvidia,ollama]'
29
- ```
30
-
31
24
  Run:
32
25
 
33
26
  ```bash
@@ -1,4 +1,4 @@
1
- """Deep Agents CLI - Interactive AI coding assistant."""
1
+ """Deep Agents Code - Interactive AI coding assistant."""
2
2
 
3
3
  from __future__ import annotations
4
4
 
@@ -152,6 +152,26 @@ class ServerConfig:
152
152
  enable_skills: bool = True
153
153
  """Enable the skills subsystem (SKILL.md loading and skill tools)."""
154
154
 
155
+ enable_interpreter: bool = False
156
+ """Enable `CodeInterpreterMiddleware` (`js_eval` REPL) on the main agent.
157
+
158
+ Local-mode only; the server graph raises if a sandbox is configured and
159
+ this flag is `True`.
160
+ """
161
+
162
+ interpreter_ptc: str | list[str] | None = None
163
+ """Override for `settings.interpreter_ptc`.
164
+
165
+ `None` means "fall through to whatever `settings.interpreter_ptc` resolves
166
+ to from `~/.deepagents/config.toml`". A string is one of `"safe"`/`"all"`;
167
+ a list is an explicit allowlist of tool names.
168
+ """
169
+
170
+ interpreter_ptc_acknowledge_unsafe: bool = False
171
+ """Mirror of `settings.interpreter_ptc_acknowledge_unsafe` — required when
172
+ `interpreter_ptc="all"` is paired with non-`auto_approve` mode.
173
+ """
174
+
155
175
  sandbox_type: str | None = None
156
176
  """Sandbox backend identifier (e.g. `'daytona'`); `None` runs tools on the
157
177
  host. `'none'` is normalized to `None` in `__post_init__`."""
@@ -159,6 +179,10 @@ class ServerConfig:
159
179
  sandbox_id: str | None = None
160
180
  """Existing sandbox ID to attach to; `None` creates a fresh sandbox."""
161
181
 
182
+ sandbox_snapshot_name: str | None = None
183
+ """Sandbox snapshot name to use or create. LangSmith-only; must be `None`
184
+ when `sandbox_id` is set."""
185
+
162
186
  sandbox_setup: str | None = None
163
187
  """Absolute path to a setup script executed inside the sandbox on first attach."""
164
188
 
@@ -226,8 +250,18 @@ class ServerConfig:
226
250
  "ENABLE_ASK_USER": str(self.enable_ask_user).lower(),
227
251
  "ENABLE_MEMORY": str(self.enable_memory).lower(),
228
252
  "ENABLE_SKILLS": str(self.enable_skills).lower(),
253
+ "ENABLE_INTERPRETER": str(self.enable_interpreter).lower(),
254
+ "INTERPRETER_PTC": (
255
+ json.dumps(self.interpreter_ptc)
256
+ if self.interpreter_ptc is not None
257
+ else None
258
+ ),
259
+ "INTERPRETER_PTC_ACKNOWLEDGE_UNSAFE": str(
260
+ self.interpreter_ptc_acknowledge_unsafe
261
+ ).lower(),
229
262
  "SANDBOX_TYPE": self.sandbox_type,
230
263
  "SANDBOX_ID": self.sandbox_id,
264
+ "SANDBOX_SNAPSHOT_NAME": self.sandbox_snapshot_name,
231
265
  "SANDBOX_SETUP": self.sandbox_setup,
232
266
  "CWD": self.cwd,
233
267
  "PROJECT_ROOT": self.project_root,
@@ -268,8 +302,14 @@ class ServerConfig:
268
302
  enable_ask_user=_read_env_bool("ENABLE_ASK_USER"),
269
303
  enable_memory=_read_env_bool("ENABLE_MEMORY", default=True),
270
304
  enable_skills=_read_env_bool("ENABLE_SKILLS", default=True),
305
+ enable_interpreter=_read_env_bool("ENABLE_INTERPRETER"),
306
+ interpreter_ptc=_read_env_json("INTERPRETER_PTC"),
307
+ interpreter_ptc_acknowledge_unsafe=_read_env_bool(
308
+ "INTERPRETER_PTC_ACKNOWLEDGE_UNSAFE"
309
+ ),
271
310
  sandbox_type=_read_env_str("SANDBOX_TYPE"),
272
311
  sandbox_id=_read_env_str("SANDBOX_ID"),
312
+ sandbox_snapshot_name=_read_env_str("SANDBOX_SNAPSHOT_NAME") or None,
273
313
  sandbox_setup=_read_env_str("SANDBOX_SETUP"),
274
314
  cwd=_read_env_str("CWD"),
275
315
  project_root=_read_env_str("PROJECT_ROOT"),
@@ -295,9 +335,13 @@ class ServerConfig:
295
335
  shell_allow_list: list[str] | None = None,
296
336
  sandbox_type: str = "none",
297
337
  sandbox_id: str | None,
338
+ sandbox_snapshot_name: str | None,
298
339
  sandbox_setup: str | None,
299
340
  enable_shell: bool,
300
341
  enable_ask_user: bool,
342
+ enable_interpreter: bool = False,
343
+ interpreter_ptc: str | list[str] | None = None,
344
+ interpreter_ptc_acknowledge_unsafe: bool = False,
301
345
  mcp_config_path: str | None,
302
346
  no_mcp: bool,
303
347
  trust_project_mcp: bool | None,
@@ -321,9 +365,16 @@ class ServerConfig:
321
365
  server subprocess for `ShellAllowListMiddleware`.
322
366
  sandbox_type: Sandbox type.
323
367
  sandbox_id: Existing sandbox ID to reuse.
368
+ sandbox_snapshot_name: Sandbox snapshot name to use or create
369
+ (langsmith only).
324
370
  sandbox_setup: Path to setup script for the sandbox.
325
371
  enable_shell: Enable shell execution tools.
326
372
  enable_ask_user: Enable ask_user tool.
373
+ enable_interpreter: Enable `CodeInterpreterMiddleware` on the main
374
+ agent.
375
+ interpreter_ptc: Override for `settings.interpreter_ptc`.
376
+ interpreter_ptc_acknowledge_unsafe: Mirror of
377
+ `settings.interpreter_ptc_acknowledge_unsafe`.
327
378
  mcp_config_path: Path to MCP config.
328
379
  no_mcp: Disable MCP.
329
380
  trust_project_mcp: Trust project MCP servers.
@@ -344,8 +395,12 @@ class ServerConfig:
344
395
  interactive=interactive,
345
396
  enable_shell=enable_shell,
346
397
  enable_ask_user=enable_ask_user,
398
+ enable_interpreter=enable_interpreter,
399
+ interpreter_ptc=interpreter_ptc,
400
+ interpreter_ptc_acknowledge_unsafe=interpreter_ptc_acknowledge_unsafe,
347
401
  sandbox_type=sandbox_type,
348
402
  sandbox_id=sandbox_id,
403
+ sandbox_snapshot_name=sandbox_snapshot_name,
349
404
  sandbox_setup=_normalize_path(
350
405
  sandbox_setup, project_context, "sandbox setup"
351
406
  ),
@@ -0,0 +1,45 @@
1
+ """Stderr marker emission used by the langgraph server graph entry point.
2
+
3
+ Lives in its own module so unit tests can exercise the marker contract
4
+ without triggering `server_graph.make_graph()` at import time.
5
+ """
6
+
7
+ from __future__ import annotations
8
+
9
+ import logging
10
+ import sys
11
+ import traceback
12
+
13
+ logger = logging.getLogger(__name__)
14
+
15
+ STARTUP_ERROR_MARKER = "DEEPAGENTS_STARTUP_ERROR:"
16
+ """Stderr marker the parent app scans for in `server._extract_startup_error_marker`
17
+ to upgrade an opaque "Server process exited with code N" into a one-line summary.
18
+ Format is `{STARTUP_ERROR_MARKER}{single-line message}`."""
19
+
20
+
21
+ def emit_startup_failure(exc: BaseException) -> None:
22
+ """Report a server graph startup failure to the parent app process.
23
+
24
+ Emits two stderr outputs: the full traceback for logs/debugging, then a
25
+ single-line `{STARTUP_ERROR_MARKER}{type}: {summary}` line that
26
+ `server._extract_startup_error_marker` parses to upgrade an opaque
27
+ "Server process exited with code N" into an actionable summary.
28
+
29
+ Args:
30
+ exc: The exception raised during graph initialization.
31
+ """
32
+ logger.critical("Failed to initialize server graph", exc_info=exc)
33
+ print( # noqa: T201 # stderr fallback — logger may not reach parent process
34
+ f"Failed to initialize server graph: {exc}\n{traceback.format_exc()}",
35
+ file=sys.stderr,
36
+ )
37
+ # Marker contract is single-line; guard against multi-line/empty `str(exc)`
38
+ # and include the type so e.g. `ValueError` and `RuntimeError` are
39
+ # distinguishable in the parent's truncated summary.
40
+ exc_lines = str(exc).splitlines()
41
+ summary = exc_lines[0] if exc_lines else "<no message>"
42
+ print( # noqa: T201
43
+ f"{STARTUP_ERROR_MARKER}{type(exc).__name__}: {summary}",
44
+ file=sys.stderr,
45
+ )
@@ -2,7 +2,7 @@
2
2
 
3
3
  # Keep the `x-release-please-version` annotation — release-please uses it to
4
4
  # bump `__version__` in sync with `pyproject.toml` on every release PR.
5
- __version__ = "0.1.2" # x-release-please-version
5
+ __version__ = "0.1.4" # x-release-please-version
6
6
 
7
7
  DOCS_URL = "https://docs.langchain.com/oss/python/deepagents/code"
8
8
  """URL for `deepagents-code` documentation."""