deepagents-code 0.1.72__tar.gz → 0.1.74__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 (564) hide show
  1. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/CHANGELOG.md +42 -0
  2. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/PKG-INFO +18 -18
  3. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/THREAT_MODEL.md +27 -23
  4. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/_build_info.py +1 -1
  5. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/_dep_floor_check.py +4 -1
  6. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/_paths.py +6 -1
  7. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/_server_config.py +129 -2
  8. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/_session_stats.py +191 -82
  9. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/_version.py +1 -1
  10. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/agent.py +130 -13
  11. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/app.py +339 -28
  12. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/auto_mode.py +535 -183
  13. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/built_in_skills/skill-creator/scripts/init_skill.py +8 -4
  14. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/built_in_skills/skill-creator/scripts/quick_validate.py +1 -1
  15. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/client/non_interactive.py +6 -3
  16. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/client/remote_client.py +37 -2
  17. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/cold_cache.py +44 -1
  18. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/config.py +1 -1
  19. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/configurable_model.py +41 -2
  20. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/cost_tracking.py +682 -57
  21. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/hooks/legacy.py +2 -2
  22. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/integrations/sandbox_factory.py +9 -9
  23. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/main.py +3 -2
  24. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/model_retry.py +11 -0
  25. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/offload_api.py +19 -2
  26. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/offload_middleware.py +1 -0
  27. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/resume_state.py +8 -0
  28. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/server_graph.py +191 -23
  29. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/sessions.py +90 -7
  30. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/skills/commands.py +1 -1
  31. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/system_prompt.md +10 -26
  32. deepagents_code-0.1.74/deepagents_code/tui/modals/cost_breakdown.py +95 -0
  33. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/tui/modals/resume_compact.py +5 -3
  34. deepagents_code-0.1.74/deepagents_code/tui/modals/session_cost.py +69 -0
  35. deepagents_code-0.1.74/deepagents_code/tui/modals/session_cost.tcss +32 -0
  36. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/tui/textual_adapter.py +151 -7
  37. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/tui/widgets/autocomplete.py +268 -0
  38. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/tui/widgets/chat_input.py +89 -30
  39. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/tui/widgets/debug_console.py +70 -2
  40. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/tui/widgets/startup_tip.py +2 -1
  41. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/tui/widgets/status.py +90 -2
  42. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/tui/widgets/thread_selector.py +40 -9
  43. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/ui.py +9 -1
  44. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/update_check.py +78 -39
  45. deepagents_code-0.1.74/deepagents_code/workspace.py +861 -0
  46. deepagents_code-0.1.74/deepagents_code/workspace_diagnostics.py +438 -0
  47. deepagents_code-0.1.74/images/debug-console-cost-breakdown.png +0 -0
  48. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/pyproject.toml +12 -12
  49. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/scripts/install.sh +41 -5
  50. deepagents_code-0.1.74/tests/integration_tests/benchmarks/test_thread_loading_benchmarks.py +165 -0
  51. deepagents_code-0.1.74/tests/unit_tests/smoke_tests/snapshots/system_prompt_headless_local.md +301 -0
  52. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/smoke_tests/snapshots/system_prompt_interactive_local.md +6 -3
  53. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/smoke_tests/test_system_prompt.py +75 -13
  54. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_agent.py +84 -0
  55. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_app.py +746 -0
  56. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_auto_mode.py +1228 -303
  57. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_configurable_model.py +88 -1
  58. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_cost_tracking.py +712 -10
  59. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_debug_console.py +59 -6
  60. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_dep_floor_check.py +9 -7
  61. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_hooks.py +11 -0
  62. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_input_parsing.py +8 -0
  63. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_install_script.py +310 -62
  64. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_model_retry.py +36 -2
  65. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_non_interactive.py +26 -12
  66. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_offload_api.py +77 -0
  67. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_paths.py +12 -0
  68. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_remote_client.py +27 -0
  69. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_resume_state.py +50 -0
  70. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_sandbox_factory.py +132 -1
  71. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_server_config.py +62 -0
  72. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_server_graph.py +90 -5
  73. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_session_stats.py +189 -11
  74. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_sessions.py +65 -1
  75. deepagents_code-0.1.74/tests/unit_tests/test_text_encoding.py +147 -0
  76. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_update_check.py +200 -0
  77. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_workspace.py +109 -3
  78. deepagents_code-0.1.74/tests/unit_tests/test_workspace_diagnostics.py +309 -0
  79. deepagents_code-0.1.74/tests/unit_tests/tui/modals/test_session_cost.py +24 -0
  80. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/tui/test_textual_adapter.py +332 -12
  81. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/tui/widgets/test_autocomplete.py +68 -0
  82. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/tui/widgets/test_chat_input.py +159 -0
  83. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/tui/widgets/test_status.py +58 -0
  84. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/tui/widgets/test_thread_selector.py +18 -4
  85. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/uv.lock +49 -49
  86. deepagents_code-0.1.72/deepagents_code/workspace.py +0 -497
  87. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/.gitignore +0 -0
  88. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/AGENTS.md +0 -0
  89. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/ARCHITECTURE.md +0 -0
  90. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/COMMANDS.md +0 -0
  91. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/DEVELOPMENT.md +0 -0
  92. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/EXTENSIONS.md +0 -0
  93. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/HOOKS.md +0 -0
  94. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/LICENSE +0 -0
  95. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/Makefile +0 -0
  96. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/PRICING.md +0 -0
  97. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/README.md +0 -0
  98. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/__init__.py +0 -0
  99. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/__main__.py +0 -0
  100. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/_ask_user_types.py +0 -0
  101. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/_cli_context.py +0 -0
  102. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/_constants.py +0 -0
  103. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/_content_blocks.py +0 -0
  104. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/_debug.py +0 -0
  105. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/_debug_buffer.py +0 -0
  106. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/_env_vars.py +0 -0
  107. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/_fake_models.py +0 -0
  108. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/_git.py +0 -0
  109. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/_glm_5p2_profile.py +0 -0
  110. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/_home_error.py +0 -0
  111. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/_invocation.py +0 -0
  112. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/_markdown.py +0 -0
  113. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/_repository_bounds.py +0 -0
  114. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/_reserved_names.py +0 -0
  115. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/_startup_error.py +0 -0
  116. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/_terminal_stderr.py +0 -0
  117. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/_testing_models.py +0 -0
  118. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/_textual_patches.py +0 -0
  119. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/_tool_stream.py +0 -0
  120. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/_tracing.py +0 -0
  121. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/acp.py +0 -0
  122. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/app.tcss +0 -0
  123. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/approval_mode.py +0 -0
  124. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/ask_user.py +0 -0
  125. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/auth_display.py +0 -0
  126. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/auth_store.py +0 -0
  127. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/built_in_skills/__init__.py +0 -0
  128. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/built_in_skills/deepagents-thread-inspector/SKILL.md +0 -0
  129. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/built_in_skills/deepagents-thread-inspector/scripts/inspect_sessions.py +0 -0
  130. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/built_in_skills/remember/SKILL.md +0 -0
  131. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/built_in_skills/skill-creator/SKILL.md +0 -0
  132. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/bundled_prices.README.md +0 -0
  133. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/bundled_prices.json +0 -0
  134. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/client/__init__.py +0 -0
  135. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/client/commands/__init__.py +0 -0
  136. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/client/commands/auth.py +0 -0
  137. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/client/commands/config.py +0 -0
  138. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/client/commands/extras.py +0 -0
  139. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/client/commands/mcp.py +0 -0
  140. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/client/commands/tools.py +0 -0
  141. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/client/launch/__init__.py +0 -0
  142. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/client/launch/server.py +0 -0
  143. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/client/launch/server_manager.py +0 -0
  144. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/clipboard.py +0 -0
  145. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/command_registry.py +0 -0
  146. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/config_manifest.py +0 -0
  147. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/configuration/__init__.py +0 -0
  148. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/configuration/interpreter.py +0 -0
  149. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/configuration/paths.py +0 -0
  150. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/configuration/provider.py +0 -0
  151. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/configuration/providers.py +0 -0
  152. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/configuration/resolver.py +0 -0
  153. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/configuration/service.py +0 -0
  154. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/configuration/theme_resolution.py +0 -0
  155. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/configuration/types.py +0 -0
  156. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/configuration/writer.py +0 -0
  157. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/context_doctor.py +0 -0
  158. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/default_agent_prompt.md +0 -0
  159. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/diff_utils.py +0 -0
  160. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/doctor.py +0 -0
  161. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/editor.py +0 -0
  162. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/event_bus.py +0 -0
  163. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/extensions/__init__.py +0 -0
  164. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/extensions/api.py +0 -0
  165. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/extensions/discovery.py +0 -0
  166. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/extensions/hosting.py +0 -0
  167. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/extensions/loader.py +0 -0
  168. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/extensions/registry.py +0 -0
  169. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/extensions/runtime.py +0 -0
  170. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/extensions/settings.py +0 -0
  171. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/extensions/trust.py +0 -0
  172. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/extras_info.py +0 -0
  173. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/file_ops.py +0 -0
  174. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/formatting.py +0 -0
  175. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/goal_rubric.py +0 -0
  176. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/goal_state_limits.py +0 -0
  177. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/goal_state_notice.py +0 -0
  178. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/goal_tools.py +0 -0
  179. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/hooks/__init__.py +0 -0
  180. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/hooks/capabilities.py +0 -0
  181. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/hooks/client.py +0 -0
  182. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/hooks/client_lifecycle.py +0 -0
  183. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/hooks/context.py +0 -0
  184. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/hooks/engine.py +0 -0
  185. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/hooks/env.py +0 -0
  186. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/hooks/envelope.py +0 -0
  187. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/hooks/interrupt.py +0 -0
  188. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/hooks/loading.py +0 -0
  189. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/hooks/manager.py +0 -0
  190. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/hooks/migration.py +0 -0
  191. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/hooks/models/__init__.py +0 -0
  192. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/hooks/models/adapters.py +0 -0
  193. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/hooks/models/config.py +0 -0
  194. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/hooks/models/domain.py +0 -0
  195. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/hooks/models/transport.py +0 -0
  196. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/hooks/models/wire.py +0 -0
  197. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/hooks/permissions.py +0 -0
  198. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/hooks/presenter.py +0 -0
  199. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/hooks/projection.py +0 -0
  200. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/hooks/reducer.py +0 -0
  201. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/hooks/runner.py +0 -0
  202. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/hooks/runtime.py +0 -0
  203. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/hooks/server_middleware.py +0 -0
  204. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/hooks/snapshot.py +0 -0
  205. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/hooks/tools.py +0 -0
  206. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/hooks/transcript.py +0 -0
  207. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/hooks/trust.py +0 -0
  208. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/hooks/validate_terminal_sequence.py +0 -0
  209. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/input.py +0 -0
  210. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/integrations/__init__.py +0 -0
  211. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/integrations/openai_codex.py +0 -0
  212. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/integrations/sandbox_config.py +0 -0
  213. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/integrations/sandbox_provider.py +0 -0
  214. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/integrations/sandbox_registry.py +0 -0
  215. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/iterm_cursor_guide.py +0 -0
  216. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/json_types.py +0 -0
  217. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/local_context.py +0 -0
  218. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/managed_tools.py +0 -0
  219. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/mcp_auth.py +0 -0
  220. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/mcp_config.py +0 -0
  221. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/mcp_disabled.py +0 -0
  222. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/mcp_login_service.py +0 -0
  223. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/mcp_middleware.py +0 -0
  224. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/mcp_oauth_ui.py +0 -0
  225. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/mcp_providers/__init__.py +0 -0
  226. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/mcp_providers/_registry.py +0 -0
  227. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/mcp_providers/base.py +0 -0
  228. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/mcp_providers/github.py +0 -0
  229. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/mcp_providers/slack.py +0 -0
  230. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/mcp_proxy.py +0 -0
  231. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/mcp_tools.py +0 -0
  232. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/media_utils.py +0 -0
  233. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/memory_guard.py +0 -0
  234. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/model_config.py +0 -0
  235. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/notifications.py +0 -0
  236. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/offload.py +0 -0
  237. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/onboarding.py +0 -0
  238. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/output.py +0 -0
  239. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/paste_collapse.py +0 -0
  240. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/plugins/__init__.py +0 -0
  241. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/plugins/_json.py +0 -0
  242. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/plugins/adapters/__init__.py +0 -0
  243. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/plugins/adapters/hooks.py +0 -0
  244. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/plugins/adapters/mcp.py +0 -0
  245. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/plugins/adapters/skills.py +0 -0
  246. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/plugins/adapters/skills_middleware.py +0 -0
  247. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/plugins/commands_cli.py +0 -0
  248. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/plugins/discovery.py +0 -0
  249. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/plugins/manifest.py +0 -0
  250. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/plugins/marketplace.py +0 -0
  251. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/plugins/models.py +0 -0
  252. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/plugins/store.py +0 -0
  253. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/plugins/substitution.py +0 -0
  254. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/project_utils.py +0 -0
  255. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/py.typed +0 -0
  256. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/reasoning_effort.py +0 -0
  257. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/reliable_rubric.py +0 -0
  258. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/skills/__init__.py +0 -0
  259. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/skills/invocation.py +0 -0
  260. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/skills/load.py +0 -0
  261. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/skills/merge.py +0 -0
  262. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/skills/trust.py +0 -0
  263. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/state_migration.py +0 -0
  264. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/subagents.py +0 -0
  265. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/terminal_capabilities.py +0 -0
  266. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/terminal_escape.py +0 -0
  267. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/theme.py +0 -0
  268. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/tool_catalog.py +0 -0
  269. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/tool_display.py +0 -0
  270. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/tools.py +0 -0
  271. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/tui/__init__.py +0 -0
  272. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/tui/key_hints.py +0 -0
  273. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/tui/modals/__init__.py +0 -0
  274. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/tui/modals/cold_cache.py +0 -0
  275. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/tui/modals/model_switch.py +0 -0
  276. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/tui/modals/plugin_manager/__init__.py +0 -0
  277. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/tui/modals/plugin_manager/content.py +0 -0
  278. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/tui/modals/plugin_manager/models.py +0 -0
  279. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/tui/modals/plugin_manager/plugin_manager.tcss +0 -0
  280. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/tui/modals/plugin_manager/state.py +0 -0
  281. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/tui/modals/plugin_manager/tabs.py +0 -0
  282. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/tui/modals/prompt_clipboard.py +0 -0
  283. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/tui/modals/prompt_clipboard.tcss +0 -0
  284. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/tui/modals/resume_blocked.py +0 -0
  285. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/tui/screens/__init__.py +0 -0
  286. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/tui/widgets/__init__.py +0 -0
  287. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/tui/widgets/_condense_path.py +0 -0
  288. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/tui/widgets/_copy_spans.py +0 -0
  289. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/tui/widgets/_inline_prompt.py +0 -0
  290. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/tui/widgets/_js_eval_display.py +0 -0
  291. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/tui/widgets/_links.py +0 -0
  292. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/tui/widgets/_paste_textarea.py +0 -0
  293. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/tui/widgets/agent_selector.py +0 -0
  294. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/tui/widgets/approval.py +0 -0
  295. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/tui/widgets/ask_user.py +0 -0
  296. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/tui/widgets/auth.py +0 -0
  297. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/tui/widgets/auto_mode_notice.py +0 -0
  298. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/tui/widgets/codex_auth.py +0 -0
  299. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/tui/widgets/context_usage.py +0 -0
  300. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/tui/widgets/cwd_switch.py +0 -0
  301. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/tui/widgets/diff.py +0 -0
  302. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/tui/widgets/effort_selector.py +0 -0
  303. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/tui/widgets/goal_review.py +0 -0
  304. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/tui/widgets/goal_status.py +0 -0
  305. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/tui/widgets/history.py +0 -0
  306. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/tui/widgets/install_confirm.py +0 -0
  307. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/tui/widgets/launch_init.py +0 -0
  308. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/tui/widgets/loading.py +0 -0
  309. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/tui/widgets/mcp_login.py +0 -0
  310. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/tui/widgets/mcp_reconnect.py +0 -0
  311. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/tui/widgets/mcp_viewer.py +0 -0
  312. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/tui/widgets/message_store.py +0 -0
  313. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/tui/widgets/messages.py +0 -0
  314. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/tui/widgets/model_selector.py +0 -0
  315. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/tui/widgets/notification_center.py +0 -0
  316. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/tui/widgets/notification_detail.py +0 -0
  317. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/tui/widgets/notification_settings.py +0 -0
  318. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/tui/widgets/prompt_search.py +0 -0
  319. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/tui/widgets/restart_prompt.py +0 -0
  320. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/tui/widgets/skill_trust.py +0 -0
  321. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/tui/widgets/subagent_panel.py +0 -0
  322. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/tui/widgets/theme_selector.py +0 -0
  323. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/tui/widgets/thread_agent_switch.py +0 -0
  324. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/tui/widgets/tool_renderers.py +0 -0
  325. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/tui/widgets/tool_widgets.py +0 -0
  326. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/tui/widgets/update_available.py +0 -0
  327. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/tui/widgets/update_confirm.py +0 -0
  328. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/tui/widgets/update_progress.py +0 -0
  329. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/tui/widgets/welcome.py +0 -0
  330. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/tui/widgets/yolo_mode_notice.py +0 -0
  331. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/deepagents_code/unicode_security.py +0 -0
  332. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/examples/extensions/memory_store.py +0 -0
  333. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/examples/skills/arxiv-search/SKILL.md +0 -0
  334. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/examples/skills/arxiv-search/arxiv_search.py +0 -0
  335. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/examples/skills/langgraph-docs/SKILL.md +0 -0
  336. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/examples/skills/skill-creator/SKILL.md +0 -0
  337. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/examples/skills/skill-creator/scripts/init_skill.py +0 -0
  338. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/examples/skills/skill-creator/scripts/quick_validate.py +0 -0
  339. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/examples/skills/web-research/SKILL.md +0 -0
  340. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/hatch_build.py +0 -0
  341. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/images/model-stream-retry.png +0 -0
  342. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/images/tui.png +0 -0
  343. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/scripts/check_imports.py +0 -0
  344. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/scripts/check_process_cwd.py +0 -0
  345. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/scripts/debug_server.sh +0 -0
  346. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/scripts/generate_commands_catalog.py +0 -0
  347. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/README.md +0 -0
  348. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/integration_tests/__init__.py +0 -0
  349. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/integration_tests/benchmarks/__init__.py +0 -0
  350. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/integration_tests/benchmarks/test_codspeed_import_benchmarks.py +0 -0
  351. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/integration_tests/benchmarks/test_local_context_benchmarks.py +0 -0
  352. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/integration_tests/benchmarks/test_startup_benchmarks.py +0 -0
  353. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/integration_tests/conftest.py +0 -0
  354. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/integration_tests/test_acp_mode.py +0 -0
  355. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/integration_tests/test_auto_approve_remote.py +0 -0
  356. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/integration_tests/test_compact_resume.py +0 -0
  357. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/integration_tests/test_offload_server_side.py +0 -0
  358. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/integration_tests/test_pending_work_recovery.py +0 -0
  359. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/integration_tests/test_sandbox_factory.py +0 -0
  360. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/integration_tests/test_sandbox_operations.py +0 -0
  361. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/__init__.py +0 -0
  362. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/client/__init__.py +0 -0
  363. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/client/commands/__init__.py +0 -0
  364. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/client/commands/test_auth.py +0 -0
  365. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/client/commands/test_extras.py +0 -0
  366. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/client/commands/test_mcp.py +0 -0
  367. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/client/commands/test_tools.py +0 -0
  368. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/conftest.py +0 -0
  369. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/data/coding_agent_v1_validator.json +0 -0
  370. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/hooks/__init__.py +0 -0
  371. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/hooks/models/__init__.py +0 -0
  372. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/hooks/models/test_models.py +0 -0
  373. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/hooks/test_client_lifecycle.py +0 -0
  374. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/hooks/test_configuration.py +0 -0
  375. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/hooks/test_engine.py +0 -0
  376. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/hooks/test_execution.py +0 -0
  377. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/hooks/test_manager.py +0 -0
  378. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/hooks/test_presenter.py +0 -0
  379. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/hooks/test_server_lifecycle.py +0 -0
  380. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/hooks/test_transcript.py +0 -0
  381. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/hooks/test_trust.py +0 -0
  382. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/plugins/__init__.py +0 -0
  383. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/plugins/test_marketplace.py +0 -0
  384. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/plugins/test_plugin_hooks.py +0 -0
  385. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/plugins/test_plugins_p0.py +0 -0
  386. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/skills/__init__.py +0 -0
  387. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/skills/test_commands.py +0 -0
  388. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/skills/test_load.py +0 -0
  389. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/skills/test_merge.py +0 -0
  390. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/skills/test_skill_trust.py +0 -0
  391. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/skills/test_skills_json.py +0 -0
  392. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/skills/test_thread_inspector.py +0 -0
  393. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/smoke_tests/__init__.py +0 -0
  394. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/smoke_tests/conftest.py +0 -0
  395. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test__tool_stream.py +0 -0
  396. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_acp.py +0 -0
  397. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_agent_friendly.py +0 -0
  398. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_approval_mode.py +0 -0
  399. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_args.py +0 -0
  400. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_ask_user_middleware.py +0 -0
  401. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_ask_user_types.py +0 -0
  402. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_auth_display.py +0 -0
  403. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_auth_store.py +0 -0
  404. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_auth_web_search_restart.py +0 -0
  405. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_charset.py +0 -0
  406. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_cli_provider.py +0 -0
  407. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_clipboard.py +0 -0
  408. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_coding_agent_metadata.py +0 -0
  409. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_cold_cache.py +0 -0
  410. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_command_registry.py +0 -0
  411. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_compact_tool.py +0 -0
  412. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_config.py +0 -0
  413. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_config_manifest.py +0 -0
  414. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_configuration.py +0 -0
  415. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_configuration_resolution.py +0 -0
  416. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_configuration_resolver.py +0 -0
  417. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_context_doctor.py +0 -0
  418. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_cursor_style.py +0 -0
  419. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_debug.py +0 -0
  420. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_debug_buffer.py +0 -0
  421. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_diff_utils.py +0 -0
  422. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_doctor.py +0 -0
  423. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_editor.py +0 -0
  424. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_end_to_end.py +0 -0
  425. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_env_vars.py +0 -0
  426. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_event_bus.py +0 -0
  427. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_exception_handling.py +0 -0
  428. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_extension_api.py +0 -0
  429. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_extension_cli_trust.py +0 -0
  430. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_extension_config_manifest.py +0 -0
  431. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_extension_discovery.py +0 -0
  432. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_extension_display.py +0 -0
  433. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_extension_host_runtime.py +0 -0
  434. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_extension_hosting.py +0 -0
  435. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_extension_runtime.py +0 -0
  436. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_extra_skills_dirs.py +0 -0
  437. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_extras_info.py +0 -0
  438. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_file_ops.py +0 -0
  439. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_formatting.py +0 -0
  440. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_git.py +0 -0
  441. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_glm_5p2_profile.py +0 -0
  442. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_goal_criteria_client.py +0 -0
  443. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_goal_rubric.py +0 -0
  444. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_goal_state_limits.py +0 -0
  445. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_goal_state_notice.py +0 -0
  446. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_goal_state_persistence.py +0 -0
  447. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_goal_tools.py +0 -0
  448. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_hatch_build.py +0 -0
  449. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_imports.py +0 -0
  450. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_install_command.py +0 -0
  451. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_invocation.py +0 -0
  452. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_iterm_cursor_guide.py +0 -0
  453. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_json_types.py +0 -0
  454. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_local_context.py +0 -0
  455. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_main.py +0 -0
  456. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_main_acp_mode.py +0 -0
  457. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_main_args.py +0 -0
  458. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_managed_tools.py +0 -0
  459. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_mcp_auth.py +0 -0
  460. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_mcp_config.py +0 -0
  461. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_mcp_disabled.py +0 -0
  462. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_mcp_lifecycle.py +0 -0
  463. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_mcp_login_service.py +0 -0
  464. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_mcp_oauth_ui.py +0 -0
  465. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_mcp_proxy.py +0 -0
  466. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_mcp_schema.py +0 -0
  467. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_mcp_tools.py +0 -0
  468. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_media_utils.py +0 -0
  469. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_memory_guard.py +0 -0
  470. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_model_config.py +0 -0
  471. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_model_switch.py +0 -0
  472. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_notifications.py +0 -0
  473. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_offload.py +0 -0
  474. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_onboarding.py +0 -0
  475. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_openai_codex_integration.py +0 -0
  476. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_output.py +0 -0
  477. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_process_cwd_check.py +0 -0
  478. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_reasoning_effort.py +0 -0
  479. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_reliable_rubric.py +0 -0
  480. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_reload.py +0 -0
  481. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_repository_bounds.py +0 -0
  482. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_resume_compaction_recovery.py +0 -0
  483. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_rubric_cli.py +0 -0
  484. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_sandbox_config.py +0 -0
  485. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_sandbox_provider.py +0 -0
  486. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_sandbox_registry.py +0 -0
  487. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_server.py +0 -0
  488. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_server_helpers.py +0 -0
  489. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_server_manager.py +0 -0
  490. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_server_tracing.py +0 -0
  491. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_shell_allow_list.py +0 -0
  492. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_skill_invocation.py +0 -0
  493. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_startup_fast_paths.py +0 -0
  494. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_state_migration.py +0 -0
  495. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_subagents.py +0 -0
  496. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_terminal_capabilities.py +0 -0
  497. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_terminal_escape.py +0 -0
  498. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_terminal_progress_preference.py +0 -0
  499. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_terminal_stderr.py +0 -0
  500. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_textual_patches.py +0 -0
  501. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_theme.py +0 -0
  502. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_threads_resume.py +0 -0
  503. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_tool_catalog.py +0 -0
  504. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_tool_display.py +0 -0
  505. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_tracing.py +0 -0
  506. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_tracing_replicas.py +0 -0
  507. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_transcript_virtualization.py +0 -0
  508. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_ui.py +0 -0
  509. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_unicode_security.py +0 -0
  510. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_uninstall_command.py +0 -0
  511. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/test_version.py +0 -0
  512. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/tools/__init__.py +0 -0
  513. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/tools/test_current_thread.py +0 -0
  514. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/tools/test_fetch_url.py +0 -0
  515. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/tools/test_tool_arg_schemas.py +0 -0
  516. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/tools/test_web_search.py +0 -0
  517. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/tui/__init__.py +0 -0
  518. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/tui/modals/__init__.py +0 -0
  519. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/tui/modals/plugin_manager/__init__.py +0 -0
  520. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/tui/modals/plugin_manager/test_structure.py +0 -0
  521. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/tui/modals/test_cold_cache.py +0 -0
  522. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/tui/modals/test_model_switch.py +0 -0
  523. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/tui/modals/test_prompt_clipboard.py +0 -0
  524. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/tui/modals/test_resume_blocked.py +0 -0
  525. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/tui/test_key_hints.py +0 -0
  526. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/tui/test_modal_footer_layout.py +0 -0
  527. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/tui/test_subagent_stream.py +0 -0
  528. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/tui/widgets/__init__.py +0 -0
  529. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/tui/widgets/test_agent_selector.py +0 -0
  530. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/tui/widgets/test_approval.py +0 -0
  531. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/tui/widgets/test_ask_user.py +0 -0
  532. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/tui/widgets/test_auth_widgets.py +0 -0
  533. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/tui/widgets/test_auto_mode_notice.py +0 -0
  534. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/tui/widgets/test_condense_path.py +0 -0
  535. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/tui/widgets/test_copy_spans.py +0 -0
  536. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/tui/widgets/test_cwd_switch.py +0 -0
  537. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/tui/widgets/test_diff.py +0 -0
  538. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/tui/widgets/test_goal_review.py +0 -0
  539. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/tui/widgets/test_history.py +0 -0
  540. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/tui/widgets/test_inline_prompt.py +0 -0
  541. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/tui/widgets/test_install_confirm.py +0 -0
  542. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/tui/widgets/test_launch_init.py +0 -0
  543. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/tui/widgets/test_links.py +0 -0
  544. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/tui/widgets/test_loading.py +0 -0
  545. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/tui/widgets/test_mcp_login_modal.py +0 -0
  546. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/tui/widgets/test_mcp_reconnect.py +0 -0
  547. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/tui/widgets/test_mcp_viewer.py +0 -0
  548. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/tui/widgets/test_message_store.py +0 -0
  549. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/tui/widgets/test_messages.py +0 -0
  550. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/tui/widgets/test_model_selector.py +0 -0
  551. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/tui/widgets/test_notification_center.py +0 -0
  552. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/tui/widgets/test_notification_detail.py +0 -0
  553. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/tui/widgets/test_notification_settings.py +0 -0
  554. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/tui/widgets/test_prompt_search.py +0 -0
  555. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/tui/widgets/test_restart_prompt.py +0 -0
  556. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/tui/widgets/test_skill_trust_screen.py +0 -0
  557. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/tui/widgets/test_startup_tip.py +0 -0
  558. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/tui/widgets/test_subagent_panel.py +0 -0
  559. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/tui/widgets/test_thread_agent_switch.py +0 -0
  560. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/tui/widgets/test_tool_renderers.py +0 -0
  561. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/tui/widgets/test_update_available.py +0 -0
  562. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/tui/widgets/test_update_confirm.py +0 -0
  563. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/tui/widgets/test_update_progress.py +0 -0
  564. {deepagents_code-0.1.72 → deepagents_code-0.1.74}/tests/unit_tests/tui/widgets/test_welcome.py +0 -0
@@ -2,6 +2,48 @@
2
2
 
3
3
  # Deep Agents Code Changelog
4
4
 
5
+ ## [0.1.74](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.73...deepagents-code==0.1.74) (2026-09-23)
6
+
7
+ ### Features
8
+
9
+ - Added inline thread mentions & picker via `@@` ([#6197](https://github.com/langchain-ai/deepagents/pull/6197)).
10
+ - Usage summaries now show human invocations ([#6500](https://github.com/langchain-ai/deepagents/pull/6500)).
11
+
12
+ ### Bug Fixes
13
+
14
+ - Retry bare `openai.APIError` exceptions raised mid-stream ([#6499](https://github.com/langchain-ai/deepagents/pull/6499)).
15
+ - Keep prompt recall results out of the file picker ([#6494](https://github.com/langchain-ai/deepagents/pull/6494)).
16
+ - Read `hooks.json` as UTF-8 in the legacy hook loader ([#6501](https://github.com/langchain-ai/deepagents/pull/6501)).
17
+
18
+ ### Performance Improvements
19
+
20
+ - Reuse Auto classifier history ([#6056](https://github.com/langchain-ai/deepagents/pull/6056)).
21
+ - Rank checkpoint and message row IDs before loading blobs and prompts ([#6488](https://github.com/langchain-ai/deepagents/pull/6488), [#6489](https://github.com/langchain-ai/deepagents/pull/6489)).
22
+ - Log thread-loading phase timings ([#6490](https://github.com/langchain-ai/deepagents/pull/6490)).
23
+
24
+ ## [0.1.73](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.72...deepagents-code==0.1.73) (2026-09-22)
25
+
26
+ ### Features
27
+
28
+ - Added cache bust timer to the footer. ([#6394](https://github.com/langchain-ai/deepagents/pull/6394))
29
+ - Added a durable Debug Console cost breakdown. ([#6246](https://github.com/langchain-ai/deepagents/pull/6246))
30
+ - Added support for copying the highlighted thread ID with `Ctrl+C`. ([#6431](https://github.com/langchain-ai/deepagents/pull/6431))
31
+
32
+ ### Bug Fixes
33
+
34
+ - Improved cost-warning behavior by showing session cost warnings in a modal and suppressing historical cost warnings when resuming. ([#6393](https://github.com/langchain-ai/deepagents/pull/6393), [#6471](https://github.com/langchain-ai/deepagents/pull/6471))
35
+ - Made thread browsing and resume flows more resilient with recoverable thread-picker resume failures, loading labels for thread details, and a clearer thread message count header. ([#6476](https://github.com/langchain-ai/deepagents/pull/6476), [#6430](https://github.com/langchain-ai/deepagents/pull/6430), [#6428](https://github.com/langchain-ai/deepagents/pull/6428))
36
+ - Removed contradictory and invalid system-prompt instructions. ([#6072](https://github.com/langchain-ai/deepagents/pull/6072))
37
+ - Preserved `ask_user` consent receipts across user turns and reconciled interrupted tool requests. ([#6307](https://github.com/langchain-ai/deepagents/pull/6307), [#6321](https://github.com/langchain-ai/deepagents/pull/6321))
38
+ - Cleaned up newly created sandboxes when setup fails. ([#6475](https://github.com/langchain-ai/deepagents/pull/6475))
39
+ - Fixed editable refreshes so they stay anchored to the correct checkout. ([#6455](https://github.com/langchain-ai/deepagents/pull/6455))
40
+ - Kept installation locks outside the uv tool directory. ([#6472](https://github.com/langchain-ai/deepagents/pull/6472))
41
+ - Improved workspace and runtime diagnostics, including separating access-policy compatibility from runtime identity. ([#6384](https://github.com/langchain-ai/deepagents/pull/6384), [#6386](https://github.com/langchain-ai/deepagents/pull/6386))
42
+ - Deduplicated mixed-ID model usage. ([#6432](https://github.com/langchain-ai/deepagents/pull/6432))
43
+ - Clarified the compaction prompt. ([#6429](https://github.com/langchain-ai/deepagents/pull/6429))
44
+ - Restricted auto classifier IDs to the review batch enum. ([#6250](https://github.com/langchain-ai/deepagents/pull/6250))
45
+ - Used UTF-8 for prompts and skill files. ([#6474](https://github.com/langchain-ai/deepagents/pull/6474))
46
+
5
47
  ## [0.1.72](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.71...deepagents-code==0.1.72) (2026-09-21)
6
48
 
7
49
  ### Features
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: deepagents-code
3
- Version: 0.1.72
3
+ Version: 0.1.74
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,21 +30,21 @@ 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.15
33
+ Requires-Dist: deepagents==0.7.18
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.7
37
37
  Requires-Dist: httpx<1.0.0,>=0.28.1
38
- Requires-Dist: langchain-anthropic<2.0.0,>=1.7.2
38
+ Requires-Dist: langchain-anthropic<2.0.0,>=1.7.3
39
39
  Requires-Dist: langchain-google-genai<5.0.0,>=4.4.0
40
- Requires-Dist: langchain-openai<2.0.0,>=1.6.2
40
+ Requires-Dist: langchain-openai<2.0.0,>=1.6.4
41
41
  Requires-Dist: langchain-quickjs<0.4.0,>=0.3.4
42
42
  Requires-Dist: langchain<2.0.0,>=1.4.2
43
43
  Requires-Dist: langgraph-checkpoint-sqlite<4.0.0,>=3.1.1
44
44
  Requires-Dist: langgraph-cli[inmem]<1.0.0,>=0.4.31
45
45
  Requires-Dist: langgraph-runtime-inmem<1.0.0,>=0.34.1
46
- Requires-Dist: langgraph-sdk<1.0.0,>=0.4.4
47
- Requires-Dist: langsmith[sandbox]>=0.13.0
46
+ Requires-Dist: langgraph-sdk<1.0.0,>=0.4.5
47
+ Requires-Dist: langsmith[sandbox]>=0.14.0
48
48
  Requires-Dist: markdownify<2.0.0,>=1.2.3
49
49
  Requires-Dist: mcp<3.0.0,>=2.0.0
50
50
  Requires-Dist: packaging>=26.2
@@ -66,12 +66,12 @@ Provides-Extra: agentcore
66
66
  Requires-Dist: langchain-agentcore-codeinterpreter<1.0.0,>=0.0.5; extra == 'agentcore'
67
67
  Provides-Extra: all-providers
68
68
  Requires-Dist: aiohttp<3.15.0,>=3.14.3; extra == 'all-providers'
69
- Requires-Dist: langchain-anthropic<2.0.0,>=1.7.2; extra == 'all-providers'
70
- Requires-Dist: langchain-aws<2.0.0,>=1.7.8; extra == 'all-providers'
69
+ Requires-Dist: langchain-anthropic<2.0.0,>=1.7.3; extra == 'all-providers'
70
+ Requires-Dist: langchain-aws<2.0.0,>=1.7.9; extra == 'all-providers'
71
71
  Requires-Dist: langchain-baseten<1.0.0,>=0.2.4; extra == 'all-providers'
72
72
  Requires-Dist: langchain-cohere<1.0.0,>=0.6.0; extra == 'all-providers'
73
- Requires-Dist: langchain-deepseek<2.0.0,>=1.1.0; extra == 'all-providers'
74
- Requires-Dist: langchain-fireworks<2.0.0,>=1.6.1; extra == 'all-providers'
73
+ Requires-Dist: langchain-deepseek<2.0.0,>=1.1.1; extra == 'all-providers'
74
+ Requires-Dist: langchain-fireworks<2.0.0,>=1.6.2; extra == 'all-providers'
75
75
  Requires-Dist: langchain-google-genai<5.0.0,>=4.4.0; extra == 'all-providers'
76
76
  Requires-Dist: langchain-google-vertexai<4.0.0,>=3.2.4; extra == 'all-providers'
77
77
  Requires-Dist: langchain-groq<2.0.0,>=1.1.3; extra == 'all-providers'
@@ -82,8 +82,8 @@ Requires-Dist: langchain-meta<2.0.0,>=0.5.0; extra == 'all-providers'
82
82
  Requires-Dist: langchain-mistralai<2.0.0,>=1.1.6; extra == 'all-providers'
83
83
  Requires-Dist: langchain-nvidia-ai-endpoints<2.0.0,>=1.4.3; extra == 'all-providers'
84
84
  Requires-Dist: langchain-ollama<2.0.0,>=1.1.0; extra == 'all-providers'
85
- Requires-Dist: langchain-openai<2.0.0,>=1.6.2; extra == 'all-providers'
86
- Requires-Dist: langchain-openrouter<2.0.0,>=0.2.8; extra == 'all-providers'
85
+ Requires-Dist: langchain-openai<2.0.0,>=1.6.4; extra == 'all-providers'
86
+ Requires-Dist: langchain-openrouter<2.0.0,>=0.2.9; extra == 'all-providers'
87
87
  Requires-Dist: langchain-perplexity<2.0.0,>=1.4.1; extra == 'all-providers'
88
88
  Requires-Dist: langchain-together<2.0.0,>=0.4.0; extra == 'all-providers'
89
89
  Requires-Dist: langchain-xai<2.0.0,>=1.3.0; extra == 'all-providers'
@@ -94,19 +94,19 @@ Requires-Dist: langchain-modal>=0.0.5; extra == 'all-sandboxes'
94
94
  Requires-Dist: langchain-runloop>=0.0.6; extra == 'all-sandboxes'
95
95
  Requires-Dist: langchain-vercel-sandbox>=0.0.1; extra == 'all-sandboxes'
96
96
  Provides-Extra: anthropic
97
- Requires-Dist: langchain-anthropic<2.0.0,>=1.7.2; extra == 'anthropic'
97
+ Requires-Dist: langchain-anthropic<2.0.0,>=1.7.3; extra == 'anthropic'
98
98
  Provides-Extra: baseten
99
99
  Requires-Dist: langchain-baseten<1.0.0,>=0.2.4; extra == 'baseten'
100
100
  Provides-Extra: bedrock
101
- Requires-Dist: langchain-aws<2.0.0,>=1.7.8; extra == 'bedrock'
101
+ Requires-Dist: langchain-aws<2.0.0,>=1.7.9; extra == 'bedrock'
102
102
  Provides-Extra: cohere
103
103
  Requires-Dist: langchain-cohere<1.0.0,>=0.6.0; extra == 'cohere'
104
104
  Provides-Extra: daytona
105
105
  Requires-Dist: langchain-daytona>=0.0.7; extra == 'daytona'
106
106
  Provides-Extra: deepseek
107
- Requires-Dist: langchain-deepseek<2.0.0,>=1.1.0; extra == 'deepseek'
107
+ Requires-Dist: langchain-deepseek<2.0.0,>=1.1.1; extra == 'deepseek'
108
108
  Provides-Extra: fireworks
109
- Requires-Dist: langchain-fireworks<2.0.0,>=1.6.1; extra == 'fireworks'
109
+ Requires-Dist: langchain-fireworks<2.0.0,>=1.6.2; extra == 'fireworks'
110
110
  Provides-Extra: google-genai
111
111
  Requires-Dist: langchain-google-genai<5.0.0,>=4.4.0; extra == 'google-genai'
112
112
  Provides-Extra: groq
@@ -132,9 +132,9 @@ Requires-Dist: langchain-nvidia-ai-endpoints<2.0.0,>=1.4.3; extra == 'nvidia'
132
132
  Provides-Extra: ollama
133
133
  Requires-Dist: langchain-ollama<2.0.0,>=1.1.0; extra == 'ollama'
134
134
  Provides-Extra: openai
135
- Requires-Dist: langchain-openai<2.0.0,>=1.6.2; extra == 'openai'
135
+ Requires-Dist: langchain-openai<2.0.0,>=1.6.4; extra == 'openai'
136
136
  Provides-Extra: openrouter
137
- Requires-Dist: langchain-openrouter<2.0.0,>=0.2.8; extra == 'openrouter'
137
+ Requires-Dist: langchain-openrouter<2.0.0,>=0.2.9; extra == 'openrouter'
138
138
  Provides-Extra: perplexity
139
139
  Requires-Dist: langchain-perplexity<2.0.0,>=1.4.1; extra == 'perplexity'
140
140
  Provides-Extra: quickjs
@@ -15,7 +15,7 @@
15
15
  - Interactive TUI (`app.py`, `tui/textual_adapter.py`, `tui/widgets/`)
16
16
  - Non-interactive pipeline runner (`client/non_interactive.py`)
17
17
  - Agent creation (`agent.py`)
18
- - Built-in tools (`tools.py`: `http_request`, `web_search`, `fetch_url`)
18
+ - Built-in tools (`tools.py`: `web_search`, `fetch_url`)
19
19
  - MCP config loader and per-server allow/deny lists (`mcp_tools.py`, `model_config.py`)
20
20
  - Hook runtimes (`hooks/`)
21
21
  - Sandbox integration factory (`integrations/sandbox_factory.py`, `integrations/sandbox_provider.py`)
@@ -63,7 +63,9 @@
63
63
 
64
64
  ## System Overview
65
65
 
66
- `deepagents-code` is a terminal-based AI coding assistant. It wraps the `deepagents` SDK in an interactive TUI (Textual) and a headless non-interactive mode. Both modes route agent execution through a local `langgraph dev` subprocess: the CLI spawns a server, passes configuration via `DA_SERVER_*` environment variables, and communicates via a `RemoteAgent` HTTP+SSE client. The agent receives user prompts, reasons with a configurable LLM, and executes side-effecting tools (file read/write, shell commands, web search, HTTP requests) subject to a human-in-the-loop (HITL) approval gate. Sessions are persisted in a local SQLite checkpoint database. Users can extend the agent with MCP servers (stdio processes or remote HTTP/SSE endpoints), hooks (event-driven subprocesses), custom subagents (AGENTS.md files in `.deepagents/agents/`), async remote subagents (LangGraph deployments configured in `config.toml`), and pluggable sandbox backends for remote code execution.
66
+ `deepagents-code` is a terminal-based AI coding assistant. It wraps the `deepagents` SDK in an interactive TUI (Textual) and a headless non-interactive mode. Both modes route agent execution through a local `langgraph dev` subprocess: the CLI spawns a server, passes configuration via `DA_SERVER_*` environment variables, and communicates via a `RemoteAgent` HTTP+SSE client. The agent receives user prompts, reasons with a configurable LLM, and executes side-effecting tools (file read/write, shell commands, web search, HTTP requests) subject to the selected approval mode and configured policies (not universally to human approval). Sessions are persisted in a local SQLite checkpoint database. Users can extend the agent with MCP servers (stdio processes or remote HTTP/SSE endpoints), hooks (event-driven subprocesses), custom subagents (AGENTS.md files in `.deepagents/agents/`), async remote subagents (LangGraph deployments configured in `config.toml`), and pluggable sandbox backends for remote code execution.
67
+
68
+ Non-interactive mode (`-n` or piped stdin) does not ask for human tool approvals. Non-shell tools, including file mutations and permitted network requests, run unattended by default. Shell execution is disabled unless a shell allow-list is configured; configured permission hooks remain effective (TB2). Disabling shell execution does not make a run read-only or confine local filesystem access to the project: the local backend uses `virtual_mode=False`, so absolute paths and relative paths escaping the project remain accessible subject to OS permissions. Untrusted repository content and tool output can influence an unattended agent. Human approval, automated permission hooks, shell policy, HTTP URL protections, and sandbox isolation are distinct controls, not substitutes for one another.
67
69
 
68
70
  ### Architecture Diagram
69
71
 
@@ -138,7 +140,7 @@
138
140
  | C1 | CLI Entry Point | Parses argv, loads config/env, bootstraps session | framework-controlled | Yes | `main.cli_main`, `main.parse_args` |
139
141
  | C2 | TUI / Non-interactive | Textual UI for interactive chat; `client/non_interactive.py` for headless pipelines (both use `RemoteAgent`) | framework-controlled | Yes | `app.DeepAgentsApp.run`, `client.non_interactive.run_non_interactive` |
140
142
  | C3 | Agent Engine | LangGraph agent graph running inside `langgraph dev` server, assembled by `create_cli_agent` | framework-controlled | Yes | `agent.create_cli_agent`, `agent._add_interrupt_on`, `server_graph.make_graph` |
141
- | C4 | Built-in Tools | `http_request`, `web_search` (Tavily), `fetch_url` (HTML→markdown) | framework-controlled | Partial¹ | `tools.http_request`, `tools.web_search`, `tools.fetch_url` |
143
+ | C4 | Built-in Tools | `web_search` (Tavily), `fetch_url` (HTML→markdown) | framework-controlled | Partial¹ | `tools.web_search`, `tools.fetch_url` |
142
144
  | C5 | MCP Loader & Trust | Discovers/loads `.mcp.json`, validates server configs, applies per-server allow/deny lists + interactive approval | framework-controlled | No² | `mcp_tools.resolve_and_load_mcp_tools`, `model_config.load_mcp_server_trust_lists`, `main._check_mcp_project_trust` |
143
145
  | C6 | Hook Runtime | Fires subprocess commands on agent lifecycle events | framework-controlled | No³ | `hooks.runtime.HooksRuntime`, `hooks.runner.run_command_handler` |
144
146
  | C7 | Sandbox Integration | Creates/destroys remote sandboxes (Daytona, LangSmith, Modal, Runloop, AgentCore) | framework-controlled | No⁴ | `integrations.sandbox_factory.create_sandbox` |
@@ -156,7 +158,7 @@
156
158
  | C19 | Goal/Rubric State Notice | Projects persisted goal objectives, active criteria, and status notes into synthetic messages for the primary model | framework-controlled | Yes | `goal_state_notice.build_goal_state_notice`, `goal_tools.GoalToolsMiddleware` |
157
159
 
158
160
  **Notes:**
159
- 1. `http_request` and `fetch_url` enabled by default; `web_search` requires `TAVILY_API_KEY`.
161
+ 1. `fetch_url` enabled by default; `web_search` requires `TAVILY_API_KEY`.
160
162
  2. MCP servers only load if `.mcp.json` config files are present.
161
163
  3. User hooks load from `~/.deepagents/hooks.json`. Project hooks load from `.deepagents/hooks.json` only after interactive workspace trust or the headless `--trust-project-hooks` opt-in.
162
164
  4. Sandbox mode requires explicit `--sandbox` CLI flag.
@@ -219,7 +221,7 @@
219
221
  | ID | Boundary | Description | Controls (Inside) | Does NOT Control (Outside) |
220
222
  |------|---------------------------------------|----------------------------------------------------------------------------|---------------------------------------------------------------------------------|---------------------------------------------------------------|
221
223
  | TB1 | User Input → Agent Engine | Where user-typed prompts enter the agent graph | Prompt routing, session threading, UI rendering | Prompt content — any text accepted |
222
- | TB2 | LLM Decision → Tool Execution | HITL gate on all side-effecting tool calls | Interrupt map, allow-list check, auto-approve toggle | LLM reasoning; what user approves |
224
+ | TB2 | LLM Decision → Tool Execution | Approval-mode-dependent gating of configured tools | Interrupt map, permission hooks, shell allow-list, approval mode | LLM reasoning; what user approves |
223
225
  | TB3 | Tool Result → LLM Context | Tool outputs re-enter the context window | Unicode warnings on URLs in args; markdownify HTML conversion | Content of fetched web pages, MCP responses, search results |
224
226
  | TB4 | MCP Config → Process / Network | `.mcp.json` triggers subprocess spawn or network connection | Schema validation; per-server allow/deny lists + interactive approval prompt | What the MCP process does once trusted and running |
225
227
  | TB5 | Hooks Config → Subprocess | `hooks.json` commands execute as local subprocesses | Workspace trust for project hooks, schema validation, bounded execution, sanitized environment | Command content (user-authored) |
@@ -243,10 +245,11 @@
243
245
 
244
246
  #### TB2: LLM Decision → Tool Execution Gate (HITL)
245
247
 
246
- - **Inside**: `agent._add_interrupt_on` registers interrupt configs for `execute`, `write_file`, `edit_file`, `web_search`, `fetch_url`, `task`, `compact_conversation`, `launch_async_subagent`, `update_async_subagent`, `cancel_async_subagent`. In non-interactive mode, `client.non_interactive._handle_action_request` enforces the shell allow-list via `config.is_shell_command_allowed`.
247
- - **Outside**: Once the user clicks "approve" (interactive) or a command passes the allow-list check (non-interactive), the tool executes with no further framework-level gating.
248
- - **Crossing mechanism**: LangGraph HITL interrupt routed through `RemoteAgent` SSE stream.
249
- - **Key note**: `auto_approve` mode bypasses all HITL approval prompts while still displaying Unicode/URL warnings.
248
+ - **Inside**: `agent._add_interrupt_on` configures gated tools, including shell execution, file mutations, web search, URL fetching, and delegation. Interactive Manual mode routes these calls through HITL; read-only tools do not all prompt. Auto uses automated review, while YOLO bypasses human approval.
249
+ - **Non-interactive**: Without configured `PermissionRequest` hooks, `run_non_interactive` selects auto-approval when shell is disabled or unrestricted (`all`); with a restrictive shell allow-list, `create_cli_agent` omits HITL middleware and installs `ShellAllowListMiddleware`. Non-shell tools run unattended in both cases.
250
+ - **Permission-hook exception**: Configured `PermissionRequest` handlers disable those middleware shortcuts so gated calls reach the client. `_process_hitl_interrupts` uses hook decisions first, including allow, deny, or interruption; unresolved calls fall back to `_make_hitl_decision`, which approves non-shell tools and checks shell commands against the allow-list (rejecting them when none is configured). A hook-provided decision takes precedence over that fallback. This is automated policy handling, not a human prompt.
251
+ - **Outside**: Approval does not validate model intent or isolate execution. Tool-specific URL checks, configured hooks, backend access rules, and OS/sandbox restrictions remain separate controls.
252
+ - **Crossing mechanism**: When installed and applicable to the approval mode, LangGraph HITL interrupts are routed through the `RemoteAgent` SSE stream. Non-interactive runs resolve them programmatically.
250
253
  - **Key note**: This boundary gates the *model-initiated* `compact_conversation` tool.
251
254
  - **Authorization**: The explicit `/offload` command does *not* cross it. C18 invokes the agent's shared compaction service directly, with no tool node and no synthetic message. The slash command is the authorization.
252
255
  - **Hook events**: The operation still dispatches `PreCompact` and `PreToolUse` against an in-memory forced call. Hooks may veto or interrupt. The TUI returns opaque hook replies over the operation protocol.
@@ -367,7 +370,7 @@
367
370
  | DF4 | C11 LangGraph Dev Server | C12 RemoteAgent | SSE stream (AI responses, tool calls, interrupts) | DC2 | TB10 | HTTP+SSE (localhost) |
368
371
  | DF5 | C3 Agent | External LLM | System prompt + message history | DC1, DC2 | TB7 | HTTPS / LangChain |
369
372
  | DF6 | External LLM | C3 Agent | AI response + tool call decisions | — | TB7 | HTTPS / LangChain |
370
- | DF7 | C3 Agent | C4 Tools | Tool call arguments (file/URL/command) | — | TB2 | Function call + HITL |
373
+ | DF7 | C3 Agent | C4 Tools | Tool call arguments (file/URL/command) | — | TB2 | Function call + mode-dependent approval |
371
374
  | DF8 | External | C4 Tools | HTTP response bodies (web/API content) | — | TB3 | HTTPS |
372
375
  | DF9 | C4 Tools | C3 Agent | Tool results (file content, web pages) | — | TB3 | ToolMessage |
373
376
  | DF10 | C9 Config | C1 Entry | TOML config, env vars, API keys | DC1 | None | File + environ |
@@ -398,7 +401,7 @@
398
401
 
399
402
  - **Data**: Arbitrary HTML/JSON from the internet, converted to markdown by `markdownify`. Can be megabytes.
400
403
  - **Validation**: URL domain checked for Unicode spoofing / script mixing (`unicode_security.check_url_safety`); displayed as warning in approval dialog. Content not scanned for prompt-injection patterns.
401
- - **Trust assumption**: User approved the fetch. Content is data — but the LLM may interpret adversarial content as instructions.
404
+ - **Trust assumption**: A permitted fetch is not necessarily human-approved; non-interactive runs fetch unattended by default. `fetch_url` enforces the URL protections in D3 independently of approval mode. Content is data — but the LLM may interpret adversarial content as instructions.
402
405
 
403
406
  #### DF11: MCP Tool Results → Agent Context
404
407
 
@@ -445,7 +448,7 @@
445
448
  | T1 | DF8, DF9 | — | Prompt injection via fetched web content causes LLM to request harmful actions | TB3 | Medium | Likely | `tools.fetch_url`, `agent._add_interrupt_on` |
446
449
  | T2 | DF7 | — | `--shell-allow-list all` removes pattern checks; LLM-injected shell commands execute without approval in non-interactive mode | TB2 | Medium | Verified | `config.is_shell_command_allowed`, `client.non_interactive._handle_action_request` |
447
450
  | T3 | DF7 | — | Unicode-homoglyph URL in LLM-generated tool args deceives user during approval | TB2 | Low | Disproven | `unicode_security.check_url_safety`, `agent._format_fetch_url_description` |
448
- | T4 | DF5, DF9 | — | Auto-approve mode bypasses all HITL gates; any LLM-initiated tool call executes | TB2 | Low | Verified | `agent.create_cli_agent` (`auto_approve` param), `agent._add_interrupt_on` |
451
+ | T4 | DF5, DF9 | — | YOLO and non-interactive operation omit human tool approval; other controls still apply | TB2 | Low | Verified | `agent.create_cli_agent` (`auto_approve` param), `agent._add_interrupt_on` |
449
452
  | T5 | DF13, DF14| DC2 | Local SQLite checkpoint file tampered with to inject adversarial content into future LLM context | None | Low | Unverified | `sessions.get_db_path` |
450
453
  | T6 | DF3, DF4, DF26 | DC2 | Unauthenticated LangGraph dev server on localhost can be accessed by any local process | TB10 | Medium | Verified | `server._build_server_env`, `server._DEFAULT_HOST`, `offload_api.app` |
451
454
  | T7 | DF19, DF20| DC3 | Makefile or project file content injected into system prompt via LocalContextMiddleware | TB9 | Low | Verified | `local_context._section_makefile`, `local_context.LocalContextMiddleware._get_modified_request` |
@@ -465,12 +468,12 @@
465
468
 
466
469
  - **Flow**: DF8 (external web) → DF9 (tool result) → C3 Agent context
467
470
  - **Description**: When the agent calls `fetch_url` or `web_search`, the response body enters the LLM's context window as a `ToolMessage`. A maliciously crafted web page or search snippet can embed natural-language instructions that the LLM may interpret as authoritative commands, leading to unexpected tool call requests in the next turn.
468
- - **Preconditions**: (1) User or LLM-initiated call to `fetch_url`/`web_search` reaches a malicious page; (2) LLM interprets injected instructions as directives; (3) In interactive mode, user must still approve the resulting tool call.
471
+ - **Preconditions**: (1) User or LLM-initiated call to `fetch_url`/`web_search` reaches a malicious page; (2) LLM interprets injected instructions as directives; (3) In interactive Manual mode, gated calls still require approval unless resolved by a configured permission hook; non-interactive calls are resolved without human review.
469
472
 
470
473
  #### T15: Stored Prompt Injection Through Goal/Rubric State
471
474
 
472
475
  - **Flow**: DF28/DF29 (user or local-file content → checkpointed notice → primary-model context)
473
- - **Description**: The goal-state notice embeds the full actionable objective, active criteria, and status note in a synthetic `HumanMessage`. A rubric loaded from an untrusted repository file, or a crafted status note, can therefore persist instructions that influence later model behavior. Bounded superseded notices remain in the append-only request history until compaction; the latest notice identifies itself as authoritative, but a model can still attend to older text. Oversized legacy notices are replaced only in the transient model request. HTML escaping and boundary labels prevent literal tag forgery. They do not stop natural-language prompt injection. Interactive HITL still gates side-effecting tool calls. Auto and non-interactive configurations can reduce that protection.
476
+ - **Description**: The goal-state notice embeds the full actionable objective, active criteria, and status note in a synthetic `HumanMessage`. A rubric loaded from an untrusted repository file, or a crafted status note, can therefore persist instructions that influence later model behavior. Bounded superseded notices remain in the append-only request history until compaction; the latest notice identifies itself as authoritative, but a model can still attend to older text. Oversized legacy notices are replaced only in the transient model request. HTML escaping and boundary labels prevent literal tag forgery. They do not stop natural-language prompt injection. Interactive Manual mode gates configured tools; Auto, YOLO, and non-interactive operation have different approval semantics (TB2).
474
477
  - **Preconditions**: (1) The user accepts a goal/rubric or loads a file containing attacker-controlled instructions; (2) the state is actionable or the rubric remains active; (3) the primary model follows the injected content; (4) for side effects, the resulting tool call is approved or an approval-bypassing mode is active.
475
478
 
476
479
  #### T16: Automatic Disclosure of File-Loaded Rubrics
@@ -497,11 +500,11 @@
497
500
  - **Description**: An LLM influenced by adversarial input could generate a `fetch_url` call with a URL containing mixed-script or confusable characters visually identical to ASCII.
498
501
  - **Preconditions**: LLM generates a confusable URL (requires adversarial steering). `check_url_safety` detects mixed-script domain labels and `strip_dangerous_unicode` removes invisible BiDi/zero-width characters; warnings displayed in approval dialog. Classified Disproven as a project vulnerability — the UI warnings are the intended control.
499
502
 
500
- #### T4: Auto-Approve Removes All Execution Safeguards
503
+ #### T4: Unattended Tool Execution Without Human Approval
501
504
 
502
- - **Flow**: DF7 (all tool calls) when `auto_approve=True`
503
- - **Description**: When auto-approve is enabled (via `--auto-approve` flag or `Shift+Tab` in TUI), all tool calls including `execute`, `write_file`, `edit_file`, `fetch_url`, `launch_async_subagent` execute without user confirmation.
504
- - **Preconditions**: User explicitly enables auto-approve. Default is approval-required.
505
+ - **Flow**: DF7 (tool calls), influenced by DF5/DF9 (model context and tool results).
506
+ - **Description**: YOLO bypasses human tool approval. Non-interactive mode also runs non-shell tools, including file mutations and permitted network requests, unattended by default, without requiring a separate auto-approve flag. Shell execution is disabled unless configured through the shell allow-list; `all` removes command-pattern restrictions. Configured permission hooks retain the decision precedence described in TB2. URL protections and OS/sandbox access restrictions still apply: omitting human approval does not remove every security check.
507
+ - **Preconditions**: The user selects YOLO or invokes non-interactive operation (`-n` or piped stdin). Untrusted repository content or tool output can then influence actions without human review. Interactive Manual approval is not a universal default for all modes or every tool. Shell-disabled local runs are neither read-only nor project-confined; use appropriate filesystem permissions and isolation for unattended work.
505
508
 
506
509
  #### T5: Local SQLite Checkpoint Tampering
507
510
 
@@ -600,8 +603,8 @@ Threats that appear valid in isolation but fall outside project responsibility b
600
603
 
601
604
  | Pattern | Why Out of Scope | Project Responsibility Ends At |
602
605
  |-------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------|
603
- | Prompt injection leading to arbitrary code execution (interactive mode) | In interactive mode, every side-effecting tool call requires explicit user approval via the HITL dialog. The user is the final gatekeeper. | Providing HITL for all side-effecting tools (`agent._add_interrupt_on`) and Unicode/URL warnings in the approval dialog. |
604
- | API key exfiltration via LLM-directed `http_request` | `http_request` requires HITL in interactive mode. Keys it could exfiltrate are user-supplied env vars. In non-interactive mode, user has opted into autonomous operation. | Providing HITL gate for HTTP tools. Users control which env vars are in scope. |
606
+ | Prompt injection leading to arbitrary code execution (interactive mode) | In interactive Manual mode, configured gated calls require approval unless resolved by permission hooks. This rationale does not apply to unattended modes or ungated tools. | Providing mode-dependent HITL for configured tools (`agent._add_interrupt_on`) and Unicode/URL warnings in the approval dialog. |
607
+ | Data exfiltration via LLM-directed network requests | Permitted public URLs can carry sensitive data even with SSRF protections. Non-interactive requests run unattended by default; interactive Manual mode gates `fetch_url`. | Enforcing `fetch_url` URL protections and the configured approval policy, not guaranteeing content confidentiality. |
605
608
  | Malicious MCP server injecting prompt instructions | Users configure MCP servers and explicitly trust project-level configs. Once trusted, MCP tool outputs are data from a system the user controls. | Interactive approval prompt + per-server allow/deny lists for project-level configs (`main._check_mcp_project_trust`, `model_config.load_mcp_server_trust_lists`). |
606
609
  | LLM jailbreak / safety bypass | Model selection and safety configuration are user-controlled. The project routes prompts to the configured LLM but cannot guarantee model behavior. | Correctly routing prompts to the configured LLM; applying the system prompt from `agent.get_system_prompt`. |
607
610
  | Sandbox provider security vulnerabilities | Daytona, LangSmith, Modal, Runloop, and AgentCore are third-party services. Their internal security is not this project's responsibility. | Correctly initializing sandbox sessions via `integrations.sandbox_factory.create_sandbox`. |
@@ -612,11 +615,11 @@ Threats that appear valid in isolation but fall outside project responsibility b
612
615
 
613
616
  ### Rationale
614
617
 
615
- **Prompt injection in interactive mode**: The HITL interrupt means every file write, shell command, web search, URL fetch, task delegation, and async subagent action shows the user a confirmation dialog with full tool arguments. Even a successful prompt injection can only execute what the user explicitly approves. The project's responsibility is to make that dialog accurate — hence the Unicode/URL warning layer in `unicode_security.py`.
618
+ **Prompt injection in interactive Manual mode**: Configured gated tools show a confirmation dialog unless a permission hook resolves the request. This does not cover every tool or apply to Auto, YOLO, or non-interactive operation (TB2/T4). Approval UI warnings help users inspect arguments; they do not prevent prompt injection in repository content or tool results.
616
619
 
617
620
  **LangGraph dev server without auth**: The `LANGGRAPH_AUTH_TYPE=noop` setting is intentional for local dev server use. Adding authentication would require users to manage tokens for a locally-spawned ephemeral process, creating more friction than security benefit in this context. The 127.0.0.1 binding limits exposure to the local machine. T6 documents this as an accepted risk for the threat model.
618
621
 
619
- **Custom subagent system prompts**: Subagent definitions in `.deepagents/agents/` are user-authored files. The framework correctly treats them as user-controlled content. The HITL gate on `task` tool calls ensures the user approves subagent delegation before it occurs.
622
+ **Custom subagent system prompts**: Subagent definitions in `.deepagents/agents/` are user-authored files. The framework correctly treats them as user-controlled content. In interactive Manual mode, `task` is gated unless resolved by permission hooks; unattended modes do not promise human approval of delegation.
620
623
 
621
624
  **`class_path` code execution**: This follows the same trust model as `pyproject.toml` build scripts — the user edits their own config file on their own machine. The `issubclass(BaseChatModel)` check provides a post-import guard, though module-level side effects execute before it. Documented as intentional in `model_config.py`.
622
625
 
@@ -637,7 +640,7 @@ Threats that appear valid in isolation but fall outside project responsibility b
637
640
  |----|----------------|---------------|----------|------------|
638
641
  | D1 | Unsafe msgpack deserialization in langgraph checkpoint loading | Verified fix status — confirmed fixed and closed upstream. | Users on current `langgraph` versions are not exposed. | Upstream langgraph has patched the unsafe msgpack deserialization. No longer an active risk. |
639
642
  | D2 | Unicode URL homoglyph as project vulnerability | Traced `check_url_safety` + `strip_dangerous_unicode` + `format_warning_detail` → approval dialog display | `unicode_security.check_url_safety`, `agent._format_fetch_url_description` | Warning system is the intended control — the project correctly surfaces the risk to the user in the approval dialog. Not a project vulnerability; classified as mitigated by design (UI warning). |
640
- | D3 | SSRF via `http_request` / `fetch_url` to internal services | Traced `tools.http_request` and `tools.fetch_url` — no URL scheme or host blocklist. However, both tools require HITL approval in interactive mode. In non-interactive mode, only shell commands are auto-approved via the allow-list; HTTP tools still go through the HITL interrupt gate. | `tools.http_request`, `tools.fetch_url`, `agent._add_interrupt_on` | Not a project vulnerability in isolation — the HITL gate is the intended control for all HTTP tool calls. The user sees the full URL before approving. SSRF is only reachable if the user approves the request (interactive) or enables auto-approve (explicit opt-in). Classified as out-of-scope for the same reason as prompt injection in interactive mode. |
643
+ | D3 | SSRF via built-in URL fetching to internal services | Current `tools.py` exposes `fetch_url`, not `http_request`. `fetch_url` permits only HTTP/HTTPS and rejects hosts resolving to private, loopback, link-local, reserved, multicast, unspecified, or other non-global IPs. Each redirect is revalidated (maximum five); connections are pinned to validated IPs and environment proxies are disabled. | `tools._validate_url`, `tools._is_blocked_ip`, `tools._fetch_with_redirects`, `tools._pinned_dns` | These URL/connection protections apply independently of human approval. Non-interactive fetches run unattended by default, subject to configured hooks. The protections do not prevent disclosure to permitted public destinations or constrain network access through other tools or MCP servers. |
641
644
  | D4 | Offload path injection via archive filename | Checked `SummarizationMiddleware._get_session_id`/`_get_history_path` — the leaf is `session_` plus a `uuid4().hex`. | `SummarizationMiddleware._get_session_id`, `SummarizationMiddleware._get_history_path` | The archive filename is minted by the framework from a UUID4 hex, so no user-controlled path component reaches the file path. Not exploitable. |
642
645
 
643
646
  ---
@@ -668,3 +671,4 @@ Threats that appear valid in isolation but fall outside project responsibility b
668
671
  | 2026-08-24 | langster-threat-model (diff) | Removed the client-seeded `/offload` fallback. `/offload` is now available only through C18 on built-in servers; local in-process and ACP agents do not support it, and custom or older servers without the route fail at the HTTP boundary. Updated DC5, TB2, TB10, and T6 to remove the client self-approval and synthetic-message attack surface. The server route, hook behavior, archive guard, and state-only persistence controls are unchanged; no new threat was identified. |
669
672
  | 2026-08-24 | manual update | The C18 boundary now strips endpoint/proxy/transport keys (`base_url`, `openai_proxy`, `http_client`, and similar) from client-supplied `model_params` before they reach `config.create_model` (`offload_api._strip_transport_model_params`), closing the credential-redirection consequence of T6 for this route. Client-supplied `model` and behavioral params still flow through; in-process `CLIContextSchema` model params remain trusted and unfiltered |
670
673
  | 2026-08-25 | manual update | Stopped replacing bounded superseded goal-state notices in model requests while retaining bounded same-index stand-ins for oversized legacy notices. Goal/rubric history now remains append-only for prompt-cache stability where safe, and the latest notice explicitly supersedes earlier notices. Updated T15 to record the residual risk that a model can still attend to older bounded goal text until compaction. |
674
+ | 2026-09-22 | manual update | Corrected TB2, T4, D3, and related approval claims to describe existing non-interactive behavior, permission-hook exceptions, local filesystem access, and `fetch_url` URL/connection protections. Runtime behavior is unchanged. |
@@ -1,3 +1,3 @@
1
1
  """Generated at build time. Do not edit or commit."""
2
2
 
3
- BUILD_COMMIT = "a764619"
3
+ BUILD_COMMIT = "e109d04"
@@ -363,13 +363,16 @@ def _refresh_args(uv_path: str) -> list[str]:
363
363
  root would execute instead of the legitimate binary.
364
364
 
365
365
  Returns:
366
- Arguments for the user-approved `uv pip install` process.
366
+ Arguments for the user-approved `uv pip install` process, with uv's
367
+ configuration discovery anchored to the editable checkout.
367
368
  """
368
369
  checkout = _checkout_root()
369
370
  args = [
370
371
  uv_path,
371
372
  "pip",
372
373
  "install",
374
+ "--directory",
375
+ str(checkout),
373
376
  "--python",
374
377
  sys.executable,
375
378
  "-e",
@@ -861,7 +861,12 @@ def _installation_paths() -> InstallationPaths:
861
861
  """
862
862
  root = _normalize_absolute(Path(sys.prefix), what="sys.prefix")
863
863
  resources = root / "share" / "deepagents-code"
864
- locks = root.parent / f".{root.name}.deepagents-code-locks"
864
+ # uv enumerates every directory beside the tool environment as a package.
865
+ # Keep persistent locks beside that container instead, outside the environment
866
+ # uv replaces on upgrade. Mirror this in install.sh's acquire_install_lock.
867
+ locks = (
868
+ root.parent.parent / f".{root.parent.name}.{root.name}.deepagents-code-locks"
869
+ )
865
870
  return InstallationPaths(
866
871
  root=root,
867
872
  managed_bin_dir=resources / "bin",
@@ -79,6 +79,62 @@ execute one directory's configuration against another directory's trust
79
79
  decision.
80
80
  """
81
81
 
82
+ MODEL_COMPATIBLE_FIELDS = frozenset(
83
+ {
84
+ "auto_classifier_model",
85
+ "cli_max_retries",
86
+ "model",
87
+ "rubric_model",
88
+ "summarization_model",
89
+ }
90
+ )
91
+ """Cosmetic model settings that do not affect durable access-policy compat.
92
+
93
+ Changing which model serves a bound thread — or the retry budget or auxiliary
94
+ grader/classifier models — does not change what the thread is *allowed* to do
95
+ (trust, tool, sandbox, and approval policy are unchanged). These fields are
96
+ therefore excluded from the policy fingerprint, so a model switch does not
97
+ invalidate a durable binding. They remain part of the runtime fingerprint so
98
+ the runtime rebuilds. `None` and an empty/unset value are normalized as
99
+ equivalent here.
100
+ """
101
+
102
+ RUNTIME_ONLY_FIELDS = frozenset(
103
+ {
104
+ "assistant_id",
105
+ "model_params",
106
+ "profile_overrides",
107
+ "recursion_limit",
108
+ "rubric_max_iterations",
109
+ "system_prompt",
110
+ }
111
+ )
112
+ """Runtime-identity fields that are not durable access policy.
113
+
114
+ These shape *how* the runtime executes (model kwargs, prompt, step budget,
115
+ graph id) but are not the trust/tool/sandbox/approval policy a binding guards.
116
+ They are fingerprinted into the runtime identity (so changing them rebuilds the
117
+ runtime) yet never persisted or reported — `model_params`, `profile_overrides`,
118
+ and `system_prompt` can carry secrets and prompt material.
119
+ """
120
+
121
+ WORKSPACE_IDENTITY_FIELDS = frozenset({"cwd", "project_root"})
122
+ """Fields that name *which* workspace a binding is for.
123
+
124
+ Workspace identity is part of durable access-policy compatibility: a binding
125
+ is meaningless if it can be replayed against a different directory. These are
126
+ compared exactly (canonical paths) and are never normalized away.
127
+ """
128
+
129
+
130
+ def _classified_fields() -> frozenset[str]:
131
+ """Return every field the policy/runtime split accounts for.
132
+
133
+ Returns:
134
+ The union of all classification sets plus workspace identity.
135
+ """
136
+ return MODEL_COMPATIBLE_FIELDS | RUNTIME_ONLY_FIELDS | WORKSPACE_IDENTITY_FIELDS
137
+
82
138
 
83
139
  def _same_workspace_project(first: str | None, second: str) -> bool:
84
140
  """Whether two paths name the same project directory.
@@ -636,8 +692,34 @@ class ServerConfig:
636
692
  return replace(self, trust_project_extensions=False)
637
693
  return self
638
694
 
639
- def workspace_fingerprint(self) -> str:
640
- """Fingerprint the resolved runtime config except workspace identity.
695
+ def policy_fingerprint(self) -> str:
696
+ """Fingerprint durable access policy plus workspace identity.
697
+
698
+ Covers the trust/tool/sandbox/approval payload (the
699
+ `to_workspace_payload()` keys) and the workspace's `cwd`/`project_root`.
700
+ Cosmetic model settings (`MODEL_COMPATIBLE_FIELDS`) are excluded so a
701
+ model switch does not invalidate a durable binding; runtime-only fields
702
+ (`RUNTIME_ONLY_FIELDS`) are excluded because they are not persisted.
703
+
704
+ Returns:
705
+ The canonical SHA-256 fingerprint.
706
+ """
707
+ from deepagents_code.workspace import canonical_fingerprint
708
+
709
+ return canonical_fingerprint(
710
+ {
711
+ "cwd": self.cwd,
712
+ "policy": self.to_workspace_payload(),
713
+ "project_root": self.project_root,
714
+ }
715
+ )
716
+
717
+ def runtime_fingerprint(self) -> str:
718
+ """Fingerprint the full runtime identity, including model settings.
719
+
720
+ Any change to model, model params, prompt, policy, or runtime fields
721
+ yields a different value, so the runtime cache can rebuild on any of
722
+ them while the binding only guards the policy fingerprint.
641
723
 
642
724
  Returns:
643
725
  The canonical SHA-256 fingerprint.
@@ -649,6 +731,16 @@ class ServerConfig:
649
731
 
650
732
  return canonical_fingerprint(values)
651
733
 
734
+ def workspace_fingerprint(self) -> str:
735
+ """Fingerprint the resolved runtime config except workspace identity.
736
+
737
+ Retained for compatibility; equivalent to `runtime_fingerprint()`.
738
+
739
+ Returns:
740
+ The canonical SHA-256 fingerprint.
741
+ """
742
+ return self.runtime_fingerprint()
743
+
652
744
  def __post_init__(self) -> None:
653
745
  """Normalize fields and validate invariants.
654
746
 
@@ -1015,3 +1107,38 @@ def _normalize_path(
1015
1107
  "Ensure the path exists and is accessible."
1016
1108
  )
1017
1109
  raise ValueError(msg) from exc
1110
+
1111
+
1112
+ def classified_config_fields() -> dict[str, str]:
1113
+ """Classify every `ServerConfig` field for the policy/runtime split.
1114
+
1115
+ Every dataclass field must land in exactly one bucket so the fingerprint
1116
+ split cannot silently drop a setting. A field missing from a bucket is a
1117
+ programming error and fails closed (raises) rather than being treated as
1118
+ either policy or runtime by default.
1119
+
1120
+ Returns:
1121
+ A mapping of field name to one of `"model"`, `"runtime"`,
1122
+ `"identity"`, or `"policy"`.
1123
+
1124
+ Raises:
1125
+ RuntimeError: If a `ServerConfig` field is not classified.
1126
+ """
1127
+ import dataclasses
1128
+
1129
+ policy_fields = set(ServerConfig().to_workspace_payload())
1130
+ classification: dict[str, str] = {}
1131
+ for field_info in dataclasses.fields(ServerConfig):
1132
+ name = field_info.name
1133
+ if name in MODEL_COMPATIBLE_FIELDS:
1134
+ classification[name] = "model"
1135
+ elif name in RUNTIME_ONLY_FIELDS:
1136
+ classification[name] = "runtime"
1137
+ elif name in WORKSPACE_IDENTITY_FIELDS:
1138
+ classification[name] = "identity"
1139
+ elif name in policy_fields:
1140
+ classification[name] = "policy"
1141
+ else:
1142
+ msg = f"ServerConfig field {name!r} is not classified"
1143
+ raise RuntimeError(msg)
1144
+ return classification