voidx 3.2.2__tar.gz → 3.3.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 (293) hide show
  1. {voidx-3.2.2 → voidx-3.3.1}/PKG-INFO +1 -1
  2. {voidx-3.2.2 → voidx-3.3.1}/pyproject.toml +1 -1
  3. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/__init__.py +1 -1
  4. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/graph/compaction_coordinator.py +6 -3
  5. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/graph/core/_voidx_graph.py +2 -0
  6. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/graph/core/llm.py +2 -1
  7. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/graph/subagent.py +60 -0
  8. voidx-3.3.1/src/voidx/agent/message_trimming.py +511 -0
  9. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/prompts.py +6 -9
  10. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/runtime_context.py +8 -4
  11. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/todo_state.py +16 -19
  12. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/permission/rules.py +8 -1
  13. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/skills/registry.py +41 -1
  14. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/tools/agent.py +8 -13
  15. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/tools/bash/core.py +0 -5
  16. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/tools/bash/hint/file.py +2 -2
  17. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/tools/bash/hint/git.py +4 -8
  18. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/tools/bash/hint/search.py +6 -6
  19. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/tools/bash/tool.py +8 -4
  20. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/tools/clarify.py +42 -3
  21. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/tools/compact_context.py +4 -1
  22. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/tools/file_ops/edit_execute.py +95 -27
  23. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/tools/file_ops/edit_resolve.py +41 -8
  24. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/tools/file_ops/file.py +7 -4
  25. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/tools/file_ops/read.py +9 -12
  26. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/tools/file_ops/write.py +4 -4
  27. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/tools/file_state.py +127 -13
  28. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/tools/git.py +25 -15
  29. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/tools/load_doc_template.py +4 -1
  30. voidx-3.3.1/src/voidx/tools/load_skills.py +12 -0
  31. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/tools/lsp.py +10 -4
  32. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/tools/plan_checkpoint.py +4 -1
  33. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/tools/registry.py +3 -3
  34. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/tools/search.py +14 -8
  35. voidx-3.3.1/src/voidx/tools/skills.py +252 -0
  36. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/tools/task_status.py +17 -4
  37. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/tools/todo.py +22 -23
  38. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/tools/webfetch.py +4 -1
  39. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/tools/websearch.py +4 -1
  40. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/tools/workflow.py +4 -1
  41. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/output/console/formatting.py +5 -1
  42. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/output/diff.py +1 -1
  43. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/output/dock/__init__.py +6 -0
  44. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/output/dock/app.py +5 -0
  45. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/output/dock/formatting.py +2 -2
  46. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/output/dock/nodes.py +7 -3
  47. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/output/dock/nodes_checkpoint.py +18 -7
  48. voidx-3.3.1/src/voidx/ui/output/dock/nodes_clarify.py +92 -0
  49. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/output/dock/nodes_permission.py +2 -3
  50. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/output/dock/status.py +35 -16
  51. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/output/events/__init__.py +4 -0
  52. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/output/events/consumers.py +235 -18
  53. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/output/events/schema.py +18 -0
  54. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/output/tree.py +16 -6
  55. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/tui/render_activity.py +28 -2
  56. {voidx-3.2.2 → voidx-3.3.1}/src/voidx.egg-info/PKG-INFO +1 -1
  57. {voidx-3.2.2 → voidx-3.3.1}/src/voidx.egg-info/SOURCES.txt +3 -0
  58. voidx-3.3.1/tests/test_install_sh.py +476 -0
  59. voidx-3.2.2/src/voidx/tools/load_skills.py +0 -206
  60. voidx-3.2.2/tests/test_install_sh.py +0 -162
  61. {voidx-3.2.2 → voidx-3.3.1}/README.md +0 -0
  62. {voidx-3.2.2 → voidx-3.3.1}/setup.cfg +0 -0
  63. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/__init__.py +0 -0
  64. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/agents.py +0 -0
  65. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/attachments.py +0 -0
  66. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/goal_resolver.py +0 -0
  67. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/graph/__init__.py +0 -0
  68. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/graph/compaction.py +0 -0
  69. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/graph/contracts.py +0 -0
  70. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/graph/convergence.py +0 -0
  71. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/graph/core/__init__.py +0 -0
  72. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/graph/core/helpers.py +0 -0
  73. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/graph/permissions.py +0 -0
  74. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/graph/run_loop.py +0 -0
  75. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/graph/runtime.py +0 -0
  76. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/graph/runtime_guards.py +0 -0
  77. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/graph/session_mixin.py +0 -0
  78. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/graph/session_runtime.py +0 -0
  79. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/graph/streaming.py +0 -0
  80. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/graph/title_mixin.py +0 -0
  81. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/graph/todo_events.py +0 -0
  82. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/graph/tool_execution.py +0 -0
  83. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/graph/tool_executor/__init__.py +0 -0
  84. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/graph/tool_executor/executor.py +0 -0
  85. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/graph/tool_executor/guards.py +0 -0
  86. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/graph/tool_executor/helpers.py +0 -0
  87. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/graph/tool_executor/types.py +0 -0
  88. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/graph/tool_executor/ui.py +0 -0
  89. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/graph/tool_executor/workflow.py +0 -0
  90. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/graph/topology.py +0 -0
  91. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/graph/transcript_mixin.py +0 -0
  92. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/graph/turn_mixin.py +0 -0
  93. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/graph/turn_runner.py +2 -2
  94. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/graph/wiring.py +0 -0
  95. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/graph/workflow_utils.py +0 -0
  96. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/message_rows.py +0 -0
  97. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/slash/__init__.py +0 -0
  98. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/slash/code_ide.py +0 -0
  99. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/slash/guide.py +0 -0
  100. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/slash/handler.py +0 -0
  101. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/slash/host.py +0 -0
  102. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/slash/init.py +0 -0
  103. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/slash/lsp.py +0 -0
  104. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/slash/mcp.py +0 -0
  105. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/slash/model.py +0 -0
  106. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/slash/profile.py +0 -0
  107. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/slash/runtime.py +0 -0
  108. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/slash/session.py +0 -0
  109. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/slash/skills.py +0 -0
  110. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/slash/upgrade.py +0 -0
  111. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/state.py +0 -0
  112. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/task_state.py +0 -0
  113. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/tool_call_ids.py +0 -0
  114. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/tool_exchange_sanitizer.py +0 -0
  115. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/tool_filters.py +0 -0
  116. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/tool_messages.py +0 -0
  117. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/tool_result_storage.py +0 -0
  118. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/config/__init__.py +0 -0
  119. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/config/enums.py +0 -0
  120. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/config/models.py +0 -0
  121. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/config/permissions.py +0 -0
  122. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/config/settings.py +0 -0
  123. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/config/settings_agent.py +0 -0
  124. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/config/settings_api_keys.py +0 -0
  125. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/config/settings_code_ide.py +0 -0
  126. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/config/settings_custom.py +0 -0
  127. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/config/settings_mcp.py +0 -0
  128. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/config/settings_permissions.py +0 -0
  129. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/config/settings_skills.py +0 -0
  130. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/config/settings_update.py +0 -0
  131. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/config/settings_utils.py +0 -0
  132. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/config/settings_web.py +0 -0
  133. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/data/__init__.py +0 -0
  134. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/data/templates/api-doc.md +0 -0
  135. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/data/templates/prd.md +0 -0
  136. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/data/templates/readme.md +0 -0
  137. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/data/templates/rfc.md +0 -0
  138. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/data/templates/tech-design.md +0 -0
  139. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/diffing.py +0 -0
  140. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/llm/__init__.py +0 -0
  141. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/llm/catalog.py +0 -0
  142. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/llm/compaction.py +0 -0
  143. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/llm/context.py +0 -0
  144. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/llm/instruction.py +0 -0
  145. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/llm/message_markers.py +0 -0
  146. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/llm/message_status.py +0 -0
  147. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/llm/provider.py +0 -0
  148. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/llm/service.py +0 -0
  149. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/llm/usage.py +0 -0
  150. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/logging/__init__.py +0 -0
  151. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/logging/request_log.py +0 -0
  152. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/logging/tool_log.py +0 -0
  153. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/lsp/__init__.py +0 -0
  154. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/lsp/client.py +0 -0
  155. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/lsp/config.py +0 -0
  156. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/lsp/detector.py +0 -0
  157. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/lsp/detector_data.py +0 -0
  158. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/lsp/errors.py +0 -0
  159. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/lsp/manager.py +0 -0
  160. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/lsp/schema.py +0 -0
  161. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/lsp/service.py +0 -0
  162. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/main.py +0 -0
  163. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/mcp/__init__.py +0 -0
  164. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/mcp/client/__init__.py +0 -0
  165. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/mcp/client/base.py +0 -0
  166. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/mcp/client/errors.py +0 -0
  167. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/mcp/client/http_transport.py +0 -0
  168. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/mcp/client/sse_transport.py +0 -0
  169. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/mcp/client/stdio_transport.py +0 -0
  170. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/mcp/manager.py +0 -0
  171. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/mcp/schema.py +0 -0
  172. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/mcp/tool.py +0 -0
  173. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/mcp_servers/__init__.py +0 -0
  174. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/mcp_servers/web.py +0 -0
  175. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/memory/__init__.py +0 -0
  176. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/memory/cleanup.py +0 -0
  177. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/memory/context_frames.py +0 -0
  178. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/memory/jsonl_store.py +0 -0
  179. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/memory/model_profiles.py +0 -0
  180. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/memory/runtime_state.py +0 -0
  181. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/memory/service.py +0 -0
  182. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/memory/session.py +0 -0
  183. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/memory/store.py +0 -0
  184. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/memory/subagents.py +0 -0
  185. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/memory/transcript.py +0 -0
  186. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/permission/__init__.py +0 -0
  187. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/permission/context.py +0 -0
  188. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/permission/engine.py +0 -0
  189. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/permission/evaluate.py +0 -0
  190. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/permission/sandbox.py +0 -0
  191. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/permission/schema.py +0 -0
  192. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/permission/service.py +0 -0
  193. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/permission/wildcard.py +0 -0
  194. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/runtime/__init__.py +0 -0
  195. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/runtime/attachments.py +0 -0
  196. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/runtime/intent.py +0 -0
  197. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/runtime/reference_tokens.py +0 -0
  198. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/runtime/task_state.py +0 -0
  199. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/runtime/todo.py +0 -0
  200. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/runtime/ui.py +0 -0
  201. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/runtime/ui_port.py +0 -0
  202. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/selfupdate.py +0 -0
  203. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/skills/__init__.py +0 -0
  204. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/skills/context.py +0 -0
  205. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/skills/references.py +0 -0
  206. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/skills/schema.py +0 -0
  207. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/skills/service.py +0 -0
  208. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/tools/__init__.py +0 -0
  209. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/tools/base.py +0 -0
  210. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/tools/bash/__init__.py +0 -0
  211. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/tools/bash/hint/__init__.py +0 -0
  212. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/tools/bash/router.py +0 -0
  213. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/tools/bash/safety.py +0 -0
  214. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/tools/file_ops/__init__.py +0 -0
  215. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/tools/file_ops/types.py +0 -0
  216. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/tools/service.py +0 -0
  217. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/tools/task_tracker.py +0 -0
  218. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/tools/web_content.py +0 -0
  219. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/tools/web_mcp.py +0 -0
  220. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/__init__.py +0 -0
  221. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/commands.py +0 -0
  222. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/frontend.py +0 -0
  223. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/gateway/__init__.py +0 -0
  224. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/gateway/bootstrap.py +0 -0
  225. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/gateway/server.py +0 -0
  226. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/gateway/session.py +0 -0
  227. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/output/__init__.py +0 -0
  228. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/output/agent_display.py +0 -0
  229. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/output/browse.py +0 -0
  230. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/output/capture.py +0 -0
  231. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/output/console/__init__.py +0 -0
  232. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/output/console/app.py +0 -0
  233. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/output/console/streaming.py +0 -0
  234. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/output/display_policy.py +0 -0
  235. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/output/dock/agent_placeholder.py +0 -0
  236. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/output/dock/nodes_startup.py +0 -0
  237. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/output/dock/nodes_status.py +0 -0
  238. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/output/dock/state.py +0 -0
  239. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/output/dock/stream.py +0 -0
  240. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/output/dock/todo.py +0 -0
  241. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/output/events/bus.py +0 -0
  242. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/output/types.py +0 -0
  243. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/protocol/__init__.py +0 -0
  244. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/protocol/commands.py +0 -0
  245. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/protocol/envelope.py +0 -0
  246. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/protocol/requests.py +0 -0
  247. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/protocol/schema.py +0 -0
  248. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/protocol/transcript.py +0 -0
  249. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/session.py +0 -0
  250. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/tools/__init__.py +0 -0
  251. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/tools/attachment_tokens.py +0 -0
  252. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/tools/clipboard_image.py +0 -0
  253. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/tools/clipboard_text.py +0 -0
  254. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/tools/code_ide.py +0 -0
  255. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/tools/file_picker.py +0 -0
  256. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/tools/skill_picker.py +0 -0
  257. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/transcript.py +0 -0
  258. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/tui/__init__.py +0 -0
  259. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/tui/activity.py +0 -0
  260. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/tui/app.py +0 -0
  261. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/tui/choice_mixin.py +0 -0
  262. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/tui/clipboard_mixin.py +0 -0
  263. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/tui/helpers.py +0 -0
  264. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/tui/input.py +0 -0
  265. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/tui/overlays.py +0 -0
  266. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/tui/panels.py +0 -0
  267. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/tui/parser.py +0 -0
  268. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/tui/render_frame.py +0 -0
  269. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/tui/render_input.py +0 -0
  270. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/tui/render_status.py +0 -0
  271. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/tui/render_todo.py +0 -0
  272. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/tui/renderer.py +0 -0
  273. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/tui/state.py +0 -0
  274. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/tui/terminal_mixin.py +0 -0
  275. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/tui/text_prompt_mixin.py +0 -0
  276. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/workflow/__init__.py +0 -0
  277. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/workflow/auto_advance.py +0 -0
  278. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/workflow/context.py +0 -0
  279. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/workflow/dag.py +0 -0
  280. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/workflow/nodes.py +0 -0
  281. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/workflow/policy.py +0 -0
  282. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/workflow/reconcile.py +0 -0
  283. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/workflow/render.py +0 -0
  284. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/workflow/route.py +0 -0
  285. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/workflow/runtime.py +0 -0
  286. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/workflow/schema.py +0 -0
  287. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/workflow/service.py +0 -0
  288. {voidx-3.2.2 → voidx-3.3.1}/src/voidx/workflow/types.py +0 -0
  289. {voidx-3.2.2 → voidx-3.3.1}/src/voidx.egg-info/dependency_links.txt +0 -0
  290. {voidx-3.2.2 → voidx-3.3.1}/src/voidx.egg-info/entry_points.txt +0 -0
  291. {voidx-3.2.2 → voidx-3.3.1}/src/voidx.egg-info/requires.txt +0 -0
  292. {voidx-3.2.2 → voidx-3.3.1}/src/voidx.egg-info/top_level.txt +0 -0
  293. {voidx-3.2.2 → voidx-3.3.1}/tests/test_npm_package.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: voidx
3
- Version: 3.2.2
3
+ Version: 3.3.1
4
4
  Summary: A coding agent that quantifies everything and solves with tools, not fuzzy prompts.
5
5
  Requires-Python: >=3.11
6
6
  Description-Content-Type: text/markdown
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "voidx"
3
- version = "3.2.2"
3
+ version = "3.3.1"
4
4
  description = "A coding agent that quantifies everything and solves with tools, not fuzzy prompts."
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.11"
@@ -1,3 +1,3 @@
1
1
  """VoidX - A coding agent that quantifies everything."""
2
2
 
3
- __version__ = "3.2.2"
3
+ __version__ = "3.3.1"
@@ -189,7 +189,7 @@ class GraphCompactionCoordinator:
189
189
  if host._ui.via_events():
190
190
  await host._ui.events.emit(StatusUpdated(
191
191
  status_id="compaction",
192
- label="Compacting context",
192
+ label="Compacting",
193
193
  detail=_compaction_status_detail(total_tokens, force=force, preflight=preflight),
194
194
  stage="compacting",
195
195
  display="record_only",
@@ -198,7 +198,7 @@ class GraphCompactionCoordinator:
198
198
  host._ui.ui.print(
199
199
  "[yellow]Context overflow — compacting...[/yellow]"
200
200
  if not force
201
- else "[yellow]Compacting context...[/yellow]"
201
+ else "[yellow]Compacting...[/yellow]"
202
202
  )
203
203
 
204
204
  runtime_prefix = _runtime_prefix(messages)
@@ -251,9 +251,10 @@ class GraphCompactionCoordinator:
251
251
  retry_label = f" (attempt {attempt})" if attempt > 1 else ""
252
252
  await host._ui.events.emit(StatusUpdated(
253
253
  status_id="compaction",
254
- label="Compacting context",
254
+ label="Compacting",
255
255
  detail=f"summarizing {len(head_msgs)} old messages{retry_label}",
256
256
  stage="compacting",
257
+ display="record_only",
257
258
  ))
258
259
  summary = await run_agent(head_msgs, previous_summary)
259
260
  if summary:
@@ -270,6 +271,7 @@ class GraphCompactionCoordinator:
270
271
  label="Compaction agent failed",
271
272
  detail=f"{e}; retrying ({attempt}/{COMPACTION_MAX_RETRIES})",
272
273
  stage="compacting",
274
+ display="record_only",
273
275
  ))
274
276
  else:
275
277
  host._ui.ui.print(f"[dim]Compaction agent failed ({e}) — retrying ({attempt}/{COMPACTION_MAX_RETRIES})[/dim]")
@@ -288,6 +290,7 @@ class GraphCompactionCoordinator:
288
290
  label="Compaction agent failed",
289
291
  detail=f"{failure_detail}; using extracted summary",
290
292
  stage="compacting",
293
+ display="record_only",
291
294
  ))
292
295
  else:
293
296
  err_msg = f" ({failure_detail})"
@@ -399,6 +399,7 @@ class VoidXGraph(
399
399
 
400
400
  ok = False
401
401
  run_metadata: dict[str, object] = {}
402
+ result = ""
402
403
  try:
403
404
  kwargs = {
404
405
  "sub_messages": sub_buffer,
@@ -439,6 +440,7 @@ class VoidXGraph(
439
440
  ok=ok,
440
441
  elapsed=time.monotonic() - started_at,
441
442
  finish_reason=str(run_metadata.get("finish_reason") or ("final_answer" if ok else "error")),
443
+ summary=result if ok else "",
442
444
  ))
443
445
  if self._session:
444
446
  await append_subagent_event(session_id, agent_run_id, {
@@ -17,6 +17,7 @@ from voidx.agent.runtime_context import (
17
17
  from voidx.agent.state import AgentState
18
18
  from voidx.agent.task_state import GoalResolution, TaskState, goal_label, goal_type_from_join
19
19
  from voidx.agent.todo_state import sanitize_todo_replay_messages
20
+ from voidx.agent.message_trimming import trim_superseded_file_tools
20
21
  from voidx.agent.tool_exchange_sanitizer import sanitize_failed_tool_exchanges
21
22
  from voidx.agent.tool_filters import filter_unavailable_lsp_tools
22
23
  from voidx.agent.graph.streaming import (
@@ -200,7 +201,7 @@ class GraphLlmMixin:
200
201
  *,
201
202
  allow_inline_compaction: bool,
202
203
  ) -> tuple[list[BaseMessage], list[HumanMessage], bool]:
203
- base_messages = [*messages, *guidance_messages]
204
+ base_messages = trim_superseded_file_tools([*messages, *guidance_messages])
204
205
  if allow_inline_compaction and not compaction_happened:
205
206
  inline_compaction_guide = self._inline_compaction_guide_for(base_messages)
206
207
  if inline_compaction_guide is not None:
@@ -3,6 +3,7 @@
3
3
  from __future__ import annotations
4
4
 
5
5
  import asyncio
6
+ import re
6
7
  import time
7
8
 
8
9
  from langchain_core.messages import AIMessage, HumanMessage, ToolMessage
@@ -43,6 +44,7 @@ from voidx.runtime.ui_port import AgentUiPort, runtime_ui_port
43
44
 
44
45
 
45
46
  _SAFETY_STEP_LIMIT = 50
47
+ _RESULT_CONTRACT_RETRY_LIMIT = 2
46
48
 
47
49
  async def run_subagent(
48
50
  agent_def: AgentDef,
@@ -105,6 +107,8 @@ async def run_subagent(
105
107
  )
106
108
  guard_state = RuntimeGuardState(wall_clock=WallClockGuardState.for_subagent())
107
109
  pending_guard_guidance: list[str] = []
110
+ contract_retry_count = 0
111
+ has_successful_tool_work = False
108
112
 
109
113
  context, context_cache = RuntimeContextBuilder(
110
114
  config=context_config,
@@ -212,6 +216,18 @@ async def run_subagent(
212
216
 
213
217
  if not assistant_msg.tool_calls:
214
218
  text = extract_text(assistant_msg)
219
+ if has_successful_tool_work and not _satisfies_result_contract(text, result_contract):
220
+ if contract_retry_count < _RESULT_CONTRACT_RETRY_LIMIT:
221
+ contract_retry_count += 1
222
+ step -= 1
223
+ guidance = _result_contract_retry_message(result_contract)
224
+ messages.append(HumanMessage(content=guidance))
225
+ continue
226
+ if tracker:
227
+ tracker.update(task_id, last_output=text[:200])
228
+ tracker.finish(task_id, "completed")
229
+ mark_finished("contract_unsatisfied")
230
+ return text
215
231
  if tracker:
216
232
  tracker.update(task_id, last_output=text[:200])
217
233
  tracker.finish(task_id, "completed")
@@ -318,6 +334,7 @@ async def run_subagent(
318
334
  if metadata.get("runtime_guard"):
319
335
  continue
320
336
  if result_ok(item["result"]):
337
+ has_successful_tool_work = True
321
338
  guard_state.tool_failures.record_success(item["tool_call"])
322
339
  continue
323
340
  key = build_failure_key(item["tool_call"], item["result"])
@@ -391,3 +408,46 @@ def _task_payload(task_description: str, result_contract) -> str:
391
408
  "Return the final answer using this contract."
392
409
  )
393
410
  return "\n\n".join(parts)
411
+
412
+
413
+ def _result_contract_fields(result_contract) -> list[str]:
414
+ result_format = str(getattr(result_contract, "format", "") or "")
415
+ fields: list[str] = []
416
+ for raw_part in result_format.split(","):
417
+ part = raw_part.strip()
418
+ if not part:
419
+ continue
420
+ match = re.match(r"([A-Za-z_][A-Za-z0-9_]*)", part)
421
+ if match:
422
+ fields.append(match.group(1))
423
+ return fields
424
+
425
+
426
+ def _satisfies_result_contract(text: str, result_contract) -> bool:
427
+ fields = _result_contract_fields(result_contract)
428
+ if not fields:
429
+ return True
430
+ if not text.strip():
431
+ return False
432
+
433
+ matched = [
434
+ field
435
+ for field in fields
436
+ if re.search(rf"(?im)^\s*(?:[-*]\s*)?{re.escape(field)}\s*[:=]", text)
437
+ ]
438
+ required = 1 if len(fields) == 1 else 2
439
+ if fields[0] not in matched:
440
+ return False
441
+ return len(matched) >= required
442
+
443
+
444
+ def _result_contract_retry_message(result_contract) -> str:
445
+ schema_name = str(getattr(result_contract, "schema_name", "") or "agent_result")
446
+ result_format = str(getattr(result_contract, "format", "") or "").strip()
447
+ return (
448
+ "Your previous response did not satisfy the child-agent result contract. "
449
+ "Do not return raw tool output or code snippets as the final answer.\n"
450
+ "Summarize the completed delegated task using the required contract:\n"
451
+ f"- schema_name: {schema_name}\n"
452
+ f"- format: {result_format}"
453
+ )