deepagents-code 0.1.20__tar.gz → 0.1.21__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 (297) hide show
  1. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/AGENTS.md +4 -37
  2. deepagents_code-0.1.21/ARCHITECTURE.md +70 -0
  3. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/CHANGELOG.md +21 -0
  4. deepagents_code-0.1.21/COMMANDS.md +47 -0
  5. deepagents_code-0.1.21/DEVELOPMENT.md +199 -0
  6. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/PKG-INFO +20 -19
  7. deepagents_code-0.1.21/deepagents_code/_cli_context.py +78 -0
  8. deepagents_code-0.1.21/deepagents_code/_paths.py +69 -0
  9. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/_testing_models.py +1 -1
  10. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/_version.py +1 -1
  11. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/agent.py +70 -4
  12. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/app.py +519 -109
  13. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/app.tcss +10 -0
  14. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/clipboard.py +48 -2
  15. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/command_registry.py +27 -30
  16. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/config.py +289 -25
  17. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/config_commands.py +6 -8
  18. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/config_manifest.py +5 -4
  19. deepagents_code-0.1.21/deepagents_code/doctor.py +402 -0
  20. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/extras_info.py +35 -1
  21. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/integrations/sandbox_provider.py +1 -1
  22. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/main.py +111 -23
  23. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/mcp_auth.py +1 -1
  24. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/terminal_escape.py +1 -1
  25. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/textual_adapter.py +24 -3
  26. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/tool_display.py +20 -3
  27. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/ui.py +39 -0
  28. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/unicode_security.py +2 -2
  29. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/update_check.py +487 -12
  30. deepagents_code-0.1.21/deepagents_code/widgets/_js_eval_display.py +139 -0
  31. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/widgets/ask_user.py +6 -0
  32. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/widgets/chat_input.py +231 -29
  33. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/widgets/loading.py +1 -1
  34. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/widgets/mcp_viewer.py +29 -0
  35. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/widgets/messages.py +227 -14
  36. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/widgets/notification_center.py +2 -2
  37. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/widgets/notification_detail.py +1 -1
  38. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/widgets/thread_selector.py +30 -4
  39. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/widgets/update_available.py +1 -1
  40. deepagents_code-0.1.21/deepagents_code/widgets/update_confirm.py +184 -0
  41. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/pyproject.toml +19 -18
  42. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/scripts/generate_commands_catalog.py +6 -5
  43. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/scripts/install.sh +135 -4
  44. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/integration_tests/benchmarks/test_startup_benchmarks.py +4 -4
  45. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/conftest.py +61 -0
  46. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/skills/test_commands.py +1 -1
  47. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_agent.py +151 -4
  48. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_app.py +906 -20
  49. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_ask_user.py +17 -0
  50. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_chat_input.py +342 -3
  51. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_clipboard.py +108 -1
  52. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_command_registry.py +36 -5
  53. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_config.py +437 -1
  54. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_config_manifest.py +8 -6
  55. deepagents_code-0.1.21/tests/unit_tests/test_doctor.py +313 -0
  56. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_extras_info.py +32 -0
  57. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_install_script.py +300 -2
  58. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_main.py +277 -0
  59. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_mcp_tools.py +2 -1
  60. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_mcp_viewer.py +59 -24
  61. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_messages.py +304 -0
  62. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_model_selector.py +144 -208
  63. deepagents_code-0.1.21/tests/unit_tests/test_paths.py +44 -0
  64. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_startup_fast_paths.py +51 -18
  65. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_textual_adapter.py +114 -1
  66. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_thread_selector.py +69 -7
  67. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_tool_display.py +21 -0
  68. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_update_check.py +478 -0
  69. deepagents_code-0.1.21/tests/unit_tests/test_update_confirm.py +106 -0
  70. deepagents_code-0.1.21/tests/unit_tests/test_version.py +1310 -0
  71. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/uv.lock +2229 -1932
  72. deepagents_code-0.1.20/COMMANDS.md +0 -46
  73. deepagents_code-0.1.20/DEV.md +0 -105
  74. deepagents_code-0.1.20/deepagents_code/_cli_context.py +0 -46
  75. deepagents_code-0.1.20/tests/unit_tests/test_version.py +0 -658
  76. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/.gitignore +0 -0
  77. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/Makefile +0 -0
  78. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/README.md +0 -0
  79. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/THREAT_MODEL.md +0 -0
  80. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/__init__.py +0 -0
  81. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/__main__.py +0 -0
  82. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/_ask_user_types.py +0 -0
  83. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/_constants.py +0 -0
  84. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/_debug.py +0 -0
  85. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/_env_vars.py +0 -0
  86. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/_git.py +0 -0
  87. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/_server_config.py +0 -0
  88. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/_session_stats.py +0 -0
  89. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/_startup_error.py +0 -0
  90. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/_textual_patches.py +0 -0
  91. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/ask_user.py +0 -0
  92. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/auth_commands.py +0 -0
  93. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/auth_display.py +0 -0
  94. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/auth_store.py +0 -0
  95. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/built_in_skills/__init__.py +0 -0
  96. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/built_in_skills/remember/SKILL.md +0 -0
  97. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/built_in_skills/skill-creator/SKILL.md +0 -0
  98. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/built_in_skills/skill-creator/scripts/init_skill.py +0 -0
  99. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/built_in_skills/skill-creator/scripts/quick_validate.py +0 -0
  100. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/configurable_model.py +0 -0
  101. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/default_agent_prompt.md +0 -0
  102. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/editor.py +0 -0
  103. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/event_bus.py +0 -0
  104. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/file_ops.py +0 -0
  105. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/filesystem_empty_result.py +0 -0
  106. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/formatting.py +0 -0
  107. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/hooks.py +0 -0
  108. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/input.py +0 -0
  109. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/integrations/__init__.py +0 -0
  110. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/integrations/openai_codex.py +0 -0
  111. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/integrations/sandbox_config.py +0 -0
  112. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/integrations/sandbox_factory.py +0 -0
  113. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/integrations/sandbox_registry.py +0 -0
  114. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/iterm_cursor_guide.py +0 -0
  115. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/local_context.py +0 -0
  116. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/managed_tools.py +0 -0
  117. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/mcp_commands.py +0 -0
  118. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/mcp_disabled.py +0 -0
  119. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/mcp_login_service.py +0 -0
  120. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/mcp_oauth_ui.py +0 -0
  121. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/mcp_providers/__init__.py +0 -0
  122. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/mcp_providers/_registry.py +0 -0
  123. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/mcp_providers/base.py +0 -0
  124. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/mcp_providers/github.py +0 -0
  125. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/mcp_providers/slack.py +0 -0
  126. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/mcp_tools.py +0 -0
  127. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/mcp_trust.py +0 -0
  128. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/media_utils.py +0 -0
  129. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/memory_guard.py +0 -0
  130. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/model_config.py +0 -0
  131. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/non_interactive.py +0 -0
  132. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/notifications.py +0 -0
  133. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/offload.py +0 -0
  134. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/onboarding.py +0 -0
  135. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/output.py +0 -0
  136. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/project_utils.py +0 -0
  137. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/py.typed +0 -0
  138. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/remote_client.py +0 -0
  139. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/resume_state.py +0 -0
  140. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/server.py +0 -0
  141. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/server_graph.py +0 -0
  142. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/server_manager.py +0 -0
  143. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/sessions.py +0 -0
  144. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/skills/__init__.py +0 -0
  145. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/skills/commands.py +0 -0
  146. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/skills/invocation.py +0 -0
  147. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/skills/load.py +0 -0
  148. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/state_migration.py +0 -0
  149. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/subagents.py +0 -0
  150. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/system_prompt.md +0 -0
  151. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/terminal_capabilities.py +0 -0
  152. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/theme.py +0 -0
  153. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/tools.py +0 -0
  154. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/widgets/__init__.py +0 -0
  155. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/widgets/_links.py +0 -0
  156. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/widgets/agent_selector.py +0 -0
  157. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/widgets/approval.py +0 -0
  158. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/widgets/auth.py +0 -0
  159. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/widgets/autocomplete.py +0 -0
  160. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/widgets/codex_auth.py +0 -0
  161. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/widgets/cwd_switch.py +0 -0
  162. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/widgets/diff.py +0 -0
  163. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/widgets/history.py +0 -0
  164. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/widgets/install_confirm.py +0 -0
  165. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/widgets/launch_init.py +0 -0
  166. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/widgets/mcp_login.py +0 -0
  167. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/widgets/mcp_reconnect.py +0 -0
  168. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/widgets/message_store.py +0 -0
  169. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/widgets/model_selector.py +0 -0
  170. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/widgets/notification_settings.py +0 -0
  171. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/widgets/restart_prompt.py +0 -0
  172. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/widgets/status.py +0 -0
  173. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/widgets/theme_selector.py +0 -0
  174. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/widgets/tool_renderers.py +0 -0
  175. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/widgets/tool_widgets.py +0 -0
  176. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/widgets/update_progress.py +0 -0
  177. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/deepagents_code/widgets/welcome.py +0 -0
  178. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/examples/skills/arxiv-search/SKILL.md +0 -0
  179. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/examples/skills/arxiv-search/arxiv_search.py +0 -0
  180. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/examples/skills/langgraph-docs/SKILL.md +0 -0
  181. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/examples/skills/skill-creator/SKILL.md +0 -0
  182. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/examples/skills/skill-creator/scripts/init_skill.py +0 -0
  183. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/examples/skills/skill-creator/scripts/quick_validate.py +0 -0
  184. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/examples/skills/web-research/SKILL.md +0 -0
  185. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/images/tui.png +0 -0
  186. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/scripts/check_imports.py +0 -0
  187. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/scripts/debug_server.sh +0 -0
  188. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/README.md +0 -0
  189. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/integration_tests/__init__.py +0 -0
  190. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/integration_tests/benchmarks/__init__.py +0 -0
  191. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/integration_tests/benchmarks/test_codspeed_import_benchmarks.py +0 -0
  192. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/integration_tests/conftest.py +0 -0
  193. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/integration_tests/test_acp_mode.py +0 -0
  194. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/integration_tests/test_compact_resume.py +0 -0
  195. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/integration_tests/test_sandbox_factory.py +0 -0
  196. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/integration_tests/test_sandbox_operations.py +0 -0
  197. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/__init__.py +0 -0
  198. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/skills/__init__.py +0 -0
  199. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/skills/test_load.py +0 -0
  200. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/skills/test_skills_json.py +0 -0
  201. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_agent_friendly.py +0 -0
  202. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_agent_selector.py +0 -0
  203. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_approval.py +0 -0
  204. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_args.py +0 -0
  205. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_ask_user_middleware.py +0 -0
  206. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_auth_commands.py +0 -0
  207. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_auth_display.py +0 -0
  208. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_auth_store.py +0 -0
  209. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_auth_widgets.py +0 -0
  210. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_autocomplete.py +0 -0
  211. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_charset.py +0 -0
  212. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_compact_tool.py +0 -0
  213. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_configurable_model.py +0 -0
  214. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_cursor_blink.py +0 -0
  215. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_cwd_switch.py +0 -0
  216. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_debug.py +0 -0
  217. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_editor.py +0 -0
  218. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_end_to_end.py +0 -0
  219. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_env_vars.py +0 -0
  220. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_event_bus.py +0 -0
  221. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_exception_handling.py +0 -0
  222. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_file_ops.py +0 -0
  223. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_filesystem_empty_result.py +0 -0
  224. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_formatting.py +0 -0
  225. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_git.py +0 -0
  226. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_history.py +0 -0
  227. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_hooks.py +0 -0
  228. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_imports.py +0 -0
  229. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_input_parsing.py +0 -0
  230. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_install_command.py +0 -0
  231. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_install_confirm.py +0 -0
  232. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_iterm_cursor_guide.py +0 -0
  233. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_launch_init.py +0 -0
  234. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_links.py +0 -0
  235. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_loading.py +0 -0
  236. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_local_context.py +0 -0
  237. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_main_acp_mode.py +0 -0
  238. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_main_args.py +0 -0
  239. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_managed_tools.py +0 -0
  240. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_mcp_auth.py +0 -0
  241. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_mcp_commands.py +0 -0
  242. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_mcp_disabled.py +0 -0
  243. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_mcp_login_modal.py +0 -0
  244. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_mcp_login_service.py +0 -0
  245. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_mcp_oauth_ui.py +0 -0
  246. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_mcp_reconnect.py +0 -0
  247. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_mcp_trust.py +0 -0
  248. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_media_utils.py +0 -0
  249. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_memory_guard.py +0 -0
  250. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_message_store.py +0 -0
  251. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_model_config.py +0 -0
  252. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_model_switch.py +0 -0
  253. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_non_interactive.py +0 -0
  254. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_notification_center.py +0 -0
  255. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_notification_detail.py +0 -0
  256. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_notifications.py +0 -0
  257. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_offload.py +0 -0
  258. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_offload_dict_messages.py +0 -0
  259. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_onboarding.py +0 -0
  260. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_openai_codex_integration.py +0 -0
  261. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_output.py +0 -0
  262. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_reload.py +0 -0
  263. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_remote_client.py +0 -0
  264. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_restart_prompt.py +0 -0
  265. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_resume_state.py +0 -0
  266. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_sandbox_config.py +0 -0
  267. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_sandbox_factory.py +0 -0
  268. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_sandbox_provider.py +0 -0
  269. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_sandbox_registry.py +0 -0
  270. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_server.py +0 -0
  271. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_server_config.py +0 -0
  272. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_server_graph.py +0 -0
  273. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_server_helpers.py +0 -0
  274. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_server_manager.py +0 -0
  275. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_session_stats.py +0 -0
  276. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_sessions.py +0 -0
  277. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_shell_allow_list.py +0 -0
  278. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_skill_invocation.py +0 -0
  279. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_state_migration.py +0 -0
  280. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_status.py +0 -0
  281. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_subagents.py +0 -0
  282. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_terminal_capabilities.py +0 -0
  283. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_terminal_escape.py +0 -0
  284. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_terminal_progress_preference.py +0 -0
  285. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_textual_patches.py +0 -0
  286. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_theme.py +0 -0
  287. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_tracing_replicas.py +0 -0
  288. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_ui.py +0 -0
  289. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_unicode_security.py +0 -0
  290. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_update_available.py +0 -0
  291. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_update_progress.py +0 -0
  292. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/test_welcome.py +0 -0
  293. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/tools/__init__.py +0 -0
  294. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/tools/test_current_thread.py +0 -0
  295. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/tools/test_fetch_url.py +0 -0
  296. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/widgets/__init__.py +0 -0
  297. {deepagents_code-0.1.20 → deepagents_code-0.1.21}/tests/unit_tests/widgets/test_diff.py +0 -0
@@ -2,7 +2,7 @@
2
2
 
3
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
4
 
5
- For monorepo-wide conventions (commit titles, lint, testing, docs, CI, benchmarks), see the root `AGENTS.md`.
5
+ For monorepo-wide conventions (commit titles, lint, testing, docs, CI, benchmarks), see the root `AGENTS.md`. For a high-level map of the package (client/server processes, request lifecycle, module map), see `ARCHITECTURE.md`.
6
6
 
7
7
  ## Textual (terminal UI framework)
8
8
 
@@ -71,40 +71,7 @@ Casts are acceptable when the type violation is the point of the test (for examp
71
71
 
72
72
  `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`).
73
73
 
74
- ## Local dev installs
75
-
76
- Keep the released CLI and editable development CLI separate:
77
-
78
- - `dcode` / `deepagents-code` should point at the normal installed tool, typically managed by `uv tool install deepagents-code`.
79
- - `dcode-dev` should point at a dedicated editable venv under `~/.local/share/dcode-dev`, with a symlink in `~/.local/bin/dcode-dev`.
80
-
81
- This uses a manual `uv venv` + `uv pip install -e` rather than `uv sync` or `uv tool install --editable` on purpose: it builds an isolated venv outside the workspace's locked environment, so the dev binary can be re-resolved on demand without disturbing the released tool or the repo's `uv.lock`. `uv pip`/`uv venv` are first-class `uv` subcommands here, not bare `pip`.
82
-
83
- `~/.local/bin` must be on your `PATH` for the `dcode-dev` symlink to resolve (`uv tool install` adds its own shim directory automatically, but a hand-rolled symlink does not).
84
-
85
- Example setup. The `--python` value is illustrative — any interpreter satisfying the package's `requires-python` (currently `>=3.11`) works; omit the flag to let `uv` pick. Replace `<repo>` with your local checkout path.
86
-
87
- ```bash
88
- uv venv ~/.local/share/dcode-dev --python 3.13
89
- uv pip install --python ~/.local/share/dcode-dev/bin/python -e <repo>/libs/code
90
- ln -sf ~/.local/share/dcode-dev/bin/dcode ~/.local/bin/dcode-dev
91
- ```
92
-
93
- When dependency constraints change in `libs/code/pyproject.toml`, update the dev venv explicitly:
94
-
95
- ```bash
96
- uv pip install --python ~/.local/share/dcode-dev/bin/python -e <repo>/libs/code --upgrade
97
- ```
98
-
99
- Verify command resolution and editable imports (the `dcode` checks assume the released tool is installed separately, per above):
100
-
101
- ```bash
102
- which dcode
103
- which dcode-dev
104
- dcode --version
105
- dcode-dev --version
106
- ~/.local/share/dcode-dev/bin/python -c 'import deepagents_code; print(deepagents_code.__file__)'
107
- ```
74
+ For a persistent editable `dcode-dev` install that stays separate from a released install, see [Local dev installs](./DEVELOPMENT.md#local-dev-installs) in the development guide.
108
75
 
109
76
  ## Startup performance
110
77
 
@@ -124,7 +91,7 @@ Debug logging is configured **once**, on the `deepagents_code` package logger, b
124
91
 
125
92
  - Do **not** add per-module `configure_debug_logging(logger)` calls. They are redundant now that the package logger is configured at import, and they reintroduce the duplicate-handler problem the single-config approach solves.
126
93
  - Every module should create its logger with `logging.getLogger(__name__)` so it stays inside the `deepagents_code.*` hierarchy and inherits the package handler. Don't set `logger.propagate = False` or attach your own handlers.
127
- - The handler only attaches when `DEEPAGENTS_CODE_DEBUG` is truthy; the no-op path is a single env-var read, so it's safe on the startup hot path. See `DEV.md` for the `DEEPAGENTS_CODE_DEBUG` / `DEEPAGENTS_CODE_DEBUG_FILE` env vars.
94
+ - The handler only attaches when `DEEPAGENTS_CODE_DEBUG` is truthy; the no-op path is a single env-var read, so it's safe on the startup hot path. See `DEVELOPMENT.md` for the `DEEPAGENTS_CODE_DEBUG` / `DEEPAGENTS_CODE_DEBUG_FILE` env vars.
128
95
 
129
96
  ## CLI help screen
130
97
 
@@ -138,7 +105,7 @@ When adding a user-facing CLI feature (new slash command, keybinding, workflow),
138
105
 
139
106
  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.
140
107
 
141
- 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.
108
+ 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 commands-catalog` if you changed command names, aliases, descriptions, visibility, or hidden-command metadata, then (5) run `make lint && make test` — the drift test will catch any mismatch.
142
109
 
143
110
  ## Adding a new model provider
144
111
 
@@ -0,0 +1,70 @@
1
+ # Deep Agents Code Architecture
2
+
3
+ ## What this package is
4
+
5
+ `deepagents-code` is a prebuilt terminal coding agent built on top of the `deepagents` SDK. It is a reference implementation: one design for packaging the SDK into a useful coding-agent product, based on patterns that have worked well in our experience.
6
+
7
+ The SDK provides the agent harness. This package shows how to combine that harness with a terminal experience, persistence, tools, skills, and optional sandboxed execution.
8
+
9
+ ## The big picture
10
+
11
+ Deep Agents Code has two runtime halves:
12
+
13
+ ```text
14
+ ┌──────────────────── Terminal client ─────────────────────┐
15
+ │ Presents interactive or headless output │
16
+ │ Collects user input and approvals │
17
+ └──────────────────────────┬───────────────────────────────┘
18
+ │ streaming protocol
19
+
20
+ ┌──────────────────── Agent server ────────────────────────┐
21
+ │ Runs the coding agent graph │
22
+ │ Connects the model, tools, memory, skills, and backend │
23
+ └──────────────────────────────────────────────────────────┘
24
+ ```
25
+
26
+ The client and server run in separate processes. The client owns presentation and input. The server owns the agent runtime. Keeping that boundary narrow makes the UI responsive while letting the agent use LangGraph's streaming, checkpointing, and resume behavior.
27
+
28
+ ## Request flow
29
+
30
+ A request follows the same shape in interactive and headless mode:
31
+
32
+ 1. The client receives user input.
33
+ 2. The client sends that input to the agent server.
34
+ 3. The server runs the agent and streams events back.
35
+ 4. The client renders those events and collects any needed human response.
36
+ 5. Session state is preserved so the conversation can continue later.
37
+
38
+ Headless mode uses the same agent runtime as the interactive UI, but swaps the terminal interface for machine-friendly input and output.
39
+
40
+ ## Configuration and extension
41
+
42
+ Configuration is layered across user, project, session, and runtime scopes. That lets teams share project defaults while individual users keep their own credentials, preferences, skills, and local settings.
43
+
44
+ The main extension points are:
45
+
46
+ - **Skills and subagents** for reusable agent workflows
47
+ - **Tools and MCP servers** for external capabilities
48
+ - **Sandboxes** for changing where tool execution happens
49
+ - **Hooks and commands** for integrating with local workflows
50
+
51
+ These pieces are designed to compose. A project can provide shared defaults and integrations, while each user can layer personal configuration on top.
52
+
53
+ ## Design tradeoffs
54
+
55
+ This architecture optimizes for:
56
+
57
+ - A responsive local terminal experience
58
+ - A reusable agent core that can be tested apart from the UI
59
+ - Durable sessions that can be resumed
60
+ - Controlled tool execution, locally or in a sandbox
61
+ - Practical extension points without rewriting the core app
62
+
63
+ The main cost is the client/server boundary. When debugging, first decide which side owns the failure: presentation and input usually belong to the client; model execution, tools, memory, and graph startup usually belong to the server.
64
+
65
+ ## Where to go next
66
+
67
+ - For local setup and debugging, see [`DEVELOPMENT.md`](./DEVELOPMENT.md).
68
+ - For command behavior, see [`COMMANDS.md`](./COMMANDS.md).
69
+ - For security boundaries, see [`THREAT_MODEL.md`](./THREAT_MODEL.md).
70
+ - For package-specific coding conventions, see [`AGENTS.md`](./AGENTS.md).
@@ -2,6 +2,27 @@
2
2
 
3
3
  # Deep Agents Code Changelog
4
4
 
5
+ ## [0.1.21](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.20...deepagents-code==0.1.21) (2026-06-23)
6
+
7
+ ### Features
8
+
9
+ * `dcode doctor` diagnostics command ([#4148](https://github.com/langchain-ai/deepagents/issues/4148)) ([8179731](https://github.com/langchain-ai/deepagents/commit/81797312c7d857e7d94d03c9c695cd3c8d88799a))
10
+ * Add structured TUI display for `js_eval` ([#4151](https://github.com/langchain-ai/deepagents/issues/4151)) ([91c0dae](https://github.com/langchain-ai/deepagents/commit/91c0dae3fe0253f02a5926fcd3c6f796cd8d11fe))
11
+ * Allow dependency updates without requiring release ([#4157](https://github.com/langchain-ai/deepagents/issues/4157)) ([7beb97a](https://github.com/langchain-ai/deepagents/commit/7beb97a2b02e2fd238baf3b6f05d43a4accf3f42))
12
+ * Clear chat input via `esc+esc`, add `[ X ]/[ COPY ]` buttons ([#4000](https://github.com/langchain-ai/deepagents/issues/4000)) ([c20546f](https://github.com/langchain-ai/deepagents/commit/c20546feac7876786e6816776d1ccfa5fcd4b2c8))
13
+ * Confirm "Launched" after auto-update restart ([#4098](https://github.com/langchain-ai/deepagents/issues/4098)) ([df8db8a](https://github.com/langchain-ai/deepagents/commit/df8db8af6a7cbfc2ab535020b951d73759da73dd))
14
+ * Surface tracing in `doctor` and `config show` ([#4163](https://github.com/langchain-ai/deepagents/issues/4163)) ([2bb3e44](https://github.com/langchain-ai/deepagents/commit/2bb3e44243553a5f2954a0f3ec42364563842a87))
15
+
16
+ ### Bug Fixes
17
+
18
+ * Handle LangSmith project-not-found and default tracing project ([#4153](https://github.com/langchain-ai/deepagents/issues/4153)) ([e303ce9](https://github.com/langchain-ai/deepagents/commit/e303ce986a3595f0cf458e796d857f7c8f5f8b5c))
19
+ * Make `/timestamps` toggle instant via per-footer class ([#4095](https://github.com/langchain-ai/deepagents/issues/4095)) ([7ae32b0](https://github.com/langchain-ai/deepagents/commit/7ae32b0a606cc200d4311e11036a65f17e8282b3))
20
+ * Refocus `/mcp` filter input after in-place refresh ([#4080](https://github.com/langchain-ai/deepagents/issues/4080)) ([d79cd74](https://github.com/langchain-ai/deepagents/commit/d79cd74cb8a44c300c3bbad712fe77e709f9221a))
21
+ * Report same-version dependency updates ([#4146](https://github.com/langchain-ai/deepagents/issues/4146)) ([156e118](https://github.com/langchain-ai/deepagents/commit/156e1185242a19746f8c268904637c73f07b9a10))
22
+ * Show "Loading..." in `/threads` agent dropdown while loading ([#4101](https://github.com/langchain-ai/deepagents/issues/4101)) ([c2d949e](https://github.com/langchain-ai/deepagents/commit/c2d949e8765fbbbdb81e5a70125932842358099f))
23
+ * Skip tool interrupts once auto-approve is set ([#4092](https://github.com/langchain-ai/deepagents/issues/4092)) ([9e21c34](https://github.com/langchain-ai/deepagents/commit/9e21c346a6eb8ad25b9cc671f24527b07732e2b7))
24
+ * Word-delete backspace parity in ask-user text area ([#4079](https://github.com/langchain-ai/deepagents/issues/4079)) ([ed3c499](https://github.com/langchain-ai/deepagents/commit/ed3c499354467bc5e8476e5c7cdf0cd5f8b6aec1))
25
+
5
26
  ## [0.1.20](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.19...deepagents-code==0.1.20) (2026-06-17)
6
27
 
7
28
  ### Features
@@ -0,0 +1,47 @@
1
+ <!-- AUTO-GENERATED by scripts/generate_commands_catalog.py — do not edit manually. -->
2
+ # Slash command catalog
3
+
4
+ This is the generated reference for `deepagents-code` slash commands. Command
5
+ names, aliases, and descriptions come from `deepagents_code/command_registry.py`.
6
+ Regenerate this file with `make commands-catalog` after changing command names,
7
+ aliases, descriptions, visibility, or hidden-command metadata.
8
+
9
+
10
+ ## Public (28)
11
+
12
+ | Command | Aliases | Description |
13
+ | --- | --- | --- |
14
+ | `/agents` | | Browse and switch between available agents |
15
+ | `/auth` | `/connect` | Connect and manage model provider credentials |
16
+ | `/auto-update` | | Turn automatic updates on or off |
17
+ | `/changelog` | | Open the changelog in a browser |
18
+ | `/clear` | | Clear the chat and start a new thread |
19
+ | `/copy` | | Copy the latest assistant message to clipboard |
20
+ | `/docs` | | Open the docs |
21
+ | `/editor` | | Open prompt in an external editor ($EDITOR) |
22
+ | `/feedback` | | Send feedback or report an issue |
23
+ | `/force-clear` | | Stop active work, clear the chat, and start a new thread |
24
+ | `/help` | | Show help and available commands |
25
+ | `/install` | | Install an optional integration |
26
+ | `/mcp` | | Manage MCP servers and authentication |
27
+ | `/model` | | Switch models or edit model settings |
28
+ | `/notifications` | | Configure startup warnings |
29
+ | `/offload` | `/compact` | Offload older messages to free context |
30
+ | `/quit` | `/q` | Exit app |
31
+ | `/reload` | | Reload environment and config |
32
+ | `/remember` | | Save useful context to memory or skills |
33
+ | `/restart` | | Restart the agent server |
34
+ | `/skill-creator` | | Create or refine agent skills |
35
+ | `/theme` | | Change color theme |
36
+ | `/threads` | | Browse and resume past threads |
37
+ | `/timestamps` | | Show or hide message timestamps |
38
+ | `/tokens` | | Show token usage |
39
+ | `/trace` | | Open this thread in LangSmith |
40
+ | `/update` | | Check for and install updates |
41
+ | `/version` | `/about` | Show version information |
42
+
43
+ ## Hidden (1)
44
+
45
+ These commands are intentionally omitted from autocomplete and help. See the `HIDDEN_COMMANDS` docstring in the registry for context.
46
+
47
+ - `/debug-error`
@@ -0,0 +1,199 @@
1
+ # Deep Agents Code Development Guide
2
+
3
+ New to the package? Start with [`ARCHITECTURE.md`](./ARCHITECTURE.md) for a high-level map of how the TUI, the `langgraph dev` server subprocess, and the agent graph fit together.
4
+
5
+ ## Contents
6
+
7
+ - [Quickstart](#quickstart) — get a local checkout running and run the checks CI enforces
8
+ - [Local dev installs](#local-dev-installs) — keep an editable `dcode-dev` separate from a released install
9
+ - [Debugging](#debugging) — diagnose startup crashes and client-side issues
10
+ - [Live CSS development with Textual devtools](#live-css-development-with-textual-devtools) — UI/CSS hot-reload
11
+
12
+ ## Quickstart
13
+
14
+ This package uses [`uv`](https://docs.astral.sh/uv/) for environment and dependency management. Install it first if you haven't:
15
+
16
+ ```bash
17
+ curl -LsSf https://astral.sh/uv/install.sh | sh
18
+ ```
19
+
20
+ Clone the monorepo and sync the `code` package with its test dependencies (this creates the virtualenv and installs everything you need to run and test the app):
21
+
22
+ ```bash
23
+ git clone https://github.com/langchain-ai/deepagents.git
24
+ cd deepagents/libs/code
25
+ uv sync --group test
26
+ ```
27
+
28
+ Run the TUI from `libs/code` in your local checkout:
29
+
30
+ ```bash
31
+ uv run deepagents-code
32
+ ```
33
+
34
+ `uv run` uses the project environment with the package installed editable, so source changes take effect on the next launch. If you want a persistent `dcode-dev` command that stays separate from a released install, use the local dev install setup below.
35
+
36
+ ### Running the tests and linters
37
+
38
+ All commands run from `libs/code`. These mirror what CI enforces, so run them before opening a PR.
39
+
40
+ ```bash
41
+ # Unit tests (no network)
42
+ make test
43
+
44
+ # A single test file
45
+ make test TEST_FILE=tests/unit_tests/test_specific.py
46
+
47
+ # Integration tests (network permitted)
48
+ make integration_test
49
+ ```
50
+
51
+ ```bash
52
+ # Auto-format (ruff format + autofix)
53
+ make format
54
+
55
+ # Lint + type-check (ruff, ty, commands-catalog check)
56
+ make lint
57
+ ```
58
+
59
+ Run `make help` to see every available target.
60
+
61
+ ## Debugging
62
+
63
+ Deep Agents Code runs as two processes: the **Textual TUI** you interact with, and a **`langgraph dev` subprocess** that hosts the agent graph. Each writes its own log, and a single switch turns both on:
64
+
65
+ ```bash
66
+ cd libs/code
67
+ export DEEPAGENTS_CODE_DEBUG=1
68
+ uv run deepagents-code
69
+ ```
70
+
71
+ | Variable | Effect |
72
+ | --- | --- |
73
+ | `DEEPAGENTS_CODE_DEBUG` | Master switch. Preserves the server subprocess log on exit (printing its path to stderr) and attaches the client `DEBUG` file handler. Truthy: `1`/`true`/`yes`/`on` (case-insensitive). Falsy: `0`/`false`/`no`/`off`/empty/unset. |
74
+ | `DEEPAGENTS_CODE_DEBUG_FILE=<path>` | Overrides the client log path (default `/tmp/deepagents_debug.log`). **Only takes effect when `DEEPAGENTS_CODE_DEBUG` is truthy**; does **not** affect the server subprocess log. |
75
+
76
+ Then pick the log you need by symptom:
77
+
78
+ | Symptom | Log you want | Default location |
79
+ | --- | --- | --- |
80
+ | App crashes on launch (one-line failure banner) | **Server subprocess log** — the real traceback | `$TMPDIR/deepagents_server_log_*.txt` |
81
+ | App starts, then misbehaves (UI, model calls, slash commands) | **Client app log** — `deepagents_code` at `DEBUG` | `/tmp/deepagents_debug.log` |
82
+
83
+ ### Startup crash -> server subprocess log
84
+
85
+ The TUI only surfaces a one-line banner; the actual exception lives in the subprocess's combined stdout/stderr. To get it:
86
+
87
+ 1. **Re-run with debugging on** (see above). On exit, the log is preserved and its path is printed to stderr as `Server log preserved at: ...`. Textual's fullscreen mode can hide that line, but the file is still on disk.
88
+ 2. **Open the newest log.** On macOS, `tempfile` resolves to `$TMPDIR` (a path under `/var/folders/.../T/`):
89
+
90
+ ```bash
91
+ # Newest first
92
+ ls -lt ${TMPDIR:-/tmp}/deepagents_server_log_*.txt | head -5
93
+
94
+ # Or tail the latest live while you reproduce the crash
95
+ tail -F "$(ls -t ${TMPDIR:-/tmp}/deepagents_server_log_*.txt | head -1)"
96
+ ```
97
+
98
+ 3. **Search for `Failed to initialize server graph`.** The traceback beneath it names the concrete failure — MCP config validation, sandbox init, model resolution, subagent load, and so on. Everything above that line is uvicorn/lifespan unwinding and can be ignored.
99
+
100
+ ### Client-side issue -> app log
101
+
102
+ For problems that appear after the app is up, tail the client log in another terminal while reproducing:
103
+
104
+ ```bash
105
+ tail -f /tmp/deepagents_debug.log
106
+ ```
107
+
108
+ To send it elsewhere, also `export DEEPAGENTS_CODE_DEBUG_FILE=<path>`. The handler appends across runs, so a single file accumulates every session.
109
+
110
+ ## Local dev installs
111
+
112
+ A *local dev install* gives you a persistent `dcode-dev` command that launches your checkout directly. It lives in a dedicated editable venv under `~/.local/share/dcode-dev`, symlinked into `~/.local/bin/dcode-dev`. It can sit alongside a released `dcode` without interfering:
113
+
114
+ - `dcode` / `deepagents-code` — the released tool, installed via `curl -LsSf https://langch.in/dcode | bash` (the install script).
115
+ - `dcode-dev` — your local checkout.
116
+
117
+ That lets you compare released behavior against local, and fall back to a known-good build if your checkout breaks. Either way, the dedicated venv keeps the dev binary's dependency experiments out of the repo's locked `uv sync` environment.
118
+
119
+ ### Setup
120
+
121
+ `~/.local/bin` must be on your `PATH` for the symlink to resolve (`uv tool install` adds its own shim directory automatically, but a hand-rolled symlink does not). Replace `<repo>` with your local checkout path:
122
+
123
+ ```bash
124
+ # 1. Create an isolated venv for the dev binary
125
+ uv venv ~/.local/share/dcode-dev --python 3.13
126
+
127
+ # 2. Install your checkout into it, editable
128
+ uv pip install --python ~/.local/share/dcode-dev/bin/python -e <repo>/libs/code
129
+
130
+ # 3. Expose it as `dcode-dev` on your PATH
131
+ ln -sf ~/.local/share/dcode-dev/bin/dcode ~/.local/bin/dcode-dev
132
+ ```
133
+
134
+ The `--python 3.13` is illustrative — any interpreter satisfying the package's `requires-python` (currently `>=3.11`) works; omit the flag to let `uv` pick.
135
+
136
+ > **Why `uv venv` + `uv pip install -e` rather than `uv sync` or `uv tool install --editable`?** This builds an isolated venv *outside* the workspace's locked environment, so the dev binary can be re-resolved on demand without disturbing the released tool or the repo's `uv.lock`. (`uv pip` and `uv venv` are first-class `uv` subcommands here, not bare `pip`.)
137
+
138
+ ### Updating
139
+
140
+ When dependency constraints change in `libs/code/pyproject.toml`, refresh the dev venv:
141
+
142
+ ```bash
143
+ uv pip install --python ~/.local/share/dcode-dev/bin/python -e <repo>/libs/code --upgrade
144
+ ```
145
+
146
+ ### Verifying
147
+
148
+ Confirm command resolution and editable imports (the `dcode` checks assume the released tool is installed separately, per above):
149
+
150
+ ```bash
151
+ which dcode
152
+ which dcode-dev
153
+ dcode --version
154
+ dcode-dev --version
155
+ ~/.local/share/dcode-dev/bin/python -c 'import deepagents_code; print(deepagents_code.__file__)'
156
+ ```
157
+
158
+ ## Live CSS development with Textual devtools
159
+
160
+ After completing the [Quickstart](#quickstart), use Textual's devtools console for CSS hot-reload and live `self.log()` output during development.
161
+
162
+ Create the dev wrapper script once:
163
+
164
+ ```bash
165
+ cat > /tmp/dev_deepagents.py << 'PYEOF'
166
+ """Dev wrapper to run Deep Agents Code with textual devtools."""
167
+ import sys
168
+ sys.argv = ["deepagents"] + sys.argv[1:]
169
+
170
+ from deepagents_code.main import cli_main
171
+ cli_main()
172
+ PYEOF
173
+ ```
174
+
175
+ Run both commands from `libs/code`:
176
+
177
+ **Terminal 1** — devtools console:
178
+
179
+ ```bash
180
+ uv run --group test textual console
181
+ ```
182
+
183
+ **Terminal 2** — TUI with live reload:
184
+
185
+ ```bash
186
+ uv run --group test textual run --dev /tmp/dev_deepagents.py
187
+ ```
188
+
189
+ Edit any `.tcss` file and save — changes appear immediately. Any `self.log()` calls in widget code show in the console.
190
+
191
+ ### Console options
192
+
193
+ - `textual console -v` — verbose mode, shows all events (key presses, mouse, etc.)
194
+ - `textual console -x EVENT` — exclude noisy event groups
195
+ - `textual console --port 7342` — custom port (pass matching `--port` to `textual run`)
196
+
197
+ ### Why the wrapper script?
198
+
199
+ `textual run --dev` handles the devtools connection, but it needs to run inside the project's virtualenv to import `deepagents_code`. The wrapper script bridges the gap — `uv run --group test textual run --dev` ensures both `textual-dev` (from the `test` group) and `deepagents_code` are available in the same environment.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: deepagents-code
3
- Version: 0.1.20
3
+ Version: 0.1.21
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,19 +27,20 @@ Classifier: Topic :: Terminals
27
27
  Requires-Python: <4.0,>=3.11
28
28
  Requires-Dist: aiosqlite<1.0.0,>=0.22.1
29
29
  Requires-Dist: deepagents-acp<1.0.0,>=0.0.8
30
- Requires-Dist: deepagents==0.6.10
30
+ Requires-Dist: deepagents==0.6.11
31
31
  Requires-Dist: httpx<1.0.0,>=0.28.1
32
- Requires-Dist: langchain-anthropic<2.0.0,>=1.4.6
32
+ Requires-Dist: langchain-anthropic<2.0.0,>=1.4.7
33
33
  Requires-Dist: langchain-google-genai<5.0.0,>=4.2.5
34
34
  Requires-Dist: langchain-mcp-adapters<1.0.0,>=0.3.0
35
- Requires-Dist: langchain-openai<2.0.0,>=1.3.2
36
- Requires-Dist: langchain<2.0.0,>=1.3.9
35
+ Requires-Dist: langchain-openai<2.0.0,>=1.3.3
36
+ Requires-Dist: langchain<2.0.0,>=1.3.11
37
37
  Requires-Dist: langgraph-checkpoint-sqlite<4.0.0,>=3.1.0
38
- Requires-Dist: langgraph-cli[inmem]<1.0.0,>=0.4.29
38
+ Requires-Dist: langgraph-cli[inmem]<1.0.0,>=0.4.30
39
39
  Requires-Dist: langgraph-runtime-inmem<1.0.0,>=0.30.0
40
40
  Requires-Dist: langgraph-sdk<1.0.0,>=0.4.2
41
- Requires-Dist: langsmith[sandbox]>=0.8.15
41
+ Requires-Dist: langsmith[sandbox]>=0.9.0
42
42
  Requires-Dist: markdownify<2.0.0,>=1.2.2
43
+ Requires-Dist: mcp<2.0.0,>=1.9.2
43
44
  Requires-Dist: packaging>=26.2
44
45
  Requires-Dist: pillow<13.0.0,>=12.2.0
45
46
  Requires-Dist: prompt-toolkit<4.0.0,>=3.0.52
@@ -53,12 +54,12 @@ Requires-Dist: textual-autocomplete<5.0.0,>=4.0.6
53
54
  Requires-Dist: textual-speedups<1.0.0,>=0.2.1
54
55
  Requires-Dist: textual<9.0.0,>=8.2.7
55
56
  Requires-Dist: tomli-w<2.0.0,>=1.2.0
56
- Requires-Dist: uuid-utils<1.0.0,>=0.16.0
57
+ Requires-Dist: uuid-utils<1.0.0,>=0.16.2
57
58
  Provides-Extra: agentcore
58
59
  Requires-Dist: langchain-agentcore-codeinterpreter<1.0.0,>=0.0.4; extra == 'agentcore'
59
60
  Provides-Extra: all-providers
60
- Requires-Dist: langchain-anthropic<2.0.0,>=1.4.6; extra == 'all-providers'
61
- Requires-Dist: langchain-aws<2.0.0,>=1.5.1; extra == 'all-providers'
61
+ Requires-Dist: langchain-anthropic<2.0.0,>=1.4.7; extra == 'all-providers'
62
+ Requires-Dist: langchain-aws<2.0.0,>=1.6.0; extra == 'all-providers'
62
63
  Requires-Dist: langchain-baseten<1.0.0,>=0.2.0; extra == 'all-providers'
63
64
  Requires-Dist: langchain-cohere<1.0.0,>=0.6.0; extra == 'all-providers'
64
65
  Requires-Dist: langchain-deepseek<2.0.0,>=1.1.0; extra == 'all-providers'
@@ -68,12 +69,12 @@ Requires-Dist: langchain-google-vertexai<4.0.0,>=3.2.4; extra == 'all-providers'
68
69
  Requires-Dist: langchain-groq<2.0.0,>=1.1.3; extra == 'all-providers'
69
70
  Requires-Dist: langchain-huggingface<2.0.0,>=1.2.2; extra == 'all-providers'
70
71
  Requires-Dist: langchain-ibm<2.0.0,>=1.1.0; extra == 'all-providers'
71
- Requires-Dist: langchain-litellm<2.0.0,>=0.6.6; extra == 'all-providers'
72
+ Requires-Dist: langchain-litellm<2.0.0,>=0.7.0; extra == 'all-providers'
72
73
  Requires-Dist: langchain-mistralai<2.0.0,>=1.1.5; extra == 'all-providers'
73
74
  Requires-Dist: langchain-nvidia-ai-endpoints<2.0.0,>=1.4.1; extra == 'all-providers'
74
75
  Requires-Dist: langchain-ollama<2.0.0,>=1.1.0; extra == 'all-providers'
75
- Requires-Dist: langchain-openai<2.0.0,>=1.3.2; extra == 'all-providers'
76
- Requires-Dist: langchain-openrouter<2.0.0,>=0.2.3; extra == 'all-providers'
76
+ Requires-Dist: langchain-openai<2.0.0,>=1.3.3; extra == 'all-providers'
77
+ Requires-Dist: langchain-openrouter<2.0.0,>=0.2.4; extra == 'all-providers'
77
78
  Requires-Dist: langchain-perplexity<2.0.0,>=1.4.0; extra == 'all-providers'
78
79
  Requires-Dist: langchain-together<2.0.0,>=0.4.0; extra == 'all-providers'
79
80
  Requires-Dist: langchain-xai<2.0.0,>=1.2.2; extra == 'all-providers'
@@ -84,11 +85,11 @@ Requires-Dist: langchain-modal>=0.0.5; extra == 'all-sandboxes'
84
85
  Requires-Dist: langchain-runloop>=0.0.6; extra == 'all-sandboxes'
85
86
  Requires-Dist: langchain-vercel-sandbox>=0.0.1; extra == 'all-sandboxes'
86
87
  Provides-Extra: anthropic
87
- Requires-Dist: langchain-anthropic<2.0.0,>=1.4.6; extra == 'anthropic'
88
+ Requires-Dist: langchain-anthropic<2.0.0,>=1.4.7; extra == 'anthropic'
88
89
  Provides-Extra: baseten
89
90
  Requires-Dist: langchain-baseten<1.0.0,>=0.2.0; extra == 'baseten'
90
91
  Provides-Extra: bedrock
91
- Requires-Dist: langchain-aws<2.0.0,>=1.5.1; extra == 'bedrock'
92
+ Requires-Dist: langchain-aws<2.0.0,>=1.6.0; extra == 'bedrock'
92
93
  Provides-Extra: cohere
93
94
  Requires-Dist: langchain-cohere<1.0.0,>=0.6.0; extra == 'cohere'
94
95
  Provides-Extra: daytona
@@ -106,7 +107,7 @@ Requires-Dist: langchain-huggingface<2.0.0,>=1.2.2; extra == 'huggingface'
106
107
  Provides-Extra: ibm
107
108
  Requires-Dist: langchain-ibm<2.0.0,>=1.1.0; extra == 'ibm'
108
109
  Provides-Extra: litellm
109
- Requires-Dist: langchain-litellm<2.0.0,>=0.6.6; extra == 'litellm'
110
+ Requires-Dist: langchain-litellm<2.0.0,>=0.7.0; extra == 'litellm'
110
111
  Provides-Extra: mistralai
111
112
  Requires-Dist: langchain-mistralai<2.0.0,>=1.1.5; extra == 'mistralai'
112
113
  Provides-Extra: modal
@@ -116,13 +117,13 @@ Requires-Dist: langchain-nvidia-ai-endpoints<2.0.0,>=1.4.1; extra == 'nvidia'
116
117
  Provides-Extra: ollama
117
118
  Requires-Dist: langchain-ollama<2.0.0,>=1.1.0; extra == 'ollama'
118
119
  Provides-Extra: openai
119
- Requires-Dist: langchain-openai<2.0.0,>=1.3.2; extra == 'openai'
120
+ Requires-Dist: langchain-openai<2.0.0,>=1.3.3; extra == 'openai'
120
121
  Provides-Extra: openrouter
121
- Requires-Dist: langchain-openrouter<2.0.0,>=0.2.3; extra == 'openrouter'
122
+ Requires-Dist: langchain-openrouter<2.0.0,>=0.2.4; extra == 'openrouter'
122
123
  Provides-Extra: perplexity
123
124
  Requires-Dist: langchain-perplexity<2.0.0,>=1.4.0; extra == 'perplexity'
124
125
  Provides-Extra: quickjs
125
- Requires-Dist: langchain-quickjs<0.3.0,>=0.2.0; extra == 'quickjs'
126
+ Requires-Dist: langchain-quickjs<0.4.0,>=0.3.1; extra == 'quickjs'
126
127
  Provides-Extra: runloop
127
128
  Requires-Dist: langchain-runloop>=0.0.6; extra == 'runloop'
128
129
  Provides-Extra: together
@@ -0,0 +1,78 @@
1
+ """Lightweight runtime context types for the CLI agent graph.
2
+
3
+ Carries per-run overrides (model swap/params, approval mode) passed via
4
+ `context=`. Extracted from `configurable_model` so hot-path modules (`app`,
5
+ `textual_adapter`) can import `CLIContext` without pulling in the langchain
6
+ middleware stack.
7
+ """
8
+
9
+ from __future__ import annotations
10
+
11
+ from dataclasses import dataclass, field
12
+ from typing import Any, TypedDict
13
+
14
+
15
+ @dataclass
16
+ class CLIContextSchema:
17
+ """Declared `context_schema` for the agent graph.
18
+
19
+ Registered via `context_schema=` when the graph is built, so LangGraph
20
+ coerces each run's `context=` payload into this dataclass — in-process,
21
+ `runtime.context` is a `CLIContextSchema` instance.
22
+
23
+ It exists alongside `CLIContext` (below) because the payload is shaped
24
+ differently on each side of the API boundary: in-process it is coerced to
25
+ this dataclass, but over the LangGraph API server (RemoteGraph) it is
26
+ serialized to JSON and arrives as a plain dict. Consumers
27
+ (`configurable_model._get_context`, `_should_interrupt_tool_call`)
28
+ therefore accept both shapes. `CLIContext` is the client-facing builder for
29
+ constructing that payload.
30
+
31
+ Fields mirror `CLIContext`; see its per-field docstrings for semantics.
32
+ """
33
+
34
+ model: str | None = None
35
+
36
+ model_params: dict[str, Any] = field(default_factory=dict)
37
+
38
+ effective_model: str | None = None
39
+
40
+ auto_approve: bool = False
41
+
42
+
43
+ class CLIContext(TypedDict, total=False):
44
+ """Client-facing builder for the per-run graph context payload.
45
+
46
+ Callers populate this and pass it via `context=` to `astream`/`ainvoke`.
47
+ `ConfigurableModelMiddleware` and the `interrupt_on` `when` predicate read
48
+ it from `request.runtime.context`. In-process LangGraph coerces it into
49
+ `CLIContextSchema` (the registered `context_schema`); over the API it stays
50
+ a plain dict — which is why consumers handle both shapes.
51
+ """
52
+
53
+ model: str | None
54
+ """Model spec to swap at runtime (e.g. `'provider:model'`)."""
55
+
56
+ model_params: dict[str, Any]
57
+ """Invocation params (e.g. `temperature`, `max_tokens`) to merge
58
+ into `model_settings`."""
59
+
60
+ effective_model: str | None
61
+ """Resolved `provider:model` spec actually in use for this invocation.
62
+
63
+ Unlike `model` (a swap *instruction* that is `None` when the base model is
64
+ used), this carries the model in effect — whether from a `/model` override
65
+ or the startup default — so `ResumeStateMiddleware` can record it to
66
+ checkpoint state for restore on resume. `None` when no usable spec is
67
+ resolved yet (e.g. credentials not configured), in which case nothing is
68
+ recorded rather than a malformed spec.
69
+ """
70
+
71
+ auto_approve: bool
72
+ """Whether gated tool calls should skip the human-approval interrupt.
73
+
74
+ Sourced from the client session (not graph state) so the model cannot
75
+ self-approve by writing state. The `interrupt_on` `when` predicate reads
76
+ this to suppress interrupts at the source when "approve always" is on,
77
+ avoiding the interrupt-then-auto-resolve round-trip.
78
+ """