deepagents-code 0.1.63__tar.gz → 0.1.64__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 (538) hide show
  1. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/AGENTS.md +2 -2
  2. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/ARCHITECTURE.md +3 -0
  3. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/CHANGELOG.md +22 -0
  4. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/COMMANDS.md +2 -1
  5. deepagents_code-0.1.64/EXTENSIONS.md +148 -0
  6. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/PKG-INFO +16 -16
  7. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/THREAT_MODEL.md +4 -1
  8. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/_build_info.py +1 -1
  9. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/_env_vars.py +9 -4
  10. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/_paths.py +161 -0
  11. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/_reserved_names.py +1 -1
  12. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/_server_config.py +57 -17
  13. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/_version.py +1 -1
  14. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/agent.py +180 -63
  15. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/app.py +205 -92
  16. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/auto_mode.py +19 -0
  17. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/client/commands/config.py +32 -13
  18. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/client/commands/mcp.py +167 -35
  19. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/client/launch/server_manager.py +16 -4
  20. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/client/non_interactive.py +54 -23
  21. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/client/remote_client.py +10 -0
  22. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/command_registry.py +17 -1
  23. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/config.py +435 -569
  24. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/config_manifest.py +305 -94
  25. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/configurable_model.py +6 -6
  26. deepagents_code-0.1.64/deepagents_code/configuration/interpreter.py +90 -0
  27. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/configuration/provider.py +18 -14
  28. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/configuration/providers.py +122 -60
  29. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/configuration/resolver.py +14 -15
  30. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/cost_tracking.py +3 -3
  31. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/doctor.py +12 -2
  32. deepagents_code-0.1.64/deepagents_code/extensions/__init__.py +6 -0
  33. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/extensions/discovery.py +2 -3
  34. deepagents_code-0.1.64/deepagents_code/extensions/hosting.py +170 -0
  35. deepagents_code-0.1.64/deepagents_code/extensions/loader.py +110 -0
  36. deepagents_code-0.1.64/deepagents_code/extensions/runtime.py +182 -0
  37. deepagents_code-0.1.64/deepagents_code/extensions/settings.py +115 -0
  38. deepagents_code-0.1.64/deepagents_code/extensions/trust.py +59 -0
  39. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/file_ops.py +2 -2
  40. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/main.py +200 -40
  41. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/mcp_auth.py +29 -6
  42. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/mcp_login_service.py +3 -3
  43. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/model_config.py +25 -17
  44. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/offload_api.py +26 -1
  45. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/onboarding.py +2 -2
  46. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/server_graph.py +62 -17
  47. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/sessions.py +7 -7
  48. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/skills/commands.py +35 -26
  49. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/skills/invocation.py +55 -18
  50. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/tool_catalog.py +2 -2
  51. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/tools.py +3 -3
  52. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/tui/modals/model_switch.py +1 -1
  53. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/tui/textual_adapter.py +44 -21
  54. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/tui/widgets/ask_user.py +7 -7
  55. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/tui/widgets/goal_review.py +2 -2
  56. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/tui/widgets/model_selector.py +50 -7
  57. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/tui/widgets/startup_tip.py +2 -2
  58. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/tui/widgets/status.py +4 -4
  59. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/tui/widgets/subagent_panel.py +2 -2
  60. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/tui/widgets/welcome.py +8 -8
  61. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/ui.py +15 -3
  62. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/update_check.py +27 -14
  63. deepagents_code-0.1.64/examples/extensions/memory_store.py +17 -0
  64. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/pyproject.toml +11 -11
  65. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/integration_tests/test_auto_approve_remote.py +1 -1
  66. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/integration_tests/test_compact_resume.py +1 -1
  67. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/integration_tests/test_offload_server_side.py +6 -6
  68. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/client/commands/test_mcp.py +298 -0
  69. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/conftest.py +7 -7
  70. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/skills/test_commands.py +113 -22
  71. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/skills/test_load.py +4 -4
  72. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/skills/test_skills_json.py +77 -24
  73. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/smoke_tests/test_system_prompt.py +43 -23
  74. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_agent.py +586 -288
  75. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_agent_friendly.py +13 -5
  76. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_app.py +267 -191
  77. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_args.py +26 -0
  78. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_auth_web_search_restart.py +33 -33
  79. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_auto_mode.py +75 -0
  80. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_config.py +369 -189
  81. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_config_manifest.py +128 -50
  82. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_configurable_model.py +3 -3
  83. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_configuration.py +25 -14
  84. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_configuration_resolution.py +4 -4
  85. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_configuration_resolver.py +94 -12
  86. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_debug_console.py +32 -3
  87. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_doctor.py +19 -2
  88. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_end_to_end.py +7 -5
  89. deepagents_code-0.1.64/tests/unit_tests/test_extension_cli_trust.py +89 -0
  90. deepagents_code-0.1.64/tests/unit_tests/test_extension_config_manifest.py +74 -0
  91. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_extension_discovery.py +28 -2
  92. deepagents_code-0.1.64/tests/unit_tests/test_extension_display.py +58 -0
  93. deepagents_code-0.1.64/tests/unit_tests/test_extension_host_runtime.py +117 -0
  94. deepagents_code-0.1.64/tests/unit_tests/test_extension_hosting.py +184 -0
  95. deepagents_code-0.1.64/tests/unit_tests/test_extension_runtime.py +281 -0
  96. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_install_command.py +8 -4
  97. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_main.py +4 -4
  98. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_main_acp_mode.py +25 -13
  99. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_main_args.py +34 -49
  100. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_mcp_oauth_ui.py +36 -3
  101. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_model_config.py +73 -17
  102. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_model_switch.py +104 -104
  103. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_non_interactive.py +211 -139
  104. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_onboarding.py +5 -4
  105. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_paths.py +257 -0
  106. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_reasoning_effort.py +57 -57
  107. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_reload.py +219 -135
  108. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_remote_client.py +34 -0
  109. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_server_config.py +34 -16
  110. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_server_graph.py +24 -19
  111. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_sessions.py +35 -0
  112. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_skill_invocation.py +56 -27
  113. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_threads_resume.py +14 -2
  114. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_tool_catalog.py +3 -3
  115. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_update_check.py +76 -0
  116. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/tui/modals/test_model_switch.py +1 -0
  117. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/tui/test_textual_adapter.py +119 -19
  118. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/tui/widgets/test_ask_user.py +23 -23
  119. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/tui/widgets/test_auth_widgets.py +4 -4
  120. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/tui/widgets/test_goal_review.py +4 -4
  121. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/tui/widgets/test_model_selector.py +56 -0
  122. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/tui/widgets/test_startup_tip.py +1 -1
  123. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/tui/widgets/test_status.py +1 -1
  124. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/tui/widgets/test_subagent_panel.py +1 -1
  125. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/tui/widgets/test_thread_selector.py +14 -14
  126. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/tui/widgets/test_welcome.py +27 -45
  127. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/uv.lock +44 -44
  128. deepagents_code-0.1.63/deepagents_code/extensions/__init__.py +0 -5
  129. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/.gitignore +0 -0
  130. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/DEVELOPMENT.md +0 -0
  131. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/HOOKS.md +0 -0
  132. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/LICENSE +0 -0
  133. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/Makefile +0 -0
  134. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/PRICING.md +0 -0
  135. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/README.md +0 -0
  136. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/__init__.py +0 -0
  137. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/__main__.py +0 -0
  138. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/_ask_user_types.py +0 -0
  139. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/_cli_context.py +0 -0
  140. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/_constants.py +0 -0
  141. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/_debug.py +0 -0
  142. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/_debug_buffer.py +0 -0
  143. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/_dep_floor_check.py +0 -0
  144. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/_fake_models.py +0 -0
  145. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/_git.py +0 -0
  146. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/_glm_5p2_profile.py +0 -0
  147. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/_home_error.py +0 -0
  148. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/_invocation.py +0 -0
  149. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/_markdown.py +0 -0
  150. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/_repository_bounds.py +0 -0
  151. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/_session_stats.py +0 -0
  152. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/_startup_error.py +0 -0
  153. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/_terminal_stderr.py +0 -0
  154. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/_testing_models.py +0 -0
  155. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/_textual_patches.py +0 -0
  156. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/_tool_stream.py +0 -0
  157. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/_tracing.py +0 -0
  158. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/acp.py +0 -0
  159. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/app.tcss +0 -0
  160. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/approval_mode.py +0 -0
  161. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/ask_user.py +0 -0
  162. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/auth_display.py +0 -0
  163. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/auth_store.py +0 -0
  164. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/built_in_skills/__init__.py +0 -0
  165. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/built_in_skills/deepagents-thread-inspector/SKILL.md +0 -0
  166. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/built_in_skills/deepagents-thread-inspector/scripts/inspect_sessions.py +0 -0
  167. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/built_in_skills/remember/SKILL.md +0 -0
  168. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/built_in_skills/skill-creator/SKILL.md +0 -0
  169. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/built_in_skills/skill-creator/scripts/init_skill.py +0 -0
  170. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/built_in_skills/skill-creator/scripts/quick_validate.py +0 -0
  171. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/bundled_prices.README.md +0 -0
  172. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/bundled_prices.json +0 -0
  173. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/client/__init__.py +0 -0
  174. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/client/commands/__init__.py +0 -0
  175. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/client/commands/auth.py +0 -0
  176. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/client/commands/extras.py +0 -0
  177. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/client/commands/tools.py +0 -0
  178. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/client/launch/__init__.py +0 -0
  179. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/client/launch/server.py +0 -0
  180. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/clipboard.py +0 -0
  181. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/cold_cache.py +0 -0
  182. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/configuration/__init__.py +0 -0
  183. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/configuration/paths.py +0 -0
  184. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/configuration/service.py +0 -0
  185. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/configuration/theme_resolution.py +0 -0
  186. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/configuration/types.py +0 -0
  187. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/configuration/writer.py +0 -0
  188. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/context_doctor.py +0 -0
  189. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/default_agent_prompt.md +0 -0
  190. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/diff_utils.py +0 -0
  191. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/editor.py +0 -0
  192. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/event_bus.py +0 -0
  193. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/extensions/api.py +0 -0
  194. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/extensions/registry.py +0 -0
  195. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/extras_info.py +0 -0
  196. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/formatting.py +0 -0
  197. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/goal_rubric.py +0 -0
  198. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/goal_state_limits.py +0 -0
  199. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/goal_state_notice.py +0 -0
  200. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/goal_tools.py +0 -0
  201. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/hooks/__init__.py +0 -0
  202. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/hooks/capabilities.py +0 -0
  203. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/hooks/client.py +0 -0
  204. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/hooks/client_lifecycle.py +0 -0
  205. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/hooks/context.py +0 -0
  206. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/hooks/engine.py +0 -0
  207. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/hooks/env.py +0 -0
  208. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/hooks/envelope.py +0 -0
  209. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/hooks/interrupt.py +0 -0
  210. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/hooks/legacy.py +0 -0
  211. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/hooks/loading.py +0 -0
  212. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/hooks/manager.py +0 -0
  213. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/hooks/migration.py +0 -0
  214. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/hooks/models/__init__.py +0 -0
  215. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/hooks/models/adapters.py +0 -0
  216. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/hooks/models/config.py +0 -0
  217. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/hooks/models/domain.py +0 -0
  218. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/hooks/models/transport.py +0 -0
  219. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/hooks/models/wire.py +0 -0
  220. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/hooks/permissions.py +0 -0
  221. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/hooks/presenter.py +0 -0
  222. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/hooks/projection.py +0 -0
  223. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/hooks/reducer.py +0 -0
  224. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/hooks/runner.py +0 -0
  225. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/hooks/runtime.py +0 -0
  226. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/hooks/server_middleware.py +0 -0
  227. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/hooks/snapshot.py +0 -0
  228. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/hooks/tools.py +0 -0
  229. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/hooks/transcript.py +0 -0
  230. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/hooks/trust.py +0 -0
  231. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/hooks/validate_terminal_sequence.py +0 -0
  232. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/input.py +0 -0
  233. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/integrations/__init__.py +0 -0
  234. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/integrations/openai_codex.py +0 -0
  235. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/integrations/sandbox_config.py +0 -0
  236. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/integrations/sandbox_factory.py +0 -0
  237. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/integrations/sandbox_provider.py +0 -0
  238. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/integrations/sandbox_registry.py +0 -0
  239. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/iterm_cursor_guide.py +0 -0
  240. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/json_types.py +0 -0
  241. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/local_context.py +0 -0
  242. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/managed_tools.py +0 -0
  243. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/mcp_config.py +0 -0
  244. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/mcp_disabled.py +0 -0
  245. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/mcp_oauth_ui.py +0 -0
  246. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/mcp_providers/__init__.py +0 -0
  247. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/mcp_providers/_registry.py +0 -0
  248. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/mcp_providers/base.py +0 -0
  249. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/mcp_providers/github.py +0 -0
  250. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/mcp_providers/slack.py +0 -0
  251. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/mcp_tools.py +0 -0
  252. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/media_utils.py +0 -0
  253. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/memory_guard.py +0 -0
  254. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/model_retry.py +0 -0
  255. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/notifications.py +0 -0
  256. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/offload.py +0 -0
  257. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/offload_middleware.py +0 -0
  258. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/output.py +0 -0
  259. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/paste_collapse.py +0 -0
  260. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/plugins/__init__.py +0 -0
  261. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/plugins/_json.py +0 -0
  262. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/plugins/adapters/__init__.py +0 -0
  263. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/plugins/adapters/hooks.py +0 -0
  264. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/plugins/adapters/mcp.py +0 -0
  265. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/plugins/adapters/skills.py +0 -0
  266. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/plugins/adapters/skills_middleware.py +0 -0
  267. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/plugins/commands_cli.py +0 -0
  268. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/plugins/discovery.py +0 -0
  269. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/plugins/manifest.py +0 -0
  270. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/plugins/marketplace.py +0 -0
  271. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/plugins/models.py +0 -0
  272. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/plugins/store.py +0 -0
  273. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/plugins/substitution.py +0 -0
  274. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/project_utils.py +0 -0
  275. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/py.typed +0 -0
  276. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/reasoning_effort.py +0 -0
  277. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/reliable_rubric.py +0 -0
  278. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/resume_state.py +0 -0
  279. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/skills/__init__.py +0 -0
  280. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/skills/load.py +0 -0
  281. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/skills/merge.py +0 -0
  282. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/skills/trust.py +0 -0
  283. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/state_migration.py +0 -0
  284. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/subagents.py +0 -0
  285. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/system_prompt.md +0 -0
  286. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/terminal_capabilities.py +0 -0
  287. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/terminal_escape.py +0 -0
  288. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/theme.py +0 -0
  289. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/tool_display.py +0 -0
  290. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/tui/__init__.py +0 -0
  291. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/tui/key_hints.py +0 -0
  292. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/tui/modals/__init__.py +0 -0
  293. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/tui/modals/cold_cache.py +0 -0
  294. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/tui/modals/plugin_manager/__init__.py +0 -0
  295. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/tui/modals/plugin_manager/content.py +0 -0
  296. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/tui/modals/plugin_manager/models.py +0 -0
  297. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/tui/modals/plugin_manager/plugin_manager.tcss +0 -0
  298. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/tui/modals/plugin_manager/state.py +0 -0
  299. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/tui/modals/plugin_manager/tabs.py +0 -0
  300. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/tui/modals/prompt_clipboard.py +0 -0
  301. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/tui/modals/prompt_clipboard.tcss +0 -0
  302. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/tui/modals/resume_compact.py +0 -0
  303. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/tui/screens/__init__.py +0 -0
  304. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/tui/widgets/__init__.py +0 -0
  305. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/tui/widgets/_copy_spans.py +0 -0
  306. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/tui/widgets/_inline_prompt.py +0 -0
  307. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/tui/widgets/_js_eval_display.py +0 -0
  308. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/tui/widgets/_links.py +0 -0
  309. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/tui/widgets/_paste_textarea.py +0 -0
  310. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/tui/widgets/agent_selector.py +0 -0
  311. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/tui/widgets/approval.py +0 -0
  312. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/tui/widgets/auth.py +0 -0
  313. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/tui/widgets/auto_mode_notice.py +0 -0
  314. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/tui/widgets/autocomplete.py +0 -0
  315. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/tui/widgets/chat_input.py +0 -0
  316. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/tui/widgets/codex_auth.py +0 -0
  317. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/tui/widgets/context_usage.py +0 -0
  318. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/tui/widgets/cwd_switch.py +0 -0
  319. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/tui/widgets/debug_console.py +0 -0
  320. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/tui/widgets/diff.py +0 -0
  321. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/tui/widgets/effort_selector.py +0 -0
  322. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/tui/widgets/goal_status.py +0 -0
  323. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/tui/widgets/history.py +0 -0
  324. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/tui/widgets/install_confirm.py +0 -0
  325. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/tui/widgets/launch_init.py +0 -0
  326. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/tui/widgets/loading.py +0 -0
  327. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/tui/widgets/mcp_login.py +0 -0
  328. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/tui/widgets/mcp_reconnect.py +0 -0
  329. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/tui/widgets/mcp_viewer.py +0 -0
  330. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/tui/widgets/message_store.py +0 -0
  331. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/tui/widgets/messages.py +0 -0
  332. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/tui/widgets/notification_center.py +0 -0
  333. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/tui/widgets/notification_detail.py +0 -0
  334. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/tui/widgets/notification_settings.py +0 -0
  335. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/tui/widgets/prompt_search.py +0 -0
  336. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/tui/widgets/restart_prompt.py +0 -0
  337. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/tui/widgets/skill_trust.py +0 -0
  338. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/tui/widgets/theme_selector.py +0 -0
  339. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/tui/widgets/thread_agent_switch.py +0 -0
  340. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/tui/widgets/thread_selector.py +0 -0
  341. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/tui/widgets/tool_renderers.py +0 -0
  342. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/tui/widgets/tool_widgets.py +0 -0
  343. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/tui/widgets/update_available.py +0 -0
  344. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/tui/widgets/update_confirm.py +0 -0
  345. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/tui/widgets/update_progress.py +0 -0
  346. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/tui/widgets/yolo_mode_notice.py +0 -0
  347. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/deepagents_code/unicode_security.py +0 -0
  348. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/examples/skills/arxiv-search/SKILL.md +0 -0
  349. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/examples/skills/arxiv-search/arxiv_search.py +0 -0
  350. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/examples/skills/langgraph-docs/SKILL.md +0 -0
  351. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/examples/skills/skill-creator/SKILL.md +0 -0
  352. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/examples/skills/skill-creator/scripts/init_skill.py +0 -0
  353. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/examples/skills/skill-creator/scripts/quick_validate.py +0 -0
  354. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/examples/skills/web-research/SKILL.md +0 -0
  355. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/hatch_build.py +0 -0
  356. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/images/tui.png +0 -0
  357. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/scripts/check_imports.py +0 -0
  358. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/scripts/debug_server.sh +0 -0
  359. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/scripts/generate_commands_catalog.py +0 -0
  360. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/scripts/install.sh +0 -0
  361. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/README.md +0 -0
  362. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/integration_tests/__init__.py +0 -0
  363. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/integration_tests/benchmarks/__init__.py +0 -0
  364. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/integration_tests/benchmarks/test_codspeed_import_benchmarks.py +0 -0
  365. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/integration_tests/benchmarks/test_local_context_benchmarks.py +0 -0
  366. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/integration_tests/benchmarks/test_startup_benchmarks.py +0 -0
  367. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/integration_tests/conftest.py +0 -0
  368. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/integration_tests/test_acp_mode.py +0 -0
  369. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/integration_tests/test_goal_criteria_remote.py +0 -0
  370. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/integration_tests/test_sandbox_factory.py +0 -0
  371. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/integration_tests/test_sandbox_operations.py +0 -0
  372. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/__init__.py +0 -0
  373. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/client/__init__.py +0 -0
  374. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/client/commands/__init__.py +0 -0
  375. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/client/commands/test_auth.py +0 -0
  376. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/client/commands/test_extras.py +0 -0
  377. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/client/commands/test_tools.py +0 -0
  378. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/data/coding_agent_v1_validator.json +0 -0
  379. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/hooks/__init__.py +0 -0
  380. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/hooks/models/__init__.py +0 -0
  381. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/hooks/models/test_models.py +0 -0
  382. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/hooks/test_client_lifecycle.py +0 -0
  383. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/hooks/test_configuration.py +0 -0
  384. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/hooks/test_engine.py +0 -0
  385. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/hooks/test_execution.py +0 -0
  386. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/hooks/test_manager.py +0 -0
  387. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/hooks/test_presenter.py +0 -0
  388. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/hooks/test_server_lifecycle.py +0 -0
  389. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/hooks/test_transcript.py +0 -0
  390. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/hooks/test_trust.py +0 -0
  391. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/plugins/__init__.py +0 -0
  392. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/plugins/test_marketplace.py +0 -0
  393. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/plugins/test_plugin_hooks.py +0 -0
  394. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/plugins/test_plugins_p0.py +0 -0
  395. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/plugins/test_store.py +0 -0
  396. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/skills/__init__.py +0 -0
  397. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/skills/test_merge.py +0 -0
  398. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/skills/test_skill_trust.py +0 -0
  399. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/skills/test_thread_inspector.py +0 -0
  400. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/smoke_tests/__init__.py +0 -0
  401. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/smoke_tests/conftest.py +0 -0
  402. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/smoke_tests/snapshots/system_prompt_interactive_local.md +0 -0
  403. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test__tool_stream.py +0 -0
  404. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_acp.py +0 -0
  405. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_approval_mode.py +0 -0
  406. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_ask_user_middleware.py +0 -0
  407. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_ask_user_types.py +0 -0
  408. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_auth_display.py +0 -0
  409. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_auth_store.py +0 -0
  410. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_charset.py +0 -0
  411. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_cli_provider.py +0 -0
  412. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_clipboard.py +0 -0
  413. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_coding_agent_metadata.py +0 -0
  414. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_cold_cache.py +0 -0
  415. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_command_registry.py +0 -0
  416. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_compact_tool.py +0 -0
  417. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_context_doctor.py +0 -0
  418. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_cost_tracking.py +0 -0
  419. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_cursor_blink.py +0 -0
  420. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_cursor_style.py +0 -0
  421. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_debug.py +0 -0
  422. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_debug_buffer.py +0 -0
  423. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_dep_floor_check.py +0 -0
  424. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_diff_utils.py +0 -0
  425. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_editor.py +0 -0
  426. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_env_vars.py +0 -0
  427. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_event_bus.py +0 -0
  428. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_exception_handling.py +0 -0
  429. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_extension_api.py +0 -0
  430. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_extras_info.py +0 -0
  431. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_file_ops.py +0 -0
  432. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_formatting.py +0 -0
  433. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_git.py +0 -0
  434. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_glm_5p2_profile.py +0 -0
  435. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_goal_criteria_client.py +0 -0
  436. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_goal_rubric.py +0 -0
  437. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_goal_state_limits.py +0 -0
  438. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_goal_state_notice.py +0 -0
  439. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_goal_state_persistence.py +0 -0
  440. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_goal_tools.py +0 -0
  441. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_hatch_build.py +0 -0
  442. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_hooks.py +0 -0
  443. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_imports.py +0 -0
  444. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_input_parsing.py +0 -0
  445. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_install_script.py +0 -0
  446. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_invocation.py +0 -0
  447. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_iterm_cursor_guide.py +0 -0
  448. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_json_types.py +0 -0
  449. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_local_context.py +0 -0
  450. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_managed_tools.py +0 -0
  451. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_mcp_auth.py +0 -0
  452. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_mcp_config.py +0 -0
  453. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_mcp_disabled.py +0 -0
  454. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_mcp_login_service.py +0 -0
  455. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_mcp_tools.py +0 -0
  456. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_media_utils.py +0 -0
  457. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_memory_guard.py +0 -0
  458. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_middleware_trace_policy.py +0 -0
  459. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_model_retry.py +0 -0
  460. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_notifications.py +0 -0
  461. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_offload.py +0 -0
  462. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_offload_api.py +0 -0
  463. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_openai_codex_integration.py +0 -0
  464. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_output.py +0 -0
  465. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_reliable_rubric.py +0 -0
  466. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_repository_bounds.py +0 -0
  467. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_resume_state.py +0 -0
  468. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_rubric_cli.py +0 -0
  469. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_sandbox_config.py +0 -0
  470. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_sandbox_factory.py +0 -0
  471. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_sandbox_provider.py +0 -0
  472. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_sandbox_registry.py +0 -0
  473. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_server.py +0 -0
  474. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_server_helpers.py +0 -0
  475. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_server_manager.py +0 -0
  476. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_session_stats.py +0 -0
  477. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_shell_allow_list.py +0 -0
  478. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_startup_blocking.py +0 -0
  479. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_startup_fast_paths.py +0 -0
  480. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_state_migration.py +0 -0
  481. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_subagents.py +0 -0
  482. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_terminal_capabilities.py +0 -0
  483. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_terminal_escape.py +0 -0
  484. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_terminal_progress_preference.py +0 -0
  485. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_terminal_stderr.py +0 -0
  486. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_textual_patches.py +0 -0
  487. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_theme.py +0 -0
  488. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_tool_display.py +0 -0
  489. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_tracing.py +0 -0
  490. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_tracing_replicas.py +0 -0
  491. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_transcript_virtualization.py +0 -0
  492. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_ui.py +0 -0
  493. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_unicode_security.py +0 -0
  494. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/test_version.py +0 -0
  495. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/tools/__init__.py +0 -0
  496. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/tools/test_current_thread.py +0 -0
  497. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/tools/test_fetch_url.py +0 -0
  498. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/tools/test_tool_arg_schemas.py +0 -0
  499. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/tui/__init__.py +0 -0
  500. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/tui/modals/__init__.py +0 -0
  501. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/tui/modals/plugin_manager/__init__.py +0 -0
  502. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/tui/modals/plugin_manager/test_structure.py +0 -0
  503. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/tui/modals/test_cold_cache.py +0 -0
  504. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/tui/modals/test_prompt_clipboard.py +0 -0
  505. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/tui/test_key_hints.py +0 -0
  506. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/tui/test_modal_footer_layout.py +0 -0
  507. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/tui/test_subagent_stream.py +0 -0
  508. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/tui/widgets/__init__.py +0 -0
  509. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/tui/widgets/test_agent_selector.py +0 -0
  510. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/tui/widgets/test_approval.py +0 -0
  511. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/tui/widgets/test_auto_mode_notice.py +0 -0
  512. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/tui/widgets/test_autocomplete.py +0 -0
  513. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/tui/widgets/test_chat_input.py +0 -0
  514. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/tui/widgets/test_copy_spans.py +0 -0
  515. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/tui/widgets/test_cwd_switch.py +0 -0
  516. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/tui/widgets/test_diff.py +0 -0
  517. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/tui/widgets/test_history.py +0 -0
  518. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/tui/widgets/test_inline_prompt.py +0 -0
  519. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/tui/widgets/test_install_confirm.py +0 -0
  520. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/tui/widgets/test_launch_init.py +0 -0
  521. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/tui/widgets/test_links.py +0 -0
  522. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/tui/widgets/test_loading.py +0 -0
  523. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/tui/widgets/test_mcp_login_modal.py +0 -0
  524. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/tui/widgets/test_mcp_reconnect.py +0 -0
  525. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/tui/widgets/test_mcp_viewer.py +0 -0
  526. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/tui/widgets/test_message_store.py +0 -0
  527. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/tui/widgets/test_messages.py +0 -0
  528. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/tui/widgets/test_notification_center.py +0 -0
  529. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/tui/widgets/test_notification_detail.py +0 -0
  530. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/tui/widgets/test_notification_settings.py +0 -0
  531. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/tui/widgets/test_prompt_search.py +0 -0
  532. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/tui/widgets/test_restart_prompt.py +0 -0
  533. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/tui/widgets/test_skill_trust_screen.py +0 -0
  534. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/tui/widgets/test_thread_agent_switch.py +0 -0
  535. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/tui/widgets/test_tool_renderers.py +0 -0
  536. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/tui/widgets/test_update_available.py +0 -0
  537. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/tui/widgets/test_update_confirm.py +0 -0
  538. {deepagents_code-0.1.63 → deepagents_code-0.1.64}/tests/unit_tests/tui/widgets/test_update_progress.py +0 -0
@@ -139,7 +139,7 @@ Hints that tell the user to run something (for example the teardown `-r <thread>
139
139
 
140
140
  ## Splash screen tips
141
141
 
142
- When adding a user-facing CLI feature (new slash command, keybinding, workflow), add a corresponding entry to the `_TIPS` dict in `deepagents_code/tui/widgets/startup_tip.py`, mapping the tip text to a relative selection weight (higher = shown more often). One tip is chosen at random above the input on startup to help users discover features. Keep tips short and action-oriented (e.g., `"Press ctrl+x to compose prompts in your external editor"`).
142
+ When adding a user-facing CLI feature (new slash command, keybinding, workflow), add a corresponding entry to the `_TIPS` dict in `deepagents_code/tui/widgets/startup_tip.py`, mapping the tip text to a relative selection weight (higher = shown more often). One tip is chosen at random above the input on startup to help users discover features. Keep tips short and action-oriented (e.g., `"Press ctrl+g to compose prompts in your external editor"`).
143
143
 
144
144
  ## Slash commands
145
145
 
@@ -170,6 +170,6 @@ To add a new slash command: (1) add a `SlashCommand` entry to `COMMANDS`, (2) se
170
170
  **Not required** unless the provider's models have a distinctive name prefix (like `gpt-*`, `claude*`, `gemini*`):
171
171
 
172
172
  - `detect_provider()` in `config.py` — only needed for auto-detection from bare model names
173
- - `Settings.has_*` property in `config.py` — only needed if referenced by `detect_provider()` fallback logic
173
+ - `Credentials.has_*` property in `config.py` — only needed if referenced by `detect_provider()` fallback logic
174
174
 
175
175
  Model discovery, credential checking, and UI integration are automatic once `PROVIDER_API_KEY_ENV` is populated and the `langchain-*` package is installed.
@@ -59,6 +59,8 @@ The main extension points are:
59
59
  - **Tools and MCP servers** for external capabilities
60
60
  - **Sandboxes** for changing where tool execution happens
61
61
  - **Hooks and commands** for integrating with local workflows
62
+ - **Python extensions** for middleware, tools, and virtual storage routes,
63
+ loaded from user-authorized sources or a trusted project
62
64
 
63
65
  These pieces are designed to compose. A project can provide shared defaults and integrations, while each user can layer personal configuration on top.
64
66
 
@@ -79,6 +81,7 @@ The main cost is the client/server boundary. When debugging, first decide which
79
81
  - For local setup and debugging, see [`DEVELOPMENT.md`](./DEVELOPMENT.md).
80
82
  - For command behavior, see [`COMMANDS.md`](./COMMANDS.md).
81
83
  - For lifecycle hooks (`hooks.json`), see [`HOOKS.md`](./HOOKS.md).
84
+ - For server-side Python extensions, see [`EXTENSIONS.md`](./EXTENSIONS.md).
82
85
  - For cost estimates and local pricing overrides (`prices.json`), see
83
86
  [`PRICING.md`](./PRICING.md).
84
87
  - For security boundaries, see [`THREAT_MODEL.md`](./THREAT_MODEL.md).
@@ -2,6 +2,28 @@
2
2
 
3
3
  # Deep Agents Code Changelog
4
4
 
5
+ ## [0.1.64](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.63...deepagents-code==0.1.64) (2026-08-28)
6
+
7
+ ### Features
8
+
9
+ - Added trace metadata attribution for skill invocations ([#5925](https://github.com/langchain-ai/deepagents/issues/5925)).
10
+ - Added a list of MCP servers that require login ([#5867](https://github.com/langchain-ai/deepagents/issues/5867)).
11
+ - Added the ability to copy the current model from the picker header ([#5904](https://github.com/langchain-ai/deepagents/issues/5904)).
12
+ - Linked the doctor commit hash to GitHub ([#5920](https://github.com/langchain-ai/deepagents/issues/5920)).
13
+ - Standardized the external editor shortcut ([#5911](https://github.com/langchain-ai/deepagents/issues/5911)).
14
+
15
+ ### Bug Fixes
16
+
17
+ - Deferred recursion-limit handling to the LangGraph server ([#5882](https://github.com/langchain-ai/deepagents/issues/5882)).
18
+ - Disabled Git terminal prompts in `execute` ([#5878](https://github.com/langchain-ai/deepagents/issues/5878)).
19
+ - Improved privacy and debug-only visibility for MCP token and editable paths ([#5866](https://github.com/langchain-ai/deepagents/issues/5866), [#5850](https://github.com/langchain-ai/deepagents/issues/5850)).
20
+ - Updated the model-switch warning to point to `/offload` ([#5901](https://github.com/langchain-ai/deepagents/issues/5901)).
21
+ - Rejected stale successful updates ([#5847](https://github.com/langchain-ai/deepagents/issues/5847)).
22
+ - Fixed thread timestamp rendering on systems without the glibc-only `%-I` `strftime` flag ([#5886](https://github.com/langchain-ai/deepagents/issues/5886)).
23
+ - Respected ASCII mode in the splash border ([#5923](https://github.com/langchain-ai/deepagents/issues/5923)).
24
+ - Skipped unchanged config writes ([#5919](https://github.com/langchain-ai/deepagents/issues/5919)).
25
+ - Skipped uncorrelated-result warnings for auto-mode policy denials ([#5869](https://github.com/langchain-ai/deepagents/issues/5869)).
26
+
5
27
  ## [0.1.63](https://github.com/langchain-ai/deepagents/compare/deepagents-code==0.1.62...deepagents-code==0.1.63) (2026-08-26)
6
28
 
7
29
  ### Features
@@ -8,7 +8,7 @@ Regenerate this file with `make commands-catalog` after changing command names,
8
8
  aliases, descriptions, visibility, or hidden-command metadata.
9
9
 
10
10
 
11
- ## Public (42)
11
+ ## Public (43)
12
12
 
13
13
  | Command | Aliases | Description |
14
14
  | --- | --- | --- |
@@ -25,6 +25,7 @@ aliases, descriptions, visibility, or hidden-command metadata.
25
25
  | `/docs` | | Open the docs |
26
26
  | `/editor` | | Open prompt in an external editor ($EDITOR) |
27
27
  | `/effort` | | Set reasoning effort for the current model |
28
+ | `/extensions` | | List loaded Python extensions and their provenance |
28
29
  | `/feedback` | | Send feedback or report an issue |
29
30
  | `/force-clear` | | Recover a stuck session with a fresh thread |
30
31
  | `/goal` | | Set and manage a persistent objective with acceptance criteria |
@@ -0,0 +1,148 @@
1
+ # Python extensions
2
+
3
+ Python extensions customize the agent server without modifying `dcode`. They
4
+ are experimental and load only when `DEEPAGENTS_CODE_EXPERIMENTAL=1` is set
5
+ before starting `dcode`.
6
+
7
+ An installed plugin declares one or more Python entry files in its manifest:
8
+
9
+ ```json
10
+ {
11
+ "name": "shared-memory",
12
+ "version": "1.0.0",
13
+ "extensions": {
14
+ "com.langchain.deepagents.code": {
15
+ "pythonExtensions": "./extension.py"
16
+ }
17
+ }
18
+ }
19
+ ```
20
+
21
+ The entry file exposes an async `extension` setup function. See
22
+ [`memory_store.py`](./examples/extensions/memory_store.py) for an example that
23
+ registers a shared `/memories/` storage route.
24
+
25
+ Install and enable the plugin through the normal plugin commands, then run
26
+ `/restart`. Backend composition happens while the agent graph is built, so
27
+ backend route changes cannot be applied by `/reload`. A separately managed
28
+ remote agent server must be restarted or redeployed by its operator.
29
+
30
+ The `/memories/` route makes shared storage available to model file
31
+ operations. It does not automatically move dcode's built-in `AGENTS.md` memory.
32
+ An extension that wants that content in the model's prompt must also register
33
+ middleware that reads the shared location.
34
+
35
+ ## Supported registrations
36
+
37
+ | Method | Purpose |
38
+ | --- | --- |
39
+ | `register_middleware(class_or_instance)` | Add LangChain `AgentMiddleware`. Classes must have a zero-argument constructor; use an instance otherwise. |
40
+ | `register_tool(function_or_tool)` | Expose a callable or `BaseTool` to the model. |
41
+ | `register_backend_route(prefix, storage)` | Make a `BackendProtocol` storage provider available under a virtual path. |
42
+ | `on_shutdown(callback)` | Release session resources when the agent server stops. Sync and async callbacks are supported. |
43
+
44
+ The factory must be declared with `async def`; dcode awaits every factory before
45
+ building the agent. The registrar remains valid for callbacks that outlive the
46
+ factory. Runtime tools appear on the next model request, backend routes update
47
+ the registry but require `/restart`, and middleware also takes effect after the
48
+ next server rebuild. `/extensions` reports when a restart is required.
49
+
50
+ Do not open long-lived connections or start background tasks during module
51
+ import. A storage provider may connect lazily on first use. If setup opens a
52
+ session resource, register an idempotent `on_shutdown` callback to release it.
53
+
54
+ The API exposes read-only session context (`d.cwd`, `d.mode`, `d.has_ui`, and
55
+ `d.path`), not mutable TUI or thread state. Custom slash commands are not part
56
+ of this API. Run `/extensions` to inspect registered units and their source.
57
+
58
+ ## Storage routes
59
+
60
+ `BackendProtocol` is the SDK name for a storage implementation. Route prefixes
61
+ are lowercase absolute paths with leading and trailing slashes, such as
62
+ `/memories/` or `/company/knowledge/`. Traversal, empty segments, backslashes,
63
+ URL query or fragment syntax, and overlaps with dcode's internal routes are
64
+ rejected.
65
+
66
+ Routed content is available through the model's file tools. Shell `execute`
67
+ remains attached to the default local or sandbox storage, so shell commands
68
+ cannot see virtual routed content.
69
+
70
+ Local agents may mount `FilesystemBackend` and `LocalShellBackend`. Sandboxed
71
+ agents reject direct instances of either class, including subclasses, because
72
+ they would expose host storage while `execute` still runs inside the sandbox.
73
+ Other `BackendProtocol` implementations such as `StateBackend`, `StoreBackend`,
74
+ and `ContextHubBackend` are supported. This check is intentionally shallow:
75
+ dcode does not recursively inspect custom or composite backend wrappers, whose
76
+ authors own their isolation contract.
77
+
78
+ The first extension registration of a route prefix or unit name wins. Extension
79
+ tools and middleware replace same-named built-ins. A route that is a parent or
80
+ child of dcode's artifact or conversation-history storage fails agent
81
+ construction or runtime registration immediately; internal routes cannot be
82
+ replaced.
83
+
84
+ ## Packaging, discovery, and trust
85
+
86
+ For quick user-wide extensions, place Python files in
87
+ `~/.deepagents/extensions/`. Installed plugins remain the preferred
88
+ distribution mechanism: they provide stable identity, versions, updates, and a
89
+ durable data directory. Dcode resolves plugin manifest entries inside the
90
+ installed snapshot and rejects traversal, absolute paths, symlink escapes,
91
+ missing files, and non-Python files. Entries without a plugin version are
92
+ ignored. Installed Python distributions may also expose module entry points in
93
+ the `dcode.extensions` group.
94
+
95
+ Sources load in this order:
96
+
97
+ | Source | Version and trust behavior |
98
+ | --- | --- |
99
+ | `~/.deepagents/extensions/` | User-owned loose files; implicitly authorized. |
100
+ | `[extensions].extra_files` and `extra_dirs` | Explicit paths in trusted user configuration. |
101
+ | `-e/--extension PATH` | Temporary file or directory authorized for one run. |
102
+ | Enabled installed plugins | Identified by `name@marketplace`, loaded from the versioned plugin cache. Installing and enabling the plugin authorizes its code. |
103
+ | `dcode.extensions` entry points | Modules from installed Python distributions. |
104
+ | `.deepagents/extensions/` | Project-controlled and normally versioned with the project; never scanned before project trust. |
105
+
106
+ The project directory is the local development escape hatch. Its scan is
107
+ shallow: direct `*.py` files are extensions, and a direct subdirectory is a
108
+ package extension when it contains `__init__.py` or `extension.py`.
109
+
110
+ Project extensions execute arbitrary Python with the user's process privileges.
111
+ Interactive launches ask before loading them and can remember the canonical
112
+ project path. Headless or CI launches can opt in for one run with
113
+ `--trust-project-extensions`. Only trust projects you control.
114
+
115
+ ## Configuration
116
+
117
+ ```toml
118
+ # ~/.deepagents/config.toml
119
+ [extensions]
120
+ enabled = true
121
+ trust = "ask" # ask | always | never
122
+ extra_files = ["~/src/policy.py"]
123
+ extra_dirs = ["~/src/company-extensions"]
124
+ ```
125
+
126
+ Environment overrides:
127
+
128
+ - `DEEPAGENTS_CODE_EXTENSIONS` enables or disables all extension loading.
129
+ - `DEEPAGENTS_CODE_EXTENSIONS_TRUST` overrides the project trust policy.
130
+
131
+ Relative extra paths resolve from `~/.deepagents/`. Repeat `-e PATH` to add
132
+ multiple temporary sources for one invocation.
133
+
134
+ ## Failure and security behavior
135
+
136
+ Each setup function is transactional. If import or initialization fails, all of
137
+ that extension's partial registrations are removed and later extensions still
138
+ load. Failures are written to the debug log.
139
+
140
+ Extension tools override same-named built-ins and are not automatically added to
141
+ dcode's human-approval map. An extension that performs sensitive work must
142
+ enforce its own approval or policy through middleware.
143
+
144
+ Every registration retains its plugin ID, version, installed root, and source
145
+ scope. This attribution tells dcode which extension added a storage route; it
146
+ does not prove that an arbitrary storage implementation is safe. A provider can
147
+ access the network or host files, so install plugins only from trusted sources
148
+ and choose shared namespaces that preserve tenant and user isolation.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: deepagents-code
3
- Version: 0.1.63
3
+ Version: 0.1.64
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,20 +30,20 @@ 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.9
33
+ Requires-Dist: deepagents==0.7.10
34
34
  Requires-Dist: filelock<3.30,>=3.29.7
35
35
  Requires-Dist: genai-prices<0.2.0,>=0.1.4
36
36
  Requires-Dist: httpx<1.0.0,>=0.28.1
37
- Requires-Dist: langchain-anthropic<2.0.0,>=1.6.1
38
- Requires-Dist: langchain-google-genai<5.0.0,>=4.3.5
37
+ Requires-Dist: langchain-anthropic<2.0.0,>=1.7.0
38
+ Requires-Dist: langchain-google-genai<5.0.0,>=4.3.7
39
39
  Requires-Dist: langchain-mcp-adapters<1.0.0,>=0.3.2
40
40
  Requires-Dist: langchain-openai<2.0.0,>=1.6.0
41
41
  Requires-Dist: langchain-quickjs<0.4.0,>=0.3.4
42
- Requires-Dist: langchain<2.0.0,>=1.3.17
42
+ Requires-Dist: langchain<2.0.0,>=1.3.18
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.33.0
46
- Requires-Dist: langgraph-sdk<1.0.0,>=0.4.3
46
+ Requires-Dist: langgraph-sdk<1.0.0,>=0.4.4
47
47
  Requires-Dist: langsmith[sandbox]>=0.11.1
48
48
  Requires-Dist: markdownify<2.0.0,>=1.2.3
49
49
  Requires-Dist: mcp<2.0.0,>=1.28.1
@@ -66,13 +66,13 @@ 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.6.1; extra == 'all-providers'
70
- Requires-Dist: langchain-aws<2.0.0,>=1.7.3; extra == 'all-providers'
71
- Requires-Dist: langchain-baseten<1.0.0,>=0.2.3; extra == 'all-providers'
69
+ Requires-Dist: langchain-anthropic<2.0.0,>=1.7.0; extra == 'all-providers'
70
+ Requires-Dist: langchain-aws<2.0.0,>=1.7.4; extra == 'all-providers'
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
73
  Requires-Dist: langchain-deepseek<2.0.0,>=1.1.0; extra == 'all-providers'
74
- Requires-Dist: langchain-fireworks<2.0.0,>=1.6.0; extra == 'all-providers'
75
- Requires-Dist: langchain-google-genai<5.0.0,>=4.3.5; extra == 'all-providers'
74
+ Requires-Dist: langchain-fireworks<2.0.0,>=1.6.1; extra == 'all-providers'
75
+ Requires-Dist: langchain-google-genai<5.0.0,>=4.3.7; 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'
78
78
  Requires-Dist: langchain-huggingface<2.0.0,>=1.2.2; extra == 'all-providers'
@@ -94,11 +94,11 @@ 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.6.1; extra == 'anthropic'
97
+ Requires-Dist: langchain-anthropic<2.0.0,>=1.7.0; extra == 'anthropic'
98
98
  Provides-Extra: baseten
99
- Requires-Dist: langchain-baseten<1.0.0,>=0.2.3; extra == 'baseten'
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.3; extra == 'bedrock'
101
+ Requires-Dist: langchain-aws<2.0.0,>=1.7.4; 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
@@ -106,9 +106,9 @@ Requires-Dist: langchain-daytona>=0.0.7; extra == 'daytona'
106
106
  Provides-Extra: deepseek
107
107
  Requires-Dist: langchain-deepseek<2.0.0,>=1.1.0; extra == 'deepseek'
108
108
  Provides-Extra: fireworks
109
- Requires-Dist: langchain-fireworks<2.0.0,>=1.6.0; extra == 'fireworks'
109
+ Requires-Dist: langchain-fireworks<2.0.0,>=1.6.1; extra == 'fireworks'
110
110
  Provides-Extra: google-genai
111
- Requires-Dist: langchain-google-genai<5.0.0,>=4.3.5; extra == 'google-genai'
111
+ Requires-Dist: langchain-google-genai<5.0.0,>=4.3.7; extra == 'google-genai'
112
112
  Provides-Extra: groq
113
113
  Requires-Dist: langchain-groq<2.0.0,>=1.1.3; extra == 'groq'
114
114
  Provides-Extra: huggingface
@@ -28,6 +28,7 @@
28
28
  - Custom subagent loader (`subagents.py`, `agent.py:load_async_subagents`)
29
29
  - Conversation offload (`offload.py`)
30
30
  - Skill management (`skills/commands.py`)
31
+ - Python extension loading (`extensions/`)
31
32
  - Persisted goal/rubric state notices (`goal_state_notice.py`, `goal_tools.py`,
32
33
  `goal_state_limits.py`)
33
34
 
@@ -55,6 +56,8 @@
55
56
  7. `DA_SERVER_*` environment variables are readable only by the CLI process and its child server subprocess (OS process isolation assumption).
56
57
  8. Users who set `class_path` in `config.toml` accept the same trust model as `pyproject.toml` build scripts — they control their own machine.
57
58
  9. Administrators deploy and protect the fixed `managed_config.toml` path with operating-system controls; the CLI does not validate its owner or mode and never writes it.
59
+ 10. User-directory, user-config, CLI, installed-plugin, and Python entry-point extensions are authorized by the user action that supplied them. Project extensions execute only after explicit, configured, or persisted trust.
60
+ 11. Extension backend routes cannot overlap dcode's local artifact or conversation-history storage. A sandboxed agent rejects direct `FilesystemBackend` and `LocalShellBackend` mounts, including subclasses; wrapper implementations are responsible for their own isolation because dcode does not recursively inspect arbitrary backend object graphs.
58
61
 
59
62
  ---
60
63
 
@@ -140,7 +143,7 @@
140
143
  | C6 | Hook Runtime | Fires subprocess commands on agent lifecycle events | framework-controlled | No³ | `hooks.runtime.HooksRuntime`, `hooks.runner.run_command_handler` |
141
144
  | C7 | Sandbox Integration | Creates/destroys remote sandboxes (Daytona, LangSmith, Modal, Runloop, AgentCore) | framework-controlled | No⁴ | `integrations.sandbox_factory.create_sandbox` |
142
145
  | C8 | Session Persistence | SQLite checkpoint store for LangGraph thread state | framework-controlled | Yes | `sessions.get_db_path`, `sessions.generate_thread_id` |
143
- | C9 | Configuration System | Managed/user TOML, env vars, `AGENTS.md` system prompts, model config | administrator/user-controlled | N/A | `configuration`, `config.settings`, `model_config.ModelConfig`, fixed managed path, `~/.deepagents/config.toml` |
146
+ | C9 | Configuration System | Managed/user TOML, env vars, `AGENTS.md` system prompts, model config | administrator/user-controlled | N/A | `configuration`, `config.Credentials`, `config.RuntimeState`, `_paths.PATHS`, `model_config.ModelConfig`, fixed managed path, `~/.deepagents/config.toml` |
144
147
  | C10 | Unicode/URL Safety | Detects hidden Unicode, checks URL domain spoofing for approval UI warnings | framework-controlled | Yes | `unicode_security.detect_dangerous_unicode`, `unicode_security.check_url_safety` |
145
148
  | C11 | LangGraph Dev Server | Subprocess running `langgraph dev` with `LANGGRAPH_AUTH_TYPE=noop`; managed by `ServerProcess` | framework-controlled | Yes⁵ | `client.launch.server.ServerProcess.start`, `client.launch.server.generate_langgraph_json`, `client.launch.server_manager.start_server_and_get_agent` |
146
149
  | C12 | Remote Agent Client | HTTP+SSE client wrapping `RemoteGraph`; connects to C11 on localhost | framework-controlled | Yes⁵ | `client.remote_client.RemoteAgent.astream`, `client.remote_client.RemoteAgent.aget_state` |
@@ -1,3 +1,3 @@
1
1
  """Generated at build time. Do not edit or commit."""
2
2
 
3
- BUILD_COMMIT = "970003e"
3
+ BUILD_COMMIT = "d8686f7"
@@ -256,6 +256,12 @@ values). Marks experimental runs in UI/trace metadata. Behavior behind this
256
256
  flag may change or be removed without notice.
257
257
  """
258
258
 
259
+ EXTENSIONS = "DEEPAGENTS_CODE_EXTENSIONS"
260
+ """Enable loading installed-plugin and trusted-project Python extensions."""
261
+
262
+ EXTENSIONS_TRUST = "DEEPAGENTS_CODE_EXTENSIONS_TRUST"
263
+ """Default project extension trust policy: `ask`, `always`, or `never`."""
264
+
259
265
  EXTERNAL_EVENT_SOCKET = "DEEPAGENTS_CODE_EXTERNAL_EVENT_SOCKET"
260
266
  """Enable the local Unix-socket external event listener.
261
267
 
@@ -487,10 +493,9 @@ repo file, so a project `.env` cannot disable itself.
487
493
  RECURSION_LIMIT = "DEEPAGENTS_CODE_RECURSION_LIMIT"
488
494
  """Override the main agent's LangGraph `recursion_limit` (graph step budget).
489
495
 
490
- Parsed as an integer by the config manifest. Values below the LangGraph floor
491
- (`25`) or above the manifest ceiling are ignored with a logged warning, falling
492
- back to `config.toml` then the default. See `[runtime].recursion_limit` and the
493
- `--recursion-limit` CLI flag.
496
+ Parsed as an integer by the config manifest. Values outside the accepted range
497
+ are ignored with a logged warning, falling back to `config.toml`. See
498
+ `[runtime].recursion_limit` and the `--recursion-limit` CLI flag.
494
499
  """
495
500
 
496
501
  RESTARTED_AFTER_UPDATE = "DEEPAGENTS_CODE_RESTARTED_AFTER_UPDATE"
@@ -21,6 +21,7 @@ from __future__ import annotations
21
21
  import errno
22
22
  import logging
23
23
  import os
24
+ import re
24
25
  import sys
25
26
  import tempfile
26
27
  from dataclasses import dataclass
@@ -49,12 +50,29 @@ __all__ = [
49
50
  "ProfilePaths",
50
51
  "ProjectPaths",
51
52
  "classify_path",
53
+ "ensure_agent_dir",
54
+ "ensure_project_skills_dir",
55
+ "ensure_user_skills_dir",
52
56
  "export_profile_env",
53
57
  "first_writable",
58
+ "get_agent_dir",
59
+ "get_built_in_skills_dir",
54
60
  "get_deepagents_home",
61
+ "get_project_agent_md_path",
62
+ "get_project_agent_skills_dir",
63
+ "get_project_agents_dir",
64
+ "get_project_claude_skills_dir",
65
+ "get_project_skills_dir",
66
+ "get_user_agent_md_path",
67
+ "get_user_agent_skills_dir",
68
+ "get_user_agents_dir",
69
+ "get_user_claude_skills_dir",
70
+ "get_user_skills_dir",
55
71
  "harden_state_dir",
56
72
  "probe_writable",
57
73
  "project_paths",
74
+ "user_agents_dir",
75
+ "user_deepagents_dir",
58
76
  ]
59
77
 
60
78
  DEEPAGENTS_HOME_ENV = "DEEPAGENTS_HOME"
@@ -221,6 +239,149 @@ def project_paths(root: Path) -> ProjectPaths:
221
239
  )
222
240
 
223
241
 
242
+ def user_deepagents_dir() -> Path:
243
+ """Return the immutable launch-time user profile root."""
244
+ return PATHS.profile.root
245
+
246
+
247
+ def _validate_agent_name(agent_name: str) -> None:
248
+ """Raise when an agent name cannot safely identify a profile directory.
249
+
250
+ Raises:
251
+ ValueError: If the name is empty, unsafe, or reserved by dcode.
252
+ """
253
+ if (
254
+ not agent_name
255
+ or not agent_name.strip()
256
+ or not re.fullmatch(r"[a-zA-Z0-9_\-\s]+", agent_name)
257
+ ):
258
+ msg = (
259
+ f"Invalid agent name: {agent_name!r}. Agent names can only "
260
+ "contain letters, numbers, hyphens, underscores, and spaces."
261
+ )
262
+ raise ValueError(msg)
263
+ from deepagents_code._reserved_names import is_reserved_agent_dir_name
264
+
265
+ if is_reserved_agent_dir_name(agent_name):
266
+ msg = f"Invalid agent name: {agent_name!r} is reserved for dcode's own state."
267
+ raise ValueError(msg)
268
+
269
+
270
+ def get_agent_dir(agent_name: str) -> Path:
271
+ """Return the validated profile directory for an agent name.
272
+
273
+ Args:
274
+ agent_name: Agent profile name.
275
+
276
+ Returns:
277
+ Path to the agent's profile directory.
278
+
279
+ """
280
+ _validate_agent_name(agent_name)
281
+ return PATHS.profile.agent_dir(agent_name)
282
+
283
+
284
+ def ensure_agent_dir(agent_name: str) -> Path:
285
+ """Create the validated profile directory for an agent.
286
+
287
+ Returns:
288
+ Path to the agent's profile directory.
289
+ """
290
+ agent_dir = get_agent_dir(agent_name)
291
+ agent_dir.mkdir(parents=True, exist_ok=True)
292
+ return agent_dir
293
+
294
+
295
+ def get_user_agent_md_path(agent_name: str) -> Path:
296
+ """Return the user-level `AGENTS.md` path for an agent profile."""
297
+ return get_agent_dir(agent_name) / "AGENTS.md"
298
+
299
+
300
+ def get_project_agent_md_path(project_root: Path | None) -> list[Path]:
301
+ """Return existing project-level `AGENTS.md` paths."""
302
+ if project_root is None:
303
+ return []
304
+ from deepagents_code.project_utils import find_project_agent_md
305
+
306
+ return find_project_agent_md(project_root)
307
+
308
+
309
+ def get_user_skills_dir(agent_name: str) -> Path:
310
+ """Return the user-level skills directory for an agent profile."""
311
+ return get_agent_dir(agent_name) / "skills"
312
+
313
+
314
+ def ensure_user_skills_dir(agent_name: str) -> Path:
315
+ """Create the user-level skills directory for an agent.
316
+
317
+ Returns:
318
+ Path to the agent's user-level skills directory.
319
+ """
320
+ skills_dir = get_user_skills_dir(agent_name)
321
+ skills_dir.mkdir(parents=True, exist_ok=True)
322
+ return skills_dir
323
+
324
+
325
+ def get_project_skills_dir(project_root: Path | None) -> Path | None:
326
+ """Return the project-level dcode skills directory, when in a project."""
327
+ return None if project_root is None else project_paths(project_root).skills_dir
328
+
329
+
330
+ def ensure_project_skills_dir(project_root: Path | None) -> Path | None:
331
+ """Create the project-level dcode skills directory.
332
+
333
+ Returns:
334
+ Path to the project skills directory, or `None` outside a project.
335
+ """
336
+ skills_dir = get_project_skills_dir(project_root)
337
+ if skills_dir is not None:
338
+ skills_dir.mkdir(parents=True, exist_ok=True)
339
+ return skills_dir
340
+
341
+
342
+ def get_user_agents_dir(agent_name: str) -> Path:
343
+ """Return the custom-subagent directory for an agent profile."""
344
+ return get_agent_dir(agent_name) / "agents"
345
+
346
+
347
+ def get_project_agents_dir(project_root: Path | None) -> Path | None:
348
+ """Return the project-level custom-subagent directory, when available."""
349
+ return None if project_root is None else project_paths(project_root).agents_dir
350
+
351
+
352
+ def user_agents_dir() -> Path | None:
353
+ """Return the launch user's tool-agnostic `~/.agents` directory."""
354
+ return None if PATHS.launch_home is None else PATHS.launch_home / ".agents"
355
+
356
+
357
+ def get_user_agent_skills_dir() -> Path | None:
358
+ """Return the launch user's tool-agnostic `~/.agents/skills` directory."""
359
+ base = user_agents_dir()
360
+ return None if base is None else base / "skills"
361
+
362
+
363
+ def get_project_agent_skills_dir(project_root: Path | None) -> Path | None:
364
+ """Return the project-level tool-agnostic `.agents/skills` directory."""
365
+ return None if project_root is None else project_root / ".agents" / "skills"
366
+
367
+
368
+ def get_user_claude_skills_dir() -> Path | None:
369
+ """Return the launch user's experimental `~/.claude/skills` directory."""
370
+ if PATHS.launch_home is None:
371
+ return None
372
+ return PATHS.launch_home / ".claude" / "skills"
373
+
374
+
375
+ def get_project_claude_skills_dir(project_root: Path | None) -> Path | None:
376
+ """Return the project's experimental `.claude/skills` directory."""
377
+ return None if project_root is None else project_root / ".claude" / "skills"
378
+
379
+
380
+ def get_built_in_skills_dir() -> Path:
381
+ """Return the directory containing skills bundled with dcode."""
382
+ return Path(__file__).parent / "built_in_skills"
383
+
384
+
224
385
  class PathState(StrEnum):
225
386
  """Whether a probed path exists, is absent, or could not be read.
226
387
 
@@ -4,7 +4,7 @@ Agent profiles are siblings of the app's own directories under the profile
4
4
  root, so an agent named after one of them would resolve onto app state. Both
5
5
  the picker and the write path need that list.
6
6
 
7
- This module is imported on the CLI startup path (`config.get_agent_dir` and
7
+ This module is imported on the CLI startup path (`_paths.get_agent_dir` and
8
8
  `main`) and by the agent picker. Keep its module level free of heavy imports.
9
9
  The constants are read inside the function, so importing this module never
10
10
  pulls in `deepagents` or LangChain. The function itself must stay light too,