voidx 3.2.0__tar.gz → 3.2.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 (291) hide show
  1. {voidx-3.2.0 → voidx-3.2.1}/PKG-INFO +1 -1
  2. {voidx-3.2.0 → voidx-3.2.1}/pyproject.toml +1 -1
  3. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/__init__.py +1 -1
  4. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/graph/permissions.py +1 -0
  5. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/graph/runtime_guards.py +22 -19
  6. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/graph/subagent.py +1 -1
  7. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/graph/todo_events.py +7 -1
  8. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/graph/tool_executor/executor.py +4 -2
  9. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/graph/tool_executor/workflow.py +1 -1
  10. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/runtime_context.py +4 -4
  11. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/slash/init.py +1 -1
  12. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/todo_state.py +29 -3
  13. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/memory/runtime_state.py +2 -2
  14. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/permission/rules.py +10 -5
  15. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/permission/sandbox.py +304 -304
  16. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/permission/service.py +1 -1
  17. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/runtime/task_state.py +7 -1
  18. voidx-3.2.1/src/voidx/tools/bash/__init__.py +6 -0
  19. voidx-3.2.1/src/voidx/tools/bash/core.py +112 -0
  20. voidx-3.2.1/src/voidx/tools/bash/hint/__init__.py +57 -0
  21. voidx-3.2.1/src/voidx/tools/bash/hint/file.py +232 -0
  22. voidx-3.2.1/src/voidx/tools/bash/hint/git.py +537 -0
  23. voidx-3.2.1/src/voidx/tools/bash/hint/search.py +271 -0
  24. voidx-3.2.1/src/voidx/tools/bash/router.py +69 -0
  25. voidx-3.2.1/src/voidx/tools/bash/safety.py +88 -0
  26. voidx-3.2.0/src/voidx/tools/bash.py → voidx-3.2.1/src/voidx/tools/bash/tool.py +3 -82
  27. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/tools/file_ops/write.py +0 -2
  28. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/tools/plan_checkpoint.py +6 -5
  29. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/tools/registry.py +0 -2
  30. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/tools/task_tracker.py +37 -4
  31. voidx-3.2.1/src/voidx/tools/todo.py +297 -0
  32. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/output/console/app.py +1 -1
  33. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/output/display_policy.py +0 -1
  34. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/output/dock/app.py +34 -0
  35. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/output/dock/nodes.py +3 -1
  36. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/output/dock/nodes_checkpoint.py +3 -14
  37. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/output/dock/stream.py +62 -4
  38. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/output/dock/todo.py +9 -3
  39. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/output/events/schema.py +2 -0
  40. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/output/tree.py +34 -6
  41. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/tui/app.py +3 -2
  42. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/tui/render_activity.py +6 -3
  43. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/tui/render_frame.py +33 -5
  44. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/workflow/nodes.py +0 -7
  45. {voidx-3.2.0 → voidx-3.2.1}/src/voidx.egg-info/PKG-INFO +1 -1
  46. {voidx-3.2.0 → voidx-3.2.1}/src/voidx.egg-info/SOURCES.txt +9 -3
  47. {voidx-3.2.0 → voidx-3.2.1}/tests/test_npm_package.py +25 -30
  48. voidx-3.2.0/src/voidx/tools/bash_router.py +0 -1222
  49. voidx-3.2.0/src/voidx/tools/repomap.py +0 -249
  50. voidx-3.2.0/src/voidx/tools/todo.py +0 -86
  51. {voidx-3.2.0 → voidx-3.2.1}/README.md +0 -0
  52. {voidx-3.2.0 → voidx-3.2.1}/setup.cfg +0 -0
  53. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/__init__.py +0 -0
  54. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/agents.py +0 -0
  55. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/attachments.py +0 -0
  56. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/goal_resolver.py +0 -0
  57. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/graph/__init__.py +0 -0
  58. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/graph/compaction.py +0 -0
  59. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/graph/compaction_coordinator.py +0 -0
  60. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/graph/contracts.py +0 -0
  61. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/graph/convergence.py +0 -0
  62. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/graph/core/__init__.py +0 -0
  63. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/graph/core/_voidx_graph.py +0 -0
  64. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/graph/core/helpers.py +0 -0
  65. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/graph/core/llm.py +0 -0
  66. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/graph/run_loop.py +0 -0
  67. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/graph/runtime.py +0 -0
  68. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/graph/session_mixin.py +0 -0
  69. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/graph/session_runtime.py +0 -0
  70. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/graph/streaming.py +0 -0
  71. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/graph/title_mixin.py +0 -0
  72. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/graph/tool_execution.py +0 -0
  73. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/graph/tool_executor/__init__.py +0 -0
  74. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/graph/tool_executor/guards.py +0 -0
  75. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/graph/tool_executor/helpers.py +0 -0
  76. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/graph/tool_executor/types.py +0 -0
  77. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/graph/tool_executor/ui.py +0 -0
  78. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/graph/topology.py +0 -0
  79. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/graph/transcript_mixin.py +0 -0
  80. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/graph/turn_mixin.py +0 -0
  81. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/graph/turn_runner.py +0 -0
  82. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/graph/wiring.py +0 -0
  83. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/graph/workflow_utils.py +0 -0
  84. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/message_rows.py +0 -0
  85. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/prompts.py +0 -0
  86. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/slash/__init__.py +0 -0
  87. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/slash/code_ide.py +0 -0
  88. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/slash/guide.py +0 -0
  89. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/slash/handler.py +0 -0
  90. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/slash/host.py +0 -0
  91. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/slash/lsp.py +0 -0
  92. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/slash/mcp.py +0 -0
  93. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/slash/model.py +0 -0
  94. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/slash/profile.py +0 -0
  95. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/slash/runtime.py +0 -0
  96. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/slash/session.py +0 -0
  97. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/slash/skills.py +0 -0
  98. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/slash/upgrade.py +0 -0
  99. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/state.py +0 -0
  100. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/task_state.py +0 -0
  101. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/tool_call_ids.py +0 -0
  102. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/tool_exchange_sanitizer.py +0 -0
  103. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/tool_filters.py +0 -0
  104. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/tool_messages.py +0 -0
  105. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/tool_result_storage.py +0 -0
  106. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/config/__init__.py +0 -0
  107. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/config/enums.py +0 -0
  108. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/config/models.py +0 -0
  109. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/config/permissions.py +0 -0
  110. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/config/settings.py +0 -0
  111. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/config/settings_agent.py +0 -0
  112. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/config/settings_api_keys.py +0 -0
  113. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/config/settings_code_ide.py +0 -0
  114. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/config/settings_custom.py +0 -0
  115. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/config/settings_mcp.py +0 -0
  116. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/config/settings_permissions.py +0 -0
  117. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/config/settings_skills.py +0 -0
  118. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/config/settings_update.py +0 -0
  119. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/config/settings_utils.py +0 -0
  120. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/config/settings_web.py +0 -0
  121. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/data/__init__.py +0 -0
  122. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/data/templates/api-doc.md +0 -0
  123. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/data/templates/prd.md +0 -0
  124. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/data/templates/readme.md +0 -0
  125. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/data/templates/rfc.md +0 -0
  126. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/data/templates/tech-design.md +0 -0
  127. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/diffing.py +0 -0
  128. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/llm/__init__.py +0 -0
  129. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/llm/catalog.py +0 -0
  130. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/llm/compaction.py +0 -0
  131. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/llm/context.py +0 -0
  132. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/llm/instruction.py +0 -0
  133. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/llm/message_markers.py +0 -0
  134. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/llm/message_status.py +0 -0
  135. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/llm/provider.py +0 -0
  136. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/llm/service.py +0 -0
  137. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/llm/usage.py +0 -0
  138. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/logging/__init__.py +0 -0
  139. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/logging/request_log.py +0 -0
  140. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/logging/tool_log.py +0 -0
  141. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/lsp/__init__.py +0 -0
  142. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/lsp/client.py +0 -0
  143. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/lsp/config.py +0 -0
  144. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/lsp/detector.py +0 -0
  145. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/lsp/detector_data.py +0 -0
  146. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/lsp/errors.py +0 -0
  147. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/lsp/manager.py +0 -0
  148. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/lsp/schema.py +0 -0
  149. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/lsp/service.py +0 -0
  150. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/main.py +0 -0
  151. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/mcp/__init__.py +0 -0
  152. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/mcp/client/__init__.py +0 -0
  153. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/mcp/client/base.py +0 -0
  154. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/mcp/client/errors.py +0 -0
  155. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/mcp/client/http_transport.py +0 -0
  156. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/mcp/client/sse_transport.py +0 -0
  157. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/mcp/client/stdio_transport.py +0 -0
  158. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/mcp/manager.py +0 -0
  159. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/mcp/schema.py +0 -0
  160. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/mcp/tool.py +0 -0
  161. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/mcp_servers/__init__.py +0 -0
  162. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/mcp_servers/web.py +0 -0
  163. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/memory/__init__.py +0 -0
  164. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/memory/cleanup.py +0 -0
  165. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/memory/context_frames.py +0 -0
  166. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/memory/jsonl_store.py +0 -0
  167. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/memory/model_profiles.py +0 -0
  168. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/memory/service.py +0 -0
  169. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/memory/session.py +0 -0
  170. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/memory/store.py +0 -0
  171. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/memory/subagents.py +0 -0
  172. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/memory/transcript.py +0 -0
  173. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/permission/__init__.py +0 -0
  174. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/permission/context.py +0 -0
  175. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/permission/engine.py +0 -0
  176. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/permission/evaluate.py +0 -0
  177. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/permission/schema.py +0 -0
  178. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/permission/wildcard.py +0 -0
  179. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/runtime/__init__.py +0 -0
  180. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/runtime/attachments.py +0 -0
  181. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/runtime/intent.py +0 -0
  182. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/runtime/reference_tokens.py +0 -0
  183. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/runtime/todo.py +0 -0
  184. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/runtime/ui.py +0 -0
  185. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/runtime/ui_port.py +0 -0
  186. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/selfupdate.py +0 -0
  187. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/skills/__init__.py +0 -0
  188. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/skills/context.py +0 -0
  189. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/skills/references.py +0 -0
  190. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/skills/registry.py +0 -0
  191. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/skills/schema.py +0 -0
  192. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/skills/service.py +0 -0
  193. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/tools/__init__.py +0 -0
  194. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/tools/agent.py +0 -0
  195. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/tools/base.py +0 -0
  196. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/tools/clarify.py +0 -0
  197. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/tools/compact_context.py +0 -0
  198. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/tools/file_ops/__init__.py +0 -0
  199. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/tools/file_ops/edit_execute.py +0 -0
  200. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/tools/file_ops/edit_resolve.py +0 -0
  201. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/tools/file_ops/file.py +0 -0
  202. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/tools/file_ops/read.py +0 -0
  203. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/tools/file_ops/types.py +0 -0
  204. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/tools/file_state.py +0 -0
  205. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/tools/git.py +0 -0
  206. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/tools/load_doc_template.py +0 -0
  207. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/tools/load_skills.py +0 -0
  208. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/tools/lsp.py +0 -0
  209. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/tools/search.py +0 -0
  210. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/tools/service.py +0 -0
  211. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/tools/task_status.py +0 -0
  212. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/tools/web_content.py +0 -0
  213. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/tools/web_mcp.py +0 -0
  214. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/tools/webfetch.py +0 -0
  215. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/tools/websearch.py +0 -0
  216. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/tools/workflow.py +0 -0
  217. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/__init__.py +0 -0
  218. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/commands.py +0 -0
  219. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/frontend.py +0 -0
  220. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/gateway/__init__.py +0 -0
  221. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/gateway/bootstrap.py +0 -0
  222. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/gateway/server.py +0 -0
  223. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/gateway/session.py +0 -0
  224. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/output/__init__.py +0 -0
  225. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/output/agent_display.py +0 -0
  226. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/output/browse.py +0 -0
  227. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/output/capture.py +0 -0
  228. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/output/console/__init__.py +0 -0
  229. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/output/console/formatting.py +0 -0
  230. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/output/console/streaming.py +0 -0
  231. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/output/diff.py +0 -0
  232. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/output/dock/__init__.py +0 -0
  233. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/output/dock/agent_placeholder.py +0 -0
  234. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/output/dock/formatting.py +0 -0
  235. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/output/dock/nodes_permission.py +0 -0
  236. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/output/dock/nodes_startup.py +0 -0
  237. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/output/dock/nodes_status.py +0 -0
  238. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/output/dock/state.py +0 -0
  239. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/output/dock/status.py +0 -0
  240. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/output/events/__init__.py +0 -0
  241. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/output/events/bus.py +0 -0
  242. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/output/events/consumers.py +0 -0
  243. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/output/types.py +0 -0
  244. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/protocol/__init__.py +0 -0
  245. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/protocol/commands.py +0 -0
  246. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/protocol/envelope.py +0 -0
  247. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/protocol/requests.py +0 -0
  248. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/protocol/schema.py +0 -0
  249. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/protocol/transcript.py +0 -0
  250. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/session.py +0 -0
  251. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/tools/__init__.py +0 -0
  252. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/tools/attachment_tokens.py +0 -0
  253. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/tools/clipboard_image.py +0 -0
  254. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/tools/clipboard_text.py +0 -0
  255. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/tools/code_ide.py +0 -0
  256. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/tools/file_picker.py +0 -0
  257. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/tools/skill_picker.py +0 -0
  258. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/transcript.py +0 -0
  259. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/tui/__init__.py +0 -0
  260. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/tui/activity.py +0 -0
  261. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/tui/choice_mixin.py +0 -0
  262. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/tui/clipboard_mixin.py +0 -0
  263. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/tui/helpers.py +0 -0
  264. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/tui/input.py +0 -0
  265. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/tui/overlays.py +0 -0
  266. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/tui/panels.py +0 -0
  267. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/tui/parser.py +0 -0
  268. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/tui/render_input.py +0 -0
  269. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/tui/render_status.py +0 -0
  270. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/tui/render_todo.py +0 -0
  271. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/tui/renderer.py +0 -0
  272. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/tui/state.py +0 -0
  273. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/tui/terminal_mixin.py +0 -0
  274. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/tui/text_prompt_mixin.py +0 -0
  275. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/workflow/__init__.py +0 -0
  276. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/workflow/auto_advance.py +0 -0
  277. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/workflow/context.py +0 -0
  278. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/workflow/dag.py +0 -0
  279. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/workflow/policy.py +0 -0
  280. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/workflow/reconcile.py +0 -0
  281. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/workflow/render.py +0 -0
  282. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/workflow/route.py +0 -0
  283. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/workflow/runtime.py +0 -0
  284. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/workflow/schema.py +0 -0
  285. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/workflow/service.py +0 -0
  286. {voidx-3.2.0 → voidx-3.2.1}/src/voidx/workflow/types.py +0 -0
  287. {voidx-3.2.0 → voidx-3.2.1}/src/voidx.egg-info/dependency_links.txt +0 -0
  288. {voidx-3.2.0 → voidx-3.2.1}/src/voidx.egg-info/entry_points.txt +0 -0
  289. {voidx-3.2.0 → voidx-3.2.1}/src/voidx.egg-info/requires.txt +0 -0
  290. {voidx-3.2.0 → voidx-3.2.1}/src/voidx.egg-info/top_level.txt +0 -0
  291. {voidx-3.2.0 → voidx-3.2.1}/tests/test_install_sh.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: voidx
3
- Version: 3.2.0
3
+ Version: 3.2.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.0"
3
+ version = "3.2.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.0"
3
+ __version__ = "3.2.1"
@@ -112,6 +112,7 @@ class GraphPermissionMixin:
112
112
  choices=choices,
113
113
  tools=self._permission_tool_details(tool_calls),
114
114
  ))
115
+ details = None
115
116
 
116
117
  if not self._app:
117
118
  self._ui.ui.print("")
@@ -349,27 +349,30 @@ def stable_json(value: Any) -> str:
349
349
  return json.dumps(value, sort_keys=True, separators=(",", ":"), default=str)
350
350
 
351
351
 
352
- def todo_status_signature(todo_state: Any) -> tuple[tuple[str, int], ...]:
352
+ def todo_status_signature(todo_state: Any) -> tuple[int, int, int, int]:
353
+ """(done, in_progress, pending, cancelled) count signature."""
353
354
  if todo_state is None:
354
- return ()
355
+ return (0, 0, 0, 0)
356
+
357
+ # Try to get counts from TodoRunState
358
+ if hasattr(todo_state, "done"):
359
+ return (
360
+ getattr(todo_state, "done", 0),
361
+ getattr(todo_state, "in_progress", 0),
362
+ getattr(todo_state, "pending", 0),
363
+ getattr(todo_state, "cancelled", 0),
364
+ )
365
+
366
+ # Fallback for dict representation
355
367
  if isinstance(todo_state, dict):
356
- items = todo_state.get("items") or []
357
- if not items and "todos" in todo_state:
358
- items = todo_state.get("todos") or []
359
- elif hasattr(todo_state, "items"):
360
- items = getattr(todo_state, "items") or []
361
- else:
362
- return ()
363
-
364
- statuses: list[str] = []
365
- for item in items:
366
- if isinstance(item, dict):
367
- status = item.get("status")
368
- else:
369
- status = getattr(item, "status", None)
370
- if status:
371
- statuses.append(str(status))
372
- return tuple(sorted(Counter(statuses).items()))
368
+ return (
369
+ todo_state.get("done", 0),
370
+ todo_state.get("in_progress", 0),
371
+ todo_state.get("pending", 0),
372
+ todo_state.get("cancelled", 0),
373
+ )
374
+
375
+ return (0, 0, 0, 0)
373
376
 
374
377
 
375
378
  def cycle_summary_from_tools(
@@ -271,7 +271,7 @@ async def run_subagent(
271
271
  capture.tool_call(tid, targs, tool_call_id=cid)
272
272
  result = await agent_tools.execute_tool(tid, targs, ctx)
273
273
  todo_state = todo_run_state_from_result(result) if tid == "todo" else None
274
- if todo_state_sink is not None and todo_state is not None and todo_state.items:
274
+ if todo_state_sink is not None and todo_state is not None and todo_state.total > 0:
275
275
  todo_state_sink(todo_state)
276
276
  if ui_port.via_events() and tid == "todo":
277
277
  todo_event = todo_updated_event(result, agent_id=agent_id)
@@ -10,8 +10,14 @@ def todo_updated_event(result, *, agent_id: int = -1):
10
10
  state = todo_run_state_from_result(result)
11
11
  if state is None:
12
12
  return None
13
+
14
+ # Get todo_op from metadata
15
+ metadata = getattr(result, "metadata", {}) or {}
16
+ todo_op = metadata.get("todo_op", "write")
17
+
13
18
  return TodoUpdated(
14
19
  agent_id=agent_id,
15
- items=[TodoItemPayload(content=item.content, status=item.status) for item in state.items],
20
+ items=[TodoItemPayload(id=item.id, content=item.content, status=item.status) for item in state.active_items],
16
21
  summary=state.summary,
22
+ todo_op=todo_op,
17
23
  )
@@ -189,7 +189,9 @@ class GraphToolExecutor:
189
189
  host._clear_failure_check(cid)
190
190
 
191
191
  todo_state = todo_run_state_from_result(result) if tid == "todo" and ok else None
192
- if host._ui.via_events() and tid == "todo":
192
+ todo_meta = getattr(result, "metadata", {}) or {} if tid == "todo" and ok else {}
193
+ is_todo_read = todo_meta.get("todo_op") == "read"
194
+ if host._ui.via_events() and tid == "todo" and not is_todo_read:
193
195
  todo_event = todo_updated_event(result)
194
196
  if todo_event is not None:
195
197
  await host._ui.events.emit(todo_event)
@@ -197,7 +199,7 @@ class GraphToolExecutor:
197
199
  await host._ui.events.emit(WarningAppended(
198
200
  message="Todo update ignored: tool returned malformed metadata.",
199
201
  ))
200
- elif tid == "todo" and ok and todo_state is None:
202
+ elif tid == "todo" and ok and todo_state is None and not is_todo_read:
201
203
  host._ui.ui.warn("Todo update ignored: tool returned malformed metadata.")
202
204
 
203
205
  notify_tool_failure(host, tc, result, display_policy.rule_for(tid).mode, tool_event_id)
@@ -37,7 +37,7 @@ def _state_update_from_executed_tools(
37
37
  workflow_runs_changed = False
38
38
  for item in executed:
39
39
  if item.tool_call.get("name") == "todo" and item.todo_state is not None:
40
- if item.todo_state.items:
40
+ if item.todo_state.total > 0:
41
41
  update["todo_state"] = item.todo_state.model_dump(mode="json")
42
42
  else:
43
43
  update["todo_state"] = None
@@ -268,10 +268,10 @@ class RuntimeContextBuilder:
268
268
  if exits:
269
269
  lines.append(f"- Workflow exits [{workflow_name}]: {'; '.join(exits)}")
270
270
  todo_state = _coerce_todo_run_state(self.todo_state)
271
- if todo_state is not None and todo_state.items:
272
- lines.append(f"- Active todo: {len(todo_state.items)} items")
273
- for item in todo_state.items:
274
- lines.append(f" - {item.status}: {item.content}")
271
+ if todo_state is not None and todo_state.active_items:
272
+ lines.append(f"- Active todo: {todo_state.summary}")
273
+ for item in todo_state.active_items:
274
+ lines.append(f" - [{item.id}] {item.status}: {item.content}")
275
275
  if self.interaction_mode == InteractionMode.PLAN:
276
276
  lines.append("- Constraint: plan mode blocks write/insert/replace/edit, write-capable bash, and implement delegation.")
277
277
  elif self.interaction_mode == InteractionMode.GOAL:
@@ -12,7 +12,7 @@ Generate an AGENTS.md file for this project. Write it to the workspace root.
12
12
 
13
13
  ## What to do
14
14
 
15
- 1. Scan the project structure using repo_map, glob, grep, and read tools.
15
+ 1. Scan the project structure using glob, grep, and read tools.
16
16
  2. Detect the language, framework, test runner, linter, and build system.
17
17
  3. Read key config files such as pyproject.toml, package.json, Cargo.toml,
18
18
  go.mod, Makefile, justfile, and README files to extract exact commands.
@@ -28,6 +28,12 @@ _DSML_RUNTIME_INVOKE_RE = re.compile(
28
28
 
29
29
  def todo_run_state_from_result(result: object) -> TodoRunState | None:
30
30
  metadata = getattr(result, "metadata", {}) or {}
31
+
32
+ # Short-circuit for read operations
33
+ todo_op = metadata.get("todo_op")
34
+ if todo_op == "read":
35
+ return None
36
+
31
37
  raw_items = metadata.get("todo_items")
32
38
  summary = metadata.get("todo_summary")
33
39
  if not isinstance(raw_items, list) or not isinstance(summary, str):
@@ -36,9 +42,25 @@ def todo_run_state_from_result(result: object) -> TodoRunState | None:
36
42
  items = [TodoRunItem.model_validate(item) for item in raw_items]
37
43
  except Exception:
38
44
  return None
45
+
46
+ # Build counts
47
+ total = len(items)
48
+ done = sum(1 for item in items if item.status == "completed")
49
+ in_progress = sum(1 for item in items if item.status == "in_progress")
50
+ pending = sum(1 for item in items if item.status == "pending")
51
+ cancelled = sum(1 for item in items if item.status == "cancelled")
52
+
53
+ # Build active_items (only in_progress)
54
+ active_items = [item for item in items if item.status == "in_progress"]
55
+
39
56
  return TodoRunState(
40
57
  summary=summary,
41
- items=items,
58
+ total=total,
59
+ done=done,
60
+ in_progress=in_progress,
61
+ pending=pending,
62
+ cancelled=cancelled,
63
+ active_items=active_items,
42
64
  updated_at=datetime.now(timezone.utc).isoformat(),
43
65
  )
44
66
 
@@ -62,8 +84,12 @@ def apply_todo_state_to_host(host: object, raw_state: object) -> None:
62
84
  if task_state is not None:
63
85
  task_state.todo_state = todo_state
64
86
  if tracker is not None:
65
- if todo_state.items:
66
- tracker.set_todos(todo_state.items)
87
+ if todo_state.total > 0:
88
+ # Convert active_items to dict format for tracker
89
+ todos_dict = {}
90
+ for item in todo_state.active_items:
91
+ todos_dict[item.id] = {"content": item.content, "status": item.status}
92
+ tracker.set_todos_from_dict(todos_dict)
67
93
  else:
68
94
  tracker.clear_todos()
69
95
 
@@ -166,7 +166,7 @@ def _dump_workflow_route(route: WorkflowRoute | None) -> str:
166
166
 
167
167
 
168
168
  def _dump_todo_state(todo_state: TodoRunState | None) -> str:
169
- if todo_state is None or not todo_state.items:
169
+ if todo_state is None or todo_state.total == 0:
170
170
  return ""
171
171
  return json.dumps(todo_state.model_dump(mode="json"), ensure_ascii=False)
172
172
 
@@ -228,7 +228,7 @@ def _load_todo_state(raw: str) -> TodoRunState | None:
228
228
  state = TodoRunState.model_validate(data)
229
229
  except ValueError:
230
230
  return None
231
- return state if state.items else None
231
+ return state if state.total > 0 else None
232
232
 
233
233
 
234
234
  async def save_message_runtime_snapshot(snapshot: MessageRuntimeSnapshot) -> None:
@@ -37,7 +37,6 @@ BASIC_RULES: Ruleset = [
37
37
  Rule(permission="compact", pattern="*", action="allow"),
38
38
  Rule(permission="task_status", pattern="*", action="allow"),
39
39
  Rule(permission="skill", pattern="*", action="allow"),
40
- Rule(permission="repo_map", pattern="*", action="allow"),
41
40
  Rule(permission="lsp", pattern="*", action="allow"),
42
41
  Rule(permission="agent", pattern="voidx", action="allow"),
43
42
  Rule(permission="edit", pattern="*", action="ask"),
@@ -98,7 +97,6 @@ def repair_tool_name(tool: str) -> str:
98
97
  "edit_file": "replace", "shell": "bash",
99
98
  "readfile": "read", "writefile": "file",
100
99
  "search": "grep", "find": "glob",
101
- "RepoMap": "repo_map", "repomap": "repo_map", "Repo_map": "repo_map",
102
100
  "LspDiagnostics": "lsp", "LspSymbols": "lsp",
103
101
  "LspDefinition": "lsp", "LspReferences": "lsp",
104
102
  "CompactContext": "compact",
@@ -163,13 +161,20 @@ def is_safe_bash(command: str) -> bool:
163
161
 
164
162
  def _shell_words(command: str) -> list[str] | None:
165
163
  try:
166
- lexer = shlex.shlex(command, posix=True, punctuation_chars=True)
164
+ lexer = shlex.shlex(command, posix=False, punctuation_chars=True)
167
165
  lexer.whitespace_split = True
168
- return list(lexer)
166
+ return [_strip_quotes(w) for w in lexer]
169
167
  except ValueError:
170
168
  return None
171
169
 
172
170
 
171
+ def _strip_quotes(word: str) -> str:
172
+ """Strip one layer of surrounding single or double quotes (posix=False compat)."""
173
+ if len(word) >= 2 and word[0] == word[-1] and word[0] in ("'", '"'):
174
+ return word[1:-1]
175
+ return word
176
+
177
+
173
178
  def _has_write_redirection(words: list[str]) -> bool:
174
179
  write_redirections = {">", ">>", ">|", "&>", "&>>"}
175
180
  for index, word in enumerate(words):
@@ -354,7 +359,7 @@ def capability_for_tool(tool: str, args: dict) -> PermissionCapability:
354
359
  if tool in {
355
360
  "read", "glob", "grep", "webfetch", "websearch", "todo", "task_status",
356
361
  "skill", "workflow", "compact",
357
- "repo_map", "lsp",
362
+ "lsp",
358
363
  }:
359
364
  return PermissionCapability.READ_TOOLS
360
365
  if tool in {"file", "write", "replace"}: