voidx 2.2.1__tar.gz → 2.3.0__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.
- {voidx-2.2.1 → voidx-2.3.0}/PKG-INFO +1 -1
- {voidx-2.2.1 → voidx-2.3.0}/pyproject.toml +2 -1
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/__init__.py +1 -1
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/agent/agents.py +30 -15
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/agent/attachments.py +23 -3
- voidx-2.3.0/src/voidx/agent/graph/compaction.py +81 -0
- voidx-2.3.0/src/voidx/agent/graph/compaction_coordinator.py +478 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/agent/graph/contracts.py +135 -67
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/agent/graph/core.py +213 -81
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/agent/graph/permissions.py +46 -7
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/agent/graph/run_loop.py +99 -48
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/agent/graph/runtime.py +0 -2
- voidx-2.3.0/src/voidx/agent/graph/session_mixin.py +38 -0
- voidx-2.3.0/src/voidx/agent/graph/session_runtime.py +327 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/agent/graph/streaming.py +71 -16
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/agent/graph/subagent.py +30 -68
- voidx-2.3.0/src/voidx/agent/graph/title_mixin.py +100 -0
- voidx-2.3.0/src/voidx/agent/graph/todo_events.py +17 -0
- voidx-2.3.0/src/voidx/agent/graph/tool_execution.py +41 -0
- voidx-2.3.0/src/voidx/agent/graph/tool_executor.py +640 -0
- voidx-2.3.0/src/voidx/agent/graph/transcript_mixin.py +18 -0
- voidx-2.3.0/src/voidx/agent/graph/turn_mixin.py +40 -0
- voidx-2.2.1/src/voidx/agent/graph/turn_mixin.py → voidx-2.3.0/src/voidx/agent/graph/turn_runner.py +125 -108
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/agent/intent_refinement.py +89 -33
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/agent/runtime_context.py +100 -12
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/agent/slash/code_ide.py +4 -4
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/agent/slash/guide.py +3 -4
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/agent/slash/handler.py +46 -163
- voidx-2.3.0/src/voidx/agent/slash/host.py +365 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/agent/slash/init.py +4 -4
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/agent/slash/lsp.py +6 -6
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/agent/slash/mcp.py +22 -21
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/agent/slash/model.py +79 -76
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/agent/slash/profile.py +9 -8
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/agent/slash/runtime.py +0 -2
- voidx-2.3.0/src/voidx/agent/slash/session.py +139 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/agent/slash/skills.py +35 -11
- voidx-2.3.0/src/voidx/agent/slash/upgrade.py +98 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/agent/state.py +4 -3
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/agent/task_state.py +4 -0
- voidx-2.3.0/src/voidx/agent/todo_state.py +196 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/config/settings.py +2 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/config/settings_skills.py +26 -1
- voidx-2.3.0/src/voidx/config/settings_update.py +72 -0
- voidx-2.3.0/src/voidx/data/templates/api-doc.md +64 -0
- voidx-2.3.0/src/voidx/data/templates/prd.md +117 -0
- voidx-2.3.0/src/voidx/data/templates/readme.md +55 -0
- voidx-2.3.0/src/voidx/data/templates/rfc.md +38 -0
- voidx-2.3.0/src/voidx/data/templates/tech-design.md +68 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/llm/compaction.py +17 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/llm/instruction.py +43 -41
- voidx-2.3.0/src/voidx/llm/provider.py +542 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/lsp/__init__.py +9 -1
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/lsp/client.py +9 -2
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/lsp/manager.py +70 -22
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/memory/runtime_state.py +37 -12
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/memory/store.py +4 -2
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/permission/rules.py +4 -1
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/runtime/__init__.py +4 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/runtime/task_state.py +20 -8
- voidx-2.3.0/src/voidx/runtime/ui_port.py +178 -0
- voidx-2.3.0/src/voidx/selfupdate.py +207 -0
- voidx-2.3.0/src/voidx/skills/__init__.py +23 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/skills/context.py +4 -5
- voidx-2.3.0/src/voidx/skills/policy.py +43 -0
- voidx-2.3.0/src/voidx/skills/references.py +73 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/skills/registry.py +2 -1
- voidx-2.3.0/src/voidx/skills/runtime.py +25 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/skills/schema.py +3 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/skills/service.py +20 -115
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/tools/__init__.py +8 -1
- voidx-2.3.0/src/voidx/tools/advance_workflow.py +206 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/tools/agent.py +5 -5
- voidx-2.2.1/src/voidx/tools/file_ops.py → voidx-2.3.0/src/voidx/tools/apply_patch.py +6 -201
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/tools/base.py +4 -1
- voidx-2.3.0/src/voidx/tools/file_ops.py +184 -0
- voidx-2.3.0/src/voidx/tools/file_state.py +28 -0
- voidx-2.3.0/src/voidx/tools/load_doc_template.py +62 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/tools/load_skills.py +10 -9
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/tools/on_intent.py +7 -7
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/tools/registry.py +5 -2
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/ui/commands.py +6 -0
- voidx-2.3.0/src/voidx/ui/output/events/__init__.py +102 -0
- voidx-2.3.0/src/voidx/ui/output/events/bus.py +119 -0
- voidx-2.2.1/src/voidx/ui/output/events/__init__.py → voidx-2.3.0/src/voidx/ui/output/events/consumers.py +14 -121
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/ui/tools/__init__.py +5 -0
- voidx-2.3.0/src/voidx/ui/tools/skill_picker.py +79 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/ui/tui/app.py +12 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/ui/tui/input.py +7 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/ui/tui/overlays.py +43 -1
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/ui/tui/panels.py +126 -3
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/ui/tui/parser.py +4 -0
- voidx-2.3.0/src/voidx/ui/tui/render_activity.py +77 -0
- voidx-2.3.0/src/voidx/ui/tui/render_frame.py +456 -0
- voidx-2.3.0/src/voidx/ui/tui/render_input.py +154 -0
- voidx-2.3.0/src/voidx/ui/tui/render_status.py +226 -0
- voidx-2.3.0/src/voidx/ui/tui/render_todo.py +81 -0
- voidx-2.3.0/src/voidx/ui/tui/renderer.py +24 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/ui/tui/state.py +14 -0
- voidx-2.3.0/src/voidx/workflow/__init__.py +68 -0
- voidx-2.3.0/src/voidx/workflow/auto_advance.py +162 -0
- voidx-2.3.0/src/voidx/workflow/context.py +66 -0
- voidx-2.3.0/src/voidx/workflow/dag.py +34 -0
- voidx-2.3.0/src/voidx/workflow/nodes.py +322 -0
- voidx-2.3.0/src/voidx/workflow/policy.py +147 -0
- voidx-2.3.0/src/voidx/workflow/render.py +100 -0
- voidx-2.3.0/src/voidx/workflow/runtime.py +278 -0
- voidx-2.3.0/src/voidx/workflow/schema.py +159 -0
- voidx-2.3.0/src/voidx/workflow/service.py +197 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx.egg-info/PKG-INFO +1 -1
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx.egg-info/SOURCES.txt +46 -9
- voidx-2.3.0/tests/test_auto_advance.py +410 -0
- {voidx-2.2.1 → voidx-2.3.0}/tests/test_compaction.py +168 -29
- {voidx-2.2.1 → voidx-2.3.0}/tests/test_config.py +44 -3
- {voidx-2.2.1 → voidx-2.3.0}/tests/test_instruction_cache.py +1 -1
- voidx-2.3.0/tests/test_llm_provider.py +632 -0
- {voidx-2.2.1 → voidx-2.3.0}/tests/test_lsp.py +143 -2
- {voidx-2.2.1 → voidx-2.3.0}/tests/test_npm_package.py +7 -0
- voidx-2.3.0/tests/test_selfupdate.py +103 -0
- {voidx-2.2.1 → voidx-2.3.0}/tests/test_skills.py +350 -260
- voidx-2.3.0/tests/test_tui_frame_rendering.py +472 -0
- voidx-2.3.0/tests/test_tui_input_handling.py +865 -0
- voidx-2.3.0/tests/test_tui_output_tree.py +301 -0
- voidx-2.3.0/tests/test_tui_paste_handling.py +280 -0
- voidx-2.3.0/tests/test_tui_status_activity.py +723 -0
- voidx-2.3.0/tests/test_tui_terminal_panels.py +710 -0
- {voidx-2.2.1 → voidx-2.3.0}/tests/test_ui_events.py +23 -2
- voidx-2.2.1/src/voidx/agent/graph/compaction.py +0 -323
- voidx-2.2.1/src/voidx/agent/graph/session_mixin.py +0 -60
- voidx-2.2.1/src/voidx/agent/graph/title_mixin.py +0 -211
- voidx-2.2.1/src/voidx/agent/graph/todo_events.py +0 -21
- voidx-2.2.1/src/voidx/agent/graph/tool_execution.py +0 -475
- voidx-2.2.1/src/voidx/agent/graph/transcript_mixin.py +0 -34
- voidx-2.2.1/src/voidx/agent/slash/session.py +0 -239
- voidx-2.2.1/src/voidx/llm/provider.py +0 -320
- voidx-2.2.1/src/voidx/skills/__init__.py +0 -34
- voidx-2.2.1/src/voidx/skills/bundled/brainstorming/SKILL.md +0 -51
- voidx-2.2.1/src/voidx/skills/bundled/receiving-code-review/SKILL.md +0 -60
- voidx-2.2.1/src/voidx/skills/bundled/requesting-code-review/SKILL.md +0 -59
- voidx-2.2.1/src/voidx/skills/bundled/systematic-debugging/SKILL.md +0 -64
- voidx-2.2.1/src/voidx/skills/bundled/test-driven-development/SKILL.md +0 -61
- voidx-2.2.1/src/voidx/skills/bundled/verification-before-completion/SKILL.md +0 -69
- voidx-2.2.1/src/voidx/skills/bundled/writing-design-docs/SKILL.md +0 -87
- voidx-2.2.1/src/voidx/skills/bundled/writing-plans/SKILL.md +0 -54
- voidx-2.2.1/src/voidx/skills/policy.py +0 -121
- voidx-2.2.1/src/voidx/skills/runtime.py +0 -252
- voidx-2.2.1/src/voidx/ui/tui/renderer.py +0 -905
- voidx-2.2.1/tests/test_llm_provider.py +0 -225
- voidx-2.2.1/tests/test_pure_tui.py +0 -3204
- {voidx-2.2.1 → voidx-2.3.0}/README.md +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/setup.cfg +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/agent/__init__.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/agent/graph/__init__.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/agent/graph/convergence.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/agent/graph/topology.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/agent/graph/wiring.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/agent/message_rows.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/agent/slash/__init__.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/agent/tool_filters.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/agent/tool_messages.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/config/__init__.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/config/cli.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/config/enums.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/config/models.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/config/permissions.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/config/settings_agent.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/config/settings_api_keys.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/config/settings_code_ide.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/config/settings_custom.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/config/settings_mcp.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/config/settings_permissions.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/config/settings_utils.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/config/settings_web.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/data/__init__.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/data/intent_classifier.json +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/diffing.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/llm/__init__.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/llm/catalog.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/llm/context.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/llm/message_markers.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/llm/usage.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/lsp/config.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/lsp/detector.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/lsp/detector_data.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/lsp/errors.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/lsp/schema.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/lsp/service.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/main.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/mcp/__init__.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/mcp/client/__init__.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/mcp/client/base.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/mcp/client/errors.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/mcp/client/http_transport.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/mcp/client/sse_transport.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/mcp/client/stdio_transport.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/mcp/manager.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/mcp/schema.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/mcp/tool.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/mcp_servers/__init__.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/mcp_servers/web.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/memory/__init__.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/memory/context_frames.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/memory/model_profiles.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/memory/session.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/memory/transcript.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/permission/__init__.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/permission/context.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/permission/engine.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/permission/evaluate.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/permission/sandbox.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/permission/schema.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/permission/service.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/permission/wildcard.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/runtime/intent.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/runtime/intent_classifier.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/runtime/ui.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/tools/bash.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/tools/clarify.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/tools/git.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/tools/lsp.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/tools/plan_checkpoint.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/tools/repomap.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/tools/search.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/tools/task_status.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/tools/task_tracker.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/tools/todo.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/tools/web_content.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/tools/web_mcp.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/tools/webfetch.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/tools/websearch.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/ui/__init__.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/ui/frontend.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/ui/gateway/__init__.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/ui/gateway/bootstrap.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/ui/gateway/server.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/ui/gateway/session.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/ui/output/__init__.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/ui/output/agent_display.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/ui/output/browse.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/ui/output/capture.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/ui/output/console/__init__.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/ui/output/console/app.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/ui/output/console/formatting.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/ui/output/console/streaming.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/ui/output/diff.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/ui/output/dock/__init__.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/ui/output/dock/agent_placeholder.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/ui/output/dock/app.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/ui/output/dock/formatting.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/ui/output/dock/nodes.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/ui/output/dock/nodes_permission.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/ui/output/dock/nodes_startup.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/ui/output/dock/nodes_status.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/ui/output/dock/state.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/ui/output/dock/status.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/ui/output/dock/stream.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/ui/output/dock/todo.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/ui/output/events/schema.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/ui/output/tree.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/ui/output/types.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/ui/protocol/__init__.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/ui/protocol/commands.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/ui/protocol/envelope.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/ui/protocol/requests.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/ui/protocol/schema.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/ui/protocol/transcript.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/ui/session.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/ui/tools/attachment_tokens.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/ui/tools/clipboard_image.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/ui/tools/clipboard_text.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/ui/tools/code_ide.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/ui/tools/file_picker.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/ui/transcript.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/ui/tui/__init__.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/ui/tui/activity.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/ui/tui/choice_mixin.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/ui/tui/clipboard_mixin.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/ui/tui/helpers.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/ui/tui/terminal_mixin.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx/ui/tui/text_prompt_mixin.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx.egg-info/dependency_links.txt +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx.egg-info/entry_points.txt +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx.egg-info/requires.txt +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/src/voidx.egg-info/top_level.txt +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/tests/test_clipboard_image.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/tests/test_clipboard_text.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/tests/test_code_ide.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/tests/test_intent_classifier_phase_a.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/tests/test_llm_catalog.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/tests/test_llm_usage.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/tests/test_main.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/tests/test_main_startup.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/tests/test_mcp.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/tests/test_output_browse.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/tests/test_runtime_intent_classifier.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/tests/test_runtime_ui.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/tests/test_scrollback_flush.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/tests/test_startup.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/tests/test_tree_smoke.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/tests/test_ui_diff.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/tests/test_ui_frontend_protocol.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/tests/test_ui_gateway.py +0 -0
- {voidx-2.2.1 → voidx-2.3.0}/tests/test_ui_session_changes.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "voidx"
|
|
3
|
-
version = "2.
|
|
3
|
+
version = "2.3.0"
|
|
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"
|
|
@@ -48,6 +48,7 @@ where = ["src"]
|
|
|
48
48
|
]
|
|
49
49
|
"voidx.data" = [
|
|
50
50
|
"intent_classifier.json",
|
|
51
|
+
"templates/*.md",
|
|
51
52
|
]
|
|
52
53
|
|
|
53
54
|
[tool.pytest.ini_options]
|
|
@@ -46,15 +46,20 @@ BASE_SYSTEM_PROMPT = """You are voidx, a coding agent that lives in the terminal
|
|
|
46
46
|
- Keep user-facing responses concise and focused on outcomes.
|
|
47
47
|
- Do not expose internal role names unless the user asks about architecture.
|
|
48
48
|
- Never claim work is complete until it has been verified.
|
|
49
|
+
- When Current Task State lists an active workflow gate, that workflow gate takes precedence
|
|
50
|
+
over role prompts, delegation rules, and the decision flow below.
|
|
49
51
|
|
|
50
52
|
|
|
51
|
-
## Workflow
|
|
53
|
+
## Workflow Runtime
|
|
52
54
|
|
|
53
|
-
- voidx has a workflow
|
|
54
|
-
- Current Task State is the activation source for this turn's workflow
|
|
55
|
-
-
|
|
56
|
-
library.
|
|
57
|
-
|
|
55
|
+
- voidx has a structured workflow runtime.
|
|
56
|
+
- Current Task State is the activation source for this turn's workflow nodes.
|
|
57
|
+
- Workflow Context messages contain structured workflow node definitions as a
|
|
58
|
+
reference library. Active node definitions are expanded; inactive nodes may
|
|
59
|
+
appear only as summaries. Follow ONLY nodes listed as active in Current Task
|
|
60
|
+
State, unless the user explicitly references another node by name.
|
|
61
|
+
- When a node is not listed as active, its summary is reference only. Do not
|
|
62
|
+
follow its gate, workflow, or transition instructions.
|
|
58
63
|
- load_skills can return project/global skill bodies for the current turn.
|
|
59
64
|
"""
|
|
60
65
|
|
|
@@ -76,8 +81,9 @@ surgical edits directly when that is the shortest safe path.
|
|
|
76
81
|
Do not call implement. Do not start plan→implement→review.
|
|
77
82
|
- Discuss/design/propose → produce options or a plan. Do not implement unless
|
|
78
83
|
the user explicitly approves.
|
|
79
|
-
- Fix/implement/modify →
|
|
80
|
-
broad/isolated work to
|
|
84
|
+
- Fix/implement/modify → unless blocked by an active workflow gate, edit
|
|
85
|
+
directly for small scoped changes, or delegate broad/isolated work to
|
|
86
|
+
implement.
|
|
81
87
|
- Ambiguous → continue with read-only investigation when useful. Use clarify
|
|
82
88
|
for one structured question before edits, unsafe bash, or implement delegation.
|
|
83
89
|
|
|
@@ -98,14 +104,14 @@ surgical edits directly when that is the shortest safe path.
|
|
|
98
104
|
running write-capable commands, or delegating implement.
|
|
99
105
|
|
|
100
106
|
4. **Code changes**
|
|
101
|
-
- Small
|
|
102
|
-
yourself and verify.
|
|
107
|
+
- Small documentation or single-file edits → unless blocked by an active
|
|
108
|
+
workflow gate, read first, then call write/edit yourself and verify.
|
|
103
109
|
- If investigation finds a concrete edit but the user asked only to inspect,
|
|
104
110
|
design, or review, stop and report the proposed change. Ask for
|
|
105
111
|
confirmation before editing.
|
|
106
|
-
- Broad, risky, or
|
|
107
|
-
|
|
108
|
-
reporting completion.
|
|
112
|
+
- Broad, risky, source/test/config, or multi-file patch work → unless blocked
|
|
113
|
+
by an active workflow gate, use todo and delegate a complete brief to
|
|
114
|
+
implement. Review non-trivial delegated work before reporting completion.
|
|
109
115
|
- If review says FAIL or NEEDS_CHANGE → fix, review again.
|
|
110
116
|
|
|
111
117
|
5. **Unclear intent** — ask through clarify. One specific clarifying question is
|
|
@@ -118,10 +124,15 @@ surgical edits directly when that is the shortest safe path.
|
|
|
118
124
|
- In plan mode, do not call write/edit/lsp_format, unsafe bash, or implement.
|
|
119
125
|
- Ambiguous implementation intent is not enough for write/edit/lsp_format,
|
|
120
126
|
unsafe bash, or implement delegation.
|
|
127
|
+
- apply_patch is implement-only. As orchestrator, use write/edit for direct
|
|
128
|
+
edits and delegate multi-file patch work to implement.
|
|
121
129
|
- Child agents do not interact with the user. If a child plan result needs user
|
|
122
130
|
approval or clarification, call plan_checkpoint or clarify yourself.
|
|
123
131
|
- Don't tell the user "done" until changes are verified.
|
|
124
132
|
- Child agents have isolated context — give them complete, self-contained briefs.
|
|
133
|
+
- If Current Task State lists an active workflow gate, that workflow gate takes precedence over
|
|
134
|
+
this decision flow. Do not delegate to implement or take implementation action while a gate
|
|
135
|
+
blocks implementation workflows.
|
|
125
136
|
"""
|
|
126
137
|
|
|
127
138
|
# Plan mode prompt — injected when plan_mode=True
|
|
@@ -233,6 +244,9 @@ verdict: PASS | FAIL | NEEDS_CHANGE
|
|
|
233
244
|
- PASS means the code is ready to ship — no issues found.
|
|
234
245
|
- NEEDS_CHANGE for minor issues that don't block functionality.
|
|
235
246
|
- FAIL for bugs, security issues, or broken functionality.
|
|
247
|
+
- Workflow impact: PASS leaves review workflow completion to the orchestrator.
|
|
248
|
+
FAIL or NEEDS_CHANGE means the orchestrator should advance review with
|
|
249
|
+
`review_has_issues` into review-feedback.
|
|
236
250
|
"""
|
|
237
251
|
|
|
238
252
|
|
|
@@ -338,11 +352,12 @@ BUILTIN_AGENTS: dict[str, AgentDef] = {
|
|
|
338
352
|
"delegates broad work to specialists, reviews results.",
|
|
339
353
|
when_to_use="Default agent for all user interactions. Always use first.",
|
|
340
354
|
tools=[
|
|
341
|
-
"on_intent", "clarify", "plan_checkpoint",
|
|
355
|
+
"on_intent", "clarify", "plan_checkpoint", "advance_workflow",
|
|
342
356
|
"read", "glob", "grep", "bash", "agent", "task_status", "todo", "load_skills",
|
|
357
|
+
"load_doc_template",
|
|
343
358
|
"webfetch", "websearch", "repo_map",
|
|
344
359
|
"lsp_diagnostics", "lsp_symbols", "lsp_definition", "lsp_references",
|
|
345
|
-
"write", "edit", "
|
|
360
|
+
"write", "edit", "lsp_format",
|
|
346
361
|
],
|
|
347
362
|
can_write=True,
|
|
348
363
|
can_delegate=True,
|
|
@@ -56,7 +56,13 @@ def serialize_message_content(content: str | list[dict[str, Any]]) -> tuple[str,
|
|
|
56
56
|
return content, "text"
|
|
57
57
|
|
|
58
58
|
|
|
59
|
-
def build_user_message_payload(
|
|
59
|
+
def build_user_message_payload(
|
|
60
|
+
user_text: str,
|
|
61
|
+
workspace: str,
|
|
62
|
+
*,
|
|
63
|
+
text_prefix: str = "",
|
|
64
|
+
extra_removed_spans: list[tuple[int, int]] | None = None,
|
|
65
|
+
) -> UserMessagePayload:
|
|
60
66
|
workspace_path = Path(workspace).resolve()
|
|
61
67
|
tokens = _attachment_tokens(user_text)
|
|
62
68
|
removed_spans: list[tuple[int, int]] = []
|
|
@@ -112,8 +118,13 @@ def build_user_message_payload(user_text: str, workspace: str) -> UserMessagePay
|
|
|
112
118
|
if section:
|
|
113
119
|
text_sections.append(section)
|
|
114
120
|
|
|
121
|
+
display_clean_text = _normalize_text(_remove_spans(user_text, removed_spans))
|
|
122
|
+
if extra_removed_spans:
|
|
123
|
+
removed_spans.extend(extra_removed_spans)
|
|
115
124
|
clean_text = _normalize_text(_remove_spans(user_text, removed_spans))
|
|
116
125
|
text_content = _build_text_content(clean_text, attachments, text_sections)
|
|
126
|
+
if text_prefix.strip():
|
|
127
|
+
text_content = _prefix_text_content(text_prefix.strip(), text_content)
|
|
117
128
|
content: str | list[dict[str, Any]]
|
|
118
129
|
content_format = "text"
|
|
119
130
|
if image_parts:
|
|
@@ -122,7 +133,7 @@ def build_user_message_payload(user_text: str, workspace: str) -> UserMessagePay
|
|
|
122
133
|
else:
|
|
123
134
|
content = text_content
|
|
124
135
|
|
|
125
|
-
display_text = _display_text(
|
|
136
|
+
display_text = _display_text(display_clean_text, attachments)
|
|
126
137
|
title_text = clean_text or (f"Attached {attachments[0].rel_path}" if attachments else user_text)
|
|
127
138
|
return UserMessagePayload(
|
|
128
139
|
raw_text=user_text,
|
|
@@ -158,7 +169,9 @@ def _remove_spans(text: str, spans: list[tuple[int, int]]) -> str:
|
|
|
158
169
|
return text
|
|
159
170
|
result: list[str] = []
|
|
160
171
|
last = 0
|
|
161
|
-
for start, end in spans:
|
|
172
|
+
for start, end in sorted(spans):
|
|
173
|
+
if start < last:
|
|
174
|
+
continue
|
|
162
175
|
result.append(text[last:start])
|
|
163
176
|
result.append(" ")
|
|
164
177
|
last = end
|
|
@@ -166,6 +179,13 @@ def _remove_spans(text: str, spans: list[tuple[int, int]]) -> str:
|
|
|
166
179
|
return "".join(result)
|
|
167
180
|
|
|
168
181
|
|
|
182
|
+
def _prefix_text_content(prefix: str, text: str) -> str:
|
|
183
|
+
text = text.strip()
|
|
184
|
+
if not text:
|
|
185
|
+
return prefix
|
|
186
|
+
return f"{prefix}\n\n{text}"
|
|
187
|
+
|
|
188
|
+
|
|
169
189
|
def _resolve_workspace_path(workspace: Path, raw_path: str) -> Path | None:
|
|
170
190
|
candidate = Path(raw_path).expanduser()
|
|
171
191
|
resolved = candidate.resolve() if candidate.is_absolute() else (workspace / candidate).resolve()
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"""Context compaction method proxies for the agent graph."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import TYPE_CHECKING
|
|
6
|
+
|
|
7
|
+
from voidx.agent.graph.compaction_coordinator import CompactionResult, GraphCompactionCoordinator
|
|
8
|
+
|
|
9
|
+
if TYPE_CHECKING:
|
|
10
|
+
from voidx.agent.graph.contracts import GraphCompactionHost
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def _compaction_component_for(host: GraphCompactionHost) -> GraphCompactionCoordinator:
|
|
14
|
+
coordinator = getattr(host, "_compaction_coordinator", None)
|
|
15
|
+
if coordinator is None:
|
|
16
|
+
# Bare mixin tests can instantiate a host without VoidXGraph.__init__.
|
|
17
|
+
coordinator = GraphCompactionCoordinator(host)
|
|
18
|
+
host._compaction_coordinator = coordinator
|
|
19
|
+
return coordinator
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class GraphCompactionMixin:
|
|
23
|
+
def _compaction_component(self: GraphCompactionHost) -> GraphCompactionCoordinator:
|
|
24
|
+
return _compaction_component_for(self)
|
|
25
|
+
|
|
26
|
+
async def _maybe_compact(
|
|
27
|
+
self: GraphCompactionHost,
|
|
28
|
+
messages: list,
|
|
29
|
+
session_msgs: list | None = None,
|
|
30
|
+
*,
|
|
31
|
+
force: bool = False,
|
|
32
|
+
ask: bool = True,
|
|
33
|
+
) -> tuple[list | None, str | None]:
|
|
34
|
+
return await _compaction_component_for(self).maybe_compact(
|
|
35
|
+
messages,
|
|
36
|
+
session_msgs,
|
|
37
|
+
force=force,
|
|
38
|
+
ask=ask,
|
|
39
|
+
run_compaction_agent=self._run_compaction_agent,
|
|
40
|
+
persist_compaction=self._persist_compaction,
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
async def _in_turn_compact(
|
|
44
|
+
self: GraphCompactionHost,
|
|
45
|
+
messages: list,
|
|
46
|
+
) -> CompactionResult | None:
|
|
47
|
+
count = getattr(self, "_in_turn_compaction_count", 0) + 1
|
|
48
|
+
self._in_turn_compaction_count = count
|
|
49
|
+
if count > 2:
|
|
50
|
+
return None
|
|
51
|
+
return await _compaction_component_for(self).compact_for_live_state(
|
|
52
|
+
messages,
|
|
53
|
+
force=True,
|
|
54
|
+
ask=False,
|
|
55
|
+
include_summary_message=True,
|
|
56
|
+
run_compaction_agent=self._run_compaction_agent,
|
|
57
|
+
persist_compaction=self._persist_compaction,
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
async def _ask_compact(self: GraphCompactionHost, total_tokens: int) -> bool:
|
|
61
|
+
return await _compaction_component_for(self).ask_compact(total_tokens)
|
|
62
|
+
|
|
63
|
+
async def _persist_compaction(self: GraphCompactionHost, head_messages: list) -> None:
|
|
64
|
+
await _compaction_component_for(self).persist_compaction(head_messages)
|
|
65
|
+
|
|
66
|
+
async def _compact_session_history(self: GraphCompactionHost, *, force: bool = True) -> bool:
|
|
67
|
+
return await _compaction_component_for(self).compact_session_history(
|
|
68
|
+
force=force,
|
|
69
|
+
run_compaction_agent=self._run_compaction_agent,
|
|
70
|
+
persist_compaction=self._persist_compaction,
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
async def _run_compaction_agent(
|
|
74
|
+
self: GraphCompactionHost,
|
|
75
|
+
head_messages: list,
|
|
76
|
+
previous_summary: str | None,
|
|
77
|
+
) -> str | None:
|
|
78
|
+
return await _compaction_component_for(self).run_compaction_agent(
|
|
79
|
+
head_messages,
|
|
80
|
+
previous_summary,
|
|
81
|
+
)
|