deepagents-code 0.1.52__tar.gz → 0.1.53__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 (471) hide show
  1. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/.gitignore +3 -1
  2. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/ARCHITECTURE.md +2 -0
  3. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/CHANGELOG.md +18 -0
  4. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/HOOKS.md +3 -2
  5. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/PKG-INFO +5 -5
  6. deepagents_code-0.1.53/PRICING.md +105 -0
  7. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/_ask_user_types.py +5 -3
  8. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/_build_info.py +1 -1
  9. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/_version.py +1 -1
  10. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/app.py +198 -38
  11. deepagents_code-0.1.53/deepagents_code/bundled_prices.README.md +80 -0
  12. deepagents_code-0.1.53/deepagents_code/bundled_prices.json +21 -0
  13. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/command_registry.py +20 -2
  14. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/config.py +173 -0
  15. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/config_manifest.py +16 -0
  16. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/cost_tracking.py +690 -3
  17. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/hooks/capabilities.py +16 -0
  18. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/hooks/models/domain.py +21 -0
  19. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/hooks/models/wire.py +21 -0
  20. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/hooks/projection.py +22 -0
  21. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/hooks/reducer.py +19 -0
  22. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/hooks/server_middleware.py +62 -21
  23. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/hooks/snapshot.py +6 -1
  24. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/main.py +180 -36
  25. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/offload_middleware.py +4 -2
  26. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/sessions.py +86 -21
  27. deepagents_code-0.1.53/deepagents_code/tui/modals/resume_compact.py +121 -0
  28. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/textual_adapter.py +24 -4
  29. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/update_check.py +141 -22
  30. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/pyproject.toml +18 -5
  31. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/scripts/install.sh +698 -73
  32. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/conftest.py +33 -0
  33. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/hooks/test_engine.py +40 -3
  34. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/hooks/test_server_lifecycle.py +29 -10
  35. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_app.py +214 -14
  36. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_coding_agent_metadata.py +22 -0
  37. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_command_registry.py +16 -0
  38. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_compact_tool.py +3 -8
  39. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_config.py +322 -1
  40. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_cost_tracking.py +1029 -0
  41. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_end_to_end.py +0 -1
  42. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_install_script.py +1048 -37
  43. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_main.py +325 -25
  44. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_sessions.py +111 -1
  45. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_threads_resume.py +6 -2
  46. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_update_check.py +155 -0
  47. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tui/test_textual_adapter.py +229 -4
  48. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/uv.lock +7 -7
  49. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/AGENTS.md +0 -0
  50. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/COMMANDS.md +0 -0
  51. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/DEVELOPMENT.md +0 -0
  52. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/LICENSE +0 -0
  53. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/Makefile +0 -0
  54. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/README.md +0 -0
  55. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/THREAT_MODEL.md +0 -0
  56. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/__init__.py +0 -0
  57. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/__main__.py +0 -0
  58. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/_cli_context.py +0 -0
  59. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/_constants.py +0 -0
  60. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/_debug.py +0 -0
  61. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/_debug_buffer.py +0 -0
  62. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/_env_vars.py +0 -0
  63. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/_fake_models.py +0 -0
  64. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/_git.py +0 -0
  65. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/_glm_5p2_profile.py +0 -0
  66. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/_invocation.py +0 -0
  67. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/_markdown.py +0 -0
  68. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/_paths.py +0 -0
  69. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/_repository_bounds.py +0 -0
  70. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/_server_config.py +0 -0
  71. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/_session_stats.py +0 -0
  72. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/_startup_error.py +0 -0
  73. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/_testing_models.py +0 -0
  74. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/_textual_patches.py +0 -0
  75. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/_tool_stream.py +0 -0
  76. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/agent.py +0 -0
  77. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/app.tcss +0 -0
  78. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/approval_mode.py +0 -0
  79. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/ask_user.py +0 -0
  80. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/auth_display.py +0 -0
  81. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/auth_store.py +0 -0
  82. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/auto_mode.py +0 -0
  83. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/built_in_skills/__init__.py +0 -0
  84. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/built_in_skills/deepagents-thread-inspector/SKILL.md +0 -0
  85. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/built_in_skills/deepagents-thread-inspector/scripts/inspect_sessions.py +0 -0
  86. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/built_in_skills/remember/SKILL.md +0 -0
  87. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/built_in_skills/skill-creator/SKILL.md +0 -0
  88. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/built_in_skills/skill-creator/scripts/init_skill.py +0 -0
  89. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/built_in_skills/skill-creator/scripts/quick_validate.py +0 -0
  90. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/client/__init__.py +0 -0
  91. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/client/commands/__init__.py +0 -0
  92. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/client/commands/auth.py +0 -0
  93. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/client/commands/config.py +0 -0
  94. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/client/commands/extras.py +0 -0
  95. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/client/commands/mcp.py +0 -0
  96. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/client/commands/tools.py +0 -0
  97. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/client/launch/__init__.py +0 -0
  98. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/client/launch/server.py +0 -0
  99. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/client/launch/server_manager.py +0 -0
  100. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/client/non_interactive.py +0 -0
  101. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/client/remote_client.py +0 -0
  102. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/clipboard.py +0 -0
  103. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/configurable_model.py +0 -0
  104. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/default_agent_prompt.md +0 -0
  105. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/doctor.py +0 -0
  106. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/editor.py +0 -0
  107. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/event_bus.py +0 -0
  108. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/extras_info.py +0 -0
  109. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/file_ops.py +0 -0
  110. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/formatting.py +0 -0
  111. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/goal_rubric.py +0 -0
  112. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/goal_state_notice.py +0 -0
  113. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/goal_tools.py +0 -0
  114. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/hooks/__init__.py +0 -0
  115. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/hooks/client.py +0 -0
  116. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/hooks/client_lifecycle.py +0 -0
  117. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/hooks/context.py +0 -0
  118. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/hooks/engine.py +0 -0
  119. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/hooks/env.py +0 -0
  120. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/hooks/envelope.py +0 -0
  121. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/hooks/interrupt.py +0 -0
  122. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/hooks/legacy.py +0 -0
  123. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/hooks/loading.py +0 -0
  124. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/hooks/manager.py +0 -0
  125. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/hooks/migration.py +0 -0
  126. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/hooks/models/__init__.py +0 -0
  127. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/hooks/models/adapters.py +0 -0
  128. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/hooks/models/config.py +0 -0
  129. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/hooks/models/transport.py +0 -0
  130. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/hooks/permissions.py +0 -0
  131. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/hooks/presenter.py +0 -0
  132. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/hooks/runner.py +0 -0
  133. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/hooks/runtime.py +0 -0
  134. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/hooks/tools.py +0 -0
  135. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/hooks/transcript.py +0 -0
  136. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/hooks/trust.py +0 -0
  137. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/hooks/validate_terminal_sequence.py +0 -0
  138. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/input.py +0 -0
  139. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/integrations/__init__.py +0 -0
  140. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/integrations/openai_codex.py +0 -0
  141. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/integrations/sandbox_config.py +0 -0
  142. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/integrations/sandbox_factory.py +0 -0
  143. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/integrations/sandbox_provider.py +0 -0
  144. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/integrations/sandbox_registry.py +0 -0
  145. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/iterm_cursor_guide.py +0 -0
  146. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/json_types.py +0 -0
  147. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/local_context.py +0 -0
  148. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/managed_tools.py +0 -0
  149. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/mcp_auth.py +0 -0
  150. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/mcp_config.py +0 -0
  151. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/mcp_disabled.py +0 -0
  152. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/mcp_login_service.py +0 -0
  153. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/mcp_oauth_ui.py +0 -0
  154. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/mcp_providers/__init__.py +0 -0
  155. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/mcp_providers/_registry.py +0 -0
  156. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/mcp_providers/base.py +0 -0
  157. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/mcp_providers/github.py +0 -0
  158. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/mcp_providers/slack.py +0 -0
  159. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/mcp_tools.py +0 -0
  160. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/media_utils.py +0 -0
  161. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/memory_guard.py +0 -0
  162. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/model_config.py +0 -0
  163. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/notifications.py +0 -0
  164. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/offload.py +0 -0
  165. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/onboarding.py +0 -0
  166. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/output.py +0 -0
  167. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/paste_collapse.py +0 -0
  168. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/plugins/__init__.py +0 -0
  169. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/plugins/_json.py +0 -0
  170. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/plugins/adapters/__init__.py +0 -0
  171. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/plugins/adapters/hooks.py +0 -0
  172. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/plugins/adapters/mcp.py +0 -0
  173. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/plugins/adapters/skills.py +0 -0
  174. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/plugins/adapters/skills_middleware.py +0 -0
  175. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/plugins/commands_cli.py +0 -0
  176. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/plugins/discovery.py +0 -0
  177. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/plugins/manifest.py +0 -0
  178. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/plugins/marketplace.py +0 -0
  179. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/plugins/models.py +0 -0
  180. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/plugins/store.py +0 -0
  181. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/plugins/substitution.py +0 -0
  182. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/project_utils.py +0 -0
  183. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/py.typed +0 -0
  184. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/reasoning_effort.py +0 -0
  185. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/reliable_rubric.py +0 -0
  186. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/resume_state.py +0 -0
  187. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/server_graph.py +0 -0
  188. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/skills/__init__.py +0 -0
  189. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/skills/commands.py +0 -0
  190. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/skills/invocation.py +0 -0
  191. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/skills/load.py +0 -0
  192. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/skills/merge.py +0 -0
  193. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/skills/trust.py +0 -0
  194. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/state_migration.py +0 -0
  195. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/subagents.py +0 -0
  196. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/system_prompt.md +0 -0
  197. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/terminal_capabilities.py +0 -0
  198. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/terminal_escape.py +0 -0
  199. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/theme.py +0 -0
  200. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tool_catalog.py +0 -0
  201. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tool_display.py +0 -0
  202. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tools.py +0 -0
  203. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/__init__.py +0 -0
  204. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/modals/__init__.py +0 -0
  205. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/modals/plugin_manager/__init__.py +0 -0
  206. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/modals/plugin_manager/content.py +0 -0
  207. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/modals/plugin_manager/models.py +0 -0
  208. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/modals/plugin_manager/plugin_manager.tcss +0 -0
  209. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/modals/plugin_manager/state.py +0 -0
  210. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/modals/plugin_manager/tabs.py +0 -0
  211. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/screens/__init__.py +0 -0
  212. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/widgets/__init__.py +0 -0
  213. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/widgets/_copy_spans.py +0 -0
  214. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/widgets/_inline_prompt.py +0 -0
  215. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/widgets/_js_eval_display.py +0 -0
  216. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/widgets/_links.py +0 -0
  217. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/widgets/_paste_textarea.py +0 -0
  218. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/widgets/agent_selector.py +0 -0
  219. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/widgets/approval.py +0 -0
  220. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/widgets/ask_user.py +0 -0
  221. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/widgets/auth.py +0 -0
  222. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/widgets/auto_mode_notice.py +0 -0
  223. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/widgets/autocomplete.py +0 -0
  224. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/widgets/chat_input.py +0 -0
  225. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/widgets/codex_auth.py +0 -0
  226. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/widgets/cwd_switch.py +0 -0
  227. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/widgets/debug_console.py +0 -0
  228. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/widgets/diff.py +0 -0
  229. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/widgets/effort_selector.py +0 -0
  230. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/widgets/goal_review.py +0 -0
  231. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/widgets/goal_status.py +0 -0
  232. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/widgets/history.py +0 -0
  233. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/widgets/install_confirm.py +0 -0
  234. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/widgets/launch_init.py +0 -0
  235. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/widgets/loading.py +0 -0
  236. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/widgets/mcp_login.py +0 -0
  237. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/widgets/mcp_reconnect.py +0 -0
  238. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/widgets/mcp_viewer.py +0 -0
  239. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/widgets/message_store.py +0 -0
  240. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/widgets/messages.py +0 -0
  241. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/widgets/model_selector.py +0 -0
  242. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/widgets/notification_center.py +0 -0
  243. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/widgets/notification_detail.py +0 -0
  244. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/widgets/notification_settings.py +0 -0
  245. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/widgets/plugin_reload.py +0 -0
  246. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/widgets/restart_prompt.py +0 -0
  247. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/widgets/skill_trust.py +0 -0
  248. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/widgets/startup_tip.py +0 -0
  249. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/widgets/status.py +0 -0
  250. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/widgets/subagent_panel.py +0 -0
  251. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/widgets/theme_selector.py +0 -0
  252. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/widgets/thread_agent_switch.py +0 -0
  253. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/widgets/thread_selector.py +0 -0
  254. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/widgets/tool_renderers.py +0 -0
  255. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/widgets/tool_widgets.py +0 -0
  256. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/widgets/update_available.py +0 -0
  257. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/widgets/update_confirm.py +0 -0
  258. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/widgets/update_progress.py +0 -0
  259. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/widgets/welcome.py +0 -0
  260. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/tui/widgets/yolo_mode_notice.py +0 -0
  261. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/ui.py +0 -0
  262. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/deepagents_code/unicode_security.py +0 -0
  263. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/examples/skills/arxiv-search/SKILL.md +0 -0
  264. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/examples/skills/arxiv-search/arxiv_search.py +0 -0
  265. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/examples/skills/langgraph-docs/SKILL.md +0 -0
  266. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/examples/skills/skill-creator/SKILL.md +0 -0
  267. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/examples/skills/skill-creator/scripts/init_skill.py +0 -0
  268. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/examples/skills/skill-creator/scripts/quick_validate.py +0 -0
  269. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/examples/skills/web-research/SKILL.md +0 -0
  270. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/hatch_build.py +0 -0
  271. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/images/tui.png +0 -0
  272. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/scripts/check_imports.py +0 -0
  273. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/scripts/debug_server.sh +0 -0
  274. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/scripts/generate_commands_catalog.py +0 -0
  275. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/README.md +0 -0
  276. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/integration_tests/__init__.py +0 -0
  277. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/integration_tests/benchmarks/__init__.py +0 -0
  278. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/integration_tests/benchmarks/test_codspeed_import_benchmarks.py +0 -0
  279. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/integration_tests/benchmarks/test_local_context_benchmarks.py +0 -0
  280. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/integration_tests/benchmarks/test_startup_benchmarks.py +0 -0
  281. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/integration_tests/conftest.py +0 -0
  282. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/integration_tests/test_acp_mode.py +0 -0
  283. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/integration_tests/test_auto_approve_remote.py +0 -0
  284. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/integration_tests/test_compact_resume.py +0 -0
  285. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/integration_tests/test_goal_criteria_remote.py +0 -0
  286. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/integration_tests/test_offload_server_side.py +0 -0
  287. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/integration_tests/test_sandbox_factory.py +0 -0
  288. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/integration_tests/test_sandbox_operations.py +0 -0
  289. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/__init__.py +0 -0
  290. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/client/__init__.py +0 -0
  291. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/client/commands/__init__.py +0 -0
  292. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/client/commands/test_auth.py +0 -0
  293. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/client/commands/test_extras.py +0 -0
  294. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/client/commands/test_mcp.py +0 -0
  295. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/client/commands/test_tools.py +0 -0
  296. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/data/coding_agent_v1_validator.json +0 -0
  297. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/hooks/__init__.py +0 -0
  298. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/hooks/models/__init__.py +0 -0
  299. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/hooks/models/test_models.py +0 -0
  300. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/hooks/test_client_lifecycle.py +0 -0
  301. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/hooks/test_configuration.py +0 -0
  302. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/hooks/test_execution.py +0 -0
  303. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/hooks/test_manager.py +0 -0
  304. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/hooks/test_presenter.py +0 -0
  305. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/hooks/test_transcript.py +0 -0
  306. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/hooks/test_trust.py +0 -0
  307. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/plugins/__init__.py +0 -0
  308. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/plugins/test_marketplace.py +0 -0
  309. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/plugins/test_plugin_hooks.py +0 -0
  310. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/plugins/test_plugins_p0.py +0 -0
  311. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/plugins/test_store.py +0 -0
  312. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/skills/__init__.py +0 -0
  313. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/skills/test_commands.py +0 -0
  314. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/skills/test_load.py +0 -0
  315. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/skills/test_merge.py +0 -0
  316. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/skills/test_skill_trust.py +0 -0
  317. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/skills/test_skills_json.py +0 -0
  318. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/skills/test_thread_inspector.py +0 -0
  319. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/smoke_tests/__init__.py +0 -0
  320. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/smoke_tests/conftest.py +0 -0
  321. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/smoke_tests/snapshots/system_prompt_interactive_local.md +0 -0
  322. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/smoke_tests/test_system_prompt.py +0 -0
  323. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test__tool_stream.py +0 -0
  324. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_agent.py +0 -0
  325. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_agent_friendly.py +0 -0
  326. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_approval_mode.py +0 -0
  327. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_args.py +0 -0
  328. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_ask_user_middleware.py +0 -0
  329. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_ask_user_types.py +0 -0
  330. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_auth_display.py +0 -0
  331. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_auth_store.py +0 -0
  332. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_auth_web_search_restart.py +0 -0
  333. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_auto_mode.py +0 -0
  334. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_charset.py +0 -0
  335. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_clipboard.py +0 -0
  336. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_config_manifest.py +0 -0
  337. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_config_recursion_limit.py +0 -0
  338. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_configurable_model.py +0 -0
  339. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_cursor_blink.py +0 -0
  340. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_cursor_style.py +0 -0
  341. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_debug.py +0 -0
  342. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_debug_buffer.py +0 -0
  343. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_debug_console.py +0 -0
  344. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_doctor.py +0 -0
  345. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_editor.py +0 -0
  346. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_env_vars.py +0 -0
  347. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_event_bus.py +0 -0
  348. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_exception_handling.py +0 -0
  349. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_extras_info.py +0 -0
  350. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_file_ops.py +0 -0
  351. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_formatting.py +0 -0
  352. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_git.py +0 -0
  353. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_glm_5p2_profile.py +0 -0
  354. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_goal_criteria_client.py +0 -0
  355. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_goal_rubric.py +0 -0
  356. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_goal_state_notice.py +0 -0
  357. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_goal_state_persistence.py +0 -0
  358. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_goal_tools.py +0 -0
  359. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_hatch_build.py +0 -0
  360. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_hooks.py +0 -0
  361. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_imports.py +0 -0
  362. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_input_parsing.py +0 -0
  363. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_install_command.py +0 -0
  364. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_invocation.py +0 -0
  365. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_iterm_cursor_guide.py +0 -0
  366. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_json_types.py +0 -0
  367. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_local_context.py +0 -0
  368. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_main_acp_mode.py +0 -0
  369. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_main_args.py +0 -0
  370. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_managed_tools.py +0 -0
  371. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_mcp_auth.py +0 -0
  372. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_mcp_config.py +0 -0
  373. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_mcp_disabled.py +0 -0
  374. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_mcp_login_service.py +0 -0
  375. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_mcp_oauth_ui.py +0 -0
  376. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_mcp_tools.py +0 -0
  377. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_media_utils.py +0 -0
  378. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_memory_guard.py +0 -0
  379. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_model_config.py +0 -0
  380. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_model_switch.py +0 -0
  381. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_non_interactive.py +0 -0
  382. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_notifications.py +0 -0
  383. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_offload.py +0 -0
  384. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_onboarding.py +0 -0
  385. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_openai_codex_integration.py +0 -0
  386. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_output.py +0 -0
  387. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_paths.py +0 -0
  388. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_reasoning_effort.py +0 -0
  389. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_reliable_rubric.py +0 -0
  390. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_reload.py +0 -0
  391. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_remote_client.py +0 -0
  392. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_repository_bounds.py +0 -0
  393. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_resume_state.py +0 -0
  394. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_rubric_cli.py +0 -0
  395. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_sandbox_config.py +0 -0
  396. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_sandbox_factory.py +0 -0
  397. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_sandbox_provider.py +0 -0
  398. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_sandbox_registry.py +0 -0
  399. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_server.py +0 -0
  400. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_server_config.py +0 -0
  401. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_server_graph.py +0 -0
  402. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_server_helpers.py +0 -0
  403. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_server_manager.py +0 -0
  404. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_session_stats.py +0 -0
  405. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_shell_allow_list.py +0 -0
  406. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_skill_invocation.py +0 -0
  407. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_startup_blocking.py +0 -0
  408. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_startup_fast_paths.py +0 -0
  409. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_state_migration.py +0 -0
  410. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_subagents.py +0 -0
  411. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_terminal_capabilities.py +0 -0
  412. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_terminal_escape.py +0 -0
  413. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_terminal_progress_preference.py +0 -0
  414. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_textual_patches.py +0 -0
  415. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_theme.py +0 -0
  416. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_tool_catalog.py +0 -0
  417. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_tool_display.py +0 -0
  418. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_tracing_replicas.py +0 -0
  419. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_transcript_virtualization.py +0 -0
  420. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_ui.py +0 -0
  421. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_unicode_security.py +0 -0
  422. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/test_version.py +0 -0
  423. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tools/__init__.py +0 -0
  424. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tools/test_current_thread.py +0 -0
  425. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tools/test_fetch_url.py +0 -0
  426. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tools/test_tool_arg_schemas.py +0 -0
  427. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tui/__init__.py +0 -0
  428. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tui/modals/__init__.py +0 -0
  429. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tui/modals/plugin_manager/__init__.py +0 -0
  430. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tui/modals/plugin_manager/test_structure.py +0 -0
  431. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tui/test_subagent_stream.py +0 -0
  432. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tui/widgets/__init__.py +0 -0
  433. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tui/widgets/test_agent_selector.py +0 -0
  434. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tui/widgets/test_approval.py +0 -0
  435. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tui/widgets/test_ask_user.py +0 -0
  436. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tui/widgets/test_auth_widgets.py +0 -0
  437. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tui/widgets/test_auto_mode_notice.py +0 -0
  438. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tui/widgets/test_autocomplete.py +0 -0
  439. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tui/widgets/test_chat_input.py +0 -0
  440. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tui/widgets/test_copy_spans.py +0 -0
  441. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tui/widgets/test_cwd_switch.py +0 -0
  442. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tui/widgets/test_diff.py +0 -0
  443. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tui/widgets/test_goal_review.py +0 -0
  444. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tui/widgets/test_history.py +0 -0
  445. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tui/widgets/test_inline_prompt.py +0 -0
  446. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tui/widgets/test_install_confirm.py +0 -0
  447. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tui/widgets/test_launch_init.py +0 -0
  448. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tui/widgets/test_links.py +0 -0
  449. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tui/widgets/test_loading.py +0 -0
  450. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tui/widgets/test_mcp_login_modal.py +0 -0
  451. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tui/widgets/test_mcp_reconnect.py +0 -0
  452. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tui/widgets/test_mcp_viewer.py +0 -0
  453. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tui/widgets/test_message_store.py +0 -0
  454. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tui/widgets/test_messages.py +0 -0
  455. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tui/widgets/test_model_selector.py +0 -0
  456. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tui/widgets/test_notification_center.py +0 -0
  457. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tui/widgets/test_notification_detail.py +0 -0
  458. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tui/widgets/test_notification_settings.py +0 -0
  459. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tui/widgets/test_plugin_reload.py +0 -0
  460. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tui/widgets/test_restart_prompt.py +0 -0
  461. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tui/widgets/test_skill_trust_screen.py +0 -0
  462. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tui/widgets/test_startup_tip.py +0 -0
  463. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tui/widgets/test_status.py +0 -0
  464. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tui/widgets/test_subagent_panel.py +0 -0
  465. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tui/widgets/test_thread_agent_switch.py +0 -0
  466. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tui/widgets/test_thread_selector.py +0 -0
  467. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tui/widgets/test_tool_renderers.py +0 -0
  468. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tui/widgets/test_update_available.py +0 -0
  469. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tui/widgets/test_update_confirm.py +0 -0
  470. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tui/widgets/test_update_progress.py +0 -0
  471. {deepagents_code-0.1.52 → deepagents_code-0.1.53}/tests/unit_tests/tui/widgets/test_welcome.py +0 -0
@@ -241,8 +241,10 @@ __marimo__/
241
241
  #claude
242
242
  .claude
243
243
 
244
- # Harbor local job output
244
+ # Harbor local job output. `harbor-jobs/` is the per-suite variant the eval Makefile and
245
+ # the CI workflow write to (`harbor-jobs/<category>`).
245
246
  jobs/
247
+ harbor-jobs/
246
248
 
247
249
  .idea
248
250
  TEXTUAL_REFACTOR_PLAN.md
@@ -67,5 +67,7 @@ The main cost is the client/server boundary. When debugging, first decide which
67
67
  - For local setup and debugging, see [`DEVELOPMENT.md`](./DEVELOPMENT.md).
68
68
  - For command behavior, see [`COMMANDS.md`](./COMMANDS.md).
69
69
  - For lifecycle hooks (`hooks.json`), see [`HOOKS.md`](./HOOKS.md).
70
+ - For cost estimates and local pricing overrides (`prices.json`), see
71
+ [`PRICING.md`](./PRICING.md).
70
72
  - For security boundaries, see [`THREAT_MODEL.md`](./THREAT_MODEL.md).
71
73
  - For package-specific coding conventions, see [`AGENTS.md`](./AGENTS.md).
@@ -2,6 +2,24 @@
2
2
 
3
3
  # Deep Agents Code Changelog
4
4
 
5
+ ## [0.1.53](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.52...deepagents-code==0.1.53) (2026-08-06)
6
+
7
+ ### Features
8
+
9
+ - Added pricing coverage with Baseten built-in overrides and local fallback overrides when `genai-prices` is missing data ([#5312](https://github.com/langchain-ai/deepagents/issues/5312), [#5304](https://github.com/langchain-ai/deepagents/issues/5304)).
10
+ - Suggest compacting large resumed threads ([#5318](https://github.com/langchain-ai/deepagents/issues/5318)).
11
+ - Added terminal program trace metadata ([#5329](https://github.com/langchain-ai/deepagents/issues/5329)).
12
+
13
+ ### Bug Fixes
14
+
15
+ - Preserved runtime offload archive routing ([#5328](https://github.com/langchain-ai/deepagents/issues/5328)).
16
+ - Always restart after a successful startup auto-update ([#5317](https://github.com/langchain-ai/deepagents/issues/5317)).
17
+ - Fixed leaked turn coroutines and SQLite handles ([#5218](https://github.com/langchain-ai/deepagents/issues/5218)).
18
+ - Keep MCP shutdown-race tracebacks from appearing in the terminal ([#5325](https://github.com/langchain-ai/deepagents/issues/5325)).
19
+ - Open the `/auto model` selector immediately while connecting ([#5341](https://github.com/langchain-ai/deepagents/issues/5341)).
20
+ - Route failures to `PostToolUseFailure` ([#5315](https://github.com/langchain-ai/deepagents/issues/5315)).
21
+ - Use dismissed copy for ask-user prompts ([#5331](https://github.com/langchain-ai/deepagents/issues/5331)).
22
+
5
23
  ## [0.1.52](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.51...deepagents-code==0.1.52) (2026-08-04)
6
24
 
7
25
  ### Features
@@ -54,7 +54,8 @@ Native tools are matched by their wire names (for example `execute` → `Bash`,
54
54
  | `PermissionRequest` | client | `tool_name` | The client is about to ask for tool permission |
55
55
  | `Notification` | client | `notification_type` | A client lifecycle notification is emitted |
56
56
  | `PreToolUse` | server | `tool_name` | Before a tool call runs |
57
- | `PostToolUse` | server | `tool_name` | After a tool call completes |
57
+ | `PostToolUse` | server | `tool_name` | After a tool call succeeds |
58
+ | `PostToolUseFailure` | server | `tool_name` | After a tool call fails |
58
59
  | `PreCompact` | server | `trigger` | Before conversation compaction |
59
60
  | `Stop` | server | _(none)_ | After an agent stop turn |
60
61
  | `SubagentStart` | server | `agent_name` | When a subagent starts |
@@ -127,7 +128,7 @@ Matchers use wire tool names. `execute` is exposed as `Bash`. Exit code `2` (or
127
128
 
128
129
  Handlers communicate through:
129
130
 
130
- - **Exit code `2`**: treated as a synthetic `decision: "block"`. Interpretation depends on the event (for example deny on `PreToolUse` / `PermissionRequest`, block further processing on `UserPromptSubmit` / `PreCompact`, feedback on `PostToolUse`).
131
+ - **Exit code `2`**: treated as a synthetic `decision: "block"`. Interpretation depends on the event (for example deny on `PreToolUse` / `PermissionRequest`, block further processing on `UserPromptSubmit` / `PreCompact`, feedback on `PostToolUse` / `PostToolUseFailure`).
131
132
  - **Other non-zero exits**: recorded as diagnostics; they do not apply a block decision.
132
133
  - **JSON stdout** (`HookWireOutput`): may set `continue` / `stopReason`, `systemMessage` (user-visible notice), `additionalContext` via `hookSpecificOutput`, and event-specific fields such as `permissionDecision` on `PreToolUse`.
133
134
  - **Non-JSON stdout**: becomes additional context for events whose plain-output policy is context (`SessionStart`, `UserPromptSubmit`); otherwise it is a diagnostic.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: deepagents-code
3
- Version: 0.1.52
3
+ Version: 0.1.53
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://docs.langchain.com/oss/python/deepagents/overview
6
6
  Project-URL: Documentation, https://reference.langchain.com/python/deepagents/
@@ -29,11 +29,11 @@ Requires-Python: <4.0,>=3.11
29
29
  Requires-Dist: aiosqlite<1.0.0,>=0.22.1
30
30
  Requires-Dist: anyio<5.0.0,>=4.14.2
31
31
  Requires-Dist: deepagents-acp<1.0.0,>=0.0.9
32
- Requires-Dist: deepagents==0.7.1
32
+ Requires-Dist: deepagents==0.7.4
33
33
  Requires-Dist: filelock<3.30,>=3.29.7
34
34
  Requires-Dist: genai-prices<0.2.0,>=0.1.1
35
35
  Requires-Dist: httpx<1.0.0,>=0.28.1
36
- Requires-Dist: langchain-anthropic<2.0.0,>=1.5.3
36
+ Requires-Dist: langchain-anthropic<2.0.0,>=1.5.4
37
37
  Requires-Dist: langchain-google-genai<5.0.0,>=4.3.2
38
38
  Requires-Dist: langchain-mcp-adapters<1.0.0,>=0.3.0
39
39
  Requires-Dist: langchain-openai<2.0.0,>=1.4.1
@@ -65,7 +65,7 @@ Provides-Extra: agentcore
65
65
  Requires-Dist: langchain-agentcore-codeinterpreter<1.0.0,>=0.0.5; extra == 'agentcore'
66
66
  Provides-Extra: all-providers
67
67
  Requires-Dist: aiohttp<3.15.0,>=3.14.3; extra == 'all-providers'
68
- Requires-Dist: langchain-anthropic<2.0.0,>=1.5.3; extra == 'all-providers'
68
+ Requires-Dist: langchain-anthropic<2.0.0,>=1.5.4; extra == 'all-providers'
69
69
  Requires-Dist: langchain-aws<2.0.0,>=1.6.3; extra == 'all-providers'
70
70
  Requires-Dist: langchain-baseten<1.0.0,>=0.2.3; extra == 'all-providers'
71
71
  Requires-Dist: langchain-cohere<1.0.0,>=0.6.0; extra == 'all-providers'
@@ -93,7 +93,7 @@ Requires-Dist: langchain-modal>=0.0.5; extra == 'all-sandboxes'
93
93
  Requires-Dist: langchain-runloop>=0.0.6; extra == 'all-sandboxes'
94
94
  Requires-Dist: langchain-vercel-sandbox>=0.0.1; extra == 'all-sandboxes'
95
95
  Provides-Extra: anthropic
96
- Requires-Dist: langchain-anthropic<2.0.0,>=1.5.3; extra == 'anthropic'
96
+ Requires-Dist: langchain-anthropic<2.0.0,>=1.5.4; extra == 'anthropic'
97
97
  Provides-Extra: baseten
98
98
  Requires-Dist: langchain-baseten<1.0.0,>=0.2.3; extra == 'baseten'
99
99
  Provides-Extra: bedrock
@@ -0,0 +1,105 @@
1
+ # Cost estimates and local pricing overrides
2
+
3
+ `/cost` reports an estimate for the current thread. Rates come from
4
+ [genai-prices](https://github.com/pydantic/genai-prices), which ships an offline
5
+ catalog and refreshes it hourly in the background (opt out with
6
+ `DEEPAGENTS_CODE_PRICES_AUTO_UPDATE=0`, or `[update].prices_auto_update = false`
7
+ in `config.toml`).
8
+
9
+ Estimates are display-only. Nothing in dcode caps spend or gates execution on
10
+ them, so a wrong rate costs you an inaccurate number and nothing else.
11
+
12
+ ## When a model has no rates
13
+
14
+ A model the catalog does not cover is left out of the total. `/cost` distinguishes
15
+ that from a genuinely free request: it reports how many of the recorded requests
16
+ are included in the figure.
17
+
18
+ That happens with a newly released model, a self-hosted or proxied endpoint, or a
19
+ provider name that does not line up with what genai-prices calls it. If you would
20
+ rather see an estimate than a gap, write your own rates to:
21
+
22
+ ```
23
+ ~/.deepagents/prices.json
24
+ ```
25
+
26
+ The file is read once, on the first request that needs it. **Edits take effect on
27
+ the next dcode start**, not mid-session.
28
+
29
+ ## File format
30
+
31
+ `prices.json` uses the same provider-array schema as genai-prices' own
32
+ `prices/new_data/v2/data.json`, so an entry can be contributed upstream as-is.
33
+ It is a JSON array of providers:
34
+
35
+ ```json
36
+ [
37
+ {
38
+ "id": "my-proxy",
39
+ "name": "My proxy",
40
+ "api_pattern": "gateway\\.example\\.internal",
41
+ "models": [
42
+ {
43
+ "id": "house-model-v2",
44
+ "match": { "equals": "house-model-v2" },
45
+ "prices": { "input_mtok": 2.5, "output_mtok": 10.0 }
46
+ }
47
+ ]
48
+ }
49
+ ]
50
+ ```
51
+
52
+ Required, and easy to omit:
53
+
54
+ | Field | Where | Notes |
55
+ | --- | --- | --- |
56
+ | `id` | provider | Must be the provider id dcode reports for the request — see below. |
57
+ | `name` | provider | Any display string. |
58
+ | `api_pattern` | provider | Regex against the API URL. Unused by dcode, but the schema requires it. |
59
+ | `id` | model | Any identifier; used in log messages. |
60
+ | `match` | model | How to recognize the model: `{"equals": ...}`, `{"starts_with": ...}`, `{"contains": ...}`, or `{"regex": ...}`. |
61
+ | `prices` | model | At least one rate. |
62
+
63
+ Rates are per million tokens: `input_mtok`, `output_mtok`, and optionally
64
+ `cache_read_mtok`, `cache_write_mtok`, `output_reasoning_mtok`,
65
+ `input_audio_mtok`. Only list a bucket you have a real rate for — tokens in an
66
+ omitted bucket are billed at the ordinary input or output rate rather than being
67
+ dropped.
68
+
69
+ ## Getting the provider id right
70
+
71
+ This is where a hand-written file usually goes wrong. dcode resolves the
72
+ LangChain provider name through its own alias table before looking anything up,
73
+ so the id it searches on is not always the string you would expect.
74
+
75
+ If no provider in your file claims that id, dcode falls back to searching **every**
76
+ provider in the file by model id alone. That keeps your entry reachable, but it
77
+ also means an entry can price a request that ran against a different provider —
78
+ `llama-3.3-70b` costs very different amounts on Bedrock, Together, and Groq. When
79
+ that happens you get a warning naming both providers; pin the entry by using the
80
+ id from the warning.
81
+
82
+ ## Diagnosing a file that is not working
83
+
84
+ Everything below is logged to the Debug Console (`Ctrl+\`), each message once per
85
+ session:
86
+
87
+ | What you see | What it means |
88
+ | --- | --- |
89
+ | Nothing at all, cost still missing | The file is not where dcode looks, or is empty. Both are silent by design. |
90
+ | "No pricing override matched model=… though … contributed N model entries" | The file loaded, but nothing matched. The `provider_id` in the message is the post-alias id your entry must use. |
91
+ | "Could not parse … as JSON" / "must be an array of providers" | Syntax or shape problem. The payload must be a bare array, not `{"providers": [...]}`. |
92
+ | "the entries failed validation against the genai-prices provider schema" | A required field is missing or mistyped. |
93
+ | "the request ran against provider …" | Priced by a sweep, possibly from the wrong provider's entry. See above. |
94
+ | "its entry matched but its rates were rejected" | A rate is unusable — negative, or large enough to overflow. |
95
+
96
+ A malformed `prices.json` never breaks a model turn and never disables ordinary
97
+ pricing: the bad source is dropped and everything else still prices.
98
+
99
+ ## Built-in stopgaps
100
+
101
+ dcode also ships a small maintainer-curated catalog for models upstream has not
102
+ priced yet. Your file wins over it on a conflicting `(provider id, model id)`
103
+ pair, and both are consulted only when genai-prices itself has no rates. See
104
+ [`deepagents_code/bundled_prices.README.md`](./deepagents_code/bundled_prices.README.md)
105
+ for that policy.
@@ -195,9 +195,11 @@ ASK_USER_CANCELLED_SUMMARY = "Question cancelled"
195
195
  Rewording it changes that hook contract. Not rendered on any row: a live cancel
196
196
  calls `set_rejected` (which records no output), and a transcript of `(cancelled)`
197
197
  placeholders from a non-TUI client is summarized from the recorded status like
198
- any other, so it reads as `ASK_USER_ANSWERED_SUMMARY`. The cancel banner in
199
- `textual_adapter` shares this wording but deliberately not this constant it is
200
- user-facing prose, not the hook contract.
198
+ any other, so it reads as `ASK_USER_ANSWERED_SUMMARY`. The dismissal banner in
199
+ `textual_adapter` deliberately does not use this constant, and no longer even
200
+ shares its wording the banner says "dismissed" where this says "cancelled".
201
+ That divergence is intentional: the banner is user-facing prose free to be
202
+ reworded, this is the hook contract. Do not "de-duplicate" them.
201
203
  """
202
204
 
203
205
  ASK_USER_FAILED_SUMMARY: AskUserRowSummary = "Question failed"
@@ -1,3 +1,3 @@
1
1
  """Generated at build time. Do not edit or commit."""
2
2
 
3
- BUILD_COMMIT = "b428644"
3
+ BUILD_COMMIT = "0bd15dc"
@@ -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.52" # x-release-please-version
5
+ __version__ = "0.1.53" # 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."""
@@ -354,6 +354,20 @@ def _coerce_provisional_cost_delta_usd(value: object) -> float | None:
354
354
  return delta_usd
355
355
 
356
356
 
357
+ def _persisted_context_tokens(state_values: dict[str, Any]) -> int:
358
+ """Read a checkpoint's `_context_tokens`, coercing absent or invalid to 0.
359
+
360
+ Args:
361
+ state_values: Thread state values from the checkpoint.
362
+
363
+ Returns:
364
+ The persisted context size, or 0 when it is missing or not a
365
+ non-negative `int`.
366
+ """
367
+ raw = state_values.get("_context_tokens")
368
+ return raw if isinstance(raw, int) and raw >= 0 else 0
369
+
370
+
357
371
  def _warn_discarded_goal_channels(state_values: dict[str, Any]) -> list[str]:
358
372
  """Report persisted goal/rubric channels that are present but malformed.
359
373
 
@@ -9337,6 +9351,8 @@ class DeepAgentsApp(App):
9337
9351
  ),
9338
9352
  )
9339
9353
  return
9354
+ if start_cause is SessionStartCause.RESUME:
9355
+ await self._restore_resumed_context_tokens()
9340
9356
 
9341
9357
  if not await self._run_session_start_hook(start_cause):
9342
9358
  self._initial_session_start_stopped = True
@@ -9349,6 +9365,9 @@ class DeepAgentsApp(App):
9349
9365
  self._startup_cmd = None
9350
9366
  await self._run_startup_command(cmd)
9351
9367
 
9368
+ if start_cause is SessionStartCause.RESUME:
9369
+ await self._maybe_compact_after_resume()
9370
+
9352
9371
  if should_load_history:
9353
9372
  await self._remount_pending_goal_rubric_review()
9354
9373
 
@@ -10173,6 +10192,7 @@ class DeepAgentsApp(App):
10173
10192
  from deepagents_code.command_registry import (
10174
10193
  BYPASS_WHEN_CONNECTING,
10175
10194
  IMMEDIATE_UI,
10195
+ IMMEDIATE_UI_ARG_FORMS,
10176
10196
  SIDE_EFFECT_FREE,
10177
10197
  STARTUP_RECOVERY_COMMANDS,
10178
10198
  )
@@ -10200,11 +10220,16 @@ class DeepAgentsApp(App):
10200
10220
  or self._modal_command_running()
10201
10221
  )
10202
10222
  if cmd in IMMEDIATE_UI:
10203
- # Only bare form (no args) bypasses the selector-opening form is
10204
- # safe, but an argument form does a direct action that shouldn't
10205
- # race the agent (e.g. `/model <name>` switches models, `/threads
10206
- # -r <id>` resumes a thread).
10207
- return value == cmd
10223
+ # Only UI-opening forms bypass: the bare command, or an argument
10224
+ # form whitelisted in IMMEDIATE_UI_ARG_FORMS (e.g. `/auto model`,
10225
+ # which opens the classifier picker). Other argument forms do a
10226
+ # direct action that shouldn't race the agent (e.g. `/model <name>`
10227
+ # switches models, `/threads -r <id>` resumes a thread,
10228
+ # `/auto model <spec>` mutates classifier state). Whitespace is
10229
+ # canonicalized for the whitelist check because `_handle_command`
10230
+ # strips and reparses the same way — `/auto model` (double space,
10231
+ # tab) reaches the selector branch once processed.
10232
+ return value == cmd or " ".join(value.split()) in IMMEDIATE_UI_ARG_FORMS
10208
10233
  return cmd in SIDE_EFFECT_FREE
10209
10234
 
10210
10235
  async def _submit_input(
@@ -15388,15 +15413,29 @@ class DeepAgentsApp(App):
15388
15413
  if self._chat_input:
15389
15414
  self._chat_input.set_cursor_active(active=False)
15390
15415
 
15416
+ from functools import partial
15417
+
15391
15418
  # Use run_worker to avoid blocking the main event loop
15392
15419
  # This allows the UI to remain responsive during agent execution
15393
- self._agent_worker = self.run_worker(
15394
- self._run_agent_task(
15395
- message,
15396
- message_kwargs=message_kwargs,
15397
- goal_notice_current=resuming_blocked,
15398
- ),
15399
- exclusive=False,
15420
+ #
15421
+ # Passed as a callable rather than a coroutine: a worker
15422
+ # cancelled before its first event-loop step never runs its
15423
+ # work, and an already-built coroutine would then be finalized
15424
+ # unawaited (`RuntimeWarning`, plus an unraisable exception when
15425
+ # the interpreter is far enough into teardown). Building it
15426
+ # inside the worker means nothing exists to strand.
15427
+ turn: Callable[[], Coroutine[None, None, None]] = partial(
15428
+ self._run_agent_task,
15429
+ message,
15430
+ message_kwargs=message_kwargs,
15431
+ goal_notice_current=resuming_blocked,
15432
+ )
15433
+ # Cast because Textual's `WorkType` alias admits both a
15434
+ # coroutine factory and a plain callable, so the result type
15435
+ # infers as the union rather than the `None` the turn returns.
15436
+ self._agent_worker = cast(
15437
+ "Worker[None]",
15438
+ self.run_worker(turn, name="_run_agent_task", exclusive=False),
15400
15439
  )
15401
15440
  worker_started = True
15402
15441
  finally:
@@ -16488,10 +16527,7 @@ class DeepAgentsApp(App):
16488
16527
  context-token count, and the persisted model spec (if any).
16489
16528
  """
16490
16529
  state_values = await self._get_thread_state_values(thread_id)
16491
- raw_tokens = state_values.get("_context_tokens")
16492
- context_tokens = (
16493
- raw_tokens if isinstance(raw_tokens, int) and raw_tokens >= 0 else 0
16494
- )
16530
+ context_tokens = _persisted_context_tokens(state_values)
16495
16531
  raw_spec = state_values.get("_model_spec")
16496
16532
  model_spec = raw_spec if isinstance(raw_spec, str) else ""
16497
16533
  raw_params = state_values.get("_model_params")
@@ -19049,9 +19085,9 @@ class DeepAgentsApp(App):
19049
19085
  " /auto model <provider:model>\n"
19050
19086
  " /auto model clear Reuse the main agent model\n\n"
19051
19087
  "Auto reviews gated actions with a classifier model. It currently "
19052
- f"uses {self._auto_classifier_model_label()}. A weaker model makes "
19053
- "that review weaker; actions it cannot review are denied, and "
19054
- "repeated review failures fall back to your approval.\n\n"
19088
+ f"uses {self._auto_classifier_model_label()}. Actions it cannot "
19089
+ "review are denied, and repeated review failures fall back to your "
19090
+ "approval.\n\n"
19055
19091
  "Changes here apply to this session only. Set "
19056
19092
  "`[models].auto_classifier` in config.toml for a persistent choice."
19057
19093
  )
@@ -19142,6 +19178,43 @@ class DeepAgentsApp(App):
19142
19178
  # removes the modal.
19143
19179
  self.call_after_refresh(start_selection_worker)
19144
19180
 
19181
+ tail = ""
19182
+ if self._auto_classifier_display_spec() is not None:
19183
+ # The picker lists only recommended classifiers, so it offers no
19184
+ # entry that reverts to the main agent model. `_auto_usage_text`
19185
+ # carries the hint, but it is mounted only for an unrecognized
19186
+ # `/auto` subcommand, so no path that opens this modal shows it.
19187
+ tail = " Clear it with `/auto model clear`."
19188
+
19189
+ # Every branch hands the screen a `Content`: the description reaches a
19190
+ # `Static`, which parses a plain `str` as markup. The branches naming a
19191
+ # spec use `from_markup` with `$spec` per `AGENTS.md`, because the spec
19192
+ # is user-supplied: `/auto model <spec>` validates, but the startup seed
19193
+ # from `--auto-classifier-model` / `config.toml` does not. Interpolated
19194
+ # into a plain `str` instead,
19195
+ # a spec containing `[dim]` would render a truncated, dimmed name that is
19196
+ # not the model reviewing actions, and one containing `[/]` would raise
19197
+ # `MarkupError` when the modal opens. The first branch names no spec, so
19198
+ # the plain `Content` constructor — which parses nothing — suffices.
19199
+ active = self._auto_classifier_review_model_spec()
19200
+ if active is None:
19201
+ description = Content(
19202
+ "Auto currently reviews with the main agent model." + tail
19203
+ )
19204
+ elif not self._auto_classifier_is_distinct():
19205
+ # Not `display_spec() is None`: that asks where the spec came from,
19206
+ # but the sentence claims the spec *is* the main agent model. They
19207
+ # diverge when a configured classifier matches the main model, which
19208
+ # `_notify_auto_classifier_active` also treats as "not distinct".
19209
+ description = Content.from_markup(
19210
+ "Auto currently reviews with $spec, the main agent model." + tail,
19211
+ spec=active,
19212
+ )
19213
+ else:
19214
+ description = Content.from_markup(
19215
+ "Auto currently reviews with $spec." + tail, spec=active
19216
+ )
19217
+
19145
19218
  screen = ModelSelectorScreen(
19146
19219
  current_model=current_model,
19147
19220
  current_provider=current_provider,
@@ -19149,12 +19222,7 @@ class DeepAgentsApp(App):
19149
19222
  recommended_models=_AUTO_CLASSIFIER_RECOMMENDED_MODELS,
19150
19223
  include_recent_models=False,
19151
19224
  title="Choose the Auto classifier model",
19152
- description=(
19153
- "Recommended models favor lower latency and cost for repeated "
19154
- "reviews. A faster, cheaper model may review actions less "
19155
- "carefully. Clear it with `/auto model clear` to reuse the main "
19156
- "agent model."
19157
- ),
19225
+ description=description,
19158
19226
  )
19159
19227
  self.push_screen(screen, handle_result)
19160
19228
 
@@ -20923,6 +20991,9 @@ class DeepAgentsApp(App):
20923
20991
  )
20924
20992
  await self._mount_message(AppMessage(resume_hint))
20925
20993
 
20994
+ if resume_thread_id is not None:
20995
+ await self._maybe_compact_after_resume()
20996
+
20926
20997
  # Drain any messages the user typed after we cleared the queue
20927
20998
  # but before the new server was ready.
20928
20999
  if self._pending_messages and not self._agent_running:
@@ -24205,18 +24276,44 @@ class DeepAgentsApp(App):
24205
24276
  if target is None:
24206
24277
  return
24207
24278
 
24208
- active_agent = self._assistant_id or DEFAULT_ASSISTANT_ID
24209
- if target.agent_name == active_agent:
24210
- await self._resume_thread(target.thread_id)
24211
- return
24212
-
24213
24279
  # This command runs inline on Textual's message pump. Detach before
24214
- # awaiting the confirmation modal so Enter/Esc can reach it.
24280
+ # awaiting the cwd/compaction modals so Enter/Esc can reach them. Both
24281
+ # continuations mount their own failure messages.
24282
+ active_agent = self._assistant_id or DEFAULT_ASSISTANT_ID
24215
24283
  self._schedule_off_message_pump(
24216
- self._confirm_then_resume_cross_agent_thread(target),
24284
+ self._resume_same_agent_thread(target.thread_id)
24285
+ if target.agent_name == active_agent
24286
+ else self._confirm_then_resume_cross_agent_thread(target),
24217
24287
  context=f"threads-resume:{target.thread_id}",
24218
24288
  )
24219
24289
 
24290
+ async def _resume_same_agent_thread(self, thread_id: str) -> None:
24291
+ """Resume a thread already owned by the active agent.
24292
+
24293
+ A thin reporting wrapper: `_resume_thread` handles its own failures once
24294
+ the switch is under way, but its pre-switch phase (the cwd prompt, the
24295
+ compaction prompt, and their modal setup) sits outside that boundary.
24296
+ Detached continuations only get logged, so without this a `/threads -r`
24297
+ would end with no visible outcome.
24298
+
24299
+ Args:
24300
+ thread_id: The thread to resume on the current agent.
24301
+
24302
+ Raises:
24303
+ asyncio.CancelledError: If app shutdown cancels the detached flow.
24304
+ """
24305
+ try:
24306
+ await self._resume_thread(thread_id)
24307
+ except asyncio.CancelledError:
24308
+ raise
24309
+ except Exception:
24310
+ logger.exception("Same-agent resume failed for thread %s", thread_id)
24311
+ await self._mount_message(
24312
+ ErrorMessage(
24313
+ f"Could not resume thread {thread_id}. Use /threads to try again."
24314
+ )
24315
+ )
24316
+
24220
24317
  async def _resolve_threads_resume_target(
24221
24318
  self, requested_id: str | None
24222
24319
  ) -> _ThreadsResumeTarget | None:
@@ -24928,6 +25025,69 @@ class DeepAgentsApp(App):
24928
25025
  return False
24929
25026
  return bool(changes)
24930
25027
 
25028
+ async def _restore_resumed_context_tokens(self) -> None:
25029
+ """Seed `_context_tokens` from the checkpoint without loading history.
25030
+
25031
+ A launch that resumes *and* carries an initial prompt skips the history
25032
+ load, so nothing would populate the context size — and that path is the
25033
+ one where it matters most, since the prompt is submitted against the
25034
+ full restored context moments later.
25035
+ """
25036
+ if not self._lc_thread_id or not self._agent:
25037
+ return
25038
+ try:
25039
+ state_values = await self._get_thread_state_values(self._lc_thread_id)
25040
+ except Exception:
25041
+ logger.warning(
25042
+ "Could not read the context size for resumed thread %s; "
25043
+ "skipping the compaction suggestion",
25044
+ self._lc_thread_id,
25045
+ exc_info=True,
25046
+ )
25047
+ return
25048
+ tokens = _persisted_context_tokens(state_values)
25049
+ if tokens > 0:
25050
+ self._on_tokens_update(tokens)
25051
+
25052
+ async def _maybe_compact_after_resume(self) -> None:
25053
+ """Offer to compact a just-resumed thread with an oversized context.
25054
+
25055
+ Resuming costs nothing on its own, so the prompt runs once the thread is
25056
+ live and before the user's next turn pays for the restored context.
25057
+ Declining is free: `/compact` remains available for the rest of the
25058
+ session.
25059
+ """
25060
+ from deepagents_code.config_manifest import (
25061
+ COMPACT_ON_RESUME_THRESHOLD_DEFAULT,
25062
+ get_option,
25063
+ load_config_toml,
25064
+ resolve_scalar,
25065
+ )
25066
+
25067
+ threshold = COMPACT_ON_RESUME_THRESHOLD_DEFAULT
25068
+ option = get_option("threads.compact_on_resume_threshold")
25069
+ if option is not None:
25070
+ resolved, _ = resolve_scalar(option, toml_data=load_config_toml())
25071
+ if isinstance(resolved, int):
25072
+ threshold = resolved
25073
+ if threshold <= 0 or self._context_tokens <= threshold:
25074
+ return
25075
+
25076
+ from deepagents_code.tui.modals.resume_compact import ResumeCompactPromptScreen
25077
+
25078
+ try:
25079
+ compact = await self._push_screen_wait(
25080
+ ResumeCompactPromptScreen(
25081
+ context_tokens=self._context_tokens,
25082
+ threshold=threshold,
25083
+ )
25084
+ )
25085
+ except Exception:
25086
+ logger.exception("Failed to show the compact-on-resume prompt")
25087
+ return
25088
+ if compact:
25089
+ await self._handle_offload()
25090
+
24931
25091
  async def _offer_thread_cwd_switch(
24932
25092
  self,
24933
25093
  thread_id: str,
@@ -25225,6 +25385,12 @@ class DeepAgentsApp(App):
25225
25385
  # or failed load leaves the hint under something else.
25226
25386
  await self._mount_previous_thread_hint(prev_session_thread)
25227
25387
 
25388
+ # Landing on a new thread re-arms the same-thread toast, so stepping
25389
+ # back to a thread and re-selecting it announces itself again.
25390
+ self._last_thread_unchanged = None
25391
+ if await self._run_session_start_hook(SessionStartCause.RESUME):
25392
+ await self._maybe_compact_after_resume()
25393
+
25228
25394
  # Deferred above so it lands last, keeping the interactive prompt
25229
25395
  # at the bottom of the transcript. Guarded because this runs inside
25230
25396
  # the rollback handler's `try`: failing to restore a review must
@@ -25233,12 +25399,6 @@ class DeepAgentsApp(App):
25233
25399
  await self._remount_pending_goal_rubric_review()
25234
25400
  except Exception:
25235
25401
  logger.exception("Failed to restore pending goal review")
25236
-
25237
- # Landing on a new thread re-arms the same-thread toast, so stepping
25238
- # back to a thread and re-selecting it announces itself again.
25239
- self._last_thread_unchanged = None
25240
- if not await self._run_session_start_hook(SessionStartCause.RESUME):
25241
- return
25242
25402
  except Exception as exc:
25243
25403
  if prefetched_payload is None:
25244
25404
  logger.exception("Failed to prefetch history for thread %s", thread_id)