deepagents-code 0.1.67__tar.gz → 0.1.68__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 (547) hide show
  1. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/CHANGELOG.md +14 -0
  2. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/PKG-INFO +2 -2
  3. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/_build_info.py +1 -1
  4. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/_env_vars.py +3 -0
  5. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/_version.py +1 -1
  6. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/app.py +106 -51
  7. deepagents_code-0.1.68/deepagents_code/bundled_prices.json +39 -0
  8. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/client/remote_client.py +20 -7
  9. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/cold_cache.py +103 -40
  10. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/configurable_model.py +18 -5
  11. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/offload_api.py +46 -23
  12. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/sessions.py +11 -9
  13. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/theme.py +2 -0
  14. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/cwd_switch.py +28 -2
  15. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/model_selector.py +6 -5
  16. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/thread_selector.py +2 -2
  17. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/pyproject.toml +2 -2
  18. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_app.py +358 -27
  19. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_cold_cache.py +110 -1
  20. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_configurable_model.py +107 -4
  21. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_offload_api.py +35 -0
  22. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_theme.py +9 -0
  23. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/widgets/test_cwd_switch.py +36 -1
  24. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/uv.lock +6 -6
  25. deepagents_code-0.1.67/deepagents_code/bundled_prices.json +0 -21
  26. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/.gitignore +0 -0
  27. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/AGENTS.md +0 -0
  28. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/ARCHITECTURE.md +0 -0
  29. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/COMMANDS.md +0 -0
  30. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/DEVELOPMENT.md +0 -0
  31. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/EXTENSIONS.md +0 -0
  32. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/HOOKS.md +0 -0
  33. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/LICENSE +0 -0
  34. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/Makefile +0 -0
  35. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/PRICING.md +0 -0
  36. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/README.md +0 -0
  37. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/THREAT_MODEL.md +0 -0
  38. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/__init__.py +0 -0
  39. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/__main__.py +0 -0
  40. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/_ask_user_types.py +0 -0
  41. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/_cli_context.py +0 -0
  42. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/_constants.py +0 -0
  43. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/_content_blocks.py +0 -0
  44. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/_debug.py +0 -0
  45. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/_debug_buffer.py +0 -0
  46. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/_dep_floor_check.py +0 -0
  47. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/_fake_models.py +0 -0
  48. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/_git.py +0 -0
  49. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/_glm_5p2_profile.py +0 -0
  50. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/_home_error.py +0 -0
  51. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/_invocation.py +0 -0
  52. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/_markdown.py +0 -0
  53. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/_paths.py +0 -0
  54. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/_repository_bounds.py +0 -0
  55. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/_reserved_names.py +0 -0
  56. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/_server_config.py +0 -0
  57. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/_session_stats.py +0 -0
  58. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/_startup_error.py +0 -0
  59. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/_terminal_stderr.py +0 -0
  60. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/_testing_models.py +0 -0
  61. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/_textual_patches.py +0 -0
  62. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/_tool_stream.py +0 -0
  63. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/_tracing.py +0 -0
  64. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/acp.py +0 -0
  65. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/agent.py +0 -0
  66. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/app.tcss +0 -0
  67. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/approval_mode.py +0 -0
  68. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/ask_user.py +0 -0
  69. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/auth_display.py +0 -0
  70. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/auth_store.py +0 -0
  71. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/auto_mode.py +0 -0
  72. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/built_in_skills/__init__.py +0 -0
  73. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/built_in_skills/deepagents-thread-inspector/SKILL.md +0 -0
  74. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/built_in_skills/deepagents-thread-inspector/scripts/inspect_sessions.py +0 -0
  75. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/built_in_skills/remember/SKILL.md +0 -0
  76. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/built_in_skills/skill-creator/SKILL.md +0 -0
  77. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/built_in_skills/skill-creator/scripts/init_skill.py +0 -0
  78. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/built_in_skills/skill-creator/scripts/quick_validate.py +0 -0
  79. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/bundled_prices.README.md +0 -0
  80. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/client/__init__.py +0 -0
  81. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/client/commands/__init__.py +0 -0
  82. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/client/commands/auth.py +0 -0
  83. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/client/commands/config.py +0 -0
  84. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/client/commands/extras.py +0 -0
  85. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/client/commands/mcp.py +0 -0
  86. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/client/commands/tools.py +0 -0
  87. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/client/launch/__init__.py +0 -0
  88. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/client/launch/server.py +0 -0
  89. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/client/launch/server_manager.py +0 -0
  90. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/client/non_interactive.py +0 -0
  91. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/clipboard.py +0 -0
  92. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/command_registry.py +0 -0
  93. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/config.py +0 -0
  94. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/config_manifest.py +0 -0
  95. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/configuration/__init__.py +0 -0
  96. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/configuration/interpreter.py +0 -0
  97. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/configuration/paths.py +0 -0
  98. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/configuration/provider.py +0 -0
  99. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/configuration/providers.py +0 -0
  100. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/configuration/resolver.py +0 -0
  101. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/configuration/service.py +0 -0
  102. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/configuration/theme_resolution.py +0 -0
  103. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/configuration/types.py +0 -0
  104. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/configuration/writer.py +0 -0
  105. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/context_doctor.py +0 -0
  106. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/cost_tracking.py +0 -0
  107. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/default_agent_prompt.md +0 -0
  108. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/diff_utils.py +0 -0
  109. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/doctor.py +0 -0
  110. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/editor.py +0 -0
  111. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/event_bus.py +0 -0
  112. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/extensions/__init__.py +0 -0
  113. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/extensions/api.py +0 -0
  114. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/extensions/discovery.py +0 -0
  115. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/extensions/hosting.py +0 -0
  116. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/extensions/loader.py +0 -0
  117. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/extensions/registry.py +0 -0
  118. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/extensions/runtime.py +0 -0
  119. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/extensions/settings.py +0 -0
  120. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/extensions/trust.py +0 -0
  121. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/extras_info.py +0 -0
  122. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/file_ops.py +0 -0
  123. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/formatting.py +0 -0
  124. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/goal_rubric.py +0 -0
  125. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/goal_state_limits.py +0 -0
  126. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/goal_state_notice.py +0 -0
  127. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/goal_tools.py +0 -0
  128. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/hooks/__init__.py +0 -0
  129. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/hooks/capabilities.py +0 -0
  130. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/hooks/client.py +0 -0
  131. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/hooks/client_lifecycle.py +0 -0
  132. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/hooks/context.py +0 -0
  133. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/hooks/engine.py +0 -0
  134. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/hooks/env.py +0 -0
  135. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/hooks/envelope.py +0 -0
  136. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/hooks/interrupt.py +0 -0
  137. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/hooks/legacy.py +0 -0
  138. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/hooks/loading.py +0 -0
  139. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/hooks/manager.py +0 -0
  140. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/hooks/migration.py +0 -0
  141. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/hooks/models/__init__.py +0 -0
  142. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/hooks/models/adapters.py +0 -0
  143. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/hooks/models/config.py +0 -0
  144. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/hooks/models/domain.py +0 -0
  145. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/hooks/models/transport.py +0 -0
  146. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/hooks/models/wire.py +0 -0
  147. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/hooks/permissions.py +0 -0
  148. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/hooks/presenter.py +0 -0
  149. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/hooks/projection.py +0 -0
  150. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/hooks/reducer.py +0 -0
  151. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/hooks/runner.py +0 -0
  152. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/hooks/runtime.py +0 -0
  153. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/hooks/server_middleware.py +0 -0
  154. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/hooks/snapshot.py +0 -0
  155. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/hooks/tools.py +0 -0
  156. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/hooks/transcript.py +0 -0
  157. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/hooks/trust.py +0 -0
  158. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/hooks/validate_terminal_sequence.py +0 -0
  159. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/input.py +0 -0
  160. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/integrations/__init__.py +0 -0
  161. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/integrations/openai_codex.py +0 -0
  162. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/integrations/sandbox_config.py +0 -0
  163. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/integrations/sandbox_factory.py +0 -0
  164. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/integrations/sandbox_provider.py +0 -0
  165. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/integrations/sandbox_registry.py +0 -0
  166. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/iterm_cursor_guide.py +0 -0
  167. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/json_types.py +0 -0
  168. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/local_context.py +0 -0
  169. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/main.py +0 -0
  170. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/managed_tools.py +0 -0
  171. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/mcp_auth.py +0 -0
  172. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/mcp_config.py +0 -0
  173. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/mcp_disabled.py +0 -0
  174. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/mcp_login_service.py +0 -0
  175. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/mcp_oauth_ui.py +0 -0
  176. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/mcp_providers/__init__.py +0 -0
  177. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/mcp_providers/_registry.py +0 -0
  178. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/mcp_providers/base.py +0 -0
  179. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/mcp_providers/github.py +0 -0
  180. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/mcp_providers/slack.py +0 -0
  181. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/mcp_tools.py +0 -0
  182. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/media_utils.py +0 -0
  183. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/memory_guard.py +0 -0
  184. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/model_config.py +0 -0
  185. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/model_retry.py +0 -0
  186. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/notifications.py +0 -0
  187. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/offload.py +0 -0
  188. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/offload_middleware.py +0 -0
  189. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/onboarding.py +0 -0
  190. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/output.py +0 -0
  191. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/paste_collapse.py +0 -0
  192. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/plugins/__init__.py +0 -0
  193. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/plugins/_json.py +0 -0
  194. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/plugins/adapters/__init__.py +0 -0
  195. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/plugins/adapters/hooks.py +0 -0
  196. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/plugins/adapters/mcp.py +0 -0
  197. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/plugins/adapters/skills.py +0 -0
  198. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/plugins/adapters/skills_middleware.py +0 -0
  199. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/plugins/commands_cli.py +0 -0
  200. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/plugins/discovery.py +0 -0
  201. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/plugins/manifest.py +0 -0
  202. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/plugins/marketplace.py +0 -0
  203. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/plugins/models.py +0 -0
  204. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/plugins/store.py +0 -0
  205. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/plugins/substitution.py +0 -0
  206. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/project_utils.py +0 -0
  207. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/py.typed +0 -0
  208. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/reasoning_effort.py +0 -0
  209. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/reliable_rubric.py +0 -0
  210. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/resume_state.py +0 -0
  211. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/server_graph.py +0 -0
  212. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/skills/__init__.py +0 -0
  213. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/skills/commands.py +0 -0
  214. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/skills/invocation.py +0 -0
  215. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/skills/load.py +0 -0
  216. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/skills/merge.py +0 -0
  217. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/skills/trust.py +0 -0
  218. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/state_migration.py +0 -0
  219. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/subagents.py +0 -0
  220. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/system_prompt.md +0 -0
  221. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/terminal_capabilities.py +0 -0
  222. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/terminal_escape.py +0 -0
  223. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tool_catalog.py +0 -0
  224. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tool_display.py +0 -0
  225. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tools.py +0 -0
  226. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/__init__.py +0 -0
  227. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/key_hints.py +0 -0
  228. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/modals/__init__.py +0 -0
  229. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/modals/cold_cache.py +0 -0
  230. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/modals/model_switch.py +0 -0
  231. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/modals/plugin_manager/__init__.py +0 -0
  232. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/modals/plugin_manager/content.py +0 -0
  233. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/modals/plugin_manager/models.py +0 -0
  234. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/modals/plugin_manager/plugin_manager.tcss +0 -0
  235. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/modals/plugin_manager/state.py +0 -0
  236. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/modals/plugin_manager/tabs.py +0 -0
  237. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/modals/prompt_clipboard.py +0 -0
  238. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/modals/prompt_clipboard.tcss +0 -0
  239. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/modals/resume_blocked.py +0 -0
  240. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/modals/resume_compact.py +0 -0
  241. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/screens/__init__.py +0 -0
  242. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/textual_adapter.py +0 -0
  243. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/__init__.py +0 -0
  244. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/_copy_spans.py +0 -0
  245. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/_inline_prompt.py +0 -0
  246. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/_js_eval_display.py +0 -0
  247. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/_links.py +0 -0
  248. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/_paste_textarea.py +0 -0
  249. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/agent_selector.py +0 -0
  250. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/approval.py +0 -0
  251. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/ask_user.py +0 -0
  252. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/auth.py +0 -0
  253. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/auto_mode_notice.py +0 -0
  254. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/autocomplete.py +0 -0
  255. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/chat_input.py +0 -0
  256. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/codex_auth.py +0 -0
  257. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/context_usage.py +0 -0
  258. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/debug_console.py +0 -0
  259. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/diff.py +0 -0
  260. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/effort_selector.py +0 -0
  261. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/goal_review.py +0 -0
  262. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/goal_status.py +0 -0
  263. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/history.py +0 -0
  264. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/install_confirm.py +0 -0
  265. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/launch_init.py +0 -0
  266. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/loading.py +0 -0
  267. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/mcp_login.py +0 -0
  268. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/mcp_reconnect.py +0 -0
  269. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/mcp_viewer.py +0 -0
  270. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/message_store.py +0 -0
  271. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/messages.py +0 -0
  272. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/notification_center.py +0 -0
  273. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/notification_detail.py +0 -0
  274. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/notification_settings.py +0 -0
  275. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/prompt_search.py +0 -0
  276. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/restart_prompt.py +0 -0
  277. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/skill_trust.py +0 -0
  278. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/startup_tip.py +0 -0
  279. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/status.py +0 -0
  280. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/subagent_panel.py +0 -0
  281. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/theme_selector.py +0 -0
  282. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/thread_agent_switch.py +0 -0
  283. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/tool_renderers.py +0 -0
  284. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/tool_widgets.py +0 -0
  285. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/update_available.py +0 -0
  286. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/update_confirm.py +0 -0
  287. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/update_progress.py +0 -0
  288. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/welcome.py +0 -0
  289. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/tui/widgets/yolo_mode_notice.py +0 -0
  290. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/ui.py +0 -0
  291. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/unicode_security.py +0 -0
  292. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/update_check.py +0 -0
  293. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/deepagents_code/workspace.py +0 -0
  294. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/examples/extensions/memory_store.py +0 -0
  295. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/examples/skills/arxiv-search/SKILL.md +0 -0
  296. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/examples/skills/arxiv-search/arxiv_search.py +0 -0
  297. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/examples/skills/langgraph-docs/SKILL.md +0 -0
  298. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/examples/skills/skill-creator/SKILL.md +0 -0
  299. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/examples/skills/skill-creator/scripts/init_skill.py +0 -0
  300. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/examples/skills/skill-creator/scripts/quick_validate.py +0 -0
  301. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/examples/skills/web-research/SKILL.md +0 -0
  302. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/hatch_build.py +0 -0
  303. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/images/model-stream-retry.png +0 -0
  304. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/images/tui.png +0 -0
  305. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/scripts/check_imports.py +0 -0
  306. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/scripts/check_process_cwd.py +0 -0
  307. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/scripts/debug_server.sh +0 -0
  308. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/scripts/generate_commands_catalog.py +0 -0
  309. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/scripts/install.sh +0 -0
  310. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/README.md +0 -0
  311. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/integration_tests/__init__.py +0 -0
  312. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/integration_tests/benchmarks/__init__.py +0 -0
  313. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/integration_tests/benchmarks/test_codspeed_import_benchmarks.py +0 -0
  314. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/integration_tests/benchmarks/test_local_context_benchmarks.py +0 -0
  315. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/integration_tests/benchmarks/test_startup_benchmarks.py +0 -0
  316. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/integration_tests/conftest.py +0 -0
  317. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/integration_tests/test_acp_mode.py +0 -0
  318. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/integration_tests/test_auto_approve_remote.py +0 -0
  319. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/integration_tests/test_compact_resume.py +0 -0
  320. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/integration_tests/test_offload_server_side.py +0 -0
  321. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/integration_tests/test_pending_work_recovery.py +0 -0
  322. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/integration_tests/test_sandbox_factory.py +0 -0
  323. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/integration_tests/test_sandbox_operations.py +0 -0
  324. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/__init__.py +0 -0
  325. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/client/__init__.py +0 -0
  326. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/client/commands/__init__.py +0 -0
  327. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/client/commands/test_auth.py +0 -0
  328. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/client/commands/test_extras.py +0 -0
  329. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/client/commands/test_mcp.py +0 -0
  330. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/client/commands/test_tools.py +0 -0
  331. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/conftest.py +0 -0
  332. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/data/coding_agent_v1_validator.json +0 -0
  333. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/hooks/__init__.py +0 -0
  334. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/hooks/models/__init__.py +0 -0
  335. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/hooks/models/test_models.py +0 -0
  336. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/hooks/test_client_lifecycle.py +0 -0
  337. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/hooks/test_configuration.py +0 -0
  338. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/hooks/test_engine.py +0 -0
  339. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/hooks/test_execution.py +0 -0
  340. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/hooks/test_manager.py +0 -0
  341. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/hooks/test_presenter.py +0 -0
  342. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/hooks/test_server_lifecycle.py +0 -0
  343. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/hooks/test_transcript.py +0 -0
  344. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/hooks/test_trust.py +0 -0
  345. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/plugins/__init__.py +0 -0
  346. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/plugins/test_marketplace.py +0 -0
  347. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/plugins/test_plugin_hooks.py +0 -0
  348. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/plugins/test_plugins_p0.py +0 -0
  349. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/skills/__init__.py +0 -0
  350. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/skills/test_commands.py +0 -0
  351. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/skills/test_load.py +0 -0
  352. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/skills/test_merge.py +0 -0
  353. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/skills/test_skill_trust.py +0 -0
  354. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/skills/test_skills_json.py +0 -0
  355. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/skills/test_thread_inspector.py +0 -0
  356. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/smoke_tests/__init__.py +0 -0
  357. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/smoke_tests/conftest.py +0 -0
  358. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/smoke_tests/snapshots/system_prompt_interactive_local.md +0 -0
  359. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/smoke_tests/test_system_prompt.py +0 -0
  360. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test__tool_stream.py +0 -0
  361. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_acp.py +0 -0
  362. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_agent.py +0 -0
  363. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_agent_friendly.py +0 -0
  364. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_approval_mode.py +0 -0
  365. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_args.py +0 -0
  366. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_ask_user_middleware.py +0 -0
  367. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_ask_user_types.py +0 -0
  368. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_auth_display.py +0 -0
  369. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_auth_store.py +0 -0
  370. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_auth_web_search_restart.py +0 -0
  371. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_auto_mode.py +0 -0
  372. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_charset.py +0 -0
  373. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_cli_provider.py +0 -0
  374. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_clipboard.py +0 -0
  375. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_coding_agent_metadata.py +0 -0
  376. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_command_registry.py +0 -0
  377. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_compact_tool.py +0 -0
  378. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_config.py +0 -0
  379. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_config_manifest.py +0 -0
  380. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_configuration.py +0 -0
  381. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_configuration_resolution.py +0 -0
  382. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_configuration_resolver.py +0 -0
  383. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_context_doctor.py +0 -0
  384. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_cost_tracking.py +0 -0
  385. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_cursor_style.py +0 -0
  386. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_debug.py +0 -0
  387. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_debug_buffer.py +0 -0
  388. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_debug_console.py +0 -0
  389. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_dep_floor_check.py +0 -0
  390. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_diff_utils.py +0 -0
  391. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_doctor.py +0 -0
  392. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_editor.py +0 -0
  393. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_end_to_end.py +0 -0
  394. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_env_vars.py +0 -0
  395. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_event_bus.py +0 -0
  396. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_exception_handling.py +0 -0
  397. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_extension_api.py +0 -0
  398. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_extension_cli_trust.py +0 -0
  399. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_extension_config_manifest.py +0 -0
  400. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_extension_discovery.py +0 -0
  401. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_extension_display.py +0 -0
  402. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_extension_host_runtime.py +0 -0
  403. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_extension_hosting.py +0 -0
  404. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_extension_runtime.py +0 -0
  405. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_extra_skills_dirs.py +0 -0
  406. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_extras_info.py +0 -0
  407. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_file_ops.py +0 -0
  408. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_formatting.py +0 -0
  409. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_git.py +0 -0
  410. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_glm_5p2_profile.py +0 -0
  411. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_goal_criteria_client.py +0 -0
  412. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_goal_rubric.py +0 -0
  413. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_goal_state_limits.py +0 -0
  414. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_goal_state_notice.py +0 -0
  415. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_goal_state_persistence.py +0 -0
  416. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_goal_tools.py +0 -0
  417. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_hatch_build.py +0 -0
  418. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_hooks.py +0 -0
  419. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_imports.py +0 -0
  420. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_input_parsing.py +0 -0
  421. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_install_command.py +0 -0
  422. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_install_script.py +0 -0
  423. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_invocation.py +0 -0
  424. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_iterm_cursor_guide.py +0 -0
  425. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_json_types.py +0 -0
  426. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_local_context.py +0 -0
  427. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_main.py +0 -0
  428. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_main_acp_mode.py +0 -0
  429. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_main_args.py +0 -0
  430. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_managed_tools.py +0 -0
  431. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_mcp_auth.py +0 -0
  432. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_mcp_config.py +0 -0
  433. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_mcp_disabled.py +0 -0
  434. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_mcp_login_service.py +0 -0
  435. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_mcp_oauth_ui.py +0 -0
  436. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_mcp_tools.py +0 -0
  437. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_media_utils.py +0 -0
  438. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_memory_guard.py +0 -0
  439. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_model_config.py +0 -0
  440. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_model_retry.py +0 -0
  441. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_model_switch.py +0 -0
  442. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_non_interactive.py +0 -0
  443. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_notifications.py +0 -0
  444. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_offload.py +0 -0
  445. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_onboarding.py +0 -0
  446. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_openai_codex_integration.py +0 -0
  447. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_output.py +0 -0
  448. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_paths.py +0 -0
  449. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_process_cwd_check.py +0 -0
  450. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_reasoning_effort.py +0 -0
  451. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_reliable_rubric.py +0 -0
  452. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_reload.py +0 -0
  453. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_remote_client.py +0 -0
  454. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_repository_bounds.py +0 -0
  455. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_resume_compaction_recovery.py +0 -0
  456. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_resume_state.py +0 -0
  457. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_rubric_cli.py +0 -0
  458. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_sandbox_config.py +0 -0
  459. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_sandbox_factory.py +0 -0
  460. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_sandbox_provider.py +0 -0
  461. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_sandbox_registry.py +0 -0
  462. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_server.py +0 -0
  463. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_server_config.py +0 -0
  464. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_server_graph.py +0 -0
  465. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_server_helpers.py +0 -0
  466. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_server_manager.py +0 -0
  467. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_server_tracing.py +0 -0
  468. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_session_stats.py +0 -0
  469. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_sessions.py +0 -0
  470. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_shell_allow_list.py +0 -0
  471. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_skill_invocation.py +0 -0
  472. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_startup_fast_paths.py +0 -0
  473. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_state_migration.py +0 -0
  474. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_subagents.py +0 -0
  475. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_terminal_capabilities.py +0 -0
  476. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_terminal_escape.py +0 -0
  477. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_terminal_progress_preference.py +0 -0
  478. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_terminal_stderr.py +0 -0
  479. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_textual_patches.py +0 -0
  480. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_threads_resume.py +0 -0
  481. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_tool_catalog.py +0 -0
  482. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_tool_display.py +0 -0
  483. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_tracing.py +0 -0
  484. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_tracing_replicas.py +0 -0
  485. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_transcript_virtualization.py +0 -0
  486. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_ui.py +0 -0
  487. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_unicode_security.py +0 -0
  488. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_uninstall_command.py +0 -0
  489. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_update_check.py +0 -0
  490. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_version.py +0 -0
  491. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/test_workspace.py +0 -0
  492. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tools/__init__.py +0 -0
  493. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tools/test_current_thread.py +0 -0
  494. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tools/test_fetch_url.py +0 -0
  495. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tools/test_tool_arg_schemas.py +0 -0
  496. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tools/test_web_search.py +0 -0
  497. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/__init__.py +0 -0
  498. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/modals/__init__.py +0 -0
  499. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/modals/plugin_manager/__init__.py +0 -0
  500. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/modals/plugin_manager/test_structure.py +0 -0
  501. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/modals/test_cold_cache.py +0 -0
  502. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/modals/test_model_switch.py +0 -0
  503. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/modals/test_prompt_clipboard.py +0 -0
  504. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/modals/test_resume_blocked.py +0 -0
  505. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/test_key_hints.py +0 -0
  506. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/test_modal_footer_layout.py +0 -0
  507. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/test_subagent_stream.py +0 -0
  508. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/test_textual_adapter.py +0 -0
  509. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/widgets/__init__.py +0 -0
  510. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/widgets/test_agent_selector.py +0 -0
  511. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/widgets/test_approval.py +0 -0
  512. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/widgets/test_ask_user.py +0 -0
  513. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/widgets/test_auth_widgets.py +0 -0
  514. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/widgets/test_auto_mode_notice.py +0 -0
  515. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/widgets/test_autocomplete.py +0 -0
  516. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/widgets/test_chat_input.py +0 -0
  517. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/widgets/test_copy_spans.py +0 -0
  518. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/widgets/test_diff.py +0 -0
  519. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/widgets/test_goal_review.py +0 -0
  520. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/widgets/test_history.py +0 -0
  521. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/widgets/test_inline_prompt.py +0 -0
  522. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/widgets/test_install_confirm.py +0 -0
  523. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/widgets/test_launch_init.py +0 -0
  524. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/widgets/test_links.py +0 -0
  525. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/widgets/test_loading.py +0 -0
  526. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/widgets/test_mcp_login_modal.py +0 -0
  527. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/widgets/test_mcp_reconnect.py +0 -0
  528. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/widgets/test_mcp_viewer.py +0 -0
  529. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/widgets/test_message_store.py +0 -0
  530. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/widgets/test_messages.py +0 -0
  531. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/widgets/test_model_selector.py +0 -0
  532. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/widgets/test_notification_center.py +0 -0
  533. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/widgets/test_notification_detail.py +0 -0
  534. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/widgets/test_notification_settings.py +0 -0
  535. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/widgets/test_prompt_search.py +0 -0
  536. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/widgets/test_restart_prompt.py +0 -0
  537. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/widgets/test_skill_trust_screen.py +0 -0
  538. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/widgets/test_startup_tip.py +0 -0
  539. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/widgets/test_status.py +0 -0
  540. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/widgets/test_subagent_panel.py +0 -0
  541. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/widgets/test_thread_agent_switch.py +0 -0
  542. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/widgets/test_thread_selector.py +0 -0
  543. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/widgets/test_tool_renderers.py +0 -0
  544. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/widgets/test_update_available.py +0 -0
  545. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/widgets/test_update_confirm.py +0 -0
  546. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/widgets/test_update_progress.py +0 -0
  547. {deepagents_code-0.1.67 → deepagents_code-0.1.68}/tests/unit_tests/tui/widgets/test_welcome.py +0 -0
@@ -2,6 +2,20 @@
2
2
 
3
3
  # Deep Agents Code Changelog
4
4
 
5
+ ## [0.1.68](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.67...deepagents-code==0.1.68) (2026-09-10)
6
+
7
+ ### Features
8
+
9
+ - Recommended GLM 5.3 models are now available in code workflows ([#6211](https://github.com/langchain-ai/deepagents/pull/6211)).
10
+
11
+ ### Bug Fixes
12
+
13
+ - Added pricing support for Fireworks GLM-5.3 and GLM-5.3 Flash usage ([#6221](https://github.com/langchain-ai/deepagents/pull/6221), [#6223](https://github.com/langchain-ai/deepagents/pull/6223)).
14
+ - Workspace switches now ask for confirmation before restarting the server ([#6178](https://github.com/langchain-ai/deepagents/pull/6178)).
15
+ - Effort changes are now included in cache identity for OpenAI and Anthropic requests ([#6196](https://github.com/langchain-ai/deepagents/pull/6196)).
16
+ - Standardized the recent-thread environment variable ([#6205](https://github.com/langchain-ai/deepagents/pull/6205)).
17
+ - Silenced warnings when the themes config is absent ([#6220](https://github.com/langchain-ai/deepagents/pull/6220)).
18
+
5
19
  ## [0.1.67](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.66...deepagents-code==0.1.67) (2026-09-09)
6
20
 
7
21
  ### Features
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: deepagents-code
3
- Version: 0.1.67
3
+ Version: 0.1.68
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
@@ -44,7 +44,7 @@ Requires-Dist: langgraph-checkpoint-sqlite<4.0.0,>=3.1.1
44
44
  Requires-Dist: langgraph-cli[inmem]<1.0.0,>=0.4.31
45
45
  Requires-Dist: langgraph-runtime-inmem<1.0.0,>=0.34.0
46
46
  Requires-Dist: langgraph-sdk<1.0.0,>=0.4.4
47
- Requires-Dist: langsmith[sandbox]>=0.12.2
47
+ Requires-Dist: langsmith[sandbox]>=0.12.3
48
48
  Requires-Dist: markdownify<2.0.0,>=1.2.3
49
49
  Requires-Dist: mcp<2.0.0,>=1.28.1
50
50
  Requires-Dist: packaging>=26.2
@@ -1,3 +1,3 @@
1
1
  """Generated at build time. Do not edit or commit."""
2
2
 
3
- BUILD_COMMIT = "d0fbc7c"
3
+ BUILD_COMMIT = "1c477e9"
@@ -506,6 +506,9 @@ hostile values the dotenv denylist does not yet enumerate. The global
506
506
  repo file, so a project `.env` cannot disable itself.
507
507
  """
508
508
 
509
+ RECENT_THREADS = "DEEPAGENTS_CODE_RECENT_THREADS"
510
+ """Maximum number of recent threads loaded and displayed (default: 20)."""
511
+
509
512
  RECURSION_LIMIT = "DEEPAGENTS_CODE_RECURSION_LIMIT"
510
513
  """Override the main agent's LangGraph `recursion_limit` (graph step budget).
511
514
 
@@ -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.67" # x-release-please-version
5
+ __version__ = "0.1.68" # 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."""
@@ -873,6 +873,14 @@ class _ServerRespawnResult:
873
873
  """
874
874
 
875
875
 
876
+ @dataclass(frozen=True)
877
+ class _CwdServerReuseResult:
878
+ """Server decision for a destination workspace."""
879
+
880
+ outcome: Literal["continue", "abort", "restart"]
881
+ workspace_snapshot: tuple[str | None, dict[str, dict[str, Any]]] | None = None
882
+
883
+
876
884
  def _format_mcp_server_changes(
877
885
  previous: list[MCPServerInfo] | None,
878
886
  current: list[MCPServerInfo] | None,
@@ -9218,7 +9226,7 @@ class DeepAgentsApp(App):
9218
9226
  type(raw_endpoint).__name__,
9219
9227
  )
9220
9228
 
9221
- def _stamp_cache_identity_locally(self) -> None:
9229
+ async def _stamp_cache_identity_locally(self) -> None:
9222
9230
  """Record the just-run model as the cache identity, without a checkpoint.
9223
9231
 
9224
9232
  Used when a turn reached the model but ended without a readable
@@ -9231,16 +9239,14 @@ class DeepAgentsApp(App):
9231
9239
  """
9232
9240
  from datetime import UTC, datetime
9233
9241
 
9234
- from deepagents_code.cold_cache import cache_identity_params
9242
+ from deepagents_code.configurable_model import _effective_cache_params
9235
9243
 
9236
9244
  self._last_model_request_at = datetime.now(UTC).isoformat()
9237
9245
  self._last_cache_model_spec = self._effective_model_spec() or ""
9238
- # Record only the cache-identity projection of the session overrides,
9239
- # matching what the middleware checkpoints in `_last_cache_params`:
9240
- # the comparison side filters through `cache_identity_params` too, so
9241
- # unrelated knobs must not read as a cache change here either.
9242
- self._last_cache_model_params = (
9243
- cache_identity_params(self._model_params_override) or None
9246
+ self._last_cache_model_params = await asyncio.to_thread(
9247
+ _effective_cache_params,
9248
+ self._last_cache_model_spec,
9249
+ self._model_params_override,
9244
9250
  )
9245
9251
 
9246
9252
  async def _sync_session_cost_from_checkpoint(self) -> None:
@@ -11911,6 +11917,7 @@ class DeepAgentsApp(App):
11911
11917
  parse_cache_timestamp,
11912
11918
  resolve_prompt_cache_policy,
11913
11919
  )
11920
+ from deepagents_code.config import _compose_openai_reasoning_effort
11914
11921
  from deepagents_code.model_config import (
11915
11922
  ModelConfig,
11916
11923
  is_warning_suppressed,
@@ -11941,6 +11948,14 @@ class DeepAgentsApp(App):
11941
11948
  fallback_base_url = config.get_base_url(provider)
11942
11949
  if isinstance(fallback_base_url, str):
11943
11950
  current_params["base_url"] = fallback_base_url
11951
+ # Match model construction before projecting the cache identity.
11952
+ overrides = self._model_params_override or {}
11953
+ current_params = _compose_openai_reasoning_effort(
11954
+ provider,
11955
+ current_params,
11956
+ overrides.get("reasoning_effort"),
11957
+ overrides.get("reasoning"),
11958
+ )
11944
11959
  # Endpoint changes have their own normalized identity. Keeping
11945
11960
  # `base_url` out of this mapping avoids treating the same endpoint
11946
11961
  # as two independent identity changes.
@@ -12042,11 +12057,13 @@ class DeepAgentsApp(App):
12042
12057
  age_seconds = max(elapsed or 0.0, 0.0)
12043
12058
  if (
12044
12059
  model_spec != last_spec
12045
- # Only cache-participating params are compared: `/effort`
12046
- # and friends rewrite `model_params` without touching the
12047
- # prefix, and must not read as a cache identity change.
12048
- or cache_identity_params(current_params)
12049
- != cache_identity_params(last_params)
12060
+ # Only cache-participating params are compared. OpenAI and
12061
+ # Anthropic reasoning-effort settings participate because
12062
+ # both providers render effort into the prefix: OpenAI may
12063
+ # rewrite model-side instructions, Anthropic always renders
12064
+ # the thinking config into the prompt.
12065
+ or cache_identity_params(current_params, model_spec=model_spec)
12066
+ != cache_identity_params(last_params, model_spec=last_spec)
12050
12067
  # `None` means no endpoint was ever recorded -- e.g. a
12051
12068
  # thread checkpointed before this field existed, or one
12052
12069
  # whose stored value was unreadable and discarded on load.
@@ -18777,7 +18794,7 @@ class DeepAgentsApp(App):
18777
18794
  # the in-memory request time. Leaving it stale would make the
18778
18795
  # very next send report "no record of when this thread last
18779
18796
  # reached the model" seconds after a turn that plainly did.
18780
- self._stamp_cache_identity_locally()
18797
+ await self._stamp_cache_identity_locally()
18781
18798
  # Finalize any subagent rows left "running" — an interrupt cancels
18782
18799
  # the worker before the bridge emits terminal events (a cancel is a
18783
18800
  # BaseException, which the bridge's `except Exception` skips), so the
@@ -29109,23 +29126,18 @@ class DeepAgentsApp(App):
29109
29126
 
29110
29127
  async def _reuse_server_after_cwd_switch(
29111
29128
  self, cwd: Path, thread_id: str
29112
- ) -> Literal["continue", "abort", "restart"]:
29129
+ ) -> _CwdServerReuseResult:
29113
29130
  remote = self._remote_agent()
29114
- if remote is None or self._sandbox_type is not None:
29115
- return "restart"
29131
+ if remote is None:
29132
+ return _CwdServerReuseResult("restart")
29116
29133
  from langgraph_sdk.errors import ConflictError
29117
29134
 
29118
- previous_cwd = Path(self._cwd)
29119
- previous_server_cwd = (
29120
- self._server_kwargs.get("cwd") if self._server_kwargs is not None else None
29121
- )
29122
- previous_mcp_info = self._mcp_server_info
29123
29135
  workspace_snapshot = remote._snapshot_workspace()
29124
29136
  config: RunnableConfig = {"configurable": {"thread_id": thread_id}}
29125
29137
  try:
29126
- mcp_info = await remote.aswitch_workspace(config, str(cwd))
29138
+ await remote.aswitch_workspace(config, str(cwd), validate_only=True)
29127
29139
  except ConflictError:
29128
- return "restart"
29140
+ return _CwdServerReuseResult("restart")
29129
29141
  except Exception as exc:
29130
29142
  logger.exception("Server could not validate the destination workspace")
29131
29143
  self.notify(
@@ -29135,21 +29147,33 @@ class DeepAgentsApp(App):
29135
29147
  timeout=10,
29136
29148
  markup=False,
29137
29149
  )
29138
- return "abort"
29150
+ return _CwdServerReuseResult("abort")
29151
+ return _CwdServerReuseResult(
29152
+ "continue",
29153
+ workspace_snapshot=workspace_snapshot,
29154
+ )
29155
+
29156
+ async def _apply_reused_server_cwd_switch(
29157
+ self, cwd: Path, thread_id: str, reuse: _CwdServerReuseResult
29158
+ ) -> None:
29159
+ remote = self._remote_agent()
29160
+ if remote is None or reuse.workspace_snapshot is None:
29161
+ msg = "A validated workspace switch has no remote workspace snapshot."
29162
+ raise RuntimeError(msg)
29163
+ previous_cwd = Path(self._cwd)
29164
+ previous_server_cwd = (
29165
+ self._server_kwargs.get("cwd") if self._server_kwargs is not None else None
29166
+ )
29167
+ previous_mcp_info = self._mcp_server_info
29168
+ config: RunnableConfig = {"configurable": {"thread_id": thread_id}}
29139
29169
  try:
29140
29170
  self._preserve_launch_relative_server_paths(previous_cwd)
29141
29171
  await self._switch_process_cwd(cwd)
29142
29172
  if self._server_kwargs is not None:
29143
29173
  self._server_kwargs["cwd"] = self._cwd
29144
- self._mcp_server_info = mcp_info
29145
- self._mcp_optimistic_original_server_info.clear()
29146
- self._pending_mcp_login_reconnect = False
29147
- self._pending_mcp_disable_reconnect_servers.clear()
29148
- self._mcp_viewer_disable_toggled = False
29149
- self._sync_pending_mcp_reconnect()
29150
- self._refresh_mcp_client_state()
29174
+ mcp_server_info = await remote.aswitch_workspace(config, str(cwd))
29151
29175
  except BaseException:
29152
- remote._restore_workspace(workspace_snapshot)
29176
+ remote._restore_workspace(reuse.workspace_snapshot)
29153
29177
  self._mcp_server_info = previous_mcp_info
29154
29178
  if self._server_kwargs is not None:
29155
29179
  self._server_kwargs["cwd"] = previous_server_cwd
@@ -29159,8 +29183,16 @@ class DeepAgentsApp(App):
29159
29183
  await self._switch_process_cwd(previous_cwd)
29160
29184
  self._refresh_mcp_client_state()
29161
29185
  raise
29162
- else:
29163
- return "continue"
29186
+ self._mcp_server_info = mcp_server_info
29187
+ self._mcp_optimistic_original_server_info.clear()
29188
+ self._pending_mcp_login_reconnect = False
29189
+ self._pending_mcp_disable_reconnect_servers.clear()
29190
+ self._mcp_viewer_disable_toggled = False
29191
+ self._sync_pending_mcp_reconnect()
29192
+ try:
29193
+ self._refresh_mcp_client_state()
29194
+ except Exception:
29195
+ logger.exception("Failed to refresh MCP state after cwd switch")
29164
29196
 
29165
29197
  @staticmethod
29166
29198
  async def _preview_project_settings_change(cwd: Path) -> bool:
@@ -29345,6 +29377,9 @@ class DeepAgentsApp(App):
29345
29377
  failed (the caller should stop the resume). The user-declined
29346
29378
  abort fires only when `abort` is set, and the switch-failed
29347
29379
  abort only when `restart_server` is True.
29380
+
29381
+ Raises:
29382
+ RuntimeError: If an in-session switch has no server decision.
29348
29383
  """
29349
29384
  target = await self._thread_cwd_mismatch(thread_id)
29350
29385
  if target is None:
@@ -29352,8 +29387,21 @@ class DeepAgentsApp(App):
29352
29387
 
29353
29388
  from deepagents_code.tui.widgets.cwd_switch import CwdSwitchPromptScreen
29354
29389
 
29355
- project_settings_change_detected = await self._preview_project_settings_change(
29356
- target
29390
+ reuse = (
29391
+ await self._reuse_server_after_cwd_switch(target, thread_id)
29392
+ if restart_server
29393
+ else None
29394
+ )
29395
+ if reuse is not None and reuse.outcome == "abort":
29396
+ return "abort"
29397
+ owns_server = self._server_kwargs is not None and self._server_proc is not None
29398
+ server_refusal: Literal["restart", "unavailable"] | None = None
29399
+ if reuse is not None and reuse.outcome == "restart":
29400
+ server_refusal = "restart" if owns_server else "unavailable"
29401
+ project_settings_change_detected = (
29402
+ await self._preview_project_settings_change(target)
29403
+ if server_refusal is None
29404
+ else False
29357
29405
  )
29358
29406
  choice = await self._push_screen_wait(
29359
29407
  CwdSwitchPromptScreen(
@@ -29361,27 +29409,30 @@ class DeepAgentsApp(App):
29361
29409
  thread_cwd=str(target),
29362
29410
  project_settings_change_detected=project_settings_change_detected,
29363
29411
  abort=abort,
29412
+ server_refusal=server_refusal,
29364
29413
  )
29365
29414
  )
29415
+ if server_refusal == "unavailable":
29416
+ return "abort"
29417
+ if server_refusal == "restart" and choice != "switch":
29418
+ return "abort"
29366
29419
  if choice == "abort":
29420
+ if reuse is not None and reuse.workspace_snapshot is not None:
29421
+ remote = self._remote_agent()
29422
+ if remote is not None:
29423
+ remote._restore_workspace(reuse.workspace_snapshot)
29367
29424
  return "abort"
29368
29425
  if choice == "switch":
29369
29426
  if restart_server:
29370
- reuse_outcome = await self._reuse_server_after_cwd_switch(
29371
- target, thread_id
29372
- )
29373
- outcome = (
29374
- await self._replace_server_after_cwd_switch(target)
29375
- if reuse_outcome == "restart"
29376
- else reuse_outcome
29377
- )
29427
+ if reuse is None:
29428
+ msg = "An in-session cwd switch has no server decision."
29429
+ raise RuntimeError(msg)
29430
+ outcome = reuse.outcome
29431
+ if outcome == "restart":
29432
+ outcome = await self._replace_server_after_cwd_switch(target)
29433
+ elif outcome == "continue":
29434
+ await self._apply_reused_server_cwd_switch(target, thread_id, reuse)
29378
29435
  if outcome == "abort":
29379
- # A failed restart returns "abort" just like a user-declined
29380
- # abort, so the caller cannot tell them apart.
29381
- # `_replace_server_after_cwd_switch` already rolled back and
29382
- # notified, but that toast is transient -- leave a persistent
29383
- # in-chat record so a failed switch is not mistaken for a
29384
- # deliberate cancel.
29385
29436
  await self._mount_message(
29386
29437
  AppMessage(
29387
29438
  "Could not switch to the thread's directory; staying "
@@ -29399,6 +29450,10 @@ class DeepAgentsApp(App):
29399
29450
  )
29400
29451
  return "continue"
29401
29452
 
29453
+ if reuse is not None and reuse.workspace_snapshot is not None:
29454
+ remote = self._remote_agent()
29455
+ if remote is not None:
29456
+ remote._restore_workspace(reuse.workspace_snapshot)
29402
29457
  self.notify(
29403
29458
  "Continuing in the current directory. Cached local context may be "
29404
29459
  "stale and tools may operate in the wrong project.",
@@ -0,0 +1,39 @@
1
+ [
2
+ {
3
+ "id": "openai",
4
+ "name": "OpenAI",
5
+ "api_pattern": "https://api\\.openai\\.com",
6
+ "models": [
7
+ {
8
+ "id": "gpt-6-astra",
9
+ "match": { "or": [{ "equals": "gpt-6-astra" }, { "regex": "^gpt-6-astra-\\d{4}-\\d{2}-\\d{2}$" }] },
10
+ "price_comments": "Stopgap pending release of merged pydantic/genai-prices#680",
11
+ "prices": {
12
+ "input_mtok": { "base": 10.0, "tiers": [{ "start": 271999, "price": 20.0 }] },
13
+ "cache_write_mtok": { "base": 12.5, "tiers": [{ "start": 271999, "price": 25.0 }] },
14
+ "cache_read_mtok": { "base": 1.0, "tiers": [{ "start": 271999, "price": 2.0 }] },
15
+ "output_mtok": { "base": 50.0, "tiers": [{ "start": 271999, "price": 75.0 }] }
16
+ }
17
+ }
18
+ ]
19
+ },
20
+ {
21
+ "id": "baseten",
22
+ "name": "Baseten",
23
+ "api_pattern": "https://inference\\.baseten\\.co",
24
+ "models": [
25
+ { "id": "zai-org/GLM-4.7", "match": { "equals": "glm-4-7" }, "price_comments": "Bare alias omitted from pydantic/genai-prices#660", "prices": { "input_mtok": 0.6, "cache_read_mtok": 0.12, "output_mtok": 2.2 } },
26
+ { "id": "thinkingmachines/inkling", "match": { "equals": "inkling" }, "price_comments": "Bare alias omitted from pydantic/genai-prices#660", "prices": { "input_mtok": 1.0, "cache_read_mtok": 0.17, "output_mtok": 4.05 } },
27
+ { "id": "thinkingmachines/inkling-small", "match": { "equals": "inkling-small" }, "price_comments": "Bare alias omitted from pydantic/genai-prices#660", "prices": { "input_mtok": 0.5, "cache_read_mtok": 0.1, "output_mtok": 1.2 } }
28
+ ]
29
+ },
30
+ {
31
+ "id": "fireworks",
32
+ "name": "Fireworks",
33
+ "api_pattern": "https://api\\.fireworks\\.ai",
34
+ "models": [
35
+ { "id": "glm-5p3", "match": { "equals": "accounts/fireworks/models/glm-5p3" }, "price_comments": "Fireworks deployment omitted from pydantic/genai-prices#617", "prices": { "input_mtok": 1.4, "cache_read_mtok": 0.26, "output_mtok": 4.4 } },
36
+ { "id": "glm-5p3-flash", "match": { "equals": "accounts/fireworks/models/glm-5p3-flash" }, "price_comments": "Fireworks deployment omitted from pydantic/genai-prices#617", "prices": { "input_mtok": 0.15, "cache_read_mtok": 0.03, "output_mtok": 0.5 } }
37
+ ]
38
+ }
39
+ ]
@@ -803,10 +803,16 @@ class RemoteAgent:
803
803
  return await self.abind_workspace(config, self._workspace_cwd)
804
804
 
805
805
  async def _request_workspace(
806
- self, config: Mapping[str, Any], cwd: str
806
+ self,
807
+ config: Mapping[str, Any],
808
+ cwd: str,
809
+ *,
810
+ validate_only: bool = False,
807
811
  ) -> tuple[dict[str, Any], list[MCPServerInfo] | None]:
808
812
  thread_id = _require_thread_id(config)
809
813
  payload: dict[str, Any] = {"cwd": cwd}
814
+ if validate_only:
815
+ payload["validate_only"] = True
810
816
  if self._workspace_config is not None:
811
817
  payload["workspace_config"] = self._workspace_config
812
818
  payload["config_fingerprint"] = self._workspace_config_fingerprint
@@ -874,18 +880,25 @@ class RemoteAgent:
874
880
  self._workspaces.update(workspaces)
875
881
 
876
882
  async def aswitch_workspace(
877
- self, config: Mapping[str, Any], cwd: str
883
+ self,
884
+ config: Mapping[str, Any],
885
+ cwd: str,
886
+ *,
887
+ validate_only: bool = False,
878
888
  ) -> list[MCPServerInfo] | None:
879
- """Bind one thread to a workspace and make it the default for new threads.
889
+ """Bind or validate one thread's workspace and return MCP metadata.
880
890
 
881
891
  Returns:
882
892
  MCP metadata for the server runtime selected by the binding.
883
893
  """
884
894
  thread_id = _require_thread_id(config)
885
- workspace, mcp_server_info = await self._request_workspace(config, cwd)
886
- self._workspace_cwd = cwd
887
- self._workspaces.clear()
888
- self._workspaces[thread_id] = workspace
895
+ workspace, mcp_server_info = await self._request_workspace(
896
+ config, cwd, validate_only=validate_only
897
+ )
898
+ if not validate_only:
899
+ self._workspace_cwd = cwd
900
+ self._workspaces.clear()
901
+ self._workspaces[thread_id] = workspace
889
902
  return mcp_server_info
890
903
 
891
904
  def set_workspace(
@@ -76,12 +76,14 @@ CACHE_IDENTITY_PARAM_KEYS = frozenset(
76
76
  )
77
77
  """Invocation params that select or invalidate a provider cache entry.
78
78
 
79
- The identity check compares only these. Comparing whole `model_params` maps
80
- instead would report a model change for every unrelated knob -- `/effort`
81
- rewrites `reasoning_effort` wholesale, and `temperature` or `max_tokens` are
82
- just as inert for caching -- and the modal would then assert that "the previous
83
- cached prefix cannot be reused" when nothing about the prefix moved. A modal
84
- that fires on a false premise trains users into the permanent suppression.
79
+ The identity check compares only these, plus the provider's reasoning-effort
80
+ settings where a change is documented to move the cached prefix (see
81
+ `_EFFORT_CACHE_IDENTITY_PROVIDERS`). Comparing whole `model_params` maps
82
+ instead would report a model change for every unrelated knob -- `temperature`
83
+ or `max_tokens`, for example -- and the modal would then assert that "the
84
+ previous cached prefix cannot be reused" when nothing about the prefix moved.
85
+ A modal that fires on a false premise trains users into the permanent
86
+ suppression.
85
87
 
86
88
  `cache_control` is deliberately absent: `AnthropicPromptCachingMiddleware`
87
89
  overwrites `model_settings["cache_control"]` with its own TTL on every
@@ -90,6 +92,28 @@ user-supplied value never reaches the wire. Comparing it would report an
90
92
  identity change for a setting the effective requests never differed on.
91
93
  """
92
94
 
95
+ _EFFORT_CACHE_IDENTITY_PROVIDERS = frozenset({"openai", "openai_codex", "anthropic"})
96
+ """Providers whose reasoning-effort settings participate in cache identity.
97
+
98
+ OpenAI documents `reasoning.effort` as a setting that "can change model-side
99
+ reasoning instructions" for its models generally -- the GPT-6 Astra
100
+ `configuration_update` escape hatch exists precisely because the top-level
101
+ knob rewrites the hidden prefix -- and pre-GPT-5.6 minimum cacheable lengths
102
+ vary with request settings including reasoning effort:
103
+ https://developers.openai.com/api/docs/guides/prompt-caching
104
+
105
+ Anthropic is stricter: the thinking/effort configuration is rendered into the
106
+ prompt, so changing it always invalidates message blocks:
107
+ https://platform.claude.com/docs/en/build-with-claude/prompt-caching
108
+
109
+ Other providers (`google_genai`, `fireworks`, `xai`, ...) document no link
110
+ between effort and cache identity, so their effort settings stay out of the
111
+ projection: including them would fire the modal on a false premise.
112
+ `openai_codex` resolves no cache policy today (`resolve_prompt_cache_policy`
113
+ gates on the `openai` provider), so its entries matter only for checkpointed
114
+ storage until that changes.
115
+ """
116
+
93
117
  _OPENAI_MODEL_VERSION = re.compile(r"^gpt-(?P<major>\d+)(?:\.(?P<minor>\d+))?")
94
118
  _DEFAULT_ENDPOINT_PORTS = {"http": 80, "https": 443}
95
119
 
@@ -865,23 +889,24 @@ def resolve_prompt_cache_policy(
865
889
  if provider != "openai" or not endpoint_ok("api.openai.com"):
866
890
  return None
867
891
 
868
- # Write pricing follows the model version, independent of retention: only
869
- # GPT-5.6+ bills a miss as a cache write.
870
- write_bucket: CacheWriteBucket = (
871
- "generic_write" if _openai_uses_thirty_minute_cache(model_name) else "generic"
872
- )
892
+ # GPT-5.6+ uses `prompt_cache_options.ttl = "30m"`; the legacy
893
+ # `prompt_cache_retention` knob does not extend that family to one or 24
894
+ # hours. OpenAI documents 30 minutes as a guaranteed minimum, so the prefix
895
+ # may still be warm after this window.
896
+ # https://developers.openai.com/api/docs/guides/prompt-caching
897
+ if _openai_uses_thirty_minute_cache(model_name):
898
+ return PromptCachePolicy(
899
+ provider_name="OpenAI",
900
+ window_seconds=1800,
901
+ confidence="may_be_cold",
902
+ minimum_tokens=_OPENAI_MINIMUM_TOKENS,
903
+ write_bucket="generic_write",
904
+ )
873
905
 
874
906
  # `in_memory` and `24h` are documented *maximums* ("up to one hour", "a
875
907
  # maximum, not a guarantee"): entries may be evicted earlier, so a warning
876
908
  # is only defensible once the maximum has passed -- at which point the
877
909
  # entry is gone rather than merely doubtful.
878
- #
879
- # Checked before the GPT-5.6+ minimum because the two knobs are
880
- # independent: `prompt_cache_retention` states a maximum lifetime while the
881
- # 5.6+ guarantee states a minimum one, and an explicitly configured
882
- # retention is the later, firmer bound. Warning a user who asked for `24h`
883
- # at the 30-minute mark would contradict their own configuration.
884
- # https://platform.openai.com/docs/guides/prompt-caching
885
910
  retention = params.get("prompt_cache_retention")
886
911
  retention_windows = {"in_memory": 3600, "24h": 86400}
887
912
  window = retention_windows.get(retention) if isinstance(retention, str) else None
@@ -891,41 +916,79 @@ def resolve_prompt_cache_policy(
891
916
  window_seconds=window,
892
917
  confidence="expired",
893
918
  minimum_tokens=_OPENAI_MINIMUM_TOKENS,
894
- write_bucket=write_bucket,
895
- )
896
-
897
- if write_bucket == "generic_write":
898
- # 30 minutes is the documented guaranteed *minimum* for GPT-5.6+ with
899
- # no explicit retention configured, but OpenAI may retain the prefix
900
- # longer, so past the window it can only be treated as possibly cold.
901
- # https://platform.openai.com/docs/guides/prompt-caching
902
- return PromptCachePolicy(
903
- provider_name="OpenAI",
904
- window_seconds=1800,
905
- confidence="may_be_cold",
906
- minimum_tokens=_OPENAI_MINIMUM_TOKENS,
907
- write_bucket=write_bucket,
919
+ write_bucket="generic",
908
920
  )
909
921
  return None
910
922
 
911
923
 
912
- def cache_identity_params(model_params: Mapping[str, Any] | None) -> dict[str, Any]:
924
+ _EFFORT_IDENTITY_KEY = "reasoning_effort"
925
+ """Checkpoint key the effective effort value is projected under.
926
+
927
+ Canonical rather than request-shaped: the identity question is whether the
928
+ effort value changed, not which request shape carried it. Storing the native
929
+ shape would report an identity change for a flat-to-nested representation
930
+ swap that leaves the prefix untouched.
931
+ """
932
+
933
+
934
+ def _effort_identity_entries(
935
+ model_params: Mapping[str, Any], provider: str
936
+ ) -> dict[str, Any]:
937
+ """Project the provider's effective reasoning effort from `model_params`.
938
+
939
+ Uses the same path resolution and precedence as `/effort`
940
+ (`reasoning_effort._effort_paths`), so native request shapes -- OpenAI's
941
+ nested `reasoning: {"effort": ...}`, Anthropic's `output_config.effort`
942
+ -- participate alongside the canonical flat `reasoning_effort`. Sibling
943
+ keys in nested containers (`reasoning.summary`, say) stay out: they are
944
+ not documented to move the prefix, and including them would fire the
945
+ modal on a false premise.
946
+
947
+ Args:
948
+ model_params: Full invocation params.
949
+ provider: Lowercase provider name from the model spec.
950
+
951
+ Returns:
952
+ `{_EFFORT_IDENTITY_KEY: value}` when an effort setting is present and
953
+ non-`None`, or `{}` when the provider has none configured.
954
+ """
955
+ from deepagents_code.reasoning_effort import _effort_paths
956
+
957
+ for path in _effort_paths(provider):
958
+ if len(path) == 1:
959
+ if path[0] in model_params and model_params[path[0]] is not None:
960
+ return {_EFFORT_IDENTITY_KEY: model_params[path[0]]}
961
+ else:
962
+ nested = model_params.get(path[0])
963
+ if isinstance(nested, dict) and nested.get(path[1]) is not None:
964
+ return {_EFFORT_IDENTITY_KEY: nested[path[1]]}
965
+ return {}
966
+
967
+
968
+ def cache_identity_params(
969
+ model_params: Mapping[str, Any] | None,
970
+ *,
971
+ model_spec: str | None = None,
972
+ ) -> dict[str, Any]:
913
973
  """Project the params that participate in prompt-cache identity.
914
974
 
915
975
  Args:
916
976
  model_params: Full invocation params, or `None`.
977
+ model_spec: Optional `provider:model` spec used for model-specific keys.
917
978
 
918
979
  Returns:
919
- Only the `CACHE_IDENTITY_PARAM_KEYS` entries present, so two calls can
920
- be compared without unrelated knobs reading as a cache change.
980
+ Cache-identity entries, excluding unrelated invocation knobs.
921
981
  """
922
982
  if not model_params:
923
983
  return {}
924
- return {
925
- key: value
926
- for key, value in model_params.items()
927
- if key in CACHE_IDENTITY_PARAM_KEYS
928
- }
984
+ keys = CACHE_IDENTITY_PARAM_KEYS
985
+ if model_spec:
986
+ provider = model_spec.partition(":")[0].strip().lower()
987
+ if provider in _EFFORT_CACHE_IDENTITY_PROVIDERS:
988
+ result = {key: value for key, value in model_params.items() if key in keys}
989
+ result.update(_effort_identity_entries(model_params, provider))
990
+ return result
991
+ return {key: value for key, value in model_params.items() if key in keys}
929
992
 
930
993
 
931
994
  def estimate_rewarm_cost(