deepagents-code 0.1.14__tar.gz → 0.1.16__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 (281) hide show
  1. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/CHANGELOG.md +13 -0
  2. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/PKG-INFO +14 -9
  3. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/README.md +2 -0
  4. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/_cli_context.py +10 -2
  5. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/_env_vars.py +0 -1
  6. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/_version.py +1 -1
  7. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/agent.py +3 -1
  8. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/auth_display.py +50 -0
  9. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/config.py +76 -4
  10. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/configurable_model.py +115 -39
  11. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/extras_info.py +3 -1
  12. deepagents_code-0.1.16/deepagents_code/integrations/openai_codex.py +551 -0
  13. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/integrations/sandbox_factory.py +221 -3
  14. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/integrations/sandbox_registry.py +9 -0
  15. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/main.py +5 -6
  16. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/model_config.py +130 -1
  17. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/resume_state.py +7 -2
  18. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/ui.py +2 -4
  19. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/widgets/auth.py +179 -1
  20. deepagents_code-0.1.16/deepagents_code/widgets/codex_auth.py +443 -0
  21. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/widgets/model_selector.py +119 -8
  22. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/widgets/welcome.py +0 -1
  23. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/pyproject.toml +11 -8
  24. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_agent.py +5 -0
  25. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_args.py +10 -0
  26. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_auth_display.py +44 -0
  27. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_auth_widgets.py +313 -3
  28. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_config.py +149 -0
  29. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_configurable_model.py +42 -5
  30. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_extras_info.py +1 -0
  31. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_main_args.py +17 -2
  32. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_model_config.py +114 -0
  33. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_model_selector.py +250 -0
  34. deepagents_code-0.1.16/tests/unit_tests/test_openai_codex_integration.py +669 -0
  35. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_sandbox_factory.py +618 -0
  36. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_sandbox_registry.py +8 -0
  37. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_textual_adapter.py +40 -2
  38. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/uv.lock +98 -31
  39. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/.gitignore +0 -0
  40. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/AGENTS.md +0 -0
  41. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/COMMANDS.md +0 -0
  42. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/DEV.md +0 -0
  43. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/Makefile +0 -0
  44. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/THREAT_MODEL.md +0 -0
  45. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/__init__.py +0 -0
  46. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/__main__.py +0 -0
  47. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/_ask_user_types.py +0 -0
  48. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/_constants.py +0 -0
  49. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/_debug.py +0 -0
  50. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/_git.py +0 -0
  51. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/_server_config.py +0 -0
  52. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/_session_stats.py +0 -0
  53. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/_startup_error.py +0 -0
  54. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/_testing_models.py +0 -0
  55. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/_textual_patches.py +0 -0
  56. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/app.py +0 -0
  57. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/app.tcss +0 -0
  58. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/ask_user.py +0 -0
  59. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/auth_store.py +0 -0
  60. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/built_in_skills/__init__.py +0 -0
  61. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/built_in_skills/remember/SKILL.md +0 -0
  62. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/built_in_skills/skill-creator/SKILL.md +0 -0
  63. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/built_in_skills/skill-creator/scripts/init_skill.py +0 -0
  64. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/built_in_skills/skill-creator/scripts/quick_validate.py +0 -0
  65. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/clipboard.py +0 -0
  66. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/command_registry.py +0 -0
  67. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/config_commands.py +0 -0
  68. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/config_manifest.py +0 -0
  69. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/default_agent_prompt.md +0 -0
  70. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/editor.py +0 -0
  71. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/event_bus.py +0 -0
  72. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/file_ops.py +0 -0
  73. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/filesystem_empty_result.py +0 -0
  74. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/formatting.py +0 -0
  75. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/hooks.py +0 -0
  76. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/input.py +0 -0
  77. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/integrations/__init__.py +0 -0
  78. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/integrations/sandbox_config.py +0 -0
  79. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/integrations/sandbox_provider.py +0 -0
  80. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/iterm_cursor_guide.py +0 -0
  81. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/local_context.py +0 -0
  82. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/managed_tools.py +0 -0
  83. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/mcp_auth.py +0 -0
  84. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/mcp_commands.py +0 -0
  85. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/mcp_disabled.py +0 -0
  86. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/mcp_login_service.py +0 -0
  87. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/mcp_oauth_ui.py +0 -0
  88. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/mcp_providers/__init__.py +0 -0
  89. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/mcp_providers/_registry.py +0 -0
  90. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/mcp_providers/base.py +0 -0
  91. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/mcp_providers/github.py +0 -0
  92. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/mcp_providers/slack.py +0 -0
  93. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/mcp_tools.py +0 -0
  94. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/mcp_trust.py +0 -0
  95. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/media_utils.py +0 -0
  96. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/memory_guard.py +0 -0
  97. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/non_interactive.py +0 -0
  98. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/notifications.py +0 -0
  99. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/offload.py +0 -0
  100. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/onboarding.py +0 -0
  101. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/output.py +0 -0
  102. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/project_utils.py +0 -0
  103. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/py.typed +0 -0
  104. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/remote_client.py +0 -0
  105. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/server.py +0 -0
  106. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/server_graph.py +0 -0
  107. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/server_manager.py +0 -0
  108. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/sessions.py +0 -0
  109. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/skills/__init__.py +0 -0
  110. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/skills/commands.py +0 -0
  111. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/skills/invocation.py +0 -0
  112. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/skills/load.py +0 -0
  113. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/state_migration.py +0 -0
  114. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/subagents.py +0 -0
  115. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/system_prompt.md +0 -0
  116. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/terminal_capabilities.py +0 -0
  117. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/terminal_escape.py +0 -0
  118. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/textual_adapter.py +0 -0
  119. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/theme.py +0 -0
  120. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/tool_display.py +0 -0
  121. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/tools.py +0 -0
  122. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/unicode_security.py +0 -0
  123. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/update_check.py +0 -0
  124. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/widgets/__init__.py +0 -0
  125. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/widgets/_links.py +0 -0
  126. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/widgets/agent_selector.py +0 -0
  127. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/widgets/approval.py +0 -0
  128. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/widgets/ask_user.py +0 -0
  129. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/widgets/autocomplete.py +0 -0
  130. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/widgets/chat_input.py +0 -0
  131. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/widgets/cwd_switch.py +0 -0
  132. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/widgets/diff.py +0 -0
  133. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/widgets/history.py +0 -0
  134. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/widgets/install_confirm.py +0 -0
  135. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/widgets/launch_init.py +0 -0
  136. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/widgets/loading.py +0 -0
  137. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/widgets/mcp_login.py +0 -0
  138. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/widgets/mcp_reconnect.py +0 -0
  139. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/widgets/mcp_viewer.py +0 -0
  140. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/widgets/message_store.py +0 -0
  141. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/widgets/messages.py +0 -0
  142. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/widgets/notification_center.py +0 -0
  143. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/widgets/notification_detail.py +0 -0
  144. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/widgets/notification_settings.py +0 -0
  145. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/widgets/restart_prompt.py +0 -0
  146. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/widgets/status.py +0 -0
  147. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/widgets/theme_selector.py +0 -0
  148. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/widgets/thread_selector.py +0 -0
  149. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/widgets/tool_renderers.py +0 -0
  150. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/widgets/tool_widgets.py +0 -0
  151. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/widgets/update_available.py +0 -0
  152. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/deepagents_code/widgets/update_progress.py +0 -0
  153. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/examples/skills/arxiv-search/SKILL.md +0 -0
  154. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/examples/skills/arxiv-search/arxiv_search.py +0 -0
  155. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/examples/skills/langgraph-docs/SKILL.md +0 -0
  156. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/examples/skills/skill-creator/SKILL.md +0 -0
  157. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/examples/skills/skill-creator/scripts/init_skill.py +0 -0
  158. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/examples/skills/skill-creator/scripts/quick_validate.py +0 -0
  159. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/examples/skills/web-research/SKILL.md +0 -0
  160. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/images/tui.png +0 -0
  161. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/scripts/check_imports.py +0 -0
  162. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/scripts/debug_server.sh +0 -0
  163. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/scripts/generate_commands_catalog.py +0 -0
  164. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/scripts/install.sh +0 -0
  165. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/README.md +0 -0
  166. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/integration_tests/__init__.py +0 -0
  167. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/integration_tests/benchmarks/__init__.py +0 -0
  168. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/integration_tests/benchmarks/test_codspeed_import_benchmarks.py +0 -0
  169. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/integration_tests/benchmarks/test_startup_benchmarks.py +0 -0
  170. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/integration_tests/conftest.py +0 -0
  171. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/integration_tests/test_acp_mode.py +0 -0
  172. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/integration_tests/test_compact_resume.py +0 -0
  173. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/integration_tests/test_sandbox_factory.py +0 -0
  174. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/integration_tests/test_sandbox_operations.py +0 -0
  175. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/__init__.py +0 -0
  176. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/conftest.py +0 -0
  177. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/skills/__init__.py +0 -0
  178. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/skills/test_commands.py +0 -0
  179. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/skills/test_load.py +0 -0
  180. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/skills/test_skills_json.py +0 -0
  181. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_agent_friendly.py +0 -0
  182. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_agent_selector.py +0 -0
  183. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_app.py +0 -0
  184. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_approval.py +0 -0
  185. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_ask_user.py +0 -0
  186. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_ask_user_middleware.py +0 -0
  187. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_auth_store.py +0 -0
  188. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_autocomplete.py +0 -0
  189. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_charset.py +0 -0
  190. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_chat_input.py +0 -0
  191. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_clipboard.py +0 -0
  192. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_command_registry.py +0 -0
  193. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_compact_tool.py +0 -0
  194. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_config_manifest.py +0 -0
  195. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_cursor_blink.py +0 -0
  196. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_cwd_switch.py +0 -0
  197. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_debug.py +0 -0
  198. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_editor.py +0 -0
  199. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_end_to_end.py +0 -0
  200. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_env_vars.py +0 -0
  201. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_event_bus.py +0 -0
  202. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_exception_handling.py +0 -0
  203. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_file_ops.py +0 -0
  204. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_filesystem_empty_result.py +0 -0
  205. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_formatting.py +0 -0
  206. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_git.py +0 -0
  207. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_history.py +0 -0
  208. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_hooks.py +0 -0
  209. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_imports.py +0 -0
  210. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_input_parsing.py +0 -0
  211. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_install_command.py +0 -0
  212. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_install_confirm.py +0 -0
  213. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_iterm_cursor_guide.py +0 -0
  214. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_launch_init.py +0 -0
  215. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_links.py +0 -0
  216. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_loading.py +0 -0
  217. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_local_context.py +0 -0
  218. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_main.py +0 -0
  219. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_main_acp_mode.py +0 -0
  220. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_managed_tools.py +0 -0
  221. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_mcp_auth.py +0 -0
  222. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_mcp_commands.py +0 -0
  223. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_mcp_disabled.py +0 -0
  224. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_mcp_login_modal.py +0 -0
  225. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_mcp_login_service.py +0 -0
  226. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_mcp_oauth_ui.py +0 -0
  227. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_mcp_reconnect.py +0 -0
  228. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_mcp_tools.py +0 -0
  229. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_mcp_trust.py +0 -0
  230. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_mcp_viewer.py +0 -0
  231. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_media_utils.py +0 -0
  232. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_memory_guard.py +0 -0
  233. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_message_store.py +0 -0
  234. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_messages.py +0 -0
  235. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_model_switch.py +0 -0
  236. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_non_interactive.py +0 -0
  237. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_notification_center.py +0 -0
  238. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_notification_detail.py +0 -0
  239. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_notifications.py +0 -0
  240. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_offload.py +0 -0
  241. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_offload_dict_messages.py +0 -0
  242. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_onboarding.py +0 -0
  243. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_output.py +0 -0
  244. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_reload.py +0 -0
  245. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_remote_client.py +0 -0
  246. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_restart_prompt.py +0 -0
  247. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_resume_state.py +0 -0
  248. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_sandbox_config.py +0 -0
  249. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_sandbox_provider.py +0 -0
  250. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_server.py +0 -0
  251. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_server_config.py +0 -0
  252. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_server_graph.py +0 -0
  253. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_server_helpers.py +0 -0
  254. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_server_manager.py +0 -0
  255. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_session_stats.py +0 -0
  256. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_sessions.py +0 -0
  257. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_shell_allow_list.py +0 -0
  258. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_skill_invocation.py +0 -0
  259. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_startup_fast_paths.py +0 -0
  260. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_state_migration.py +0 -0
  261. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_status.py +0 -0
  262. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_subagents.py +0 -0
  263. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_terminal_capabilities.py +0 -0
  264. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_terminal_escape.py +0 -0
  265. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_terminal_progress_preference.py +0 -0
  266. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_textual_patches.py +0 -0
  267. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_theme.py +0 -0
  268. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_thread_selector.py +0 -0
  269. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_tool_display.py +0 -0
  270. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_ui.py +0 -0
  271. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_unicode_security.py +0 -0
  272. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_update_available.py +0 -0
  273. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_update_check.py +0 -0
  274. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_update_progress.py +0 -0
  275. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_version.py +0 -0
  276. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/test_welcome.py +0 -0
  277. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/tools/__init__.py +0 -0
  278. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/tools/test_current_thread.py +0 -0
  279. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/tools/test_fetch_url.py +0 -0
  280. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/widgets/__init__.py +0 -0
  281. {deepagents_code-0.1.14 → deepagents_code-0.1.16}/tests/unit_tests/widgets/test_diff.py +0 -0
@@ -2,6 +2,19 @@
2
2
 
3
3
  # Deep Agents Code Changelog
4
4
 
5
+ ## [0.1.16](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.15...deepagents-code==0.1.16) (2026-06-13)
6
+
7
+ ### Features
8
+
9
+ * ChatGPT OAuth sign-in for Codex models ([#3532](https://github.com/langchain-ai/deepagents/issues/3532)) ([202e0bd](https://github.com/langchain-ai/deepagents/commit/202e0bd3e5b8b874a69656815489308d75a77d05))
10
+ * Add Vercel Sandbox provider ([#3588](https://github.com/langchain-ai/deepagents/issues/3588)) ([e5e4748](https://github.com/langchain-ai/deepagents/commit/e5e4748cb6c66ddaa9444ab464990c1a5d10854d))
11
+
12
+ ## [0.1.15](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.14...deepagents-code==0.1.15) (2026-06-12)
13
+
14
+ ### Features
15
+
16
+ * Add Deep Agents client version metadata ([#3934](https://github.com/langchain-ai/deepagents/issues/3934)) ([058cec6](https://github.com/langchain-ai/deepagents/commit/058cec654645dd1a504408d712ab678edc48273d))
17
+
5
18
  ## [0.1.14](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.13...deepagents-code==0.1.14) (2026-06-12)
6
19
 
7
20
  ### Features
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: deepagents-code
3
- Version: 0.1.14
3
+ Version: 0.1.16
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,13 +27,13 @@ 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.8
30
+ Requires-Dist: deepagents==0.6.10
31
31
  Requires-Dist: httpx<1.0.0,>=0.28.1
32
- Requires-Dist: langchain-anthropic<2.0.0,>=1.4.5
32
+ Requires-Dist: langchain-anthropic<2.0.0,>=1.4.6
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.0
36
- Requires-Dist: langchain<2.0.0,>=1.3.8
35
+ Requires-Dist: langchain-openai<2.0.0,>=1.3.2
36
+ Requires-Dist: langchain<2.0.0,>=1.3.9
37
37
  Requires-Dist: langgraph-checkpoint-sqlite<4.0.0,>=3.1.0
38
38
  Requires-Dist: langgraph-cli[inmem]<1.0.0,>=0.4.29
39
39
  Requires-Dist: langgraph-runtime-inmem<1.0.0,>=0.30.0
@@ -57,7 +57,7 @@ Requires-Dist: uuid-utils<1.0.0,>=0.16.0
57
57
  Provides-Extra: agentcore
58
58
  Requires-Dist: langchain-agentcore-codeinterpreter<1.0.0,>=0.0.4; extra == 'agentcore'
59
59
  Provides-Extra: all-providers
60
- Requires-Dist: langchain-anthropic<2.0.0,>=1.4.5; extra == 'all-providers'
60
+ Requires-Dist: langchain-anthropic<2.0.0,>=1.4.6; extra == 'all-providers'
61
61
  Requires-Dist: langchain-aws<2.0.0,>=1.5.1; extra == 'all-providers'
62
62
  Requires-Dist: langchain-baseten<1.0.0,>=0.2.0; extra == 'all-providers'
63
63
  Requires-Dist: langchain-cohere<1.0.0,>=0.6.0; extra == 'all-providers'
@@ -72,7 +72,7 @@ Requires-Dist: langchain-litellm<2.0.0,>=0.6.6; extra == 'all-providers'
72
72
  Requires-Dist: langchain-mistralai<2.0.0,>=1.1.5; extra == 'all-providers'
73
73
  Requires-Dist: langchain-nvidia-ai-endpoints<2.0.0,>=1.4.1; extra == 'all-providers'
74
74
  Requires-Dist: langchain-ollama<2.0.0,>=1.1.0; extra == 'all-providers'
75
- Requires-Dist: langchain-openai<2.0.0,>=1.3.0; extra == 'all-providers'
75
+ Requires-Dist: langchain-openai<2.0.0,>=1.3.2; extra == 'all-providers'
76
76
  Requires-Dist: langchain-openrouter<2.0.0,>=0.2.3; extra == 'all-providers'
77
77
  Requires-Dist: langchain-perplexity<2.0.0,>=1.4.0; extra == 'all-providers'
78
78
  Requires-Dist: langchain-together<2.0.0,>=0.4.0; extra == 'all-providers'
@@ -82,8 +82,9 @@ Requires-Dist: langchain-agentcore-codeinterpreter<1.0.0,>=0.0.4; extra == 'all-
82
82
  Requires-Dist: langchain-daytona>=0.0.7; extra == 'all-sandboxes'
83
83
  Requires-Dist: langchain-modal>=0.0.5; extra == 'all-sandboxes'
84
84
  Requires-Dist: langchain-runloop>=0.0.6; extra == 'all-sandboxes'
85
+ Requires-Dist: langchain-vercel-sandbox>=0.0.1; extra == 'all-sandboxes'
85
86
  Provides-Extra: anthropic
86
- Requires-Dist: langchain-anthropic<2.0.0,>=1.4.5; extra == 'anthropic'
87
+ Requires-Dist: langchain-anthropic<2.0.0,>=1.4.6; extra == 'anthropic'
87
88
  Provides-Extra: baseten
88
89
  Requires-Dist: langchain-baseten<1.0.0,>=0.2.0; extra == 'baseten'
89
90
  Provides-Extra: bedrock
@@ -115,7 +116,7 @@ Requires-Dist: langchain-nvidia-ai-endpoints<2.0.0,>=1.4.1; extra == 'nvidia'
115
116
  Provides-Extra: ollama
116
117
  Requires-Dist: langchain-ollama<2.0.0,>=1.1.0; extra == 'ollama'
117
118
  Provides-Extra: openai
118
- Requires-Dist: langchain-openai<2.0.0,>=1.3.0; extra == 'openai'
119
+ Requires-Dist: langchain-openai<2.0.0,>=1.3.2; extra == 'openai'
119
120
  Provides-Extra: openrouter
120
121
  Requires-Dist: langchain-openrouter<2.0.0,>=0.2.3; extra == 'openrouter'
121
122
  Provides-Extra: perplexity
@@ -126,6 +127,8 @@ Provides-Extra: runloop
126
127
  Requires-Dist: langchain-runloop>=0.0.6; extra == 'runloop'
127
128
  Provides-Extra: together
128
129
  Requires-Dist: langchain-together<2.0.0,>=0.4.0; extra == 'together'
130
+ Provides-Extra: vercel
131
+ Requires-Dist: langchain-vercel-sandbox>=0.0.1; extra == 'vercel'
129
132
  Provides-Extra: vertex
130
133
  Requires-Dist: langchain-google-vertexai<4.0.0,>=3.2.4; extra == 'vertex'
131
134
  Provides-Extra: xai
@@ -182,6 +185,8 @@ The fastest way to start using Deep Agents. `deepagents-code` is a pre-built cod
182
185
  - **[Changelog](https://github.com/langchain-ai/deepagents/blob/main/libs/code/CHANGELOG.md)**
183
186
  - **[Source code](https://github.com/langchain-ai/deepagents/tree/main/libs/code)**
184
187
  - **[Deep Agents SDK](https://github.com/langchain-ai/deepagents)** — underlying agent harness
188
+ - [LangChain Academy](https://academy.langchain.com/) — Comprehensive, free courses on LangChain libraries and products, made by the LangChain team.
189
+ - [Code of Conduct](https://github.com/langchain-ai/langchain/?tab=coc-ov-file) — community guidelines and standards
185
190
 
186
191
  ## 📕 Releases & Versioning
187
192
 
@@ -48,6 +48,8 @@ The fastest way to start using Deep Agents. `deepagents-code` is a pre-built cod
48
48
  - **[Changelog](https://github.com/langchain-ai/deepagents/blob/main/libs/code/CHANGELOG.md)**
49
49
  - **[Source code](https://github.com/langchain-ai/deepagents/tree/main/libs/code)**
50
50
  - **[Deep Agents SDK](https://github.com/langchain-ai/deepagents)** — underlying agent harness
51
+ - [LangChain Academy](https://academy.langchain.com/) — Comprehensive, free courses on LangChain libraries and products, made by the LangChain team.
52
+ - [Code of Conduct](https://github.com/langchain-ai/langchain/?tab=coc-ov-file) — community guidelines and standards
51
53
 
52
54
  ## 📕 Releases & Versioning
53
55
 
@@ -7,9 +7,17 @@ middleware stack.
7
7
 
8
8
  from __future__ import annotations
9
9
 
10
- from typing import Any
10
+ from dataclasses import dataclass, field
11
+ from typing import Any, TypedDict
11
12
 
12
- from typing_extensions import TypedDict
13
+
14
+ @dataclass
15
+ class CLIContextSchema:
16
+ """Server-side schema for run-scoped CLI context."""
17
+
18
+ model: str | None = None
19
+ model_params: dict[str, Any] = field(default_factory=dict)
20
+ effective_model: str | None = None
13
21
 
14
22
 
15
23
  class CLIContext(TypedDict, total=False):
@@ -170,7 +170,6 @@ THEME = "DEEPAGENTS_CODE_THEME"
170
170
  USER_ID = "DEEPAGENTS_CODE_USER_ID"
171
171
  """Attach a user identifier to LangSmith trace metadata."""
172
172
 
173
-
174
173
  _TRUTHY_VALUES = frozenset({"1", "true", "yes", "on"})
175
174
  _FALSY_VALUES = frozenset({"0", "false", "no", "off", ""})
176
175
 
@@ -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.14" # x-release-please-version
5
+ __version__ = "0.1.16" # 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."""
@@ -52,6 +52,7 @@ if TYPE_CHECKING:
52
52
  from langchain.agents.middleware.types import AgentMiddleware
53
53
 
54
54
  from deepagents_code import theme
55
+ from deepagents_code._cli_context import CLIContextSchema
55
56
  from deepagents_code._constants import DEFAULT_AGENT_NAME
56
57
  from deepagents_code.config import (
57
58
  _INHERITED_PYTHONPATH_ENV,
@@ -1118,7 +1119,7 @@ def create_cli_agent(
1118
1119
  cwd: str | Path | None = None,
1119
1120
  project_context: ProjectContext | None = None,
1120
1121
  async_subagents: list[AsyncSubAgent] | None = None,
1121
- ) -> tuple[Pregel, CompositeBackend]:
1122
+ ) -> tuple[Pregel[Any, Any, Any, Any], CompositeBackend]:
1122
1123
  """Create a CLI-configured agent with flexible options.
1123
1124
 
1124
1125
  This is the main entry point for creating a Deep Agents Code agent, usable
@@ -1578,6 +1579,7 @@ def create_cli_agent(
1578
1579
  backend=composite_backend,
1579
1580
  middleware=agent_middleware,
1580
1581
  interrupt_on=interrupt_on,
1582
+ context_schema=CLIContextSchema,
1581
1583
  checkpointer=checkpointer,
1582
1584
  subagents=all_subagents or None,
1583
1585
  name=_sanitize_agent_message_name(assistant_id),
@@ -7,6 +7,7 @@ from typing import TYPE_CHECKING, assert_never
7
7
  from textual.content import Content
8
8
 
9
9
  from deepagents_code.model_config import (
10
+ CODEX_PROVIDER,
10
11
  ProviderAuthSource,
11
12
  ProviderAuthState,
12
13
  ProviderAuthStatus,
@@ -29,6 +30,13 @@ def format_auth_badge(status: ProviderAuthStatus) -> Content:
29
30
  Returns:
30
31
  A styled badge `Content` for the auth manager surface.
31
32
  """
33
+ # The ChatGPT-OAuth codex provider has no API key, so its credential is a
34
+ # file-backed OAuth token rather than a stored key. Give it distinctive
35
+ # badges (`[chatgpt]` / `[sign in to chatgpt]`) so users don't read the
36
+ # generic `[stored]`/`[missing]` as a literal API key on disk.
37
+ if status.provider == CODEX_PROVIDER:
38
+ return _format_codex_badge(status)
39
+
32
40
  state = status.state
33
41
  match state:
34
42
  case ProviderAuthState.CONFIGURED:
@@ -103,6 +111,48 @@ def _auth_badge(detail: str, *, prefix: str = "") -> Content:
103
111
  )
104
112
 
105
113
 
114
+ def _format_codex_badge(status: ProviderAuthStatus) -> Content:
115
+ """Format the auth manager badge for the ChatGPT-OAuth codex provider.
116
+
117
+ Codex signs in through ChatGPT OAuth rather than an API key, so a
118
+ `CONFIGURED` status renders as `[chatgpt]` (carrying the plan name when the
119
+ status detail includes one) and any other state renders as a
120
+ `[sign in to chatgpt]` prompt.
121
+
122
+ Args:
123
+ status: The codex provider's auth status.
124
+
125
+ Returns:
126
+ A styled badge reflecting ChatGPT sign-in state.
127
+ """
128
+ if status.state is ProviderAuthState.CONFIGURED:
129
+ badge_text = "[chatgpt]"
130
+ # `_get_codex_auth_status` encodes the plan as a trailing "(plan)" in
131
+ # the detail string (e.g. "signed in to ChatGPT (pro)").
132
+ if status.detail and (plan := _codex_plan_from_detail(status.detail)):
133
+ badge_text = f"[chatgpt: {plan}]"
134
+ return Content.styled(badge_text, "bold $success")
135
+ return Content.styled("[sign in to chatgpt]", "bold $warning")
136
+
137
+
138
+ def _codex_plan_from_detail(detail: str) -> str | None:
139
+ """Extract the ChatGPT plan from a codex auth detail string.
140
+
141
+ Args:
142
+ detail: Human-readable codex auth status detail.
143
+
144
+ Returns:
145
+ The ChatGPT plan text, or `None` when no bounded plan is present.
146
+ """
147
+ _, marker, plan_tail = detail.partition("(")
148
+ if not marker:
149
+ return None
150
+ plan, marker, _ = plan_tail.partition(")")
151
+ if not marker or not plan:
152
+ return None
153
+ return plan
154
+
155
+
106
156
  def _format_configured_badge(status: ProviderAuthStatus) -> Content:
107
157
  """Format the auth manager badge for a `CONFIGURED` provider.
108
158
 
@@ -13,7 +13,7 @@ import sys
13
13
  import threading
14
14
  from dataclasses import dataclass
15
15
  from enum import StrEnum
16
- from importlib.metadata import PackageNotFoundError, distribution
16
+ from importlib.metadata import PackageNotFoundError, distribution, version
17
17
  from pathlib import Path
18
18
  from typing import TYPE_CHECKING, Any
19
19
  from urllib.parse import unquote, urlparse
@@ -568,6 +568,23 @@ Kept short so tracing metadata can never stall app flows.
568
568
  """
569
569
 
570
570
 
571
+ def _get_deepagents_version() -> str | None:
572
+ """Read the installed Deep Agents SDK version from package metadata.
573
+
574
+ Returns:
575
+ The installed Deep Agents SDK version, or `None` when package metadata
576
+ is unavailable.
577
+ """
578
+ try:
579
+ return version("deepagents")
580
+ except PackageNotFoundError:
581
+ logger.debug(
582
+ "Failed to read deepagents version from package metadata",
583
+ exc_info=True,
584
+ )
585
+ return None
586
+
587
+
571
588
  def _resolve_editable_info() -> tuple[bool, str | None]:
572
589
  """Parse PEP 610 `direct_url.json` once and cache both results.
573
590
 
@@ -826,11 +843,15 @@ def build_stream_config(
826
843
  ) -> RunnableConfig:
827
844
  """Build the LangGraph stream config dict.
828
845
 
829
- Injects the dcode version into `metadata["versions"]` so LangSmith traces
846
+ Injects the dcode version into `metadata["lc_versions"]` so LangSmith traces
830
847
  can be correlated with specific releases. `create_deep_agent` supplies the
831
848
  SDK version through the compiled graph config, and LangChain merges nested
832
849
  metadata dictionaries so both versions survive at stream time.
833
850
 
851
+ Also records `dcode_client_deepagents_version` as a dcode-client diagnostic.
852
+ This describes the Deep Agents package installed alongside the TUI, which
853
+ can differ from a remote graph's Deep Agents runtime version.
854
+
834
855
  Includes `ls_integration` metadata so LangSmith traces originating from
835
856
  the app are distinguishable from bare SDK usage.
836
857
 
@@ -854,9 +875,13 @@ def build_stream_config(
854
875
  cwd = ""
855
876
 
856
877
  metadata: dict[str, Any] = {
857
- "versions": {"deepagents-code": __version__},
878
+ "lc_versions": {"deepagents-code": __version__},
858
879
  "ls_integration": "deepagents-code",
859
880
  }
881
+ deepagents_version = _get_deepagents_version()
882
+ if deepagents_version is not None:
883
+ metadata["dcode_client_deepagents_version"] = deepagents_version
884
+
860
885
  from deepagents_code._env_vars import USER_ID
861
886
 
862
887
  user_id = os.environ.get(USER_ID)
@@ -3045,6 +3070,8 @@ def create_model(
3045
3070
  warn_on_split_credential_source(provider)
3046
3071
  apply_stored_credentials(provider)
3047
3072
 
3073
+ from deepagents_code.model_config import CODEX_PROVIDER
3074
+
3048
3075
  # Early credential check — fail fast with an actionable message instead of
3049
3076
  # letting the provider SDK raise an opaque auth error on first invocation.
3050
3077
  # Providers that support implicit auth (e.g., Vertex AI ADC) are excluded
@@ -3054,6 +3081,13 @@ def create_model(
3054
3081
  if cred_status is False:
3055
3082
  from deepagents_code.model_config import MissingCredentialsError
3056
3083
 
3084
+ if provider == CODEX_PROVIDER:
3085
+ # No env var to set; point the user at `/auth` instead.
3086
+ msg = (
3087
+ "Not signed in to ChatGPT. Run `/auth` and select "
3088
+ "openai_codex to sign in with your ChatGPT account."
3089
+ )
3090
+ raise MissingCredentialsError(msg, provider=provider, env_var=None)
3057
3091
  env_var = get_credential_env_var(provider)
3058
3092
  display_env = env_var or f"<{provider} API key>"
3059
3093
  msg = (
@@ -3117,7 +3151,45 @@ def create_model(
3117
3151
  config = ModelConfig.load()
3118
3152
  class_path = config.get_class_path(provider) if provider else None
3119
3153
 
3120
- if class_path:
3154
+ if provider == CODEX_PROVIDER:
3155
+ # Codex models are constructed directly via `_ChatOpenAICodex` so the
3156
+ # `token_provider=` kwarg is wired to the on-disk OAuth token store
3157
+ # before any request goes out. `init_chat_model` does not know about
3158
+ # this class and would route through API-key `ChatOpenAI` instead.
3159
+ from deepagents_code.integrations import openai_codex as _codex
3160
+ from deepagents_code.model_config import (
3161
+ MissingCredentialsError,
3162
+ ModelConfigError,
3163
+ )
3164
+
3165
+ # Drop any `api_key` left in kwargs (e.g. from a config-level
3166
+ # `api_key_env` set on the codex provider, or a `--model-params
3167
+ # api_key=...`) so the bearer always comes from the OAuth
3168
+ # `token_provider` rather than a static key.
3169
+ kwargs.pop("api_key", None)
3170
+ try:
3171
+ model = _codex.build_chat_model(model_name, **kwargs)
3172
+ except FileNotFoundError as exc:
3173
+ msg = (
3174
+ "Not signed in to ChatGPT. Run `/auth` and select "
3175
+ "openai_codex to sign in with your ChatGPT account."
3176
+ )
3177
+ raise MissingCredentialsError(msg, provider=provider, env_var=None) from exc
3178
+ except _codex.CodexAuthExpiredError as exc:
3179
+ # A token exists but its refresh token is dead. Route through the
3180
+ # same `MissingCredentialsError` recovery path as a missing token
3181
+ # (which the retry flow re-attempts after `/auth`) instead of the
3182
+ # generic `ModelConfigError` below, which would not offer sign-in.
3183
+ msg = (
3184
+ "ChatGPT session expired. Run `/auth` and select openai_codex "
3185
+ "to sign in again."
3186
+ )
3187
+ raise MissingCredentialsError(msg, provider=provider, env_var=None) from exc
3188
+ except Exception as exc:
3189
+ spec = f"{provider}:{model_name}"
3190
+ msg = f"Failed to initialize Codex model '{spec}': {exc}"
3191
+ raise ModelConfigError(msg) from exc
3192
+ elif class_path:
3121
3193
  model = _create_model_from_class(class_path, model_name, provider, kwargs)
3122
3194
  else:
3123
3195
  model = _create_model_via_init(model_name, provider, kwargs)
@@ -7,6 +7,7 @@ the graph.
7
7
 
8
8
  from __future__ import annotations
9
9
 
10
+ import asyncio
10
11
  import logging
11
12
  from typing import TYPE_CHECKING, Any
12
13
 
@@ -17,9 +18,13 @@ from langchain.agents.middleware.types import (
17
18
  ModelResponse,
18
19
  )
19
20
 
21
+ from deepagents_code._cli_context import CLIContextSchema
22
+
20
23
  if TYPE_CHECKING:
21
24
  from collections.abc import Awaitable, Callable
22
25
 
26
+ from deepagents_code.config import ModelResult
27
+
23
28
 
24
29
  logger = logging.getLogger(__name__)
25
30
 
@@ -56,55 +61,54 @@ _ANTHROPIC_ONLY_SETTINGS: set[str] = {"cache_control"}
56
61
  must be stripped on cross-provider swap."""
57
62
 
58
63
 
59
- def _apply_overrides(request: ModelRequest) -> ModelRequest:
60
- """Apply model/param overrides from `CLIContext` on the runtime.
64
+ def _get_context(request: ModelRequest) -> CLIContextSchema | None:
65
+ """Return runtime context when it matches the CLI context shape."""
66
+ runtime = request.runtime
67
+ if runtime is None:
68
+ return None
61
69
 
62
- Reads `'model'` and `'model_params'` from `runtime.context` and, when
63
- present, swaps the model and/or merges extra settings into the request.
64
- On a cross-provider swap away from Anthropic, Anthropic-only settings
65
- (e.g. `cache_control`) are stripped. The `### Model Identity` section
66
- in the system prompt is also patched to reflect the new model.
70
+ ctx = runtime.context
71
+ if isinstance(ctx, CLIContextSchema):
72
+ return ctx
73
+ if isinstance(ctx, dict):
74
+ return CLIContextSchema(
75
+ model=ctx.get("model"),
76
+ model_params=ctx.get("model_params") or {},
77
+ effective_model=ctx.get("effective_model"),
78
+ )
79
+ return None
80
+
81
+
82
+ def _build_overrides(
83
+ request: ModelRequest, ctx: CLIContextSchema, model_result: ModelResult | None
84
+ ) -> ModelRequest:
85
+ """Build the overridden request from a (possibly resolved) model result.
86
+
87
+ Holds the post-construction logic shared by the sync and async override
88
+ paths: applying the model swap, merging `model_params`, stripping
89
+ Anthropic-only settings on a cross-provider swap, and patching the
90
+ `### Model Identity` system-prompt section. The only thing that differs
91
+ between the two callers is how `model_result` is produced (a direct
92
+ `create_model` call vs. an `asyncio.to_thread` offload).
67
93
 
68
94
  Args:
69
95
  request: The incoming model request from the middleware chain.
96
+ ctx: Runtime CLI context carrying the requested overrides.
97
+ model_result: The resolved model result from `create_model`, or `None`
98
+ when no model swap was requested.
70
99
 
71
100
  Returns:
72
- The original request unchanged when no `CLIContext` is present or it
73
- contains no overrides, otherwise a new request with overrides
74
- applied via `request.override()`.
101
+ The original request when no overrides apply, otherwise a new request
102
+ with overrides applied via `request.override()`.
75
103
  """
76
- runtime = request.runtime
77
- if runtime is None:
78
- return request
79
-
80
- ctx = runtime.context
81
- if not isinstance(ctx, dict):
82
- return request
83
-
84
104
  overrides: dict[str, Any] = {}
85
105
 
86
- # Model swap
87
- new_model = None
88
- model = ctx.get("model")
89
- if model and not model_matches_spec(request.model, model):
90
- from deepagents_code.config import create_model
91
- from deepagents_code.model_config import ModelConfigError
92
-
93
- logger.debug("Overriding model to %s", model)
94
- try:
95
- model_result = create_model(model)
96
- new_model = model_result.model
97
- except ModelConfigError:
98
- logger.exception(
99
- "Failed to resolve runtime model override '%s'; "
100
- "continuing with current model",
101
- model,
102
- )
103
- return request
106
+ new_model = model_result.model if model_result is not None else None
107
+ if new_model is not None:
104
108
  overrides["model"] = new_model
105
109
 
106
110
  # Param merge
107
- model_params = ctx.get("model_params", {})
111
+ model_params = ctx.model_params
108
112
  if model_params:
109
113
  overrides["model_settings"] = {**request.model_settings, **model_params}
110
114
 
@@ -131,7 +135,7 @@ def _apply_overrides(request: ModelRequest) -> ModelRequest:
131
135
  # We read metadata from model_result (not the app's settings singleton)
132
136
  # because the middleware runs in the server subprocess where settings
133
137
  # are never updated by /model.
134
- if new_model is not None and request.system_prompt:
138
+ if model_result is not None and request.system_prompt:
135
139
  from deepagents_code.agent import (
136
140
  MODEL_IDENTITY_RE,
137
141
  build_model_identity_section,
@@ -159,6 +163,78 @@ def _apply_overrides(request: ModelRequest) -> ModelRequest:
159
163
  return request.override(**overrides)
160
164
 
161
165
 
166
+ def _apply_overrides(request: ModelRequest) -> ModelRequest:
167
+ """Apply model/param overrides from `CLIContext` on the runtime.
168
+
169
+ Reads `'model'` and `'model_params'` from `runtime.context` and, when
170
+ present, swaps the model and/or merges extra settings into the request.
171
+ On a cross-provider swap away from Anthropic, Anthropic-only settings
172
+ (e.g. `cache_control`) are stripped. The `### Model Identity` section
173
+ in the system prompt is also patched to reflect the new model.
174
+
175
+ Args:
176
+ request: The incoming model request from the middleware chain.
177
+
178
+ Returns:
179
+ The original request unchanged when no `CLIContext` is present or it
180
+ contains no overrides, otherwise a new request with overrides
181
+ applied via `request.override()`.
182
+ """
183
+ ctx = _get_context(request)
184
+ if ctx is None:
185
+ return request
186
+
187
+ model_result = None
188
+ model = ctx.model
189
+ if model and not model_matches_spec(request.model, model):
190
+ from deepagents_code.config import create_model
191
+ from deepagents_code.model_config import ModelConfigError
192
+
193
+ logger.debug("Overriding model to %s", model)
194
+ try:
195
+ model_result = create_model(model)
196
+ except ModelConfigError:
197
+ logger.exception(
198
+ "Failed to resolve runtime model override '%s'; "
199
+ "continuing with current model",
200
+ model,
201
+ )
202
+ return request
203
+
204
+ return _build_overrides(request, ctx, model_result)
205
+
206
+
207
+ async def _apply_overrides_async(request: ModelRequest) -> ModelRequest:
208
+ """Async variant of `_apply_overrides` that offloads model construction.
209
+
210
+ Returns:
211
+ The original request when no async override applies, otherwise a request
212
+ with the runtime model or settings override applied.
213
+ """
214
+ ctx = _get_context(request)
215
+ if ctx is None:
216
+ return request
217
+
218
+ model_result = None
219
+ model = ctx.model
220
+ if model and not model_matches_spec(request.model, model):
221
+ from deepagents_code.config import create_model
222
+ from deepagents_code.model_config import ModelConfigError
223
+
224
+ logger.debug("Overriding model to %s", model)
225
+ try:
226
+ model_result = await asyncio.to_thread(create_model, model)
227
+ except ModelConfigError:
228
+ logger.exception(
229
+ "Failed to resolve runtime model override '%s'; "
230
+ "continuing with current model",
231
+ model,
232
+ )
233
+ return request
234
+
235
+ return _build_overrides(request, ctx, model_result)
236
+
237
+
162
238
  class ConfigurableModelMiddleware(AgentMiddleware):
163
239
  """Swap the model or per-call settings from `runtime.context`.
164
240
 
@@ -198,4 +274,4 @@ class ConfigurableModelMiddleware(AgentMiddleware):
198
274
  Returns:
199
275
  The `ModelResponse` produced by the downstream handler.
200
276
  """
201
- return await handler(_apply_overrides(request))
277
+ return await handler(await _apply_overrides_async(request))
@@ -66,7 +66,9 @@ MODEL_PROVIDER_EXTRAS: frozenset[str] = frozenset(
66
66
  Keep in sync with `[project.optional-dependencies]` in `pyproject.toml`.
67
67
  """
68
68
 
69
- SANDBOX_EXTRAS: frozenset[str] = frozenset({"agentcore", "daytona", "modal", "runloop"})
69
+ SANDBOX_EXTRAS: frozenset[str] = frozenset(
70
+ {"agentcore", "daytona", "modal", "runloop", "vercel"}
71
+ )
70
72
  """Optional extras that add sandbox integrations."""
71
73
 
72
74
  STANDALONE_EXTRAS: frozenset[str] = frozenset({"quickjs"})