deepagents-code 0.1.35__tar.gz → 0.1.36__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (339) hide show
  1. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/CHANGELOG.md +11 -0
  2. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/PKG-INFO +16 -16
  3. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/_build_info.py +1 -1
  4. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/_version.py +1 -1
  5. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/app.py +10 -5
  6. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/model_config.py +3 -0
  7. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/reasoning_effort.py +75 -10
  8. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/tui/widgets/model_selector.py +7 -0
  9. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/pyproject.toml +10 -10
  10. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_app.py +22 -0
  11. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_model_config.py +7 -0
  12. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_reasoning_effort.py +65 -1
  13. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/tui/widgets/test_model_selector.py +15 -3
  14. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/uv.lock +45 -45
  15. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/.gitignore +0 -0
  16. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/AGENTS.md +0 -0
  17. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/ARCHITECTURE.md +0 -0
  18. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/COMMANDS.md +0 -0
  19. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/DEVELOPMENT.md +0 -0
  20. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/Makefile +0 -0
  21. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/README.md +0 -0
  22. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/THREAT_MODEL.md +0 -0
  23. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/__init__.py +0 -0
  24. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/__main__.py +0 -0
  25. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/_ask_user_types.py +0 -0
  26. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/_cli_context.py +0 -0
  27. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/_constants.py +0 -0
  28. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/_debug.py +0 -0
  29. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/_env_vars.py +0 -0
  30. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/_fake_models.py +0 -0
  31. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/_git.py +0 -0
  32. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/_paths.py +0 -0
  33. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/_server_config.py +0 -0
  34. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/_session_stats.py +0 -0
  35. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/_startup_error.py +0 -0
  36. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/_testing_models.py +0 -0
  37. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/_textual_patches.py +0 -0
  38. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/_tool_stream.py +0 -0
  39. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/agent.py +0 -0
  40. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/app.tcss +0 -0
  41. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/approval_mode.py +0 -0
  42. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/ask_user.py +0 -0
  43. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/auth_display.py +0 -0
  44. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/auth_store.py +0 -0
  45. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/built_in_skills/__init__.py +0 -0
  46. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/built_in_skills/remember/SKILL.md +0 -0
  47. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/built_in_skills/skill-creator/SKILL.md +0 -0
  48. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/built_in_skills/skill-creator/scripts/init_skill.py +0 -0
  49. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/built_in_skills/skill-creator/scripts/quick_validate.py +0 -0
  50. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/client/__init__.py +0 -0
  51. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/client/commands/__init__.py +0 -0
  52. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/client/commands/auth.py +0 -0
  53. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/client/commands/config.py +0 -0
  54. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/client/commands/mcp.py +0 -0
  55. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/client/commands/tools.py +0 -0
  56. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/client/launch/__init__.py +0 -0
  57. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/client/launch/server.py +0 -0
  58. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/client/launch/server_manager.py +0 -0
  59. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/client/non_interactive.py +0 -0
  60. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/client/remote_client.py +0 -0
  61. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/clipboard.py +0 -0
  62. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/command_registry.py +0 -0
  63. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/config.py +0 -0
  64. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/config_manifest.py +0 -0
  65. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/configurable_model.py +0 -0
  66. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/default_agent_prompt.md +0 -0
  67. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/doctor.py +0 -0
  68. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/editor.py +0 -0
  69. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/event_bus.py +0 -0
  70. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/extras_info.py +0 -0
  71. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/file_ops.py +0 -0
  72. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/formatting.py +0 -0
  73. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/goal_rubric.py +0 -0
  74. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/goal_tools.py +0 -0
  75. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/hooks.py +0 -0
  76. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/input.py +0 -0
  77. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/integrations/__init__.py +0 -0
  78. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/integrations/openai_codex.py +0 -0
  79. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/integrations/sandbox_config.py +0 -0
  80. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/integrations/sandbox_factory.py +0 -0
  81. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/integrations/sandbox_provider.py +0 -0
  82. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/integrations/sandbox_registry.py +0 -0
  83. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/iterm_cursor_guide.py +0 -0
  84. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/local_context.py +0 -0
  85. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/main.py +0 -0
  86. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/managed_tools.py +0 -0
  87. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/mcp_auth.py +0 -0
  88. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/mcp_disabled.py +0 -0
  89. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/mcp_login_service.py +0 -0
  90. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/mcp_oauth_ui.py +0 -0
  91. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/mcp_providers/__init__.py +0 -0
  92. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/mcp_providers/_registry.py +0 -0
  93. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/mcp_providers/base.py +0 -0
  94. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/mcp_providers/github.py +0 -0
  95. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/mcp_providers/slack.py +0 -0
  96. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/mcp_tools.py +0 -0
  97. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/mcp_trust.py +0 -0
  98. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/media_utils.py +0 -0
  99. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/memory_guard.py +0 -0
  100. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/notifications.py +0 -0
  101. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/offload.py +0 -0
  102. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/onboarding.py +0 -0
  103. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/output.py +0 -0
  104. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/paste_collapse.py +0 -0
  105. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/project_utils.py +0 -0
  106. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/py.typed +0 -0
  107. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/resume_state.py +0 -0
  108. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/server_graph.py +0 -0
  109. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/sessions.py +0 -0
  110. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/skills/__init__.py +0 -0
  111. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/skills/commands.py +0 -0
  112. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/skills/invocation.py +0 -0
  113. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/skills/load.py +0 -0
  114. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/skills/trust.py +0 -0
  115. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/state_migration.py +0 -0
  116. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/subagents.py +0 -0
  117. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/system_prompt.md +0 -0
  118. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/terminal_capabilities.py +0 -0
  119. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/terminal_escape.py +0 -0
  120. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/theme.py +0 -0
  121. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/tool_catalog.py +0 -0
  122. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/tool_display.py +0 -0
  123. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/tools.py +0 -0
  124. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/tui/__init__.py +0 -0
  125. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/tui/textual_adapter.py +0 -0
  126. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/tui/widgets/__init__.py +0 -0
  127. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/tui/widgets/_js_eval_display.py +0 -0
  128. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/tui/widgets/_links.py +0 -0
  129. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/tui/widgets/agent_selector.py +0 -0
  130. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/tui/widgets/approval.py +0 -0
  131. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/tui/widgets/ask_user.py +0 -0
  132. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/tui/widgets/auth.py +0 -0
  133. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/tui/widgets/autocomplete.py +0 -0
  134. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/tui/widgets/chat_input.py +0 -0
  135. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/tui/widgets/codex_auth.py +0 -0
  136. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/tui/widgets/cwd_switch.py +0 -0
  137. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/tui/widgets/diff.py +0 -0
  138. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/tui/widgets/effort_selector.py +0 -0
  139. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/tui/widgets/goal_review.py +0 -0
  140. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/tui/widgets/history.py +0 -0
  141. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/tui/widgets/install_confirm.py +0 -0
  142. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/tui/widgets/launch_init.py +0 -0
  143. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/tui/widgets/loading.py +0 -0
  144. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/tui/widgets/mcp_login.py +0 -0
  145. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/tui/widgets/mcp_reconnect.py +0 -0
  146. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/tui/widgets/mcp_viewer.py +0 -0
  147. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/tui/widgets/message_store.py +0 -0
  148. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/tui/widgets/messages.py +0 -0
  149. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/tui/widgets/notification_center.py +0 -0
  150. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/tui/widgets/notification_detail.py +0 -0
  151. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/tui/widgets/notification_settings.py +0 -0
  152. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/tui/widgets/restart_prompt.py +0 -0
  153. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/tui/widgets/skill_trust.py +0 -0
  154. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/tui/widgets/startup_tip.py +0 -0
  155. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/tui/widgets/status.py +0 -0
  156. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/tui/widgets/subagent_panel.py +0 -0
  157. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/tui/widgets/theme_selector.py +0 -0
  158. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/tui/widgets/thread_selector.py +0 -0
  159. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/tui/widgets/tool_renderers.py +0 -0
  160. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/tui/widgets/tool_widgets.py +0 -0
  161. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/tui/widgets/update_available.py +0 -0
  162. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/tui/widgets/update_confirm.py +0 -0
  163. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/tui/widgets/update_progress.py +0 -0
  164. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/tui/widgets/welcome.py +0 -0
  165. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/ui.py +0 -0
  166. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/unicode_security.py +0 -0
  167. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/deepagents_code/update_check.py +0 -0
  168. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/examples/skills/arxiv-search/SKILL.md +0 -0
  169. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/examples/skills/arxiv-search/arxiv_search.py +0 -0
  170. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/examples/skills/langgraph-docs/SKILL.md +0 -0
  171. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/examples/skills/skill-creator/SKILL.md +0 -0
  172. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/examples/skills/skill-creator/scripts/init_skill.py +0 -0
  173. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/examples/skills/skill-creator/scripts/quick_validate.py +0 -0
  174. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/examples/skills/web-research/SKILL.md +0 -0
  175. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/hatch_build.py +0 -0
  176. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/images/tui.png +0 -0
  177. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/scripts/check_imports.py +0 -0
  178. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/scripts/debug_server.sh +0 -0
  179. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/scripts/generate_commands_catalog.py +0 -0
  180. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/scripts/install.sh +0 -0
  181. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/README.md +0 -0
  182. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/integration_tests/__init__.py +0 -0
  183. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/integration_tests/benchmarks/__init__.py +0 -0
  184. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/integration_tests/benchmarks/test_codspeed_import_benchmarks.py +0 -0
  185. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/integration_tests/benchmarks/test_startup_benchmarks.py +0 -0
  186. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/integration_tests/conftest.py +0 -0
  187. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/integration_tests/test_acp_mode.py +0 -0
  188. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/integration_tests/test_auto_approve_remote.py +0 -0
  189. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/integration_tests/test_compact_resume.py +0 -0
  190. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/integration_tests/test_sandbox_factory.py +0 -0
  191. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/integration_tests/test_sandbox_operations.py +0 -0
  192. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/__init__.py +0 -0
  193. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/client/__init__.py +0 -0
  194. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/client/commands/__init__.py +0 -0
  195. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/client/commands/test_auth.py +0 -0
  196. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/client/commands/test_mcp.py +0 -0
  197. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/client/commands/test_tools.py +0 -0
  198. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/conftest.py +0 -0
  199. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/data/coding_agent_v1_validator.json +0 -0
  200. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/skills/__init__.py +0 -0
  201. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/skills/test_commands.py +0 -0
  202. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/skills/test_load.py +0 -0
  203. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/skills/test_skill_trust.py +0 -0
  204. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/skills/test_skills_json.py +0 -0
  205. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/smoke_tests/__init__.py +0 -0
  206. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/smoke_tests/conftest.py +0 -0
  207. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/smoke_tests/snapshots/system_prompt_interactive_local.md +0 -0
  208. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/smoke_tests/test_system_prompt.py +0 -0
  209. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test__tool_stream.py +0 -0
  210. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_agent.py +0 -0
  211. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_agent_friendly.py +0 -0
  212. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_approval_mode.py +0 -0
  213. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_args.py +0 -0
  214. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_ask_user_middleware.py +0 -0
  215. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_auth_display.py +0 -0
  216. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_auth_store.py +0 -0
  217. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_auth_web_search_restart.py +0 -0
  218. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_charset.py +0 -0
  219. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_clipboard.py +0 -0
  220. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_coding_agent_metadata.py +0 -0
  221. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_command_registry.py +0 -0
  222. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_compact_tool.py +0 -0
  223. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_config.py +0 -0
  224. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_config_manifest.py +0 -0
  225. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_configurable_model.py +0 -0
  226. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_cursor_blink.py +0 -0
  227. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_debug.py +0 -0
  228. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_doctor.py +0 -0
  229. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_editor.py +0 -0
  230. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_end_to_end.py +0 -0
  231. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_env_vars.py +0 -0
  232. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_event_bus.py +0 -0
  233. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_exception_handling.py +0 -0
  234. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_extras_info.py +0 -0
  235. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_file_ops.py +0 -0
  236. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_formatting.py +0 -0
  237. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_git.py +0 -0
  238. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_goal_rubric.py +0 -0
  239. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_goal_tools.py +0 -0
  240. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_hatch_build.py +0 -0
  241. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_hooks.py +0 -0
  242. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_imports.py +0 -0
  243. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_input_parsing.py +0 -0
  244. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_install_command.py +0 -0
  245. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_install_script.py +0 -0
  246. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_iterm_cursor_guide.py +0 -0
  247. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_local_context.py +0 -0
  248. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_main.py +0 -0
  249. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_main_acp_mode.py +0 -0
  250. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_main_args.py +0 -0
  251. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_managed_tools.py +0 -0
  252. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_mcp_auth.py +0 -0
  253. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_mcp_disabled.py +0 -0
  254. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_mcp_login_service.py +0 -0
  255. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_mcp_oauth_ui.py +0 -0
  256. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_mcp_tools.py +0 -0
  257. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_mcp_trust.py +0 -0
  258. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_media_utils.py +0 -0
  259. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_memory_guard.py +0 -0
  260. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_model_switch.py +0 -0
  261. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_non_interactive.py +0 -0
  262. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_notifications.py +0 -0
  263. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_offload.py +0 -0
  264. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_offload_dict_messages.py +0 -0
  265. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_onboarding.py +0 -0
  266. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_openai_codex_integration.py +0 -0
  267. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_output.py +0 -0
  268. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_paths.py +0 -0
  269. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_reload.py +0 -0
  270. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_remote_client.py +0 -0
  271. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_resume_state.py +0 -0
  272. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_rubric_cli.py +0 -0
  273. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_sandbox_config.py +0 -0
  274. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_sandbox_factory.py +0 -0
  275. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_sandbox_provider.py +0 -0
  276. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_sandbox_registry.py +0 -0
  277. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_server.py +0 -0
  278. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_server_config.py +0 -0
  279. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_server_graph.py +0 -0
  280. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_server_helpers.py +0 -0
  281. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_server_manager.py +0 -0
  282. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_session_stats.py +0 -0
  283. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_sessions.py +0 -0
  284. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_shell_allow_list.py +0 -0
  285. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_skill_invocation.py +0 -0
  286. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_startup_fast_paths.py +0 -0
  287. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_state_migration.py +0 -0
  288. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_subagents.py +0 -0
  289. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_terminal_capabilities.py +0 -0
  290. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_terminal_escape.py +0 -0
  291. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_terminal_progress_preference.py +0 -0
  292. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_textual_patches.py +0 -0
  293. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_theme.py +0 -0
  294. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_tool_catalog.py +0 -0
  295. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_tool_display.py +0 -0
  296. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_tracing_replicas.py +0 -0
  297. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_ui.py +0 -0
  298. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_unicode_security.py +0 -0
  299. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_update_check.py +0 -0
  300. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/test_version.py +0 -0
  301. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/tools/__init__.py +0 -0
  302. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/tools/test_current_thread.py +0 -0
  303. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/tools/test_fetch_url.py +0 -0
  304. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/tui/__init__.py +0 -0
  305. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/tui/test_subagent_stream.py +0 -0
  306. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/tui/test_textual_adapter.py +0 -0
  307. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/tui/widgets/__init__.py +0 -0
  308. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/tui/widgets/test_agent_selector.py +0 -0
  309. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/tui/widgets/test_approval.py +0 -0
  310. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/tui/widgets/test_ask_user.py +0 -0
  311. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/tui/widgets/test_auth_widgets.py +0 -0
  312. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/tui/widgets/test_autocomplete.py +0 -0
  313. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/tui/widgets/test_chat_input.py +0 -0
  314. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/tui/widgets/test_cwd_switch.py +0 -0
  315. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/tui/widgets/test_diff.py +0 -0
  316. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/tui/widgets/test_goal_review.py +0 -0
  317. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/tui/widgets/test_history.py +0 -0
  318. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/tui/widgets/test_install_confirm.py +0 -0
  319. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/tui/widgets/test_launch_init.py +0 -0
  320. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/tui/widgets/test_links.py +0 -0
  321. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/tui/widgets/test_loading.py +0 -0
  322. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/tui/widgets/test_mcp_login_modal.py +0 -0
  323. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/tui/widgets/test_mcp_reconnect.py +0 -0
  324. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/tui/widgets/test_mcp_viewer.py +0 -0
  325. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/tui/widgets/test_message_store.py +0 -0
  326. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/tui/widgets/test_messages.py +0 -0
  327. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/tui/widgets/test_notification_center.py +0 -0
  328. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/tui/widgets/test_notification_detail.py +0 -0
  329. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/tui/widgets/test_restart_prompt.py +0 -0
  330. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/tui/widgets/test_skill_trust_screen.py +0 -0
  331. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/tui/widgets/test_startup_tip.py +0 -0
  332. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/tui/widgets/test_status.py +0 -0
  333. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/tui/widgets/test_subagent_panel.py +0 -0
  334. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/tui/widgets/test_thread_selector.py +0 -0
  335. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/tui/widgets/test_tool_renderers.py +0 -0
  336. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/tui/widgets/test_update_available.py +0 -0
  337. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/tui/widgets/test_update_confirm.py +0 -0
  338. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/tui/widgets/test_update_progress.py +0 -0
  339. {deepagents_code-0.1.35 → deepagents_code-0.1.36}/tests/unit_tests/tui/widgets/test_welcome.py +0 -0
@@ -2,6 +2,17 @@
2
2
 
3
3
  # Deep Agents Code Changelog
4
4
 
5
+ ## [0.1.36](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.35...deepagents-code==0.1.36) (2026-07-09)
6
+
7
+ ### Features
8
+
9
+ * Add `GPT-5.6` model family ([#4600](https://github.com/langchain-ai/deepagents/issues/4600)) ([4a806bc](https://github.com/langchain-ai/deepagents/commit/4a806bc703b69334cccd05bcd27d411602e82318))
10
+ * Add Grok 4.5 model ([#4596](https://github.com/langchain-ai/deepagents/issues/4596)) ([b0a209d](https://github.com/langchain-ai/deepagents/commit/b0a209da3a8c9f80e2e3d5e199340736c854c567))
11
+
12
+ ### Bug Fixes
13
+
14
+ * Strip input before Ctrl+C copy-input fallback ([#4590](https://github.com/langchain-ai/deepagents/issues/4590)) ([505d55a](https://github.com/langchain-ai/deepagents/commit/505d55ad83e8569213175911ee6c8c39fbbf340c))
15
+
5
16
  ## [0.1.35](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.34...deepagents-code==0.1.35) (2026-07-09)
6
17
 
7
18
  ### Features
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: deepagents-code
3
- Version: 0.1.35
3
+ Version: 0.1.36
4
4
  Summary: Terminal interface for Deep Agents - interactive AI agent with file operations, shell access, and sub-agent capabilities.
5
5
  Project-URL: Homepage, https://docs.langchain.com/oss/python/deepagents/overview
6
6
  Project-URL: Documentation, https://reference.langchain.com/python/deepagents/
@@ -30,12 +30,12 @@ Requires-Dist: deepagents-acp<1.0.0,>=0.0.8
30
30
  Requires-Dist: deepagents==0.7.0a6
31
31
  Requires-Dist: filelock<4.0.0,>=3.12
32
32
  Requires-Dist: httpx<1.0.0,>=0.28.1
33
- Requires-Dist: langchain-anthropic<2.0.0,>=1.4.7
33
+ Requires-Dist: langchain-anthropic<2.0.0,>=1.4.8
34
34
  Requires-Dist: langchain-google-genai<5.0.0,>=4.2.7
35
35
  Requires-Dist: langchain-mcp-adapters<1.0.0,>=0.3.0
36
- Requires-Dist: langchain-openai<2.0.0,>=1.3.3
36
+ Requires-Dist: langchain-openai<2.0.0,>=1.3.4
37
37
  Requires-Dist: langchain-quickjs<0.4.0,>=0.3.2
38
- Requires-Dist: langchain<2.0.0,>=1.3.11
38
+ Requires-Dist: langchain<2.0.0,>=1.3.12
39
39
  Requires-Dist: langgraph-checkpoint-sqlite<4.0.0,>=3.1.0
40
40
  Requires-Dist: langgraph-cli[inmem]<1.0.0,>=0.4.30
41
41
  Requires-Dist: langgraph-runtime-inmem<1.0.0,>=0.30.0
@@ -62,23 +62,23 @@ Provides-Extra: agentcore
62
62
  Requires-Dist: langchain-agentcore-codeinterpreter<1.0.0,>=0.0.5; extra == 'agentcore'
63
63
  Provides-Extra: all-providers
64
64
  Requires-Dist: aiohttp<3.15.0,>=3.14.1; extra == 'all-providers'
65
- Requires-Dist: langchain-anthropic<2.0.0,>=1.4.7; extra == 'all-providers'
66
- Requires-Dist: langchain-aws<2.0.0,>=1.6.1; extra == 'all-providers'
65
+ Requires-Dist: langchain-anthropic<2.0.0,>=1.4.8; extra == 'all-providers'
66
+ Requires-Dist: langchain-aws<2.0.0,>=1.6.2; extra == 'all-providers'
67
67
  Requires-Dist: langchain-baseten<1.0.0,>=0.2.1; extra == 'all-providers'
68
68
  Requires-Dist: langchain-cohere<1.0.0,>=0.6.0; extra == 'all-providers'
69
69
  Requires-Dist: langchain-deepseek<2.0.0,>=1.1.0; extra == 'all-providers'
70
- Requires-Dist: langchain-fireworks<2.0.0,>=1.4.3; extra == 'all-providers'
70
+ Requires-Dist: langchain-fireworks<2.0.0,>=1.4.4; extra == 'all-providers'
71
71
  Requires-Dist: langchain-google-genai<5.0.0,>=4.2.7; extra == 'all-providers'
72
72
  Requires-Dist: langchain-google-vertexai<4.0.0,>=3.2.4; extra == 'all-providers'
73
73
  Requires-Dist: langchain-groq<2.0.0,>=1.1.3; extra == 'all-providers'
74
74
  Requires-Dist: langchain-huggingface<2.0.0,>=1.2.2; extra == 'all-providers'
75
75
  Requires-Dist: langchain-ibm<2.0.0,>=1.1.0; extra == 'all-providers'
76
76
  Requires-Dist: langchain-litellm<2.0.0,>=0.7.0; extra == 'all-providers'
77
- Requires-Dist: langchain-mistralai<2.0.0,>=1.1.5; extra == 'all-providers'
77
+ Requires-Dist: langchain-mistralai<2.0.0,>=1.1.6; extra == 'all-providers'
78
78
  Requires-Dist: langchain-nvidia-ai-endpoints<2.0.0,>=1.4.3; extra == 'all-providers'
79
79
  Requires-Dist: langchain-ollama<2.0.0,>=1.1.0; extra == 'all-providers'
80
- Requires-Dist: langchain-openai<2.0.0,>=1.3.3; extra == 'all-providers'
81
- Requires-Dist: langchain-openrouter<2.0.0,>=0.2.4; extra == 'all-providers'
80
+ Requires-Dist: langchain-openai<2.0.0,>=1.3.4; extra == 'all-providers'
81
+ Requires-Dist: langchain-openrouter<2.0.0,>=0.2.6; extra == 'all-providers'
82
82
  Requires-Dist: langchain-perplexity<2.0.0,>=1.4.0; extra == 'all-providers'
83
83
  Requires-Dist: langchain-together<2.0.0,>=0.4.0; extra == 'all-providers'
84
84
  Requires-Dist: langchain-xai<2.0.0,>=1.2.2; extra == 'all-providers'
@@ -89,11 +89,11 @@ Requires-Dist: langchain-modal>=0.0.5; extra == 'all-sandboxes'
89
89
  Requires-Dist: langchain-runloop>=0.0.6; extra == 'all-sandboxes'
90
90
  Requires-Dist: langchain-vercel-sandbox>=0.0.1; extra == 'all-sandboxes'
91
91
  Provides-Extra: anthropic
92
- Requires-Dist: langchain-anthropic<2.0.0,>=1.4.7; extra == 'anthropic'
92
+ Requires-Dist: langchain-anthropic<2.0.0,>=1.4.8; extra == 'anthropic'
93
93
  Provides-Extra: baseten
94
94
  Requires-Dist: langchain-baseten<1.0.0,>=0.2.1; extra == 'baseten'
95
95
  Provides-Extra: bedrock
96
- Requires-Dist: langchain-aws<2.0.0,>=1.6.1; extra == 'bedrock'
96
+ Requires-Dist: langchain-aws<2.0.0,>=1.6.2; extra == 'bedrock'
97
97
  Provides-Extra: cohere
98
98
  Requires-Dist: langchain-cohere<1.0.0,>=0.6.0; extra == 'cohere'
99
99
  Provides-Extra: daytona
@@ -101,7 +101,7 @@ Requires-Dist: langchain-daytona>=0.0.7; extra == 'daytona'
101
101
  Provides-Extra: deepseek
102
102
  Requires-Dist: langchain-deepseek<2.0.0,>=1.1.0; extra == 'deepseek'
103
103
  Provides-Extra: fireworks
104
- Requires-Dist: langchain-fireworks<2.0.0,>=1.4.3; extra == 'fireworks'
104
+ Requires-Dist: langchain-fireworks<2.0.0,>=1.4.4; extra == 'fireworks'
105
105
  Provides-Extra: google-genai
106
106
  Requires-Dist: langchain-google-genai<5.0.0,>=4.2.7; extra == 'google-genai'
107
107
  Provides-Extra: groq
@@ -116,7 +116,7 @@ Provides-Extra: media
116
116
  Requires-Dist: av<18.0.0,>=17.0.0; extra == 'media'
117
117
  Requires-Dist: pillow<13.0.0,>=12.2.0; extra == 'media'
118
118
  Provides-Extra: mistralai
119
- Requires-Dist: langchain-mistralai<2.0.0,>=1.1.5; extra == 'mistralai'
119
+ Requires-Dist: langchain-mistralai<2.0.0,>=1.1.6; extra == 'mistralai'
120
120
  Provides-Extra: modal
121
121
  Requires-Dist: langchain-modal>=0.0.5; extra == 'modal'
122
122
  Provides-Extra: nvidia
@@ -125,9 +125,9 @@ Requires-Dist: langchain-nvidia-ai-endpoints<2.0.0,>=1.4.3; extra == 'nvidia'
125
125
  Provides-Extra: ollama
126
126
  Requires-Dist: langchain-ollama<2.0.0,>=1.1.0; extra == 'ollama'
127
127
  Provides-Extra: openai
128
- Requires-Dist: langchain-openai<2.0.0,>=1.3.3; extra == 'openai'
128
+ Requires-Dist: langchain-openai<2.0.0,>=1.3.4; extra == 'openai'
129
129
  Provides-Extra: openrouter
130
- Requires-Dist: langchain-openrouter<2.0.0,>=0.2.4; extra == 'openrouter'
130
+ Requires-Dist: langchain-openrouter<2.0.0,>=0.2.6; extra == 'openrouter'
131
131
  Provides-Extra: perplexity
132
132
  Requires-Dist: langchain-perplexity<2.0.0,>=1.4.0; extra == 'perplexity'
133
133
  Provides-Extra: quickjs
@@ -1,3 +1,3 @@
1
1
  """Generated at build time. Do not edit or commit."""
2
2
 
3
- BUILD_COMMIT = "09daab5"
3
+ BUILD_COMMIT = "2f56309"
@@ -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.35" # x-release-please-version
5
+ __version__ = "0.1.36" # 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."""
@@ -12259,7 +12259,8 @@ class DeepAgentsApp(App):
12259
12259
  4. If ask_user menu is active, cancel it
12260
12260
  5. If agent is running, interrupt it (preserve input)
12261
12261
  6. If double press (quit_pending), quit
12262
- 7. If a focused input has text, copy the whole draft (no selection)
12262
+ 7. If a focused input has non-whitespace text, copy the whole draft
12263
+ (no selection)
12263
12264
  8. Otherwise show quit hint
12264
12265
 
12265
12266
  Rapid escape hatch: the clipboard-copy branches (1 and 7) are skipped
@@ -12370,13 +12371,14 @@ class DeepAgentsApp(App):
12370
12371
  return copy_text_with_feedback(self, selected_text, failure_noun="selection")
12371
12372
 
12372
12373
  def _copy_focused_input_text(self) -> bool:
12373
- """Copy the focused input's full text to the clipboard, if non-empty.
12374
+ """Copy the focused input's full text to the clipboard, if meaningful.
12374
12375
 
12375
12376
  Ctrl+C fallback used when there is no active selection, so the whole
12376
- draft is copied instead of arming quit.
12377
+ draft is copied instead of arming quit. A whitespace-only draft is
12378
+ treated as empty and left to fall through to quit handling.
12377
12379
 
12378
12380
  Returns:
12379
- `True` when non-empty text was handled by a clipboard attempt.
12381
+ `True` when non-whitespace text was handled by a clipboard attempt.
12380
12382
  """
12381
12383
  from textual.widgets import Input, TextArea
12382
12384
 
@@ -12387,7 +12389,10 @@ class DeepAgentsApp(App):
12387
12389
  return False
12388
12390
 
12389
12391
  text = widget.text if isinstance(widget, TextArea) else widget.value
12390
- if not text:
12392
+ # Strip before deciding whether there is anything to copy: a
12393
+ # whitespace-only draft carries no meaningful content, so Ctrl+C should
12394
+ # fall through to arming quit rather than copying blank space.
12395
+ if not text.strip():
12391
12396
  return False
12392
12397
 
12393
12398
  from deepagents_code.clipboard import copy_text_with_feedback
@@ -594,6 +594,9 @@ source, model class, and request endpoint all differ. See
594
594
 
595
595
  CODEX_MODELS: frozenset[str] = frozenset(
596
596
  {
597
+ "gpt-5.6-luna",
598
+ "gpt-5.6-sol",
599
+ "gpt-5.6-terra",
597
600
  "gpt-5.5",
598
601
  "gpt-5.4",
599
602
  "gpt-5.4-mini",
@@ -27,7 +27,7 @@ type-checked against this alias, so update them in lockstep when it changes.
27
27
  """
28
28
 
29
29
  ReasoningProvider: TypeAlias = Literal[
30
- "anthropic", "fireworks", "google_genai", "openai", "openai_codex"
30
+ "anthropic", "fireworks", "google_genai", "openai", "openai_codex", "xai"
31
31
  ]
32
32
  """Provider identifiers that support model-specific reasoning effort controls.
33
33
 
@@ -53,11 +53,14 @@ class ReasoningProviderConfig(NamedTuple):
53
53
 
54
54
 
55
55
  OPENAI_EFFORTS: tuple[EffortLabel, ...] = ("none", "low", "medium", "high", "xhigh")
56
- """OpenAI GPT-5 effort labels for `reasoning.effort`.
56
+ """OpenAI GPT-5 effort labels before GPT-5.6 for `reasoning.effort`.
57
57
 
58
58
  See https://platform.openai.com/docs/guides/reasoning.
59
59
  """
60
60
 
61
+ OPENAI_56_EFFORTS: tuple[EffortLabel, ...] = (*OPENAI_EFFORTS, "max")
62
+ """OpenAI GPT-5.6 effort labels for `reasoning.effort`."""
63
+
61
64
  ANTHROPIC_EFFORTS: tuple[EffortLabel, ...] = ("low", "medium", "high", "xhigh", "max")
62
65
  """Anthropic `output_config.effort` labels for Opus 4.7+ and Sonnet 5.
63
66
 
@@ -112,9 +115,16 @@ FIREWORKS_GLM_EFFORTS: tuple[EffortLabel, ...] = ("none", "high", "max")
112
115
  See https://docs.fireworks.ai/guides/reasoning.
113
116
  """
114
117
 
118
+ XAI_EFFORTS: tuple[EffortLabel, ...] = ("low", "medium", "high")
119
+ """xAI `reasoning_effort` labels for Grok 4.5.
120
+
121
+ See https://docs.x.ai/developers/model-capabilities/text/reasoning.
122
+ """
123
+
115
124
  _REASONING_KEYS: frozenset[str] = frozenset(
116
125
  {
117
126
  "effort",
127
+ "extra_body",
118
128
  "output_config",
119
129
  "reasoning",
120
130
  "reasoning_effort",
@@ -125,17 +135,16 @@ _REASONING_KEYS: frozenset[str] = frozenset(
125
135
  """Runtime config keys that may already carry provider reasoning settings."""
126
136
 
127
137
 
128
- def _openai_supported_efforts(_model: str) -> tuple[EffortLabel, ...]:
138
+ def _openai_supported_efforts(model: str) -> tuple[EffortLabel, ...]:
129
139
  """Return OpenAI reasoning effort levels."""
130
- return OPENAI_EFFORTS
140
+ return OPENAI_56_EFFORTS if _has_version(model, "gpt-5.6") else OPENAI_EFFORTS
131
141
 
132
142
 
133
143
  def _openai_default_effort(model: str) -> EffortLabel | None:
134
144
  """Return the OpenAI default reasoning effort when known."""
135
- # Only gpt-5.5 documents `medium` as its default; other/newer gpt-5 variants
136
- # fall through to `None` until their default is confirmed against
137
- # https://platform.openai.com/docs/guides/reasoning.
138
- return "medium" if model.startswith("gpt-5.5") else None
145
+ if _has_version(model, "gpt-5.5") or _has_version(model, "gpt-5.6"):
146
+ return "medium"
147
+ return None
139
148
 
140
149
 
141
150
  def _openai_model_params(effort: str) -> dict[str, Any]:
@@ -341,6 +350,44 @@ def _fireworks_current_effort(model_params: dict[str, Any]) -> str | None:
341
350
  return None
342
351
 
343
352
 
353
+ def _is_xai_grok_45(model: str) -> bool:
354
+ """Return whether `model` is Grok 4.5 or a documented alias."""
355
+ return model in {"grok-4.5", "grok-4.5-latest", "grok-build-latest"}
356
+
357
+
358
+ def _xai_supported_efforts(model: str) -> tuple[EffortLabel, ...]:
359
+ """Return xAI reasoning effort levels for a model."""
360
+ return XAI_EFFORTS if _is_xai_grok_45(model) else ()
361
+
362
+
363
+ def _xai_default_effort(model: str) -> EffortLabel | None:
364
+ """Return the xAI default reasoning effort when known."""
365
+ return "high" if _is_xai_grok_45(model) else None
366
+
367
+
368
+ def _xai_model_params(effort: str) -> dict[str, Any]:
369
+ """Return xAI reasoning params for an effort label."""
370
+ return {"extra_body": {"reasoning_effort": effort}}
371
+
372
+
373
+ def _xai_current_effort(model_params: dict[str, Any]) -> str | None:
374
+ """Read the xAI reasoning effort from model params.
375
+
376
+ Returns:
377
+ The configured effort label, or `None` when unset.
378
+ """
379
+ extra = model_params.get("extra_body")
380
+ if isinstance(extra, dict):
381
+ value = extra.get("reasoning_effort")
382
+ if value is not None and not isinstance(value, str):
383
+ logger.warning(
384
+ "Ignoring non-str xAI extra_body.reasoning_effort of type %s",
385
+ type(value).__name__,
386
+ )
387
+ return value if isinstance(value, str) else None
388
+ return None
389
+
390
+
344
391
  _OPENAI_CONFIG = ReasoningProviderConfig(
345
392
  supported_efforts=_openai_supported_efforts,
346
393
  default_effort=_openai_default_effort,
@@ -374,6 +421,12 @@ _PROVIDER_CONFIGS: dict[ReasoningProvider, ReasoningProviderConfig] = {
374
421
  model_params=_fireworks_model_params,
375
422
  current_effort=_fireworks_current_effort,
376
423
  ),
424
+ "xai": ReasoningProviderConfig(
425
+ supported_efforts=_xai_supported_efforts,
426
+ default_effort=_xai_default_effort,
427
+ model_params=_xai_model_params,
428
+ current_effort=_xai_current_effort,
429
+ ),
377
430
  }
378
431
  """Provider-specific reasoning effort behavior keyed by `ModelSpec` provider."""
379
432
 
@@ -405,6 +458,8 @@ def _classify_reasoning_provider(provider: str, model: str) -> ReasoningProvider
405
458
  return "google_genai"
406
459
  if provider == "fireworks" and model_lower.startswith("accounts/fireworks/models/"):
407
460
  return "fireworks"
461
+ if provider == "xai" and _is_xai_grok_45(model_lower):
462
+ return "xai"
408
463
  return None
409
464
 
410
465
 
@@ -526,7 +581,9 @@ def merge_effort_model_params(
526
581
  """
527
582
  merged = dict(existing) if existing else {}
528
583
  for key, value in effort_params.items():
529
- if key in {"model_kwargs", "output_config"} and isinstance(value, dict):
584
+ if key in {"extra_body", "model_kwargs", "output_config"} and isinstance(
585
+ value, dict
586
+ ):
530
587
  current = merged.get(key)
531
588
  base = dict(current) if isinstance(current, dict) else {}
532
589
  base.update(value)
@@ -556,7 +613,8 @@ def without_effort_model_params(
556
613
  cleaned = {
557
614
  key: (dict(value) if isinstance(value, dict) else value)
558
615
  for key, value in existing.items()
559
- if key not in _REASONING_KEYS and key not in {"model_kwargs", "output_config"}
616
+ if key not in _REASONING_KEYS
617
+ and key not in {"extra_body", "model_kwargs", "output_config"}
560
618
  }
561
619
  kwargs = existing.get("model_kwargs")
562
620
  if isinstance(kwargs, dict):
@@ -572,4 +630,11 @@ def without_effort_model_params(
572
630
  cleaned["output_config"] = output_config_params
573
631
  elif output_config is not None:
574
632
  cleaned["output_config"] = output_config
633
+ extra = existing.get("extra_body")
634
+ if isinstance(extra, dict):
635
+ extra_params = {k: v for k, v in extra.items() if k != "reasoning_effort"}
636
+ if extra_params:
637
+ cleaned["extra_body"] = extra_params
638
+ elif extra is not None:
639
+ cleaned["extra_body"] = extra
575
640
  return cleaned or None
@@ -89,11 +89,17 @@ _RECOMMENDED_MODELS: dict[str, str] = {
89
89
  "openai:gpt-5.4-pro": "GPT-5.4 Pro",
90
90
  "openai:gpt-5.5": "GPT-5.5",
91
91
  "openai:gpt-5.5-pro": "GPT-5.5 Pro",
92
+ "openai:gpt-5.6-luna": "GPT-5.6 Luna",
93
+ "openai:gpt-5.6-sol": "GPT-5.6 Sol",
94
+ "openai:gpt-5.6-terra": "GPT-5.6 Terra",
92
95
  "openai_codex:gpt-5.2": "GPT-5.2",
93
96
  "openai_codex:gpt-5.3-codex": "GPT-5.3 Codex",
94
97
  "openai_codex:gpt-5.4": "GPT-5.4",
95
98
  "openai_codex:gpt-5.4-mini": "GPT-5.4 mini",
96
99
  "openai_codex:gpt-5.5": "GPT-5.5",
100
+ "openai_codex:gpt-5.6-luna": "GPT-5.6 Luna",
101
+ "openai_codex:gpt-5.6-sol": "GPT-5.6 Sol",
102
+ "openai_codex:gpt-5.6-terra": "GPT-5.6 Terra",
97
103
  "openrouter:anthropic/claude-opus-4.6": "Claude Opus 4.6",
98
104
  "openrouter:anthropic/claude-opus-4.7": "Claude Opus 4.7",
99
105
  "openrouter:anthropic/claude-opus-4.7-fast": "Claude Opus 4.7 Fast",
@@ -114,6 +120,7 @@ _RECOMMENDED_MODELS: dict[str, str] = {
114
120
  "openrouter:openrouter/fusion": "OpenRouter Fusion",
115
121
  "openrouter:qwen/qwen3.7-plus": "Qwen 3.7 Plus",
116
122
  "openrouter:z-ai/glm-5.2": "GLM 5.2",
123
+ "xai:grok-4.5": "Grok 4.5",
117
124
  }
118
125
  """Hand-curated frontier-tier models promoted across the UI, mapped to a
119
126
  human-readable display name.
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "deepagents-code"
7
- version = "0.1.35"
7
+ version = "0.1.36"
8
8
  description = "Terminal interface for Deep Agents - interactive AI agent with file operations, shell access, and sub-agent capabilities."
9
9
  readme = "README.md"
10
10
  license = { text = "MIT" }
@@ -27,7 +27,7 @@ classifiers = [
27
27
  dependencies = [
28
28
  # Framework
29
29
  "deepagents==0.7.0a6",
30
- "langchain>=1.3.11,<2.0.0",
30
+ "langchain>=1.3.12,<2.0.0",
31
31
  "langgraph-checkpoint-sqlite>=3.1.0,<4.0.0",
32
32
 
33
33
  # Client-server architecture
@@ -37,9 +37,9 @@ dependencies = [
37
37
  "httpx>=0.28.1,<1.0.0",
38
38
 
39
39
  # Core model providers - others are added as optional
40
- "langchain-anthropic>=1.4.7,<2.0.0",
40
+ "langchain-anthropic>=1.4.8,<2.0.0",
41
41
  "langchain-google-genai>=4.2.7,<5.0.0",
42
- "langchain-openai>=1.3.3,<2.0.0",
42
+ "langchain-openai>=1.3.4,<2.0.0",
43
43
  "pydantic>=2.12.5,<2.14.0a0",
44
44
 
45
45
  # UI/Terminal
@@ -87,25 +87,25 @@ dependencies = [
87
87
 
88
88
  [project.optional-dependencies]
89
89
  # Model providers
90
- anthropic = ["langchain-anthropic>=1.4.7,<2.0.0"]
90
+ anthropic = ["langchain-anthropic>=1.4.8,<2.0.0"]
91
91
  baseten = ["langchain-baseten>=0.2.1,<1.0.0"]
92
- bedrock = ["langchain-aws>=1.6.1,<2.0.0"]
92
+ bedrock = ["langchain-aws>=1.6.2,<2.0.0"]
93
93
  cohere = ["langchain-cohere>=0.6.0,<1.0.0"]
94
94
  deepseek = ["langchain-deepseek>=1.1.0,<2.0.0"]
95
- fireworks = ["langchain-fireworks>=1.4.3,<2.0.0"]
95
+ fireworks = ["langchain-fireworks>=1.4.4,<2.0.0"]
96
96
  google-genai = ["langchain-google-genai>=4.2.7,<5.0.0"]
97
97
  groq = ["langchain-groq>=1.1.3,<2.0.0"]
98
98
  huggingface = ["langchain-huggingface>=1.2.2,<2.0.0"]
99
99
  ibm = ["langchain-ibm>=1.1.0,<2.0.0"]
100
100
  litellm = ["langchain-litellm>=0.7.0,<2.0.0"]
101
- mistralai = ["langchain-mistralai>=1.1.5,<2.0.0"]
101
+ mistralai = ["langchain-mistralai>=1.1.6,<2.0.0"]
102
102
  nvidia = [
103
103
  "aiohttp>=3.14.1,<3.15.0",
104
104
  "langchain-nvidia-ai-endpoints>=1.4.3,<2.0.0",
105
105
  ]
106
106
  ollama = ["langchain-ollama>=1.1.0,<2.0.0"]
107
- openai = ["langchain-openai>=1.3.3,<2.0.0"]
108
- openrouter = ["langchain-openrouter>=0.2.4,<2.0.0"]
107
+ openai = ["langchain-openai>=1.3.4,<2.0.0"]
108
+ openrouter = ["langchain-openrouter>=0.2.6,<2.0.0"]
109
109
  perplexity = ["langchain-perplexity>=1.4.0,<2.0.0"]
110
110
  together = ["langchain-together>=0.4.0,<2.0.0"]
111
111
  vertex = ["langchain-google-vertexai>=3.2.4,<4.0.0"]
@@ -23027,6 +23027,28 @@ class TestCopyFocusedInputText:
23027
23027
  assert app._copy_focused_input_text() is False
23028
23028
  assert copied == []
23029
23029
 
23030
+ def test_no_copy_when_input_whitespace_only(self, monkeypatch) -> None:
23031
+ """A whitespace-only draft is treated as empty and not copied."""
23032
+ from textual.widgets import TextArea
23033
+
23034
+ import deepagents_code.clipboard as clipboard_module
23035
+
23036
+ copied: list[str] = []
23037
+
23038
+ def fake_copy(_app: object, text: str) -> tuple[bool, str | None]:
23039
+ copied.append(text)
23040
+ return True, None
23041
+
23042
+ monkeypatch.setattr(clipboard_module, "copy_text_to_clipboard", fake_copy)
23043
+
23044
+ app = self._make_app()
23045
+ text_area = TextArea()
23046
+ text_area.text = " \n\t "
23047
+ monkeypatch.setattr(type(app), "focused", property(lambda _self: text_area))
23048
+
23049
+ assert app._copy_focused_input_text() is False
23050
+ assert copied == []
23051
+
23030
23052
  def test_no_copy_when_nothing_focused(self, monkeypatch) -> None:
23031
23053
  """When the focused widget is not an input, nothing is copied."""
23032
23054
  app = self._make_app()
@@ -5815,6 +5815,13 @@ class TestCodexProviderMirror:
5815
5815
  `openai_codex`; other openai models are not mirrored.
5816
5816
  """
5817
5817
 
5818
+ def test_gpt_56_models_are_allowlisted(self) -> None:
5819
+ assert {
5820
+ "gpt-5.6-luna",
5821
+ "gpt-5.6-sol",
5822
+ "gpt-5.6-terra",
5823
+ } <= model_config.CODEX_MODELS
5824
+
5818
5825
  def test_available_models_mirror_codex_allowlist(self) -> None:
5819
5826
  model_config.clear_caches()
5820
5827
  available = model_config.get_available_models()
@@ -39,8 +39,25 @@ def _restore_settings() -> Iterator[None]:
39
39
  [
40
40
  ("openai:gpt-5.5", ("none", "low", "medium", "high", "xhigh")),
41
41
  ("openai_codex:gpt-5.5", ("none", "low", "medium", "high", "xhigh")),
42
+ (
43
+ "openai:gpt-5.6-sol",
44
+ ("none", "low", "medium", "high", "xhigh", "max"),
45
+ ),
46
+ (
47
+ "openai:gpt-5.6-terra",
48
+ ("none", "low", "medium", "high", "xhigh", "max"),
49
+ ),
50
+ (
51
+ "openai:gpt-5.6-luna",
52
+ ("none", "low", "medium", "high", "xhigh", "max"),
53
+ ),
54
+ (
55
+ "openai_codex:gpt-5.6-sol",
56
+ ("none", "low", "medium", "high", "xhigh", "max"),
57
+ ),
42
58
  # A generic (non-5.5) gpt-5 still gets the full OpenAI range.
43
59
  ("openai:gpt-5.4", ("none", "low", "medium", "high", "xhigh")),
60
+ ("openai:gpt-5.60-sol", ("none", "low", "medium", "high", "xhigh")),
44
61
  ("anthropic:claude-opus-4-8", ("low", "medium", "high", "xhigh", "max")),
45
62
  # Opus 4.7 is the first version documented for the full range; assert the
46
63
  # named boundary directly rather than relying on 4.8 to exercise it.
@@ -65,6 +82,9 @@ def _restore_settings() -> Iterator[None]:
65
82
  ("anthropic:claude-opus-4-16", ("low", "medium", "high", "xhigh", "max")),
66
83
  ("google_genai:gemini-3.5-flash", ("low", "medium", "high")),
67
84
  ("google_genai:gemini-3.1-pro-preview", ("low", "medium", "high")),
85
+ ("xai:grok-4.5", ("low", "medium", "high")),
86
+ ("xai:grok-4.5-latest", ("low", "medium", "high")),
87
+ ("xai:grok-build-latest", ("low", "medium", "high")),
68
88
  (
69
89
  "fireworks:accounts/fireworks/models/deepseek-v4-pro",
70
90
  ("none", "low", "medium", "high", "xhigh", "max"),
@@ -81,6 +101,7 @@ def _restore_settings() -> Iterator[None]:
81
101
  ("openai_codex:gpt-4o", ()),
82
102
  ("anthropic:claude-3-5-haiku-latest", ()),
83
103
  ("google_genai:gemini-2.5-flash", ()),
104
+ ("xai:grok-4", ()),
84
105
  ("fireworks:accounts/fireworks/models/llama-v3p1-70b-instruct", ()),
85
106
  ],
86
107
  )
@@ -93,8 +114,12 @@ def test_supported_efforts_for_model(model_spec: str, efforts: tuple[str, ...])
93
114
  [
94
115
  ("openai:gpt-5.5", "medium"),
95
116
  ("openai_codex:gpt-5.5", "medium"),
96
- # Only gpt-5.5 has a documented default; other gpt-5 variants are None.
117
+ ("openai:gpt-5.6-sol", "medium"),
118
+ ("openai:gpt-5.6-terra", "medium"),
119
+ ("openai:gpt-5.6-luna", "medium"),
120
+ ("openai_codex:gpt-5.6-sol", "medium"),
97
121
  ("openai:gpt-5.4", None),
122
+ ("openai:gpt-5.60-sol", None),
98
123
  ("anthropic:claude-opus-4-8", "high"),
99
124
  ("anthropic:claude-opus-4-7", "high"),
100
125
  ("anthropic:claude-sonnet-4-6", "high"),
@@ -104,6 +129,7 @@ def test_supported_efforts_for_model(model_spec: str, efforts: tuple[str, ...])
104
129
  ("google_genai:gemini-3.1-pro-preview", "high"),
105
130
  ("google_genai:gemini-3-pro", "high"),
106
131
  ("google_genai:gemini-3-flash", "high"),
132
+ ("xai:grok-4.5", "high"),
107
133
  ("fireworks:accounts/fireworks/models/deepseek-v4-pro", "high"),
108
134
  ("fireworks:accounts/fireworks/models/glm-5p2", "max"),
109
135
  ("fireworks:accounts/fireworks/models/kimi-k2p7-code", None),
@@ -118,6 +144,9 @@ def test_model_params_for_effort_maps_provider_kwargs() -> None:
118
144
  assert model_params_for_effort("openai:gpt-5.5", "high") == {
119
145
  "reasoning": {"effort": "high", "summary": "auto"}
120
146
  }
147
+ assert model_params_for_effort("openai:gpt-5.6-sol", "max") == {
148
+ "reasoning": {"effort": "max", "summary": "auto"}
149
+ }
121
150
  assert model_params_for_effort("anthropic:claude-opus-4-8", "xhigh") == {
122
151
  "thinking": {"type": "adaptive", "display": "summarized"},
123
152
  "output_config": {"effort": "xhigh"},
@@ -128,6 +157,9 @@ def test_model_params_for_effort_maps_provider_kwargs() -> None:
128
157
  assert model_params_for_effort(
129
158
  "fireworks:accounts/fireworks/models/deepseek-v4-pro", "max"
130
159
  ) == {"model_kwargs": {"reasoning_effort": "max"}}
160
+ assert model_params_for_effort("xai:grok-4.5", "medium") == {
161
+ "extra_body": {"reasoning_effort": "medium"}
162
+ }
131
163
 
132
164
 
133
165
  def test_current_effort_reads_anthropic_output_config() -> None:
@@ -139,6 +171,15 @@ def test_current_effort_reads_anthropic_output_config() -> None:
139
171
  )
140
172
 
141
173
 
174
+ def test_current_effort_reads_xai_extra_body() -> None:
175
+ assert (
176
+ current_effort_from_model_params(
177
+ "xai:grok-4.5", {"extra_body": {"reasoning_effort": "high"}}
178
+ )
179
+ == "high"
180
+ )
181
+
182
+
142
183
  def test_model_params_for_effort_rejects_unsupported_effort() -> None:
143
184
  assert (
144
185
  model_params_for_effort(
@@ -171,6 +212,21 @@ def test_merge_and_clear_effort_model_params_preserves_unrelated_params() -> Non
171
212
  }
172
213
 
173
214
 
215
+ def test_merge_and_clear_xai_effort_preserves_extra_body_params() -> None:
216
+ merged = merge_effort_model_params(
217
+ {"extra_body": {"prompt_cache_key": "thread-1"}},
218
+ {"extra_body": {"reasoning_effort": "high"}},
219
+ )
220
+
221
+ assert merged == {
222
+ "extra_body": {"prompt_cache_key": "thread-1", "reasoning_effort": "high"}
223
+ }
224
+ assert current_effort_from_model_params("xai:grok-4.5", merged) == "high"
225
+ assert without_effort_model_params(merged) == {
226
+ "extra_body": {"prompt_cache_key": "thread-1"}
227
+ }
228
+
229
+
174
230
  @pytest.mark.parametrize(
175
231
  ("model_spec", "model_params"),
176
232
  [
@@ -185,6 +241,7 @@ def test_merge_and_clear_effort_model_params_preserves_unrelated_params() -> Non
185
241
  "fireworks:accounts/fireworks/models/deepseek-v4-pro",
186
242
  {"model_kwargs": {"reasoning_effort": 5}},
187
243
  ),
244
+ ("xai:grok-4.5", {"extra_body": {"reasoning_effort": 5}}),
188
245
  ],
189
246
  )
190
247
  def test_current_effort_warns_on_malformed_params(
@@ -215,6 +272,13 @@ def test_current_effort_non_dict_model_kwargs_is_silent() -> None:
215
272
  )
216
273
 
217
274
 
275
+ def test_current_effort_non_dict_extra_body_is_silent() -> None:
276
+ """A non-dict `extra_body` is a legit shape and must not warn."""
277
+ assert (
278
+ current_effort_from_model_params("xai:grok-4.5", {"extra_body": "raw"}) is None
279
+ )
280
+
281
+
218
282
  def test_effort_argument_hint_covers_effort_vocabulary() -> None:
219
283
  """The `/effort` argument hint must list every `EffortLabel` plus a reset.
220
284
 
@@ -2251,15 +2251,27 @@ class TestGetModelDisplayName:
2251
2251
  == "claude-sonnet-4-5"
2252
2252
  )
2253
2253
 
2254
- def test_uses_recommended_name_when_no_profile(self) -> None:
2254
+ @pytest.mark.parametrize(
2255
+ ("spec", "name"),
2256
+ [
2257
+ ("fireworks:accounts/fireworks/models/kimi-k2p7-code", "Kimi K2.7 Code"),
2258
+ ("openai:gpt-5.6-luna", "GPT-5.6 Luna"),
2259
+ ("openai:gpt-5.6-sol", "GPT-5.6 Sol"),
2260
+ ("openai:gpt-5.6-terra", "GPT-5.6 Terra"),
2261
+ ("openai_codex:gpt-5.6-luna", "GPT-5.6 Luna"),
2262
+ ("openai_codex:gpt-5.6-sol", "GPT-5.6 Sol"),
2263
+ ("openai_codex:gpt-5.6-terra", "GPT-5.6 Terra"),
2264
+ ("xai:grok-4.5", "Grok 4.5"),
2265
+ ],
2266
+ )
2267
+ def test_uses_recommended_name_when_no_profile(self, spec: str, name: str) -> None:
2255
2268
  """Uninstalled recommendations use the hardcoded name, not the raw id."""
2256
2269
  from deepagents_code.tui.widgets import model_selector
2257
2270
 
2258
2271
  screen = ModelSelectorScreen.__new__(ModelSelectorScreen)
2259
2272
  screen._profiles = {}
2260
- spec = "fireworks:accounts/fireworks/models/kimi-k2p7-code"
2261
2273
  assert spec in model_selector._RECOMMENDED_MODELS
2262
- assert screen._get_model_display_name(spec) == "Kimi K2.7 Code"
2274
+ assert screen._get_model_display_name(spec) == name
2263
2275
 
2264
2276
  def test_profile_name_wins_over_recommended_name(self) -> None:
2265
2277
  """A loaded profile's `name` takes precedence over the hardcoded one."""