voidx 3.4.3__tar.gz → 3.5.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (546) hide show
  1. {voidx-3.4.3 → voidx-3.5.1}/LICENSE +21 -21
  2. {voidx-3.4.3/src/voidx.egg-info → voidx-3.5.1}/PKG-INFO +100 -100
  3. {voidx-3.4.3 → voidx-3.5.1}/pyproject.toml +64 -64
  4. {voidx-3.4.3 → voidx-3.5.1}/setup.cfg +4 -4
  5. voidx-3.5.1/src/tests/conftest.py +17 -0
  6. voidx-3.5.1/src/tests/test_agent/conftest.py +101 -0
  7. voidx-3.5.1/src/tests/test_agent/graph/run_loop_helpers.py +107 -0
  8. voidx-3.5.1/src/tests/test_agent/graph/stream_llm_helpers.py +252 -0
  9. voidx-3.5.1/src/tests/test_agent/graph/test_call_llm_compaction.py +629 -0
  10. voidx-3.5.1/src/tests/test_agent/graph/test_call_llm_compaction_advanced.py +247 -0
  11. voidx-3.5.1/src/tests/test_agent/graph/test_call_llm_tools.py +336 -0
  12. voidx-3.5.1/src/tests/test_agent/graph/test_compaction_flow.py +462 -0
  13. voidx-3.5.1/src/tests/test_agent/graph/test_compaction_flow_run_once.py +370 -0
  14. voidx-3.5.1/src/tests/test_agent/graph/test_convergence.py +74 -0
  15. voidx-3.5.1/src/tests/test_agent/graph/test_execute_tools_guard.py +671 -0
  16. voidx-3.5.1/src/tests/test_agent/graph/test_execute_tools_todo.py +439 -0
  17. voidx-3.5.1/src/tests/test_agent/graph/test_graph_authorization.py +478 -0
  18. voidx-3.5.1/src/tests/test_agent/graph/test_graph_setup_prompts.py +351 -0
  19. voidx-3.5.1/src/tests/test_agent/graph/test_guards_tool_op.py +301 -0
  20. voidx-3.5.1/src/tests/test_agent/graph/test_parallel_subagents.py +420 -0
  21. voidx-3.5.1/src/tests/test_agent/graph/test_parallel_subagents_dedup.py +391 -0
  22. voidx-3.5.1/src/tests/test_agent/graph/test_prepare_workflow.py +354 -0
  23. voidx-3.5.1/src/tests/test_agent/graph/test_run_loop_startup.py +469 -0
  24. voidx-3.5.1/src/tests/test_agent/graph/test_run_loop_title_lsp.py +157 -0
  25. voidx-3.5.1/src/tests/test_agent/graph/test_run_loop_title_misc.py +174 -0
  26. voidx-3.5.1/src/tests/test_agent/graph/test_run_loop_workflow.py +172 -0
  27. voidx-3.5.1/src/tests/test_agent/graph/test_run_loop_workflow_advanced.py +148 -0
  28. voidx-3.5.1/src/tests/test_agent/graph/test_runtime_guards.py +401 -0
  29. voidx-3.5.1/src/tests/test_agent/graph/test_session_context_frames.py +199 -0
  30. voidx-3.5.1/src/tests/test_agent/graph/test_session_crud.py +420 -0
  31. voidx-3.5.1/src/tests/test_agent/graph/test_session_messages.py +468 -0
  32. voidx-3.5.1/src/tests/test_agent/graph/test_session_persistence.py +545 -0
  33. voidx-3.5.1/src/tests/test_agent/graph/test_session_run_once.py +341 -0
  34. voidx-3.5.1/src/tests/test_agent/graph/test_session_runtime_state.py +406 -0
  35. voidx-3.5.1/src/tests/test_agent/graph/test_session_transcript.py +484 -0
  36. voidx-3.5.1/src/tests/test_agent/graph/test_stream_llm_sanitization.py +527 -0
  37. voidx-3.5.1/src/tests/test_agent/graph/test_subagent_persistence.py +389 -0
  38. voidx-3.5.1/src/tests/test_agent/graph/test_subagent_runner.py +416 -0
  39. voidx-3.5.1/src/tests/test_agent/graph/test_subagent_step_budget.py +375 -0
  40. voidx-3.5.1/src/tests/test_agent/graph/test_subagent_step_budget_convergence.py +364 -0
  41. voidx-3.5.1/src/tests/test_agent/graph/test_subagent_step_budget_final.py +515 -0
  42. voidx-3.5.1/src/tests/test_agent/graph/test_todo_events.py +290 -0
  43. voidx-3.5.1/src/tests/test_agent/graph/test_tool_execution_auth.py +386 -0
  44. voidx-3.5.1/src/tests/test_agent/graph/test_tool_result_preview.py +248 -0
  45. voidx-3.5.1/src/tests/test_agent/graph/test_workflow_done.py +314 -0
  46. voidx-3.5.1/src/tests/test_agent/graph/test_workflow_review.py +319 -0
  47. voidx-3.5.1/src/tests/test_agent/graph/test_workflow_transactions.py +315 -0
  48. voidx-3.5.1/src/tests/test_agent/graph/test_workflow_transactions_barrier.py +350 -0
  49. voidx-3.5.1/src/tests/test_agent/slash/__init__.py +0 -0
  50. voidx-3.5.1/src/tests/test_agent/slash/test_slash_init.py +97 -0
  51. voidx-3.5.1/src/tests/test_agent/slash/test_slash_mcp.py +185 -0
  52. voidx-3.5.1/src/tests/test_agent/slash/test_slash_model.py +521 -0
  53. voidx-3.5.1/src/tests/test_agent/slash/test_slash_model_advanced.py +466 -0
  54. voidx-3.5.1/src/tests/test_agent/slash/test_slash_session.py +453 -0
  55. voidx-3.5.1/src/tests/test_agent/slash/test_slash_skills.py +84 -0
  56. voidx-3.5.1/src/tests/test_agent/slash/test_slash_tavily.py +197 -0
  57. voidx-3.5.1/src/tests/test_agent/slash/test_slash_upgrade.py +108 -0
  58. voidx-3.5.1/src/tests/test_agent/test_attachments.py +185 -0
  59. voidx-3.5.1/src/tests/test_agent/test_file_rwlock.py +304 -0
  60. voidx-3.5.1/src/tests/test_agent/test_goal_resolver.py +557 -0
  61. voidx-3.5.1/src/tests/test_agent/test_goal_resolver_advanced.py +400 -0
  62. voidx-3.5.1/src/tests/test_agent/test_message_trimming_parsers.py +214 -0
  63. voidx-3.5.1/src/tests/test_agent/test_message_trimming_rules.py +493 -0
  64. voidx-3.5.1/src/tests/test_agent/test_module_boundaries.py +240 -0
  65. voidx-3.5.1/src/tests/test_agent/test_permission.py +480 -0
  66. voidx-3.5.1/src/tests/test_agent/test_permission_append.py +21 -0
  67. voidx-3.5.1/src/tests/test_agent/test_prompts.py +53 -0
  68. voidx-3.5.1/src/tests/test_agent/test_runtime_context_builder.py +555 -0
  69. voidx-3.5.1/src/tests/test_agent/test_runtime_context_prompts.py +40 -0
  70. voidx-3.5.1/src/tests/test_agent/test_runtime_context_skill_stripping.py +288 -0
  71. voidx-3.5.1/src/tests/test_agent/test_task_state.py +216 -0
  72. voidx-3.5.1/src/tests/test_agent/test_task_state_rendering.py +229 -0
  73. voidx-3.5.1/src/tests/test_agent/test_todo_replay_sanitization.py +60 -0
  74. voidx-3.5.1/src/tests/test_agent/test_tool_exchange_sanitizer.py +166 -0
  75. voidx-3.5.1/src/tests/test_agent/test_tool_filters_gemini.py +124 -0
  76. voidx-3.5.1/src/tests/test_agent/test_tool_messages.py +19 -0
  77. voidx-3.5.1/src/tests/test_agent/test_tool_result_storage.py +101 -0
  78. voidx-3.5.1/src/tests/test_config/__init__.py +0 -0
  79. voidx-3.5.1/src/tests/test_config/test_config.py +354 -0
  80. voidx-3.5.1/src/tests/test_config/test_config_advanced.py +500 -0
  81. {voidx-3.4.3 → voidx-3.5.1/src}/tests/test_install_sh.py +476 -476
  82. voidx-3.5.1/src/tests/test_llm/conftest.py +60 -0
  83. voidx-3.5.1/src/tests/test_llm/test_compaction_retry.py +500 -0
  84. voidx-3.5.1/src/tests/test_llm/test_fallback_summary.py +110 -0
  85. voidx-3.5.1/src/tests/test_llm/test_gemini_provider.py +347 -0
  86. voidx-3.5.1/src/tests/test_llm/test_instruction_cache.py +88 -0
  87. voidx-3.5.1/src/tests/test_llm/test_llm_catalog.py +49 -0
  88. voidx-3.5.1/src/tests/test_llm/test_llm_provider.py +387 -0
  89. voidx-3.5.1/src/tests/test_llm/test_llm_provider_advanced.py +379 -0
  90. voidx-3.5.1/src/tests/test_llm/test_llm_usage.py +211 -0
  91. voidx-3.5.1/src/tests/test_llm/test_overflow_threshold.py +83 -0
  92. voidx-3.5.1/src/tests/test_llm/test_prune_args.py +451 -0
  93. voidx-3.5.1/src/tests/test_llm/test_request_log.py +315 -0
  94. voidx-3.5.1/src/tests/test_llm/test_streaming_sanitize.py +102 -0
  95. voidx-3.5.1/src/tests/test_llm/test_token_counting.py +377 -0
  96. voidx-3.5.1/src/tests/test_logging/test_internal_error.py +67 -0
  97. voidx-3.5.1/src/tests/test_logging/test_tool_log.py +117 -0
  98. voidx-3.5.1/src/tests/test_lsp/__init__.py +0 -0
  99. voidx-3.5.1/src/tests/test_lsp/test_lsp.py +359 -0
  100. voidx-3.5.1/src/tests/test_lsp/test_lsp_advanced.py +331 -0
  101. voidx-3.5.1/src/tests/test_mcp/__init__.py +0 -0
  102. voidx-3.5.1/src/tests/test_mcp/test_mcp.py +376 -0
  103. voidx-3.5.1/src/tests/test_memory/__init__.py +0 -0
  104. voidx-3.5.1/src/tests/test_memory/test_main.py +76 -0
  105. voidx-3.5.1/src/tests/test_memory/test_main_startup.py +129 -0
  106. voidx-3.5.1/src/tests/test_memory/test_schema_migration.py +111 -0
  107. {voidx-3.4.3 → voidx-3.5.1/src}/tests/test_npm_package.py +357 -323
  108. voidx-3.5.1/src/tests/test_permission/__init__.py +0 -0
  109. voidx-3.5.1/src/tests/test_runtime/__init__.py +0 -0
  110. voidx-3.5.1/src/tests/test_runtime/test_goal_resolution_refactor.py +125 -0
  111. voidx-3.5.1/src/tests/test_runtime/test_runtime_ui.py +112 -0
  112. voidx-3.5.1/src/tests/test_selfupdate/__init__.py +0 -0
  113. voidx-3.5.1/src/tests/test_selfupdate/test_selfupdate.py +103 -0
  114. voidx-3.5.1/src/tests/test_skills/__init__.py +0 -0
  115. voidx-3.5.1/src/tests/test_skills/conftest.py +14 -0
  116. voidx-3.5.1/src/tests/test_skills/test_create_skill.py +154 -0
  117. voidx-3.5.1/src/tests/test_skills/test_skill_parsing.py +264 -0
  118. voidx-3.5.1/src/tests/test_skills/test_skill_references.py +356 -0
  119. voidx-3.5.1/src/tests/test_skills/test_workflow_advance.py +495 -0
  120. voidx-3.5.1/src/tests/test_tools/__init__.py +0 -0
  121. voidx-3.5.1/src/tests/test_tools/bash/__init__.py +0 -0
  122. voidx-3.5.1/src/tests/test_tools/bash/test_router_git.py +318 -0
  123. voidx-3.5.1/src/tests/test_tools/bash/test_router_safety.py +94 -0
  124. voidx-3.5.1/src/tests/test_tools/bash/test_router_sed_grep.py +376 -0
  125. voidx-3.5.1/src/tests/test_tools/bash/test_tool.py +165 -0
  126. voidx-3.5.1/src/tests/test_tools/file_ops/__init__.py +0 -0
  127. voidx-3.5.1/src/tests/test_tools/file_ops/test_coverage_fingerprint.py +579 -0
  128. voidx-3.5.1/src/tests/test_tools/file_ops/test_edit_anchors.py +297 -0
  129. voidx-3.5.1/src/tests/test_tools/file_ops/test_edit_bounds_input.py +102 -0
  130. voidx-3.5.1/src/tests/test_tools/file_ops/test_edit_coverage.py +180 -0
  131. voidx-3.5.1/src/tests/test_tools/file_ops/test_edit_dedup.py +298 -0
  132. voidx-3.5.1/src/tests/test_tools/file_ops/test_edit_drift_fallback.py +121 -0
  133. voidx-3.5.1/src/tests/test_tools/file_ops/test_edit_drift_fallback_e2e.py +190 -0
  134. voidx-3.5.1/src/tests/test_tools/file_ops/test_edit_errors.py +136 -0
  135. voidx-3.5.1/src/tests/test_tools/file_ops/test_edit_line_insert.py +217 -0
  136. voidx-3.5.1/src/tests/test_tools/file_ops/test_edit_llm_messages.py +80 -0
  137. voidx-3.5.1/src/tests/test_tools/file_ops/test_edit_replace.py +391 -0
  138. voidx-3.5.1/src/tests/test_tools/file_ops/test_edit_trailing_newline.py +296 -0
  139. voidx-3.5.1/src/tests/test_tools/file_ops/test_read.py +402 -0
  140. voidx-3.5.1/src/tests/test_tools/file_ops/test_read_write.py +309 -0
  141. voidx-3.5.1/src/tests/test_tools/file_ops/test_write_file.py +360 -0
  142. voidx-3.5.1/src/tests/test_tools/test_clarify_tool.py +285 -0
  143. voidx-3.5.1/src/tests/test_tools/test_diffing.py +128 -0
  144. voidx-3.5.1/src/tests/test_tools/test_git_tool_destructive.py +94 -0
  145. voidx-3.5.1/src/tests/test_tools/test_git_tool_raw_permissions.py +391 -0
  146. voidx-3.5.1/src/tests/test_tools/test_git_tool_schema_errors.py +144 -0
  147. voidx-3.5.1/src/tests/test_tools/test_git_tool_structured.py +431 -0
  148. voidx-3.5.1/src/tests/test_tools/test_infer_state_patch.py +72 -0
  149. voidx-3.5.1/src/tests/test_tools/test_interactive_tools.py +454 -0
  150. voidx-3.5.1/src/tests/test_tools/test_interactive_tools_write.py +430 -0
  151. voidx-3.5.1/src/tests/test_tools/test_load_doc_template.py +68 -0
  152. voidx-3.5.1/src/tests/test_tools/test_make_interact_callback.py +201 -0
  153. voidx-3.5.1/src/tests/test_tools/test_plan_checkpoint.py +445 -0
  154. voidx-3.5.1/src/tests/test_tools/test_powershell_tool.py +385 -0
  155. voidx-3.5.1/src/tests/test_tools/test_replace_failure_logging.py +142 -0
  156. voidx-3.5.1/src/tests/test_tools/test_resolve_safe.py +68 -0
  157. voidx-3.5.1/src/tests/test_tools/test_search.py +456 -0
  158. voidx-3.5.1/src/tests/test_tools/test_skills_tool.py +244 -0
  159. voidx-3.5.1/src/tests/test_tools/test_state_update_from_executed_tools.py +267 -0
  160. voidx-3.5.1/src/tests/test_tools/test_task_tracker.py +165 -0
  161. voidx-3.5.1/src/tests/test_tools/test_todo_tool.py +26 -0
  162. voidx-3.5.1/src/tests/test_tools/test_tool_error_handling.py +220 -0
  163. voidx-3.5.1/src/tests/test_tools/test_tool_registry.py +122 -0
  164. voidx-3.5.1/src/tests/test_tools/test_tool_schemas.py +178 -0
  165. voidx-3.5.1/src/tests/test_tools/test_tool_state_patch.py +57 -0
  166. voidx-3.5.1/src/tests/test_tools/test_user_interaction_models.py +58 -0
  167. voidx-3.5.1/src/tests/test_tools/test_web_mcp.py +280 -0
  168. voidx-3.5.1/src/tests/test_tools/test_webfetch.py +157 -0
  169. voidx-3.5.1/src/tests/test_tools/test_workflow_tool.py +634 -0
  170. voidx-3.5.1/src/tests/test_ui/gateway/__init__.py +0 -0
  171. voidx-3.5.1/src/tests/test_ui/gateway/conftest.py +44 -0
  172. voidx-3.5.1/src/tests/test_ui/gateway/helpers.py +23 -0
  173. voidx-3.5.1/src/tests/test_ui/gateway/test_adapter.py +473 -0
  174. voidx-3.5.1/src/tests/test_ui/gateway/test_diff_review.py +217 -0
  175. voidx-3.5.1/src/tests/test_ui/gateway/test_gateway_v2_crud_diff.py +336 -0
  176. voidx-3.5.1/src/tests/test_ui/gateway/test_gateway_v2_dispatch.py +306 -0
  177. voidx-3.5.1/src/tests/test_ui/gateway/test_gateway_v2_routing.py +480 -0
  178. voidx-3.5.1/src/tests/test_ui/gateway/test_gateway_v2_server.py +527 -0
  179. voidx-3.5.1/src/tests/test_ui/gateway/test_gateway_v2_session.py +301 -0
  180. voidx-3.5.1/src/tests/test_ui/gateway/test_run_manager.py +183 -0
  181. voidx-3.5.1/src/tests/test_ui/gateway/test_terminal.py +279 -0
  182. voidx-3.5.1/src/tests/test_ui/gateway/test_ui_events_dock_bus.py +206 -0
  183. voidx-3.5.1/src/tests/test_ui/gateway/test_ui_events_dock_prompts.py +471 -0
  184. voidx-3.5.1/src/tests/test_ui/gateway/test_ui_events_dock_status.py +355 -0
  185. voidx-3.5.1/src/tests/test_ui/gateway/test_ui_events_streaming.py +349 -0
  186. voidx-3.5.1/src/tests/test_ui/gateway/test_ui_events_subagent.py +454 -0
  187. voidx-3.5.1/src/tests/test_ui/gateway/test_ui_events_todo.py +336 -0
  188. voidx-3.5.1/src/tests/test_ui/gateway/test_ui_gateway.py +396 -0
  189. voidx-3.5.1/src/tests/test_ui/output/__init__.py +0 -0
  190. voidx-3.5.1/src/tests/test_ui/output/test_dock_formatting.py +97 -0
  191. voidx-3.5.1/src/tests/test_ui/output/test_fmt_args.py +50 -0
  192. voidx-3.5.1/src/tests/test_ui/output/test_output_browse.py +22 -0
  193. voidx-3.5.1/src/tests/test_ui/output/test_scrollback_flush.py +150 -0
  194. voidx-3.5.1/src/tests/test_ui/output/test_tree_smoke.py +327 -0
  195. voidx-3.5.1/src/tests/test_ui/output/test_ui_diff.py +88 -0
  196. voidx-3.5.1/src/tests/test_ui/output/test_ui_session_changes.py +131 -0
  197. voidx-3.5.1/src/tests/test_ui/protocol/__init__.py +0 -0
  198. voidx-3.5.1/src/tests/test_ui/protocol/test_dto.py +151 -0
  199. voidx-3.5.1/src/tests/test_ui/protocol/test_v2_envelope.py +173 -0
  200. voidx-3.5.1/src/tests/test_ui/protocol/test_v2_methods.py +107 -0
  201. voidx-3.5.1/src/tests/test_ui/protocol/test_v2_snapshot.py +84 -0
  202. voidx-3.5.1/src/tests/test_ui/protocol/test_v2_threads.py +84 -0
  203. voidx-3.5.1/src/tests/test_ui/test_display_policy.py +166 -0
  204. voidx-3.5.1/src/tests/test_ui/test_file_picker.py +68 -0
  205. voidx-3.5.1/src/tests/test_ui/tools/__init__.py +0 -0
  206. voidx-3.5.1/src/tests/test_ui/tools/test_clipboard_image.py +99 -0
  207. voidx-3.5.1/src/tests/test_ui/tools/test_clipboard_image_windows.py +216 -0
  208. voidx-3.5.1/src/tests/test_ui/tools/test_clipboard_text.py +22 -0
  209. voidx-3.5.1/src/tests/test_ui/tools/test_clipboard_text_windows.py +53 -0
  210. voidx-3.5.1/src/tests/test_ui/tools/test_code_ide.py +74 -0
  211. voidx-3.5.1/src/tests/test_workflow/__init__.py +0 -0
  212. voidx-3.5.1/src/tests/test_workflow/test_auto_advance.py +412 -0
  213. voidx-3.5.1/src/tests/test_workflow/test_workflow_reconcile.py +338 -0
  214. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/__init__.py +3 -3
  215. voidx-3.5.1/src/voidx/agent/__init__.py +0 -0
  216. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/agent/agents.py +77 -77
  217. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/agent/attachments.py +386 -345
  218. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/agent/goal_resolver.py +444 -443
  219. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/agent/graph/compaction.py +97 -97
  220. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/agent/graph/compaction_coordinator.py +675 -683
  221. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/agent/graph/contracts.py +245 -241
  222. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/agent/graph/convergence.py +87 -87
  223. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/agent/graph/core/__init__.py +9 -9
  224. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/agent/graph/core/helpers.py +176 -126
  225. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/agent/graph/core/llm.py +470 -441
  226. voidx-3.4.3/src/voidx/agent/graph/core/_voidx_graph.py → voidx-3.5.1/src/voidx/agent/graph/core/voidx_graph.py +591 -460
  227. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/agent/graph/permissions.py +196 -196
  228. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/agent/graph/run_loop.py +419 -391
  229. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/agent/graph/runtime.py +10 -10
  230. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/agent/graph/runtime_guards.py +496 -469
  231. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/agent/graph/session_mixin.py +38 -38
  232. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/agent/graph/session_runtime.py +296 -292
  233. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/agent/graph/streaming.py +611 -611
  234. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/agent/graph/subagent.py +454 -453
  235. voidx-3.5.1/src/voidx/agent/graph/thread_context.py +171 -0
  236. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/agent/graph/title_mixin.py +100 -100
  237. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/agent/graph/todo_events.py +23 -23
  238. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/agent/graph/tool_execution.py +40 -40
  239. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/agent/graph/tool_executor/__init__.py +8 -8
  240. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/agent/graph/tool_executor/executor.py +410 -362
  241. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/agent/graph/tool_executor/guards.py +150 -150
  242. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/agent/graph/tool_executor/helpers.py +492 -347
  243. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/agent/graph/tool_executor/types.py +86 -86
  244. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/agent/graph/tool_executor/ui.py +143 -143
  245. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/agent/graph/tool_executor/workflow.py +314 -314
  246. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/agent/graph/topology.py +88 -88
  247. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/agent/graph/transcript_mixin.py +18 -18
  248. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/agent/graph/turn_mixin.py +37 -36
  249. voidx-3.5.1/src/voidx/agent/graph/turn_runner.py +513 -0
  250. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/agent/graph/wiring.py +106 -106
  251. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/agent/graph/workflow_utils.py +32 -32
  252. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/agent/message_rows.py +102 -102
  253. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/agent/message_trimming.py +511 -511
  254. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/agent/prompts.py +174 -174
  255. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/agent/runtime_context.py +607 -607
  256. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/agent/slash/code_ide.py +67 -67
  257. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/agent/slash/guide.py +18 -18
  258. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/agent/slash/handler.py +553 -557
  259. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/agent/slash/host.py +359 -359
  260. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/agent/slash/init.py +95 -95
  261. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/agent/slash/lsp.py +112 -112
  262. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/agent/slash/mcp.py +427 -427
  263. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/agent/slash/model.py +485 -463
  264. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/agent/slash/profile.py +162 -162
  265. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/agent/slash/runtime.py +74 -73
  266. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/agent/slash/session.py +253 -253
  267. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/agent/slash/skills.py +117 -117
  268. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/agent/slash/upgrade.py +98 -98
  269. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/agent/state.py +27 -27
  270. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/agent/task_state.py +31 -31
  271. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/agent/todo_state.py +278 -282
  272. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/agent/tool_call_ids.py +33 -33
  273. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/agent/tool_exchange_sanitizer.py +168 -168
  274. voidx-3.5.1/src/voidx/agent/tool_filters.py +58 -0
  275. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/agent/tool_result_storage.py +73 -73
  276. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/config/__init__.py +45 -45
  277. voidx-3.5.1/src/voidx/config/defaults.py +12 -0
  278. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/config/enums.py +60 -60
  279. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/config/models.py +124 -123
  280. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/config/permissions.py +24 -24
  281. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/config/settings.py +486 -444
  282. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/config/settings_agent.py +21 -21
  283. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/config/settings_api_keys.py +45 -45
  284. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/config/settings_code_ide.py +19 -19
  285. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/config/settings_custom.py +52 -52
  286. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/config/settings_mcp.py +69 -69
  287. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/config/settings_permissions.py +86 -86
  288. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/config/settings_skills.py +79 -79
  289. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/config/settings_update.py +68 -68
  290. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/config/settings_utils.py +9 -9
  291. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/config/settings_web.py +47 -47
  292. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/data/__init__.py +1 -1
  293. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/data/templates/api-doc.md +64 -64
  294. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/data/templates/prd.md +117 -117
  295. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/data/templates/readme.md +55 -55
  296. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/data/templates/rfc.md +38 -38
  297. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/data/templates/tech-design.md +68 -68
  298. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/diffing.py +323 -323
  299. voidx-3.5.1/src/voidx/llm/__init__.py +0 -0
  300. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/llm/catalog.py +204 -201
  301. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/llm/compaction.py +652 -652
  302. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/llm/context.py +4 -2
  303. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/llm/instruction.py +308 -307
  304. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/llm/message_markers.py +14 -14
  305. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/llm/message_status.py +12 -12
  306. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/llm/provider.py +705 -639
  307. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/llm/service.py +34 -32
  308. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/llm/usage.py +376 -376
  309. voidx-3.5.1/src/voidx/logging/__init__.py +7 -0
  310. voidx-3.5.1/src/voidx/logging/internal_error.py +77 -0
  311. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/logging/request_log.py +149 -147
  312. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/logging/tool_log.py +77 -75
  313. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/lsp/__init__.py +38 -38
  314. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/lsp/client.py +267 -266
  315. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/lsp/config.py +1 -2
  316. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/lsp/detector.py +396 -395
  317. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/lsp/detector_data.py +130 -130
  318. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/lsp/manager.py +388 -388
  319. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/lsp/schema.py +179 -179
  320. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/main.py +167 -167
  321. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/mcp/client/__init__.py +11 -11
  322. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/mcp/client/base.py +355 -354
  323. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/mcp/client/errors.py +15 -15
  324. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/mcp/client/http_transport.py +120 -120
  325. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/mcp/client/sse_transport.py +151 -151
  326. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/mcp/client/stdio_transport.py +116 -116
  327. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/memory/cleanup.py +122 -122
  328. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/memory/context_frames.py +247 -247
  329. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/memory/jsonl_store.py +188 -188
  330. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/memory/runtime_state.py +347 -347
  331. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/memory/service.py +99 -99
  332. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/memory/session.py +446 -439
  333. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/memory/store.py +265 -247
  334. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/memory/subagents.py +21 -21
  335. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/memory/transcript.py +495 -495
  336. voidx-3.5.1/src/voidx/paths.py +45 -0
  337. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/permission/context.py +59 -59
  338. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/permission/engine.py +195 -195
  339. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/permission/evaluate.py +114 -114
  340. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/permission/rules.py +404 -404
  341. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/permission/sandbox.py +304 -304
  342. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/permission/service.py +326 -326
  343. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/runtime/__init__.py +46 -46
  344. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/runtime/attachments.py +7 -7
  345. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/runtime/intent.py +46 -46
  346. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/runtime/reference_tokens.py +9 -9
  347. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/runtime/task_state.py +235 -235
  348. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/runtime/todo.py +9 -9
  349. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/runtime/ui.py +288 -254
  350. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/runtime/ui_port.py +178 -178
  351. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/selfupdate.py +209 -208
  352. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/skills/__init__.py +23 -23
  353. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/skills/context.py +115 -115
  354. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/skills/references.py +73 -73
  355. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/skills/registry.py +288 -287
  356. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/skills/schema.py +49 -49
  357. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/skills/service.py +185 -181
  358. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/tools/__init__.py +19 -19
  359. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/tools/agent.py +294 -294
  360. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/tools/base.py +230 -222
  361. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/tools/bash/__init__.py +6 -6
  362. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/tools/bash/core.py +73 -73
  363. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/tools/bash/hint/__init__.py +31 -31
  364. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/tools/bash/hint/file.py +232 -232
  365. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/tools/bash/hint/git.py +7 -7
  366. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/tools/bash/hint/search.py +271 -271
  367. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/tools/bash/router.py +69 -69
  368. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/tools/bash/safety.py +59 -59
  369. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/tools/bash/tool.py +75 -75
  370. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/tools/clarify.py +154 -152
  371. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/tools/compact_context.py +56 -56
  372. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/tools/file_ops/__init__.py +18 -18
  373. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/tools/file_ops/edit_execute.py +563 -363
  374. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/tools/file_ops/edit_resolve.py +325 -273
  375. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/tools/file_ops/file.py +187 -187
  376. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/tools/file_ops/read.py +279 -279
  377. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/tools/file_ops/types.py +35 -35
  378. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/tools/file_ops/write.py +137 -137
  379. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/tools/file_state.py +467 -467
  380. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/tools/git.py +951 -951
  381. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/tools/load_doc_template.py +67 -67
  382. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/tools/load_skills.py +12 -12
  383. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/tools/lsp.py +140 -140
  384. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/tools/plan_checkpoint.py +367 -366
  385. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/tools/powershell/__init__.py +7 -7
  386. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/tools/powershell/core.py +107 -107
  387. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/tools/powershell/hint/__init__.py +1 -1
  388. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/tools/powershell/hint/file.py +50 -50
  389. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/tools/powershell/hint/search.py +50 -50
  390. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/tools/powershell/router.py +98 -98
  391. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/tools/powershell/safety.py +70 -70
  392. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/tools/powershell/sandbox.py +241 -241
  393. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/tools/powershell/tool.py +97 -97
  394. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/tools/registry.py +146 -146
  395. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/tools/search.py +311 -305
  396. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/tools/service.py +32 -32
  397. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/tools/shell/__init__.py +21 -21
  398. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/tools/shell/common.py +165 -165
  399. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/tools/shell/hint/__init__.py +1 -1
  400. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/tools/shell/hint/git.py +44 -44
  401. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/tools/skills.py +252 -252
  402. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/tools/task_status.py +72 -72
  403. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/tools/task_tracker.py +132 -132
  404. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/tools/todo.py +289 -289
  405. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/tools/web_mcp.py +108 -108
  406. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/tools/webfetch.py +256 -256
  407. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/tools/websearch.py +285 -285
  408. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/tools/workflow.py +654 -556
  409. voidx-3.5.1/src/voidx/ui/__init__.py +0 -0
  410. voidx-3.5.1/src/voidx/ui/command_catalog.py +159 -0
  411. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/ui/commands.py +111 -111
  412. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/ui/gateway/adapter.py +547 -512
  413. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/ui/gateway/diff_review.py +210 -210
  414. voidx-3.5.1/src/voidx/ui/gateway/run_manager.py +269 -0
  415. voidx-3.5.1/src/voidx/ui/gateway/server.py +242 -0
  416. voidx-3.5.1/src/voidx/ui/gateway/session/__init__.py +4 -0
  417. voidx-3.5.1/src/voidx/ui/gateway/session/consumer.py +22 -0
  418. voidx-3.5.1/src/voidx/ui/gateway/session/core.py +399 -0
  419. voidx-3.5.1/src/voidx/ui/gateway/session/method/__init__.py +0 -0
  420. voidx-3.5.1/src/voidx/ui/gateway/session/method/diff.py +56 -0
  421. voidx-3.5.1/src/voidx/ui/gateway/session/method/integrations.py +187 -0
  422. voidx-3.5.1/src/voidx/ui/gateway/session/method/sessions.py +142 -0
  423. voidx-3.5.1/src/voidx/ui/gateway/session/method/settings.py +250 -0
  424. voidx-3.5.1/src/voidx/ui/gateway/session/method/terminal.py +64 -0
  425. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/ui/gateway/terminal.py +207 -205
  426. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/ui/output/__init__.py +2 -1
  427. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/ui/output/agent_display.py +25 -25
  428. voidx-3.5.1/src/voidx/ui/output/ansi_marker.py +10 -0
  429. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/ui/output/browse.py +174 -174
  430. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/ui/output/capture.py +180 -180
  431. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/ui/output/console/app.py +358 -358
  432. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/ui/output/console/formatting.py +104 -104
  433. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/ui/output/console/streaming.py +212 -212
  434. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/ui/output/diff.py +130 -130
  435. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/ui/output/display_policy.py +135 -137
  436. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/ui/output/dock/__init__.py +38 -30
  437. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/ui/output/dock/agent_placeholder.py +21 -21
  438. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/ui/output/dock/app.py +478 -474
  439. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/ui/output/dock/formatting.py +165 -165
  440. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/ui/output/dock/nodes.py +447 -429
  441. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/ui/output/dock/nodes_checkpoint.py +126 -126
  442. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/ui/output/dock/nodes_clarify.py +92 -92
  443. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/ui/output/dock/nodes_permission.py +49 -49
  444. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/ui/output/dock/nodes_startup.py +60 -60
  445. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/ui/output/dock/nodes_status.py +79 -79
  446. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/ui/output/dock/status.py +134 -106
  447. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/ui/output/dock/stream.py +172 -171
  448. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/ui/output/dock/todo.py +111 -111
  449. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/ui/output/events/__init__.py +121 -114
  450. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/ui/output/events/bus.py +154 -119
  451. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/ui/output/events/consumers.py +612 -604
  452. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/ui/output/events/schema.py +359 -342
  453. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/ui/output/tree.py +809 -812
  454. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/ui/output/types.py +98 -44
  455. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/ui/protocol/__init__.py +39 -59
  456. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/ui/protocol/commands.py +17 -1
  457. voidx-3.5.1/src/voidx/ui/protocol/schema.py +42 -0
  458. voidx-3.5.1/src/voidx/ui/protocol/v2/__init__.py +46 -0
  459. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/ui/protocol/v2/envelope.py +117 -116
  460. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/ui/protocol/v2/methods.py +81 -81
  461. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/ui/protocol/v2/snapshot.py +43 -37
  462. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/ui/protocol/v2/threads.py +56 -55
  463. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/ui/session.py +378 -378
  464. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/ui/tools/__init__.py +32 -32
  465. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/ui/tools/clipboard_image.py +346 -347
  466. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/ui/tools/clipboard_text.py +131 -131
  467. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/ui/tools/file_picker.py +139 -139
  468. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/ui/tools/skill_picker.py +83 -83
  469. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/ui/transcript.py +150 -150
  470. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/workflow/__init__.py +70 -70
  471. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/workflow/auto_advance.py +202 -162
  472. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/workflow/context.py +61 -61
  473. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/workflow/dag.py +30 -30
  474. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/workflow/nodes.py +415 -415
  475. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/workflow/policy.py +82 -82
  476. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/workflow/reconcile.py +293 -293
  477. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/workflow/render.py +91 -91
  478. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/workflow/route.py +49 -49
  479. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/workflow/runtime.py +281 -281
  480. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/workflow/schema.py +177 -177
  481. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/workflow/service.py +143 -143
  482. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/workflow/types.py +101 -101
  483. {voidx-3.4.3 → voidx-3.5.1/src/voidx.egg-info}/PKG-INFO +100 -100
  484. voidx-3.5.1/src/voidx.egg-info/SOURCES.txt +516 -0
  485. {voidx-3.4.3 → voidx-3.5.1}/src/voidx.egg-info/top_level.txt +1 -0
  486. voidx-3.4.3/src/voidx/agent/graph/turn_runner.py +0 -511
  487. voidx-3.4.3/src/voidx/agent/tool_filters.py +0 -24
  488. voidx-3.4.3/src/voidx/logging/__init__.py +0 -6
  489. voidx-3.4.3/src/voidx/ui/gateway/server.py +0 -114
  490. voidx-3.4.3/src/voidx/ui/gateway/session.py +0 -459
  491. voidx-3.4.3/src/voidx/ui/protocol/envelope.py +0 -76
  492. voidx-3.4.3/src/voidx/ui/protocol/schema.py +0 -30
  493. voidx-3.4.3/src/voidx/ui/protocol/v2/__init__.py +0 -5
  494. voidx-3.4.3/src/voidx/ui/tui/__init__.py +0 -4
  495. voidx-3.4.3/src/voidx/ui/tui/activity.py +0 -64
  496. voidx-3.4.3/src/voidx/ui/tui/app.py +0 -616
  497. voidx-3.4.3/src/voidx/ui/tui/choice_mixin.py +0 -59
  498. voidx-3.4.3/src/voidx/ui/tui/clipboard_mixin.py +0 -83
  499. voidx-3.4.3/src/voidx/ui/tui/helpers.py +0 -144
  500. voidx-3.4.3/src/voidx/ui/tui/input.py +0 -370
  501. voidx-3.4.3/src/voidx/ui/tui/overlays.py +0 -157
  502. voidx-3.4.3/src/voidx/ui/tui/panels.py +0 -346
  503. voidx-3.4.3/src/voidx/ui/tui/parser.py +0 -531
  504. voidx-3.4.3/src/voidx/ui/tui/render_activity.py +0 -129
  505. voidx-3.4.3/src/voidx/ui/tui/render_frame.py +0 -615
  506. voidx-3.4.3/src/voidx/ui/tui/render_input.py +0 -154
  507. voidx-3.4.3/src/voidx/ui/tui/render_status.py +0 -266
  508. voidx-3.4.3/src/voidx/ui/tui/render_todo.py +0 -79
  509. voidx-3.4.3/src/voidx/ui/tui/renderer.py +0 -24
  510. voidx-3.4.3/src/voidx/ui/tui/state.py +0 -254
  511. voidx-3.4.3/src/voidx/ui/tui/terminal_mixin.py +0 -95
  512. voidx-3.4.3/src/voidx/ui/tui/text_prompt_mixin.py +0 -49
  513. voidx-3.4.3/src/voidx.egg-info/SOURCES.txt +0 -311
  514. {voidx-3.4.3 → voidx-3.5.1}/README.md +0 -0
  515. {voidx-3.4.3/src/voidx/agent → voidx-3.5.1/src/tests}/__init__.py +0 -0
  516. {voidx-3.4.3/src/voidx/llm → voidx-3.5.1/src/tests/test_agent}/__init__.py +0 -0
  517. {voidx-3.4.3/src/voidx/ui → voidx-3.5.1/src/tests/test_agent/graph}/__init__.py +0 -0
  518. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/agent/graph/__init__.py +0 -0
  519. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/agent/slash/__init__.py +0 -0
  520. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/agent/tool_messages.py +0 -0
  521. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/lsp/errors.py +0 -0
  522. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/lsp/service.py +0 -0
  523. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/mcp/__init__.py +0 -0
  524. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/mcp/manager.py +0 -0
  525. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/mcp/schema.py +0 -0
  526. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/mcp/tool.py +0 -0
  527. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/mcp_servers/__init__.py +0 -0
  528. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/mcp_servers/web.py +0 -0
  529. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/memory/__init__.py +0 -0
  530. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/memory/model_profiles.py +0 -0
  531. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/permission/__init__.py +0 -0
  532. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/permission/schema.py +0 -0
  533. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/permission/wildcard.py +0 -0
  534. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/tools/web_content.py +0 -0
  535. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/ui/frontend.py +0 -0
  536. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/ui/gateway/__init__.py +0 -0
  537. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/ui/gateway/bootstrap.py +0 -0
  538. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/ui/output/console/__init__.py +0 -0
  539. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/ui/output/dock/state.py +0 -0
  540. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/ui/protocol/requests.py +0 -0
  541. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/ui/protocol/transcript.py +0 -0
  542. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/ui/tools/attachment_tokens.py +0 -0
  543. {voidx-3.4.3 → voidx-3.5.1}/src/voidx/ui/tools/code_ide.py +0 -0
  544. {voidx-3.4.3 → voidx-3.5.1}/src/voidx.egg-info/dependency_links.txt +0 -0
  545. {voidx-3.4.3 → voidx-3.5.1}/src/voidx.egg-info/entry_points.txt +0 -0
  546. {voidx-3.4.3 → voidx-3.5.1}/src/voidx.egg-info/requires.txt +0 -0
@@ -1,21 +1,21 @@
1
- MIT License
2
-
3
- Copyright (c) 2026 chikhamx
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
1
+ MIT License
2
+
3
+ Copyright (c) 2026 chikhamx
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -1,100 +1,100 @@
1
- Metadata-Version: 2.4
2
- Name: voidx
3
- Version: 3.4.3
4
- Summary: A coding agent that quantifies everything and solves with tools, not fuzzy prompts.
5
- Author: chikhamx
6
- License: MIT
7
- Requires-Python: >=3.11
8
- Description-Content-Type: text/markdown
9
- License-File: LICENSE
10
- Requires-Dist: langgraph>=0.3.0
11
- Requires-Dist: langchain>=0.3.0
12
- Requires-Dist: langchain-anthropic>=0.3.0
13
- Requires-Dist: langchain-openai>=0.3.0
14
- Requires-Dist: pydantic>=2.10.0
15
- Requires-Dist: pydantic-settings>=2.7.0
16
- Requires-Dist: typer>=0.15.0
17
- Requires-Dist: rich>=13.9.0
18
- Requires-Dist: tiktoken>=0.8.0
19
- Requires-Dist: httpx>=0.28.0
20
- Requires-Dist: websockets>=14
21
- Requires-Dist: pathspec>=0.12
22
- Requires-Dist: Pillow>=10.0.0; platform_system == "Windows"
23
- Provides-Extra: gemini
24
- Requires-Dist: langchain-google-genai>=4.0.0; extra == "gemini"
25
- Provides-Extra: dev
26
- Requires-Dist: build>=1.2.0; extra == "dev"
27
- Requires-Dist: pytest>=8.0.0; extra == "dev"
28
- Requires-Dist: pytest-asyncio>=0.25.0; extra == "dev"
29
- Dynamic: license-file
30
-
31
- # voidx
32
-
33
- voidx is a terminal AI coding agent built in Python.
34
-
35
- ## Install
36
-
37
- ### One-line install (no Python or npm required)
38
-
39
- macOS / Linux:
40
-
41
- ```bash
42
- curl -fsSL https://raw.githubusercontent.com/chikhamx/voidx/master/scripts/install.sh | bash
43
- ```
44
-
45
- Windows (PowerShell):
46
-
47
- ```powershell
48
- irm https://raw.githubusercontent.com/chikhamx/voidx/master/scripts/install.ps1 | iex
49
- ```
50
-
51
- The installer downloads a standalone Python runtime and sets up voidx in an
52
- isolated environment — nothing else is needed on your machine.
53
-
54
- ### pip
55
-
56
- ```bash
57
- pip install voidx
58
- voidx
59
- ```
60
-
61
- ### npm
62
-
63
- ```bash
64
- npm install -g @chikhamx/voidx
65
- voidx
66
- ```
67
-
68
- ### From source
69
-
70
- ```bash
71
- git clone https://github.com/chikhamx/voidx.git
72
- cd voidx
73
- pip install -e .
74
- voidx
75
- ```
76
-
77
- ### China / slow network
78
-
79
- Set mirror environment variables before running any install method:
80
-
81
- ```bash
82
- export VOIDX_PYTHON_MIRROR=https://npmmirror.com/mirrors/python-standalone
83
- export VOIDX_PIP_INDEX=https://pypi.tuna.tsinghua.edu.cn/simple
84
- ```
85
-
86
- ## Useful Commands
87
-
88
- ```bash
89
- voidx version
90
- voidx sessions
91
- voidx -w /path/to/project
92
- ```
93
-
94
- ## Development
95
-
96
- ```bash
97
- .venv/bin/python -m pytest
98
- .venv/bin/python scripts/package.py --format all --clean
99
- npm --prefix npm run check
100
- ```
1
+ Metadata-Version: 2.4
2
+ Name: voidx
3
+ Version: 3.5.1
4
+ Summary: A coding agent that quantifies everything and solves with tools, not fuzzy prompts.
5
+ Author: chikhamx
6
+ License: MIT
7
+ Requires-Python: >=3.11
8
+ Description-Content-Type: text/markdown
9
+ License-File: LICENSE
10
+ Requires-Dist: langgraph>=0.3.0
11
+ Requires-Dist: langchain>=0.3.0
12
+ Requires-Dist: langchain-anthropic>=0.3.0
13
+ Requires-Dist: langchain-openai>=0.3.0
14
+ Requires-Dist: pydantic>=2.10.0
15
+ Requires-Dist: pydantic-settings>=2.7.0
16
+ Requires-Dist: typer>=0.15.0
17
+ Requires-Dist: rich>=13.9.0
18
+ Requires-Dist: tiktoken>=0.8.0
19
+ Requires-Dist: httpx>=0.28.0
20
+ Requires-Dist: websockets>=14
21
+ Requires-Dist: pathspec>=0.12
22
+ Requires-Dist: Pillow>=10.0.0; platform_system == "Windows"
23
+ Provides-Extra: gemini
24
+ Requires-Dist: langchain-google-genai>=4.0.0; extra == "gemini"
25
+ Provides-Extra: dev
26
+ Requires-Dist: build>=1.2.0; extra == "dev"
27
+ Requires-Dist: pytest>=8.0.0; extra == "dev"
28
+ Requires-Dist: pytest-asyncio>=0.25.0; extra == "dev"
29
+ Dynamic: license-file
30
+
31
+ # voidx
32
+
33
+ voidx is a terminal AI coding agent built in Python.
34
+
35
+ ## Install
36
+
37
+ ### One-line install (no Python or npm required)
38
+
39
+ macOS / Linux:
40
+
41
+ ```bash
42
+ curl -fsSL https://raw.githubusercontent.com/chikhamx/voidx/master/scripts/install.sh | bash
43
+ ```
44
+
45
+ Windows (PowerShell):
46
+
47
+ ```powershell
48
+ irm https://raw.githubusercontent.com/chikhamx/voidx/master/scripts/install.ps1 | iex
49
+ ```
50
+
51
+ The installer downloads a standalone Python runtime and sets up voidx in an
52
+ isolated environment — nothing else is needed on your machine.
53
+
54
+ ### pip
55
+
56
+ ```bash
57
+ pip install voidx
58
+ voidx
59
+ ```
60
+
61
+ ### npm
62
+
63
+ ```bash
64
+ npm install -g @chikhamx/voidx
65
+ voidx
66
+ ```
67
+
68
+ ### From source
69
+
70
+ ```bash
71
+ git clone https://github.com/chikhamx/voidx.git
72
+ cd voidx
73
+ pip install -e .
74
+ voidx
75
+ ```
76
+
77
+ ### China / slow network
78
+
79
+ Set mirror environment variables before running any install method:
80
+
81
+ ```bash
82
+ export VOIDX_PYTHON_MIRROR=https://npmmirror.com/mirrors/python-standalone
83
+ export VOIDX_PIP_INDEX=https://pypi.tuna.tsinghua.edu.cn/simple
84
+ ```
85
+
86
+ ## Useful Commands
87
+
88
+ ```bash
89
+ voidx version
90
+ voidx sessions
91
+ voidx -w /path/to/project
92
+ ```
93
+
94
+ ## Development
95
+
96
+ ```bash
97
+ .venv/bin/python -m pytest
98
+ .venv/bin/python scripts/package.py --format all --clean
99
+ npm --prefix npm run check
100
+ ```
@@ -1,64 +1,64 @@
1
- [project]
2
- name = "voidx"
3
- dynamic = ["version"]
4
- description = "A coding agent that quantifies everything and solves with tools, not fuzzy prompts."
5
- license = {text = "MIT"}
6
- authors = [{name = "chikhamx"}]
7
- readme = "README.md"
8
- requires-python = ">=3.11"
9
- dependencies = [
10
- "langgraph>=0.3.0",
11
- "langchain>=0.3.0",
12
- "langchain-anthropic>=0.3.0",
13
- "langchain-openai>=0.3.0",
14
- "pydantic>=2.10.0",
15
- "pydantic-settings>=2.7.0",
16
- "typer>=0.15.0",
17
- "rich>=13.9.0",
18
- "tiktoken>=0.8.0",
19
- "httpx>=0.28.0",
20
- "websockets>=14",
21
- "pathspec>=0.12",
22
- "Pillow>=10.0.0; platform_system == 'Windows'",
23
- ]
24
-
25
- [project.scripts]
26
- voidx = "voidx.main:cli"
27
-
28
- [project.optional-dependencies]
29
- gemini = ["langchain-google-genai>=4.0.0"]
30
- dev = [
31
- "build>=1.2.0",
32
- "pytest>=8.0.0",
33
- "pytest-asyncio>=0.25.0",
34
- ]
35
-
36
- [dependency-groups]
37
- dev = [
38
- "build>=1.2.0",
39
- "pytest>=8.0.0",
40
- "pytest-asyncio>=0.25.0",
41
- ]
42
-
43
- [build-system]
44
- requires = ["setuptools>=68", "wheel"]
45
- build-backend = "setuptools.build_meta"
46
-
47
- [tool.setuptools.dynamic]
48
- version = {attr = "voidx.__version__"}
49
-
50
- [tool.setuptools.packages.find]
51
- where = ["src"]
52
-
53
- [tool.setuptools.package-data]
54
- "voidx.skills" = [
55
- "bundled/*/SKILL.md",
56
- ]
57
- "voidx.data" = [
58
- "templates/*.md",
59
- ]
60
-
61
- [tool.pytest.ini_options]
62
- asyncio_mode = "auto"
63
- pythonpath = ["src"]
64
- testpaths = ["tests"]
1
+ [project]
2
+ name = "voidx"
3
+ dynamic = ["version"]
4
+ description = "A coding agent that quantifies everything and solves with tools, not fuzzy prompts."
5
+ license = {text = "MIT"}
6
+ authors = [{name = "chikhamx"}]
7
+ readme = "README.md"
8
+ requires-python = ">=3.11"
9
+ dependencies = [
10
+ "langgraph>=0.3.0",
11
+ "langchain>=0.3.0",
12
+ "langchain-anthropic>=0.3.0",
13
+ "langchain-openai>=0.3.0",
14
+ "pydantic>=2.10.0",
15
+ "pydantic-settings>=2.7.0",
16
+ "typer>=0.15.0",
17
+ "rich>=13.9.0",
18
+ "tiktoken>=0.8.0",
19
+ "httpx>=0.28.0",
20
+ "websockets>=14",
21
+ "pathspec>=0.12",
22
+ "Pillow>=10.0.0; platform_system == 'Windows'",
23
+ ]
24
+
25
+ [project.scripts]
26
+ voidx = "voidx.main:cli"
27
+
28
+ [project.optional-dependencies]
29
+ gemini = ["langchain-google-genai>=4.0.0"]
30
+ dev = [
31
+ "build>=1.2.0",
32
+ "pytest>=8.0.0",
33
+ "pytest-asyncio>=0.25.0",
34
+ ]
35
+
36
+ [dependency-groups]
37
+ dev = [
38
+ "build>=1.2.0",
39
+ "pytest>=8.0.0",
40
+ "pytest-asyncio>=0.25.0",
41
+ ]
42
+
43
+ [build-system]
44
+ requires = ["setuptools>=68", "wheel"]
45
+ build-backend = "setuptools.build_meta"
46
+
47
+ [tool.setuptools.dynamic]
48
+ version = {attr = "voidx.__version__"}
49
+
50
+ [tool.setuptools.packages.find]
51
+ where = ["src"]
52
+
53
+ [tool.setuptools.package-data]
54
+ "voidx.skills" = [
55
+ "bundled/*/SKILL.md",
56
+ ]
57
+ "voidx.data" = [
58
+ "templates/*.md",
59
+ ]
60
+
61
+ [tool.pytest.ini_options]
62
+ asyncio_mode = "auto"
63
+ pythonpath = ["src", "tui"]
64
+ testpaths = ["src/tests", "tui/tests"]
@@ -1,4 +1,4 @@
1
- [egg_info]
2
- tag_build =
3
- tag_date = 0
4
-
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+
@@ -0,0 +1,17 @@
1
+ from pathlib import Path
2
+
3
+ import pytest
4
+ from voidx.memory import store
5
+
6
+
7
+ @pytest.fixture(autouse=True)
8
+ def isolated_settings_home(monkeypatch: pytest.MonkeyPatch, tmp_path: Path):
9
+ monkeypatch.setattr("voidx.config.settings._settings_home", lambda: tmp_path)
10
+ if store._conn is not None:
11
+ store._conn.close()
12
+ store._conn = None
13
+ monkeypatch.setattr(store, "DATA_DIR", tmp_path / ".voidx")
14
+ yield
15
+ if store._conn is not None:
16
+ store._conn.close()
17
+ store._conn = None
@@ -0,0 +1,101 @@
1
+ """Shared fixtures and helpers for test_agent tests."""
2
+
3
+ import json
4
+ import sqlite3
5
+ import sys
6
+ from pathlib import Path
7
+
8
+
9
+ import pytest
10
+
11
+ import voidx.memory.store as store
12
+
13
+
14
+ @pytest.fixture(autouse=True)
15
+ def isolated_memory_store(tmp_path):
16
+ if store._conn is not None:
17
+ store._conn.close()
18
+ store._conn = None
19
+ store.DATA_DIR = tmp_path / ".voidx"
20
+ yield
21
+ if store._conn is not None:
22
+ store._conn.close()
23
+ store._conn = None
24
+
25
+
26
+ def _session_dir(session_id: str) -> Path:
27
+ return store.DATA_DIR / "sessions" / session_id
28
+
29
+
30
+ def _read_jsonl(path: Path) -> list[dict]:
31
+ return [json.loads(line) for line in path.read_text(encoding="utf-8").splitlines()]
32
+
33
+
34
+ async def _table_names() -> set[str]:
35
+ rows = await store._fetch_all("SELECT name FROM sqlite_master WHERE type = 'table'")
36
+ return {str(row["name"]) for row in rows}
37
+
38
+
39
+ async def _table_columns(table: str) -> set[str]:
40
+ rows = await store._fetch_all(f"PRAGMA table_info({table})")
41
+ return {str(row["name"]) for row in rows}
42
+
43
+
44
+ def _create_legacy_db(path: Path, session_id: str, *, title: str = "Legacy") -> None:
45
+ path.parent.mkdir(parents=True, exist_ok=True)
46
+ conn = sqlite3.connect(str(path))
47
+ try:
48
+ conn.execute(
49
+ """CREATE TABLE sessions (
50
+ id TEXT PRIMARY KEY,
51
+ title TEXT NOT NULL DEFAULT 'New session',
52
+ workspace TEXT NOT NULL DEFAULT '.',
53
+ model_provider TEXT NOT NULL DEFAULT 'anthropic',
54
+ model_name TEXT NOT NULL DEFAULT 'claude-sonnet-4-6',
55
+ created_at TEXT NOT NULL,
56
+ updated_at TEXT NOT NULL
57
+ )"""
58
+ )
59
+ conn.execute(
60
+ """CREATE TABLE messages (
61
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
62
+ session_id TEXT NOT NULL,
63
+ role TEXT NOT NULL,
64
+ content TEXT NOT NULL DEFAULT '',
65
+ tool_calls TEXT,
66
+ tool_call_id TEXT,
67
+ created_at TEXT NOT NULL
68
+ )"""
69
+ )
70
+ conn.execute(
71
+ """INSERT INTO sessions (
72
+ id, title, workspace, model_provider, model_name, created_at, updated_at
73
+ )
74
+ VALUES (?, ?, '.', 'anthropic', 'claude-sonnet-4-6', '2026-06-14T00:00:00+00:00', '2026-06-14T00:00:00+00:00')""",
75
+ (session_id, title),
76
+ )
77
+ conn.execute(
78
+ """INSERT INTO messages (session_id, role, content, created_at)
79
+ VALUES (?, 'user', 'hello', '2026-06-14T00:00:00+00:00')""",
80
+ (session_id,),
81
+ )
82
+ conn.commit()
83
+ finally:
84
+ conn.close()
85
+
86
+
87
+ def _create_new_store_db(path: Path, session_id: str, *, title: str = "New Store") -> None:
88
+ path.parent.mkdir(parents=True, exist_ok=True)
89
+ conn = sqlite3.connect(str(path))
90
+ try:
91
+ store._init_schema(conn)
92
+ conn.execute(
93
+ """INSERT INTO sessions (
94
+ id, title, workspace, model_provider, model_name, created_at, updated_at, message_count
95
+ )
96
+ VALUES (?, ?, '.', 'anthropic', 'claude-sonnet-4-6', '2026-06-14T00:00:00+00:00', '2026-06-14T00:00:00+00:00', 0)""",
97
+ (session_id, title),
98
+ )
99
+ conn.commit()
100
+ finally:
101
+ conn.close()
@@ -0,0 +1,107 @@
1
+ """Shared helpers for test_run_loop split files."""
2
+
3
+ import sys
4
+ from pathlib import Path
5
+ from types import SimpleNamespace
6
+
7
+ import voidx.memory.store as store
8
+
9
+
10
+ from voidx.agent.graph import VoidXGraph
11
+ from voidx.agent.graph.run_loop import GraphRunLoopMixin
12
+ from voidx.agent.graph.title_mixin import _sanitize_generated_title
13
+ from voidx.config import Config, ModelConfig
14
+ from voidx.llm.usage import UsageStats
15
+ from voidx.tools.task_tracker import TaskTracker
16
+ from voidx.ui.output.dock import BottomInputDock, set_dock
17
+ from voidx.ui.output.events import DockEventConsumer, ui_events
18
+ from voidx.ui.protocol import UiSubmitCommand
19
+ from voidx.runtime.ui_port import runtime_ui_port
20
+
21
+
22
+ class FakeTui:
23
+ instances = []
24
+
25
+ def __init__(self, status, commands):
26
+ self.status = status
27
+ self.commands = commands
28
+ FakeTui.instances.append(self)
29
+
30
+ async def run(self, on_submit):
31
+ keep_running = await on_submit("/model reasoning")
32
+ assert keep_running is True
33
+
34
+ def set_external_command_handler(self, handler):
35
+ self.command_handler = handler
36
+
37
+ def consume_quiet_command(self, command: str) -> bool:
38
+ return command == "/model reasoning"
39
+
40
+
41
+ class ExitTui:
42
+ def __init__(self, status, commands):
43
+ self.status = status
44
+ self.commands = commands
45
+ self.command_handler = None
46
+
47
+ async def run(self, on_submit):
48
+ return
49
+
50
+ def set_external_command_handler(self, handler):
51
+ self.command_handler = handler
52
+
53
+
54
+ class NoopMcpManager:
55
+ def statuses(self):
56
+ return []
57
+
58
+ async def start_all(self):
59
+ return None
60
+
61
+ async def stop_all(self):
62
+ return None
63
+
64
+
65
+ class NoopLspManager:
66
+ initialized = True
67
+ initializing = False
68
+
69
+ async def initialize(self):
70
+ return None
71
+
72
+ def doctor(self):
73
+ return []
74
+
75
+ async def warm_up(self):
76
+ return {}
77
+
78
+ async def stop_all(self):
79
+ return None
80
+
81
+
82
+ def _graph(session=None, workspace: str = "/tmp/workspace") -> GraphRunLoopMixin:
83
+ graph = GraphRunLoopMixin()
84
+ graph._session = session
85
+ graph._workspace = workspace
86
+ graph.model = object()
87
+ graph.config = SimpleNamespace(
88
+ workspace=workspace,
89
+ model=ModelConfig(provider="mimo", model="mimo-v2.5", reasoning_effort="high"),
90
+ )
91
+ graph._settings = SimpleNamespace(list_mcp_servers=lambda: [], path=f"{workspace}/.voidx/settings.json")
92
+ graph._permission = SimpleNamespace(
93
+ status_label=lambda: "default",
94
+ clear_session_permissions=lambda: None,
95
+ )
96
+ graph._usage_stats = UsageStats()
97
+ graph._debug = False
98
+ graph._plan_mode = False
99
+ graph._tracker = TaskTracker()
100
+ graph._session_msg_cache = None
101
+ graph._ui = runtime_ui_port
102
+ return graph
103
+
104
+
105
+ def _disable_external_managers(graph) -> None:
106
+ graph._mcp_manager = NoopMcpManager()
107
+ graph._lsp_manager = NoopLspManager()