deepagents-code 0.1.86__tar.gz → 0.1.87__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 (616) hide show
  1. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/CHANGELOG.md +15 -0
  2. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/DEVELOPMENT.md +51 -0
  3. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/PKG-INFO +5 -5
  4. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/_build_info.py +1 -1
  5. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/_constants.py +1 -1
  6. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/_env_vars.py +8 -1
  7. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/_version.py +1 -1
  8. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/app.py +109 -119
  9. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/client/commands/mcp.py +6 -2
  10. deepagents_code-0.1.87/deepagents_code/client/headless_resume.py +133 -0
  11. deepagents_code-0.1.87/deepagents_code/client/launch/_server_bootstrap.py +88 -0
  12. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/client/launch/server.py +76 -25
  13. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/client/non_interactive.py +209 -2
  14. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/config_manifest.py +15 -0
  15. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/input.py +31 -12
  16. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/main.py +50 -6
  17. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/mcp_auth.py +33 -8
  18. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/mcp_config.py +44 -3
  19. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/mcp_providers/_registry.py +14 -1
  20. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/mcp_providers/slack.py +41 -30
  21. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/mcp_tools.py +3 -1
  22. deepagents_code-0.1.87/deepagents_code/resume_policy.py +161 -0
  23. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/sessions.py +315 -147
  24. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/autocomplete.py +10 -5
  25. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/status.py +2 -0
  26. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/thread_selector.py +551 -159
  27. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/ui.py +1 -0
  28. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/unicode_security.py +13 -0
  29. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/pyproject.toml +5 -5
  30. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/scripts/check_process_cwd.py +3 -0
  31. deepagents_code-0.1.87/tests/integration_tests/test_headless_resume.py +316 -0
  32. deepagents_code-0.1.87/tests/integration_tests/test_server_owner_lifetime.py +234 -0
  33. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_app.py +8 -2
  34. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_cache_expiry.py +32 -6
  35. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_config_manifest.py +13 -0
  36. deepagents_code-0.1.87/tests/unit_tests/test_headless_resume.py +91 -0
  37. deepagents_code-0.1.87/tests/unit_tests/test_idle_compaction.py +166 -0
  38. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_input_parsing.py +68 -0
  39. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_main_args.py +60 -0
  40. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_mcp_auth.py +59 -1
  41. deepagents_code-0.1.87/tests/unit_tests/test_mcp_config.py +115 -0
  42. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_non_interactive.py +219 -1
  43. deepagents_code-0.1.87/tests/unit_tests/test_server_pipe.py +148 -0
  44. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_sessions.py +140 -12
  45. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/widgets/test_autocomplete.py +81 -0
  46. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/widgets/test_thread_selector.py +364 -2
  47. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/uv.lock +321 -213
  48. deepagents_code-0.1.86/tests/unit_tests/test_mcp_config.py +0 -56
  49. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/.gitignore +0 -0
  50. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/AGENTS.md +0 -0
  51. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/ARCHITECTURE.md +0 -0
  52. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/COMMANDS.md +0 -0
  53. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/EXTENSIONS.md +0 -0
  54. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/HOOKS.md +0 -0
  55. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/LICENSE +0 -0
  56. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/Makefile +0 -0
  57. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/PRICING.md +0 -0
  58. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/README.md +0 -0
  59. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/THREAT_MODEL.md +0 -0
  60. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/__init__.py +0 -0
  61. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/__main__.py +0 -0
  62. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/_ask_user_types.py +0 -0
  63. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/_async.py +0 -0
  64. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/_cli_context.py +0 -0
  65. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/_content_blocks.py +0 -0
  66. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/_debug.py +0 -0
  67. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/_debug_buffer.py +0 -0
  68. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/_dep_floor_check.py +0 -0
  69. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/_fake_models.py +0 -0
  70. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/_git.py +0 -0
  71. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/_glm_5p2_profile.py +0 -0
  72. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/_home_error.py +0 -0
  73. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/_invocation.py +0 -0
  74. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/_js_cost.py +0 -0
  75. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/_markdown.py +0 -0
  76. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/_paths.py +0 -0
  77. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/_repository_bounds.py +0 -0
  78. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/_reserved_names.py +0 -0
  79. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/_server_config.py +0 -0
  80. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/_session_stats.py +0 -0
  81. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/_startup_error.py +0 -0
  82. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/_terminal_stderr.py +0 -0
  83. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/_testing_models.py +0 -0
  84. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/_textual_patches.py +0 -0
  85. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/_tool_free.py +0 -0
  86. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/_tool_stream.py +0 -0
  87. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/_tracing.py +0 -0
  88. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/acp.py +0 -0
  89. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/agent.py +0 -0
  90. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/app.tcss +0 -0
  91. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/approval_mode.py +0 -0
  92. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/ask_user.py +0 -0
  93. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/auth_display.py +0 -0
  94. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/auth_store.py +0 -0
  95. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/auto_mode.py +0 -0
  96. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/btw.py +0 -0
  97. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/btw_api.py +0 -0
  98. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/btw_cost.py +0 -0
  99. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/built_in_skills/__init__.py +0 -0
  100. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/built_in_skills/deepagents-plugin-discovery/SKILL.md +0 -0
  101. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/built_in_skills/deepagents-thread-inspector/SKILL.md +0 -0
  102. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/built_in_skills/deepagents-thread-inspector/scripts/inspect_sessions.py +0 -0
  103. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/built_in_skills/remember/SKILL.md +0 -0
  104. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/built_in_skills/skill-creator/SKILL.md +0 -0
  105. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/built_in_skills/skill-creator/scripts/init_skill.py +0 -0
  106. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/built_in_skills/skill-creator/scripts/quick_validate.py +0 -0
  107. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/bundled_prices.README.md +0 -0
  108. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/bundled_prices.json +0 -0
  109. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/client/__init__.py +0 -0
  110. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/client/commands/__init__.py +0 -0
  111. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/client/commands/auth.py +0 -0
  112. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/client/commands/config.py +0 -0
  113. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/client/commands/extras.py +0 -0
  114. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/client/commands/tools.py +0 -0
  115. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/client/launch/__init__.py +0 -0
  116. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/client/launch/server_manager.py +0 -0
  117. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/client/remote_client.py +0 -0
  118. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/client/session_cost.py +0 -0
  119. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/clipboard.py +0 -0
  120. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/cold_cache.py +0 -0
  121. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/command_registry.py +0 -0
  122. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/config.py +0 -0
  123. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/configurable_model.py +0 -0
  124. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/configuration/__init__.py +0 -0
  125. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/configuration/interpreter.py +0 -0
  126. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/configuration/paths.py +0 -0
  127. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/configuration/provider.py +0 -0
  128. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/configuration/providers.py +0 -0
  129. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/configuration/resolver.py +0 -0
  130. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/configuration/service.py +0 -0
  131. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/configuration/theme_resolution.py +0 -0
  132. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/configuration/types.py +0 -0
  133. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/configuration/writer.py +0 -0
  134. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/context_doctor.py +0 -0
  135. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/cost_tracking.py +0 -0
  136. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/default_agent_prompt.md +0 -0
  137. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/diff_utils.py +0 -0
  138. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/doctor.py +0 -0
  139. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/editor.py +0 -0
  140. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/event_bus.py +0 -0
  141. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/extensions/__init__.py +0 -0
  142. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/extensions/api.py +0 -0
  143. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/extensions/discovery.py +0 -0
  144. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/extensions/hosting.py +0 -0
  145. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/extensions/loader.py +0 -0
  146. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/extensions/registry.py +0 -0
  147. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/extensions/runtime.py +0 -0
  148. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/extensions/settings.py +0 -0
  149. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/extensions/trust.py +0 -0
  150. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/extras_info.py +0 -0
  151. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/file_ops.py +0 -0
  152. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/formatting.py +0 -0
  153. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/goal_rubric.py +0 -0
  154. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/goal_state_limits.py +0 -0
  155. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/goal_state_notice.py +0 -0
  156. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/goal_tools.py +0 -0
  157. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/hooks/__init__.py +0 -0
  158. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/hooks/capabilities.py +0 -0
  159. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/hooks/client.py +0 -0
  160. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/hooks/client_lifecycle.py +0 -0
  161. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/hooks/context.py +0 -0
  162. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/hooks/engine.py +0 -0
  163. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/hooks/env.py +0 -0
  164. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/hooks/envelope.py +0 -0
  165. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/hooks/interrupt.py +0 -0
  166. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/hooks/legacy.py +0 -0
  167. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/hooks/loading.py +0 -0
  168. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/hooks/manager.py +0 -0
  169. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/hooks/migration.py +0 -0
  170. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/hooks/models/__init__.py +0 -0
  171. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/hooks/models/adapters.py +0 -0
  172. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/hooks/models/config.py +0 -0
  173. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/hooks/models/domain.py +0 -0
  174. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/hooks/models/transport.py +0 -0
  175. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/hooks/models/wire.py +0 -0
  176. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/hooks/permissions.py +0 -0
  177. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/hooks/presenter.py +0 -0
  178. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/hooks/projection.py +0 -0
  179. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/hooks/reducer.py +0 -0
  180. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/hooks/runner.py +0 -0
  181. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/hooks/runtime.py +0 -0
  182. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/hooks/server_middleware.py +0 -0
  183. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/hooks/snapshot.py +0 -0
  184. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/hooks/tools.py +0 -0
  185. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/hooks/transcript.py +0 -0
  186. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/hooks/trust.py +0 -0
  187. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/hooks/validate_terminal_sequence.py +0 -0
  188. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/integrations/__init__.py +0 -0
  189. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/integrations/openai_codex.py +0 -0
  190. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/integrations/sandbox_config.py +0 -0
  191. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/integrations/sandbox_factory.py +0 -0
  192. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/integrations/sandbox_provider.py +0 -0
  193. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/integrations/sandbox_registry.py +0 -0
  194. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/iterm_cursor_guide.py +0 -0
  195. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/json_types.py +0 -0
  196. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/local_context.py +0 -0
  197. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/managed_tools.py +0 -0
  198. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/mcp_disabled.py +0 -0
  199. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/mcp_login_service.py +0 -0
  200. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/mcp_middleware.py +0 -0
  201. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/mcp_oauth_ui.py +0 -0
  202. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/mcp_providers/__init__.py +0 -0
  203. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/mcp_providers/base.py +0 -0
  204. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/mcp_providers/github.py +0 -0
  205. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/mcp_proxy.py +0 -0
  206. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/media_utils.py +0 -0
  207. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/memory_guard.py +0 -0
  208. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/model_api.py +0 -0
  209. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/model_catalog.py +0 -0
  210. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/model_config.py +0 -0
  211. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/model_metadata.py +0 -0
  212. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/model_retry.py +0 -0
  213. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/notifications.py +0 -0
  214. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/offload.py +0 -0
  215. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/offload_api.py +0 -0
  216. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/offload_middleware.py +0 -0
  217. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/onboarding.py +0 -0
  218. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/output.py +0 -0
  219. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/paste_collapse.py +0 -0
  220. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/plugins/__init__.py +0 -0
  221. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/plugins/_json.py +0 -0
  222. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/plugins/adapters/__init__.py +0 -0
  223. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/plugins/adapters/hooks.py +0 -0
  224. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/plugins/adapters/mcp.py +0 -0
  225. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/plugins/adapters/skills.py +0 -0
  226. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/plugins/adapters/skills_middleware.py +0 -0
  227. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/plugins/commands_cli.py +0 -0
  228. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/plugins/discovery.py +0 -0
  229. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/plugins/manifest.py +0 -0
  230. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/plugins/marketplace.py +0 -0
  231. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/plugins/models.py +0 -0
  232. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/plugins/store.py +0 -0
  233. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/plugins/substitution.py +0 -0
  234. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/project_utils.py +0 -0
  235. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/py.typed +0 -0
  236. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/reasoning_effort.py +0 -0
  237. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/reliable_rubric.py +0 -0
  238. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/resume_state.py +0 -0
  239. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/server_graph.py +0 -0
  240. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/skills/__init__.py +0 -0
  241. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/skills/commands.py +0 -0
  242. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/skills/invocation.py +0 -0
  243. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/skills/load.py +0 -0
  244. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/skills/load_errors.py +0 -0
  245. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/skills/merge.py +0 -0
  246. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/skills/trust.py +0 -0
  247. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/state_migration.py +0 -0
  248. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/subagents.py +0 -0
  249. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/system_prompt.md +0 -0
  250. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/terminal_capabilities.py +0 -0
  251. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/terminal_escape.py +0 -0
  252. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/terminal_title.py +0 -0
  253. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/theme.py +0 -0
  254. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/thread_ownership.py +0 -0
  255. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/thread_titles.py +0 -0
  256. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tool_catalog.py +0 -0
  257. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tool_display.py +0 -0
  258. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tools.py +0 -0
  259. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/__init__.py +0 -0
  260. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/key_hints.py +0 -0
  261. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/modals/__init__.py +0 -0
  262. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/modals/_cost_breakdown.py +0 -0
  263. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/modals/btw.py +0 -0
  264. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/modals/btw.tcss +0 -0
  265. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/modals/cold_cache.py +0 -0
  266. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/modals/cost_breakdown.py +0 -0
  267. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/modals/mcp_servers.py +0 -0
  268. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/modals/mcp_servers.tcss +0 -0
  269. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/modals/model_switch.py +0 -0
  270. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/modals/plugin_manager/__init__.py +0 -0
  271. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/modals/plugin_manager/content.py +0 -0
  272. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/modals/plugin_manager/models.py +0 -0
  273. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/modals/plugin_manager/plugin_manager.tcss +0 -0
  274. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/modals/plugin_manager/state.py +0 -0
  275. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/modals/plugin_manager/tabs.py +0 -0
  276. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/modals/prompt_clipboard.py +0 -0
  277. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/modals/prompt_clipboard.tcss +0 -0
  278. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/modals/resume_blocked.py +0 -0
  279. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/modals/resume_compact.py +0 -0
  280. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/modals/session_cost.py +0 -0
  281. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/modals/session_cost.tcss +0 -0
  282. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/modals/thread_name.py +0 -0
  283. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/modals/thread_name.tcss +0 -0
  284. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/screens/__init__.py +0 -0
  285. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/textual_adapter.py +0 -0
  286. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/__init__.py +0 -0
  287. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/_condense_path.py +0 -0
  288. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/_copy_spans.py +0 -0
  289. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/_inline_prompt.py +0 -0
  290. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/_js_eval_display.py +0 -0
  291. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/_links.py +0 -0
  292. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/_paste_textarea.py +0 -0
  293. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/agent_selector.py +0 -0
  294. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/approval.py +0 -0
  295. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/ask_user.py +0 -0
  296. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/auth.py +0 -0
  297. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/auto_mode_notice.py +0 -0
  298. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/chat_input.py +0 -0
  299. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/codex_auth.py +0 -0
  300. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/context_usage.py +0 -0
  301. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/cwd_switch.py +0 -0
  302. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/debug_console.py +0 -0
  303. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/diff.py +0 -0
  304. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/effort_selector.py +0 -0
  305. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/goal_review.py +0 -0
  306. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/goal_status.py +0 -0
  307. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/history.py +0 -0
  308. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/install_confirm.py +0 -0
  309. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/launch_init.py +0 -0
  310. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/loading.py +0 -0
  311. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/mcp_login.py +0 -0
  312. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/mcp_reconnect.py +0 -0
  313. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/mcp_viewer.py +0 -0
  314. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/message_store.py +0 -0
  315. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/messages.py +0 -0
  316. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/model_selector.py +0 -0
  317. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/notification_center.py +0 -0
  318. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/notification_detail.py +0 -0
  319. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/notification_settings.py +0 -0
  320. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/prompt_search.py +0 -0
  321. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/restart_prompt.py +0 -0
  322. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/skill_trust.py +0 -0
  323. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/startup_tip.py +0 -0
  324. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/subagent_panel.py +0 -0
  325. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/theme_selector.py +0 -0
  326. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/thread_agent_switch.py +0 -0
  327. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/tool_renderers.py +0 -0
  328. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/tool_widgets.py +0 -0
  329. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/update_available.py +0 -0
  330. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/update_confirm.py +0 -0
  331. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/update_progress.py +0 -0
  332. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/welcome.py +0 -0
  333. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/tui/widgets/yolo_mode_notice.py +0 -0
  334. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/update_check.py +0 -0
  335. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/workspace.py +0 -0
  336. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/deepagents_code/workspace_diagnostics.py +0 -0
  337. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/examples/extensions/memory_store.py +0 -0
  338. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/examples/skills/arxiv-search/SKILL.md +0 -0
  339. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/examples/skills/arxiv-search/arxiv_search.py +0 -0
  340. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/examples/skills/langgraph-docs/SKILL.md +0 -0
  341. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/examples/skills/skill-creator/SKILL.md +0 -0
  342. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/examples/skills/skill-creator/scripts/init_skill.py +0 -0
  343. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/examples/skills/skill-creator/scripts/quick_validate.py +0 -0
  344. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/examples/skills/web-research/SKILL.md +0 -0
  345. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/hatch_build.py +0 -0
  346. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/images/debug-console-cost-breakdown.png +0 -0
  347. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/images/model-stream-retry.png +0 -0
  348. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/images/tui.png +0 -0
  349. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/scripts/check_imports.py +0 -0
  350. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/scripts/debug_server.sh +0 -0
  351. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/scripts/generate_commands_catalog.py +0 -0
  352. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/scripts/install.sh +0 -0
  353. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/README.md +0 -0
  354. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/integration_tests/__init__.py +0 -0
  355. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/integration_tests/benchmarks/__init__.py +0 -0
  356. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/integration_tests/benchmarks/test_codspeed_import_benchmarks.py +0 -0
  357. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/integration_tests/benchmarks/test_local_context_benchmarks.py +0 -0
  358. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/integration_tests/benchmarks/test_startup_benchmarks.py +0 -0
  359. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/integration_tests/benchmarks/test_thread_loading_benchmarks.py +0 -0
  360. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/integration_tests/conftest.py +0 -0
  361. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/integration_tests/test_acp_mode.py +0 -0
  362. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/integration_tests/test_auto_approve_remote.py +0 -0
  363. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/integration_tests/test_compact_resume.py +0 -0
  364. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/integration_tests/test_offload_server_side.py +0 -0
  365. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/integration_tests/test_pending_work_recovery.py +0 -0
  366. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/integration_tests/test_sandbox_factory.py +0 -0
  367. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/integration_tests/test_sandbox_operations.py +0 -0
  368. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/__init__.py +0 -0
  369. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/client/__init__.py +0 -0
  370. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/client/commands/__init__.py +0 -0
  371. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/client/commands/test_auth.py +0 -0
  372. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/client/commands/test_extras.py +0 -0
  373. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/client/commands/test_mcp.py +0 -0
  374. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/client/commands/test_tools.py +0 -0
  375. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/conftest.py +0 -0
  376. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/data/coding_agent_v1_validator.json +0 -0
  377. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/hooks/__init__.py +0 -0
  378. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/hooks/models/__init__.py +0 -0
  379. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/hooks/models/test_models.py +0 -0
  380. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/hooks/test_client_lifecycle.py +0 -0
  381. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/hooks/test_configuration.py +0 -0
  382. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/hooks/test_engine.py +0 -0
  383. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/hooks/test_execution.py +0 -0
  384. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/hooks/test_manager.py +0 -0
  385. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/hooks/test_presenter.py +0 -0
  386. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/hooks/test_server_lifecycle.py +0 -0
  387. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/hooks/test_transcript.py +0 -0
  388. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/hooks/test_trust.py +0 -0
  389. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/plugins/__init__.py +0 -0
  390. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/plugins/test_marketplace.py +0 -0
  391. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/plugins/test_plugin_hooks.py +0 -0
  392. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/plugins/test_plugins_p0.py +0 -0
  393. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/skills/__init__.py +0 -0
  394. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/skills/test_commands.py +0 -0
  395. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/skills/test_load.py +0 -0
  396. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/skills/test_merge.py +0 -0
  397. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/skills/test_pinned_skills.py +0 -0
  398. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/skills/test_skill_trust.py +0 -0
  399. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/skills/test_skills_json.py +0 -0
  400. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/skills/test_thread_inspector.py +0 -0
  401. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/smoke_tests/__init__.py +0 -0
  402. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/smoke_tests/conftest.py +0 -0
  403. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/smoke_tests/snapshots/system_prompt_headless_local.md +0 -0
  404. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/smoke_tests/snapshots/system_prompt_interactive_local.md +0 -0
  405. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/smoke_tests/test_system_prompt.py +0 -0
  406. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test__tool_stream.py +0 -0
  407. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_acp.py +0 -0
  408. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_agent.py +0 -0
  409. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_agent_friendly.py +0 -0
  410. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_agent_mcp_timeout.py +0 -0
  411. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_app_thread_ownership.py +0 -0
  412. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_approval_mode.py +0 -0
  413. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_args.py +0 -0
  414. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_ask_user_middleware.py +0 -0
  415. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_ask_user_types.py +0 -0
  416. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_auth_display.py +0 -0
  417. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_auth_store.py +0 -0
  418. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_auth_web_search_restart.py +0 -0
  419. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_auto_mode.py +0 -0
  420. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_btw.py +0 -0
  421. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_btw_api.py +0 -0
  422. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_charset.py +0 -0
  423. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_cli_provider.py +0 -0
  424. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_clipboard.py +0 -0
  425. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_coding_agent_metadata.py +0 -0
  426. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_cold_cache.py +0 -0
  427. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_command_registry.py +0 -0
  428. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_compact_tool.py +0 -0
  429. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_config.py +0 -0
  430. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_configurable_model.py +0 -0
  431. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_configuration.py +0 -0
  432. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_configuration_resolution.py +0 -0
  433. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_configuration_resolver.py +0 -0
  434. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_context_doctor.py +0 -0
  435. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_cost_breakdown.py +0 -0
  436. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_cost_tracking.py +0 -0
  437. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_cursor_style.py +0 -0
  438. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_debug.py +0 -0
  439. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_debug_buffer.py +0 -0
  440. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_debug_console.py +0 -0
  441. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_dep_floor_check.py +0 -0
  442. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_diff_utils.py +0 -0
  443. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_doctor.py +0 -0
  444. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_editor.py +0 -0
  445. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_end_to_end.py +0 -0
  446. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_env_vars.py +0 -0
  447. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_event_bus.py +0 -0
  448. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_exception_handling.py +0 -0
  449. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_extension_api.py +0 -0
  450. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_extension_cli_trust.py +0 -0
  451. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_extension_config_manifest.py +0 -0
  452. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_extension_discovery.py +0 -0
  453. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_extension_display.py +0 -0
  454. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_extension_host_runtime.py +0 -0
  455. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_extension_hosting.py +0 -0
  456. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_extension_runtime.py +0 -0
  457. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_extra_skills_dirs.py +0 -0
  458. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_extras_info.py +0 -0
  459. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_file_ops.py +0 -0
  460. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_fork_goal_notice.py +0 -0
  461. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_formatting.py +0 -0
  462. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_git.py +0 -0
  463. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_glm_5p2_profile.py +0 -0
  464. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_goal_criteria_client.py +0 -0
  465. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_goal_rubric.py +0 -0
  466. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_goal_state_limits.py +0 -0
  467. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_goal_state_notice.py +0 -0
  468. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_goal_state_persistence.py +0 -0
  469. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_goal_tools.py +0 -0
  470. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_groq_tool_limit.py +0 -0
  471. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_hatch_build.py +0 -0
  472. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_hooks.py +0 -0
  473. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_imports.py +0 -0
  474. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_install_command.py +0 -0
  475. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_install_script.py +0 -0
  476. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_interpreter_workspace_policy.py +0 -0
  477. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_invocation.py +0 -0
  478. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_iterm_cursor_guide.py +0 -0
  479. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_js_cost_sync.py +0 -0
  480. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_js_cost_tracking.py +0 -0
  481. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_json_types.py +0 -0
  482. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_local_context.py +0 -0
  483. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_main.py +0 -0
  484. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_main_acp_mode.py +0 -0
  485. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_managed_tools.py +0 -0
  486. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_mcp_disabled.py +0 -0
  487. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_mcp_lifecycle.py +0 -0
  488. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_mcp_login_service.py +0 -0
  489. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_mcp_middleware.py +0 -0
  490. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_mcp_oauth_ui.py +0 -0
  491. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_mcp_proxy.py +0 -0
  492. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_mcp_schema.py +0 -0
  493. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_mcp_tools.py +0 -0
  494. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_media_utils.py +0 -0
  495. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_memory_guard.py +0 -0
  496. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_model_catalog.py +0 -0
  497. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_model_config.py +0 -0
  498. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_model_metadata.py +0 -0
  499. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_model_retry.py +0 -0
  500. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_model_switch.py +0 -0
  501. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_notifications.py +0 -0
  502. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_offload.py +0 -0
  503. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_offload_api.py +0 -0
  504. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_onboarding.py +0 -0
  505. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_openai_codex_integration.py +0 -0
  506. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_output.py +0 -0
  507. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_paths.py +0 -0
  508. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_process_cwd_check.py +0 -0
  509. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_reasoning_effort.py +0 -0
  510. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_reliable_rubric.py +0 -0
  511. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_reload.py +0 -0
  512. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_remote_client.py +0 -0
  513. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_repository_bounds.py +0 -0
  514. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_resume_compaction_recovery.py +0 -0
  515. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_resume_state.py +0 -0
  516. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_resume_workspace_errors.py +0 -0
  517. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_rubric_cli.py +0 -0
  518. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_sandbox_config.py +0 -0
  519. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_sandbox_factory.py +0 -0
  520. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_sandbox_provider.py +0 -0
  521. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_sandbox_registry.py +0 -0
  522. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_server.py +0 -0
  523. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_server_config.py +0 -0
  524. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_server_graph.py +0 -0
  525. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_server_helpers.py +0 -0
  526. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_server_manager.py +0 -0
  527. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_server_tracing.py +0 -0
  528. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_session_stats.py +0 -0
  529. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_shell_allow_list.py +0 -0
  530. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_skill_invocation.py +0 -0
  531. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_startup_fast_paths.py +0 -0
  532. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_state_migration.py +0 -0
  533. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_subagents.py +0 -0
  534. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_terminal_capabilities.py +0 -0
  535. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_terminal_escape.py +0 -0
  536. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_terminal_progress_preference.py +0 -0
  537. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_terminal_stderr.py +0 -0
  538. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_terminal_title.py +0 -0
  539. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_text_encoding.py +0 -0
  540. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_textual_patches.py +0 -0
  541. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_theme.py +0 -0
  542. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_thread_naming_app.py +0 -0
  543. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_thread_ownership.py +0 -0
  544. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_thread_ownership_transitions.py +0 -0
  545. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_thread_titles.py +0 -0
  546. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_threads_resume.py +0 -0
  547. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_tool_catalog.py +0 -0
  548. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_tool_display.py +0 -0
  549. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_tracing.py +0 -0
  550. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_tracing_replicas.py +0 -0
  551. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_transcript_virtualization.py +0 -0
  552. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_ui.py +0 -0
  553. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_unicode_security.py +0 -0
  554. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_uninstall_command.py +0 -0
  555. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_update_check.py +0 -0
  556. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_version.py +0 -0
  557. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_workspace.py +0 -0
  558. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/test_workspace_diagnostics.py +0 -0
  559. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tools/__init__.py +0 -0
  560. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tools/test_current_thread.py +0 -0
  561. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tools/test_fetch_url.py +0 -0
  562. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tools/test_tool_arg_schemas.py +0 -0
  563. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tools/test_web_search.py +0 -0
  564. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/__init__.py +0 -0
  565. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/modals/__init__.py +0 -0
  566. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/modals/plugin_manager/__init__.py +0 -0
  567. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/modals/plugin_manager/test_inspection.py +0 -0
  568. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/modals/plugin_manager/test_structure.py +0 -0
  569. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/modals/test_cold_cache.py +0 -0
  570. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/modals/test_model_switch.py +0 -0
  571. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/modals/test_prompt_clipboard.py +0 -0
  572. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/modals/test_resume_blocked.py +0 -0
  573. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/modals/test_session_cost.py +0 -0
  574. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/test_key_hints.py +0 -0
  575. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/test_modal_footer_layout.py +0 -0
  576. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/test_subagent_stream.py +0 -0
  577. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/test_textual_adapter.py +0 -0
  578. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/widgets/__init__.py +0 -0
  579. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/widgets/test_agent_selector.py +0 -0
  580. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/widgets/test_approval.py +0 -0
  581. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/widgets/test_ask_user.py +0 -0
  582. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/widgets/test_auth_widgets.py +0 -0
  583. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/widgets/test_auto_mode_notice.py +0 -0
  584. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/widgets/test_chat_input.py +0 -0
  585. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/widgets/test_condense_path.py +0 -0
  586. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/widgets/test_copy_spans.py +0 -0
  587. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/widgets/test_cwd_switch.py +0 -0
  588. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/widgets/test_diff.py +0 -0
  589. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/widgets/test_goal_review.py +0 -0
  590. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/widgets/test_history.py +0 -0
  591. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/widgets/test_inline_prompt.py +0 -0
  592. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/widgets/test_install_confirm.py +0 -0
  593. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/widgets/test_launch_init.py +0 -0
  594. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/widgets/test_links.py +0 -0
  595. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/widgets/test_loading.py +0 -0
  596. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/widgets/test_mcp_login_modal.py +0 -0
  597. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/widgets/test_mcp_reconnect.py +0 -0
  598. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/widgets/test_mcp_viewer.py +0 -0
  599. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/widgets/test_message_store.py +0 -0
  600. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/widgets/test_messages.py +0 -0
  601. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/widgets/test_model_selector.py +0 -0
  602. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/widgets/test_notification_center.py +0 -0
  603. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/widgets/test_notification_detail.py +0 -0
  604. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/widgets/test_notification_settings.py +0 -0
  605. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/widgets/test_prompt_search.py +0 -0
  606. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/widgets/test_restart_prompt.py +0 -0
  607. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/widgets/test_skill_trust_screen.py +0 -0
  608. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/widgets/test_startup_tip.py +0 -0
  609. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/widgets/test_status.py +0 -0
  610. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/widgets/test_subagent_panel.py +0 -0
  611. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/widgets/test_thread_agent_switch.py +0 -0
  612. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/widgets/test_tool_renderers.py +0 -0
  613. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/widgets/test_update_available.py +0 -0
  614. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/widgets/test_update_confirm.py +0 -0
  615. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/widgets/test_update_progress.py +0 -0
  616. {deepagents_code-0.1.86 → deepagents_code-0.1.87}/tests/unit_tests/tui/widgets/test_welcome.py +0 -0
@@ -2,6 +2,21 @@
2
2
 
3
3
  # Deep Agents Code Changelog
4
4
 
5
+ ## [0.1.87](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.86...deepagents-code==0.1.87) (2026-10-20)
6
+
7
+ ### Features
8
+
9
+ - Resume threads in non-interactive mode ([#7011](https://github.com/langchain-ai/deepagents/pull/7011)).
10
+ - Compact large idle sessions before the prompt cache expires ([#6956](https://github.com/langchain-ai/deepagents/pull/6956)) and show the prompt-cache expiration time ([#7005](https://github.com/langchain-ai/deepagents/pull/7005)).
11
+ - Support custom Slack OAuth app identity ([#7061](https://github.com/langchain-ai/deepagents/pull/7061)).
12
+ - Load older threads from the thread switcher ([#7051](https://github.com/langchain-ai/deepagents/pull/7051)).
13
+
14
+ ### Bug Fixes
15
+
16
+ - Stop the local server when its owner dies ([#7038](https://github.com/langchain-ai/deepagents/pull/7038)).
17
+ - Support non-ASCII file names in `@` mentions ([#7023](https://github.com/langchain-ai/deepagents/pull/7023)).
18
+ - Correct misleading `/reload` change summaries ([#7063](https://github.com/langchain-ai/deepagents/pull/7063)).
19
+
5
20
  ## [0.1.86](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.85...deepagents-code==0.1.86) (2026-10-16)
6
21
 
7
22
  ### Features
@@ -69,6 +69,30 @@ make lint
69
69
 
70
70
  Run `make help` to see every available target.
71
71
 
72
+ ## Custom Slack MCP app identity
73
+
74
+ Slack's hosted MCP server attributes sent messages to the OAuth app used to connect. To use your own registered Slack app instead of Deep Agents Code, add an `oauth` object to its `.mcp.json` server entry:
75
+
76
+ ```json
77
+ {
78
+ "mcpServers": {
79
+ "slack": {
80
+ "type": "http",
81
+ "url": "https://mcp.slack.com/mcp",
82
+ "auth": "oauth",
83
+ "oauth": {
84
+ "client_id": "${SLACK_CLIENT_ID}",
85
+ "client_secret": "${SLACK_CLIENT_SECRET}"
86
+ }
87
+ }
88
+ }
89
+ }
90
+ ```
91
+
92
+ Enable MCP access for your Slack app and register `http://localhost:3118/callback` as its redirect URL. Set the environment variables and run `dcode mcp login slack` to authorize it. Confidential apps use `client_secret_post`; omit `client_secret` only for an app registered as a public client. Keep secrets in environment variables, not committed config. The registration, including any secret, is saved in the existing restricted local token store.
93
+
94
+ Credentials are isolated by server name, URL, and configured client ID, so changing apps requires a separate login and never reuses the default app's grant. Re-run login after rotating a client secret. Omitting `oauth` preserves the existing app and credentials. This selects the authenticated app; it does not let a message supply arbitrary attribution or suppress Slack's footer. These settings apply to dcode; Talon's separate OAuth implementation is unchanged.
95
+
72
96
  ## LangSmith tracing projects
73
97
 
74
98
  When LangSmith tracing is enabled and a `LANGSMITH_API_KEY` is available, `deepagents-code` traces its own agent runs to LangSmith. A key alone is not enough for environment-supplied keys — set `LANGSMITH_TRACING=true`. Keys stored via `/auth` auto- enable tracing unless you explicitly opt out (for example `DEEPAGENTS_CODE_LANGSMITH_TRACING=false`).
@@ -91,6 +115,33 @@ When onboarding a new tracing project to Engine, capture the nature of that proj
91
115
 
92
116
  A server keeps the first workspace's tracing configuration for its lifetime. Workspaces sharing that server must use matching tracing credentials, projects, endpoints, profile selectors, tracing flags, and redaction policy. A conflicting workspace is refused before its settings can affect cached or concurrent runs; start a separate server for that workspace. Restart the server to change its tracing configuration.
93
117
 
118
+ ## Idle context compaction
119
+
120
+ Idle compaction is disabled by default. When enabled, the interactive client
121
+ automatically uses the existing `/offload` operation for contexts at or above
122
+ the configured token threshold during the final 20% of a known prompt-cache
123
+ retention window, capped at 120 seconds (60 seconds for a 5-minute window). This keeps the same thread and archives older
124
+ messages; it does not create a handoff thread. The configured offload model is
125
+ used, so summarization can incur costs and cache reuse is not guaranteed.
126
+
127
+ Opt in with a token threshold through the normal layered config:
128
+
129
+ ```toml
130
+ [history]
131
+ idle_compaction_tokens = 100000
132
+ ```
133
+
134
+ Alternatively, set `DEEPAGENTS_CODE_IDLE_COMPACTION_TOKENS=100000` before
135
+ launching dcode.
136
+
137
+ Set `idle_compaction_tokens = 0` to disable it again. File edits take effect after
138
+ `/reload`. This setting is independent of cold-cache warning preferences.
139
+ Compaction skips busy sessions, queued input, active typing, modals, lifecycle
140
+ transitions, and approximate token counts. It attempts at most once per thread
141
+ and cache window, announces the operation, and supports Escape cancellation.
142
+ Input arriving before the worker starts skips compaction; input arriving after
143
+ it starts uses the normal offload queue and runs once compaction finishes.
144
+
94
145
  ## Debugging
95
146
 
96
147
  Deep Agents Code runs as two processes: the **Textual TUI** you interact with, and a **`langgraph dev` subprocess** that hosts the agent graph. Each writes its own log, and a single switch turns both on:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: deepagents-code
3
- Version: 0.1.86
3
+ Version: 0.1.87
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
@@ -30,7 +30,7 @@ Requires-Python: <4.0,>=3.12
30
30
  Requires-Dist: aiosqlite<1.0.0,>=0.22.1
31
31
  Requires-Dist: anyio<5.0.0,>=4.14.2
32
32
  Requires-Dist: deepagents-acp<1.0.0,>=0.0.10
33
- Requires-Dist: deepagents==0.7.28
33
+ Requires-Dist: deepagents==0.7.29
34
34
  Requires-Dist: fastmcp<5.0.0,>=4.0.0b4
35
35
  Requires-Dist: filelock<3.30,>=3.29.7
36
36
  Requires-Dist: genai-prices<0.2.0,>=0.1.13
@@ -41,9 +41,9 @@ Requires-Dist: langchain-openai<2.0.0,>=1.7.2
41
41
  Requires-Dist: langchain-quickjs<0.4.0,>=0.3.4
42
42
  Requires-Dist: langchain<2.0.0,>=1.4.6
43
43
  Requires-Dist: langgraph-checkpoint-sqlite<4.0.0,>=3.1.2
44
- Requires-Dist: langgraph-cli[inmem]<1.0.0,>=0.4.35
45
- Requires-Dist: langgraph-runtime-inmem<1.0.0,>=0.36.1
46
- Requires-Dist: langgraph-sdk<1.0.0,>=0.4.7
44
+ Requires-Dist: langgraph-cli[inmem]<1.0.0,>=0.4.37
45
+ Requires-Dist: langgraph-runtime-inmem<1.0.0,>=0.36.2
46
+ Requires-Dist: langgraph-sdk<1.0.0,>=0.4.8
47
47
  Requires-Dist: langsmith[sandbox]>=0.14.11
48
48
  Requires-Dist: markdownify<2.0.0,>=1.2.3
49
49
  Requires-Dist: mcp<3.0.0,>=2.0.0
@@ -1,3 +1,3 @@
1
1
  """Generated at build time. Do not edit or commit."""
2
2
 
3
- BUILD_COMMIT = "577e3f1"
3
+ BUILD_COMMIT = "d1962cf"
@@ -14,7 +14,7 @@ DEFAULT_AGENT_NAME: Final[str] = "agent"
14
14
  """Default agent / assistant identifier when no `-a` flag is given."""
15
15
 
16
16
  DEFAULT_THREAD_LIMIT: Final[int] = 100
17
- """Fallback maximum number of recent threads to load and display."""
17
+ """Fallback for `get_thread_limit()`, the thread switcher batch size."""
18
18
 
19
19
  FS_TOOL_NAMES: Final[frozenset[str]] = frozenset(
20
20
  {"ls", "read_file", "write_file", "edit_file", "delete", "glob", "grep", "execute"}
@@ -328,6 +328,9 @@ HIDE_SPLASH_TIPS = "DEEPAGENTS_CODE_HIDE_SPLASH_TIPS"
328
328
  HIDE_SPLASH_VERSION = "DEEPAGENTS_CODE_HIDE_SPLASH_VERSION"
329
329
  """Hide version and local-install details in the splash screen when enabled."""
330
330
 
331
+ IDLE_COMPACTION_TOKENS = "DEEPAGENTS_CODE_IDLE_COMPACTION_TOKENS"
332
+ """Minimum context tokens for opt-in idle compaction; 0 disables it."""
333
+
331
334
  HISTORY_RETENTION_DAYS = "DEEPAGENTS_CODE_HISTORY_RETENTION_DAYS"
332
335
  """Days an offloaded conversation-history archive is kept before the startup
333
336
  sweep deletes it.
@@ -514,7 +517,11 @@ repo file, so a project `.env` cannot disable itself.
514
517
  """
515
518
 
516
519
  RECENT_THREADS = "DEEPAGENTS_CODE_RECENT_THREADS"
517
- """Maximum recent threads (default: `_constants.DEFAULT_THREAD_LIMIT`)."""
520
+ """Recent threads per batch (default: 100, `_constants.DEFAULT_THREAD_LIMIT`).
521
+
522
+ The thread switcher loads this many at a time. It is also the default row
523
+ limit for `threads list` (override with `-n`) and `@@` thread completion.
524
+ """
518
525
 
519
526
  RECURSION_LIMIT = "DEEPAGENTS_CODE_RECURSION_LIMIT"
520
527
  """Override the main agent's LangGraph `recursion_limit` (graph step budget).
@@ -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.86" # x-release-please-version
5
+ __version__ = "0.1.87" # 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."""
@@ -2111,6 +2111,9 @@ Two seconds balances responsiveness with avoiding accidental approval
2111
2111
  key presses.
2112
2112
  """
2113
2113
 
2114
+ _IDLE_COMPACTION_LEAD_SECONDS = 120
2115
+ """Lead time for automatic idle context compaction."""
2116
+
2114
2117
  _CACHE_EXPIRING_LEAD_SECONDS = 60
2115
2118
  """Lead time for the prompt-cache retention notification."""
2116
2119
 
@@ -4579,6 +4582,7 @@ class DeepAgentsApp(App):
4579
4582
  )
4580
4583
  """Minimum estimated cold-versus-warm cost delta that opens the modal."""
4581
4584
 
4585
+ self._idle_compaction_seen: dict[str, datetime] = {}
4582
4586
  self._cache_expiring_seen: dict[str, datetime] = {}
4583
4587
  self._cache_expiring_worker: Worker[None] | None = None
4584
4588
 
@@ -6016,16 +6020,9 @@ class DeepAgentsApp(App):
6016
6020
  Returns:
6017
6021
  A short user-facing provenance and rationale sentence.
6018
6022
  """
6019
- if source == "managed config":
6020
- owner = "Your administrator set this policy through managed config"
6021
- elif source == "config.toml":
6022
- owner = "This policy was set in your config.toml"
6023
- else:
6024
- owner = "This policy was set by active configuration"
6025
- return (
6026
- f"{owner} to keep older threads from restoring stale context after "
6027
- "model or policy changes."
6028
- )
6023
+ from deepagents_code.resume_policy import resume_cutoff_explanation
6024
+
6025
+ return resume_cutoff_explanation(source)
6029
6026
 
6030
6027
  @staticmethod
6031
6028
  def _resume_cutoff() -> tuple[datetime, str, bool] | None:
@@ -6034,69 +6031,16 @@ class DeepAgentsApp(App):
6034
6031
  Returns:
6035
6032
  The cutoff, its source, and whether it is rolling, or `None`.
6036
6033
  """
6037
- from deepagents_code.config_manifest import (
6038
- _emit_ranked_diagnostics,
6039
- _ranked_source,
6040
- get_option,
6041
- parse_duration_seconds,
6042
- )
6043
- from deepagents_code.configuration.resolver import get_config_resolver
6034
+ from deepagents_code.resume_policy import resume_cutoff
6044
6035
 
6045
- resolver = get_config_resolver()
6046
- cutoffs: list[tuple[datetime, str, bool]] = []
6047
- for key in ("threads.resume_after", "threads.max_resume_age"):
6048
- option = get_option(key)
6049
- if option is None:
6050
- continue
6051
- resolved = resolver.get(option)
6052
- _emit_ranked_diagnostics(option, resolved)
6053
- value = resolved.value
6054
- if key.endswith("resume_after") and isinstance(value, str):
6055
- cutoffs.append(
6056
- (datetime.fromisoformat(value), _ranked_source(resolved), False)
6057
- )
6058
- elif key.endswith("max_resume_age") and isinstance(value, str):
6059
- seconds = parse_duration_seconds(value)
6060
- if seconds is not None:
6061
- cutoff = datetime.min.replace(tzinfo=UTC)
6062
- with suppress(OverflowError):
6063
- cutoff = datetime.now(UTC) - timedelta(seconds=seconds)
6064
- cutoffs.append((cutoff, _ranked_source(resolved), True))
6065
- return max(cutoffs, default=None)
6036
+ return resume_cutoff()
6066
6037
 
6067
6038
  @staticmethod
6068
6039
  async def _thread_resume_block(thread_id: str) -> str | None:
6069
6040
  """Return why configured policy blocks resuming a thread, if applicable."""
6070
- from deepagents_code.config_manifest import normalize_iso_datetime
6071
- from deepagents_code.sessions import get_thread_updated_at
6041
+ from deepagents_code.resume_policy import thread_resume_block
6072
6042
 
6073
- policy = DeepAgentsApp._resume_cutoff()
6074
- if policy is None:
6075
- return None
6076
- cutoff, source, rolling = policy
6077
- explanation = DeepAgentsApp._resume_cutoff_explanation(source)
6078
- updated_value = await get_thread_updated_at(thread_id)
6079
- normalized = normalize_iso_datetime(updated_value)
6080
- if normalized is None:
6081
- logger.warning(
6082
- "Blocking resume for thread %s: missing or invalid updated_at %r",
6083
- thread_id,
6084
- updated_value,
6085
- )
6086
- return (
6087
- f"Thread {thread_id} cannot be resumed because its last-updated "
6088
- f"time could not be verified.\n\n{explanation}"
6089
- )
6090
- if datetime.fromisoformat(normalized) >= cutoff:
6091
- return None
6092
- reason = (
6093
- "it is older than the configured maximum age"
6094
- if rolling
6095
- else f"it was last updated before {cutoff.isoformat()}"
6096
- )
6097
- return (
6098
- f"Thread {thread_id} cannot be resumed because {reason}.\n\n{explanation}"
6099
- )
6043
+ return await thread_resume_block(thread_id, DeepAgentsApp._resume_cutoff())
6100
6044
 
6101
6045
  def _reserve_thread(self, thread_id: str) -> None:
6102
6046
  """Reserve a locally managed thread before reading or adopting it."""
@@ -9758,29 +9702,72 @@ class DeepAgentsApp(App):
9758
9702
  banners = self.screen_stack[0].query("#cache-expired-banner")
9759
9703
  if banners:
9760
9704
  expires_at = self._status_bar.cache_expires_at if self._status_bar else None
9761
- banners.first().display = (
9705
+ banner = banners.first(Static)
9706
+ banner.display = (
9762
9707
  not self._cache_reconciliation_pending
9763
9708
  and expires_at is not None
9764
9709
  and datetime.now(UTC) >= expires_at
9765
9710
  )
9711
+ if banner.display and expires_at is not None:
9712
+ expired_at = expires_at.astimezone().strftime("%H:%M:%S")
9713
+ elapsed = datetime.now(UTC) - expires_at
9714
+ age = "just now"
9715
+ for unit in ("day", "hour", "minute"):
9716
+ count = elapsed // timedelta(**{f"{unit}s": 1})
9717
+ if count:
9718
+ age = f"{count} {unit}{'s' if count != 1 else ''} ago"
9719
+ break
9720
+ banner.update(f"Prompt cache expired at {expired_at} ({age})")
9766
9721
 
9767
- def _check_cache_expiry(self) -> None:
9768
- """Offer a handoff once per expired cache window, only when idle.
9722
+ def _check_idle_compaction(self) -> None:
9723
+ """Reserve one offload per warm cache window, without yielding to input."""
9724
+ from deepagents_code.config_manifest import get_option
9725
+ from deepagents_code.configuration.resolver import get_config_resolver
9769
9726
 
9770
- Polled every second from `on_mount`. Acts only when
9771
- `warnings.cache_prompt` is `expiry` and no cold-cache opt-out applies.
9772
- """
9773
- self._refresh_cache_expiry_banner()
9727
+ option = get_option("history.idle_compaction_tokens")
9728
+ threshold = get_config_resolver().get(option).value if option else 0
9774
9729
  expires_at = self._status_bar.cache_expires_at if self._status_bar else None
9730
+ window = self._status_bar.cache_window_seconds if self._status_bar else None
9731
+ lead = min(window * 0.2, _IDLE_COMPACTION_LEAD_SECONDS) if window else 0
9775
9732
  thread_id = self._lc_thread_id
9776
9733
  if (
9777
- expires_at is None
9734
+ not isinstance(threshold, int)
9735
+ or threshold <= 0
9736
+ or self._tokens_approximate
9737
+ or self._context_tokens < threshold
9778
9738
  or not thread_id
9779
- or datetime.now(UTC) < expires_at
9780
- or self._cache_expiry_seen.get(thread_id) == expires_at
9781
- or not self._agent
9739
+ or expires_at is None
9740
+ or self._idle_compaction_seen.get(thread_id) == expires_at
9741
+ or not 0 < (expires_at - datetime.now(UTC)).total_seconds() <= lead
9742
+ or not self._cache_maintenance_idle()
9743
+ or self._remote_agent() is None
9744
+ ):
9745
+ return
9746
+ self._idle_compaction_seen[thread_id] = expires_at
9747
+ self._set_agent_running(True)
9748
+ try:
9749
+ self._offload_worker = self.run_worker(
9750
+ self._run_offload_task(idle_window=(thread_id, expires_at)),
9751
+ group="offload",
9752
+ exit_on_error=False,
9753
+ )
9754
+ except Exception:
9755
+ self._set_agent_running(False)
9756
+ logger.exception("Failed to schedule idle compaction")
9757
+
9758
+ def _cache_maintenance_idle(self, *, reserved: bool = False) -> bool:
9759
+ """Require a quiescent UI before automatic cache maintenance.
9760
+
9761
+ Args:
9762
+ reserved: Ignore the automatic offload's own busy reservation.
9763
+
9764
+ Returns:
9765
+ Whether no UI activity competes with cache maintenance.
9766
+ """
9767
+ return not (
9768
+ not self._agent
9782
9769
  or not self._session_state
9783
- or self._agent_running
9770
+ or (self._agent_running and not reserved)
9784
9771
  or self._agent_reconciling
9785
9772
  or self._goal_state_mutating
9786
9773
  or self._shell_running
@@ -9796,6 +9783,25 @@ class DeepAgentsApp(App):
9796
9783
  or self._reloading
9797
9784
  or self._exiting
9798
9785
  or isinstance(self.screen, ModalScreen)
9786
+ or self._cache_reconciliation_pending
9787
+ )
9788
+
9789
+ def _check_cache_expiry(self) -> None:
9790
+ """Offer a handoff once per expired cache window, only when idle.
9791
+
9792
+ Polled every second from `on_mount`. Acts only when
9793
+ `warnings.cache_prompt` is `expiry` and no cold-cache opt-out applies.
9794
+ """
9795
+ self._refresh_cache_expiry_banner()
9796
+ self._check_idle_compaction()
9797
+ expires_at = self._status_bar.cache_expires_at if self._status_bar else None
9798
+ thread_id = self._lc_thread_id
9799
+ if (
9800
+ expires_at is None
9801
+ or not thread_id
9802
+ or datetime.now(UTC) < expires_at
9803
+ or self._cache_expiry_seen.get(thread_id) == expires_at
9804
+ or not self._cache_maintenance_idle()
9799
9805
  ):
9800
9806
  return
9801
9807
  if (
@@ -18310,7 +18316,7 @@ class DeepAgentsApp(App):
18310
18316
  f" - {change}" for change in changes
18311
18317
  )
18312
18318
  else:
18313
- report = "Configuration reloaded. No changes detected."
18319
+ report = "Configuration reloaded."
18314
18320
  report += "\nModel config caches cleared."
18315
18321
  if theme_reload_ok:
18316
18322
  report += "\nTheme registry reloaded."
@@ -18803,10 +18809,26 @@ class DeepAgentsApp(App):
18803
18809
  ErrorMessage(f"Offload failed: {format_agent_exception(exc)}")
18804
18810
  )
18805
18811
 
18806
- async def _run_offload_task(self) -> None:
18812
+ async def _run_offload_task(
18813
+ self, *, idle_window: tuple[str, datetime] | None = None
18814
+ ) -> None:
18807
18815
  """Run a synchronously reserved `/offload` outside the App message pump."""
18808
18816
  self._offload_task_started = True
18809
18817
  try:
18818
+ if idle_window is not None:
18819
+ if (
18820
+ self._lc_thread_id != idle_window[0]
18821
+ or not self._status_bar
18822
+ or self._status_bar.cache_expires_at != idle_window[1]
18823
+ or datetime.now(UTC) >= idle_window[1]
18824
+ or not self._cache_maintenance_idle(reserved=True)
18825
+ ):
18826
+ self._set_agent_running(False)
18827
+ return
18828
+ self.notify(
18829
+ "Compacting idle context before cache expiry.",
18830
+ markup=False,
18831
+ )
18810
18832
  await self._handle_offload(reserved=True)
18811
18833
  finally:
18812
18834
  self._offload_task_started = False
@@ -30632,46 +30654,14 @@ class DeepAgentsApp(App):
30632
30654
  ) -> tuple[Literal["match", "unavailable", "mismatch"], Path | None]:
30633
30655
  """Classify a stored thread cwd against the current app cwd.
30634
30656
 
30635
- Args:
30636
- raw: The cwd recorded in the thread's checkpoint metadata. May be
30637
- relative or use `~`; both are normalized here.
30638
- current_cwd: The app's current working directory.
30657
+ See `resume_policy.classify_thread_cwd`.
30639
30658
 
30640
30659
  Returns:
30641
- A `(status, path)` pair. `path` is only set when `status` is
30642
- `"mismatch"`; it is `None` otherwise. `status` is one of:
30643
-
30644
- - `"match"`: the stored cwd resolves to the current cwd; no action.
30645
- - `"unavailable"`: the stored cwd is relative/malformed, or names an
30646
- absolute directory that no longer exists — it cannot be honored,
30647
- so the caller should warn and stay put.
30648
- - `"mismatch"`: the stored cwd is a real directory that differs from
30649
- the current cwd — the caller should offer to switch.
30650
- """
30651
- target = Path(raw).expanduser()
30652
- if not target.is_absolute() or not target.is_dir():
30653
- # Relative/malformed or missing directory: cannot be honored.
30654
- return "unavailable", None
30655
- try:
30656
- current = Path(current_cwd).expanduser().resolve()
30657
- resolved = target.resolve()
30658
- except OSError:
30659
- # Symlink resolution failed (e.g. ELOOP, permission on a path
30660
- # component). Fall back to a non-resolving comparison, which can
30661
- # report a spurious mismatch for symlinked-but-equal paths; log so
30662
- # the degraded comparison is traceable.
30663
- logger.debug(
30664
- "Could not resolve cwd paths for mismatch check (%r vs %r); "
30665
- "falling back to non-resolving comparison",
30666
- current_cwd,
30667
- raw,
30668
- exc_info=True,
30669
- )
30670
- current = Path(current_cwd).expanduser().absolute()
30671
- resolved = target.absolute()
30672
- if current == resolved:
30673
- return "match", None
30674
- return "mismatch", resolved
30660
+ A `(status, path)` pair; `path` is set only for `"mismatch"`.
30661
+ """
30662
+ from deepagents_code.resume_policy import classify_thread_cwd
30663
+
30664
+ return classify_thread_cwd(raw, current_cwd)
30675
30665
 
30676
30666
  async def _thread_cwd_mismatch(self, thread_id: str) -> Path | None:
30677
30667
  """Return the thread cwd when it differs from the current app cwd."""
@@ -152,14 +152,18 @@ async def run_mcp_login_list(*, config_path: str | None) -> int:
152
152
  continue
153
153
  try:
154
154
  resolved_config = resolve_mcp_server_env(server_name, server_config)
155
- except (RuntimeError, TypeError) as exc:
155
+ except (RuntimeError, TypeError, ValueError) as exc:
156
156
  print( # noqa: T201
157
157
  f"Invalid MCP server config for {server_name!r}: {exc}",
158
158
  file=sys.stderr,
159
159
  )
160
160
  unreadable += 1
161
161
  continue
162
- storage = FileTokenStorage(server_name, server_url=resolved_config["url"])
162
+ storage = FileTokenStorage(
163
+ server_name,
164
+ server_url=resolved_config["url"],
165
+ oauth_client_id=(resolved_config.get("oauth") or {}).get("client_id"),
166
+ )
163
167
  try:
164
168
  tokens = await storage.get_tokens()
165
169
  except (OSError, RuntimeError, ValueError) as exc:
@@ -0,0 +1,133 @@
1
+ """Resolve `dcode -r <id> -n ...` into a thread the headless run may continue.
2
+
3
+ Headless resume never falls back to a new thread. Threads stay bound to the
4
+ workspace policy they were created with, so only threads started headless from
5
+ the same directory with the same flags can be resumed here.
6
+ """
7
+
8
+ from __future__ import annotations
9
+
10
+ from dataclasses import dataclass
11
+ from typing import TYPE_CHECKING, Any, cast
12
+
13
+ if TYPE_CHECKING:
14
+ from collections.abc import Mapping
15
+
16
+
17
+ @dataclass(frozen=True)
18
+ class ResumeRequest:
19
+ """An explicit `-r <id>` resume request from the command line."""
20
+
21
+ thread_id: str
22
+
23
+ adopt_agent: bool
24
+ """Use the thread's agent; `False` when `-a` was given."""
25
+
26
+ adopt_model: bool
27
+ """Use the thread's last model; `False` when `-M` was given."""
28
+
29
+
30
+ @dataclass(frozen=True)
31
+ class ResumeTarget:
32
+ """A thread that exists and passes the resume-age policy."""
33
+
34
+ thread_id: str
35
+ agent_name: str | None
36
+ cwd: str | None
37
+
38
+
39
+ class ResumeError(Exception):
40
+ """A user-facing reason the requested thread cannot be resumed."""
41
+
42
+
43
+ WORKSPACE_CONFLICT_MESSAGE = (
44
+ "Couldn't resume this thread because it was created with different "
45
+ "settings. A thread keeps the directory, agent, approval, shell, sandbox, "
46
+ "and MCP settings it started with, so threads from the interactive UI "
47
+ "can't be resumed with -n. Rerun from the same directory with the same "
48
+ "flags as the run that created it."
49
+ )
50
+
51
+
52
+ async def resolve_resume_target(thread_id: str) -> ResumeTarget:
53
+ """Look up a thread to resume and enforce the resume-age policy.
54
+
55
+ Args:
56
+ thread_id: The exact thread ID given to `-r`.
57
+
58
+ Returns:
59
+ The thread's persisted agent and directory.
60
+
61
+ Raises:
62
+ ResumeError: The thread is missing or blocked by policy.
63
+ """
64
+ from deepagents_code.resume_policy import resume_cutoff, thread_resume_block
65
+ from deepagents_code.sessions import (
66
+ find_similar_threads,
67
+ get_thread_agent,
68
+ get_thread_cwd,
69
+ thread_exists,
70
+ )
71
+
72
+ if not await thread_exists(thread_id):
73
+ similar = await find_similar_threads(thread_id)
74
+ msg = f"Thread '{thread_id}' not found."
75
+ if similar:
76
+ msg += f" Did you mean: {', '.join(similar)}?"
77
+ raise ResumeError(msg)
78
+ if blocked := await thread_resume_block(thread_id, resume_cutoff()):
79
+ raise ResumeError(blocked)
80
+ return ResumeTarget(
81
+ thread_id=thread_id,
82
+ agent_name=await get_thread_agent(thread_id),
83
+ cwd=await get_thread_cwd(thread_id),
84
+ )
85
+
86
+
87
+ def cwd_conflict(target: ResumeTarget, current_cwd: str) -> str | None:
88
+ """Explain why `target` cannot be resumed from `current_cwd`.
89
+
90
+ The server refuses a directory change through the thread's workspace
91
+ binding; checking first turns that generic refusal into a specific message.
92
+
93
+ Returns:
94
+ A user-facing message, or `None` when the directories match.
95
+ """
96
+ from deepagents_code.resume_policy import classify_thread_cwd
97
+
98
+ if not target.cwd:
99
+ return None
100
+ status, path = classify_thread_cwd(target.cwd, current_cwd)
101
+ if status == "mismatch":
102
+ return (
103
+ f"Thread {target.thread_id} belongs to {path}. "
104
+ "Run from that directory to resume it."
105
+ )
106
+ if status == "unavailable":
107
+ return (
108
+ f"Thread {target.thread_id} was last used in {target.cwd!r}, "
109
+ "which is no longer available, so it can't be resumed."
110
+ )
111
+ return None
112
+
113
+
114
+ def persisted_model(
115
+ values: Mapping[str, object],
116
+ ) -> tuple[str, dict[str, Any] | None] | None:
117
+ """Read the model a thread last ran with from its checkpoint values.
118
+
119
+ Returns:
120
+ The `(spec, params)` pair, or `None` when no model is recorded.
121
+ """
122
+ from deepagents_code.resume_state import coerce_model_spec
123
+
124
+ spec = coerce_model_spec(values.get("_model_spec"))
125
+ if spec is None:
126
+ return None
127
+ raw_params = values.get("_model_params")
128
+ params = (
129
+ dict(cast("dict[str, Any]", raw_params))
130
+ if isinstance(raw_params, dict)
131
+ else None
132
+ )
133
+ return spec, params