voidx 3.2.0__tar.gz → 3.2.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {voidx-3.2.0 → voidx-3.2.1}/PKG-INFO +1 -1
- {voidx-3.2.0 → voidx-3.2.1}/pyproject.toml +1 -1
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/__init__.py +1 -1
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/graph/permissions.py +1 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/graph/runtime_guards.py +22 -19
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/graph/subagent.py +1 -1
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/graph/todo_events.py +7 -1
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/graph/tool_executor/executor.py +4 -2
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/graph/tool_executor/workflow.py +1 -1
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/runtime_context.py +4 -4
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/slash/init.py +1 -1
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/todo_state.py +29 -3
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/memory/runtime_state.py +2 -2
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/permission/rules.py +10 -5
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/permission/sandbox.py +304 -304
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/permission/service.py +1 -1
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/runtime/task_state.py +7 -1
- voidx-3.2.1/src/voidx/tools/bash/__init__.py +6 -0
- voidx-3.2.1/src/voidx/tools/bash/core.py +112 -0
- voidx-3.2.1/src/voidx/tools/bash/hint/__init__.py +57 -0
- voidx-3.2.1/src/voidx/tools/bash/hint/file.py +232 -0
- voidx-3.2.1/src/voidx/tools/bash/hint/git.py +537 -0
- voidx-3.2.1/src/voidx/tools/bash/hint/search.py +271 -0
- voidx-3.2.1/src/voidx/tools/bash/router.py +69 -0
- voidx-3.2.1/src/voidx/tools/bash/safety.py +88 -0
- voidx-3.2.0/src/voidx/tools/bash.py → voidx-3.2.1/src/voidx/tools/bash/tool.py +3 -82
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/tools/file_ops/write.py +0 -2
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/tools/plan_checkpoint.py +6 -5
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/tools/registry.py +0 -2
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/tools/task_tracker.py +37 -4
- voidx-3.2.1/src/voidx/tools/todo.py +297 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/output/console/app.py +1 -1
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/output/display_policy.py +0 -1
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/output/dock/app.py +34 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/output/dock/nodes.py +3 -1
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/output/dock/nodes_checkpoint.py +3 -14
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/output/dock/stream.py +62 -4
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/output/dock/todo.py +9 -3
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/output/events/schema.py +2 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/output/tree.py +34 -6
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/tui/app.py +3 -2
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/tui/render_activity.py +6 -3
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/tui/render_frame.py +33 -5
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/workflow/nodes.py +0 -7
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx.egg-info/PKG-INFO +1 -1
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx.egg-info/SOURCES.txt +9 -3
- {voidx-3.2.0 → voidx-3.2.1}/tests/test_npm_package.py +25 -30
- voidx-3.2.0/src/voidx/tools/bash_router.py +0 -1222
- voidx-3.2.0/src/voidx/tools/repomap.py +0 -249
- voidx-3.2.0/src/voidx/tools/todo.py +0 -86
- {voidx-3.2.0 → voidx-3.2.1}/README.md +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/setup.cfg +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/__init__.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/agents.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/attachments.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/goal_resolver.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/graph/__init__.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/graph/compaction.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/graph/compaction_coordinator.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/graph/contracts.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/graph/convergence.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/graph/core/__init__.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/graph/core/_voidx_graph.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/graph/core/helpers.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/graph/core/llm.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/graph/run_loop.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/graph/runtime.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/graph/session_mixin.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/graph/session_runtime.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/graph/streaming.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/graph/title_mixin.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/graph/tool_execution.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/graph/tool_executor/__init__.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/graph/tool_executor/guards.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/graph/tool_executor/helpers.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/graph/tool_executor/types.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/graph/tool_executor/ui.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/graph/topology.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/graph/transcript_mixin.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/graph/turn_mixin.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/graph/turn_runner.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/graph/wiring.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/graph/workflow_utils.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/message_rows.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/prompts.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/slash/__init__.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/slash/code_ide.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/slash/guide.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/slash/handler.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/slash/host.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/slash/lsp.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/slash/mcp.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/slash/model.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/slash/profile.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/slash/runtime.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/slash/session.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/slash/skills.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/slash/upgrade.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/state.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/task_state.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/tool_call_ids.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/tool_exchange_sanitizer.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/tool_filters.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/tool_messages.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/agent/tool_result_storage.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/config/__init__.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/config/enums.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/config/models.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/config/permissions.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/config/settings.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/config/settings_agent.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/config/settings_api_keys.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/config/settings_code_ide.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/config/settings_custom.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/config/settings_mcp.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/config/settings_permissions.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/config/settings_skills.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/config/settings_update.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/config/settings_utils.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/config/settings_web.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/data/__init__.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/data/templates/api-doc.md +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/data/templates/prd.md +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/data/templates/readme.md +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/data/templates/rfc.md +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/data/templates/tech-design.md +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/diffing.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/llm/__init__.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/llm/catalog.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/llm/compaction.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/llm/context.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/llm/instruction.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/llm/message_markers.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/llm/message_status.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/llm/provider.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/llm/service.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/llm/usage.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/logging/__init__.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/logging/request_log.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/logging/tool_log.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/lsp/__init__.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/lsp/client.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/lsp/config.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/lsp/detector.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/lsp/detector_data.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/lsp/errors.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/lsp/manager.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/lsp/schema.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/lsp/service.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/main.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/mcp/__init__.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/mcp/client/__init__.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/mcp/client/base.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/mcp/client/errors.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/mcp/client/http_transport.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/mcp/client/sse_transport.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/mcp/client/stdio_transport.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/mcp/manager.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/mcp/schema.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/mcp/tool.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/mcp_servers/__init__.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/mcp_servers/web.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/memory/__init__.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/memory/cleanup.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/memory/context_frames.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/memory/jsonl_store.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/memory/model_profiles.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/memory/service.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/memory/session.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/memory/store.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/memory/subagents.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/memory/transcript.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/permission/__init__.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/permission/context.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/permission/engine.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/permission/evaluate.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/permission/schema.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/permission/wildcard.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/runtime/__init__.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/runtime/attachments.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/runtime/intent.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/runtime/reference_tokens.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/runtime/todo.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/runtime/ui.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/runtime/ui_port.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/selfupdate.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/skills/__init__.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/skills/context.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/skills/references.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/skills/registry.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/skills/schema.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/skills/service.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/tools/__init__.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/tools/agent.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/tools/base.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/tools/clarify.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/tools/compact_context.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/tools/file_ops/__init__.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/tools/file_ops/edit_execute.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/tools/file_ops/edit_resolve.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/tools/file_ops/file.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/tools/file_ops/read.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/tools/file_ops/types.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/tools/file_state.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/tools/git.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/tools/load_doc_template.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/tools/load_skills.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/tools/lsp.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/tools/search.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/tools/service.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/tools/task_status.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/tools/web_content.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/tools/web_mcp.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/tools/webfetch.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/tools/websearch.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/tools/workflow.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/__init__.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/commands.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/frontend.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/gateway/__init__.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/gateway/bootstrap.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/gateway/server.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/gateway/session.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/output/__init__.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/output/agent_display.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/output/browse.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/output/capture.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/output/console/__init__.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/output/console/formatting.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/output/console/streaming.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/output/diff.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/output/dock/__init__.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/output/dock/agent_placeholder.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/output/dock/formatting.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/output/dock/nodes_permission.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/output/dock/nodes_startup.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/output/dock/nodes_status.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/output/dock/state.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/output/dock/status.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/output/events/__init__.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/output/events/bus.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/output/events/consumers.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/output/types.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/protocol/__init__.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/protocol/commands.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/protocol/envelope.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/protocol/requests.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/protocol/schema.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/protocol/transcript.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/session.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/tools/__init__.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/tools/attachment_tokens.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/tools/clipboard_image.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/tools/clipboard_text.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/tools/code_ide.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/tools/file_picker.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/tools/skill_picker.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/transcript.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/tui/__init__.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/tui/activity.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/tui/choice_mixin.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/tui/clipboard_mixin.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/tui/helpers.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/tui/input.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/tui/overlays.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/tui/panels.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/tui/parser.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/tui/render_input.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/tui/render_status.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/tui/render_todo.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/tui/renderer.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/tui/state.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/tui/terminal_mixin.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/ui/tui/text_prompt_mixin.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/workflow/__init__.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/workflow/auto_advance.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/workflow/context.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/workflow/dag.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/workflow/policy.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/workflow/reconcile.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/workflow/render.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/workflow/route.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/workflow/runtime.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/workflow/schema.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/workflow/service.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx/workflow/types.py +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx.egg-info/dependency_links.txt +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx.egg-info/entry_points.txt +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx.egg-info/requires.txt +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/src/voidx.egg-info/top_level.txt +0 -0
- {voidx-3.2.0 → voidx-3.2.1}/tests/test_install_sh.py +0 -0
|
@@ -349,27 +349,30 @@ def stable_json(value: Any) -> str:
|
|
|
349
349
|
return json.dumps(value, sort_keys=True, separators=(",", ":"), default=str)
|
|
350
350
|
|
|
351
351
|
|
|
352
|
-
def todo_status_signature(todo_state: Any) -> tuple[
|
|
352
|
+
def todo_status_signature(todo_state: Any) -> tuple[int, int, int, int]:
|
|
353
|
+
"""(done, in_progress, pending, cancelled) count signature."""
|
|
353
354
|
if todo_state is None:
|
|
354
|
-
return ()
|
|
355
|
+
return (0, 0, 0, 0)
|
|
356
|
+
|
|
357
|
+
# Try to get counts from TodoRunState
|
|
358
|
+
if hasattr(todo_state, "done"):
|
|
359
|
+
return (
|
|
360
|
+
getattr(todo_state, "done", 0),
|
|
361
|
+
getattr(todo_state, "in_progress", 0),
|
|
362
|
+
getattr(todo_state, "pending", 0),
|
|
363
|
+
getattr(todo_state, "cancelled", 0),
|
|
364
|
+
)
|
|
365
|
+
|
|
366
|
+
# Fallback for dict representation
|
|
355
367
|
if isinstance(todo_state, dict):
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
statuses: list[str] = []
|
|
365
|
-
for item in items:
|
|
366
|
-
if isinstance(item, dict):
|
|
367
|
-
status = item.get("status")
|
|
368
|
-
else:
|
|
369
|
-
status = getattr(item, "status", None)
|
|
370
|
-
if status:
|
|
371
|
-
statuses.append(str(status))
|
|
372
|
-
return tuple(sorted(Counter(statuses).items()))
|
|
368
|
+
return (
|
|
369
|
+
todo_state.get("done", 0),
|
|
370
|
+
todo_state.get("in_progress", 0),
|
|
371
|
+
todo_state.get("pending", 0),
|
|
372
|
+
todo_state.get("cancelled", 0),
|
|
373
|
+
)
|
|
374
|
+
|
|
375
|
+
return (0, 0, 0, 0)
|
|
373
376
|
|
|
374
377
|
|
|
375
378
|
def cycle_summary_from_tools(
|
|
@@ -271,7 +271,7 @@ async def run_subagent(
|
|
|
271
271
|
capture.tool_call(tid, targs, tool_call_id=cid)
|
|
272
272
|
result = await agent_tools.execute_tool(tid, targs, ctx)
|
|
273
273
|
todo_state = todo_run_state_from_result(result) if tid == "todo" else None
|
|
274
|
-
if todo_state_sink is not None and todo_state is not None and todo_state.
|
|
274
|
+
if todo_state_sink is not None and todo_state is not None and todo_state.total > 0:
|
|
275
275
|
todo_state_sink(todo_state)
|
|
276
276
|
if ui_port.via_events() and tid == "todo":
|
|
277
277
|
todo_event = todo_updated_event(result, agent_id=agent_id)
|
|
@@ -10,8 +10,14 @@ def todo_updated_event(result, *, agent_id: int = -1):
|
|
|
10
10
|
state = todo_run_state_from_result(result)
|
|
11
11
|
if state is None:
|
|
12
12
|
return None
|
|
13
|
+
|
|
14
|
+
# Get todo_op from metadata
|
|
15
|
+
metadata = getattr(result, "metadata", {}) or {}
|
|
16
|
+
todo_op = metadata.get("todo_op", "write")
|
|
17
|
+
|
|
13
18
|
return TodoUpdated(
|
|
14
19
|
agent_id=agent_id,
|
|
15
|
-
items=[TodoItemPayload(content=item.content, status=item.status) for item in state.
|
|
20
|
+
items=[TodoItemPayload(id=item.id, content=item.content, status=item.status) for item in state.active_items],
|
|
16
21
|
summary=state.summary,
|
|
22
|
+
todo_op=todo_op,
|
|
17
23
|
)
|
|
@@ -189,7 +189,9 @@ class GraphToolExecutor:
|
|
|
189
189
|
host._clear_failure_check(cid)
|
|
190
190
|
|
|
191
191
|
todo_state = todo_run_state_from_result(result) if tid == "todo" and ok else None
|
|
192
|
-
|
|
192
|
+
todo_meta = getattr(result, "metadata", {}) or {} if tid == "todo" and ok else {}
|
|
193
|
+
is_todo_read = todo_meta.get("todo_op") == "read"
|
|
194
|
+
if host._ui.via_events() and tid == "todo" and not is_todo_read:
|
|
193
195
|
todo_event = todo_updated_event(result)
|
|
194
196
|
if todo_event is not None:
|
|
195
197
|
await host._ui.events.emit(todo_event)
|
|
@@ -197,7 +199,7 @@ class GraphToolExecutor:
|
|
|
197
199
|
await host._ui.events.emit(WarningAppended(
|
|
198
200
|
message="Todo update ignored: tool returned malformed metadata.",
|
|
199
201
|
))
|
|
200
|
-
elif tid == "todo" and ok and todo_state is None:
|
|
202
|
+
elif tid == "todo" and ok and todo_state is None and not is_todo_read:
|
|
201
203
|
host._ui.ui.warn("Todo update ignored: tool returned malformed metadata.")
|
|
202
204
|
|
|
203
205
|
notify_tool_failure(host, tc, result, display_policy.rule_for(tid).mode, tool_event_id)
|
|
@@ -37,7 +37,7 @@ def _state_update_from_executed_tools(
|
|
|
37
37
|
workflow_runs_changed = False
|
|
38
38
|
for item in executed:
|
|
39
39
|
if item.tool_call.get("name") == "todo" and item.todo_state is not None:
|
|
40
|
-
if item.todo_state.
|
|
40
|
+
if item.todo_state.total > 0:
|
|
41
41
|
update["todo_state"] = item.todo_state.model_dump(mode="json")
|
|
42
42
|
else:
|
|
43
43
|
update["todo_state"] = None
|
|
@@ -268,10 +268,10 @@ class RuntimeContextBuilder:
|
|
|
268
268
|
if exits:
|
|
269
269
|
lines.append(f"- Workflow exits [{workflow_name}]: {'; '.join(exits)}")
|
|
270
270
|
todo_state = _coerce_todo_run_state(self.todo_state)
|
|
271
|
-
if todo_state is not None and todo_state.
|
|
272
|
-
lines.append(f"- Active todo: {
|
|
273
|
-
for item in todo_state.
|
|
274
|
-
lines.append(f" - {item.status}: {item.content}")
|
|
271
|
+
if todo_state is not None and todo_state.active_items:
|
|
272
|
+
lines.append(f"- Active todo: {todo_state.summary}")
|
|
273
|
+
for item in todo_state.active_items:
|
|
274
|
+
lines.append(f" - [{item.id}] {item.status}: {item.content}")
|
|
275
275
|
if self.interaction_mode == InteractionMode.PLAN:
|
|
276
276
|
lines.append("- Constraint: plan mode blocks write/insert/replace/edit, write-capable bash, and implement delegation.")
|
|
277
277
|
elif self.interaction_mode == InteractionMode.GOAL:
|
|
@@ -12,7 +12,7 @@ Generate an AGENTS.md file for this project. Write it to the workspace root.
|
|
|
12
12
|
|
|
13
13
|
## What to do
|
|
14
14
|
|
|
15
|
-
1. Scan the project structure using
|
|
15
|
+
1. Scan the project structure using glob, grep, and read tools.
|
|
16
16
|
2. Detect the language, framework, test runner, linter, and build system.
|
|
17
17
|
3. Read key config files such as pyproject.toml, package.json, Cargo.toml,
|
|
18
18
|
go.mod, Makefile, justfile, and README files to extract exact commands.
|
|
@@ -28,6 +28,12 @@ _DSML_RUNTIME_INVOKE_RE = re.compile(
|
|
|
28
28
|
|
|
29
29
|
def todo_run_state_from_result(result: object) -> TodoRunState | None:
|
|
30
30
|
metadata = getattr(result, "metadata", {}) or {}
|
|
31
|
+
|
|
32
|
+
# Short-circuit for read operations
|
|
33
|
+
todo_op = metadata.get("todo_op")
|
|
34
|
+
if todo_op == "read":
|
|
35
|
+
return None
|
|
36
|
+
|
|
31
37
|
raw_items = metadata.get("todo_items")
|
|
32
38
|
summary = metadata.get("todo_summary")
|
|
33
39
|
if not isinstance(raw_items, list) or not isinstance(summary, str):
|
|
@@ -36,9 +42,25 @@ def todo_run_state_from_result(result: object) -> TodoRunState | None:
|
|
|
36
42
|
items = [TodoRunItem.model_validate(item) for item in raw_items]
|
|
37
43
|
except Exception:
|
|
38
44
|
return None
|
|
45
|
+
|
|
46
|
+
# Build counts
|
|
47
|
+
total = len(items)
|
|
48
|
+
done = sum(1 for item in items if item.status == "completed")
|
|
49
|
+
in_progress = sum(1 for item in items if item.status == "in_progress")
|
|
50
|
+
pending = sum(1 for item in items if item.status == "pending")
|
|
51
|
+
cancelled = sum(1 for item in items if item.status == "cancelled")
|
|
52
|
+
|
|
53
|
+
# Build active_items (only in_progress)
|
|
54
|
+
active_items = [item for item in items if item.status == "in_progress"]
|
|
55
|
+
|
|
39
56
|
return TodoRunState(
|
|
40
57
|
summary=summary,
|
|
41
|
-
|
|
58
|
+
total=total,
|
|
59
|
+
done=done,
|
|
60
|
+
in_progress=in_progress,
|
|
61
|
+
pending=pending,
|
|
62
|
+
cancelled=cancelled,
|
|
63
|
+
active_items=active_items,
|
|
42
64
|
updated_at=datetime.now(timezone.utc).isoformat(),
|
|
43
65
|
)
|
|
44
66
|
|
|
@@ -62,8 +84,12 @@ def apply_todo_state_to_host(host: object, raw_state: object) -> None:
|
|
|
62
84
|
if task_state is not None:
|
|
63
85
|
task_state.todo_state = todo_state
|
|
64
86
|
if tracker is not None:
|
|
65
|
-
if todo_state.
|
|
66
|
-
tracker
|
|
87
|
+
if todo_state.total > 0:
|
|
88
|
+
# Convert active_items to dict format for tracker
|
|
89
|
+
todos_dict = {}
|
|
90
|
+
for item in todo_state.active_items:
|
|
91
|
+
todos_dict[item.id] = {"content": item.content, "status": item.status}
|
|
92
|
+
tracker.set_todos_from_dict(todos_dict)
|
|
67
93
|
else:
|
|
68
94
|
tracker.clear_todos()
|
|
69
95
|
|
|
@@ -166,7 +166,7 @@ def _dump_workflow_route(route: WorkflowRoute | None) -> str:
|
|
|
166
166
|
|
|
167
167
|
|
|
168
168
|
def _dump_todo_state(todo_state: TodoRunState | None) -> str:
|
|
169
|
-
if todo_state is None or
|
|
169
|
+
if todo_state is None or todo_state.total == 0:
|
|
170
170
|
return ""
|
|
171
171
|
return json.dumps(todo_state.model_dump(mode="json"), ensure_ascii=False)
|
|
172
172
|
|
|
@@ -228,7 +228,7 @@ def _load_todo_state(raw: str) -> TodoRunState | None:
|
|
|
228
228
|
state = TodoRunState.model_validate(data)
|
|
229
229
|
except ValueError:
|
|
230
230
|
return None
|
|
231
|
-
return state if state.
|
|
231
|
+
return state if state.total > 0 else None
|
|
232
232
|
|
|
233
233
|
|
|
234
234
|
async def save_message_runtime_snapshot(snapshot: MessageRuntimeSnapshot) -> None:
|
|
@@ -37,7 +37,6 @@ BASIC_RULES: Ruleset = [
|
|
|
37
37
|
Rule(permission="compact", pattern="*", action="allow"),
|
|
38
38
|
Rule(permission="task_status", pattern="*", action="allow"),
|
|
39
39
|
Rule(permission="skill", pattern="*", action="allow"),
|
|
40
|
-
Rule(permission="repo_map", pattern="*", action="allow"),
|
|
41
40
|
Rule(permission="lsp", pattern="*", action="allow"),
|
|
42
41
|
Rule(permission="agent", pattern="voidx", action="allow"),
|
|
43
42
|
Rule(permission="edit", pattern="*", action="ask"),
|
|
@@ -98,7 +97,6 @@ def repair_tool_name(tool: str) -> str:
|
|
|
98
97
|
"edit_file": "replace", "shell": "bash",
|
|
99
98
|
"readfile": "read", "writefile": "file",
|
|
100
99
|
"search": "grep", "find": "glob",
|
|
101
|
-
"RepoMap": "repo_map", "repomap": "repo_map", "Repo_map": "repo_map",
|
|
102
100
|
"LspDiagnostics": "lsp", "LspSymbols": "lsp",
|
|
103
101
|
"LspDefinition": "lsp", "LspReferences": "lsp",
|
|
104
102
|
"CompactContext": "compact",
|
|
@@ -163,13 +161,20 @@ def is_safe_bash(command: str) -> bool:
|
|
|
163
161
|
|
|
164
162
|
def _shell_words(command: str) -> list[str] | None:
|
|
165
163
|
try:
|
|
166
|
-
lexer = shlex.shlex(command, posix=
|
|
164
|
+
lexer = shlex.shlex(command, posix=False, punctuation_chars=True)
|
|
167
165
|
lexer.whitespace_split = True
|
|
168
|
-
return
|
|
166
|
+
return [_strip_quotes(w) for w in lexer]
|
|
169
167
|
except ValueError:
|
|
170
168
|
return None
|
|
171
169
|
|
|
172
170
|
|
|
171
|
+
def _strip_quotes(word: str) -> str:
|
|
172
|
+
"""Strip one layer of surrounding single or double quotes (posix=False compat)."""
|
|
173
|
+
if len(word) >= 2 and word[0] == word[-1] and word[0] in ("'", '"'):
|
|
174
|
+
return word[1:-1]
|
|
175
|
+
return word
|
|
176
|
+
|
|
177
|
+
|
|
173
178
|
def _has_write_redirection(words: list[str]) -> bool:
|
|
174
179
|
write_redirections = {">", ">>", ">|", "&>", "&>>"}
|
|
175
180
|
for index, word in enumerate(words):
|
|
@@ -354,7 +359,7 @@ def capability_for_tool(tool: str, args: dict) -> PermissionCapability:
|
|
|
354
359
|
if tool in {
|
|
355
360
|
"read", "glob", "grep", "webfetch", "websearch", "todo", "task_status",
|
|
356
361
|
"skill", "workflow", "compact",
|
|
357
|
-
"
|
|
362
|
+
"lsp",
|
|
358
363
|
}:
|
|
359
364
|
return PermissionCapability.READ_TOOLS
|
|
360
365
|
if tool in {"file", "write", "replace"}:
|