execweave 0.8.5__tar.gz → 0.8.6__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.
- {execweave-0.8.5 → execweave-0.8.6}/PKG-INFO +2 -2
- {execweave-0.8.5 → execweave-0.8.6}/README.de.md +1 -1
- {execweave-0.8.5 → execweave-0.8.6}/README.fr.md +1 -1
- {execweave-0.8.5 → execweave-0.8.6}/README.ja.md +1 -1
- {execweave-0.8.5 → execweave-0.8.6}/README.ko.md +1 -1
- {execweave-0.8.5 → execweave-0.8.6}/README.md +1 -1
- {execweave-0.8.5 → execweave-0.8.6}/README.ru.md +1 -1
- {execweave-0.8.5 → execweave-0.8.6}/README.zh-CN.md +1 -1
- {execweave-0.8.5 → execweave-0.8.6}/README.zh-TW.md +1 -1
- {execweave-0.8.5 → execweave-0.8.6}/pyproject.toml +2 -2
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/__init__.py +1 -1
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/antigravity_subagent_linkage.py +11 -3
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/conversation_records.py +118 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/viewer_agent_panel.py +11 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/viewer_dashboard_focus.py +8 -2
- execweave-0.8.6/tests/test_antigravity_root_child_history_v2.py +173 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_v069_dashboard_release.py +3 -3
- {execweave-0.8.5 → execweave-0.8.6}/.github/workflows/ci.yml +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/.github/workflows/cleanup-workflow-history.yml +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/.github/workflows/i18n.yml +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/.github/workflows/package-benchmark.yml +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/.github/workflows/package-smoke.yml +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/.github/workflows/provider-capability-stage-integrity.yml +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/.github/workflows/publish.yml +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/.github/workflows/scalability.yml +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/.github/workflows/viewer-agent-isolation.yml +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/.github/workflows/wheel-smoke.yml +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/.github/workflows/windows-launcher.yml +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/.gitignore +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/LICENSE +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/RELEASE-PLAN-0.8.0.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/benchmarks/phase1_overhead.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/antigravity-hooks.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/assets/codex.gif +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/benchmarks/README.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/benchmarks/v0.6.0-github-actions.json +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/benchmarks/v0.6.0-github-actions.svg +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/claude-code-hooks.de.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/claude-code-hooks.fr.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/claude-code-hooks.ja.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/claude-code-hooks.ko.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/claude-code-hooks.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/claude-code-hooks.ru.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/claude-code-hooks.zh-CN.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/claude-code-hooks.zh-TW.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/codex-hooks.de.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/codex-hooks.fr.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/codex-hooks.ja.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/codex-hooks.ko.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/codex-hooks.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/codex-hooks.ru.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/codex-hooks.zh-CN.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/codex-hooks.zh-TW.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/cursor-hooks.de.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/cursor-hooks.fr.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/cursor-hooks.ja.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/cursor-hooks.ko.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/cursor-hooks.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/cursor-hooks.ru.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/cursor-hooks.zh-CN.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/cursor-hooks.zh-TW.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/evidence-grades.de.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/evidence-grades.fr.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/evidence-grades.ja.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/evidence-grades.ko.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/evidence-grades.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/evidence-grades.ru.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/evidence-grades.zh-CN.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/evidence-grades.zh-TW.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/gemini-hooks.de.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/gemini-hooks.fr.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/gemini-hooks.ja.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/gemini-hooks.ko.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/gemini-hooks.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/gemini-hooks.ru.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/gemini-hooks.zh-CN.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/gemini-hooks.zh-TW.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/inference-gateway.de.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/inference-gateway.fr.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/inference-gateway.ja.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/inference-gateway.ko.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/inference-gateway.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/inference-gateway.ru.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/inference-gateway.zh-CN.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/inference-gateway.zh-TW.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/internal/provider-capability-matrix.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/live-graph.de.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/live-graph.fr.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/live-graph.ja.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/live-graph.ko.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/live-graph.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/live-graph.ru.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/live-graph.zh-CN.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/live-graph.zh-TW.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/model-runtime.de.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/model-runtime.fr.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/model-runtime.ja.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/model-runtime.ko.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/model-runtime.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/model-runtime.ru.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/model-runtime.zh-CN.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/model-runtime.zh-TW.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/opencode-plugin.de.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/opencode-plugin.fr.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/opencode-plugin.ja.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/opencode-plugin.ko.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/opencode-plugin.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/opencode-plugin.ru.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/opencode-plugin.zh-CN.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/opencode-plugin.zh-TW.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/phase-1-runtime-collection.de.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/phase-1-runtime-collection.fr.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/phase-1-runtime-collection.ja.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/phase-1-runtime-collection.ko.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/phase-1-runtime-collection.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/phase-1-runtime-collection.ru.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/phase-1-runtime-collection.zh-CN.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/phase-1-runtime-collection.zh-TW.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/phase-2-execution-graph.de.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/phase-2-execution-graph.fr.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/phase-2-execution-graph.ja.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/phase-2-execution-graph.ko.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/phase-2-execution-graph.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/phase-2-execution-graph.ru.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/phase-2-execution-graph.zh-CN.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/phase-2-execution-graph.zh-TW.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/rule-packs.de.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/rule-packs.fr.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/rule-packs.ja.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/rule-packs.ko.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/rule-packs.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/rule-packs.ru.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/rule-packs.zh-CN.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/rule-packs.zh-TW.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/run-integrity.de.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/run-integrity.fr.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/run-integrity.ja.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/run-integrity.ko.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/run-integrity.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/run-integrity.ru.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/run-integrity.zh-CN.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/run-integrity.zh-TW.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/runtime-threat-model.de.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/runtime-threat-model.fr.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/runtime-threat-model.ja.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/runtime-threat-model.ko.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/runtime-threat-model.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/runtime-threat-model.ru.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/runtime-threat-model.zh-CN.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/runtime-threat-model.zh-TW.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/security-analysis.de.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/security-analysis.fr.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/security-analysis.ja.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/security-analysis.ko.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/security-analysis.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/security-analysis.ru.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/security-analysis.zh-CN.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/security-analysis.zh-TW.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/semantic-telemetry.de.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/semantic-telemetry.fr.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/semantic-telemetry.ja.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/semantic-telemetry.ko.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/semantic-telemetry.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/semantic-telemetry.ru.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/semantic-telemetry.zh-CN.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/semantic-telemetry.zh-TW.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/v0.6.5-hardening-decisions.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/docs/v0.8.3-graph-ergonomics.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/scripts/audit_i18n_parity.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/scripts/check_claude_hook.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/scripts/check_claude_record_graph.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/scripts/check_codex_hook.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/scripts/check_conversation_records.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/scripts/check_correlation_graph.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/scripts/check_inference_gateway_cli.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/scripts/check_model_runtime_cli.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/scripts/check_openai_compatible_cli.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/scripts/check_release_stage_integrity.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/scripts/check_semantic_graph.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/scripts/check_viewer_js.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/scripts/check_wheel_install.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/scripts/check_windows_launchers.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/scripts/emit_claude_hook_smoke.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/scripts/emit_codex_hook_smoke.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/scripts/emit_cursor_hook_smoke.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/scripts/emit_gemini_hook_smoke.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/scripts/emit_opencode_plugin_smoke.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/scripts/make_semantic_smoke.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/scripts/probe_provider_capability.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/scripts/sync_i18n_nav.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/__main__.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/_conversation_records_core.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/agent_bootstrap.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/agent_topology.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/agent_trace.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/analysis.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/anthropic.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/anthropic_cli.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/anthropic_full_fidelity.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/antigravity_adapter.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/antigravity_adapter_base.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/antigravity_full_fidelity.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/antigravity_full_fidelity_base.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/antigravity_full_fidelity_collaboration_base.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/antigravity_hook_cli.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/antigravity_record.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/antigravity_trace_capability.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/auto_specialized.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/backends.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/benchmark.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/claude_adapter.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/claude_delegation.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/claude_full_fidelity.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/claude_hook_cli.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/claude_hook_contract.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/claude_model_observer.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/claude_record.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/cli.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/codex_adapter.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/codex_conversation.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/codex_full_fidelity.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/codex_hook_cli.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/codex_hook_lifecycle.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/codex_message_diagnostics.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/codex_message_transport_diagnostics.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/codex_record.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/codex_rollout_structures.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/codex_rollout_trace.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/codex_rollout_trace_base.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/collector.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/command.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/content_evidence.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/content_store.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/conversation_archive.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/conversation_message_identity.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/conversation_preview.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/correlation.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/cursor_adapter.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/cursor_delegation.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/cursor_delegation_base.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/cursor_full_fidelity.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/cursor_hook_cli.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/cursor_hook_contract.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/cursor_record.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/dashboard_shell.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/entry.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/evidence_availability.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/evidence_grade.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/fidelity.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/filesystem.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/focus.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/gemini_adapter.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/gemini_full_fidelity.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/gemini_hook_cli.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/gemini_hook_contract.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/gemini_record.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/graph.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/graph_ops.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/http_proxy.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/http_proxy_cli.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/inference_gateway.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/inference_gateway_cli.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/inference_gateway_full_fidelity.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/inference_identity.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/inference_identity_cli.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/integrity.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/integrity_cli.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/litellm_callback.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/litellm_callback_cli.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/live.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/live_core.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/live_view.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/live_view_extra_style.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/live_view_markup.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/live_view_readability.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/live_view_script_a.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/live_view_script_b.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/live_view_script_c.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/live_view_script_d.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/live_view_style.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/model_runtime.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/model_runtime_cli.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/model_runtime_full_fidelity.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/openai_compatible.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/openai_compatible_cli.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/openai_compatible_full_fidelity.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/opencode_adapter.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/opencode_event_contract.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/opencode_full_fidelity.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/opencode_hook_cli.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/opencode_plugin_cli.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/opencode_record.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/opencode_task_linkage.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/overhead_benchmark.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/provider_capability.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/provider_lifecycle.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/provider_record.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/rule_pack.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/rule_pack_cli.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/scalability_benchmark.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/schema.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/scope.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/semantic.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/sink.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/strace_backend.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/stream_assembly.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/theme.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/top.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/top_cli.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/validate.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/view_cli.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/viewer.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/viewer_content_inspector.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/viewer_dashboard_clean.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/viewer_dashboard_hardening.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/viewer_dashboard_hardening_v2.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/viewer_live_layout.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/viewer_projection.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/viewer_projection_base.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/src/execweave/workflow.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/dashboard_readability_fixture.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/fixtures/codex_multi_agent/PROVENANCE.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/fixtures/codex_multi_agent/hook-payloads.json +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/fixtures/codex_multi_agent/rollout-main.jsonl +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/fixtures/hooks/README.md +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/fixtures/hooks/claude.json +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/fixtures/hooks/codex.json +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/fixtures/hooks/cursor.json +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/fixtures/hooks/gemini.json +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/fixtures/hooks/manifest.json +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/fixtures/hooks/opencode.json +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/multi_agent_run_fixture.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_agent_bootstrap.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_agent_message_viewer.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_agent_node_labels.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_agent_said_panel.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_agent_topology_evidence.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_agent_trace_lifecycle.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_agent_trace_viewer_visibility.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_analysis.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_anthropic.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_antigravity_agent_collaboration.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_antigravity_cursor_launch.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_antigravity_history_replay.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_antigravity_identity_topology.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_antigravity_lifecycle.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_antigravity_linkage_projection.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_antigravity_multi_conversation_isolation.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_antigravity_official_contract.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_antigravity_subagent_transcript_linkage.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_antigravity_trace_capability_cli.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_auto_specialized.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_backends.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_claude_adapter.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_claude_delegation.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_claude_full_fidelity.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_claude_hook_contract.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_claude_hook_metadata.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_claude_hook_viewer.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_claude_model_observer.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_claude_record.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_codex_adapter.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_codex_archive_full_fidelity.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_codex_conversation_isolation.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_codex_full_fidelity.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_codex_hook_lifecycle.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_codex_hook_partial_capture.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_codex_message_diagnostics.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_codex_message_transport_diagnostics.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_codex_plain_routed_agent_message.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_codex_real_multi_agent_conversation.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_codex_record.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_codex_reducer_command.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_codex_rollout_structures.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_codex_rollout_trace.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_codex_routing_native_identity.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_collector.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_command.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_condense.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_conversation_access.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_conversation_agent_focus.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_conversation_agent_isolation.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_conversation_identity_merge.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_conversation_message_observation_dedupe.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_conversation_provider_parity.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_conversation_root_authority.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_correlation.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_correlation_canonical_path.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_correlation_checker.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_correlation_process_exe.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_cross_provider_agent_trace.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_cursor_adapter.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_cursor_delegation.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_cursor_full_fidelity.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_cursor_hook_contract.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_cursor_hook_fail_open.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_cursor_record.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_cursor_task_linkage.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_dashboard_information_architecture.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_dashboard_readability_e2e.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_dashboard_round_fold_state_e2e.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_dashboard_simplification.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_dashboard_ux_and_hook_projection.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_delegation_viewer.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_evidence_grade.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_execution_viewer.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_fidelity.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_filesystem_resilience.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_focus.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_fold_budget_setting.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_full_fidelity.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_gemini_adapter.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_gemini_full_fidelity.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_gemini_hook_contract.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_gemini_lifecycle.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_gemini_record.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_graph.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_graph_clear_focus_e2e.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_graph_edge_routing_e2e.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_graph_lane_separation_e2e.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_graph_node_sizing_e2e.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_graph_ops.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_hook_fixture_corpus.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_http_proxy.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_inference_endpoint_identity.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_inference_gateway.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_inference_gateway_full_fidelity.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_inference_identity.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_integrity.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_litellm_callback.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_live.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_live_auth.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_live_dashboard.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_live_dashboard_js.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_live_delta.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_live_logs_export.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_live_theme.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_lmstudio_auto_specialized.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_local_runtime_live_capture.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_model_runtime.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_model_runtime_full_fidelity.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_openai_compatible.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_opencode_adapter.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_opencode_event_contract.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_opencode_event_lifecycle.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_opencode_full_fidelity.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_opencode_identity_unification.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_opencode_plugin.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_opencode_record.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_opencode_task_session_linkage.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_overhead_benchmark.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_per_agent_conversation_default.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_pr25_premerge_hardening_contract.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_pr25_premerge_hardening_e2e.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_provider_capability.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_provider_conversation_evidence.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_provider_conversation_history_integrity.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_provider_lifecycle.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_release_stage_integrity_version_guard.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_rule_pack.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_schema.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_scope.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_semantic.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_shared_injected_context_scope.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_strace_backend.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_stream_assembly.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_threat_model.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_tool_traffic_e2e.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_top_detached.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_v063_features.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_v064_live_auto_integrations.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_v064_live_evidence.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_v079_review_e2e.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_v079_review_regressions.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_v083_release_gate_p2.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_validate.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_version.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_viewer.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_viewer_agent_isolation_e2e.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_viewer_child_authority.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_viewer_content_inspector.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_viewer_projection.py +0 -0
- {execweave-0.8.5 → execweave-0.8.6}/tests/test_workflow.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: execweave
|
|
3
|
-
Version: 0.8.
|
|
3
|
+
Version: 0.8.6
|
|
4
4
|
Summary: Turn AI-agent runtime behavior into a local interactive execution graph.
|
|
5
5
|
Project-URL: Homepage, https://github.com/Irish-kw/ExecWeave
|
|
6
6
|
Project-URL: Repository, https://github.com/Irish-kw/ExecWeave
|
|
@@ -83,7 +83,7 @@ ExecWeave is a source-available, local-first observability project that turns AI
|
|
|
83
83
|
<img src="docs/assets/codex.gif" alt="ExecWeave animated live demo" width="100%">
|
|
84
84
|
</p>
|
|
85
85
|
|
|
86
|
-
This README documents **v0.8.
|
|
86
|
+
This README documents **v0.8.6**.
|
|
87
87
|
|
|
88
88
|
## Why ExecWeave
|
|
89
89
|
|
|
@@ -30,7 +30,7 @@ ExecWeave ist ein source-available, local-first Observability-Projekt, das Aktiv
|
|
|
30
30
|
<img src="docs/assets/codex.gif" alt="ExecWeave animated live demo" width="100%">
|
|
31
31
|
</p>
|
|
32
32
|
|
|
33
|
-
Dieses README dokumentiert **v0.8.
|
|
33
|
+
Dieses README dokumentiert **v0.8.6**.
|
|
34
34
|
|
|
35
35
|
## Warum ExecWeave
|
|
36
36
|
|
|
@@ -30,7 +30,7 @@ ExecWeave est un projet d’observabilité source-available et local-first qui t
|
|
|
30
30
|
<img src="docs/assets/codex.gif" alt="ExecWeave animated live demo" width="100%">
|
|
31
31
|
</p>
|
|
32
32
|
|
|
33
|
-
Ce README décrit **v0.8.
|
|
33
|
+
Ce README décrit **v0.8.6**.
|
|
34
34
|
|
|
35
35
|
## Pourquoi ExecWeave
|
|
36
36
|
|
|
@@ -30,7 +30,7 @@ ExecWeave is a source-available, local-first observability project that turns AI
|
|
|
30
30
|
<img src="docs/assets/codex.gif" alt="ExecWeave animated live demo" width="100%">
|
|
31
31
|
</p>
|
|
32
32
|
|
|
33
|
-
This README documents **v0.8.
|
|
33
|
+
This README documents **v0.8.6**.
|
|
34
34
|
|
|
35
35
|
## Why ExecWeave
|
|
36
36
|
|
|
@@ -4,8 +4,8 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "execweave"
|
|
7
|
-
# ExecWeave v0.8.
|
|
8
|
-
version = "0.8.
|
|
7
|
+
# ExecWeave v0.8.6 release metadata
|
|
8
|
+
version = "0.8.6"
|
|
9
9
|
description = "Turn AI-agent runtime behavior into a local interactive execution graph."
|
|
10
10
|
readme = "README.md"
|
|
11
11
|
requires-python = ">=3.10"
|
|
@@ -115,7 +115,9 @@ def _request_specs(value: object) -> list[dict[str, Any]] | None:
|
|
|
115
115
|
if not isinstance(value, list) or not value:
|
|
116
116
|
return None
|
|
117
117
|
specs: list[dict[str, Any]] = []
|
|
118
|
-
|
|
118
|
+
# Current Antigravity includes Model in each invoke_subagent spec.
|
|
119
|
+
# Keep the allow-list strict while accepting that live-verified field.
|
|
120
|
+
allowed = {"Model", "Prompt", "Role", "TypeName", "Workspace"}
|
|
119
121
|
for raw in value:
|
|
120
122
|
if not isinstance(raw, dict) or not set(raw).issubset(allowed):
|
|
121
123
|
return None
|
|
@@ -128,6 +130,9 @@ def _request_specs(value: object) -> list[dict[str, Any]] | None:
|
|
|
128
130
|
return None
|
|
129
131
|
if not isinstance(type_name, str) or not type_name:
|
|
130
132
|
return None
|
|
133
|
+
model = raw.get("Model")
|
|
134
|
+
if model is not None and (not isinstance(model, str) or not model):
|
|
135
|
+
return None
|
|
131
136
|
workspace = raw.get("Workspace")
|
|
132
137
|
if workspace is not None and (not isinstance(workspace, str) or not workspace):
|
|
133
138
|
return None
|
|
@@ -211,9 +216,12 @@ def _matching_request(record: dict[str, Any], specs: list[dict[str, Any]]) -> bo
|
|
|
211
216
|
|
|
212
217
|
|
|
213
218
|
def _matching_result(record: dict[str, Any]) -> list[dict[str, Any]] | None:
|
|
214
|
-
if record.get("source") != "MODEL":
|
|
219
|
+
if record.get("source") != "MODEL" or record.get("status") != "DONE":
|
|
215
220
|
return None
|
|
216
|
-
|
|
221
|
+
# Older builds labelled the immediate result INVOKE_SUBAGENT; the current
|
|
222
|
+
# live wire labels that same record GENERIC. GENERIC is accepted only if its
|
|
223
|
+
# payload passes _parse_result_content's exact provider prefix/schema checks.
|
|
224
|
+
if record.get("type") not in {"INVOKE_SUBAGENT", "GENERIC"}:
|
|
217
225
|
return None
|
|
218
226
|
return _parse_result_content(record.get("content"))
|
|
219
227
|
|
|
@@ -235,6 +235,123 @@ def _history_message_key(message: dict[str, Any]) -> tuple[object, ...]:
|
|
|
235
235
|
)
|
|
236
236
|
|
|
237
237
|
|
|
238
|
+
def _project_antigravity_addressed_tasks(
|
|
239
|
+
entries: list[dict[str, Any]],
|
|
240
|
+
graph: dict[str, Any],
|
|
241
|
+
) -> None:
|
|
242
|
+
"""Project exact parent-addressed send_message text into the child timeline.
|
|
243
|
+
|
|
244
|
+
Raw Antigravity topology already carries positive ``parent_scope_id`` evidence on
|
|
245
|
+
each validated child node. Raw send_message conversation evidence carries exact
|
|
246
|
+
provider sender and recipient conversation IDs. Join those two facts only for
|
|
247
|
+
presentation: an addressed parent message becomes a child task opener, while raw
|
|
248
|
+
evidence remains unchanged and delivery/consumption remain explicitly unobserved.
|
|
249
|
+
"""
|
|
250
|
+
prefix = "agent:antigravity:conversation:"
|
|
251
|
+
topology: dict[str, tuple[str, str]] = {}
|
|
252
|
+
for node in graph.get("nodes", []):
|
|
253
|
+
if not isinstance(node, dict) or node.get("type") != "agent":
|
|
254
|
+
continue
|
|
255
|
+
node_id = node.get("id")
|
|
256
|
+
attrs = node.get("attributes")
|
|
257
|
+
attrs = attrs if isinstance(attrs, dict) else {}
|
|
258
|
+
if not isinstance(node_id, str) or not node_id.startswith(prefix):
|
|
259
|
+
continue
|
|
260
|
+
if str(attrs.get("provider") or "").lower() != "antigravity":
|
|
261
|
+
continue
|
|
262
|
+
parent_path = attrs.get("parent_agent_path")
|
|
263
|
+
parent_scope = attrs.get("parent_scope_id")
|
|
264
|
+
if not isinstance(parent_path, str) or not parent_path:
|
|
265
|
+
continue
|
|
266
|
+
if not isinstance(parent_scope, str) or not parent_scope:
|
|
267
|
+
continue
|
|
268
|
+
topology[node_id.removeprefix(prefix)] = (parent_scope, parent_path)
|
|
269
|
+
|
|
270
|
+
children: dict[str, dict[str, Any]] = {}
|
|
271
|
+
for entry in entries:
|
|
272
|
+
if str(entry.get("provider") or "").lower() != "antigravity":
|
|
273
|
+
continue
|
|
274
|
+
source_id = entry.get("source_id")
|
|
275
|
+
preview = entry.get("conversation_preview")
|
|
276
|
+
if not isinstance(source_id, str) or not source_id.startswith(prefix):
|
|
277
|
+
continue
|
|
278
|
+
child_id = source_id.removeprefix(prefix)
|
|
279
|
+
if child_id not in topology or not isinstance(preview, dict):
|
|
280
|
+
continue
|
|
281
|
+
children[child_id] = entry
|
|
282
|
+
|
|
283
|
+
additions: dict[str, list[dict[str, Any]]] = {child_id: [] for child_id in children}
|
|
284
|
+
for entry in entries:
|
|
285
|
+
if str(entry.get("provider") or "").lower() != "antigravity":
|
|
286
|
+
continue
|
|
287
|
+
preview = entry.get("conversation_preview")
|
|
288
|
+
if not isinstance(preview, dict):
|
|
289
|
+
continue
|
|
290
|
+
for message in preview.get("messages") or []:
|
|
291
|
+
if not isinstance(message, dict) or message.get("kind") != "send_message":
|
|
292
|
+
continue
|
|
293
|
+
sender = message.get("sender")
|
|
294
|
+
recipient = message.get("recipient")
|
|
295
|
+
if not isinstance(sender, str) or not sender.startswith("antigravity:"):
|
|
296
|
+
continue
|
|
297
|
+
if not isinstance(recipient, str) or not recipient.startswith("antigravity:"):
|
|
298
|
+
continue
|
|
299
|
+
sender_id = sender.removeprefix("antigravity:")
|
|
300
|
+
child_id = recipient.removeprefix("antigravity:")
|
|
301
|
+
child_entry = children.get(child_id)
|
|
302
|
+
if child_entry is None:
|
|
303
|
+
continue
|
|
304
|
+
parent_scope, parent_path = topology[child_id]
|
|
305
|
+
if sender_id != parent_scope:
|
|
306
|
+
# Exact sibling/other-agent messages are messages, not parent tasks.
|
|
307
|
+
continue
|
|
308
|
+
child_preview = child_entry["conversation_preview"]
|
|
309
|
+
task = dict(message)
|
|
310
|
+
task.update(
|
|
311
|
+
{
|
|
312
|
+
"kind": "task",
|
|
313
|
+
"phase": "assignment",
|
|
314
|
+
"sender": parent_path,
|
|
315
|
+
"recipient": str(child_preview.get("agent_path") or ""),
|
|
316
|
+
"content_role": "antigravity_addressed_task",
|
|
317
|
+
"provider_sender_id": sender_id,
|
|
318
|
+
"provider_recipient_id": child_id,
|
|
319
|
+
"delivery_observed": False,
|
|
320
|
+
"consumption_observed": False,
|
|
321
|
+
}
|
|
322
|
+
)
|
|
323
|
+
additions[child_id].append(task)
|
|
324
|
+
|
|
325
|
+
for child_id, tasks in additions.items():
|
|
326
|
+
if not tasks:
|
|
327
|
+
continue
|
|
328
|
+
preview = children[child_id]["conversation_preview"]
|
|
329
|
+
combined = [
|
|
330
|
+
dict(message)
|
|
331
|
+
for message in preview.get("messages") or []
|
|
332
|
+
if isinstance(message, dict)
|
|
333
|
+
] + tasks
|
|
334
|
+
combined.sort(
|
|
335
|
+
key=lambda message: (
|
|
336
|
+
str(message.get("timestamp") or ""),
|
|
337
|
+
message.get("ordinal")
|
|
338
|
+
if isinstance(message.get("ordinal"), int)
|
|
339
|
+
else 2**63 - 1,
|
|
340
|
+
)
|
|
341
|
+
)
|
|
342
|
+
seen: set[tuple[object, ...]] = set()
|
|
343
|
+
messages: list[dict[str, Any]] = []
|
|
344
|
+
for message in combined:
|
|
345
|
+
key = _history_message_key(message)
|
|
346
|
+
if key in seen:
|
|
347
|
+
continue
|
|
348
|
+
seen.add(key)
|
|
349
|
+
messages.append(message)
|
|
350
|
+
preview["message_count"] = len(messages)
|
|
351
|
+
preview["messages_truncated"] = False
|
|
352
|
+
preview["messages"] = messages
|
|
353
|
+
|
|
354
|
+
|
|
238
355
|
def _restore_complete_histories(
|
|
239
356
|
entries: list[dict[str, Any]],
|
|
240
357
|
snapshots: list[tuple[dict[str, Any], dict[str, Any]]],
|
|
@@ -430,6 +547,7 @@ def conversation_record_entries(
|
|
|
430
547
|
) -> list[dict[str, Any]]:
|
|
431
548
|
"""Publish root-only Ollama turns under the one run root without changing raw evidence."""
|
|
432
549
|
entries = _core_conversation_record_entries(graph, run_root)
|
|
550
|
+
_project_antigravity_addressed_tasks(entries, graph)
|
|
433
551
|
root_id = _ollama_root_agent_id(graph)
|
|
434
552
|
if root_id is None:
|
|
435
553
|
return entries
|
|
@@ -74,6 +74,17 @@ function recordFor(node){
|
|
|
74
74
|
function canonicalRootRecord(){
|
|
75
75
|
const roots=entries.filter(entryHasRootAuthority);
|
|
76
76
|
const sourceIds=[...new Set(roots.map(entry=>String(entry?.source_id||'')).filter(Boolean))];
|
|
77
|
+
if(sourceIds.length!==1){
|
|
78
|
+
if(sourceIds.length)return null;
|
|
79
|
+
const agy=entries.filter(entry=>{
|
|
80
|
+
const preview=entry?.conversation_preview;
|
|
81
|
+
return String(entry?.provider||'').toLowerCase()==='antigravity'&&!!preview&&
|
|
82
|
+
String(entry?.source_id||'').startsWith('agent:antigravity:conversation:')&&
|
|
83
|
+
!String(preview.parent_agent_path||'').trim();
|
|
84
|
+
});
|
|
85
|
+
const agyIds=[...new Set(agy.map(entry=>String(entry?.source_id||'')).filter(Boolean))];
|
|
86
|
+
if(agyIds.length===1)return aggregate(agy.filter(entry=>String(entry?.source_id||'')===agyIds[0]));
|
|
87
|
+
}
|
|
77
88
|
if(sourceIds.length!==1)return null;
|
|
78
89
|
return aggregate(roots.filter(entry=>String(entry?.source_id||'')===sourceIds[0]));
|
|
79
90
|
}
|
|
@@ -39,14 +39,20 @@ execweaveDashboardGraph=function(data){
|
|
|
39
39
|
});
|
|
40
40
|
const presentationAlias=new Map();
|
|
41
41
|
const antigravityRoot=prepared.find(node=>String(node?.id||'')==='agent:Antigravity');
|
|
42
|
-
const
|
|
42
|
+
const antigravityScoped=prepared.filter(node=>{
|
|
43
43
|
const attrs=node?.attributes||{};
|
|
44
44
|
return node?.type==='agent'&&String(attrs.provider||'').toLowerCase()==='antigravity'&&
|
|
45
|
-
String(node.id||'').startsWith('agent:antigravity:conversation:')
|
|
45
|
+
String(node.id||'').startsWith('agent:antigravity:conversation:');
|
|
46
46
|
});
|
|
47
|
+
const parentScopes=new Set(antigravityScoped.filter(node=>String(node?.attributes?.parent_agent_path||'').trim()).map(node=>String(node?.attributes?.parent_scope_id||'')).filter(Boolean));
|
|
48
|
+
const evidenceMains=antigravityScoped.filter(node=>{const attrs=node?.attributes||{};return !String(attrs.parent_agent_path||'').trim()&&parentScopes.has(String(attrs.conversation_id||''));});
|
|
49
|
+
const fallbackMains=antigravityScoped.filter(node=>{const attrs=node?.attributes||{};return !String(attrs.parent_agent_path||'').trim()&&!attrs.routing_identity_only;});
|
|
50
|
+
const antigravityMains=evidenceMains.length?evidenceMains:fallbackMains;
|
|
47
51
|
if(antigravityRoot&&antigravityMains.length===1){
|
|
48
52
|
const main=antigravityMains[0];presentationAlias.set(antigravityRoot.id,main.id);
|
|
49
53
|
prepared=prepared.filter(node=>node.id!==antigravityRoot.id).map(node=>node.id===main.id?{...node,name:'/root'}:node);
|
|
54
|
+
}else if(antigravityRoot&&antigravityScoped.length){
|
|
55
|
+
prepared=prepared.filter(node=>node.id!==antigravityRoot.id);
|
|
50
56
|
}
|
|
51
57
|
const ollamaRoots=prepared.filter(node=>node?.type==='agent'&&['agent:Ollama','agent:ollama'].includes(String(node.id||'')));
|
|
52
58
|
const ollamaRuntimes=prepared.filter(node=>node?.type==='model_runtime'&&String(node?.attributes?.provider||'').toLowerCase()==='ollama');
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import json
|
|
4
|
+
import os
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
|
|
7
|
+
import pytest
|
|
8
|
+
|
|
9
|
+
from execweave.antigravity_full_fidelity import antigravity_hook_to_content_events
|
|
10
|
+
from execweave.content_store import FullFidelityContentStore
|
|
11
|
+
from execweave.conversation_records import conversation_record_entries
|
|
12
|
+
from execweave.graph import GraphAccumulator
|
|
13
|
+
from execweave.viewer_projection import write_graph_html
|
|
14
|
+
|
|
15
|
+
ROOT = "root-current-wire"
|
|
16
|
+
CHILD_A = "child-current-a"
|
|
17
|
+
CHILD_B = "child-current-b"
|
|
18
|
+
ROOT_ID = f"agent:antigravity:conversation:{ROOT}"
|
|
19
|
+
CHILD_A_ID = f"agent:antigravity:conversation:{CHILD_A}"
|
|
20
|
+
CHILD_B_ID = f"agent:antigravity:conversation:{CHILD_B}"
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def _brain_transcript(tmp_path: Path, conversation_id: str) -> Path:
|
|
24
|
+
path = tmp_path / "brain" / conversation_id / ".system_generated" / "logs" / "transcript.jsonl"
|
|
25
|
+
path.parent.mkdir(parents=True, exist_ok=True)
|
|
26
|
+
return path
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def _write(path: Path, rows: list[dict[str, object]]) -> None:
|
|
30
|
+
path.write_text("".join(json.dumps(row, ensure_ascii=False) + "\n" for row in rows), encoding="utf-8")
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def _root_rows(tmp_path: Path) -> tuple[list[dict[str, object]], list[dict[str, str]]]:
|
|
34
|
+
specs = [
|
|
35
|
+
{"Model": "inherit", "Prompt": "child A first task", "Role": "Role A", "TypeName": "worker", "Workspace": "inherit"},
|
|
36
|
+
{"Model": "inherit", "Prompt": "child B first task", "Role": "Role B", "TypeName": "worker", "Workspace": "inherit"},
|
|
37
|
+
]
|
|
38
|
+
result = (
|
|
39
|
+
"Created the following subagents:\n"
|
|
40
|
+
+ json.dumps({"conversationId": CHILD_A, "logAbsoluteUri": _brain_transcript(tmp_path, CHILD_A).as_uri(), "workspaceUris": [tmp_path.as_uri()]})
|
|
41
|
+
+ "\n"
|
|
42
|
+
+ json.dumps({"conversationId": CHILD_B, "logAbsoluteUri": _brain_transcript(tmp_path, CHILD_B).as_uri(), "workspaceUris": [tmp_path.as_uri()]})
|
|
43
|
+
)
|
|
44
|
+
rows: list[dict[str, object]] = [
|
|
45
|
+
{"step_index": 0, "source": "USER_EXPLICIT", "type": "USER_INPUT", "status": "DONE", "created_at": "2026-09-01T01:00:00Z", "content": "<USER_REQUEST>root first request</USER_REQUEST>"},
|
|
46
|
+
{"step_index": 1, "source": "MODEL", "type": "PLANNER_RESPONSE", "status": "DONE", "created_at": "2026-09-01T01:00:01Z", "tool_calls": [{"name": "invoke_subagent", "args": {"Subagents": specs}}]},
|
|
47
|
+
{"step_index": 2, "source": "MODEL", "type": "GENERIC", "status": "DONE", "created_at": "2026-09-01T01:00:02Z", "content": result},
|
|
48
|
+
{"step_index": 3, "source": "MODEL", "type": "PLANNER_RESPONSE", "status": "DONE", "created_at": "2026-09-01T01:00:03Z", "content": "root first response"},
|
|
49
|
+
{"step_index": 4, "source": "USER_EXPLICIT", "type": "USER_INPUT", "status": "DONE", "created_at": "2026-09-01T01:00:50Z", "content": "<USER_REQUEST>root second request</USER_REQUEST>"},
|
|
50
|
+
{"step_index": 5, "source": "MODEL", "type": "PLANNER_RESPONSE", "status": "DONE", "created_at": "2026-09-01T01:00:51Z", "content": "root dispatches a new child task"},
|
|
51
|
+
]
|
|
52
|
+
return rows, specs
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def _build(tmp_path: Path) -> tuple[dict[str, object], Path]:
|
|
56
|
+
run_root = tmp_path / "run"
|
|
57
|
+
store = FullFidelityContentStore(run_root)
|
|
58
|
+
root_path = _brain_transcript(tmp_path, ROOT)
|
|
59
|
+
root_rows, specs = _root_rows(tmp_path)
|
|
60
|
+
_write(root_path, root_rows)
|
|
61
|
+
_write(_brain_transcript(tmp_path, CHILD_A), [
|
|
62
|
+
{"step_index": 0, "source": "MODEL", "type": "PLANNER_RESPONSE", "status": "DONE", "created_at": "2026-09-01T01:00:05Z", "content": "child A first response"},
|
|
63
|
+
{"step_index": 4, "source": "MODEL", "type": "PLANNER_RESPONSE", "status": "DONE", "created_at": "2026-09-01T01:01:05Z", "content": "child A second response"},
|
|
64
|
+
])
|
|
65
|
+
_write(_brain_transcript(tmp_path, CHILD_B), [
|
|
66
|
+
{"step_index": 0, "source": "MODEL", "type": "PLANNER_RESPONSE", "status": "DONE", "created_at": "2026-09-01T01:00:06Z", "content": "child B first response"},
|
|
67
|
+
])
|
|
68
|
+
graph = GraphAccumulator(session_id="agy-root-child-v2", source_path=run_root / "events.jsonl")
|
|
69
|
+
invoke_payload = {"conversationId": ROOT, "workspacePaths": [str(tmp_path)], "transcriptPath": str(root_path), "stepIdx": 1, "toolCall": {"name": "invoke_subagent", "args": {"Subagents": specs}}}
|
|
70
|
+
for event in antigravity_hook_to_content_events(invoke_payload, hook_event="PostToolUse", store=store, timestamp="2026-09-01T01:00:04Z"):
|
|
71
|
+
graph.apply(event)
|
|
72
|
+
root_stop = {"conversationId": ROOT, "workspacePaths": [str(tmp_path)], "transcriptPath": str(root_path), "executionNum": 1, "terminationReason": "done", "fullyIdle": True}
|
|
73
|
+
for event in antigravity_hook_to_content_events(root_stop, hook_event="Stop", store=store, timestamp="2026-09-01T01:03:00Z"):
|
|
74
|
+
graph.apply(event)
|
|
75
|
+
for child_id in (CHILD_A, CHILD_B):
|
|
76
|
+
stop_payload = {"conversationId": child_id, "workspacePaths": [str(tmp_path)], "transcriptPath": str(_brain_transcript(tmp_path, child_id)), "executionNum": 1, "terminationReason": "done", "fullyIdle": True}
|
|
77
|
+
for event in antigravity_hook_to_content_events(stop_payload, hook_event="Stop", store=store, timestamp="2026-09-01T01:02:00Z"):
|
|
78
|
+
graph.apply(event)
|
|
79
|
+
followup = {"conversationId": ROOT, "stepIdx": 10, "workspacePaths": [str(tmp_path)], "toolCall": {"name": "send_message", "args": {"Recipient": CHILD_A, "Message": "child A second task"}}}
|
|
80
|
+
for event in antigravity_hook_to_content_events(followup, hook_event="PostToolUse", store=store, timestamp="2026-09-01T01:01:00Z"):
|
|
81
|
+
graph.apply(event)
|
|
82
|
+
sibling = {"conversationId": CHILD_B, "stepIdx": 11, "workspacePaths": [str(tmp_path)], "toolCall": {"name": "send_message", "args": {"Recipient": CHILD_A, "Message": "sibling note, not a task"}}}
|
|
83
|
+
for event in antigravity_hook_to_content_events(sibling, hook_event="PostToolUse", store=store, timestamp="2026-09-01T01:01:01Z"):
|
|
84
|
+
graph.apply(event)
|
|
85
|
+
materialized = graph.to_dict()
|
|
86
|
+
materialized["nodes"].append({"id": "agent:Antigravity", "type": "agent", "name": "Antigravity", "attributes": {"provider": "antigravity"}})
|
|
87
|
+
return materialized, run_root
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
def _entry(entries: list[dict[str, object]], source_id: str) -> dict[str, object]:
|
|
91
|
+
matches = [entry for entry in entries if entry.get("source_id") == source_id and isinstance(entry.get("conversation_preview"), dict)]
|
|
92
|
+
assert len(matches) == 1, (source_id, len(matches))
|
|
93
|
+
return matches[0]
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
def test_current_generic_result_and_model_field_produce_positive_child_topology(tmp_path: Path) -> None:
|
|
97
|
+
graph, run_root = _build(tmp_path)
|
|
98
|
+
for child_id in (CHILD_A_ID, CHILD_B_ID):
|
|
99
|
+
child = next(node for node in graph["nodes"] if node["id"] == child_id)
|
|
100
|
+
attrs = child["attributes"]
|
|
101
|
+
assert attrs["parent_agent_path"] == "/root"
|
|
102
|
+
assert attrs["parent_scope_id"] == ROOT
|
|
103
|
+
assert attrs["parent_relation_source"] == "provider_validated_child_transcript"
|
|
104
|
+
entries = conversation_record_entries(graph, run_root)
|
|
105
|
+
preview_a = _entry(entries, CHILD_A_ID)["conversation_preview"]
|
|
106
|
+
texts_a = [message["text"] for message in preview_a["messages"]]
|
|
107
|
+
assert texts_a == ["child A first task", "child A first response", "child A second task", "child A second response"]
|
|
108
|
+
second = next(message for message in preview_a["messages"] if message["text"] == "child A second task")
|
|
109
|
+
assert second["phase"] == "assignment"
|
|
110
|
+
assert second["content_role"] == "antigravity_addressed_task"
|
|
111
|
+
assert second["provider_sender_id"] == ROOT
|
|
112
|
+
assert second["provider_recipient_id"] == CHILD_A
|
|
113
|
+
assert second["delivery_observed"] is False
|
|
114
|
+
assert second["consumption_observed"] is False
|
|
115
|
+
assert "sibling note, not a task" not in texts_a
|
|
116
|
+
preview_b = _entry(entries, CHILD_B_ID)["conversation_preview"]
|
|
117
|
+
assert "child A second task" not in [message["text"] for message in preview_b["messages"]]
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
def _required_browser(playwright: object):
|
|
121
|
+
try:
|
|
122
|
+
return playwright.chromium.launch()
|
|
123
|
+
except Exception as error: # noqa: BLE001
|
|
124
|
+
if os.environ.get("EXECWEAVE_E2E_REQUIRED", "").lower() not in {"", "0", "false"}:
|
|
125
|
+
pytest.fail(f"Chromium required for Antigravity root/child history gate: {error}")
|
|
126
|
+
pytest.skip(f"Chromium unavailable: {error}")
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
@pytest.mark.viewer_e2e
|
|
130
|
+
def test_dashboard_has_one_root_and_reused_child_has_folded_history(tmp_path: Path) -> None:
|
|
131
|
+
sync_api = pytest.importorskip("playwright.sync_api")
|
|
132
|
+
graph, run_root = _build(tmp_path)
|
|
133
|
+
entries = conversation_record_entries(graph, run_root)
|
|
134
|
+
viewer = run_root / "viewer.html"
|
|
135
|
+
write_graph_html(graph, viewer)
|
|
136
|
+
with sync_api.sync_playwright() as playwright:
|
|
137
|
+
browser = _required_browser(playwright)
|
|
138
|
+
try:
|
|
139
|
+
page = browser.new_page(viewport={"width": 1440, "height": 1000})
|
|
140
|
+
page.goto(viewer.as_uri())
|
|
141
|
+
page.wait_for_selector(".node")
|
|
142
|
+
visible = page.eval_on_selector_all(".node", "nodes=>nodes.map(node=>({id:node.dataset.id,text:node.textContent}))")
|
|
143
|
+
ids = [item["id"] for item in visible]
|
|
144
|
+
assert "agent:Antigravity" not in ids
|
|
145
|
+
assert ROOT_ID in ids
|
|
146
|
+
assert "/root" in next(item for item in visible if item["id"] == ROOT_ID)["text"]
|
|
147
|
+
assert "Role A" in next(item for item in visible if item["id"] == CHILD_A_ID)["text"]
|
|
148
|
+
assert "Role B" in next(item for item in visible if item["id"] == CHILD_B_ID)["text"]
|
|
149
|
+
page.eval_on_selector(f'.node[data-id="{CHILD_A_ID}"]', "node=>node.dispatchEvent(new MouseEvent('click',{bubbles:true}))")
|
|
150
|
+
page.wait_for_function("()=>(document.getElementById('details')?.innerText||'').includes('child A second task')")
|
|
151
|
+
details = page.locator("#details")
|
|
152
|
+
current = details.inner_text()
|
|
153
|
+
assert "child A second task" in current
|
|
154
|
+
assert "child A second response" in current
|
|
155
|
+
assert "sibling note, not a task" not in current
|
|
156
|
+
assert details.locator(".execweave-agent-older").count() == 1
|
|
157
|
+
older = details.locator(".execweave-agent-older").first
|
|
158
|
+
assert not older.evaluate("node=>node.open")
|
|
159
|
+
older.locator("summary").click()
|
|
160
|
+
assert older.evaluate("node=>node.open")
|
|
161
|
+
expanded = older.inner_text()
|
|
162
|
+
assert "child A first task" in expanded
|
|
163
|
+
assert "child A first response" in expanded
|
|
164
|
+
assert "child A second task" not in expanded
|
|
165
|
+
assert "child A second response" not in expanded
|
|
166
|
+
page.evaluate("items=>window.__execweaveAgentPanel.setEntries(items)", entries)
|
|
167
|
+
persisted = details.locator(".execweave-agent-older").first
|
|
168
|
+
assert persisted.evaluate("node=>node.open")
|
|
169
|
+
persisted_text = persisted.inner_text()
|
|
170
|
+
assert "child A first task" in persisted_text
|
|
171
|
+
assert "child A first response" in persisted_text
|
|
172
|
+
finally:
|
|
173
|
+
browser.close()
|
|
@@ -103,10 +103,10 @@ def test_release_version_and_noncommercial_license_metadata_are_078() -> None:
|
|
|
103
103
|
stage-integrity node-ID floor refuses renames; the assertions below are the
|
|
104
104
|
current release.
|
|
105
105
|
"""
|
|
106
|
-
assert __version__ == "0.8.
|
|
106
|
+
assert __version__ == "0.8.6"
|
|
107
107
|
pyproject = Path("pyproject.toml").read_text(encoding="utf-8")
|
|
108
|
-
assert 'version = "0.8.
|
|
109
|
-
assert "ExecWeave v0.8.
|
|
108
|
+
assert 'version = "0.8.6"' in pyproject
|
|
109
|
+
assert "ExecWeave v0.8.6 release metadata" in pyproject
|
|
110
110
|
assert "License :: Other/Proprietary License" in pyproject
|
|
111
111
|
assert "License :: OSI Approved :: MIT License" not in pyproject
|
|
112
112
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{execweave-0.8.5 → execweave-0.8.6}/.github/workflows/provider-capability-stage-integrity.yml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|