deepagents-code 0.2.0__tar.gz → 0.2.1__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 (619) hide show
  1. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/CHANGELOG.md +12 -0
  2. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/PKG-INFO +3 -3
  3. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/_build_info.py +1 -1
  4. deepagents_code-0.2.1/deepagents_code/_session_lock.py +184 -0
  5. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/_version.py +1 -1
  6. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/agent.py +40 -5
  7. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/app.py +1 -1
  8. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/auto_mode.py +12 -7
  9. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/client/launch/_server_bootstrap.py +6 -1
  10. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/client/launch/server.py +7 -2
  11. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/config.py +1 -1
  12. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/main.py +82 -21
  13. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/mcp_tools.py +11 -0
  14. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/plugins/adapters/skills_middleware.py +4 -0
  15. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/update_check.py +30 -5
  16. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/pyproject.toml +3 -3
  17. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/integration_tests/test_server_owner_lifetime.py +4 -0
  18. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/conftest.py +22 -0
  19. deepagents_code-0.2.1/tests/unit_tests/skills/test_skill_tools.py +244 -0
  20. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_auto_mode.py +32 -9
  21. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_main.py +81 -6
  22. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_mcp_tools.py +36 -0
  23. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_server_pipe.py +31 -2
  24. deepagents_code-0.2.1/tests/unit_tests/test_session_lock.py +114 -0
  25. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_update_check.py +13 -0
  26. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/uv.lock +14 -14
  27. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/.gitignore +0 -0
  28. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/AGENTS.md +0 -0
  29. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/ARCHITECTURE.md +0 -0
  30. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/COMMANDS.md +0 -0
  31. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/DEVELOPMENT.md +0 -0
  32. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/EXTENSIONS.md +0 -0
  33. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/HOOKS.md +0 -0
  34. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/LICENSE +0 -0
  35. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/Makefile +0 -0
  36. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/PRICING.md +0 -0
  37. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/README.md +0 -0
  38. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/THREAT_MODEL.md +0 -0
  39. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/__init__.py +0 -0
  40. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/__main__.py +0 -0
  41. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/_ask_user_types.py +0 -0
  42. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/_async.py +0 -0
  43. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/_cli_context.py +0 -0
  44. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/_constants.py +0 -0
  45. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/_content_blocks.py +0 -0
  46. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/_debug.py +0 -0
  47. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/_debug_buffer.py +0 -0
  48. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/_dep_floor_check.py +0 -0
  49. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/_env_vars.py +0 -0
  50. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/_fake_models.py +0 -0
  51. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/_git.py +0 -0
  52. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/_glm_5p2_profile.py +0 -0
  53. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/_home_error.py +0 -0
  54. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/_invocation.py +0 -0
  55. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/_js_cost.py +0 -0
  56. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/_markdown.py +0 -0
  57. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/_paths.py +0 -0
  58. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/_repository_bounds.py +0 -0
  59. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/_reserved_names.py +0 -0
  60. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/_server_config.py +0 -0
  61. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/_session_stats.py +0 -0
  62. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/_startup_error.py +0 -0
  63. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/_terminal_stderr.py +0 -0
  64. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/_testing_models.py +0 -0
  65. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/_textual_patches.py +0 -0
  66. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/_tool_free.py +0 -0
  67. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/_tool_stream.py +0 -0
  68. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/_tracing.py +0 -0
  69. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/acp.py +0 -0
  70. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/app.tcss +0 -0
  71. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/approval_mode.py +0 -0
  72. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/ask_user.py +0 -0
  73. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/auth_display.py +0 -0
  74. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/auth_store.py +0 -0
  75. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/btw.py +0 -0
  76. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/btw_api.py +0 -0
  77. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/btw_cost.py +0 -0
  78. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/built_in_skills/__init__.py +0 -0
  79. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/built_in_skills/deepagents-plugin-discovery/SKILL.md +0 -0
  80. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/built_in_skills/deepagents-thread-inspector/SKILL.md +0 -0
  81. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/built_in_skills/deepagents-thread-inspector/scripts/inspect_sessions.py +0 -0
  82. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/built_in_skills/remember/SKILL.md +0 -0
  83. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/built_in_skills/skill-creator/SKILL.md +0 -0
  84. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/built_in_skills/skill-creator/scripts/init_skill.py +0 -0
  85. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/built_in_skills/skill-creator/scripts/quick_validate.py +0 -0
  86. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/bundled_prices.README.md +0 -0
  87. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/bundled_prices.json +0 -0
  88. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/client/__init__.py +0 -0
  89. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/client/commands/__init__.py +0 -0
  90. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/client/commands/auth.py +0 -0
  91. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/client/commands/config.py +0 -0
  92. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/client/commands/extras.py +0 -0
  93. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/client/commands/mcp.py +0 -0
  94. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/client/commands/tools.py +0 -0
  95. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/client/headless_resume.py +0 -0
  96. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/client/launch/__init__.py +0 -0
  97. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/client/launch/server_manager.py +0 -0
  98. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/client/non_interactive.py +0 -0
  99. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/client/remote_client.py +0 -0
  100. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/client/session_cost.py +0 -0
  101. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/clipboard.py +0 -0
  102. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/cold_cache.py +0 -0
  103. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/command_registry.py +0 -0
  104. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/config_manifest.py +0 -0
  105. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/configurable_model.py +0 -0
  106. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/configuration/__init__.py +0 -0
  107. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/configuration/interpreter.py +0 -0
  108. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/configuration/paths.py +0 -0
  109. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/configuration/provider.py +0 -0
  110. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/configuration/providers.py +0 -0
  111. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/configuration/resolver.py +0 -0
  112. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/configuration/service.py +0 -0
  113. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/configuration/theme_resolution.py +0 -0
  114. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/configuration/types.py +0 -0
  115. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/configuration/writer.py +0 -0
  116. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/context_doctor.py +0 -0
  117. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/cost_tracking.py +0 -0
  118. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/default_agent_prompt.md +0 -0
  119. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/diff_utils.py +0 -0
  120. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/doctor.py +0 -0
  121. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/editor.py +0 -0
  122. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/event_bus.py +0 -0
  123. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/extensions/__init__.py +0 -0
  124. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/extensions/api.py +0 -0
  125. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/extensions/discovery.py +0 -0
  126. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/extensions/hosting.py +0 -0
  127. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/extensions/loader.py +0 -0
  128. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/extensions/registry.py +0 -0
  129. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/extensions/runtime.py +0 -0
  130. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/extensions/settings.py +0 -0
  131. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/extensions/trust.py +0 -0
  132. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/extras_info.py +0 -0
  133. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/file_ops.py +0 -0
  134. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/formatting.py +0 -0
  135. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/goal_rubric.py +0 -0
  136. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/goal_state_limits.py +0 -0
  137. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/goal_state_notice.py +0 -0
  138. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/goal_tools.py +0 -0
  139. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/hooks/__init__.py +0 -0
  140. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/hooks/capabilities.py +0 -0
  141. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/hooks/client.py +0 -0
  142. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/hooks/client_lifecycle.py +0 -0
  143. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/hooks/context.py +0 -0
  144. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/hooks/engine.py +0 -0
  145. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/hooks/env.py +0 -0
  146. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/hooks/envelope.py +0 -0
  147. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/hooks/interrupt.py +0 -0
  148. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/hooks/legacy.py +0 -0
  149. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/hooks/loading.py +0 -0
  150. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/hooks/manager.py +0 -0
  151. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/hooks/migration.py +0 -0
  152. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/hooks/models/__init__.py +0 -0
  153. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/hooks/models/adapters.py +0 -0
  154. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/hooks/models/config.py +0 -0
  155. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/hooks/models/domain.py +0 -0
  156. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/hooks/models/transport.py +0 -0
  157. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/hooks/models/wire.py +0 -0
  158. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/hooks/permissions.py +0 -0
  159. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/hooks/presenter.py +0 -0
  160. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/hooks/projection.py +0 -0
  161. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/hooks/reducer.py +0 -0
  162. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/hooks/runner.py +0 -0
  163. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/hooks/runtime.py +0 -0
  164. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/hooks/server_middleware.py +0 -0
  165. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/hooks/snapshot.py +0 -0
  166. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/hooks/tools.py +0 -0
  167. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/hooks/transcript.py +0 -0
  168. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/hooks/trust.py +0 -0
  169. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/hooks/validate_terminal_sequence.py +0 -0
  170. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/input.py +0 -0
  171. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/integrations/__init__.py +0 -0
  172. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/integrations/openai_codex.py +0 -0
  173. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/integrations/sandbox_config.py +0 -0
  174. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/integrations/sandbox_factory.py +0 -0
  175. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/integrations/sandbox_provider.py +0 -0
  176. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/integrations/sandbox_registry.py +0 -0
  177. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/iterm_cursor_guide.py +0 -0
  178. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/json_types.py +0 -0
  179. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/local_context.py +0 -0
  180. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/managed_tools.py +0 -0
  181. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/mcp_auth.py +0 -0
  182. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/mcp_config.py +0 -0
  183. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/mcp_disabled.py +0 -0
  184. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/mcp_login_service.py +0 -0
  185. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/mcp_middleware.py +0 -0
  186. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/mcp_oauth_ui.py +0 -0
  187. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/mcp_providers/__init__.py +0 -0
  188. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/mcp_providers/_registry.py +0 -0
  189. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/mcp_providers/base.py +0 -0
  190. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/mcp_providers/github.py +0 -0
  191. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/mcp_providers/slack.py +0 -0
  192. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/mcp_proxy.py +0 -0
  193. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/media_utils.py +0 -0
  194. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/memory_guard.py +0 -0
  195. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/model_api.py +0 -0
  196. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/model_catalog.py +0 -0
  197. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/model_config.py +0 -0
  198. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/model_metadata.py +0 -0
  199. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/model_retry.py +0 -0
  200. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/notifications.py +0 -0
  201. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/offload.py +0 -0
  202. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/offload_api.py +0 -0
  203. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/offload_middleware.py +0 -0
  204. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/onboarding.py +0 -0
  205. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/output.py +0 -0
  206. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/paste_collapse.py +0 -0
  207. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/plugins/__init__.py +0 -0
  208. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/plugins/_json.py +0 -0
  209. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/plugins/adapters/__init__.py +0 -0
  210. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/plugins/adapters/hooks.py +0 -0
  211. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/plugins/adapters/mcp.py +0 -0
  212. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/plugins/adapters/skills.py +0 -0
  213. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/plugins/commands_cli.py +0 -0
  214. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/plugins/discovery.py +0 -0
  215. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/plugins/manifest.py +0 -0
  216. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/plugins/marketplace.py +0 -0
  217. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/plugins/models.py +0 -0
  218. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/plugins/store.py +0 -0
  219. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/plugins/substitution.py +0 -0
  220. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/project_utils.py +0 -0
  221. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/py.typed +0 -0
  222. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/reasoning_effort.py +0 -0
  223. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/reliable_rubric.py +0 -0
  224. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/resume_policy.py +0 -0
  225. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/resume_state.py +0 -0
  226. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/server_graph.py +0 -0
  227. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/sessions.py +0 -0
  228. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/skills/__init__.py +0 -0
  229. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/skills/commands.py +0 -0
  230. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/skills/invocation.py +0 -0
  231. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/skills/load.py +0 -0
  232. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/skills/load_errors.py +0 -0
  233. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/skills/merge.py +0 -0
  234. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/skills/trust.py +0 -0
  235. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/state_migration.py +0 -0
  236. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/subagents.py +0 -0
  237. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/system_prompt.md +0 -0
  238. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/terminal_capabilities.py +0 -0
  239. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/terminal_escape.py +0 -0
  240. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/terminal_title.py +0 -0
  241. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/theme.py +0 -0
  242. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/thread_ownership.py +0 -0
  243. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/thread_titles.py +0 -0
  244. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tool_catalog.py +0 -0
  245. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tool_display.py +0 -0
  246. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tools.py +0 -0
  247. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/__init__.py +0 -0
  248. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/key_hints.py +0 -0
  249. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/modals/__init__.py +0 -0
  250. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/modals/_cost_breakdown.py +0 -0
  251. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/modals/btw.py +0 -0
  252. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/modals/btw.tcss +0 -0
  253. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/modals/cold_cache.py +0 -0
  254. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/modals/cost_breakdown.py +0 -0
  255. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/modals/mcp_servers.py +0 -0
  256. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/modals/mcp_servers.tcss +0 -0
  257. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/modals/model_switch.py +0 -0
  258. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/modals/plugin_manager/__init__.py +0 -0
  259. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/modals/plugin_manager/content.py +0 -0
  260. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/modals/plugin_manager/models.py +0 -0
  261. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/modals/plugin_manager/plugin_manager.tcss +0 -0
  262. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/modals/plugin_manager/state.py +0 -0
  263. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/modals/plugin_manager/tabs.py +0 -0
  264. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/modals/prompt_clipboard.py +0 -0
  265. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/modals/prompt_clipboard.tcss +0 -0
  266. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/modals/resume_blocked.py +0 -0
  267. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/modals/resume_compact.py +0 -0
  268. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/modals/session_cost.py +0 -0
  269. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/modals/session_cost.tcss +0 -0
  270. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/modals/thread_name.py +0 -0
  271. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/modals/thread_name.tcss +0 -0
  272. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/screens/__init__.py +0 -0
  273. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/textual_adapter.py +0 -0
  274. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/__init__.py +0 -0
  275. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/_condense_path.py +0 -0
  276. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/_copy_spans.py +0 -0
  277. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/_inline_prompt.py +0 -0
  278. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/_js_eval_display.py +0 -0
  279. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/_links.py +0 -0
  280. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/_paste_textarea.py +0 -0
  281. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/agent_selector.py +0 -0
  282. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/approval.py +0 -0
  283. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/ask_user.py +0 -0
  284. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/auth.py +0 -0
  285. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/auto_mode_notice.py +0 -0
  286. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/autocomplete.py +0 -0
  287. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/chat_input.py +0 -0
  288. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/codex_auth.py +0 -0
  289. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/context_usage.py +0 -0
  290. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/cwd_switch.py +0 -0
  291. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/debug_console.py +0 -0
  292. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/diff.py +0 -0
  293. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/effort_selector.py +0 -0
  294. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/goal_review.py +0 -0
  295. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/goal_status.py +0 -0
  296. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/history.py +0 -0
  297. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/install_confirm.py +0 -0
  298. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/launch_init.py +0 -0
  299. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/loading.py +0 -0
  300. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/mcp_login.py +0 -0
  301. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/mcp_reconnect.py +0 -0
  302. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/mcp_viewer.py +0 -0
  303. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/message_store.py +0 -0
  304. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/messages.py +0 -0
  305. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/model_selector.py +0 -0
  306. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/notification_center.py +0 -0
  307. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/notification_detail.py +0 -0
  308. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/notification_settings.py +0 -0
  309. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/prompt_search.py +0 -0
  310. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/restart_prompt.py +0 -0
  311. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/skill_trust.py +0 -0
  312. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/startup_tip.py +0 -0
  313. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/status.py +0 -0
  314. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/subagent_panel.py +0 -0
  315. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/theme_selector.py +0 -0
  316. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/thread_agent_switch.py +0 -0
  317. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/thread_selector.py +0 -0
  318. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/tool_renderers.py +0 -0
  319. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/tool_widgets.py +0 -0
  320. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/update_available.py +0 -0
  321. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/update_confirm.py +0 -0
  322. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/update_progress.py +0 -0
  323. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/welcome.py +0 -0
  324. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/tui/widgets/yolo_mode_notice.py +0 -0
  325. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/ui.py +0 -0
  326. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/unicode_security.py +0 -0
  327. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/workspace.py +0 -0
  328. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/deepagents_code/workspace_diagnostics.py +0 -0
  329. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/examples/extensions/memory_store.py +0 -0
  330. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/examples/skills/arxiv-search/SKILL.md +0 -0
  331. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/examples/skills/arxiv-search/arxiv_search.py +0 -0
  332. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/examples/skills/langgraph-docs/SKILL.md +0 -0
  333. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/examples/skills/skill-creator/SKILL.md +0 -0
  334. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/examples/skills/skill-creator/scripts/init_skill.py +0 -0
  335. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/examples/skills/skill-creator/scripts/quick_validate.py +0 -0
  336. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/examples/skills/web-research/SKILL.md +0 -0
  337. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/hatch_build.py +0 -0
  338. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/images/debug-console-cost-breakdown.png +0 -0
  339. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/images/model-stream-retry.png +0 -0
  340. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/images/tui.png +0 -0
  341. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/scripts/check_imports.py +0 -0
  342. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/scripts/check_process_cwd.py +0 -0
  343. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/scripts/debug_server.sh +0 -0
  344. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/scripts/generate_commands_catalog.py +0 -0
  345. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/scripts/install.sh +0 -0
  346. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/README.md +0 -0
  347. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/integration_tests/__init__.py +0 -0
  348. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/integration_tests/benchmarks/__init__.py +0 -0
  349. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/integration_tests/benchmarks/test_codspeed_import_benchmarks.py +0 -0
  350. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/integration_tests/benchmarks/test_local_context_benchmarks.py +0 -0
  351. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/integration_tests/benchmarks/test_startup_benchmarks.py +0 -0
  352. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/integration_tests/benchmarks/test_thread_loading_benchmarks.py +0 -0
  353. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/integration_tests/conftest.py +0 -0
  354. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/integration_tests/test_acp_mode.py +0 -0
  355. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/integration_tests/test_auto_approve_remote.py +0 -0
  356. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/integration_tests/test_compact_resume.py +0 -0
  357. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/integration_tests/test_headless_resume.py +0 -0
  358. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/integration_tests/test_offload_server_side.py +0 -0
  359. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/integration_tests/test_pending_work_recovery.py +0 -0
  360. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/integration_tests/test_sandbox_factory.py +0 -0
  361. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/integration_tests/test_sandbox_operations.py +0 -0
  362. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/__init__.py +0 -0
  363. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/client/__init__.py +0 -0
  364. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/client/commands/__init__.py +0 -0
  365. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/client/commands/test_auth.py +0 -0
  366. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/client/commands/test_extras.py +0 -0
  367. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/client/commands/test_mcp.py +0 -0
  368. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/client/commands/test_tools.py +0 -0
  369. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/data/coding_agent_v1_validator.json +0 -0
  370. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/hooks/__init__.py +0 -0
  371. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/hooks/models/__init__.py +0 -0
  372. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/hooks/models/test_models.py +0 -0
  373. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/hooks/test_client_lifecycle.py +0 -0
  374. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/hooks/test_configuration.py +0 -0
  375. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/hooks/test_engine.py +0 -0
  376. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/hooks/test_execution.py +0 -0
  377. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/hooks/test_manager.py +0 -0
  378. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/hooks/test_presenter.py +0 -0
  379. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/hooks/test_server_lifecycle.py +0 -0
  380. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/hooks/test_transcript.py +0 -0
  381. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/hooks/test_trust.py +0 -0
  382. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/plugins/__init__.py +0 -0
  383. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/plugins/test_marketplace.py +0 -0
  384. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/plugins/test_plugin_hooks.py +0 -0
  385. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/plugins/test_plugins_p0.py +0 -0
  386. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/skills/__init__.py +0 -0
  387. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/skills/test_commands.py +0 -0
  388. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/skills/test_load.py +0 -0
  389. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/skills/test_merge.py +0 -0
  390. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/skills/test_pinned_skills.py +0 -0
  391. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/skills/test_skill_trust.py +0 -0
  392. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/skills/test_skills_json.py +0 -0
  393. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/skills/test_thread_inspector.py +0 -0
  394. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/smoke_tests/__init__.py +0 -0
  395. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/smoke_tests/conftest.py +0 -0
  396. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/smoke_tests/snapshots/system_prompt_headless_local.md +0 -0
  397. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/smoke_tests/snapshots/system_prompt_interactive_local.md +0 -0
  398. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/smoke_tests/test_system_prompt.py +0 -0
  399. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test__tool_stream.py +0 -0
  400. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_acp.py +0 -0
  401. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_agent.py +0 -0
  402. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_agent_friendly.py +0 -0
  403. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_agent_mcp_timeout.py +0 -0
  404. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_app.py +0 -0
  405. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_app_thread_ownership.py +0 -0
  406. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_approval_mode.py +0 -0
  407. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_args.py +0 -0
  408. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_ask_user_middleware.py +0 -0
  409. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_ask_user_types.py +0 -0
  410. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_auth_display.py +0 -0
  411. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_auth_store.py +0 -0
  412. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_auth_web_search_restart.py +0 -0
  413. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_btw.py +0 -0
  414. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_btw_api.py +0 -0
  415. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_cache_expiry.py +0 -0
  416. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_charset.py +0 -0
  417. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_cli_provider.py +0 -0
  418. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_clipboard.py +0 -0
  419. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_coding_agent_metadata.py +0 -0
  420. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_cold_cache.py +0 -0
  421. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_command_registry.py +0 -0
  422. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_compact_tool.py +0 -0
  423. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_config.py +0 -0
  424. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_config_manifest.py +0 -0
  425. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_configurable_model.py +0 -0
  426. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_configuration.py +0 -0
  427. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_configuration_resolution.py +0 -0
  428. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_configuration_resolver.py +0 -0
  429. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_context_doctor.py +0 -0
  430. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_cost_breakdown.py +0 -0
  431. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_cost_tracking.py +0 -0
  432. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_cursor_style.py +0 -0
  433. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_debug.py +0 -0
  434. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_debug_buffer.py +0 -0
  435. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_debug_console.py +0 -0
  436. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_dep_floor_check.py +0 -0
  437. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_diff_utils.py +0 -0
  438. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_doctor.py +0 -0
  439. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_editor.py +0 -0
  440. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_end_to_end.py +0 -0
  441. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_env_vars.py +0 -0
  442. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_event_bus.py +0 -0
  443. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_exception_handling.py +0 -0
  444. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_extension_api.py +0 -0
  445. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_extension_cli_trust.py +0 -0
  446. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_extension_config_manifest.py +0 -0
  447. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_extension_discovery.py +0 -0
  448. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_extension_display.py +0 -0
  449. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_extension_host_runtime.py +0 -0
  450. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_extension_hosting.py +0 -0
  451. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_extension_runtime.py +0 -0
  452. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_extra_skills_dirs.py +0 -0
  453. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_extras_info.py +0 -0
  454. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_file_ops.py +0 -0
  455. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_fork_goal_notice.py +0 -0
  456. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_formatting.py +0 -0
  457. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_git.py +0 -0
  458. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_glm_5p2_profile.py +0 -0
  459. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_goal_criteria_client.py +0 -0
  460. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_goal_rubric.py +0 -0
  461. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_goal_state_limits.py +0 -0
  462. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_goal_state_notice.py +0 -0
  463. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_goal_state_persistence.py +0 -0
  464. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_goal_tools.py +0 -0
  465. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_groq_tool_limit.py +0 -0
  466. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_hatch_build.py +0 -0
  467. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_headless_resume.py +0 -0
  468. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_hooks.py +0 -0
  469. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_idle_compaction.py +0 -0
  470. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_imports.py +0 -0
  471. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_input_parsing.py +0 -0
  472. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_install_command.py +0 -0
  473. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_install_script.py +0 -0
  474. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_interpreter_workspace_policy.py +0 -0
  475. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_invocation.py +0 -0
  476. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_iterm_cursor_guide.py +0 -0
  477. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_js_cost_sync.py +0 -0
  478. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_js_cost_tracking.py +0 -0
  479. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_json_types.py +0 -0
  480. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_local_context.py +0 -0
  481. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_main_acp_mode.py +0 -0
  482. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_main_args.py +0 -0
  483. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_managed_tools.py +0 -0
  484. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_mcp_auth.py +0 -0
  485. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_mcp_config.py +0 -0
  486. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_mcp_disabled.py +0 -0
  487. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_mcp_lifecycle.py +0 -0
  488. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_mcp_login_service.py +0 -0
  489. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_mcp_middleware.py +0 -0
  490. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_mcp_oauth_ui.py +0 -0
  491. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_mcp_proxy.py +0 -0
  492. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_mcp_schema.py +0 -0
  493. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_media_utils.py +0 -0
  494. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_memory_guard.py +0 -0
  495. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_model_catalog.py +0 -0
  496. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_model_config.py +0 -0
  497. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_model_metadata.py +0 -0
  498. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_model_retry.py +0 -0
  499. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_model_switch.py +0 -0
  500. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_non_interactive.py +0 -0
  501. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_notifications.py +0 -0
  502. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_offload.py +0 -0
  503. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_offload_api.py +0 -0
  504. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_onboarding.py +0 -0
  505. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_openai_codex_integration.py +0 -0
  506. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_output.py +0 -0
  507. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_paths.py +0 -0
  508. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_process_cwd_check.py +0 -0
  509. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_python_migration_bridge.py +0 -0
  510. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_reasoning_effort.py +0 -0
  511. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_reliable_rubric.py +0 -0
  512. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_reload.py +0 -0
  513. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_remote_client.py +0 -0
  514. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_repository_bounds.py +0 -0
  515. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_resume_compaction_recovery.py +0 -0
  516. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_resume_state.py +0 -0
  517. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_resume_workspace_errors.py +0 -0
  518. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_rubric_cli.py +0 -0
  519. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_sandbox_config.py +0 -0
  520. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_sandbox_factory.py +0 -0
  521. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_sandbox_provider.py +0 -0
  522. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_sandbox_registry.py +0 -0
  523. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_server.py +0 -0
  524. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_server_config.py +0 -0
  525. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_server_graph.py +0 -0
  526. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_server_helpers.py +0 -0
  527. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_server_manager.py +0 -0
  528. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_server_tracing.py +0 -0
  529. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_session_stats.py +0 -0
  530. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_sessions.py +0 -0
  531. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_shell_allow_list.py +0 -0
  532. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_skill_invocation.py +0 -0
  533. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_startup_fast_paths.py +0 -0
  534. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_state_migration.py +0 -0
  535. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_subagents.py +0 -0
  536. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_terminal_capabilities.py +0 -0
  537. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_terminal_escape.py +0 -0
  538. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_terminal_progress_preference.py +0 -0
  539. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_terminal_stderr.py +0 -0
  540. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_terminal_title.py +0 -0
  541. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_text_encoding.py +0 -0
  542. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_textual_patches.py +0 -0
  543. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_theme.py +0 -0
  544. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_thread_naming_app.py +0 -0
  545. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_thread_ownership.py +0 -0
  546. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_thread_ownership_transitions.py +0 -0
  547. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_thread_titles.py +0 -0
  548. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_threads_resume.py +0 -0
  549. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_tool_catalog.py +0 -0
  550. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_tool_display.py +0 -0
  551. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_tracing.py +0 -0
  552. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_tracing_replicas.py +0 -0
  553. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_transcript_virtualization.py +0 -0
  554. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_ui.py +0 -0
  555. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_unicode_security.py +0 -0
  556. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_uninstall_command.py +0 -0
  557. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_version.py +0 -0
  558. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_workspace.py +0 -0
  559. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/test_workspace_diagnostics.py +0 -0
  560. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tools/__init__.py +0 -0
  561. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tools/test_current_thread.py +0 -0
  562. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tools/test_fetch_url.py +0 -0
  563. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tools/test_tool_arg_schemas.py +0 -0
  564. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tools/test_web_search.py +0 -0
  565. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/__init__.py +0 -0
  566. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/modals/__init__.py +0 -0
  567. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/modals/plugin_manager/__init__.py +0 -0
  568. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/modals/plugin_manager/test_inspection.py +0 -0
  569. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/modals/plugin_manager/test_structure.py +0 -0
  570. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/modals/test_cold_cache.py +0 -0
  571. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/modals/test_model_switch.py +0 -0
  572. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/modals/test_prompt_clipboard.py +0 -0
  573. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/modals/test_resume_blocked.py +0 -0
  574. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/modals/test_session_cost.py +0 -0
  575. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/test_key_hints.py +0 -0
  576. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/test_modal_footer_layout.py +0 -0
  577. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/test_subagent_stream.py +0 -0
  578. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/test_textual_adapter.py +0 -0
  579. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/widgets/__init__.py +0 -0
  580. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/widgets/test_agent_selector.py +0 -0
  581. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/widgets/test_approval.py +0 -0
  582. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/widgets/test_ask_user.py +0 -0
  583. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/widgets/test_auth_widgets.py +0 -0
  584. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/widgets/test_auto_mode_notice.py +0 -0
  585. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/widgets/test_autocomplete.py +0 -0
  586. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/widgets/test_chat_input.py +0 -0
  587. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/widgets/test_condense_path.py +0 -0
  588. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/widgets/test_copy_spans.py +0 -0
  589. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/widgets/test_cwd_switch.py +0 -0
  590. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/widgets/test_diff.py +0 -0
  591. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/widgets/test_goal_review.py +0 -0
  592. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/widgets/test_history.py +0 -0
  593. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/widgets/test_inline_prompt.py +0 -0
  594. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/widgets/test_install_confirm.py +0 -0
  595. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/widgets/test_launch_init.py +0 -0
  596. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/widgets/test_links.py +0 -0
  597. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/widgets/test_loading.py +0 -0
  598. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/widgets/test_mcp_login_modal.py +0 -0
  599. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/widgets/test_mcp_reconnect.py +0 -0
  600. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/widgets/test_mcp_viewer.py +0 -0
  601. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/widgets/test_message_store.py +0 -0
  602. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/widgets/test_messages.py +0 -0
  603. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/widgets/test_model_selector.py +0 -0
  604. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/widgets/test_notification_center.py +0 -0
  605. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/widgets/test_notification_detail.py +0 -0
  606. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/widgets/test_notification_settings.py +0 -0
  607. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/widgets/test_prompt_search.py +0 -0
  608. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/widgets/test_restart_prompt.py +0 -0
  609. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/widgets/test_skill_trust_screen.py +0 -0
  610. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/widgets/test_startup_tip.py +0 -0
  611. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/widgets/test_status.py +0 -0
  612. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/widgets/test_subagent_panel.py +0 -0
  613. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/widgets/test_thread_agent_switch.py +0 -0
  614. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/widgets/test_thread_selector.py +0 -0
  615. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/widgets/test_tool_renderers.py +0 -0
  616. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/widgets/test_update_available.py +0 -0
  617. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/widgets/test_update_confirm.py +0 -0
  618. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/widgets/test_update_progress.py +0 -0
  619. {deepagents_code-0.2.0 → deepagents_code-0.2.1}/tests/unit_tests/tui/widgets/test_welcome.py +0 -0
@@ -2,6 +2,18 @@
2
2
 
3
3
  # Deep Agents Code Changelog
4
4
 
5
+ ## [0.2.1](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.2.0...deepagents-code==0.2.1) (2026-10-23)
6
+
7
+ ### Features
8
+
9
+ - Support skill-scoped MCP tools ([#7010](https://github.com/langchain-ai/deepagents/pull/7010)).
10
+ - Default the Anthropic Auto classifier to Claude Sonnet 5.5 ([#7163](https://github.com/langchain-ai/deepagents/pull/7163)).
11
+
12
+ ### Bug Fixes
13
+
14
+ - Automatically migrate to Python 3.14 when no other session is running ([#7160](https://github.com/langchain-ai/deepagents/pull/7160)).
15
+ - Use native structured output for the Anthropic Auto classifier ([#7162](https://github.com/langchain-ai/deepagents/pull/7162)).
16
+
5
17
  ## [0.2.0](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.88...deepagents-code==0.2.0) (2026-10-22)
6
18
 
7
19
  ### ⚠ BREAKING CHANGES
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: deepagents-code
3
- Version: 0.2.0
3
+ Version: 0.2.1
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
@@ -28,7 +28,7 @@ Requires-Python: <3.15,>=3.14
28
28
  Requires-Dist: aiosqlite>=0.22.1
29
29
  Requires-Dist: anyio>=4.14.2
30
30
  Requires-Dist: deepagents-acp<1.0.0,>=0.0.10
31
- Requires-Dist: deepagents==0.7.30
31
+ Requires-Dist: deepagents==0.7.31
32
32
  Requires-Dist: fastmcp>=4.0.0b4
33
33
  Requires-Dist: filelock<3.30,>=3.29.7
34
34
  Requires-Dist: genai-prices<0.2.0,>=0.1.13
@@ -40,7 +40,7 @@ Requires-Dist: langchain-quickjs<0.4.0,>=0.3.4
40
40
  Requires-Dist: langchain<2.0.0,>=1.4.7
41
41
  Requires-Dist: langgraph-checkpoint-sqlite<4.0.0,>=3.1.2
42
42
  Requires-Dist: langgraph-cli[inmem]<1.0.0,>=0.4.37
43
- Requires-Dist: langgraph-runtime-inmem<1.0.0,>=0.36.4
43
+ Requires-Dist: langgraph-runtime-inmem<1.0.0,>=0.36.5
44
44
  Requires-Dist: langgraph-sdk<1.0.0,>=0.4.8
45
45
  Requires-Dist: langsmith[sandbox]>=0.14.12
46
46
  Requires-Dist: markdownify>=1.2.3
@@ -1,3 +1,3 @@
1
1
  """Generated at build time. Do not edit or commit."""
2
2
 
3
- BUILD_COMMIT = "981a87a"
3
+ BUILD_COMMIT = "8f48aab"
@@ -0,0 +1,184 @@
1
+ """Presence lock telling a launch whether other dcode sessions share its install.
2
+
3
+ A Python migration rebuilds the uv tool environment, which breaks every dcode
4
+ process — and every server it spawned — still running from the old one. Startup
5
+ auto-update may only migrate when no other session uses the installation, and
6
+ it cannot tell that from a process listing: shims, renamed symlinks, and the
7
+ server bootstrap all run under different names.
8
+
9
+ Instead, each dcode process of a non-editable install (editable installs never
10
+ auto-update) holds a shared `flock` on `SESSION_LOCK_FILE` for its lifetime,
11
+ and hands the descriptor to the servers it spawns so they hold
12
+ the same lock. A process asking "am I alone?" tries to take the lock
13
+ exclusively; that succeeds only when no other session's open file holds it.
14
+ The kernel drops a lock when its last descriptor closes, so a crashed session
15
+ can never leave a stale claim behind.
16
+
17
+ The answer is a snapshot. It cannot see sessions of versions from before this
18
+ lock existed, and nothing stops a session that launches while the migration
19
+ runs; both are accepted as rare and recoverable by a relaunch.
20
+
21
+ POSIX only. On Windows, or whenever the lock cannot be taken, a process is
22
+ never reported as alone, so the migration stays deferred to `dcode update`.
23
+ """
24
+
25
+ from __future__ import annotations
26
+
27
+ import logging
28
+ import os
29
+ import sys
30
+ from typing import TYPE_CHECKING
31
+
32
+ from deepagents_code._paths import PATHS
33
+
34
+ if sys.platform != "win32":
35
+ import fcntl
36
+
37
+ if TYPE_CHECKING:
38
+ from pathlib import Path
39
+
40
+ logger = logging.getLogger(__name__)
41
+
42
+ SESSION_LOCK_FILE: Path = PATHS.installation.locks_dir / "sessions.lock"
43
+ """Advisory lock held shared by every registered dcode process of one installation.
44
+
45
+ Lives beside `update.lock`, outside the tool environment, so a migration that
46
+ rebuilds the environment keeps the same file. Carries no data.
47
+
48
+ Installation-scoped only, with no per-profile fallback: a profile-scoped lock
49
+ would hide sessions of other profiles, and over-reporting "alone" is the one
50
+ failure this lock must not have.
51
+ """
52
+
53
+ _held_fd: int | None = None
54
+ """Descriptor holding this process's shared lock, or `None` when not held."""
55
+
56
+
57
+ def hold_session_lock() -> None:
58
+ """Register this process as a running session for its lifetime.
59
+
60
+ Idempotent and fail-soft: when the lock cannot be taken, the process runs
61
+ unregistered and `is_sole_session` reports `False`. The descriptor is
62
+ non-inheritable, so the re-exec after an update drops it and the new
63
+ process registers itself again.
64
+ """
65
+ global _held_fd # noqa: PLW0603 # one registration per process
66
+ if _held_fd is not None or sys.platform == "win32":
67
+ return
68
+ try:
69
+ SESSION_LOCK_FILE.parent.mkdir(mode=0o700, parents=True, exist_ok=True)
70
+ fd = os.open(SESSION_LOCK_FILE, os.O_RDWR | os.O_CREAT, 0o600)
71
+ except OSError:
72
+ logger.warning(
73
+ "Could not open session lock %s", SESSION_LOCK_FILE, exc_info=True
74
+ )
75
+ return
76
+ try:
77
+ # Blocks only while another process is inside `is_sole_session`, the
78
+ # one place the lock is ever held exclusively, and only for an instant.
79
+ # Failing fast instead would leave this session invisible to that check.
80
+ fcntl.flock(fd, fcntl.LOCK_SH)
81
+ except OSError:
82
+ logger.warning(
83
+ "Could not take session lock %s", SESSION_LOCK_FILE, exc_info=True
84
+ )
85
+ os.close(fd)
86
+ return
87
+ _held_fd = fd
88
+
89
+
90
+ def session_lock_fds() -> tuple[int, ...]:
91
+ """Return descriptors a spawned server must inherit to count as this session.
92
+
93
+ `flock` locks belong to the open file description, so a child given the
94
+ descriptor holds the same lock: the server keeps the install marked in use
95
+ if it outlives its client, and does not count as a second session.
96
+ """
97
+ return () if _held_fd is None else (_held_fd,)
98
+
99
+
100
+ def session_lock_unavailable() -> bool:
101
+ """Return whether this POSIX process failed to register as a session.
102
+
103
+ Lets callers tell "other sessions are running" apart from "presence cannot
104
+ be known", which quitting other sessions would never fix.
105
+ """
106
+ return sys.platform != "win32" and _held_fd is None
107
+
108
+
109
+ def is_sole_session() -> bool:
110
+ """Return whether no other dcode session holds this installation.
111
+
112
+ Converting a `flock` is not atomic: the shared lock is released before the
113
+ exclusive one is tried, so two processes checking at once could each see
114
+ the other as absent. An exclusive lock on `sessions.check.lock` beside
115
+ `SESSION_LOCK_FILE` admits one checker at a time; a process that finds it
116
+ taken is not alone.
117
+
118
+ Returns:
119
+ `True` only when this process holds the session lock and could take
120
+ it exclusively. `False` when another session holds it, or when the
121
+ lock is unavailable and presence cannot be known.
122
+ """
123
+ if _held_fd is None:
124
+ return False
125
+ check_file = SESSION_LOCK_FILE.with_name("sessions.check.lock")
126
+ try:
127
+ guard = os.open(check_file, os.O_RDWR | os.O_CREAT, 0o600)
128
+ except OSError:
129
+ logger.warning("Could not open %s", check_file, exc_info=True)
130
+ return False
131
+ try:
132
+ fcntl.flock(guard, fcntl.LOCK_EX | fcntl.LOCK_NB)
133
+ except OSError:
134
+ return False
135
+ else:
136
+ return _probe_exclusive(_held_fd)
137
+ finally:
138
+ os.close(guard)
139
+
140
+
141
+ def _probe_exclusive(fd: int) -> bool:
142
+ """Try to take the session lock exclusively, then hold it shared again.
143
+
144
+ Returns:
145
+ Whether the exclusive attempt succeeded and the shared lock is back.
146
+ """
147
+ try:
148
+ fcntl.flock(fd, fcntl.LOCK_EX | fcntl.LOCK_NB)
149
+ except BlockingIOError:
150
+ sole = False
151
+ except OSError:
152
+ logger.warning(
153
+ "Could not check session lock %s", SESSION_LOCK_FILE, exc_info=True
154
+ )
155
+ sole = False
156
+ else:
157
+ sole = True
158
+ # Re-take it on both branches: on Linux a failed upgrade attempt has already
159
+ # released the shared lock.
160
+ return _restore_shared(fd) and sole
161
+
162
+
163
+ def _restore_shared(fd: int) -> bool:
164
+ """Hold the session lock shared again, or unregister on failure.
165
+
166
+ Returns:
167
+ Whether this process is still registered.
168
+ """
169
+ global _held_fd # noqa: PLW0603 # unregister a lock this process lost
170
+ try:
171
+ # Blocking is safe: the check lock is held, so no other process holds
172
+ # this lock exclusively.
173
+ fcntl.flock(fd, fcntl.LOCK_SH)
174
+ except OSError:
175
+ logger.warning(
176
+ "Could not restore the shared session lock %s; other dcode sessions "
177
+ "will not see this one",
178
+ SESSION_LOCK_FILE,
179
+ exc_info=True,
180
+ )
181
+ _held_fd = None
182
+ os.close(fd)
183
+ return False
184
+ return True
@@ -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.2.0" # x-release-please-version
5
+ __version__ = "0.2.1" # 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."""
@@ -2772,6 +2772,28 @@ def create_cli_agent(
2772
2772
  ):
2773
2773
  extension_registry = None
2774
2774
  mcp_tools = tuple(mcp_tools or ())
2775
+ skill_tools = tuple(
2776
+ item
2777
+ for item in mcp_tools
2778
+ if (item.metadata or {}).get("_deepagents_code_skill_only") is True
2779
+ )
2780
+ skill_tool_ids = {id(item) for item in skill_tools}
2781
+ tools = [item for item in tools if id(item) not in skill_tool_ids]
2782
+ if skill_tools and mcp_server_info:
2783
+ skill_tool_names = {item.name for item in skill_tools}
2784
+ mcp_server_info = [
2785
+ replace(
2786
+ server,
2787
+ tools=tuple(
2788
+ item for item in server.tools if item.name not in skill_tool_names
2789
+ ),
2790
+ )
2791
+ for server in mcp_server_info
2792
+ ]
2793
+ if skill_tools and not enable_skills:
2794
+ logger.warning(
2795
+ "Skill-only MCP tools are unavailable because skills are disabled"
2796
+ )
2775
2797
  if auto_mode_enabled and sandbox is not None:
2776
2798
  logger.warning(
2777
2799
  "Classifier-backed Auto is unavailable with a sandbox; using Manual HITL"
@@ -2792,6 +2814,12 @@ def create_cli_agent(
2792
2814
  # Base instructions are loaded fresh from get_system_prompt()
2793
2815
  agent_md.touch()
2794
2816
 
2817
+ skill_sources = (
2818
+ get_skill_sources(assistant_id=assistant_id, project_context=project_context)
2819
+ if enable_skills
2820
+ else []
2821
+ )
2822
+
2795
2823
  # Load custom subagents from filesystem
2796
2824
  custom_subagents: list[SubAgent | CompiledSubAgent] = []
2797
2825
  resolved_shell_allow_list = _resolve_shell_allow_list()
@@ -2892,6 +2920,16 @@ def create_cli_agent(
2892
2920
  middleware.append(
2893
2921
  ManagedMemoryGuardMiddleware([get_user_agent_md_path(assistant_id)])
2894
2922
  )
2923
+ if enable_skills and skill_tools:
2924
+ middleware.insert(
2925
+ 0,
2926
+ PluginSkillsMiddleware(
2927
+ backend=FilesystemBackend(virtual_mode=False),
2928
+ sources=skill_sources,
2929
+ path_base=effective_cwd,
2930
+ tools=skill_tools,
2931
+ ),
2932
+ )
2895
2933
  return middleware
2896
2934
 
2897
2935
  from deepagents_code._cli_context import INHERIT_CLASSIFIER_MODEL
@@ -3097,14 +3135,11 @@ def create_cli_agent(
3097
3135
 
3098
3136
  # Add skills middleware
3099
3137
  if enable_skills:
3100
- sources = get_skill_sources(
3101
- assistant_id=assistant_id,
3102
- project_context=project_context,
3103
- )
3104
3138
  skills_middleware = PluginSkillsMiddleware(
3105
3139
  backend=FilesystemBackend(virtual_mode=False),
3106
- sources=sources,
3140
+ sources=skill_sources,
3107
3141
  path_base=effective_cwd,
3142
+ tools=skill_tools,
3108
3143
  )
3109
3144
  agent_middleware.append(skills_middleware)
3110
3145
  instruction_middleware.append(skills_middleware)
@@ -243,7 +243,7 @@ _DEFERRED_START_NOTICE = (
243
243
 
244
244
  _AUTO_CLASSIFIER_RECOMMENDED_MODELS = {
245
245
  "anthropic:claude-haiku-5-5": "Claude Haiku 5.5",
246
- "anthropic:claude-sonnet-5": "Claude Sonnet 5",
246
+ "anthropic:claude-sonnet-5-5": "Claude Sonnet 5.5",
247
247
  "google_genai:gemini-3.8-flash": "Gemini 3.8 Flash",
248
248
  "openai:gpt-6-luna": "GPT-6 Luna",
249
249
  }
@@ -2864,8 +2864,7 @@ class AutoModeHITLMiddleware(HumanInTheLoopMiddleware[AutoModeState, Any, Any]):
2864
2864
  selected,
2865
2865
  # Classifier history never replays thinking blocks,
2866
2866
  # so the Anthropic preserved-thinking binding would only
2867
- # cost it the forced tool call `with_structured_output`
2868
- # relies on.
2867
+ # add latency and cost to every review.
2869
2868
  bind_preserved_thinking=False,
2870
2869
  **retry_kwargs,
2871
2870
  )
@@ -3089,12 +3088,18 @@ class AutoModeHITLMiddleware(HumanInTheLoopMiddleware[AutoModeState, Any, Any]):
3089
3088
  timeout_cm = asyncio.timeout(self._classifier_timeout_seconds)
3090
3089
  try:
3091
3090
  async with timeout_cm:
3092
- thinking = getattr(model, "thinking", None)
3091
+ # Anthropic's native structured output constrains decoding to
3092
+ # the schema. Forced tool calling only suggests it, and Claude
3093
+ # intermittently wraps a valid verdict list in a JSON string or
3094
+ # a placeholder key, which strict validation rejects and the
3095
+ # fail-closed path turns into a denied batch. Models without
3096
+ # native support (Claude 4.1 and earlier) reject the request
3097
+ # outright, so they keep forced tool calling.
3098
+ profile = getattr(model, "profile", None)
3093
3099
  if (
3094
- spec is None
3095
- and getattr(model, "_llm_type", None) == "anthropic-chat"
3096
- and isinstance(thinking, dict)
3097
- and thinking.get("type") in {"adaptive", "enabled"}
3100
+ getattr(model, "_llm_type", None) == "anthropic-chat"
3101
+ and isinstance(profile, dict)
3102
+ and profile.get("structured_output") is True
3098
3103
  ):
3099
3104
  structured = model.with_structured_output(
3100
3105
  _ClassifierBatch, method="json_schema"
@@ -76,7 +76,12 @@ class _ParentGuard:
76
76
 
77
77
 
78
78
  def _main() -> None:
79
- guard = _ParentGuard(int(sys.argv[1]), float(sys.argv[2]))
79
+ reader, *held = (int(fd) for fd in sys.argv[1].split(","))
80
+ for fd in held:
81
+ # Keep the session lock in this process only, so a long-lived
82
+ # grandchild cannot hold the install in use after the server exits.
83
+ os.set_inheritable(fd, False)
84
+ guard = _ParentGuard(reader, float(sys.argv[2]))
80
85
  guard.start()
81
86
  if not guard.begin_dispatch():
82
87
  return
@@ -1039,17 +1039,22 @@ class ServerProcess:
1039
1039
  creationflags=_WINDOWS_CREATE_NEW_PROCESS_GROUP,
1040
1040
  )
1041
1041
 
1042
+ from deepagents_code._session_lock import session_lock_fds
1043
+
1042
1044
  reader, writer = os.pipe() # Both ends are non-inheritable by default.
1043
1045
  self._parent_pipe_writer = writer
1044
1046
  # Abandoning the manager must not leak its writer. Explicit teardown
1045
1047
  # invokes this same finalizer so a reused descriptor is never closed twice.
1046
1048
  self._parent_pipe_finalizer = weakref.finalize(self, os.close, writer)
1049
+ # The session lock keeps the install marked in use while the server
1050
+ # runs, so a migration does not rebuild it underneath.
1051
+ inherited = (reader, *session_lock_fds())
1047
1052
  try:
1048
1053
  return subprocess.Popen( # noqa: S603 # argv is built internally
1049
1054
  [
1050
1055
  *cmd[:2],
1051
1056
  "deepagents_code.client.launch._server_bootstrap",
1052
- str(reader),
1057
+ ",".join(map(str, inherited)),
1053
1058
  str(_SHUTDOWN_TIMEOUT),
1054
1059
  *cmd[3:],
1055
1060
  ],
@@ -1059,7 +1064,7 @@ class ServerProcess:
1059
1064
  stderr=subprocess.STDOUT,
1060
1065
  start_new_session=True,
1061
1066
  creationflags=0,
1062
- pass_fds=(reader,),
1067
+ pass_fds=inherited,
1063
1068
  )
1064
1069
  finally:
1065
1070
  os.close(reader)
@@ -4685,7 +4685,7 @@ def resolve_auto_classifier_model_with_problem() -> tuple[str | None, str | None
4685
4685
 
4686
4686
 
4687
4687
  _DEFAULT_AUTO_CLASSIFIER_MODELS = {
4688
- "anthropic": "anthropic:claude-sonnet-5",
4688
+ "anthropic": "anthropic:claude-sonnet-5-5",
4689
4689
  "google_genai": "google_genai:gemini-3.8-flash",
4690
4690
  "google_vertexai": "google_vertexai:gemini-3.8-flash",
4691
4691
  "openai": "openai:gpt-5.6-luna",
@@ -52,6 +52,11 @@ _UNPERSISTED_AUTO_UPDATE_FAILURE_NOTE = (
52
52
  "\n[yellow]Note:[/yellow] this failure could not be recorded, so dcode will "
53
53
  "retry this update on the next launch until the state directory becomes writable."
54
54
  )
55
+ _UNPERSISTED_AUTO_UPDATE_DEFERRAL_NOTE = (
56
+ "\n[yellow]Note:[/yellow] this deferral could not be recorded, so dcode will "
57
+ "announce this update again on the next launch until the state directory "
58
+ "becomes writable."
59
+ )
55
60
 
56
61
 
57
62
  class _TrustAction(Enum):
@@ -457,6 +462,27 @@ def _confirm_update_after_restart(console: Console, version: str) -> None:
457
462
  console.print(f"[green]Updated to v{version}.[/green]", highlight=False)
458
463
 
459
464
 
465
+ def _session_lock_unavailable_note() -> str:
466
+ """Explain a migration deferral that quitting other sessions cannot fix.
467
+
468
+ Returns:
469
+ A line ending in a newline, or an empty string when the session lock
470
+ works and the deferral notice alone is accurate.
471
+ """
472
+ from deepagents_code._session_lock import (
473
+ SESSION_LOCK_FILE,
474
+ session_lock_unavailable,
475
+ )
476
+
477
+ if not session_lock_unavailable():
478
+ return ""
479
+ return (
480
+ f"dcode could not lock {SESSION_LOCK_FILE}, so it cannot tell whether "
481
+ "other sessions are running and will not migrate on its own. Run "
482
+ "`dcode update` instead.\n"
483
+ )
484
+
485
+
460
486
  def _mark_startup_auto_update_failed_safe(version: str) -> None:
461
487
  """Record the auto-update cooldown for *version*, never raising.
462
488
 
@@ -622,10 +648,12 @@ def _run_startup_auto_update(console: Console) -> None:
622
648
  is_update_check_enabled,
623
649
  mark_auto_update_default_acknowledged,
624
650
  mark_startup_auto_update_failed,
651
+ migration_deferral_message,
625
652
  perform_upgrade,
626
653
  release_requires_prereleases,
627
654
  should_announce_auto_update_default,
628
655
  should_skip_startup_auto_update_after_failure,
656
+ startup_auto_update_was_deferred,
629
657
  update_install_lock,
630
658
  upgrade_command,
631
659
  )
@@ -687,12 +715,15 @@ def _run_startup_auto_update(console: Console) -> None:
687
715
  highlight=False,
688
716
  )
689
717
  return
718
+ # A deferred migration is retried as soon as no other session is
719
+ # running; the install lock section decides between migrating and
720
+ # repeating the deferral.
721
+ retrying_deferral = startup_auto_update_was_deferred(latest)
690
722
  if should_skip_startup_auto_update_after_failure(latest):
691
- # A same-version upgrade failed or was deferred recently; retrying
692
- # it here would very likely fail again and re-stall every launch
693
- # (this runs before the TUI). Skip for the cooldown window and
694
- # point at `dcode update`: unlike a bare uv command, it also
695
- # handles a Python migration that startup deferred.
723
+ # A same-version upgrade failed recently; retrying it here would
724
+ # very likely fail again and re-stall every launch (this runs
725
+ # before the TUI). Skip for the cooldown window and point at
726
+ # `dcode update`.
696
727
  from deepagents_code._invocation import invoked_name
697
728
 
698
729
  console.print(
@@ -751,6 +782,23 @@ def _run_startup_auto_update(console: Console) -> None:
751
782
  highlight=False,
752
783
  )
753
784
  return
785
+ # A migration rebuilds the shared tool environment, which would
786
+ # break dcode sessions running in other terminals, so it only runs
787
+ # here when no other session was found at this check.
788
+ from deepagents_code._session_lock import is_sole_session
789
+
790
+ sole_session = is_sole_session()
791
+ if retrying_deferral and not sole_session:
792
+ # Repeat the deferral without re-fetching the release's Python
793
+ # requirement or announcing an update that will not happen.
794
+ console.print(
795
+ f"{migration_deferral_message(latest)}\n"
796
+ f"{_session_lock_unavailable_note()}"
797
+ f"Continuing with v{cli_version}.",
798
+ markup=False,
799
+ highlight=False,
800
+ )
801
+ return
754
802
  release_age = format_release_age_parenthetical(latest)
755
803
  console.print(
756
804
  f"Updating dcode from v{cli_version} to v{latest}{release_age}..."
@@ -775,15 +823,12 @@ def _run_startup_auto_update(console: Console) -> None:
775
823
  notices.append(message)
776
824
  console.print(message, markup=False, highlight=False)
777
825
 
778
- # A Python migration rebuilds the shared tool environment, which
779
- # would break dcode sessions running in other terminals. Defer it
780
- # to an explicit `dcode update`.
781
826
  success, output, _installed = asyncio.run(
782
827
  perform_upgrade(
783
828
  on_notice=show_notice,
784
829
  log_path=log_path,
785
830
  target_version=latest,
786
- allow_python_migration=False,
831
+ allow_python_migration=sole_session,
787
832
  on_migration_deferred=lambda: deferred.append(True),
788
833
  on_unverified_install=lambda: unverified.append(True),
789
834
  )
@@ -841,12 +886,13 @@ def _run_startup_auto_update(console: Console) -> None:
841
886
  _mark_startup_auto_update_failed_safe(latest)
842
887
  _exit_after_unrestartable_update(console, latest)
843
888
  return
844
- persisted = mark_startup_auto_update_failed(latest)
889
+ persisted = mark_startup_auto_update_failed(latest, deferred=bool(deferred))
845
890
  if unverified:
846
891
  _exit_after_unverified_update(console, persisted=persisted)
847
892
  if deferred:
848
893
  # Nothing failed: the notice above explains how to migrate.
849
- message = f"Continuing with v{cli_version}."
894
+ note = escape(_session_lock_unavailable_note())
895
+ message = f"{note}Continuing with v{cli_version}."
850
896
  elif notices:
851
897
  # The notice above carries its own recovery steps; a generic
852
898
  # command here would contradict them.
@@ -867,14 +913,16 @@ def _run_startup_auto_update(console: Console) -> None:
867
913
  f"Run manually: [cyan]{cmd}[/cyan]\n"
868
914
  f"Continuing with v{cli_version}."
869
915
  )
870
- if not persisted and not deferred:
871
- # The cooldown marker could not be saved (e.g. a read-only state
872
- # dir), so this same failing upgrade would otherwise be retried on
873
- # every launch. Surface it rather than silently re-stalling, the
874
- # way the consent-announce path surfaces its un-persisted state.
875
- # After a deferral nothing failed: a lost marker only repeats the
876
- # deferral notice, which installs nothing.
877
- message += _UNPERSISTED_AUTO_UPDATE_FAILURE_NOTE
916
+ if not persisted:
917
+ # The marker could not be saved (e.g. a read-only state dir), so
918
+ # this same upgrade would otherwise be retried on every launch.
919
+ # Surface it rather than silently re-stalling, the way the
920
+ # consent-announce path surfaces its un-persisted state.
921
+ message += (
922
+ _UNPERSISTED_AUTO_UPDATE_DEFERRAL_NOTE
923
+ if deferred
924
+ else _UNPERSISTED_AUTO_UPDATE_FAILURE_NOTE
925
+ )
878
926
  console.print(message, markup=True, highlight=False)
879
927
  except SystemExit:
880
928
  # Process replacement (and test doubles that simulate it), plus the
@@ -2630,7 +2678,7 @@ def parse_args() -> argparse.Namespace:
2630
2678
  dest="auto_classifier_model",
2631
2679
  metavar="MODEL",
2632
2680
  help="Model the Auto approval classifier reviews actions with "
2633
- "(e.g. anthropic:claude-sonnet-5). Local TUI or ACP only. Defaults to "
2681
+ "(e.g. anthropic:claude-sonnet-5-5). Local TUI or ACP only. Defaults to "
2634
2682
  "DEEPAGENTS_CODE_AUTO_CLASSIFIER_MODEL, then [models].auto_classifier, "
2635
2683
  "then a provider-specific model or the main agent model. A weaker model "
2636
2684
  "weakens Auto's review.",
@@ -5520,10 +5568,23 @@ def cli_main() -> None:
5520
5568
  # accessor triggers `_ensure_bootstrap()` (dotenv loading), and
5521
5569
  # commands dispatched below — notably `auth status` — resolve
5522
5570
  # credentials from the environment expecting `.env` to be loaded.
5523
- from deepagents_code.config import _get_credentials, console
5571
+ from deepagents_code.config import (
5572
+ _get_credentials,
5573
+ _is_editable_install,
5574
+ console,
5575
+ )
5524
5576
 
5525
5577
  _get_credentials()
5526
5578
 
5579
+ # Mark this install as in use before anything can migrate it, so a
5580
+ # concurrent launch's auto-update does not rebuild the environment out
5581
+ # from under this process. Editable installs never auto-update, so
5582
+ # nothing reads their registration.
5583
+ if not _is_editable_install():
5584
+ from deepagents_code._session_lock import hold_session_lock
5585
+
5586
+ hold_session_lock()
5587
+
5527
5588
  if command is None:
5528
5589
  # The health gate already ran above, for every command, so the
5529
5590
  # violation check inside cannot fire. Kept as defense in depth: it
@@ -438,6 +438,12 @@ def _validate_server_config(server_name: str, server_config: dict[str, Any]) ->
438
438
  error_msg = f"Server '{server_name}' config must be a dictionary"
439
439
  raise TypeError(error_msg)
440
440
 
441
+ if "skillOnly" in server_config and not isinstance(
442
+ server_config["skillOnly"], bool
443
+ ):
444
+ error_msg = f"Server '{server_name}' 'skillOnly' must be a boolean"
445
+ raise TypeError(error_msg)
446
+
441
447
  server_type = _resolve_server_type(server_config)
442
448
 
443
449
  if server_type in _SUPPORTED_REMOTE_TYPES:
@@ -2295,6 +2301,11 @@ async def _load_tools_from_config(
2295
2301
  for tool in server_tools:
2296
2302
  original_name = (tool.metadata or {})[_MCP_ORIGINAL_TOOL_NAME_KEY]
2297
2303
  tool.name = tool_names[server_name, original_name]
2304
+ if server_config.get("skillOnly"):
2305
+ tool.metadata = {
2306
+ **(tool.metadata or {}),
2307
+ "_deepagents_code_skill_only": True,
2308
+ }
2298
2309
  server_tools = _apply_tool_filter(server_tools, server_name, server_config)
2299
2310
 
2300
2311
  # Pair each schema by the server-side name retained in the adapted
@@ -42,6 +42,7 @@ if TYPE_CHECKING:
42
42
 
43
43
  from deepagents.backends.protocol import BackendProtocol
44
44
  from langchain_core.runnables import RunnableConfig
45
+ from langchain_core.tools import BaseTool
45
46
  from langgraph.runtime import Runtime
46
47
 
47
48
  logger = logging.getLogger(__name__)
@@ -440,6 +441,7 @@ class PluginSkillsMiddleware(SkillsMiddleware):
440
441
  sources: Sequence[CodeSkillSource],
441
442
  system_prompt: str | None = sdk_skills.SKILLS_SYSTEM_PROMPT,
442
443
  path_base: Path | None = None,
444
+ tools: Sequence[BaseTool] = (),
443
445
  ) -> None:
444
446
  """Initialize the middleware with Code-local plugin source tuples.
445
447
 
@@ -451,6 +453,7 @@ class PluginSkillsMiddleware(SkillsMiddleware):
451
453
  path_base: Directory that relative `skills.extra_allowed_dirs`
452
454
  entries resolve against. If `None`, the process working
453
455
  directory is used.
456
+ tools: Tools disclosed only after their skill is read or pinned.
454
457
  """
455
458
  self._allowed_roots = tuple(Path(source[0]).resolve() for source in sources)
456
459
  self._path_base = path_base
@@ -459,6 +462,7 @@ class PluginSkillsMiddleware(SkillsMiddleware):
459
462
  backend=backend,
460
463
  sources=sdk_sources,
461
464
  system_prompt=system_prompt,
465
+ tools=tools,
462
466
  )
463
467
  self._namespaces = tuple(
464
468
  source[2] if len(source) == _PLUGIN_SKILL_SOURCE_LENGTH else None