deepagents-code 0.1.62__tar.gz → 0.1.63__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 (524) hide show
  1. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/AGENTS.md +2 -2
  2. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/CHANGELOG.md +16 -0
  3. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/COMMANDS.md +2 -2
  4. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/PKG-INFO +1 -1
  5. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/THREAT_MODEL.md +8 -2
  6. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/_build_info.py +1 -1
  7. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/_server_config.py +16 -0
  8. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/_session_stats.py +109 -11
  9. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/_version.py +1 -1
  10. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/agent.py +122 -12
  11. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/app.py +625 -142
  12. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/auto_mode.py +74 -32
  13. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/client/launch/server.py +112 -27
  14. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/client/launch/server_manager.py +6 -0
  15. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/client/non_interactive.py +39 -3
  16. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/command_registry.py +2 -2
  17. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/config.py +474 -203
  18. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/config_manifest.py +2 -2
  19. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/configurable_model.py +38 -14
  20. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/configuration/providers.py +757 -1
  21. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/configuration/resolver.py +87 -21
  22. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/configuration/service.py +228 -43
  23. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/configuration/types.py +87 -1
  24. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/configuration/writer.py +8 -7
  25. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/cost_tracking.py +83 -9
  26. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/doctor.py +67 -17
  27. deepagents_code-0.1.63/deepagents_code/extensions/__init__.py +5 -0
  28. deepagents_code-0.1.63/deepagents_code/extensions/api.py +188 -0
  29. deepagents_code-0.1.63/deepagents_code/extensions/discovery.py +205 -0
  30. deepagents_code-0.1.63/deepagents_code/extensions/registry.py +228 -0
  31. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/goal_rubric.py +27 -2
  32. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/main.py +95 -10
  33. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/model_config.py +64 -36
  34. deepagents_code-0.1.63/deepagents_code/model_retry.py +886 -0
  35. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/offload_api.py +90 -2
  36. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/offload_middleware.py +94 -2
  37. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/plugins/manifest.py +56 -6
  38. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/plugins/models.py +3 -0
  39. deepagents_code-0.1.63/deepagents_code/reliable_rubric.py +136 -0
  40. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/server_graph.py +7 -1
  41. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/textual_adapter.py +61 -15
  42. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/auth.py +18 -3
  43. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/diff.py +433 -11
  44. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/model_selector.py +1 -0
  45. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/ui.py +1 -1
  46. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/pyproject.toml +5 -2
  47. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/integration_tests/test_offload_server_side.py +87 -0
  48. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_agent.py +276 -0
  49. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_app.py +1154 -15
  50. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_auto_mode.py +137 -1
  51. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_charset.py +22 -16
  52. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_compact_tool.py +101 -3
  53. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_config.py +380 -250
  54. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_configurable_model.py +65 -0
  55. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_configuration.py +4465 -1991
  56. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_configuration_resolver.py +275 -1
  57. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_cost_tracking.py +98 -2
  58. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_debug_console.py +35 -0
  59. deepagents_code-0.1.63/tests/unit_tests/test_extension_api.py +198 -0
  60. deepagents_code-0.1.63/tests/unit_tests/test_extension_discovery.py +180 -0
  61. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_goal_rubric.py +29 -0
  62. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_main_acp_mode.py +13 -0
  63. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_main_args.py +134 -29
  64. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_model_config.py +3 -3
  65. deepagents_code-0.1.63/tests/unit_tests/test_model_retry.py +1482 -0
  66. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_model_switch.py +7 -3
  67. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_non_interactive.py +58 -0
  68. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_offload_api.py +190 -1
  69. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_reliable_rubric.py +140 -127
  70. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_reload.py +110 -3
  71. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_server.py +125 -19
  72. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_server_config.py +40 -0
  73. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_server_graph.py +38 -0
  74. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_session_stats.py +115 -0
  75. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_startup_fast_paths.py +23 -0
  76. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_tool_catalog.py +5 -2
  77. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/test_textual_adapter.py +181 -0
  78. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/widgets/test_auth_widgets.py +112 -0
  79. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/widgets/test_autocomplete.py +3 -3
  80. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/widgets/test_diff.py +360 -17
  81. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/uv.lock +1 -1
  82. deepagents_code-0.1.62/deepagents_code/reliable_rubric.py +0 -238
  83. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/.gitignore +0 -0
  84. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/ARCHITECTURE.md +0 -0
  85. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/DEVELOPMENT.md +0 -0
  86. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/HOOKS.md +0 -0
  87. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/LICENSE +0 -0
  88. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/Makefile +0 -0
  89. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/PRICING.md +0 -0
  90. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/README.md +0 -0
  91. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/__init__.py +0 -0
  92. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/__main__.py +0 -0
  93. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/_ask_user_types.py +0 -0
  94. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/_cli_context.py +0 -0
  95. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/_constants.py +0 -0
  96. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/_debug.py +0 -0
  97. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/_debug_buffer.py +0 -0
  98. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/_dep_floor_check.py +0 -0
  99. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/_env_vars.py +0 -0
  100. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/_fake_models.py +0 -0
  101. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/_git.py +0 -0
  102. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/_glm_5p2_profile.py +0 -0
  103. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/_home_error.py +0 -0
  104. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/_invocation.py +0 -0
  105. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/_markdown.py +0 -0
  106. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/_paths.py +0 -0
  107. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/_repository_bounds.py +0 -0
  108. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/_reserved_names.py +0 -0
  109. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/_startup_error.py +0 -0
  110. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/_terminal_stderr.py +0 -0
  111. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/_testing_models.py +0 -0
  112. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/_textual_patches.py +0 -0
  113. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/_tool_stream.py +0 -0
  114. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/_tracing.py +0 -0
  115. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/acp.py +0 -0
  116. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/app.tcss +0 -0
  117. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/approval_mode.py +0 -0
  118. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/ask_user.py +0 -0
  119. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/auth_display.py +0 -0
  120. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/auth_store.py +0 -0
  121. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/built_in_skills/__init__.py +0 -0
  122. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/built_in_skills/deepagents-thread-inspector/SKILL.md +0 -0
  123. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/built_in_skills/deepagents-thread-inspector/scripts/inspect_sessions.py +0 -0
  124. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/built_in_skills/remember/SKILL.md +0 -0
  125. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/built_in_skills/skill-creator/SKILL.md +0 -0
  126. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/built_in_skills/skill-creator/scripts/init_skill.py +0 -0
  127. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/built_in_skills/skill-creator/scripts/quick_validate.py +0 -0
  128. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/bundled_prices.README.md +0 -0
  129. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/bundled_prices.json +0 -0
  130. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/client/__init__.py +0 -0
  131. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/client/commands/__init__.py +0 -0
  132. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/client/commands/auth.py +0 -0
  133. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/client/commands/config.py +0 -0
  134. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/client/commands/extras.py +0 -0
  135. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/client/commands/mcp.py +0 -0
  136. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/client/commands/tools.py +0 -0
  137. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/client/launch/__init__.py +0 -0
  138. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/client/remote_client.py +0 -0
  139. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/clipboard.py +0 -0
  140. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/cold_cache.py +0 -0
  141. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/configuration/__init__.py +0 -0
  142. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/configuration/paths.py +0 -0
  143. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/configuration/provider.py +0 -0
  144. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/configuration/theme_resolution.py +0 -0
  145. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/context_doctor.py +0 -0
  146. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/default_agent_prompt.md +0 -0
  147. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/diff_utils.py +0 -0
  148. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/editor.py +0 -0
  149. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/event_bus.py +0 -0
  150. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/extras_info.py +0 -0
  151. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/file_ops.py +0 -0
  152. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/formatting.py +0 -0
  153. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/goal_state_limits.py +0 -0
  154. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/goal_state_notice.py +0 -0
  155. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/goal_tools.py +0 -0
  156. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/hooks/__init__.py +0 -0
  157. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/hooks/capabilities.py +0 -0
  158. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/hooks/client.py +0 -0
  159. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/hooks/client_lifecycle.py +0 -0
  160. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/hooks/context.py +0 -0
  161. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/hooks/engine.py +0 -0
  162. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/hooks/env.py +0 -0
  163. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/hooks/envelope.py +0 -0
  164. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/hooks/interrupt.py +0 -0
  165. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/hooks/legacy.py +0 -0
  166. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/hooks/loading.py +0 -0
  167. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/hooks/manager.py +0 -0
  168. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/hooks/migration.py +0 -0
  169. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/hooks/models/__init__.py +0 -0
  170. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/hooks/models/adapters.py +0 -0
  171. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/hooks/models/config.py +0 -0
  172. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/hooks/models/domain.py +0 -0
  173. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/hooks/models/transport.py +0 -0
  174. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/hooks/models/wire.py +0 -0
  175. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/hooks/permissions.py +0 -0
  176. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/hooks/presenter.py +0 -0
  177. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/hooks/projection.py +0 -0
  178. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/hooks/reducer.py +0 -0
  179. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/hooks/runner.py +0 -0
  180. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/hooks/runtime.py +0 -0
  181. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/hooks/server_middleware.py +0 -0
  182. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/hooks/snapshot.py +0 -0
  183. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/hooks/tools.py +0 -0
  184. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/hooks/transcript.py +0 -0
  185. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/hooks/trust.py +0 -0
  186. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/hooks/validate_terminal_sequence.py +0 -0
  187. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/input.py +0 -0
  188. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/integrations/__init__.py +0 -0
  189. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/integrations/openai_codex.py +0 -0
  190. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/integrations/sandbox_config.py +0 -0
  191. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/integrations/sandbox_factory.py +0 -0
  192. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/integrations/sandbox_provider.py +0 -0
  193. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/integrations/sandbox_registry.py +0 -0
  194. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/iterm_cursor_guide.py +0 -0
  195. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/json_types.py +0 -0
  196. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/local_context.py +0 -0
  197. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/managed_tools.py +0 -0
  198. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/mcp_auth.py +0 -0
  199. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/mcp_config.py +0 -0
  200. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/mcp_disabled.py +0 -0
  201. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/mcp_login_service.py +0 -0
  202. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/mcp_oauth_ui.py +0 -0
  203. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/mcp_providers/__init__.py +0 -0
  204. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/mcp_providers/_registry.py +0 -0
  205. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/mcp_providers/base.py +0 -0
  206. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/mcp_providers/github.py +0 -0
  207. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/mcp_providers/slack.py +0 -0
  208. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/mcp_tools.py +0 -0
  209. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/media_utils.py +0 -0
  210. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/memory_guard.py +0 -0
  211. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/notifications.py +0 -0
  212. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/offload.py +0 -0
  213. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/onboarding.py +0 -0
  214. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/output.py +0 -0
  215. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/paste_collapse.py +0 -0
  216. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/plugins/__init__.py +0 -0
  217. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/plugins/_json.py +0 -0
  218. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/plugins/adapters/__init__.py +0 -0
  219. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/plugins/adapters/hooks.py +0 -0
  220. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/plugins/adapters/mcp.py +0 -0
  221. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/plugins/adapters/skills.py +0 -0
  222. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/plugins/adapters/skills_middleware.py +0 -0
  223. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/plugins/commands_cli.py +0 -0
  224. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/plugins/discovery.py +0 -0
  225. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/plugins/marketplace.py +0 -0
  226. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/plugins/store.py +0 -0
  227. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/plugins/substitution.py +0 -0
  228. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/project_utils.py +0 -0
  229. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/py.typed +0 -0
  230. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/reasoning_effort.py +0 -0
  231. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/resume_state.py +0 -0
  232. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/sessions.py +0 -0
  233. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/skills/__init__.py +0 -0
  234. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/skills/commands.py +0 -0
  235. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/skills/invocation.py +0 -0
  236. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/skills/load.py +0 -0
  237. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/skills/merge.py +0 -0
  238. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/skills/trust.py +0 -0
  239. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/state_migration.py +0 -0
  240. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/subagents.py +0 -0
  241. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/system_prompt.md +0 -0
  242. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/terminal_capabilities.py +0 -0
  243. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/terminal_escape.py +0 -0
  244. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/theme.py +0 -0
  245. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tool_catalog.py +0 -0
  246. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tool_display.py +0 -0
  247. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tools.py +0 -0
  248. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/__init__.py +0 -0
  249. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/key_hints.py +0 -0
  250. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/modals/__init__.py +0 -0
  251. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/modals/cold_cache.py +0 -0
  252. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/modals/model_switch.py +0 -0
  253. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/modals/plugin_manager/__init__.py +0 -0
  254. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/modals/plugin_manager/content.py +0 -0
  255. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/modals/plugin_manager/models.py +0 -0
  256. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/modals/plugin_manager/plugin_manager.tcss +0 -0
  257. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/modals/plugin_manager/state.py +0 -0
  258. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/modals/plugin_manager/tabs.py +0 -0
  259. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/modals/prompt_clipboard.py +0 -0
  260. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/modals/prompt_clipboard.tcss +0 -0
  261. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/modals/resume_compact.py +0 -0
  262. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/screens/__init__.py +0 -0
  263. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/__init__.py +0 -0
  264. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/_copy_spans.py +0 -0
  265. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/_inline_prompt.py +0 -0
  266. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/_js_eval_display.py +0 -0
  267. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/_links.py +0 -0
  268. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/_paste_textarea.py +0 -0
  269. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/agent_selector.py +0 -0
  270. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/approval.py +0 -0
  271. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/ask_user.py +0 -0
  272. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/auto_mode_notice.py +0 -0
  273. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/autocomplete.py +0 -0
  274. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/chat_input.py +0 -0
  275. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/codex_auth.py +0 -0
  276. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/context_usage.py +0 -0
  277. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/cwd_switch.py +0 -0
  278. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/debug_console.py +0 -0
  279. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/effort_selector.py +0 -0
  280. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/goal_review.py +0 -0
  281. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/goal_status.py +0 -0
  282. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/history.py +0 -0
  283. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/install_confirm.py +0 -0
  284. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/launch_init.py +0 -0
  285. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/loading.py +0 -0
  286. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/mcp_login.py +0 -0
  287. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/mcp_reconnect.py +0 -0
  288. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/mcp_viewer.py +0 -0
  289. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/message_store.py +0 -0
  290. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/messages.py +0 -0
  291. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/notification_center.py +0 -0
  292. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/notification_detail.py +0 -0
  293. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/notification_settings.py +0 -0
  294. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/prompt_search.py +0 -0
  295. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/restart_prompt.py +0 -0
  296. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/skill_trust.py +0 -0
  297. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/startup_tip.py +0 -0
  298. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/status.py +0 -0
  299. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/subagent_panel.py +0 -0
  300. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/theme_selector.py +0 -0
  301. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/thread_agent_switch.py +0 -0
  302. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/thread_selector.py +0 -0
  303. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/tool_renderers.py +0 -0
  304. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/tool_widgets.py +0 -0
  305. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/update_available.py +0 -0
  306. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/update_confirm.py +0 -0
  307. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/update_progress.py +0 -0
  308. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/welcome.py +0 -0
  309. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/tui/widgets/yolo_mode_notice.py +0 -0
  310. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/unicode_security.py +0 -0
  311. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/deepagents_code/update_check.py +0 -0
  312. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/examples/skills/arxiv-search/SKILL.md +0 -0
  313. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/examples/skills/arxiv-search/arxiv_search.py +0 -0
  314. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/examples/skills/langgraph-docs/SKILL.md +0 -0
  315. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/examples/skills/skill-creator/SKILL.md +0 -0
  316. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/examples/skills/skill-creator/scripts/init_skill.py +0 -0
  317. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/examples/skills/skill-creator/scripts/quick_validate.py +0 -0
  318. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/examples/skills/web-research/SKILL.md +0 -0
  319. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/hatch_build.py +0 -0
  320. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/images/tui.png +0 -0
  321. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/scripts/check_imports.py +0 -0
  322. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/scripts/debug_server.sh +0 -0
  323. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/scripts/generate_commands_catalog.py +0 -0
  324. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/scripts/install.sh +0 -0
  325. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/README.md +0 -0
  326. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/integration_tests/__init__.py +0 -0
  327. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/integration_tests/benchmarks/__init__.py +0 -0
  328. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/integration_tests/benchmarks/test_codspeed_import_benchmarks.py +0 -0
  329. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/integration_tests/benchmarks/test_local_context_benchmarks.py +0 -0
  330. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/integration_tests/benchmarks/test_startup_benchmarks.py +0 -0
  331. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/integration_tests/conftest.py +0 -0
  332. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/integration_tests/test_acp_mode.py +0 -0
  333. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/integration_tests/test_auto_approve_remote.py +0 -0
  334. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/integration_tests/test_compact_resume.py +0 -0
  335. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/integration_tests/test_goal_criteria_remote.py +0 -0
  336. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/integration_tests/test_sandbox_factory.py +0 -0
  337. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/integration_tests/test_sandbox_operations.py +0 -0
  338. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/__init__.py +0 -0
  339. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/client/__init__.py +0 -0
  340. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/client/commands/__init__.py +0 -0
  341. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/client/commands/test_auth.py +0 -0
  342. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/client/commands/test_extras.py +0 -0
  343. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/client/commands/test_mcp.py +0 -0
  344. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/client/commands/test_tools.py +0 -0
  345. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/conftest.py +0 -0
  346. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/data/coding_agent_v1_validator.json +0 -0
  347. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/hooks/__init__.py +0 -0
  348. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/hooks/models/__init__.py +0 -0
  349. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/hooks/models/test_models.py +0 -0
  350. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/hooks/test_client_lifecycle.py +0 -0
  351. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/hooks/test_configuration.py +0 -0
  352. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/hooks/test_engine.py +0 -0
  353. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/hooks/test_execution.py +0 -0
  354. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/hooks/test_manager.py +0 -0
  355. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/hooks/test_presenter.py +0 -0
  356. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/hooks/test_server_lifecycle.py +0 -0
  357. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/hooks/test_transcript.py +0 -0
  358. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/hooks/test_trust.py +0 -0
  359. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/plugins/__init__.py +0 -0
  360. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/plugins/test_marketplace.py +0 -0
  361. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/plugins/test_plugin_hooks.py +0 -0
  362. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/plugins/test_plugins_p0.py +0 -0
  363. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/plugins/test_store.py +0 -0
  364. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/skills/__init__.py +0 -0
  365. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/skills/test_commands.py +0 -0
  366. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/skills/test_load.py +0 -0
  367. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/skills/test_merge.py +0 -0
  368. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/skills/test_skill_trust.py +0 -0
  369. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/skills/test_skills_json.py +0 -0
  370. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/skills/test_thread_inspector.py +0 -0
  371. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/smoke_tests/__init__.py +0 -0
  372. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/smoke_tests/conftest.py +0 -0
  373. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/smoke_tests/snapshots/system_prompt_interactive_local.md +0 -0
  374. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/smoke_tests/test_system_prompt.py +0 -0
  375. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test__tool_stream.py +0 -0
  376. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_acp.py +0 -0
  377. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_agent_friendly.py +0 -0
  378. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_approval_mode.py +0 -0
  379. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_args.py +0 -0
  380. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_ask_user_middleware.py +0 -0
  381. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_ask_user_types.py +0 -0
  382. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_auth_display.py +0 -0
  383. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_auth_store.py +0 -0
  384. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_auth_web_search_restart.py +0 -0
  385. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_cli_provider.py +0 -0
  386. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_clipboard.py +0 -0
  387. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_coding_agent_metadata.py +0 -0
  388. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_cold_cache.py +0 -0
  389. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_command_registry.py +0 -0
  390. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_config_manifest.py +0 -0
  391. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_configuration_resolution.py +0 -0
  392. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_context_doctor.py +0 -0
  393. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_cursor_blink.py +0 -0
  394. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_cursor_style.py +0 -0
  395. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_debug.py +0 -0
  396. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_debug_buffer.py +0 -0
  397. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_dep_floor_check.py +0 -0
  398. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_diff_utils.py +0 -0
  399. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_doctor.py +0 -0
  400. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_editor.py +0 -0
  401. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_end_to_end.py +0 -0
  402. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_env_vars.py +0 -0
  403. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_event_bus.py +0 -0
  404. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_exception_handling.py +0 -0
  405. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_extras_info.py +0 -0
  406. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_file_ops.py +0 -0
  407. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_formatting.py +0 -0
  408. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_git.py +0 -0
  409. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_glm_5p2_profile.py +0 -0
  410. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_goal_criteria_client.py +0 -0
  411. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_goal_state_limits.py +0 -0
  412. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_goal_state_notice.py +0 -0
  413. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_goal_state_persistence.py +0 -0
  414. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_goal_tools.py +0 -0
  415. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_hatch_build.py +0 -0
  416. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_hooks.py +0 -0
  417. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_imports.py +0 -0
  418. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_input_parsing.py +0 -0
  419. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_install_command.py +0 -0
  420. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_install_script.py +0 -0
  421. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_invocation.py +0 -0
  422. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_iterm_cursor_guide.py +0 -0
  423. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_json_types.py +0 -0
  424. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_local_context.py +0 -0
  425. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_main.py +0 -0
  426. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_managed_tools.py +0 -0
  427. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_mcp_auth.py +0 -0
  428. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_mcp_config.py +0 -0
  429. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_mcp_disabled.py +0 -0
  430. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_mcp_login_service.py +0 -0
  431. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_mcp_oauth_ui.py +0 -0
  432. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_mcp_tools.py +0 -0
  433. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_media_utils.py +0 -0
  434. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_memory_guard.py +0 -0
  435. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_middleware_trace_policy.py +0 -0
  436. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_notifications.py +0 -0
  437. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_offload.py +0 -0
  438. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_onboarding.py +0 -0
  439. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_openai_codex_integration.py +0 -0
  440. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_output.py +0 -0
  441. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_paths.py +0 -0
  442. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_reasoning_effort.py +0 -0
  443. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_remote_client.py +0 -0
  444. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_repository_bounds.py +0 -0
  445. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_resume_state.py +0 -0
  446. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_rubric_cli.py +0 -0
  447. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_sandbox_config.py +0 -0
  448. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_sandbox_factory.py +0 -0
  449. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_sandbox_provider.py +0 -0
  450. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_sandbox_registry.py +0 -0
  451. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_server_helpers.py +0 -0
  452. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_server_manager.py +0 -0
  453. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_sessions.py +0 -0
  454. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_shell_allow_list.py +0 -0
  455. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_skill_invocation.py +0 -0
  456. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_startup_blocking.py +0 -0
  457. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_state_migration.py +0 -0
  458. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_subagents.py +0 -0
  459. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_terminal_capabilities.py +0 -0
  460. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_terminal_escape.py +0 -0
  461. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_terminal_progress_preference.py +0 -0
  462. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_terminal_stderr.py +0 -0
  463. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_textual_patches.py +0 -0
  464. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_theme.py +0 -0
  465. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_threads_resume.py +0 -0
  466. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_tool_display.py +0 -0
  467. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_tracing.py +0 -0
  468. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_tracing_replicas.py +0 -0
  469. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_transcript_virtualization.py +0 -0
  470. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_ui.py +0 -0
  471. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_unicode_security.py +0 -0
  472. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_update_check.py +0 -0
  473. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/test_version.py +0 -0
  474. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tools/__init__.py +0 -0
  475. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tools/test_current_thread.py +0 -0
  476. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tools/test_fetch_url.py +0 -0
  477. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tools/test_tool_arg_schemas.py +0 -0
  478. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/__init__.py +0 -0
  479. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/modals/__init__.py +0 -0
  480. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/modals/plugin_manager/__init__.py +0 -0
  481. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/modals/plugin_manager/test_structure.py +0 -0
  482. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/modals/test_cold_cache.py +0 -0
  483. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/modals/test_model_switch.py +0 -0
  484. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/modals/test_prompt_clipboard.py +0 -0
  485. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/test_key_hints.py +0 -0
  486. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/test_modal_footer_layout.py +0 -0
  487. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/test_subagent_stream.py +0 -0
  488. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/widgets/__init__.py +0 -0
  489. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/widgets/test_agent_selector.py +0 -0
  490. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/widgets/test_approval.py +0 -0
  491. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/widgets/test_ask_user.py +0 -0
  492. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/widgets/test_auto_mode_notice.py +0 -0
  493. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/widgets/test_chat_input.py +0 -0
  494. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/widgets/test_copy_spans.py +0 -0
  495. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/widgets/test_cwd_switch.py +0 -0
  496. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/widgets/test_goal_review.py +0 -0
  497. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/widgets/test_history.py +0 -0
  498. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/widgets/test_inline_prompt.py +0 -0
  499. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/widgets/test_install_confirm.py +0 -0
  500. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/widgets/test_launch_init.py +0 -0
  501. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/widgets/test_links.py +0 -0
  502. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/widgets/test_loading.py +0 -0
  503. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/widgets/test_mcp_login_modal.py +0 -0
  504. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/widgets/test_mcp_reconnect.py +0 -0
  505. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/widgets/test_mcp_viewer.py +0 -0
  506. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/widgets/test_message_store.py +0 -0
  507. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/widgets/test_messages.py +0 -0
  508. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/widgets/test_model_selector.py +0 -0
  509. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/widgets/test_notification_center.py +0 -0
  510. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/widgets/test_notification_detail.py +0 -0
  511. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/widgets/test_notification_settings.py +0 -0
  512. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/widgets/test_prompt_search.py +0 -0
  513. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/widgets/test_restart_prompt.py +0 -0
  514. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/widgets/test_skill_trust_screen.py +0 -0
  515. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/widgets/test_startup_tip.py +0 -0
  516. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/widgets/test_status.py +0 -0
  517. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/widgets/test_subagent_panel.py +0 -0
  518. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/widgets/test_thread_agent_switch.py +0 -0
  519. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/widgets/test_thread_selector.py +0 -0
  520. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/widgets/test_tool_renderers.py +0 -0
  521. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/widgets/test_update_available.py +0 -0
  522. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/widgets/test_update_confirm.py +0 -0
  523. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/widgets/test_update_progress.py +0 -0
  524. {deepagents_code-0.1.62 → deepagents_code-0.1.63}/tests/unit_tests/tui/widgets/test_welcome.py +0 -0
@@ -153,8 +153,8 @@ To add a new slash command: (1) add a `SlashCommand` entry to `COMMANDS`, (2) se
153
153
 
154
154
  1. `deepagents_code/model_config.py` — add `"provider_name": "ENV_VAR_NAME"` to `PROVIDER_API_KEY_ENV`
155
155
  2. `deepagents_code/model_config.py` — if the provider reads a *dedicated* endpoint env var, add `"provider_name": ("CANONICAL_BASE_URL", "ALTERNATE", ...)` to `PROVIDER_BASE_URL_ENV` (see guidelines below); omit the provider entirely when it has no provider-specific endpoint variable
156
- 3. `pyproject.toml` — add `provider = ["langchain-provider>=X.Y.Z,<N.0.0"]` to `[project.optional-dependencies]` and include it in the `all-providers` composite extra
157
- 4. `deepagents_code/model_config.py` — add `"provider_name"` to `RETRY_PARAM_BY_PROVIDER` if the provider's chat model accepts `max_retries`
156
+ 3. `deepagents_code/model_config.py` — add `"provider_name": "max_retries"` (or the provider's actual retry-count constructor kwarg) to `RETRY_PARAM_BY_PROVIDER`. dcode's model-node middleware owns the retry budget, so this entry is the disable-list that forces the provider's own SDK retry loop off; omitting it lets the SDK retries multiply the middleware's attempts. Verify the kwarg name against the integration's constructor — leave the provider out only when it exposes no integer retry-count kwarg. Check what the kwarg counts: retries are disabled with the default zero, but a kwarg counting *total attempts* needs an entry in `RETRY_DISABLE_VALUE_BY_PROVIDER` (see `google_genai`), because zero attempts either restores the SDK default or is coerced back to one
157
+ 4. `pyproject.toml` — add `provider = ["langchain-provider>=X.Y.Z,<N.0.0"]` to `[project.optional-dependencies]` and include it in the `all-providers` composite extra
158
158
  5. `deepagents_code/tui/widgets/auth.py` — add `"provider_name": "Display Name"` to `PROVIDER_DISPLAY_NAMES` so the `/auth` UI shows a branded label instead of the title-cased key, and (if the provider issues API keys from a self-serve page) `"provider_name": "https://…"` to `PROVIDER_API_KEY_URLS` so the prompt links straight to the key page
159
159
  6. `tests/unit_tests/test_model_config.py` — add `assert PROVIDER_API_KEY_ENV["provider_name"] == "ENV_VAR_NAME"` to `TestProviderApiKeyEnv.test_contains_major_providers`, and pin any `PROVIDER_BASE_URL_ENV` entry with a matching assertion
160
160
 
@@ -2,6 +2,22 @@
2
2
 
3
3
  # Deep Agents Code Changelog
4
4
 
5
+ ## [0.1.63](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.62...deepagents-code==0.1.63) (2026-08-26)
6
+
7
+ ### Features
8
+
9
+ - Added Baseten `zai-org/GLM-5.3-Flash` to the model switcher ([#5844](https://github.com/langchain-ai/deepagents/issues/5844)).
10
+ - Added support for loading managed config from a remote source ([#5776](https://github.com/langchain-ai/deepagents/issues/5776)).
11
+ - Added retry middleware for transient model errors in model nodes ([#4569](https://github.com/langchain-ai/deepagents/issues/4569)).
12
+
13
+ ### Fixes
14
+
15
+ - Fixed live cost tracking for dynamic subagents ([#5833](https://github.com/langchain-ai/deepagents/issues/5833)).
16
+ - Improved `clear` command descriptions ([#5841](https://github.com/langchain-ai/deepagents/issues/5841)).
17
+ - Allowed instrumental Auto actions ([#5832](https://github.com/langchain-ai/deepagents/issues/5832)).
18
+ - Ensured traces are flushed before server shutdown ([#5837](https://github.com/langchain-ai/deepagents/issues/5837)).
19
+ - Made the debug log path click-to-copy ([#5845](https://github.com/langchain-ai/deepagents/issues/5845)).
20
+
5
21
  ## [0.1.62](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.61...deepagents-code==0.1.62) (2026-08-26)
6
22
 
7
23
  ### Features
@@ -17,7 +17,7 @@ aliases, descriptions, visibility, or hidden-command metadata.
17
17
  | `/auto` | | Switch to Auto approval mode or manage its classifier model |
18
18
  | `/auto-update` | | Turn automatic updates on or off |
19
19
  | `/changelog` | | Open the changelog in a browser |
20
- | `/clear` | | Clear the chat and start a new thread |
20
+ | `/clear` | | Start a fresh thread |
21
21
  | `/context` | | Show current context window usage |
22
22
  | `/context-doctor` | | Audit what a session injects and its estimated token cost |
23
23
  | `/copy` | | Copy the latest assistant message to clipboard |
@@ -26,7 +26,7 @@ aliases, descriptions, visibility, or hidden-command metadata.
26
26
  | `/editor` | | Open prompt in an external editor ($EDITOR) |
27
27
  | `/effort` | | Set reasoning effort for the current model |
28
28
  | `/feedback` | | Send feedback or report an issue |
29
- | `/force-clear` | | Stop active work, clear the chat, and start a new thread |
29
+ | `/force-clear` | | Recover a stuck session with a fresh thread |
30
30
  | `/goal` | | Set and manage a persistent objective with acceptance criteria |
31
31
  | `/help` | | Show help and available commands |
32
32
  | `/install` | | Install an optional integration |
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: deepagents-code
3
- Version: 0.1.62
3
+ Version: 0.1.63
4
4
  Summary: Terminal coding agent built on the Deep Agents SDK - works with any model, with persistent memory, customizable skills, subagents, and approval controls.
5
5
  Project-URL: Homepage, https://www.langchain.com/dcode
6
6
  Project-URL: Documentation, https://docs.langchain.com/oss/deepagents/code/overview
@@ -333,11 +333,17 @@
333
333
  - A missing file is accepted and applies no policy.
334
334
  - A present unreadable, undecodable, or syntactically corrupt file blocks every command except `--help`, `--version`, `help`, `config`, `doctor`, and `auth path`. It also blocks `/reload`.
335
335
  - On Windows, a ProgramData directory that cannot be read from the registry blocks the same commands. The path would be a guess, and an empty read at a guessed path does not prove that no policy is deployed. Reporting it as a missing file made every managed setting silently inert on a host whose ProgramData is relocated.
336
- - A failed `/reload` keeps the last snapshot that parsed cleanly, so policy is never dropped mid-session.
336
+ - A failed `/reload` keeps the last enforceable snapshot, so policy is never dropped mid-session. A snapshot that parses but cannot be enforced is not cached either, so a rejected edit cannot become the generation later readers observe.
337
337
  - An unusable user `config.toml` drops only the user layer, so managed policy still applies.
338
338
  - A deny list that cannot be read is treated as denying everything, never as empty. This covers a managed `[mcp].disabled_servers` that is neither an array of names nor a comma-separated string, and a `[mcp]` section that is not a table. A managed `[mcp].enabled_project_server_approvals` that is not an array is treated the same way: the key is present, so policy means to narrow access, and reading its presence as absence would keep both the user's approvals and the `DEEPAGENTS_CODE_DANGEROUSLY_ENABLE_PROJECT_MCP_SERVERS` bypass in force.
339
339
  - **Outside**: Ownership, permission-mode validation, privileged installation, and `sudo` policy are deployment responsibilities. Anyone who can replace the administrator-managed file can control model, sandbox, interpreter, MCP trust, and other supported runtime settings. Model policy constrains official dcode selection and construction paths; it does not stop a hostile local user from replacing the package, modifying the process, or calling a provider SDK directly. On macOS, note that stock `/Library/Application Support` is group-writable by `admin`, so any admin-group member can create the file and grant themselves policy. Deployments that rely on this boundary must tighten ownership and mode on the `dcode` directory.
340
- - **Crossing mechanism**: Synchronous local file read through `configuration.TomlFileProvider`, followed by typed resolution and CLI/server startup gates.
340
+ - **Remote source**: The fixed local file may contain only `[managed_config].source`. Its administrator-owned HTTPS URL is then the explicit destination allowlist. The remote document becomes the whole managed policy. It cannot chain to another source. URLs with userinfo, query strings, or fragments are rejected. So are URLs carrying whitespace, control characters, or any non-ASCII character: confusable host text must not reach operator output, and `urllib` does not encode a non-ASCII request target consistently.
341
+ - Requests validate the certificate against Python's default TLS trust store, bypass environment proxies, and refuse redirects. One five-second budget covers the whole fetch: the connection, the TLS handshake, the headers, and the body. The fetch is abandoned once that budget is spent. At most 1 MiB is accepted.
342
+ - Only a complete document is accepted. The status must be 200. The media type must be `application/toml`, `text/plain`, or `application/octet-stream`, and the body must not be compressed. A captive portal or gateway error page that answers 200 with `text/html` is rejected before it is parsed. This is not a complete guard, and it is not relied on as one: a response with no `Content-Type`, or one claiming `application/octet-stream`, is read, because a bare object store answers that way. Such a body still has to parse as TOML and satisfy every rule below. Framing must show the body arrived whole: one matching `Content-Length`, or chunked encoding. A response that sends both, or that repeats `Content-Length` with different values, is rejected — the first value wins in `http.client`, so a duplicate header would otherwise let a prefix pass as a whole document. A keyless document is rejected as a failed publish. Truncated TOML often still parses, so a partial document would otherwise enforce a policy with entries silently missing, and would replace the last enforceable generation.
343
+ - The proxy bypass stops a local user redirecting the fetch through `HTTPS_PROXY`. The trust store itself is not pinned. `SSL_CERT_FILE` and `SSL_CERT_DIR` still select the certificate authorities, so the same actor can substitute the CA set for this request. This is the same deployment responsibility as the local file ownership in the **Outside** bullet above. This boundary does not apply on a host where an unprivileged user controls the `dcode` process environment.
344
+ - No disk cache or authentication material is stored. Private enterprise hosts remain reachable because the local trust anchor, not user input, selects the host. A fetch failure stops startup. A failed reload keeps the process's last enforceable snapshot, and `dcode doctor` reports that the refresh failed so a host that stopped answering is not silent.
345
+
346
+ - **Crossing mechanism**: Synchronous local file read through `configuration.TomlFileProvider`, optionally followed by one bounded HTTPS fetch through `configuration.RemoteTomlProvider`, then typed resolution and CLI/server startup gates.
341
347
 
342
348
  #### TB14: Launch Environment → User Trust Root
343
349
 
@@ -1,3 +1,3 @@
1
1
  """Generated at build time. Do not edit or commit."""
2
2
 
3
- BUILD_COMMIT = "dc27a2f"
3
+ BUILD_COMMIT = "970003e"
@@ -254,6 +254,9 @@ class ServerConfig:
254
254
  """Extra kwargs forwarded to the chat model constructor (temperature,
255
255
  max_tokens, etc.)."""
256
256
 
257
+ cli_max_retries: int | None = None
258
+ """Explicit `--max-retries` value, separate from provider model kwargs."""
259
+
257
260
  profile_overrides: dict[str, Any] | None = None
258
261
  """Model profile metadata overrides resolved by the client."""
259
262
 
@@ -424,6 +427,12 @@ class ServerConfig:
424
427
  if self.rubric_max_iterations is not None and self.rubric_max_iterations <= 0:
425
428
  msg = "rubric_max_iterations must be None or a positive integer"
426
429
  raise ValueError(msg)
430
+ if isinstance(self.cli_max_retries, bool):
431
+ msg = "cli_max_retries must be None or a non-negative integer"
432
+ raise TypeError(msg)
433
+ if self.cli_max_retries is not None and self.cli_max_retries < 0:
434
+ msg = "cli_max_retries must be None or a non-negative integer"
435
+ raise ValueError(msg)
427
436
  if isinstance(self.recursion_limit, bool):
428
437
  msg = "recursion_limit must be None or a positive integer"
429
438
  raise TypeError(msg)
@@ -451,6 +460,9 @@ class ServerConfig:
451
460
  "MODEL_PARAMS": (
452
461
  json.dumps(self.model_params) if self.model_params is not None else None
453
462
  ),
463
+ "MAX_RETRIES": (
464
+ str(self.cli_max_retries) if self.cli_max_retries is not None else None
465
+ ),
454
466
  "PROFILE_OVERRIDES": (
455
467
  json.dumps(self.profile_overrides)
456
468
  if self.profile_overrides is not None
@@ -522,6 +534,7 @@ class ServerConfig:
522
534
  return cls(
523
535
  model=_read_env_str("MODEL"),
524
536
  model_params=_read_env_json("MODEL_PARAMS"),
537
+ cli_max_retries=_read_env_int("MAX_RETRIES", default=None),
525
538
  profile_overrides=_read_env_json("PROFILE_OVERRIDES"),
526
539
  assistant_id=_read_env_str("ASSISTANT_ID") or DEFAULT_ASSISTANT_ID,
527
540
  system_prompt=_read_env_str("SYSTEM_PROMPT"),
@@ -570,6 +583,7 @@ class ServerConfig:
570
583
  project_context: ProjectContext | None,
571
584
  model_name: str | None,
572
585
  model_params: dict[str, Any] | None,
586
+ cli_max_retries: int | None = None,
573
587
  profile_overrides: dict[str, Any] | None = None,
574
588
  assistant_id: str,
575
589
  auto_approve: bool,
@@ -604,6 +618,7 @@ class ServerConfig:
604
618
  project_context: Explicit user/project path context.
605
619
  model_name: Model spec string.
606
620
  model_params: Extra model kwargs.
621
+ cli_max_retries: Explicit `--max-retries` value.
607
622
  profile_overrides: Model profile metadata overrides.
608
623
  assistant_id: Agent identifier.
609
624
  auto_approve: Auto-approve all tools.
@@ -650,6 +665,7 @@ class ServerConfig:
650
665
  return cls(
651
666
  model=model_name,
652
667
  model_params=model_params,
668
+ cli_max_retries=cli_max_retries,
653
669
  profile_overrides=profile_overrides,
654
670
  assistant_id=assistant_id,
655
671
  auto_approve=auto_approve,
@@ -30,17 +30,13 @@ logger = logging.getLogger(__name__)
30
30
  _warned_usage_stats_rejections: set[str] = set()
31
31
  """Rejection reasons already reported by `_warn_rejected_usage_stats_value`."""
32
32
 
33
- SpinnerStatus = (
34
- Literal[
35
- "Thinking",
36
- "Offloading",
37
- "Loading thread",
38
- "Drafting acceptance criteria",
39
- "Reviewing approval request",
40
- ]
41
- | None
42
- )
43
- """Valid spinner display states, or `None` to hide."""
33
+ SpinnerStatus = str | None
34
+ """Spinner display text, or `None` to hide.
35
+
36
+ Deliberately unconstrained rather than the closed `Literal` set it replaced:
37
+ retry status text is generated per attempt by `model_retry.format_retry_status`.
38
+ Narrowing this back to a `Literal` union would break the retry spinner.
39
+ """
44
40
 
45
41
  UsageKind = Literal["assistant", "subagent", "offload", "auto"]
46
42
  """Billing/display class for a model request."""
@@ -892,6 +888,108 @@ def record_message_usage(
892
888
  )
893
889
 
894
890
 
891
+ def is_model_usage_event(data: object) -> bool:
892
+ """Report whether a custom-stream payload is a nested model-usage event.
893
+
894
+ Lets a client consume its own event whatever `record_model_usage_event` made
895
+ of it. A duplicate of a request the message stream already recorded is still
896
+ this client's event, not a payload for the unrelated handlers downstream.
897
+
898
+ Args:
899
+ data: A `custom` stream payload.
900
+
901
+ Returns:
902
+ `True` when the payload claims to be a nested model-usage event.
903
+ """
904
+ from deepagents_code.cost_tracking import MODEL_USAGE_EVENT_TYPE
905
+
906
+ return isinstance(data, Mapping) and data.get("type") == MODEL_USAGE_EVENT_TYPE
907
+
908
+
909
+ def record_model_usage_event(
910
+ stats: SessionStats,
911
+ data: object,
912
+ *,
913
+ active_thread_id: str = "",
914
+ fallback_model: str = "",
915
+ fallback_provider: str = "",
916
+ recorded_requests: dict[str, RecordedRequest] | None = None,
917
+ ) -> RecordedUsage | None:
918
+ """Record a validated provisional usage event from a nested model call.
919
+
920
+ Returns:
921
+ The recorded usage delta, or `None` when the event is invalid or duplicate.
922
+ """
923
+ from deepagents_code.cost_tracking import (
924
+ MODEL_USAGE_EVENT_TYPE,
925
+ MODEL_USAGE_EVENT_VERSION,
926
+ )
927
+
928
+ if not isinstance(data, Mapping) or data.get("type") != MODEL_USAGE_EVENT_TYPE:
929
+ return None
930
+ version = data.get("version")
931
+ if (
932
+ not isinstance(version, int)
933
+ or isinstance(version, bool)
934
+ or version != MODEL_USAGE_EVENT_VERSION
935
+ ):
936
+ # A newer graph process can stream a shape this client cannot read. The
937
+ # spend is still charged and streamed as the thread total, so only the
938
+ # provisional display is lost -- but silence would make that look like
939
+ # the graph never emitted anything.
940
+ logger.debug(
941
+ "Ignoring a nested usage event of version %r; this client reads %d.",
942
+ version,
943
+ MODEL_USAGE_EVENT_VERSION,
944
+ )
945
+ return None
946
+ request_id = data.get("request_id")
947
+ thread_id = data.get("thread_id")
948
+ scope = data.get("scope")
949
+ usage = data.get("usage_metadata")
950
+ model_name, provider = data.get("model_name"), data.get("provider")
951
+ if (
952
+ not isinstance(request_id, str)
953
+ or not request_id
954
+ or not isinstance(thread_id, str)
955
+ or not thread_id
956
+ or not isinstance(scope, str)
957
+ or not scope
958
+ or not isinstance(usage, Mapping)
959
+ or not usage
960
+ or not isinstance(model_name, str)
961
+ or not isinstance(provider, str)
962
+ ):
963
+ logger.debug("Ignoring a malformed nested usage event")
964
+ return None
965
+ if active_thread_id and thread_id != active_thread_id:
966
+ # Ordinary: a stream for a thread the user has since switched away from.
967
+ return None
968
+ try:
969
+ from langchain_core.messages import AIMessage
970
+
971
+ message = AIMessage(
972
+ content="",
973
+ id=request_id,
974
+ usage_metadata=cast("Any", dict(usage)),
975
+ response_metadata={
976
+ "model_name": model_name,
977
+ "model_provider": provider,
978
+ },
979
+ )
980
+ except (TypeError, ValueError):
981
+ logger.debug("Rejected malformed nested model usage", exc_info=True)
982
+ return None
983
+ return record_message_usage(
984
+ stats,
985
+ message,
986
+ fallback_model=fallback_model,
987
+ fallback_provider=fallback_provider,
988
+ kind="subagent",
989
+ recorded_requests=recorded_requests,
990
+ )
991
+
992
+
895
993
  def format_token_count(count: int) -> str:
896
994
  """Format a token count into a human-readable short string.
897
995
 
@@ -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.62" # x-release-please-version
5
+ __version__ = "0.1.63" # 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."""
@@ -83,6 +83,7 @@ from deepagents_code.approval_mode import (
83
83
  )
84
84
  from deepagents_code.config import (
85
85
  _INHERITED_PYTHONPATH_ENV,
86
+ DEFAULT_MODEL_RETRIES,
86
87
  _ShellAllowAll,
87
88
  config,
88
89
  console,
@@ -2204,6 +2205,52 @@ def _apply_inherited_pythonpath(env: dict[str, str]) -> None:
2204
2205
  env["PYTHONPATH"] = inherited
2205
2206
 
2206
2207
 
2208
+ def _resolve_retry_owned_model(
2209
+ model_spec: str, cli_max_retries: int | None
2210
+ ) -> BaseChatModel | None:
2211
+ """Resolve a string model with provider retries disabled and metadata tagged.
2212
+
2213
+ Only an explicit `--max-retries` is forwarded. Passing the caller's already
2214
+ resolved budget instead would take precedence over
2215
+ `[retries.<provider>].max_retries`, so a model on a different provider could
2216
+ never use its own configured budget.
2217
+
2218
+ Args:
2219
+ model_spec: The subagent's declared model string.
2220
+ cli_max_retries: The `--max-retries` flag value, or `None` when unset.
2221
+
2222
+ Returns:
2223
+ The concrete model prepared by dcode's model factory, or `None` when it
2224
+ cannot be built here and the caller should pass the spec through.
2225
+ """
2226
+ from deepagents_code.config import create_model
2227
+ from deepagents_code.model_config import MissingCredentialsError
2228
+
2229
+ try:
2230
+ return create_model(model_spec, cli_max_retries=cli_max_retries).model
2231
+ except MissingCredentialsError:
2232
+ # Taking ownership of retries is an optimization, not a precondition for
2233
+ # launching. A subagent declaring a provider the user has not
2234
+ # authenticated must not abort the whole CLI: pass the spec through so
2235
+ # the credential error surfaces if and when that subagent runs.
2236
+ logger.debug(
2237
+ "Deferring model resolution for %r: no provider credentials yet",
2238
+ model_spec,
2239
+ )
2240
+ return None
2241
+
2242
+
2243
+ def _has_resolvable_model_provider(model_spec: str) -> bool:
2244
+ """Return whether dcode can resolve the provider before graph construction."""
2245
+ from deepagents_code.config import detect_provider
2246
+ from deepagents_code.model_config import ModelSpec
2247
+
2248
+ return (
2249
+ ModelSpec.try_parse(model_spec) is not None
2250
+ or detect_provider(model_spec) is not None
2251
+ )
2252
+
2253
+
2207
2254
  def get_skill_sources(
2208
2255
  assistant_id: str = DEFAULT_AGENT_NAME,
2209
2256
  project_context: ProjectContext | None = None,
@@ -2299,6 +2346,8 @@ def create_cli_agent(
2299
2346
  async_subagents: list[AsyncSubAgent] | None = None,
2300
2347
  goal_criteria_tools: Sequence[BaseTool | Callable[..., Any]] | None = None,
2301
2348
  rubric_grader_tools: Sequence[BaseTool | Callable[..., Any]] | None = None,
2349
+ model_retries: int = DEFAULT_MODEL_RETRIES,
2350
+ cli_max_retries: int | None = None,
2302
2351
  enforce_model_policy: bool = True,
2303
2352
  ) -> tuple[Pregel[Any, Any, Any, Any], CompositeBackend]:
2304
2353
  """Create a CLI-configured agent with flexible options.
@@ -2448,6 +2497,12 @@ def create_cli_agent(
2448
2497
  rubric_grader_tools: External read-only context tools available to rubric
2449
2498
  grading for verifying work completed in MCP-backed or web-accessible
2450
2499
  systems.
2500
+ model_retries: Model-node retry attempts after the first call. `0`
2501
+ disables retries. Resolved upstream from config/CLI.
2502
+ cli_max_retries: The `--max-retries` flag value, or `None` when unset.
2503
+ Forwarded to subagent, Auto classifier, and runtime offload models
2504
+ so each one resolves its own provider's configured budget unless the
2505
+ user overrode it globally.
2451
2506
  enforce_model_policy: Check every model string against `models.allowed`.
2452
2507
  Pass `False` **only** from callers that compile a graph they never
2453
2508
  invoke (tool enumeration), so a blocked subagent model degrades the
@@ -2468,10 +2523,9 @@ def create_cli_agent(
2468
2523
  without `auto_approve` or `interpreter_ptc_acknowledge_unsafe`.
2469
2524
  ModelNotAllowedError: When `model`, `auto_classifier_model`,
2470
2525
  `rubric_model`, or a subagent's frontmatter `model` is a string
2471
- outside the effective `models.allowed` policy. Model *strings* are
2472
- checked here because the SDK resolves them through
2473
- `init_chat_model`, bypassing `config.create_model`; a prebuilt
2474
- `BaseChatModel` came from a path that already checked.
2526
+ outside the effective `models.allowed` policy. Model strings are
2527
+ checked before dcode resolves them with provider retries disabled;
2528
+ a prebuilt `BaseChatModel` came from a path that already checked.
2475
2529
  """ # noqa: DOC502 - propagates from `ModelConfig.require_model_allowed`
2476
2530
  tools = tools or []
2477
2531
  mcp_tools = tuple(mcp_tools or ())
@@ -2542,7 +2596,12 @@ def create_cli_agent(
2542
2596
  if resolved_interrupt_on is not None:
2543
2597
  middleware.append(AsyncApprovalHITLMiddleware(resolved_interrupt_on))
2544
2598
  if not has_explicit_model:
2545
- middleware.append(ConfigurableModelMiddleware(persist_model_state=False))
2599
+ middleware.append(
2600
+ ConfigurableModelMiddleware(
2601
+ persist_model_state=False,
2602
+ cli_max_retries=cli_max_retries,
2603
+ )
2604
+ )
2546
2605
  # Checkpoint nested spend before HITL can pause the subgraph, then hand
2547
2606
  # the completed delta back through owner-scoped state for the parent
2548
2607
  # graph to add to its durable total.
@@ -2552,6 +2611,9 @@ def create_cli_agent(
2552
2611
  # activates only for the measured Fireworks GLM-5.2 endpoint.
2553
2612
  if not interactive:
2554
2613
  middleware.append(_GlmTerminalStallRecovery())
2614
+ from deepagents_code.model_retry import CodeModelRetryMiddleware
2615
+
2616
+ middleware.append(CodeModelRetryMiddleware(max_retries=model_retries))
2555
2617
  if restrictive_shell_allow_list is not None:
2556
2618
  middleware.append(ShellAllowListMiddleware(restrictive_shell_allow_list))
2557
2619
  # Server-owned hooks must wrap subagent tools too; otherwise Pre/Post
@@ -2585,9 +2647,12 @@ def create_cli_agent(
2585
2647
  from deepagents_code._cli_context import INHERIT_CLASSIFIER_MODEL
2586
2648
  from deepagents_code.model_config import ModelConfig
2587
2649
 
2588
- # Every model *string* this function forwards is checked here, because the
2589
- # SDK resolves strings through `init_chat_model` without passing through
2590
- # `create_model` -- the gate in `config.create_model` never sees them. A
2650
+ # Every runtime model string is checked before it is resolved. Known providers
2651
+ # go through `create_model` here so the SDK retry loop is disabled before Deep
2652
+ # Agents builds the graph and every request carries dcode's retry metadata.
2653
+ # Graph-only tool enumeration leaves all strings to SDK assembly because it
2654
+ # never invokes them. Provider-less placeholders also remain strings because
2655
+ # dcode cannot identify a retry constructor parameter for them. A
2591
2656
  # `BaseChatModel` was already built by a checked path, so it is exempt.
2592
2657
  model_policy = ModelConfig.load()
2593
2658
  if not enforce_model_policy:
@@ -2601,6 +2666,12 @@ def create_cli_agent(
2601
2666
  )
2602
2667
  if isinstance(model, str):
2603
2668
  model_policy.require_model_allowed(model)
2669
+ if enforce_model_policy and _has_resolvable_model_provider(model):
2670
+ # `None` means credentials are absent: keep the spec so graph
2671
+ # construction resolves it later instead of failing the launch.
2672
+ resolved = _resolve_retry_owned_model(model, cli_max_retries)
2673
+ if resolved is not None:
2674
+ model = resolved
2604
2675
  if (
2605
2676
  isinstance(auto_classifier_model, str)
2606
2677
  and auto_classifier_model.strip()
@@ -2637,7 +2708,14 @@ def create_cli_agent(
2637
2708
  else f"subagent {name!r}"
2638
2709
  ),
2639
2710
  )
2640
- subagent["model"] = model_spec
2711
+ resolved_model = (
2712
+ _resolve_retry_owned_model(model_spec, cli_max_retries)
2713
+ if enforce_model_policy and _has_resolvable_model_provider(model_spec)
2714
+ else None
2715
+ )
2716
+ subagent["model"] = (
2717
+ resolved_model if resolved_model is not None else model_spec
2718
+ )
2641
2719
  subagent_middleware = _subagent_cli_middleware(
2642
2720
  has_explicit_model=has_explicit_model,
2643
2721
  )
@@ -2673,7 +2751,7 @@ def create_cli_agent(
2673
2751
 
2674
2752
  # Build middleware stack based on enabled features
2675
2753
  agent_middleware: list[AgentMiddleware[Any, Any]] = [
2676
- ConfigurableModelMiddleware(),
2754
+ ConfigurableModelMiddleware(cli_max_retries=cli_max_retries),
2677
2755
  ]
2678
2756
  if not interactive:
2679
2757
  agent_middleware.append(_GlmTerminalStallRecovery())
@@ -2935,7 +3013,11 @@ def create_cli_agent(
2935
3013
  routes={},
2936
3014
  )
2937
3015
 
2938
- compaction_middleware = _create_cli_compaction_middleware(model, composite_backend)
3016
+ compaction_middleware = _create_cli_compaction_middleware(
3017
+ model,
3018
+ composite_backend,
3019
+ cli_max_retries=cli_max_retries,
3020
+ )
2939
3021
  if auto_mode_config is not None and resolved_interrupt_on is not None:
2940
3022
  from deepagents_code.auto_mode import AutoModeHITLMiddleware
2941
3023
  from deepagents_code.config import resolve_auto_classifier_model
@@ -2956,6 +3038,7 @@ def create_cli_agent(
2956
3038
  worktree_root=trusted_root,
2957
3039
  shell_allow_list=narrow_allow_list,
2958
3040
  classifier_model=classifier_model,
3041
+ cli_max_retries=cli_max_retries,
2959
3042
  classifier_timeout_seconds=resolve_auto_classifier_timeout(),
2960
3043
  trusted_ask_user_tool=trusted_ask_user_tool,
2961
3044
  trusted_compaction_tool=compaction_middleware.tools[0],
@@ -3049,14 +3132,29 @@ def create_cli_agent(
3049
3132
  context_tools=goal_criteria_tools,
3050
3133
  auto_mode_enabled=auto_mode_enabled,
3051
3134
  fs_tools=fs_tools,
3135
+ model_retries=model_retries,
3136
+ cli_max_retries=cli_max_retries,
3137
+ )
3138
+ criteria_fallback_agent = create_goal_criteria_fallback_agent(
3139
+ model=model,
3140
+ model_retries=model_retries,
3141
+ cli_max_retries=cli_max_retries,
3052
3142
  )
3053
- criteria_fallback_agent = create_goal_criteria_fallback_agent(model=model)
3054
3143
  agent_middleware.append(
3055
3144
  GoalCriteriaMiddleware(criteria_agent, criteria_fallback_agent)
3056
3145
  )
3057
3146
 
3058
3147
  agent_middleware.append(compaction_middleware)
3059
3148
 
3149
+ # Model-node retry sits inside side-effecting automatic compaction so a
3150
+ # failed provider attempt repeats only the final model handler, not summary
3151
+ # generation or the archive append. Keep it in the stack when the startup
3152
+ # budget is zero because a runtime `/model` switch may select a provider
3153
+ # with a non-zero request-time budget.
3154
+ from deepagents_code.model_retry import CodeModelRetryMiddleware
3155
+
3156
+ agent_middleware.append(CodeModelRetryMiddleware(max_retries=model_retries))
3157
+
3060
3158
  grader_context_tools = _normalize_rubric_grader_context_tools(
3061
3159
  rubric_grader_tools or ()
3062
3160
  )
@@ -3097,6 +3195,12 @@ def create_cli_agent(
3097
3195
  )
3098
3196
 
3099
3197
  grader_middleware: list[AgentMiddleware[Any, Any]] = [
3198
+ # Both clients filter this nested message stream. A transient fault can
3199
+ # safely retry the failed model node without replaying grader tools.
3200
+ CodeModelRetryMiddleware(
3201
+ max_retries=model_retries,
3202
+ stream_output_is_visible=False,
3203
+ ),
3100
3204
  _ContextToolCallBudgetMiddleware(
3101
3205
  # `read_file` is bounded separately by the grader's in-tool
3102
3206
  # working-directory counter, which excludes offloaded-result reads.
@@ -3131,6 +3235,12 @@ def create_cli_agent(
3131
3235
  # a policy check here would instead advise a fully qualified spec.
3132
3236
  if isinstance(rubric_model, str) and rubric_model.strip():
3133
3237
  model_policy.require_model_allowed(rubric_model)
3238
+ if enforce_model_policy and _has_resolvable_model_provider(rubric_model):
3239
+ resolved_rubric_model = _resolve_retry_owned_model(
3240
+ rubric_model, cli_max_retries
3241
+ )
3242
+ if resolved_rubric_model is not None:
3243
+ rubric_model = resolved_rubric_model
3134
3244
 
3135
3245
  # Rubric-driven self-evaluation. The middleware is a no-op until a
3136
3246
  # `rubric` is supplied on invocation state, so installing it is safe.