voidx 3.7.3__tar.gz → 3.7.5__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 (622) hide show
  1. {voidx-3.7.3/src/voidx.egg-info → voidx-3.7.5}/PKG-INFO +1 -1
  2. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_agent/graph/test_graph_authorization.py +75 -8
  3. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_agent/loop/test_manager.py +20 -2
  4. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_agent/test_permission_phase6.py +2 -4
  5. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_permission/test_risk.py +2 -2
  6. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_skills/test_skill_parsing.py +0 -1
  7. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_skills/test_skill_references.py +0 -1
  8. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_skills/test_workflow_advance.py +0 -5
  9. voidx-3.7.5/src/tests/test_tools/bash/test_auto_route_git.py +342 -0
  10. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_tools/file/test_edit_dedup.py +103 -0
  11. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_tools/file/test_edit_line_insert.py +181 -0
  12. voidx-3.7.5/src/tests/test_tools/file/test_overlap.py +73 -0
  13. voidx-3.7.5/src/tests/test_tools/test_shell_json_format.py +33 -0
  14. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_tools/test_tool_schemas.py +2 -0
  15. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_ui/gateway/test_gateway_v2_routing.py +50 -0
  16. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/__init__.py +1 -1
  17. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/agent/graph/permissions.py +0 -48
  18. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/agent/graph/subagent.py +1 -1
  19. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/agent/graph/thread_context.py +3 -0
  20. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/agent/graph/turn_runner.py +6 -1
  21. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/agent/loop/manager.py +5 -2
  22. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/agent/prompts.py +1 -1
  23. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/permission/presets.py +0 -1
  24. voidx-3.7.5/src/voidx/tools/file/overlap.py +35 -0
  25. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/tools/file/replace.py +120 -83
  26. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/tools/file/safe_path.py +0 -2
  27. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/tools/file/write.py +43 -6
  28. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/tools/search.py +4 -4
  29. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/tools/shell/common.py +3 -3
  30. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/ui/gateway/session/core.py +10 -1
  31. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/ui/output/events/bus.py +15 -3
  32. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/workflow/__init__.py +0 -2
  33. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/workflow/nodes.py +0 -4
  34. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/workflow/policy.py +0 -6
  35. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/workflow/render.py +0 -4
  36. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/workflow/schema.py +0 -10
  37. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/workflow/service.py +0 -1
  38. {voidx-3.7.3 → voidx-3.7.5/src/voidx.egg-info}/PKG-INFO +1 -1
  39. {voidx-3.7.3 → voidx-3.7.5}/src/voidx.egg-info/SOURCES.txt +4 -0
  40. {voidx-3.7.3 → voidx-3.7.5}/LICENSE +0 -0
  41. {voidx-3.7.3 → voidx-3.7.5}/README.md +0 -0
  42. {voidx-3.7.3 → voidx-3.7.5}/pyproject.toml +0 -0
  43. {voidx-3.7.3 → voidx-3.7.5}/setup.cfg +0 -0
  44. {voidx-3.7.3 → voidx-3.7.5}/src/tests/__init__.py +0 -0
  45. {voidx-3.7.3 → voidx-3.7.5}/src/tests/conftest.py +0 -0
  46. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_agent/__init__.py +0 -0
  47. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_agent/conftest.py +0 -0
  48. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_agent/graph/__init__.py +0 -0
  49. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_agent/graph/conftest.py +0 -0
  50. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_agent/graph/run_loop_helpers.py +0 -0
  51. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_agent/graph/stream_llm_helpers.py +0 -0
  52. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_agent/graph/test_call_llm_compaction.py +0 -0
  53. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_agent/graph/test_call_llm_compaction_advanced.py +0 -0
  54. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_agent/graph/test_call_llm_structure.py +0 -0
  55. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_agent/graph/test_call_llm_tools.py +0 -0
  56. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_agent/graph/test_compaction_flow.py +0 -0
  57. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_agent/graph/test_compaction_flow_run_once.py +0 -0
  58. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_agent/graph/test_convergence.py +0 -0
  59. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_agent/graph/test_execute_tools_guard.py +0 -0
  60. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_agent/graph/test_execute_tools_todo.py +0 -0
  61. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_agent/graph/test_graph_setup_prompts.py +0 -0
  62. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_agent/graph/test_guards_tool_op.py +0 -0
  63. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_agent/graph/test_parallel_subagents.py +0 -0
  64. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_agent/graph/test_parallel_subagents_dedup.py +0 -0
  65. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_agent/graph/test_prepare_workflow.py +0 -0
  66. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_agent/graph/test_run_loop_startup.py +0 -0
  67. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_agent/graph/test_run_loop_title_lsp.py +0 -0
  68. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_agent/graph/test_run_loop_title_misc.py +0 -0
  69. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_agent/graph/test_run_loop_workflow.py +0 -0
  70. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_agent/graph/test_run_loop_workflow_advanced.py +0 -0
  71. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_agent/graph/test_runtime_guards.py +0 -0
  72. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_agent/graph/test_session_context_frames.py +0 -0
  73. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_agent/graph/test_session_crud.py +0 -0
  74. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_agent/graph/test_session_messages.py +0 -0
  75. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_agent/graph/test_session_persistence.py +0 -0
  76. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_agent/graph/test_session_run_once.py +0 -0
  77. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_agent/graph/test_session_runtime_state.py +0 -0
  78. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_agent/graph/test_session_transcript.py +0 -0
  79. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_agent/graph/test_stream_llm_sanitization.py +0 -0
  80. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_agent/graph/test_subagent_llm_retry.py +0 -0
  81. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_agent/graph/test_subagent_persistence.py +0 -0
  82. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_agent/graph/test_subagent_runner.py +0 -0
  83. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_agent/graph/test_subagent_step_budget.py +0 -0
  84. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_agent/graph/test_subagent_step_budget_convergence.py +0 -0
  85. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_agent/graph/test_subagent_step_budget_final.py +0 -0
  86. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_agent/graph/test_todo_events.py +0 -0
  87. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_agent/graph/test_tool_execution_auth.py +0 -0
  88. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_agent/graph/test_tool_result_preview.py +0 -0
  89. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_agent/graph/test_turn_control_e2e.py +0 -0
  90. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_agent/graph/test_turn_control_integration.py +0 -0
  91. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_agent/graph/test_turn_runner_guidance_discard.py +0 -0
  92. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_agent/graph/test_turn_runner_idle_event.py +0 -0
  93. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_agent/graph/test_turn_stop_without_pending.py +0 -0
  94. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_agent/graph/test_workflow_done.py +0 -0
  95. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_agent/graph/test_workflow_review.py +0 -0
  96. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_agent/graph/test_workflow_transactions.py +0 -0
  97. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_agent/graph/test_workflow_transactions_barrier.py +0 -0
  98. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_agent/loop/test_prompt_source.py +0 -0
  99. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_agent/slash/__init__.py +0 -0
  100. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_agent/slash/test_slash_init.py +0 -0
  101. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_agent/slash/test_slash_loop.py +0 -0
  102. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_agent/slash/test_slash_mcp.py +0 -0
  103. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_agent/slash/test_slash_model.py +0 -0
  104. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_agent/slash/test_slash_model_advanced.py +0 -0
  105. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_agent/slash/test_slash_session.py +0 -0
  106. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_agent/slash/test_slash_skills.py +0 -0
  107. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_agent/slash/test_slash_tavily.py +0 -0
  108. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_agent/slash/test_slash_upgrade.py +0 -0
  109. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_agent/test_attachments.py +0 -0
  110. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_agent/test_file_rwlock.py +0 -0
  111. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_agent/test_goal_resolver.py +0 -0
  112. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_agent/test_goal_resolver_advanced.py +0 -0
  113. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_agent/test_guard_guidance.py +0 -0
  114. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_agent/test_guide_command.py +0 -0
  115. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_agent/test_message_trimming_parsers.py +0 -0
  116. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_agent/test_message_trimming_rules.py +0 -0
  117. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_agent/test_module_boundaries.py +0 -0
  118. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_agent/test_permission.py +0 -0
  119. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_agent/test_permission_append.py +0 -0
  120. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_agent/test_permission_phase2.py +0 -0
  121. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_agent/test_permission_phase3.py +0 -0
  122. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_agent/test_permission_phase4.py +0 -0
  123. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_agent/test_permission_phase5.py +0 -0
  124. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_agent/test_prompts.py +0 -0
  125. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_agent/test_runtime_context_builder.py +0 -0
  126. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_agent/test_runtime_context_prompts.py +0 -0
  127. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_agent/test_runtime_context_skill_stripping.py +0 -0
  128. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_agent/test_task_state.py +0 -0
  129. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_agent/test_task_state_context_sync.py +0 -0
  130. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_agent/test_task_state_rendering.py +0 -0
  131. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_agent/test_todo_replay_sanitization.py +0 -0
  132. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_agent/test_tool_exchange_sanitizer.py +0 -0
  133. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_agent/test_tool_filters_gemini.py +0 -0
  134. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_agent/test_tool_messages.py +0 -0
  135. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_agent/test_tool_result_storage.py +0 -0
  136. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_agent/test_turn_control.py +0 -0
  137. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_agent/test_turn_control_prompt.py +0 -0
  138. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_agent/test_turn_metrics.py +0 -0
  139. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_agent/test_turn_start.py +0 -0
  140. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_archive_script.py +0 -0
  141. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_config/__init__.py +0 -0
  142. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_config/test_config.py +0 -0
  143. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_config/test_config_advanced.py +0 -0
  144. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_config/test_retry_config.py +0 -0
  145. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_install_sh.py +0 -0
  146. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_llm/conftest.py +0 -0
  147. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_llm/test_compaction_retry.py +0 -0
  148. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_llm/test_fallback_summary.py +0 -0
  149. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_llm/test_gemini_provider.py +0 -0
  150. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_llm/test_goal_resolver_retry.py +0 -0
  151. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_llm/test_instruction_cache.py +0 -0
  152. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_llm/test_llm_catalog.py +0 -0
  153. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_llm/test_llm_catalog_fetchers.py +0 -0
  154. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_llm/test_llm_provider.py +0 -0
  155. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_llm/test_llm_provider_advanced.py +0 -0
  156. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_llm/test_llm_usage.py +0 -0
  157. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_llm/test_overflow_threshold.py +0 -0
  158. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_llm/test_prune_args.py +0 -0
  159. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_llm/test_request_log.py +0 -0
  160. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_llm/test_streaming_sanitize.py +0 -0
  161. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_llm/test_token_counting.py +0 -0
  162. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_logging/test_external.py +0 -0
  163. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_logging/test_internal_error.py +0 -0
  164. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_logging/test_tool_log.py +0 -0
  165. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_lsp/__init__.py +0 -0
  166. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_lsp/test_lsp.py +0 -0
  167. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_lsp/test_lsp_advanced.py +0 -0
  168. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_mcp/__init__.py +0 -0
  169. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_mcp/test_mcp.py +0 -0
  170. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_memory/__init__.py +0 -0
  171. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_memory/test_main.py +0 -0
  172. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_memory/test_main_startup.py +0 -0
  173. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_memory/test_schema_migration.py +0 -0
  174. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_npm_package.py +0 -0
  175. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_permission/__init__.py +0 -0
  176. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_release_npm_wheel_sync.py +0 -0
  177. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_runtime/__init__.py +0 -0
  178. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_runtime/test_goal_resolution_refactor.py +0 -0
  179. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_runtime/test_processes.py +0 -0
  180. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_runtime/test_runtime_ui.py +0 -0
  181. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_selfupdate/__init__.py +0 -0
  182. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_selfupdate/test_selfupdate.py +0 -0
  183. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_skills/__init__.py +0 -0
  184. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_skills/conftest.py +0 -0
  185. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_skills/test_create_skill.py +0 -0
  186. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_test_runner.py +0 -0
  187. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_tools/__init__.py +0 -0
  188. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_tools/bash/__init__.py +0 -0
  189. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_tools/bash/test_router_git.py +0 -0
  190. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_tools/bash/test_router_safety.py +0 -0
  191. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_tools/bash/test_router_sed_grep.py +0 -0
  192. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_tools/bash/test_tool.py +0 -0
  193. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_tools/file/__init__.py +0 -0
  194. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_tools/file/test_coverage_fingerprint.py +0 -0
  195. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_tools/file/test_edit_anchors.py +0 -0
  196. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_tools/file/test_edit_bounds_input.py +0 -0
  197. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_tools/file/test_edit_coverage.py +0 -0
  198. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_tools/file/test_edit_drift_fallback.py +0 -0
  199. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_tools/file/test_edit_drift_fallback_e2e.py +0 -0
  200. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_tools/file/test_edit_errors.py +0 -0
  201. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_tools/file/test_edit_llm_messages.py +0 -0
  202. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_tools/file/test_edit_replace.py +0 -0
  203. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_tools/file/test_edit_trailing_newline.py +0 -0
  204. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_tools/file/test_read.py +0 -0
  205. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_tools/file/test_read_write.py +0 -0
  206. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_tools/file/test_render_numbered_diff.py +0 -0
  207. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_tools/file/test_write_file.py +0 -0
  208. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_tools/test_clarify_tool.py +0 -0
  209. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_tools/test_diffing.py +0 -0
  210. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_tools/test_file_tools_redesign.py +0 -0
  211. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_tools/test_git_tool_destructive.py +0 -0
  212. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_tools/test_git_tool_phase5.py +0 -0
  213. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_tools/test_git_tool_raw_permissions.py +0 -0
  214. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_tools/test_git_tool_schema_errors.py +0 -0
  215. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_tools/test_git_tool_structured.py +0 -0
  216. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_tools/test_infer_state_patch.py +0 -0
  217. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_tools/test_interactive_tools.py +0 -0
  218. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_tools/test_interactive_tools_write.py +0 -0
  219. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_tools/test_load_doc_template.py +0 -0
  220. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_tools/test_loop_integration.py +0 -0
  221. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_tools/test_loop_registry.py +0 -0
  222. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_tools/test_make_interact_callback.py +0 -0
  223. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_tools/test_plan_checkpoint.py +0 -0
  224. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_tools/test_powershell_tool.py +0 -0
  225. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_tools/test_powershell_tool_phase6.py +0 -0
  226. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_tools/test_replace_failure_logging.py +0 -0
  227. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_tools/test_resolve_safe.py +0 -0
  228. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_tools/test_retry.py +0 -0
  229. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_tools/test_schedule_wakeup.py +0 -0
  230. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_tools/test_search.py +0 -0
  231. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_tools/test_shell_tool_phase6.py +0 -0
  232. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_tools/test_skills_tool.py +0 -0
  233. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_tools/test_state_update_from_executed_tools.py +0 -0
  234. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_tools/test_task_tracker.py +0 -0
  235. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_tools/test_todo_tool.py +0 -0
  236. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_tools/test_tool_error_handling.py +0 -0
  237. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_tools/test_tool_registry.py +0 -0
  238. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_tools/test_tool_state_patch.py +0 -0
  239. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_tools/test_user_interaction_models.py +0 -0
  240. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_tools/test_web_mcp.py +0 -0
  241. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_tools/test_webfetch.py +0 -0
  242. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_tools/test_workflow_tool.py +0 -0
  243. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_ui/gateway/__init__.py +0 -0
  244. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_ui/gateway/conftest.py +0 -0
  245. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_ui/gateway/helpers.py +0 -0
  246. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_ui/gateway/test_adapter.py +0 -0
  247. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_ui/gateway/test_diff_review.py +0 -0
  248. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_ui/gateway/test_gateway_headless_frontend.py +0 -0
  249. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_ui/gateway/test_gateway_v2_crud_diff.py +0 -0
  250. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_ui/gateway/test_gateway_v2_dispatch.py +0 -0
  251. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_ui/gateway/test_gateway_v2_server.py +0 -0
  252. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_ui/gateway/test_gateway_v2_session.py +0 -0
  253. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_ui/gateway/test_guidance_fallback.py +0 -0
  254. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_ui/gateway/test_run_manager.py +0 -0
  255. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_ui/gateway/test_terminal.py +0 -0
  256. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_ui/gateway/test_ui_events_dock_bus.py +0 -0
  257. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_ui/gateway/test_ui_events_dock_prompts.py +0 -0
  258. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_ui/gateway/test_ui_events_dock_status.py +0 -0
  259. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_ui/gateway/test_ui_events_streaming.py +0 -0
  260. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_ui/gateway/test_ui_events_subagent.py +0 -0
  261. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_ui/gateway/test_ui_events_todo.py +0 -0
  262. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_ui/gateway/test_ui_gateway.py +0 -0
  263. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_ui/output/__init__.py +0 -0
  264. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_ui/output/test_console_app.py +0 -0
  265. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_ui/output/test_dock_formatting.py +0 -0
  266. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_ui/output/test_fmt_args.py +0 -0
  267. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_ui/output/test_output_browse.py +0 -0
  268. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_ui/output/test_scrollback_flush.py +0 -0
  269. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_ui/output/test_tool_display.py +0 -0
  270. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_ui/output/test_tree_smoke.py +0 -0
  271. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_ui/output/test_ui_diff.py +0 -0
  272. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_ui/output/test_ui_session_changes.py +0 -0
  273. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_ui/protocol/__init__.py +0 -0
  274. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_ui/protocol/test_dto.py +0 -0
  275. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_ui/protocol/test_v2_envelope.py +0 -0
  276. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_ui/protocol/test_v2_methods.py +0 -0
  277. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_ui/protocol/test_v2_snapshot.py +0 -0
  278. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_ui/protocol/test_v2_threads.py +0 -0
  279. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_ui/test_display_policy.py +0 -0
  280. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_ui/test_file_picker.py +0 -0
  281. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_ui/tools/__init__.py +0 -0
  282. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_ui/tools/test_clipboard_image.py +0 -0
  283. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_ui/tools/test_clipboard_image_windows.py +0 -0
  284. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_ui/tools/test_clipboard_text.py +0 -0
  285. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_ui/tools/test_clipboard_text_windows.py +0 -0
  286. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_ui/tools/test_code_ide.py +0 -0
  287. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_voidx_entrypoint.py +0 -0
  288. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_wheel_build.py +0 -0
  289. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_wheel_verify_cwd.py +0 -0
  290. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_workflow/__init__.py +0 -0
  291. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_workflow/test_auto_advance.py +0 -0
  292. {voidx-3.7.3 → voidx-3.7.5}/src/tests/test_workflow/test_workflow_reconcile.py +0 -0
  293. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/agent/__init__.py +0 -0
  294. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/agent/agents.py +0 -0
  295. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/agent/attachments.py +0 -0
  296. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/agent/goal_resolver.py +0 -0
  297. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/agent/graph/__init__.py +0 -0
  298. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/agent/graph/compaction.py +0 -0
  299. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/agent/graph/compaction_coordinator.py +0 -0
  300. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/agent/graph/contracts.py +0 -0
  301. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/agent/graph/convergence.py +0 -0
  302. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/agent/graph/core/__init__.py +0 -0
  303. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/agent/graph/core/context.py +0 -0
  304. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/agent/graph/core/helpers.py +0 -0
  305. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/agent/graph/core/llm.py +0 -0
  306. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/agent/graph/core/loop.py +0 -0
  307. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/agent/graph/core/turn.py +0 -0
  308. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/agent/graph/core/voidx_graph.py +0 -0
  309. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/agent/graph/run_loop.py +0 -0
  310. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/agent/graph/runtime.py +0 -0
  311. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/agent/graph/runtime_guards.py +0 -0
  312. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/agent/graph/session_mixin.py +0 -0
  313. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/agent/graph/session_runtime.py +0 -0
  314. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/agent/graph/streaming.py +0 -0
  315. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/agent/graph/title_mixin.py +0 -0
  316. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/agent/graph/todo_events.py +0 -0
  317. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/agent/graph/tool_execution.py +0 -0
  318. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/agent/graph/tool_executor/__init__.py +0 -0
  319. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/agent/graph/tool_executor/executor.py +0 -0
  320. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/agent/graph/tool_executor/guards.py +0 -0
  321. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/agent/graph/tool_executor/helpers.py +0 -0
  322. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/agent/graph/tool_executor/types.py +0 -0
  323. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/agent/graph/tool_executor/ui.py +0 -0
  324. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/agent/graph/tool_executor/workflow.py +0 -0
  325. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/agent/graph/topology.py +0 -0
  326. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/agent/graph/transcript_mixin.py +0 -0
  327. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/agent/graph/turn_control.py +0 -0
  328. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/agent/graph/turn_metrics.py +0 -0
  329. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/agent/graph/turn_mixin.py +0 -0
  330. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/agent/graph/wiring.py +0 -0
  331. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/agent/graph/workflow_utils.py +0 -0
  332. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/agent/loop/__init__.py +0 -0
  333. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/agent/loop/prompt_source.py +0 -0
  334. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/agent/loop/slash.py +0 -0
  335. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/agent/message_rows.py +0 -0
  336. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/agent/message_trimming.py +0 -0
  337. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/agent/runtime_context.py +0 -0
  338. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/agent/slash/__init__.py +0 -0
  339. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/agent/slash/code_ide.py +0 -0
  340. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/agent/slash/guide.py +0 -0
  341. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/agent/slash/handler.py +0 -0
  342. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/agent/slash/host.py +0 -0
  343. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/agent/slash/init.py +0 -0
  344. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/agent/slash/lsp.py +0 -0
  345. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/agent/slash/mcp.py +0 -0
  346. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/agent/slash/model.py +0 -0
  347. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/agent/slash/profile.py +0 -0
  348. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/agent/slash/runtime.py +0 -0
  349. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/agent/slash/session.py +0 -0
  350. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/agent/slash/skills.py +0 -0
  351. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/agent/slash/upgrade.py +0 -0
  352. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/agent/state.py +0 -0
  353. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/agent/task_state.py +0 -0
  354. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/agent/todo_state.py +0 -0
  355. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/agent/tool_call_ids.py +0 -0
  356. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/agent/tool_exchange_sanitizer.py +0 -0
  357. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/agent/tool_filters.py +0 -0
  358. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/agent/tool_messages.py +0 -0
  359. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/agent/tool_result_storage.py +0 -0
  360. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/config/__init__.py +0 -0
  361. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/config/defaults.py +0 -0
  362. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/config/enums.py +0 -0
  363. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/config/models.py +0 -0
  364. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/config/settings.py +0 -0
  365. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/config/settings_agent.py +0 -0
  366. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/config/settings_api_keys.py +0 -0
  367. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/config/settings_code_ide.py +0 -0
  368. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/config/settings_custom.py +0 -0
  369. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/config/settings_mcp.py +0 -0
  370. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/config/settings_permissions.py +0 -0
  371. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/config/settings_retry.py +0 -0
  372. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/config/settings_skills.py +0 -0
  373. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/config/settings_update.py +0 -0
  374. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/config/settings_utils.py +0 -0
  375. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/config/settings_web.py +0 -0
  376. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/data/__init__.py +0 -0
  377. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/data/documents/README.md +0 -0
  378. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/data/documents/templates/api-doc.md +0 -0
  379. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/data/documents/templates/capability-spec.md +0 -0
  380. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/data/documents/templates/implementation-spec.md +0 -0
  381. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/data/documents/templates/prd.md +0 -0
  382. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/data/documents/templates/readme.md +0 -0
  383. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/data/documents/templates/rfc.md +0 -0
  384. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/data/documents/templates/tasks.md +0 -0
  385. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/data/documents/templates/tech-design.md +0 -0
  386. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/data/documents/voidx-guide/README.md +0 -0
  387. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/data/documents/voidx-guide/context.md +0 -0
  388. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/data/documents/voidx-guide/debug.md +0 -0
  389. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/data/documents/voidx-guide/extension.md +0 -0
  390. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/data/documents/voidx-guide/mode.md +0 -0
  391. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/data/documents/voidx-guide/model.md +0 -0
  392. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/data/documents/voidx-guide/permission.md +0 -0
  393. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/data/documents/voidx-guide/preferences.md +0 -0
  394. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/data/documents/voidx-guide/quickstart.md +0 -0
  395. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/data/documents/voidx-guide/reference.md +0 -0
  396. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/data/documents/voidx-guide/session.md +0 -0
  397. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/data/documents/voidx-guide/upgrade.md +0 -0
  398. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/data/documents/voidx-guide/web.md +0 -0
  399. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/data/documents/voidx-guide/workflow.md +0 -0
  400. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/diffing.py +0 -0
  401. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/llm/__init__.py +0 -0
  402. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/llm/catalog.py +0 -0
  403. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/llm/compaction.py +0 -0
  404. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/llm/context.py +0 -0
  405. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/llm/instruction.py +0 -0
  406. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/llm/message_markers.py +0 -0
  407. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/llm/message_status.py +0 -0
  408. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/llm/provider.py +0 -0
  409. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/llm/service.py +0 -0
  410. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/llm/usage.py +0 -0
  411. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/logging/__init__.py +0 -0
  412. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/logging/external.py +0 -0
  413. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/logging/internal_error.py +0 -0
  414. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/logging/request_log.py +0 -0
  415. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/logging/tool_log.py +0 -0
  416. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/lsp/__init__.py +0 -0
  417. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/lsp/client.py +0 -0
  418. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/lsp/config.py +0 -0
  419. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/lsp/detector.py +0 -0
  420. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/lsp/detector_data.py +0 -0
  421. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/lsp/errors.py +0 -0
  422. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/lsp/manager.py +0 -0
  423. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/lsp/schema.py +0 -0
  424. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/lsp/service.py +0 -0
  425. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/main.py +0 -0
  426. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/mcp/__init__.py +0 -0
  427. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/mcp/client/__init__.py +0 -0
  428. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/mcp/client/base.py +0 -0
  429. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/mcp/client/errors.py +0 -0
  430. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/mcp/client/http_transport.py +0 -0
  431. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/mcp/client/sse_transport.py +0 -0
  432. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/mcp/client/stdio_transport.py +0 -0
  433. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/mcp/manager.py +0 -0
  434. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/mcp/schema.py +0 -0
  435. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/mcp/tool.py +0 -0
  436. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/mcp_servers/__init__.py +0 -0
  437. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/mcp_servers/web.py +0 -0
  438. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/memory/__init__.py +0 -0
  439. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/memory/cleanup.py +0 -0
  440. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/memory/context_frames.py +0 -0
  441. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/memory/jsonl_store.py +0 -0
  442. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/memory/model_profiles.py +0 -0
  443. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/memory/runtime_state.py +0 -0
  444. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/memory/service.py +0 -0
  445. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/memory/session.py +0 -0
  446. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/memory/store.py +0 -0
  447. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/memory/subagents.py +0 -0
  448. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/memory/transcript.py +0 -0
  449. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/paths.py +0 -0
  450. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/permission/__init__.py +0 -0
  451. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/permission/constants.py +0 -0
  452. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/permission/context.py +0 -0
  453. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/permission/engine.py +0 -0
  454. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/permission/evaluate.py +0 -0
  455. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/permission/git_policy.py +0 -0
  456. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/permission/grants.py +0 -0
  457. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/permission/process_sandbox.py +0 -0
  458. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/permission/risk.py +0 -0
  459. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/permission/rules.py +0 -0
  460. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/permission/sandbox.py +0 -0
  461. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/permission/schema.py +0 -0
  462. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/permission/service.py +0 -0
  463. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/permission/shell_policy.py +0 -0
  464. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/permission/wildcard.py +0 -0
  465. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/runtime/__init__.py +0 -0
  466. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/runtime/_win32_jobs.py +0 -0
  467. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/runtime/attachments.py +0 -0
  468. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/runtime/intent.py +0 -0
  469. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/runtime/processes.py +0 -0
  470. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/runtime/reference_tokens.py +0 -0
  471. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/runtime/task_state.py +0 -0
  472. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/runtime/todo.py +0 -0
  473. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/runtime/ui.py +0 -0
  474. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/runtime/ui_port.py +0 -0
  475. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/selfupdate.py +0 -0
  476. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/skills/__init__.py +0 -0
  477. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/skills/context.py +0 -0
  478. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/skills/references.py +0 -0
  479. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/skills/registry.py +0 -0
  480. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/skills/schema.py +0 -0
  481. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/skills/service.py +0 -0
  482. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/tools/__init__.py +0 -0
  483. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/tools/agent.py +0 -0
  484. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/tools/base.py +0 -0
  485. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/tools/bash/__init__.py +0 -0
  486. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/tools/bash/core.py +0 -0
  487. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/tools/bash/hint/__init__.py +0 -0
  488. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/tools/bash/hint/file.py +0 -0
  489. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/tools/bash/hint/git.py +0 -0
  490. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/tools/bash/hint/search.py +0 -0
  491. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/tools/bash/router.py +0 -0
  492. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/tools/bash/safety.py +0 -0
  493. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/tools/bash/tool.py +0 -0
  494. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/tools/checkpoint.py +0 -0
  495. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/tools/clarify.py +0 -0
  496. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/tools/compact.py +0 -0
  497. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/tools/document.py +0 -0
  498. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/tools/file/__init__.py +0 -0
  499. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/tools/file/manage.py +0 -0
  500. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/tools/file/read.py +0 -0
  501. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/tools/file/replace_resolve.py +0 -0
  502. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/tools/file/state.py +0 -0
  503. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/tools/file/types.py +0 -0
  504. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/tools/git/__init__.py +0 -0
  505. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/tools/git/access.py +0 -0
  506. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/tools/git/constants.py +0 -0
  507. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/tools/git/handlers.py +0 -0
  508. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/tools/git/models.py +0 -0
  509. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/tools/git/parsers.py +0 -0
  510. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/tools/git/process.py +0 -0
  511. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/tools/git/results.py +0 -0
  512. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/tools/git/routing.py +0 -0
  513. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/tools/git/tool.py +0 -0
  514. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/tools/lsp.py +0 -0
  515. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/tools/powershell/__init__.py +0 -0
  516. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/tools/powershell/core.py +0 -0
  517. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/tools/powershell/hint/__init__.py +0 -0
  518. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/tools/powershell/hint/file.py +0 -0
  519. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/tools/powershell/hint/search.py +0 -0
  520. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/tools/powershell/router.py +0 -0
  521. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/tools/powershell/safety.py +0 -0
  522. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/tools/powershell/sandbox.py +0 -0
  523. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/tools/powershell/tool.py +0 -0
  524. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/tools/registry.py +0 -0
  525. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/tools/retry.py +0 -0
  526. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/tools/schedule_wakeup.py +0 -0
  527. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/tools/service.py +0 -0
  528. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/tools/shell/__init__.py +0 -0
  529. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/tools/shell/hint/__init__.py +0 -0
  530. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/tools/shell/hint/git.py +0 -0
  531. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/tools/skills.py +0 -0
  532. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/tools/task_status.py +0 -0
  533. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/tools/task_tracker.py +0 -0
  534. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/tools/todo.py +0 -0
  535. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/tools/web/__init__.py +0 -0
  536. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/tools/web/content.py +0 -0
  537. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/tools/web/fetch.py +0 -0
  538. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/tools/web/mcp.py +0 -0
  539. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/tools/web/search.py +0 -0
  540. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/tools/workflow.py +0 -0
  541. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/ui/__init__.py +0 -0
  542. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/ui/command_catalog.py +0 -0
  543. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/ui/commands.py +0 -0
  544. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/ui/frontend.py +0 -0
  545. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/ui/gateway/__init__.py +0 -0
  546. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/ui/gateway/adapter.py +0 -0
  547. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/ui/gateway/bootstrap.py +0 -0
  548. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/ui/gateway/diff_review.py +0 -0
  549. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/ui/gateway/frontend.py +0 -0
  550. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/ui/gateway/run_manager.py +0 -0
  551. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/ui/gateway/server.py +0 -0
  552. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/ui/gateway/session/__init__.py +0 -0
  553. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/ui/gateway/session/consumer.py +0 -0
  554. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/ui/gateway/session/method/__init__.py +0 -0
  555. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/ui/gateway/session/method/diff.py +0 -0
  556. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/ui/gateway/session/method/integrations.py +0 -0
  557. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/ui/gateway/session/method/sessions.py +0 -0
  558. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/ui/gateway/session/method/settings.py +0 -0
  559. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/ui/gateway/session/method/terminal.py +0 -0
  560. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/ui/gateway/terminal.py +0 -0
  561. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/ui/output/__init__.py +0 -0
  562. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/ui/output/agent_display.py +0 -0
  563. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/ui/output/ansi_marker.py +0 -0
  564. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/ui/output/browse.py +0 -0
  565. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/ui/output/capture.py +0 -0
  566. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/ui/output/console/__init__.py +0 -0
  567. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/ui/output/console/app.py +0 -0
  568. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/ui/output/console/formatting.py +0 -0
  569. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/ui/output/console/streaming.py +0 -0
  570. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/ui/output/diff.py +0 -0
  571. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/ui/output/display_policy.py +0 -0
  572. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/ui/output/dock/__init__.py +0 -0
  573. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/ui/output/dock/agent_placeholder.py +0 -0
  574. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/ui/output/dock/app.py +0 -0
  575. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/ui/output/dock/formatting.py +0 -0
  576. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/ui/output/dock/nodes.py +0 -0
  577. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/ui/output/dock/nodes_checkpoint.py +0 -0
  578. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/ui/output/dock/nodes_clarify.py +0 -0
  579. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/ui/output/dock/nodes_permission.py +0 -0
  580. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/ui/output/dock/nodes_startup.py +0 -0
  581. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/ui/output/dock/nodes_status.py +0 -0
  582. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/ui/output/dock/state.py +0 -0
  583. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/ui/output/dock/status.py +0 -0
  584. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/ui/output/dock/stream.py +0 -0
  585. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/ui/output/dock/todo.py +0 -0
  586. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/ui/output/events/__init__.py +0 -0
  587. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/ui/output/events/consumers.py +0 -0
  588. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/ui/output/events/schema.py +0 -0
  589. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/ui/output/manage_display.py +0 -0
  590. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/ui/output/tool_display.py +0 -0
  591. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/ui/output/tree.py +0 -0
  592. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/ui/output/types.py +0 -0
  593. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/ui/protocol/__init__.py +0 -0
  594. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/ui/protocol/commands.py +0 -0
  595. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/ui/protocol/requests.py +0 -0
  596. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/ui/protocol/schema.py +0 -0
  597. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/ui/protocol/transcript.py +0 -0
  598. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/ui/protocol/v2/__init__.py +0 -0
  599. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/ui/protocol/v2/envelope.py +0 -0
  600. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/ui/protocol/v2/methods.py +0 -0
  601. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/ui/protocol/v2/snapshot.py +0 -0
  602. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/ui/protocol/v2/threads.py +0 -0
  603. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/ui/session.py +0 -0
  604. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/ui/tools/__init__.py +0 -0
  605. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/ui/tools/attachment_tokens.py +0 -0
  606. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/ui/tools/clipboard_image.py +0 -0
  607. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/ui/tools/clipboard_text.py +0 -0
  608. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/ui/tools/code_ide.py +0 -0
  609. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/ui/tools/file_picker.py +0 -0
  610. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/ui/tools/skill_picker.py +0 -0
  611. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/ui/transcript.py +0 -0
  612. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/workflow/auto_advance.py +0 -0
  613. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/workflow/context.py +0 -0
  614. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/workflow/dag.py +0 -0
  615. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/workflow/reconcile.py +0 -0
  616. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/workflow/route.py +0 -0
  617. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/workflow/runtime.py +0 -0
  618. {voidx-3.7.3 → voidx-3.7.5}/src/voidx/workflow/types.py +0 -0
  619. {voidx-3.7.3 → voidx-3.7.5}/src/voidx.egg-info/dependency_links.txt +0 -0
  620. {voidx-3.7.3 → voidx-3.7.5}/src/voidx.egg-info/entry_points.txt +0 -0
  621. {voidx-3.7.3 → voidx-3.7.5}/src/voidx.egg-info/requires.txt +0 -0
  622. {voidx-3.7.3 → voidx-3.7.5}/src/voidx.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: voidx
3
- Version: 3.7.3
3
+ Version: 3.7.5
4
4
  Summary: A coding agent that quantifies everything and solves with tools, not fuzzy prompts.
5
5
  Author: chikhamx
6
6
  License: MIT
@@ -241,6 +241,56 @@ async def test_graph_authorization_never_approves_mixed_blocked_batch(tmp_path):
241
241
  assert [item.tool_call["id"] for item in asked[1]] == ["ask"]
242
242
 
243
243
 
244
+ @pytest.mark.asyncio
245
+ async def test_full_access_workflow_gate_advisory_allows_without_approval(tmp_path):
246
+ graph = _graph(tmp_path)
247
+ graph._permission.set_permission_mode("full_access")
248
+
249
+ async def fail_if_asked(_tool_calls):
250
+ pytest.fail("workflow gate should not prompt for approval under full_access")
251
+
252
+ graph._ask_tool_permission = fail_if_asked
253
+
254
+ approved, denied = await graph._authorize_tool_calls(
255
+ [{"name": "write", "args": {"file_path": "app.py", "content": "x"}, "id": "call_1"}],
256
+ plan_mode=False,
257
+ session_id="test",
258
+ workflow_runs=[
259
+ WorkflowRunState(name="brainstorm", status=WorkflowRunStatus.ACTIVE),
260
+ ],
261
+ )
262
+
263
+ assert [call["id"] for call in approved] == ["call_1"]
264
+ assert denied == []
265
+
266
+
267
+ @pytest.mark.asyncio
268
+ async def test_safe_mode_workflow_gate_still_prompts(tmp_path):
269
+ """Under safe mode, workflow gate advisory does not bypass permission approval."""
270
+ graph = _graph(tmp_path)
271
+ graph._permission.set_permission_mode("safe")
272
+ asked: list = []
273
+
274
+ async def approve(tool_calls):
275
+ asked.extend(tool_calls)
276
+ return "y"
277
+
278
+ graph._ask_tool_permission = approve
279
+
280
+ approved, denied = await graph._authorize_tool_calls(
281
+ [{"name": "write", "args": {"file_path": "app.py", "content": "x"}, "id": "call_1"}],
282
+ plan_mode=False,
283
+ session_id="test",
284
+ workflow_runs=[
285
+ WorkflowRunState(name="brainstorm", status=WorkflowRunStatus.ACTIVE),
286
+ ],
287
+ )
288
+
289
+ assert [call["id"] for call in approved] == ["call_1"]
290
+ assert denied == []
291
+ assert len(asked) > 0
292
+
293
+
244
294
  @pytest.mark.asyncio
245
295
  async def test_graph_authorization_asks_for_write_by_active_workflow_gate(tmp_path):
246
296
  graph = _graph(tmp_path)
@@ -269,7 +319,14 @@ async def test_graph_authorization_asks_for_write_by_active_workflow_gate(tmp_pa
269
319
  @pytest.mark.asyncio
270
320
  async def test_graph_authorization_uses_current_workflow_gate_only(tmp_path):
271
321
  graph = _graph(tmp_path)
272
-
322
+ asked: list[list[dict]] = []
323
+
324
+ async def approve(tool_calls):
325
+ asked.append(tool_calls)
326
+ return "y"
327
+
328
+ graph._ask_tool_permission = approve
329
+
273
330
  approved, denied = await graph._authorize_tool_calls(
274
331
  [{
275
332
  "name": "edit",
@@ -285,12 +342,14 @@ async def test_graph_authorization_uses_current_workflow_gate_only(tmp_path):
285
342
  ],
286
343
  )
287
344
 
345
+ assert [[call["id"] for call in _asked_tool_calls(batch)] for batch in asked] == [["call_1"]]
288
346
  assert [call["id"] for call in approved] == ["call_1"]
289
347
  assert denied == []
290
348
 
291
349
 
292
350
  @pytest.mark.asyncio
293
- async def test_graph_authorization_allows_plan_gate_doc_paths_only(tmp_path):
351
+ async def test_graph_authorization_plan_gate_no_longer_bypasses_doc_paths(tmp_path):
352
+ """allowed_paths bypass removed: both docs and src edits go through normal permission."""
294
353
  graph = _graph(tmp_path)
295
354
  asked: list[list[dict]] = []
296
355
 
@@ -321,16 +380,23 @@ async def test_graph_authorization_allows_plan_gate_doc_paths_only(tmp_path):
321
380
  ],
322
381
  )
323
382
 
324
- assert [call["id"] for call in approved] == ["call_docs"]
325
- assert [[call["id"] for call in _asked_tool_calls(batch)] for batch in asked] == [["call_src"]]
326
- assert [call["id"] for call, _reason in denied] == ["call_src"]
327
- assert denied[0][1] == "User denied: replace"
383
+ assert approved == []
384
+ assert [call["id"] for call, _reason in denied] == ["call_docs", "call_src"]
385
+ assert all(reason == "User denied: replace" for _tc, reason in denied)
328
386
 
329
387
 
330
388
  @pytest.mark.asyncio
331
- async def test_graph_authorization_allowed_paths_match_nested_docs(tmp_path):
389
+ async def test_graph_authorization_nested_docs_go_through_normal_permission(tmp_path):
390
+ """allowed_paths bypass removed: nested docs edits go through normal permission."""
332
391
  graph = _graph(tmp_path)
333
-
392
+ asked: list[list[dict]] = []
393
+
394
+ async def approve(tool_calls):
395
+ asked.append(tool_calls)
396
+ return "y"
397
+
398
+ graph._ask_tool_permission = approve
399
+
334
400
  approved, denied = await graph._authorize_tool_calls(
335
401
  [{
336
402
  "name": "edit",
@@ -345,6 +411,7 @@ async def test_graph_authorization_allowed_paths_match_nested_docs(tmp_path):
345
411
  ],
346
412
  )
347
413
 
414
+ assert [[call["id"] for call in _asked_tool_calls(batch)] for batch in asked] == [["call_nested_docs"]]
348
415
  assert [call["id"] for call in approved] == ["call_nested_docs"]
349
416
  assert denied == []
350
417
 
@@ -33,6 +33,23 @@ async def test_fixed_loop_fires_after_interval(tmp_path) -> None:
33
33
  assert host.turns[:1] == ["tick"]
34
34
 
35
35
 
36
+ @pytest.mark.asyncio
37
+ async def test_first_fire_is_immediate(tmp_path) -> None:
38
+ host = FakeHost()
39
+ idle = asyncio.Event()
40
+ idle.set()
41
+ manager = LoopManager(host, idle_event=idle, workspace=str(tmp_path))
42
+
43
+ manager.start(PromptSource.from_raw("tick"), 60)
44
+ for _ in range(20):
45
+ if host.turns:
46
+ break
47
+ await asyncio.sleep(0.005)
48
+ await manager.cleanup()
49
+
50
+ assert host.turns[:1] == ["tick"]
51
+
52
+
36
53
  @pytest.mark.asyncio
37
54
  async def test_stop_cancels_active_loop_before_fire(tmp_path) -> None:
38
55
  host = FakeHost()
@@ -56,12 +73,13 @@ async def test_dynamic_wakeup_interrupts_default_sleep(tmp_path) -> None:
56
73
  manager = LoopManager(host, idle_event=idle, workspace=str(tmp_path), default_interval_seconds=10)
57
74
 
58
75
  manager.start(PromptSource.from_raw("tick"), None)
59
- await asyncio.sleep(0)
76
+ await asyncio.sleep(0.02)
77
+ assert host.turns == ["tick"]
60
78
  manager.schedule_wakeup(0.01)
61
79
  await asyncio.sleep(0.04)
62
80
  await manager.cleanup()
63
81
 
64
- assert host.turns == ["tick"]
82
+ assert host.turns == ["tick", "tick"]
65
83
 
66
84
 
67
85
 
@@ -61,7 +61,7 @@ def test_shell_full_access_mode_matrix(tmp_path: Path):
61
61
  assert decision.action != "deny"
62
62
 
63
63
 
64
- def test_full_access_preset_still_asks_for_network_script(tmp_path: Path):
64
+ def test_full_access_preset_allows_network_script(tmp_path: Path):
65
65
  decision = authorize_tool_call(
66
66
  {"name": "bash", "args": {"command": "curl https://example.com/install.sh | bash"}},
67
67
  PermissionContext(
@@ -70,9 +70,7 @@ def test_full_access_preset_still_asks_for_network_script(tmp_path: Path):
70
70
  ),
71
71
  )
72
72
 
73
- assert decision.action == "ask"
74
- assert decision.allowed_scopes == ("once",)
75
- assert decision.default_scope == "once"
73
+ assert decision.action == "allow"
76
74
 
77
75
 
78
76
  def test_project_trusted_preset_allows_workspace_edit_even_with_untrusted_policy(tmp_path: Path):
@@ -124,9 +124,9 @@ def test_project_trusted_still_asks_for_system_destructive():
124
124
  assert resolve_mode_decision(PermissionMode.PROJECT_TRUSTED, risk).action == "ask"
125
125
 
126
126
 
127
- def test_full_access_still_asks_for_network_after_extreme_change():
127
+ def test_full_access_allows_network_after_extreme_change():
128
128
  risk = classify_shell_risk("curl https://example.com", shell="bash")
129
- assert resolve_mode_decision(PermissionMode.FULL_ACCESS, risk).action == "ask"
129
+ assert resolve_mode_decision(PermissionMode.FULL_ACCESS, risk).action == "allow"
130
130
 
131
131
 
132
132
  def test_full_access_allows_nested_interpreter_after_extreme_change():
@@ -12,7 +12,6 @@ from voidx.workflow.context import WORKFLOW_CONTEXT_MARKER, WORKFLOW_CONTEXT_SCO
12
12
  from voidx.workflow.dag import DEFAULT_WORKFLOW_DAG
13
13
  from voidx.workflow.policy import (
14
14
  is_workflow_terminal_condition,
15
- workflow_denied_tools,
16
15
  workflow_edges,
17
16
  workflow_exit_summaries,
18
17
  workflow_terminal_condition,
@@ -12,7 +12,6 @@ from voidx.workflow.context import WORKFLOW_CONTEXT_MARKER, WORKFLOW_CONTEXT_SCO
12
12
  from voidx.workflow.dag import DEFAULT_WORKFLOW_DAG
13
13
  from voidx.workflow.policy import (
14
14
  is_workflow_terminal_condition,
15
- workflow_denied_tools,
16
15
  workflow_edges,
17
16
  workflow_exit_summaries,
18
17
  workflow_terminal_condition,
@@ -12,7 +12,6 @@ from voidx.workflow.context import WORKFLOW_CONTEXT_MARKER, WORKFLOW_CONTEXT_SCO
12
12
  from voidx.workflow.dag import DEFAULT_WORKFLOW_DAG
13
13
  from voidx.workflow.policy import (
14
14
  is_workflow_terminal_condition,
15
- workflow_denied_tools,
16
15
  workflow_edges,
17
16
  workflow_exit_summaries,
18
17
  workflow_terminal_condition,
@@ -160,10 +159,6 @@ def test_workflow_state_summary_includes_transition_hint():
160
159
  assert "next=verify" in run.state_summary()
161
160
 
162
161
 
163
- def test_workflow_denied_tools_aggregates_all_active_gates():
164
- assert workflow_denied_tools(["debug", "tdd"]) >= {"manage", "write", "replace"}
165
-
166
-
167
162
  def test_feedback_workflow_exposes_design_and_plan_exits():
168
163
  assert workflow_transitions("feedback") == (
169
164
  "tdd",
@@ -0,0 +1,342 @@
1
+ """Tests for bash/powershell auto-route to git tool via maybe_route_hint."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import json
6
+ import os
7
+
8
+ import pytest
9
+
10
+ from voidx.tools.base import ToolContext
11
+ from voidx.tools.registry import ToolRegistry
12
+ from voidx.tools.shell.common import RouteHint
13
+ from voidx.tools.bash.router import try_hint
14
+
15
+
16
+ # ---------------------------------------------------------------------------
17
+ # Helpers
18
+ # ---------------------------------------------------------------------------
19
+
20
+
21
+ def _make_ctx(tmp_path, registry: ToolRegistry | None = None) -> ToolContext:
22
+ return ToolContext(
23
+ workspace=str(tmp_path),
24
+ permission_mode="full_access",
25
+ tool_registry=registry,
26
+ )
27
+
28
+
29
+ def _make_registry() -> ToolRegistry:
30
+ return ToolRegistry()
31
+
32
+
33
+ # ---------------------------------------------------------------------------
34
+ # 1. bash git auto-route 结构化输出
35
+ # ---------------------------------------------------------------------------
36
+
37
+
38
+ class TestBashGitAutoRouteStructured:
39
+ """bash git command auto-routes to git tool and returns structured output."""
40
+
41
+ @pytest.mark.asyncio
42
+ async def test_git_status_structured(self, tmp_path):
43
+ import subprocess
44
+ subprocess.run(["git", "init", str(tmp_path)], check=True, capture_output=True)
45
+ subprocess.run(
46
+ ["git", "config", "user.email", "test@test.com"],
47
+ cwd=str(tmp_path), check=True, capture_output=True,
48
+ )
49
+ subprocess.run(
50
+ ["git", "config", "user.name", "Test"],
51
+ cwd=str(tmp_path), check=True, capture_output=True,
52
+ )
53
+ (tmp_path / "file.txt").write_text("hello")
54
+ subprocess.run(["git", "add", "."], cwd=str(tmp_path), check=True, capture_output=True)
55
+ subprocess.run(
56
+ ["git", "commit", "-m", "init"],
57
+ cwd=str(tmp_path), check=True, capture_output=True,
58
+ )
59
+
60
+ r = _make_registry()
61
+ ctx = _make_ctx(tmp_path, r)
62
+ result = await r.execute_tool("bash", {"command": "git status --porcelain"}, ctx)
63
+
64
+ data = json.loads(result.output)
65
+ assert "ok" in data
66
+ assert data["ok"] is True
67
+ assert result.metadata.get("routed_from") == "bash"
68
+ assert result.metadata.get("routed_command") == "git status --porcelain"
69
+
70
+ @pytest.mark.asyncio
71
+ async def test_git_log_structured(self, tmp_path):
72
+ import subprocess
73
+ subprocess.run(["git", "init", str(tmp_path)], check=True, capture_output=True)
74
+ subprocess.run(
75
+ ["git", "config", "user.email", "test@test.com"],
76
+ cwd=str(tmp_path), check=True, capture_output=True,
77
+ )
78
+ subprocess.run(
79
+ ["git", "config", "user.name", "Test"],
80
+ cwd=str(tmp_path), check=True, capture_output=True,
81
+ )
82
+ (tmp_path / "file.txt").write_text("hello")
83
+ subprocess.run(["git", "add", "."], cwd=str(tmp_path), check=True, capture_output=True)
84
+ subprocess.run(
85
+ ["git", "commit", "-m", "init"],
86
+ cwd=str(tmp_path), check=True, capture_output=True,
87
+ )
88
+
89
+ r = _make_registry()
90
+ ctx = _make_ctx(tmp_path, r)
91
+ result = await r.execute_tool("bash", {"command": "git log --oneline -1"}, ctx)
92
+
93
+ data = json.loads(result.output)
94
+ assert data["ok"] is True
95
+ assert result.metadata.get("routed_from") == "bash"
96
+
97
+
98
+ # ---------------------------------------------------------------------------
99
+ # 2. bash git auto-route 带路径
100
+ # ---------------------------------------------------------------------------
101
+
102
+
103
+ class TestBashGitAutoRouteWithPath:
104
+ """bash git -C <path> auto-routes with path passed to git tool."""
105
+
106
+ @pytest.mark.asyncio
107
+ async def test_git_with_C_flag_routes_with_path(self, tmp_path):
108
+ import subprocess
109
+ repo = tmp_path / "repo"
110
+ repo.mkdir()
111
+ subprocess.run(["git", "init", str(repo)], check=True, capture_output=True)
112
+ subprocess.run(
113
+ ["git", "config", "user.email", "test@test.com"],
114
+ cwd=str(repo), check=True, capture_output=True,
115
+ )
116
+ subprocess.run(
117
+ ["git", "config", "user.name", "Test"],
118
+ cwd=str(repo), check=True, capture_output=True,
119
+ )
120
+ (repo / "file.txt").write_text("hello")
121
+ subprocess.run(["git", "add", "."], cwd=str(repo), check=True, capture_output=True)
122
+ subprocess.run(
123
+ ["git", "commit", "-m", "init"],
124
+ cwd=str(repo), check=True, capture_output=True,
125
+ )
126
+
127
+ r = _make_registry()
128
+ ctx = _make_ctx(tmp_path, r)
129
+ result = await r.execute_tool(
130
+ "bash", {"command": f"git -C {repo} status --porcelain"}, ctx
131
+ )
132
+
133
+ data = json.loads(result.output)
134
+ assert data["ok"] is True
135
+ assert result.metadata.get("routed_from") == "bash"
136
+ assert result.metadata.get("routed_tool_args", {}).get("path") == str(repo)
137
+
138
+
139
+ # ---------------------------------------------------------------------------
140
+ # 3. bash git 破坏性命令拦截
141
+ # ---------------------------------------------------------------------------
142
+
143
+
144
+ class TestBashGitDestructiveDenied:
145
+ """Destructive git commands are denied by git tool policy even via auto-route."""
146
+
147
+ @pytest.mark.asyncio
148
+ async def test_git_reset_hard_denied(self, tmp_path):
149
+ import subprocess
150
+ subprocess.run(["git", "init", str(tmp_path)], check=True, capture_output=True)
151
+ subprocess.run(
152
+ ["git", "config", "user.email", "test@test.com"],
153
+ cwd=str(tmp_path), check=True, capture_output=True,
154
+ )
155
+ subprocess.run(
156
+ ["git", "config", "user.name", "Test"],
157
+ cwd=str(tmp_path), check=True, capture_output=True,
158
+ )
159
+ (tmp_path / "file.txt").write_text("hello")
160
+ subprocess.run(["git", "add", "."], cwd=str(tmp_path), check=True, capture_output=True)
161
+ subprocess.run(
162
+ ["git", "commit", "-m", "init"],
163
+ cwd=str(tmp_path), check=True, capture_output=True,
164
+ )
165
+
166
+ r = _make_registry()
167
+ ctx = _make_ctx(tmp_path, r)
168
+ result = await r.execute_tool("bash", {"command": "git reset --hard"}, ctx)
169
+
170
+ data = json.loads(result.output)
171
+ assert data["ok"] is False
172
+ assert "command_denied" in data.get("error", "")
173
+ assert result.metadata.get("routed_from") == "bash"
174
+
175
+
176
+ # ---------------------------------------------------------------------------
177
+ # 4. bash 非 git 命令不受影响
178
+ # ---------------------------------------------------------------------------
179
+
180
+
181
+ class TestBashNonGitUnaffected:
182
+ """Non-git bash commands still execute normally."""
183
+
184
+ @pytest.mark.asyncio
185
+ async def test_echo_hello_not_routed(self, tmp_path):
186
+ r = _make_registry()
187
+ ctx = _make_ctx(tmp_path, r)
188
+ result = await r.execute_tool("bash", {"command": "echo hello"}, ctx)
189
+
190
+ data = json.loads(result.output)
191
+ assert data["ok"] is True
192
+ assert "hello" in data["stdout"]
193
+ assert "routed_from" not in result.metadata
194
+
195
+
196
+ # ---------------------------------------------------------------------------
197
+ # 5. bash hint 无 registry 时降级
198
+ # ---------------------------------------------------------------------------
199
+
200
+
201
+ class TestBashHintFallbackNoRegistry:
202
+ """When ctx.tool_registry is None, falls back to hint-only result."""
203
+
204
+ @pytest.mark.asyncio
205
+ async def test_no_registry_returns_hint(self, tmp_path):
206
+ r = _make_registry()
207
+ ctx = _make_ctx(tmp_path, registry=None)
208
+ result = await r.execute_tool("bash", {"command": "git status"}, ctx)
209
+
210
+ assert result.metadata.get("skipped") is True
211
+ assert result.metadata.get("route_hint", {}).get("tool_id") == "git"
212
+ assert "routed_from" not in result.metadata
213
+
214
+
215
+ # ---------------------------------------------------------------------------
216
+ # 7. RouteHint tool_args 默认 None(非 git hint)
217
+ # ---------------------------------------------------------------------------
218
+
219
+
220
+ class TestRouteHintToolArgsDefaultNone:
221
+ """Non-git hints keep tool_args=None and preserve old hint-only behavior."""
222
+
223
+ def test_cat_hint_tool_args_none(self):
224
+ h = try_hint("cat file.py")
225
+ assert h is not None
226
+ assert h.tool_id == "read"
227
+ assert h.tool_args is None
228
+
229
+ def test_grep_hint_tool_args_none(self):
230
+ h = try_hint("grep -r foo .")
231
+ assert h is not None
232
+ assert h.tool_id == "grep"
233
+ assert h.tool_args is None
234
+
235
+ def test_find_hint_tool_args_none(self):
236
+ h = try_hint("find . -name '*.py'")
237
+ assert h is not None
238
+ assert h.tool_id == "glob"
239
+ assert h.tool_args is None
240
+
241
+
242
+ # ---------------------------------------------------------------------------
243
+ # 8. bash git 含 -c 配置时降级
244
+ # ---------------------------------------------------------------------------
245
+
246
+
247
+ class TestBashGitConfigFlagFallback:
248
+ """git -c key=value falls back to hint-only (tool_args=None)."""
249
+
250
+ @pytest.mark.asyncio
251
+ async def test_git_with_c_flag_returns_hint(self, tmp_path):
252
+ r = _make_registry()
253
+ ctx = _make_ctx(tmp_path, r)
254
+ result = await r.execute_tool(
255
+ "bash", {"command": "git -c core.autocrlf=true status"}, ctx
256
+ )
257
+
258
+ assert result.metadata.get("skipped") is True
259
+ assert result.metadata.get("route_hint", {}).get("tool_id") == "git"
260
+ assert "routed_from" not in result.metadata
261
+
262
+
263
+ # ---------------------------------------------------------------------------
264
+ # 9. bash git --git-dir 不 hint
265
+ # ---------------------------------------------------------------------------
266
+
267
+
268
+ class TestBashGitGlobalDirNoHint:
269
+ """git --git-dir=x does not produce a hint — runs as raw shell command."""
270
+
271
+ @pytest.mark.asyncio
272
+ async def test_git_dir_runs_as_shell(self, tmp_path):
273
+ r = _make_registry()
274
+ ctx = _make_ctx(tmp_path, r)
275
+ result = await r.execute_tool(
276
+ "bash", {"command": "git --git-dir=/nonexistent status"}, ctx
277
+ )
278
+
279
+ assert result.metadata.get("skipped") is not True
280
+ assert "routed_from" not in result.metadata
281
+
282
+
283
+ # ---------------------------------------------------------------------------
284
+ # 10. filtered registry 降级
285
+ # ---------------------------------------------------------------------------
286
+
287
+
288
+ class TestBashFilteredRegistryFallback:
289
+ """When registry excludes git tool, falls back to hint-only result."""
290
+
291
+ @pytest.mark.asyncio
292
+ async def test_filtered_registry_returns_hint(self, tmp_path):
293
+ r = _make_registry()
294
+ r.filter_tools({"bash"})
295
+ ctx = _make_ctx(tmp_path, r)
296
+ result = await r.execute_tool("bash", {"command": "git status"}, ctx)
297
+
298
+ assert result.metadata.get("skipped") is True
299
+ assert result.metadata.get("route_hint", {}).get("tool_id") == "git"
300
+ assert "routed_from" not in result.metadata
301
+
302
+
303
+ # ---------------------------------------------------------------------------
304
+ # 11. try_hint 异常安全
305
+ # ---------------------------------------------------------------------------
306
+
307
+
308
+ class TestTryHintExceptionSafety:
309
+ """try_hint catches all exceptions and returns None."""
310
+
311
+ def test_exception_returns_none(self, monkeypatch):
312
+ def boom(*a, **kw):
313
+ raise RuntimeError("parser crash")
314
+
315
+ monkeypatch.setattr("voidx.tools.bash.router._try_hint_impl", boom)
316
+ assert try_hint("git status") is None
317
+
318
+
319
+ # ---------------------------------------------------------------------------
320
+ # 6. powershell git auto-route (skipped on non-Windows)
321
+ # ---------------------------------------------------------------------------
322
+
323
+
324
+ @pytest.mark.skipif(os.name == "nt", reason="powershell tool only on Windows")
325
+ class TestPowerShellGitAutoRouteSkipped:
326
+ """PowerShell auto-route is skipped on non-Windows platforms."""
327
+
328
+ def test_powershell_not_registered_on_unix(self):
329
+ r = _make_registry()
330
+ assert r.get("powershell") is None
331
+
332
+
333
+ @pytest.mark.skipif(os.name != "nt", reason="powershell tool only on Windows")
334
+ class TestPowerShellGitAutoRoute:
335
+ """PowerShell git auto-route on Windows."""
336
+
337
+ @pytest.mark.asyncio
338
+ async def test_powershell_git_routes(self, tmp_path):
339
+ r = _make_registry()
340
+ ctx = _make_ctx(tmp_path, r)
341
+ result = await r.execute_tool("powershell", {"command": "git status"}, ctx)
342
+ assert result.metadata.get("routed_from") == "powershell"