voidx 3.2.2__tar.gz → 3.3.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {voidx-3.2.2 → voidx-3.3.1}/PKG-INFO +1 -1
- {voidx-3.2.2 → voidx-3.3.1}/pyproject.toml +1 -1
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/__init__.py +1 -1
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/graph/compaction_coordinator.py +6 -3
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/graph/core/_voidx_graph.py +2 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/graph/core/llm.py +2 -1
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/graph/subagent.py +60 -0
- voidx-3.3.1/src/voidx/agent/message_trimming.py +511 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/prompts.py +6 -9
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/runtime_context.py +8 -4
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/todo_state.py +16 -19
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/permission/rules.py +8 -1
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/skills/registry.py +41 -1
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/tools/agent.py +8 -13
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/tools/bash/core.py +0 -5
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/tools/bash/hint/file.py +2 -2
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/tools/bash/hint/git.py +4 -8
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/tools/bash/hint/search.py +6 -6
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/tools/bash/tool.py +8 -4
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/tools/clarify.py +42 -3
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/tools/compact_context.py +4 -1
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/tools/file_ops/edit_execute.py +95 -27
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/tools/file_ops/edit_resolve.py +41 -8
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/tools/file_ops/file.py +7 -4
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/tools/file_ops/read.py +9 -12
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/tools/file_ops/write.py +4 -4
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/tools/file_state.py +127 -13
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/tools/git.py +25 -15
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/tools/load_doc_template.py +4 -1
- voidx-3.3.1/src/voidx/tools/load_skills.py +12 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/tools/lsp.py +10 -4
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/tools/plan_checkpoint.py +4 -1
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/tools/registry.py +3 -3
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/tools/search.py +14 -8
- voidx-3.3.1/src/voidx/tools/skills.py +252 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/tools/task_status.py +17 -4
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/tools/todo.py +22 -23
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/tools/webfetch.py +4 -1
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/tools/websearch.py +4 -1
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/tools/workflow.py +4 -1
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/output/console/formatting.py +5 -1
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/output/diff.py +1 -1
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/output/dock/__init__.py +6 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/output/dock/app.py +5 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/output/dock/formatting.py +2 -2
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/output/dock/nodes.py +7 -3
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/output/dock/nodes_checkpoint.py +18 -7
- voidx-3.3.1/src/voidx/ui/output/dock/nodes_clarify.py +92 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/output/dock/nodes_permission.py +2 -3
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/output/dock/status.py +35 -16
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/output/events/__init__.py +4 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/output/events/consumers.py +235 -18
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/output/events/schema.py +18 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/output/tree.py +16 -6
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/tui/render_activity.py +28 -2
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx.egg-info/PKG-INFO +1 -1
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx.egg-info/SOURCES.txt +3 -0
- voidx-3.3.1/tests/test_install_sh.py +476 -0
- voidx-3.2.2/src/voidx/tools/load_skills.py +0 -206
- voidx-3.2.2/tests/test_install_sh.py +0 -162
- {voidx-3.2.2 → voidx-3.3.1}/README.md +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/setup.cfg +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/__init__.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/agents.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/attachments.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/goal_resolver.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/graph/__init__.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/graph/compaction.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/graph/contracts.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/graph/convergence.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/graph/core/__init__.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/graph/core/helpers.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/graph/permissions.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/graph/run_loop.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/graph/runtime.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/graph/runtime_guards.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/graph/session_mixin.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/graph/session_runtime.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/graph/streaming.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/graph/title_mixin.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/graph/todo_events.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/graph/tool_execution.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/graph/tool_executor/__init__.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/graph/tool_executor/executor.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/graph/tool_executor/guards.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/graph/tool_executor/helpers.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/graph/tool_executor/types.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/graph/tool_executor/ui.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/graph/tool_executor/workflow.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/graph/topology.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/graph/transcript_mixin.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/graph/turn_mixin.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/graph/turn_runner.py +2 -2
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/graph/wiring.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/graph/workflow_utils.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/message_rows.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/slash/__init__.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/slash/code_ide.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/slash/guide.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/slash/handler.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/slash/host.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/slash/init.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/slash/lsp.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/slash/mcp.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/slash/model.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/slash/profile.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/slash/runtime.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/slash/session.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/slash/skills.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/slash/upgrade.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/state.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/task_state.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/tool_call_ids.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/tool_exchange_sanitizer.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/tool_filters.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/tool_messages.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/agent/tool_result_storage.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/config/__init__.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/config/enums.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/config/models.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/config/permissions.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/config/settings.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/config/settings_agent.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/config/settings_api_keys.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/config/settings_code_ide.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/config/settings_custom.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/config/settings_mcp.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/config/settings_permissions.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/config/settings_skills.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/config/settings_update.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/config/settings_utils.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/config/settings_web.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/data/__init__.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/data/templates/api-doc.md +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/data/templates/prd.md +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/data/templates/readme.md +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/data/templates/rfc.md +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/data/templates/tech-design.md +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/diffing.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/llm/__init__.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/llm/catalog.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/llm/compaction.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/llm/context.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/llm/instruction.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/llm/message_markers.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/llm/message_status.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/llm/provider.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/llm/service.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/llm/usage.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/logging/__init__.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/logging/request_log.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/logging/tool_log.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/lsp/__init__.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/lsp/client.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/lsp/config.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/lsp/detector.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/lsp/detector_data.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/lsp/errors.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/lsp/manager.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/lsp/schema.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/lsp/service.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/main.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/mcp/__init__.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/mcp/client/__init__.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/mcp/client/base.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/mcp/client/errors.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/mcp/client/http_transport.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/mcp/client/sse_transport.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/mcp/client/stdio_transport.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/mcp/manager.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/mcp/schema.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/mcp/tool.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/mcp_servers/__init__.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/mcp_servers/web.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/memory/__init__.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/memory/cleanup.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/memory/context_frames.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/memory/jsonl_store.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/memory/model_profiles.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/memory/runtime_state.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/memory/service.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/memory/session.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/memory/store.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/memory/subagents.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/memory/transcript.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/permission/__init__.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/permission/context.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/permission/engine.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/permission/evaluate.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/permission/sandbox.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/permission/schema.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/permission/service.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/permission/wildcard.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/runtime/__init__.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/runtime/attachments.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/runtime/intent.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/runtime/reference_tokens.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/runtime/task_state.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/runtime/todo.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/runtime/ui.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/runtime/ui_port.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/selfupdate.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/skills/__init__.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/skills/context.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/skills/references.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/skills/schema.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/skills/service.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/tools/__init__.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/tools/base.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/tools/bash/__init__.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/tools/bash/hint/__init__.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/tools/bash/router.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/tools/bash/safety.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/tools/file_ops/__init__.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/tools/file_ops/types.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/tools/service.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/tools/task_tracker.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/tools/web_content.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/tools/web_mcp.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/__init__.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/commands.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/frontend.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/gateway/__init__.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/gateway/bootstrap.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/gateway/server.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/gateway/session.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/output/__init__.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/output/agent_display.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/output/browse.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/output/capture.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/output/console/__init__.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/output/console/app.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/output/console/streaming.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/output/display_policy.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/output/dock/agent_placeholder.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/output/dock/nodes_startup.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/output/dock/nodes_status.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/output/dock/state.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/output/dock/stream.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/output/dock/todo.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/output/events/bus.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/output/types.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/protocol/__init__.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/protocol/commands.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/protocol/envelope.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/protocol/requests.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/protocol/schema.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/protocol/transcript.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/session.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/tools/__init__.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/tools/attachment_tokens.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/tools/clipboard_image.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/tools/clipboard_text.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/tools/code_ide.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/tools/file_picker.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/tools/skill_picker.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/transcript.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/tui/__init__.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/tui/activity.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/tui/app.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/tui/choice_mixin.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/tui/clipboard_mixin.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/tui/helpers.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/tui/input.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/tui/overlays.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/tui/panels.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/tui/parser.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/tui/render_frame.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/tui/render_input.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/tui/render_status.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/tui/render_todo.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/tui/renderer.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/tui/state.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/tui/terminal_mixin.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/ui/tui/text_prompt_mixin.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/workflow/__init__.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/workflow/auto_advance.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/workflow/context.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/workflow/dag.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/workflow/nodes.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/workflow/policy.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/workflow/reconcile.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/workflow/render.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/workflow/route.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/workflow/runtime.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/workflow/schema.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/workflow/service.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx/workflow/types.py +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx.egg-info/dependency_links.txt +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx.egg-info/entry_points.txt +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx.egg-info/requires.txt +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/src/voidx.egg-info/top_level.txt +0 -0
- {voidx-3.2.2 → voidx-3.3.1}/tests/test_npm_package.py +0 -0
|
@@ -189,7 +189,7 @@ class GraphCompactionCoordinator:
|
|
|
189
189
|
if host._ui.via_events():
|
|
190
190
|
await host._ui.events.emit(StatusUpdated(
|
|
191
191
|
status_id="compaction",
|
|
192
|
-
label="Compacting
|
|
192
|
+
label="Compacting",
|
|
193
193
|
detail=_compaction_status_detail(total_tokens, force=force, preflight=preflight),
|
|
194
194
|
stage="compacting",
|
|
195
195
|
display="record_only",
|
|
@@ -198,7 +198,7 @@ class GraphCompactionCoordinator:
|
|
|
198
198
|
host._ui.ui.print(
|
|
199
199
|
"[yellow]Context overflow — compacting...[/yellow]"
|
|
200
200
|
if not force
|
|
201
|
-
else "[yellow]Compacting
|
|
201
|
+
else "[yellow]Compacting...[/yellow]"
|
|
202
202
|
)
|
|
203
203
|
|
|
204
204
|
runtime_prefix = _runtime_prefix(messages)
|
|
@@ -251,9 +251,10 @@ class GraphCompactionCoordinator:
|
|
|
251
251
|
retry_label = f" (attempt {attempt})" if attempt > 1 else ""
|
|
252
252
|
await host._ui.events.emit(StatusUpdated(
|
|
253
253
|
status_id="compaction",
|
|
254
|
-
label="Compacting
|
|
254
|
+
label="Compacting",
|
|
255
255
|
detail=f"summarizing {len(head_msgs)} old messages{retry_label}",
|
|
256
256
|
stage="compacting",
|
|
257
|
+
display="record_only",
|
|
257
258
|
))
|
|
258
259
|
summary = await run_agent(head_msgs, previous_summary)
|
|
259
260
|
if summary:
|
|
@@ -270,6 +271,7 @@ class GraphCompactionCoordinator:
|
|
|
270
271
|
label="Compaction agent failed",
|
|
271
272
|
detail=f"{e}; retrying ({attempt}/{COMPACTION_MAX_RETRIES})",
|
|
272
273
|
stage="compacting",
|
|
274
|
+
display="record_only",
|
|
273
275
|
))
|
|
274
276
|
else:
|
|
275
277
|
host._ui.ui.print(f"[dim]Compaction agent failed ({e}) — retrying ({attempt}/{COMPACTION_MAX_RETRIES})[/dim]")
|
|
@@ -288,6 +290,7 @@ class GraphCompactionCoordinator:
|
|
|
288
290
|
label="Compaction agent failed",
|
|
289
291
|
detail=f"{failure_detail}; using extracted summary",
|
|
290
292
|
stage="compacting",
|
|
293
|
+
display="record_only",
|
|
291
294
|
))
|
|
292
295
|
else:
|
|
293
296
|
err_msg = f" ({failure_detail})"
|
|
@@ -399,6 +399,7 @@ class VoidXGraph(
|
|
|
399
399
|
|
|
400
400
|
ok = False
|
|
401
401
|
run_metadata: dict[str, object] = {}
|
|
402
|
+
result = ""
|
|
402
403
|
try:
|
|
403
404
|
kwargs = {
|
|
404
405
|
"sub_messages": sub_buffer,
|
|
@@ -439,6 +440,7 @@ class VoidXGraph(
|
|
|
439
440
|
ok=ok,
|
|
440
441
|
elapsed=time.monotonic() - started_at,
|
|
441
442
|
finish_reason=str(run_metadata.get("finish_reason") or ("final_answer" if ok else "error")),
|
|
443
|
+
summary=result if ok else "",
|
|
442
444
|
))
|
|
443
445
|
if self._session:
|
|
444
446
|
await append_subagent_event(session_id, agent_run_id, {
|
|
@@ -17,6 +17,7 @@ from voidx.agent.runtime_context import (
|
|
|
17
17
|
from voidx.agent.state import AgentState
|
|
18
18
|
from voidx.agent.task_state import GoalResolution, TaskState, goal_label, goal_type_from_join
|
|
19
19
|
from voidx.agent.todo_state import sanitize_todo_replay_messages
|
|
20
|
+
from voidx.agent.message_trimming import trim_superseded_file_tools
|
|
20
21
|
from voidx.agent.tool_exchange_sanitizer import sanitize_failed_tool_exchanges
|
|
21
22
|
from voidx.agent.tool_filters import filter_unavailable_lsp_tools
|
|
22
23
|
from voidx.agent.graph.streaming import (
|
|
@@ -200,7 +201,7 @@ class GraphLlmMixin:
|
|
|
200
201
|
*,
|
|
201
202
|
allow_inline_compaction: bool,
|
|
202
203
|
) -> tuple[list[BaseMessage], list[HumanMessage], bool]:
|
|
203
|
-
base_messages = [*messages, *guidance_messages]
|
|
204
|
+
base_messages = trim_superseded_file_tools([*messages, *guidance_messages])
|
|
204
205
|
if allow_inline_compaction and not compaction_happened:
|
|
205
206
|
inline_compaction_guide = self._inline_compaction_guide_for(base_messages)
|
|
206
207
|
if inline_compaction_guide is not None:
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
5
|
import asyncio
|
|
6
|
+
import re
|
|
6
7
|
import time
|
|
7
8
|
|
|
8
9
|
from langchain_core.messages import AIMessage, HumanMessage, ToolMessage
|
|
@@ -43,6 +44,7 @@ from voidx.runtime.ui_port import AgentUiPort, runtime_ui_port
|
|
|
43
44
|
|
|
44
45
|
|
|
45
46
|
_SAFETY_STEP_LIMIT = 50
|
|
47
|
+
_RESULT_CONTRACT_RETRY_LIMIT = 2
|
|
46
48
|
|
|
47
49
|
async def run_subagent(
|
|
48
50
|
agent_def: AgentDef,
|
|
@@ -105,6 +107,8 @@ async def run_subagent(
|
|
|
105
107
|
)
|
|
106
108
|
guard_state = RuntimeGuardState(wall_clock=WallClockGuardState.for_subagent())
|
|
107
109
|
pending_guard_guidance: list[str] = []
|
|
110
|
+
contract_retry_count = 0
|
|
111
|
+
has_successful_tool_work = False
|
|
108
112
|
|
|
109
113
|
context, context_cache = RuntimeContextBuilder(
|
|
110
114
|
config=context_config,
|
|
@@ -212,6 +216,18 @@ async def run_subagent(
|
|
|
212
216
|
|
|
213
217
|
if not assistant_msg.tool_calls:
|
|
214
218
|
text = extract_text(assistant_msg)
|
|
219
|
+
if has_successful_tool_work and not _satisfies_result_contract(text, result_contract):
|
|
220
|
+
if contract_retry_count < _RESULT_CONTRACT_RETRY_LIMIT:
|
|
221
|
+
contract_retry_count += 1
|
|
222
|
+
step -= 1
|
|
223
|
+
guidance = _result_contract_retry_message(result_contract)
|
|
224
|
+
messages.append(HumanMessage(content=guidance))
|
|
225
|
+
continue
|
|
226
|
+
if tracker:
|
|
227
|
+
tracker.update(task_id, last_output=text[:200])
|
|
228
|
+
tracker.finish(task_id, "completed")
|
|
229
|
+
mark_finished("contract_unsatisfied")
|
|
230
|
+
return text
|
|
215
231
|
if tracker:
|
|
216
232
|
tracker.update(task_id, last_output=text[:200])
|
|
217
233
|
tracker.finish(task_id, "completed")
|
|
@@ -318,6 +334,7 @@ async def run_subagent(
|
|
|
318
334
|
if metadata.get("runtime_guard"):
|
|
319
335
|
continue
|
|
320
336
|
if result_ok(item["result"]):
|
|
337
|
+
has_successful_tool_work = True
|
|
321
338
|
guard_state.tool_failures.record_success(item["tool_call"])
|
|
322
339
|
continue
|
|
323
340
|
key = build_failure_key(item["tool_call"], item["result"])
|
|
@@ -391,3 +408,46 @@ def _task_payload(task_description: str, result_contract) -> str:
|
|
|
391
408
|
"Return the final answer using this contract."
|
|
392
409
|
)
|
|
393
410
|
return "\n\n".join(parts)
|
|
411
|
+
|
|
412
|
+
|
|
413
|
+
def _result_contract_fields(result_contract) -> list[str]:
|
|
414
|
+
result_format = str(getattr(result_contract, "format", "") or "")
|
|
415
|
+
fields: list[str] = []
|
|
416
|
+
for raw_part in result_format.split(","):
|
|
417
|
+
part = raw_part.strip()
|
|
418
|
+
if not part:
|
|
419
|
+
continue
|
|
420
|
+
match = re.match(r"([A-Za-z_][A-Za-z0-9_]*)", part)
|
|
421
|
+
if match:
|
|
422
|
+
fields.append(match.group(1))
|
|
423
|
+
return fields
|
|
424
|
+
|
|
425
|
+
|
|
426
|
+
def _satisfies_result_contract(text: str, result_contract) -> bool:
|
|
427
|
+
fields = _result_contract_fields(result_contract)
|
|
428
|
+
if not fields:
|
|
429
|
+
return True
|
|
430
|
+
if not text.strip():
|
|
431
|
+
return False
|
|
432
|
+
|
|
433
|
+
matched = [
|
|
434
|
+
field
|
|
435
|
+
for field in fields
|
|
436
|
+
if re.search(rf"(?im)^\s*(?:[-*]\s*)?{re.escape(field)}\s*[:=]", text)
|
|
437
|
+
]
|
|
438
|
+
required = 1 if len(fields) == 1 else 2
|
|
439
|
+
if fields[0] not in matched:
|
|
440
|
+
return False
|
|
441
|
+
return len(matched) >= required
|
|
442
|
+
|
|
443
|
+
|
|
444
|
+
def _result_contract_retry_message(result_contract) -> str:
|
|
445
|
+
schema_name = str(getattr(result_contract, "schema_name", "") or "agent_result")
|
|
446
|
+
result_format = str(getattr(result_contract, "format", "") or "").strip()
|
|
447
|
+
return (
|
|
448
|
+
"Your previous response did not satisfy the child-agent result contract. "
|
|
449
|
+
"Do not return raw tool output or code snippets as the final answer.\n"
|
|
450
|
+
"Summarize the completed delegated task using the required contract:\n"
|
|
451
|
+
f"- schema_name: {schema_name}\n"
|
|
452
|
+
f"- format: {result_format}"
|
|
453
|
+
)
|