voidx 3.4.1__tar.gz → 3.4.2__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 (313) hide show
  1. {voidx-3.4.1/src/voidx.egg-info → voidx-3.4.2}/PKG-INFO +1 -1
  2. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/__init__.py +1 -1
  3. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/agent/attachments.py +14 -0
  4. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/ui/output/dock/app.py +16 -40
  5. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/ui/output/tree.py +40 -5
  6. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/ui/tui/panels.py +7 -1
  7. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/ui/tui/parser.py +12 -9
  8. {voidx-3.4.1 → voidx-3.4.2/src/voidx.egg-info}/PKG-INFO +1 -1
  9. {voidx-3.4.1 → voidx-3.4.2}/LICENSE +0 -0
  10. {voidx-3.4.1 → voidx-3.4.2}/README.md +0 -0
  11. {voidx-3.4.1 → voidx-3.4.2}/pyproject.toml +0 -0
  12. {voidx-3.4.1 → voidx-3.4.2}/setup.cfg +0 -0
  13. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/agent/__init__.py +0 -0
  14. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/agent/agents.py +0 -0
  15. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/agent/goal_resolver.py +0 -0
  16. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/agent/graph/__init__.py +0 -0
  17. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/agent/graph/compaction.py +0 -0
  18. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/agent/graph/compaction_coordinator.py +0 -0
  19. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/agent/graph/contracts.py +0 -0
  20. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/agent/graph/convergence.py +0 -0
  21. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/agent/graph/core/__init__.py +0 -0
  22. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/agent/graph/core/_voidx_graph.py +0 -0
  23. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/agent/graph/core/helpers.py +0 -0
  24. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/agent/graph/core/llm.py +0 -0
  25. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/agent/graph/permissions.py +0 -0
  26. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/agent/graph/run_loop.py +0 -0
  27. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/agent/graph/runtime.py +0 -0
  28. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/agent/graph/runtime_guards.py +0 -0
  29. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/agent/graph/session_mixin.py +0 -0
  30. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/agent/graph/session_runtime.py +0 -0
  31. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/agent/graph/streaming.py +0 -0
  32. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/agent/graph/subagent.py +0 -0
  33. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/agent/graph/title_mixin.py +0 -0
  34. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/agent/graph/todo_events.py +0 -0
  35. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/agent/graph/tool_execution.py +0 -0
  36. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/agent/graph/tool_executor/__init__.py +0 -0
  37. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/agent/graph/tool_executor/executor.py +0 -0
  38. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/agent/graph/tool_executor/guards.py +0 -0
  39. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/agent/graph/tool_executor/helpers.py +0 -0
  40. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/agent/graph/tool_executor/types.py +0 -0
  41. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/agent/graph/tool_executor/ui.py +0 -0
  42. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/agent/graph/tool_executor/workflow.py +0 -0
  43. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/agent/graph/topology.py +0 -0
  44. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/agent/graph/transcript_mixin.py +0 -0
  45. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/agent/graph/turn_mixin.py +0 -0
  46. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/agent/graph/turn_runner.py +0 -0
  47. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/agent/graph/wiring.py +0 -0
  48. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/agent/graph/workflow_utils.py +0 -0
  49. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/agent/message_rows.py +0 -0
  50. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/agent/message_trimming.py +0 -0
  51. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/agent/prompts.py +0 -0
  52. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/agent/runtime_context.py +0 -0
  53. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/agent/slash/__init__.py +0 -0
  54. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/agent/slash/code_ide.py +0 -0
  55. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/agent/slash/guide.py +0 -0
  56. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/agent/slash/handler.py +0 -0
  57. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/agent/slash/host.py +0 -0
  58. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/agent/slash/init.py +0 -0
  59. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/agent/slash/lsp.py +0 -0
  60. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/agent/slash/mcp.py +0 -0
  61. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/agent/slash/model.py +0 -0
  62. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/agent/slash/profile.py +0 -0
  63. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/agent/slash/runtime.py +0 -0
  64. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/agent/slash/session.py +0 -0
  65. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/agent/slash/skills.py +0 -0
  66. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/agent/slash/upgrade.py +0 -0
  67. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/agent/state.py +0 -0
  68. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/agent/task_state.py +0 -0
  69. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/agent/todo_state.py +0 -0
  70. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/agent/tool_call_ids.py +0 -0
  71. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/agent/tool_exchange_sanitizer.py +0 -0
  72. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/agent/tool_filters.py +0 -0
  73. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/agent/tool_messages.py +0 -0
  74. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/agent/tool_result_storage.py +0 -0
  75. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/config/__init__.py +0 -0
  76. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/config/enums.py +0 -0
  77. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/config/models.py +0 -0
  78. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/config/permissions.py +0 -0
  79. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/config/settings.py +0 -0
  80. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/config/settings_agent.py +0 -0
  81. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/config/settings_api_keys.py +0 -0
  82. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/config/settings_code_ide.py +0 -0
  83. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/config/settings_custom.py +0 -0
  84. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/config/settings_mcp.py +0 -0
  85. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/config/settings_permissions.py +0 -0
  86. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/config/settings_skills.py +0 -0
  87. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/config/settings_update.py +0 -0
  88. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/config/settings_utils.py +0 -0
  89. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/config/settings_web.py +0 -0
  90. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/data/__init__.py +0 -0
  91. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/data/templates/api-doc.md +0 -0
  92. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/data/templates/prd.md +0 -0
  93. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/data/templates/readme.md +0 -0
  94. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/data/templates/rfc.md +0 -0
  95. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/data/templates/tech-design.md +0 -0
  96. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/diffing.py +0 -0
  97. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/llm/__init__.py +0 -0
  98. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/llm/catalog.py +0 -0
  99. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/llm/compaction.py +0 -0
  100. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/llm/context.py +0 -0
  101. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/llm/instruction.py +0 -0
  102. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/llm/message_markers.py +0 -0
  103. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/llm/message_status.py +0 -0
  104. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/llm/provider.py +0 -0
  105. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/llm/service.py +0 -0
  106. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/llm/usage.py +0 -0
  107. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/logging/__init__.py +0 -0
  108. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/logging/request_log.py +0 -0
  109. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/logging/tool_log.py +0 -0
  110. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/lsp/__init__.py +0 -0
  111. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/lsp/client.py +0 -0
  112. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/lsp/config.py +0 -0
  113. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/lsp/detector.py +0 -0
  114. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/lsp/detector_data.py +0 -0
  115. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/lsp/errors.py +0 -0
  116. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/lsp/manager.py +0 -0
  117. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/lsp/schema.py +0 -0
  118. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/lsp/service.py +0 -0
  119. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/main.py +0 -0
  120. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/mcp/__init__.py +0 -0
  121. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/mcp/client/__init__.py +0 -0
  122. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/mcp/client/base.py +0 -0
  123. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/mcp/client/errors.py +0 -0
  124. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/mcp/client/http_transport.py +0 -0
  125. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/mcp/client/sse_transport.py +0 -0
  126. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/mcp/client/stdio_transport.py +0 -0
  127. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/mcp/manager.py +0 -0
  128. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/mcp/schema.py +0 -0
  129. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/mcp/tool.py +0 -0
  130. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/mcp_servers/__init__.py +0 -0
  131. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/mcp_servers/web.py +0 -0
  132. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/memory/__init__.py +0 -0
  133. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/memory/cleanup.py +0 -0
  134. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/memory/context_frames.py +0 -0
  135. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/memory/jsonl_store.py +0 -0
  136. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/memory/model_profiles.py +0 -0
  137. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/memory/runtime_state.py +0 -0
  138. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/memory/service.py +0 -0
  139. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/memory/session.py +0 -0
  140. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/memory/store.py +0 -0
  141. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/memory/subagents.py +0 -0
  142. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/memory/transcript.py +0 -0
  143. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/permission/__init__.py +0 -0
  144. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/permission/context.py +0 -0
  145. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/permission/engine.py +0 -0
  146. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/permission/evaluate.py +0 -0
  147. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/permission/rules.py +0 -0
  148. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/permission/sandbox.py +0 -0
  149. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/permission/schema.py +0 -0
  150. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/permission/service.py +0 -0
  151. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/permission/wildcard.py +0 -0
  152. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/runtime/__init__.py +0 -0
  153. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/runtime/attachments.py +0 -0
  154. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/runtime/intent.py +0 -0
  155. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/runtime/reference_tokens.py +0 -0
  156. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/runtime/task_state.py +0 -0
  157. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/runtime/todo.py +0 -0
  158. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/runtime/ui.py +0 -0
  159. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/runtime/ui_port.py +0 -0
  160. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/selfupdate.py +0 -0
  161. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/skills/__init__.py +0 -0
  162. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/skills/context.py +0 -0
  163. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/skills/references.py +0 -0
  164. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/skills/registry.py +0 -0
  165. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/skills/schema.py +0 -0
  166. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/skills/service.py +0 -0
  167. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/tools/__init__.py +0 -0
  168. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/tools/agent.py +0 -0
  169. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/tools/base.py +0 -0
  170. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/tools/bash/__init__.py +0 -0
  171. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/tools/bash/core.py +0 -0
  172. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/tools/bash/hint/__init__.py +0 -0
  173. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/tools/bash/hint/file.py +0 -0
  174. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/tools/bash/hint/git.py +0 -0
  175. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/tools/bash/hint/search.py +0 -0
  176. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/tools/bash/router.py +0 -0
  177. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/tools/bash/safety.py +0 -0
  178. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/tools/bash/tool.py +0 -0
  179. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/tools/clarify.py +0 -0
  180. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/tools/compact_context.py +0 -0
  181. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/tools/file_ops/__init__.py +0 -0
  182. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/tools/file_ops/edit_execute.py +0 -0
  183. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/tools/file_ops/edit_resolve.py +0 -0
  184. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/tools/file_ops/file.py +0 -0
  185. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/tools/file_ops/read.py +0 -0
  186. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/tools/file_ops/types.py +0 -0
  187. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/tools/file_ops/write.py +0 -0
  188. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/tools/file_state.py +0 -0
  189. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/tools/git.py +0 -0
  190. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/tools/load_doc_template.py +0 -0
  191. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/tools/load_skills.py +0 -0
  192. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/tools/lsp.py +0 -0
  193. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/tools/plan_checkpoint.py +0 -0
  194. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/tools/powershell/__init__.py +0 -0
  195. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/tools/powershell/core.py +0 -0
  196. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/tools/powershell/hint/__init__.py +0 -0
  197. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/tools/powershell/hint/file.py +0 -0
  198. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/tools/powershell/hint/search.py +0 -0
  199. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/tools/powershell/router.py +0 -0
  200. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/tools/powershell/safety.py +0 -0
  201. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/tools/powershell/sandbox.py +0 -0
  202. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/tools/powershell/tool.py +0 -0
  203. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/tools/registry.py +0 -0
  204. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/tools/search.py +0 -0
  205. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/tools/service.py +0 -0
  206. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/tools/shell/__init__.py +0 -0
  207. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/tools/shell/common.py +0 -0
  208. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/tools/shell/hint/__init__.py +0 -0
  209. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/tools/shell/hint/git.py +0 -0
  210. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/tools/skills.py +0 -0
  211. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/tools/task_status.py +0 -0
  212. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/tools/task_tracker.py +0 -0
  213. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/tools/todo.py +0 -0
  214. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/tools/web_content.py +0 -0
  215. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/tools/web_mcp.py +0 -0
  216. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/tools/webfetch.py +0 -0
  217. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/tools/websearch.py +0 -0
  218. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/tools/workflow.py +0 -0
  219. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/ui/__init__.py +0 -0
  220. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/ui/commands.py +0 -0
  221. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/ui/frontend.py +0 -0
  222. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/ui/gateway/__init__.py +0 -0
  223. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/ui/gateway/adapter.py +0 -0
  224. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/ui/gateway/bootstrap.py +0 -0
  225. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/ui/gateway/diff_review.py +0 -0
  226. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/ui/gateway/server.py +0 -0
  227. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/ui/gateway/session.py +0 -0
  228. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/ui/gateway/terminal.py +0 -0
  229. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/ui/output/__init__.py +0 -0
  230. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/ui/output/agent_display.py +0 -0
  231. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/ui/output/browse.py +0 -0
  232. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/ui/output/capture.py +0 -0
  233. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/ui/output/console/__init__.py +0 -0
  234. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/ui/output/console/app.py +0 -0
  235. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/ui/output/console/formatting.py +0 -0
  236. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/ui/output/console/streaming.py +0 -0
  237. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/ui/output/diff.py +0 -0
  238. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/ui/output/display_policy.py +0 -0
  239. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/ui/output/dock/__init__.py +0 -0
  240. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/ui/output/dock/agent_placeholder.py +0 -0
  241. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/ui/output/dock/formatting.py +0 -0
  242. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/ui/output/dock/nodes.py +0 -0
  243. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/ui/output/dock/nodes_checkpoint.py +0 -0
  244. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/ui/output/dock/nodes_clarify.py +0 -0
  245. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/ui/output/dock/nodes_permission.py +0 -0
  246. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/ui/output/dock/nodes_startup.py +0 -0
  247. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/ui/output/dock/nodes_status.py +0 -0
  248. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/ui/output/dock/state.py +0 -0
  249. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/ui/output/dock/status.py +0 -0
  250. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/ui/output/dock/stream.py +0 -0
  251. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/ui/output/dock/todo.py +0 -0
  252. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/ui/output/events/__init__.py +0 -0
  253. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/ui/output/events/bus.py +0 -0
  254. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/ui/output/events/consumers.py +0 -0
  255. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/ui/output/events/schema.py +0 -0
  256. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/ui/output/types.py +0 -0
  257. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/ui/protocol/__init__.py +0 -0
  258. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/ui/protocol/commands.py +0 -0
  259. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/ui/protocol/envelope.py +0 -0
  260. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/ui/protocol/requests.py +0 -0
  261. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/ui/protocol/schema.py +0 -0
  262. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/ui/protocol/transcript.py +0 -0
  263. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/ui/protocol/v2/__init__.py +0 -0
  264. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/ui/protocol/v2/envelope.py +0 -0
  265. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/ui/protocol/v2/methods.py +0 -0
  266. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/ui/protocol/v2/snapshot.py +0 -0
  267. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/ui/protocol/v2/threads.py +0 -0
  268. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/ui/session.py +0 -0
  269. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/ui/tools/__init__.py +0 -0
  270. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/ui/tools/attachment_tokens.py +0 -0
  271. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/ui/tools/clipboard_image.py +0 -0
  272. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/ui/tools/clipboard_text.py +0 -0
  273. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/ui/tools/code_ide.py +0 -0
  274. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/ui/tools/file_picker.py +0 -0
  275. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/ui/tools/skill_picker.py +0 -0
  276. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/ui/transcript.py +0 -0
  277. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/ui/tui/__init__.py +0 -0
  278. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/ui/tui/activity.py +0 -0
  279. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/ui/tui/app.py +0 -0
  280. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/ui/tui/choice_mixin.py +0 -0
  281. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/ui/tui/clipboard_mixin.py +0 -0
  282. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/ui/tui/helpers.py +0 -0
  283. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/ui/tui/input.py +0 -0
  284. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/ui/tui/overlays.py +0 -0
  285. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/ui/tui/render_activity.py +0 -0
  286. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/ui/tui/render_frame.py +0 -0
  287. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/ui/tui/render_input.py +0 -0
  288. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/ui/tui/render_status.py +0 -0
  289. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/ui/tui/render_todo.py +0 -0
  290. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/ui/tui/renderer.py +0 -0
  291. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/ui/tui/state.py +0 -0
  292. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/ui/tui/terminal_mixin.py +0 -0
  293. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/ui/tui/text_prompt_mixin.py +0 -0
  294. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/workflow/__init__.py +0 -0
  295. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/workflow/auto_advance.py +0 -0
  296. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/workflow/context.py +0 -0
  297. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/workflow/dag.py +0 -0
  298. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/workflow/nodes.py +0 -0
  299. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/workflow/policy.py +0 -0
  300. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/workflow/reconcile.py +0 -0
  301. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/workflow/render.py +0 -0
  302. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/workflow/route.py +0 -0
  303. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/workflow/runtime.py +0 -0
  304. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/workflow/schema.py +0 -0
  305. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/workflow/service.py +0 -0
  306. {voidx-3.4.1 → voidx-3.4.2}/src/voidx/workflow/types.py +0 -0
  307. {voidx-3.4.1 → voidx-3.4.2}/src/voidx.egg-info/SOURCES.txt +0 -0
  308. {voidx-3.4.1 → voidx-3.4.2}/src/voidx.egg-info/dependency_links.txt +0 -0
  309. {voidx-3.4.1 → voidx-3.4.2}/src/voidx.egg-info/entry_points.txt +0 -0
  310. {voidx-3.4.1 → voidx-3.4.2}/src/voidx.egg-info/requires.txt +0 -0
  311. {voidx-3.4.1 → voidx-3.4.2}/src/voidx.egg-info/top_level.txt +0 -0
  312. {voidx-3.4.1 → voidx-3.4.2}/tests/test_install_sh.py +0 -0
  313. {voidx-3.4.1 → voidx-3.4.2}/tests/test_npm_package.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: voidx
3
- Version: 3.4.1
3
+ Version: 3.4.2
4
4
  Summary: A coding agent that quantifies everything and solves with tools, not fuzzy prompts.
5
5
  Author: chikhamx
6
6
  License: MIT
@@ -1,3 +1,3 @@
1
1
  """VoidX - A coding agent that quantifies everything."""
2
2
 
3
- __version__ = "3.4.1"
3
+ __version__ = "3.4.2"
@@ -152,9 +152,23 @@ def is_image_path(path: Path | str) -> bool:
152
152
  return Path(path).suffix.lower() in IMAGE_EXTENSIONS
153
153
 
154
154
 
155
+ _PASTED_RE = re.compile(r"<pasted>\n.*?\n</pasted>", re.DOTALL)
156
+
157
+
158
+ def _pasted_spans(text: str) -> list[tuple[int, int]]:
159
+ """Return (start, end) spans of all <pasted>...</pasted> blocks."""
160
+ return [(m.start(), m.end()) for m in _PASTED_RE.finditer(text)]
161
+
162
+
155
163
  def _attachment_tokens(text: str) -> list[tuple[int, int, str]]:
156
164
  tokens: list[tuple[int, int, str]] = []
165
+ excluded = _pasted_spans(text)
157
166
  for match in _ATTACHMENT_RE.finditer(text):
167
+ # Skip @-references and [image-] tokens inside <pasted> blocks —
168
+ # pasted content is quoted material (e.g. code with decorators),
169
+ # not user-authored attachment references.
170
+ if any(start <= match.start() < end for start, end in excluded):
171
+ continue
158
172
  image_stem = match.group(3)
159
173
  if image_stem:
160
174
  raw_path = f":image:{image_stem}"
@@ -7,17 +7,15 @@ from typing import Any, Callable, Sequence
7
7
 
8
8
  from rich.console import Console, Group
9
9
  from rich.live import Live
10
- from rich.markup import escape
11
10
  from rich.text import Text
12
11
 
12
+ from rich.markup import escape
13
+
13
14
  from voidx.ui.output.dock.formatting import (
14
15
  ANSI_LINE_PREFIX,
15
- _ansi_line,
16
16
  _clean,
17
- _markdown_lines,
18
- _strip_ansi_trailing_space,
17
+ _PASTED_RE,
19
18
  _text_from_line,
20
- split_pasted_segments,
21
19
  )
22
20
  from voidx.ui.output.dock.nodes import DockNodeMixin
23
21
  from voidx.ui.output.dock.stream import DockStreamMixin
@@ -222,12 +220,13 @@ class BottomInputDock(DockStreamMixin, DockStatusMixin, DockNodeMixin):
222
220
  if self._tree.root.children:
223
221
  self._append_root_spacer()
224
222
  preview = _clean(text)
225
- segments = split_pasted_segments(preview)
226
- header, body_lines = self._render_turn_segments(segments)
223
+ preview = _PASTED_RE.sub(r"\1", preview)
224
+ header, body_lines = self._render_turn_text(preview)
225
+ header = f"[bold white]❯[/] {header}" if header else "[bold white]❯[/]"
227
226
  self._current_turn = self._tree.new_node(
228
227
  parent=self._tree.root,
229
228
  node_type="turn",
230
- header=f"[bold white]❯[/] {header}",
229
+ header=header,
231
230
  body_lines=body_lines,
232
231
  collapsed=False,
233
232
  )
@@ -235,40 +234,17 @@ class BottomInputDock(DockStreamMixin, DockStatusMixin, DockNodeMixin):
235
234
  self.refresh()
236
235
  return self._current_turn
237
236
 
238
- def _render_turn_segments(
239
- self, segments: list[tuple[bool, str]]
240
- ) -> tuple[str, list[str]]:
241
- """Render (is_pasted, content) segments into (header, body_lines).
237
+ def _render_turn_text(self, text: str) -> tuple[str, list[str]]:
238
+ """Render user turn text into (header, body_lines) as plain text.
242
239
 
243
- Non-pasted segments use escape() plain text (existing behavior).
244
- Pasted segments use _markdown_lines() with _ansi_line() wrapping.
240
+ <pasted> wrapper tags are stripped (content kept), then the entire
241
+ text is rendered as escaped plain text — no markdown formatting.
245
242
  """
246
- header = ""
247
- body_lines: list[str] = []
248
- width = self._markdown_width()
249
- for index, (is_pasted, content) in enumerate(segments):
250
- if is_pasted:
251
- md_lines = [
252
- _ansi_line(line)
253
- for line in _markdown_lines(content, width)
254
- ]
255
- if index == 0 and md_lines:
256
- header = md_lines[0]
257
- body_lines.extend(md_lines[1:])
258
- else:
259
- body_lines.extend(md_lines)
260
- else:
261
- lines = [
262
- _strip_ansi_trailing_space(line)
263
- for line in ((content.splitlines() or [content]) if content else [])
264
- ]
265
- if index == 0 and lines:
266
- header = escape(lines[0])
267
- body_lines.extend(escape(line) for line in lines[1:])
268
- else:
269
- body_lines.extend(escape(line) for line in lines)
270
- if not header and body_lines:
271
- header = body_lines.pop(0)
243
+ lines = text.splitlines() or [text] if text else []
244
+ if not lines:
245
+ return "", []
246
+ header = escape(lines[0])
247
+ body_lines = [escape(line) for line in lines[1:]]
272
248
  return header, body_lines
273
249
 
274
250
  def ensure_agent(self) -> OutputNode:
@@ -14,6 +14,27 @@ from rich.text import Text
14
14
  USER_ROW_STYLE = "white on #3a3937"
15
15
  TOOL_META_BRANCH = "[dim]└[/dim] "
16
16
 
17
+ # Must match voidx.ui.output.dock.formatting.ANSI_LINE_PREFIX.
18
+ # Duplicated here to avoid circular imports (formatting imports from dock,
19
+ # dock imports from tree).
20
+ _ANSI_LINE_PREFIX = "\x00voidx-ansi\x00"
21
+
22
+
23
+ def _visible_len(line: str) -> int:
24
+ """Compute visible cell length of a render line safely.
25
+
26
+ Lines may contain an ANSI_LINE_PREFIX marker separating rich-markup text
27
+ from ANSI-styled text (pasted segments). The ANSI portion can contain
28
+ arbitrary characters including ``[/]`` that would crash Text.from_markup,
29
+ so it is parsed with Text.from_ansi instead.
30
+ """
31
+ marker = line.find(_ANSI_LINE_PREFIX)
32
+ if marker == -1:
33
+ return cell_len(Text.from_markup(line).plain)
34
+ text = Text.from_markup(line[:marker])
35
+ text.append_text(Text.from_ansi(line[marker + len(_ANSI_LINE_PREFIX):]))
36
+ return cell_len(text.plain)
37
+
17
38
 
18
39
  @dataclass
19
40
  class OutputNode:
@@ -617,15 +638,29 @@ class OutputTree:
617
638
 
618
639
 
619
640
  def _full_width_row(line: str, width: int) -> str:
620
- visible = cell_len(Text.from_markup(line).plain)
641
+ visible = _visible_len(line)
621
642
  padding = " " * max(0, width - visible)
622
- return f"[{USER_ROW_STYLE}]{line}{padding}[/]"
643
+ return _wrap_full_width(line, padding, USER_ROW_STYLE)
623
644
 
624
645
 
625
646
  def _permission_row(line: str, width: int) -> str:
626
- visible = cell_len(Text.from_markup(line).plain)
647
+ visible = _visible_len(line)
627
648
  padding = " " * max(0, width - visible)
628
- return f"[white on #3a3937]{line}{padding}[/]"
649
+ return _wrap_full_width(line, padding, "white on #3a3937")
650
+
651
+
652
+ def _wrap_full_width(line: str, padding: str, style: str) -> str:
653
+ """Wrap a line with a background style and padding to full width.
654
+
655
+ When the line contains an ANSI_LINE_PREFIX marker, the closing tag and
656
+ padding must go *before* the marker so that _text_from_line parses them
657
+ with Text.from_markup (which understands tags) rather than leaving them
658
+ as literal text in the Text.from_ansi portion.
659
+ """
660
+ marker = line.find(_ANSI_LINE_PREFIX)
661
+ if marker == -1:
662
+ return f"[{style}]{line}{padding}[/]"
663
+ return f"[{style}]{line[:marker]}{padding}[/]{line[marker:]}"
629
664
 
630
665
 
631
666
  def _is_full_width_user_row(node: OutputNode) -> bool:
@@ -644,7 +679,7 @@ def _pad_diff_background_row(line: str, width: int) -> str:
644
679
  marker = "[/on #4a0000]"
645
680
  if not marker:
646
681
  return line
647
- visible = cell_len(Text.from_markup(line).plain)
682
+ visible = _visible_len(line)
648
683
  padding = " " * max(0, width - visible)
649
684
  return line.replace(marker, f"{padding}{marker}", 1)
650
685
 
@@ -7,6 +7,7 @@ from typing import Any
7
7
 
8
8
  from voidx.config import Settings
9
9
  from voidx.skills.service import SkillRegistry, SkillService
10
+ from voidx.ui.output.dock.formatting import _PASTED_RE
10
11
  from voidx.ui.tools.attachment_tokens import attachment_token_text
11
12
  from voidx.ui.tools.file_picker import (
12
13
  AttachmentToken,
@@ -37,7 +38,12 @@ class _PanelManagerMixin:
37
38
  # ── submit ───────────────────────────────────────────────────────────
38
39
 
39
40
  def _submit_text_prompt(self) -> None:
40
- value = self._get_input_text()
41
+ value = self._expand_registered_tokens(self._get_input_text())
42
+ # Clarify answers are plain text — strip <pasted> wrapper tags that
43
+ # _expand_registered_tokens adds (those tags are only consumed by the
44
+ # main input path's split_pasted_segments in start_turn rendering).
45
+ value = _PASTED_RE.sub(r"\1", value)
46
+ self._paste_entries.clear()
41
47
  self._text_queue.put_nowait(value)
42
48
 
43
49
  def _cancel_text_prompt(self) -> None:
@@ -101,9 +101,13 @@ class _InputParserMixin:
101
101
  (multiple newlines or a long run), wraps them in a bracketed-paste
102
102
  sequence so ``_process_paste`` handles them as a unit.
103
103
 
104
- Works with ANY first character, not just newlines — pasted text
105
- often starts with a regular character (e.g. "line1\\r\\nline2").
106
- Returns the bracketed-paste bytes, or ``None`` if this is not a paste.
104
+ Returns the bracketed-paste bytes when the drained content looks
105
+ like a paste. Returns the raw bytes of ALL drained characters
106
+ (including ``first_char``) when they don't look like a paste
107
+ this lets the caller process them in arrival order without
108
+ stashing extras into ``_pending_bytes``, which previously caused
109
+ IME/keyboard characters to be reordered across reads. Returns
110
+ ``None`` when nothing follows ``first_char`` (a single keypress).
107
111
  """
108
112
  import msvcrt
109
113
  import time
@@ -132,12 +136,11 @@ class _InputParserMixin:
132
136
  newline_count = buffer.count("\r") + buffer.count("\n")
133
137
  if newline_count >= 2 or len(buffer) > 8:
134
138
  return b"\x1b[200~" + buffer.encode("utf-8", errors="replace") + b"\x1b[201~"
135
- # Not a paste: preserve any extra chars we consumed so they are
136
- # processed on the next _process_input call instead of being lost.
137
- extra = buffer[1:]
138
- if extra:
139
- self._pending_bytes = extra.encode("utf-8", errors="replace")
140
- return None
139
+ # Not a paste: return all drained chars as raw bytes so the caller
140
+ # processes them in arrival order. Previously, only first_char was
141
+ # returned and the rest was stashed in _pending_bytes, which caused
142
+ # fast IME/keyboard input to be reordered across reads.
143
+ return buffer.encode("utf-8", errors="replace")
141
144
 
142
145
  async def _read_input_line(self) -> bytes:
143
146
  """Fallback: read a line from stdin (not a tty)."""
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: voidx
3
- Version: 3.4.1
3
+ Version: 3.4.2
4
4
  Summary: A coding agent that quantifies everything and solves with tools, not fuzzy prompts.
5
5
  Author: chikhamx
6
6
  License: MIT
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes